bibliothecary 12.1.3 → 12.1.5

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: b061a0f0ac234c87fb6821f0575ecb1f4fe7b9a217fdeec726cf5d9389a6264a
4
- data.tar.gz: f4479d3b94254de19b34f0e0773ef6fdd4459b7fe388fe80a1567686b70c2a34
3
+ metadata.gz: e8b70e5a827feb678f61dc5d2f3760be0b627ad948556ccb22dc74521df046c9
4
+ data.tar.gz: de4f2d64c252570088d1c223002d6942247c45a18f3382e88448338e097273e9
5
5
  SHA512:
6
- metadata.gz: 8ba28c715feabd5561329e72361c7b01aae12987ddd1bd338c77d31e079b220c2ec0f08e8d03ac9386c08196b3d77a4bd8a5b01a18bff1c432efcae9034d00b8
7
- data.tar.gz: 97d7c4fadc853771ca46a4a08da9d79c393d8c7048fc0dc867685115d632e0178fdc18fc6964e8aa9ad5c737d706ac4ba0ca0425ef7bdf483b9c8b6191d1ce98
6
+ metadata.gz: cda3bfcd8d209364d5d8c6fe5b062f308437863f6e09ec05e05f473c486a425c6e0d68eaed3a8a8716119db7cb1ce65ee0921c781f9bacb1e927dd5a17bc7d58
7
+ data.tar.gz: efacaa12ee9cb7e88b876b4ea8fabf48bfa72ff2da49c4ee637d98bf4ad0f80219d3ad106c5cdc49560557dca078304729592fc89b79a9082ae501446a1d4236
data/CHANGELOG.md CHANGED
@@ -13,6 +13,62 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
13
13
 
14
14
  ### Removed
15
15
 
16
+ ## [12.1.5] - 2025-03-17
17
+
18
+ ### Added
19
+
20
+ - Adds alias support for PNPM lockfiles.
21
+ - Add support for bun.lock files
22
+
23
+ ### Changed
24
+
25
+ ### Removed
26
+
27
+ ## [12.1.4] - 2025-03-14
28
+
29
+ ### Added
30
+
31
+ - Add support for PNPM lockfiles (lockfile versions 5, 6, and 9).
32
+ - Add 'parser_options' arg to Bilbiothecary::Runner constructor.
33
+
34
+ ### Changed
35
+
36
+ ### Removed
37
+
38
+ ## [12.1.3] - 2025-02-26
39
+
40
+ ### Added
41
+
42
+ - Add 'local' property to dependencies from Pipfile and Pipfile.lock
43
+
44
+ ### Changed
45
+
46
+ - Handle aliases and NPM and Yarn, and ignore patched dependencies.
47
+ - Fix a PyPI parser's regex to exclude false positive "require" names.
48
+ - Drop all sub-projects from list of deps in a Maven maven-dependency-tree.txt.
49
+
50
+ ### Removed
51
+
52
+ ## [12.1.2] - 2025-02-26
53
+
54
+ ### Added
55
+
56
+ - Add 'local' property to dependencies from Pipfile and Pipfile.lock
57
+
58
+ ### Changed
59
+
60
+ ### Removed
61
+
62
+ ## [12.1.1] - 2025-02-21
63
+
64
+ ### Added
65
+
66
+ - Add test coverage for Go 1.24's new "tool" directive.
67
+
68
+ ### Changed
69
+
70
+ ### Removed
71
+
16
72
  ## [12.1.0] - 2025-01-30
17
73
 
18
74
  ### Added
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  spec.add_dependency "commander"
25
25
  spec.add_dependency "deb_control"
26
+ spec.add_dependency "json", "~> 2.8"
26
27
  spec.add_dependency "librariesio-gem-parser"
27
28
  spec.add_dependency "ox", ">= 2.8.1"
28
29
  spec.add_dependency "packageurl-ruby"
@@ -16,10 +16,6 @@ module Bibliothecary
16
16
  kind: "manifest",
17
17
  parser: :parse_manifest,
18
18
  },
19
- match_filename("npm-shrinkwrap.json") => {
20
- kind: "lockfile",
21
- parser: :parse_shrinkwrap,
22
- },
23
19
  match_filename("yarn.lock") => {
24
20
  kind: "lockfile",
25
21
  parser: :parse_yarn_lock,
@@ -28,10 +24,22 @@ module Bibliothecary
28
24
  kind: "lockfile",
29
25
  parser: :parse_package_lock,
30
26
  },
