bibliothecary 8.5.1 → 8.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 28eee333f0558f68657092d126ca5465eddbba371f1ad189a3007d4b43915063
4
- data.tar.gz: 91cb04d35a821cd7a8af93688a7db430d445f37f805493f379c2eeccddca5f74
3
+ metadata.gz: 339163151e8113f056a34e7089bcd5e68d0629cdd45b0109b40087974dd0efa4
4
+ data.tar.gz: 0bd35f6a15d412e7625268e41de4122a352a08c5def052a4bdd54efcaede8dba
5
5
  SHA512:
6
- metadata.gz: 8286430aba8f90efd0fc73b63f1fe31f57a7aa3759f88613fdecced517ad98a12a2ce62032bab0919c94f125c84953a71ba3862533a4a2e410ec11d1e4cf4a99
7
- data.tar.gz: 310fa03c90fca4ee65fb46b2fb78b9f9276b082adeada8a4536cd9357441c7f33c54cbf016cd087a7b7c5f0b6517664ed8107d92cbe730e57538888e2e778fe6
6
+ metadata.gz: 0f6ef41d068ddab930d57d22beb60cb8bdc1543de2429ed5d4e13a3ded544cc8dec1374798c2d5a432d610ed6a5612578996940c793d869795bb0c35ad6ebad5
7
+ data.tar.gz: dff39cdf5dc7b28de5343ad45a1b095336cdcdeb92224855b47abd112f61d0ff6d861367fe8c84fe546ce4a1c7e94fdd2b84cb7c3d841e6057a52db227bff194
@@ -14,6 +14,9 @@ module Bibliothecary
14
14
  MANIFEST_REGEXP = /.*require[^\/]*(\/)?[^\/]*\.(txt|pip|in)$/
15
15
  PIP_COMPILE_REGEXP = /.*require.*$/
16
16
 
17
+ # Adapted from https://peps.python.org/pep-0508/#names
18
+ PEP_508_NAME_REGEX = /^([A-Z0-9][A-Z0-9._-]*[A-Z0-9]|[A-Z0-9])/i
19
+
17
20
  def self.mapping
