class RuboCop::Cop::Bundler::GemVersion

Enforce that Gem version specifications or a commit reference (branch, ref, or tag) are either required or forbidden.

@example EnforcedStyle: required (default)

# bad
gem 'rubocop'

# good
gem 'rubocop', '~> 1.12'

# good
gem 'rubocop', '>= 1.10.0'

# good
gem 'rubocop', '>= 1.5.0', '< 1.10.0'

# good
gem 'rubocop', branch: 'feature-branch'

# good
gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'

# good
gem 'rubocop', tag: 'v1.17.0'

@example EnforcedStyle: forbidden

# good
gem 'rubocop'

# bad
gem 'rubocop', '~> 1.12'

# bad
gem 'rubocop', '>= 1.10.0'

# bad
gem 'rubocop', '>= 1.5.0', '< 1.10.0'

# bad
gem 'rubocop', branch: 'feature-branch'

# bad
gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'

# bad
gem 'rubocop', tag: 'v1.17.0'

Constants

FORBIDDEN_MSG
REQUIRED_MSG
VERSION_SPECIFICATION_REGEX

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubocop/cop/bundler/gem_version.rb, line 71
def on_send(node)
  return unless gem_declaration?(node)
  return if allowed_gem?(node)

  if offense?(node)
    add_offense(node)
    opposite_style_detected
  else
    correct_style_detected
  end
end

Private Instance Methods

allowed_gem?(node) click to toggle source
# File lib/rubocop/cop/bundler/gem_version.rb, line 85
def allowed_gem?(node)
  allowed_gems.include?(node.first_argument.value)
end
allowed_gems() click to toggle source
# File lib/rubocop/cop/bundler/gem_version.rb, line 89
def allowed_gems
  Array(cop_config['AllowedGems'])
end
forbidden_offense?(node) click to toggle source
# File lib/rubocop/cop/bundler/gem_version.rb, line 113
def forbidden_offense?(node)
  return unless forbidden_style?

  includes_version_specification?(node) || includes_commit_reference?(node)
end
forbidden_style?() click to toggle source
# File lib/rubocop/cop/bundler/gem_version.rb, line 119
def forbidden_style?
  style == :forbidden
end
message(range) click to toggle source
# File lib/rubocop/cop/bundler/gem_version.rb, line 93
def message(range)
  gem_specification = range.source

  if required_style?
    format(REQUIRED_MSG, gem_specification: gem_specification)
  elsif forbidden_style?
    format(FORBIDDEN_MSG, gem_specification: gem_specification)
  end
end
offense?(node) click to toggle source
# File lib/rubocop/cop/bundler/gem_version.rb, line 103
def offense?(node)
  required_offense?(node) || forbidden_offense?(node)
end
required_offense?(node) click to toggle source
# File lib/rubocop/cop/bundler/gem_version.rb, line 107
def required_offense?(node)
  return unless required_style?

  !includes_version_specification?(node) && !includes_commit_reference?(node)
end
required_style?() click to toggle source
# File lib/rubocop/cop/bundler/gem_version.rb, line 123
def required_style?
  style == :required
end
version_specification?(expression) click to toggle source
# File lib/rubocop/cop/bundler/gem_version.rb, line 127
def version_specification?(expression)
  expression.match?(VERSION_SPECIFICATION_REGEX)
end