dependabot-maven 0.274.0 → 0.276.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1f2dc96b3b4e5aa7a47c3344c1fcb8a7abe883f011a23f5713809ad0b151be91
4
- data.tar.gz: f29e13fb7ff4ab77168854e5ac648df6c77c0b7cb65c812bd4c18549d8ac224a
3
+ metadata.gz: ad6e39551492801502e013e8934b584d2357fb63ce8dcbac1d8595ae97ace06b
4
+ data.tar.gz: 5e7bf11324be13067df5081d825aa1072da1daec535a222bed3caa0a12e2d5d5
5
5
  SHA512:
6
- metadata.gz: 7233b52a2fb23d10a1727b06588026af845050943aa79bd5b0d3d4a0fba50bd28bda04acd717fc32ad9640fa9e09b63ffef9f0374d797e885e0c0d4d82b45b1e
7
- data.tar.gz: 7fb6067db86ad1ec4459a6e98bef45daec9604dc726e3f01896ec167aad7f34422d7eef07bad75a9d4021007690dc7191df2710eafd0438f890aac2d713c81a6
6
+ metadata.gz: df458c686885588e4751a45edc95b4559638752ade6cca6c89d67da4d5444e0311e55ed1615a78fcd1d66c63ea77efa92bcce6f923c85d48cbec2d3aec525945
7
+ data.tar.gz: 7615212cdd6ded48a8c62da5ba1f6d01d5f158bafb6ce6a229f41063dabd22903c86d3029a50e78833505ba4a17d655d24fea4c4f71f17b13a68d50825edbf11
@@ -0,0 +1,99 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require "dependabot/maven/version_parser"
6
+
7
+ # See https://maven.apache.org/pom.html#Version_Order_Specification for details
8
+ #
9
+ module Dependabot
10
+ module Maven
11
+ class TokenBucket < T::Struct
12
+ extend T::Sig
13
+ extend T::Helpers
14
+ include Comparable
15
+
16
+ prop :tokens, T::Array[T.untyped]
17
+ prop :addition, T.nilable(TokenBucket)
18
+
19
+ sig { returns(T::Array[T.untyped]) }
20
+ def to_a
21
+ return tokens if addition.nil?
22
+
23
+ tokens.clone.append(addition.to_a)
24
+ end
25
+
26
+ sig { params(other: TokenBucket).returns(T.nilable(Integer)) }
27
+ def <=>(other)
28
+ cmp = compare_tokens(tokens, other.tokens)
29
+ return cmp unless cmp&.zero?
30
+
31
+ compare_additions(addition, other.addition)
32
+ end
33
+
34
+ sig do
35
+ params(
36
+ first: T::Array[T.any(String, Integer)],
37
+ second: T::Array[T.any(String, Integer)]
38
+ ).returns(T.nilable(Integer))
39
+ end
40
+ def compare_tokens(first, second)
41
+ max_idx = [first.size, second.size].max - 1
42
+ (0..max_idx).each do |idx|
43
+ cmp = compare_token_pair(first[idx], second[idx])
44
+ return cmp unless T.must(cmp).zero?
45
+ end
46
+ 0
47
+ end
48
+
49
+ sig do
50
+ params(
51
+ first: T.nilable(T.any(String, Integer)),
52
+ second: T.nilable(T.any(String, Integer))
53
+ ).returns(T.nilable(Integer))
54
+ end
55
+ def compare_token_pair(first = 0, second = 0) # rubocop:disable Metrics/PerceivedComplexity,Metrics/CyclomaticComplexity
56
+ first ||= 0
57
+ second ||= 0
58
+
59
+ if first.is_a?(Integer) && second.is_a?(String)
60
+ return first <= 0 ? -1 : 1
61
+ end
62
+
63
+ if first.is_a?(String) && second.is_a?(Integer)
64
+ return second <= 0 ? 1 : -1
65
+ end
66
+
67
+ if first == Dependabot::Maven::VersionParser::SP &&
68
+ second.is_a?(String) && second != Dependabot::Maven::VersionParser::SP
69
+ return -1
70
+ end
71
+
72
+ if second == Dependabot::Maven::VersionParser::SP &&
73
+ first.is_a?(String) && first != Dependabot::Maven::VersionParser::SP
74
+ return 1
75
+ end
76
+
77
+ if first.is_a?(Integer) && second.is_a?(Integer)
78
+ first <=> second
79
+ elsif first.is_a?(String) && second.is_a?(String)
80
+ first <=> second
81
+ end
82
+ end
83
+
84
+ sig do
85
+ params(first: T.nilable(TokenBucket), second: T.nilable(TokenBucket)).returns(T.nilable(Integer))
86
+ end
87
+ def compare_additions(first, second)
88
+ return 0 if first.nil? && second.nil?
89
+
90
+ (first || empty_addition) <=> (second || empty_addition)
91
+ end
92
+
93
+ sig { returns(TokenBucket) }
94
+ def empty_addition
95
+ TokenBucket.new(tokens: [])
96
+ end
97
+ end
98
+ end
99
+ end
@@ -50,12 +50,8 @@ module Dependabot
50
50
  attr_reader :properties_to_update
