license_finder 2.1.2 → 3.0.0
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/.gitignore +1 -0
- data/CHANGELOG.md +29 -0
- data/CONTRIBUTING.md +28 -3
- data/Dockerfile +82 -0
- data/README.md +11 -2
- data/Rakefile +27 -0
- data/appveyor.yml +21 -0
- data/bin/license_finder_pip.py +1 -1
- data/ci/pipelines/pipeline.yml.erb +78 -0
- data/ci/scripts/test.sh +27 -0
- data/ci/tasks/build.yml +16 -0
- data/features/features/package_managers/gradle_spec.rb +6 -0
- data/features/features/package_managers/maven_spec.rb +9 -0
- data/features/features/report/diff_spec.rb +26 -23
- data/features/fixtures/alternate-build-file-gradle/build-alt.gradle +26 -0
- data/features/fixtures/alternate-build-file-gradle/settings.gradle +1 -0
- data/features/fixtures/file-based-libs-gradle/build.gradle +1 -1
- data/features/fixtures/gradle-wrapper/build.gradle +26 -0
- data/features/fixtures/gradle-wrapper/gradlew +3 -0
- data/features/fixtures/gradle-wrapper/gradlew.bat +1 -0
- data/features/fixtures/maven-wrapper/mvnw +3 -0
- data/features/fixtures/maven-wrapper/mvnw.cmd +7 -0
- data/features/fixtures/maven-wrapper/pom.xml +37 -0
- data/features/support/testing_dsl.rb +12 -5
- data/lib/license_finder/cli/base.rb +1 -0
- data/lib/license_finder/cli/main.rb +2 -1
- data/lib/license_finder/configuration.rb +6 -13
- data/lib/license_finder/core.rb +2 -1
- data/lib/license_finder/diff.rb +4 -4
- data/lib/license_finder/package.rb +5 -3
- data/lib/license_finder/package_delta.rb +2 -5
- data/lib/license_finder/package_managers/bower.rb +1 -1
- data/lib/license_finder/package_managers/bundler.rb +4 -4
- data/lib/license_finder/package_managers/go_dep.rb +21 -4
- data/lib/license_finder/package_managers/go_package.rb +2 -1
- data/lib/license_finder/package_managers/go_vendor.rb +21 -7
- data/lib/license_finder/package_managers/go_workspace.rb +18 -11
- data/lib/license_finder/package_managers/gradle.rb +42 -15
- data/lib/license_finder/package_managers/maven.rb +31 -17
- data/lib/license_finder/package_managers/maven_dependency_finder.rb +13 -0
- data/lib/license_finder/package_managers/maven_package.rb +6 -1
- data/lib/license_finder/package_managers/npm.rb +4 -4
- data/lib/license_finder/package_managers/rebar.rb +1 -1
- data/lib/license_finder/reports/csv_report.rb +5 -1
- data/lib/license_finder/reports/diff_report.rb +3 -7
- data/lib/license_finder/reports/text_report.rb +6 -1
- data/lib/license_finder/version.rb +1 -1
- data/license_finder.gemspec +6 -0
- data/spec/lib/license_finder/configuration_spec.rb +0 -8
- data/spec/lib/license_finder/core_spec.rb +2 -1
- data/spec/lib/license_finder/diff_spec.rb +50 -27
- data/spec/lib/license_finder/package_managers/bower_spec.rb +1 -1
- data/spec/lib/license_finder/package_managers/bundler_spec.rb +1 -1
- data/spec/lib/license_finder/package_managers/go_dep_spec.rb +14 -1
- data/spec/lib/license_finder/package_managers/go_vendor_spec.rb +23 -2
- data/spec/lib/license_finder/package_managers/go_workspace_spec.rb +23 -7
- data/spec/lib/license_finder/package_managers/gradle_spec.rb +55 -2
- data/spec/lib/license_finder/package_managers/maven_package_spec.rb +16 -3
- data/spec/lib/license_finder/package_managers/maven_spec.rb +56 -4
- data/spec/lib/license_finder/package_managers/merged_package_spec.rb +8 -4
- data/spec/lib/license_finder/package_spec.rb +4 -1
- data/spec/lib/license_finder/reports/csv_report_spec.rb +8 -0
- data/spec/lib/license_finder/reports/diff_report_spec.rb +5 -5
- data/spec/lib/license_finder/reports/text_report_spec.rb +5 -0
- metadata +218 -9
- data/.travis.yml +0 -37
- data/.travis/install_bower.sh +0 -5
- data/.travis/install_godep.sh +0 -6
- data/.travis/install_gradle.sh +0 -12
- data/.travis/install_rebar.sh +0 -14
@@ -28,7 +28,7 @@ module LicenseFinder
|
|
28
28
|
JSON
|
29
29
|
|
30
30
|
allow(Dir).to receive(:chdir).with(Pathname('/fake/path')) { |&block| block.call }
|
31
|
-
allow(subject).to receive(:capture).with('bower list --json -l action').and_return([json, true])
|
31
|
+
allow(subject).to receive(:capture).with('bower list --json -l action --allow-root').and_return([json, true])
|
32
32
|
|
33
33
|
expect(subject.current_packages.map { |p| [p.name, p.install_path] }).to eq [
|
34
34
|
%w(dependency-library /path/to/thing), %w(another-dependency /path/to/thing2)
|
@@ -30,7 +30,7 @@ module LicenseFinder
|
|
30
30
|
|
31
31
|
describe '.current_packages' do
|
32
32
|
subject do
|
33
|
-
Bundler.new(
|
33
|
+
Bundler.new(ignored_groups: ['dev', 'test'], definition: definition).current_packages
|
34
34
|
end
|
35
35
|
|
36
36
|
it "should have 2 dependencies" do
|
@@ -21,6 +21,10 @@ module LicenseFinder
|
|
21
21
|
{
|
22
22
|
"ImportPath": "github.com/pivotal/bar",
|
23
23
|
"Rev": "3245708abcdef234589450649872346783298736"
|
24
|
+
},
|
25
|
+
{
|
26
|
+
"ImportPath": "code.google.com/foo/bar",
|
27
|
+
"Rev": "3245708abcdef234589450649872346783298735"
|
24
28
|
}
|
25
29
|
]
|
26
30
|
}'
|
@@ -30,6 +34,14 @@ module LicenseFinder
|
|
30
34
|
allow(IO).to receive(:read).with('/fake/path/Godeps/Godeps.json').and_return(content.to_s)
|
31
35
|
end
|
32
36
|
|
37
|
+
it 'sets the homepage for packages' do
|
38
|
+
packages = subject.current_packages
|
39
|
+
|
40
|
+
expect(packages[0].homepage).to eq("github.com/pivotal/foo")
|
41
|
+
expect(packages[1].homepage).to eq("github.com/pivotal/bar")
|
42
|
+
expect(packages[2].homepage).to eq("code.google.com/foo/bar")
|
43
|
+
end
|
44
|
+
|
33
45
|
context 'when dependencies are vendored' do
|
34
46
|
before do
|
35
47
|
allow(FileTest).to receive(:exist?).with('/fake/path/Godeps/_workspace').and_return(true)
|
@@ -52,7 +64,8 @@ module LicenseFinder
|
|
52
64
|
it 'list the dependencies with full version' do
|
53
65
|
expect(subject.current_packages.map(&:version)).to eq [
|
54
66
|
"61164e49940b423ba1f12ddbdf01632ac793e5e9",
|
55
|
-
"3245708abcdef234589450649872346783298736"
|
67
|
+
"3245708abcdef234589450649872346783298736",
|
68
|
+
"3245708abcdef234589450649872346783298735"]
|
56
69
|
end
|
57
70
|
end
|
58
71
|
end
|
@@ -39,6 +39,7 @@ module LicenseFinder
|
|
39
39
|
FileUtils.mkdir_p project_path
|
40
40
|
FileUtils.touch File.join(project_path, 'main.go')
|
41
41
|
FileUtils.mkdir_p File.join(project_path, 'vendor', 'github.com', 'foo', 'bar')
|
42
|
+
FileUtils.mkdir_p File.join(project_path, 'vendor', 'golang.org', 'bar', 'baz')
|
42
43
|
end
|
43
44
|
|
44
45
|
it 'detects the project as go vendor project' do
|
@@ -49,9 +50,13 @@ module LicenseFinder
|
|
49
50
|
let(:go_deps) {
|
50
51
|
["github.com/foo/bar", true]
|
51
52
|
}
|
53
|
+
let(:std_deps) {
|
54
|
+
["stdbar/baz", true]
|
55
|
+
}
|
52
56
|
|
53
57
|
before do
|
54
|
-
allow(subject).to receive(:capture).with(%q[go list -f
|
58
|
+
allow(subject).to receive(:capture).with(%q[go list -f "{{join .Deps \"\n\"}}" ./...]).and_return(go_deps)
|
59
|
+
allow(subject).to receive(:capture).with(%q[go list std]).and_return(std_deps)
|
55
60
|
allow(subject).to receive(:capture).with(%q[git rev-list --max-count 1 HEAD]).and_return(["e0ff7ae205f\n", true])
|
56
61
|
end
|
57
62
|
|
@@ -75,7 +80,6 @@ module LicenseFinder
|
|
75
80
|
["github.com/foo/bar\ngithub.com/foo/bar/baz", true]
|
76
81
|
}
|
77
82
|
|
78
|
-
include_examples 'current_packages'
|
79
83
|
end
|
80
84
|
|
81
85
|
context 'when only sub packages are being used' do
|
@@ -93,6 +97,23 @@ module LicenseFinder
|
|
93
97
|
|
94
98
|
include_examples 'current_packages'
|
95
99
|
end
|
100
|
+
|
101
|
+
context 'when standard packages are being used' do
|
102
|
+
let(:go_deps) {
|
103
|
+
["github.com/foo/bar\ngolang.org/stdbar/baz", true]
|
104
|
+
}
|
105
|
+
|
106
|
+
include_examples 'current_packages'
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'when standard package names match part of a nonstandard package' do
|
110
|
+
let(:go_deps) {
|
111
|
+
["github.com/foo/bar/my-stdbar/baz\ngolang.org/stdbar/baz", true]
|
112
|
+
}
|
113
|
+
|
114
|
+
include_examples 'current_packages'
|
115
|
+
|
116
|
+
end
|
96
117
|
end
|
97
118
|
end
|
98
119
|
|
@@ -34,9 +34,19 @@ module LicenseFinder
|
|
34
34
|
|
35
35
|
let(:go_list_output) {
|
36
36
|
<<HERE
|
37
|
-
encoding/json
|
38
37
|
gopkg.in/yaml.v2
|
39
38
|
github.com/onsi/ginkgo
|
39
|
+
myblip/blop-custom
|
40
|
+
encoding/json
|
41
|
+
golang.org/x/tools/go/ast/astutil
|
42
|
+
HERE
|
43
|
+
}
|
44
|
+
|
45
|
+
let(:std_packages) {
|
46
|
+
<<HERE
|
47
|
+
go/ast
|
48
|
+
blop
|
49
|
+
encoding/json
|
40
50
|
HERE
|
41
51
|
}
|
42
52
|
|
@@ -44,6 +54,8 @@ HERE
|
|
44
54
|
allow(Dir).to receive(:chdir).with(Pathname.new project_path) { |&b| b.call() }
|
45
55
|
allow(FileTest).to receive(:exist?).and_return(false)
|
46
56
|
allow(FileTest).to receive(:exist?).with(File.join(project_path, '.envrc')).and_return(true)
|
57
|
+
allow(subject).to receive(:capture).with('go list -f "{{join .Deps \"\n\"}}" ./...').and_return([go_list_output, true])
|
58
|
+
allow(subject).to receive(:capture).with('go list std').and_return([std_packages, true])
|
47
59
|
end
|
48
60
|
|
49
61
|
it 'changes the directory' do
|
@@ -52,16 +64,14 @@ HERE
|
|
52
64
|
expect(Dir).to have_received(:chdir)
|
53
65
|
end
|
54
66
|
|
55
|
-
it '
|
56
|
-
allow(subject).to receive(:capture).with('go list -f \'{{join .Deps "\n"}}\' ./...').and_return([go_list_output, true])
|
67
|
+
it 'lists only non-standard packages' do
|
57
68
|
packages = subject.send(:go_list)
|
58
|
-
expect(packages.count).to eq(
|
59
|
-
expect(packages).to
|
60
|
-
expect(packages).to include 'gopkg.in/yaml.v2'
|
69
|
+
expect(packages.count).to eq(3)
|
70
|
+
expect(packages).to eq(['gopkg.in/yaml.v2', 'github.com/onsi/ginkgo', 'myblip/blop-custom'])
|
61
71
|
end
|
62
72
|
|
63
73
|
it 'sets gopath to the envrc path' do
|
64
|
-
allow(subject).to receive(:capture).with('go list -f
|
74
|
+
allow(subject).to receive(:capture).with('go list -f "{{join .Deps \"\n\"}}" ./...') {
|
65
75
|
expect(ENV['GOPATH']).to be_nil
|
66
76
|
['', true]
|
67
77
|
}
|
@@ -129,6 +139,12 @@ HERE
|
|
129
139
|
allow(subject).to receive(:git_modules).and_return(git_modules_output)
|
130
140
|
end
|
131
141
|
|
142
|
+
it 'sets homepage for the packages' do
|
143
|
+
packages = subject.current_packages
|
144
|
+
|
145
|
+
expect(packages[0].homepage).to eq('bitbucket.org/kardianos/osext')
|
146
|
+
end
|
147
|
+
|
132
148
|
describe 'should return an array of go packages' do
|
133
149
|
it 'provides package names' do
|
134
150
|
packages = subject.current_packages
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'fakefs/spec_helpers'
|
2
3
|
|
3
4
|
module LicenseFinder
|
4
5
|
describe Gradle do
|
@@ -17,6 +18,17 @@ module LicenseFinder
|
|
17
18
|
expect(GradleDependencyFinder).to receive(:new).and_return(dependencies)
|
18
19
|
end
|
19
20
|
|
21
|
+
it 'uses the gradle wrapper, if present' do
|
22
|
+
subject = Gradle.new(project_path: Pathname('features/fixtures/gradle-wrapper'))
|
23
|
+
expect(Dir).to receive(:chdir).with(Pathname('features/fixtures/gradle-wrapper')).and_call_original
|
24
|
+
if Platform.windows?
|
25
|
+
expect(subject.package_management_command).to eq('gradlew.bat')
|
26
|
+
else
|
27
|
+
expect(subject.package_management_command).to eq('./gradlew')
|
28
|
+
end
|
29
|
+
subject.current_packages
|
30
|
+
end
|
31
|
+
|
20
32
|
it 'uses custom subject command, if provided' do
|
21
33
|
subject = Gradle.new(gradle_command: 'subjectfoo', project_path: Pathname('/fake/path'))
|
22
34
|
expect(Dir).to receive(:chdir).with(Pathname('/fake/path')) { |&block| block.call }
|
@@ -27,11 +39,14 @@ module LicenseFinder
|
|
27
39
|
it 'sets the working directory to project_path, if provided' do
|
28
40
|
subject = Gradle.new(project_path: Pathname('/Users/foo/bar'))
|
29
41
|
expect(Dir).to receive(:chdir).with(Pathname('/Users/foo/bar')) { |&block| block.call }
|
30
|
-
|
42
|
+
if Platform.windows?
|
43
|
+
expect(subject).to receive(:capture).with('gradle.bat downloadLicenses').and_return(['', true])
|
44
|
+
else
|
45
|
+
expect(subject).to receive(:capture).with('gradle downloadLicenses').and_return(['', true])
|
46
|
+
end
|
31
47
|
subject.current_packages
|
32
48
|
end
|
33
49
|
|
34
|
-
|
35
50
|
context 'when dependencies are found' do
|
36
51
|
let(:content) do
|
37
52
|
[
|
@@ -123,5 +138,43 @@ module LicenseFinder
|
|
123
138
|
end
|
124
139
|
end
|
125
140
|
end
|
141
|
+
|
142
|
+
describe '#active?' do
|
143
|
+
include FakeFS::SpecHelpers
|
144
|
+
|
145
|
+
it 'return true if build.gradle exists' do
|
146
|
+
FakeFS do
|
147
|
+
FileUtils.mkdir_p '/fake/path'
|
148
|
+
FileUtils.touch '/fake/path/build.gradle'
|
149
|
+
|
150
|
+
expect(subject.active?).to be true
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context "when there's no build.gradle" do
|
155
|
+
it 'returns false' do
|
156
|
+
expect(subject.active?).to be false
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
context "when there's a settings.gradle" do
|
161
|
+
it 'uses the build.gradle referenced inside' do
|
162
|
+
SETTINGS_DOT_GRADLE = <<-eos
|
163
|
+
rootProject.buildFileName = 'build-alt.gradle'
|
164
|
+
eos
|
165
|
+
|
166
|
+
FakeFS do
|
167
|
+
FileUtils.mkdir_p '/fake/path'
|
168
|
+
File.open('/fake/path/settings.gradle', 'w') do |file|
|
169
|
+
file.write SETTINGS_DOT_GRADLE
|
170
|
+
end
|
171
|
+
FileUtils.touch '/fake/path/build-alt.gradle'
|
172
|
+
|
173
|
+
expect(subject.active?).to be true
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
end
|
126
179
|
end
|
127
180
|
end
|
@@ -2,11 +2,16 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module LicenseFinder
|
4
4
|
describe MavenPackage do
|
5
|
+
let(:options) { {} }
|
5
6
|
subject do
|
6
7
|
described_class.new(
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
{
|
9
|
+
"groupId" => "org.hamcrest",
|
10
|
+
"artifactId" => "hamcrest-core",
|
11
|
+
"version" => "4.11",
|
12
|
+
"licenses" => [{ "name" => "MIT" }],
|
13
|
+
},
|
14
|
+
options
|
10
15
|
)
|
11
16
|
end
|
12
17
|
|
@@ -33,6 +38,14 @@ module LicenseFinder
|
|
33
38
|
end
|
34
39
|
end
|
35
40
|
|
41
|
+
context 'when include_groups is set to true' do
|
42
|
+
let(:options) { {include_groups: true} }
|
43
|
+
|
44
|
+
it 'includes the group id in the name' do
|
45
|
+
expect(subject.name).to eq("org.hamcrest:hamcrest-core")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
36
49
|
context "when there are multiple licenses" do
|
37
50
|
subject do
|
38
51
|
described_class.new(
|
@@ -2,7 +2,9 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module LicenseFinder
|
4
4
|
describe Maven do
|
5
|
-
|
5
|
+
let(:options) { {} }
|
6
|
+
|
7
|
+
subject { Maven.new(options.merge(project_path: Pathname('/fake/path'))) }
|
6
8
|
|
7
9
|
it_behaves_like "a PackageManager"
|
8
10
|
|
@@ -20,21 +22,30 @@ module LicenseFinder
|
|
20
22
|
describe '.current_packages' do
|
21
23
|
before do
|
22
24
|
allow(Dir).to receive(:chdir).with(Pathname('/fake/path')) { |&block| block.call }
|
23
|
-
allow(subject).to receive(:capture).with('mvn license:download-licenses').and_return(['', true])
|
25
|
+
allow(subject).to receive(:capture).with('mvn org.codehaus.mojo:license-maven-plugin:download-licenses').and_return(['', true])
|
24
26
|
end
|
25
27
|
|
26
28
|
def stub_license_report(deps)
|
27
|
-
|
28
|
-
|
29
|
+
dependencies = double(:subject_dependency_file, dependencies: [license_xml(deps)])
|
30
|
+
expect(MavenDependencyFinder).to receive(:new).and_return(dependencies)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'uses the maven wrapper, if present' do
|
34
|
+
subject = Maven.new(project_path: Pathname('features/fixtures/maven-wrapper'))
|
35
|
+
expect(Dir).to receive(:chdir).with(Pathname('features/fixtures/maven-wrapper')).and_call_original
|
36
|
+
expect(subject.package_management_command).to eq('./mvnw').or eq('mvnw.cmd')
|
37
|
+
subject.current_packages
|
29
38
|
end
|
30
39
|
|
31
40
|
it 'lists all the current packages' do
|
32
41
|
stub_license_report("
|
33
42
|
<dependency>
|
43
|
+
<groupId>org.otherorg</groupId>
|
34
44
|
<artifactId>junit</artifactId>
|
35
45
|
<version>4.11</version>
|
36
46
|
</dependency>
|
37
47
|
<dependency>
|
48
|
+
<groupId>org.hamcrest</groupId>
|
38
49
|
<artifactId>hamcrest-core</artifactId>
|
39
50
|
<version>1.3</version>
|
40
51
|
</dependency>
|
@@ -46,6 +57,23 @@ module LicenseFinder
|
|
46
57
|
]
|
47
58
|
end
|
48
59
|
|
60
|
+
context 'when ignored_groups is used' do
|
61
|
+
subject {
|
62
|
+
Maven.new(options.merge(
|
63
|
+
project_path: Pathname('/fake/path'),
|
64
|
+
ignored_groups: Set.new(%w(system test provided import))
|
65
|
+
))
|
66
|
+
}
|
67
|
+
|
68
|
+
before do
|
69
|
+
expect(subject).to receive(:capture).with('mvn org.codehaus.mojo:license-maven-plugin:download-licenses -Dlicense.excludedScopes=system,test,provided,import').and_return(['', true])
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'uses skips the specified groups' do
|
73
|
+
subject.current_packages
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
49
77
|
it "handles multiple licenses" do
|
50
78
|
stub_license_report("
|
51
79
|
<dependency>
|
@@ -63,6 +91,30 @@ module LicenseFinder
|
|
63
91
|
expect(subject.current_packages.first.licenses.map(&:name)).to eq ['License 1', 'License 2']
|
64
92
|
end
|
65
93
|
|
94
|
+
context 'when maven group ids option is enabled' do
|
95
|
+
let(:options) { { maven_include_groups: true } }
|
96
|
+
|
97
|
+
it 'lists all the current packages' do
|
98
|
+
stub_license_report("
|
99
|
+
<dependency>
|
100
|
+
<groupId>junit</groupId>
|
101
|
+
<artifactId>junit</artifactId>
|
102
|
+
<version>4.11</version>
|
103
|
+
</dependency>
|
104
|
+
<dependency>
|
105
|
+
<groupId>org.hamcrest</groupId>
|
106
|
+
<artifactId>hamcrest-core</artifactId>
|
107
|
+
<version>1.3</version>
|
108
|
+
</dependency>
|
109
|
+
")
|
110
|
+
|
111
|
+
expect(subject.current_packages.map { |p| [p.name, p.version] }).to eq [
|
112
|
+
["junit:junit", "4.11"],
|
113
|
+
["org.hamcrest:hamcrest-core", "1.3"]
|
114
|
+
]
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
66
118
|
it "handles no licenses" do
|
67
119
|
stub_license_report("
|
68
120
|
<dependency>
|
@@ -29,27 +29,31 @@ module LicenseFinder
|
|
29
29
|
end
|
30
30
|
|
31
31
|
describe '#eql?' do
|
32
|
-
it 'returns
|
32
|
+
it 'returns false when the package names are the same, but the version is different' do
|
33
33
|
p1 = MergedPackage.new(Package.new('foo', '1.0.0'), ['/path/to/package1'])
|
34
34
|
p2 = MergedPackage.new(Package.new('foo', '2.0.0'), ['/path/to/package2'])
|
35
35
|
p3 = MergedPackage.new(Package.new('bar', '1.0.0'), ['/path/to/package3'])
|
36
|
-
expect(p1.eql?(p2)).to eq(
|
36
|
+
expect(p1.eql?(p2)).to eq(false)
|
37
37
|
expect(p1.eql?(p3)).not_to eq(true)
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'can handle merged packages that contain other merged packages' do
|
41
41
|
p1 = MergedPackage.new(Package.new('foo', '1.0.0'), ['/path/to/package1'])
|
42
42
|
p2 = MergedPackage.new(Package.new('foo', '2.0.0'), ['/path/to/package2'])
|
43
|
-
p3 = MergedPackage.new(
|
43
|
+
p3 = MergedPackage.new(p1, ['/path/to/package3', '/path/to/package1'])
|
44
|
+
p4 = MergedPackage.new(p2, ['/path/to/package4', '/path/to/package2'])
|
44
45
|
expect(p1.eql?(p3)).to eq(true)
|
46
|
+
expect(p1.eql?(p4)).not_to eq(true)
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
48
50
|
describe 'hash' do
|
49
51
|
it 'returns equal hash codes for packages that are equal' do
|
50
52
|
p1 = MergedPackage.new(Package.new('foo', '1.0.0'), ['/path/to/package1'])
|
51
|
-
p2 = MergedPackage.new(Package.new('foo', '
|
53
|
+
p2 = MergedPackage.new(Package.new('foo', '1.0.0'), ['/path/to/package2'])
|
54
|
+
p3 = MergedPackage.new(Package.new('foo', '2.0.0'), ['/path/to/package3'])
|
52
55
|
expect(p1.hash).to eq(p2.hash)
|
56
|
+
expect(p1.hash).not_to eq(p3.hash)
|
53
57
|
end
|
54
58
|
end
|
55
59
|
end
|
@@ -153,13 +153,16 @@ module LicenseFinder
|
|
153
153
|
describe '#eql?' do
|
154
154
|
it 'returns true if package name matches' do
|
155
155
|
p1 = Package.new('package', '0.0.1')
|
156
|
-
p2 = Package.new('package', '0.0.
|
156
|
+
p2 = Package.new('package', '0.0.1')
|
157
157
|
p3 = Package.new('foo', 'foo')
|
158
|
+
p4 = Package.new('foo', 'foo2')
|
158
159
|
|
159
160
|
expect(p1.eql?(p2)).to be true
|
160
161
|
expect(p1.eql?(p3)).to be false
|
162
|
+
expect(p3.eql?(p4)).to be false
|
161
163
|
|
162
164
|
expect(p1.hash).to eq p2.hash
|
165
|
+
expect(p3.hash).not_to eq p4.hash
|
163
166
|
end
|
164
167
|
end
|
165
168
|
|
@@ -35,6 +35,14 @@ module LicenseFinder
|
|
35
35
|
expect(subject.to_s).to eq("gem_a,1.0,Nuget\n")
|
36
36
|
end
|
37
37
|
|
38
|
+
it 'supports license_links column' do
|
39
|
+
dep = Package.new('gem_a', '1.0')
|
40
|
+
mit = License.find_by_name("MIT")
|
41
|
+
dep.decide_on_license(mit)
|
42
|
+
subject = described_class.new([dep], columns: %w[name licenses license_links])
|
43
|
+
expect(subject.to_s).to eq("gem_a,MIT,#{mit.url}\n")
|
44
|
+
end
|
45
|
+
|
38
46
|
it "does not include columns that should only be in merged reports" do
|
39
47
|
dep = Package.new('gem_a', '1.0')
|
40
48
|
subject = described_class.new([dep], columns: %w[subproject_paths])
|