Class: Dependabot::Dependency

Inherits:
Object
  • Object
show all
Defined in:
lib/dependabot/dependency.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name:, requirements:, package_manager:, version: nil, previous_version: nil, previous_requirements: nil, subdependency_metadata: [], removed: false, metadata: {}) ⇒ Dependency

Returns a new instance of Dependency.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/dependabot/dependency.rb', line 42

def initialize(name:, requirements:, package_manager:, version: nil,
               previous_version: nil, previous_requirements: nil,
               subdependency_metadata: [], removed: false, 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 = &.
                              map { |h| symbolize_keys(h) }
  end
  @removed = removed
  @metadata = symbolize_keys( || {})

  check_values
end

Instance Attribute Details

#metadataObject (readonly)

Returns the value of attribute metadata.



38
39
40
# File 'lib/dependabot/dependency.rb', line 38

def 
  @metadata
end

#nameObject (readonly)

Returns the value of attribute name.



38
39
40
# File 'lib/dependabot/dependency.rb', line 38

def name
  @name
end

#package_managerObject (readonly)

Returns the value of attribute package_manager.



38
39
40
# File 'lib/dependabot/dependency.rb', line 38

def package_manager
  @package_manager
end

#previous_requirementsObject (readonly)

Returns the value of attribute previous_requirements.



38
39
40
# File 'lib/dependabot/dependency.rb', line 38

def previous_requirements
  @previous_requirements
end

#previous_versionObject (readonly)

Returns the value of attribute previous_version.



38
39
40
# File 'lib/dependabot/dependency.rb', line 38

def previous_version
  @previous_version
end

#requirementsObject (readonly)

Returns the value of attribute requirements.



38
39
40
# File 'lib/dependabot/dependency.rb', line 38

def requirements
  @requirements
end

#subdependency_metadataObject (readonly)

Returns the value of attribute subdependency_metadata.



38
39
40
# File 'lib/dependabot/dependency.rb', line 38

def 
  @subdependency_metadata
end

#versionObject (readonly)

Returns the value of attribute version.



38
39
40
# File 'lib/dependabot/dependency.rb', line 38

def version
  @version
end

Class Method Details

.display_name_builder_for_package_manager(package_manager) ⇒ Object



22
23
24
# 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) ⇒ Object



30
31
32
# File 'lib/dependabot/dependency.rb', line 30

def self.name_normaliser_for_package_manager(package_manager)
  @name_normalisers[package_manager] || ->(name) { name }
end

.production_check_for_package_manager(package_manager) ⇒ Object



11
12
13
14
15
16
# 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) ⇒ Object



26
27
28
# 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) ⇒ Object



34
35
36
# 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) ⇒ Object



18
19
20
# File 'lib/dependabot/dependency.rb', line 18

def self.register_production_check(package_manager, production_check)
  @production_checks[package_manager] = production_check
end

Instance Method Details

#==(other) ⇒ Object



129
130
131
# File 'lib/dependabot/dependency.rb', line 129

def ==(other)
  other.instance_of?(self.class) && to_h == other.to_h
end

#all_versionsObject

Returns all detected versions of the dependency. Only ecosystems that support this feature will return more than the current version.



115
116
117
118
119
120
# File 'lib/dependabot/dependency.rb', line 115

def all_versions
  all_versions = [:all_versions]
  return [version].compact unless all_versions

  all_versions.filter_map(&:version)
end

#appears_in_lockfile?Boolean

Returns:

  • (Boolean)


87
88
89
# File 'lib/dependabot/dependency.rb', line 87

def appears_in_lockfile?
  previous_version || (version && previous_requirements.nil?)
end

#display_nameObject



105
106
107
108
109
110
111
# File 'lib/dependabot/dependency.rb', line 105

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) ⇒ Boolean

Returns:

  • (Boolean)


137
138
139
# File 'lib/dependabot/dependency.rb', line 137

def eql?(other)
  self.==(other)
end

#hashObject



133
134
135
# File 'lib/dependabot/dependency.rb', line 133

def hash
  to_h.hash
end

#informational_only?Boolean

This dependency is being indirectly updated by an update to another dependency. We don’t need to try and update it ourselves but want to surface it to the user in the PR.

Returns:

  • (Boolean)


125
126
127
# File 'lib/dependabot/dependency.rb', line 125

def informational_only?
  [:information_only]
end

#numeric_versionObject



70
71
72
# File 'lib/dependabot/dependency.rb', line 70

def numeric_version
  @numeric_version ||= version_class.new(version) if version && version_class.correct?(version)
end

#production?Boolean

Returns:

  • (Boolean)


91
92
93
94
95
96
97
98
99
# File 'lib/dependabot/dependency.rb', line 91

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

#removed?Boolean

Returns:

  • (Boolean)


66
67
68
# File 'lib/dependabot/dependency.rb', line 66

def removed?
  @removed
end

#subdependency_production_checkObject



101
102
103
# File 'lib/dependabot/dependency.rb', line 101

def subdependency_production_check
  !&.all? { |h| h[:production] == false }
end

#to_hObject



74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/dependabot/dependency.rb', line 74

def to_h
  {
    "name" => name,
    "version" => version,
    "requirements" => requirements,
    "previous_version" => previous_version,
    "previous_requirements" => previous_requirements,
    "package_manager" => package_manager,
    "subdependency_metadata" => ,
    "removed" => removed? ? true : nil
  }.compact
end

#top_level?Boolean

Returns:

  • (Boolean)


62
63
64
# File 'lib/dependabot/dependency.rb', line 62

def top_level?
  requirements.any?
end