dependabot-common 0.283.0 → 0.285.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 23990d60058d974f2358748f5a1a9cebeeb9b0aa41bcff87c8d5c0a82f162639
4
- data.tar.gz: 2f8c3980648d02dc8bba63d1b8dde5493293245366d651343a8fac785f65b7f2
3
+ metadata.gz: f715ae3932ff54488335714eca22437b802ffe69591bd5e82804ec1b517bc47e
4
+ data.tar.gz: 8bc3dbb798980775b4fa8f091d00bd4687ae323d41d766ee887bae09b0d995e2
5
5
  SHA512:
6
- metadata.gz: 2dd34fccf3d316a0b5b9295a0cdf05be1b7fd577a6cc8701ccb91084bef512a393d1347059ccc0bc2c4affeacaf7e6d2e2b9d4c4432ff111ce32597b50a6ba7e
7
- data.tar.gz: 2f8de1d6775ccbd267c25ab3aff79a00247e21ab57a316091cc5419e1fde50fcdd1f5f376aa1954f8aa02e56e105106f4229bc9df98e152df9266013bc7c027a
6
+ metadata.gz: 91d44bfa9b54c64c11509458bc3414052308ac9ed527c3f15dbc3da25bb314ce9f04712195ebe0cd9116d390f29fa53cfabac0f35a1d5c844362ca1e3f6802bf
7
+ data.tar.gz: 9309be975505a43f6d2182b1cb992367b1d79d4e4fcc1a9eb1458442d8c6749e65e8f71b24efa09c23faba4300dc818053d35e5724ca8c7e5adb6383eeabffe4
@@ -63,6 +63,7 @@ module Dependabot
63
63
  "composer" => "composer",
64
64
  "devcontainer" => "devcontainers",
65
65
  "docker" => "docker",
66
+ "dotnet-sdk" => "dotnet_sdk",
66
67
  "elm" => "elm",
67
68
  "github-actions" => "github_actions",
68
69
  "gitsubmodule" => "submodules",
