dependabot-maven 0.319.1 → 0.320.1

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: 3268690eeb4f7ee69aa0672721dd0305c0f07bd76354bc902dea5dc801a8f012
4
- data.tar.gz: f7080365f342e6ecfdc094718c5bb186d2e228b014bb7e824db1648814320302
3
+ metadata.gz: 24dcdf6874641aec6d60da3c09b81c70878cc61e754b0809e6246f9265a1b831
4
+ data.tar.gz: 2dce537d8680b9eb276b2a12010261ad6be4824140d1cf277b92743cc89304a0
5
5
  SHA512:
6
- metadata.gz: b0b4883e8cfecd7bb7d3f3937c09ca59489102c23bc87e6ba1829d01a23232d3c773765eb8ca33c05e8659509e3e9f2359edd24c4d7cc18c4fd59712927ba43d
7
- data.tar.gz: 6308ea5cb891f6f7bed9f9095381bdaceacd75ef3fef890b7d2fcdce0b5ac3b84f800924b0ff718f4fcc8cb35bcdc5c85592a99606c7af35bf77ec598bf5fb0c
6
+ metadata.gz: 155fcc04c0b1323649702406c89c6bf9079a17007ea51053de3b1f1a372220c4948b3c9325cee0091ef6dae37fd293dd22bcbf1a2ac237b066599ce3318136a7
7
+ data.tar.gz: 51b8c75dceb8a7fbca841478dbe7a6278cdfc5cee4c9782dd29577a44a5a59f9e478dd8f11cdc41a169aea29b6b07f88e9aa62b8061bfa3ff85583d2faedee96
@@ -2,6 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "nokogiri"
5
+ require "rexml/document"
5
6
  require "sorbet-runtime"
6
7
  require "dependabot/file_updaters"
7
8
  require "dependabot/file_updaters/base"
@@ -149,43 +150,40 @@ module Dependabot
149
150
  ).returns(String)
150
151
  end
151
152
  def add_new_declaration(content, dependency, requirement) # rubocop:disable Metrics/AbcSize
152
- doc = Nokogiri::XML(content) { |config| config.default_xml.noblanks }
153
- doc.remove_namespaces!
154
-
155
- project = doc.at_xpath("//project")
153
+ doc = REXML::Document.new(content)
154
+ project = doc.get_elements("//project").first
156
155
  raise "<project> element not found in the XML content" unless project
157
156
 
158
- dependency_management = project.at_xpath("dependencyManagement")
159
- unless dependency_management
160
- dependency_management = Nokogiri::XML::Node.new("dependencyManagement", doc)
161
- dependencies = Nokogiri::XML::Node.new("dependencies", doc)
162
- dependency_management.add_child(dependencies)
163
- project.add_child(dependency_management)
164
- end
157
+ # Detect indentation of the file from indentation of the project tag children
158
+ indentation_config = detect_indentation_config(project)
165
159
 
166
- dependencies = dependency_management.at_xpath("dependencies")
167
- unless dependencies
168
- dependencies = Nokogiri::XML::Node.new("dependencies", doc)
169
- dependency_management.add_child(dependencies)
170
- end
160
+ dependency_management, dependency_management_created = ensure_dependency_management_element(project,
161
+ indentation_config)
162
+ dependencies, dependencies_created = ensure_dependencies_element(dependency_management, indentation_config)
171
163
 
172
- dependency_node = Nokogiri::XML::Node.new("dependency", doc)
173
-
174
- group_id = Nokogiri::XML::Node.new("groupId", doc)
175
- group_id.content = dependency.name.split(":").first
176
- dependency_node.add_child(group_id)
164
+ if dependencies.children.last&.to_s&.start_with?("\n")
165
+ dependencies.children.last.value = "\n#{indentation_config[:levels][:dependencies]}"
166
+ else
167
+ dependencies.add_text("\n#{indentation_config[:levels][:dependencies]}")
168
+ end
177
169
 
178
- artifact_id = Nokogiri::XML::Node.new("artifactId", doc)
179
- artifact_id.content = dependency.name.split(":").last
180
- dependency_node.add_child(artifact_id)
170
+ # Create the dependency element with the required fields, adding the appropriate indentation as text nodes
171
+ add_dependency_entry(dependency, requirement, dependencies, indentation_config[:levels][:dependency],
172
+ indentation_config[:levels][:dependencies])
181
173
 
182
- version = Nokogiri::XML::Node.new("version", doc)
183
- version.content = requirement.fetch(:requirement)
184
- dependency_node.add_child(version)
174
+ # Close all sections with appropriate indentation
175
+ dependencies.add_text("\n#{indentation_config[:levels][:dependency_management]}")
176
+ dependency_management.add_text("\n#{indentation_config[:levels][:base]}") if dependencies_created
177
+ project.add_text("\n") if dependency_management_created
185
178
 
186
- dependencies.add_child(dependency_node)
179
+ # If dependencyManagement was created, replace entire document content with parser output
180
+ # Unfortunately, this might include unrelated formatting changes sometimes
181
+ return doc.to_s if dependency_management_created
187
182
 
