license_finder 2.1.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +29 -0
  4. data/CONTRIBUTING.md +28 -3
  5. data/Dockerfile +82 -0
  6. data/README.md +11 -2
  7. data/Rakefile +27 -0
  8. data/appveyor.yml +21 -0
  9. data/bin/license_finder_pip.py +1 -1
  10. data/ci/pipelines/pipeline.yml.erb +78 -0
  11. data/ci/scripts/test.sh +27 -0
  12. data/ci/tasks/build.yml +16 -0
  13. data/features/features/package_managers/gradle_spec.rb +6 -0
  14. data/features/features/package_managers/maven_spec.rb +9 -0
  15. data/features/features/report/diff_spec.rb +26 -23
  16. data/features/fixtures/alternate-build-file-gradle/build-alt.gradle +26 -0
  17. data/features/fixtures/alternate-build-file-gradle/settings.gradle +1 -0
  18. data/features/fixtures/file-based-libs-gradle/build.gradle +1 -1
  19. data/features/fixtures/gradle-wrapper/build.gradle +26 -0
  20. data/features/fixtures/gradle-wrapper/gradlew +3 -0
  21. data/features/fixtures/gradle-wrapper/gradlew.bat +1 -0
  22. data/features/fixtures/maven-wrapper/mvnw +3 -0
  23. data/features/fixtures/maven-wrapper/mvnw.cmd +7 -0
  24. data/features/fixtures/maven-wrapper/pom.xml +37 -0
  25. data/features/support/testing_dsl.rb +12 -5
  26. data/lib/license_finder/cli/base.rb +1 -0
  27. data/lib/license_finder/cli/main.rb +2 -1
  28. data/lib/license_finder/configuration.rb +6 -13
  29. data/lib/license_finder/core.rb +2 -1
  30. data/lib/license_finder/diff.rb +4 -4
  31. data/lib/license_finder/package.rb +5 -3
  32. data/lib/license_finder/package_delta.rb +2 -5
  33. data/lib/license_finder/package_managers/bower.rb +1 -1
  34. data/lib/license_finder/package_managers/bundler.rb +4 -4
  35. data/lib/license_finder/package_managers/go_dep.rb +21 -4
  36. data/lib/license_finder/package_managers/go_package.rb +2 -1
  37. data/lib/license_finder/package_managers/go_vendor.rb +21 -7
  38. data/lib/license_finder/package_managers/go_workspace.rb +18 -11
  39. data/lib/license_finder/package_managers/gradle.rb +42 -15
  40. data/lib/license_finder/package_managers/maven.rb +31 -17
  41. data/lib/license_finder/package_managers/maven_dependency_finder.rb +13 -0
  42. data/lib/license_finder/package_managers/maven_package.rb +6 -1
  43. data/lib/license_finder/package_managers/npm.rb +4 -4
  44. data/lib/license_finder/package_managers/rebar.rb +1 -1
  45. data/lib/license_finder/reports/csv_report.rb +5 -1
  46. data/lib/license_finder/reports/diff_report.rb +3 -7
  47. data/lib/license_finder/reports/text_report.rb +6 -1
  48. data/lib/license_finder/version.rb +1 -1
  49. data/license_finder.gemspec +6 -0
  50. data/spec/lib/license_finder/configuration_spec.rb +0 -8
  51. data/spec/lib/license_finder/core_spec.rb +2 -1
  52. data/spec/lib/license_finder/diff_spec.rb +50 -27
  53. data/spec/lib/license_finder/package_managers/bower_spec.rb +1 -1
  54. data/spec/lib/license_finder/package_managers/bundler_spec.rb +1 -1
  55. data/spec/lib/license_finder/package_managers/go_dep_spec.rb +14 -1
  56. data/spec/lib/license_finder/package_managers/go_vendor_spec.rb +23 -2
  57. data/spec/lib/license_finder/package_managers/go_workspace_spec.rb +23 -7
  58. data/spec/lib/license_finder/package_managers/gradle_spec.rb +55 -2
  59. data/spec/lib/license_finder/package_managers/maven_package_spec.rb +16 -3
  60. data/spec/lib/license_finder/package_managers/maven_spec.rb +56 -4
  61. data/spec/lib/license_finder/package_managers/merged_package_spec.rb +8 -4
  62. data/spec/lib/license_finder/package_spec.rb +4 -1
  63. data/spec/lib/license_finder/reports/csv_report_spec.rb +8 -0
  64. data/spec/lib/license_finder/reports/diff_report_spec.rb +5 -5
  65. data/spec/lib/license_finder/reports/text_report_spec.rb +5 -0
  66. metadata +218 -9
  67. data/.travis.yml +0 -37
  68. data/.travis/install_bower.sh +0 -5
  69. data/.travis/install_godep.sh +0 -6
  70. data/.travis/install_gradle.sh +0 -12
  71. data/.travis/install_rebar.sh +0 -14
