dependabot-common 0.364.0 → 0.365.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: 6da1e661120cc32753f744c61f71c22ea49fc6f2fdcbbfd3a137631acf3103e4
4
- data.tar.gz: 1c3c5a19b497c29ac3fa2853202918f514cc2c702c091b8dd4af352b186ad61f
3
+ metadata.gz: f60295381915191cca0d05b7be5c04af89cbe52a0f3df889e8365503d9d23ab6
4
+ data.tar.gz: 6cce9d750a9d91859998a579d9701329ed3bfc40ce63edf21c4c7cd7659e2ca1
5
5
  SHA512:
6
- metadata.gz: fd97c8d6b0978058bf3204aee949f1082fda7d8724ac366a7684d35c3d82d867e1d26ce0bf24e3dd97e94b08b689d3276b681cdfa86782525dfa09aeae892af5
7
- data.tar.gz: 13d846c8ab332fa64643df2bdc4aa95a47250efdbf10a382a77df4e63312bf773a1f01fdaaa72390d715cd4132f1798d5a4ceec70910dca43ee271abaeca5a29
6
+ metadata.gz: 7b6a7a215197bbfc58f9652bb25c4e240d4ca82cb2cf693e9bba403546a26f97507b18c3456ccacf07ae140b85a975f44ccf3775ffd1747e7a2f943f88796076
7
+ data.tar.gz: 6da0b1e735407a95fb73d30588cdb9c4c31e84239cd049e91c5c3cbc70e8113525c5e56e3d70ccac910be6a43ebb8d425cc948c2da2e332483ba081faabd4442
@@ -14,6 +14,10 @@ module Dependabot
14
14
  )
15
15
  @display_name_builders = T.let({}, T::Hash[String, T.proc.params(arg0: String).returns(String)])
16
16
  @name_normalisers = T.let({}, T::Hash[String, T.proc.params(arg0: String).returns(String)])
17
+ @humanized_previous_version_builders = T.let(
18
+ {},
19
+ T::Hash[String, T.proc.params(arg0: Dependency).returns(T.nilable(String))]
20
+ )
17
21
 
18
22
  sig do
19
23
  params(package_manager: String).returns(T.proc.params(arg0: T::Array[T.untyped]).returns(T::Boolean))
@@ -61,6 +65,25 @@ module Dependabot
61
65
  @name_normalisers[package_manager] = name_builder
62
66
  end
63
67
 
68
+ sig do
69
+ params(
70
+ package_manager: String
71
+ ).returns(T.nilable(T.proc.params(arg0: Dependency).returns(T.nilable(String))))
72
+ end
73
+ def self.humanized_previous_version_builder_for_package_manager(package_manager)
74
+ @humanized_previous_version_builders[package_manager]
75
+ end
76
+
77
+ sig do
78
+ params(
79
+ package_manager: String,
80
+ builder: T.proc.params(arg0: Dependency).returns(T.nilable(String))
81
+ ).void
82
+ end
83
+ def self.register_humanized_previous_version_builder(package_manager, builder)
84
+ @humanized_previous_version_builders[package_manager] = builder
85
+ end
86
+
64
87
  sig { returns(String) }
65
88
  attr_reader :name
66
89
 
@@ -225,24 +248,10 @@ module Dependabot
225
248
 
226
249
  sig { returns(T.nilable(String)) }
227
250
  def humanized_previous_version
228
- # If we don't have a previous version, we *may* still be able to figure
229
- # one out if a ref was provided and has been changed (in which case the
230
- # previous ref was essentially the version).
231
- if previous_version.nil?
232
- return ref_changed? ? previous_ref : nil
233
- end
234
-
235
- if T.must(previous_version).match?(/^[0-9a-f]{40}/)
236
- return previous_ref if ref_changed? && previous_ref
251
+ custom_version = custom_humanized_previous_version
252
+ return custom_version if custom_version
237
253
 
238
- "`#{T.must(previous_version)[0..6]}`"
239
- elsif version == previous_version &&
240
- package_manager == "docker"
241
- digest = docker_digest_from_reqs(T.must(previous_requirements))
242
- "`#{T.must(T.must(digest).split(':').last)[0..6]}`"
243
- else
244
- previous_version
245
- end
254
+ default_humanized_previous_version
246
255
  end
