dependabot-elm 0.143.6 → 0.144.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: dc622fc8ae62d6435a3c49c9928c3a95836d80d16e823a2df2b4a48338c4001f
4
- data.tar.gz: e16001806adbfbcf64c2680b4796f58a4b33bed8795e5b6126590e3075ea3943
3
+ metadata.gz: 12e98ada04d79099d4a388649447a44501a2c3d29f57f7d77dec34e482aae5fa
4
+ data.tar.gz: 0e8546c21d7062bcb7daf0a603513c3a7480e5270f76dd48abc743224406a9f6
5
5
  SHA512:
6
- metadata.gz: 38640d64e652ee39e9b6f3984b6fa3b50f9ad49ed20656c98d62011ef67eb128fbab7e1d6c94d483b9565a6ea0c5edf927ac4a2c54147a2dd8d0057c445cdb4b
7
- data.tar.gz: 6989984382ddafef700a7f2b80297fcdcc6741d7912c03136c24855ec25faca3a00e647257d5241f70fc3d518ea7f3d1fcabd334af20882887cdf49d9de97242
6
+ metadata.gz: 8edfb34fd1cac0cfb215909fa70f6b69cd122a7df8d55029465d6366401164eb53bf894fdc742274e5e82f1ae076a08fb1f5e17c5dd40cc87d5bfc2f9dc1cc4a
7
+ data.tar.gz: 1259af17f6eab0ec3bc80c5b2cb4ce3cc4d945f269ebb24fee40e5a22d57ded1ca3dc9458e9cacf8ff9ca143f5919bdab2ac4481d790253d01e62cf88732126b
@@ -7,8 +7,6 @@ module Dependabot
7
7
  module Elm
8
8
  class FileFetcher < Dependabot::FileFetchers::Base
9
9
  def self.required_files_in?(filenames)
10
- return true if filenames.include?("elm-package.json")
11
-
12
10
  filenames.include?("elm.json")
13
11
  end
14
12
 
@@ -21,7 +19,6 @@ module Dependabot
21
19
  def fetch_files
22
20
  fetched_files = []
23
21
 
24
- fetched_files << elm_package if elm_package
25
22
  fetched_files << elm_json if elm_json
26
23
 
27
24
  # NOTE: We *do not* fetch the exact-dependencies.json file, as it is
@@ -32,17 +29,13 @@ module Dependabot
32
29
  end
33
30
 
34
31
  def check_required_files_present
35
- return if elm_package || elm_json
32
+ return if elm_json
36
33
 
37
34
  path = Pathname.new(File.join(directory, "elm.json")).
38
35
  cleanpath.to_path
39
36
  raise Dependabot::DependencyFileNotFound, path
40
37
  end
41
38
 
42
- def elm_package
43
- @elm_package ||= fetch_file_if_present("elm-package.json")
44
- end
45
-
46
39
  def elm_json
47
40
  @elm_json ||= fetch_file_if_present("elm.json")
48
41
  end
@@ -16,7 +16,6 @@ module Dependabot
16
16
  def parse
17
17
  dependency_set = DependencySet.new
18
18
 
19
- dependency_set += elm_package_dependencies if elm_package
20
19
  dependency_set += elm_json_dependencies if elm_json
21
20
 
22
21
  dependency_set.dependencies.sort_by(&:name)
@@ -24,27 +23,6 @@ module Dependabot
24
23
 
25
24
  private
26
25
 
27
- def elm_package_dependencies
28
- dependency_set = DependencySet.new
29
-
30
- parsed_package_file.fetch("dependencies").each do |name, req|
31
- dependency_set <<
32
- Dependency.new(
33
- name: name,
34
- version: version_for(req)&.to_s,
35
- requirements: [{
36
- requirement: req, # 4.0 <= v <= 4.0
37
- groups: [], # we don't have this (its dev vs non-dev)
38
- source: nil, # elm-package only has elm-package sources
39
- file: "elm-package.json"
40
- }],
41
- package_manager: "elm"
42
- )
43
- end
44
-
45
- dependency_set
46
- end
47
-
48
26
  # For docs on elm.json, see:
49
27
  # https://github.com/elm/compiler/blob/master/docs/elm.json/application.md
50
28
  # https://github.com/elm/compiler/blob/master/docs/elm.json/package.md
@@ -98,9 +76,9 @@ module Dependabot
98
76
  end
99
77
 
100
78
  def check_required_files
101
- return if elm_json || elm_package
79
+ return if elm_json
102
80
 
103
- raise "No elm.json or elm-package.json!"
81
+ raise "No elm.json"
104
82
  end
105
83
 
106
84
  def version_for(version_requirement)
@@ -111,22 +89,12 @@ module Dependabot
111
89
  req.requirements.first.last
112
90
  end
113
91
 
114
- def parsed_package_file
115
- @parsed_package_file ||= JSON.parse(elm_package.content)
116
- rescue JSON::ParserError
117
- raise Dependabot::DependencyFileNotParseable, elm_package.path
118
- end
119
-
120
92
  def parsed_elm_json
121
93
  @parsed_elm_json ||= JSON.parse(elm_json.content)
122
94
  rescue JSON::ParserError
123
95
  raise Dependabot::DependencyFileNotParseable, elm_json.path
124
96
  end
125
97
 
126
- def elm_package
127
- @elm_package ||= get_original_file("elm-package.json")
128
- end
129
-
130
98
  def elm_json
131
99
  @elm_json ||= get_original_file("elm.json")
132
100
  end
@@ -6,12 +6,10 @@ require "dependabot/file_updaters/base"
6
6
  module Dependabot
7
7
  module Elm
8
8
  class FileUpdater < Dependabot::FileUpdaters::Base
9
- require_relative "file_updater/elm_package_updater"
10
9
  require_relative "file_updater/elm_json_updater"
11
10
 
12
11
  def self.updated_files_regex
13
12
  [
14
- /^elm-package\.json$/,
15
13
  /^elm\.json$/
16
14
  ]
17
15
  end
@@ -19,16 +17,6 @@ module Dependabot
19
17
  def updated_dependency_files
20
18
  updated_files = []
21
19
 
22
- elm_package_files.each do |file|
23
- next unless file_changed?(file)
24
-
25
- updated_files <<
26
- updated_file(
27
- file: file,
28
- content: updated_elm_package_content(file)
29
- )
30
- end
31
-
32
20
  elm_json_files.each do |file|
33
21
  next unless file_changed?(file)
34
22
 
@@ -47,16 +35,9 @@ module Dependabot
47
35
  private
48
36
 
49
37
  def check_required_files
50
- return if elm_json_files.any? || elm_package_files.any?
51
-
52
- raise "No elm.json or elm-package.json!"
53
- end
38
+ return if elm_json_files.any?
54
39
 
55
- def updated_elm_package_content(file)
56
- ElmPackageUpdater.new(
57
- dependencies: dependencies,
58
- elm_package_file: file
59
- ).updated_elm_package_file_content
40
+ raise "No elm.json"
60
41
  end
61
42
 
62
43
  def updated_elm_json_content(file)
@@ -66,10 +47,6 @@ module Dependabot
66
47
  ).updated_content
67
48
  end
68
49
 
69
- def elm_package_files
70
- dependency_files.select { |f| f.name.end_with?("elm-package.json") }
71
- end
72
-
73
50
  def elm_json_files
74
51
  dependency_files.select { |f| f.name.end_with?("elm.json") }
75
52
  end
@@ -10,7 +10,6 @@ module Dependabot
10
10
  module Elm
11
11
  class UpdateChecker < Dependabot::UpdateCheckers::Base
12
12
  require_relative "update_checker/requirements_updater"
13
- require_relative "update_checker/elm_18_version_resolver"
14
13
  require_relative "update_checker/elm_19_version_resolver"
15
14
 
16
15
  def latest_version
@@ -55,17 +54,15 @@ module Dependabot
55
54
 
56
55
  def version_resolver
57
56
  @version_resolver ||=
58
- if dependency.requirements.any? { |r| r.fetch(:file) == "elm.json" }
57
+ begin
58
+ unless dependency.requirements.any? { |r| r.fetch(:file) == "elm.json" }
59
+ raise Dependabot::DependencyFileNotResolvable, "No elm.json found"
60
+ end
61
+
59
62
  Elm19VersionResolver.new(
60
63
  dependency: dependency,
61
64
  dependency_files: dependency_files
62
65
  )
