spandx 0.2.0 → 0.3.0

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: a9c82d16a4a78e075ecebcd7308580b5e3ca44bcc274d3070ade1d546b9a38fa
4
- data.tar.gz: 540a6a7f1d12f14c5d44feb15826b2f61ba8ee422d72e662328457b8df7260fc
3
+ metadata.gz: 14b8433caf34da68102cdf2db650684c9dbccc2e32509a63a44021978a8d1f6e
4
+ data.tar.gz: c7c342040a9c5a666708096f30228823a815256587ddd99b9b77fcb7f6856259
5
5
  SHA512:
6
- metadata.gz: 1bb0a40e4723a2b3fc2b50a92d3df34df978753f5e14a76534758d9c946349475dfa18a123c1e0b3f1d89ac01fbbe9eecb520ca6842c122ba5af122d9466c639
7
- data.tar.gz: faaedb6aaaf9ae486219ef396092c108ff359723a267291b5ef37b2bcf834195b5ace2578067598f97c71b68f78f4efb8ade261c3953184fd4a7be34eed9d7a9
6
+ metadata.gz: 9d916195c87c1162ec60ace64a7c36c5b693c51445361cf11242ca9ceb32c9a8b932d1a2bd65026757c56e556cdc677a738bb42f6dd266652c897737ce2da281
7
+ data.tar.gz: 92df5d8346276b1998f28bfad73ef26fd6e9bf300589997e5d6ad517e7044974b52b659082acae52e496ea51ff77e3f7bd8d4faa5f4d14d39c20c44a8fb529af
@@ -1,4 +1,4 @@
1
- Version 0.2.0
1
+ Version 0.3.0
2
2
 
3
3
  # Changelog
4
4
 
@@ -8,8 +8,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
8
8
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
9
9
 
10
10
  ## [Unreleased]
11
+
12
+ ## [0.3.0] - 2020-01-29
11
13
  ### Added
12
- - Nil
14
+ - Add `pom.xml` parser
15
+
16
+ ### Changed
17
+ - Change minimum ruby from 2.5 to 2.4
13
18
 
14
19
  ## [0.2.0] - 2020-01-28
15
20
  ### Added
@@ -52,7 +57,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
52
57
  ### Added
53
58
  - Provide ruby API to the latest SPDX catalogue.
54
59
 
55
- [Unreleased]: https://github.com/mokhan/spandx/compare/v0.2.0...HEAD
60
+ [Unreleased]: https://github.com/mokhan/spandx/compare/v0.3.0...HEAD
61
+ [0.3.0]: https://github.com/mokhan/spandx/compare/v0.2.0...v0.3.0
56
62
  [0.2.0]: https://github.com/mokhan/spandx/compare/v0.1.7...v0.2.0
57
63
  [0.1.7]: https://github.com/mokhan/spandx/compare/v0.1.6...v0.1.7
58
64
  [0.1.6]: https://github.com/mokhan/spandx/compare/v0.1.5...v0.1.6
@@ -3,6 +3,7 @@
3
3
  require 'spandx/parsers/base'
4
4
  require 'spandx/parsers/csproj'
5
5
  require 'spandx/parsers/gemfile_lock'
6
+ require 'spandx/parsers/maven'
6
7
  require 'spandx/parsers/packages_config'
7
8
  require 'spandx/parsers/pipfile_lock'
8
9
  require 'spandx/parsers/sln'
@@ -4,7 +4,7 @@ module Spandx
4
4
  module Parsers
5
5
  class Csproj < Base
6
6
  def self.matches?(filename)
7
- filename.match?(/.*\.csproj/)
7
+ ['.csproj', '.props'].include?(File.extname(filename))
8
8
  end
9
9
 
10
10
  def parse(lockfile)
@@ -3,7 +3,21 @@
3
3
  module Spandx
4
4
  module Parsers
5
5
  class Csproj
6
- PackageReference = Struct.new(:name, :version, keyword_init: true)
6
+ class PackageReference
7
+ attr_reader :name, :version
8
+
9
+ def initialize(name:, version:)
10
+ @name = name
11
+ @version = version
12
+ end
13
+
14
+ def to_h
15
+ {
16
+ name: name,
17
+ version: version
18
+ }
19
+ end
20
+ end
7
21
  end
8
22
  end
9
23
  end
@@ -9,17 +9,13 @@ module Spandx
9
9
  def initialize(path)
10
10
  @path = path
11
11
  @dir = File.dirname(path)
12
- @document = Nokogiri::XML(IO.read(path))
12
+ @document = Nokogiri::XML(IO.read(path)).tap(&:remove_namespaces!)
13
13
  end
14
14
 
15
15
  def package_references
