dependabot-pub 0.397.0 → 0.398.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: 8ee93bbe3a567d05c49aa43c3cd6be245a3d297b73dd1299377d55ddcd52d8b6
4
- data.tar.gz: 6af10c2f14fdd2e0dc5c324c3a1b0d3af14a82647189c2e92a85b55fcc8cce45
3
+ metadata.gz: d3f347c5026b0a38c8b5dcd1fe34d5bf086c5232a298d8e4ee53a2a2c77675ee
4
+ data.tar.gz: c63bbc442dd89bd2e88381c1f8636783a96ea1e3ce4dcf8e1107182922e575c3
5
5
  SHA512:
6
- metadata.gz: 9b873c93b89ca23f6eccf6ed6d73829223226b8e86de473ae0f8b106e68d29b68bd23ee8ea42ea10782c7a090c528f8adae34e31d5d99b82693d8d08739df2d3
7
- data.tar.gz: 792a68fbdb3cbd1f4a63df868102bb3b86aa6c14746ce877cc32ec37287cf729684d854bef05e2936518596d5aa3f487696f87f2070ce6617d6f1546a623355b
6
+ metadata.gz: 5da945c408909041abb77106389039e7d6131086dc5516411d071a248779d9cdcdd1264680f6f768dac9bb54eb6730cdcfc857537b5bcee8233042a71f4ebae0
7
+ data.tar.gz: 795b73580e3d48ddf10362fc1e89bc10f8dd964022434eacbeea5f3feb91cb7478ccf9d1edaa8d3d79e132a07e167358d7bae21d119b7e496290f2eec0176688
@@ -63,8 +63,9 @@ module Dependabot
63
63
 
64
64
  sig { params(dependency: Dependabot::Dependency).returns(String) }
65
65
  def repository_url(dependency)
66
- RequirementSource.new(dependency.requirements.first).description_string("url") || options[:pub_hosted_url] ||
67
- "https://pub.dev"
66
+ repository_url = RequirementSource.new(dependency.requirements.first).description_string("url") ||
67
+ options[:pub_hosted_url] || "https://pub.dev"
68
+ repository_url.delete_suffix("/")
68
69
  end
69
70
 
70
71
  sig { params(dependency: Dependabot::Dependency).returns(T::Hash[String, T.untyped]) }
@@ -24,7 +24,7 @@ module Dependabot
24
24
  result.commit = source.description_string("resolved-ref")
25
25
  return result
26
26
  end
27
- repository_url = source.description_string("url") || "https://pub.dev"
27
+ repository_url = (source.description_string("url") || "https://pub.dev").delete_suffix("/")
28
28
 
29
29
  listing = repository_listing(repository_url)
30
30
  repo = listing.dig("latest", "pubspec", "repository")
@@ -72,32 +72,29 @@ module Dependabot
72
72
 
73
73
  sig { returns(T.any(T::Array[Dependabot::Package::PackageRelease], T.untyped)) }
74
74
  def package_details_metadata
75
- package_releases = []
76
- T.let({}, T::Hash[String, T.untyped])
77
-
78
- Dependabot.logger.error("Initializing package metadata for \"#{@dependency.name}\"")
75
+ Dependabot.logger.info("Initializing package metadata for \"#{@dependency.name}\"")
79
76
 
80
77
  response = fetch_package_metadata(dependency)
81
- return package_releases if response.status >= 500
82
-
83
- begin
84
- package_details_metadata = JSON.parse(response.body)
85
-
86
- package_details_metadata["versions"].select do |v|
87
- package_releases << package_release(
88
- version: v["version"],
89
- publish_date: Time.parse(v["published"])
90
- )
91
- end
92
-
93
- package_releases
94
- rescue JSON::ParserError
95
- Dependabot.logger.error("Failed to parse package metadata")
96
- package_releases
78
+ return [] if response.status >= 500
79
+
80
+ versions = JSON.parse(response.body).fetch("versions", [])
81
+
82
+ # Build the full list up front. If any release can't be parsed (e.g. a
83
+ # missing or invalid publish date) the partial result is discarded, so
84
+ # callers can treat a non-empty list as a complete, trustworthy snapshot
85
+ # and an empty list as "no usable metadata".
86
+ versions.map do |v|
87
+ package_release(
88
+ version: v["version"],
89
+ publish_date: Time.parse(v["published"])
90
+ )
97
91
  end
92
+ rescue JSON::ParserError
93
+ Dependabot.logger.error("Failed to parse package metadata")
94
+ []
98
95
  rescue StandardError => e
99
96
  Dependabot.logger.error("Failed to fetch package metadata #{e.message}")
100
- package_releases
97
+ []
101
98
  end
102
99
 
103
100
  private
@@ -7,6 +7,7 @@ require "dependabot/update_checkers/version_filters"
7
7
  require "dependabot/registry_client"
8
8
  require "dependabot/pub/package/package_details_fetcher"
9
9
  require "dependabot/package/package_latest_version_finder"
10
+ require "dependabot/update_checkers/cooldown_calculation"
10
11
  require "sorbet-runtime"
11
12
 
12
13
  module Dependabot
@@ -119,6 +120,47 @@ module Dependabot
119
120
  return unparsed_version unless cooldown_options
120
121
 