@@ -0,0 +1,26 @@
1
+ apply plugin: 'java'
2
+
3
+ sourceCompatibility = 1.5
4
+ version = '1.0'
5
+
6
+ repositories {
7
+ mavenCentral()
8
+ }
9
+
10
+ dependencies {
11
+ compile group: 'junit', name: 'junit', version: '4.11'
12
+ }
13
+
14
+ buildscript {
15
+ repositories {
16
+ maven {
17
+ url 'https://plugins.gradle.org/m2/'
18
+ }
19
+ }
20
+
21
+ dependencies {
22
+ classpath 'gradle.plugin.nl.javadude.gradle.plugins:license-gradle-plugin:0.12.1'
23
+ }
24
+ }
25
+
26
+ apply plugin: 'license'
@@ -0,0 +1 @@
1
+ rootProject.buildFileName = 'build-alt.gradle'
@@ -14,5 +14,5 @@ dependencies {
14
14
  )
15
15
 
16
16
  // Import external libraries that are **not** available to download via repo
17
- compile fileTree(dir: 'libs', include: '*.jar')
17
+ compile fileTree(dir: 'libs', include: ['*.jar'])
18
18
  }
@@ -0,0 +1,26 @@
1
+ apply plugin: 'java'
2
+
3
+ sourceCompatibility = 1.5
4
+ version = '1.0'
5
+
6
+ repositories {
7
+ mavenCentral()
8
+ }
9
+
10
+ dependencies {
11
+ compile group: 'junit', name: 'junit', version: '4.11'
12
+ }
13
+
14
+ buildscript {
15
+ repositories {
16
+ maven {
17
+ url 'https://plugins.gradle.org/m2/'
18
+ }
19
+ }
20
+
21
+ dependencies {
22
+ classpath 'gradle.plugin.nl.javadude.gradle.plugins:license-gradle-plugin:0.12.1'
23
+ }
24
+ }
25
+
26
+ apply plugin: 'license'
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ gradle
@@ -0,0 +1 @@
1
+ @call gradle.bat
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ mvn "$@"
@@ -0,0 +1,7 @@
1
+ @echo off
2
+ where /q mvn.cmd
3
+ if %ERRORLEVEL% equ 0 (
4
+ mvn.cmd %*
5
+ ) else (
6
+ mvn.bat %*
7
+ )
@@ -0,0 +1,37 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project xmlns="http://maven.apache.org/POM/4.0.0"
3
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
+ <modelVersion>4.0.0</modelVersion>
6
+
7
+ <groupId>dummy</groupId>
8
+ <artifactId>dummy</artifactId>
9
+ <version>1.0-SNAPSHOT</version>
10
+
11
+ <dependencies>
12
+ <dependency>
13
+ <groupId>junit</groupId>
14
+ <artifactId>junit</artifactId>
15
+ <version>4.11</version>
16
+ <scope>test</scope>
17
+ </dependency>
18
+ </dependencies>
19
+
20
+ <build>
21
+ <plugins>
22
+ <plugin>
23
+ <groupId>org.codehaus.mojo</groupId>
24
+ <artifactId>license-maven-plugin</artifactId>
25
+ <version>1.10</version>
26
+ <executions>
27
+ <execution>
28
+ <id>download-licenses</id>
29
+ <goals>
30
+ <goal>download-licenses</goal>
31
+ </goals>
32
+ </execution>
33
+ </executions>
34
+ </plugin>
35
+ </plugins>
36
+ </build>
37
+ </project>
@@ -3,11 +3,11 @@ require 'delegate'
3
3
  module LicenseFinder
4
4
  module TestingDSL
5
5
  class User
6
- def run_license_finder(path = nil)
6
+ def run_license_finder(path = nil, options='')
7
7
  if path
