dependabot-elm 0.316.0 → 0.317.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: 34441e8c0b32ed0c7cdfd613c37fda2d516eba8a0e1a04db751688198cc95057
4
- data.tar.gz: ccd6c792f1ab51bb5cb385ae87ea550a5f01af7337acecfbe1499ec83016dd5a
3
+ metadata.gz: 7968cf82c69ae8943a5e57f0f413fab605cdc72c47c5315040e5949a51ba86f2
4
+ data.tar.gz: 29821d940e253f2c8f8e10701521d58f942bbd2adfdaa35423b50d574606027c
5
5
  SHA512:
6
- metadata.gz: ab4087fd840f3d4de8730b6a92dca3bfc8940dec9aef4c9087ee4c0950fa2677a8c28f1bcb7081f8f6c8c6f904e423a9784118de0c72334763057ef8d574d679
7
- data.tar.gz: ed5f13d53cb94a9353c50fd8d68527b88e3f3f03ae46e0731245afceaa168f257b95aea0a62d76c12dbaef1944e2d2a2ac61698219c01237784c42b18a016e65
6
+ metadata.gz: 7ddb5556b029edd62b19f2d5856c9a8329bc5e8e3fe667877999a1c211f47f4888baebbdb4a406c0375c1841dbe88d42d89e27a8eb14db29fba6061397ae522b
7
+ data.tar.gz: 62221f67576047ed886feff7cc433a34bf2904e63bbf8c57846acfc79b0e76ea4afc06c5aa1f9f55f3df36e1fd30c7c5d8a6521546813275e859d85018bb6a5f
@@ -0,0 +1,65 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+ require "time"
6
+ require "cgi"
7
+ require "excon"
8
+ require "nokogiri"
9
+ require "sorbet-runtime"
10
+ require "dependabot/registry_client"
11
+ require "dependabot/elm"
12
+ require "dependabot/elm/version"
13
+ require "dependabot/package/package_release"
14
+ require "dependabot/package/package_details"
15
+
16
+ module Dependabot
17
+ module Elm
18
+ module Package
19
+ class PackageDetailsFetcher
20
+ extend T::Sig
21
+
22
+ sig do
23
+ params(
24
+ dependency: Dependabot::Dependency
25
+ ).void
26
+ end
27
+ def initialize(dependency:)
28
+ @dependency = dependency
29
+
30
+ @provider_url = T.let("https://package.elm-lang.org/packages/#{dependency.name}/releases.json",
31
+ T.nilable(String))
32
+ end
33
+
34
+ sig { returns(Dependabot::Dependency) }
35
+ attr_reader :dependency
36
+
37
+ sig { returns(T.nilable(T::Array[Dependabot::Package::PackageRelease])) }
38
+ def fetch_package_releases
39
+ releases = T.let([], T::Array[Dependabot::Package::PackageRelease])
40
+ begin
41
+ response = Dependabot::RegistryClient.get(
42
+ url: T.must(@provider_url)
43
+ )
44
+
45
+ return [] unless response.status == 200
46
+
47
+ package_metadata = JSON.parse(response.body)
48
+
49
+ package_metadata.each do |version, release_date|
50
+ releases << Dependabot::Package::PackageRelease.new(
51
+ version: Elm::Version.new(version),
52
+ released_at: release_date ? Time.at(release_date).to_time : nil
53
+ )
54
+ end
55
+
56
+ releases
57
+ rescue StandardError => e
58
+ Dependabot.logger.error("Error while fetching package info for elm packages: #{e.message}")
59
+ releases
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -1,20 +1,106 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
+ require "excon"
5
+ require "json"
6
+ require "sorbet-runtime"
7
+
4
8
  require "open3"
5
9
  require "shellwords"
6
- require "dependabot/shared_helpers"
7
10
  require "dependabot/errors"
11
+ require "dependabot/package/package_latest_version_finder"
12
+ require "dependabot/shared_helpers"
13
+ require "dependabot/update_checkers/version_filters"
8
14
  require "dependabot/elm/file_parser"
15
+ require "dependabot/elm/package/package_details_fetcher"
16
+ require "dependabot/elm/requirement"
9
17
  require "dependabot/elm/update_checker"
10
18
  require "dependabot/elm/update_checker/cli_parser"
11
19
  require "dependabot/elm/update_checker/requirements_updater"
12
- require "dependabot/elm/requirement"
13
20
 
14
21
  module Dependabot
15
22
  module Elm
16
23
  class UpdateChecker
