dependabot-dotnet_sdk 0.317.0 → 0.318.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: c9cf3c0f4066c28fcab2b668a44264cc52ef9dac8dc5847de3f4ab6ecdc0215f
4
- data.tar.gz: 516dfa1ae1d9d75533b4d134d35d126a7da8e84e26e36bc005c9a6260eb38342
3
+ metadata.gz: '039adc7e5a9dc839f07b1665a9f626a367d5acca93c6403d009862a76ab5aaff'
4
+ data.tar.gz: 1bf3eb9d9a53c91ff663fe256566758e3a7a4eceed8f3acc0275ca931d64b582
5
5
  SHA512:
6
- metadata.gz: 212338f5124264f5ca0259539f5e46db59bf55563b863dee6578f51c472e6d744f982f7011f7f11d759c40cbe33c41462ce0320f667768e7eafe6334f8157f99
7
- data.tar.gz: f1001d8a73701fc2bb1437997eb3a5779e856f87fb09f616372af4bea6e8ad35a476ef8c9959888d92f3611f73f64042fed58c7a0b00432161cf7bcc74f0b782
6
+ metadata.gz: f189b5e18550bc281c0d024d2881e120436dc73be455d08a75e124ee60f9d76d6b8041852848ed9f429bb2d6df1f2d851df6e3d2469149d6f34f4732d4b21df4
7
+ data.tar.gz: 7b645cbf524315097ece68eb189695234a60d930b14904d15c2123fe95d58f6a34796539fa3463a2e91a62824ffde1b3fb73f6d36dbb57778fb70b40d6fddbf5
@@ -0,0 +1,135 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ require "dependabot/package/package_details"
7
+
8
+ require "dependabot/dotnet_sdk/version"
9
+
10
+ module Dependabot
11
+ module DotnetSdk
12
+ module Package
13
+ class PackageDetailsFetcher
14
+ extend T::Sig
15
+
16
+ RELEASES_INDEX_URL = "https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/releases-index.json"
17
+
18
+ sig do
19
+ params(
20
+ dependency: Dependabot::Dependency
21
+ ).void
22
+ end
23
+ def initialize(dependency:)
24
+ @dependency = dependency
25
+ @package_details = T.let(nil, T.nilable(Dependabot::Package::PackageDetails))
26
+ end
27
+
28
+ sig { returns(Dependabot::Dependency) }
29
+ attr_reader :dependency
30
+
31
+ sig do
32
+ returns(T.nilable(Dependabot::Package::PackageDetails))
33
+ end
34
+ def fetch
35
+ package_releases = releases.filter_map do |release|
36
+ version = release["version"]
37
+ release_date = release["release-date"]
38
+ next unless version && release_date
39
+
40
+ package_release(
41
+ version: version,
42
+ released_at: Time.parse(release_date)
43
+ )
44
+ end
45
+
46
+ package_details(package_releases)
47
+ end
48
+
49
+ private
50
+
51
+ sig { returns(T::Array[T::Hash[String, String]]) }
52
+ def releases
53
+ response = releases_response
54
+ return [] unless response.status == 200
55
+
56
+ parsed = JSON.parse(response.body)
57
+ parsed["releases-index"].flat_map do |release|
58
+ release_channel(release["releases.json"])
59
+ end
60
+ end
61
+
62
+ sig { returns(Excon::Response) }
63
+ def releases_response
64
+ Dependabot::RegistryClient.get(
65
+ url: RELEASES_INDEX_URL,
66
+ headers: { "Accept" => "application/json" }
67
+ )
68
+ end
69
+
70
+ sig { params(url: String).returns(T::Array[T::Hash[String, String]]) }
71
+ def release_channel(url)
72
+ response = release_channel_response(url)
73
+ return [] unless response
74
+
75
+ JSON.parse(response.body)
76
+ .fetch("releases", [])
77
+ .flat_map { |release| extract_release_versions(release) }
78
+ rescue JSON::ParserError
79
+ raise Dependabot::DependencyFileNotResolvable, "Invalid JSON response from #{url}"
80
+ end
81
+
82
+ sig { params(release: T::Hash[String, T.untyped]).returns(T::Array[T::Hash[String, String]]) }
83
+ def extract_release_versions(release)
84
+ release_date = release["release-date"]
85
+ return [] unless release_date
86
+
87
+ if release["sdks"].nil?
88
+ sdk_version = release.dig("sdk", "version")
89
+ return [] unless sdk_version
90
+
91
+ [{ "version" => sdk_version, "release-date" => release_date }]
92
+ else
93
+ release["sdks"]&.filter_map do |sdk|
94
+ next unless sdk["version"]
95
+
96
+ { "version" => sdk["version"], "release-date" => release_date }
97
+ end || []
98
+ end
99
+ end
100
+
101
+ sig { params(url: String).returns(T.nilable(Excon::Response)) }
102
+ def release_channel_response(url)
103
+ Dependabot::RegistryClient.get(
104
+ url: url,
105
+ headers: { "Accept" => "application/json" }
106
+ )
107
+ end
108
+
109
+ sig do
110
+ params(
111
+ version: String,
112
+ released_at: T.nilable(Time)
113
+ ).returns(Dependabot::Package::PackageRelease)
114
+ end
115
+ def package_release(version:, released_at:)
116
+ Dependabot::Package::PackageRelease.new(
117
+ version: DotnetSdk::Version.new(version),
118
+ released_at: released_at
119
+ )
120
+ end
121
+
122
+ sig do
123
+ params(releases: T::Array[Dependabot::Package::PackageRelease])
124
+ .returns(Dependabot::Package::PackageDetails)
125
+ end
126
+ def package_details(releases)
127
+ @package_details ||= Dependabot::Package::PackageDetails.new(
128
+ dependency: dependency,
129
+ releases: releases.reverse.uniq(&:version)
130
+ )
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
@@ -1,138 +1,62 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- require "excon"
5
4
  require "sorbet-runtime"