247
256
 
248
257
  sig { returns(T.nilable(String)) }
@@ -391,6 +400,40 @@ module Dependabot
391
400
 
392
401
  private
393
402
 
403
+ sig { returns(T.nilable(String)) }
404
+ def custom_humanized_previous_version
405
+ builder = self.class.humanized_previous_version_builder_for_package_manager(package_manager)
406
+ return nil unless builder
407
+
408
+ builder.call(self)
409
+ end
410
+
411
+ sig { returns(T.nilable(String)) }
412
+ def default_humanized_previous_version
413
+ # If we don't have a previous version, we *may* still be able to figure
414
+ # one out if a ref was provided and has been changed (in which case the
415
+ # previous ref was essentially the version).
416
+ return (ref_changed? ? previous_ref : nil) if previous_version.nil?
417
+
418
+ return humanized_sha_previous_version if T.must(previous_version).match?(/^[0-9a-f]{40}/)
419
+ return humanized_docker_previous_version if version == previous_version && package_manager == "docker"
420
+
421
+ previous_version
422
+ end
423
+
424
+ sig { returns(T.nilable(String)) }
425
+ def humanized_sha_previous_version
426
+ return previous_ref if ref_changed? && previous_ref
427
+
428
+ "`#{T.must(previous_version)[0..6]}`"
429
+ end
430
+
431
+ sig { returns(String) }
432
+ def humanized_docker_previous_version
433
+ digest = docker_digest_from_reqs(T.must(previous_requirements))
434
+ "`#{T.must(T.must(digest).split(':').last)[0..6]}`"
435
+ end
436
+
394
437
  sig { void }
395
438
  def check_values
396
439
  check_requirement_fields
@@ -0,0 +1,126 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require "dependabot/dependency"
6
+ require "dependabot/logger"
7
+ require "dependabot/pull_request_creator/pr_name_prefixer"
8
+
9
+ module Dependabot
10
+ class PullRequestCreator
11
+ class MessageBuilder
12
+ # Composes a final PR title from a base title + prefix.
13
+ #
14
+ # Works in two modes:
15
+ # 1. With a full PrNamePrefixer (updater path — has source/credentials for
16
+ # commit style auto-detection)
17
+ # 2. With just commit_message_options (API path — explicit prefix only,
18
+ # no network calls needed)
19
+ class TitleBuilder
20
+ extend T::Sig
21
+
22
+ sig { returns(String) }
23
+ attr_reader :base_title
24
+
25
+ sig { returns(T.nilable(Dependabot::PullRequestCreator::PrNamePrefixer)) }
26
+ attr_reader :prefixer
27
+
28
+ sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
29
+ attr_reader :commit_message_options
30
+
31
+ sig { returns(T.nilable(T::Array[Dependabot::Dependency])) }
32
+ attr_reader :dependencies
33
+
34
+ sig do
35
+ params(
36
+ base_title: String,
37
+ prefixer: T.nilable(Dependabot::PullRequestCreator::PrNamePrefixer),
38
+ commit_message_options: T.nilable(T::Hash[Symbol, T.untyped]),
39
+ dependencies: T.nilable(T::Array[Dependabot::Dependency])
40
+ ).void
41
+ end
42
+ def initialize(base_title:, prefixer: nil, commit_message_options: nil, dependencies: nil)
43
+ @base_title = base_title
44
+ @prefixer = prefixer
45
+ @commit_message_options = commit_message_options
46
+ @dependencies = dependencies
47
+ end
48
+
49
+ # Generates a base title for multi-ecosystem combined PR updates.
50
+ sig { params(group_name: String, update_count: Integer).returns(String) }
51
+ def self.multi_ecosystem_base_title(group_name:, update_count:)
52
+ "bump the \"#{group_name}\" group with " \
53
+ "#{update_count} update#{'s' unless update_count == 1} across multiple ecosystems"
54
+ end
55
+
56
+ sig { returns(String) }
57
+ def build
58
+ name = base_title.dup
59
+ name[0] = T.must(name[0]).capitalize if !name.empty? && capitalize?
60
+ "#{prefix}#{name}"
61
+ end
62
+
63
+ private
64
+
65
+ sig { returns(String) }
66
+ def prefix
67
+ return T.must(prefixer).pr_name_prefix if prefixer
68
+
69
+ build_explicit_prefix
70
+ rescue StandardError => e
71
+ Dependabot.logger.error("Error while generating PR name prefix: #{e.message}")
72
+ Dependabot.logger.error(e.backtrace&.join("\n"))
73
+ ""
74
+ end
75
+
76
+ sig { returns(T::Boolean) }
77
+ def capitalize?
78
+ return T.must(prefixer).capitalize_first_word? if prefixer
79
+
80
+ true
81
+ end
82
+
83
+ # Builds prefix from explicit commit_message_options only.
84
+ # Same logic as PrNamePrefixer#prefix_from_explicitly_provided_details
85
+ # but without requiring source/credentials.
86
+ sig { returns(String) }
87
+ def build_explicit_prefix
88
+ return "" unless commit_message_options&.key?(:prefix)
89
+
90
+ prefix = explicit_prefix_string
91
+ return "" if prefix.empty?
92
+
93
+ prefix += "(#{scope})" if commit_message_options&.dig(:include_scope)
94
+ # Append colon after alphanumeric or closing bracket to follow
95
+ # conventional commit format (e.g., "chore: ..." or "fix(deps): ...")
96
+ prefix += ":" if prefix.match?(/[A-Za-z0-9\)\]]\Z/)
97
+ prefix += " " unless prefix.end_with?(" ")
98
+ prefix
99
+ end
100
+
101
+ sig { returns(String) }
102
+ def explicit_prefix_string
103
+ if production_dependencies?
104
+ commit_message_options&.dig(:prefix).to_s
105
+ elsif commit_message_options&.key?(:prefix_development)
106
+ commit_message_options&.dig(:prefix_development).to_s
107
+ else
108
+ commit_message_options&.dig(:prefix).to_s
109
+ end
110
+ end
111
+
112
+ sig { returns(T::Boolean) }
113
+ def production_dependencies?
114
+ dependencies&.any?(&:production?) != false
115
+ rescue StandardError
116
+ true
117
+ end
118
+
119
+ sig { returns(String) }
120
+ def scope
121
+ production_dependencies? ? "deps" : "deps-dev"
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
@@ -24,6 +24,7 @@ module Dependabot
24
24
  require_relative "message_builder/metadata_presenter"
