Migrate the test suite to minitest 6, fix the Volume version fallback, and regenerate the RuboCop baseline - #556
Open
tas50 wants to merge 3 commits into
Open
Conversation
minitest 6 removed both of the `class Object` monkeypatches that minitest 5
installed, and the suite depended on each of them:
* `minitest/spec` no longer includes `Minitest::Expectations` into Object,
so a bare `foo.must_equal bar` raises NoMethodError. The explicit
`_(foo).must_equal bar` form resolves through `Minitest::Expectation`
instead, and works on minitest 5.11+ and 6.x alike.
* `minitest/mock` was extracted into the standalone minitest-mock gem,
taking `Object#stub` with it.
Together these left `rake tests:mock` with 645 errors and `rake tests:unit`
with 4, every one of them a NoMethodError rather than a real assertion.
* Wrap all 1295 expectation receivers in `_(...)` across test/, spec/ and
unit/. `must_match_schema`, which fog-core registers via
`infect_an_assertion`, keeps working unchanged in this form.
* Add the minitest-mock development dependency and require it from
unit/test_helper.rb for `Object#stub`.
* Replace `must_equal nil` with `must_be_nil`. minitest rejects the former,
which the NoMethodErrors had been masking.
* Split the `must_raise(Excon::Errors::BadRequest, /message/)` call in
spec/volume_spec.rb into an exception assertion and a message assertion.
minitest splats those arguments into a `rescue` clause, so the Regexp
raised a TypeError; that escaped the `begin`, ran the `ensure` early and
left its failure reported in place of the real one.
* Add rubocop-minitest and enable Minitest/GlobalExpectations so the
explicit form does not regress. The rest of the Minitest department stays
off, as it is not part of the current baseline.
* Fix the .gitignore entry for the generated test/lorem.txt fixture.
`rake tests:mock` and `rake tests:unit` now pass, and RuboCop reports no new
offenses against the existing baseline.
Signed-off-by: Tim Smith <tsmith84@proton.me>
Fog::OpenStack::Volume.new documents that it returns a V3, V2 or V1 service,
"choosing the V3 by default", and implemented that as:
Fog::OpenStack::Volume::V3.new(args) \
|| Fog::OpenStack::Volume::V2.new(args) \
|| Fog::OpenStack::Volume::V1.new(args)
Fog::Service.new never returns nil or false, so the `||` arms were dead code.
When the catalog does not advertise a "volumev3" endpoint, V3.new raises
Fog::OpenStack::Auth::Catalog::ServiceTypeError and the fallback meant to
handle exactly that case never runs, leaving the caller with an exception
rather than the V2 or V1 service the cloud does offer.
Rescue ServiceTypeError and try each version in turn, re-raising the last
error when the catalog advertises no volume service at all.
unit/volume_test.rb covers the four outcomes, stubbing the versioned classes
so the negotiation is exercised without a token endpoint. Both fallback cases
fail against the previous implementation.
spec/volume_spec.rb no longer runs the shared examples against the
version-negotiating entry point. Negotiation authenticates once per version it
tries, and those cassettes recorded a single token request each, so they
cannot represent it. V1 and V2 stay covered there.
Signed-off-by: Tim Smith <tsmith84@proton.me>
houndci-bot
reviewed
Aug 28, 2026
houndci-bot
left a comment
There was a problem hiding this comment.
Some files could not be reviewed due to errors:
.rubocop.yml: Layout/EmptyLineAfterGuardClause has the wrong namespace - shou...
.rubocop.yml: Layout/EmptyLineAfterGuardClause has the wrong namespace - should be Style .rubocop.yml: Layout/LineLength has the wrong namespace - should be Metrics Warning: unrecognized cop Gemspec/DevelopmentDependencies found in .rubocop.yml Warning: unrecognized cop Gemspec/RequireMFA found in .rubocop.yml Warning: unrecognized cop Layout/ArgumentAlignment found in .rubocop.yml Warning: unrecognized cop Layout/EmptyLinesAfterModuleInclusion found in .rubocop.yml Warning: unrecognized cop Layout/FirstArgumentIndentation found in .rubocop.yml Warning: unrecognized cop Layout/FirstArrayElementIndentation found in .rubocop.yml Warning: unrecognized cop Layout/FirstHashElementIndentation found in .rubocop.yml Warning: unrecognized cop Layout/HashAlignment found in .rubocop.yml Warning: unrecognized cop Layout/LeadingEmptyLines found in .rubocop.yml Warning: unrecognized cop Layout/LineContinuationLeadingSpace found in .rubocop.yml Warning: unrecognized cop Layout/LineContinuationSpacing found in .rubocop.yml Warning: unrecognized cop Layout/LineEndStringConcatenationIndentation found in .rubocop.yml Warning: unrecognized cop Lint/AmbiguousOperatorPrecedence found in .rubocop.yml Warning: unrecognized cop Lint/ConstantDefinitionInBlock found in .rubocop.yml Warning: unrecognized cop Lint/DuplicateBranch found in .rubocop.yml Warning: unrecognized cop Lint/EmptyBlock found in .rubocop.yml Warning: unrecognized cop Lint/EmptyClass found in .rubocop.yml Warning: unrecognized cop Lint/EmptyFile found in .rubocop.yml Warning: unrecognized cop Lint/RedundantCopDisableDirective found in .rubocop.yml Warning: unrecognized cop Lint/SuppressedException found in .rubocop.yml Warning: unrecognized cop Lint/SymbolConversion found in .rubocop.yml Warning: unrecognized cop Lint/UselessMethodDefinition found in .rubocop.yml Warning: unrecognized cop Naming/MethodParameterName found in .rubocop.yml Warning: unrecognized cop Naming/PredicateMethod found in .rubocop.yml Warning: unrecognized cop Naming/RescuedExceptionsVariableName found in .rubocop.yml Warning: unrecognized cop Style/AccessorGrouping found in .rubocop.yml Warning: unrecognized cop Style/BisectedAttrAccessor found in .rubocop.yml Warning: unrecognized cop Style/ClassEqualityComparison found in .rubocop.yml Warning: unrecognized cop Style/DirectiveScope found in .rubocop.yml Warning: unrecognized cop Style/DocumentDynamicEvalDefinition found in .rubocop.yml Warning: unrecognized cop Style/EnvHome found in .rubocop.yml Warning: unrecognized cop Style/ExplicitBlockArgument found in .rubocop.yml Warning: unrecognized cop Style/FetchEnvVar found in .rubocop.yml Warning: unrecognized cop Style/FileOpen found in .rubocop.yml Warning: unrecognized cop Style/FileWrite found in .rubocop.yml Warning: unrecognized cop Style/HashAsLastArrayItem found in .rubocop.yml Warning: unrecognized cop Style/HashConversion found in .rubocop.yml Warning: unrecognized cop Style/HashEachMethods found in .rubocop.yml Warning: unrecognized cop Style/MapIntoArray found in .rubocop.yml Warning: unrecognized cop Style/MissingRespondToMissing found in .rubocop.yml Warning: unrecognized cop Style/NegatedIfElseCondition found in .rubocop.yml Warning: unrecognized cop Style/OptionalBooleanParameter found in .rubocop.yml Warning: unrecognized cop Style/RedundantConstantBase found in .rubocop.yml Warning: unrecognized cop Style/RedundantCurrentDirectoryInPath found in .rubocop.yml Warning: unrecognized cop Style/RedundantFileExtensionInRequire found in .rubocop.yml Warning: unrecognized cop Style/RedundantPercentQ found in .rubocop.yml Warning: unrecognized cop Style/RedundantRegexpArgument found in .rubocop.yml Warning: unrecognized cop Style/RedundantRegexpEscape found in .rubocop.yml Warning: unrecognized cop Style/SoleNestedConditional found in .rubocop.yml Warning: unrecognized cop Style/StringConcatenation found in .rubocop.yml Warning: unrecognized cop Style/SuperArguments found in .rubocop.yml Warning: unrecognized cop Style/SuperWithArgsParentheses found in .rubocop.yml Warning: unrecognized cop Style/YAMLFileRead found in .rubocop.yml Warning: unrecognized cop plugins found in .rubocop.yml Warning: unrecognized cop Minitest found in .rubocop.yml Warning: unrecognized cop Minitest/GlobalExpectations found in .rubocop.yml Warning: unrecognized parameter AllCops:NewCops found in .rubocop.yml Warning: unrecognized parameter Metrics/BlockLength:IgnoredMethods found in .rubocop.yml no implicit conversion of String into Integer /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config.rb:294:in `block in make_excludes_absolute' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config.rb:268:in `each_key' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config.rb:292:in `make_excludes_absolute' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config.rb:239:in `check' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config.rb:231:in `create' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config_loader.rb:54:in `load_file' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config_loader.rb:83:in `configuration_from_file' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config_store.rb:44:in `for' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/cli.rb:181:in `apply_default_formatter' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/cli.rb:40:in `run' /home/linters/.bundle/gems/rubocop-0.54.0/bin/rubocop:13:in `block in ' /usr/local/lib/ruby/2.6.0/benchmark.rb:308:in `realtime' /home/linters/.bundle/gems/rubocop-0.54.0/bin/rubocop:12:in `' /home/linters/.bundle/bin/rubocop:23:in `load' /home/linters/.bundle/bin/rubocop:23:in `' /usr/local/lib/ruby/2.6.0/bundler/cli/exec.rb:74:in `load' /usr/local/lib/ruby/2.6.0/bundler/cli/exec.rb:74:in `kernel_load' /usr/local/lib/ruby/2.6.0/bundler/cli/exec.rb:28:in `run' /usr/local/lib/ruby/2.6.0/bundler/cli.rb:463:in `exec' /usr/local/lib/ruby/2.6.0/bundler/vendor/thor/lib/thor/command.rb:27:in `run' /usr/local/lib/ruby/2.6.0/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command' /usr/local/lib/ruby/2.6.0/bundler/vendor/thor/lib/thor.rb:387:in `dispatch' /usr/local/lib/ruby/2.6.0/bundler/cli.rb:27:in `dispatch' /usr/local/lib/ruby/2.6.0/bundler/vendor/thor/lib/thor/base.rb:466:in `start' /usr/local/lib/ruby/2.6.0/bundler/cli.rb:18:in `start' /usr/local/lib/ruby/gems/2.6.0/gems/bundler-1.17.2/exe/bundle:30:in `block in ' /usr/local/lib/ruby/2.6.0/bundler/friendly_errors.rb:124:in `with_friendly_errors' /usr/local/lib/ruby/gems/2.6.0/gems/bundler-1.17.2/exe/bundle:22:in `' /usr/local/bin/bundle:23:in `load' /usr/local/bin/bundle:23:in `'
The Linting workflow has been failing on master with 108 offenses, none of
which are new code. Gemfile.lock is not committed and the rubocop development
dependency is unconstrained, so every CI run resolves the newest RuboCop. When
a release adds cops, offenses appear in code that has not changed and the
baseline no longer matches.
The 108 fall entirely into four cops that postdate the last baseline:
Style/CollectionCompact, Style/HashSlice, Style/NumericPredicate and
Style/SafeNavigation.
Regenerated with the same flags recorded in the file header:
rubocop --auto-gen-config --no-exclude-limit --no-auto-gen-timestamp
This also drops the now-obsolete Lint/UriEscapeUnescape entry, which became
unnecessary when URI.encode was replaced in e51026e.
`bundle exec rubocop` now reports no offenses. Minitest/GlobalExpectations is
not suppressed, so it still guards the explicit expectation form.
Signed-off-by: Tim Smith <tsmith84@proton.me>
houndci-bot
reviewed
Aug 28, 2026
houndci-bot
left a comment
There was a problem hiding this comment.
Some files could not be reviewed due to errors:
.rubocop.yml: Layout/EmptyLineAfterGuardClause has the wrong namespace - shou...
.rubocop.yml: Layout/EmptyLineAfterGuardClause has the wrong namespace - should be Style .rubocop.yml: Layout/LineLength has the wrong namespace - should be Metrics Warning: unrecognized cop Gemspec/DevelopmentDependencies found in .rubocop.yml Warning: unrecognized cop Gemspec/RequireMFA found in .rubocop.yml Warning: unrecognized cop Layout/ArgumentAlignment found in .rubocop.yml Warning: unrecognized cop Layout/EmptyLinesAfterModuleInclusion found in .rubocop.yml Warning: unrecognized cop Layout/FirstArgumentIndentation found in .rubocop.yml Warning: unrecognized cop Layout/FirstArrayElementIndentation found in .rubocop.yml Warning: unrecognized cop Layout/FirstHashElementIndentation found in .rubocop.yml Warning: unrecognized cop Layout/HashAlignment found in .rubocop.yml Warning: unrecognized cop Layout/LeadingEmptyLines found in .rubocop.yml Warning: unrecognized cop Layout/LineContinuationLeadingSpace found in .rubocop.yml Warning: unrecognized cop Layout/LineContinuationSpacing found in .rubocop.yml Warning: unrecognized cop Layout/LineEndStringConcatenationIndentation found in .rubocop.yml Warning: unrecognized cop Lint/AmbiguousOperatorPrecedence found in .rubocop.yml Warning: unrecognized cop Lint/ConstantDefinitionInBlock found in .rubocop.yml Warning: unrecognized cop Lint/DuplicateBranch found in .rubocop.yml Warning: unrecognized cop Lint/EmptyBlock found in .rubocop.yml Warning: unrecognized cop Lint/EmptyClass found in .rubocop.yml Warning: unrecognized cop Lint/EmptyFile found in .rubocop.yml Warning: unrecognized cop Lint/RedundantCopDisableDirective found in .rubocop.yml Warning: unrecognized cop Lint/SuppressedException found in .rubocop.yml Warning: unrecognized cop Lint/SymbolConversion found in .rubocop.yml Warning: unrecognized cop Lint/UselessMethodDefinition found in .rubocop.yml Warning: unrecognized cop Naming/MethodParameterName found in .rubocop.yml Warning: unrecognized cop Naming/PredicateMethod found in .rubocop.yml Warning: unrecognized cop Naming/RescuedExceptionsVariableName found in .rubocop.yml Warning: unrecognized cop Style/AccessorGrouping found in .rubocop.yml Warning: unrecognized cop Style/BisectedAttrAccessor found in .rubocop.yml Warning: unrecognized cop Style/ClassEqualityComparison found in .rubocop.yml Warning: unrecognized cop Style/CollectionCompact found in .rubocop.yml Warning: unrecognized cop Style/DirectiveScope found in .rubocop.yml Warning: unrecognized cop Style/DocumentDynamicEvalDefinition found in .rubocop.yml Warning: unrecognized cop Style/EnvHome found in .rubocop.yml Warning: unrecognized cop Style/ExplicitBlockArgument found in .rubocop.yml Warning: unrecognized cop Style/FetchEnvVar found in .rubocop.yml Warning: unrecognized cop Style/FileOpen found in .rubocop.yml Warning: unrecognized cop Style/FileWrite found in .rubocop.yml Warning: unrecognized cop Style/HashAsLastArrayItem found in .rubocop.yml Warning: unrecognized cop Style/HashConversion found in .rubocop.yml Warning: unrecognized cop Style/HashEachMethods found in .rubocop.yml Warning: unrecognized cop Style/HashSlice found in .rubocop.yml Warning: unrecognized cop Style/MapIntoArray found in .rubocop.yml Warning: unrecognized cop Style/MissingRespondToMissing found in .rubocop.yml Warning: unrecognized cop Style/NegatedIfElseCondition found in .rubocop.yml Warning: unrecognized cop Style/OptionalBooleanParameter found in .rubocop.yml Warning: unrecognized cop Style/RedundantConstantBase found in .rubocop.yml Warning: unrecognized cop Style/RedundantCurrentDirectoryInPath found in .rubocop.yml Warning: unrecognized cop Style/RedundantFileExtensionInRequire found in .rubocop.yml Warning: unrecognized cop Style/RedundantPercentQ found in .rubocop.yml Warning: unrecognized cop Style/RedundantRegexpArgument found in .rubocop.yml Warning: unrecognized cop Style/RedundantRegexpEscape found in .rubocop.yml Warning: unrecognized cop Style/SoleNestedConditional found in .rubocop.yml Warning: unrecognized cop Style/StringConcatenation found in .rubocop.yml Warning: unrecognized cop Style/SuperArguments found in .rubocop.yml Warning: unrecognized cop Style/SuperWithArgsParentheses found in .rubocop.yml Warning: unrecognized cop Style/YAMLFileRead found in .rubocop.yml Warning: unrecognized cop plugins found in .rubocop.yml Warning: unrecognized cop Minitest found in .rubocop.yml Warning: unrecognized cop Minitest/GlobalExpectations found in .rubocop.yml Warning: unrecognized parameter AllCops:NewCops found in .rubocop.yml Warning: unrecognized parameter Metrics/BlockLength:IgnoredMethods found in .rubocop.yml no implicit conversion of String into Integer /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config.rb:294:in `block in make_excludes_absolute' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config.rb:268:in `each_key' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config.rb:292:in `make_excludes_absolute' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config.rb:239:in `check' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config.rb:231:in `create' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config_loader.rb:54:in `load_file' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config_loader.rb:83:in `configuration_from_file' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/config_store.rb:44:in `for' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/cli.rb:181:in `apply_default_formatter' /home/linters/.bundle/gems/rubocop-0.54.0/lib/rubocop/cli.rb:40:in `run' /home/linters/.bundle/gems/rubocop-0.54.0/bin/rubocop:13:in `block in ' /usr/local/lib/ruby/2.6.0/benchmark.rb:308:in `realtime' /home/linters/.bundle/gems/rubocop-0.54.0/bin/rubocop:12:in `' /home/linters/.bundle/bin/rubocop:23:in `load' /home/linters/.bundle/bin/rubocop:23:in `' /usr/local/lib/ruby/2.6.0/bundler/cli/exec.rb:74:in `load' /usr/local/lib/ruby/2.6.0/bundler/cli/exec.rb:74:in `kernel_load' /usr/local/lib/ruby/2.6.0/bundler/cli/exec.rb:28:in `run' /usr/local/lib/ruby/2.6.0/bundler/cli.rb:463:in `exec' /usr/local/lib/ruby/2.6.0/bundler/vendor/thor/lib/thor/command.rb:27:in `run' /usr/local/lib/ruby/2.6.0/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command' /usr/local/lib/ruby/2.6.0/bundler/vendor/thor/lib/thor.rb:387:in `dispatch' /usr/local/lib/ruby/2.6.0/bundler/cli.rb:27:in `dispatch' /usr/local/lib/ruby/2.6.0/bundler/vendor/thor/lib/thor/base.rb:466:in `start' /usr/local/lib/ruby/2.6.0/bundler/cli.rb:18:in `start' /usr/local/lib/ruby/gems/2.6.0/gems/bundler-1.17.2/exe/bundle:30:in `block in ' /usr/local/lib/ruby/2.6.0/bundler/friendly_errors.rb:124:in `with_friendly_errors' /usr/local/lib/ruby/gems/2.6.0/gems/bundler-1.17.2/exe/bundle:22:in `' /usr/local/bin/bundle:23:in `load' /usr/local/bin/bundle:23:in `'
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Both workflows have been red since CI was added (run 33117772179):
rake tests:mockreported 645 errors,rake tests:unitanother 4, and Linting 108 offenses. This gets everything green on 3.3, 3.4, 4.0 and head.Why the tests broke
minitest 6 removed both of the
class Objectmonkeypatches that minitest 5 installed, and the suite leaned on each:minitest/specno longer doesclass Object; include Minitest::Expectations; end, so a barefoo.must_equal barraisesNoMethodError._(foo).must_equal bargoes throughMinitest::Expectationinstead.minitest/mockwas extracted into the standaloneminitest-mockgem, takingObject#stubwith it.Every one of the 649 failures was a
NoMethodErrorraised before the assertion ran — which is also why the run reported only 31 assertions. Nothing was actually being verified.Commit 1 — migrate the test suite
_(...)acrosstest/,spec/andunit/. This is compatible with minitest 5.11+ as well, so it needs no version pin. fog-core's custommust_match_schema(registered viainfect_an_assertion) keeps working unchanged in this form.minitest-mockdevelopment dependency and require it fromunit/test_helper.rb.must_equal nilwithmust_be_nil; minitest rejects the former, which theNoMethodErrors had been hiding.spec/volume_spec.rb:must_raise(Excon::Errors::BadRequest, /message/)was never valid, since minitest splats those arguments straight into arescueclause and a Regexp there is aTypeError. That error escaped thebegin, ran theensureearly, and left theensure's own failure reported in place of the real one.rubocop-minitestand enableMinitest/GlobalExpectationsso the explicit form does not regress. The rest of the Minitest department stays off, as it is not part of the baseline.The mechanical rewrite was done with a Prism-based script rather than by hand or by regex, because the receiver has to be wrapped as a whole (
@instance.reload.state.must_equal, multi-lineproc do ... end.must_raise). Worth noting that RuboCop's ownMinitest/GlobalExpectationsautocorrect is not safe here: it rewritesproc do ... end.must_raise Xto_ { proc do ... end }.must_raise X, which passes the outer block tomust_raise. Evaluating it just constructs a proc, nothing raises, and the assertion silently stops testing anything.Commit 2 — fix the Volume version fallback
Fog::OpenStack::Volume.newdocuments that it returns a V3, V2 or V1 service, and implemented that as:Fog::Service.newnever returns nil or false, so the||arms were dead code. On a cloud that does not advertise avolumev3endpoint,V3.newraisesServiceTypeErrorand the fallback meant to handle exactly that case never runs — the caller gets an exception instead of the V2 or V1 service the cloud does offer.This rescues
ServiceTypeErrorand tries each version in turn, re-raising the last error when no volume service is advertised at all.unit/volume_test.rbcovers the four outcomes with the versioned classes stubbed, so negotiation is exercised without a token endpoint; both fallback cases fail against the previous implementation.spec/volume_spec.rbno longer runs the shared examples against the version-negotiating entry point. Negotiation authenticates once per version it tries, and those cassettes (recorded in 2016, advertising only"type": "volume") contain a single token request each, so they cannot represent it. V1 and V2 stay covered there.Commit 3 — regenerate the RuboCop baseline
The 108 Linting offenses were not new code.
Gemfile.lockis not committed and therubocopdevelopment dependency is unconstrained, so every CI run resolves the newest RuboCop; when a release adds cops, offenses appear in code that has not changed and the baseline stops matching. All 108 fall into four cops that postdate the last baseline:Style/CollectionCompact,Style/HashSlice,Style/NumericPredicateandStyle/SafeNavigation.Regenerated with the same flags recorded in the file header:
This also drops the obsolete
Lint/UriEscapeUnescapeentry, which stopped being needed whenURI.encodewas replaced in e51026e.Minitest/GlobalExpectationsis not suppressed, so it still guards the explicit expectation form.Note this will recur on future RuboCop releases. Constraining the
rubocopdependency (or committing a lockfile for CI) would make the Linting job reproducible; happy to add that here or separately if you'd like.Verification