Skip to content

Release v0.6.0: RubyMine 2025.3+ baseline and IDE 2026 stability fixes#101

Merged
thinkAmi merged 16 commits into
mainfrom
epic/support_ide_2026
May 12, 2026
Merged

Release v0.6.0: RubyMine 2025.3+ baseline and IDE 2026 stability fixes#101
thinkAmi merged 16 commits into
mainfrom
epic/support_ide_2026

Conversation

@thinkAmi
Copy link
Copy Markdown
Owner

Background

This PR merges the epic/support_ide_2026 branch into main for the v0.6.0 release.

The branch raises the minimum supported RubyMine version to 2025.3 and includes the compatibility fixes needed for newer IDE 2026 platform builds, where stricter threading and read-action checks surfaced startup and route-loading failures.

The minimum supported IDE change is a breaking change for users on 2024.x, 2025.1, and 2025.2, so this is released as v0.6.0.

Summary

  • BREAKING: Minimum supported IDE is now RubyMine 2025.3 (since-build = 253). Users on 2024.x, 2025.1, or 2025.2 should stay on the 0.5.x line.
  • Improved compatibility with IDE 2026, including fixes for startup errors, route loading, route navigation, and copy-route actions.
  • Rails Routes now reports missing or misconfigured Ruby SDK / Rails setup with a notification instead of failing silently.
  • Unsaved editor files are saved before Rails Routes runs, so recent edits are reflected in the routes list.
  • Release preparation updates gradle.properties to 0.6.0 and updates the [Unreleased] CHANGELOG entry used for the v0.6.0 release notes.

Included PRs

This PR consolidates the following already-reviewed PRs:

Notes

  • The CHANGELOG intentionally focuses on user-visible changes. The Gradle / CI migration is kept in this PR description and git history, but omitted from the Marketplace-facing release notes.
  • until-build remains intentionally unset.
  • After this PR merges, the Build workflow creates the v0.6.0 draft release. Publishing that draft triggers the JetBrains Marketplace release and the changelog-update PR. See docs/release-process.md for the full runbook.

Testing

  • The underlying PRs include their own validation details; see each linked PR for the exact checks that were run.
  • New/expanded test coverage includes SimpleRouteSnapshotTest, RoutesPreflightTest, CopyRouteActionBaseTest, RouteCopyProviderTest, and MountedEngineRouteTest.
  • The final release-prep commit only edits gradle.properties and CHANGELOG.md.
  • Local ./gradlew patchPluginXml verifyPlugin buildPlugin for the bumped 0.6.0 version has not yet been run and should be run before merging this PR.

thinkAmi and others added 16 commits May 8, 2026 14:32
…m-template-2.6

Migrate Gradle and CI configuration
RubyMine 2026.1.1 throws "Read access is allowed from inside read-action only"
when a row is selected in the routes table, because SimpleRoute lazily reads
RailsAction.psiClass / psiMethod from getQualifiedActionTitle / getActionIcon /
canNavigate / methodExists, all of which are invoked from the EDT (MainContent,
ActionCellRenderer, RoutesTable double-click, RoutesTableFilter) outside of a
read action.

Capture the display-side values at init time inside the same ReadAction.run
block as railsAction.update(), and have the getters return the cached snapshot.
Navigation keeps using the existing ReadAction.nonBlocking re-resolution path
so the jump target is still based on the latest PSI.

Extract icon dispatch into a pure resolveActionIcon() helper so each branch
(NodeRouteAction / NodeController / Unknown) can be unit-tested without the
Ruby plugin services that are otherwise required to instantiate real RClass /
RMethod under BasePlatformTestCase.

Add SimpleRouteSnapshotTest covering: snapshot immutability, all three icon
dispatch branches, default state with no Rails app, dynamic ":controller"
routes, and the nested controller fallback (admin/users -> Admin::UsersController).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Raise minimum IDE to 2025.3 and fix PSI read assertion in 2026.1.1
Notify users when Rails Routes cannot run because the project has no module,
no Rails application is detected, or no Ruby SDK is configured. Keep the
reason visible in the tool window instead of silently returning to the
initial state.

Extract the preflight checks into a tested helper and run Rails application
resolution inside a read action to avoid PSI read assertions.

Also restore the Kotlin compiler daemon heap setting that was dropped during
the Gradle migration.

Tests:
- ./gradlew check

🤖 Generated with https://claude.ai/code

Co-Authored-By: Claude mailto:noreply@anthropic.com
fix: show configuration errors before running Rails Routes
The StubIndex can return non-RContainer elements such as RConstantImpl
(e.g. when an `include SomeConstant` references a non-module constant).
The previous unconditional `as RContainer` cast threw ClassCastException
in that case and stalled the entire rails routes parsing.

Replace it with an `is RContainer` smart cast so non-container matches
are skipped and `null` is returned when no class/module is found.

Tests:
- ./gradlew check

🤖 Generated with https://claude.ai/code

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
rails routes is an external process that reads files from disk, so any
in-editor edits to config/routes.rb (or related Ruby sources) that have
not been written out yet will not be reflected in the result.

Call FileDocumentManager.saveAllDocuments() at the action entry point,
before launching the routes task, so the external process always sees
the up-to-date contents.

Tests:
- ./gradlew check

🤖 Generated with https://claude.ai/code

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
fix: stop Rails Routes from stalling on cast errors and unsaved files
The Railroads tool window had two latent threading boundary gaps that
violate IntelliJ Platform contracts: MainView was constructed off the
EDT while walking the Swing component tree, and the mounted engine
route resolved Ruby PSI / StubIndex outside a read action.

Neither has produced a user-visible failure so far because today's UI
callers happen to dispatch correctly and the mounted engine row is not
reachable from the table double-click path. Newer platform builds ship
stricter threading assertions that flag both as violations, so leaving
them in place is borrowing trouble against the next platform bump.

Add the platform contract assertions explicitly so any future bypass
fails fast at construction / call time, rather than relying on
platform-mode-dependent runtime checks that may or may not be active.

Enabling mounted engine navigation from the UI (a canNavigate() override)
is intentionally out of scope; this commit only makes the existing
NavigationItem implementation safe for the callers that already invoke
it.

Tests:
- ./gradlew check
- Manual verification via ./gradlew runIde against a Rails app with
  mounted engines: no assertion violations in the IDE log, tool window
  renders normally, mounted engine row shows the expected icon and
  qualified title.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Enforce IntelliJ Platform threading contracts in routes view and mounted engine navigation
CopyRouteActionBase.update() reads the selected route through
PlatformDataKeys.SELECTED_ITEM. When the data context is backed by
RoutesTable, that path reads Swing selection/model state with
selectedRow and convertRowIndexToModel(...), so the action update must
run on the EDT.

Switch the ActionUpdateThread contracts for CopyRouteActionBase and
RouteCopyProvider from BGT to EDT. The update/copy paths only read route
data already stored on BaseRoute and derive strings from routeName,
routePath, and requestMethod, so this does not add PSI or index work to
the EDT.

Add tests covering the update-thread contract for CopyRouteNameAction,
CopyRoutePathAction, CopyRouteFullPathAction, and RouteCopyProvider.

Tests:
- ./gradlew check
- Manual verification via ./gradlew runIde against a Rails app: Copy
  Route Name / Path / Full Path each work for single and multi
  selection, with no assertion violations in the IDE log.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…hread-edt

Move copy route action updates onto the EDT
@thinkAmi thinkAmi merged commit 047bf8f into main May 12, 2026
8 checks passed
@thinkAmi thinkAmi deleted the epic/support_ide_2026 branch May 12, 2026 22:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant