dependabot-maven 0.355.0 → 0.357.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: ed3c6bc921b14f4b9c8b5b972eddd908d25ca480169eb1e154f4e469b3d49759
4
- data.tar.gz: 91587156337eb764be0168703579558c50a134a6c15ce9e235d9318141bdfef9
3
+ metadata.gz: 88f4ec6abad6b9329da21a5d9d1b8a1ac73a541d0fb0437149def4a1cfad73e4
4
+ data.tar.gz: 99280b25245177eae98b618cba2ca285bf4db099dbe3396c481db91328a4997b
5
5
  SHA512:
6
- metadata.gz: bda3df043f3c32e84a1f18536d2c7c574e5e2902746d6ba08ffe46fb173b8634ed55ce89b3b82b6e4f40aca248ea1d149612ab4cd3f10de68f5fdee751539249
7
- data.tar.gz: 7583568de4499b7c72d1d32a94149ecd0dcfa20573db44e96af07de58b399efe48e783d0079383271f046608d2913cc4cbc4927a3864f7685ec415f719092569
6
+ metadata.gz: 010f3bbe4754d3e0128516561cb4f19b290d2d8d3edc1289f9ad89504638662ca922fa30c4cc1859080b4dbcbe33b8161523216a074319c41af0cd2739e87bdd
7
+ data.tar.gz: 4073e5d61854ad4ac1be44c72f2baef543e5f1f81e90f0c27e6816e03ed9f10de33edf645e4e3b8e1c5115ca8215a9b384634d06ffcbee343d97c641225a9e54
@@ -122,14 +122,16 @@ module Dependabot
122
122
  doc = Nokogiri::XML(pom.content)
123
123
  doc.remove_namespaces!
124
124
 
125
+ plugin_names = collect_plugin_names(pom, doc)
126
+
125
127
  doc.css(DEPENDENCY_SELECTOR).each do |dependency_node|
126
- dep = dependency_from_dependency_node(pom, dependency_node)
128
+ dep = dependency_from_dependency_node(pom, dependency_node, plugin_names)
127
129
  dependency_set << dep if dep
128
130
  rescue DependencyFileNotEvaluatable => e
129
131
  errors << e
130
132
  end
131
133
 
132
- doc.css(PLUGIN_SELECTOR, PLUGIN_ARTIFACT_ITEMS_SELECTOR).each do |dependency_node|
134
+ plugin_nodes(doc).each do |dependency_node|
133
135
  dep = dependency_from_plugin_node(pom, dependency_node)
134
136
  dependency_set << dep if dep
135
137
  rescue DependencyFileNotEvaluatable => e
@@ -141,6 +143,18 @@ module Dependabot
141
143
  dependency_set
142
144
  end
143
145
 
146
+ sig { params(pom: Dependabot::DependencyFile, doc: Nokogiri::XML::Document).returns(T::Set[String]) }
147
+ def collect_plugin_names(pom, doc)
148
+ plugin_names = Set.new
149
+
150
+ plugin_nodes(doc).each do |plugin_node|
151
+ name = plugin_name(plugin_node, pom)
152
+ plugin_names << name if name
153
+ end
154
+
155
+ plugin_names
156
+ end
157
+
144
158
  sig { params(extension: Dependabot::DependencyFile).returns(DependencySet) }
145
159
  def extensionfile_dependencies(extension)
146
160
  dependency_set = DependencySet.new
@@ -149,8 +163,10 @@ module Dependabot
149
163
  doc = Nokogiri::XML(extension.content)
150
164
  doc.remove_namespaces!
151
165
 
166
+ plugin_names = collect_plugin_names(extension, doc)
167
+
152
168
  doc.css(EXTENSION_SELECTOR).each do |dependency_node|
153
- dep = dependency_from_dependency_node(extension, dependency_node)
169
+ dep = dependency_from_dependency_node(extension, dependency_node, plugin_names)
154
170
  dependency_set << dep if dep
155
171
  rescue DependencyFileNotEvaluatable => e
156
172
  errors << e
@@ -169,8 +185,10 @@ module Dependabot
169
185
  doc = Nokogiri::XML(target.content)
170
186
  doc.remove_namespaces!
171
187
 
188
+ plugin_names = collect_plugin_names(target, doc)
189
+
172
190
  doc.css(TARGET_SELECTOR).each do |dependency_node|
173
- dep = dependency_from_dependency_node(target, dependency_node)
191
+ dep = dependency_from_dependency_node(target, dependency_node, plugin_names)
174
192
  dependency_set << dep if dep
175
193
  rescue DependencyFileNotEvaluatable => e
176
194
  errors << e
@@ -184,14 +202,16 @@ module Dependabot
184
202
  sig do
185
203
  params(
186
204
  pom: Dependabot::DependencyFile,
187
- dependency_node: Nokogiri::XML::Element
205
+ dependency_node: Nokogiri::XML::Element,
206
+ plugin_names: T::Set[String]
188
207
  ).returns(T.nilable(Dependabot::Dependency))
189
208
  end
190
- def dependency_from_dependency_node(pom, dependency_node)
209
+ def dependency_from_dependency_node(pom, dependency_node, plugin_names)
191
210
  return unless (name = dependency_name(dependency_node, pom))
192
211
  return if internal_dependency_names.include?(name)
193
212
 
194
- build_dependency(pom, dependency_node, name)
213
+ is_plugin = plugin_names.include?(name)
214
+ build_dependency(pom, dependency_node, name, is_plugin: is_plugin)
195
215
  end
196
216
 
197
217
  sig do
@@ -204,17 +224,18 @@ module Dependabot
204
224
  return unless (name = plugin_name(dependency_node, pom))
205
225
  return if internal_dependency_names.include?(name)
206
226
 
207
- build_dependency(pom, dependency_node, name)
227
+ build_dependency(pom, dependency_node, name, is_plugin: true)
208
228
  end
209
229
 
210
230
  sig do
211
231
  params(
212
232
  pom: Dependabot::DependencyFile,
213
233
  dependency_node: Nokogiri::XML::Element,
214
- name: String
234
+ name: String,
235
+ is_plugin: T::Boolean
215
236
  ).returns(T.nilable(Dependabot::Dependency))
216
237
  end
217
- def build_dependency(pom, dependency_node, name)
238
+ def build_dependency(pom, dependency_node, name, is_plugin:)
218
239
  property_details =
