Skip to content

Commit

Permalink
Fix required_ruby_version issue when using Gem::Requirement
Browse files Browse the repository at this point in the history
This fixes an issue when the `required_ruby_version` uses `Gem::Requirement` to define the Ruby version.

e.g.

```
s.required_ruby_version = Gem::Requirement.new('< 3.0.0')
```

Related to rubocop#8761
  • Loading branch information
cetinajero committed Nov 12, 2020
1 parent aba0e36 commit a451545
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 0 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

## master (unreleased)

### Bug fixes

* [#9037](https://github.com/rubocop-hq/rubocop/pull/9037): Fix `required_ruby_version` issue when using `Gem::Requirement`. ([@cetinajero][])

## 1.3.0 (2020-11-12)

### New features
Expand Down
8 changes: 8 additions & 0 deletions lib/rubocop/target_ruby.rb
Original file line number Diff line number Diff line change
Expand Up @@ -141,9 +141,17 @@ def find_version
return versions.compact.min
end

return gem_requirement_version(version) if version.send_type?

version_from_str(version.str_content)
end

def gem_requirement_version(version)
gem_requirement = version.children.last
versions = gem_requirement.children.map { |v| version_from_str(v) }
versions.compact.min
end

def gemspec_filename
@gemspec_filename ||= begin
basename = Pathname.new(@config.base_dir_for_path_parameters).basename.to_s
Expand Down
47 changes: 47 additions & 0 deletions spec/rubocop/target_ruby_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,53 @@
end
end

context 'when file contains `required_ruby_version` as a requirement' do
let(:base_path) { configuration.base_dir_for_path_parameters }
let(:gemspec_file_path) { File.join(base_path, 'example.gemspec') }

it 'sets target_ruby from required_ruby_version from exact requirement version' do
content =
<<-HEREDOC
Gem::Specification.new do |s|
s.name = 'test'
s.required_ruby_version = Gem::Requirement.new('2.7.4')
s.licenses = ['MIT']
end
HEREDOC

create_file(gemspec_file_path, content)
expect(target_ruby.version).to eq 2.7
end

it 'sets target_ruby from required_ruby_version from inclusive requirement range' do
content =
<<-HEREDOC
Gem::Specification.new do |s|
s.name = 'test'
s.required_ruby_version = Gem::Requirement.new('>= 3.0.0')
s.licenses = ['MIT']
end
HEREDOC

create_file(gemspec_file_path, content)
expect(target_ruby.version).to eq 3.0
end

it 'sets default target_ruby from exclusive requirement range' do
content =
<<-HEREDOC
Gem::Specification.new do |s|
s.name = 'test'
s.required_ruby_version = Gem::Requirement.new('< 3.0.0')
s.licenses = ['MIT']
end
HEREDOC

create_file(gemspec_file_path, content)
expect(target_ruby.version).to eq default_version
end
end

context 'when file contains `required_ruby_version` as an array' do
let(:base_path) { configuration.base_dir_for_path_parameters }
let(:gemspec_file_path) { File.join(base_path, 'example.gemspec') }
Expand Down

0 comments on commit a451545

Please sign in to comment.