class RuboCop::Cop::Gemspec::DependencyVersion

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

@example EnforcedStyle: required (default)

# bad
Gem::Specification.new do |spec|
  spec.add_dependency 'parser'
end

# bad
Gem::Specification.new do |spec|
  spec.add_development_dependency 'parser'
end

# good
Gem::Specification.new do |spec|
  spec.add_dependency 'parser', '>= 2.3.3.1', '< 3.0'
end

# good
Gem::Specification.new do |spec|
  spec.add_development_dependency 'parser', '>= 2.3.3.1', '< 3.0'
end

@example EnforcedStyle: forbidden

# bad
Gem::Specification.new do |spec|
  spec.add_dependency 'parser', '>= 2.3.3.1', '< 3.0'
end

# bad
Gem::Specification.new do |spec|
  spec.add_development_dependency 'parser', '>= 2.3.3.1', '< 3.0'
end

# good
Gem::Specification.new do |spec|
  spec.add_dependency 'parser'
end

# good
Gem::Specification.new do |spec|
  spec.add_development_dependency 'parser'
end

Constants

FORBIDDEN_MSG
REQUIRED_MSG
VERSION_SPECIFICATION_REGEX

Public Instance Methods

on_new_investigation() click to toggle source
# File lib/rubocop/cop/gemspec/dependency_version.rb, line 77
def on_new_investigation
  return if processed_source.blank?

  add_dependency_method_nodes.each do |node|
    next if allowed_gem?(node)

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

Private Instance Methods

add_dependency_method?(method_name) click to toggle source
# File lib/rubocop/cop/gemspec/dependency_version.rb, line 118
def add_dependency_method?(method_name)
  method_name.to_s.end_with?('_dependency')
end
add_dependency_method_nodes() click to toggle source
# File lib/rubocop/cop/gemspec/dependency_version.rb, line 122
def add_dependency_method_nodes
  add_dependency_method_declarations(processed_source.ast)
end
allowed_gem?(node) click to toggle source
# File lib/rubocop/cop/gemspec/dependency_version.rb, line 94
def allowed_gem?(node)
  allowed_gems.include?(node.first_argument.value)
end
allowed_gems() click to toggle source
# File lib/rubocop/cop/gemspec/dependency_version.rb, line 98
def allowed_gems
  Array(cop_config['AllowedGems'])
end
forbidden_offense?(node) click to toggle source
# File lib/rubocop/cop/gemspec/dependency_version.rb, line 136
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/gemspec/dependency_version.rb, line 142
def forbidden_style?
  style == :forbidden
end
match_block_variable_name?(receiver_name) click to toggle source
# File lib/rubocop/cop/gemspec/dependency_version.rb, line 112
def match_block_variable_name?(receiver_name)
  gem_specification(processed_source.ast) do |block_variable_name|
    return block_variable_name == receiver_name
  end
end
message(range) click to toggle source
# File lib/rubocop/cop/gemspec/dependency_version.rb, line 102
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/gemspec/dependency_version.rb, line 126
def offense?(node)
  required_offense?(node) || forbidden_offense?(node)
end
required_offense?(node) click to toggle source
# File lib/rubocop/cop/gemspec/dependency_version.rb, line 130
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/gemspec/dependency_version.rb, line 146
def required_style?
  style == :required
end
version_specification?(expression) click to toggle source
# File lib/rubocop/cop/gemspec/dependency_version.rb, line 150
def version_specification?(expression)
  expression.match?(VERSION_SPECIFICATION_REGEX)
end