licensee 5.0.0b4 → 5.0.0b5
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/bin/licensee +5 -1
- data/lib/licensee.rb +1 -5
- data/lib/licensee/content_helper.rb +13 -0
- data/lib/licensee/license.rb +19 -1
- data/lib/licensee/matchers/copyright_matcher.rb +3 -2
- data/lib/licensee/matchers/git_matcher.rb +2 -2
- data/lib/licensee/matchers/levenshtein_matcher.rb +20 -1
- data/lib/licensee/project_file.rb +9 -7
- data/lib/licensee/version.rb +1 -1
- data/test/fixtures/mit-without-title/mit.txt +19 -0
- data/test/functions.rb +16 -3
- data/test/test_licensee.rb +0 -4
- data/test/test_licensee_bin.rb +1 -1
- data/test/test_licensee_content_helper.rb +36 -0
- data/test/test_licensee_git_matcher.rb +1 -0
- data/test/test_licensee_levenshtein_matcher.rb +3 -3
- data/test/test_licensee_license.rb +31 -0
- data/test/test_licensee_project.rb +4 -0
- data/test/test_licensee_project_file.rb +4 -5
- data/test/test_licensee_vendor.rb +5 -3
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3141e0f1cc301cf2aebb6f835212533eafe27316
|
4
|
+
data.tar.gz: 3fac37012f662fd0520b99106793d3b43bafce61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc48939cb0de92f1305b7e341b01da174c298b262ec58a1f6a7ed66298a1d4f68ecfbb1dc870e64cab51bb75298b643a66770c3590b666d2c3cdf7a8881049d3
|
7
|
+
data.tar.gz: 8f8350d224fa1cb4f18661a3a42c876e2dd450670de6f3888b8cbeef6a9a8ffdbe7ab635b8702b27b179b92115cf7defe32436b51bb7ee25a74ea7d8b440f474
|
data/bin/licensee
CHANGED
@@ -7,8 +7,12 @@ Licensee.package_manager_files = true
|
|
7
7
|
project = Licensee::Project.new(path)
|
8
8
|
license = project.matched_file
|
9
9
|
|
10
|
+
if project.license_file
|
11
|
+
puts "License file: #{project.license_file.path}"
|
12
|
+
puts "Attribution: #{project.license_file.attribution}" if project.license_file.attribution
|
13
|
+
end
|
14
|
+
|
10
15
|
if license
|
11
|
-
puts "Matched file: #{license.path}"
|
12
16
|
puts "License: #{license.match ? license.match.meta['title'] : 'no license'}"
|
13
17
|
puts "Confidence: #{license.confidence}%"
|
14
18
|
puts "Method: #{license.matcher.class}"
|
data/lib/licensee.rb
CHANGED
@@ -4,6 +4,7 @@ require 'rugged'
|
|
4
4
|
require 'levenshtein'
|
5
5
|
|
6
6
|
require_relative "licensee/version"
|
7
|
+
require_relative "licensee/content_helper"
|
7
8
|
require_relative "licensee/license"
|
8
9
|
require_relative "licensee/project"
|
9
10
|
require_relative "licensee/project_file"
|
@@ -39,11 +40,6 @@ class Licensee
|
|
39
40
|
Licensee::Project.new(path).license
|
40
41
|
end
|
41
42
|
|
42
|
-
# Diffs the project license and the known license
|
43
|
-
def diff(path)
|
44
|
-
Licensee::Project.new(path).license_file.diff
|
45
|
-
end
|
46
|
-
|
47
43
|
# Array of matchers to use, in order of preference
|
48
44
|
# The order should be decending order of anticipated speed to match
|
49
45
|
def matchers
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Licensee
|
2
|
+
module ContentHelper
|
3
|
+
def normalize_content(content)
|
4
|
+
return unless content
|
5
|
+
content = content.downcase
|
6
|
+
content = content.gsub(/\A[[:space:]]+/, '')
|
7
|
+
content = content.gsub(/[[:space:]]+\z/, '')
|
8
|
+
content = content.gsub(/^#{CopyrightMatcher::REGEX}$/i, '')
|
9
|
+
content = content.gsub(/[[:space:]]+/, ' ')
|
10
|
+
content.squeeze(' ').strip
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/licensee/license.rb
CHANGED
@@ -39,6 +39,8 @@ class Licensee
|
|
39
39
|
|
40
40
|
HIDDEN_LICENSES = %w[other no-license]
|
41
41
|
|
42
|
+
include Licensee::ContentHelper
|
43
|
+
|
42
44
|
def initialize(key)
|
43
45
|
@key=key.downcase
|
44
46
|
end
|
@@ -76,6 +78,14 @@ class Licensee
|
|
76
78
|
meta.nil? ? key.capitalize : meta["title"]
|
77
79
|
end
|
78
80
|
|
81
|
+
def nickname
|
82
|
+
meta["nickname"] if meta
|
83
|
+
end
|
84
|
+
|
85
|
+
def name_without_version
|
86
|
+
/(.+?)(( v?\d\.\d)|$)/.match(name)[1]
|
87
|
+
end
|
88
|
+
|
79
89
|
def featured?
|
80
90
|
!!(meta["featured"] if meta)
|
81
91
|
end
|
@@ -95,7 +105,7 @@ class Licensee
|
|
95
105
|
|
96
106
|
# License body with all whitespace replaced with a single space
|
97
107
|
def body_normalized
|
98
|
-
@
|
108
|
+
@body_normalized ||= normalize_content(body)
|
99
109
|
end
|
100
110
|
|
101
111
|
# Git-computed hash signature for the license file
|
@@ -118,6 +128,14 @@ class Licensee
|
|
118
128
|
other != nil && key == other.key
|
119
129
|
end
|
120
130
|
|
131
|
+
def body_includes_name?
|
132
|
+
@body_includes_name ||= body_normalized.include?(name_without_version.downcase)
|
133
|
+
end
|
134
|
+
|
135
|
+
def body_includes_nickname?
|
136
|
+
@body_includes_nickname ||= !!(nickname && body_normalized.include?(nickname.downcase))
|
137
|
+
end
|
138
|
+
|
121
139
|
private
|
122
140
|
|
123
141
|
def parts
|
@@ -2,10 +2,11 @@
|
|
2
2
|
class Licensee
|
3
3
|
class CopyrightMatcher < Matcher
|
4
4
|
|
5
|
-
REGEX = /\
|
5
|
+
REGEX = /\s*Copyright (©|\(c\)|\xC2\xA9)? ?(\d{4}|\[year\])(.*)?\s*/i
|
6
6
|
|
7
7
|
def match
|
8
|
-
|
8
|
+
# Note: must use content, and not content_normalized here
|
9
|
+
no_license if file.content.strip =~ /\A#{REGEX}\z/i
|
9
10
|
rescue
|
10
11
|
nil
|
11
12
|
end
|
@@ -2,7 +2,7 @@ class Licensee
|
|
2
2
|
class GitMatcher < Matcher
|
3
3
|
|
4
4
|
def match
|
5
|
-
match_info[0]
|
5
|
+
match_info[0] if match_info && match_info[1] >= Licensee.confidence_threshold
|
6
6
|
end
|
7
7
|
|
8
8
|
def confidence
|
@@ -19,7 +19,7 @@ class Licensee
|
|
19
19
|
def match_info
|
20
20
|
@match_info ||= begin
|
21
21
|
match = matches.max_by { |license, similarity| similarity }
|
22
|
-
match if match
|
22
|
+
match if match
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -4,6 +4,13 @@ class Licensee
|
|
4
4
|
# Return the first potential license that is more similar than the confidence threshold
|
5
5
|
def match
|
6
6
|
@match ||= potential_licenses.find do |license|
|
7
|
+
|
8
|
+
# If we know the license text contains the license name or nickname,
|
9
|
+
# bail early unless the file we're checking contains it.
|
10
|
+
# Guards against OSL & AFL confusion. See https://github.com/benbalter/licensee/issues/50
|
11
|
+
next if license.body_includes_name? && !includes_license_name?(license)
|
12
|
+
next if license.body_includes_nickname? && !includes_license_nickname?(license)
|
13
|
+
|
7
14
|
similarity(license) >= Licensee.confidence_threshold
|
8
15
|
end
|
9
16
|
end
|
@@ -12,7 +19,11 @@ class Licensee
|
|
12
19
|
# Difference in lengths cannot exceed the file's length * the confidence threshold / 100
|
13
20
|
def potential_licenses
|
14
21
|
@potential_licenses ||= begin
|
15
|
-
Licensee.licenses(:hidden => true)
|
22
|
+
licenses = Licensee.licenses(:hidden => true)
|
23
|
+
licenses = licenses.select do |license|
|
24
|
+
license.body_normalized && length_delta(license) <= max_delta
|
25
|
+
end
|
26
|
+
licenses.sort_by { |l| length_delta(l) }
|
16
27
|
end
|
17
28
|
end
|
18
29
|
|
@@ -51,5 +62,13 @@ class Licensee
|
|
51
62
|
def distance(license)
|
52
63
|
Levenshtein.distance(license.body_normalized, file.content_normalized).to_f
|
53
64
|
end
|
65
|
+
|
66
|
+
def includes_license_name?(license)
|
67
|
+
file.content_normalized.include?(license.name_without_version.downcase)
|
68
|
+
end
|
69
|
+
|
70
|
+
def includes_license_nickname?(license)
|
71
|
+
license.nickname && file.content_normalized.include?(license.nickname.downcase)
|
72
|
+
end
|
54
73
|
end
|
55
74
|
end
|
@@ -7,6 +7,8 @@ class Licensee
|
|
7
7
|
attr_reader :blob, :path
|
8
8
|
alias_method :filename, :path
|
9
9
|
|
10
|
+
include Licensee::ContentHelper
|
11
|
+
|
10
12
|
def initialize(blob, path)
|
11
13
|
@blob = blob
|
12
14
|
@path = path
|
@@ -21,7 +23,7 @@ class Licensee
|
|
21
23
|
|
22
24
|
# File content with all whitespace replaced with a single space
|
23
25
|
def content_normalized
|
24
|
-
@content_normalized ||= content
|
26
|
+
@content_normalized ||= normalize_content(content)
|
25
27
|
end
|
26
28
|
|
27
29
|
# Determines which matching strategy to use, returns an instane of that matcher
|
@@ -46,12 +48,6 @@ class Licensee
|
|
46
48
|
0
|
47
49
|
end
|
48
50
|
|
49
|
-
# Comptutes a diff between known license and project license
|
50
|
-
def diff(options={})
|
51
|
-
options = options.merge(:reverse => true)
|
52
|
-
blob.diff(match.body, options).to_s if match
|
53
|
-
end
|
54
|
-
|
55
51
|
def license_score
|
56
52
|
self.class.license_score(filename)
|
57
53
|
end
|
@@ -60,6 +56,12 @@ class Licensee
|
|
60
56
|
license_score != 0.0
|
61
57
|
end
|
62
58
|
|
59
|
+
def attribution
|
60
|
+
return nil unless license?
|
61
|
+
matches = /^#{CopyrightMatcher::REGEX}$/i.match(content)
|
62
|
+
matches[0].strip if matches
|
63
|
+
end
|
64
|
+
|
63
65
|
def package_score
|
64
66
|
return 1.0 if filename =~ /[a-zA-Z0-9\-_]+\.gemspec/
|
65
67
|
return 1.0 if filename =~ /package\.json/
|
data/lib/licensee/version.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2015 Ben Balter
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
11
|
+
copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
SOFTWARE.
|
data/test/functions.rb
CHANGED
@@ -22,8 +22,8 @@ end
|
|
22
22
|
FakeBlob = Licensee::FilesystemRepository::Blob
|
23
23
|
|
24
24
|
def chaos_monkey(string)
|
25
|
-
Random.rand(
|
26
|
-
string[Random.rand(string.length)] = SecureRandom.base64(Random.rand(
|
25
|
+
Random.rand(3).times do
|
26
|
+
string[Random.rand(string.length)] = SecureRandom.base64(Random.rand(3))
|
27
27
|
end
|
28
28
|
string
|
29
29
|
end
|
@@ -39,15 +39,28 @@ def verify_license_file(license, chaos = false, wrap=false)
|
|
39
39
|
license_file = Licensee::ProjectFile.new(blob, "LICENSE")
|
40
40
|
|
41
41
|
actual = license_file.match
|
42
|
-
|
42
|
+
msg = "No match for #{expected}."
|
43
|
+
|
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
|
+
assert actual, msg
|
43
53
|
assert_equal expected, actual.key, "expeceted #{expected} but got #{actual.key} for .match. Confidence: #{license_file.confidence}. Method: #{license_file.matcher.class}"
|
44
54
|
end
|
45
55
|
|
46
56
|
def wrap(text, line_width=80)
|
47
57
|
text = text.clone
|
58
|
+
copyright = /^#{Licensee::CopyrightMatcher::REGEX}$/i.match(text)
|
59
|
+
text.gsub! /^#{Licensee::CopyrightMatcher::REGEX}$/i, '[COPYRIGHT]' if copyright
|
48
60
|
text.gsub! /([^\n])\n([^\n])/, '\1 \2'
|
49
61
|
text = text.split("\n").collect do |line|
|
50
62
|
line.length > line_width ? line.gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n").strip : line
|
51
63
|
end * "\n"
|
64
|
+
text.gsub! "[COPYRIGHT]", "\n#{copyright}\n" if copyright
|
52
65
|
text.strip
|
53
66
|
end
|
data/test/test_licensee.rb
CHANGED
@@ -12,10 +12,6 @@ class TestLicensee < Minitest::Test
|
|
12
12
|
assert_equal "mit", Licensee.license(fixture_path("licenses.git")).key
|
13
13
|
end
|
14
14
|
|
15
|
-
should "diff a license" do
|
16
|
-
Licensee.diff(fixture_path("licenses.git"))
|
17
|
-
end
|
18
|
-
|
19
15
|
context "confidence threshold" do
|
20
16
|
should "return the confidence threshold" do
|
21
17
|
assert_equal 90, Licensee.confidence_threshold
|
data/test/test_licensee_bin.rb
CHANGED
@@ -6,7 +6,7 @@ class TestLicenseeBin < Minitest::Test
|
|
6
6
|
Dir.chdir root
|
7
7
|
stdout,stderr,status = Open3.capture3("#{root}/bin/licensee")
|
8
8
|
assert stdout.include?("License: MIT"), "expected #{stdout} to include `License: MIT`"
|
9
|
-
assert stdout.include?("
|
9
|
+
assert stdout.include?("License file: LICENSE.md"), "expected #{stdout} to include `Matched file: LICENSE.md`"
|
10
10
|
assert_equal 0, status
|
11
11
|
end
|
12
12
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestHelper
|
4
|
+
include Licensee::ContentHelper
|
5
|
+
end
|
6
|
+
|
7
|
+
class TestLicenseeContentHelper < Minitest::Test
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@helper = TestHelper.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def normalize(content)
|
14
|
+
@helper.normalize_content(content)
|
15
|
+
end
|
16
|
+
|
17
|
+
should "downcase content" do
|
18
|
+
assert_equal "foo", normalize("Foo")
|
19
|
+
end
|
20
|
+
|
21
|
+
should "strip leading whitespace" do
|
22
|
+
assert_equal "foo", normalize("\n Foo")
|
23
|
+
end
|
24
|
+
|
25
|
+
should "strip trailing whitespace" do
|
26
|
+
assert_equal "foo", normalize("Foo \n ")
|
27
|
+
end
|
28
|
+
|
29
|
+
should "strip double spaces" do
|
30
|
+
assert_equal "foo bar", normalize("Foo bar")
|
31
|
+
end
|
32
|
+
|
33
|
+
should "strip copyrights" do
|
34
|
+
assert_equal "foo", normalize("Copyright (c) 2015 Ben Balter\nFoo")
|
35
|
+
end
|
36
|
+
end
|
@@ -18,13 +18,13 @@ class TestLicenseeLevenshteinMatcher < Minitest::Test
|
|
18
18
|
end
|
19
19
|
|
20
20
|
should "calculate max delta" do
|
21
|
-
assert_equal
|
21
|
+
assert_equal 937.8000000000001, Licensee::LevenshteinMatcher.new(@mit).max_delta
|
22
22
|
end
|
23
23
|
|
24
24
|
should "calculate length delta" do
|
25
25
|
isc = Licensee::License.find("isc")
|
26
|
-
assert_equal
|
27
|
-
assert_equal
|
26
|
+
assert_equal 0.0, Licensee::LevenshteinMatcher.new(@mit).length_delta(Licensee::License.find("mit"))
|
27
|
+
assert_equal 347.0, Licensee::LevenshteinMatcher.new(@mit).length_delta(isc)
|
28
28
|
end
|
29
29
|
|
30
30
|
should "round up potential licenses" do
|
@@ -30,6 +30,11 @@ class TestLicenseeLicense < Minitest::Test
|
|
30
30
|
assert_equal "MIT License", @license.name
|
31
31
|
end
|
32
32
|
|
33
|
+
should "know the license nickname" do
|
34
|
+
expected = "GNU Affero GPL v3.0"
|
35
|
+
assert_equal expected, Licensee::License.find("agpl-3.0").nickname
|
36
|
+
end
|
37
|
+
|
33
38
|
should "know the license ID" do
|
34
39
|
assert_equal "mit", @license.key
|
35
40
|
end
|
@@ -98,6 +103,32 @@ class TestLicenseeLicense < Minitest::Test
|
|
98
103
|
refute license.featured?
|
99
104
|
end
|
100
105
|
|
106
|
+
describe "name without version" do
|
107
|
+
should "strip the version from the license name" do
|
108
|
+
expected = "GNU Affero General Public License"
|
109
|
+
assert_equal expected, Licensee::License.find("agpl-3.0").name_without_version
|
110
|
+
expected = "GNU General Public License"
|
111
|
+
assert_equal expected, Licensee::License.find("gpl-2.0").name_without_version
|
112
|
+
assert_equal expected, Licensee::License.find("gpl-3.0").name_without_version
|
113
|
+
end
|
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
|
+
Licensee.licenses.each do |license|
|
126
|
+
should "strip the version number from the #{license.name} license" do
|
127
|
+
assert license.name_without_version
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
101
132
|
describe "class methods" do
|
102
133
|
should "know license names" do
|
103
134
|
assert_equal Array, Licensee::License.keys.class
|
@@ -22,13 +22,12 @@ class TestLicenseeProjectFile < Minitest::Test
|
|
22
22
|
assert_equal "LICENSE", @file.path
|
23
23
|
end
|
24
24
|
|
25
|
-
should "
|
26
|
-
|
27
|
-
assert @file.diff.include?(expected)
|
25
|
+
should "calculate confidence" do
|
26
|
+
assert_equal 100, @file.confidence
|
28
27
|
end
|
29
28
|
|
30
|
-
should "
|
31
|
-
assert_equal
|
29
|
+
should "parse the attribution" do
|
30
|
+
assert_equal "Copyright (c) 2014 Ben Balter", @file.attribution
|
32
31
|
end
|
33
32
|
|
34
33
|
context "license filename scoring" do
|
@@ -1,15 +1,17 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class TestLicenseeVendor < Minitest::Test
|
4
|
-
Licensee::License.send(:license_files).shuffle.each do |license|
|
5
4
|
|
5
|
+
SKIP = %[wtfpl no-license]
|
6
|
+
|
7
|
+
Licensee::License.send(:license_files).shuffle.each do |license|
|
6
8
|
should "detect the #{license} license" do
|
7
9
|
verify_license_file(license)
|
8
10
|
end
|
9
11
|
|
10
12
|
context "when modified" do
|
11
13
|
should "detect the #{license} license" do
|
12
|
-
verify_license_file(license, true) unless license
|
14
|
+
verify_license_file(license, true) unless SKIP.include?(File.basename(license, ".txt"))
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
@@ -20,7 +22,7 @@ class TestLicenseeVendor < Minitest::Test
|
|
20
22
|
|
21
23
|
context "when modified" do
|
22
24
|
should "detect the #{license} license" do
|
23
|
-
verify_license_file(license, true, 50) unless license
|
25
|
+
verify_license_file(license, true, 50) unless SKIP.include?(File.basename(license, ".txt"))
|
24
26
|
end
|
25
27
|
end
|
26
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: licensee
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.
|
4
|
+
version: 5.0.0b5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Balter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rugged
|
@@ -107,6 +107,7 @@ files:
|
|
107
107
|
- Rakefile
|
108
108
|
- bin/licensee
|
109
109
|
- lib/licensee.rb
|
110
|
+
- lib/licensee/content_helper.rb
|
110
111
|
- lib/licensee/filesystem_repository.rb
|
111
112
|
- lib/licensee/license.rb
|
112
113
|
- lib/licensee/matcher.rb
|
@@ -151,6 +152,7 @@ files:
|
|
151
152
|
- test/fixtures/licenses.git/objects/pack/pack-4a7088171ae3ca900f010a4be6f1c2c96490c338.pack
|
152
153
|
- test/fixtures/licenses.git/packed-refs
|
153
154
|
- test/fixtures/licenses.git/refs/heads/master
|
155
|
+
- test/fixtures/mit-without-title/mit.txt
|
154
156
|
- test/fixtures/named-license-file-prefix.git/HEAD
|
155
157
|
- test/fixtures/named-license-file-prefix.git/config
|
156
158
|
- test/fixtures/named-license-file-prefix.git/objects/64/3983d3f82ecc2a7d8e4227946220ebffd477d2
|
@@ -177,6 +179,7 @@ files:
|
|
177
179
|
- test/helper.rb
|
178
180
|
- test/test_licensee.rb
|
179
181
|
- test/test_licensee_bin.rb
|
182
|
+
- test/test_licensee_content_helper.rb
|
180
183
|
- test/test_licensee_copyright_matcher.rb
|
181
184
|
- test/test_licensee_exact_matcher.rb
|
182
185
|
- test/test_licensee_gemspec_matcher.rb
|