license_finder-rubyzip3 7.2.1.1
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 +7 -0
- data/.force-build +0 -0
- data/.github/dependabot.yml +16 -0
- data/.gitignore +13 -0
- data/.pre-commit-hooks.yaml +10 -0
- data/.rspec +1 -0
- data/.rubocop.yml +84 -0
- data/CHANGELOG.md +1066 -0
- data/CONTRIBUTING.md +122 -0
- data/Dockerfile +275 -0
- data/Gemfile +2 -0
- data/LICENSE +22 -0
- data/README.md +597 -0
- data/Rakefile +77 -0
- data/TODO.md +12 -0
- data/VERSION +1 -0
- data/appveyor.yml +21 -0
- data/bin/license_finder +6 -0
- data/bin/license_finder_pip.py +43 -0
- data/ci/pipelines/pull-request.yml.erb +138 -0
- data/ci/pipelines/release.yml.erb +176 -0
- data/ci/scripts/containerize-tests.sh +14 -0
- data/ci/scripts/pushscript.sh +31 -0
- data/ci/scripts/run-rubocop.sh +15 -0
- data/ci/scripts/run-tests.sh +41 -0
- data/ci/scripts/test.ps1 +81 -0
- data/ci/scripts/updateChangelog.sh +84 -0
- data/ci/tasks/build-and-push-gem.yml +10 -0
- data/ci/tasks/build-windows.yml +6 -0
- data/ci/tasks/build.yml +16 -0
- data/ci/tasks/rubocop.yml +15 -0
- data/ci/tasks/run-tests.yml +10 -0
- data/ci/tasks/update-changelog.yml +18 -0
- data/dlf +21 -0
- data/examples/Gemfile +4 -0
- data/examples/custom_erb_template.rb +24 -0
- data/examples/extract_license_data.rb +63 -0
- data/examples/sample_template.erb +7 -0
- data/lib/license_finder/cli/approvals.rb +28 -0
- data/lib/license_finder/cli/base.rb +113 -0
- data/lib/license_finder/cli/dependencies.rb +44 -0
- data/lib/license_finder/cli/ignored_dependencies.rb +32 -0
- data/lib/license_finder/cli/ignored_groups.rb +32 -0
- data/lib/license_finder/cli/inherited_decisions.rb +50 -0
- data/lib/license_finder/cli/licenses.rb +31 -0
- data/lib/license_finder/cli/main.rb +229 -0
- data/lib/license_finder/cli/makes_decisions.rb +38 -0
- data/lib/license_finder/cli/patched_thor.rb +33 -0
- data/lib/license_finder/cli/permitted_licenses.rb +32 -0
- data/lib/license_finder/cli/project_name.rb +32 -0
- data/lib/license_finder/cli/restricted_licenses.rb +32 -0
- data/lib/license_finder/cli.rb +20 -0
- data/lib/license_finder/configuration.rb +197 -0
- data/lib/license_finder/core.rb +121 -0
- data/lib/license_finder/decision_applier.rb +70 -0
- data/lib/license_finder/decisions.rb +334 -0
- data/lib/license_finder/decisions_factory.rb +13 -0
- data/lib/license_finder/diff.rb +51 -0
- data/lib/license_finder/license/any_matcher.rb +15 -0
- data/lib/license_finder/license/definitions.rb +498 -0
- data/lib/license_finder/license/header_matcher.rb +17 -0
- data/lib/license_finder/license/matcher.rb +24 -0
- data/lib/license_finder/license/none_matcher.rb +11 -0
- data/lib/license_finder/license/template.rb +19 -0
- data/lib/license_finder/license/templates/0BSD.txt +10 -0
- data/lib/license_finder/license/templates/AGPL3.txt +661 -0
- data/lib/license_finder/license/templates/Apache1_1.txt +16 -0
- data/lib/license_finder/license/templates/Apache2.txt +170 -0
- data/lib/license_finder/license/templates/Artistic.txt +128 -0
- data/lib/license_finder/license/templates/BSD.txt +24 -0
- data/lib/license_finder/license/templates/CC01.txt +30 -0
- data/lib/license_finder/license/templates/CC01_alt.txt +31 -0
- data/lib/license_finder/license/templates/CDDL1.txt +131 -0
- data/lib/license_finder/license/templates/CDDL1_1.txt +123 -0
- data/lib/license_finder/license/templates/CPL1.txt +217 -0
- data/lib/license_finder/license/templates/EPL1.txt +86 -0
- data/lib/license_finder/license/templates/EPL2.txt +80 -0
- data/lib/license_finder/license/templates/GPLv2.txt +339 -0
- data/lib/license_finder/license/templates/GPLv3.txt +674 -0
- data/lib/license_finder/license/templates/ISC.txt +2 -0
- data/lib/license_finder/license/templates/LGPL.txt +165 -0
- data/lib/license_finder/license/templates/LGPL2_1.txt +169 -0
- data/lib/license_finder/license/templates/MIT.txt +9 -0
- data/lib/license_finder/license/templates/MPL1_1.txt +469 -0
- data/lib/license_finder/license/templates/MPL2.txt +373 -0
- data/lib/license_finder/license/templates/NewBSD.txt +21 -0
- data/lib/license_finder/license/templates/OFL.txt +91 -0
- data/lib/license_finder/license/templates/Python.txt +47 -0
- data/lib/license_finder/license/templates/Ruby.txt +52 -0
- data/lib/license_finder/license/templates/SimplifiedBSD.txt +19 -0
- data/lib/license_finder/license/templates/Unlicense.txt +24 -0
- data/lib/license_finder/license/templates/WTFPL.txt +14 -0
- data/lib/license_finder/license/templates/Zlib.txt +17 -0
- data/lib/license_finder/license/text.rb +49 -0
- data/lib/license_finder/license.rb +123 -0
- data/lib/license_finder/license_aggregator.rb +59 -0
- data/lib/license_finder/logger.rb +69 -0
- data/lib/license_finder/manual_licenses.rb +79 -0
- data/lib/license_finder/package.rb +195 -0
- data/lib/license_finder/package_delta.rb +61 -0
- data/lib/license_finder/package_manager.rb +183 -0
- data/lib/license_finder/package_managers/bower.rb +37 -0
- data/lib/license_finder/package_managers/bundler.rb +110 -0
- data/lib/license_finder/package_managers/cargo.rb +38 -0
- data/lib/license_finder/package_managers/carthage.rb +68 -0
- data/lib/license_finder/package_managers/cocoa_pods.rb +66 -0
- data/lib/license_finder/package_managers/composer.rb +63 -0
- data/lib/license_finder/package_managers/conan.rb +70 -0
- data/lib/license_finder/package_managers/conda.rb +131 -0
- data/lib/license_finder/package_managers/dep.rb +45 -0
- data/lib/license_finder/package_managers/dotnet.rb +86 -0
- data/lib/license_finder/package_managers/erlangmk.rb +50 -0
- data/lib/license_finder/package_managers/glide.rb +42 -0
- data/lib/license_finder/package_managers/go_15vendorexperiment.rb +87 -0
- data/lib/license_finder/package_managers/go_dep.rb +80 -0
- data/lib/license_finder/package_managers/go_modules.rb +93 -0
- data/lib/license_finder/package_managers/go_workspace.rb +117 -0
- data/lib/license_finder/package_managers/govendor.rb +73 -0
- data/lib/license_finder/package_managers/gradle.rb +99 -0
- data/lib/license_finder/package_managers/gvt.rb +69 -0
- data/lib/license_finder/package_managers/maven.rb +69 -0
- data/lib/license_finder/package_managers/mix.rb +131 -0
- data/lib/license_finder/package_managers/npm.rb +70 -0
- data/lib/license_finder/package_managers/nuget.rb +159 -0
- data/lib/license_finder/package_managers/pip.rb +70 -0
- data/lib/license_finder/package_managers/pipenv.rb +63 -0
- data/lib/license_finder/package_managers/pnpm.rb +126 -0
- data/lib/license_finder/package_managers/pub.rb +86 -0
- data/lib/license_finder/package_managers/rebar.rb +65 -0
- data/lib/license_finder/package_managers/sbt.rb +46 -0
- data/lib/license_finder/package_managers/spm.rb +93 -0
- data/lib/license_finder/package_managers/trash.rb +43 -0
- data/lib/license_finder/package_managers/yarn.rb +195 -0
- data/lib/license_finder/package_utils/activation.rb +40 -0
- data/lib/license_finder/package_utils/conan_info_parser.rb +77 -0
- data/lib/license_finder/package_utils/conan_info_parser_v2.rb +82 -0
- data/lib/license_finder/package_utils/gradle_dependency_finder.rb +15 -0
- data/lib/license_finder/package_utils/license_files.rb +51 -0
- data/lib/license_finder/package_utils/licensing.rb +40 -0
- data/lib/license_finder/package_utils/maven_dependency_finder.rb +57 -0
- data/lib/license_finder/package_utils/notice_files.rb +51 -0
- data/lib/license_finder/package_utils/possible_license_file.rb +33 -0
- data/lib/license_finder/package_utils/pypi.rb +43 -0
- data/lib/license_finder/package_utils/sbt_dependency_finder.rb +15 -0
- data/lib/license_finder/packages/bower_package.rb +45 -0
- data/lib/license_finder/packages/bundler_package.rb +33 -0
- data/lib/license_finder/packages/cargo_package.rb +28 -0
- data/lib/license_finder/packages/carthage_package.rb +18 -0
- data/lib/license_finder/packages/cocoa_pods_package.rb +22 -0
- data/lib/license_finder/packages/composer_package.rb +13 -0
- data/lib/license_finder/packages/conan_package.rb +23 -0
- data/lib/license_finder/packages/conda_package.rb +74 -0
- data/lib/license_finder/packages/erlangmk_package.rb +112 -0
- data/lib/license_finder/packages/go_package.rb +30 -0
- data/lib/license_finder/packages/gradle_package.rb +30 -0
- data/lib/license_finder/packages/manual_package.rb +27 -0
- data/lib/license_finder/packages/maven_package.rb +39 -0
- data/lib/license_finder/packages/merged_package.rb +44 -0
- data/lib/license_finder/packages/mix_package.rb +13 -0
- data/lib/license_finder/packages/npm_package.rb +219 -0
- data/lib/license_finder/packages/nuget_package.rb +13 -0
- data/lib/license_finder/packages/pip_package.rb +50 -0
- data/lib/license_finder/packages/pnpm_package.rb +13 -0
- data/lib/license_finder/packages/pubspec_package.rb +18 -0
- data/lib/license_finder/packages/rebar_package.rb +13 -0
- data/lib/license_finder/packages/sbt_package.rb +22 -0
- data/lib/license_finder/packages/spm_package.rb +18 -0
- data/lib/license_finder/packages/yarn_package.rb +13 -0
- data/lib/license_finder/platform.rb +15 -0
- data/lib/license_finder/printer.rb +39 -0
- data/lib/license_finder/project_finder.rb +62 -0
- data/lib/license_finder/report.rb +34 -0
- data/lib/license_finder/reports/csv_report.rb +108 -0
- data/lib/license_finder/reports/diff_report.rb +29 -0
- data/lib/license_finder/reports/erb_report.rb +62 -0
- data/lib/license_finder/reports/html_report.rb +13 -0
- data/lib/license_finder/reports/json_report.rb +31 -0
- data/lib/license_finder/reports/junit_report.rb +23 -0
- data/lib/license_finder/reports/markdown_report.rb +9 -0
- data/lib/license_finder/reports/merged_report.rb +16 -0
- data/lib/license_finder/reports/templates/bootstrap.css +9 -0
- data/lib/license_finder/reports/templates/html_report.erb +113 -0
- data/lib/license_finder/reports/templates/junit_report.erb +41 -0
- data/lib/license_finder/reports/templates/markdown_report.erb +49 -0
- data/lib/license_finder/reports/templates/xml_report.erb +19 -0
- data/lib/license_finder/reports/text_report.rb +12 -0
- data/lib/license_finder/reports/xml_report.rb +23 -0
- data/lib/license_finder/scanner.rb +83 -0
- data/lib/license_finder/shared_helpers/cmd.rb +13 -0
- data/lib/license_finder/shared_helpers/common_path.rb +29 -0
- data/lib/license_finder/version.rb +6 -0
- data/lib/license_finder.rb +14 -0
- data/license_finder.gemspec +79 -0
- data/release/instructions.md +8 -0
- data/swift-all-keys.asc +240 -0
- metadata +604 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'license_finder/package_utils/possible_license_file'
|
|
4
|
+
|
|
5
|
+
module LicenseFinder
|
|
6
|
+
class NoticeFiles
|
|
7
|
+
CANDIDATE_FILE_NAMES = %w[NOTICE Notice].freeze
|
|
8
|
+
CANDIDATE_PATH_WILDCARD_STRICT = "{#{CANDIDATE_FILE_NAMES.join(',')}}*"
|
|
9
|
+
CANDIDATE_PATH_WILDCARD = "*#{CANDIDATE_PATH_WILDCARD_STRICT}"
|
|
10
|
+
|
|
11
|
+
def self.find(install_path, options = {})
|
|
12
|
+
new(install_path).find(options)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def initialize(install_path)
|
|
16
|
+
@install_path = install_path ? Pathname(install_path) : nil
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def find(options = {})
|
|
20
|
+
paths_of_candidate_files
|
|
21
|
+
.map { |path| PossibleLicenseFile.new(path, options) } # Not really possible license files, but that class has all we need.
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
attr_reader :install_path
|
|
27
|
+
|
|
28
|
+
def paths_of_candidate_files
|
|
29
|
+
candidate_files_and_dirs
|
|
30
|
+
.flat_map { |path| !path.is_a?(Zip::Entry) && path.directory? ? path.children : path }
|
|
31
|
+
.reject(&:directory?)
|
|
32
|
+
.uniq
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def candidate_files_and_dirs
|
|
36
|
+
return [] if install_path.nil?
|
|
37
|
+
|
|
38
|
+
if !install_path.extname.casecmp('.jar').zero?
|
|
39
|
+
Pathname.glob(install_path.join('**', CANDIDATE_PATH_WILDCARD))
|
|
40
|
+
else
|
|
41
|
+
candidates_from_zip
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def candidates_from_zip
|
|
46
|
+
Zip::File.open(install_path.to_s) do |zip_file|
|
|
47
|
+
zip_file.glob("*/#{CANDIDATE_PATH_WILDCARD_STRICT}", File::FNM_EXTGLOB)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
class PossibleLicenseFile
|
|
5
|
+
def initialize(path, options = {})
|
|
6
|
+
if !path.is_a?(Zip::Entry)
|
|
7
|
+
@path = Pathname(path)
|
|
8
|
+
else
|
|
9
|
+
@zip_entry = path
|
|
10
|
+
end
|
|
11
|
+
@logger = options[:logger]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def path
|
|
15
|
+
@path.to_s
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def license
|
|
19
|
+
License.find_by_text(text)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def text
|
|
23
|
+
if @zip_entry
|
|
24
|
+
@zip_entry.get_input_stream.read
|
|
25
|
+
elsif @path.exist?
|
|
26
|
+
@text ||= (@path.respond_to?(:binread) ? @path.binread : @path.read)
|
|
27
|
+
else
|
|
28
|
+
@logger.info('ERROR', "#{@path} does not exists", color: :red)
|
|
29
|
+
''
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'net/http'
|
|
4
|
+
require 'openssl'
|
|
5
|
+
|
|
6
|
+
module LicenseFinder
|
|
7
|
+
class PyPI
|
|
8
|
+
CONNECTION_ERRORS = [
|
|
9
|
+
EOFError,
|
|
10
|
+
Errno::ECONNREFUSED,
|
|
11
|
+
Errno::ECONNRESET,
|
|
12
|
+
Errno::ECONNRESET,
|
|
13
|
+
Errno::EHOSTUNREACH,
|
|
14
|
+
Errno::EINVAL,
|
|
15
|
+
Net::OpenTimeout,
|
|
16
|
+
Net::ProtocolError,
|
|
17
|
+
Net::ReadTimeout,
|
|
18
|
+
OpenSSL::OpenSSLError,
|
|
19
|
+
OpenSSL::SSL::SSLError,
|
|
20
|
+
SocketError,
|
|
21
|
+
Timeout::Error
|
|
22
|
+
].freeze
|
|
23
|
+
|
|
24
|
+
class << self
|
|
25
|
+
def definition(name, version)
|
|
26
|
+
response = request("https://pypi.org/pypi/#{name}/#{version}/json")
|
|
27
|
+
response.is_a?(Net::HTTPSuccess) ? JSON.parse(response.body).fetch('info', {}) : {}
|
|
28
|
+
rescue *CONNECTION_ERRORS => e
|
|
29
|
+
raise e, "Unable to read package from pypi.org #{name} #{version}: #{e}" unless @prepare_no_fail
|
|
30
|
+
|
|
31
|
+
{}
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def request(location, limit = 10)
|
|
35
|
+
uri = URI(location)
|
|
36
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
|
37
|
+
http.use_ssl = true
|
|
38
|
+
response = http.get(uri.request_uri).response
|
|
39
|
+
response.is_a?(Net::HTTPRedirection) && limit.positive? ? request(response['location'], limit - 1) : response
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
class SbtDependencyFinder
|
|
5
|
+
def initialize(project_path)
|
|
6
|
+
@project_path = project_path
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def dependencies
|
|
10
|
+
Pathname
|
|
11
|
+
.glob(@project_path.join('**', 'target', 'license-reports', '*.csv'))
|
|
12
|
+
.map(&:read)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'open-uri'
|
|
4
|
+
module LicenseFinder
|
|
5
|
+
class BowerPackage < Package
|
|
6
|
+
def initialize(bower_module, options = {})
|
|
7
|
+
spec = bower_module.fetch('pkgMeta', {})
|
|
8
|
+
|
|
9
|
+
if spec.empty?
|
|
10
|
+
endpoint = bower_module.fetch('endpoint', {})
|
|
11
|
+
name = endpoint['name']
|
|
12
|
+
version = endpoint['target']
|
|
13
|
+
else
|
|
14
|
+
name = spec['name']
|
|
15
|
+
version = spec['version']
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
super(
|
|
19
|
+
name,
|
|
20
|
+
version,
|
|
21
|
+
options.merge(
|
|
22
|
+
summary: spec['description'],
|
|
23
|
+
description: spec['readme'],
|
|
24
|
+
homepage: spec['homepage'],
|
|
25
|
+
spec_licenses: Package.license_names_from_standard_spec(spec),
|
|
26
|
+
install_path: bower_module['canonicalDir'],
|
|
27
|
+
missing: bower_module['missing']
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def package_manager
|
|
33
|
+
'Bower'
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def package_url
|
|
37
|
+
meta = if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.5.0')
|
|
38
|
+
JSON.parse(open("https://registry.bower.io/packages/#{CGI.escape(name)}").read)
|
|
39
|
+
else
|
|
40
|
+
JSON.parse(URI.open("https://registry.bower.io/packages/#{CGI.escape(name)}").read)
|
|
41
|
+
end
|
|
42
|
+
meta['url']
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
class BundlerPackage < Package
|
|
5
|
+
def initialize(spec, bundler_def, options = {})
|
|
6
|
+
children = spec.dependencies.map(&:name)
|
|
7
|
+
groups = Array(bundler_def && bundler_def.groups).map(&:to_s)
|
|
8
|
+
|
|
9
|
+
super(
|
|
10
|
+
spec.name,
|
|
11
|
+
spec.version.to_s,
|
|
12
|
+
options.merge(
|
|
13
|
+
authors: Array(spec.authors).join(', '),
|
|
14
|
+
summary: spec.summary,
|
|
15
|
+
description: spec.description,
|
|
16
|
+
homepage: spec.homepage,
|
|
17
|
+
children: children,
|
|
18
|
+
groups: groups,
|
|
19
|
+
spec_licenses: spec.licenses,
|
|
20
|
+
install_path: spec.full_gem_path
|
|
21
|
+
)
|
|
22
|
+
)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def package_manager
|
|
26
|
+
'Bundler'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def package_url
|
|
30
|
+
"https://rubygems.org/gems/#{CGI.escape(name)}/versions/#{CGI.escape(version)}"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
class CargoPackage < Package
|
|
5
|
+
def initialize(crate, options = {})
|
|
6
|
+
crate = crate.reject { |_, v| v.nil? || v == '' }
|
|
7
|
+
children = crate.fetch('dependencies', []).map { |p| p['name'] }
|
|
8
|
+
licenses = crate.fetch('license', '').split('/')
|
|
9
|
+
super(
|
|
10
|
+
crate['name'],
|
|
11
|
+
crate['version'],
|
|
12
|
+
options.merge(
|
|
13
|
+
summary: crate.fetch('description', '').strip,
|
|
14
|
+
spec_licenses: licenses.compact,
|
|
15
|
+
children: children
|
|
16
|
+
)
|
|
17
|
+
)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def package_manager
|
|
21
|
+
'Cargo'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def package_url
|
|
25
|
+
"https://crates.io/crates/#{CGI.escape(name)}/#{CGI.escape(version)}"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
class CarthagePackage < Package
|
|
5
|
+
def initialize(name, version, license_text, options = {})
|
|
6
|
+
super(name, version, options)
|
|
7
|
+
@license = License.find_by_text(license_text.to_s)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def licenses_from_spec
|
|
11
|
+
[@license].compact
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def package_manager
|
|
15
|
+
'Carthage'
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
class CocoaPodsPackage < Package
|
|
5
|
+
def initialize(name, version, license_text, options = {})
|
|
6
|
+
super(name, version, options)
|
|
7
|
+
@license = License.find_by_text(license_text.to_s)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def licenses_from_spec
|
|
11
|
+
[@license].compact
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def package_manager
|
|
15
|
+
'CocoaPods'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def package_url
|
|
19
|
+
"https://cocoapods.org/pods/#{CGI.escape(name)}"
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
class ConanPackage < Package
|
|
5
|
+
def initialize(name, version, license_text, url, options = {})
|
|
6
|
+
super(name, version, options)
|
|
7
|
+
@license = License.find_by_text(license_text.to_s)
|
|
8
|
+
@homepage = url
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def licenses_from_spec
|
|
12
|
+
[@license].compact
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def package_manager
|
|
16
|
+
'Conan'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def package_url
|
|
20
|
+
"https://conan.io/center/#{CGI.escape(name)}/#{CGI.escape(version)}"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
class CondaPackage < Package
|
|
5
|
+
attr_accessor :identifier, :json
|
|
6
|
+
|
|
7
|
+
def initialize(conda_json)
|
|
8
|
+
@json = conda_json
|
|
9
|
+
@identifier = Identifier.from_hash(conda_json)
|
|
10
|
+
super(@identifier.name,
|
|
11
|
+
@identifier.version,
|
|
12
|
+
spec_licenses: Package.license_names_from_standard_spec(conda_json),
|
|
13
|
+
children: children)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def ==(other)
|
|
17
|
+
other.is_a?(CondaPackage) && @identifier == other.identifier
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def to_s
|
|
21
|
+
@identifier.to_s
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def package_manager
|
|
25
|
+
'Conda'
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def package_url
|
|
29
|
+
@json['url']
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def children
|
|
33
|
+
@json.fetch('depends', []).map { |constraint| constraint.split.first }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class Identifier
|
|
37
|
+
attr_accessor :name, :version
|
|
38
|
+
|
|
39
|
+
def initialize(name, version)
|
|
40
|
+
@name = name
|
|
41
|
+
@version = version
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def self.from_hash(hash)
|
|
45
|
+
name = hash['name']
|
|
46
|
+
version = hash['version']
|
|
47
|
+
return nil if name.nil? || version.nil?
|
|
48
|
+
|
|
49
|
+
Identifier.new(name, version)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def ==(other)
|
|
53
|
+
other.is_a?(Identifier) && @name == other.name && @version == other.version
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def eql?(other)
|
|
57
|
+
self == other
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def hash
|
|
61
|
+
[@name, @version].hash
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def <=>(other)
|
|
65
|
+
sort_name = @name <=> other.name
|
|
66
|
+
sort_name.zero? ? @version <=> other.version : sort_name
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def to_s
|
|
70
|
+
"#{@name} - #{@version}"
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rubygems'
|
|
4
|
+
|
|
5
|
+
class InvalidErlangmkPackageError < ArgumentError
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
module LicenseFinder
|
|
9
|
+
class ErlangmkPackage < Package
|
|
10
|
+
attr_reader :dep_parent,
|
|
11
|
+
:dep_name,
|
|
12
|
+
:dep_fetch_method,
|
|
13
|
+
:dep_repo_unformatted,
|
|
14
|
+
:dep_version_unformatted,
|
|
15
|
+
:dep_absolute_path
|
|
16
|
+
|
|
17
|
+
def initialize(dep_string_from_query_deps)
|
|
18
|
+
@dep_parent,
|
|
19
|
+
@dep_name,
|
|
20
|
+
@dep_fetch_method,
|
|
21
|
+
@dep_repo_unformatted,
|
|
22
|
+
@dep_version_unformatted,
|
|
23
|
+
@dep_absolute_path = dep_string_from_query_deps.split
|
|
24
|
+
|
|
25
|
+
raise_invalid(dep_string_from_query_deps) unless all_parts_valid?
|
|
26
|
+
|
|
27
|
+
super(
|
|
28
|
+
dep_name,
|
|
29
|
+
dep_version,
|
|
30
|
+
homepage: dep_repo,
|
|
31
|
+
install_path: dep_absolute_path
|
|
32
|
+
)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def package_manager
|
|
36
|
+
'Erlangmk'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def dep_version
|
|
40
|
+
@dep_version ||= dep_version_unformatted.sub(version_prefix_re, '')
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def dep_repo
|
|
44
|
+
@dep_repo ||= dep_repo_unformatted
|
|
45
|
+
.chomp('.git')
|
|
46
|
+
.sub('git@github.com:', 'https://github.com/')
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def raise_invalid(dep_string)
|
|
50
|
+
invalid_dep_message = "'#{dep_string}' does not look like a valid Erlank.mk dependency"
|
|
51
|
+
valid_dep_example = "A valid dependency example: 'lager: goldrush git https://github.com/DeadZen/goldrush.git 0.1.9 /absolute/path/to/dep'"
|
|
52
|
+
raise(InvalidErlangmkPackageError, "#{invalid_dep_message}. #{valid_dep_example}")
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def all_parts_valid?
|
|
56
|
+
dep_part_valid?(dep_parent) &&
|
|
57
|
+
dep_part_valid?(dep_name) &&
|
|
58
|
+
set?(dep_fetch_method) &&
|
|
59
|
+
dep_repo_valid? &&
|
|
60
|
+
dep_version_valid? &&
|
|
61
|
+
set?(dep_absolute_path)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
private
|
|
65
|
+
|
|
66
|
+
def dep_part_valid?(dep_part)
|
|
67
|
+
set?(dep_part) &&
|
|
68
|
+
word?(dep_part)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def set?(dep_part)
|
|
72
|
+
!dep_part.nil? &&
|
|
73
|
+
!dep_part.empty?
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def word?(dep_part)
|
|
77
|
+
dep = dep_part.chomp(':')
|
|
78
|
+
dep =~ word_re
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def dep_repo_valid?
|
|
82
|
+
set?(dep_repo_unformatted) &&
|
|
83
|
+
URI.parse(dep_repo)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def dep_version_valid?
|
|
87
|
+
return false unless set?(dep_version_unformatted)
|
|
88
|
+
|
|
89
|
+
if dep_version&.match?(version_re)
|
|
90
|
+
Gem::Version.correct?(dep_version)
|
|
91
|
+
else
|
|
92
|
+
dep_version =~ word_dot_re
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def version_re
|
|
97
|
+
@version_re ||= Regexp.new('\d+\.\d+\.\d+')
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def version_prefix_re
|
|
101
|
+
@version_prefix_re ||= Regexp.new('^v')
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def word_re
|
|
105
|
+
@word_re ||= Regexp.new('^\w+$')
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def word_dot_re
|
|
109
|
+
@word_dot_re ||= Regexp.new('^[.\w]+$')
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
class GoPackage < Package
|
|
5
|
+
def package_manager
|
|
6
|
+
'Go'
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def package_url
|
|
10
|
+
"https://pkg.go.dev/#{CGI.escape(name)}@#{CGI.escape(version)}"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class << self
|
|
14
|
+
def from_dependency(hash, prefix, full_version)
|
|
15
|
+
name = hash['ImportPath']
|
|
16
|
+
install_path = hash['InstallPath']
|
|
17
|
+
install_path ||= install_path(prefix.join(name))
|
|
18
|
+
version = full_version ? hash['Rev'].gsub('+incompatible', '') : hash['Rev'][0..6]
|
|
19
|
+
homepage = hash['Homepage']
|
|
20
|
+
new(name, version, install_path: install_path, package_manager: 'Go', homepage: homepage)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def install_path(path)
|
|
26
|
+
Pathname(path).cleanpath.to_s
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
class GradlePackage < Package
|
|
5
|
+
def initialize(spec, options = {})
|
|
6
|
+
name = spec['name']
|
|
7
|
+
if name.scan(':').size >= 1
|
|
8
|
+
group, name, version = name.split(':')
|
|
9
|
+
else
|
|
10
|
+
version = 'unknown'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
name = options[:include_groups] ? "#{group}:#{name}" : name
|
|
14
|
+
|
|
15
|
+
licenses = Array(spec['license'])
|
|
16
|
+
.map { |l| l['name'] }
|
|
17
|
+
.reject { |reject_name| reject_name == 'No license found' }
|
|
18
|
+
|
|
19
|
+
super(name, version, options.merge(spec_licenses: licenses))
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def package_manager
|
|
23
|
+
'Gradle'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def package_url
|
|
27
|
+
"https://plugins.gradle.org/plugin/#{CGI.escape(name)}/#{CGI.escape(version)}"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
class ManualPackage < Package
|
|
5
|
+
def ==(other)
|
|
6
|
+
eql? other
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def eql?(other)
|
|
10
|
+
name == other.name
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def hash
|
|
14
|
+
name.hash
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def licenses_from_spec
|
|
20
|
+
Set.new
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def licenses_from_files
|
|
24
|
+
Set.new
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
class MavenPackage < Package
|
|
5
|
+
def initialize(spec, options = {})
|
|
6
|
+
name = spec['artifactId']
|
|
7
|
+
name = "#{spec['groupId']}:#{name}" if options[:include_groups]
|
|
8
|
+
@jar_file = spec['jarFile']
|
|
9
|
+
|
|
10
|
+
super(
|
|
11
|
+
name,
|
|
12
|
+
spec['version'],
|
|
13
|
+
options.merge(
|
|
14
|
+
spec_licenses: Array(spec['licenses']).map { |l| l['name'] },
|
|
15
|
+
groups: Array(spec['groupId']),
|
|
16
|
+
summary: spec['summary'],
|
|
17
|
+
description: spec['description'],
|
|
18
|
+
homepage: spec['homepage']
|
|
19
|
+
)
|
|
20
|
+
)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def package_manager
|
|
24
|
+
'Maven'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def package_url
|
|
28
|
+
"https://search.maven.org/artifact/#{CGI.escape(groups.first)}/#{CGI.escape(name.split(':').last)}/#{CGI.escape(version)}/jar"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def license_files
|
|
32
|
+
LicenseFiles.find(@jar_file, logger: logger)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def notice_files
|
|
36
|
+
NoticeFiles.find(@jar_file, logger: logger)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
class MergedPackage < Package
|
|
5
|
+
extend Forwardable
|
|
6
|
+
attr_reader :dependency
|
|
7
|
+
|
|
8
|
+
def initialize(package, aggregate_paths)
|
|
9
|
+
@dependency = package
|
|
10
|
+
@aggregate_paths = aggregate_paths.map { |p| Pathname(p) }
|
|
11
|
+
super(package.name, package.version)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def_delegators :@dependency, :name, :version, :authors, :summary, :description, :homepage, :package_url, :children, :parents,
|
|
15
|
+
:groups, :permitted, :restricted, :manual_approval, :install_path, :licenses, :approved_manually?,
|
|
16
|
+
:approved_manually!, :approved?, :permitted!, :permitted?, :restricted!, :restricted?, :hash,
|
|
17
|
+
:activations, :missing, :license_names_from_spec, :decided_licenses, :licensing, :decide_on_license,
|
|
18
|
+
:license_files, :package_manager, :missing?, :log_activation, :notice_files
|
|
19
|
+
|
|
20
|
+
def aggregate_paths
|
|
21
|
+
@aggregate_paths.map { |p| p.expand_path.to_s }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def <=>(other)
|
|
25
|
+
dependency <=> other.dependency
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def eql?(other)
|
|
29
|
+
if other.instance_of? MergedPackage
|
|
30
|
+
other.dependency.eql?(dependency)
|
|
31
|
+
else
|
|
32
|
+
dependency.eql?(other)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def ==(other)
|
|
37
|
+
dependency.eql?(other.dependency) && aggregate_paths.eql?(other.aggregate_paths)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def method_missing(_method_name)
|
|
41
|
+
nil
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|