license_finder 3.0.0 → 3.0.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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/CONTRIBUTING.md +17 -3
  4. data/Dockerfile +12 -15
  5. data/README.md +3 -1
  6. data/Rakefile +7 -0
  7. data/ci/pipelines/pipeline.yml.erb +2 -2
  8. data/features/features/cli/cli_spec.rb +4 -3
  9. data/features/support/testing_dsl.rb +9 -2
  10. data/lib/license_finder/cli/base.rb +1 -1
  11. data/lib/license_finder/cli/main.rb +7 -0
  12. data/lib/license_finder/configuration.rb +4 -0
  13. data/lib/license_finder/core.rb +2 -2
  14. data/lib/license_finder/decision_applier.rb +8 -4
  15. data/lib/license_finder/package_managers/cocoa_pods.rb +6 -10
  16. data/lib/license_finder/package_managers/go_vendor.rb +2 -0
  17. data/lib/license_finder/package_managers/go_workspace.rb +2 -0
  18. data/lib/license_finder/package_managers/maven.rb +2 -1
  19. data/lib/license_finder/package_managers/npm.rb +66 -58
  20. data/lib/license_finder/package_managers/npm_package.rb +0 -14
  21. data/lib/license_finder/package_managers/nuget.rb +6 -1
  22. data/lib/license_finder/reports/csv_report.rb +6 -2
  23. data/lib/license_finder/version.rb +1 -1
  24. data/license_finder.gemspec +1 -0
  25. data/spec/fixtures/npm-circular-licenses/npm-list.json +7597 -0
  26. data/spec/fixtures/npm-circular-licenses/package.json +23 -0
  27. data/spec/lib/license_finder/cli/main_spec.rb +31 -7
  28. data/spec/lib/license_finder/core_spec.rb +1 -0
  29. data/spec/lib/license_finder/decision_applier_spec.rb +8 -0
  30. data/spec/lib/license_finder/package_managers/go_dep_spec.rb +17 -16
  31. data/spec/lib/license_finder/package_managers/npm_spec.rb +37 -3
  32. data/spec/lib/license_finder/package_managers/nuget_spec.rb +12 -1
  33. metadata +21 -5
  34. data/spec/lib/license_finder/package_managers/npm_package_spec.rb +0 -56
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "license_finder_test",
3
+ "version": "0.0.1",
4
+ "description": "",
5
+ "main": "index.js",
6
+ "dependencies": {
7
+ "node-polyglot": "^2.0.0"
8
+ },
9
+ "devDependencies": {
10
+ "enzyme": "^2.8.2"
11
+ },
12
+ "scripts": {},
13
+ "repository": {},
14
+ "author": "",
15
+ "license": "MIT",
16
+ "bugs": {},
17
+ "private": true,
18
+ "engines": {
19
+ "node": "^6.11.0",
20
+ "yarn": "^0.24.6",
21
+ "npm": "^5.0.3"
22
+ }
23
+ }
@@ -12,9 +12,10 @@ module LicenseFinder
12
12
  )
13
13
  end
14
14
  let(:configuration) { double(:configuration, valid_project_path?: true) }
15
- let(:license_finder_instance) { double(:license_finder, unapproved: [unapproved_dependency], blacklisted: [], project_name: 'taco stand', config: configuration) }
15
+ let(:found_any_packages) { true }
16
+ let(:license_finder_instance) { double(:license_finder, unapproved: unapproved_dependencies, blacklisted: [], project_name: 'taco stand', config: configuration, any_packages?: found_any_packages) }
16
17
  let(:license) { double(:license, name: "thing") }
17
- let(:unapproved_dependency) { double(:dependency, name: "a dependency", version: "2.4.1", missing?: false, licenses: [license]) }
18
+ let(:unapproved_dependencies) { [double(:dependency, name: "a dependency", version: "2.4.1", missing?: false, licenses: [license])] }
18
19
 
19
20
  before do
20
21
  allow(Decisions).to receive(:fetch_saved) { decisions }
@@ -24,7 +25,7 @@ module LicenseFinder
24
25
  describe "default" do
25
26
  it "checks for action items" do
26
27
  decisions.add_package("a dependency", nil)
27
- expect_any_instance_of(LicenseFinder::Core).to receive(:unapproved).and_return([unapproved_dependency])
28
+ expect_any_instance_of(LicenseFinder::Core).to receive(:unapproved).and_return(unapproved_dependencies)
28
29
  silence_stdout do
29
30
  expect { described_class.start(["--quiet"]) }.to raise_error(SystemExit)
30
31
  end
@@ -183,6 +184,21 @@ module LicenseFinder
183
184
  subject.action_items
184
185
  end
185
186
 