188
- doc.to_xml
183
+ # If dependencyManagement was not created, we just replace the existing dependencyManagement element
184
+ # with the updated one, preserving the rest of the document
185
+ content.gsub(%r{\<dependencyManagement\>[\s\S]*\</dependencyManagement\>},
186
+ dependency_management.to_s)
189
187
  end
190
188
 
191
189
  sig do
@@ -267,6 +265,90 @@ module Dependabot
267
265
  T.nilable(T::Array[Dependabot::DependencyFile])
268
266
  )
269
267
  end
268
+
269
+ sig do
270
+ params(project: REXML::Element,
271
+ indent_config: T::Hash[Symbol, T.untyped]).returns([REXML::Element, T::Boolean])
272
+ end
273
+ def ensure_dependency_management_element(project, indent_config)
274
+ dependency_management = project.get_elements("dependencyManagement").first
275
+ is_created = false
276
+
277
+ unless dependency_management
278
+ project.add_text("\n#{indent_config[:levels][:base]}")
279
+ dependency_management = REXML::Element.new("dependencyManagement", project)
280
+ is_created = true
281
+ end
282
+
283
+ [dependency_management, is_created]
284
+ end
285
+
286
+ sig do
287
+ params(dependency_management: REXML::Element,
288
+ indent_config: T::Hash[Symbol, T.untyped]).returns([REXML::Element, T::Boolean])
289
+ end
290
+ def ensure_dependencies_element(dependency_management, indent_config)
291
+ dependencies = dependency_management.get_elements("dependencies").first
292
+ is_created = false
293
+
294
+ unless dependencies
295
+ dependency_management.add_text("\n#{indent_config[:levels][:dependency_management]}")
296
+ dependencies = REXML::Element.new("dependencies", dependency_management)
297
+ is_created = true
298
+ end
299
+
300
+ [dependencies, is_created]
301
+ end
302
+
303
+ sig do
304
+ params(dependency: Dependabot::Dependency, requirement: T::Hash[Symbol, T.untyped],
305
+ dependencies_node: REXML::Element, current_indentation_level: String,
306
+ parent_indentation_level: String).void
307
+ end
308
+ def add_dependency_entry(dependency, requirement, dependencies_node, current_indentation_level,
309
+ parent_indentation_level)
310
+ dependency_node = REXML::Element.new("dependency", dependencies_node)
311
+ dependency_node.add_text("\n#{current_indentation_level}")
312
+ group_id = REXML::Element.new("groupId", dependency_node)
313
+ group_id.text = dependency.name.split(":").first
314
+ dependency_node.add_text("\n#{current_indentation_level}")
315
+ artifact_id = REXML::Element.new("artifactId", dependency_node)
316
+ artifact_id.text = dependency.name.split(":").last
317
+ dependency_node.add_text("\n#{current_indentation_level}")
318
+ version = REXML::Element.new("version", dependency_node)
319
+ version.text = requirement.fetch(:requirement)
320
+ dependency_node.add_text("\n#{parent_indentation_level}")
321
+ end
322
+
323
+ sig { params(base_indentation: String, is_tabs: T::Boolean).returns(Integer) }
324
+ def get_indent_size(base_indentation, is_tabs)
325
+ if is_tabs
326
+ indent_size = base_indentation.to_s.scan(/\t+$/).length
327
+ indent_size.positive? ? indent_size : 1
328
+ else
329
+ base_indentation.to_s.scan(/ +$/).last&.length || 2
330
+ end
331
+ end
332
+
333
+ sig { params(project: REXML::Element).returns(T::Hash[Symbol, T.untyped]) }
334
+ def detect_indentation_config(project)
335
+ sample_indent = project.children.find do |child|
336
+ child.to_s.match?(/\n(\t+| +)$/)
337
+ end&.to_s&.match(/\n(\t+| +)$/)&.[](1)
338
+
339
+ base_indent = sample_indent || " "
340
+
341
+ {
342
+ base: base_indent,
343
+ is_tabs: base_indent.include?("\t"),
344
+ levels: {
345
+ base: base_indent,
346
+ dependency_management: base_indent + base_indent,
347
+ dependencies: base_indent + base_indent + base_indent,
348
+ dependency: base_indent + base_indent + base_indent + base_indent
349
+ }
350
+ }
351
+ end
270
352
  end
271
353
  end
272
354
  end
@@ -68,7 +68,7 @@ module Dependabot
68
68
 
69
69
  sig { returns(T::Boolean) }
70
70
  def cooldown_enabled?
71
- Dependabot::Experiments.enabled?(:enable_cooldown_for_maven)
71
+ true
72
72
  end
73
73
 
74
74
  sig do
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.319.1
4
+ version: 0.320.1
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.319.1
18
+ version: 0.320.1
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.319.1
25
+ version: 0.320.1
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: debug
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -270,7 +270,7 @@ licenses:
270
270
  - MIT
271
271
  metadata:
272
272
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
273
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.319.1
273
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.320.1
274
274
  rdoc_options: []
275
275
  require_paths:
276
276
  - lib