diff --git a/changelog/change_migrate_to_requires_gem_api.md b/changelog/change_migrate_to_requires_gem_api.md new file mode 100644 index 0000000000..5723b0479e --- /dev/null +++ b/changelog/change_migrate_to_requires_gem_api.md @@ -0,0 +1 @@ +* [#1137](https://github.com/rubocop/rubocop-rails/pull/1137): Migrate to `TargetRailsVersion` the new [`requires_gem` API](https://github.com/rubocop/rubocop/pull/12186). ([@amomchilov][]) diff --git a/lib/rubocop/cop/mixin/target_rails_version.rb b/lib/rubocop/cop/mixin/target_rails_version.rb index 6f9021407f..4dca5074ae 100644 --- a/lib/rubocop/cop/mixin/target_rails_version.rb +++ b/lib/rubocop/cop/mixin/target_rails_version.rb @@ -4,13 +4,40 @@ module RuboCop module Cop # Common functionality for checking target rails version. module TargetRailsVersion + # Informs the base RuboCop gem that it the Rails version is checked via `requires_gem` API, + # without needing to call this `#support_target_rails_version` method. + USES_REQUIRES_GEM_API = true + def minimum_target_rails_version(version) - @minimum_target_rails_version = version + if respond_to?(:requires_gem) + case version + when Integer, Float then requires_gem(TARGET_GEM_NAME, ">= #{version}") + when String then requires_gem(TARGET_GEM_NAME, version) + end + else + # Fallback path for previous versions of RuboCop which don't support the `requires_gem` API yet. + @minimum_target_rails_version = version + end end def support_target_rails_version?(version) - @minimum_target_rails_version <= version + if respond_to?(:requires_gem) + return false unless gem_requirements + + gem_requirement = gem_requirements[TARGET_GEM_NAME] + return true unless gem_requirement # If we have no requirement, then we support all versions + + gem_requirement.satisfied_by?(Gem::Version.new(version)) + else + # Fallback path for previous versions of RuboCop which don't support the `requires_gem` API yet. + @minimum_target_rails_version <= version + end end + + # Look for `railties` instead of `rails`, to support apps that only use a subset of `rails` + # See https://github.com/rubocop/rubocop/pull/11289 + TARGET_GEM_NAME = 'railties' + private_constant :TARGET_GEM_NAME end end end