18
21
  {
19
22
  match_filenames('requirements-dev.txt', 'requirements/dev.txt',
@@ -56,7 +59,7 @@ module Bibliothecary
56
59
  },
57
60
  match_filename("pyproject.toml") => {
58
61
  kind: 'manifest',
59
- parser: :parse_poetry
62
+ parser: :parse_pyproject
60
63
  },
61
64
  match_filename("poetry.lock") => {
62
65
  kind: 'lockfile',
@@ -90,9 +93,30 @@ module Bibliothecary
90
93
  map_dependencies(manifest['packages'], 'runtime') + map_dependencies(manifest['dev-packages'], 'develop')
91
94
  end
92
95
 
96
+ def self.parse_pyproject(file_contents, options: {})
97
+ deps = []
98
+
99
+ file_contents = Tomlrb.parse(file_contents)
100
+
101
+ # Parse poetry [tool.poetry] deps
102
+ poetry_manifest = file_contents.fetch('tool', {}).fetch('poetry', {})
103
+ deps += map_dependencies(poetry_manifest['dependencies'], 'runtime')
104
+ deps += map_dependencies(poetry_manifest['dev-dependencies'], 'develop')
105
+
106
+ # Parse PEP621 [project] deps
107
+ pep621_manifest = file_contents.fetch('project', {})
108
+ pep621_deps = pep621_manifest.fetch('dependencies', []).map { |d| parse_pep_508_dep_spec(d) }
109
+ deps += map_dependencies(pep621_deps, 'runtime')
110
+
111
+ # We're combining both poetry+PEP621 deps instead of making them mutually exclusive, until we
112
+ # find a reason not to ingest them both.
113
+ deps.uniq
114
+ end
115
+
116
+ # TODO: this was deprecated in 8.6.0. Remove this in any major version bump >= 9.*
93
117
  def self.parse_poetry(file_contents, options: {})
94
- manifest = Tomlrb.parse(file_contents).fetch('tool', {}).fetch('poetry', {})
95
- map_dependencies(manifest['dependencies'], 'runtime') + map_dependencies(manifest['dev-dependencies'], 'develop')
118
+ puts "Warning: parse_poetry() is deprecated, use parse_pyproject() instead."
119
+ parse_pyproject(file_contents, options)
96
120
  end
97
121
 
98
122
  def self.parse_conda(file_contents, options: {})
@@ -252,6 +276,15 @@ module Bibliothecary
252
276
  # parsing after we match.
253
277
  false
254
278
  end
279
+
280
+ # Simply parses out the name of a PEP 508 Dependency specification: https://peps.python.org/pep-0508/
281
+ # Leaves the rest as-is with any leading semicolons or spaces stripped
282
+ def self.parse_pep_508_dep_spec(dep)
283
+ name, requirement = dep.split(PEP_508_NAME_REGEX, 2).last(2).map(&:strip)
284
+ requirement = requirement.sub(/^[\s;]*/, "")
285
+ requirement = "*" if requirement == ""
286
+ return name, requirement
287
+ end
255
288
  end
256
289
  end
257
290
  end
@@ -8,6 +8,7 @@ module Bibliothecary
8
8
 
9
9
  NAME_VERSION = '(?! )(.*?)(?: \(([^-]*)(?:-(.*))?\))?'.freeze
10
10
  NAME_VERSION_4 = /^ {4}#{NAME_VERSION}$/
11
+ BUNDLED_WITH = /BUNDLED WITH/
11
12
 
12
13
  def self.mapping
13
14
  {
@@ -35,14 +36,20 @@ module Bibliothecary
35
36
  def self.parse_gemfile_lock(file_contents, options: {})
36
37
  file_contents.lines(chomp: true).map do |line|
37
38
  match = line.match(NAME_VERSION_4)
38
- next unless match
39
- name = match[1]
40
- version = match[2].gsub(/\(|\)/,'')
41
- {
42
- name: name,
43
- requirement: version,
44
- type: 'runtime'
45
- }
39
+ bundler_match = line.match(BUNDLED_WITH)
40
+ next unless match || bundler_match
41
+
42
+ if match
43
+ name = match[1]
44
+ version = match[2].gsub(/\(|\)/,'')
45
+ {
46
+ name: name,
47
+ requirement: version,
48
+ type: 'runtime'
49
+ }
50
+ else
51
+ parse_bundler(file_contents)
52
+ end
46
53
  end.compact
47
54
  end
48
55
 
@@ -55,6 +62,19 @@ module Bibliothecary
55
62
  manifest = Gemnasium::Parser.send(:gemspec, file_contents)
56
63
  parse_ruby_manifest(manifest)
57
64
  end
65
+
66
+ def self.parse_bundler(file_contents)
67
+ bundled_with_index = file_contents.lines(chomp: true).find_index { |line| line.match(BUNDLED_WITH) }
68
+ version = file_contents.lines(chomp: true).fetch(bundled_with_index + 1)&.strip
69
+
70
+ return nil unless version
71
+
72
+ {
73
+ name: 'bundler',
74
+ requirement: version,
75
+ type: 'runtime'
76
+ }
77
+ end
58
78
  end
59
79
  end
60
80
  end
@@ -1,3 +1,3 @@
1
1
  module Bibliothecary
2
- VERSION = "8.5.1"
2
+ VERSION = "8.6.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bibliothecary
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.5.1
4
+ version: 8.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Nesbitt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-18 00:00:00.000000000 Z
11
+ date: 2023-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tomlrb
@@ -339,7 +339,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
339
339
  - !ruby/object:Gem::Version
340
340
  version: '0'
341
341
  requirements: []
342
- rubygems_version: 3.3.22
342
+ rubygems_version: 3.1.6
343
343
  signing_key:
344
344
  specification_version: 4
345
345
  summary: Find and parse manifests