A tale of two RuboCop plugin gems.
This project uses rubocop_gradual instead of vanilla RuboCop for code style checking. The rubocop_gradual tool allows for gradual adoption of RuboCop rules by tracking violations in a lock file.
This project uses rubocop-lts to ensure, on a best-effort basis, compatibility with Ruby >= 1.9.2.
RuboCop rules are meticulously configured by the rubocop-lts family of gems to ensure that a project is compatible with a specific version of Ruby. See: https://rubocop-lts.gitlab.io for more.
To check for RuboCop violations in this project, always use:
bundle exec rake rubocop_gradual:checkDo not use the standard RuboCop commands like:
bundle exec rubocoprubocop
The .rubocop_gradual.lock file tracks all current RuboCop violations in the project. This allows the team to:
- Prevent new violations while gradually fixing existing ones
- Track progress on code style improvements
- Ensure CI builds don't fail due to pre-existing violations
- Check violations
bundle exec rake rubocop_gradualbundle exec rake rubocop_gradual:check
- (Safe) Autocorrect violations, and update lockfile if no new violations
bundle exec rake rubocop_gradual:autocorrect
- Force update the lock file (w/o autocorrect) to match violations present in code
bundle exec rake rubocop_gradual:force_update
- Before submitting a PR, run
bundle exec rake rubocop_gradual:autocorrecta. or just the defaultbundle exec rake, as autocorrection is a pre-requisite of the default task. - If there are new violations, either:
- Fix them in your code
- Run
bundle exec rake rubocop_gradual:force_updateto update the lock file (only for violations you can't fix immediately)
- Commit the updated
.rubocop_gradual.lockfile along with your changes
Do not add inline rubocop:disable / rubocop:enable comments anywhere in the codebase (including specs, except when following the few existing rubocop:disable patterns for a rule already being disabled elsewhere in the code). We handle exceptions in two supported ways:
- Permanent/structural exceptions: prefer adjusting the RuboCop configuration (e.g., in
.rubocop.yml) to exclude a rule for a path or file pattern when it makes sense project-wide. - Temporary exceptions while improving code: record the current violations in
.rubocop_gradual.lockvia the gradual workflow:bundle exec rake rubocop_gradual:autocorrect(preferred; will autocorrect what it can and update the lock only if no new violations were introduced)- If needed,
bundle exec rake rubocop_gradual:force_update(as a last resort when you cannot fix the newly reported violations immediately)
In general, treat the rules as guidance to follow; fix violations rather than ignore them. For example, RSpec conventions in this project expect described_class to be used in specs that target a specific class under test.
- Allows incremental adoption of code style rules
- Prevents CI failures due to pre-existing violations
- Provides a clear record of code style debt
- Enables focused efforts on improving code quality over time