Shopify / Shopify/ruby-lsp

CodeLens Run Test In Terminal doesn't work (on Windows) due to incorrectly escaped Regex

Open
#3,759 6 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug help-wanted pinned
Dominant language
Ruby
Stars
2k
Forks
281
Avg merge
2h 14m
Merged PRs (30d)
6

Description

Description
Ruby LSP Information
VS Code Version

1.104.1

Ruby LSP Extension Version

0.9.32

Ruby LSP Server Version

0.26.1

Ruby LSP Add-ons
  • RuboCop (unknown)
Ruby Version

3.1.4

Ruby Version Manager

none

Installed Extensions
Click to expand
  • Lisp (0.1.12)
  • code-spell-checker (4.2.6)
  • color-highlight (2.8.0)
  • errorlens (3.26.0)
  • exercism-cli (0.2.2)
  • gitlens (17.4.1)
  • jikiscript (1.0.0)
  • postcss (1.0.9)
  • prettier-vscode (11.0.0)
  • rails (0.22.0)
  • rainbow-csv (3.22.0)
  • react-native-ide (1.3.0)
  • remote-explorer (0.5.0)
  • remote-ssh (0.120.0)
  • remote-ssh-edit (0.87.0)
  • ruby-lsp (0.9.32)
  • vscode-eslint (3.0.16)
  • vscode-expo-tools (1.6.1)
  • vscode-github-actions (0.27.2)
  • vscode-graphql (0.13.2)
  • vscode-graphql-syntax (1.3.8)
  • vscode-tailwindcss (0.14.26)
  • vscode-versionlens (1.22.4)
  • vscode-yaml (1.18.0)
  • vscode-zipfs (3.0.0)
  • vsliveshare (1.0.5959)
Ruby LSP Settings
Click to expand
Workspace
{
  "indexing": {
    "includedPatterns": [
      "lib/**/*.rb",
      "test/**/*.rb"
    ]
  }
}
User
{
  "enabledFeatures": {
    "codeActions": true,
    "diagnostics": true,
    "documentHighlights": true,
    "documentLink": true,
    "documentSymbols": true,
    "foldingRanges": true,
    "formatting": false,
    "hover": true,
    "inlayHint": true,
    "onTypeFormatting": false,
    "selectionRanges": true,
    "semanticHighlighting": true,
    "completion": true,
    "codeLens": true,
    "definition": true,
    "workspaceSymbol": true,
    "signatureHelp": true,
    "typeHierarchy": true
  },
  "featuresConfiguration": {},
  "addonSettings": {},
  "rubyVersionManager": {
    "identifier": "none"
  },
  "customRubyCommand": "",
  "formatter": "auto",
  "linters": null,
  "bundleGemfile": "",
  "testTimeout": 30,
  "branch": "",
  "pullDiagnosticsOn": "both",
  "useBundlerCompose": false,
  "bypassTypechecker": false,
  "rubyExecutablePath": "",
  "indexing": {
    "includedPatterns": [
      "lib/**/*.rb",
      "test/**/*.rb"
    ]
  },
  "erbSupport": true,
  "featureFlags": {},
  "sigOpacityLevel": "1"
}
Reproduction steps
  1. Start the Ruby LSP using VS Code
  2. Open a Ruby test file with a single test
  3. Click "Run Test in Terminal"
  4. Terminal reports no tests ran
class TestNothing < Minitest::Test
  def test_nothing
    refute_nil true
  end
end

The full file can be tested:

C:\Users\Derk-Jan\...snip...>bundle exec ruby -rC:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/ruby-lsp-0.26.1/lib/ruby_lsp/test_reporters/minitest_reporter.rb -rC:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/ruby-lsp-0.26.1/lib/ruby_lsp/test_reporters/test_unit_reporter.rb -Itest c:/Users/Derk-Jan/...snip.../test/test_nothing.rb --name "/^TestNothing(#|::)/"
Run options: --name "/^TestNothing(#|::)/" --seed 56682

# Running:

.

Finished in 0.015750s, 63.4917 runs/s, 63.4917 assertions/s.

Simplifying this command we see:

bundle exec ruby -rPathToLspProvidedReporter.rb -rPathToAnotherLspProvidedReporter.rb -Itest PathToFile --name "/^TestClassName(#|::)/"

There are three paths:

  • PathToLspProvidedReporter
  • PathToAnotherLspProvidedReporter
  • PathToFile

There is one regex matcher:

  • /^TestNothing(#|::)/

For a single test, we get:

C:\Users\Derk-Jan\...snip...>bundle exec ruby -rC:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/ruby-lsp-0.26.1/lib/ruby_lsp/test_reporters/minitest_reporter.rb -rC:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/ruby-lsp-0.26.1/lib/ruby_lsp/test_reporters/test_unit_reporter.rb -Itest c:/Users/Derk-Jan/...snip.../test_nothing.rb --name "/^TestNothing#test_nothing\$/"
Run options: --name "/^TestNothing#test_nothing\\$/" --seed 33369

[...]

Finished in 0.010229s, 0.0000 runs/s, 0.0000 assertions/s.

0 runs, 0 assertions, 0 failures, 0 errors, 0 skips
Nothing ran for filter: /^TestNothing#test_nothing\$/

The issue can be seen in the --name argument:

/^TestNothing#test_nothing\\$/

Removing the extra slash makes the entire command work again.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Trace the Ruby LSP CodeLens “Run Test in Terminal” command construction, using the reported minitest_reporter.rb and test_unit_reporter.rb paths as context. Reproduce the Windows command with the provided TestNothing example and inspect how the single-test regex is escaped. Done means the generated command runs the selected test instead of reporting zero tests.

Written by the indexing model from the issue text.

Assessment

Tech stack
ruby
Domain
tooling
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.