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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +15 -50
  3. data/bin/licensee +7 -8
  4. data/lib/licensee.rb +9 -33
  5. data/lib/licensee/content_helper.rb +7 -8
  6. data/lib/licensee/license.rb +5 -28
  7. data/lib/licensee/matchers/copyright_matcher.rb +17 -16
  8. data/lib/licensee/matchers/dice_matcher.rb +65 -0
  9. data/lib/licensee/matchers/exact_matcher.rb +12 -6
  10. data/lib/licensee/matchers/gemspec_matcher.rb +11 -11
  11. data/lib/licensee/matchers/npm_bower_matcher.rb +10 -10
  12. data/lib/licensee/matchers/package_matcher.rb +11 -10
  13. data/lib/licensee/project.rb +96 -30
  14. data/lib/licensee/project_file.rb +57 -77
  15. data/lib/licensee/version.rb +1 -1
  16. data/licensee.gemspec +26 -0
  17. data/test/fixtures/npm.git/HEAD +1 -0
  18. data/test/fixtures/npm.git/config +4 -0
  19. data/test/fixtures/npm.git/objects/info/packs +2 -0
  20. data/test/fixtures/npm.git/objects/pack/pack-03c0879445cabcc37f91d97c7955465adef26f4a.idx +0 -0
  21. data/test/fixtures/npm.git/objects/pack/pack-03c0879445cabcc37f91d97c7955465adef26f4a.pack +0 -0
  22. data/test/fixtures/npm.git/packed-refs +2 -0
  23. data/test/functions.rb +4 -15
  24. data/test/test_licensee.rb +1 -13
  25. data/test/test_licensee_copyright_matcher.rb +19 -28
  26. data/test/test_licensee_dice_matcher.rb +21 -0
  27. data/test/test_licensee_exact_matcher.rb +4 -6
  28. data/test/test_licensee_gemspec_matcher.rb +3 -11
  29. data/test/test_licensee_license.rb +2 -12
  30. data/test/test_licensee_npm_bower_matcher.rb +10 -16
  31. data/test/test_licensee_project.rb +24 -35
  32. data/test/test_licensee_project_file.rb +5 -10
  33. data/vendor/choosealicense.com/_licenses/afl-3.0.txt +69 -0
  34. data/vendor/choosealicense.com/_licenses/isc.txt +2 -2
  35. metadata +14 -26
  36. data/lib/licensee/filesystem_repository.rb +0 -38
  37. data/lib/licensee/matcher.rb +0 -32
  38. data/lib/licensee/matchers/git_matcher.rb +0 -27
  39. data/lib/licensee/matchers/levenshtein_matcher.rb +0 -75
  40. data/test/test_licensee_content_helper.rb +0 -40
  41. data/test/test_licensee_git_matcher.rb +0 -19
  42. data/test/test_licensee_levenshtein_matcher.rb +0 -34
  43. 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
- blob = FakeBlob.new(text)
39
- license_file = Licensee::ProjectFile.new(blob, "LICENSE")
36
+ license_file = Licensee::Project::LicenseFile.new(text)
40
37
 
41
- actual = license_file.match
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::CopyrightMatcher::REGEX}$/i.match(text)
59
- text.gsub! /^#{Licensee::CopyrightMatcher::REGEX}$/i, '[COPYRIGHT]' if copyright
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
@@ -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 23, Licensee.licenses(:hidden => true).size
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 TestLicenseeCopyrightMatcher < Minitest::Test
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
- assert_equal "no-license", Licensee::CopyrightMatcher.match(@file).key
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
- assert_equal 100, Licensee::CopyrightMatcher.new(@file).confidence
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
- blob = FakeBlob.new(text)
23
- file = Licensee::ProjectFile.new(blob, "LICENSE")
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
- blob = FakeBlob.new(text)
30
- file = Licensee::ProjectFile.new(blob, "LICENSE")
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
- blob = FakeBlob.new(text)
37
- file = Licensee::ProjectFile.new(blob, "LICENSE")
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
- blob = FakeBlob.new(text)
44
- file = Licensee::ProjectFile.new(blob, "LICENSE")
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
- blob = FakeBlob.new(text)
51
- file = Licensee::ProjectFile.new(blob, "LICENSE")
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
- blob = FakeBlob.new(text)
58
- file = Licensee::ProjectFile.new(blob, "LICENSE")
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 TestLicenseeExactMatcher < Minitest::Test
4
-
3
+ class TestLicenseeExactMatchers < Minitest::Test
5
4
  def setup
6
5
  text = File.open(Licensee::License.find("mit").path).read.split("---").last
7
- blob = FakeBlob.new(text)
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::ExactMatcher.match(@mit).key
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::ExactMatcher.new(@mit).confidence
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 TestLicenseeGemspecMatcher < Minitest::Test
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::Project.new(root)
15
- matcher = Licensee::GemspecMatcher.new(project.package_file)
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 23, Licensee::License.keys.size
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 23, Licensee::License.all(:hidden => true).size
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 TestLicenseeNpmBowerMatcher < Minitest::Test
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
- project = Licensee::Project.new fixture_path "npm"
15
- matcher = Licensee::NpmBowerMatcher.new(project.package_file)
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
- project = Licensee::Project.new fixture_path "bower"
22
- matcher = Licensee::NpmBowerMatcher.new(project.package_file)
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
- project = Licensee::Project.new fixture_path "npm-non-spdx"
29
- matcher = Licensee::NpmBowerMatcher.new(project.package_file)
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
- [true, false].each do |as_git|
7
- describe(as_git ? "git" : "non-git") do
8
-
9
- def make_project(fixture_name, as_git)
10
- fixture = fixture_path fixture_name
11
-
12
- unless as_git
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", fixture, dest
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
- Licensee::Project.new fixture
21
- end
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", as_git
31
- assert_instance_of Licensee::ProjectFile, project.license_file
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", as_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", as_git
41
- assert_instance_of Licensee::ProjectFile, project.license_file
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", as_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", as_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", as_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", as_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", as_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::Project.new fixture_path "npm"
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::ProjectFile.new(@repo.lookup(blob), "LICENSE")
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.contents =~ /MIT/
14
+ assert @file.content =~ /MIT/
15
15
  end
16
16
 
17
17
  should "match the license" do
18
- assert_equal "mit", @file.match.key
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::ProjectFile.license_score(filename)
50
+ assert_equal expected, Licensee::Project::LicenseFile.name_score(filename)
56
51
  end
57
52
  end
58
53
  end