63
- else
64
- Elm18VersionResolver.new(
65
- dependency: dependency,
66
- dependency_files: dependency_files,
67
- candidate_versions: candidate_versions
68
- )
69
66
  end
70
67
  end
71
68
 
@@ -29,7 +29,7 @@ module Dependabot
29
29
  return current_version if unlock_requirement == :none
30
30
 
31
31
  # Otherwise, we gotta check a few conditions to see if bumping
32
- # wouldn't also bump other deps in elm-package.json
32
+ # wouldn't also bump other deps in elm.json
33
33
  fetch_latest_resolvable_version(unlock_requirement)
34
34
  end
35
35
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-elm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.143.6
4
+ version: 0.144.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-30 00:00:00.000000000 Z
11
+ date: 2021-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dependabot-common
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.143.6
19
+ version: 0.144.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.143.6
26
+ version: 0.144.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: byebug
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -190,12 +190,10 @@ files:
190
190
  - lib/dependabot/elm/file_parser.rb
191
191
  - lib/dependabot/elm/file_updater.rb
192
192
  - lib/dependabot/elm/file_updater/elm_json_updater.rb
193
- - lib/dependabot/elm/file_updater/elm_package_updater.rb
194
193
  - lib/dependabot/elm/metadata_finder.rb
195
194
  - lib/dependabot/elm/requirement.rb
196
195
  - lib/dependabot/elm/update_checker.rb
197
196
  - lib/dependabot/elm/update_checker/cli_parser.rb
198
- - lib/dependabot/elm/update_checker/elm_18_version_resolver.rb
199
197
  - lib/dependabot/elm/update_checker/elm_19_version_resolver.rb
200
198
  - lib/dependabot/elm/update_checker/requirements_updater.rb
201
199
  - lib/dependabot/elm/version.rb
@@ -1,67 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "dependabot/elm/file_updater"
4
-
5
- module Dependabot
6
- module Elm
7
- class FileUpdater
8
- class ElmPackageUpdater
9
- def initialize(elm_package_file:, dependencies:)
10
- @elm_package_file = elm_package_file
11
- @dependencies = dependencies
12
- end
13
-
14
- def updated_elm_package_file_content
15
- dependencies.
16
- select { |dep| requirement_changed?(elm_package_file, dep) }.
17
- reduce(elm_package_file.content.dup) do |content, dep|
18
- updated_content = content
19
-
20
- updated_content = update_requirement(
21
- content: updated_content,
22
- filename: elm_package_file.name,
23
- dependency: dep
24
- )
25
-
26
- next updated_content unless content == updated_content
27
-
28
- raise "Expected content to change!"
29
- end
30
- end
31
-
32
- private
33
-
34
- attr_reader :elm_package_file, :dependencies
35
-
36
- def requirement_changed?(file, dependency)
37
- changed_requirements =
38
- dependency.requirements - dependency.previous_requirements
39
-
40
- changed_requirements.any? { |f| f[:file] == file.name }
41
- end
42
-
43
- def update_requirement(content:, filename:, dependency:)
44
- updated_req =
45
- dependency.requirements.
46
- find { |r| r.fetch(:file) == filename }.
47
- fetch(:requirement)
48
-
49
- old_req =
50
- dependency.previous_requirements.
51
- find { |r| r.fetch(:file) == filename }.
52
- fetch(:requirement)
53
-
54
- return content unless old_req
55
-
56
- dep = dependency
57
- regex =
58
- /"#{Regexp.quote(dep.name)}"\s*:\s+"#{Regexp.quote(old_req)}"/
59
-
60
- content.gsub(regex) do |declaration|
61
- declaration.gsub(%("#{old_req}"), %("#{updated_req}"))
62
- end
63
- end
64
- end
65
- end
66
- end
67
- end
@@ -1,238 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "open3"
4
- require "dependabot/shared_helpers"
5
- require "dependabot/errors"
6
- require "dependabot/elm/file_parser"
7
- require "dependabot/elm/update_checker"
8
- require "dependabot/elm/update_checker/cli_parser"
9
- require "dependabot/elm/update_checker/requirements_updater"
10
- require "dependabot/elm/requirement"
11
-
12
- module Dependabot
13
- module Elm
14
- class UpdateChecker
15
- class Elm18VersionResolver
16
- class UnrecoverableState < StandardError; end
17
-
18
- def initialize(dependency:, dependency_files:, candidate_versions:)
19
- @dependency = dependency
20
- @dependency_files = dependency_files
21
- @candidate_versions = candidate_versions
22
- end
23
-
24
- def latest_resolvable_version(unlock_requirement:)
25
- raise "Invalid unlock setting: #{unlock_requirement}" unless %i(none own all).include?(unlock_requirement)
26
-
27
- # Elm has no lockfile, so we will never create an update PR if
28
- # unlock requirements are `none`. Just return the current version.
29
- return current_version if unlock_requirement == :none
30
-
31
- # Otherwise, we gotta check a few conditions to see if bumping
32
- # wouldn't also bump other deps in elm-package.json
33
- candidate_versions.sort.reverse_each do |version|
34
- return version if can_update?(version, unlock_requirement)
35
- end
36
-
37
- # Fall back to returning the dependency's current version, which is
38
- # presumed to be resolvable
39
- current_version
40
- end
41
-
42
- def updated_dependencies_after_full_unlock
43
- version = latest_resolvable_version(unlock_requirement: :all)
44
- deps_after_install = fetch_install_metadata(target_version: version)
45
-
46
- original_dependency_details.map do |original_dep|
47
- new_version = deps_after_install.fetch(original_dep.name)
48
-
49
- old_reqs = original_dep.requirements.map do |req|
50
- requirement_class.new(req[:requirement])
51
- end
52
-
53
- next if old_reqs.all? { |req| req.satisfied_by?(new_version) }
54
-
55
- new_requirements =
56
- RequirementsUpdater.new(
57
- requirements: original_dep.requirements,
58
- latest_resolvable_version: new_version.to_s
59
- ).updated_requirements
60
-
61
- Dependency.new(
62
- name: original_dep.name,
63
- version: new_version.to_s,
64
- requirements: new_requirements,
65
- previous_version: original_dep.version,
66
- previous_requirements: original_dep.requirements,
67
- package_manager: original_dep.package_manager
68
- )
69
- end.compact
70
- end
71
-
72
- private
73
-
74
- attr_reader :dependency, :dependency_files, :candidate_versions
75
-
76
- def can_update?(version, unlock_requirement)
77
- deps_after_install = fetch_install_metadata(target_version: version)
78
-
79
- result = check_install_result(deps_after_install, version)
80
-
81
- # If the install was clean then we can definitely update
82
- return true if result == :clean_bump
83
-
84
- # Otherwise, we can still update if the result was a forced full
85
- # unlock and we're allowed to unlock other requirements
86
- return false unless unlock_requirement == :all
87
-
88
- result == :forced_full_unlock_bump
89
- end
90
-
91
- def check_install_result(deps_after_install, target_version)
92
- # This can go one of 5 ways:
93
- # 1) We bump our dep and no other dep is bumped
94
- # 2) We bump our dep and another dep is bumped too
95
- # Scenario: NoRedInk/datetimepicker bump to 3.0.2 also
96
- # bumps elm-css to 14
97
- # 3) We bump our dep but actually elm-package doesn't bump it
98
- # Scenario: elm-css bump to 14 but datetimepicker is at 3.0.1
99
- # 4) We bump our dep but elm-package just says
100
- # "Packages configured successfully!"
101
- # Narrator: they weren't
102
- # Scenario: impossible dependency (i.e. elm-css 999.999.999)
103
- # a <= v < b where a is greater than latest version
104
- # 5) We bump our dep but elm-package blows up (not handled here)
105
- # Scenario: rtfeldman/elm-css 14 && rtfeldman/hashed-class 1.0.0
106
- # I'm not sure what's different from this scenario
107
- # to 3), why it blows up instead of just rolling
108
- # elm-css back to version 9 which is what
109
- # hashed-class requires
110
-
111
- # 4) We bump our dep but elm-package just says
112
- # "Packages configured successfully!"
113
- return :empty_elm_stuff_bug if deps_after_install.empty?
114
-
115
- version_after_install = deps_after_install.fetch(dependency.name)
116
-
117
- # 3) We bump our dep but actually elm-package doesn't bump it
118
- return :downgrade_bug if version_after_install < target_version
119
-
120
- other_top_level_deps_bumped =
121
- original_dependency_details.
122
- reject { |dep| dep.name == dependency.name }.
123
- select do |dep|
124
- reqs = dep.requirements.map { |r| r.fetch(:requirement) }
125
- reqs = reqs.map { |r| requirement_class.new(r) }
126
- reqs.any? { |r| !r.satisfied_by?(deps_after_install[dep.name]) }
127
- end
128
-
129
- # 2) We bump our dep and another dep is bumped
130
- return :forced_full_unlock_bump if other_top_level_deps_bumped.any?
131
-
132
- # 1) We bump our dep and no other dep is bumped
133
- :clean_bump
134
- end
135
-
136
- def fetch_install_metadata(target_version:)
137
- @install_cache ||= {}
138
- @install_cache[target_version.to_s] ||=
139
- SharedHelpers.in_a_temporary_directory do
140
- write_temporary_dependency_files(target_version: target_version)
141
-
142
- # Elm package install outputs a preview of the actions to be
143
- # performed. We can use this preview to calculate whether it
144
- # would do anything funny
145
- command = "yes n | elm-package install"
146
- response = run_shell_command(command)
147
-
148
- deps_after_install = CliParser.decode_install_preview(response)
149
-
150
- deps_after_install
151
- rescue SharedHelpers::HelperSubprocessFailed => e
152
- # 5) We bump our dep but elm-package blows up
153
- handle_elm_package_errors(e)
154
- end
155
- end
156
-
157
- def run_shell_command(command)
158
- start = Time.now
159
- stdout, process = Open3.capture2e(command)
160
- time_taken = Time.now - start
161
-
162
- # Raise an error with the output from the shell session if Elm
163
- # returns a non-zero status
164
- return stdout if process.success?
165
-
166
- raise SharedHelpers::HelperSubprocessFailed.new(
167
- message: stdout,
168
- error_context: {
169
- command: command,
170
- time_taken: time_taken,
171
- process_exit_value: process.to_s
172
- }
173
- )
174
- end
175
-
176
- def handle_elm_package_errors(error)
177
- if error.message.include?("I cannot find a set of packages that " \
178
- "works with your constraints")
179
- raise Dependabot::DependencyFileNotResolvable, error.message
180
- end
181
-
182
- if error.message.include?("You are using Elm 0.18.0, but")
183
- raise Dependabot::DependencyFileNotResolvable, error.message
184
- end
185
-
186
- # I don't know any other errors
187
- raise error
188
- end
189
-
190
- def write_temporary_dependency_files(target_version:)
191
- dependency_files.each do |file|
192
- path = file.name
193
- FileUtils.mkdir_p(Pathname.new(path).dirname)
194
-
195
- File.write(
196
- path,
197
- updated_elm_package_content(file.content, target_version)
198
- )
199
- end
200
- end
201
-
202
- def updated_elm_package_content(content, version)
203
- json = JSON.parse(content)
204
-
205
- new_requirement = RequirementsUpdater.new(
206
- requirements: dependency.requirements,
207
- latest_resolvable_version: version.to_s
208
- ).updated_requirements.first[:requirement]
209
-
210
- json["dependencies"][dependency.name] = new_requirement
211
- JSON.dump(json)
212
- end
213
-
214
- def original_dependency_details
215
- @original_dependency_details ||=
216
- Elm::FileParser.new(
217
- dependency_files: dependency_files,
218
- source: nil
219
- ).parse
220
- end
221
-
222
- def current_version
223
- return unless dependency.version
224
-
225
- version_class.new(dependency.version)
226
- end
227
-
228
- def version_class
229
- Elm::Version
230
- end
231
-
232
- def requirement_class
233
- Elm::Requirement
234
- end
235
- end
236
- end
237
- end
238
- end