licensee 5.0.0 → 6.0.0b1
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/README.md +15 -50
- data/bin/licensee +7 -8
- data/lib/licensee.rb +9 -33
- data/lib/licensee/content_helper.rb +7 -8
- data/lib/licensee/license.rb +5 -28
- data/lib/licensee/matchers/copyright_matcher.rb +17 -16
- data/lib/licensee/matchers/dice_matcher.rb +65 -0
- data/lib/licensee/matchers/exact_matcher.rb +12 -6
- data/lib/licensee/matchers/gemspec_matcher.rb +11 -11
- data/lib/licensee/matchers/npm_bower_matcher.rb +10 -10
- data/lib/licensee/matchers/package_matcher.rb +11 -10
- data/lib/licensee/project.rb +96 -30
- data/lib/licensee/project_file.rb +57 -77
- data/lib/licensee/version.rb +1 -1
- data/licensee.gemspec +26 -0
- data/test/fixtures/npm.git/HEAD +1 -0
- data/test/fixtures/npm.git/config +4 -0
- data/test/fixtures/npm.git/objects/info/packs +2 -0
- data/test/fixtures/npm.git/objects/pack/pack-03c0879445cabcc37f91d97c7955465adef26f4a.idx +0 -0
- data/test/fixtures/npm.git/objects/pack/pack-03c0879445cabcc37f91d97c7955465adef26f4a.pack +0 -0
- data/test/fixtures/npm.git/packed-refs +2 -0
- data/test/functions.rb +4 -15
- data/test/test_licensee.rb +1 -13
- data/test/test_licensee_copyright_matcher.rb +19 -28
- data/test/test_licensee_dice_matcher.rb +21 -0
- data/test/test_licensee_exact_matcher.rb +4 -6
- data/test/test_licensee_gemspec_matcher.rb +3 -11
- data/test/test_licensee_license.rb +2 -12
- data/test/test_licensee_npm_bower_matcher.rb +10 -16
- data/test/test_licensee_project.rb +24 -35
- data/test/test_licensee_project_file.rb +5 -10
- data/vendor/choosealicense.com/_licenses/afl-3.0.txt +69 -0
- data/vendor/choosealicense.com/_licenses/isc.txt +2 -2
- metadata +14 -26
- data/lib/licensee/filesystem_repository.rb +0 -38
- data/lib/licensee/matcher.rb +0 -32
- data/lib/licensee/matchers/git_matcher.rb +0 -27
- data/lib/licensee/matchers/levenshtein_matcher.rb +0 -75
- data/test/test_licensee_content_helper.rb +0 -40
- data/test/test_licensee_git_matcher.rb +0 -19
- data/test/test_licensee_levenshtein_matcher.rb +0 -34
- data/test/test_licensee_matcher.rb +0 -7
data/test/functions.rb
CHANGED
@@ -19,8 +19,6 @@ def license_from_path(path)
|
|
19
19
|
license
|
20
20
|
end
|
21
21
|
|
22
|
-
FakeBlob = Licensee::FilesystemRepository::Blob
|
23
|
-
|
24
22
|
def chaos_monkey(string)
|
25
23
|
Random.rand(3).times do
|
26
24
|
string[Random.rand(string.length)] = SecureRandom.base64(Random.rand(3))
|
@@ -35,28 +33,19 @@ def verify_license_file(license, chaos = false, wrap=false)
|
|
35
33
|
text = chaos_monkey(text) if chaos
|
36
34
|
text = wrap(text, wrap) if wrap
|
37
35
|
|
38
|
-
|
39
|
-
license_file = Licensee::ProjectFile.new(blob, "LICENSE")
|
36
|
+
license_file = Licensee::Project::LicenseFile.new(text)
|
40
37
|
|
41
|
-
actual = license_file.
|
38
|
+
actual = license_file.license
|
42
39
|
msg = "No match for #{expected}."
|
43
40
|
|
44
|
-
unless actual
|
45
|
-
Licensee.matchers.each do |matcher|
|
46
|
-
matcher = matcher.new(license_file)
|
47
|
-
msg << "#{matcher.class}: #{matcher.confidence}% #{matcher.match.inspect}\n"
|
48
|
-
end
|
49
|
-
msg << "Here's the test text:\n#{text}"
|
50
|
-
end
|
51
|
-
|
52
41
|
assert actual, msg
|
53
42
|
assert_equal expected, actual.key, "expeceted #{expected} but got #{actual.key} for .match. Confidence: #{license_file.confidence}. Method: #{license_file.matcher.class}"
|
54
43
|
end
|
55
44
|
|
56
45
|
def wrap(text, line_width=80)
|
57
46
|
text = text.clone
|
58
|
-
copyright = /^#{Licensee::
|
59
|
-
text.gsub! /^#{Licensee::
|
47
|
+
copyright = /^#{Licensee::Matchers::Copyright::REGEX}$/i.match(text)
|
48
|
+
text.gsub! /^#{Licensee::Matchers::Copyright::REGEX}$/i, '[COPYRIGHT]' if copyright
|
60
49
|
text.gsub! /([^\n])\n([^\n])/, '\1 \2'
|
61
50
|
text = text.split("\n").collect do |line|
|
62
51
|
line.length > line_width ? line.gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n").strip : line
|
data/test/test_licensee.rb
CHANGED
@@ -4,7 +4,7 @@ class TestLicensee < Minitest::Test
|
|
4
4
|
should "know the licenses" do
|
5
5
|
assert_equal Array, Licensee.licenses.class
|
6
6
|
assert_equal 15, Licensee.licenses.size
|
7
|
-
assert_equal
|
7
|
+
assert_equal 24, Licensee.licenses(:hidden => true).size
|
8
8
|
assert_equal Licensee::License, Licensee.licenses.first.class
|
9
9
|
end
|
10
10
|
|
@@ -23,16 +23,4 @@ class TestLicensee < Minitest::Test
|
|
23
23
|
Licensee.confidence_threshold = 90
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
27
|
-
context "npm-bower matcher" do
|
28
|
-
should "be disabled by default" do
|
29
|
-
refute Licensee.matchers.include? Licensee::NpmBowerMatcher
|
30
|
-
end
|
31
|
-
|
32
|
-
should "be enable-able" do
|
33
|
-
Licensee.package_manager_files = true
|
34
|
-
assert Licensee.matchers.include? Licensee::NpmBowerMatcher
|
35
|
-
Licensee.package_manager_files = false
|
36
|
-
end
|
37
|
-
end
|
38
26
|
end
|
@@ -1,61 +1,52 @@
|
|
1
1
|
# encoding=utf-8
|
2
2
|
require 'helper'
|
3
3
|
|
4
|
-
class
|
5
|
-
|
6
|
-
def setup
|
7
|
-
text = "Copyright 2015 Ben Balter"
|
8
|
-
blob = FakeBlob.new(text)
|
9
|
-
@file = Licensee::ProjectFile.new(blob, "LICENSE")
|
10
|
-
end
|
11
|
-
|
4
|
+
class TestLicenseeCopyrightMatchers < Minitest::Test
|
12
5
|
should "match the license" do
|
13
|
-
|
6
|
+
text = "Copyright 2015 Ben Balter"
|
7
|
+
file = Licensee::Project::LicenseFile.new(text)
|
8
|
+
assert_equal "no-license", Licensee::Matchers::Copyright.new(file).match.key
|
14
9
|
end
|
15
10
|
|
16
11
|
should "know the match confidence" do
|
17
|
-
|
12
|
+
text = "Copyright 2015 Ben Balter"
|
13
|
+
file = Licensee::Project::LicenseFile.new(text)
|
14
|
+
assert_equal 100, Licensee::Matchers::Copyright.new(file).confidence
|
18
15
|
end
|
19
16
|
|
20
17
|
should "match Copyright (C) copyright notices" do
|
21
18
|
text = "Copyright (C) 2015 Ben Balter"
|
22
|
-
|
23
|
-
|
24
|
-
assert_equal "no-license", Licensee::CopyrightMatcher.match(file).key
|
19
|
+
file = Licensee::Project::LicenseFile.new(text)
|
20
|
+
assert_equal "no-license", Licensee::Matchers::Copyright.new(file).match.key
|
25
21
|
end
|
26
22
|
|
27
23
|
should "match Copyright © copyright notices" do
|
28
24
|
text = "copyright © 2015 Ben Balter"
|
29
|
-
|
30
|
-
|
31
|
-
assert_equal "no-license", Licensee::CopyrightMatcher.match(file).key
|
25
|
+
file = Licensee::Project::LicenseFile.new(text)
|
26
|
+
assert_equal "no-license", Licensee::Matchers::Copyright.new(file).match.key
|
32
27
|
end
|
33
28
|
|
34
29
|
should "not false positive" do
|
35
30
|
text = File.open(Licensee::License.find("mit").path).read.split("---").last
|
36
|
-
|
37
|
-
|
38
|
-
assert_equal nil, Licensee::CopyrightMatcher.match(file)
|
31
|
+
file = Licensee::Project::LicenseFile.new(text)
|
32
|
+
assert_equal nil, Licensee::Matchers::Copyright.new(file).match
|
39
33
|
end
|
40
34
|
|
41
35
|
should "handle UTF-8 encoded copyright notices" do
|
42
36
|
text = "Copyright (c) 2010-2014 Simon Hürlimann"
|
43
|
-
|
44
|
-
|
45
|
-
assert_equal "no-license", Licensee::CopyrightMatcher.match(file).key
|
37
|
+
file = Licensee::Project::LicenseFile.new(text)
|
38
|
+
assert_equal "no-license", Licensee::Matchers::Copyright.new(file).match.key
|
46
39
|
end
|
47
40
|
|
48
41
|
should "handle ASCII-8BIT encoded copyright notices" do
|
49
42
|
text = "Copyright \xC2\xA92015 Ben Balter`".force_encoding("ASCII-8BIT")
|
50
|
-
|
51
|
-
|
52
|
-
assert_equal "no-license", Licensee::CopyrightMatcher.match(file).key
|
43
|
+
file = Licensee::Project::LicenseFile.new(text)
|
44
|
+
assert_equal "no-license", Licensee::Matchers::Copyright.new(file).match.key
|
53
45
|
end
|
54
46
|
|
55
47
|
should "match comma, separated dates" do
|
56
48
|
text = "Copyright (c) 2003, 2004 Ben Balter"
|
57
|
-
|
58
|
-
|
59
|
-
assert_equal "no-license", Licensee::CopyrightMatcher.match(file).key
|
49
|
+
file = Licensee::Project::LicenseFile.new(text)
|
50
|
+
assert_equal "no-license", Licensee::Matchers::Copyright.new(file).match.key
|
60
51
|
end
|
61
52
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestLicenseeDiceMatchers < Minitest::Test
|
4
|
+
def setup
|
5
|
+
text = license_from_path(Licensee::License.find("mit").path)
|
6
|
+
@mit = Licensee::Project::LicenseFile.new(text)
|
7
|
+
end
|
8
|
+
|
9
|
+
should "match the license" do
|
10
|
+
assert_equal "mit", Licensee::Matchers::Dice.new(@mit).match.key
|
11
|
+
end
|
12
|
+
|
13
|
+
should "know the match confidence" do
|
14
|
+
matcher = Licensee::Matchers::Dice.new(@mit)
|
15
|
+
assert matcher.confidence > 95, "#{matcher.confidence} < 95"
|
16
|
+
end
|
17
|
+
|
18
|
+
should "calculate max delta" do
|
19
|
+
assert_equal 83.7, Licensee::Matchers::Dice.new(@mit).max_delta
|
20
|
+
end
|
21
|
+
end
|
@@ -1,18 +1,16 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
-
class
|
4
|
-
|
3
|
+
class TestLicenseeExactMatchers < Minitest::Test
|
5
4
|
def setup
|
6
5
|
text = File.open(Licensee::License.find("mit").path).read.split("---").last
|
7
|
-
|
8
|
-
@mit = Licensee::ProjectFile.new(blob, "LICENSE")
|
6
|
+
@mit = Licensee::Project::LicenseFile.new(text)
|
9
7
|
end
|
10
8
|
|
11
9
|
should "match the license" do
|
12
|
-
assert_equal "mit", Licensee::
|
10
|
+
assert_equal "mit", Licensee::Matchers::Exact.new(@mit).match.key
|
13
11
|
end
|
14
12
|
|
15
13
|
should "know the match confidence" do
|
16
|
-
assert_equal 100, Licensee::
|
14
|
+
assert_equal 100, Licensee::Matchers::Exact.new(@mit).confidence
|
17
15
|
end
|
18
16
|
end
|
@@ -1,18 +1,10 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
-
class
|
4
|
-
def setup
|
5
|
-
Licensee.package_manager_files = true
|
6
|
-
end
|
7
|
-
|
8
|
-
def teardown
|
9
|
-
Licensee.package_manager_files = false
|
10
|
-
end
|
11
|
-
|
3
|
+
class TestLicenseeGemspecMatchers < Minitest::Test
|
12
4
|
should "detect its own license" do
|
13
5
|
root = File.expand_path "../", File.dirname(__FILE__)
|
14
|
-
project = Licensee::
|
15
|
-
matcher = Licensee::
|
6
|
+
project = Licensee::GitProject.new(root, detect_packages: true)
|
7
|
+
matcher = Licensee::Matchers::Gemspec.new(project.package_file)
|
16
8
|
assert_equal "mit", matcher.send(:license_property)
|
17
9
|
assert_equal "mit", matcher.match.key
|
18
10
|
end
|
@@ -112,16 +112,6 @@ class TestLicenseeLicense < Minitest::Test
|
|
112
112
|
assert_equal expected, Licensee::License.find("gpl-3.0").name_without_version
|
113
113
|
end
|
114
114
|
|
115
|
-
should "know if the license contains the name without version" do
|
116
|
-
refute Licensee::License.find("cc0-1.0").body_includes_name?
|
117
|
-
assert Licensee::License.find("agpl-3.0").body_includes_name?
|
118
|
-
end
|
119
|
-
|
120
|
-
should "know if the license contains the nickname" do
|
121
|
-
refute Licensee::License.find("mit").body_includes_nickname?
|
122
|
-
assert Licensee::License.find("apache-2.0").body_includes_nickname?
|
123
|
-
end
|
124
|
-
|
125
115
|
Licensee.licenses.each do |license|
|
126
116
|
should "strip the version number from the #{license.name} license" do
|
127
117
|
assert license.name_without_version
|
@@ -132,13 +122,13 @@ class TestLicenseeLicense < Minitest::Test
|
|
132
122
|
describe "class methods" do
|
133
123
|
should "know license names" do
|
134
124
|
assert_equal Array, Licensee::License.keys.class
|
135
|
-
assert_equal
|
125
|
+
assert_equal 24, Licensee::License.keys.size
|
136
126
|
end
|
137
127
|
|
138
128
|
should "load the licenses" do
|
139
129
|
assert_equal Array, Licensee::License.all.class
|
140
130
|
assert_equal 15, Licensee::License.all.size
|
141
|
-
assert_equal
|
131
|
+
assert_equal 24, Licensee::License.all(:hidden => true).size
|
142
132
|
assert_equal Licensee::License, Licensee::License.all.first.class
|
143
133
|
end
|
144
134
|
|
@@ -1,32 +1,26 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
|
-
class
|
4
|
-
|
5
|
-
def setup
|
6
|
-
Licensee.package_manager_files = true
|
7
|
-
end
|
8
|
-
|
9
|
-
def teardown
|
10
|
-
Licensee.package_manager_files = false
|
11
|
-
end
|
12
|
-
|
3
|
+
class TestLicenseeNpmBowerMatchers < Minitest::Test
|
13
4
|
should "detect NPM files" do
|
14
|
-
|
15
|
-
|
5
|
+
pkg = File.read fixture_path("npm/package.json")
|
6
|
+
pkgfile = Licensee::Project::PackageInfo.new(pkg)
|
7
|
+
matcher = Licensee::Matchers::NpmBower.new(pkgfile)
|
16
8
|
assert_equal "mit", matcher.send(:license_property)
|
17
9
|
assert_equal "mit", matcher.match.key
|
18
10
|
end
|
19
11
|
|
20
12
|
should "detect Bower files" do
|
21
|
-
|
22
|
-
|
13
|
+
pkg = File.read fixture_path("bower/bower.json")
|
14
|
+
pkgfile = Licensee::Project::PackageInfo.new(pkg)
|
15
|
+
matcher = Licensee::Matchers::NpmBower.new(pkgfile)
|
23
16
|
assert_equal "mit", matcher.send(:license_property)
|
24
17
|
assert_equal "mit", matcher.match.key
|
25
18
|
end
|
26
19
|
|
27
20
|
should "not err on non-spdx licenses" do
|
28
|
-
|
29
|
-
|
21
|
+
pkg = File.read fixture_path("npm-non-spdx/package.json")
|
22
|
+
pkgfile = Licensee::Project::PackageInfo.new(pkg)
|
23
|
+
matcher = Licensee::Matchers::NpmBower.new(pkgfile)
|
30
24
|
assert_equal "mit-1.0", matcher.send(:license_property)
|
31
25
|
assert_equal nil, matcher.match
|
32
26
|
end
|
@@ -3,66 +3,65 @@ require 'fileutils'
|
|
3
3
|
|
4
4
|
class TestLicenseeProject < Minitest::Test
|
5
5
|
|
6
|
-
[
|
7
|
-
describe(
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
6
|
+
["git", "filesystem"].each do |project_type|
|
7
|
+
describe("#{project_type} repository project") do
|
8
|
+
if project_type == "git"
|
9
|
+
def make_project(fixture_name)
|
10
|
+
fixture = fixture_path fixture_name
|
11
|
+
Licensee::GitProject.new(fixture)
|
12
|
+
end
|
13
|
+
else
|
14
|
+
def make_project(fixture_name)
|
13
15
|
dest = File.join("tmp", "fixtures", fixture_name)
|
14
16
|
FileUtils.mkdir_p File.dirname(dest)
|
15
|
-
system "git", "clone", "-q",
|
17
|
+
system "git", "clone", "-q", fixture_path(fixture_name), dest
|
16
18
|
FileUtils.rm_r File.join(dest, ".git")
|
17
|
-
fixture = dest
|
18
|
-
end
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
Licensee::FSProject.new(dest)
|
21
|
+
end
|
22
22
|
|
23
|
-
unless as_git
|
24
23
|
def teardown
|
25
|
-
FileUtils.rm_rf "tmp/fixtures"
|
24
|
+
FileUtils.rm_rf "tmp/fixtures"
|
26
25
|
end
|
27
26
|
end
|
28
27
|
|
29
28
|
should "detect the license file" do
|
30
|
-
project = make_project "licenses.git"
|
31
|
-
assert_instance_of Licensee::
|
29
|
+
project = make_project "licenses.git"
|
30
|
+
assert_instance_of Licensee::Project::LicenseFile, project.license_file
|
32
31
|
end
|
33
32
|
|
34
33
|
should "detect the license" do
|
35
|
-
project = make_project "licenses.git"
|
34
|
+
project = make_project "licenses.git"
|
36
35
|
assert_equal "mit", project.license.key
|
37
36
|
end
|
38
37
|
|
39
38
|
should "detect an atypically cased license file" do
|
40
|
-
project = make_project "case-sensitive.git"
|
41
|
-
assert_instance_of Licensee::
|
39
|
+
project = make_project "case-sensitive.git"
|
40
|
+
assert_instance_of Licensee::Project::LicenseFile, project.license_file
|
42
41
|
end
|
43
42
|
|
44
43
|
should "detect MIT-LICENSE licensed projects" do
|
45
|
-
project = make_project "named-license-file-prefix.git"
|
44
|
+
project = make_project "named-license-file-prefix.git"
|
46
45
|
assert_equal "mit", project.license.key
|
47
46
|
end
|
48
47
|
|
49
48
|
should "detect LICENSE-MIT licensed projects" do
|
50
|
-
project = make_project "named-license-file-suffix.git"
|
49
|
+
project = make_project "named-license-file-suffix.git"
|
51
50
|
assert_equal "mit", project.license.key
|
52
51
|
end
|
53
52
|
|
54
53
|
should "not error out on repos with folders names license" do
|
55
|
-
project = make_project "license-folder.git"
|
54
|
+
project = make_project "license-folder.git"
|
56
55
|
assert_equal nil, project.license
|
57
56
|
end
|
58
57
|
|
59
58
|
should "detect licence files" do
|
60
|
-
project = make_project "licence.git"
|
59
|
+
project = make_project "licence.git"
|
61
60
|
assert_equal "mit", project.license.key
|
62
61
|
end
|
63
62
|
|
64
63
|
should "detect an unlicensed project" do
|
65
|
-
project = make_project "no-license.git"
|
64
|
+
project = make_project "no-license.git"
|
66
65
|
assert_equal nil, project.license
|
67
66
|
end
|
68
67
|
end
|
@@ -78,19 +77,9 @@ class TestLicenseeProject < Minitest::Test
|
|
78
77
|
end
|
79
78
|
end
|
80
79
|
|
81
|
-
|
82
80
|
describe "packages" do
|
83
|
-
|
84
|
-
def setup
|
85
|
-
Licensee.package_manager_files = true
|
86
|
-
end
|
87
|
-
|
88
|
-
def teardown
|
89
|
-
Licensee.package_manager_files = false
|
90
|
-
end
|
91
|
-
|
92
81
|
should "detect a package file" do
|
93
|
-
project = Licensee::
|
82
|
+
project = Licensee::GitProject.new(fixture_path("npm.git"), detect_packages: true)
|
94
83
|
assert_equal "package.json", project.package_file.filename
|
95
84
|
assert_equal "mit", project.license.key
|
96
85
|
end
|
@@ -4,22 +4,18 @@ class TestLicenseeProjectFile < Minitest::Test
|
|
4
4
|
|
5
5
|
def setup
|
6
6
|
@repo = Rugged::Repository.new(fixture_path("licenses.git"))
|
7
|
-
blob = 'bcb552d06d9cf1cd4c048a6d3bf716849c2216cc'
|
8
|
-
@file = Licensee::
|
7
|
+
blob, _ = Rugged::Blob.to_buffer(@repo, 'bcb552d06d9cf1cd4c048a6d3bf716849c2216cc')
|
8
|
+
@file = Licensee::Project::LicenseFile.new(blob)
|
9
9
|
@gpl = Licensee::License.find "GPL-3.0"
|
10
10
|
@mit = Licensee::License.find "MIT"
|
11
11
|
end
|
12
12
|
|
13
13
|
should "read the file" do
|
14
|
-
assert @file.
|
14
|
+
assert @file.content =~ /MIT/
|
15
15
|
end
|
16
16
|
|
17
17
|
should "match the license" do
|
18
|
-
assert_equal "mit", @file.
|
19
|
-
end
|
20
|
-
|
21
|
-
should "know the path" do
|
22
|
-
assert_equal "LICENSE", @file.path
|
18
|
+
assert_equal "mit", @file.license.key
|
23
19
|
end
|
24
20
|
|
25
21
|
should "calculate confidence" do
|
@@ -31,7 +27,6 @@ class TestLicenseeProjectFile < Minitest::Test
|
|
31
27
|
end
|
32
28
|
|
33
29
|
context "license filename scoring" do
|
34
|
-
|
35
30
|
EXPECTATIONS = {
|
36
31
|
"license" => 1.0,
|
37
32
|
"LICENCE" => 1.0,
|
@@ -52,7 +47,7 @@ class TestLicenseeProjectFile < Minitest::Test
|
|
52
47
|
|
53
48
|
EXPECTATIONS.each do |filename, expected|
|
54
49
|
should "score a license named `#{filename}` as `#{expected}`" do
|
55
|
-
assert_equal expected, Licensee::
|
50
|
+
assert_equal expected, Licensee::Project::LicenseFile.name_score(filename)
|
56
51
|
end
|
57
52
|
end
|
58
53
|
end
|