Faster runs via RuboCop::Runner #573
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Every time we call
RuboCop::CLI#run
(which happens once per file being linted), it sets up a new RuboCop::Runner.This is pretty slow, especially from
RuboCop::Options#parse
andRuboCop::Runner#mobilized_cop_classes
.We can skip all this repeated setup by using RuboCop::Runner directly. This also means we don't have to capture the stdout/stderr streams from CLI, since the relevant information is available directly on the runner instance.
Before:
After:
I've introduced a subclass of RuboCop::Runner to handle some of the customizations we need. ruby-lsp have a similar approach here - https://github.com/Shopify/ruby-lsp/blob/13bb8b0addf96248a951dca988e40127c86b6ba8/lib/ruby_lsp/requests/support/rubocop_runner.rb#L54, which might be useful for comparison.