bibliothecary 15.2.1 → 15.3.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/CHANGELOG.md +10 -0
- data/lib/bibliothecary/parsers/maven.rb +75 -68
- data/lib/bibliothecary/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1c856b89f10d42290894679e20641f18ba61f5929f3c3d86b3c43d66ae0c50ba
|
|
4
|
+
data.tar.gz: d76b5df4cb31982f2045338a693639e733331c557f6516ad060045f9f4a499f5
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 949ac2408b25189052b10b1c2be9c66a73fca42134f4d47eb711b52061ef5625b1263ccdc3373bb815f327e3699d021210af2214ac85be84ec580c7dc95b957e
|
|
7
|
+
data.tar.gz: a62f39651879069a6d1ae6aed2506704af55f7296e3a5ba49ffceec08296598994448efc82d4d1bc356dc0e3f8bfda20d78f0798d909afc24461438552e583fa
|
data/CHANGELOG.md
CHANGED
|
@@ -13,6 +13,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
13
13
|
|
|
14
14
|
### Removed
|
|
15
15
|
|
|
16
|
+
## [15.3.0]
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- Return the leading ":" with Gradle project names from gradle-dependencies-q.txt, and use "0.0.0" for a version instead of "*" since this is a lockfie.
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- Adds a new Bibliothecary::Parsers::Maven.parse_resolved_gradle_dep_line() method for parsing a single line in gradle-dependencies-q.txt, and optimize it a bit.
|
|
25
|
+
|
|
16
26
|
## [15.2.1]
|
|
17
27
|
|
|
18
28
|
### Changed
|
|
@@ -24,12 +24,12 @@ module Bibliothecary
|
|
|
24
24
|
GRADLE_ARROW_REGEXP = / -> /
|
|
25
25
|
|
|
26
26
|
# The name of the project containing the given dependencies
|
|
27
|
-
GRADLE_PROJECT_REGEXP = /\s*(Root p|P)roject '
|
|
27
|
+
GRADLE_PROJECT_REGEXP = /\s*(Root p|P)roject '?(:?[^\s']+)'?/
|
|
28
28
|
|
|
29
29
|
# Dependencies that are on-disk projects, eg:
|
|
30
30
|
# e.g. "\--- project :api:my-internal-project"
|
|
31
31
|
# e.g. "+--- my-group:my-alias:1.2.3 -> project :client (*)"
|
|
32
|
-
GRADLE_DEPENDENCY_PROJECT_REGEXP = /project
|
|
32
|
+
GRADLE_DEPENDENCY_PROJECT_REGEXP = /project (:?\S+)?/
|
|
33
33
|
|
|
34
34
|
# line ending legend: (c) means a dependency constraint, (n) means not resolved, or (*) means resolved previously, e.g. org.springframework.boot:spring-boot-starter-web:2.1.0.M3 (*)
|
|
35
35
|
# e.g. the "(n)" in "+--- my-group:my-name:1.2.3 (n)"
|
|
@@ -196,88 +196,95 @@ module Bibliothecary
|
|
|
196
196
|
|
|
197
197
|
def self.parse_gradle_resolved(file_contents, options: {})
|
|
198
198
|
keep_subprojects = options.fetch(:keep_subprojects_in_maven_tree, false)
|
|
199
|
+
source = options.fetch(:filename, nil)
|
|
199
200
|
current_type = nil
|
|
200
201
|
project_name = nil
|
|
201
202
|
|
|
202
|
-
dependencies = file_contents.lines
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
203
|
+
dependencies = file_contents.lines
|
|
204
|
+
.filter_map do |line|
|
|
205
|
+
line = line.strip
|
|
206
|
+
if project_name.nil? && (project_name_match = GRADLE_PROJECT_REGEXP.match(line))
|
|
207
|
+
project_name = project_name_match.captures[1]
|
|
208
|
+
nil
|
|
209
|
+
elsif (current_type_match = GRADLE_TYPE_REGEXP.match(line))
|
|
210
|
+
current_type = current_type_match.captures[0] if current_type_match
|
|
211
|
+
nil
|
|
212
|
+
else
|
|
213
|
+
parse_resolved_gradle_dep_line(line, current_type: current_type, keep_subprojects: keep_subprojects, source: source)
|
|
214
|
+
end
|
|
208
215
|
end
|
|
216
|
+
.uniq { |item| [item.name, item.requirement, item.type, item.original_name, item.original_requirement] }
|
|
209
217
|
|
|
210
|
-
|
|
211
|
-
|
|
218
|
+
ParserResult.new(
|
|
219
|
+
project_name: project_name,
|
|
220
|
+
dependencies: dependencies
|
|
221
|
+
)
|
|
222
|
+
end
|
|
212
223
|
|
|
213
|
-
|
|
214
|
-
|
|
224
|
+
def self.parse_resolved_gradle_dep_line(line, current_type: nil, keep_subprojects: false, source: nil)
|
|
225
|
+
return if line.end_with?("(n)") # skip unresolved or already-resolved dependencies
|
|
215
226
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
next unless keep_subprojects
|
|
227
|
+
gradle_dep_match = GRADLE_DEP_REGEXP.match(line)
|
|
228
|
+
return unless gradle_dep_match
|
|
219
229
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
230
|
+
# omit Gradle project dependencies
|
|
231
|
+
if (project_match = line.match(GRADLE_DEPENDENCY_PROJECT_REGEXP))
|
|
232
|
+
return unless keep_subprojects
|
|
223
233
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
line = line.sub(GRADLE_DEPENDENCY_PROJECT_REGEXP, ":#{sub_project_name}:*")
|
|
228
|
-
end
|
|
234
|
+
# an empty project name is self-referential (i.e. a cycle), and we don't need to track the manifest's
|
|
235
|
+
# project itself, e.g. "+--- project :"
|
|
236
|
+
return if project_match[1].nil?
|
|
229
237
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
original_name = parts[0..1].join(":") # original at minimum will have a 2-part name
|
|
242
|
-
original_requirement = parts[2] || "*"
|
|
243
|
-
|
|
244
|
-
parts = resolved_depstring.split(":")
|
|
245
|
-
resolved_requirement = parts.pop # resolved at minimum will have a 1-part version
|
|
246
|
-
resolved_name = parts.join(":")
|
|
247
|
-
|
|
248
|
-
# this case is not an actual alias, just a different version was resolved, so won't keep track of original
|
|
249
|
-
if resolved_name.empty? && !original_name.empty?
|
|
250
|
-
resolved_name = original_name
|
|
251
|
-
original_name = nil
|
|
252
|
-
original_requirement = nil
|
|
253
|
-
end
|
|
254
|
-
else
|
|
255
|
-
original_name = nil
|
|
256
|
-
original_requirement = nil
|
|
238
|
+
sub_project_name = project_match[1]
|
|
239
|
+
# gradle sub-project versions cannot be specified when including them (gradle just uses whichever version is in the
|
|
240
|
+
# codebase), and their versions are 'unspecified' if not set, so just use a placeholder version since it doesn't matter.
|
|
241
|
+
line = line.sub(project_match[0], "#{sub_project_name}:0.0.0")
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
cleaned_line = line
|
|
245
|
+
.split(gradle_dep_match.captures[0])[1]
|
|
246
|
+
.sub(GRADLE_LINE_ENDING_REGEXP, "")
|
|
247
|
+
.sub(/ FAILED$/, "") # dependency could not be resolved (but still may have a version)
|
|
248
|
+
.strip
|
|
257
249
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
250
|
+
# " -> " is either for an aliased dependency, or a version that was resolved from a different requirement or no requirement.
|
|
251
|
+
if cleaned_line.include?(" -> ")
|
|
252
|
+
original_depstring, resolved_depstring = cleaned_line.split(" -> ", 2)
|
|
261
253
|
|
|
262
|
-
|
|
263
|
-
|
|
254
|
+
parts = original_depstring.split(":")
|
|
255
|
+
original_name = parts[0..1].join(":") # original at minimum will have a 2-part name
|
|
256
|
+
original_requirement = parts[2] || "*"
|
|
257
|
+
|
|
258
|
+
parts = resolved_depstring.split(":")
|
|
259
|
+
resolved_requirement = parts.pop # resolved at minimum will have a 1-part version
|
|
260
|
+
resolved_name = parts.join(":")
|
|
261
|
+
|
|
262
|
+
# this case is not an actual alias, just a different version was resolved, so won't keep track of original
|
|
263
|
+
if resolved_name.empty? && !original_name.empty?
|
|
264
|
+
resolved_name = original_name
|
|
265
|
+
original_name = nil
|
|
266
|
+
original_requirement = nil
|
|
264
267
|
end
|
|
268
|
+
else
|
|
269
|
+
original_name = nil
|
|
270
|
+
original_requirement = nil
|
|
265
271
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
source: options.fetch(:filename, nil),
|
|
273
|
-
platform: platform_name
|
|
274
|
-
)
|
|
272
|
+
# handle simple resolved dep
|
|
273
|
+
parts = cleaned_line.split(":")
|
|
274
|
+
return if parts.size < 3 # we didn't get a full name and version, so skip it
|
|
275
|
+
|
|
276
|
+
resolved_requirement = parts.pop
|
|
277
|
+
resolved_name = parts.join(":")
|
|
275
278
|
end
|
|
276
|
-
.uniq { |item| [item.name, item.requirement, item.type, item.original_name, item.original_requirement] }
|
|
277
279
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
280
|
+
Dependency.new(
|
|
281
|
+
original_name: original_name,
|
|
282
|
+
original_requirement: original_requirement,
|
|
283
|
+
name: resolved_name,
|
|
284
|
+
requirement: resolved_requirement,
|
|
285
|
+
type: current_type,
|
|
286
|
+
source: source,
|
|
287
|
+
platform: platform_name
|
|
281
288
|
)
|
|
282
289
|
end
|
|
283
290
|
|