187
+ context "with a directory that doesn't have any detected packages" do
188
+ let(:found_any_packages) { false }
189
+
190
+ before do
191
+ allow(LicenseFinder::Core).to receive(:new).and_return(license_finder_instance)
192
+ end
193
+
194
+ it "reports that no dependencies were recognized" do
195
+ result = capture_stdout do
196
+ expect { action_items }.to raise_error(SystemExit)
197
+ end
198
+ expect(result).to match /no dependencies recognized/i
199
+ end
200
+ end
201
+
186
202
  context "with unapproved dependencies" do
187
203
  let(:packages) { [Package.new('one dependency')] }
188
204
 
@@ -207,11 +223,19 @@ module LicenseFinder
207
223
  end
208
224
  end
209
225
 
210
- it "reports that all dependencies are approved" do
211
- result = capture_stdout do
212
- expect { action_items }.not_to raise_error
226
+ context "with no unapproved dependencies" do
227
+ let(:unapproved_dependencies) {[]}
228
+
229
+ before do
230
+ allow(LicenseFinder::Core).to receive(:new).and_return(license_finder_instance)
231
+ end
232
+
233
+ it "reports that all dependencies are approved" do
234
+ result = capture_stdout do
235
+ expect { action_items }.not_to raise_error
236
+ end
237
+ expect(result).to match /approved/i
213
238
  end
214
- expect(result).to match /approved/i
215
239
  end
216
240
  end
217
241
  end
@@ -31,6 +31,7 @@ module LicenseFinder
31
31
  gradle_command: configuration.gradle_command,
32
32
  gradle_include_groups: nil,
33
33
  maven_include_groups: nil,
34
+ maven_options: nil,
34
35
  rebar_command: configuration.rebar_command,
35
36
  rebar_deps_dir: configuration.rebar_deps_dir
36
37
  }
@@ -2,6 +2,14 @@ require 'spec_helper'
2
2
 
3
3
  module LicenseFinder
4
4
  describe DecisionApplier do
5
+ it "reports nothing found" do
6
+ decision_applier = described_class.new(
7
+ decisions: Decisions.new,
8
+ packages: []
9
+ )
10
+ expect(decision_applier.any_packages?).to be false
11
+ end
12
+
5
13
  describe "#acknowledged" do
6
14
  it "combines manual and system packages" do
