bibliothecary 6.7.2 → 6.7.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|