class RuboCop::Cop::Gemspec::RequiredRubyVersion

Checks that `required_ruby_version` of gemspec and `TargetRubyVersion` of .rubocop.yml are equal. Thereby, RuboCop to perform static analysis working on the version required by gemspec.

@example

# When `TargetRubyVersion` of .rubocop.yml is `2.5`.

# bad
Gem::Specification.new do |spec|
  spec.required_ruby_version = '>= 2.4.0'
end

# bad
Gem::Specification.new do |spec|
  spec.required_ruby_version = '>= 2.6.0'
end

# good
Gem::Specification.new do |spec|
  spec.required_ruby_version = '>= 2.5.0'
end

# good
Gem::Specification.new do |spec|
  spec.required_ruby_version = '>= 2.5'
end

# good
Gem::Specification.new do |spec|
  spec.required_ruby_version = ['>= 2.5.0', '< 2.7.0']
end

Constants

MSG

Public Instance Methods

investigate(processed_source) click to toggle source
# File lib/rubocop/cop/gemspec/required_ruby_version.rb, line 48
def investigate(processed_source)
  required_ruby_version(processed_source.ast) do |version|
    ruby_version = extract_ruby_version(version)

    return if ruby_version == target_ruby_version.to_s

    add_offense(
      processed_source.ast,
      location: version.loc.expression,
      message: message(ruby_version, target_ruby_version)
    )
  end
end

Private Instance Methods

extract_ruby_version(required_ruby_version) click to toggle source
# File lib/rubocop/cop/gemspec/required_ruby_version.rb, line 64
def extract_ruby_version(required_ruby_version)
  if required_ruby_version.array_type?
    required_ruby_version = required_ruby_version.children.detect do |v|
      v.str_content =~ /[>=]/
    end
  end

  required_ruby_version.str_content.match(/(\d\.\d)/)[1]
end
message(required_ruby_version, target_ruby_version) click to toggle source
# File lib/rubocop/cop/gemspec/required_ruby_version.rb, line 74
def message(required_ruby_version, target_ruby_version)
  format(
    MSG,
    required_ruby_version: required_ruby_version,
    gemspec_filename: File.basename(processed_source.file_path),
    target_ruby_version: target_ruby_version
  )
end