27
+ match_filename("pnpm-lock.yaml") => {
28
+ kind: "lockfile",
29
+ parser: :parse_pnpm_lock,
30
+ },
31
31
  match_filename("npm-ls.json") => {
32
32
  kind: "lockfile",
33
33
  parser: :parse_ls,
34
34
  },
35
+ match_filename("npm-shrinkwrap.json") => {
36
+ kind: "lockfile",
37
+ parser: :parse_shrinkwrap,
38
+ },
39
+ match_filename("bun.lock") => {
40
+ kind: "lockfile",
41
+ parser: :parse_bun_lock,
42
+ },
35
43
  }
36
44
  end
37
45
 
@@ -248,12 +256,167 @@ module Bibliothecary
248
256
  end
249
257
  end
250
258
 
259
+ def self.parse_v5_pnpm_lock(parsed_contents, _source = nil)
260
+ dependency_mapping = parsed_contents.fetch("dependencies", {})
261
+ .merge(parsed_contents.fetch("devDependencies", {}))
262
+
263
+ parsed_contents["packages"]
264
+ .map do |name_version, details|
265
+ # e.g. "/debug/2.6.9:"
266
+ name, version = name_version.sub(/^\//, "").split("/", 2)
267
+
268
+ # e.g. "/debug/2.2.0_supports-color@1.2.0:"
269
+ version = version.split("_", 2)[0]
270
+
271
+ # e.g. "alias-package: /zod/3.24.2"
272
+ original_name = nil
273
+ original_requirement = nil
274
+ if (alias_dep = dependency_mapping.find { |_n, v| v.start_with?("/#{name}/") })
275
+ original_name = alias_dep[0]
276
+ original_requirement = alias_dep[1].split("/", 3)[2] # e.g. "/zod/3.24.2"
277
+ end
278
+
279
+ is_dev = details["dev"] == true
280
+
281
+ Dependency.new(
282
+ name: name,
283
+ requirement: version,
284
+ original_name: original_name,
285
+ original_requirement: original_requirement,
286
+ type: is_dev ? "development" : "runtime"
287
+ )
288
+ end
289
+ end
290
+
291
+ def self.parse_v6_pnpm_lock(parsed_contents, _source = nil)
292
+ dependency_mapping = parsed_contents.fetch("dependencies", {})
293
+ .merge(parsed_contents.fetch("devDependencies", {}))
294
+
295
+ parsed_contents["packages"]
296
+ .map do |name_version, details|
297
+ # e.g. "/debug@2.6.9:"
298
+ name, version = name_version.sub(/^\//, "").split("@", 2)
299
+
300
+ # e.g. "debug@2.2.0(supports-color@1.2.0)"
301
+ version = version.split("(", 2).first
302
+
303
+ # e.g.
304
+ # alias-package:
305
+ # specifier: npm:zod
306
+ # version: /zod@3.24.2
307
+ original_name = nil
308
+ original_requirement = nil
309
+ if (alias_dep = dependency_mapping.find { |_n, info| info["specifier"] == "npm:#{name}" })
310
+ original_name = alias_dep[0]
311
+ original_requirement = alias_dep[1]["version"].sub(/^\//, "").split("@", 2)[1]
312
+ end
313
+
314
+ is_dev = details["dev"] == true
315
+
316
+ Dependency.new(
317
+ name: name,
318
+ requirement: version,
319
+ original_name: original_name,
320
+ original_requirement: original_requirement,
321
+ type: is_dev ? "development" : "runtime"
322
+ )
323
+ end
324
+ end
325
+
326
+ def self.parse_v9_pnpm_lock(parsed_contents, _source = nil)
327
+ dependencies = parsed_contents.fetch("importers", {}).fetch(".", {}).fetch("dependencies")
328
+ dev_dependencies = parsed_contents.fetch("importers", {}).fetch(".", {}).fetch("devDependencies")
329
+ dependency_mapping = dependencies.merge(dev_dependencies)
330
+
331
+ # "dependencies" is in "packages" for < v9 and in "snapshots" for >= v9
332
+ # as of https://github.com/pnpm/pnpm/pull/7700.
333
+ parsed_contents["snapshots"]
334
+ .map do |name_version, _details|
335
+ # e.g. "debug@2.6.9:"
336
+ name, version = name_version.split("@", 2)
337
+
338
+ # e.g. "debug@2.2.0(supports-color@1.2.0)"
339
+ version = version.split("(", 2).first
340
+
341
+ # e.g.
342
+ # alias-package:
343
+ # specifier: npm:zod
344
+ # version: zod@3.24.2
345
+ original_name = nil
346
+ original_requirement = nil
347
+ if (alias_dep = dependency_mapping.find { |_n, info| info["specifier"] == "npm:#{name}" })
348
+ original_name = alias_dep[0]
349
+ original_requirement = alias_dep[1]["version"].split("@", 2)[1]
350
+ end
351
+
352
+ # TODO: the "dev" field was removed in v9 lockfiles (https://github.com/pnpm/pnpm/pull/7808)
353
+ # The proper way to set this for v9+ is to build a lookup of deps to
354
+ # their "dependencies", and then recurse through each package's
355
+ # parents. If the direct dep(s) that required them are all
356
+ # "devDependencies" then we can consider them "dev == true". This
357
+ # should be done using a DAG data structure, though, to be efficient
358
+ # and avoid cycles.
359
+ is_dev ||= dev_dependencies.any? do |dev_name, dev_details|
360
+ dev_name == name && dev_details["version"] == version
361
+ end
362
+
363
+ Dependency.new(
364
+ name: name,
365
+ requirement: version,
366
+ original_name: original_name,
367
+ original_requirement: original_requirement,
368
+ type: is_dev ? "development" : "runtime"
369
+ )
370
+ end
371
+ end
372
+
373
+ # This method currently has been tested to support:
374
+ # lockfileVersion: '9.0'
375
+ # lockfileVersion: '6.0'
376
+ # lockfileVersion: '5.4'
377
+ def self.parse_pnpm_lock(contents, _source = nil)
378
+ parsed = YAML.load(contents)
379
+ lockfile_version = parsed["lockfileVersion"].to_i
380
+
381
+ case lockfile_version
382
+ when 5
383
+ parse_v5_pnpm_lock(parsed)
384
+ when 6
385
+ parse_v6_pnpm_lock(parsed)
386
+ else # v9+
387
+ parse_v9_pnpm_lock(parsed)
388
+ end
389
+ end
390
+
251
391
  def self.parse_ls(file_contents, options: {})
252
392
  manifest = JSON.parse(file_contents)
253
393
 
254
394
  transform_tree_to_array(manifest.fetch("dependencies", {}), options.fetch(:filename, nil))
255
395
  end
256
396
 
397
+ def self.parse_bun_lock(file_contents, options: {})
398
+ manifest = JSON.parse(file_contents, allow_trailing_comma: true)
399
+ source = options.fetch(:filename, nil)
400
+
401
+ dev_deps = manifest.dig("workspaces", "", "devDependencies")&.keys&.to_set
402
+
403
+ manifest.fetch("packages", []).map do |name, info|
404
+ info_name, _, version = info.first.rpartition("@")
405
+ is_local = version&.start_with?("file:")
406
+ is_alias = info_name != name
407
+
408
+ Dependency.new(
409
+ name: info_name,
410
+ original_name: is_alias ? name : nil,
411
+ requirement: version,
412
+ original_requirement: is_alias ? version : nil,
413
+ type: dev_deps&.include?(name) ? "development" : "runtime",
414
+ local: is_local,
415
+ source: source
416
+ )
417
+ end
418
+ end
419
+
257
420
  def self.lockfile_preference_order(file_infos)
258
421
  files = file_infos.each_with_object({}) do |file_info, obj|
259
422
  obj[File.basename(file_info.full_path)] = file_info
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Bibliothecary
4
- VERSION = "12.1.3"
4
+ VERSION = "12.1.5"
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bibliothecary
3
3
  version: !ruby/object:Gem::Version
4
- version: 12.1.3
4
+ version: 12.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Nesbitt
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-03-14 00:00:00.000000000 Z
10
+ date: 2025-03-18 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: commander
@@ -37,6 +37,20 @@ dependencies:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: json
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.8'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.8'
40
54
  - !ruby/object:Gem::Dependency
41
55
  name: librariesio-gem-parser
42
56
  requirement: !ruby/object:Gem::Requirement