summaryrefslogtreecommitdiff
path: root/lib/license
diff options
context:
space:
mode:
Diffstat (limited to 'lib/license')
-rw-r--r--lib/license/finder/ext.rb2
-rw-r--r--lib/license/finder/ext/bower.rb8
-rw-r--r--lib/license/finder/ext/conan.rb42
-rw-r--r--lib/license/finder/ext/dependency.rb27
-rw-r--r--lib/license/finder/ext/go_modules.rb8
-rw-r--r--lib/license/finder/ext/gradle.rb2
-rw-r--r--lib/license/finder/ext/maven.rb2
-rw-r--r--lib/license/finder/ext/npm.rb4
-rw-r--r--lib/license/finder/ext/pip.rb6
-rw-r--r--lib/license/finder/ext/pipenv.rb2
-rw-r--r--lib/license/finder/ext/yarn.rb14
-rw-r--r--lib/license/management/python.rb6
-rw-r--r--lib/license/management/report.rb8
-rw-r--r--lib/license/management/report/v2.rb11
-rw-r--r--lib/license/management/report/v2_1.rb42
-rw-r--r--lib/license/management/version.rb2
16 files changed, 159 insertions, 27 deletions
diff --git a/lib/license/finder/ext.rb b/lib/license/finder/ext.rb
index 3c56c7a..8d76172 100644
--- a/lib/license/finder/ext.rb
+++ b/lib/license/finder/ext.rb
@@ -1,6 +1,8 @@
# frozen_string_literal: true
require 'license/finder/ext/bower'
+require 'license/finder/ext/conan'
+require 'license/finder/ext/dependency'
require 'license/finder/ext/go_modules'
require 'license/finder/ext/gradle'
require 'license/finder/ext/license'
diff --git a/lib/license/finder/ext/bower.rb b/lib/license/finder/ext/bower.rb
index d288b05..2219b18 100644
--- a/lib/license/finder/ext/bower.rb
+++ b/lib/license/finder/ext/bower.rb
@@ -34,14 +34,16 @@ module LicenseFinder
meta = bower_module.fetch('pkgMeta', {})
endpoint = bower_module.fetch('endpoint', {})
- Package.new(
+ Dependency.new(
+ 'Bower',
meta['name'] || endpoint['name'],
meta['version'] || endpoint['target'],
- summary: meta['description'],
description: meta['readme'],
+ detection_path: detected_package_path,
homepage: meta['homepage'],
+ install_path: bower_module['canonicalDir'],
spec_licenses: Package.license_names_from_standard_spec(meta),
- install_path: bower_module['canonicalDir']
+ summary: meta['description']
)
end
diff --git a/lib/license/finder/ext/conan.rb b/lib/license/finder/ext/conan.rb
new file mode 100644
index 0000000..1369e6a
--- /dev/null
+++ b/lib/license/finder/ext/conan.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+module LicenseFinder
+ class Conan
+ def possible_package_paths
+ [project_path.join('conanfile.txt')]
+ end
+
+ def current_packages
+ Dir.chdir(project_path) do
+ shell.execute([:conan, :install, '.'])
+ end
+ stdout, _stderr, status = Dir.chdir(project_path) do
+ shell.execute([:conan, :info, '-j', '/dev/stdout', '.'])
+ end
+ return [] unless status.success?
+
+ parse(stdout.lines[0]).map { |dependency| map_from(dependency) }.compact
+ end
+
+ private
+
+ def extract_name_version_from(name)
+ name.split('@', 2).first.split('/', 2)
+ end
+
+ def map_from(dependency)
+ name, version = extract_name_version_from(dependency['reference'])
+ return if name == 'conanfile.txt'
+
+ Dependency.new('Conan', name, version, spec_licenses: licenses_for(dependency), detection_path: detected_package_path)
+ end
+
+ def licenses_for(dependency)
+ dependency['license']
+ end
+
+ def parse(line)
+ JSON.parse(line)
+ end
+ end
+end
diff --git a/lib/license/finder/ext/dependency.rb b/lib/license/finder/ext/dependency.rb
new file mode 100644
index 0000000..48939bf
--- /dev/null
+++ b/lib/license/finder/ext/dependency.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+module LicenseFinder
+ class Dependency < Package
+ attr_accessor :detection_path, :package_manager
+
+ def initialize(package_manager, name, version, options = {})
+ @package_manager = package_manager
+ @detection_path = options[:detection_path] || Pathname.pwd
+ super(name, version, options)
+ end
+
+ def self.from(other, detection_path)
+ new(
+ other.package_manager,
+ other.name,
+ other.version,
+ description: other.description,
+ detection_path: detection_path,
+ homepage: other.homepage,
+ install_path: other.install_path,
+ spec_licenses: other.license_names_from_spec,
+ summary: other.summary
+ )
+ end
+ end
+end
diff --git a/lib/license/finder/ext/go_modules.rb b/lib/license/finder/ext/go_modules.rb
index 3b9042e..e2f025f 100644
--- a/lib/license/finder/ext/go_modules.rb
+++ b/lib/license/finder/ext/go_modules.rb
@@ -8,7 +8,7 @@ module LicenseFinder
end
def active?
- Dir[project_path.join('go.sum')].any?
+ sum_files.any?
end
def current_packages
@@ -20,6 +20,10 @@ module LicenseFinder
private
+ def sum_files
+ Pathname.glob(project_path.join('go.sum'))
+ end
+
def go_list_command
[:go, :list, '-m', '-f', "'{{.Path}},{{.Version}},{{.Dir}}'", :all]
end
@@ -33,7 +37,7 @@ module LicenseFinder
return if dir.nil?
return if Pathname(dir).cleanpath == absolute_project_path
- Package.new(name, version, install_path: dir)
+ Dependency.new('Go', name, version, install_path: dir, detection_path: sum_files.find(&:exist?))
end
end
end
diff --git a/lib/license/finder/ext/gradle.rb b/lib/license/finder/ext/gradle.rb
index 3357042..8328300 100644
--- a/lib/license/finder/ext/gradle.rb
+++ b/lib/license/finder/ext/gradle.rb
@@ -44,7 +44,7 @@ module LicenseFinder
end
def map_from(hash)
- GradlePackage.new(hash, include_groups: @include_groups)
+ Dependency.from(GradlePackage.new(hash, include_groups: @include_groups), detected_package_path)
end
end
end
diff --git a/lib/license/finder/ext/maven.rb b/lib/license/finder/ext/maven.rb
index 159f9f9..d6a08dc 100644
--- a/lib/license/finder/ext/maven.rb
+++ b/lib/license/finder/ext/maven.rb
@@ -38,7 +38,7 @@ module LicenseFinder
::License::Management.logger.debug(xml)
XmlSimple
.xml_in(xml, XML_PARSE_OPTIONS)['dependencies']
- .map { |dependency| MavenPackage.new(dependency) }
+ .map { |dependency| Dependency.from(MavenPackage.new(dependency), detected_package_path) }
end
end
end
diff --git a/lib/license/finder/ext/npm.rb b/lib/license/finder/ext/npm.rb
index 48741f9..e0d4e41 100644
--- a/lib/license/finder/ext/npm.rb
+++ b/lib/license/finder/ext/npm.rb
@@ -3,7 +3,9 @@
module LicenseFinder
class NPM
def current_packages
- NpmPackage.packages_from_json(npm_json, detected_package_path)
+ NpmPackage.packages_from_json(npm_json, detected_package_path).map do |item|
+ Dependency.from(item, detected_package_path)
+ end
end
def prepare_command
diff --git a/lib/license/finder/ext/pip.rb b/lib/license/finder/ext/pip.rb
index 596cd4c..bdeffc3 100644
--- a/lib/license/finder/ext/pip.rb
+++ b/lib/license/finder/ext/pip.rb
@@ -5,7 +5,7 @@ module LicenseFinder
def current_packages
return legacy_results unless virtual_env?
- dependencies = python.pip_licenses
+ dependencies = python.pip_licenses(detection_path: detected_package_path)
dependencies.any? ? dependencies : legacy_results
end
@@ -58,10 +58,12 @@ module LicenseFinder
def legacy_results
pip_output.map do |name, version, _children, _location|
spec = PyPI.definition(name, version)
- Package.new(
+ Dependency.new(
+ 'Pip',
name,
version,
description: spec['description'],
+ detection_path: detected_package_path,
homepage: spec['home_page'],
spec_licenses: PipPackage.license_names_from_spec(spec)
)
diff --git a/lib/license/finder/ext/pipenv.rb b/lib/license/finder/ext/pipenv.rb
index 17b7391..687c6fc 100644
--- a/lib/license/finder/ext/pipenv.rb
+++ b/lib/license/finder/ext/pipenv.rb
@@ -12,7 +12,7 @@ module LicenseFinder
def current_packages
return legacy_results unless pipfile?
- python.pip_licenses
+ python.pip_licenses(detection_path: detected_package_path)
end
private
diff --git a/lib/license/finder/ext/yarn.rb b/lib/license/finder/ext/yarn.rb
index f9187ce..4ad97d4 100644
--- a/lib/license/finder/ext/yarn.rb
+++ b/lib/license/finder/ext/yarn.rb
@@ -54,13 +54,11 @@ module LicenseFinder
end
def map_from(hash)
- name = hash['Name']
-
- YarnPackage.new(
- name,
+ build(
+ hash['Name'],
hash['Version'],
spec_licenses: [hash['License']],
- install_path: install_path_for(name).to_s,
+ install_path: install_path_for(hash['Name']).to_s,
homepage: hash['VendorUrl']
)
end
@@ -88,7 +86,11 @@ module LicenseFinder
matches = json['data'].to_s.match(INCOMPATIBLE_PACKAGE_REGEX)
return [] unless matches
- [YarnPackage.new(matches['name'], matches['version'], spec_licenses: ['unknown'])]
+ [build(matches['name'], matches['version'], spec_licenses: ['unknown'])]
+ end
+
+ def build(name, version, options = {})
+ Dependency.new('Yarn', name, version, options.merge(detection_path: detected_package_path))
end
def default_env
diff --git a/lib/license/management/python.rb b/lib/license/management/python.rb
index b8932f9..ccf53e9 100644
--- a/lib/license/management/python.rb
+++ b/lib/license/management/python.rb
@@ -24,7 +24,7 @@ module License
ENV.fetch('PIP_INDEX_URL', 'https://pypi.org/simple/')
end
- def pip_licenses(venv: '.venv')
+ def pip_licenses(venv: '.venv', detection_path:)
_stdout, _stderr, status = shell.sh([
". #{venv}/bin/activate &&",
:pip, :install,
@@ -41,10 +41,12 @@ module License
return [] unless status.success?
JSON.parse(IO.read('pip-licenses.json')).map do |dependency|
- ::LicenseFinder::Package.new(
+ ::LicenseFinder::Dependency.new(
+ 'Pip',
dependency['Name'],
dependency['Version'],
description: dependency['Description'],
+ detection_path: detection_path,
homepage: dependency['URL'],
spec_licenses: [dependency['License']]
)
diff --git a/lib/license/management/report.rb b/lib/license/management/report.rb
index b1bf9ed..a3dbf20 100644
--- a/lib/license/management/report.rb
+++ b/lib/license/management/report.rb
@@ -4,19 +4,21 @@ require 'license/management/report/base'
require 'license/management/report/v1'
require 'license/management/report/v1_1'
require 'license/management/report/v2'
+require 'license/management/report/v2_1'
module License
module Management
module Report
- DEFAULT_VERSION = '2'
+ DEFAULT_VERSION = '2.0'
VERSIONS = {
nil => V1,
'' => V1,
'1' => V1,
'1.0' => V1,
'1.1' => V1_1,
- '2' => V2,
- '2.0' => V2
+ '2' => V2_1,
+ '2.0' => V2,
+ '2.1' => V2_1
}.freeze
# This method overrides the method defined in `LicenseFinder::JsonReport` to
diff --git a/lib/license/management/report/v2.rb b/lib/license/management/report/v2.rb
index e0b4980..ac43f53 100644
--- a/lib/license/management/report/v2.rb
+++ b/lib/license/management/report/v2.rb
@@ -30,18 +30,21 @@ module License
end
def map_from(dependency)
- licenses = dependency.licenses.map { |license| data_for(license)['id'] }.sort
- log(dependency, licenses)
-
{
name: dependency.name,
url: dependency.homepage,
description: description_for(dependency),
paths: paths_from(dependency),
- licenses: licenses
+ licenses: licenses_for(dependency)
}
end
+ def licenses_for(dependency)
+ licenses = dependency.licenses.map { |license| data_for(license)['id'] }.sort
+ log(dependency, licenses)
+ licenses
+ end
+
def log(dependency, licenses)
logger.info { [dependency.name, dependency.version, licenses].flatten.join(' ') }
return unless licenses == ['unknown']
diff --git a/lib/license/management/report/v2_1.rb b/lib/license/management/report/v2_1.rb
new file mode 100644
index 0000000..7589219
--- /dev/null
+++ b/lib/license/management/report/v2_1.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+module License
+ module Management
+ module Report
+ class V2_1 < V2
+ def to_h
+ super.merge(version: '2.1')
+ end
+
+ private
+
+ def license_summary
+ all_licenses
+ .map { |license| data_for(license) }
+ .uniq { |data| data['id'] }
+ .sort_by { |data| data['id'] }
+ end
+
+ def map_from(dependency)
+ {
+ name: dependency.name,
+ version: dependency.version,
+ package_manager: dependency.package_manager.downcase.to_sym,
+ path: detection_path_for(dependency),
+ licenses: licenses_for(dependency)
+ }
+ end
+
+ def detection_path_for(dependency)
+ dependency = dependency.dependency if dependency.instance_of?(LicenseFinder::MergedPackage)
+
+ if dependency.respond_to?(:detection_path)
+ dependency.detection_path.relative_path_from(Pathname.pwd).to_s
+ else
+ '.'
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/license/management/version.rb b/lib/license/management/version.rb
index f3e2116..595ee3a 100644
--- a/lib/license/management/version.rb
+++ b/lib/license/management/version.rb
@@ -2,6 +2,6 @@
module License
module Management
- VERSION = '3.9.2'
+ VERSION = '3.10.0'
end
end