17
- class Elm19VersionResolver
24
+ class LatestVersionFinder < Dependabot::Package::PackageLatestVersionFinder
25
+ extend T::Sig
26
+
27
+ sig do
28
+ params(
29
+ dependency: Dependabot::Dependency,
30
+ dependency_files: T::Array[Dependabot::DependencyFile],
31
+ credentials: T::Array[Dependabot::Credential],
32
+ ignored_versions: T::Array[String],
33
+ security_advisories: T::Array[Dependabot::SecurityAdvisory],
34
+ raise_on_ignored: T::Boolean,
35
+ options: T::Hash[Symbol, T.untyped],
36
+ cooldown_options: T.nilable(Dependabot::Package::ReleaseCooldownOptions)
37
+ ).void
38
+ end
39
+ def initialize(
40
+ dependency:,
41
+ dependency_files:,
42
+ credentials:,
43
+ ignored_versions:,
44
+ security_advisories:,
45
+ raise_on_ignored:,
46
+ options: {},
47
+ cooldown_options: nil
48
+ )
49
+ @dependency = dependency
50
+ @dependency_files = dependency_files
51
+ @credentials = credentials
52
+ @ignored_versions = ignored_versions
53
+ @security_advisories = security_advisories
54
+ @raise_on_ignored = raise_on_ignored
55
+ @options = options
56
+ @cooldown_options = cooldown_options
57
+ super
58
+ end
59
+
60
+ sig { returns(Dependabot::Dependency) }
61
+ attr_reader :dependency
62
+ sig { returns(T::Array[Dependabot::Credential]) }
63
+ attr_reader :credentials
64
+ sig { returns(T.nilable(Dependabot::Package::ReleaseCooldownOptions)) }
65
+ attr_reader :cooldown_options
66
+ sig { returns(T::Array[String]) }
67
+ attr_reader :ignored_versions
68
+ sig { returns(T::Array[Dependabot::SecurityAdvisory]) }
69
+ attr_reader :security_advisories
70
+ sig { override.returns(T.nilable(Dependabot::Package::PackageDetails)) }
71
+ def package_details; end
72
+
73
+ sig { returns(T.nilable(Dependabot::Version)) }
74
+ def release_version
75
+ releases = package_releases
76
+ releases = filter_ignored_versions(T.must(releases))
77
+ releases = filter_by_cooldown(releases)
78
+
79
+ releases.max_by(&:version)&.version
80
+ end
81
+
82
+ private
83
+
84
+ sig { returns(T.nilable(T::Array[Dependabot::Package::PackageRelease])) }
85
+ def package_releases
86
+ @package_releases = T.let(Dependabot::Elm::Package::PackageDetailsFetcher
87
+ .new(dependency: dependency)
88
+ .fetch_package_releases, T.nilable(T::Array[Dependabot::Package::PackageRelease]))
89
+ end
90
+
91
+ sig { override.returns(T::Boolean) }
92
+ def cooldown_enabled?
93
+ Dependabot::Experiments.enabled?(:enable_cooldown_for_elm)
94
+ end
95
+ end
96
+
97
+ ################################
98
+ ################################
99
+ #### ELM19 version finder ######
100
+ ################################
101
+ ################################
102
+
103
+ class Elm19LatestVersionFinder < Dependabot::Package::PackageLatestVersionFinder
18
104
  extend T::Sig
19
105
 
20
106
  class UnrecoverableState < StandardError; end
@@ -22,12 +108,14 @@ module Dependabot
22
108
  sig do
23
109
  params(
24
110
  dependency: Dependabot::Dependency,
25
- dependency_files: T::Array[Dependabot::DependencyFile]
111
+ dependency_files: T::Array[Dependabot::DependencyFile],
112
+ cooldown_options: T.nilable(Dependabot::Package::ReleaseCooldownOptions)
26
113
  ).void
27
114
  end
28
- def initialize(dependency:, dependency_files:)
115
+ def initialize(dependency:, dependency_files:, cooldown_options: nil)
29
116
  @dependency = dependency
30
117
  @dependency_files = dependency_files
118
+ @cooldown_options = cooldown_options
31
119
 
32
120
  @install_metadata = T.let(nil, T.nilable(T::Hash[String, Dependabot::Elm::Version]))
33
121
  @original_dependency_details ||= T.let(nil, T.nilable(T::Array[Dependabot::Dependency]))
@@ -85,13 +173,28 @@ module Dependabot
85
173
  sig { returns(T::Array[Dependabot::DependencyFile]) }
86
174
  attr_reader :dependency_files
87
175
 
176
+ sig { returns(T.nilable(T::Array[Dependabot::Package::PackageRelease])) }
177
+ def package_releases
178
+ T.let(Dependabot::Elm::Package::PackageDetailsFetcher
179
+ .new(dependency: dependency)
180
+ .fetch_package_releases, T.nilable(T::Array[Dependabot::Package::PackageRelease]))
181
+ end
182
+
88
183
  sig { params(unlock_requirement: Symbol).returns(T.nilable(Dependabot::Elm::Version)) }
