dependabot-uv 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/uv/file_fetcher/workspace_fetcher.rb +2 -2
- data/lib/dependabot/uv/file_fetcher.rb +6 -6
- data/lib/dependabot/uv/file_parser/pyproject_files_parser.rb +47 -1
- data/lib/dependabot/uv/file_updater/compile_file_updater.rb +11 -11
- data/lib/dependabot/uv/file_updater/lock_file_updater.rb +9 -9
- data/lib/dependabot/uv/update_checker/pip_compile_version_resolver.rb +4 -4
- data/lib/dependabot/uv/update_checker.rb +6 -29
- metadata +6 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b0b2c86fecd6361c11d682fd96da7135b08179f251f7a524d045824341ccbe9e
|
|
4
|
+
data.tar.gz: df43361f2dd0a76a17da2a6ea510086da7adadbe859d1d91975be7ebe84a61bc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3117ccb8929d12b1caff2b31607e8b459fbb61008495f3f9c5b195e7d4b888cabd0d2b47de2535d130660db0b4fe51fc2aede86b856bcd237d5f3e2eb20da37b
|
|
7
|
+
data.tar.gz: 162286da713782ed33c25c4fcea096c4365edcf219ad4da6bb93812fd64792a569e92e86b3c20d4f8814f10f141b1bf010ba0c3cf44a3c6e553c814e1006aad2
|
data/helpers/requirements.txt
CHANGED
|
@@ -277,8 +277,8 @@ module Dependabot
|
|
|
277
277
|
normalized_directory = directory.gsub(%r{(^/|/$)}, "")
|
|
278
278
|
|
|
279
279
|
repo_contents(dir: base_dir, raise_errors: false)
|
|
280
|
-
.select { |file|
|
|
281
|
-
.map { |
|
|
280
|
+
.select { |file| file.type == "dir" }
|
|
281
|
+
.map { |file| file.path.gsub(%r{^/?#{Regexp.escape(normalized_directory)}/?}, "") }
|
|
282
282
|
end
|
|
283
283
|
|
|
284
284
|
sig { params(paths: T::Array[String], pattern: String).returns(T::Array[String]) }
|
|
@@ -276,7 +276,7 @@ module Dependabot
|
|
|
276
276
|
def req_files_for_dir(requirements_dir)
|
|
277
277
|
dir = directory.gsub(%r{(^/|/$)}, "")
|
|
278
278
|
relative_reqs_dir =
|
|
279
|
-
requirements_dir.path
|
|
279
|
+
requirements_dir.path.gsub(%r{^/?#{Regexp.escape(dir)}/?}, "")
|
|
280
280
|
|
|
281
281
|
fetch_requirement_files_from_path(relative_reqs_dir)
|
|
282
282
|
end
|
|
@@ -321,7 +321,7 @@ module Dependabot
|
|
|
321
321
|
sig { returns(T::Array[Dependabot::DependencyFile]) }
|
|
322
322
|
def fetch_requirement_files_from_dirs
|
|
323
323
|
repo_contents
|
|
324
|
-
.select { |f|
|
|
324
|
+
.select { |f| f.type == "dir" }
|
|
325
325
|
.flat_map { |dir| req_files_for_dir(dir) }
|
|
326
326
|
end
|
|
327
327
|
|
|
@@ -333,10 +333,10 @@ module Dependabot
|
|
|
333
333
|
end
|
|
334
334
|
def filter_requirement_files(contents, base_path: nil)
|
|
335
335
|
contents
|
|
336
|
-
.select { |f|
|
|
337
|
-
.select { |f| file_matches_requirement_pattern?(
|
|
338
|
-
.reject { |f|
|
|
339
|
-
.map { |f| fetch_file_with_path(
|
|
336
|
+
.select { |f| f.type == "file" }
|
|
337
|
+
.select { |f| file_matches_requirement_pattern?(f.name) }
|
|
338
|
+
.reject { |f| f.size > MAX_FILE_SIZE }
|
|
339
|
+
.map { |f| fetch_file_with_path(f.name, base_path) }
|
|
340
340
|
.select { |f| T.must(REQUIREMENT_FILE_PATTERNS[:filenames]).include?(f.name) || requirements_file?(f) }
|
|
341
341
|
end
|
|
342
342
|
|
|
@@ -109,7 +109,53 @@ module Dependabot
|
|
|
109
109
|
|
|
110
110
|
sig { returns(T::Array[Dependabot::DependencyFile]) }
|
|
111
111
|
def workspace_member_pyproject_files
|
|
112
|
-
|
|
112
|
+
return [] if workspace_member_patterns.empty?
|
|
113
|
+
|
|
114
|
+
dependency_files.select do |file|
|
|
115
|
+
next false unless file.support_file? && file.name.end_with?("pyproject.toml")
|
|
116
|
+
|
|
117
|
+
workspace_member_file?(file)
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Only pyprojects declared under `[tool.uv.workspace].members` in the root
|
|
122
|
+
# manifest are true workspace members whose requirements should be updated.
|
|
123
|
+
# Editable `[tool.uv.sources]` path dependencies are separate packages that
|
|
124
|
+
# are fetched as support files for resolution but must not be modified.
|
|
125
|
+
sig { returns(T::Array[String]) }
|
|
126
|
+
def workspace_member_patterns
|
|
127
|
+
workspace_globs("members")
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# uv removes paths matching `[tool.uv.workspace].exclude` after expanding
|
|
131
|
+
# `members`, so an excluded directory is not a workspace member even when it
|
|
132
|
+
# matches a `members` glob.
|
|
133
|
+
sig { returns(T::Array[String]) }
|
|
134
|
+
def workspace_exclude_patterns
|
|
135
|
+
workspace_globs("exclude")
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
sig { params(key: String).returns(T::Array[String]) }
|
|
139
|
+
def workspace_globs(key)
|
|
140
|
+
return [] unless pyproject
|
|
141
|
+
|
|
142
|
+
globs = parsed_pyproject.dig("tool", "uv", "workspace", key)
|
|
143
|
+
globs.is_a?(Array) ? globs.grep(String) : []
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
sig { params(file: Dependabot::DependencyFile).returns(T::Boolean) }
|
|
147
|
+
def workspace_member_file?(file)
|
|
148
|
+
member_dir = File.dirname(file.name)
|
|
149
|
+
|
|
150
|
+
return false if workspace_exclude_patterns.any? { |pattern| glob_matches_dir?(pattern, member_dir) }
|
|
151
|
+
|
|
152
|
+
workspace_member_patterns.any? { |pattern| glob_matches_dir?(pattern, member_dir) }
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
sig { params(pattern: String, dir: String).returns(T::Boolean) }
|
|
156
|
+
def glob_matches_dir?(pattern, dir)
|
|
157
|
+
normalized_pattern = pattern.gsub(%r{^\./}, "").chomp("/")
|
|
158
|
+
File.fnmatch?(normalized_pattern, dir, File::FNM_PATHNAME)
|
|
113
159
|
end
|
|
114
160
|
|
|
115
161
|
sig { returns(Dependabot::FileParsers::Base::DependencySet) }
|
|
@@ -178,9 +178,9 @@ module Dependabot
|
|
|
178
178
|
def update_uncompiled_files(updated_files)
|
|
179
179
|
updated_filenames = updated_files.map(&:name)
|
|
180
180
|
all_old_reqs = T.must(dependency).previous_requirements
|
|
181
|
-
old_reqs = T.must(all_old_reqs).reject { |r| updated_filenames.include?(r
|
|
181
|
+
old_reqs = T.must(all_old_reqs).reject { |r| updated_filenames.include?(r.file) }
|
|
182
182
|
all_new_reqs = T.must(dependency).requirements
|
|
183
|
-
new_reqs = all_new_reqs.reject { |r| updated_filenames.include?(r
|
|
183
|
+
new_reqs = all_new_reqs.reject { |r| updated_filenames.include?(r.file) }
|
|
184
184
|
|
|
185
185
|
return [] if new_reqs.none?
|
|
186
186
|
|
|
@@ -283,15 +283,15 @@ module Dependabot
|
|
|
283
283
|
return file.content unless file.name.end_with?(".in")
|
|
284
284
|
|
|
285
285
|
old_req = T.must(dependency).previous_requirements
|
|
286
|
-
old_req = old_req&.find { |r| r
|
|
286
|
+
old_req = old_req&.find { |r| r.file == file.name }
|
|
287
287
|
|
|
288
288
|
return file.content unless old_req
|
|
289
|
-
return file.content if old_req == "==#{T.must(dependency).version}"
|
|
289
|
+
return file.content if old_req.requirement_string == "==#{T.must(dependency).version}"
|
|
290
290
|
|
|
291
291
|
RequirementReplacer.new(
|
|
292
292
|
content: T.must(file.content),
|
|
293
293
|
dependency_name: T.must(dependency).name,
|
|
294
|
-
old_requirement: old_req
|
|
294
|
+
old_requirement: old_req.requirement_string,
|
|
295
295
|
new_requirement: "==#{T.must(dependency).version}",
|
|
296
296
|
index_urls: @index_urls
|
|
297
297
|
).updated_content
|
|
@@ -302,17 +302,17 @@ module Dependabot
|
|
|
302
302
|
return file.content unless file.name.end_with?(".in")
|
|
303
303
|
|
|
304
304
|
old_req = T.must(dependency).previous_requirements
|
|
305
|
-
old_req = old_req&.find { |r| r
|
|
305
|
+
old_req = old_req&.find { |r| r.file == file.name }
|
|
306
306
|
new_req = T.must(dependency).requirements
|
|
307
|
-
new_req = new_req.find { |r| r
|
|
308
|
-
return file.content unless old_req&.
|
|
307
|
+
new_req = new_req.find { |r| r.file == file.name }
|
|
308
|
+
return file.content unless old_req&.requirement_string
|
|
309
309
|
return file.content if old_req == new_req
|
|
310
310
|
|
|
311
311
|
RequirementReplacer.new(
|
|
312
312
|
content: T.must(file.content),
|
|
313
313
|
dependency_name: T.must(dependency).name,
|
|
314
|
-
old_requirement: old_req
|
|
315
|
-
new_requirement: T.must(new_req)
|
|
314
|
+
old_requirement: old_req.requirement_string,
|
|
315
|
+
new_requirement: T.must(T.must(new_req).requirement_string),
|
|
316
316
|
index_urls: @index_urls
|
|
317
317
|
).updated_content
|
|
318
318
|
end
|
|
@@ -547,7 +547,7 @@ module Dependabot
|
|
|
547
547
|
def filenames_to_compile
|
|
548
548
|
files_from_reqs =
|
|
549
549
|
T.must(dependency).requirements
|
|
550
|
-
.
|
|
550
|
+
.filter_map(&:file)
|
|
551
551
|
.select { |fn| fn.end_with?(".in") }
|
|
552
552
|
|
|
553
553
|
files_from_compiled_files =
|
|
@@ -84,7 +84,7 @@ module Dependabot
|
|
|
84
84
|
def build_system_only_dependency?
|
|
85
85
|
return false unless dependency
|
|
86
86
|
|
|
87
|
-
groups = T.must(dependency).requirements.flat_map { |req| req
|
|
87
|
+
groups = T.must(dependency).requirements.flat_map { |req| req.groups || [] }.compact.uniq
|
|
88
88
|
return false if groups.empty?
|
|
89
89
|
|
|
90
90
|
groups.all?("build-system")
|
|
@@ -133,7 +133,7 @@ module Dependabot
|
|
|
133
133
|
updated_content = content.dup
|
|
134
134
|
|
|
135
135
|
T.must(dependency).requirements.zip(T.must(T.must(dependency).previous_requirements)).each do |new_r, old_r|
|
|
136
|
-
next unless new_r
|
|
136
|
+
next unless new_r.file == file.name && T.must(old_r).file == file.name
|
|
137
137
|
|
|
138
138
|
updated_content = replace_dep(T.must(dependency), updated_content, new_r, T.must(old_r))
|
|
139
139
|
end
|
|
@@ -147,13 +147,13 @@ module Dependabot
|
|
|
147
147
|
params(
|
|
148
148
|
dep: Dependabot::Dependency,
|
|
149
149
|
content: String,
|
|
150
|
-
new_r:
|
|
151
|
-
old_r:
|
|
150
|
+
new_r: Dependabot::DependencyRequirement,
|
|
151
|
+
old_r: Dependabot::DependencyRequirement
|
|
152
152
|
).returns(String)
|
|
153
153
|
end
|
|
154
154
|
def replace_dep(dep, content, new_r, old_r)
|
|
155
|
-
new_req = new_r
|
|
156
|
-
old_req = old_r
|
|
155
|
+
new_req = new_r.requirement_string
|
|
156
|
+
old_req = old_r.requirement_string
|
|
157
157
|
escaped_name = escape_package_name(dep.name)
|
|
158
158
|
|
|
159
159
|
regex = /(["']#{escaped_name})([^"']+)(["'])/x
|
|
@@ -634,7 +634,7 @@ module Dependabot
|
|
|
634
634
|
return false unless file
|
|
635
635
|
|
|
636
636
|
dependencies.any? do |dep|
|
|
637
|
-
dep.requirements.any? { |r| r
|
|
637
|
+
dep.requirements.any? { |r| r.file == file.name } &&
|
|
638
638
|
requirement_changed?(file, dep)
|
|
639
639
|
end
|
|
640
640
|
end
|
|
@@ -647,7 +647,7 @@ module Dependabot
|
|
|
647
647
|
changed_requirements =
|
|
648
648
|
dependency.requirements - T.must(dependency.previous_requirements)
|
|
649
649
|
|
|
650
|
-
changed_requirements.any? { |f| f
|
|
650
|
+
changed_requirements.any? { |f| f.file == T.must(file).name }
|
|
651
651
|
end
|
|
652
652
|
|
|
653
653
|
sig { params(file: Dependabot::DependencyFile, content: String).returns(Dependabot::DependencyFile) }
|
|
@@ -719,7 +719,7 @@ module Dependabot
|
|
|
719
719
|
def create_or_update_lock_file?
|
|
720
720
|
return true if lockfile && T.must(dependency).requirements.empty?
|
|
721
721
|
|
|
722
|
-
T.must(dependency).requirements.any? {
|
|
722
|
+
T.must(dependency).requirements.any? { |req| req.file&.end_with?(*REQUIRED_FILES) }
|
|
723
723
|
end
|
|
724
724
|
|
|
725
725
|
sig { returns(T::Hash[String, String]) }
|
|
@@ -409,14 +409,14 @@ module Dependabot
|
|
|
409
409
|
def update_req_file(file, updated_req)
|
|
410
410
|
return T.must(file.content) unless file.name.end_with?(".in")
|
|
411
411
|
|
|
412
|
-
req = dependency.requirements.find { |r| r
|
|
412
|
+
req = dependency.requirements.find { |r| r.file == file.name }
|
|
413
413
|
|
|
414
|
-
return T.must(file.content) + "\n#{dependency.name} #{updated_req}" unless req&.
|
|
414
|
+
return T.must(file.content) + "\n#{dependency.name} #{updated_req}" unless req&.requirement_string
|
|
415
415
|
|
|
416
416
|
Uv::FileUpdater::RequirementReplacer.new(
|
|
417
417
|
content: T.must(file.content),
|
|
418
418
|
dependency_name: dependency.name,
|
|
419
|
-
old_requirement: req
|
|
419
|
+
old_requirement: req.requirement_string,
|
|
420
420
|
new_requirement: updated_req
|
|
421
421
|
).updated_content
|
|
422
422
|
end
|
|
@@ -454,7 +454,7 @@ module Dependabot
|
|
|
454
454
|
def filenames_to_compile
|
|
455
455
|
files_from_reqs =
|
|
456
456
|
dependency.requirements
|
|
457
|
-
.
|
|
457
|
+
.filter_map(&:file)
|
|
458
458
|
.select { |fn| fn.end_with?(".in") }
|
|
459
459
|
|
|
460
460
|
files_from_compiled_files =
|
|
@@ -98,10 +98,9 @@ module Dependabot
|
|
|
98
98
|
raise "Claimed to be a sub-dependency, but no lockfile exists!"
|
|
99
99
|
end
|
|
100
100
|
|
|
101
|
-
sig { override.params(reqs: T::Array[
|
|
101
|
+
sig { override.params(reqs: T::Array[Dependabot::DependencyRequirement]).returns(T::Boolean) }
|
|
102
102
|
def exact_requirement?(reqs)
|
|
103
|
-
reqs = reqs.
|
|
104
|
-
reqs = reqs.compact
|
|
103
|
+
reqs = reqs.filter_map(&:requirement_string)
|
|
105
104
|
reqs = reqs.flat_map { |r| r.split(",").map(&:strip) }
|
|
106
105
|
reqs.any? { |r| Uv::Requirement.new(r).exact? }
|
|
107
106
|
end
|
|
@@ -157,12 +156,13 @@ module Dependabot
|
|
|
157
156
|
return if reqs.none?
|
|
158
157
|
|
|
159
158
|
requirement = reqs.find do |r|
|
|
160
|
-
file = r
|
|
159
|
+
file = r.file
|
|
160
|
+
next false unless file
|
|
161
161
|
|
|
162
162
|
file == "uv.lock" || file.end_with?("pyproject.toml") || file.end_with?(".in") || file.end_with?(".txt")
|
|
163
163
|
end
|
|
164
164
|
|
|
165
|
-
requirement&.
|
|
165
|
+
requirement&.requirement_string
|
|
166
166
|
end
|
|
167
167
|
|
|
168
168
|
sig { override.returns(String) }
|
|
@@ -187,7 +187,7 @@ module Dependabot
|
|
|
187
187
|
return ">=#{dependency.version}" if dependency.version
|
|
188
188
|
|
|
189
189
|
version_for_requirement =
|
|
190
|
-
requirements.filter_map
|
|
190
|
+
requirements.filter_map(&:requirement_string)
|
|
191
191
|
.reject { |req_string| req_string.start_with?("<") }
|
|
192
192
|
.select { |req_string| req_string.match?(VERSION_REGEX) }
|
|
193
193
|
.map { |req_string| req_string.match(VERSION_REGEX).to_s }
|
|
@@ -213,29 +213,6 @@ module Dependabot
|
|
|
213
213
|
)
|
|
214
214
|
end
|
|
215
215
|
|
|
216
|
-
sig { override.returns(T::Boolean) }
|
|
217
|
-
def library?
|
|
218
|
-
return false unless updating_pyproject?
|
|
219
|
-
return false unless library_details
|
|
220
|
-
|
|
221
|
-
return false if T.must(library_details)["name"].nil?
|
|
222
|
-
|
|
223
|
-
# Hit PyPi and check whether there are details for a library with a
|
|
224
|
-
# matching name and description
|
|
225
|
-
index_response = Dependabot::RegistryClient.get(
|
|
226
|
-
url: "https://pypi.org/pypi/#{normalised_name(T.must(library_details)['name'])}/json/"
|
|
227
|
-
)
|
|
228
|
-
|
|
229
|
-
return false unless index_response.status == 200
|
|
230
|
-
|
|
231
|
-
pypi_info = JSON.parse(index_response.body)["info"] || {}
|
|
232
|
-
pypi_info["summary"] == T.must(library_details)["description"]
|
|
233
|
-
rescue Excon::Error::Timeout, Excon::Error::Socket
|
|
234
|
-
false
|
|
235
|
-
rescue URI::InvalidURIError
|
|
236
|
-
false
|
|
237
|
-
end
|
|
238
|
-
|
|
239
216
|
sig { returns(T::Boolean) }
|
|
240
217
|
def updating_pyproject?
|
|
241
218
|
requirement_files.any? { |file| file.end_with?("pyproject.toml") }
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dependabot-uv
|
|
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,28 +15,28 @@ 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: dependabot-python
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
29
29
|
requirements:
|
|
30
30
|
- - '='
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: 0.
|
|
32
|
+
version: 0.393.0
|
|
33
33
|
type: :runtime
|
|
34
34
|
prerelease: false
|
|
35
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
36
36
|
requirements:
|
|
37
37
|
- - '='
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: 0.
|
|
39
|
+
version: 0.393.0
|
|
40
40
|
- !ruby/object:Gem::Dependency
|
|
41
41
|
name: debug
|
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -301,7 +301,7 @@ licenses:
|
|
|
301
301
|
- MIT
|
|
302
302
|
metadata:
|
|
303
303
|
bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
|
|
304
|
-
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.
|
|
304
|
+
changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.393.0
|
|
305
305
|
rdoc_options: []
|
|
306
306
|
require_paths:
|
|
307
307
|
- lib
|