51
51
 
52
52
  def update_requirement(req_string)
53
- if req_string.include?(".+")
54
- update_dynamic_requirement(req_string)
55
- else
56
- # Since range requirements are excluded this must be exact
57
- update_exact_requirement(req_string)
58
- end
53
+ # Since range requirements are excluded this must be exact
54
+ update_exact_requirement(req_string)
59
55
  end
60
56
 
61
57
  def update_exact_requirement(req_string)
@@ -64,16 +60,6 @@ module Dependabot
64
60
  req_string.gsub(old_version.to_s, latest_version.to_s)
65
61
  end
66
62
 
67
- # This is really only a Gradle thing, but Gradle relies on this
68
- # RequirementsUpdater too
69
- def update_dynamic_requirement(req_string)
70
- precision = req_string.split(".").take_while { |s| s != "+" }.count
71
-
72
- version_parts = latest_version.segments.first(precision)
73
-
74
- version_parts.join(".") + ".+"
75
- end
76
-
77
63
  def version_class
78
64
  Maven::Version
79
65
  end
@@ -1,192 +1,80 @@
1
- # typed: true
1
+ # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
+ require "dependabot/maven/version_parser"
4
5
  require "dependabot/version"
5
6
  require "dependabot/utils"
6
7
 
7
- # Java versions use dots and dashes when tokenising their versions.
8
- # Gem::Version converts a "-" to ".pre.", so we override the `to_s` method.
9
- #
10
8
  # See https://maven.apache.org/pom.html#Version_Order_Specification for details.
11
9
 
12
10
  module Dependabot
13
11
  module Maven
14
12
  class Version < Dependabot::Version
15
- NULL_VALUES = %w(0 final ga).freeze
16
- PREFIXED_TOKEN_HIERARCHY = {
17
- "." => { qualifier: 1, number: 4 },
18
- "-" => { qualifier: 2, number: 3 },
19
- "+" => { qualifier: 3, number: 2 }
20
- }.freeze
21
- NAMED_QUALIFIERS_HIERARCHY = {
22
- "a" => 1, "alpha" => 1,
23
- "b" => 2, "beta" => 2,
24
- "m" => 3, "milestone" => 3,
25
- "rc" => 4, "cr" => 4, "pr" => 4, "pre" => 4,
26
- "snapshot" => 5, "dev" => 5,
27
- "ga" => 6, "" => 6, "final" => 6,
28
- "sp" => 7
29
- }.freeze
13
+ extend T::Sig
14
+ extend T::Helpers
15
+
16
+ PRERELEASE_QUALIFIERS = T.let([
17
+ Dependabot::Maven::VersionParser::ALPHA,
18
+ Dependabot::Maven::VersionParser::BETA,
19
+ Dependabot::Maven::VersionParser::MILESTONE,
20
+ Dependabot::Maven::VersionParser::RC,
21
+ Dependabot::Maven::VersionParser::SNAPSHOT
22
+ ].freeze, T::Array[Integer])
23
+
30
24
  VERSION_PATTERN =
31
25
  "[0-9a-zA-Z]+" \
32
26
  '(?>\.[0-9a-zA-Z]*)*' \
33
27
  '([_\-\+][0-9A-Za-z_-]*(\.[0-9A-Za-z_-]*)*)?'
34
- ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})?\s*\z/
35
28
 
29
+ sig { returns(Dependabot::Maven::TokenBucket) }
30
+ attr_accessor :token_bucket
31
+
32
+ sig { override.params(version: VersionParameter).returns(T::Boolean) }
36
33
  def self.correct?(version)
37
- return false if version.nil?
34
+ return false if version.to_s.empty?
38
35
 
