licensee 9.16.0 → 9.17.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/bin/licensee +4 -2
- data/lib/licensee/commands/detect.rb +1 -0
- data/lib/licensee/commands/license_path.rb +8 -8
- data/lib/licensee/content_helper.rb +4 -4
- data/lib/licensee/license.rb +2 -2
- data/lib/licensee/license_field.rb +2 -2
- data/lib/licensee/license_meta.rb +2 -2
- data/lib/licensee/matchers/cabal.rb +1 -1
- data/lib/licensee/matchers/cargo.rb +1 -1
- data/lib/licensee/matchers/copyright.rb +3 -3
- data/lib/licensee/matchers/cran.rb +3 -3
- data/lib/licensee/matchers/dist_zilla.rb +1 -1
- data/lib/licensee/matchers/gemspec.rb +5 -5
- data/lib/licensee/matchers/npm_bower.rb +1 -1
- data/lib/licensee/matchers/nuget.rb +6 -6
- data/lib/licensee/matchers/spdx.rb +1 -1
- data/lib/licensee/project_files/license_file.rb +9 -9
- data/lib/licensee/project_files/readme_file.rb +3 -3
- data/lib/licensee/projects/fs_project.rb +2 -2
- data/lib/licensee/projects/git_project.rb +2 -2
- data/lib/licensee/projects/github_project.rb +15 -6
- data/lib/licensee/projects/project.rb +3 -3
- data/lib/licensee/rule.rb +1 -1
- data/lib/licensee/version.rb +1 -1
- data/spec/fixtures/detect.json +1 -1
- data/spec/fixtures/license-hashes.json +2 -0
- data/spec/fixtures/webmock/licensee_alternate_ref.json +26 -0
- data/spec/licensee/commands/license_path_spec.rb +3 -2
- data/spec/licensee/content_helper_spec.rb +1 -1
- data/spec/licensee/license_meta_spec.rb +2 -2
- data/spec/licensee/license_spec.rb +2 -2
- data/spec/licensee/matchers/cran_matcher_spec.rb +0 -2
- data/spec/licensee/projects/{github_project_spec.rb → git_hub_project_spec.rb} +36 -4
- data/spec/licensee_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- data/vendor/choosealicense.com/_licenses/blueoak-1.0.0.txt +84 -0
- data/vendor/choosealicense.com/_licenses/bsd-2-clause-patent.txt +76 -0
- data/vendor/choosealicense.com/_licenses/cc-by-sa-4.0.txt +1 -1
- data/vendor/choosealicense.com/_licenses/epl-1.0.txt +1 -1
- data/vendor/choosealicense.com/_licenses/epl-2.0.txt +3 -3
- data/vendor/choosealicense.com/_licenses/gpl-2.0.txt +1 -1
- data/vendor/choosealicense.com/_licenses/odbl-1.0.txt +1 -1
- data/vendor/choosealicense.com/_licenses/upl-1.0.txt +4 -4
- data/vendor/license-list-XML/src/0BSD.xml +2 -1
- data/vendor/license-list-XML/src/AGPL-3.0.xml +2 -2
- data/vendor/license-list-XML/src/Apache-2.0.xml +2 -2
- data/vendor/license-list-XML/src/BSD-2-Clause-Patent.xml +91 -0
- data/vendor/license-list-XML/src/BSD-2-Clause.xml +2 -2
- data/vendor/license-list-XML/src/BSD-3-Clause-Clear.xml +1 -1
- data/vendor/license-list-XML/src/BSD-3-Clause.xml +9 -9
- data/vendor/license-list-XML/src/BlueOak-1.0.0.xml +31 -0
- data/vendor/license-list-XML/src/CC-BY-4.0.xml +12 -12
- data/vendor/license-list-XML/src/CC-BY-SA-4.0.xml +12 -12
- data/vendor/license-list-XML/src/CECILL-2.1.xml +1 -1
- data/vendor/license-list-XML/src/EPL-2.0.xml +1 -1
- data/vendor/license-list-XML/src/EUPL-1.2.xml +1 -1
- data/vendor/license-list-XML/src/GFDL-1.3.xml +1 -1
- data/vendor/license-list-XML/src/GPL-2.0.xml +5 -5
- data/vendor/license-list-XML/src/GPL-3.0.xml +1 -1
- data/vendor/license-list-XML/src/LGPL-2.1.xml +1 -1
- data/vendor/license-list-XML/src/LGPL-3.0.xml +1 -1
- data/vendor/license-list-XML/src/MIT.xml +2 -2
- data/vendor/license-list-XML/src/MulanPSL-2.0.xml +1 -1
- data/vendor/license-list-XML/src/UPL-1.0.xml +1 -1
- data/vendor/license-list-XML/src/Unlicense.xml +1 -1
- data/vendor/license-list-XML/src/Vim.xml +1 -1
- data/vendor/license-list-XML/src/WTFPL.xml +1 -1
- metadata +26 -16
- data/licensee.gemspec +0 -47
- /data/spec/licensee/project_files/{package_info_spec.rb → package_manager_file_spec.rb} +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fcfd6caf41091c1b39ac120a61729786b14cce5e814f6d5fdcb46705c53ab0b6
|
|
4
|
+
data.tar.gz: 8d8d4d6b4beb0062ab28ee47171cc30009c2713aeddccd789c493b82b98db2fd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 57286ce86923c9dd5aeb47f3f825667040034459ae43744a50c5085a629f02b4ffad76a6ce6a28d86c5aad25d4776fceec13e4f9a0bde8aa94505b83a62868e2
|
|
7
|
+
data.tar.gz: 3f452acd71edba99d0043352900e3e88cd9009a6cb64dfacd184b73ffcfa408b4ec0166a5fc1f064593afd166e7ad064de3bd54c4803ded33419e09ec547fea0
|
data/bin/licensee
CHANGED
|
@@ -28,7 +28,9 @@ class LicenseeCLI < Thor
|
|
|
28
28
|
|
|
29
29
|
def project
|
|
30
30
|
@project ||= Licensee.project(path,
|
|
31
|
-
detect_packages: options[:packages],
|
|
31
|
+
detect_packages: options[:packages],
|
|
32
|
+
detect_readme: options[:readme],
|
|
33
|
+
ref: options[:ref])
|
|
32
34
|
end
|
|
33
35
|
|
|
34
36
|
def remote?
|
|
@@ -37,6 +39,6 @@ class LicenseeCLI < Thor
|
|
|
37
39
|
end
|
|
38
40
|
|
|
39
41
|
commands_dir = File.expand_path '../lib/licensee/commands/', __dir__
|
|
40
|
-
Dir["#{commands_dir}/*.rb"].
|
|
42
|
+
Dir["#{commands_dir}/*.rb"].each { |c| require(c) }
|
|
41
43
|
|
|
42
44
|
LicenseeCLI.start(ARGV)
|
|
@@ -13,6 +13,7 @@ class LicenseeCLI < Thor
|
|
|
13
13
|
option :confidence, type: :numeric, default: Licensee.confidence_threshold, desc: 'Confidence threshold'
|
|
14
14
|
option :license, type: :string, desc: 'The SPDX ID or key of the license to compare (implies --diff)'
|
|
15
15
|
option :diff, type: :boolean, desc: 'Compare the license to the closest match'
|
|
16
|
+
option :ref, type: :string, desc: 'The name of the commit/branch/tag to search (github.com only)'
|
|
16
17
|
def detect(_path = nil)
|
|
17
18
|
Licensee.confidence_threshold = options[:confidence]
|
|
18
19
|
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
class LicenseeCLI < Thor
|
|
4
4
|
desc 'license-path [PATH]', "Returns the path to the given project's license file"
|
|
5
|
-
def license_path(
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
def license_path(path)
|
|
6
|
+
project = Licensee.project(path)
|
|
7
|
+
|
|
8
|
+
exit 1 unless project.license_file
|
|
9
|
+
|
|
10
|
+
if remote?
|
|
11
|
+
say project.license_file.path
|
|
12
12
|
else
|
|
13
|
-
|
|
13
|
+
say File.expand_path(project.license_file.path, path)
|
|
14
14
|
end
|
|
15
15
|
end
|
|
16
16
|
end
|
|
@@ -6,8 +6,8 @@ require 'digest'
|
|
|
6
6
|
module Licensee
|
|
7
7
|
module ContentHelper
|
|
8
8
|
DIGEST = Digest::SHA1
|
|
9
|
-
START_REGEX = /\A\s
|
|
10
|
-
END_OF_TERMS_REGEX = /^[\s#*_]*end of (the )?terms and conditions[\s#*_]*$/i
|
|
9
|
+
START_REGEX = /\A\s*/
|
|
10
|
+
END_OF_TERMS_REGEX = /^[\s#*_]*end of (the )?terms and conditions[\s#*_]*$/i
|
|
11
11
|
REGEXES = {
|
|
12
12
|
bom: /#{START_REGEX}\xEF\xBB\xBF/,
|
|
13
13
|
hrs: /^\s*[=\-*]{3,}\s*$/,
|
|
@@ -304,8 +304,8 @@ module Licensee
|
|
|
304
304
|
|
|
305
305
|
if operation
|
|
306
306
|
@_content = _content.gsub operation[:from], operation[:to]
|
|
307
|
-
elsif respond_to?("normalize_#{from_or_key}", true)
|
|
308
|
-
send("normalize_#{from_or_key}")
|
|
307
|
+
elsif respond_to?(:"normalize_#{from_or_key}", true)
|
|
308
|
+
send(:"normalize_#{from_or_key}")
|
|
309
309
|
else
|
|
310
310
|
raise ArgumentError, "#{from_or_key} is an invalid normalization"
|
|
311
311
|
end
|
data/lib/licensee/license.rb
CHANGED
|
@@ -98,8 +98,8 @@ module Licensee
|
|
|
98
98
|
pseudo: true
|
|
99
99
|
}.freeze
|
|
100
100
|
|
|
101
|
-
SOURCE_PREFIX = %r{https?://(?:www\.)?}i
|
|
102
|
-
SOURCE_SUFFIX = %r{(?:\.html?|\.txt|/)(?:\?[^\s]*)?}i
|
|
101
|
+
SOURCE_PREFIX = %r{https?://(?:www\.)?}i
|
|
102
|
+
SOURCE_SUFFIX = %r{(?:\.html?|\.txt|/)(?:\?[^\s]*)?}i
|
|
103
103
|
|
|
104
104
|
HASH_METHODS = %i[
|
|
105
105
|
key spdx_id meta url rules fields other? gpl? lgpl? cc?
|
|
@@ -22,7 +22,7 @@ module Licensee
|
|
|
22
22
|
@all ||= begin
|
|
23
23
|
path = '../../vendor/choosealicense.com/_data/fields.yml'
|
|
24
24
|
path = File.expand_path path, __dir__
|
|
25
|
-
fields = YAML.
|
|
25
|
+
fields = YAML.safe_load_file(path)
|
|
26
26
|
fields.map { |field| LicenseField.from_hash(field) }
|
|
27
27
|
end
|
|
28
28
|
end
|
|
@@ -47,7 +47,7 @@ module Licensee
|
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
alias key name
|
|
50
|
-
FIELD_REGEX = /\[(#{Regexp.union(LicenseField.keys)})\]
|
|
50
|
+
FIELD_REGEX = /\[(#{Regexp.union(LicenseField.keys)})\]/
|
|
51
51
|
|
|
52
52
|
# The human-readable field name
|
|
53
53
|
def label
|
|
@@ -43,12 +43,12 @@ module Licensee
|
|
|
43
43
|
|
|
44
44
|
# Array of symbolized helper methods to expose on the License class
|
|
45
45
|
def helper_methods
|
|
46
|
-
members - PREDICATE_FIELDS + PREDICATE_FIELDS.map { |f| "#{f}?"
|
|
46
|
+
members - PREDICATE_FIELDS + PREDICATE_FIELDS.map { |f| :"#{f}?" }
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
PREDICATE_FIELDS.each do |field|
|
|
51
|
-
alias_method "#{field}?"
|
|
51
|
+
alias_method :"#{field}?", field
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
# Backward compatibalize `#["spdx-id"]` calls to avoid a breaking change
|
|
@@ -5,7 +5,7 @@ module Licensee
|
|
|
5
5
|
class Cabal < Licensee::Matchers::Package
|
|
6
6
|
# While we could parse the cabal file, prefer
|
|
7
7
|
# a lenient regex for speed and security. Moar parsing moar problems.
|
|
8
|
-
LICENSE_REGEX = /^\s*license\s*:\s*([a-z\-0-9.]+)\s*$/ix
|
|
8
|
+
LICENSE_REGEX = /^\s*license\s*:\s*([a-z\-0-9.]+)\s*$/ix
|
|
9
9
|
LICENSE_CONVERSIONS = {
|
|
10
10
|
'GPL-2' => 'GPL-2.0',
|
|
11
11
|
'GPL-3' => 'GPL-3.0',
|
|
@@ -6,9 +6,9 @@ module Licensee
|
|
|
6
6
|
attr_reader :file
|
|
7
7
|
|
|
8
8
|
COPYRIGHT_SYMBOLS = Regexp.union([/copyright/i, /\(c\)/i, "\u00A9", "\xC2\xA9"])
|
|
9
|
-
MAIN_LINE_REGEX = /[_*\-\s]*#{COPYRIGHT_SYMBOLS}.*$/i
|
|
10
|
-
OPTIONAL_LINE_REGEX = /[_*\-\s]*with Reserved Font Name.*$/i
|
|
11
|
-
REGEX = /#{ContentHelper::START_REGEX}(#{MAIN_LINE_REGEX}#{OPTIONAL_LINE_REGEX}*)+$/i
|
|
9
|
+
MAIN_LINE_REGEX = /[_*\-\s]*#{COPYRIGHT_SYMBOLS}.*$/i
|
|
10
|
+
OPTIONAL_LINE_REGEX = /[_*\-\s]*with Reserved Font Name.*$/i
|
|
11
|
+
REGEX = /#{ContentHelper::START_REGEX}(#{MAIN_LINE_REGEX}#{OPTIONAL_LINE_REGEX}*)+$/i
|
|
12
12
|
def match
|
|
13
13
|
# NOTE: must use content, and not content_normalized here
|
|
14
14
|
Licensee::License.find('no-license') if /#{REGEX}+\z/io.match?(file.content.strip)
|
|
@@ -7,9 +7,9 @@ module Licensee
|
|
|
7
7
|
|
|
8
8
|
# While we could parse the DESCRIPTION file, prefer
|
|
9
9
|
# a lenient regex for speed and security. Moar parsing moar problems.
|
|
10
|
-
LICENSE_FIELD_REGEX = /^license:\s*(.+)/i
|
|
11
|
-
PLUS_FILE_LICENSE_REGEX = /\s*\+\s*file\s+LICENSE$/i
|
|
12
|
-
GPL_VERSION_REGEX = /^GPL(?:-([23])|\s*\(\s*>=\s*([23])\s*\))$/i
|
|
10
|
+
LICENSE_FIELD_REGEX = /^license:\s*(.+)/i
|
|
11
|
+
PLUS_FILE_LICENSE_REGEX = /\s*\+\s*file\s+LICENSE$/i
|
|
12
|
+
GPL_VERSION_REGEX = /^GPL(?:-([23])|\s*\(\s*>=\s*([23])\s*\))$/i
|
|
13
13
|
|
|
14
14
|
private
|
|
15
15
|
|
|
@@ -5,24 +5,24 @@ module Licensee
|
|
|
5
5
|
class Gemspec < Licensee::Matchers::Package
|
|
6
6
|
# a value is a string surrounded by any amount of whitespace
|
|
7
7
|
# optionally ended with (non-captured) ".freeze"
|
|
8
|
-
VALUE_REGEX = /\s*['"]([a-z\-0-9.]+)['"](?:\.freeze)?\s*/i
|
|
8
|
+
VALUE_REGEX = /\s*['"]([a-z\-0-9.]+)['"](?:\.freeze)?\s*/i
|
|
9
9
|
|
|
10
10
|
# an array contains one or more values. all values, or array itself,
|
|
11
11
|
# can be surrounded by any amount of whitespace. do not capture
|
|
12
12
|
# non-value groups
|
|
13
|
-
ARRAY_REGEX = /\s*\[#{VALUE_REGEX}(?:,#{VALUE_REGEX})*\]\s*/i
|
|
13
|
+
ARRAY_REGEX = /\s*\[#{VALUE_REGEX}(?:,#{VALUE_REGEX})*\]\s*/i
|
|
14
14
|
|
|
15
15
|
DECLARATION_REGEX = /
|
|
16
16
|
^\s*[a-z0-9_]+\.([a-z0-9_]+)\s*=#{VALUE_REGEX}$
|
|
17
|
-
/ix
|
|
17
|
+
/ix
|
|
18
18
|
|
|
19
19
|
LICENSE_REGEX = /
|
|
20
20
|
^\s*[a-z0-9_]+\.license\s*=#{VALUE_REGEX}$
|
|
21
|
-
/ix
|
|
21
|
+
/ix
|
|
22
22
|
|
|
23
23
|
LICENSE_ARRAY_REGEX = /
|
|
24
24
|
^\s*[a-z0-9_]+\.licenses\s*=#{ARRAY_REGEX}$
|
|
25
|
-
/ix
|
|
25
|
+
/ix
|
|
26
26
|
|
|
27
27
|
private
|
|
28
28
|
|
|
@@ -7,14 +7,14 @@ module Licensee
|
|
|
7
7
|
# Moar parsing moar problems.
|
|
8
8
|
LICENSE_REGEX = %r{
|
|
9
9
|
<license\s*type\s*=\s*["']expression["']\s*>([a-z\-0-9. +()]+)</license\s*>
|
|
10
|
-
}ix
|
|
10
|
+
}ix
|
|
11
11
|
|
|
12
|
-
LICENSE_URL_REGEX = %r{<licenseUrl>\s*(.*)\s*</licenseUrl>}i
|
|
12
|
+
LICENSE_URL_REGEX = %r{<licenseUrl>\s*(.*)\s*</licenseUrl>}i
|
|
13
13
|
|
|
14
|
-
NUGET_REGEX = %r{https?://licenses.nuget.org/(.*)}i
|
|
15
|
-
OPENSOURCE_REGEX = %r{https?://(?:www\.)?opensource.org/licenses/(.*)}i
|
|
16
|
-
SPDX_REGEX = %r{https?://(?:www\.)?spdx.org/licenses/(.*?)(?:\.html|\.txt)?$}i
|
|
17
|
-
APACHE_REGEX = %r{https?://(?:www\.)?apache.org/licenses/(.*?)(?:\.html|\.txt)?$}i
|
|
14
|
+
NUGET_REGEX = %r{https?://licenses.nuget.org/(.*)}i
|
|
15
|
+
OPENSOURCE_REGEX = %r{https?://(?:www\.)?opensource.org/licenses/(.*)}i
|
|
16
|
+
SPDX_REGEX = %r{https?://(?:www\.)?spdx.org/licenses/(.*?)(?:\.html|\.txt)?$}i
|
|
17
|
+
APACHE_REGEX = %r{https?://(?:www\.)?apache.org/licenses/(.*?)(?:\.html|\.txt)?$}i
|
|
18
18
|
|
|
19
19
|
private
|
|
20
20
|
|
|
@@ -5,7 +5,7 @@ module Licensee
|
|
|
5
5
|
class Spdx < Licensee::Matchers::Package
|
|
6
6
|
# While we could parse the LICENSE.spdx file, prefer
|
|
7
7
|
# a lenient regex for speed and security. Moar parsing moar problems.
|
|
8
|
-
LICENSE_REGEX = /PackageLicenseDeclared:\s*([a-z\-0-9. +()]+)\s*/i
|
|
8
|
+
LICENSE_REGEX = /PackageLicenseDeclared:\s*([a-z\-0-9. +()]+)\s*/i
|
|
9
9
|
|
|
10
10
|
private
|
|
11
11
|
|
|
@@ -7,29 +7,29 @@ module Licensee
|
|
|
7
7
|
|
|
8
8
|
# List of extensions to give preference to
|
|
9
9
|
PREFERRED_EXT = %w[md markdown txt html].freeze
|
|
10
|
-
PREFERRED_EXT_REGEX = /\.#{Regexp.union(PREFERRED_EXT)}\z
|
|
10
|
+
PREFERRED_EXT_REGEX = /\.#{Regexp.union(PREFERRED_EXT)}\z/
|
|
11
11
|
|
|
12
12
|
# Regex to match any extension except .spdx or .header
|
|
13
|
-
LICENSE_EXT_REGEX = %r{\.(?!spdx|header)[^./]+\z}i
|
|
13
|
+
LICENSE_EXT_REGEX = %r{\.(?!spdx|header)[^./]+\z}i
|
|
14
14
|
|
|
15
15
|
# Regex to match any extension except a few unlikely as license
|
|
16
16
|
# texts with complex filenames
|
|
17
|
-
OTHER_EXT_REGEX = %r{\.(?!xml|go|gemspec)[^./]+\z}i
|
|
17
|
+
OTHER_EXT_REGEX = %r{\.(?!xml|go|gemspec)[^./]+\z}i
|
|
18
18
|
|
|
19
19
|
# Regex to match any extension
|
|
20
|
-
ANY_EXT_REGEX = %r{\.[^./]+\z}i
|
|
20
|
+
ANY_EXT_REGEX = %r{\.[^./]+\z}i
|
|
21
21
|
|
|
22
22
|
# Regex to match, LICENSE, LICENCE, unlicense, etc.
|
|
23
|
-
LICENSE_REGEX = /(un)?licen[sc]e/i
|
|
23
|
+
LICENSE_REGEX = /(un)?licen[sc]e/i
|
|
24
24
|
|
|
25
25
|
# Regex to match COPYING, COPYRIGHT, etc.
|
|
26
|
-
COPYING_REGEX = /copy(ing|right)/i
|
|
26
|
+
COPYING_REGEX = /copy(ing|right)/i
|
|
27
27
|
|
|
28
28
|
# Regex to match OFL.
|
|
29
|
-
OFL_REGEX = /ofl/i
|
|
29
|
+
OFL_REGEX = /ofl/i
|
|
30
30
|
|
|
31
31
|
# BSD + PATENTS patent file
|
|
32
|
-
PATENTS_REGEX = /patents/i
|
|
32
|
+
PATENTS_REGEX = /patents/i
|
|
33
33
|
|
|
34
34
|
# Hash of Regex => score with which to score potential license files
|
|
35
35
|
FILENAME_REGEXES = {
|
|
@@ -55,7 +55,7 @@ module Licensee
|
|
|
55
55
|
# detected as CC-BY or CC-BY-SA which are 98%+ similar
|
|
56
56
|
CC_FALSE_POSITIVE_REGEX = /
|
|
57
57
|
^(creative\ commons\ )?Attribution-(NonCommercial|NoDerivatives)
|
|
58
|
-
/xi
|
|
58
|
+
/xi
|
|
59
59
|
|
|
60
60
|
def possible_matchers
|
|
61
61
|
[Matchers::Copyright, Matchers::Exact, Matchers::Dice]
|
|
@@ -9,8 +9,8 @@ module Licensee
|
|
|
9
9
|
/\AREADME\.(#{Regexp.union(EXTENSIONS).source})\z/i => 0.9
|
|
10
10
|
}.freeze
|
|
11
11
|
|
|
12
|
-
TITLE_REGEX = /licen[sc]e:?/i
|
|
13
|
-
UNDERLINE_REGEX = /\n[-=]+/m
|
|
12
|
+
TITLE_REGEX = /licen[sc]e:?/i
|
|
13
|
+
UNDERLINE_REGEX = /\n[-=]+/m
|
|
14
14
|
CONTENT_REGEX = /^
|
|
15
15
|
(?: # Header lookbehind
|
|
16
16
|
[\#=]+\s#{TITLE_REGEX}\s*[\#=]* # Start of hashes or rdoc header
|
|
@@ -27,7 +27,7 @@ module Licensee
|
|
|
27
27
|
|
|
|
28
28
|
\z # End of file
|
|
29
29
|
)
|
|
30
|
-
/mix
|
|
30
|
+
/mix
|
|
31
31
|
|
|
32
32
|
def possible_matchers
|
|
33
33
|
super.push(Matchers::Reference)
|
|
@@ -34,11 +34,11 @@ module Licensee
|
|
|
34
34
|
def files
|
|
35
35
|
@files ||= search_directories.flat_map do |dir|
|
|
36
36
|
relative_dir = Pathname.new(dir).relative_path_from(dir_path).to_s
|
|
37
|
-
Dir.glob(::File.join(dir, @pattern).tr('\\', '/')).
|
|
37
|
+
Dir.glob(::File.join(dir, @pattern).tr('\\', '/')).filter_map do |file|
|
|
38
38
|
next unless ::File.file?(file)
|
|
39
39
|
|
|
40
40
|
{ name: ::File.basename(file), dir: relative_dir }
|
|
41
|
-
end
|
|
41
|
+
end
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
44
|
|
|
@@ -12,22 +12,24 @@ autoload :Octokit, 'octokit'
|
|
|
12
12
|
module Licensee
|
|
13
13
|
module Projects
|
|
14
14
|
class GitHubProject < Licensee::Projects::Project
|
|
15
|
+
attr_reader :ref, :repo
|
|
16
|
+
|
|
15
17
|
# If there's any trailing data (e.g. `.git`) this pattern will ignore it:
|
|
16
18
|
# we're going to use the API rather than clone the repo.
|
|
17
19
|
GITHUB_REPO_PATTERN =
|
|
18
|
-
%r{https://github.com/([^/]+/([^/]+(?=\.git)|[^/]+)).*}
|
|
20
|
+
%r{https://github.com/([^/]+/([^/]+(?=\.git)|[^/]+)).*}
|
|
19
21
|
|
|
20
22
|
class RepoNotFound < StandardError; end
|
|
21
23
|
|
|
22
|
-
def initialize(github_url, **args)
|
|
24
|
+
def initialize(github_url, ref: nil, **args)
|
|
23
25
|
@repo = github_url[GITHUB_REPO_PATTERN, 1]
|
|
24
26
|
raise ArgumentError, "Not a github URL: #{github_url}" unless @repo
|
|
25
27
|
|
|
28
|
+
@ref = ref
|
|
29
|
+
|
|
26
30
|
super(**args)
|
|
27
31
|
end
|
|
28
32
|
|
|
29
|
-
attr_reader :repo
|
|
30
|
-
|
|
31
33
|
private
|
|
32
34
|
|
|
33
35
|
def files
|
|
@@ -40,14 +42,21 @@ module Licensee
|
|
|
40
42
|
raise RepoNotFound, msg
|
|
41
43
|
end
|
|
42
44
|
|
|
45
|
+
def query_params
|
|
46
|
+
return { ref: @ref } unless @ref.nil?
|
|
47
|
+
|
|
48
|
+
{}
|
|
49
|
+
end
|
|
50
|
+
|
|
43
51
|
def load_file(file)
|
|
44
52
|
client.contents(@repo, path: file[:path],
|
|
45
|
-
accept: 'application/vnd.github.v3.raw'
|
|
53
|
+
accept: 'application/vnd.github.v3.raw',
|
|
54
|
+
query: query_params).to_s
|
|
46
55
|
end
|
|
47
56
|
|
|
48
57
|
def dir_files(path = nil)
|
|
49
58
|
path = path.gsub('./', '') if path
|
|
50
|
-
files = client.contents(@repo, path: path)
|
|
59
|
+
files = client.contents(@repo, path: path, query: query_params)
|
|
51
60
|
files = files.select { |data| data[:type] == 'file' }
|
|
52
61
|
files.each { |data| data[:dir] = File.dirname(data[:path]) }
|
|
53
62
|
files.map(&:to_h)
|
|
@@ -15,7 +15,7 @@ module Licensee
|
|
|
15
15
|
include Licensee::HashHelper
|
|
16
16
|
HASH_METHODS = %i[licenses matched_files].freeze
|
|
17
17
|
|
|
18
|
-
def initialize(detect_packages: false, detect_readme: false)
|
|
18
|
+
def initialize(detect_packages: false, detect_readme: false, **)
|
|
19
19
|
@detect_packages = detect_packages
|
|
20
20
|
@detect_readme = detect_readme
|
|
21
21
|
end
|
|
@@ -119,10 +119,10 @@ module Licensee
|
|
|
119
119
|
# Given a block, passes each filename to that block, and expects a numeric
|
|
120
120
|
# score in response. Returns a hash representing the top scoring file
|
|
121
121
|
# or nil, if no file scored > 0
|
|
122
|
-
def find_file(
|
|
122
|
+
def find_file(...)
|
|
123
123
|
return if files.empty? || files.nil?
|
|
124
124
|
|
|
125
|
-
file = find_files(
|
|
125
|
+
file = find_files(...).first
|
|
126
126
|
[load_file(file), file] if file
|
|
127
127
|
end
|
|
128
128
|
|
data/lib/licensee/rule.rb
CHANGED
data/lib/licensee/version.rb
CHANGED
data/spec/fixtures/detect.json
CHANGED
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
},
|
|
94
94
|
{
|
|
95
95
|
"filename": "licensee.gemspec",
|
|
96
|
-
"content": "# frozen_string_literal: true\n\nrequire File.expand_path('lib/licensee/version', __dir__)\n\nGem::Specification.new do |gem|\n gem.name = 'licensee'\n gem.version = Licensee::VERSION\n\n gem.summary = 'A Ruby Gem to detect open source project licenses'\n gem.description = <<-DESC\n Licensee automates the process of reading LICENSE files and\n compares their contents to known licenses using a fancy maths.\n DESC\n\n gem.authors = ['Ben Balter']\n gem.email = 'ben.balter@github.com'\n gem.homepage = 'https://github.com/benbalter/licensee'\n gem.license = 'MIT'\n gem.metadata['rubygems_mfa_required'] = 'true'\n\n gem.bindir = 'bin'\n gem.executables << 'licensee'\n\n gem.add_dependency('dotenv', '
|
|
96
|
+
"content": "# frozen_string_literal: true\n\nrequire File.expand_path('lib/licensee/version', __dir__)\n\nGem::Specification.new do |gem|\n gem.name = 'licensee'\n gem.version = Licensee::VERSION\n\n gem.summary = 'A Ruby Gem to detect open source project licenses'\n gem.description = <<-DESC\n Licensee automates the process of reading LICENSE files and\n compares their contents to known licenses using a fancy maths.\n DESC\n\n gem.authors = ['Ben Balter']\n gem.email = 'ben.balter@github.com'\n gem.homepage = 'https://github.com/benbalter/licensee'\n gem.license = 'MIT'\n gem.metadata['rubygems_mfa_required'] = 'true'\n\n gem.bindir = 'bin'\n gem.executables << 'licensee'\n\n gem.add_dependency('dotenv', '>= 2', '< 4')\n gem.add_dependency('octokit', '>= 4.20', '< 9.0')\n gem.add_dependency('reverse_markdown', '>= 1', '< 3')\n gem.add_dependency('rugged', '>= 0.24', '<2.0')\n gem.add_dependency('thor', '>= 0.19', '< 2.0')\n\n gem.add_development_dependency('gem-release', '~> 2.0')\n gem.add_development_dependency('mustache', '>= 0.9', '< 2.0')\n gem.add_development_dependency('pry', '~> 0.9')\n gem.add_development_dependency('rspec', '~> 3.5')\n gem.add_development_dependency('rubocop', '~> 1.0')\n gem.add_development_dependency('rubocop-performance', '~> 1.5')\n gem.add_development_dependency('rubocop-rspec', '~> 2.0')\n gem.add_development_dependency('simplecov', '~> 0.16')\n gem.add_development_dependency('webmock', '~> 3.1')\n\n gem.required_ruby_version = '>= 3.0'\n\n # ensure the gem is built out of versioned files\n gem.files = Dir[\n '{bin,lib,man,test,vendor,spec}/**/*',\n 'README*', 'LICENSE*'\n ] & `git ls-files -z`.split(\"\\0\")\nend\n",
|
|
97
97
|
"content_hash": null,
|
|
98
98
|
"content_normalized": null,
|
|
99
99
|
"matcher": {
|
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
"agpl-3.0": "10486392ac9e730ec8f77bd1233edfc2d47dd23c",
|
|
5
5
|
"apache-2.0": "bec905d850e7f5dc2e2db78a950d4a9db560a0b8",
|
|
6
6
|
"artistic-2.0": "707698f0c53ab48d54b7fd2dc4a6f40533e8ebb3",
|
|
7
|
+
"blueoak-1.0.0": "4b1a6751488e0f5ac96e40f26cf4e3fc731b9daf",
|
|
7
8
|
"bsd-2-clause": "a307ca750c21f262c95d2bce55e69c05e6c3dee9",
|
|
9
|
+
"bsd-2-clause-patent": "4098aa43dc82fbb6da400e2f5b1840d8b9fcea7f",
|
|
8
10
|
"bsd-3-clause": "a961b19cc6921d510e29a13b0ba1a826fcffe41c",
|
|
9
11
|
"bsd-3-clause-clear": "0fcdb12c4060ce8f406e17bc67787e50a9b36a61",
|
|
10
12
|
"bsd-4-clause": "3b2917580b2b6f13efaaea37546b8b7a53716a30",
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"name": "LICENSE",
|
|
4
|
+
"path": "LICENSE",
|
|
5
|
+
"sha": "sha1",
|
|
6
|
+
"size": 11357,
|
|
7
|
+
"url": "https://api.github.com/repos/benbalter/licensee/contents/LICENSE?ref=my-ref",
|
|
8
|
+
"html_url": "https://github.com/benbalter/licensee/blob/my-ref/LICENSE",
|
|
9
|
+
"git_url": "https://api.github.com/repos/benbalter/licensee/git/blobs/sha1",
|
|
10
|
+
"download_url": "https://raw.githubusercontent.com/benbalter/licensee/my-ref/LICENSE",
|
|
11
|
+
"type": "file",
|
|
12
|
+
"_links": {}
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"name": "README.md",
|
|
16
|
+
"path": "README.md",
|
|
17
|
+
"sha": "sha2",
|
|
18
|
+
"size": 608,
|
|
19
|
+
"url": "https://api.github.com/repos/benbalter/licensee/contents/README.md?ref=my-ref",
|
|
20
|
+
"html_url": "https://github.com/benbalter/licensee/blob/my-ref/README.md",
|
|
21
|
+
"git_url": "https://api.github.com/repos/benbalter/licensee/git/blobs/sha2",
|
|
22
|
+
"download_url": "https://raw.githubusercontent.com/benbalter/licensee/my-ref/README.md",
|
|
23
|
+
"type": "file",
|
|
24
|
+
"_links": {}
|
|
25
|
+
}
|
|
26
|
+
]
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
RSpec.describe 'license-path command' do
|
|
4
4
|
let(:command) { ['bundle', 'exec', 'bin/licensee', 'license-path'] }
|
|
5
|
-
let(:
|
|
5
|
+
let(:project_path) { fixture_path('mit_markdown') }
|
|
6
|
+
let(:arguments) { [project_path] }
|
|
6
7
|
let(:output) do
|
|
7
8
|
Dir.chdir project_root do
|
|
8
9
|
Open3.capture3(*[command, arguments].flatten)
|
|
@@ -14,7 +15,7 @@ RSpec.describe 'license-path command' do
|
|
|
14
15
|
let(:status) { output[2] }
|
|
15
16
|
|
|
16
17
|
it 'returns the license path' do
|
|
17
|
-
expect(stdout).to match(File.join(
|
|
18
|
+
expect(stdout).to match(File.join(project_path, 'LICENSE.md'))
|
|
18
19
|
end
|
|
19
20
|
|
|
20
21
|
it 'Returns a zero exit code' do
|
|
@@ -111,7 +111,7 @@ RSpec.describe Licensee::ContentHelper do
|
|
|
111
111
|
comment_markup: "/*\n* The MIT License\n* Foo\n*/",
|
|
112
112
|
copyright_title: "Copyright 2019 Ben Balter\nMIT License\nFoo"
|
|
113
113
|
}.each do |field, fixture|
|
|
114
|
-
|
|
114
|
+
describe "#strip_#{field}" do
|
|
115
115
|
let(:content) { fixture }
|
|
116
116
|
|
|
117
117
|
it "strips #{field}" do
|
|
@@ -28,11 +28,11 @@ RSpec.describe Licensee::LicenseMeta do
|
|
|
28
28
|
described_class::PREDICATE_FIELDS.each do |field|
|
|
29
29
|
context "the #{field}? method" do
|
|
30
30
|
it 'responds' do
|
|
31
|
-
expect(subject).to respond_to("#{field}?"
|
|
31
|
+
expect(subject).to respond_to(:"#{field}?")
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
it 'is boolean' do
|
|
35
|
-
expect(subject.send("#{field}?"
|
|
35
|
+
expect(subject.send(:"#{field}?")).to be(true).or be(false)
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
RSpec.describe Licensee::License do
|
|
4
|
-
let(:license_count) {
|
|
5
|
-
let(:hidden_license_count) {
|
|
4
|
+
let(:license_count) { 49 }
|
|
5
|
+
let(:hidden_license_count) { 36 }
|
|
6
6
|
let(:featured_license_count) { 3 }
|
|
7
7
|
let(:pseudo_license_count) { 2 }
|
|
8
8
|
let(:non_featured_license_count) do
|
|
@@ -4,8 +4,6 @@ RSpec.describe Licensee::Matchers::Cran do
|
|
|
4
4
|
subject { described_class.new(file) }
|
|
5
5
|
|
|
6
6
|
let(:mit) { Licensee::License.find('mit') }
|
|
7
|
-
let(:gpl2) { Licensee::License.find('gpl-2.0') }
|
|
8
|
-
let(:gpl3) { Licensee::License.find('gpl-3.0') }
|
|
9
7
|
let(:content) { "License: MIT + file LICENSE\nPackage: test" }
|
|
10
8
|
let(:file) { Licensee::ProjectFiles::LicenseFile.new(content, 'DESCRIPTION') }
|
|
11
9
|
|