6
5
 
7
- require "dependabot/dotnet_sdk/requirement"
8
- require "dependabot/dotnet_sdk/version"
6
+ require "dependabot/package/package_details"
7
+ require "dependabot/package/package_latest_version_finder"
9
8
  require "dependabot/registry_client"
10
9
  require "dependabot/update_checkers/base"
11
10
 
11
+ require "dependabot/dotnet_sdk/package/package_details_fetcher"
12
+ require "dependabot/dotnet_sdk/requirement"
13
+ require "dependabot/dotnet_sdk/version"
14
+
12
15
  module Dependabot
13
16
  module DotnetSdk
14
17
  class UpdateChecker < Dependabot::UpdateCheckers::Base
15
- class LatestVersionFinder
18
+ class LatestVersionFinder < Dependabot::Package::PackageLatestVersionFinder
16
19
  extend T::Sig
17
20
 
18
- RELEASES_INDEX_URL = "https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/releases-index.json"
19
-
20
- sig { params(dependency: Dependabot::Dependency, ignored_versions: T::Array[String]).void }
21
- def initialize(dependency:, ignored_versions:)
22
- @dependency = dependency
23
- @ignored_versions = ignored_versions
21
+ sig do
22
+ override.returns(T.nilable(Dependabot::Package::PackageDetails))
24
23
  end
25
-
26
- sig { returns(T.nilable(Dependabot::Version)) }
27
- def latest_version
28
- @latest_version ||= T.let(
29
- fetch_latest_version,
30
- T.nilable(Dependabot::Version)
31
- )
24
+ def package_details
25
+ @package_details ||= Package::PackageDetailsFetcher.new(dependency: dependency).fetch
32
26
  end
33
27
 
34
- private
35
-
36
- sig { returns(Dependabot::Dependency) }
37
- attr_reader :dependency
38
-
39
- sig { returns(T::Array[String]) }
40
- attr_reader :ignored_versions
41
-
42
- sig { returns(T.nilable(Dependabot::Version)) }
43
- def fetch_latest_version
44
- versions = available_versions
45
- versions = filter_prerelease_versions(versions)
46
- versions = filter_ignored_versions(versions)
47
- versions.max
28
+ sig do
29
+ override
30
+ .params(language_version: T.nilable(T.any(String, Dependabot::Version)))
31
+ .returns(T.nilable(Dependabot::Version))
48
32
  end
49
-
50
- sig { returns(T::Array[Dependabot::Version]) }
51
- def available_versions
52
- releases.map { |v| version_class.new(v) }
33
+ def latest_version(language_version: nil) # rubocop:disable Lint/UnusedMethodArgument
34
+ @latest_version ||= fetch_latest_version
53
35
  end
54
36
 
55
- sig { params(versions: T::Array[Dependabot::Version]).returns(T::Array[Dependabot::Version]) }
56
- def filter_prerelease_versions(versions)
57
- return versions if wants_prerelease?
58
-
59
- # This isn't entirely accurate. .NET considers release candidates to NOT be pre-releases.
60
- # However, we want to be conservative.
61
- # See https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-core
62
- versions.reject(&:prerelease?)
37
+ sig do
38
+ override
39
+ .params(language_version: T.nilable(T.any(String, Dependabot::Version)))
40
+ .returns(T.nilable(Dependabot::Version))
63
41
  end
64
-
65
- sig { params(versions: T::Array[Dependabot::Version]).returns(T::Array[Dependabot::Version]) }
66
- def filter_ignored_versions(versions)
67
- versions.reject do |version|
68
- ignore_requirements.any? { |r| r.satisfied_by?(version) }
69
- end
42
+ def lowest_security_fix_version(language_version: nil) # rubocop:disable Lint/UnusedMethodArgument
43
+ @lowest_security_fix_version ||= fetch_lowest_security_fix_version
70
44
  end
71
45
 
72
- sig { returns(T::Array[String]) }
73
- def releases
74
- response = releases_response
75
- return [] unless response.status == 200
46
+ protected
76
47
 