39
- version.to_s.match?(ANCHORED_VERSION_PATTERN)
36
+ Dependabot::Maven::VersionParser.parse(version.to_s).to_a.any?
37
+ rescue ArgumentError
38
+ Dependabot.logger.info("Malformed version string #{version}")
39
+ false
40
40
  end
41
41
 
42
+ sig { override.params(version: VersionParameter).void }
42
43
  def initialize(version)
43
- @version_string = version.to_s
44
+ raise BadRequirementError, "Malformed version string - string is nil" if version.nil?
45
+
46
+ @version_string = T.let(version.to_s, String)
47
+ @token_bucket = T.let(Dependabot::Maven::VersionParser.parse(version_string), Dependabot::Maven::TokenBucket)
44
48
  super(version.to_s.tr("_", "-"))
45
49
  end
46
50
 
51
+ sig { returns(String) }
47
52
  def inspect
48
- "#<#{self.class} #{@version_string}>"
53
+ "#<#{self.class} #{version_string}>"
49
54
  end
50
55
 
56
+ sig { returns(String) }
51
57
  def to_s
52
- @version_string
58
+ version_string
53
59
  end
54
60
 
61
+ sig { returns(T::Boolean) }
55
62
  def prerelease?
56
- tokens.any? do |token|
57
- next true if token == "eap"
58
- next false unless NAMED_QUALIFIERS_HIERARCHY[token]
59
-
60
- NAMED_QUALIFIERS_HIERARCHY[token] < 6
63
+ token_bucket.to_a.flatten.any? do |token|
64
+ token.is_a?(Integer) && token.negative?
61
65
  end
62
66
  end
63
67
 
68
+ sig { params(other: VersionParameter).returns(Integer) }
64
69
  def <=>(other)
65
- version = stringify_version(@version_string)
66
- version = fill_tokens(version)
67
- version = trim_version(version)
68
-
69
- other_version = stringify_version(other)
70
- other_version = fill_tokens(other_version)
71
- other_version = trim_version(other_version)
72
-
73
- version, other_version = convert_dates(version, other_version)
74
-
75
- prefixed_tokens = split_into_prefixed_tokens(version)
76
- other_prefixed_tokens = split_into_prefixed_tokens(other_version)
77
-
78
- prefixed_tokens, other_prefixed_tokens =
79
- pad_for_comparison(prefixed_tokens, other_prefixed_tokens)
80
-
81
- prefixed_tokens.count.times.each do |index|
82
- comp = compare_prefixed_token(
83
- prefix: prefixed_tokens[index][0],
84
- token: prefixed_tokens[index][1..-1] || "",
85
- other_prefix: other_prefixed_tokens[index][0],
86
- other_token: other_prefixed_tokens[index][1..-1] || ""
87
- )
88
- return comp unless comp.zero?
89
- end
90
-
91
- 0
70
+ other = Dependabot::Maven::Version.new(other.to_s) unless other.is_a? Dependabot::Maven::Version
71
+ T.must(token_bucket <=> T.cast(other, Dependabot::Maven::Version).token_bucket)
92
72
  end
93
73
 
94
74
  private
95
75
 