8
- execute_command_in_path('license_finder --quiet', Paths.project("my_app/#{path}"))
8
+ execute_command_in_path("license_finder --quiet #{options}", Paths.project("my_app/#{path}"))
9
9
  else
10
- execute_command 'license_finder --quiet'
10
+ execute_command "license_finder --quiet #{options}"
11
11
  end
12
12
  end
13
13
 
@@ -131,7 +131,7 @@ module LicenseFinder
131
131
  end
132
132
 
133
133
  def install
134
- shell_out("bower install 2>/dev/null")
134
+ shell_out("bower install --allow-root 2>/dev/null")
135
135
  end
136
136
  end
137
137
 
@@ -169,6 +169,12 @@ module LicenseFinder
169
169
  end
170
170
  end
171
171
 
172
+ class AlternateBuildFileGradleProject < Project
173
+ def add_dep
174
+ clone('alternate-build-file-gradle')
175
+ end
176
+ end
177
+
172
178
  class GoProject < Project
173
179
  def add_dep
174
180
  clone('gopath')
@@ -377,7 +383,8 @@ module LicenseFinder
377
383
 
378
384
  def reset_projects!
379
385
  # only destroyed when a test starts, so you can poke around after a failure
380
- projects.rmtree if projects.exist?
386
+ require 'fileutils'
387
+ FileUtils.rmtree(projects) if projects.exist?
381
388
  projects.mkpath
382
389
  end
383
390
  end
@@ -31,6 +31,7 @@ module LicenseFinder
31
31
  :go_full_version,
32
32
  :gradle_command,
33
33
  :gradle_include_groups,
34
+ :maven_include_groups,
34
35
  :rebar_command,
35
36
  :rebar_deps_dir,
36
37
  :save
@@ -18,11 +18,12 @@ module LicenseFinder
18
18
  }
19
19
 
20
20
  class_option :format, desc: "The desired output format.", default: 'text', enum: FORMATS.keys
21
- class_option :columns, type: :array, desc: "For CSV reports, which columns to print. Pick from: #{CsvReport::AVAILABLE_COLUMNS}", default: %w[name version licenses]
21
+ class_option :columns, type: :array, desc: "For text or CSV reports, which columns to print. Pick from: #{CsvReport::AVAILABLE_COLUMNS}", default: %w[name version licenses]
22
22
  class_option :save, desc: "Save report to a file. Default: 'license_report.csv' in project root.", lazy_default: "license_report"
23
23
  class_option :go_full_version, desc: "Whether dependency version should include full version. Only meaningful if used with a Go project. Defaults to false."
24
24
  class_option :gradle_include_groups, desc: "Whether dependency name should include group id. Only meaningful if used with a Java/gradle project. Defaults to false."
25
25
  class_option :gradle_command, desc: "Command to use when fetching gradle packages. Only meaningful if used with a Java/gradle project. Defaults to 'gradlew' / 'gradlew.bat' if the wrapper is present, otherwise to 'gradle'."
26
+ class_option :maven_include_groups, desc: "Whether dependency name should include group id. Only meaningful if used with a Java/maven project. Defaults to false."
26
27
  class_option :rebar_command, desc: "Command to use when fetching rebar packages. Only meaningful if used with a Erlang/rebar project. Defaults to 'rebar'."
27
28
  class_option :rebar_deps_dir, desc: "Path to rebar dependencies directory. Only meaningful if used with a Erlang/rebar project. Defaults to 'deps'."
28
29
  class_option :subprojects, type: :array, desc: "Generate a single report for multiple sub-projects. Ex: --subprojects='path/to/project1', 'path/to/project2'"
@@ -22,18 +22,7 @@ module LicenseFinder
22
22
  end
23
23
 
24
24
  def gradle_command
25
- get(:gradle_command) || (
26
- if Platform.windows?
27
- wrapper = 'gradlew.bat'
28
- gradle = 'gradle.bat'
29
- else
30
- wrapper = 'gradlew'
31
- gradle = 'gradle'
32
- end
33
-
34
- executable = File.exist?(wrapper) ? wrapper : gradle
35
- "#{executable} --console plain"
36
- )
25
+ get(:gradle_command)
37
26
  end
38
27
 
39
28
  def go_full_version
@@ -44,8 +33,12 @@ module LicenseFinder
44
33
  get(:gradle_include_groups)
45
34
  end
46
35
 