7
15
  decision_applier = described_class.new(
@@ -73,21 +73,21 @@ module LicenseFinder
73
73
  context 'when there are duplicate dependencies' do
74
74
  let(:content) do
75
75
  '{
76
- "ImportPath": "github.com/foo/bar",
77
- "GoVersion": "go1.3",
78
- "Deps": [
79
- {
80
- "ImportPath": "github.com/foo/baz/sub1",
81
- "Rev": "28838aae6e8158e3695cf90e2f0ed2498b68ee1d"
82
- },
83
- {
84
- "ImportPath": "github.com/foo/baz/sub2",
85
- "Rev": "28838aae6e8158e3695cf90e2f0ed2498b68ee1d"
86
- },
87
- {
88
- "ImportPath": "github.com/foo/baz/sub3",
89
- "Rev": "28838aae6e8158e3695cf90e2f0ed2498b68ee1d"
90
- }
76
+ "ImportPath": "github.com/foo/bar",
77
+ "GoVersion": "go1.3",
78
+ "Deps": [
79
+ {
80
+ "ImportPath": "github.com/foo/baz/sub1",
81
+ "Rev": "28838aae6e8158e3695cf90e2f0ed2498b68ee1d"
82
+ },
83
+ {
84
+ "ImportPath": "github.com/foo/baz/sub2",
85
+ "Rev": "28838aae6e8158e3695cf90e2f0ed2498b68ee1d"
86
+ },
87
+ {
88
+ "ImportPath": "github.com/foo/baz/sub3",
89
+ "Rev": "28838aae6e8158e3695cf90e2f0ed2498b68ee1d"
90
+ }
91
91
  ]
92
92
  }'
93
93
  end
@@ -101,11 +101,12 @@ module LicenseFinder
101
101
 
102
102
  context 'when dependencies are not vendored' do
103
103
  before do
104
+ @orig_gopath = ENV['GOPATH']
104
105
  ENV['GOPATH'] = '/fake/go/path'
105
106
  end
106
107
 
107
108
  after do
108
- ENV['GOPATH'] = nil
109
+ ENV['GOPATH'] = @orig_gopath
109
110
  end
110
111
 
111
112
  it 'should return an array of packages' do
@@ -86,9 +86,14 @@ module LicenseFinder
86
86
  include FakeFS::SpecHelpers
87
87
  before do
88
88
  NPM.instance_variable_set(:@modules, nil)
89
+ FileUtils.mkdir_p(Dir.tmpdir)
89
90
  FileUtils.mkdir_p(root)
90
91
  File.write(File.join(root, "package.json"), package_json)
91
- allow(npm).to receive(:capture).with(/npm/).and_return([dependency_json, true])
92
+ allow(npm).to receive(:capture) do |command|
93
+ filename = command.scan(/> (.*)$/).last.first
94
+ File.write(filename, dependency_json)
95
+ ['', true]
96
+ end
92
97
  end
93
98
 
94
99
  it 'fetches data from npm' do
@@ -117,7 +122,11 @@ module LicenseFinder
117
122
  JSON
118
123
 
119
124
  allow(Dir).to receive(:chdir).with(Pathname('/fake-node-project')) { |&block| block.call }
120
- allow(npm).to receive(:capture).with('npm list --json --long').and_return([json, true])
125
+ allow(npm).to receive(:capture) do |command|
126
+ filename = command.scan(/> (.*)$/).last.first
127
+ File.write(filename, json)
128
+ ['', true]
129
+ end
121
130
 
122
131
  current_packages = npm.current_packages
123
132
  expect(current_packages.map(&:name)).to eq([])
@@ -129,10 +138,35 @@ module LicenseFinder
129
138
  end
130
139
 
131
140
  it "does not fail when command fails but produces output" do
132
- allow(npm).to receive(:capture).with(/npm/).and_return('{"foo":"bar"}', false).once
141
+ allow(npm).to receive(:capture) do |command|
142
+ filename = command.scan(/> (.*)$/).last.first
143
+ File.write(filename, '{"foo":"bar"}')
144
+ ['', false]
145
+ end
133
146
  silence_stderr { npm.current_packages }
134
147
  end
135
148
 
149
+ context "npm circular license edge case - GH#307" do
150
+ let(:package_json) do
151
+ FakeFS.without do
152
+ File.read fixture_path "npm-circular-licenses/package.json"
153
+ end
154
+ end
155
+ let(:dependency_json) do
156
+ FakeFS.without do
157
+ File.read fixture_path "npm-circular-licenses/npm-list.json"
158
+ end
159
+ end
160
+
161
+ describe ".current_packages" do
162
+ it "correctly navigates the dependencies tree and pulls out valid information" do
163
+ FakeFS::FileSystem.clone(File.expand_path('../../../../../lib/license_finder/license/templates', __FILE__))
164
+ expect(npm.current_packages.find {|p| p.name == "has"}.licenses.map(&:name)).to eq ["MIT"]
165
+ expect(npm.current_packages.find {|p| p.name == "function-bind"}.licenses.map(&:name)).to eq ["MIT"]
166
+ end
167
+ end
168
+ end
169
+
136
170
  context "npm recursive dependency edge case - GH#211" do
137
171
  let(:package_json) do
138
172
  FakeFS.without do
@@ -54,11 +54,22 @@ module LicenseFinder
54
54
  FileUtils.touch 'app/vendor/package.nupkg'
55
55
  end
56
56
 
57
- it "returns vendored director" do
57
+ it "returns vendored directory" do
58
58
  nuget = Nuget.new project_path: Pathname.new("app")
59
59
  expect(nuget.package_path).to eq Pathname('/app/vendor')
60
60
  end
61
61
  end
62
+
63
+ context 'when vendor and .nuget are not present but a packages directory exists' do
64
+ before do
65
+ FileUtils.mkdir_p 'app/packages'
66
+ end
67
+
68
+ it "returns the packages directory" do
69
+ nuget = Nuget.new project_path: Pathname.new("app")
70
+ expect(nuget.package_path).to eq Pathname('app/packages')
71
+ end
72
+ end
62
73
  end
63
74
 
64
75
  describe "#current_packages" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: license_finder
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jacob Maine
@@ -20,7 +20,7 @@ authors:
20
20
  autorequire:
21
21
  bindir: bin
22
22
  cert_chain: []
23
- date: 2017-03-16 00:00:00.000000000 Z
23
+ date: 2017-07-12 00:00:00.000000000 Z
24
24
  dependencies:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bundler
@@ -92,6 +92,20 @@ dependencies:
92
92
  - - ">="
93
93
  - !ruby/object:Gem::Version
94
94
  version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: yajl-ruby
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
95
109
  - !ruby/object:Gem::Dependency
96
110
  name: with_env
97
111
  requirement: !ruby/object:Gem::Requirement
@@ -463,6 +477,8 @@ files:
463
477
  - spec/fixtures/license_names/Mit-License
464
478
  - spec/fixtures/license_names/README.rdoc
465
479
  - spec/fixtures/nested_gem/vendor/LICENSE
480
+ - spec/fixtures/npm-circular-licenses/npm-list.json
481
+ - spec/fixtures/npm-circular-licenses/package.json
466
482
  - spec/fixtures/npm-recursive-dependencies/npm-list.json
467
483
  - spec/fixtures/npm-recursive-dependencies/package.json
468
484
  - spec/fixtures/utf8_gem/README
@@ -500,7 +516,6 @@ files:
500
516
  - spec/lib/license_finder/package_managers/maven_package_spec.rb
501
517
  - spec/lib/license_finder/package_managers/maven_spec.rb
502
518
  - spec/lib/license_finder/package_managers/merged_package_spec.rb
503
- - spec/lib/license_finder/package_managers/npm_package_spec.rb
504
519
  - spec/lib/license_finder/package_managers/npm_spec.rb
505
520
  - spec/lib/license_finder/package_managers/nuget_package_spec.rb
506
521
  - spec/lib/license_finder/package_managers/nuget_spec.rb
@@ -544,7 +559,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
544
559
  version: '0'
545
560
  requirements: []
546
561
  rubyforge_project:
547
- rubygems_version: 2.5.2
562
+ rubygems_version: 2.6.11
548
563
  signing_key:
549
564
  specification_version: 4
550
565
  summary: Audit the OSS licenses of your application's dependencies.
@@ -632,6 +647,8 @@ test_files:
632
647
  - spec/fixtures/license_names/Mit-License
633
648
  - spec/fixtures/license_names/README.rdoc
634
649
  - spec/fixtures/nested_gem/vendor/LICENSE
650
+ - spec/fixtures/npm-circular-licenses/npm-list.json
651
+ - spec/fixtures/npm-circular-licenses/package.json
635
652
  - spec/fixtures/npm-recursive-dependencies/npm-list.json
636
653
  - spec/fixtures/npm-recursive-dependencies/package.json
637
654
  - spec/fixtures/utf8_gem/README
@@ -669,7 +686,6 @@ test_files:
669
686
  - spec/lib/license_finder/package_managers/maven_package_spec.rb
670
687
  - spec/lib/license_finder/package_managers/maven_spec.rb
671
688
  - spec/lib/license_finder/package_managers/merged_package_spec.rb
672
- - spec/lib/license_finder/package_managers/npm_package_spec.rb
673
689
  - spec/lib/license_finder/package_managers/npm_spec.rb
674
690
  - spec/lib/license_finder/package_managers/nuget_package_spec.rb
675
691
  - spec/lib/license_finder/package_managers/nuget_spec.rb
@@ -1,56 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module LicenseFinder
4
- describe NpmPackage do
5
- subject do
6
- described_class.new(
7
- "name" => "jasmine-node",
8
- "version" => "1.3.1",
9
- "description" => "a description",
10
- "readme" => "a readme",
11
- "path" => "some/node/package/path",
12
- "homepage" => "a homepage",
13
- "dependencies" => {
14
- "coffee-script" => {
15
- "name" => "coffee-script",
16
- }
17
- }
18
- )
19
- end
20
-
21
- its(:name) { should == "jasmine-node" }
22
- its(:version) { should == "1.3.1" }
23
- its(:summary) { should eq "" }
24
- its(:description) { should == "a description" }
25
- its(:homepage) { should == "a homepage" }
26
- its(:groups) { should == [] } # TODO: put devDependencies in 'dev' group?
27
- its(:children) { should == ["coffee-script"] }
28
- its(:install_path) { should eq "some/node/package/path" }
29
- its(:package_manager) { should eq 'Npm' }
30
-
31
- describe '#license_names_from_spec' do
32
- let(:node_module1) { {"license" => "MIT"} }
33
- let(:node_module2) { {"licenses" => [{"type" => "BSD"}]} }
34
- let(:node_module3) { {"license" => {"type" => "PSF"}} }
35
- let(:node_module4) { {"licenses" => ["MIT"]} }
36
- let(:misdeclared_node_module) { {"licenses" => {"type" => "MIT"}} }
37
-
38
- it 'finds the license for both license structures' do
39
- package = NpmPackage.new(node_module1)
40
- expect(package.license_names_from_spec).to eq ["MIT"]
41
-
42
- package = NpmPackage.new(node_module2)
43
- expect(package.license_names_from_spec).to eq ["BSD"]
44
-
45
- package = NpmPackage.new(node_module3)
46
- expect(package.license_names_from_spec).to eq ["PSF"]
47
-
48
- package = NpmPackage.new(node_module4)
49
- expect(package.license_names_from_spec).to eq ["MIT"]
50
-
51
- package = NpmPackage.new(misdeclared_node_module)
52
- expect(package.license_names_from_spec).to eq ["MIT"]
53
- end
54
- end
55
- end
56
- end