dependabot-uv 0.398.0 → 0.400.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f460c106ded2b40fb9c7e91e53baee1a2959a640e47bafaece6b43b0f112b022
4
- data.tar.gz: 281ce9fee19f90b0b703145445bb05c83d2cbc81eadbd3f3fb8eef3f07d79a0b
3
+ metadata.gz: f0641cd3de66cb0651830673fbcb78f65ce4f6b4a0c59dc5858d0ec52c024968
4
+ data.tar.gz: cea56c236a2c71bcf1c0fb6fc5a342631acb720925122241a2ee3405c68b32df
5
5
  SHA512:
6
- metadata.gz: 836cbb9770876a0f0c0f3c02d599cf0948739d7ad2ea12701f1cb78fcf1051b3f78364db63f46e4b4a12e2080d41a1797912e20803a1cbf201aa8ab857038314
7
- data.tar.gz: f3144802f8314d9998824fe31164dc4d47cb092eb7a8ed0764e221d455cf60301c37a76033c5cf963e919fe43514e9e33347c4c74eca10575514332583beeb5a
6
+ metadata.gz: ecb3617457c815151845b615f703004722a0014507130bb3598eb4a8802ec7c7fd5883aeb7efce467e8be91b3abc0895c73aa09b401098b0c9eaff55d021dc95
7
+ data.tar.gz: 0a1647d7b40b5297f3320c37ff7e61922f6bbe627fdf76fd2b55ad2215545600852c833cd7f31b2067a6f8d54b961609c4a2567216457e145696ec5504f00cb6
@@ -16,8 +16,8 @@ require "dependabot/uv/name_normaliser"
16
16
  require "dependabot/uv/requirements_file_matcher"
17
17
  require "dependabot/uv/language_version_manager"
18
18
  require "dependabot/uv/package_manager"
19
+ require "dependabot/uv/lockfile_document"
19
20
  require "dependabot/python/file_parser/pep_dependency"
20
- require "toml-rb"
21
21
 
22
22
  module Dependabot
23
23
  module Uv
@@ -199,15 +199,10 @@ module Dependabot
199
199
  dependency_set = DependencySet.new
200
200
 
201
201
  uv_lock_files.each do |file|
202
- lockfile_content = TomlRB.parse(file.content)
203
- packages = lockfile_content.fetch("package", [])
204
-
205
- packages.each do |package_data|
206
- next unless package_data.is_a?(Hash) && package_data["name"] && package_data["version"]
207
-
202
+ LockfileDocument.from_file(file).each_dependency do |package|
208
203
  dependency_set << Dependency.new(
209
- name: normalised_name(package_data["name"]),
210
- version: package_data["version"],
204
+ name: normalised_name(package.name),
205
+ version: package.version,
211
206
  requirements: [], # Lock files don't contain requirements
212
207
  package_manager: "uv"
213
208
  )
@@ -322,9 +322,19 @@ module Dependabot
322
322
  content = replace_header_with_original(updated_content, T.must(file.content))
323
323
  content = remove_new_warnings(content, T.must(file.content))
324
324
  content = update_hashes_if_required(content, T.must(file.content))
325
+ content = scrub_index_url_credentials(content)
325
326
  replace_absolute_file_paths(content, T.must(file.content))
326
327
  end
327
328
 
