bibliothecary 6.7.2 → 6.7.3
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/bibliothecary.gemspec +2 -0
- data/lib/bibliothecary/parsers/maven.rb +70 -19
- data/lib/bibliothecary/version.rb +1 -1
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b589f62fb357fbc3134d456ea82c07b7ff20b11217d2c8010c8db5ff3a009337
|
4
|
+
data.tar.gz: 0a0727d453938b3ce8878aabe623b2ca7dbc928cb207bcdd94eb97173ade521f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d12065e6cd92680e7ed7a0c60770e67704aa949f2d5591126eb20fb6d4c42cbfa763caf60c0a71877d41d6f75231da96d910d8b219c78af81e67bcf5e240918
|
7
|
+
data.tar.gz: b4c378068bf8ee58bc8a77e44a984a4eff68c0660e0c0ebaca8bee5c29b7ae69534bfead06a0993362a1f3de1b8cf96b7ff925787cdf44abc923fe9a0ffa2c1a
|
data/bibliothecary.gemspec
CHANGED
@@ -25,6 +25,8 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_dependency "deb_control"
|
26
26
|
spec.add_dependency "sdl4r"
|
27
27
|
spec.add_dependency "commander"
|
28
|
+
spec.add_dependency "strings-ansi"
|
29
|
+
spec.add_dependency "strings"
|
28
30
|
|
29
31
|
spec.add_development_dependency "bundler", "~> 1.11"
|
30
32
|
spec.add_development_dependency "pry"
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'ox'
|
2
|
+
require 'strings-ansi'
|
2
3
|
|
3
4
|
module Bibliothecary
|
4
5
|
module Parsers
|
@@ -11,6 +12,9 @@ module Bibliothecary
|
|
11
12
|
# "| \\--- com.google.guava:guava:23.5-jre (*)"
|
12
13
|
GRADLE_DEP_REGEX = /(\+---|\\---){1}/
|
13
14
|
|
15
|
+
MAVEN_PROPERTY_REGEX = /\$\{(.+?)\}/
|
16
|
+
MAX_DEPTH = 5
|
17
|
+
|
14
18
|
def self.mapping
|
15
19
|
{
|
16
20
|
match_filename("ivy.xml", case_insensitive: true) => {
|
@@ -33,6 +37,10 @@ module Bibliothecary
|
|
33
37
|
match_filename("gradle-dependencies-q.txt", case_insensitive: true) => {
|
34
38
|
kind: 'lockfile',
|
35
39
|
parser: :parse_gradle_resolved
|
40
|
+
},
|
41
|
+
match_filename("maven-resolved-dependencies.txt", case_insensitive: true) => {
|
42
|
+
kind: 'lockfile',
|
43
|
+
parser: :parse_maven_resolved
|
36
44
|
}
|
37
45
|
}
|
38
46
|
end
|
@@ -53,7 +61,7 @@ module Bibliothecary
|
|
53
61
|
doc = Ox.parse file_contents
|
54
62
|
root = doc&.locate("ivy-report")&.first
|
55
63
|
return !root.nil?
|
56
|
-
rescue Exception
|
64
|
+
rescue Exception # rubocop:disable Lint/RescueException
|
57
65
|
# We rescue exception here since native libs can throw a non-StandardError
|
58
66
|
# We don't want to throw errors during the matching phase, only during
|
59
67
|
# parsing after we match.
|
@@ -109,6 +117,25 @@ module Bibliothecary
|
|
109
117
|
end.compact.uniq {|item| [item[:name], item[:requirement], item[:type]]}
|
110
118
|
end
|
111
119
|
|
120
|
+
def self.parse_maven_resolved(file_contents)
|
121
|
+
Strings::ANSI.sanitize(file_contents)
|
122
|
+
.split("\n")
|
123
|
+
.map(&method(:parse_resolved_dep_line))
|
124
|
+
.compact
|
125
|
+
.uniq
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.parse_resolved_dep_line(line)
|
129
|
+
dep_parts = line.strip.split(":")
|
130
|
+
return unless dep_parts.length == 5
|
131
|
+
# org.springframework.boot:spring-boot-starter-web:jar:2.0.3.RELEASE:compile[36m -- module spring.boot.starter.web[0;1m [auto][m
|
132
|
+
{
|
133
|
+
name: dep_parts[0, 2].join(":"),
|
134
|
+
requirement: dep_parts[3],
|
135
|
+
type: dep_parts[4].split("--").first.strip
|
136
|
+
}
|
137
|
+
end
|
138
|
+
|
112
139
|
def self.parse_pom_manifest(file_contents, parent_properties = {})
|
113
140
|
manifest = Ox.parse file_contents
|
114
141
|
xml = manifest.respond_to?('project') ? manifest.project : manifest
|
@@ -148,30 +175,54 @@ module Bibliothecary
|
|
148
175
|
def self.extract_pom_dep_info(xml, dependency, name, parent_properties = {})
|
149
176
|
field = dependency.locate(name).first
|
150
177
|
return nil if field.nil?
|
178
|
+
|
151
179
|
value = field.nodes.first
|
152
|
-
match = value.match(
|
180
|
+
match = value.match(MAVEN_PROPERTY_REGEX)
|
153
181
|
if match
|
154
|
-
|
155
|
-
# this converts ${project/group.id} -> ${group/id}
|
156
|
-
non_prop_name = match[1].gsub('.', '/').gsub('project/', '')
|
157
|
-
return value if !xml.respond_to?('properties') && parent_properties.empty? && !xml.locate(non_prop_name)
|
158
|
-
prop_field = xml.properties.locate(match[1]).first
|
159
|
-
parent_prop = parent_properties[match[1]]
|
160
|
-
if prop_field
|
161
|
-
return prop_field.nodes.first
|
162
|
-
elsif parent_prop
|
163
|
-
return parent_prop
|
164
|
-
elsif xml.locate(non_prop_name).first
|
165
|
-
# see if the value to look up is a field under the project
|
166
|
-
# examples are ${project.groupId} or ${project.version}
|
167
|
-
return xml.locate(non_prop_name).first.nodes.first
|
168
|
-
else
|
169
|
-
return value
|
170
|
-
end
|
182
|
+
return extract_property(xml, match[1], value, parent_properties)
|
171
183
|
else
|
172
184
|
return value
|
173
185
|
end
|
174
186
|
end
|
187
|
+
|
188
|
+
def self.replace_value_with_prop(original_value, property_value, property_name)
|
189
|
+
original_value.gsub("${#{property_name}}", property_value)
|
190
|
+
end
|
191
|
+
|
192
|
+
def self.extract_property(xml, property_name, value, parent_properties = {}, depth = 0)
|
193
|
+
prop_value = property_value(xml, property_name, parent_properties)
|
194
|
+
return value unless prop_value
|
195
|
+
# don't resolve more than 5 levels deep to avoid potential circular references
|
196
|
+
|
197
|
+
resolved_value = replace_value_with_prop(value, prop_value, property_name)
|
198
|
+
# check to see if we just resolved to another property name
|
199
|
+
match = resolved_value.match(MAVEN_PROPERTY_REGEX)
|
200
|
+
if match && depth < MAX_DEPTH
|
201
|
+
depth += 1
|
202
|
+
return extract_property(xml, match[1], resolved_value, parent_properties, depth)
|
203
|
+
else
|
204
|
+
return resolved_value
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
def self.property_value(xml, property_name, parent_properties)
|
209
|
+
# the xml root is <project> so lookup the non property name in the xml
|
210
|
+
# this converts ${project/group.id} -> ${group/id}
|
211
|
+
non_prop_name = property_name.gsub(".", "/").gsub("project/", "")
|
212
|
+
return value if !xml.respond_to?("properties") && parent_properties.empty? && !xml.locate(non_prop_name)
|
213
|
+
|
214
|
+
prop_field = xml.properties.locate(property_name).first
|
215
|
+
parent_prop = parent_properties[property_name]
|
216
|
+
if prop_field
|
217
|
+
prop_field.nodes.first
|
218
|
+
elsif parent_prop
|
219
|
+
parent_prop
|
220
|
+
elsif xml.locate(non_prop_name).first
|
221
|
+
# see if the value to look up is a field under the project
|
222
|
+
# examples are ${project.groupId} or ${project.version}
|
223
|
+
xml.locate(non_prop_name).first.nodes.first
|
224
|
+
end
|
225
|
+
end
|
175
226
|
end
|
176
227
|
end
|
177
228
|
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: 6.7.
|
4
|
+
version: 6.7.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Nesbitt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: toml-rb
|
@@ -108,6 +108,34 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: strings-ansi
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: strings
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
111
139
|
- !ruby/object:Gem::Dependency
|
112
140
|
name: bundler
|
113
141
|
requirement: !ruby/object:Gem::Requirement
|