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.
Files changed (196) hide show
  1. checksums.yaml +7 -0
  2. data/.force-build +0 -0
  3. data/.github/dependabot.yml +16 -0
  4. data/.gitignore +13 -0
  5. data/.pre-commit-hooks.yaml +10 -0
  6. data/.rspec +1 -0
  7. data/.rubocop.yml +84 -0
  8. data/CHANGELOG.md +1066 -0
  9. data/CONTRIBUTING.md +122 -0
  10. data/Dockerfile +275 -0
  11. data/Gemfile +2 -0
  12. data/LICENSE +22 -0
  13. data/README.md +597 -0
  14. data/Rakefile +77 -0
  15. data/TODO.md +12 -0
  16. data/VERSION +1 -0
  17. data/appveyor.yml +21 -0
  18. data/bin/license_finder +6 -0
  19. data/bin/license_finder_pip.py +43 -0
  20. data/ci/pipelines/pull-request.yml.erb +138 -0
  21. data/ci/pipelines/release.yml.erb +176 -0
  22. data/ci/scripts/containerize-tests.sh +14 -0
  23. data/ci/scripts/pushscript.sh +31 -0
  24. data/ci/scripts/run-rubocop.sh +15 -0
  25. data/ci/scripts/run-tests.sh +41 -0
  26. data/ci/scripts/test.ps1 +81 -0
  27. data/ci/scripts/updateChangelog.sh +84 -0
  28. data/ci/tasks/build-and-push-gem.yml +10 -0
  29. data/ci/tasks/build-windows.yml +6 -0
  30. data/ci/tasks/build.yml +16 -0
  31. data/ci/tasks/rubocop.yml +15 -0
  32. data/ci/tasks/run-tests.yml +10 -0
  33. data/ci/tasks/update-changelog.yml +18 -0
  34. data/dlf +21 -0
  35. data/examples/Gemfile +4 -0
  36. data/examples/custom_erb_template.rb +24 -0
  37. data/examples/extract_license_data.rb +63 -0
  38. data/examples/sample_template.erb +7 -0
  39. data/lib/license_finder/cli/approvals.rb +28 -0
  40. data/lib/license_finder/cli/base.rb +113 -0
  41. data/lib/license_finder/cli/dependencies.rb +44 -0
  42. data/lib/license_finder/cli/ignored_dependencies.rb +32 -0
  43. data/lib/license_finder/cli/ignored_groups.rb +32 -0
  44. data/lib/license_finder/cli/inherited_decisions.rb +50 -0
  45. data/lib/license_finder/cli/licenses.rb +31 -0
  46. data/lib/license_finder/cli/main.rb +229 -0
  47. data/lib/license_finder/cli/makes_decisions.rb +38 -0
  48. data/lib/license_finder/cli/patched_thor.rb +33 -0
  49. data/lib/license_finder/cli/permitted_licenses.rb +32 -0
  50. data/lib/license_finder/cli/project_name.rb +32 -0
  51. data/lib/license_finder/cli/restricted_licenses.rb +32 -0
  52. data/lib/license_finder/cli.rb +20 -0
  53. data/lib/license_finder/configuration.rb +197 -0
  54. data/lib/license_finder/core.rb +121 -0
  55. data/lib/license_finder/decision_applier.rb +70 -0
  56. data/lib/license_finder/decisions.rb +334 -0
  57. data/lib/license_finder/decisions_factory.rb +13 -0
  58. data/lib/license_finder/diff.rb +51 -0
  59. data/lib/license_finder/license/any_matcher.rb +15 -0
  60. data/lib/license_finder/license/definitions.rb +498 -0
  61. data/lib/license_finder/license/header_matcher.rb +17 -0
  62. data/lib/license_finder/license/matcher.rb +24 -0
  63. data/lib/license_finder/license/none_matcher.rb +11 -0
  64. data/lib/license_finder/license/template.rb +19 -0
  65. data/lib/license_finder/license/templates/0BSD.txt +10 -0
  66. data/lib/license_finder/license/templates/AGPL3.txt +661 -0
  67. data/lib/license_finder/license/templates/Apache1_1.txt +16 -0
  68. data/lib/license_finder/license/templates/Apache2.txt +170 -0
  69. data/lib/license_finder/license/templates/Artistic.txt +128 -0
  70. data/lib/license_finder/license/templates/BSD.txt +24 -0
  71. data/lib/license_finder/license/templates/CC01.txt +30 -0
  72. data/lib/license_finder/license/templates/CC01_alt.txt +31 -0
  73. data/lib/license_finder/license/templates/CDDL1.txt +131 -0
  74. data/lib/license_finder/license/templates/CDDL1_1.txt +123 -0
  75. data/lib/license_finder/license/templates/CPL1.txt +217 -0
  76. data/lib/license_finder/license/templates/EPL1.txt +86 -0
  77. data/lib/license_finder/license/templates/EPL2.txt +80 -0
  78. data/lib/license_finder/license/templates/GPLv2.txt +339 -0
  79. data/lib/license_finder/license/templates/GPLv3.txt +674 -0
  80. data/lib/license_finder/license/templates/ISC.txt +2 -0
  81. data/lib/license_finder/license/templates/LGPL.txt +165 -0
  82. data/lib/license_finder/license/templates/LGPL2_1.txt +169 -0
  83. data/lib/license_finder/license/templates/MIT.txt +9 -0
  84. data/lib/license_finder/license/templates/MPL1_1.txt +469 -0
  85. data/lib/license_finder/license/templates/MPL2.txt +373 -0
  86. data/lib/license_finder/license/templates/NewBSD.txt +21 -0
  87. data/lib/license_finder/license/templates/OFL.txt +91 -0
  88. data/lib/license_finder/license/templates/Python.txt +47 -0
  89. data/lib/license_finder/license/templates/Ruby.txt +52 -0
  90. data/lib/license_finder/license/templates/SimplifiedBSD.txt +19 -0
  91. data/lib/license_finder/license/templates/Unlicense.txt +24 -0
  92. data/lib/license_finder/license/templates/WTFPL.txt +14 -0
  93. data/lib/license_finder/license/templates/Zlib.txt +17 -0
  94. data/lib/license_finder/license/text.rb +49 -0
  95. data/lib/license_finder/license.rb +123 -0
  96. data/lib/license_finder/license_aggregator.rb +59 -0
  97. data/lib/license_finder/logger.rb +69 -0
  98. data/lib/license_finder/manual_licenses.rb +79 -0
  99. data/lib/license_finder/package.rb +195 -0
  100. data/lib/license_finder/package_delta.rb +61 -0
  101. data/lib/license_finder/package_manager.rb +183 -0
  102. data/lib/license_finder/package_managers/bower.rb +37 -0
  103. data/lib/license_finder/package_managers/bundler.rb +110 -0
  104. data/lib/license_finder/package_managers/cargo.rb +38 -0
  105. data/lib/license_finder/package_managers/carthage.rb +68 -0
  106. data/lib/license_finder/package_managers/cocoa_pods.rb +66 -0
  107. data/lib/license_finder/package_managers/composer.rb +63 -0
  108. data/lib/license_finder/package_managers/conan.rb +70 -0
  109. data/lib/license_finder/package_managers/conda.rb +131 -0
  110. data/lib/license_finder/package_managers/dep.rb +45 -0
  111. data/lib/license_finder/package_managers/dotnet.rb +86 -0
  112. data/lib/license_finder/package_managers/erlangmk.rb +50 -0
  113. data/lib/license_finder/package_managers/glide.rb +42 -0
  114. data/lib/license_finder/package_managers/go_15vendorexperiment.rb +87 -0
  115. data/lib/license_finder/package_managers/go_dep.rb +80 -0
  116. data/lib/license_finder/package_managers/go_modules.rb +93 -0
  117. data/lib/license_finder/package_managers/go_workspace.rb +117 -0
  118. data/lib/license_finder/package_managers/govendor.rb +73 -0
  119. data/lib/license_finder/package_managers/gradle.rb +99 -0
  120. data/lib/license_finder/package_managers/gvt.rb +69 -0
  121. data/lib/license_finder/package_managers/maven.rb +69 -0
  122. data/lib/license_finder/package_managers/mix.rb +131 -0
  123. data/lib/license_finder/package_managers/npm.rb +70 -0
  124. data/lib/license_finder/package_managers/nuget.rb +159 -0
  125. data/lib/license_finder/package_managers/pip.rb +70 -0
  126. data/lib/license_finder/package_managers/pipenv.rb +63 -0
  127. data/lib/license_finder/package_managers/pnpm.rb +126 -0
  128. data/lib/license_finder/package_managers/pub.rb +86 -0
  129. data/lib/license_finder/package_managers/rebar.rb +65 -0
  130. data/lib/license_finder/package_managers/sbt.rb +46 -0
  131. data/lib/license_finder/package_managers/spm.rb +93 -0
  132. data/lib/license_finder/package_managers/trash.rb +43 -0
  133. data/lib/license_finder/package_managers/yarn.rb +195 -0
  134. data/lib/license_finder/package_utils/activation.rb +40 -0
  135. data/lib/license_finder/package_utils/conan_info_parser.rb +77 -0
  136. data/lib/license_finder/package_utils/conan_info_parser_v2.rb +82 -0
  137. data/lib/license_finder/package_utils/gradle_dependency_finder.rb +15 -0
  138. data/lib/license_finder/package_utils/license_files.rb +51 -0
  139. data/lib/license_finder/package_utils/licensing.rb +40 -0
  140. data/lib/license_finder/package_utils/maven_dependency_finder.rb +57 -0
  141. data/lib/license_finder/package_utils/notice_files.rb +51 -0
  142. data/lib/license_finder/package_utils/possible_license_file.rb +33 -0
  143. data/lib/license_finder/package_utils/pypi.rb +43 -0
  144. data/lib/license_finder/package_utils/sbt_dependency_finder.rb +15 -0
  145. data/lib/license_finder/packages/bower_package.rb +45 -0
  146. data/lib/license_finder/packages/bundler_package.rb +33 -0
  147. data/lib/license_finder/packages/cargo_package.rb +28 -0
  148. data/lib/license_finder/packages/carthage_package.rb +18 -0
  149. data/lib/license_finder/packages/cocoa_pods_package.rb +22 -0
  150. data/lib/license_finder/packages/composer_package.rb +13 -0
  151. data/lib/license_finder/packages/conan_package.rb +23 -0
  152. data/lib/license_finder/packages/conda_package.rb +74 -0
  153. data/lib/license_finder/packages/erlangmk_package.rb +112 -0
  154. data/lib/license_finder/packages/go_package.rb +30 -0
  155. data/lib/license_finder/packages/gradle_package.rb +30 -0
  156. data/lib/license_finder/packages/manual_package.rb +27 -0
  157. data/lib/license_finder/packages/maven_package.rb +39 -0
  158. data/lib/license_finder/packages/merged_package.rb +44 -0
  159. data/lib/license_finder/packages/mix_package.rb +13 -0
  160. data/lib/license_finder/packages/npm_package.rb +219 -0
  161. data/lib/license_finder/packages/nuget_package.rb +13 -0
  162. data/lib/license_finder/packages/pip_package.rb +50 -0
  163. data/lib/license_finder/packages/pnpm_package.rb +13 -0
  164. data/lib/license_finder/packages/pubspec_package.rb +18 -0
  165. data/lib/license_finder/packages/rebar_package.rb +13 -0
  166. data/lib/license_finder/packages/sbt_package.rb +22 -0
  167. data/lib/license_finder/packages/spm_package.rb +18 -0
  168. data/lib/license_finder/packages/yarn_package.rb +13 -0
  169. data/lib/license_finder/platform.rb +15 -0
  170. data/lib/license_finder/printer.rb +39 -0
  171. data/lib/license_finder/project_finder.rb +62 -0
  172. data/lib/license_finder/report.rb +34 -0
  173. data/lib/license_finder/reports/csv_report.rb +108 -0
  174. data/lib/license_finder/reports/diff_report.rb +29 -0
  175. data/lib/license_finder/reports/erb_report.rb +62 -0
  176. data/lib/license_finder/reports/html_report.rb +13 -0
  177. data/lib/license_finder/reports/json_report.rb +31 -0
  178. data/lib/license_finder/reports/junit_report.rb +23 -0
  179. data/lib/license_finder/reports/markdown_report.rb +9 -0
  180. data/lib/license_finder/reports/merged_report.rb +16 -0
  181. data/lib/license_finder/reports/templates/bootstrap.css +9 -0
  182. data/lib/license_finder/reports/templates/html_report.erb +113 -0
  183. data/lib/license_finder/reports/templates/junit_report.erb +41 -0
  184. data/lib/license_finder/reports/templates/markdown_report.erb +49 -0
  185. data/lib/license_finder/reports/templates/xml_report.erb +19 -0
  186. data/lib/license_finder/reports/text_report.rb +12 -0
  187. data/lib/license_finder/reports/xml_report.rb +23 -0
  188. data/lib/license_finder/scanner.rb +83 -0
  189. data/lib/license_finder/shared_helpers/cmd.rb +13 -0
  190. data/lib/license_finder/shared_helpers/common_path.rb +29 -0
  191. data/lib/license_finder/version.rb +6 -0
  192. data/lib/license_finder.rb +14 -0
  193. data/license_finder.gemspec +79 -0
  194. data/release/instructions.md +8 -0
  195. data/swift-all-keys.asc +240 -0
  196. 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,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseFinder
4
+ class ComposerPackage < Package
5
+ def package_manager
6
+ 'Composer'
7
+ end
8
+
9
+ def package_url
10
+ "https://packagist.org/packages/#{CGI.escape(name)}##{CGI.escape(version)}"
11
+ end
12
+ end
13
+ 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