class Dependabot::FileParsers::Base::DependencySet

Attributes

dependencies[R]

Public Class Methods

new(dependencies = [], case_sensitive: false) click to toggle source
# File lib/dependabot/file_parsers/base/dependency_set.rb, line 11
def initialize(dependencies = [], case_sensitive: false)
  unless dependencies.is_a?(Array) &&
         dependencies.all? { |dep| dep.is_a?(Dependency) }
    raise ArgumentError, "must be an array of Dependency objects"
  end

  @dependencies = dependencies
  @case_sensitive = case_sensitive
end

Public Instance Methods

+(other) click to toggle source
# File lib/dependabot/file_parsers/base/dependency_set.rb, line 40
def +(other)
  raise ArgumentError, "must be a DependencySet" unless other.is_a?(DependencySet)

  other.dependencies.each { |dep| self << dep }
  self
end
<<(dep) click to toggle source
# File lib/dependabot/file_parsers/base/dependency_set.rb, line 23
def <<(dep)
  raise ArgumentError, "must be a Dependency object" unless dep.is_a?(Dependency)

  existing_dependency = dependency_for_name(dep.name)

  return self if existing_dependency&.to_h == dep.to_h

  if existing_dependency
    dependencies[dependencies.index(existing_dependency)] =
      combined_dependency(existing_dependency, dep)
  else
    dependencies << dep
  end

  self
end

Private Instance Methods

case_sensitive?() click to toggle source
# File lib/dependabot/file_parsers/base/dependency_set.rb, line 49
def case_sensitive?
  @case_sensitive
end
combined_dependency(old_dep, new_dep) click to toggle source
# File lib/dependabot/file_parsers/base/dependency_set.rb, line 59
def combined_dependency(old_dep, new_dep)
  package_manager = old_dep.package_manager
  v_cls = Utils.version_class_for_package_manager(package_manager)

  # If we already have a requirement use the existing version
  # (if present). Otherwise, use whatever the lowest version is
  new_version =
    if old_dep.requirements.any? then old_dep.version || new_dep.version
    elsif !v_cls.correct?(new_dep.version) then old_dep.version
    elsif !v_cls.correct?(old_dep.version) then new_dep.version
    elsif v_cls.new(new_dep.version) > v_cls.new(old_dep.version)
      old_dep.version
    else new_dep.version
    end

  subdependency_metadata = (
    (old_dep.subdependency_metadata || []) +
    (new_dep.subdependency_metadata || [])
  ).uniq

  Dependency.new(
    name: old_dep.name,
    version: new_version,
    requirements: (old_dep.requirements + new_dep.requirements).uniq,
    package_manager: package_manager,
    subdependency_metadata: subdependency_metadata
  )
end
dependency_for_name(name) click to toggle source
# File lib/dependabot/file_parsers/base/dependency_set.rb, line 53
def dependency_for_name(name)
  return dependencies.find { |d| d.name == name } if case_sensitive?

  dependencies.find { |d| d.name&.downcase == name&.downcase }
end