license_finder 3.0.1 → 3.0.2
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 +4 -4
- data/CHANGELOG.md +15 -1
- data/ci/pipelines/pipeline.yml.erb +2 -2
- data/ci/scripts/test.sh +2 -3
- data/ci/tasks/build.yml +1 -1
- data/lib/license_finder/package_managers/npm.rb +22 -66
- data/lib/license_finder/package_managers/npm_package.rb +148 -0
- data/lib/license_finder/version.rb +1 -1
- data/license_finder.gemspec +0 -1
- data/spec/fixtures/npm-circular-dependencies/npm-list.json +5339 -0
- data/spec/fixtures/npm-circular-dependencies/package.json +5 -0
- data/spec/fixtures/npm-licenses-string/npm-list.json +7597 -0
- data/spec/fixtures/npm-licenses-string/package.json +23 -0
- data/spec/lib/license_finder/package_managers/npm_package_spec.rb +56 -0
- data/spec/lib/license_finder/package_managers/npm_spec.rb +78 -48
- metadata +12 -16
@@ -0,0 +1,23 @@
|
|
1
|
+
{
|
2
|
+
"name": "license_finder_test",
|
3
|
+
"version": "0.0.1",
|
4
|
+
"description": "has a licenses string field",
|
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
|
+
"licenses": "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
|
+
}
|
@@ -0,0 +1,56 @@
|
|
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
|
@@ -3,19 +3,19 @@ require 'fakefs/spec_helpers'
|
|
3
3
|
|
4
4
|
module LicenseFinder
|
5
5
|
describe NPM do
|
6
|
-
let(:root) {
|
6
|
+
let(:root) { '/fake-node-project' }
|
7
7
|
let(:npm) { NPM.new project_path: Pathname.new(root) }
|
8
8
|
|
9
|
-
it_behaves_like
|
9
|
+
it_behaves_like 'a PackageManager'
|
10
10
|
|
11
11
|
let(:package_json) do
|
12
12
|
{
|
13
13
|
dependencies: {
|
14
|
-
|
15
|
-
|
14
|
+
'dependency.js' => '1.3.3.7',
|
15
|
+
'dependency2.js' => '4.2'
|
16
16
|
},
|
17
17
|
devDependencies: {
|
18
|
-
|
18
|
+
'dependency3.js' => '4.2'
|
19
19
|
}
|
20
20
|
}.to_json
|
21
21
|
end
|
@@ -88,31 +88,26 @@ module LicenseFinder
|
|
88
88
|
NPM.instance_variable_set(:@modules, nil)
|
89
89
|
FileUtils.mkdir_p(Dir.tmpdir)
|
90
90
|
FileUtils.mkdir_p(root)
|
91
|
-
File.write(File.join(root,
|
92
|
-
allow(npm).to receive(:
|
93
|
-
filename = command.scan(/> (.*)$/).last.first
|
94
|
-
File.write(filename, dependency_json)
|
95
|
-
['', true]
|
96
|
-
end
|
91
|
+
File.write(File.join(root, 'package.json'), package_json)
|
92
|
+
allow(npm).to receive(:run_command_with_tempfile_buffer).and_return ['', JSON.parse(dependency_json), true]
|
97
93
|
end
|
98
94
|
|
99
95
|
it 'fetches data from npm' do
|
100
96
|
current_packages = npm.current_packages
|
101
|
-
|
102
|
-
expect(current_packages.map(&:name)).to eq(["dependency.js", "dependency1-1.js", "dependency2.js", "dependency2-1.js", "dependency3.js", "dependency3-1.js"])
|
97
|
+
expect(current_packages.map(&:name)).to eq(%w(dependency.js dependency1-1.js dependency2.js dependency2-1.js dependency3.js dependency3-1.js))
|
103
98
|
end
|
104
99
|
|
105
|
-
it
|
100
|
+
it 'finds the groups for dependencies' do
|
106
101
|
current_packages = npm.current_packages
|
107
|
-
expect(current_packages.find { |p| p.name ==
|
108
|
-
expect(current_packages.find { |p| p.name ==
|
109
|
-
expect(current_packages.find { |p| p.name ==
|
110
|
-
expect(current_packages.find { |p| p.name ==
|
111
|
-
expect(current_packages.find { |p| p.name ==
|
112
|
-
expect(current_packages.find { |p| p.name ==
|
102
|
+
expect(current_packages.find { |p| p.name == 'dependency.js' }.groups).to eq(['dependencies'])
|
103
|
+
expect(current_packages.find { |p| p.name == 'dependency1-1.js' }.groups).to eq(%w(dependencies devDependencies))
|
104
|
+
expect(current_packages.find { |p| p.name == 'dependency2.js' }.groups).to eq(['dependencies'])
|
105
|
+
expect(current_packages.find { |p| p.name == 'dependency2-1.js' }.groups).to eq(['dependencies'])
|
106
|
+
expect(current_packages.find { |p| p.name == 'dependency3.js' }.groups).to eq(['devDependencies'])
|
107
|
+
expect(current_packages.find { |p| p.name == 'dependency3-1.js' }.groups).to eq(['devDependencies'])
|
113
108
|
end
|
114
109
|
|
115
|
-
it
|
110
|
+
it 'does not support name version string' do
|
116
111
|
json = <<-JSON
|
117
112
|
{
|
118
113
|
"devDependencies": {
|
@@ -122,67 +117,102 @@ module LicenseFinder
|
|
122
117
|
JSON
|
123
118
|
|
124
119
|
allow(Dir).to receive(:chdir).with(Pathname('/fake-node-project')) { |&block| block.call }
|
125
|
-
allow(npm).to receive(:
|
126
|
-
filename = command.scan(/> (.*)$/).last.first
|
127
|
-
File.write(filename, json)
|
128
|
-
['', true]
|
129
|
-
end
|
120
|
+
allow(npm).to receive(:run_command_with_tempfile_buffer).and_return ['', JSON.parse(json), true]
|
130
121
|
|
131
122
|
current_packages = npm.current_packages
|
132
123
|
expect(current_packages.map(&:name)).to eq([])
|
133
124
|
end
|
134
125
|
|
135
|
-
it
|
136
|
-
allow(npm).to receive(:
|
126
|
+
it 'fails when command fails' do
|
127
|
+
allow(npm).to receive(:run_command_with_tempfile_buffer).with(/npm/).and_return('Some error', nil, false).once
|
137
128
|
expect { npm.current_packages }.to raise_error(RuntimeError)
|
138
129
|
end
|
139
130
|
|
140
|
-
it
|
141
|
-
allow(npm).to receive(:
|
142
|
-
filename = command.scan(/> (.*)$/).last.first
|
143
|
-
File.write(filename, '{"foo":"bar"}')
|
144
|
-
['', false]
|
145
|
-
end
|
131
|
+
it 'does not fail when command fails but produces output' do
|
132
|
+
allow(npm).to receive(:run_command_with_tempfile_buffer).and_return ['', {'foo' => 'bar'}, false]
|
146
133
|
silence_stderr { npm.current_packages }
|
147
134
|
end
|
148
135
|
|
149
|
-
context
|
136
|
+
context 'npm recursive dependency edge case - GH#211' do
|
137
|
+
let(:package_json) do
|
138
|
+
FakeFS.without do
|
139
|
+
File.read fixture_path 'npm-recursive-dependencies/package.json'
|
140
|
+
end
|
141
|
+
end
|
142
|
+
let(:dependency_json) do
|
143
|
+
FakeFS.without do
|
144
|
+
File.read fixture_path 'npm-recursive-dependencies/npm-list.json'
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe '.current_packages' do
|
149
|
+
it 'correctly navigates the dependencies tree and pulls out valid information' do
|
150
|
+
expect(npm.current_packages.find { |p| p.name == 'pui-react-alerts' }.version).to eq('3.0.0-alpha.2')
|
151
|
+
expect(npm.current_packages.find { |p| p.name == 'pui-react-media' }.version).to eq('3.0.0-alpha.2')
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
context 'npm circular license edge case - GH#307' do
|
157
|
+
let(:package_json) do
|
158
|
+
FakeFS.without do
|
159
|
+
File.read fixture_path 'npm-circular-licenses/package.json'
|
160
|
+
end
|
161
|
+
end
|
162
|
+
let(:dependency_json) do
|
163
|
+
FakeFS.without do
|
164
|
+
File.read fixture_path 'npm-circular-licenses/npm-list.json'
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe '.current_packages' do
|
169
|
+
it 'correctly navigates the dependencies tree and pulls out valid information' do
|
170
|
+
FakeFS::FileSystem.clone(File.expand_path('../../../../../lib/license_finder/license/templates', __FILE__))
|
171
|
+
expect(npm.current_packages.find {|p| p.name == 'has'}.licenses.map(&:name)).to eq ['MIT']
|
172
|
+
expect(npm.current_packages.find {|p| p.name == 'function-bind'}.licenses.map(&:name)).to eq ['MIT']
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
context 'npm licenses is a string - GH#317' do
|
150
178
|
let(:package_json) do
|
151
179
|
FakeFS.without do
|
152
|
-
File.read fixture_path
|
180
|
+
File.read fixture_path 'npm-licenses-string/package.json'
|
153
181
|
end
|
154
182
|
end
|
155
183
|
let(:dependency_json) do
|
156
184
|
FakeFS.without do
|
157
|
-
File.read fixture_path
|
185
|
+
File.read fixture_path 'npm-licenses-string/npm-list.json'
|
158
186
|
end
|
159
187
|
end
|
160
188
|
|
161
|
-
describe
|
162
|
-
it
|
189
|
+
describe '.current_packages' do
|
190
|
+
it 'correctly reports the license type' do
|
163
191
|
FakeFS::FileSystem.clone(File.expand_path('../../../../../lib/license_finder/license/templates', __FILE__))
|
164
|
-
|
165
|
-
expect(npm.current_packages.find {|p| p.name == "function-bind"}.licenses.map(&:name)).to eq ["MIT"]
|
192
|
+
expect(npm.current_packages.find {|p| p.name == 'boolbase'}.licenses.map(&:name)).to eq ['ISC']
|
166
193
|
end
|
167
194
|
end
|
168
195
|
end
|
169
196
|
|
170
|
-
context
|
197
|
+
context 'when packages have circular dependencies - GH#313' do
|
171
198
|
let(:package_json) do
|
172
199
|
FakeFS.without do
|
173
|
-
File.read fixture_path
|
200
|
+
File.read fixture_path 'npm-circular-dependencies/package.json'
|
174
201
|
end
|
175
202
|
end
|
176
203
|
let(:dependency_json) do
|
177
204
|
FakeFS.without do
|
178
|
-
File.read fixture_path
|
205
|
+
File.read fixture_path 'npm-circular-dependencies/npm-list.json'
|
179
206
|
end
|
180
207
|
end
|
181
208
|
|
182
|
-
describe
|
183
|
-
it
|
184
|
-
|
185
|
-
expect(
|
209
|
+
describe '.current_packages' do
|
210
|
+
it 'should return package tree successfully' do
|
211
|
+
packages = npm.current_packages
|
212
|
+
expect(packages.count).to be > 1
|
213
|
+
expect(packages.select{|p| p.name == 'babel-register'}.count).to eq(1)
|
214
|
+
expect(packages.select{|p| p.name == 'babel-core'}.count).to eq(1)
|
215
|
+
expect(packages.find{|p| p.name == 'babel-register'}.dependencies.count).to be > 0
|
186
216
|
end
|
187
217
|
end
|
188
218
|
end
|
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.
|
4
|
+
version: 3.0.2
|
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-07-
|
23
|
+
date: 2017-07-27 00:00:00.000000000 Z
|
24
24
|
dependencies:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: bundler
|
@@ -92,20 +92,6 @@ 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'
|
109
95
|
- !ruby/object:Gem::Dependency
|
110
96
|
name: with_env
|
111
97
|
requirement: !ruby/object:Gem::Requirement
|
@@ -477,8 +463,12 @@ files:
|
|
477
463
|
- spec/fixtures/license_names/Mit-License
|
478
464
|
- spec/fixtures/license_names/README.rdoc
|
479
465
|
- spec/fixtures/nested_gem/vendor/LICENSE
|
466
|
+
- spec/fixtures/npm-circular-dependencies/npm-list.json
|
467
|
+
- spec/fixtures/npm-circular-dependencies/package.json
|
480
468
|
- spec/fixtures/npm-circular-licenses/npm-list.json
|
481
469
|
- spec/fixtures/npm-circular-licenses/package.json
|
470
|
+
- spec/fixtures/npm-licenses-string/npm-list.json
|
471
|
+
- spec/fixtures/npm-licenses-string/package.json
|
482
472
|
- spec/fixtures/npm-recursive-dependencies/npm-list.json
|
483
473
|
- spec/fixtures/npm-recursive-dependencies/package.json
|
484
474
|
- spec/fixtures/utf8_gem/README
|
@@ -516,6 +506,7 @@ files:
|
|
516
506
|
- spec/lib/license_finder/package_managers/maven_package_spec.rb
|
517
507
|
- spec/lib/license_finder/package_managers/maven_spec.rb
|
518
508
|
- spec/lib/license_finder/package_managers/merged_package_spec.rb
|
509
|
+
- spec/lib/license_finder/package_managers/npm_package_spec.rb
|
519
510
|
- spec/lib/license_finder/package_managers/npm_spec.rb
|
520
511
|
- spec/lib/license_finder/package_managers/nuget_package_spec.rb
|
521
512
|
- spec/lib/license_finder/package_managers/nuget_spec.rb
|
@@ -647,8 +638,12 @@ test_files:
|
|
647
638
|
- spec/fixtures/license_names/Mit-License
|
648
639
|
- spec/fixtures/license_names/README.rdoc
|
649
640
|
- spec/fixtures/nested_gem/vendor/LICENSE
|
641
|
+
- spec/fixtures/npm-circular-dependencies/npm-list.json
|
642
|
+
- spec/fixtures/npm-circular-dependencies/package.json
|
650
643
|
- spec/fixtures/npm-circular-licenses/npm-list.json
|
651
644
|
- spec/fixtures/npm-circular-licenses/package.json
|
645
|
+
- spec/fixtures/npm-licenses-string/npm-list.json
|
646
|
+
- spec/fixtures/npm-licenses-string/package.json
|
652
647
|
- spec/fixtures/npm-recursive-dependencies/npm-list.json
|
653
648
|
- spec/fixtures/npm-recursive-dependencies/package.json
|
654
649
|
- spec/fixtures/utf8_gem/README
|
@@ -686,6 +681,7 @@ test_files:
|
|
686
681
|
- spec/lib/license_finder/package_managers/maven_package_spec.rb
|
687
682
|
- spec/lib/license_finder/package_managers/maven_spec.rb
|
688
683
|
- spec/lib/license_finder/package_managers/merged_package_spec.rb
|
684
|
+
- spec/lib/license_finder/package_managers/npm_package_spec.rb
|
689
685
|
- spec/lib/license_finder/package_managers/npm_spec.rb
|
690
686
|
- spec/lib/license_finder/package_managers/nuget_package_spec.rb
|
691
687
|
- spec/lib/license_finder/package_managers/nuget_spec.rb
|