spandx 0.4.1 → 0.5.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 +11 -2
- data/lib/spandx/catalogue.rb +1 -1
- data/lib/spandx/content.rb +12 -5
- data/lib/spandx/gateways/nuget.rb +6 -7
- data/lib/spandx/gateways/rubygems.rb +6 -1
- data/lib/spandx/guess.rb +31 -16
- data/lib/spandx/license.rb +1 -1
- data/lib/spandx/version.rb +1 -1
- data/lib/spandx.rb +3 -4
- data/spandx.gemspec +6 -4
- metadata +37 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 440933f7b4b8706a0a4da8ed5c84c5db80f93e40e7db258715bb73b11c5cbb31
|
4
|
+
data.tar.gz: 182e055dea23b17d3bb67fc16ce84ce245aa2dbfd247d9eead1b33162bf05472
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 26f4bc7516adf9f96c3725b15acc6ead6a2bdad6deaaf718a145106dcbec9f7c95c0f2053163f3c913a7466d2a8c3af860d4903a78bcb6eec8329f05a0cdb17f
|
7
|
+
data.tar.gz: 441abbd1f3cd090514627386e6f175ff5e53ba2909a2722f7e34e0f9a5e514532c431ffdd54e23d501dd20c6626c382b0fba215939989b7e0d32ba477bf86aa9
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Version 0.
|
1
|
+
Version 0.5.0
|
2
2
|
|
3
3
|
# Changelog
|
4
4
|
|
@@ -9,6 +9,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
9
9
|
|
10
10
|
## [Unreleased]
|
11
11
|
|
12
|
+
## [0.5.0] - 2020-02-13
|
13
|
+
### Added
|
14
|
+
- Add jaro winkler string similarity support.
|
15
|
+
- Attempt to resolve rubygems dependencies via `spandx-rubygems` index.
|
16
|
+
|
17
|
+
### Changed
|
18
|
+
- Make `text` and `jaro_winkler` gems a soft dependency.
|
19
|
+
|
12
20
|
## [0.4.1] - 2020-02-02
|
13
21
|
### Fixed
|
14
22
|
- Save license expression as string instead of array.
|
@@ -65,7 +73,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
65
73
|
### Added
|
66
74
|
- Provide ruby API to the latest SPDX catalogue.
|
67
75
|
|
68
|
-
[Unreleased]: https://github.com/mokhan/spandx/compare/v0.
|
76
|
+
[Unreleased]: https://github.com/mokhan/spandx/compare/v0.5.0...HEAD
|
77
|
+
[0.5.0]: https://github.com/mokhan/spandx/compare/v0.4.1...v0.5.0
|
69
78
|
[0.4.1]: https://github.com/mokhan/spandx/compare/v0.4.0...v0.4.1
|
70
79
|
[0.4.0]: https://github.com/mokhan/spandx/compare/v0.3.0...v0.4.0
|
71
80
|
[0.3.0]: https://github.com/mokhan/spandx/compare/v0.2.0...v0.3.0
|
data/lib/spandx/catalogue.rb
CHANGED
data/lib/spandx/content.rb
CHANGED
@@ -2,10 +2,9 @@
|
|
2
2
|
|
3
3
|
module Spandx
|
4
4
|
class Content
|
5
|
-
attr_reader :raw
|
5
|
+
attr_reader :raw
|
6
6
|
|
7
|
-
def initialize(raw
|
8
|
-
@threshold = threshold
|
7
|
+
def initialize(raw)
|
9
8
|
@raw = raw
|
10
9
|
end
|
11
10
|
|
@@ -16,9 +15,11 @@ module Spandx
|
|
16
15
|
def similar?(other, algorithm: :dice_coefficient)
|
17
16
|
case algorithm
|
18
17
|
when :dice_coefficient
|
19
|
-
similarity_score(other) >
|
18
|
+
similarity_score(other, algorithm: algorithm) > 89.0
|
20
19
|
when :levenshtein
|
21
|
-
similarity_score(other) <
|
20
|
+
similarity_score(other, algorithm: algorithm) < 3
|
21
|
+
when :jaro_winkler
|
22
|
+
similarity_score(other, algorithm: algorithm) > 89.0
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
@@ -27,7 +28,13 @@ module Spandx
|
|
27
28
|
when :dice_coefficient
|
28
29
|
dice_coefficient(other)
|
29
30
|
when :levenshtein
|
31
|
+
require 'text'
|
32
|
+
|
30
33
|
Text::Levenshtein.distance(raw, other.raw, 100)
|
34
|
+
when :jaro_winkler
|
35
|
+
require 'jaro_winkler'
|
36
|
+
|
37
|
+
JaroWinkler.distance(raw, other.raw) * 100.0
|
31
38
|
end
|
32
39
|
end
|
33
40
|
|
@@ -16,13 +16,13 @@ module Spandx
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def update!(index, limit: nil)
|
19
|
-
counter =
|
19
|
+
counter = 0
|
20
20
|
each do |spec|
|
21
21
|
upsert_into!(index, spec)
|
22
22
|
|
23
23
|
if limit
|
24
|
-
counter
|
25
|
-
break if counter
|
24
|
+
counter += 1
|
25
|
+
break if counter > limit
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -104,10 +104,9 @@ module Spandx
|
|
104
104
|
key = [host, spec['id'], spec['version']]
|
105
105
|
return if index.indexed?(key)
|
106
106
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
puts [license, key].inspect
|
107
|
+
return unless spec['licenseExpression']
|
108
|
+
|
109
|
+
index.write(key, spec['licenseExpression'])
|
111
110
|
end
|
112
111
|
end
|
113
112
|
end
|
@@ -9,13 +9,18 @@ module Spandx
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def licenses_for(name, version)
|
12
|
-
|
12
|
+
found = index.licenses_for(name: name, version: version)
|
13
|
+
found.any? ? found : details_on(name, version)['licenses'] || []
|
13
14
|
end
|
14
15
|
|
15
16
|
private
|
16
17
|
|
17
18
|
attr_reader :http
|
18
19
|
|
20
|
+
def index
|
21
|
+
@index ||= Spandx::Rubygems::Index.new
|
22
|
+
end
|
23
|
+
|
19
24
|
def details_on(name, version)
|
20
25
|
url = "https://rubygems.org/api/v2/rubygems/#{name}/versions/#{version}.json"
|
21
26
|
response = http.get(url, default: {})
|
data/lib/spandx/guess.rb
CHANGED
@@ -8,10 +8,18 @@ module Spandx
|
|
8
8
|
attr_reader :score, :item
|
9
9
|
|
10
10
|
def initialize(score, item)
|
11
|
+
update(score || 0.0, item)
|
12
|
+
end
|
13
|
+
|
14
|
+
def update(score, item)
|
11
15
|
@score = score
|
12
16
|
@item = item
|
13
17
|
end
|
14
18
|
|
19
|
+
def empty?
|
20
|
+
score.nil? || item.nil?
|
21
|
+
end
|
22
|
+
|
15
23
|
def <=>(other)
|
16
24
|
score <=> other.score
|
17
25
|
end
|
@@ -29,33 +37,40 @@ module Spandx
|
|
29
37
|
|
30
38
|
def license_for(raw_content, algorithm: :dice_coefficient)
|
31
39
|
content = Content.new(raw_content)
|
32
|
-
score = nil
|
33
|
-
|
34
|
-
|
40
|
+
score = Score.new(nil, nil)
|
41
|
+
threshold = threshold_for(algorithm)
|
42
|
+
direction = algorithm == :levenshtein ? method(:min) : method(:max)
|
35
43
|
|
36
|
-
|
44
|
+
catalogue.each do |license|
|
45
|
+
direction.call(content, license, score, threshold, algorithm) unless license.deprecated_license_id?
|
37
46
|
end
|
38
47
|
score&.item&.id
|
39
48
|
end
|
40
49
|
|
41
50
|
private
|
42
51
|
|
43
|
-
def
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
52
|
+
def threshold_for(algorithm)
|
53
|
+
{
|
54
|
+
dice_coefficient: 89.0,
|
55
|
+
jaro_winkler: 80.0,
|
56
|
+
levenshtein: 80.0,
|
57
|
+
}[algorithm.to_sym]
|
58
|
+
end
|
48
59
|
|
49
|
-
|
60
|
+
def min(target, other, score, threshold, algorithm)
|
61
|
+
percentage = target.similarity_score(other.content, algorithm: algorithm)
|
62
|
+
return if percentage > threshold
|
63
|
+
return if score.score > 0.0 && score.score < percentage
|
64
|
+
|
65
|
+
score.update(percentage, other)
|
50
66
|
end
|
51
67
|
|
52
|
-
def
|
53
|
-
percentage = target.similarity_score(other.content, algorithm:
|
54
|
-
if
|
55
|
-
|
56
|
-
end
|
68
|
+
def max(target, other, score, threshold, algorithm)
|
69
|
+
percentage = target.similarity_score(other.content, algorithm: algorithm)
|
70
|
+
return if percentage < threshold
|
71
|
+
return if score.score >= percentage
|
57
72
|
|
58
|
-
score
|
73
|
+
score.update(percentage, other)
|
59
74
|
end
|
60
75
|
end
|
61
76
|
end
|
data/lib/spandx/license.rb
CHANGED
data/lib/spandx/version.rb
CHANGED
data/lib/spandx.rb
CHANGED
@@ -2,13 +2,11 @@
|
|
2
2
|
|
3
3
|
require 'addressable/uri'
|
4
4
|
require 'bundler'
|
5
|
-
require 'concurrent'
|
6
5
|
require 'forwardable'
|
7
6
|
require 'json'
|
8
7
|
require 'net/hippie'
|
9
8
|
require 'nokogiri'
|
10
9
|
require 'pathname'
|
11
|
-
require 'text'
|
12
10
|
|
13
11
|
require 'spandx/catalogue'
|
14
12
|
require 'spandx/content'
|
@@ -24,6 +22,7 @@ require 'spandx/index'
|
|
24
22
|
require 'spandx/license'
|
25
23
|
require 'spandx/parsers'
|
26
24
|
require 'spandx/report'
|
25
|
+
require 'spandx/rubygems'
|
27
26
|
require 'spandx/version'
|
28
27
|
|
29
28
|
module Spandx
|
@@ -38,8 +37,8 @@ module Spandx
|
|
38
37
|
@http ||= Spandx::Gateways::Http.new
|
39
38
|
end
|
40
39
|
|
41
|
-
def
|
42
|
-
@
|
40
|
+
def spdx_db
|
41
|
+
@spdx_db ||= Spandx::Database.new(url: 'https://github.com/spdx/license-list-data.git').tap(&:update!)
|
43
42
|
end
|
44
43
|
end
|
45
44
|
end
|
data/spandx.gemspec
CHANGED
@@ -14,6 +14,7 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.description = 'A ruby interface to the SPDX catalogue.'
|
15
15
|
spec.homepage = 'https://github.com/mokhan/spandx'
|
16
16
|
spec.license = 'MIT'
|
17
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.4.0')
|
17
18
|
|
18
19
|
spec.metadata['homepage_uri'] = spec.homepage
|
19
20
|
spec.metadata['source_code_uri'] = 'https://github.com/mokhan/spandx'
|
@@ -29,20 +30,21 @@ Gem::Specification.new do |spec|
|
|
29
30
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
30
31
|
spec.require_paths = ['lib']
|
31
32
|
|
32
|
-
spec.required_ruby_version = '>= 2.4.0'
|
33
33
|
spec.add_dependency 'addressable', '~> 2.7'
|
34
34
|
spec.add_dependency 'bundler', '>= 1.16', '< 3.0.0'
|
35
|
-
spec.add_dependency 'concurrent-ruby-ext', '~> 1.1'
|
36
35
|
spec.add_dependency 'net-hippie', '~> 0.3'
|
37
36
|
spec.add_dependency 'nokogiri', '~> 1.10'
|
38
|
-
spec.add_dependency '
|
39
|
-
spec.add_dependency 'thor'
|
37
|
+
spec.add_dependency 'spandx-rubygems', '~> 0.1'
|
38
|
+
spec.add_dependency 'thor'
|
39
|
+
|
40
40
|
spec.add_development_dependency 'bundler-audit', '~> 0.6'
|
41
|
+
spec.add_development_dependency 'jaro_winkler', '~> 1.5'
|
41
42
|
spec.add_development_dependency 'rake', '~> 13.0'
|
42
43
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
43
44
|
spec.add_development_dependency 'rspec-benchmark', '~> 0.5'
|
44
45
|
spec.add_development_dependency 'rubocop', '~> 0.52'
|
45
46
|
spec.add_development_dependency 'rubocop-rspec', '~> 1.22'
|
47
|
+
spec.add_development_dependency 'text', '~> 1.3'
|
46
48
|
spec.add_development_dependency 'vcr', '~> 5.0'
|
47
49
|
spec.add_development_dependency 'webmock', '~> 3.7'
|
48
50
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spandx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mo khan
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-02-
|
11
|
+
date: 2020-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|
@@ -44,20 +44,6 @@ dependencies:
|
|
44
44
|
- - "<"
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: 3.0.0
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: concurrent-ruby-ext
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
50
|
-
requirements:
|
51
|
-
- - "~>"
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '1.1'
|
54
|
-
type: :runtime
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
requirements:
|
58
|
-
- - "~>"
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: '1.1'
|
61
47
|
- !ruby/object:Gem::Dependency
|
62
48
|
name: net-hippie
|
63
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,33 +73,33 @@ dependencies:
|
|
87
73
|
- !ruby/object:Gem::Version
|
88
74
|
version: '1.10'
|
89
75
|
- !ruby/object:Gem::Dependency
|
90
|
-
name:
|
76
|
+
name: spandx-rubygems
|
91
77
|
requirement: !ruby/object:Gem::Requirement
|
92
78
|
requirements:
|
93
79
|
- - "~>"
|
94
80
|
- !ruby/object:Gem::Version
|
95
|
-
version: '1
|
81
|
+
version: '0.1'
|
96
82
|
type: :runtime
|
97
83
|
prerelease: false
|
98
84
|
version_requirements: !ruby/object:Gem::Requirement
|
99
85
|
requirements:
|
100
86
|
- - "~>"
|
101
87
|
- !ruby/object:Gem::Version
|
102
|
-
version: '1
|
88
|
+
version: '0.1'
|
103
89
|
- !ruby/object:Gem::Dependency
|
104
90
|
name: thor
|
105
91
|
requirement: !ruby/object:Gem::Requirement
|
106
92
|
requirements:
|
107
|
-
- - "
|
93
|
+
- - ">="
|
108
94
|
- !ruby/object:Gem::Version
|
109
|
-
version: '0
|
95
|
+
version: '0'
|
110
96
|
type: :runtime
|
111
97
|
prerelease: false
|
112
98
|
version_requirements: !ruby/object:Gem::Requirement
|
113
99
|
requirements:
|
114
|
-
- - "
|
100
|
+
- - ">="
|
115
101
|
- !ruby/object:Gem::Version
|
116
|
-
version: '0
|
102
|
+
version: '0'
|
117
103
|
- !ruby/object:Gem::Dependency
|
118
104
|
name: bundler-audit
|
119
105
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,6 +114,20 @@ dependencies:
|
|
128
114
|
- - "~>"
|
129
115
|
- !ruby/object:Gem::Version
|
130
116
|
version: '0.6'
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: jaro_winkler
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - "~>"
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '1.5'
|
124
|
+
type: :development
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '1.5'
|
131
131
|
- !ruby/object:Gem::Dependency
|
132
132
|
name: rake
|
133
133
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,6 +198,20 @@ dependencies:
|
|
198
198
|
- - "~>"
|
199
199
|
- !ruby/object:Gem::Version
|
200
200
|
version: '1.22'
|
201
|
+
- !ruby/object:Gem::Dependency
|
202
|
+
name: text
|
203
|
+
requirement: !ruby/object:Gem::Requirement
|
204
|
+
requirements:
|
205
|
+
- - "~>"
|
206
|
+
- !ruby/object:Gem::Version
|
207
|
+
version: '1.3'
|
208
|
+
type: :development
|
209
|
+
prerelease: false
|
210
|
+
version_requirements: !ruby/object:Gem::Requirement
|
211
|
+
requirements:
|
212
|
+
- - "~>"
|
213
|
+
- !ruby/object:Gem::Version
|
214
|
+
version: '1.3'
|
201
215
|
- !ruby/object:Gem::Dependency
|
202
216
|
name: vcr
|
203
217
|
requirement: !ruby/object:Gem::Requirement
|