89
184
  def fetch_latest_resolvable_version(unlock_requirement)
90
185
  changed_deps = install_metadata
91
-
92
186
  result = check_install_result(changed_deps)
93
187
  version_after_install = changed_deps.fetch(dependency.name)
94
188
 
189
+ # returns current version if new proposed version is in cooldown period
190
+ new_release = package_releases&.find { |release| release.version == version_after_install }
191
+
192
+ if cooldown_options && in_cooldown_period?(T.must(new_release))
193
+ Dependabot.logger.info("#{dependency.name} #{new_release} is in cooldown period," \
194
+ " returning current version #{current_version}")
195
+ return current_version
196
+ end
197
+
95
198
  # If the install was clean then we can definitely update
96
199
  return version_after_install if result == :clean_bump
97
200
 
@@ -114,6 +217,11 @@ module Dependabot
114
217
  :clean_bump
115
218
  end
116
219
 
220
+ sig { override.returns(T::Boolean) }
221
+ def cooldown_enabled?
222
+ Dependabot::Experiments.enabled?(:enable_cooldown_for_elm)
223
+ end
224
+
117
225
  sig { returns(T::Hash[String, Dependabot::Elm::Version]) }
118
226
  def install_metadata
119
227
  @install_metadata ||= parse_install_metadata
@@ -221,6 +329,8 @@ module Dependabot
221
329
  def requirement_class
222
330
  dependency.requirement_class
223
331
  end
332
+ sig { override.returns(T.nilable(Dependabot::Package::PackageDetails)) }
333
+ def package_details; end
224
334
  end
225
335
  end
226
336
  end
@@ -13,34 +13,17 @@ module Dependabot
13
13
  extend T::Sig
14
14
 
15
15
  require_relative "update_checker/requirements_updater"
16
- require_relative "update_checker/elm_19_version_resolver"
16
+ require_relative "update_checker/latest_version_finder"
17
17
 
18
18
  sig { override.returns(T.nilable(Dependabot::Version)) }
19
19
  def latest_version
20
- @latest_version ||= T.let(candidate_versions.max, T.nilable(Dependabot::Version))
21
- end
22
-
23
- # Overwrite the base class to allow multi-dependency update PRs for
24
- # dependencies for which we don't have a version.
25
- sig { override.params(requirements_to_unlock: T.nilable(Symbol)).returns(T::Boolean) }
26
- def can_update?(requirements_to_unlock:)
27
- if dependency.appears_in_lockfile?
28
- version_can_update?(requirements_to_unlock: requirements_to_unlock)
29
- elsif requirements_to_unlock == :none
30
- false
31
- elsif requirements_to_unlock == :own
32
- requirements_can_update?
33
- elsif requirements_to_unlock == :all
34
- updated_dependencies_after_full_unlock.any?
35
- else
36
- false
37
- end
20
+ @latest_version ||= T.let(T.must(latest_version_finder).release_version, T.nilable(Dependabot::Version))
38
21
  end
39
22
 
40
23
  sig { override.returns(T.nilable(Dependabot::Version)) }
41
24
  def latest_resolvable_version
42
25
  @latest_resolvable_version ||= T.let(
43
- version_resolver
26
+ latest_version_finder_elm19
44
27
  .latest_resolvable_version(unlock_requirement: :own), T.nilable(Dependabot::Version)
45
28
  )
46
29
  end
@@ -61,72 +44,66 @@ module Dependabot
61
44
  ).updated_requirements
62
45
  end
63
46
 
47
+ # Overwrite the base class to allow multi-dependency update PRs for
48
+ # dependencies for which we don't have a version.
49
+ sig { override.params(requirements_to_unlock: T.nilable(Symbol)).returns(T::Boolean) }
50
+ def can_update?(requirements_to_unlock:)
51
+ if dependency.appears_in_lockfile?
52
+ version_can_update?(requirements_to_unlock: requirements_to_unlock)
53
+ elsif requirements_to_unlock == :none
54
+ false
55
+ elsif requirements_to_unlock == :own
56
+ requirements_can_update?
57
+ elsif requirements_to_unlock == :all
58
+ updated_dependencies_after_full_unlock.any?
59
+ else
60
+ false
61
+ end
62
+ end
63
+
64
64
  private
65
65
 