@@ -0,0 +1,184 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require "dependabot/requirement"
6
+
7
+ module Dependabot
8
+ class Ecosystem
9
+ extend T::Sig
10
+
11
+ class VersionManager
12
+ extend T::Sig
13
+ extend T::Helpers
14
+
15
+ abstract!
16
+ # Initialize version information for a package manager or language.
17
+ # @param name [String] the name of the package manager or language (e.g., "bundler", "ruby").
18
+ # @param version [Dependabot::Version] the parsed current version.
19
+ # @param deprecated_versions [Array<Dependabot::Version>] an array of deprecated versions.
20
+ # @param supported_versions [Array<Dependabot::Version>] an array of supported versions.
21
+ # @param requirement [Dependabot::Requirement] an array of requirements.
22
+ # @example
23
+ # VersionManager.new("bundler", "2.1.4", nil)
24
+ sig do
25
+ params(
26
+ name: String,
27
+ version: Dependabot::Version,
28
+ deprecated_versions: T::Array[Dependabot::Version],
29
+ supported_versions: T::Array[Dependabot::Version],
30
+ requirement: T.nilable(Dependabot::Requirement)
31
+ ).void
32
+ end
33
+ def initialize(
34
+ name,
35
+ version,
36
+ deprecated_versions = [],
37
+ supported_versions = [],
38
+ requirement = nil
39
+ )
40
+ @name = T.let(name, String)
41
+ @version = T.let(version, Dependabot::Version)
42
+ @deprecated_versions = T.let(deprecated_versions, T::Array[Dependabot::Version])
43
+ @supported_versions = T.let(supported_versions, T::Array[Dependabot::Version])
44
+ @requirement = T.let(requirement, T.nilable(Dependabot::Requirement))
45
+ end
46
+
47
+ # The name of the package manager (e.g., "bundler", "npm").
48
+ # @example
49
+ # name #=> "bundler"
50
+ sig { returns(String) }
51
+ attr_reader :name
52
+
53
+ # The current version of the package manager or language.
54
+ # @example
55
+ # version #=> Dependabot::Version.new("2.1.4")
56
+ sig { returns(Dependabot::Version) }
57
+ attr_reader :version
58
+
59
+ # Returns an array of deprecated versions of the package manager.
60
+ # @example
61
+ # deprecated_versions #=> [Version.new("1")]
62
+ sig { returns(T::Array[Dependabot::Version]) }
63
+ attr_reader :deprecated_versions
64
+
65
+ # Returns an array of supported versions of the package manager.
66
+ sig { returns(T::Array[Dependabot::Version]) }
67
+ attr_reader :supported_versions
68
+
69
+ # The current requirement of the package manager or language.
70
+ # @example
71
+ # requirement #=> nil
72
+ # requirement #=> Dependabot::Requirement.new(">= 2.1.4")
73
+ # requirement #=> Dependabot::Requirement.new(">= 2.1.4, < 3.0")
74
+ sig { returns(T.nilable(Dependabot::Requirement)) }
75
+ attr_reader :requirement
76
+
77
+ # Checks if the current version is deprecated.
78
+ # Returns true if the version is in the deprecated_versions array; false otherwise.
79
+ # @example
80
+ # deprecated? #=> true
81
+ sig { returns(T::Boolean) }
82
+ def deprecated?
83
+ # If the version is unsupported, the unsupported error is getting raised separately.
84
+ return false if unsupported?
85
+
86
+ deprecated_versions.include?(version)
87
+ end
88
+
89
+ # Checks if the current version is unsupported.
90
+ # @example
91
+ # unsupported? #=> false
92
+ sig { returns(T::Boolean) }
93
+ def unsupported?
94
+ return false if supported_versions.empty?
95
+
96
+ # Check if the version is not supported
97
+ supported_versions.all? { |supported| supported > version }
98
+ end
99
+
100
+ # Raises an error if the current package manager or language version is unsupported.
101
+ # If the version is unsupported, it raises a ToolVersionNotSupported error.
102
+ sig { void }
103
+ def raise_if_unsupported!
104
+ return unless unsupported?
105
+
106
+ # Example: v2.*, v3.*
107
+ supported_versions_message = supported_versions.map { |v| "v#{v}.*" }.join(", ")
108
+
109
+ raise ToolVersionNotSupported.new(
110
+ name,
111
+ version.to_s,
112
+ supported_versions_message
113
+ )
114
+ end
115
+
116
+ # Indicates if the package manager supports later versions beyond those listed in supported_versions.
117
+ # By default, returns false if not overridden in the subclass.
118
+ # @example
119
+ # support_later_versions? #=> true
120
+ sig { returns(T::Boolean) }
121
+ def support_later_versions?
122
+ false
123
+ end
124
+ end
125
+
126
+ # Initialize with mandatory name and optional language information.
127
+ # @param name [String] the name of the ecosystem (e.g., "bundler", "npm_and_yarn").
128
+ # @param package_manager [VersionManager] the package manager (mandatory).
129
+ # @param language [VersionManager] the language (optional).
130
+ sig do
131
+ params(
132
+ name: String,
133
+ package_manager: VersionManager,
134
+ language: T.nilable(VersionManager)
135
+ ).void
136
+ end
137
+ def initialize(
138
+ name:,
139
+ package_manager:,
140
+ language: nil
141
+ )
142
+ @name = T.let(name, String)
143
+ @package_manager = T.let(package_manager, VersionManager)
144
+ @language = T.let(language, T.nilable(VersionManager))
145
+ end
146
+
147
+ # The name of the ecosystem (mandatory).
148
+ # @example
149
+ # name #=> "npm_and_yarn"
150
+ sig { returns(String) }
151
+ attr_reader :name
152
+
153
+ # The information related to the package manager (mandatory).
154
+ # @example
155
+ # package_manager #=> VersionManager.new("bundler", "2.1.4", deprecated_versions, supported_versions)
156
+ sig { returns(VersionManager) }
157
+ attr_reader :package_manager
158
+
159
+ # The information related to the language (optional).
160
+ # @example
161
+ # language #=> VersionManager.new("ruby", "3.9", deprecated_versions, supported_versions)
162
+ sig { returns(T.nilable(VersionManager)) }
163
+ attr_reader :language
164
+
165
+ # Checks if the current version is deprecated.
166
+ # Returns true if the version is in the deprecated_versions array; false otherwise.
167
+ sig { returns(T::Boolean) }
168
+ def deprecated?
169
+ package_manager.deprecated?
170
+ end
171
+
172
+ # Checks if the current version is unsupported.
173
+ sig { returns(T::Boolean) }
174
+ def unsupported?
175
+ package_manager.unsupported?
176
+ end
177
+
178
+ # Delegate to the package manager to raise ToolVersionNotSupported if the version is unsupported.
179
+ sig { void }
180
+ def raise_if_unsupported!
181
+ package_manager.raise_if_unsupported!
182
+ end
183
+ end
184
+ end
@@ -3,7 +3,7 @@
3
3
 
4
4
  require "sorbet-runtime"
5
5
  require "dependabot/credential"
6
- require "dependabot/package_manager"
6
+ require "dependabot/ecosystem"
7
7
 