96
- def tokens
97
- @tokens ||=
98
- begin
99
- version = @version_string.to_s.downcase
100
- version = fill_tokens(version)
101
- version = trim_version(version)
102
- split_into_prefixed_tokens(version).map { |t| t[1..-1] }
103
- end
104
- end
105
-
106
- def stringify_version(version)
107
- version = version.to_s.downcase
108
-
109
- # Not technically correct, but pragmatic
110
- version.gsub(/^v(?=\d)/, "")
111
- end
112
-
113
- def fill_tokens(version)
114
- # Add separators when transitioning from digits to characters
115
- version = version.gsub(/(\d)([A-Za-z])/, '\1-\2')
116
- version = version.gsub(/([A-Za-z])(\d)/, '\1-\2')
117
-
118
- # Replace empty tokens with 0
119
- version = version.gsub(/([\.\-])([\.\-])/, '\10\2')
120
- version = version.gsub(/^([\.\-])/, '0\1')
121
- version.gsub(/([\.\-])$/, '\10')
122
- end
123
-
124
- def trim_version(version)
125
- version.split("-").filter_map do |v|
126
- parts = v.split(".")
127
- parts = parts[0..-2] while NULL_VALUES.include?(parts&.last)
128
- parts&.join(".")
129
- end.reject(&:empty?).join("-")
130
- end
131
-
132
- def convert_dates(version, other_version)
133
- default = [version, other_version]
134
- return default unless version.match?(/^\d{4}-?\d{2}-?\d{2}$/)
135
- return default unless other_version.match?(/^\d{4}-?\d{2}-?\d{2}$/)
136
-
137
- [version.delete("-"), other_version.delete("-")]
138
- end
139
-
140
- def split_into_prefixed_tokens(version)
141
- ".#{version}".split(/(?=[\-\.\+])/)
142
- end
143
-
144
- def pad_for_comparison(prefixed_tokens, other_prefixed_tokens)
145
- prefixed_tokens = prefixed_tokens.dup
146
- other_prefixed_tokens = other_prefixed_tokens.dup
147
-
148
- longest = [prefixed_tokens, other_prefixed_tokens].max_by(&:count)
149
- shortest = [prefixed_tokens, other_prefixed_tokens].min_by(&:count)
150
-
151
- longest.count.times do |index|
152
- next unless shortest[index].nil?
153
-
154
- shortest[index] = longest[index].start_with?(".") ? ".0" : "-"
155
- end
156
-
157
- [prefixed_tokens, other_prefixed_tokens]
158
- end
159
-
160
- def compare_prefixed_token(prefix:, token:, other_prefix:, other_token:)
161
- token_type = token.match?(/^\d+$/) ? :number : :qualifier
162
- other_token_type = other_token.match?(/^\d+$/) ? :number : :qualifier
163
-
164
- hierarchy = PREFIXED_TOKEN_HIERARCHY.fetch(prefix).fetch(token_type)
165
- other_hierarchy =
166
- PREFIXED_TOKEN_HIERARCHY.fetch(other_prefix).fetch(other_token_type)
167
-
168
- hierarchy_comparison = hierarchy <=> other_hierarchy
169
- return hierarchy_comparison unless hierarchy_comparison.zero?
170
-
171
- compare_token(token: token, other_token: other_token)
172
- end
173
-
174
- def compare_token(token:, other_token:)
175
- if (token_hierarchy = NAMED_QUALIFIERS_HIERARCHY[token])
176
- return -1 unless NAMED_QUALIFIERS_HIERARCHY[other_token]
177
-
178
- return token_hierarchy <=> NAMED_QUALIFIERS_HIERARCHY[other_token]
179
- end
180
-
181
- return 1 if NAMED_QUALIFIERS_HIERARCHY[other_token]
182
-
183
- if token.match?(/\A\d+\z/) && other_token.match?(/\A\d+\z/)
184
- token = token.to_i
185
- other_token = other_token.to_i
186
- end
187
-
188
- token <=> other_token
189
- end
76
+ sig { returns(String) }
77
+ attr_reader :version_string
190
78
  end
191
79
  end
192
80
  end
