dependabot-swift 0.314.0 → 0.316.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: b33db3e49c480beca9e7f63d4eaa3338b59417bd6084df49f80ffdd7bdc4aabb
4
- data.tar.gz: 5f4db50129f1641cdd36d401c324f7dc0c9bafc914a680c6f838f5cd2260fdbe
3
+ metadata.gz: 6a2b9732c591be3117127bc8d10d98a6244583d69d3dca23b3b8d4be835f2c5f
4
+ data.tar.gz: 8ce481f03d3dab87d2215dd1ec107f9a3cc70282c252d4d7a4e61ef0fef9f933
5
5
  SHA512:
6
- metadata.gz: 0727dd3f8e0813dc5074d2aad6c669984b03c892e72ea5e101ec1e91f4655960a3befb88d33a3c77a3d3d39a228567c2d982516c0eb0ae150bfd1895c3c96584
7
- data.tar.gz: 372d80ebe5cd19b1f3be5080ec541e77d8ec4861c06aa317e53ad6aee8291e5fa9a54643234ec99814332b35dffe4c515e15e85cff6efce516b1ec89318854b5
6
+ metadata.gz: 130cdcc0063affba1322e346f7fa391c3cf46e48081d2f5eeb441897b0d5876e553f9eb13d0d07cd56985413b1ade264765f3098b2ab20f35acde9972274a83d
7
+ data.tar.gz: 9bea1217ecd17a9fe96dee648db4b463e05a7389afb3ed8aa8e1c07f30a250ef748f5f978335958f127d49bbb6ab5de1a58c415ab447d664f3fe95293a941c45
@@ -0,0 +1,69 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+ require "time"
6
+ require "cgi"
7
+ require "excon"
8
+ require "sorbet-runtime"
9
+ require "dependabot/swift"
10
+
11
+ module Dependabot
12
+ module Swift
13
+ module Package
14
+ class PackageDetailsFetcher
15
+ extend T::Sig
16
+
17
+ RELEASES_URL = "https://api.github.com/repos/"
18
+ APPLICATION_JSON = "JSON"
19
+
20
+ sig do
21
+ params(
22
+ dependency: Dependency,
23
+ credentials: T::Array[Dependabot::Credential],
24
+ git_commit_checker: Dependabot::GitCommitChecker
25
+ ).void
26
+ end
27
+ def initialize(dependency:, credentials:, git_commit_checker:)
28
+ @dependency = dependency
29
+ @credentials = credentials
30
+ @git_commit_checker = git_commit_checker
31
+ end
32
+
33
+ sig { returns(Dependabot::GitCommitChecker) }
34
+ attr_reader :git_commit_checker
35
+
36
+ sig { returns(T::Array[Dependabot::Credential]) }
37
+ attr_reader :credentials
38
+
39
+ sig { returns(T::Array[GitTagWithDetail]) }
40
+ def fetch_tag_and_release_date
41
+ truncate_github_url = @dependency.name.gsub("github.com/", "")
42
+ url = RELEASES_URL + "#{truncate_github_url}/releases"
43
+ result_lines = T.let([], T::Array[GitTagWithDetail])
44
+ # Fetch the releases from the GitHub API
45
+ response = Excon.get(url, headers: { "Accept" => "application/vnd.github.v3+json" })
46
+ Dependabot.logger.error("Failed call details: #{response.body}") unless response.status == 200
47
+ return result_lines unless response.status == 200
48
+
49
+ # Parse the JSON response
50
+ releases = JSON.parse(response.body)
51
+
52
+ # Extract version names and release dates into a hash
53
+ releases.map do |release|
54
+ result_lines << GitTagWithDetail.new(
55
+ tag: release["tag_name"],
56
+ release_date: release["published_at"]
57
+ )
58
+ end
59
+
60
+ # sort the result lines by tag in descending order
61
+ result_lines = result_lines.sort_by(&:tag).reverse
62
+ # Log the extracted details for debugging
63
+ Dependabot.logger.info("Extracted release details: #{result_lines}")
64
+ result_lines
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,130 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "dependabot/update_checkers/base"
5
+ require "dependabot/swift/file_parser/dependency_parser"
6
+ require "dependabot/swift/file_updater/lockfile_updater"
7
+ require "dependabot/swift/package/package_details_fetcher"
8
+ require "sorbet-runtime"
9
+ require "dependabot/git_commit_checker"
10
+
11
+ module Dependabot
12
+ module Swift
13
+ class UpdateChecker < Dependabot::UpdateCheckers::Base
14
+ class LatestVersionResolver
15
+ extend T::Sig
16
+
17
+ DAY_IN_SECONDS = T.let(24 * 60 * 60, Integer)
18
+
19
+ sig do
20
+ params(
21
+ dependency: Dependabot::Dependency,
22
+ credentials: T::Array[Dependabot::Credential],
23
+ cooldown_options: T.nilable(Dependabot::Package::ReleaseCooldownOptions),
24
+ git_commit_checker: Dependabot::GitCommitChecker
25
+ ).void
26
+ end
27
+ def initialize(dependency:, credentials:, cooldown_options:, git_commit_checker:)
28
+ @dependency = dependency
29
+ @credentials = credentials
30
+ @cooldown_options = cooldown_options
31
+ @git_commit_checker = T.let(
32
+ git_commit_checker,
33
+ Dependabot::GitCommitChecker
34
+ )
35
+ end
36
+
37
+ sig { returns(Dependabot::Dependency) }
38
+ attr_reader :dependency
39
+
40
+ # Return latest version tag for the dependency, it removes tags that are in cooldown period
41
+ # and returns the latest version tag that is not in cooldown period. If eexception occurs
42
+ # it will return the latest version tag from the git_commit_checker. as it was before
43
+ sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
44
+ def latest_version_tag
45
+ # step one fetch allowed version tags and
46
+ allowed_version_tags = git_commit_checker.allowed_version_tags
47
+ begin
48
+ # sort the allowed version tags by name in descending order
49
+ select_version_tags_in_cooldown_period&.each do |tag_name|
50
+ # filter out if name is not in cooldown period
51
+ allowed_version_tags.reject! do |gitref_filtered|
52
+ true if gitref_filtered.name == tag_name
53
+ end
54
+ end
55
+ Dependabot.logger.info("Allowed version tags after filtering versions in cooldown:
56
+ #{allowed_version_tags.map(&:name).join(', ')}")
57
+ git_commit_checker.max_local_tag(allowed_version_tags)
58
+ rescue StandardError => e
59
+ Dependabot.logger.error("Error fetching latest version tag: #{e.message}")
60
+ git_commit_checker.local_tag_for_latest_version
61
+ end
62
+ end
63
+
64
+ sig { returns(T.nilable(T::Array[String])) }
65
+ def select_version_tags_in_cooldown_period
66
+ version_tags_in_cooldown_period = T.let([], T::Array[String])
67
+
68
+ package_details_fetcher.fetch_tag_and_release_date.each do |git_tag_with_detail|
69
+ if check_if_version_in_cooldown_period?(git_tag_with_detail.release_date)
70
+ version_tags_in_cooldown_period << git_tag_with_detail.tag
71
+ end
72
+ end
73
+ version_tags_in_cooldown_period
74
+ rescue StandardError => e
75
+ Dependabot.logger.error("Error checking if version is in cooldown: #{e.message}")
76
+ version_tags_in_cooldown_period
77
+ end
78
+
79
+ sig { params(release_date: String).returns(T::Boolean) }
80
+ def check_if_version_in_cooldown_period?(release_date)
81
+ return false unless release_date.length.positive?
82
+
83
+ cooldown = @cooldown_options
84
+ return false unless cooldown
85
+
86
+ return false if cooldown.nil?
87
+
88
+ # Get maximum cooldown days based on semver parts
89
+ days = [cooldown.default_days, cooldown.semver_major_days].max
90
+ days = cooldown.semver_minor_days unless days > cooldown.semver_minor_days
91
+ days = cooldown.semver_patch_days unless days > cooldown.semver_patch_days
92
+ # Calculate the number of seconds passed since the release
93
+ passed_seconds = Time.now.to_i - release_date_to_seconds(release_date)
94
+ # Check if the release is within the cooldown period
95
+ passed_seconds < days * DAY_IN_SECONDS
96
+ end
97
+
98
+ sig { params(release_date: String).returns(Integer) }
99
+ def release_date_to_seconds(release_date)
100
+ Time.parse(release_date).to_i
101
+ rescue ArgumentError => e
102
+ Dependabot.logger.error("Invalid release date format: #{release_date} and error: #{e.message}")
103
+ 0 # Default to 360 days in seconds if parsing fails, so that it will not be in cooldown
104
+ end
105
+
106
+ sig { returns(Package::PackageDetailsFetcher) }
107
+ def package_details_fetcher
108
+ @package_details_fetcher ||= T.let(
109
+ Package::PackageDetailsFetcher.new(
110
+ dependency: dependency,
111
+ credentials: credentials,
112
+ git_commit_checker: git_commit_checker
113
+ ), T.nilable(Package::PackageDetailsFetcher)
114
+ )
115
+ end
116
+
117
+ sig { returns(T::Boolean) }
118
+ def cooldown_enabled?
119
+ Dependabot::Experiments.enabled?(:enable_cooldown_for_swift)
120
+ end
121
+
122
+ sig { returns(Dependabot::GitCommitChecker) }
123
+ attr_reader :git_commit_checker
124
+
125
+ sig { returns(T::Array[Dependabot::Credential]) }
126
+ attr_reader :credentials
127
+ end
128
+ end
129
+ end
130
+ end
@@ -16,6 +16,7 @@ module Dependabot
16
16
 
17
17
  require_relative "update_checker/requirements_updater"
18
18
  require_relative "update_checker/version_resolver"
19
+ require_relative "update_checker/latest_version_resolver"
19
20
 
20
21
  sig { override.returns(T.nilable(Dependabot::Version)) }
21
22
  def latest_version
@@ -111,6 +112,16 @@ module Dependabot
111
112
  )