36
+ def maven_include_groups
37
+ get(:maven_include_groups)
38
+ end
39
+
47
40
  def rebar_command
48
- get(:rebar_command) || 'rebar'
41
+ get(:rebar_command)
49
42
  end
50
43
 
51
44
  def rebar_deps_dir
@@ -63,10 +63,11 @@ module LicenseFinder
63
63
  PackageManager.current_packages(
64
64
  logger: logger,
65
65
  project_path: config.project_path,
66
- ignore_groups: decisions.ignored_groups,
66
+ ignored_groups: decisions.ignored_groups,
67
67
  go_full_version: config.go_full_version,
68
68
  gradle_command: config.gradle_command,
69
69
  gradle_include_groups: config.gradle_include_groups,
70
+ maven_include_groups: config.maven_include_groups,
70
71
  rebar_command: config.rebar_command,
71
72
  rebar_deps_dir: config.rebar_deps_dir,
72
73
  )
@@ -10,8 +10,8 @@ module LicenseFinder
10
10
 
11
11
  [].tap do |packages|
12
12
  unchanged.each do |package|
13
- package_previous = package_with_name(p1, package)
14
- package_current = package_with_name(p2, package)
13
+ package_previous = find_package(p1, package)
14
+ package_current = find_package(p2, package)
15
15
 
16
16
  if package_current.licenses == package_previous.licenses
17
17
  packages << PackageDelta.unchanged(package_current, package_previous)
@@ -40,8 +40,8 @@ module LicenseFinder
40
40
  end
41
41
  end
42
42
 
43
- def self.package_with_name(set, package)
44
- set.find { |p| p.name == package.name }
43
+ def self.find_package(set, package)
44
+ set.find { |p| p.eql? package}
45
45
  end
46
46
  end
47
47
  end
@@ -99,15 +99,17 @@ module LicenseFinder
99
99
  ## EQUALITY
100
100
 
101
101
  def <=>(other)
102
- name <=> other.name
102
+ eq_name = name <=> other.name
103
+ return eq_name unless eq_name == 0
104
+ version <=> other.version
103
105
  end
104
106
 
105
107
  def eql?(other)
106
- name == other.name
108
+ name == other.name && version == other.version
107
109
  end
108
110
 
109
111
  def hash
110
- [name].hash
112
+ [name,version].hash
111
113
  end
112
114
 
113
115
  ## LICENSING
@@ -12,13 +12,10 @@ module LicenseFinder
12
12
  pick_package.name
13
13
  end
14
14
 
15
- def current_version
16
- @current_package ? @current_package.version : nil
15
+ def version
16
+ pick_package.version
17
17
  end
18
18
 
19
- def previous_version
20
- @previous_package ? @previous_package.version : nil
21
- end
22
19
 
23
20
  def subproject_paths
24
21
  pick_package.subproject_paths
@@ -15,7 +15,7 @@ module LicenseFinder
15
15
  private
16
16
 
17
17
  def bower_output
18
- command = 'bower list --json -l action'
18
+ command = "#{Bower::package_management_command} list --json -l action --allow-root"
19
19
  output, success = Dir.chdir(project_path) { capture(command) }
20
20
  raise "Command '#{command}' failed to execute: #{output}" unless success
21
21
 
@@ -4,7 +4,7 @@ module LicenseFinder
4
4
  class Bundler < PackageManager
5
5
  def initialize options={}
6
6
  super
7
- @ignore_groups = options[:ignore_groups]
7
+ @ignored_groups = options[:ignored_groups]
8
8
  @definition = options[:definition] # dependency injection for tests
9
9
  end
10
10
 
@@ -18,12 +18,12 @@ module LicenseFinder
18
18
  end
19
19
 
20
20
  def self.package_management_command
21
- "bundler"
21
+ "bundle"
22
22
  end
23
23
 
24
24
  private
25
25
 
26
- attr_reader :ignore_groups
26
+ attr_reader :ignored_groups
27
27
 
28
28
  def definition
29
29
  # DI
@@ -46,7 +46,7 @@ module LicenseFinder
46
46
  end
47
47
 
48
48
  def included_groups
49
- definition.groups - ignore_groups.map(&:to_sym)
49
+ definition.groups - ignored_groups.map(&:to_sym)
50
50
  end
51
51
 
52
52
  def package_path
@@ -11,12 +11,18 @@ module LicenseFinder
11
11
  def current_packages