121
122
  @package_details ||= T.let(
123
+ package_details_fetcher.package_details_metadata,
124
+ T.nilable(T::Array[Dependabot::Package::PackageRelease])
125
+ )
126
+
127
+ version_release = @package_details.find do |release|
128
+ release.version.to_s == unparsed_version
129
+ end
130
+
131
+ if version_release&.released_at
132
+ return unparsed_version unless in_cooldown_period?(version_release)
133
+
134
+ return dependency.version
135
+ end
136
+
137
+ # No dated release for this candidate. A Pub release always carries a
138
+ # publication date, so a candidate is only missing here for one of two
139
+ # reasons, handled differently:
140
+ #
141
+ # metadata present, candidate absent -> the date source is healthy and the
142
+ # candidate simply isn't published on pub.dev (the resolver and registry
143
+ # listings diverge). Skip cooldown quietly.
144
+ #
145
+ # metadata empty -> we have no dates at all, so cooldown can't be applied.
146
+ # Surface the shared "cooldown not applied" notice, matching docker/common.
147
+ unless @package_details.empty?
148
+ Dependabot.logger.info(
149
+ "No matching release metadata for #{dependency.name} #{unparsed_version}; skipping cooldown"
150
+ )
151
+ return unparsed_version
152
+ end
153
+
154
+ record_cooldown_date_unavailable(unparsed_version)
155
+ unparsed_version
156
+ rescue StandardError => e
157
+ Dependabot.logger.error("Failed to filter cooldown versions for \"#{dependency.name}\": #{e.backtrace}")
158
+ unparsed_version
159
+ end
160
+
161
+ sig { returns(PackageDetailsFetcher) }
162
+ def package_details_fetcher
163
+ @package_details_fetcher ||= T.let(
122
164
  PackageDetailsFetcher.new(
123
165
  dependency: dependency,
124
166
  dependency_files: dependency_files,
@@ -126,27 +168,46 @@ module Dependabot
126
168
  ignored_versions: ignored_versions,
127
169
  security_advisories: security_advisories,
128
170
  options: options
129
- ).package_details_metadata,
130
- T.nilable(T::Array[Dependabot::Package::PackageRelease])
171
+ ),
172
+ T.nilable(PackageDetailsFetcher)
131
173
  )
174
+ end
132
175
 
133
- return unparsed_version unless @package_details.any?
176
+ sig { params(unparsed_version: String).void }
177
+ def record_cooldown_date_unavailable(unparsed_version)
178
+ return unless version_class.correct?(unparsed_version)
134
179
 
135
- version_release = @package_details.find do |release|
136
- release.version == unparsed_version
137
- end
180
+ new_version = version_class.new(unparsed_version)
181
+ current_version = version_class.correct?(dependency.version) ? version_class.new(dependency.version) : nil
138
182
 
139
- return unparsed_version unless in_cooldown_period?(version_release)
183
+ # Nothing to cool down when the candidate isn't an upgrade, or when it is
184
+ # ignored and would be discarded anyway; mirrors the common cooldown
185
+ # tracker's relevance check and avoids job-wide warnings when no update can
186
+ # be produced.
187
+ return if current_version && new_version <= current_version
188
+ return if ignored?(new_version)
140
189
 
141
- dependency.version
142
- rescue StandardError => e
143
- Dependabot.logger.error("Failed to filter cooldown versions for \"#{dependency.name}\": #{e.backtrace}")
144
- unparsed_version
190
+ Dependabot.logger.info(
191
+ "No publication date available for #{dependency.name} #{unparsed_version}; cooldown not applied"
192
+ )
193
+ Dependabot::UpdateCheckers::CooldownCalculation.mark_cooldown_date_unavailable(
194
+ dependency,
195
+ cooldown_days: cooldown_days_for(current_version, new_version)
196
+ )
197
+ end
198
+
199
+ sig { params(version: Dependabot::Version).returns(T::Boolean) }
200
+ def ignored?(version)
201
+ requirements = ignored_versions.flat_map do |requirement|
202
+ dependency.requirement_class.requirements_array(requirement)
203
+ end
204
+ requirements.any? { |requirement| requirement.satisfied_by?(version) }
145
205
  end
146
206
 
147
207
  sig { params(release: Dependabot::Package::PackageRelease).returns(T::Boolean) }
148
208
  def in_cooldown_period?(release)
149
- unless release.released_at
209
+ released_at = release.released_at
210
+ unless released_at
150
211
  Dependabot.logger.info("Release date not available for version #{release.version}")
151
212
  return false
152
213
  end
@@ -155,7 +216,7 @@ module Dependabot
155
216
  days = cooldown_days_for(current_version, release.version)
156
217
 
157
218
  # Calculate the number of seconds passed since the release
158
- passed_seconds = Time.now.to_i - release.released_at.to_i
219
+ passed_seconds = Time.now.to_i - released_at.to_i
159
220
  passed_days = passed_seconds / DAY_IN_SECONDS
160
221
 
161
222
  if passed_days < days
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-pub
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.397.0
4
+ version: 0.398.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.397.0
18
+ version: 0.398.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.397.0
25
+ version: 0.398.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: debug
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -260,7 +260,7 @@ licenses:
260
260
  - MIT
261
261
  metadata:
262
262
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
263
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.397.0
263
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.398.0
264
264
  rdoc_options: []
265
265
  require_paths:
266
266
  - lib