219
240
  {
220
241
  property_name: version_property_name(dependency_node),
@@ -228,7 +249,7 @@ module Dependabot
228
249
  requirements: [{
229
250
  requirement: dependency_requirement(pom, dependency_node),
230
251
  file: pom.name,
231
- groups: dependency_groups(pom, dependency_node),
252
+ groups: dependency_groups(pom, dependency_node, is_plugin: is_plugin),
232
253
  source: nil,
233
254
  metadata: {
234
255
  packaging_type: packaging_type(pom, dependency_node),
@@ -324,8 +345,16 @@ module Dependabot
324
345
  version_content.empty? ? nil : version_content
325
346
  end
326
347
 
327
- sig { params(pom: Dependabot::DependencyFile, dependency_node: Nokogiri::XML::Element).returns(T::Array[String]) }
328
- def dependency_groups(pom, dependency_node)
348
+ sig do
349
+ params(
350
+ pom: Dependabot::DependencyFile,
351
+ dependency_node: Nokogiri::XML::Element,
352
+ is_plugin: T::Boolean
353
+ ).returns(T::Array[String])
354
+ end
355
+ def dependency_groups(pom, dependency_node, is_plugin:)
356
+ return ["plugin"] if is_plugin
357
+
329
358
  dependency_scope(pom, dependency_node) == "test" ? ["test"] : []
330
359
  end
331
360
 
@@ -531,6 +560,11 @@ module Dependabot
531
560
  end
532
561
  end
533
562
  end
563
+
564
+ sig { params(doc: Nokogiri::XML::Document).returns(Nokogiri::XML::NodeSet) }
565
+ def plugin_nodes(doc)
566
+ doc.css(PLUGIN_SELECTOR, PLUGIN_ARTIFACT_ITEMS_SELECTOR)
567
+ end
534
568
  end
535
569
  # rubocop:enable Metrics/ClassLength
536
570
  end
@@ -86,15 +86,10 @@ module Dependabot
86
86
  evaluated_value(node.at_xpath("./*/artifactId").content.strip)
87
87
  ].compact.join(":")
88
88
 
89
- if node.at_xpath("./*/classifier")
90
- classifier = evaluated_value(node.at_xpath("./*/classifier").content.strip)
91
- dep_classifier = dependency.requirements.first&.dig(:metadata, :classifier)
92
- next false if classifier != dep_classifier
93
- end
94
-
89
+ next false unless classifier_matches?(node)
95
90
  next false unless node_name == dependency_name
96
91
  next false unless packaging_type_matches?(node)
97
- next false unless scope_matches?(node)
92
+ next false unless declaring_requirement.fetch(:groups) == ["plugin"] || scope_matches?(node)
98
93
 
99
94
  declaring_requirement_matches?(node)
100
95
  end
@@ -140,9 +135,19 @@ module Dependabot
140
135
  type == packaging_type(node)
141
136
  end
142
137
 
138
+ sig { params(node: Nokogiri::XML::Document).returns(T::Boolean) }
139
+ def classifier_matches?(node)
140
+ return true unless node.at_xpath("./*/classifier")
141
+
142
+ classifier = evaluated_value(node.at_xpath("./*/classifier").content.strip)
143
+ dep_classifier = dependency.requirements.first&.dig(:metadata, :classifier)
144
+ classifier == dep_classifier
145
+ end
146
+
143
147
  sig { params(node: Nokogiri::XML::Document).returns(T::Boolean) }
144
148
  def scope_matches?(node)
145
149
  dependency_type = declaring_requirement.fetch(:groups)
150
+
146
151
  node_type = dependency_scope(node) == "test" ? ["test"] : []
147
152
 
148
153
  dependency_type == node_type
@@ -0,0 +1,117 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require "dependabot/file_fetchers"
6
+ require "dependabot/file_fetchers/base"
7
+ require "dependabot/package/package_latest_version_finder"
8
+
9
+ module Dependabot
10
+ module Maven
11
+ module Shared
12
+ class SharedVersionFinder < Dependabot::Package::PackageLatestVersionFinder
13
+ extend T::Sig
14
+
15
+ # Regex to match common Maven release qualifiers that indicate stable releases.
16
+ # See https://github.com/apache/maven/blob/848fbb4bf2d427b72bdb2471c22fced7ebd9a7a1/maven-artifact/src/main/java/org/apache/maven/artifact/versioning/ComparableVersion.java#L315-L320
17
+ MAVEN_RELEASE_QUALIFIERS = /
18
+ ^.+[-._](
19
+ RELEASE|# Official release
20
+ FINAL|# Final build
21
+ GA# General Availability
22
+ )$
23
+ /ix
24
+
25
+ # Common Maven pre-release qualifiers.
26
+ # They often indicate versions that are not yet stable but that are released to the public for testing.
27
+ # Examples: 1.0.0-RC1, 2.0.0-ALPHA2, 3.1.0-BETA, 4.0.0-DEV5, etc.
28
+ # See https://maven.apache.org/guides/mini/guide-naming-conventions.html#version-identifier
29
+ MAVEN_PRE_RELEASE_QUALIFIERS = /
30
+ [-._]?(
31
+ # --- Qualifiers that usually REQUIRE a number ---
32
+ # Examples: "RC1", "BETA2", "M3", "ALPHA-1", "EAP.2"
33
+ # The number differentiates multiple pre-releases; a version like "1.0.0-RC"
34
+ (?i)(?:RC|CR|M|MILESTONE|ALPHA|BETA|EA|EAP)(?:[-._]?\d+)?
35
+ |
36
+ # --- Qualifiers that do NOT usually have numbers ---
37
+ DEV|
38
+ PREVIEW|
39
+ PRERELEASE|
40
+ EXPERIMENTAL|
41
+ UNSTABLE
42
+ )$
43
+ /ix
44
+
45
+ MAVEN_SNAPSHOT_QUALIFIER = /-SNAPSHOT$/i
46
+
47
+ sig { params(comparison_version: Dependabot::Version).returns(T::Boolean) }
48
+ def matches_dependency_version_type?(comparison_version)
49
+ return true unless dependency.version
50
+
51
+ current_version_string = dependency.version
52
+ candidate_version_string = comparison_version.to_s
53
+
54
+ current_is_pre_release = current_version_string&.match?(MAVEN_PRE_RELEASE_QUALIFIERS)
55
+ candidate_is_pre_release = candidate_version_string.match?(MAVEN_PRE_RELEASE_QUALIFIERS)
56
+
57
+ # Pre-releases are only compatible with other pre-releases
58
+ # When this happens, the suffix does not need to match exactly
59
+ # This allows transitions between 1.0.0-RC1 and 1.0.0-CR2, for example
60
+ return true if current_is_pre_release && candidate_is_pre_release
61
+
62
+ current_is_snapshot = current_version_string&.match?(MAVEN_SNAPSHOT_QUALIFIER)
63
+ # If the current version is a pre-release or a snapshot, allow upgrading to a stable release
64
+ # This can help move from pre-release to the stable version that supersedes it,
65
+ # but this should not happen vice versa as a stable release should not be downgraded to a pre-release
66
+ return true if (current_is_pre_release || current_is_snapshot) && !candidate_is_pre_release
67
+
68
+ current_suffix = extract_version_suffix(current_version_string)
69
+ candidate_suffix = extract_version_suffix(candidate_version_string)
70
+
71
+ # If both versions share the exact suffix or no suffix, they are compatible
72
+ current_suffix == candidate_suffix
73
+ end
74
+
75
+ private
76
+
77
+ # Extracts the qualifier/suffix from a Maven version string.
78
+ #
79
+ # Maven versions consist of numeric parts and optional string qualifiers.
80
+ # This method identifies the suffix by finding the first segment (separated by '.')
81
+ # that contains a non-digit character.
82
+ sig { params(version_string: T.nilable(String)).returns(T.nilable(String)) }
83
+ def extract_version_suffix(version_string)
84
+ return nil unless version_string
85
+
86
+ # Exclude common Maven release qualifiers that indicate stable releases
87
+ return nil if version_string.match?(MAVEN_RELEASE_QUALIFIERS)
88
+
89
+ version_string.split(".").each do |part|
90
+ # Skip fully numeric segments
91
+ next if part.match?(/\A\d+\z/)
92
+
93
+ # strip leading digits and capture the suffix
94
+ suffix = part.sub(/\A\d+/, "")
95
+ # Normalize delimiters to ensure consistent comparison
96
+ # e.g., "beta-1" and "beta_1" are treated the same
97
+ suffix = suffix.tr("-", "_")
98
+
99
+ # Ignore purely numeric suffixes (e.g., "-1", "_2")
100
+ # e.g., "1.0.0-1" or "1.0.0_2" are not considered to have a meaningful suffix
101
+ return nil if suffix.match?(/^_?\d+$/)
102
+
103
+ # Must contain a hyphen to be considered a valid suffix
104
+ return suffix if suffix.include?("-") || suffix.include?("_")
105
+ end
106
+
107
+ nil
108
+ end
109
+
110
+ sig { override.returns(T.nilable(Dependabot::Package::PackageDetails)) }
111
+ def package_details
112
+ raise NotImplementedError, "Subclasses must implement `package_details`"
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -6,16 +6,15 @@ require "dependabot/package/release_cooldown_options"
6
6
  require "dependabot/update_checkers/version_filters"
7
7
  require "dependabot/maven/package/package_details_fetcher"
8
8
  require "dependabot/maven/update_checker"
9
+ require "dependabot/maven/shared/shared_version_finder"
9
10
  require "sorbet-runtime"
10
11
 
11
12
  module Dependabot
12
13
  module Maven
13
14
  class UpdateChecker
14
- class VersionFinder < Dependabot::Package::PackageLatestVersionFinder
15
+ class VersionFinder < Dependabot::Maven::Shared::SharedVersionFinder
15
16
  extend T::Sig
16
17
 
17
- TYPE_SUFFICES = %w(jre android java native_mt agp).freeze
18
-
19
18
  sig do
20
19
  params(
21
20
  dependency: Dependabot::Dependency,
@@ -192,27 +191,6 @@ module Dependabot
192
191
  T.must(dependency.numeric_version) >= version_class.new(100)
193
192
  end
194
193
 
195
- sig { params(comparison_version: Dependabot::Version).returns(T::Boolean) }
196
- def matches_dependency_version_type?(comparison_version)
197
- return true unless dependency.version
198
-
199
- current_type = dependency.version
200
- &.gsub("native-mt", "native_mt")
201
- &.split(/[.\-]/)
202
- &.find do |type|
203
- TYPE_SUFFICES.find { |s| type.include?(s) }
204
- end
205
-
206
- version_type = comparison_version.to_s
207
- .gsub("native-mt", "native_mt")
208
- .split(/[.\-]/)
209
- .find do |type|
210
- TYPE_SUFFICES.find { |s| type.include?(s) }
211
- end
212
-
213
- current_type == version_type
214
- end
215
-
216
194
  sig { returns(T.class_of(Dependabot::Version)) }
217
195
  def version_class
218
196
  dependency.version_class
@@ -17,7 +17,7 @@ Dependabot::PullRequestCreator::Labeler
17
17
 
18
18
  require "dependabot/dependency"
19
19
  Dependabot::Dependency
20
- .register_production_check("maven", ->(groups) { groups != ["test"] })
20
+ .register_production_check("maven", ->(groups) { groups != ["test"] && groups != ["plugin"] })
21
21
 
22
22
  Dependabot::Dependency
23
23
  .register_display_name_builder(
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-maven
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.355.0
4
+ version: 0.357.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.355.0
18
+ version: 0.357.0
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 0.355.0
25
+ version: 0.357.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rexml
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -272,6 +272,7 @@ files:
272
272
  - lib/dependabot/maven/package_manager.rb
273
273
  - lib/dependabot/maven/pom.xml
274
274
  - lib/dependabot/maven/requirement.rb
275
+ - lib/dependabot/maven/shared/shared_version_finder.rb
275
276
  - lib/dependabot/maven/token_bucket.rb
276
277
  - lib/dependabot/maven/update_checker.rb
277
278
  - lib/dependabot/maven/update_checker/property_updater.rb
@@ -285,7 +286,7 @@ licenses:
285
286
  - MIT
286
287
  metadata:
287
288
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
288
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.355.0
289
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.357.0
289
290
  rdoc_options: []
290
291
  require_paths:
291
292
  - lib
@@ -300,7 +301,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
300
301
  - !ruby/object:Gem::Version
301
302
  version: 3.3.0
302
303
  requirements: []
303
- rubygems_version: 3.6.9
304
+ rubygems_version: 3.7.2
304
305
  specification_version: 4
305
306
  summary: Provides Dependabot support for Maven
306
307
  test_files: []