licensee 9.16.0 → 9.17.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|