25
25
  require_relative "message_builder/issue_linker"
26
26
  require_relative "message_builder/link_and_mention_sanitizer"
27
+ require_relative "message_builder/title_builder"
27
28
  require_relative "pr_name_prefixer"
28
29
 
29
30
  sig { returns(Dependabot::Source) }
@@ -130,8 +131,10 @@ module Dependabot
130
131
  sig { returns(String) }
131
132
  def pr_name
132
133
  name = dependency_group ? group_pr_name : solo_pr_name
133
- name[0] = T.must(name[0]).capitalize if pr_name_prefixer.capitalize_first_word?
134
- "#{pr_name_prefix}#{name}"
134
+ MessageBuilder::TitleBuilder.new(
135
+ base_title: name,
136
+ prefixer: pr_name_prefixer
137
+ ).build
135
138
  end
136
139
 
137
140
  sig { returns(String) }
data/lib/dependabot.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Dependabot
5
- VERSION = "0.364.0"
5
+ VERSION = "0.365.0"
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-common
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.364.0
4
+ version: 0.365.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
@@ -586,6 +586,7 @@ files:
586
586
  - lib/dependabot/pull_request_creator/message_builder/issue_linker.rb
587
587
  - lib/dependabot/pull_request_creator/message_builder/link_and_mention_sanitizer.rb
588
588
  - lib/dependabot/pull_request_creator/message_builder/metadata_presenter.rb
589
+ - lib/dependabot/pull_request_creator/message_builder/title_builder.rb
589
590
  - lib/dependabot/pull_request_creator/pr_name_prefixer.rb
590
591
  - lib/dependabot/pull_request_updater.rb
591
592
  - lib/dependabot/pull_request_updater/azure.rb
@@ -615,7 +616,7 @@ licenses:
615
616
  - MIT
616
617
  metadata:
617
618
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
618
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.364.0
619
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.365.0
619
620
  rdoc_options: []
620
621
  require_paths:
621
622
  - lib