16
- other = project_references.map(&:package_references).flatten
17
- other + document.search('//PackageReference').map do |node|
18
- PackageReference.new(
19
- name: attribute_for('Include', node),
20
- version: attribute_for('Version', node)
21
- )
22
- end
16
+ project_references.flat_map(&:package_references) +
17
+ references('GlobalPackageReference') +
18
+ references('PackageReference')
23
19
  end
24
20
 
25
21
  private
@@ -32,6 +28,20 @@ module Spandx
32
28
  end
33
29
  end
34
30
 
31
+ def references(key)
32
+ document.search("//#{key}").map do |node|
33
+ PackageReference.new(
34
+ name: name_from(node),
35
+ version: attribute_for('Version', node)
36
+ )
37
+ end
38
+ end
39
+
40
+ def name_from(node)
41
+ attribute_for('Include', node) ||
42
+ attribute_for('Update', node)
43
+ end
44
+
35
45
  def attribute_for(key, node)
36
46
  node.attribute(key)&.value&.strip ||
37
47
  node.at_xpath("./#{key}")&.content&.strip
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spandx
4
+ module Parsers
5
+ class Maven < Base
6
+ class Metadata
7
+ attr_reader :artifact_id, :group_id, :version
8
+
9
+ def initialize(artifact_id:, group_id:, version:)
10
+ @artifact_id = artifact_id
11
+ @group_id = group_id.tr('.', '/')
12
+ @version = version
13
+ end
14
+
15
+ def licenses
16
+ pom.to_xml(indent: 2)
17
+ pom.search('//licenses/license').map do |node|
18
+ {
19
+ name: node.at_xpath('./name').text,
20
+ url: node.at_xpath('./url').text
21
+ }
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def pom
28
+ @pom ||= fetch
29
+ end
30
+
31
+ def spec_url
32
+ [
33
+ 'https://repo.maven.apache.org/maven2',
34
+ group_id,
35
+ artifact_id,
36
+ version,
37
+ "#{artifact_id}-#{version}.pom"
38
+ ].join('/')
39
+ end
40
+
41
+ def fetch
42
+ response = Spandx.http.get(spec_url)
43
+ return unless Spandx.http.ok?(response)
44
+
45
+ Nokogiri.XML(response.body).tap(&:remove_namespaces!)
46
+ end
47
+ end
48
+
49
+ def self.matches?(filename)
50
+ File.basename(filename) == 'pom.xml'
51
+ end
52
+
53
+ def parse(filename)
54
+ document = Nokogiri.XML(IO.read(filename)).tap(&:remove_namespaces!)
55
+ document.search('//project/dependencies/dependency').map do |node|
56
+ metadata = metadata_for(node)
57
+ Dependency.new(
58
+ name: metadata.artifact_id,
59
+ version: metadata.version,
60
+ licenses: metadata.licenses.map { |x| search_catalogue_for(x) }.compact
61
+ )
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ def metadata_for(node)
68
+ Metadata.new(
69
+ artifact_id: node.at_xpath('./artifactId').text,
70
+ group_id: node.at_xpath('./groupId').text,
71
+ version: node.at_xpath('./version').text
72
+ )
73
+ end
74
+
75
+ def search_catalogue_for(license_hash)
76
+ name = Content.new(license_hash[:name])
77
+
78
+ catalogue.find do |license|
79
+ score = name.similarity_score(Content.new(license.name))
80
+ score > 85
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Spandx
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.0'
5
5
  end
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
29
29
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
30
30
  spec.require_paths = ['lib']
31
31
 
32
- spec.required_ruby_version = '>= 2.5.0'
32
+ spec.required_ruby_version = '>= 2.4.0'
33
33
  spec.add_dependency 'bundler', '>= 1.16', '< 3.0.0'
34
34
  spec.add_dependency 'net-hippie', '~> 0.3'
35
35
  spec.add_dependency 'nokogiri', '~> 1.10'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spandx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - mo khan
@@ -231,6 +231,7 @@ files:
231
231
  - lib/spandx/parsers/csproj/package_reference.rb
232
232
  - lib/spandx/parsers/csproj/project_file.rb
233
233
  - lib/spandx/parsers/gemfile_lock.rb
234
+ - lib/spandx/parsers/maven.rb
234
235
  - lib/spandx/parsers/packages_config.rb
235
236
  - lib/spandx/parsers/pipfile_lock.rb
236
237
  - lib/spandx/parsers/sln.rb
@@ -252,7 +253,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
252
253
  requirements:
253
254
  - - ">="
254
255
  - !ruby/object:Gem::Version
255
- version: 2.5.0
256
+ version: 2.4.0
256
257
  required_rubygems_version: !ruby/object:Gem::Requirement
257
258
  requirements:
258
259
  - - ">="