66
- sig { returns(Elm19VersionResolver) }
67
- def version_resolver
68
- @version_resolver ||= T.let(
66
+ sig { returns(Elm19LatestVersionFinder) }
67
+ def latest_version_finder_elm19
68
+ @latest_version_finder_elm19 ||= T.let(
69
69
  begin
70
70
  unless dependency.requirements.any? { |r| r.fetch(:file) == MANIFEST_FILE }
71
71
  raise Dependabot::DependencyFileNotResolvable, "No #{MANIFEST_FILE} found"
72
72
  end
73
73
 
74
- Elm19VersionResolver.new(
74
+ Elm19LatestVersionFinder.new(
75
75
  dependency: dependency,
76
- dependency_files: dependency_files
76
+ dependency_files: dependency_files,
77
+ cooldown_options: update_cooldown
77
78
  )
78
- end, T.nilable(Elm19VersionResolver)
79
+ end, T.nilable(Elm19LatestVersionFinder)
79
80
  )
80
81
  end
81
82
 
82
83
  sig { override.returns(T::Array[Dependabot::Dependency]) }
83
84
  def updated_dependencies_after_full_unlock
84
- version_resolver.updated_dependencies_after_full_unlock
85
+ latest_version_finder_elm19.updated_dependencies_after_full_unlock
85
86
  end
86
87
 
87
88
  sig { override.returns(T::Boolean) }
88
89
  def latest_version_resolvable_with_full_unlock?
89
- latest_version == version_resolver
90
+ latest_version == latest_version_finder_elm19
90
91
  .latest_resolvable_version(unlock_requirement: :all)
91
92
  end
92
93
 
93
- sig { returns(T::Array[Dependabot::Version]) }
94
- def candidate_versions
95
- filtered = all_versions
96
- .reject { |v| ignore_requirements.any? { |r| r.satisfied_by?(v) } }
97
-
98
- if @raise_on_ignored && filter_lower_versions(filtered).empty? && filter_lower_versions(all_versions).any?
99
- raise AllVersionsIgnored
100
- end
101
-
102
- filtered
103
- end
104
-
105
- sig { params(versions_array: T::Array[Dependabot::Version]).returns(T::Array[Dependabot::Version]) }
106
- def filter_lower_versions(versions_array)
107
- return versions_array unless current_version
108
-
109
- versions_array
110
- .select { |version| version > current_version }
111
- end
112
-
113
- sig { returns(T::Array[Dependabot::Version]) }
114
- def all_versions
115
- @all_versions ||= T.let(fetch_all_versions, T.nilable(T::Array[Dependabot::Version]))
116
- end
117
-
118
- sig { returns(T::Array[Dependabot::Version]) }
119
- def fetch_all_versions
120
- response = Dependabot::RegistryClient.get(
121
- url: "https://package.elm-lang.org/packages/#{dependency.name}/releases.json"
122
- )
123
-
124
- return [] unless response.status == 200
125
-
126
- JSON.parse(response.body)
127
- .keys
128
- .map { |v| version_class.new(v) }
129
- .sort
94
+ sig { returns(T.nilable(Dependabot::Elm::UpdateChecker::LatestVersionFinder)) }
95
+ def latest_version_finder
96
+ @latest_version_finder ||=
97
+ T.let(LatestVersionFinder.new(
98
+ dependency: dependency,
99
+ credentials: credentials,
100
+ dependency_files: dependency_files,
101
+ security_advisories: security_advisories,
102
+ ignored_versions: ignored_versions,
103
+ raise_on_ignored: raise_on_ignored,
104
+ cooldown_options: update_cooldown
105
+ ),
106
+ T.nilable(Dependabot::Elm::UpdateChecker::LatestVersionFinder))
130
107
  end
131
108
 
132
109
  # Overwrite the base class's requirements_up_to_date? method to instead
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-elm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.316.0
4
+ version: 0.317.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.316.0
18
+ version: 0.317.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.316.0
25
+ version: 0.317.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: debug
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -248,11 +248,12 @@ files:
248
248
  - lib/dependabot/elm/file_updater/elm_json_updater.rb
249
249
  - lib/dependabot/elm/language.rb
250
250
  - lib/dependabot/elm/metadata_finder.rb
251
+ - lib/dependabot/elm/package/package_details_fetcher.rb
251
252
  - lib/dependabot/elm/package_manager.rb
252
253
  - lib/dependabot/elm/requirement.rb
253
254
  - lib/dependabot/elm/update_checker.rb
254
255
  - lib/dependabot/elm/update_checker/cli_parser.rb
255
- - lib/dependabot/elm/update_checker/elm_19_version_resolver.rb
256
+ - lib/dependabot/elm/update_checker/latest_version_finder.rb
256
257
  - lib/dependabot/elm/update_checker/requirements_updater.rb
257
258
  - lib/dependabot/elm/version.rb
258
259
  homepage: https://github.com/dependabot/dependabot-core
@@ -260,7 +261,7 @@ licenses:
260
261
  - MIT
261
262
  metadata:
262
263
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
263
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.316.0
264
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.317.0
264
265
  rdoc_options: []
265
266
  require_paths:
266
267
  - lib