@@ -0,0 +1,139 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require "strscan"
6
+ require "dependabot/maven/token_bucket"
7
+
8
+ # See https://maven.apache.org/pom.html#Version_Order_Specification for details
9
+ #
10
+ module Dependabot
11
+ module Maven
12
+ class VersionParser
13
+ extend T::Sig
14
+ extend T::Helpers
15
+
16
+ ALPHA = -5
17
+ BETA = -4
18
+ MILESTONE = -3
19
+ RC = -2
20
+ SNAPSHOT = -1
21
+ SP = "sp"
22
+
23
+ sig { params(version: T.nilable(String)).returns(TokenBucket) }
24
+ def self.parse(version)
25
+ raise BadRequirementError, "Malformed version string - string is nil" if version.nil?
26
+ raise BadRequirementError, "Malformed version string - string is empty" if version.empty?
27
+
28
+ new(version).parse
29
+ end
30
+
31
+ sig { params(version: String).void }
32
+ def initialize(version)
33
+ @version = version
34
+ @token_bucket = T.let(TokenBucket.new(tokens: []), T.nilable(TokenBucket))
35
+ @parse_result = T.let(@token_bucket, T.nilable(TokenBucket))
36
+ @scanner = T.let(StringScanner.new(version.downcase), StringScanner)
37
+ end
38
+
39
+ sig { returns(TokenBucket) }
40
+ def parse
41
+ parse_version(false)
42
+
43
+ # no tokens: version is just one of the tokens we split on e.g '.' or '-'
44
+ raise BadRequirementError, "Malformed version string - #{version}" if parse_result.to_a.empty?
45
+
46
+ T.must(parse_result)
47
+ end
48
+
49
+ private
50
+
51
+ sig { returns(StringScanner) }
52
+ attr_reader :scanner
53
+
54
+ sig { returns(String) }
55
+ attr_reader :version
56
+
57
+ sig { returns(T.nilable(TokenBucket)) }
58
+ attr_reader :parse_result
59
+
60
+ sig { params(token: T.nilable(T.any(String, Integer))).void }
61
+ def parse_addition(token = nil)
62
+ @token_bucket&.addition = TokenBucket.new(tokens: [token].compact)
63
+ @token_bucket = @token_bucket&.addition
64
+
65
+ scanner.skip(/-+/)
66
+ parse_version(true)
67
+ end
68
+
69
+ sig { params(number_begins_partition: T.nilable(T::Boolean)).void }
70
+ def parse_version(number_begins_partition) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
71
+ # skip leading v if any
72
+ scanner.skip(/v/)
73
+
74
+ until scanner.eos?
75
+ if (s = scanner.scan(/\d+/))
76
+ if number_begins_partition
77
+ parse_addition(s.to_i)
78
+ else
79
+ T.must(@token_bucket).tokens << s.to_i
80
+ end
81
+
82
+ elsif (s = scanner.match?(/a\d+/))
83
+ # aN is equivalent to alpha-N
84
+ scanner.skip("a")
85
+ parse_addition(ALPHA)
86
+
87
+ elsif (s = scanner.match?(/b\d+/))
88
+ # bN is equivalent to beta-N
89
+ scanner.skip("b")
90
+ parse_addition(BETA)
91
+
92
+ elsif (s = scanner.match?(/m\d+/))
93
+ # mN is equivalent to milestone-N
94
+ scanner.skip("m")
95
+ parse_addition(MILESTONE)
96
+
97
+ elsif (s = scanner.scan(/(alpha|beta|milestone|rc|cr|sp|ga|final|release|snapshot)[a-z]+/))
98
+ # process "alpha" and others as normal lexical tokens if they're followed by a letter
99
+ parse_addition(s)
100
+
101
+ elsif (s = scanner.scan("alpha"))
102
+ # handle alphaN, alpha-X, alpha.X, or ending alpha
103
+ parse_addition(ALPHA)
104
+
105
+ elsif (s = scanner.scan("beta"))
106
+ parse_addition(BETA)
107
+ elsif (s = scanner.scan("milestone"))
108
+ parse_addition(MILESTONE)
109
+
110
+ elsif (s = scanner.scan(/(rc|cr)/))
111
+ parse_addition(RC)
112
+
113
+ elsif (s = scanner.scan("snapshot"))
114
+ parse_addition(SNAPSHOT)
115
+
116
+ elsif (s = scanner.scan(/ga|final|release/))
117
+ parse_addition
118
+
119
+ elsif (s = scanner.scan("sp"))
120
+ parse_addition(SP)
121
+
122
+ # `+` is parsed as an addition as stated in maven version spec
123
+ elsif (s = scanner.scan(/[a-z_+]+/))
124
+ parse_addition(s)
125
+
126
+ elsif (s = scanner.scan("."))
127
+ number_begins_partition = false
128
+
129
+ elsif (s = scanner.scan("-"))
130
+ number_begins_partition = true
131
+
132
+ else
133
+ raise BadRequirementError, "Malformed version string - #{version}"
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-maven
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.274.0
4
+ version: 0.276.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-09-05 00:00:00.000000000 Z
11
+ date: 2024-09-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dependabot-common
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.274.0
19
+ version: 0.276.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.274.0
26
+ version: 0.276.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: debug
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -253,18 +253,20 @@ files:
253
253
  - lib/dependabot/maven/file_updater/property_value_updater.rb
254
254
  - lib/dependabot/maven/metadata_finder.rb
255
255
  - lib/dependabot/maven/requirement.rb
256
+ - lib/dependabot/maven/token_bucket.rb
256
257
  - lib/dependabot/maven/update_checker.rb
257
258
  - lib/dependabot/maven/update_checker/property_updater.rb
258
259
  - lib/dependabot/maven/update_checker/requirements_updater.rb
259
260
  - lib/dependabot/maven/update_checker/version_finder.rb
260
261
  - lib/dependabot/maven/utils/auth_headers_finder.rb
261
262
  - lib/dependabot/maven/version.rb
263
+ - lib/dependabot/maven/version_parser.rb
262
264
  homepage: https://github.com/dependabot/dependabot-core
263
265
  licenses:
264
266
  - MIT
265
267
  metadata:
266
268
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
267
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.274.0
269
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.276.0
268
270
  post_install_message:
269
271
  rdoc_options: []
270
272
  require_paths: