dependabot-elm 0.143.6 → 0.144.0

Sign up to get free protection for your applications and to get access to all the features.
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