dependabot-python 0.391.0 → 0.392.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/lib/dependabot/python/file_updater/pip_compile_file_updater.rb +11 -11
- 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 +22 -22
- 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 +13 -13
- 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: 70504f97ff35fbf437e2895455b6371d858c38921b3f4839a11aaddc31d04911
|
|
4
|
+
data.tar.gz: 131699694996cabca8daec6c5a96f5a4dba34ec11601a22d7a8f54e6a855852f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 56501fd6454a91206147b03fa795570e6a494e5d5c9733c8945656b174893352cd4adaa3bd2b4ee6c87565c3cc59dc861f62500d4c86fdfa3ea82c50afadda3f
|
|
7
|
+
data.tar.gz: 8e1983671535f8886b5f7b920893a747d80b16535b74159c07da2ae82c1226dd66276fea515f28503217565955827ab03d51d5ac78dee42dce46d6bcd0cbe869
|
|
@@ -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 =
|
|
@@ -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
|
|
@@ -99,7 +99,7 @@ module Dependabot
|
|
|
99
99
|
updated_content = content.dup
|
|
100
100
|
|
|
101
101
|
dependency.requirements.zip(T.must(dependency.previous_requirements)).each do |new_r, old_r|
|
|
102
|
-
next unless new_r
|
|
102
|
+
next unless new_r.file == pyproject&.name && T.must(old_r).file == pyproject&.name
|
|
103
103
|
|
|
104
104
|
updated_content = replace_dep(dependency, T.must(updated_content), new_r, T.must(old_r))
|
|
105
105
|
end
|
|
@@ -109,7 +109,7 @@ module Dependabot
|
|
|
109
109
|
updated_content
|
|
110
110
|
end
|
|
111
111
|
|
|
112
|
-
sig { params(dep: Dependabot::Dependency, content: String, new_r:
|
|
112
|
+
sig { params(dep: Dependabot::Dependency, content: String, new_r: Dependabot::DependencyRequirement, old_r: Dependabot::DependencyRequirement).returns(String) }
|
|
113
113
|
def replace_dep(dep, content, new_r, old_r)
|
|
114
114
|
return update_git_tag(dep, content, new_r, old_r) if git_dependency?(new_r) && git_dependency?(old_r)
|
|
115
115
|
|
|
@@ -119,10 +119,10 @@ module Dependabot
|
|
|
119
119
|
content
|
|
120
120
|
end
|
|
121
121
|
|
|
122
|
-
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(T.nilable(String)) }
|
|
123
123
|
def replace_poetry_dep(dep, content, new_r, old_r)
|
|
124
|
-
new_req = new_r
|
|
125
|
-
old_req = old_r
|
|
124
|
+
new_req = T.must(new_r.requirement_string)
|
|
125
|
+
old_req = T.must(old_r.requirement_string)
|
|
126
126
|
|
|
127
127
|
declaration_regex = declaration_regex(dep, old_r)
|
|
128
128
|
declaration_match = content.match(declaration_regex)
|
|
@@ -135,10 +135,10 @@ module Dependabot
|
|
|
135
135
|
content.sub(T.must(declaration), new_declaration)
|
|
136
136
|
end
|
|
137
137
|
|
|
138
|
-
sig { params(dep: Dependabot::Dependency, content: String, new_r:
|
|
138
|
+
sig { params(dep: Dependabot::Dependency, content: String, new_r: Dependabot::DependencyRequirement, old_r: Dependabot::DependencyRequirement).returns(T.nilable(String)) }
|
|
139
139
|
def replace_poetry_table_dep(dep, content, new_r, old_r)
|
|
140
|
-
old_req = old_r
|
|
141
|
-
new_req = new_r
|
|
140
|
+
old_req = T.must(old_r.requirement_string)
|
|
141
|
+
new_req = T.must(new_r.requirement_string)
|
|
142
142
|
regex = table_declaration_regex(dep, new_r)
|
|
143
143
|
|
|
144
144
|
return unless content.match(regex)
|
|
@@ -151,20 +151,20 @@ module Dependabot
|
|
|
151
151
|
end
|
|
152
152
|
end
|
|
153
153
|
|
|
154
|
-
sig { params(dep: Dependabot::Dependency, content: String, new_r:
|
|
154
|
+
sig { params(dep: Dependabot::Dependency, content: String, new_r: Dependabot::DependencyRequirement, old_r: Dependabot::DependencyRequirement).returns(T.nilable(String)) }
|
|
155
155
|
def replace_pep621_dep(dep, content, new_r, old_r)
|
|
156
156
|
Pep621Updater.new(dep: dep).replace(content, new_r, old_r)
|
|
157
157
|
end
|
|
158
158
|
|
|
159
|
-
sig { params(req:
|
|
159
|
+
sig { params(req: Dependabot::DependencyRequirement).returns(T::Boolean) }
|
|
160
160
|
def git_dependency?(req)
|
|
161
|
-
req.
|
|
161
|
+
req.source_string("type") == "git"
|
|
162
162
|
end
|
|
163
163
|
|
|
164
|
-
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(String) }
|
|
165
165
|
def update_git_tag(dep, content, new_r, old_r)
|
|
166
|
-
old_tag = old_r.
|
|
167
|
-
new_tag = new_r.
|
|
166
|
+
old_tag = old_r.source_string("ref")
|
|
167
|
+
new_tag = new_r.source_string("ref")
|
|
168
168
|
|
|
169
169
|
return content if old_tag == new_tag
|
|
170
170
|
|
|
@@ -172,7 +172,7 @@ module Dependabot
|
|
|
172
172
|
# Example: fastapi = { git = "...", extras = ["all"], tag = "0.110.0" }
|
|
173
173
|
git_dep_regex = /
|
|
174
174
|
^(\s*)#{Regexp.escape(dep.name)}(\s*=\s*\{[^}]*tag\s*=\s*)
|
|
175
|
-
["']#{Regexp.escape(old_tag)}["']([^}]*\})
|
|
175
|
+
["']#{Regexp.escape(T.must(old_tag))}["']([^}]*\})
|
|
176
176
|
/mx
|
|
177
177
|
|
|
178
178
|
content.gsub(git_dep_regex) do
|
|
@@ -233,7 +233,7 @@ module Dependabot
|
|
|
233
233
|
# Skip Git dependencies - they use tags/refs, not versions
|
|
234
234
|
next if git_dependency_being_updated?(dep)
|
|
235
235
|
|
|
236
|
-
if dep.requirements.find { |r| r
|
|
236
|
+
if dep.requirements.find { |r| r.file == pyproject&.name }
|
|
237
237
|
lock_declaration_to_new_version!(poetry_object, dep)
|
|
238
238
|
else
|
|
239
239
|
create_declaration_at_new_version!(poetry_object, dep)
|
|
@@ -302,7 +302,7 @@ module Dependabot
|
|
|
302
302
|
|
|
303
303
|
sig { params(dep: Dependabot::Dependency).returns(T::Boolean) }
|
|
304
304
|
def git_dependency_being_updated?(dep)
|
|
305
|
-
dep.requirements.any? { |r| r.
|
|
305
|
+
dep.requirements.any? { |r| r.source_string("type") == "git" }
|
|
306
306
|
end
|
|
307
307
|
|
|
308
308
|
sig { params(pyproject_content: String).returns(String) }
|
|
@@ -382,17 +382,17 @@ module Dependabot
|
|
|
382
382
|
end
|
|
383
383
|
end
|
|
384
384
|
|
|
385
|
-
sig { params(dep: Dependabot::Dependency, old_req:
|
|
385
|
+
sig { params(dep: Dependabot::Dependency, old_req: Dependabot::DependencyRequirement).returns(Regexp) }
|
|
386
386
|
def declaration_regex(dep, old_req)
|
|
387
|
-
group = old_req
|
|
387
|
+
group = T.must(old_req.groups).first
|
|
388
388
|
|
|
389
389
|
header_regex = "#{group}(?:\\.dependencies)?\\]\s*(?:\s*#.*?)*?"
|
|
390
390
|
/#{header_regex}(?:\r?\n).*?(?<declaration>(?:^\s*|["'])#{escape(dep)}["']?\s*=[^\r\n]*)(?=\r?\n|$)/mi
|
|
391
391
|
end
|
|
392
392
|
|
|
393
|
-
sig { params(dep: Dependabot::Dependency, old_req:
|
|
393
|
+
sig { params(dep: Dependabot::Dependency, old_req: Dependabot::DependencyRequirement).returns(Regexp) }
|
|
394
394
|
def table_declaration_regex(dep, old_req)
|
|
395
|
-
/tool\.poetry\.#{old_req
|
|
395
|
+
/tool\.poetry\.#{T.must(old_req.groups).first}\.#{escape(dep)}\](?:\r?\n).*?\s*version\s* =.*?(?:\r?\n)/m
|
|
396
396
|
end
|
|
397
397
|
|
|
398
398
|
sig { params(dep: Dependency).returns(String) }
|
|
@@ -410,7 +410,7 @@ module Dependabot
|
|
|
410
410
|
changed_requirements =
|
|
411
411
|
dependency.requirements - T.must(dependency.previous_requirements)
|
|
412
412
|
|
|
413
|
-
changed_requirements.any? { |f| f
|
|
413
|
+
changed_requirements.any? { |f| f.file == file.name }
|
|
414
414
|
end
|
|
415
415
|
|
|
416
416
|
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
|
|
|
@@ -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.392.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.392.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.392.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.392.0
|
|
327
327
|
rdoc_options: []
|
|
328
328
|
require_paths:
|
|
329
329
|
- lib
|