license_finder 1.1.1-java → 1.2-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/CHANGELOG.rdoc +10 -0
- data/Gemfile +1 -1
- data/README.md +363 -0
- data/Rakefile +30 -1
- data/TODO.md +28 -0
- data/bin/license_finder_pip.py +18 -0
- data/db/migrate/201410031451_rename_dependency_license_name.rb +6 -0
- data/features/multiple_licenses.feature +9 -0
- data/features/step_definitions/cli_steps.rb +9 -9
- data/features/step_definitions/cocoapod_steps.rb +1 -1
- data/features/step_definitions/configure_bundler_groups_steps.rb +3 -3
- data/features/step_definitions/configure_whitelist_steps.rb +4 -4
- data/features/step_definitions/gradle_steps.rb +1 -1
- data/features/step_definitions/manually_added_steps.rb +3 -3
- data/features/step_definitions/manually_approved_steps.rb +5 -5
- data/features/step_definitions/manually_assigned_license_steps.rb +4 -4
- data/features/step_definitions/maven_steps.rb +1 -1
- data/features/step_definitions/multiple_licenses_steps.rb +14 -0
- data/features/step_definitions/node_steps.rb +1 -1
- data/features/step_definitions/python_steps.rb +1 -1
- data/features/step_definitions/report_csv_steps.rb +3 -3
- data/features/step_definitions/report_html_steps.rb +5 -5
- data/features/step_definitions/shared_steps.rb +23 -6
- data/lib/license_finder.rb +3 -0
- data/lib/license_finder/cli.rb +13 -34
- data/lib/license_finder/configuration.rb +8 -4
- data/lib/license_finder/dependency_manager.rb +25 -15
- data/lib/license_finder/license.rb +8 -0
- data/lib/license_finder/logger.rb +59 -0
- data/lib/license_finder/package.rb +37 -30
- data/lib/license_finder/package_manager.rb +20 -0
- data/lib/license_finder/package_managers/bower.rb +4 -9
- data/lib/license_finder/package_managers/bower_package.rb +2 -1
- data/lib/license_finder/package_managers/bundler.rb +26 -41
- data/lib/license_finder/package_managers/bundler_package.rb +6 -3
- data/lib/license_finder/package_managers/cocoa_pods.rb +18 -10
- data/lib/license_finder/package_managers/cocoa_pods_package.rb +4 -3
- data/lib/license_finder/package_managers/gradle.rb +7 -11
- data/lib/license_finder/package_managers/gradle_package.rb +2 -7
- data/lib/license_finder/package_managers/maven.rb +5 -9
- data/lib/license_finder/package_managers/maven_package.rb +4 -8
- data/lib/license_finder/package_managers/npm.rb +6 -10
- data/lib/license_finder/package_managers/npm_package.rb +2 -1
- data/lib/license_finder/package_managers/pip.rb +11 -24
- data/lib/license_finder/package_managers/pip_package.rb +2 -1
- data/lib/license_finder/package_saver.rb +2 -2
- data/lib/license_finder/platform.rb +4 -0
- data/lib/license_finder/possible_license_file.rb +4 -0
- data/lib/license_finder/possible_license_files.rb +2 -1
- data/lib/license_finder/reports/detailed_text_report.rb +1 -1
- data/lib/license_finder/reports/formatted_report.rb +1 -1
- data/lib/license_finder/tables/dependency.rb +22 -12
- data/lib/license_finder/yml_to_sql.rb +1 -1
- data/lib/templates/html_report.erb +4 -4
- data/lib/templates/markdown_report.erb +4 -4
- data/lib/templates/text_report.erb +1 -1
- data/license_finder.gemspec +28 -12
- data/spec/lib/license_finder/cli_spec.rb +193 -185
- data/spec/lib/license_finder/configuration_spec.rb +46 -47
- data/spec/lib/license_finder/dependency_manager_spec.rb +48 -44
- data/spec/lib/license_finder/license/definitions_spec.rb +26 -26
- data/spec/lib/license_finder/license_spec.rb +25 -25
- data/spec/lib/license_finder/package_managers/bower_package_spec.rb +33 -17
- data/spec/lib/license_finder/package_managers/bower_spec.rb +35 -35
- data/spec/lib/license_finder/package_managers/bundler_package_spec.rb +20 -15
- data/spec/lib/license_finder/package_managers/bundler_spec.rb +12 -19
- data/spec/lib/license_finder/package_managers/cocoa_pods_package_spec.rb +8 -5
- data/spec/lib/license_finder/package_managers/cocoa_pods_spec.rb +20 -22
- data/spec/lib/license_finder/package_managers/gradle_package_spec.rb +8 -5
- data/spec/lib/license_finder/package_managers/gradle_spec.rb +20 -20
- data/spec/lib/license_finder/package_managers/maven_package_spec.rb +8 -5
- data/spec/lib/license_finder/package_managers/maven_spec.rb +18 -18
- data/spec/lib/license_finder/package_managers/npm_package_spec.rb +36 -17
- data/spec/lib/license_finder/package_managers/npm_spec.rb +17 -17
- data/spec/lib/license_finder/package_managers/pip_package_spec.rb +16 -10
- data/spec/lib/license_finder/package_managers/pip_spec.rb +21 -18
- data/spec/lib/license_finder/package_saver_spec.rb +15 -25
- data/spec/lib/license_finder/possible_license_file_spec.rb +5 -4
- data/spec/lib/license_finder/possible_license_files_spec.rb +11 -5
- data/spec/lib/license_finder/reports/detailed_text_report_spec.rb +3 -3
- data/spec/lib/license_finder/reports/html_report_spec.rb +23 -23
- data/spec/lib/license_finder/reports/markdown_report_spec.rb +12 -12
- data/spec/lib/license_finder/reports/reporter_spec.rb +11 -11
- data/spec/lib/license_finder/reports/text_report_spec.rb +3 -3
- data/spec/lib/license_finder/tables/dependency_spec.rb +59 -41
- data/spec/lib/license_finder/yml_to_sql_spec.rb +21 -21
- data/spec/lib/license_finder_spec.rb +1 -1
- data/spec/spec_helper.rb +0 -13
- data/spec/support/shared_examples_for_package.rb +46 -0
- data/spec/support/shared_examples_for_package_manager.rb +15 -0
- metadata +19 -100
- data/readme.md +0 -259
@@ -2,6 +2,9 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module LicenseFinder
|
4
4
|
describe NPM do
|
5
|
+
let(:npm) { NPM.new }
|
6
|
+
it_behaves_like "a PackageManager"
|
7
|
+
|
5
8
|
describe '.current_packages' do
|
6
9
|
before { NPM.instance_variable_set(:@modules, nil) }
|
7
10
|
|
@@ -62,9 +65,9 @@ module LicenseFinder
|
|
62
65
|
}
|
63
66
|
}
|
64
67
|
JSON
|
65
|
-
allow(
|
68
|
+
allow(npm).to receive(:capture).with(/npm/).and_return([json, true])
|
66
69
|
|
67
|
-
current_packages =
|
70
|
+
current_packages = npm.current_packages
|
68
71
|
|
69
72
|
expect(current_packages.map(&:name)).to eq(["depjs", "dep2js", "dep3js", "dep5js", "dep4js"])
|
70
73
|
expect(current_packages.first).to be_a(Package)
|
@@ -79,39 +82,36 @@ module LicenseFinder
|
|
79
82
|
}
|
80
83
|
}
|
81
84
|
JSON
|
82
|
-
allow(
|
85
|
+
allow(npm).to receive(:capture).with(/npm/).and_return([json, true])
|
83
86
|
|
84
|
-
current_packages =
|
87
|
+
current_packages = npm.current_packages
|
85
88
|
|
86
89
|
expect(current_packages.map(&:name)).to eq([])
|
87
90
|
end
|
88
91
|
|
89
92
|
it "fails when command fails" do
|
90
|
-
allow(
|
91
|
-
expect {
|
93
|
+
allow(npm).to receive(:capture).with(/npm/).and_return('Some error', false).once
|
94
|
+
expect { npm.current_packages }.to raise_error(RuntimeError)
|
92
95
|
end
|
93
96
|
|
94
97
|
it "does not fail when command fails but produces output" do
|
95
|
-
allow(
|
96
|
-
|
98
|
+
allow(npm).to receive(:capture).with(/npm/).and_return('{"foo":"bar"}', false).once
|
99
|
+
npm.current_packages
|
97
100
|
end
|
98
101
|
end
|
99
102
|
|
100
103
|
describe '.active?' do
|
101
|
-
let(:
|
102
|
-
|
103
|
-
before do
|
104
|
-
NPM.stub(package_path: package)
|
105
|
-
end
|
104
|
+
let(:package_path) { double(:package_file) }
|
105
|
+
let(:npm) { NPM.new package_path: package_path }
|
106
106
|
|
107
107
|
it 'is true with a package.json file' do
|
108
|
-
|
109
|
-
expect(
|
108
|
+
allow(package_path).to receive_messages(:exist? => true)
|
109
|
+
expect(npm).to be_active
|
110
110
|
end
|
111
111
|
|
112
112
|
it 'is false without a package.json file' do
|
113
|
-
|
114
|
-
expect(
|
113
|
+
allow(package_path).to receive_messages(:exist? => false)
|
114
|
+
expect(npm).to_not be_active
|
115
115
|
end
|
116
116
|
end
|
117
117
|
end
|
@@ -4,7 +4,7 @@ module LicenseFinder
|
|
4
4
|
describe PipPackage do
|
5
5
|
subject { make_package({}) }
|
6
6
|
|
7
|
-
it_behaves_like "
|
7
|
+
it_behaves_like "a Package"
|
8
8
|
|
9
9
|
def make_package(pypi_def)
|
10
10
|
described_class.new('jasmine', '1.3.1', "jasmine/install/path", pypi_def)
|
@@ -49,14 +49,15 @@ module LicenseFinder
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
describe '#
|
52
|
+
describe '#licenses' do
|
53
53
|
describe "with valid pypi license" do
|
54
54
|
it "returns the license from 'license' preferentially" do
|
55
55
|
data = { "license" => "MIT", "classifiers" => [ 'License :: OSI Approved :: Apache 2.0 License' ] }
|
56
56
|
|
57
57
|
subject = make_package(data)
|
58
58
|
|
59
|
-
expect(subject.
|
59
|
+
expect(subject.licenses.length).to eq 1
|
60
|
+
expect(subject.licenses.first.name).to eq('MIT')
|
60
61
|
end
|
61
62
|
|
62
63
|
context "when there's no explicit license" do
|
@@ -65,7 +66,8 @@ module LicenseFinder
|
|
65
66
|
|
66
67
|
subject = make_package(data)
|
67
68
|
|
68
|
-
expect(subject.
|
69
|
+
expect(subject.licenses.length).to eq 1
|
70
|
+
expect(subject.licenses.first.name).to eq('Apache 2.0 License')
|
69
71
|
end
|
70
72
|
|
71
73
|
it "returns 'multiple licenses' if there are multiple licenses in 'classifiers'" do
|
@@ -73,7 +75,8 @@ module LicenseFinder
|
|
73
75
|
|
74
76
|
subject = make_package(data)
|
75
77
|
|
76
|
-
expect(subject.
|
78
|
+
expect(subject.licenses.length).to eq 2
|
79
|
+
expect(subject.licenses.map(&:name)).to eq ['Apache 2.0 License', 'GPL']
|
77
80
|
end
|
78
81
|
end
|
79
82
|
|
@@ -84,7 +87,8 @@ module LicenseFinder
|
|
84
87
|
|
85
88
|
subject = make_package(data)
|
86
89
|
|
87
|
-
expect(subject.
|
90
|
+
expect(subject.licenses.length).to eq 1
|
91
|
+
expect(subject.licenses.first.name).to eq('Apache 2.0 License')
|
88
92
|
end
|
89
93
|
end
|
90
94
|
end
|
@@ -92,17 +96,19 @@ module LicenseFinder
|
|
92
96
|
|
93
97
|
describe "without pypi license" do
|
94
98
|
def stub_license_files(license_files)
|
95
|
-
PossibleLicenseFiles.
|
99
|
+
allow(PossibleLicenseFiles).to receive(:find).with("jasmine/install/path").and_return(license_files)
|
96
100
|
end
|
97
101
|
|
98
102
|
it 'returns license from file' do
|
99
|
-
stub_license_files [double(:license_file, license: License.find_by_name('License from file'))]
|
100
|
-
expect(subject.
|
103
|
+
stub_license_files [double(:license_file, license: License.find_by_name('License from file'), path: "/")]
|
104
|
+
expect(subject.licenses.length).to eq 1
|
105
|
+
expect(subject.licenses.first.name).to eq('License from file')
|
101
106
|
end
|
102
107
|
|
103
108
|
it 'returns other if no license can be found' do
|
104
109
|
stub_license_files []
|
105
|
-
expect(subject.
|
110
|
+
expect(subject.licenses.length).to eq 1
|
111
|
+
expect(subject.licenses.first.name).to eq('other')
|
106
112
|
end
|
107
113
|
end
|
108
114
|
end
|
@@ -2,9 +2,12 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module LicenseFinder
|
4
4
|
describe Pip do
|
5
|
+
let(:pip) { Pip.new }
|
6
|
+
it_behaves_like "a PackageManager"
|
7
|
+
|
5
8
|
describe '.current_packages' do
|
6
9
|
def stub_pip(stdout)
|
7
|
-
allow(
|
10
|
+
allow(pip).to receive("`").with(/license_finder_pip.py/).and_return(stdout)
|
8
11
|
end
|
9
12
|
|
10
13
|
def stub_pypi(name, version, response)
|
@@ -13,48 +16,48 @@ module LicenseFinder
|
|
13
16
|
end
|
14
17
|
|
15
18
|
it 'fetches data from pip' do
|
16
|
-
stub_pip
|
19
|
+
stub_pip [
|
20
|
+
{"name" => "jasmine", "version" => "1.3.1", "location" => "jasmine/path"},
|
21
|
+
{"name" => "jasmine-core", "version" => "1.3.1", "location" => "jasmine-core/path"}
|
22
|
+
].to_json
|
17
23
|
stub_pypi("jasmine", "1.3.1", status: 200, body: '{}')
|
18
24
|
stub_pypi("jasmine-core", "1.3.1", status: 200, body: '{}')
|
19
25
|
|
20
|
-
current_packages =
|
26
|
+
current_packages = pip.current_packages
|
21
27
|
|
22
28
|
expect(current_packages.size).to eq(2)
|
23
29
|
expect(current_packages.first).to be_a(Package)
|
24
30
|
end
|
25
31
|
|
26
32
|
it "fetches data from pypi" do
|
27
|
-
stub_pip
|
33
|
+
stub_pip [{"name" => "jasmine", "version" => "1.3.1", "location" => "jasmine/path"}].to_json
|
28
34
|
stub_pypi("jasmine", "1.3.1", status: 200, body: JSON.generate(info: {summary: "A summary"}))
|
29
35
|
|
30
|
-
expect(PipPackage).to receive(:new).with("jasmine", "1.3.1", "jasmine/path/jasmine", "summary" => "A summary")
|
31
|
-
|
36
|
+
expect(PipPackage).to receive(:new).with("jasmine", "1.3.1", "jasmine/path/jasmine", {"summary" => "A summary"}, anything)
|
37
|
+
pip.current_packages
|
32
38
|
end
|
33
39
|
|
34
40
|
it "ignores pypi if it can't find useful info" do
|
35
|
-
stub_pip
|
41
|
+
stub_pip [{"name" => "jasmine", "version" => "1.3.1", "location" => "jasmine/path"}].to_json
|
36
42
|
stub_pypi("jasmine", "1.3.1", status: 404, body: '')
|
37
43
|
|
38
|
-
expect(PipPackage).to receive(:new).with("jasmine", "1.3.1", "jasmine/path/jasmine", {})
|
39
|
-
|
44
|
+
expect(PipPackage).to receive(:new).with("jasmine", "1.3.1", "jasmine/path/jasmine", {}, anything)
|
45
|
+
pip.current_packages
|
40
46
|
end
|
41
47
|
end
|
42
48
|
|
43
49
|
describe '.active?' do
|
44
|
-
let(:
|
45
|
-
|
46
|
-
before do
|
47
|
-
Pip.stub(requirements_path: requirements)
|
48
|
-
end
|
50
|
+
let(:package_path) { double(:requirements_file) }
|
51
|
+
let(:pip) { Pip.new package_path: package_path }
|
49
52
|
|
50
53
|
it 'is true with a requirements.txt file' do
|
51
|
-
|
52
|
-
expect(
|
54
|
+
allow(package_path).to receive_messages(:exist? => true)
|
55
|
+
expect(pip).to be_active
|
53
56
|
end
|
54
57
|
|
55
58
|
it 'is false without a requirements.txt file' do
|
56
|
-
|
57
|
-
expect(
|
59
|
+
allow(package_path).to receive_messages(:exist? => false)
|
60
|
+
expect(pip).to_not be_active
|
58
61
|
end
|
59
62
|
end
|
60
63
|
end
|
@@ -5,7 +5,7 @@ module LicenseFinder
|
|
5
5
|
let(:package) do
|
6
6
|
double(
|
7
7
|
:package,
|
8
|
-
|
8
|
+
licenses: [License.find_by_name('license')].to_set,
|
9
9
|
children: ['child'],
|
10
10
|
groups: [:group],
|
11
11
|
summary: 'summary',
|
@@ -20,8 +20,8 @@ module LicenseFinder
|
|
20
20
|
let(:dependency) { double(:dependency).as_null_object }
|
21
21
|
|
22
22
|
it "find and updates relevant dependencies" do
|
23
|
-
Dependency.
|
24
|
-
dependency.
|
23
|
+
expect(Dependency).to receive(:named).with('spec_name').and_return(dependency)
|
24
|
+
expect(dependency).to receive(:save_changes)
|
25
25
|
described_class.save_all([package])
|
26
26
|
end
|
27
27
|
end
|
@@ -34,7 +34,7 @@ module LicenseFinder
|
|
34
34
|
summary: 'old summary',
|
35
35
|
description: 'old desription',
|
36
36
|
homepage: 'old homepage',
|
37
|
-
|
37
|
+
license_names: ["old license"].to_json
|
38
38
|
)
|
39
39
|
dep.add_bundler_group BundlerGroup.named("old group")
|
40
40
|
dep.add_child Dependency.named("old child")
|
@@ -42,15 +42,15 @@ module LicenseFinder
|
|
42
42
|
saver = described_class.new(dep, package)
|
43
43
|
subject = saver.save
|
44
44
|
|
45
|
-
subject.id.
|
46
|
-
subject.name.
|
47
|
-
subject.version.
|
48
|
-
subject.summary.
|
49
|
-
subject.description.
|
50
|
-
subject.homepage.
|
51
|
-
subject.bundler_groups.map(&:name).
|
52
|
-
subject.children.map(&:name).
|
53
|
-
subject.
|
45
|
+
expect(subject.id).to be
|
46
|
+
expect(subject.name).to eq("spec_name")
|
47
|
+
expect(subject.version).to eq("1.2.3")
|
48
|
+
expect(subject.summary).to eq("summary")
|
49
|
+
expect(subject.description).to eq("description")
|
50
|
+
expect(subject.homepage).to eq("http://example.com")
|
51
|
+
expect(subject.bundler_groups.map(&:name)).to eq(['group'])
|
52
|
+
expect(subject.children.map(&:name)).to eq(['child'])
|
53
|
+
expect(subject.licenses.first.name).to eq('license')
|
54
54
|
end
|
55
55
|
|
56
56
|
it "keeps approval" do
|
@@ -61,7 +61,7 @@ module LicenseFinder
|
|
61
61
|
saver = described_class.new(dep, package)
|
62
62
|
subject = saver.save
|
63
63
|
|
64
|
-
subject.
|
64
|
+
expect(subject).to be_approved
|
65
65
|
end
|
66
66
|
|
67
67
|
context "to minimize db changes" do
|
@@ -69,23 +69,13 @@ module LicenseFinder
|
|
69
69
|
# See note in PackageSaver#save
|
70
70
|
|
71
71
|
first_run = described_class.find_or_create_by_name(package)
|
72
|
-
|
73
|
-
# have no way to allow the real save to happen.
|
74
|
-
# expect(first_run.dependency).to receive(:save)
|
72
|
+
expect(first_run.dependency).to receive(:save).and_call_original
|
75
73
|
first_run.save
|
76
74
|
|
77
75
|
second_run = described_class.find_or_create_by_name(package)
|
78
76
|
expect(second_run.dependency).to_not receive(:save)
|
79
77
|
second_run.save
|
80
78
|
end
|
81
|
-
|
82
|
-
it "saves new dependencies" do
|
83
|
-
# Just a sanity check that the above test is testing what we think it
|
84
|
-
# is testing.
|
85
|
-
saver = described_class.find_or_create_by_name(package)
|
86
|
-
expect(saver.dependency).to receive(:save)
|
87
|
-
saver.save
|
88
|
-
end
|
89
79
|
end
|
90
80
|
end
|
91
81
|
end
|
@@ -7,11 +7,12 @@ module LicenseFinder
|
|
7
7
|
|
8
8
|
context "ignoring text" do
|
9
9
|
before do
|
10
|
-
subject.
|
10
|
+
allow(subject).to receive(:text).and_return('file text')
|
11
11
|
end
|
12
12
|
|
13
13
|
its(:file_path) { should == 'nested/path' }
|
14
14
|
its(:text) { should == 'file text' } # this is a terrible test, considering the stubbing
|
15
|
+
its(:path) { should == 'root/nested/path' }
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
@@ -19,9 +20,9 @@ module LicenseFinder
|
|
19
20
|
|
20
21
|
context "with a known license" do
|
21
22
|
before do
|
22
|
-
subject.
|
23
|
+
allow(subject).to receive(:text).and_return('a known license')
|
23
24
|
|
24
|
-
License.
|
25
|
+
allow(License).to receive(:find_by_text).with('a known license').and_return(License.find_by_name("MIT"))
|
25
26
|
end
|
26
27
|
|
27
28
|
its(:license) { should == License.find_by_name("MIT") }
|
@@ -29,7 +30,7 @@ module LicenseFinder
|
|
29
30
|
|
30
31
|
context "with an unknown license" do
|
31
32
|
before do
|
32
|
-
subject.
|
33
|
+
allow(subject).to receive(:text).and_return('')
|
33
34
|
end
|
34
35
|
|
35
36
|
its(:license) { should be_nil }
|
@@ -7,36 +7,42 @@ module LicenseFinder
|
|
7
7
|
end
|
8
8
|
|
9
9
|
describe "#find" do
|
10
|
+
it "is empty if passed a nil install path" do
|
11
|
+
subject = described_class.new nil
|
12
|
+
expect(subject.find).to eq([])
|
13
|
+
end
|
14
|
+
|
10
15
|
it "is empty if there aren't any license files" do
|
11
16
|
subject = described_class.new('/not/a/dir')
|
12
|
-
subject.find.
|
17
|
+
expect(subject.find).to eq([])
|
13
18
|
end
|
14
19
|
|
15
20
|
it "includes files with names like LICENSE, License or COPYING" do
|
16
21
|
subject = described_class.new(fixture_path('license_names'))
|
17
22
|
|
18
|
-
subject.find.map(&:file_path).
|
23
|
+
expect(subject.find.map(&:file_path)).to match_array(
|
19
24
|
%w[COPYING.txt LICENSE Mit-License README.rdoc Licence.rdoc]
|
25
|
+
)
|
20
26
|
end
|
21
27
|
|
22
28
|
it "includes files deep in the hierarchy" do
|
23
29
|
subject = described_class.new(fixture_path('nested_gem'))
|
24
30
|
|
25
|
-
subject.find.map(&:file_path).
|
31
|
+
expect(subject.find.map(&:file_path)).to match_array(%w[vendor/LICENSE])
|
26
32
|
end
|
27
33
|
|
28
34
|
it "includes both files nested inside LICENSE directory and top level files" do
|
29
35
|
subject = described_class.new(fixture_path('license_directory'))
|
30
36
|
found_license_files = subject.find
|
31
37
|
|
32
|
-
found_license_files.map(&:file_path).
|
38
|
+
expect(found_license_files.map(&:file_path)).to match_array(%w[
|
33
39
|
LICENSE/BSD-2-Clause.txt
|
34
40
|
LICENSE/GPL-2.0.txt
|
35
41
|
LICENSE/MIT.txt
|
36
42
|
LICENSE/RUBY.txt
|
37
43
|
COPYING
|
38
44
|
LICENSE/LICENSE
|
39
|
-
]
|
45
|
+
])
|
40
46
|
end
|
41
47
|
|
42
48
|
it "handles non UTF8 encodings" do
|
@@ -9,7 +9,7 @@ module LicenseFinder
|
|
9
9
|
'version' => '1.0',
|
10
10
|
'summary' => 'Summary',
|
11
11
|
'description' => 'Description',
|
12
|
-
'
|
12
|
+
'licenses' => [License.find_by_name('MIT')].to_set
|
13
13
|
)
|
14
14
|
end
|
15
15
|
|
@@ -19,14 +19,14 @@ module LicenseFinder
|
|
19
19
|
'version' => '1.0',
|
20
20
|
'summary' => 'Summary',
|
21
21
|
'description' => 'Description',
|
22
|
-
'
|
22
|
+
'licenses' => [License.find_by_name('MIT')].to_set
|
23
23
|
)
|
24
24
|
end
|
25
25
|
|
26
26
|
subject { DetailedTextReport.new([dep2, dep1]).to_s }
|
27
27
|
|
28
28
|
it 'should generate a text report with the name, version, license, summary and description of each dependency, sorted by name' do
|
29
|
-
|
29
|
+
is_expected.to eq("gem_a,1.0,MIT,Summary,Description\ngem_b,1.0,MIT,Summary,Description\n")
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -7,7 +7,7 @@ module LicenseFinder
|
|
7
7
|
let(:dependency_name) { "the-name" }
|
8
8
|
let(:dependency) do
|
9
9
|
dep = Dependency.create name: dependency_name
|
10
|
-
dep.
|
10
|
+
dep.set_licenses [License.find_by_name("MIT")].to_set
|
11
11
|
dep
|
12
12
|
end
|
13
13
|
|
@@ -17,66 +17,66 @@ module LicenseFinder
|
|
17
17
|
before { dependency.approve! "the-approver", "the-approval-note" }
|
18
18
|
|
19
19
|
it "should show approved dependencies without action items" do
|
20
|
-
|
21
|
-
|
20
|
+
is_expected.to have_selector ".approved"
|
21
|
+
is_expected.not_to have_selector ".action-items"
|
22
22
|
end
|
23
23
|
|
24
24
|
it "shows the license, approver and approval notes" do
|
25
25
|
deps = subject.find ".dependencies"
|
26
|
-
deps.
|
27
|
-
deps.
|
28
|
-
deps.
|
29
|
-
deps.
|
26
|
+
expect(deps).to have_content "MIT"
|
27
|
+
expect(deps).to have_content "the-approver"
|
28
|
+
expect(deps).to have_content "the-approval-note"
|
29
|
+
expect(deps).to have_selector "time"
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
33
|
context "when the dependency is whitelisted" do
|
34
|
-
before { dependency.
|
34
|
+
before { allow(dependency).to receive_messages(whitelisted?: true) }
|
35
35
|
|
36
36
|
it "should show approved dependencies without action items" do
|
37
|
-
|
38
|
-
|
37
|
+
is_expected.to have_selector ".approved"
|
38
|
+
is_expected.not_to have_selector ".action-items"
|
39
39
|
end
|
40
40
|
|
41
41
|
it "shows the license" do
|
42
42
|
deps = subject.find ".dependencies"
|
43
|
-
deps.
|
43
|
+
expect(deps).to have_content "MIT"
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
47
|
context "when the dependency is not approved" do
|
48
48
|
before {
|
49
|
-
dependency.
|
49
|
+
dependency.licenses = [License.find_by_name('GPL')].to_set
|
50
50
|
dependency.manual_approval = nil
|
51
51
|
}
|
52
52
|
|
53
53
|
it "should show unapproved dependencies with action items" do
|
54
|
-
|
55
|
-
|
54
|
+
is_expected.to have_selector ".unapproved"
|
55
|
+
is_expected.to have_selector ".action-items li"
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
59
|
context "when the gem has many relationships" do
|
60
60
|
before do
|
61
|
-
dependency.
|
61
|
+
allow(dependency).to receive_messages(bundler_groups: [double(name: "foo group")],
|
62
62
|
parents: [double(name: "foo parent")],
|
63
63
|
children: [double(name: "foo child")])
|
64
64
|
end
|
65
65
|
|
66
66
|
it "should show the relationships" do
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
67
|
+
is_expected.to have_text "(foo group)"
|
68
|
+
is_expected.to have_text "#{dependency_name} is required by:"
|
69
|
+
is_expected.to have_text "foo parent"
|
70
|
+
is_expected.to have_text "#{dependency_name} relies on:"
|
71
|
+
is_expected.to have_text "foo child"
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
75
|
context "when the gem has no relationships" do
|
76
76
|
it "should not show any relationships" do
|
77
|
-
|
78
|
-
|
79
|
-
|
77
|
+
is_expected.not_to have_text "()"
|
78
|
+
is_expected.not_to have_text "#{dependency_name} is required by:"
|
79
|
+
is_expected.not_to have_text "#{dependency_name} relies on:"
|
80
80
|
end
|
81
81
|
end
|
82
82
|
end
|