8
8
  module Dependabot
9
9
  module FileParsers
@@ -54,8 +54,8 @@ module Dependabot
54
54
  sig { abstract.returns(T::Array[Dependabot::Dependency]) }
55
55
  def parse; end
56
56
 
57
- sig { returns(T.nilable(PackageManagerBase)) }
58
- def package_manager
57
+ sig { returns(T.nilable(Ecosystem)) }
58
+ def ecosystem
59
59
  nil
60
60
  end
61
61
 
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "sorbet-runtime"
5
- require "dependabot/package_manager"
5
+ require "dependabot/ecosystem"
6
6
 
7
7
  module Dependabot
8
8
  class Notice
@@ -95,11 +95,11 @@ module Dependabot
95
95
  end
96
96
 
97
97
  # Generates a deprecation notice for the given package manager.
98
- # @param package_manager [PackageManagerBase] The package manager object.
98
+ # @param package_manager [VersionManager] The package manager object.
99
99
  # @return [Notice, nil] The generated deprecation notice or nil if the package manager is not deprecated.
100
100
  sig do
101
101
  params(
102
- package_manager: PackageManagerBase
102
+ package_manager: Ecosystem::VersionManager
103
103
  ).returns(T.nilable(Notice))
104
104
  end
105
105
  def self.generate_pm_deprecation_notice(package_manager)
@@ -74,32 +74,7 @@ module Dependabot
74
74
  sanitized_name[[T.must(max_length) - sha.size, 0].max..] = sha
75
75
  end
76
76
 
77
- if Dependabot::Experiments.enabled?(:dedup_branch_names)
78
- dedup_existing_branches(sanitized_name)
79
- else
80
- sanitized_name
81
- end
82
- end
83
-
84
- sig { params(ref: String).returns(String) }
85
- def dedup_existing_branches(ref)
86
- Dependabot.logger.debug(
87
- "Dependabot::PullRequestCreator::dedup_existing_branches::ref : #{ref}"
88
- )
89
- return ref unless existing_branches.include?(ref)
90
-
91
- i = 1
92
- new_ref = "#{ref}-#{i}"
93
- while existing_branches.include?(new_ref)
94
- i += 1
95
- new_ref = "#{ref}-#{i}"
96
- end
97
-
98
- Dependabot.logger.debug(
99
- "Dependabot::PullRequestCreator::dedup_existing_branches::new_ref : #{new_ref}"
100
- )
101
-
102
- new_ref
77
+ sanitized_name
103
78
  end
104
79
 
105
80
  sig { params(ref: String).returns(String) }
@@ -110,6 +110,17 @@ module Dependabot
110
110
 
111
111
  sig { returns(T.untyped) }
112
112
  def create
113
+ Dependabot.logger.info(
114
+ "Initiating Github pull request."
115
+ )
116
+
117
+ if experiment_duplicate_branch? && branch_exists?(branch_name)
118
+ Dependabot.logger.info(
119
+ "Existing branch \"#{branch_name}\" found. Pull request not created."
120
+ )
121
+ raise BranchAlreadyExists, "Duplicate branch #{branch_name} already exists"
122
+ end
123
+
113
124
  if branch_exists?(branch_name) && unmerged_pull_request_exists?
114
125
  raise UnmergedPRExists, "PR ##{unmerged_pull_requests.first.number} already exists"
115
126
  end
@@ -132,6 +143,10 @@ module Dependabot
132
143
  # rubocop:disable Metrics/PerceivedComplexity
133
144
  sig { params(name: String).returns(T::Boolean) }
134
145
  def branch_exists?(name)
146
+ Dependabot.logger.info(
147
+ "Checking if branch #{name} already exists."
148
+ )
149
+
135
150
  git_metadata_fetcher.ref_names.include?(name)
136
151
  rescue Dependabot::GitDependenciesNotReachable => e
137
152
  raise T.must(e.cause) if e.cause&.message&.include?("is disabled")
@@ -580,6 +595,11 @@ module Dependabot
580
595
  raise type, message
581
596
  end
582
597
  end
598
+
599
+ sig { returns(T::Boolean) }
600
+ def experiment_duplicate_branch?
601
+ Dependabot::Experiments.enabled?(:dedup_branch_names)
602
+ end
583
603
  end
584
604
  # rubocop:enable Metrics/ClassLength
585
605
  end
@@ -40,6 +40,8 @@ module Dependabot
40
40
 
41
41
  class UnmergedPRExists < StandardError; end
42
42
 
43
+ class BranchAlreadyExists < StandardError; end
44
+
43
45
  class BaseCommitNotUpToDate < StandardError; end
44
46
 