12
12
  json = JSON.parse(package_path.read)
13
13
  # godep includes subpackages as a seperate dependency, we can de-dup that
14
- deps = json['Deps'].each do |d|
15
- next unless d['ImportPath'].include?('github.com')
16
14
 
17
- d['ImportPath'] = d['ImportPath'].split('/')[0..2].join('/')
15
+ dependencies_info = json['Deps'].map do |json|
16
+ {
17
+ 'Homepage' => homepage(json),
18
+ 'ImportPath' => import_path(json),
19
+ 'InstallPath' => json['InstallPath'],
20
+ 'Rev' => json['Rev']
21
+ }
22
+ end
23
+ dependencies_info.uniq.map do |info|
24
+ GoPackage.from_dependency(info, install_prefix, @full_version)
18
25
  end
19
- deps.uniq.map { |dep| GoPackage.from_dependency(dep, install_prefix, @full_version) }
20
26
  end
21
27
 
22
28
  def package_path
@@ -37,5 +43,16 @@ module LicenseFinder
37
43
  def workspace_dir
38
44
  project_path.join('Godeps/_workspace')
39
45
  end
46
+
47
+ def homepage(dependency_json)
48
+ import_path dependency_json
49
+ end
50
+
51
+ def import_path(dependency_json)
52
+ import_path = dependency_json['ImportPath']
53
+ return import_path unless import_path.include?('github.com')
54
+
55
+ import_path.split('/')[0..2].join('/')
56
+ end
40
57
  end
41
58
  end
@@ -5,7 +5,8 @@ module LicenseFinder
5
5
  install_path = hash['InstallPath']
6
6
  install_path ||= install_path(prefix.join(name))
7
7
  version = full_version ? hash['Rev'] : hash['Rev'][0..6]
8
- self.new(name, version, {install_path: install_path, package_manager: "Go" })
8
+ homepage = hash['Homepage']
9
+ self.new(name, version, {install_path: install_path, package_manager: "Go", homepage: homepage })
9
10
  end
10
11
 
11
12
  def package_manager
@@ -24,8 +24,8 @@ module LicenseFinder
24
24
  project_path.join("vendor")
25
25
  end
26
26
 
27
- def project_sha
28
- @project_sha ||= Dir.chdir(project_path) do
27
+ def project_sha(path)
28
+ Dir.chdir(path) do
29
29
  val = capture('git rev-list --max-count 1 HEAD')
30
30
  raise 'git rev-list failed' unless val.last
31
31
  val.first.strip
@@ -39,7 +39,7 @@ module LicenseFinder
39
39
  GoPackage.from_dependency({
40
40
  'ImportPath' => dep,
41
41
  'InstallPath' => package_path.join(dep),
42
- 'Rev' => 'vendored-' + project_sha
42
+ 'Rev' => 'vendored-' + project_sha(package_path.join(dep))
43
43
  }, nil, true)
44
44
  end
45
45
  end
@@ -56,11 +56,25 @@ module LicenseFinder
56
56
  # discovered that `go list' will print a warning and unfortunately exit
57
57
  # with status code 1. Setting GOPATH to nil removes those warnings.
58
58
  ENV['GOPATH'] = nil
59
- val = capture('go list -f \'{{join .Deps "\n"}}\' ./...')
59
+ val = capture('go list -f "{{join .Deps \"\n\"}}" ./...')
60
60
  return [] unless val.last
61
- # Select non-standard packages. Standard packages tend to be short
62
- # and have less than two slashes
63
- val.first.lines.map(&:strip).select { |l| l.split("/").length > 2 }.map { |l| l.split("/")[0..2].join("/") }.uniq
61
+ # Select non-standard packages. `go list std` returns the list of standard
62
+ # dependencies. We then filter those dependencies out of the full list of
63
+ # dependencies.
64
+ deps = val.first.split("\n")
65
+ capture('go list std').first.split("\n").each do |std|
66
+ deps.delete_if do |dep|
67
+ dep =~ /(\/|^)#{std}(\/|$)/
68
+ end
69
+ end
70
+ deps.map do |d|
71
+ dep_parts = d.split('/')
72
+ if dep_parts.length > 2
73
+ dep_parts[0..2].join('/')
74
+ else
75
+ d
76
+ end
77
+ end
64
78
  end
65
79
  end
66
80
  end