dependabot-bundler 0.333.0 → 0.335.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 +4 -4
- data/helpers/v2/lib/functions/force_updater.rb +7 -2
- data/helpers/v2/lib/functions/version_resolver.rb +6 -2
- data/helpers/v2/spec/functions/conflicting_dependency_resolver_spec.rb +64 -52
- data/helpers/v2/spec/functions/dependency_source_spec.rb +14 -10
- data/helpers/v2/spec/functions/version_resolver_spec.rb +4 -2
- data/lib/dependabot/bundler/file_fetcher.rb +12 -6
- data/lib/dependabot/bundler/file_parser.rb +4 -2
- data/lib/dependabot/bundler/file_updater/gemspec_updater.rb +13 -6
- data/lib/dependabot/bundler/file_updater/git_pin_replacer.rb +27 -6
- data/lib/dependabot/bundler/file_updater/git_source_remover.rb +14 -2
- data/lib/dependabot/bundler/file_updater/lockfile_updater.rb +90 -26
- data/lib/dependabot/bundler/file_updater/requirement_replacer.rb +92 -17
- data/lib/dependabot/bundler/file_updater.rb +48 -19
- data/lib/dependabot/bundler/metadata_finder.rb +61 -30
- data/lib/dependabot/bundler/package/package_details_fetcher.rb +60 -2
- data/lib/dependabot/bundler/requirement.rb +3 -2
- data/lib/dependabot/bundler/update_checker/file_preparer.rb +81 -25
- data/lib/dependabot/bundler/update_checker/force_updater.rb +11 -5
- data/lib/dependabot/bundler/update_checker/latest_version_finder/dependency_source.rb +53 -15
- data/lib/dependabot/bundler/update_checker/latest_version_finder.rb +4 -2
- data/lib/dependabot/bundler/update_checker/requirements_updater.rb +92 -31
- data/lib/dependabot/bundler/update_checker/version_resolver.rb +14 -7
- data/lib/dependabot/bundler/update_checker.rb +14 -7
- metadata +12 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e7f69a64ba15ebbad9f9a6b231aafd823c1dfd209eaf6256bcadcec2cf2b4146
|
4
|
+
data.tar.gz: e99f4c6991029f7f44fc0a82c79298e7b57ca5e52e723abcf7e0a29f23635d2e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f016dcae6e50e038e723c4edd8181f0f69f8d784b6fb1811362a044dfe878d9addf22b5647869b6d3073275774d915ffb3963a6aea04979378b6119e4ebaf3fb
|
7
|
+
data.tar.gz: 20c66bb7c4d1293f0fb19f3f5ebec61de873f3a21066b6d4ee9935d0bb858151d381c91e2f5979bd727b226fd787de6f1f8fd71b1f9979dfc54a5d9aad124f04
|
@@ -5,8 +5,13 @@ module Functions
|
|
5
5
|
class ForceUpdater
|
6
6
|
class TopLevelDependencyDowngradedError < StandardError; end
|
7
7
|
|
8
|
-
def initialize(
|
9
|
-
|
8
|
+
def initialize(
|
9
|
+
dependency_name:,
|
10
|
+
target_version:,
|
11
|
+
gemfile_name:,
|
12
|
+
lockfile_name:,
|
13
|
+
update_multiple_dependencies:
|
14
|
+
)
|
10
15
|
@dependency_name = dependency_name
|
11
16
|
@target_version = target_version
|
12
17
|
@gemfile_name = gemfile_name
|
@@ -10,8 +10,12 @@ module Functions
|
|
10
10
|
attr_reader :gemfile_name
|
11
11
|
attr_reader :lockfile_name
|
12
12
|
|
13
|
-
def initialize(
|
14
|
-
|
13
|
+
def initialize(
|
14
|
+
dependency_name:,
|
15
|
+
dependency_requirements:,
|
16
|
+
gemfile_name:,
|
17
|
+
lockfile_name:
|
18
|
+
)
|
15
19
|
@dependency_name = dependency_name
|
16
20
|
@dependency_requirements = dependency_requirements
|
17
21
|
@gemfile_name = gemfile_name
|
@@ -42,42 +42,50 @@ RSpec.describe Functions::ConflictingDependencyResolver do
|
|
42
42
|
let(:target_version) { "6.0.0" }
|
43
43
|
|
44
44
|
it "returns a list of dependencies that block the update" do
|
45
|
-
expect(conflicting_dependencies).to contain_exactly(
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
45
|
+
expect(conflicting_dependencies).to contain_exactly(
|
46
|
+
{
|
47
|
+
"explanation" => "rails (5.2.0) requires activesupport (= 5.2.0)",
|
48
|
+
"name" => "rails",
|
49
|
+
"requirement" => "= 5.2.0",
|
50
|
+
"version" => "5.2.0"
|
51
|
+
},
|
52
|
+
{
|
53
|
+
"explanation" => "rails (5.2.0) requires activesupport (= 5.2.0) via actionpack (5.2.0)",
|
54
|
+
"name" => "actionpack",
|
55
|
+
"version" => "5.2.0",
|
56
|
+
"requirement" => "= 5.2.0"
|
57
|
+
},
|
58
|
+
{
|
59
|
+
"explanation" => "rails (5.2.0) requires activesupport (= 5.2.0) via actionview (5.2.0)",
|
60
|
+
"name" => "actionview",
|
61
|
+
"version" => "5.2.0",
|
62
|
+
"requirement" => "= 5.2.0"
|
63
|
+
},
|
64
|
+
{
|
65
|
+
"explanation" => "rails (5.2.0) requires activesupport (= 5.2.0) via activejob (5.2.0)",
|
66
|
+
"name" => "activejob",
|
67
|
+
"version" => "5.2.0",
|
68
|
+
"requirement" => "= 5.2.0"
|
69
|
+
},
|
70
|
+
{
|
71
|
+
"explanation" => "rails (5.2.0) requires activesupport (= 5.2.0) via activemodel (5.2.0)",
|
72
|
+
"name" => "activemodel",
|
73
|
+
"version" => "5.2.0",
|
74
|
+
"requirement" => "= 5.2.0"
|
75
|
+
},
|
76
|
+
{
|
77
|
+
"explanation" => "rails (5.2.0) requires activesupport (= 5.2.0) via activerecord (5.2.0)",
|
78
|
+
"name" => "activerecord",
|
79
|
+
"version" => "5.2.0",
|
80
|
+
"requirement" => "= 5.2.0"
|
81
|
+
},
|
82
|
+
{
|
83
|
+
"explanation" => "rails (5.2.0) requires activesupport (= 5.2.0) via railties (5.2.0)",
|
84
|
+
"name" => "railties",
|
85
|
+
"version" => "5.2.0",
|
86
|
+
"requirement" => "= 5.2.0"
|
87
|
+
}
|
88
|
+
)
|
81
89
|
end
|
82
90
|
end
|
83
91
|
|
@@ -88,22 +96,26 @@ RSpec.describe Functions::ConflictingDependencyResolver do
|
|
88
96
|
let(:project_name) { "multiple_blocking" }
|
89
97
|
|
90
98
|
it "returns all of the blocking dependencies" do
|
91
|
-
expect(conflicting_dependencies).to contain_exactly(
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
99
|
+
expect(conflicting_dependencies).to contain_exactly(
|
100
|
+
{
|
101
|
+
"explanation" => "actionmailer (5.0.0) requires activesupport (= 5.0.0) via actionpack (5.0.0)",
|
102
|
+
"name" => "actionpack",
|
103
|
+
"version" => "5.0.0",
|
104
|
+
"requirement" => "= 5.0.0"
|
105
|
+
},
|
106
|
+
{
|
107
|
+
"explanation" => "actionview (5.0.0) requires activesupport (= 5.0.0)",
|
108
|
+
"name" => "actionview",
|
109
|
+
"version" => "5.0.0",
|
110
|
+
"requirement" => "= 5.0.0"
|
111
|
+
},
|
112
|
+
{
|
113
|
+
"explanation" => "actionmailer (5.0.0) requires activesupport (= 5.0.0) via activejob (5.0.0)",
|
114
|
+
"name" => "activejob",
|
115
|
+
"version" => "5.0.0",
|
116
|
+
"requirement" => "= 5.0.0"
|
117
|
+
}
|
118
|
+
)
|
107
119
|
end
|
108
120
|
end
|
109
121
|
|
@@ -40,22 +40,26 @@ RSpec.describe Functions::DependencySource do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
it "returns all versions from the private source" do
|
43
|
-
expect(private_registry_versions).to eq(
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
43
|
+
expect(private_registry_versions).to eq(
|
44
|
+
[
|
45
|
+
Gem::Version.new("1.5.0"),
|
46
|
+
Gem::Version.new("1.9.0"),
|
47
|
+
Gem::Version.new("1.10.0.beta")
|
48
|
+
]
|
49
|
+
)
|
48
50
|
end
|
49
51
|
|
50
52
|
context "when specified as the default source" do
|
51
53
|
let(:project_name) { "specified_default_source_no_lockfile" }
|
52
54
|
|
53
55
|
it "returns all versions from the private source" do
|
54
|
-
expect(private_registry_versions).to eq(
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
56
|
+
expect(private_registry_versions).to eq(
|
57
|
+
[
|
58
|
+
Gem::Version.new("1.5.0"),
|
59
|
+
Gem::Version.new("1.9.0"),
|
60
|
+
Gem::Version.new("1.10.0.beta")
|
61
|
+
]
|
62
|
+
)
|
59
63
|
end
|
60
64
|
end
|
61
65
|
|
@@ -96,8 +96,10 @@ RSpec.describe Functions::VersionResolver do
|
|
96
96
|
stub_request(:get, old_index_url + "?gems=business,statesman")
|
97
97
|
.to_return(
|
98
98
|
status: 200,
|
99
|
-
body: fixture(
|
100
|
-
|
99
|
+
body: fixture(
|
100
|
+
"rubygems_responses",
|
101
|
+
"dependencies-default-gemfile"
|
102
|
+
)
|
101
103
|
)
|
102
104
|
end
|
103
105
|
|
@@ -75,16 +75,20 @@ module Dependabot
|
|
75
75
|
def gemfile
|
76
76
|
return @gemfile if defined?(@gemfile)
|
77
77
|
|
78
|
-
@gemfile = T.let(
|
79
|
-
|
78
|
+
@gemfile = T.let(
|
79
|
+
fetch_file_if_present("gems.rb") || fetch_file_if_present("Gemfile"),
|
80
|
+
T.nilable(Dependabot::DependencyFile)
|
81
|
+
)
|
80
82
|
end
|
81
83
|
|
82
84
|
sig { returns(T.nilable(DependencyFile)) }
|
83
85
|
def lockfile
|
84
86
|
return @lockfile if defined?(@lockfile)
|
85
87
|
|
86
|
-
@lockfile = T.let(
|
87
|
-
|
88
|
+
@lockfile = T.let(
|
89
|
+
fetch_file_if_present("gems.locked") || fetch_file_if_present("Gemfile.lock"),
|
90
|
+
T.nilable(Dependabot::DependencyFile)
|
91
|
+
)
|
88
92
|
end
|
89
93
|
|
90
94
|
sig { returns(T::Array[Dependabot::DependencyFile]) }
|
@@ -239,8 +243,10 @@ module Dependabot
|
|
239
243
|
end
|
240
244
|
|
241
245
|
sig do
|
242
|
-
params(
|
243
|
-
|
246
|
+
params(
|
247
|
+
file: DependencyFile,
|
248
|
+
previously_fetched_files: T::Array[DependencyFile]
|
249
|
+
).returns(T::Array[DependencyFile])
|
244
250
|
end
|
245
251
|
def fetch_child_gemfiles(file:, previously_fetched_files:)
|
246
252
|
paths = ChildGemfileFinder.new(gemfile: file).child_gemfile_paths
|
@@ -209,8 +209,10 @@ module Dependabot
|
|
209
209
|
sig { returns(T::Array[T::Hash[String, T.untyped]]) }
|
210
210
|
def parsed_gemfile
|
211
211
|
@parsed_gemfile ||= T.let(
|
212
|
-
SharedHelpers.in_a_temporary_repo_directory(
|
213
|
-
|
212
|
+
SharedHelpers.in_a_temporary_repo_directory(
|
213
|
+
T.must(base_directory),
|
214
|
+
repo_contents_path
|
215
|
+
) do
|
214
216
|
write_temporary_dependency_files
|
215
217
|
|
216
218
|
NativeHelpers.run_bundler_subprocess(
|
@@ -39,20 +39,27 @@ module Dependabot
|
|
39
39
|
attr_reader :gemspec
|
40
40
|
|
41
41
|
sig do
|
42
|
-
params(
|
43
|
-
|
42
|
+
params(
|
43
|
+
gemspec: Dependabot::DependencyFile,
|
44
|
+
dependency: Dependabot::Dependency,
|
45
|
+
content: String
|
46
|
+
).returns(String)
|
44
47
|
end
|
45
48
|
def replace_gemspec_version_requirement(gemspec, dependency, content)
|
46
49
|
return content unless requirement_changed?(gemspec, dependency)
|
47
50
|
|
48
51
|
updated_requirement =
|
49
|
-
T.must(
|
50
|
-
|
52
|
+
T.must(
|
53
|
+
dependency.requirements
|
54
|
+
.find { |r| r[:file] == gemspec.name }
|
55
|
+
)
|
51
56
|
.fetch(:requirement)
|
52
57
|
|
53
58
|
previous_requirement =
|
54
|
-
T.must(
|
55
|
-
|
59
|
+
T.must(
|
60
|
+
T.must(dependency.previous_requirements)
|
61
|
+
.find { |r| r[:file] == gemspec.name }
|
62
|
+
)
|
56
63
|
.fetch(:requirement)
|
57
64
|
|
58
65
|
RequirementReplacer.new(
|
@@ -1,6 +1,7 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
require "sorbet-runtime"
|
4
5
|
require "parser/current"
|
5
6
|
require "dependabot/bundler/file_updater"
|
6
7
|
|
@@ -8,14 +9,21 @@ module Dependabot
|
|
8
9
|
module Bundler
|
9
10
|
class FileUpdater
|
10
11
|
class GitPinReplacer
|
12
|
+
extend T::Sig
|
13
|
+
|
14
|
+
sig { returns(Dependabot::Dependency) }
|
11
15
|
attr_reader :dependency
|
16
|
+
|
17
|
+
sig { returns(String) }
|
12
18
|
attr_reader :new_pin
|
13
19
|
|
20
|
+
sig { params(dependency: Dependabot::Dependency, new_pin: String).void }
|
14
21
|
def initialize(dependency:, new_pin:)
|
15
|
-
@dependency = dependency
|
16
|
-
@new_pin = new_pin
|
22
|
+
@dependency = T.let(dependency, Dependabot::Dependency)
|
23
|
+
@new_pin = T.let(new_pin, String)
|
17
24
|
end
|
18
25
|
|
26
|
+
sig { params(content: String).returns(String) }
|
19
27
|
def rewrite(content)
|
20
28
|
buffer = Parser::Source::Buffer.new("(gemfile_content)")
|
21
29
|
buffer.source = content
|
@@ -27,15 +35,24 @@ module Dependabot
|
|
27
35
|
end
|
28
36
|
|
29
37
|
class Rewriter < Parser::TreeRewriter
|
30
|
-
|
38
|
+
extend T::Sig
|
39
|
+
|
40
|
+
PIN_KEYS = T.let(%i(ref tag).freeze, T::Array[Symbol])
|
41
|
+
|
42
|
+
sig { returns(Dependabot::Dependency) }
|
31
43
|
attr_reader :dependency
|
44
|
+
|
45
|
+
sig { returns(String) }
|
32
46
|
attr_reader :new_pin
|
33
47
|
|
48
|
+
sig { params(dependency: Dependabot::Dependency, new_pin: String).void }
|
34
49
|
def initialize(dependency:, new_pin:)
|
35
|
-
|
36
|
-
@
|
50
|
+
super()
|
51
|
+
@dependency = T.let(dependency, Dependabot::Dependency)
|
52
|
+
@new_pin = T.let(new_pin, String)
|
37
53
|
end
|
38
54
|
|
55
|
+
sig { params(node: Parser::AST::Node).returns(T.untyped) }
|
39
56
|
def on_send(node)
|
40
57
|
return unless declares_targeted_gem?(node)
|
41
58
|
return unless node.children.last.type == :hash
|
@@ -50,16 +67,19 @@ module Dependabot
|
|
50
67
|
|
51
68
|
private
|
52
69
|
|
70
|
+
sig { params(node: Parser::AST::Node).returns(T::Boolean) }
|
53
71
|
def declares_targeted_gem?(node)
|
54
72
|
return false unless node.children[1] == :gem
|
55
73
|
|
56
74
|
node.children[2].children.first == dependency.name
|
57
75
|
end
|
58
76
|
|
77
|
+
sig { params(node: Parser::AST::Node).returns(Symbol) }
|
59
78
|
def key_from_hash_pair(node)
|
60
79
|
node.children.first.children.first.to_sym
|
61
80
|
end
|
62
81
|
|
82
|
+
sig { params(hash_pair: Parser::AST::Node).void }
|
63
83
|
def update_value(hash_pair)
|
64
84
|
value_node = hash_pair.children.last
|
65
85
|
open_quote_character, close_quote_character =
|
@@ -71,6 +91,7 @@ module Dependabot
|
|
71
91
|
)
|
72
92
|
end
|
73
93
|
|
94
|
+
sig { params(value_node: Parser::AST::Node).returns([String, String]) }
|
74
95
|
def extract_quote_characters_from(value_node)
|
75
96
|
[value_node.loc.begin.source, value_node.loc.end.source]
|
76
97
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require "parser/current"
|
@@ -12,12 +12,15 @@ module Dependabot
|
|
12
12
|
class GitSourceRemover
|
13
13
|
extend T::Sig
|
14
14
|
|
15
|
+
sig { returns(Dependabot::Dependency) }
|
15
16
|
attr_reader :dependency
|
16
17
|
|
18
|
+
sig { params(dependency: Dependabot::Dependency).void }
|
17
19
|
def initialize(dependency:)
|
18
20
|
@dependency = dependency
|
19
21
|
end
|
20
22
|
|
23
|
+
sig { params(content: String).returns(String) }
|
21
24
|
def rewrite(content)
|
22
25
|
buffer = Parser::Source::Buffer.new("(gemfile_content)")
|
23
26
|
buffer.source = content
|
@@ -27,18 +30,23 @@ module Dependabot
|
|
27
30
|
end
|
28
31
|
|
29
32
|
class Rewriter < Parser::TreeRewriter
|
33
|
+
extend T::Sig
|
34
|
+
|
30
35
|
# TODO: Hack until Bundler 1.16.0 is available on Heroku
|
31
36
|
GOOD_KEYS = %i(
|
32
37
|
group groups path glob name require platform platforms type
|
33
38
|
source install_if
|
34
39
|
).freeze
|
35
40
|
|
41
|
+
sig { returns(Dependabot::Dependency) }
|
36
42
|
attr_reader :dependency
|
37
43
|
|
44
|
+
sig { params(dependency: Dependabot::Dependency).void }
|
38
45
|
def initialize(dependency:)
|
39
|
-
@dependency = dependency
|
46
|
+
@dependency = T.let(dependency, Dependabot::Dependency)
|
40
47
|
end
|
41
48
|
|
49
|
+
sig { params(node: Parser::AST::Node).void }
|
42
50
|
def on_send(node)
|
43
51
|
return unless declares_targeted_gem?(node)
|
44
52
|
return unless node.children.last.type == :hash
|
@@ -57,16 +65,19 @@ module Dependabot
|
|
57
65
|
|
58
66
|
private
|
59
67
|
|
68
|
+
sig { params(node: Parser::AST::Node).returns(T::Boolean) }
|
60
69
|
def declares_targeted_gem?(node)
|
61
70
|
return false unless node.children[1] == :gem
|
62
71
|
|
63
72
|
node.children[2].children.first == dependency.name
|
64
73
|
end
|
65
74
|
|
75
|
+
sig { params(node: Parser::AST::Node).returns(Symbol) }
|
66
76
|
def key_from_hash_pair(node)
|
67
77
|
node.children.first.children.first.to_sym
|
68
78
|
end
|
69
79
|
|
80
|
+
sig { params(node: Parser::AST::Node).void }
|
70
81
|
def remove_all_kwargs(node)
|
71
82
|
kwargs_node = node.children.last
|
72
83
|
|
@@ -76,6 +87,7 @@ module Dependabot
|
|
76
87
|
remove(range_to_remove)
|
77
88
|
end
|
78
89
|
|
90
|
+
sig { params(kwargs_node: Parser::AST::Node).void }
|
79
91
|
def remove_git_related_kwargs(kwargs_node)
|
80
92
|
good_key_index = T.let(nil, T.nilable(Integer))
|
81
93
|
hash_pairs = kwargs_node.children
|