77
- parsed = JSON.parse(response.body)
78
- parsed["releases-index"].flat_map do |release|
79
- release_channel(release["releases.json"])
80
- end
81
- end
82
-
83
- sig { returns(Excon::Response) }
84
- def releases_response
85
- Dependabot::RegistryClient.get(
86
- url: RELEASES_INDEX_URL,
87
- headers: { "Accept" => "application/json" }
88
- )
89
- end
90
-
91
- sig { params(url: String).returns(T::Array[String]) }
92
- def release_channel(url)
93
- response = release_channel_response(url)
94
- begin
95
- parsed = JSON.parse(T.must(response).body)
96
- rescue JSON::ParserError
97
- raise Dependabot::DependencyFileNotResolvable, "Invalid JSON response from #{url}"
98
- end
99
-
100
- parsed["releases"].map do |release|
101
- if release["sdks"].nil?
102
- release["sdk"]["version"]
103
- else
104
- release["sdks"].flat_map { |sdk| sdk["version"] }
105
- end
106
- end
107
- .flatten
108
- end
109
-
110
- sig { params(url: String).returns(T.nilable(Excon::Response)) }
111
- def release_channel_response(url)
112
- Dependabot::RegistryClient.get(
113
- url: url,
114
- headers: { "Accept" => "application/json" }
115
- )
116
- end
117
-
118
- sig { returns(T::Boolean) }
48
+ sig { override.returns(T::Boolean) }
119
49
  def wants_prerelease?
120
- dependency.metadata[:allow_prerelease]
50
+ !!dependency.metadata[:allow_prerelease]
121
51
  end
122
52
 
123
- sig { returns(T::Array[Dependabot::Requirement]) }
124
- def ignore_requirements
125
- ignored_versions.flat_map { |req| requirement_class.requirements_array(req) }
53
+ sig do
54
+ override
55
+ .params(releases: T::Array[Dependabot::Package::PackageRelease])
56
+ .returns(T::Array[Dependabot::Package::PackageRelease])
126
57
  end
127
-
128
- sig { returns(T.class_of(Dependabot::Version)) }
129
- def version_class
130
- dependency.version_class
131
- end
132
-
133
- sig { returns(T.class_of(Dependabot::Requirement)) }
134
- def requirement_class
135
- dependency.requirement_class
58
+ def apply_post_fetch_lowest_security_fix_versions_filter(releases)
59
+ filter_prerelease_versions(releases)
136
60
  end
137
61
  end
138
62
  end
@@ -24,6 +24,17 @@ module Dependabot
24
24
  latest_version
25
25
  end
26
26
 
27
+ sig { override.returns(T.nilable(Dependabot::Version)) }
28
+ def lowest_security_fix_version
29
+ latest_version_finder.lowest_security_fix_version
30
+ end
31
+
32
+ sig { override.returns(T.nilable(Dependabot::Version)) }
33
+ def lowest_resolvable_security_fix_version
34
+ # Resolvability isn't an issue for dotnet SDKs
35
+ lowest_security_fix_version
36
+ end
37
+
27
38
  sig { override.returns(T.nilable(Dependabot::Version)) }
28
39
  def latest_resolvable_version_with_no_unlock
29
40
  raise NotImplementedError
@@ -34,7 +45,7 @@ module Dependabot
34
45
  dependency.requirements.map do |requirement|
35
46
  {
36
47
  file: requirement[:file],
37
- requirement: latest_version,
48
+ requirement: preferred_resolvable_version,
38
49
  groups: requirement[:groups],
39
50
  source: requirement[:source]
40
51
  }
@@ -56,7 +67,15 @@ module Dependabot
56
67
  sig { returns(LatestVersionFinder) }
57
68
  def latest_version_finder
58
69
  @latest_version_finder ||= T.let(
59
- LatestVersionFinder.new(dependency: dependency, ignored_versions: ignored_versions),
70
+ LatestVersionFinder.new(
71
+ dependency: dependency,
72
+ dependency_files: dependency_files,
73
+ credentials: credentials,
74
+ ignored_versions: ignored_versions,
75
+ security_advisories: security_advisories,
76
+ cooldown_options: update_cooldown,
77
+ raise_on_ignored: raise_on_ignored
78
+ ),
60
79
  T.nilable(LatestVersionFinder)
61
80
  )
62
81
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-dotnet_sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.317.0
4
+ version: 0.318.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.317.0
18
+ version: 0.318.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.317.0
25
+ version: 0.318.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: debug
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -246,6 +246,7 @@ files:
246
246
  - lib/dependabot/dotnet_sdk/file_updater.rb
247
247
  - lib/dependabot/dotnet_sdk/language.rb
248
248
  - lib/dependabot/dotnet_sdk/metadata_finder.rb
249
+ - lib/dependabot/dotnet_sdk/package/package_details_fetcher.rb
249
250
  - lib/dependabot/dotnet_sdk/package_manager.rb
250
251
  - lib/dependabot/dotnet_sdk/requirement.rb
251
252
  - lib/dependabot/dotnet_sdk/update_checker.rb
@@ -256,7 +257,7 @@ licenses:
256
257
  - MIT
257
258
  metadata:
258
259
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
259
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.317.0
260
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.318.0
260
261
  rdoc_options: []
261
262
  require_paths:
262
263
  - lib