dependabot-python 0.391.0 → 0.393.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/requirements.txt +1 -1
- data/lib/dependabot/python/file_parser/setup_file_parser.rb +26 -8
- data/lib/dependabot/python/file_updater/pip_compile_file_updater.rb +11 -11
- data/lib/dependabot/python/file_updater/pipfile_file_updater.rb +13 -4
- data/lib/dependabot/python/file_updater/pipfile_manifest_updater.rb +7 -7
- data/lib/dependabot/python/file_updater/poetry_file_updater/pep621_updater.rb +14 -10
- data/lib/dependabot/python/file_updater/poetry_file_updater.rb +35 -24
- data/lib/dependabot/python/file_updater/requirement_file_updater.rb +15 -11
- data/lib/dependabot/python/file_updater/setup_file_sanitizer.rb +9 -10
- data/lib/dependabot/python/file_updater.rb +1 -1
- data/lib/dependabot/python/pipenv_runner.rb +1 -1
- data/lib/dependabot/python/update_checker/pip_compile_version_resolver.rb +4 -4
- data/lib/dependabot/python/update_checker/pip_version_resolver.rb +3 -1
- data/lib/dependabot/python/update_checker/poetry_version_resolver.rb +1 -1
- data/lib/dependabot/python/update_checker/requirements_updater.rb +43 -35
- data/lib/dependabot/python/update_checker.rb +17 -17
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 242cdbd71bb6b0424ba7c88daf21d1839db3eb9d3f0beb2ad9e070f3d624cf77
|
|
4
|
+
data.tar.gz: 40a2faa1353d5fd82480211fee5ac28840996cf483fdf3c884fb558702396f08
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9a75d27db29ca5df37ea4e4962da3cbbfa0c05627044fd340d9b0b6f657108d44ff78bc40c206b2d0ac3a6d8387f3f0f30cd7dfeacafee122fd92b3e2d981954
|
|
7
|
+
data.tar.gz: 7651c73fdab13d9f091cada4a7d7531842e90042825ef0052c67882e90958870a26fd3936ac213bcd69362d9ac3b9d64d422a34ea4f9646344468851c6969b7c
|
data/helpers/requirements.txt
CHANGED
|
@@ -68,10 +68,19 @@ module Dependabot
|
|
|
68
68
|
SharedHelpers.in_a_temporary_directory do
|
|
69
69
|
write_temporary_dependency_files
|
|
70
70
|
|
|
71
|
-
requirements =
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
71
|
+
requirements = T.cast(
|
|
72
|
+
SharedHelpers.run_helper_subprocess(
|
|
73
|
+
command: "pyenv exec python3 #{NativeHelpers.python_helper_path}",
|
|
74
|
+
function: "parse_setup",
|
|
75
|
+
args: [Dir.pwd]
|
|
76
|
+
),
|
|
77
|
+
T.nilable(
|
|
78
|
+
T.any(
|
|
79
|
+
T::Hash[String, T.untyped],
|
|
80
|
+
String,
|
|
81
|
+
T::Array[T::Hash[String, T.untyped]]
|
|
82
|
+
)
|
|
83
|
+
)
|
|
75
84
|
)
|
|
76
85
|
|
|
77
86
|
check_requirements(requirements)
|
|
@@ -90,10 +99,19 @@ module Dependabot
|
|
|
90
99
|
SharedHelpers.in_a_temporary_directory do
|
|
91
100
|
write_sanitized_setup_file
|
|
92
101
|
|
|
93
|
-
requirements =
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
102
|
+
requirements = T.cast(
|
|
103
|
+
SharedHelpers.run_helper_subprocess(
|
|
104
|
+
command: "pyenv exec python3 #{NativeHelpers.python_helper_path}",
|
|
105
|
+
function: "parse_setup",
|
|
106
|
+
args: [Dir.pwd]
|
|
107
|
+
),
|
|
108
|
+
T.nilable(
|
|
109
|
+
T.any(
|
|
110
|
+
T::Hash[String, T.untyped],
|
|
111
|
+
String,
|
|
112
|
+
T::Array[T::Hash[String, T.untyped]]
|
|
113
|
+
)
|
|
114
|
+
)
|
|
97
115
|
)
|
|
98
116
|
|
|
99
117
|
check_requirements(requirements)
|
|
@@ -194,9 +194,9 @@ module Dependabot
|
|
|
194
194
|
def update_uncompiled_files(updated_files)
|
|
195
195
|
updated_filenames = updated_files.map(&:name)
|
|
196
196
|
old_reqs = T.must(T.must(dependency).previous_requirements)
|
|
197
|
-
.reject { |r| updated_filenames.include?(r
|
|
197
|
+
.reject { |r| updated_filenames.include?(r.file) }
|
|
198
198
|
new_reqs = T.must(dependency).requirements
|
|
199
|
-
.reject { |r| updated_filenames.include?(r
|
|
199
|
+
.reject { |r| updated_filenames.include?(r.file) }
|
|
200
200
|
|
|
201
201
|
return [] if new_reqs.none?
|
|
202
202
|
|
|
@@ -324,15 +324,15 @@ module Dependabot
|
|
|
324
324
|
return file.content unless file.name.end_with?(".in")
|
|
325
325
|
|
|
326
326
|
old_req = T.must(T.must(dependency).previous_requirements)
|
|
327
|
-
.find { |r| r
|
|
327
|
+
.find { |r| r.file == file.name }
|
|
328
328
|
|
|
329
329
|
return file.content unless old_req
|
|
330
|
-
return file.content if old_req == "==#{T.must(dependency).version}"
|
|
330
|
+
return file.content if old_req.requirement_string == "==#{T.must(dependency).version}"
|
|
331
331
|
|
|
332
332
|
RequirementReplacer.new(
|
|
333
333
|
content: T.must(file.content),
|
|
334
334
|
dependency_name: T.must(dependency).name,
|
|
335
|
-
old_requirement: old_req
|
|
335
|
+
old_requirement: old_req.requirement_string,
|
|
336
336
|
new_requirement: "==#{T.must(dependency).version}",
|
|
337
337
|
index_urls: @index_urls
|
|
338
338
|
).updated_content
|
|
@@ -343,17 +343,17 @@ module Dependabot
|
|
|
343
343
|
return file.content unless file.name.end_with?(".in")
|
|
344
344
|
|
|
345
345
|
old_req = T.must(T.must(dependency).previous_requirements)
|
|
346
|
-
.find { |r| r
|
|
346
|
+
.find { |r| r.file == file.name }
|
|
347
347
|
new_req = T.must(dependency).requirements
|
|
348
|
-
.find { |r| r
|
|
349
|
-
return file.content unless old_req&.
|
|
348
|
+
.find { |r| r.file == file.name }
|
|
349
|
+
return file.content unless old_req&.requirement_string
|
|
350
350
|
return file.content if old_req == new_req
|
|
351
351
|
|
|
352
352
|
RequirementReplacer.new(
|
|
353
353
|
content: T.must(file.content),
|
|
354
354
|
dependency_name: T.must(dependency).name,
|
|
355
|
-
old_requirement: old_req
|
|
356
|
-
new_requirement: T.must(new_req)
|
|
355
|
+
old_requirement: old_req.requirement_string,
|
|
356
|
+
new_requirement: T.must(T.must(new_req).requirement_string),
|
|
357
357
|
index_urls: @index_urls
|
|
358
358
|
).updated_content
|
|
359
359
|
end
|
|
@@ -674,7 +674,7 @@ module Dependabot
|
|
|
674
674
|
def filenames_to_compile
|
|
675
675
|
files_from_reqs =
|
|
676
676
|
T.must(dependency).requirements
|
|
677
|
-
.
|
|
677
|
+
.filter_map(&:file)
|
|
678
678
|
.select { |fn| fn.end_with?(".in") }
|
|
679
679
|
|
|
680
680
|
files_from_compiled_files =
|
|
@@ -345,10 +345,19 @@ module Dependabot
|
|
|
345
345
|
def pipfile_hash_for(pipfile_content)
|
|
346
346
|
SharedHelpers.in_a_temporary_directory do |dir|
|
|
347
347
|
File.write(File.join(dir, "Pipfile"), pipfile_content)
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
348
|
+
T.cast(
|
|
349
|
+
SharedHelpers.run_helper_subprocess(
|
|
350
|
+
command: "pyenv exec python3 #{NativeHelpers.python_helper_path}",
|
|
351
|
+
function: "get_pipfile_hash",
|
|
352
|
+
args: [T.cast(dir, Pathname).to_s]
|
|
353
|
+
),
|
|
354
|
+
T.nilable(
|
|
355
|
+
T.any(
|
|
356
|
+
T::Hash[String, T.untyped],
|
|
357
|
+
String,
|
|
358
|
+
T::Array[T::Hash[String, T.untyped]]
|
|
359
|
+
)
|
|
360
|
+
)
|
|
352
361
|
)
|
|
353
362
|
end
|
|
354
363
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# typed:
|
|
1
|
+
# typed: strong
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
require "dependabot/python/file_updater"
|
|
@@ -53,15 +53,15 @@ module Dependabot
|
|
|
53
53
|
|
|
54
54
|
# Loop through each changed requirement
|
|
55
55
|
reqs.each do |new_req, old_req|
|
|
56
|
-
raise "Bad req match" unless new_req
|
|
57
|
-
next if new_req
|
|
58
|
-
next unless new_req
|
|
56
|
+
raise "Bad req match" unless new_req.file == T.must(old_req).file
|
|
57
|
+
next if new_req.requirement == T.must(old_req).requirement
|
|
58
|
+
next unless new_req.file == manifest.name
|
|
59
59
|
|
|
60
60
|
updated_content = update_manifest_req(
|
|
61
61
|
content: updated_content,
|
|
62
62
|
dep: dependency,
|
|
63
|
-
old_req: T.must(old_req).
|
|
64
|
-
new_req: new_req.
|
|
63
|
+
old_req: T.must(T.must(old_req).requirement_string),
|
|
64
|
+
new_req: T.must(new_req.requirement_string)
|
|
65
65
|
)
|
|
66
66
|
end
|
|
67
67
|
|
|
@@ -118,7 +118,7 @@ module Dependabot
|
|
|
118
118
|
changed_requirements =
|
|
119
119
|
dependency.requirements - T.must(dependency.previous_requirements)
|
|
120
120
|
|
|
121
|
-
changed_requirements.any? { |f| f
|
|
121
|
+
changed_requirements.any? { |f| f.file == manifest.name }
|
|
122
122
|
end
|
|
123
123
|
end
|
|
124
124
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# typed:
|
|
1
|
+
# typed: strong
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
require "sorbet-runtime"
|
|
@@ -19,8 +19,8 @@ module Dependabot
|
|
|
19
19
|
sig do
|
|
20
20
|
params(
|
|
21
21
|
content: String,
|
|
22
|
-
new_r:
|
|
23
|
-
old_r:
|
|
22
|
+
new_r: Dependabot::DependencyRequirement,
|
|
23
|
+
old_r: Dependabot::DependencyRequirement
|
|
24
24
|
).returns(T.nilable(String))
|
|
25
25
|
end
|
|
26
26
|
def replace(content, new_r, old_r)
|
|
@@ -96,8 +96,8 @@ module Dependabot
|
|
|
96
96
|
params(
|
|
97
97
|
content: String,
|
|
98
98
|
source_req: String,
|
|
99
|
-
new_r:
|
|
100
|
-
old_r:
|
|
99
|
+
new_r: Dependabot::DependencyRequirement,
|
|
100
|
+
old_r: Dependabot::DependencyRequirement
|
|
101
101
|
).returns(T.nilable(String))
|
|
102
102
|
end
|
|
103
103
|
def replace_with_source_requirement(content, source_req, new_r, old_r)
|
|
@@ -105,7 +105,11 @@ module Dependabot
|
|
|
105
105
|
return unless match
|
|
106
106
|
|
|
107
107
|
declaration = T.must(match[:declaration])
|
|
108
|
-
new_req_str = rewrite_pep508_requirement(
|
|
108
|
+
new_req_str = rewrite_pep508_requirement(
|
|
109
|
+
source_req,
|
|
110
|
+
T.must(old_r.requirement_string),
|
|
111
|
+
T.must(new_r.requirement_string)
|
|
112
|
+
)
|
|
109
113
|
content.sub(declaration, declaration.sub(source_req, new_req_str))
|
|
110
114
|
end
|
|
111
115
|
|
|
@@ -116,13 +120,13 @@ module Dependabot
|
|
|
116
120
|
sig do
|
|
117
121
|
params(
|
|
118
122
|
content: String,
|
|
119
|
-
new_r:
|
|
120
|
-
old_r:
|
|
123
|
+
new_r: Dependabot::DependencyRequirement,
|
|
124
|
+
old_r: Dependabot::DependencyRequirement
|
|
121
125
|
).returns(T.nilable(String))
|
|
122
126
|
end
|
|
123
127
|
def replace_with_normalized_requirement(content, new_r, old_r)
|
|
124
|
-
old_req = old_r
|
|
125
|
-
new_req = new_r
|
|
128
|
+
old_req = T.must(old_r.requirement_string)
|
|
129
|
+
new_req = T.must(new_r.requirement_string)
|
|
126
130
|
|
|
127
131
|
match = content.match(normalized_declaration_regex(old_req))
|
|
128
132
|
return unless match
|
|
@@ -18,6 +18,16 @@ require "dependabot/package/release_cooldown_options"
|
|
|
18
18
|
|
|
19
19
|
module Dependabot
|
|
20
20
|
module Python
|
|
21
|
+
PoetryPyprojectHashResult = T.type_alias do
|
|
22
|
+
T.nilable(
|
|
23
|
+
T.any(
|
|
24
|
+
T::Hash[String, T.untyped],
|
|
25
|
+
String,
|
|
26
|
+
T::Array[T::Hash[String, T.untyped]]
|
|
27
|
+
)
|
|
28
|
+
)
|
|
29
|
+
end
|
|
30
|
+
|
|
21
31
|
class FileUpdater
|
|
22
32
|
class PoetryFileUpdater
|
|
23
33
|
require_relative "pyproject_preparer"
|
|
@@ -99,7 +109,7 @@ module Dependabot
|
|
|
99
109
|
updated_content = content.dup
|
|
100
110
|
|
|
101
111
|
dependency.requirements.zip(T.must(dependency.previous_requirements)).each do |new_r, old_r|
|
|
102
|
-
next unless new_r
|
|
112
|
+
next unless new_r.file == pyproject&.name && T.must(old_r).file == pyproject&.name
|
|
103
113
|
|
|
104
114
|
updated_content = replace_dep(dependency, T.must(updated_content), new_r, T.must(old_r))
|
|
105
115
|
end
|
|
@@ -109,7 +119,7 @@ module Dependabot
|
|
|
109
119
|
updated_content
|
|
110
120
|
end
|
|
111
121
|
|
|
112
|
-
sig { params(dep: Dependabot::Dependency, content: String, new_r:
|
|
122
|
+
sig { params(dep: Dependabot::Dependency, content: String, new_r: Dependabot::DependencyRequirement, old_r: Dependabot::DependencyRequirement).returns(String) }
|
|
113
123
|
def replace_dep(dep, content, new_r, old_r)
|
|
114
124
|
return update_git_tag(dep, content, new_r, old_r) if git_dependency?(new_r) && git_dependency?(old_r)
|
|
115
125
|
|
|
@@ -119,10 +129,10 @@ module Dependabot
|
|
|
119
129
|
content
|
|
120
130
|
end
|
|
121
131
|
|
|
122
|
-
sig { params(dep: Dependabot::Dependency, content: String, new_r:
|
|
132
|
+
sig { params(dep: Dependabot::Dependency, content: String, new_r: Dependabot::DependencyRequirement, old_r: Dependabot::DependencyRequirement).returns(T.nilable(String)) }
|
|
123
133
|
def replace_poetry_dep(dep, content, new_r, old_r)
|
|
124
|
-
new_req = new_r
|
|
125
|
-
old_req = old_r
|
|
134
|
+
new_req = T.must(new_r.requirement_string)
|
|
135
|
+
old_req = T.must(old_r.requirement_string)
|
|
126
136
|
|
|
127
137
|
declaration_regex = declaration_regex(dep, old_r)
|
|
128
138
|
declaration_match = content.match(declaration_regex)
|
|
@@ -135,10 +145,10 @@ module Dependabot
|
|
|
135
145
|
content.sub(T.must(declaration), new_declaration)
|
|
136
146
|
end
|
|
137
147
|
|
|
138
|
-
sig { params(dep: Dependabot::Dependency, content: String, new_r:
|
|
148
|
+
sig { params(dep: Dependabot::Dependency, content: String, new_r: Dependabot::DependencyRequirement, old_r: Dependabot::DependencyRequirement).returns(T.nilable(String)) }
|
|
139
149
|
def replace_poetry_table_dep(dep, content, new_r, old_r)
|
|
140
|
-
old_req = old_r
|
|
141
|
-
new_req = new_r
|
|
150
|
+
old_req = T.must(old_r.requirement_string)
|
|
151
|
+
new_req = T.must(new_r.requirement_string)
|
|
142
152
|
regex = table_declaration_regex(dep, new_r)
|
|
143
153
|
|
|
144
154
|
return unless content.match(regex)
|
|
@@ -151,20 +161,20 @@ module Dependabot
|
|
|
151
161
|
end
|
|
152
162
|
end
|
|
153
163
|
|
|
154
|
-
sig { params(dep: Dependabot::Dependency, content: String, new_r:
|
|
164
|
+
sig { params(dep: Dependabot::Dependency, content: String, new_r: Dependabot::DependencyRequirement, old_r: Dependabot::DependencyRequirement).returns(T.nilable(String)) }
|
|
155
165
|
def replace_pep621_dep(dep, content, new_r, old_r)
|
|
156
166
|
Pep621Updater.new(dep: dep).replace(content, new_r, old_r)
|
|
157
167
|
end
|
|
158
168
|
|
|
159
|
-
sig { params(req:
|
|
169
|
+
sig { params(req: Dependabot::DependencyRequirement).returns(T::Boolean) }
|
|
160
170
|
def git_dependency?(req)
|
|
161
|
-
req.
|
|
171
|
+
req.source_string("type") == "git"
|
|
162
172
|
end
|
|
163
173
|
|
|
164
|
-
sig { params(dep: Dependabot::Dependency, content: String, new_r:
|
|
174
|
+
sig { params(dep: Dependabot::Dependency, content: String, new_r: Dependabot::DependencyRequirement, old_r: Dependabot::DependencyRequirement).returns(String) }
|
|
165
175
|
def update_git_tag(dep, content, new_r, old_r)
|
|
166
|
-
old_tag = old_r.
|
|
167
|
-
new_tag = new_r.
|
|
176
|
+
old_tag = old_r.source_string("ref")
|
|
177
|
+
new_tag = new_r.source_string("ref")
|
|
168
178
|
|
|
169
179
|
return content if old_tag == new_tag
|
|
170
180
|
|
|
@@ -172,7 +182,7 @@ module Dependabot
|
|
|
172
182
|
# Example: fastapi = { git = "...", extras = ["all"], tag = "0.110.0" }
|
|
173
183
|
git_dep_regex = /
|
|
174
184
|
^(\s*)#{Regexp.escape(dep.name)}(\s*=\s*\{[^}]*tag\s*=\s*)
|
|
175
|
-
["']#{Regexp.escape(old_tag)}["']([^}]*\})
|
|
185
|
+
["']#{Regexp.escape(T.must(old_tag))}["']([^}]*\})
|
|
176
186
|
/mx
|
|
177
187
|
|
|
178
188
|
content.gsub(git_dep_regex) do
|
|
@@ -233,7 +243,7 @@ module Dependabot
|
|
|
233
243
|
# Skip Git dependencies - they use tags/refs, not versions
|
|
234
244
|
next if git_dependency_being_updated?(dep)
|
|
235
245
|
|
|
236
|
-
if dep.requirements.find { |r| r
|
|
246
|
+
if dep.requirements.find { |r| r.file == pyproject&.name }
|
|
237
247
|
lock_declaration_to_new_version!(poetry_object, dep)
|
|
238
248
|
else
|
|
239
249
|
create_declaration_at_new_version!(poetry_object, dep)
|
|
@@ -302,7 +312,7 @@ module Dependabot
|
|
|
302
312
|
|
|
303
313
|
sig { params(dep: Dependabot::Dependency).returns(T::Boolean) }
|
|
304
314
|
def git_dependency_being_updated?(dep)
|
|
305
|
-
dep.requirements.any? { |r| r.
|
|
315
|
+
dep.requirements.any? { |r| r.source_string("type") == "git" }
|
|
306
316
|
end
|
|
307
317
|
|
|
308
318
|
sig { params(pyproject_content: String).returns(String) }
|
|
@@ -367,32 +377,33 @@ module Dependabot
|
|
|
367
377
|
.add_auth_env_vars(credentials)
|
|
368
378
|
end
|
|
369
379
|
|
|
370
|
-
sig { params(pyproject_content: String).returns(
|
|
380
|
+
sig { params(pyproject_content: String).returns(PoetryPyprojectHashResult) }
|
|
371
381
|
def pyproject_hash_for(pyproject_content)
|
|
372
382
|
SharedHelpers.in_a_temporary_directory do |dir|
|
|
373
383
|
SharedHelpers.with_git_configured(credentials: credentials) do
|
|
374
384
|
write_temporary_dependency_files(pyproject_content)
|
|
375
385
|
|
|
376
|
-
SharedHelpers.run_helper_subprocess(
|
|
386
|
+
result = SharedHelpers.run_helper_subprocess(
|
|
377
387
|
command: "pyenv exec python3 #{NativeHelpers.python_helper_path}",
|
|
378
388
|
function: "get_pyproject_hash",
|
|
379
389
|
args: [T.cast(dir, Pathname).to_s]
|
|
380
390
|
)
|
|
391
|
+
T.cast(result, PoetryPyprojectHashResult)
|
|
381
392
|
end
|
|
382
393
|
end
|
|
383
394
|
end
|
|
384
395
|
|
|
385
|
-
sig { params(dep: Dependabot::Dependency, old_req:
|
|
396
|
+
sig { params(dep: Dependabot::Dependency, old_req: Dependabot::DependencyRequirement).returns(Regexp) }
|
|
386
397
|
def declaration_regex(dep, old_req)
|
|
387
|
-
group = old_req
|
|
398
|
+
group = T.must(old_req.groups).first
|
|
388
399
|
|
|
389
400
|
header_regex = "#{group}(?:\\.dependencies)?\\]\s*(?:\s*#.*?)*?"
|
|
390
401
|
/#{header_regex}(?:\r?\n).*?(?<declaration>(?:^\s*|["'])#{escape(dep)}["']?\s*=[^\r\n]*)(?=\r?\n|$)/mi
|
|
391
402
|
end
|
|
392
403
|
|
|
393
|
-
sig { params(dep: Dependabot::Dependency, old_req:
|
|
404
|
+
sig { params(dep: Dependabot::Dependency, old_req: Dependabot::DependencyRequirement).returns(Regexp) }
|
|
394
405
|
def table_declaration_regex(dep, old_req)
|
|
395
|
-
/tool\.poetry\.#{old_req
|
|
406
|
+
/tool\.poetry\.#{T.must(old_req.groups).first}\.#{escape(dep)}\](?:\r?\n).*?\s*version\s* =.*?(?:\r?\n)/m
|
|
396
407
|
end
|
|
397
408
|
|
|
398
409
|
sig { params(dep: Dependency).returns(String) }
|
|
@@ -410,7 +421,7 @@ module Dependabot
|
|
|
410
421
|
changed_requirements =
|
|
411
422
|
dependency.requirements - T.must(dependency.previous_requirements)
|
|
412
423
|
|
|
413
|
-
changed_requirements.any? { |f| f
|
|
424
|
+
changed_requirements.any? { |f| f.file == file.name }
|
|
414
425
|
end
|
|
415
426
|
|
|
416
427
|
sig { params(file: Dependabot::DependencyFile, content: String).returns(Dependabot::DependencyFile) }
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# typed:
|
|
1
|
+
# typed: strong
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
require "sorbet-runtime"
|
|
@@ -13,6 +13,10 @@ module Dependabot
|
|
|
13
13
|
class RequirementFileUpdater
|
|
14
14
|
extend T::Sig
|
|
15
15
|
|
|
16
|
+
RequirementChange = T.type_alias do
|
|
17
|
+
[Dependabot::DependencyRequirement, T.nilable(Dependabot::DependencyRequirement)]
|
|
18
|
+
end
|
|
19
|
+
|
|
16
20
|
require_relative "requirement_replacer"
|
|
17
21
|
|
|
18
22
|
sig { returns(T::Array[Dependabot::Dependency]) }
|
|
@@ -58,9 +62,9 @@ module Dependabot
|
|
|
58
62
|
updated_contents = T.let({}, T::Hash[String, String])
|
|
59
63
|
|
|
60
64
|
unique_requirement_changes.each do |pair|
|
|
61
|
-
new_req =
|
|
65
|
+
new_req = pair[0]
|
|
62
66
|
old_req = pair[1]
|
|
63
|
-
filename = new_req.
|
|
67
|
+
filename = T.must(new_req.file)
|
|
64
68
|
content = updated_contents[filename] || T.must(T.must(get_original_file(filename)).content)
|
|
65
69
|
updated_contents[filename] = updated_requirement_or_setup_file_content(content, new_req, old_req)
|
|
66
70
|
end
|
|
@@ -77,37 +81,37 @@ module Dependabot
|
|
|
77
81
|
# Deduplicates requirements that share the same file and requirement strings.
|
|
78
82
|
# The replacer's regex matches all extras variants at once, so one call per
|
|
79
83
|
# unique (file, old_requirement, new_requirement) is sufficient.
|
|
80
|
-
sig { returns(T::Array[
|
|
84
|
+
sig { returns(T::Array[RequirementChange]) }
|
|
81
85
|
def unique_requirement_changes
|
|
82
86
|
previous_reqs = dependency.previous_requirements || []
|
|
83
87
|
|
|
84
88
|
changes = dependency.requirements.filter_map do |new_req|
|
|
85
|
-
old_req = previous_reqs.find { |r| r
|
|
89
|
+
old_req = previous_reqs.find { |r| r.file == new_req.file && r.groups == new_req.groups }
|
|
86
90
|
next if new_req == old_req
|
|
87
91
|
|
|
88
|
-
[new_req, old_req]
|
|
92
|
+
T.let([new_req, old_req], RequirementChange)
|
|
89
93
|
end
|
|
90
94
|
|
|
91
95
|
changes.uniq do |pair|
|
|
92
96
|
new_req = pair[0]
|
|
93
97
|
old_req = pair[1]
|
|
94
|
-
[new_req
|
|
98
|
+
[new_req.file, old_req&.requirement, new_req.requirement]
|
|
95
99
|
end
|
|
96
100
|
end
|
|
97
101
|
|
|
98
102
|
sig do
|
|
99
103
|
params(
|
|
100
104
|
content: String,
|
|
101
|
-
new_req:
|
|
102
|
-
old_req: T.nilable(
|
|
105
|
+
new_req: Dependabot::DependencyRequirement,
|
|
106
|
+
old_req: T.nilable(Dependabot::DependencyRequirement)
|
|
103
107
|
).returns(String)
|
|
104
108
|
end
|
|
105
109
|
def updated_requirement_or_setup_file_content(content, new_req, old_req)
|
|
106
110
|
RequirementReplacer.new(
|
|
107
111
|
content: content,
|
|
108
112
|
dependency_name: dependency.name,
|
|
109
|
-
old_requirement: old_req&.
|
|
110
|
-
new_requirement: new_req.
|
|
113
|
+
old_requirement: old_req&.requirement_string,
|
|
114
|
+
new_requirement: T.must(new_req.requirement_string),
|
|
111
115
|
new_hash_version: dependency.version,
|
|
112
116
|
index_urls: @index_urls
|
|
113
117
|
).updated_content
|
|
@@ -61,10 +61,9 @@ module Dependabot
|
|
|
61
61
|
@install_requires_array ||=
|
|
62
62
|
parsed_setup_file.dependencies.filter_map do |dep|
|
|
63
63
|
first = T.must(dep.requirements.first)
|
|
64
|
-
next unless first
|
|
65
|
-
.include?("install_requires")
|
|
64
|
+
next unless first.groups&.include?("install_requires")
|
|
66
65
|
|
|
67
|
-
name_with_extras(dep) + first
|
|
66
|
+
name_with_extras(dep) + first.requirement.to_s
|
|
68
67
|
end
|
|
69
68
|
end
|
|
70
69
|
|
|
@@ -73,10 +72,9 @@ module Dependabot
|
|
|
73
72
|
@setup_requires_array ||=
|
|
74
73
|
parsed_setup_file.dependencies.filter_map do |dep|
|
|
75
74
|
first = T.must(dep.requirements.first)
|
|
76
|
-
next unless first
|
|
77
|
-
.include?("setup_requires")
|
|
75
|
+
next unless first.groups&.include?("setup_requires")
|
|
78
76
|
|
|
79
|
-
name_with_extras(dep) + first
|
|
77
|
+
name_with_extras(dep) + first.requirement.to_s
|
|
80
78
|
end
|
|
81
79
|
end
|
|
82
80
|
|
|
@@ -87,12 +85,13 @@ module Dependabot
|
|
|
87
85
|
hash = {}
|
|
88
86
|
parsed_setup_file.dependencies.each do |dep|
|
|
89
87
|
first = T.must(dep.requirements.first)
|
|
90
|
-
first
|
|
88
|
+
T.must(first.groups).each do |group|
|
|
91
89
|
next unless group.start_with?("extras_require:")
|
|
92
90
|
|
|
93
|
-
|
|
94
|
-
hash[
|
|
95
|
-
|
|
91
|
+
group_name = group.to_s
|
|
92
|
+
hash[group_name.split(":").last] ||= []
|
|
93
|
+
hash[group_name.split(":").last] <<
|
|
94
|
+
(name_with_extras(dep) + first.requirement.to_s)
|
|
96
95
|
end
|
|
97
96
|
end
|
|
98
97
|
|
|
@@ -46,7 +46,7 @@ module Dependabot
|
|
|
46
46
|
changed_reqs = reqs.zip(dependencies.flat_map(&:previous_requirements))
|
|
47
47
|
.reject { |(new_req, old_req)| new_req == old_req }
|
|
48
48
|
.map(&:first)
|
|
49
|
-
changed_req_files = changed_reqs.
|
|
49
|
+
changed_req_files = changed_reqs.filter_map(&:file)
|
|
50
50
|
|
|
51
51
|
# If there are no requirements then this is a sub-dependency. It
|
|
52
52
|
# must come from one of Pipenv, Poetry or pip-tools, and can't come
|
|
@@ -143,7 +143,7 @@ module Dependabot
|
|
|
143
143
|
sig { returns(T.nilable(String)) }
|
|
144
144
|
def lockfile_section
|
|
145
145
|
if current_dependency.requirements.any?
|
|
146
|
-
T.must(current_dependency.requirements.first)
|
|
146
|
+
T.must(T.must(current_dependency.requirements.first).groups).first&.to_s
|
|
147
147
|
else
|
|
148
148
|
parsed_lockfile = JSON.parse(T.must(T.must(lockfile).content))
|
|
149
149
|
Python::FileParser::DEPENDENCY_GROUP_KEYS.each do |keys|
|
|
@@ -400,14 +400,14 @@ module Dependabot
|
|
|
400
400
|
def update_req_file(file, updated_req)
|
|
401
401
|
return T.must(file.content) unless file.name.end_with?(".in")
|
|
402
402
|
|
|
403
|
-
req = dependency.requirements.find { |r| r
|
|
403
|
+
req = dependency.requirements.find { |r| r.file == file.name }
|
|
404
404
|
|
|
405
|
-
return T.must(file.content) + "\n#{dependency.name} #{updated_req}" unless req&.
|
|
405
|
+
return T.must(file.content) + "\n#{dependency.name} #{updated_req}" unless req&.requirement_string
|
|
406
406
|
|
|
407
407
|
Python::FileUpdater::RequirementReplacer.new(
|
|
408
408
|
content: T.must(file.content),
|
|
409
409
|
dependency_name: dependency.name,
|
|
410
|
-
old_requirement: req
|
|
410
|
+
old_requirement: req.requirement_string,
|
|
411
411
|
new_requirement: updated_req
|
|
412
412
|
).updated_content
|
|
413
413
|
end
|
|
@@ -426,7 +426,7 @@ module Dependabot
|
|
|
426
426
|
def filenames_to_compile
|
|
427
427
|
files_from_reqs =
|
|
428
428
|
dependency.requirements
|
|
429
|
-
.
|
|
429
|
+
.filter_map(&:file)
|
|
430
430
|
.select { |fn| fn.end_with?(".in") }
|
|
431
431
|
|
|
432
432
|
files_from_compiled_files =
|
|
@@ -182,7 +182,9 @@ module Dependabot
|
|
|
182
182
|
sig { returns(T::Array[[String, String]]) }
|
|
183
183
|
def normalized_requirement_files
|
|
184
184
|
dependency.requirements.filter_map do |req|
|
|
185
|
-
raw_file =
|
|
185
|
+
raw_file = req.file
|
|
186
|
+
next unless raw_file
|
|
187
|
+
|
|
186
188
|
[raw_file, normalize_path(raw_file)]
|
|
187
189
|
end
|
|
188
190
|
end
|
|
@@ -333,7 +333,7 @@ module Dependabot
|
|
|
333
333
|
end
|
|
334
334
|
|
|
335
335
|
# If this is a sub-dependency, add the new requirement
|
|
336
|
-
unless dependency.requirements.find { |r| r
|
|
336
|
+
unless dependency.requirements.find { |r| r.file == T.must(pyproject).name }
|
|
337
337
|
poetry_object[subdep_type] ||= {}
|
|
338
338
|
poetry_object[subdep_type][dependency.name] = updated_requirement
|
|
339
339
|
end
|
|
@@ -66,45 +66,49 @@ module Dependabot
|
|
|
66
66
|
return requirements if update_strategy.lockfile_only?
|
|
67
67
|
|
|
68
68
|
requirements.map do |req|
|
|
69
|
-
case req
|
|
69
|
+
case req.file
|
|
70
70
|
when /setup\.(?:py|cfg)$/ then updated_setup_requirement(req)
|
|
71
71
|
when ->(file) { file.end_with?("pyproject.toml") } then updated_pyproject_requirement(req)
|
|
72
72
|
when "Pipfile" then updated_pipfile_requirement(req)
|
|
73
73
|
when /\.txt$|\.in$/ then updated_requirement(req)
|
|
74
|
-
else raise "Unexpected filename: #{req
|
|
74
|
+
else raise "Unexpected filename: #{req.file}"
|
|
75
75
|
end
|
|
76
76
|
end
|
|
77
77
|
end
|
|
78
78
|
|
|
79
79
|
private
|
|
80
80
|
|
|
81
|
-
# rubocop:disable Metrics/PerceivedComplexity
|
|
82
81
|
sig { params(req: Dependabot::DependencyRequirement).returns(Dependabot::DependencyRequirement) }
|
|
83
82
|
def updated_setup_requirement(req)
|
|
84
83
|
return req unless latest_resolvable_version
|
|
85
|
-
return req unless req.fetch(:requirement)
|
|
86
|
-
return req if new_version_satisfies?(req)
|
|
87
84
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if req_strings.any? { |r| requirement_class.new(r).exact? }
|
|
92
|
-
find_and_update_equality_match(req_strings)
|
|
93
|
-
elsif req_strings.any? { |r| r.start_with?("~=") }
|
|
94
|
-
tw_req = req_strings.find { |r| r.start_with?("~=") }
|
|
95
|
-
bump_version(tw_req, latest_resolvable_version.to_s)
|
|
96
|
-
elsif req_strings.any? { |r| r.start_with?("==") }
|
|
97
|
-
tw_req = req_strings.find { |r| r.start_with?("==") }
|
|
98
|
-
convert_to_range(tw_req, T.must(latest_resolvable_version))
|
|
99
|
-
else
|
|
100
|
-
update_requirements_range(req_strings)
|
|
101
|
-
end
|
|
85
|
+
requirement = req.requirement_string
|
|
86
|
+
return req unless requirement
|
|
87
|
+
return req if new_version_satisfies?(req)
|
|
102
88
|
|
|
89
|
+
new_requirement = updated_setup_requirement_string(requirement)
|
|
103
90
|
Dependabot::DependencyRequirement.create(req.merge(requirement: new_requirement))
|
|
104
91
|
rescue UnfixableRequirement
|
|
105
92
|
Dependabot::DependencyRequirement.create(req.merge(requirement: :unfixable))
|
|
106
93
|
end
|
|
107
|
-
|
|
94
|
+
|
|
95
|
+
sig { params(requirement: String).returns(String) }
|
|
96
|
+
def updated_setup_requirement_string(requirement)
|
|
97
|
+
req_strings = requirement.split(",").map(&:strip)
|
|
98
|
+
return find_and_update_equality_match(req_strings) if req_strings.any? { |r| requirement_class.new(r).exact? }
|
|
99
|
+
|
|
100
|
+
if req_strings.any? { |r| r.start_with?("~=") }
|
|
101
|
+
tw_req = req_strings.find { |r| r.start_with?("~=") }
|
|
102
|
+
return bump_version(T.must(tw_req), latest_resolvable_version.to_s)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
if req_strings.any? { |r| r.start_with?("==") }
|
|
106
|
+
tw_req = req_strings.find { |r| r.start_with?("==") }
|
|
107
|
+
return convert_to_range(T.must(tw_req), T.must(latest_resolvable_version))
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
update_requirements_range(req_strings)
|
|
111
|
+
end
|
|
108
112
|
|
|
109
113
|
sig { params(req: Dependabot::DependencyRequirement).returns(Dependabot::DependencyRequirement) }
|
|
110
114
|
def updated_pipfile_requirement(req)
|
|
@@ -116,7 +120,7 @@ module Dependabot
|
|
|
116
120
|
sig { params(req: Dependabot::DependencyRequirement).returns(Dependabot::DependencyRequirement) }
|
|
117
121
|
def updated_pyproject_requirement(req)
|
|
118
122
|
return req unless latest_resolvable_version
|
|
119
|
-
return req unless req.
|
|
123
|
+
return req unless req.requirement_string
|
|
120
124
|
return req if skip_pyproject_update?(req)
|
|
121
125
|
|
|
122
126
|
pyproject_update_for_strategy(req)
|
|
@@ -132,11 +136,13 @@ module Dependabot
|
|
|
132
136
|
|
|
133
137
|
sig { params(req: Dependabot::DependencyRequirement).returns(Dependabot::DependencyRequirement) }
|
|
134
138
|
def pyproject_update_for_strategy(req)
|
|
139
|
+
requirement = T.must(req.requirement_string)
|
|
140
|
+
|
|
135
141
|
# If the requirement uses || syntax then we always want to widen it
|
|
136
|
-
return widen_pyproject_requirement(req) if
|
|
142
|
+
return widen_pyproject_requirement(req) if requirement.match?(PYPROJECT_OR_SEPARATOR)
|
|
137
143
|
|
|
138
144
|
# If the requirement is a development dependency we always want to bump it
|
|
139
|
-
return update_pyproject_version(req) if req.
|
|
145
|
+
return update_pyproject_version(req) if req.groups&.include?("dev-dependencies")
|
|
140
146
|
|
|
141
147
|
case update_strategy
|
|
142
148
|
when RequirementsUpdateStrategy::WidenRanges then widen_pyproject_requirement(req)
|
|
@@ -155,7 +161,7 @@ module Dependabot
|
|
|
155
161
|
|
|
156
162
|
sig { params(req: Dependabot::DependencyRequirement).returns(Dependabot::DependencyRequirement) }
|
|
157
163
|
def update_pyproject_version(req)
|
|
158
|
-
return req if req
|
|
164
|
+
return req if req.requirement == "*"
|
|
159
165
|
|
|
160
166
|
update_pyproject_version_core(req, bump_lower_bound: true)
|
|
161
167
|
end
|
|
@@ -167,14 +173,14 @@ module Dependabot
|
|
|
167
173
|
).returns(Dependabot::DependencyRequirement)
|
|
168
174
|
end
|
|
169
175
|
def update_pyproject_version_core(req, bump_lower_bound:)
|
|
170
|
-
requirement_strings = req
|
|
176
|
+
requirement_strings = T.must(req.requirement_string).split(",").map(&:strip)
|
|
171
177
|
|
|
172
178
|
new_requirement =
|
|
173
179
|
if requirement_strings.any? { |r| r.match?(/^=|^\d/) }
|
|
174
180
|
find_and_update_equality_match(requirement_strings)
|
|
175
181
|
elsif requirement_strings.any? { |r| r.start_with?("~", "^") }
|
|
176
182
|
v_req = requirement_strings.find { |r| r.start_with?("~", "^") }
|
|
177
|
-
bump_version(v_req, latest_resolvable_version.to_s)
|
|
183
|
+
bump_version(T.must(v_req), latest_resolvable_version.to_s)
|
|
178
184
|
elsif bump_lower_bound
|
|
179
185
|
bump_requirements_range(requirement_strings)
|
|
180
186
|
else
|
|
@@ -188,11 +194,12 @@ module Dependabot
|
|
|
188
194
|
def widen_pyproject_requirement(req)
|
|
189
195
|
return req if new_version_satisfies?(req)
|
|
190
196
|
|
|
197
|
+
requirement = T.must(req.requirement_string)
|
|
191
198
|
new_requirement =
|
|
192
|
-
if
|
|
193
|
-
add_new_requirement_option(
|
|
199
|
+
if requirement.match?(PYPROJECT_OR_SEPARATOR)
|
|
200
|
+
add_new_requirement_option(requirement)
|
|
194
201
|
else
|
|
195
|
-
widen_requirement_range(
|
|
202
|
+
widen_requirement_range(requirement)
|
|
196
203
|
end
|
|
197
204
|
|
|
198
205
|
Dependabot::DependencyRequirement.create(req.merge(requirement: new_requirement))
|
|
@@ -248,7 +255,7 @@ module Dependabot
|
|
|
248
255
|
sig { params(req: Dependabot::DependencyRequirement).returns(Dependabot::DependencyRequirement) }
|
|
249
256
|
def updated_requirement(req)
|
|
250
257
|
return req unless latest_resolvable_version
|
|
251
|
-
return req unless req.
|
|
258
|
+
return req unless req.requirement_string
|
|
252
259
|
|
|
253
260
|
case update_strategy
|
|
254
261
|
when RequirementsUpdateStrategy::WidenRanges
|
|
@@ -279,17 +286,18 @@ module Dependabot
|
|
|
279
286
|
|
|
280
287
|
sig { params(req: Dependabot::DependencyRequirement).returns(T.any(String, Symbol)) }
|
|
281
288
|
def updated_requirement_string(req)
|
|
282
|
-
|
|
289
|
+
requirement = T.must(req.requirement_string)
|
|
290
|
+
requirement_strings = requirement.split(",").map(&:strip)
|
|
283
291
|
|
|
284
292
|
if requirement_strings.any? { |r| r.match?(/^[=\d]/) }
|
|
285
293
|
find_and_update_equality_match(requirement_strings)
|
|
286
294
|
elsif requirement_strings.any? { |r| r.start_with?("~=") }
|
|
287
295
|
tw_req = requirement_strings.find { |r| r.start_with?("~=") }
|
|
288
|
-
bump_version(tw_req, latest_resolvable_version.to_s)
|
|
296
|
+
bump_version(T.must(tw_req), latest_resolvable_version.to_s)
|
|
289
297
|
elsif bump_lower_bound?(requirement_strings)
|
|
290
298
|
bump_requirements_range(requirement_strings)
|
|
291
299
|
elsif new_version_satisfies?(req)
|
|
292
|
-
|
|
300
|
+
requirement
|
|
293
301
|
else
|
|
294
302
|
update_requirements_range(requirement_strings)
|
|
295
303
|
end
|
|
@@ -305,7 +313,7 @@ module Dependabot
|
|
|
305
313
|
def widen_requirement(req)
|
|
306
314
|
return req if new_version_satisfies?(req)
|
|
307
315
|
|
|
308
|
-
new_requirement = widen_requirement_range(req
|
|
316
|
+
new_requirement = widen_requirement_range(T.must(req.requirement_string))
|
|
309
317
|
|
|
310
318
|
Dependabot::DependencyRequirement.create(req.merge(requirement: new_requirement))
|
|
311
319
|
end
|
|
@@ -313,7 +321,7 @@ module Dependabot
|
|
|
313
321
|
sig { params(req: Dependabot::DependencyRequirement).returns(T::Boolean) }
|
|
314
322
|
def new_version_satisfies?(req)
|
|
315
323
|
requirement_class
|
|
316
|
-
.requirements_array(req.
|
|
324
|
+
.requirements_array(req.requirement_string)
|
|
317
325
|
.any? { |r| r.satisfied_by?(T.must(latest_resolvable_version)) }
|
|
318
326
|
end
|
|
319
327
|
|
|
@@ -129,7 +129,7 @@ module Dependabot
|
|
|
129
129
|
|
|
130
130
|
sig { returns(T.nilable(Gem::Version)) }
|
|
131
131
|
def latest_version_for_git_dependency
|
|
132
|
-
latest_git_version_details&.
|
|
132
|
+
latest_git_version_details&.version
|
|
133
133
|
end
|
|
134
134
|
|
|
135
135
|
sig { returns(T.nilable(Gem::Version)) }
|
|
@@ -152,7 +152,7 @@ module Dependabot
|
|
|
152
152
|
def updated_git_source
|
|
153
153
|
# Update the git tag if a new version is available
|
|
154
154
|
if git_commit_checker.pinned_ref_looks_like_version? && latest_git_version_details
|
|
155
|
-
new_tag = T.must(latest_git_version_details).
|
|
155
|
+
new_tag = T.must(latest_git_version_details).tag
|
|
156
156
|
source_details = dependency.source_details
|
|
157
157
|
return source_details.transform_keys(&:to_sym).merge(ref: new_tag) if source_details
|
|
158
158
|
end
|
|
@@ -161,11 +161,11 @@ module Dependabot
|
|
|
161
161
|
dependency.source_details&.transform_keys(&:to_sym)
|
|
162
162
|
end
|
|
163
163
|
|
|
164
|
-
sig { returns(T.nilable(
|
|
164
|
+
sig { returns(T.nilable(Dependabot::GitTagDetails)) }
|
|
165
165
|
def latest_git_version_details
|
|
166
166
|
@latest_git_version_details ||= T.let(
|
|
167
167
|
git_commit_checker.local_tag_for_latest_version(@update_cooldown),
|
|
168
|
-
T.nilable(
|
|
168
|
+
T.nilable(Dependabot::GitTagDetails)
|
|
169
169
|
)
|
|
170
170
|
end
|
|
171
171
|
|
|
@@ -253,10 +253,9 @@ module Dependabot
|
|
|
253
253
|
:requirements
|
|
254
254
|
end
|
|
255
255
|
|
|
256
|
-
sig { params(reqs: T::Array[
|
|
256
|
+
sig { params(reqs: T::Array[Dependabot::DependencyRequirement]).returns(T::Boolean) }
|
|
257
257
|
def exact_requirement?(reqs)
|
|
258
|
-
reqs = reqs.
|
|
259
|
-
reqs = reqs.compact
|
|
258
|
+
reqs = reqs.filter_map(&:requirement_string)
|
|
260
259
|
reqs = reqs.flat_map { |r| r.split(",").map(&:strip) }
|
|
261
260
|
reqs.any? { |r| Python::Requirement.new(r).exact? }
|
|
262
261
|
end
|
|
@@ -332,12 +331,13 @@ module Dependabot
|
|
|
332
331
|
return if reqs.none?
|
|
333
332
|
|
|
334
333
|
requirement = reqs.find do |r|
|
|
335
|
-
file = r
|
|
334
|
+
file = r.file
|
|
335
|
+
next false unless file
|
|
336
336
|
|
|
337
337
|
file == "Pipfile" || file == "pyproject.toml" || file.end_with?(".in") || file.end_with?(".txt")
|
|
338
338
|
end
|
|
339
339
|
|
|
340
|
-
requirement&.
|
|
340
|
+
requirement&.requirement_string
|
|
341
341
|
end
|
|
342
342
|
|
|
343
343
|
sig { returns(String) }
|
|
@@ -361,13 +361,13 @@ module Dependabot
|
|
|
361
361
|
def updated_version_req_lower_bound
|
|
362
362
|
return ">=#{dependency.version}" if dependency.version
|
|
363
363
|
|
|
364
|
-
version_for_requirement =
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
364
|
+
version_for_requirement = requirements
|
|
365
|
+
.filter_map(&:requirement_string)
|
|
366
|
+
.reject { |req_string| req_string.start_with?("<") }
|
|
367
|
+
.select { |req_string| req_string.match?(VERSION_REGEX) }
|
|
368
|
+
.map { |req_string| req_string.match(VERSION_REGEX).to_s }
|
|
369
|
+
.select { |version| Python::Version.correct?(version) }
|
|
370
|
+
.max_by { |version| Python::Version.new(version) }
|
|
371
371
|
|
|
372
372
|
">=#{version_for_requirement || 0}"
|
|
373
373
|
end
|
|
@@ -450,7 +450,7 @@ module Dependabot
|
|
|
450
450
|
|
|
451
451
|
sig { returns(T::Array[String]) }
|
|
452
452
|
def requirement_files
|
|
453
|
-
requirements.
|
|
453
|
+
requirements.filter_map(&:file)
|
|
454
454
|
end
|
|
455
455
|
|
|
456
456
|
sig { returns(T::Array[Dependabot::DependencyRequirement]) }
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dependabot-python
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.393.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.
|
|
18
|
+
version: 0.393.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.
|
|
25
|
+
version: 0.393.0
|
|
26
26
|
- !ruby/object:Gem::Dependency
|
|
27
27
|
name: debug
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -323,7 +323,7 @@ licenses:
|
|
|
323
323
|
- MIT
|
|
324
324
|
metadata:
|
|
325
325
|
bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
|
|
326
|
-
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.
|
|
326
|
+
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.393.0
|
|
327
327
|
rdoc_options: []
|
|
328
328
|
require_paths:
|
|
329
329
|
- lib
|