45
47
  class UnexpectedError < StandardError; end
@@ -396,12 +398,6 @@ module Dependabot
396
398
 
397
399
  sig { returns(Dependabot::PullRequestCreator::BranchNamer) }
398
400
  def branch_namer
399
- if Dependabot::Experiments.enabled?(:dedup_branch_names) && existing_branches
400
- Dependabot.logger.debug(
401
- "Dependabot::PullRequestCreator::branch_namer : #{existing_branches}"
402
- )
403
- end
404
-
405
401
  @branch_namer ||= T.let(
406
402
  BranchNamer.new(
407
403
  dependencies: dependencies,
@@ -1,4 +1,4 @@
1
- # typed: strong
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "sorbet-runtime"
@@ -8,13 +8,67 @@ module Dependabot
8
8
  extend T::Sig
9
9
  extend T::Helpers
10
10
 
11
+ # Constants for operator groups
12
+ MINIMUM_OPERATORS = %w(>= > ~>).freeze
13
+ MAXIMUM_OPERATORS = %w(<= < ~>).freeze
14
+
11
15
  abstract!
12
16
 
17
+ # Parses requirement strings and returns an array of requirement objects.
13
18
  sig do
14
19
  abstract
15
20
  .params(requirement_string: T.nilable(String))
16
21
  .returns(T::Array[Requirement])
17
22
  end
18
23
  def self.requirements_array(requirement_string); end
24
+
25
+ # Returns all requirement constraints as an array of strings
26
+ sig { returns(T::Array[String]) }
27
+ def constraints
28
+ requirements.map { |op, version| "#{op} #{version}" }
29
+ end
30
+
31
+ # Returns the highest lower limit among all minimum constraints.
32
+ sig { returns(T.nilable(Gem::Version)) }
33
+ def min_version
34
+ # Select constraints with minimum operators
35
+ min_constraints = requirements.select { |op, _| MINIMUM_OPERATORS.include?(op) }
36
+
37
+ # Choose the maximum version among the minimum constraints
38
+ max_min_constraint = min_constraints.max_by { |_, version| version }
39
+
40
+ # Return the version part of the max constraint, if it exists
41
+ Dependabot::Version.new(max_min_constraint&.last) if max_min_constraint&.last
42
+ end
43
+
44
+ # Returns the lowest upper limit among all maximum constraints.
45
+ sig { returns(T.nilable(Dependabot::Version)) }
46
+ def max_version
47
+ # Select constraints with maximum operators
48
+ max_constraints = requirements.select { |op, _| MAXIMUM_OPERATORS.include?(op) }
49
+
50
+ # Process each maximum constraint, handling "~>" constraints based on length
51
+ effective_max_versions = max_constraints.map do |op, version|
52
+ if op == "~>"
53
+ # If "~>" constraint, bump based on the specificity of the version
54
+ case version.segments.length
55
+ when 1
56
+ # Bump major version (e.g., 2 -> 3.0.0)
57
+ Dependabot::Version.new((version.segments[0].to_i + 1).to_s + ".0.0")
58
+ when 2
59
+ # Bump minor version (e.g., 2.5 -> 2.6.0)
60
+ Dependabot::Version.new("#{version.segments[0]}.#{version.segments[1] + 1}.0")
61
+ else
62
+ # For three or more segments, use version.bump
63
+ version.bump # e.g., "~> 2.9.9" becomes upper bound 3.0.0
64
+ end
65
+ else
66
+ version
67
+ end
68
+ end
69
+
70
+ # Return the smallest among the effective maximum constraints
71
+ Dependabot::Version.new(effective_max_versions.min) if effective_max_versions.min
72
+ end
19
73
  end
20
74
  end
data/lib/dependabot.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Dependabot
5
- VERSION = "0.283.0"
5
+ VERSION = "0.285.0"
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-common
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.283.0
4
+ version: 0.285.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-31 00:00:00.000000000 Z
11
+ date: 2024-11-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-codecommit
@@ -84,14 +84,14 @@ dependencies:
84
84
  requirements:
85
85
  - - "~>"
86
86
  - !ruby/object:Gem::Version
87
- version: 1.18.0
87
+ version: 1.18.2
88
88
  type: :runtime
89
89
  prerelease: false
90
90
  version_requirements: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
- version: 1.18.0
94
+ version: 1.18.2
95
95
  - !ruby/object:Gem::Dependency
96
96
  name: excon
97
97
  requirement: !ruby/object:Gem::Requirement
@@ -540,6 +540,7 @@ files:
540
540
  - lib/dependabot/dependency.rb
541
541
  - lib/dependabot/dependency_file.rb
542
542
  - lib/dependabot/dependency_group.rb
543
+ - lib/dependabot/ecosystem.rb
543
544
  - lib/dependabot/errors.rb
544
545
  - lib/dependabot/experiments.rb
545
546
  - lib/dependabot/file_fetchers.rb
@@ -566,7 +567,6 @@ files:
566
567
  - lib/dependabot/metadata_finders/base/commits_finder.rb
567
568
  - lib/dependabot/metadata_finders/base/release_finder.rb
568
569
  - lib/dependabot/notices.rb
569
- - lib/dependabot/package_manager.rb
570
570
  - lib/dependabot/pull_request_creator.rb
571
571
  - lib/dependabot/pull_request_creator/azure.rb
572
572
  - lib/dependabot/pull_request_creator/bitbucket.rb
@@ -614,7 +614,7 @@ licenses:
614
614
  - MIT
615
615
  metadata:
616
616
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
617
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.283.0
617
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.285.0
618
618
  post_install_message:
619
619
  rdoc_options: []
620
620
  require_paths:
@@ -1,98 +0,0 @@
1
- # typed: strong
2
- # frozen_string_literal: true
3
-
4
- require "sorbet-runtime"
5
-
6
- module Dependabot
7
- class PackageManagerBase
8
- extend T::Sig
9
- extend T::Helpers
10
-
11
- abstract!
12
-
13
- # The name of the package manager (e.g., "bundler").
14
- # @example
15
- # package_manager.name #=> "bundler"
16
- sig { abstract.returns(String) }
17
- def name; end
18
-
19
- # The version of the package manager (e.g., Dependabot::Version.new("2.1.4")).
20
- # @example
21
- # package_manager.version #=> Dependabot::Version.new("2.1.4")
22
- sig { abstract.returns(Dependabot::Version) }
23
- def version; end
24
-
25
- # Returns an array of deprecated versions of the package manager.
26
- # By default, returns an empty array if not overridden in the subclass.
27
- # @example
28
- # package_manager.deprecated_versions #=> [Dependabot::Version.new("1.0.0"), Dependabot::Version.new("1.1.0")]
29
- sig { returns(T::Array[Dependabot::Version]) }
30
- def deprecated_versions
31
- []
32
- end
33
-
34
- # Returns an array of unsupported versions of the package manager.
35
- # By default, returns an empty array if not overridden in the subclass.
36
- # @example
37
- # package_manager.unsupported_versions #=> [Dependabot::Version.new("0.9.0")]
38
- sig { returns(T::Array[Dependabot::Version]) }
39
- def unsupported_versions
40
- []
41
- end
42
-
43
- # Returns an array of supported versions of the package manager.
44
- # By default, returns an empty array if not overridden in the subclass.
45
- # @example
46
- # package_manager.supported_versions #=> [Dependabot::Version.new("2.0.0"), Dependabot::Version.new("2.1.0")]
47
- sig { returns(T::Array[Dependabot::Version]) }
48
- def supported_versions
49
- []
50
- end
51
-
52
- # Checks if the current version is deprecated.
53
- # Returns true if the version is in the deprecated_versions array; false otherwise.
54
- # @example
55
- # package_manager.deprecated? #=> true
56
- sig { returns(T::Boolean) }
57
- def deprecated?
58
- # If the version is unsupported, the unsupported error is getting raised separately.
59
- return false if unsupported?
60
-
61
- deprecated_versions.include?(version)
62
- end
63
-
64
- # Checks if the current version is unsupported.
65
- # Returns true if the version is in the unsupported_versions array; false otherwise.
66
- # @example
67
- # package_manager.unsupported? #=> false
68
- sig { returns(T::Boolean) }
69
- def unsupported?
70
- false
71
- end
72
-
73
- # Raises an error if the current package manager version is unsupported.
74
- # If the version is unsupported, it raises a ToolVersionNotSupported error.
75
- sig { void }
76
- def raise_if_unsupported!
77
- return unless unsupported?
78
-
79
- # Example: v2.*, v3.*
80
- supported_versions_message = supported_versions.map { |v| "v#{v}.*" }.join(", ")
81
-
82
- raise ToolVersionNotSupported.new(
83
- name,
84
- version.to_s,
85
- supported_versions_message
86
- )
87
- end
88
-
89
- # Indicates if the package manager supports later versions beyond those listed in supported_versions.
90
- # By default, returns false if not overridden in the subclass.
91
- # @example
92
- # package_manager.support_later_versions? #=> true
93
- sig { returns(T::Boolean) }
94
- def support_later_versions?
95
- false
96
- end
97
- end
98
- end