class Dependabot::Dependency

Attributes

name[R]
package_manager[R]
previous_requirements[R]
previous_version[R]
requirements[R]
subdependency_metadata[R]
version[R]

Public Class Methods

display_name_builder_for_package_manager(package_manager) click to toggle source
# File lib/dependabot/dependency.rb, line 22
def self.display_name_builder_for_package_manager(package_manager)
  @display_name_builders[package_manager]
end
name_normaliser_for_package_manager(package_manager) click to toggle source
# File lib/dependabot/dependency.rb, line 30
def self.name_normaliser_for_package_manager(package_manager)
  @name_normalisers[package_manager] || ->(name) { name }
end
new(name:, requirements:, package_manager:, version: nil, previous_version: nil, previous_requirements: nil, subdependency_metadata: []) click to toggle source
# File lib/dependabot/dependency.rb, line 42
def initialize(name:, requirements:, package_manager:, version: nil,
               previous_version: nil, previous_requirements: nil,
               subdependency_metadata: [])
  @name = name
  @version = version
  @requirements = requirements.map { |req| symbolize_keys(req) }
  @previous_version = previous_version
  @previous_requirements =
    previous_requirements&.map { |req| symbolize_keys(req) }
  @package_manager = package_manager
  unless top_level? || subdependency_metadata == []
    @subdependency_metadata = subdependency_metadata&.
                              map { |h| symbolize_keys(h) }
  end

  check_values
end
production_check_for_package_manager(package_manager) click to toggle source
# File lib/dependabot/dependency.rb, line 11
def self.production_check_for_package_manager(package_manager)
  production_check = @production_checks[package_manager]
  return production_check if production_check

  raise "Unsupported package_manager #{package_manager}"
end
register_display_name_builder(package_manager, name_builder) click to toggle source
# File lib/dependabot/dependency.rb, line 26
def self.register_display_name_builder(package_manager, name_builder)
  @display_name_builders[package_manager] = name_builder
end
register_name_normaliser(package_manager, name_builder) click to toggle source
# File lib/dependabot/dependency.rb, line 34
def self.register_name_normaliser(package_manager, name_builder)
  @name_normalisers[package_manager] = name_builder
end
register_production_check(package_manager, production_check) click to toggle source
# File lib/dependabot/dependency.rb, line 18
def self.register_production_check(package_manager, production_check)
  @production_checks[package_manager] = production_check
end

Public Instance Methods

==(other) click to toggle source
# File lib/dependabot/dependency.rb, line 102
def ==(other)
  other.instance_of?(self.class) && to_h == other.to_h
end
appears_in_lockfile?() click to toggle source
# File lib/dependabot/dependency.rb, line 76
def appears_in_lockfile?
  previous_version || (version && previous_requirements.nil?)
end
display_name() click to toggle source
# File lib/dependabot/dependency.rb, line 94
def display_name
  display_name_builder =
    self.class.display_name_builder_for_package_manager(package_manager)
  return name unless display_name_builder

  display_name_builder.call(name)
end
eql?(other) click to toggle source
# File lib/dependabot/dependency.rb, line 110
def eql?(other)
  self.==(other)
end
hash() click to toggle source
# File lib/dependabot/dependency.rb, line 106
def hash
  to_h.hash
end
production?() click to toggle source
# File lib/dependabot/dependency.rb, line 80
def production?
  return subdependency_production_check unless top_level?

  groups = requirements.flat_map { |r| r.fetch(:groups).map(&:to_s) }

  self.class.
    production_check_for_package_manager(package_manager).
    call(groups)
end
subdependency_production_check() click to toggle source
# File lib/dependabot/dependency.rb, line 90
def subdependency_production_check
  !subdependency_metadata&.all? { |h| h[:production] == false }
end
to_h() click to toggle source
# File lib/dependabot/dependency.rb, line 64
def to_h
  {
    "name" => name,
    "version" => version,
    "requirements" => requirements,
    "previous_version" => previous_version,
    "previous_requirements" => previous_requirements,
    "package_manager" => package_manager,
    "subdependency_metadata" => subdependency_metadata
  }.compact
end
top_level?() click to toggle source
# File lib/dependabot/dependency.rb, line 60
def top_level?
  requirements.any?
end

Private Instance Methods

check_requirement_fields() click to toggle source
# File lib/dependabot/dependency.rb, line 125
def check_requirement_fields
  requirement_fields = [requirements, previous_requirements].compact
  unless requirement_fields.all? { |r| r.is_a?(Array) } &&
         requirement_fields.flatten.all? { |r| r.is_a?(Hash) }
    raise ArgumentError, "requirements must be an array of hashes"
  end

  required_keys = %i(requirement file groups source)
  optional_keys = %i(metadata)
  unless requirement_fields.flatten.
         all? { |r| required_keys.sort == (r.keys - optional_keys).sort }
    raise ArgumentError, "each requirement must have the following "\
                         "required keys: #{required_keys.join(', ')}."\
                         "Optionally, it may have the following keys: "\
                         "#{optional_keys.join(', ')}."
  end

  return if requirement_fields.flatten.none? { |r| r[:requirement] == "" }

  raise ArgumentError, "blank strings must not be provided as requirements"
end
check_subdependency_metadata() click to toggle source
# File lib/dependabot/dependency.rb, line 147
def check_subdependency_metadata
  return unless subdependency_metadata

  unless subdependency_metadata.is_a?(Array) &&
         subdependency_metadata.all? { |r| r.is_a?(Hash) }
    raise ArgumentError, "subdependency_metadata must be an array of hashes"
  end
end
check_values() click to toggle source
# File lib/dependabot/dependency.rb, line 116
def check_values
  if [version, previous_version].any? { |v| v == "" }
    raise ArgumentError, "blank strings must not be provided as versions"
  end

  check_requirement_fields
  check_subdependency_metadata
end
symbolize_keys(hash) click to toggle source
# File lib/dependabot/dependency.rb, line 156
def symbolize_keys(hash)
  hash.keys.map { |k| [k.to_sym, hash[k]] }.to_h
end