329
+ # Index URLs are passed to `uv pip compile` with credentials embedded so
330
+ # the private index can be fetched, and uv emits those URLs verbatim
331
+ # into the compiled file when `--emit-index-url` is active. Strip any
332
+ # userinfo so tokens are never written into the regenerated file.
333
+ sig { params(content: String).returns(String) }
334
+ def scrub_index_url_credentials(content)
335
+ content.gsub(%r{^(--(?:extra-)?index-url[= ]https?://)[^/\s]+@}, "\\1")
336
+ end
337
+
328
338
  sig { params(updated_content: String, original_content: String).returns(String) }
329
339
  def replace_header_with_original(updated_content, original_content)
330
340
  original_header_lines =
@@ -22,6 +22,11 @@ module Dependabot
22
22
  const :dev_dependencies, T::Array[String]
23
23
  end
24
24
 
25
+ class LockedPackage < T::ImmutableStruct
26
+ const :name, String
27
+ const :version, String
28
+ end
29
+
25
30
  sig { params(file: Dependabot::DependencyFile).returns(LockfileDocument) }
26
31
  def self.from_file(file)
27
32
  new(data: T.cast(TomlRB.parse(T.must(file.content)), Object), context: file.path)
@@ -62,6 +67,43 @@ module Dependabot
62
67
  end
63
68
  end
64
69
 
70
+ sig { params(block: T.proc.params(package: LockedPackage).void).void }
71
+ def each_dependency(&block)
72
+ # The file parser historically skips the pairs yielded by an object-shaped package section.
73
+ return if @data["package"].is_a?(Hash)
74
+
75
+ package_entries.each_with_index do |entry, index|
76
+ next unless entry.is_a?(Hash)
77
+
78
+ package = object_hash(entry)
79
+ name = package["name"]
80
+ version = package["version"]
81
+ next unless name && version
82
+
83
+ yield(LockedPackage.new(
84
+ name: string(name, "package[#{index}].name"),
85
+ version: string(version, "package[#{index}].version")
86
+ ))
87
+ end
88
+ end
89
+
90
+ sig { returns(T::Array[LockedPackage]) }
91
+ def resolution_packages
92
+ return [] if @data["package"].nil?
93
+
94
+ package_entries.each_with_index.filter_map do |entry, index|
95
+ # String#[] cannot produce a valid version from the "version" lookup.
96
+ next if entry.is_a?(String)
97
+
98
+ package = object_hash(entry)
99
+ name = optional_string(package["name"], "package[#{index}].name")
100
+ version = optional_string(package["version"], "package[#{index}].version")
101
+ next unless name && version
102
+
103
+ LockedPackage.new(name: name, version: version)
104
+ end
105
+ end
106
+
65
107
  private
66
108
 
67
109
  sig { returns(T::Array[Object]) }
@@ -89,6 +131,20 @@ module Dependabot
89
131
  value if value.is_a?(String)
90
132
  end
91
133
 
134
+ sig { params(value: Object, field: String).returns(T.nilable(String)) }
135
+ def optional_string(value, field)
136
+ return if value.nil?
137
+
138
+ string(value, field)
139
+ end
140
+
141
+ sig { params(value: Object, field: String).returns(String) }
142
+ def string(value, field)
143
+ return value if value.is_a?(String)
144
+
145
+ raise TypeError, "#{@context} #{field} must be a string"
146
+ end
147
+
92
148
  sig { params(entries: Object).returns(T::Array[String]) }
93
149
  def dependency_names(entries)
94
150
  return [] unless entries.is_a?(Array)
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "sorbet-runtime"
5
- require "toml-rb"
5
+ require "dependabot/uv/lockfile_document"
6
6
 
7
7
  require "dependabot/errors"
8
8
  require "dependabot/package/release_cooldown_options"
@@ -278,20 +278,13 @@ module Dependabot
278
278
  .returns(T::Array[Dependabot::Uv::Version])
279
279
  end
280
280
  def locked_versions(lockfile)
281
- parsed = T.cast(TomlRB.parse(T.must(lockfile.content)), T::Hash[String, Object])
282
- packages = T.cast(parsed["package"], T.nilable(T::Array[T::Hash[String, Object]])) || []
283
281
  dependency_name = NameNormaliser.normalise(dependency.name)
284
- versions = T.let([], T::Array[Dependabot::Uv::Version])
285
- packages.each do |package|
286
- package_name = T.cast(package["name"], T.nilable(String))
287
- package_version = T.cast(package["version"], T.nilable(String))
288
- next unless package_name && NameNormaliser.normalise(package_name) == dependency_name
289
- next unless Uv::Version.correct?(package_version)
290
-
291
- versions << Uv::Version.new(package_version)
292
- end
282
+ LockfileDocument.from_file(lockfile).resolution_packages.filter_map do |package|
283
+ next unless NameNormaliser.normalise(package.name) == dependency_name
284
+ next unless Uv::Version.correct?(package.version)
293
285
 
294
- versions
286
+ Uv::Version.new(package.version)
287
+ end
295
288
  end
296
289
 
297
290
  sig { returns(T.nilable(Dependabot::DependencyFile)) }
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.398.0
4
+ version: 0.400.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.398.0
18
+ version: 0.400.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.398.0
25
+ version: 0.400.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.398.0
32
+ version: 0.400.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.398.0
39
+ version: 0.400.0
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: debug
42
42
  requirement: !ruby/object:Gem::Requirement
@@ -302,7 +302,7 @@ licenses:
302
302
  - MIT
303
303
  metadata:
304
304
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
305
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.398.0
305
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.400.0
306
306
  rdoc_options: []
307
307
  require_paths:
308
308
  - lib