112
113
  end
113
114
 
115
+ sig { returns(LatestVersionResolver) }
116
+ def cooldown_check_version_resolver_for
117
+ LatestVersionResolver.new(
118
+ dependency: dependency,
119
+ credentials: credentials,
120
+ cooldown_options: update_cooldown,
121
+ git_commit_checker: git_commit_checker
122
+ )
123
+ end
124
+
114
125
  sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
115
126
  def unlocked_requirements
116
127
  NativeRequirement.map_requirements(old_requirements) do |_old_requirement|
@@ -183,7 +194,7 @@ module Dependabot
183
194
 
184
195
  sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
185
196
  def latest_version_tag
186
- git_commit_checker.local_tag_for_latest_version
197
+ cooldown_check_version_resolver_for.latest_version_tag
187
198
  end
188
199
 
189
200
  sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-swift
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.314.0
4
+ version: 0.316.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-05-22 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: dependabot-common
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.314.0
18
+ version: 0.316.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.314.0
25
+ version: 0.316.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: debug
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -253,9 +253,11 @@ files:
253
253
  - lib/dependabot/swift/language.rb
254
254
  - lib/dependabot/swift/metadata_finder.rb
255
255
  - lib/dependabot/swift/native_requirement.rb
256
+ - lib/dependabot/swift/package/package_details_fetcher.rb
256
257
  - lib/dependabot/swift/package_manager.rb
257
258
  - lib/dependabot/swift/requirement.rb
258
259
  - lib/dependabot/swift/update_checker.rb
260
+ - lib/dependabot/swift/update_checker/latest_version_resolver.rb
259
261
  - lib/dependabot/swift/update_checker/requirements_updater.rb
260
262
  - lib/dependabot/swift/update_checker/version_resolver.rb
261
263
  - lib/dependabot/swift/version.rb
@@ -264,7 +266,7 @@ 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.314.0
269
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.316.0
268
270
  rdoc_options: []
269
271
  require_paths:
270
272
  - lib
@@ -272,14 +274,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
272
274
  requirements:
273
275
  - - ">="
274
276
  - !ruby/object:Gem::Version
275
- version: 3.1.0
277
+ version: 3.3.0
276
278
  required_rubygems_version: !ruby/object:Gem::Requirement
277
279
  requirements:
278
280
  - - ">="
279
281
  - !ruby/object:Gem::Version
280
- version: 3.1.0
282
+ version: 3.3.0
281
283
  requirements: []
282
- rubygems_version: 3.6.3
284
+ rubygems_version: 3.6.9
283
285
  specification_version: 4
284
286
  summary: Provides Dependabot support for Swift
285
287
  test_files: []