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
@@ -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(ignore_groups: ['dev', 'test'], definition: definition).current_packages
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 '{{join .Deps "\n"}}' ./...]).and_return(go_deps)
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 'returns the skip the standard libs and return lines of the output' do
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(2)
59
- expect(packages).to include 'github.com/onsi/ginkgo'
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 \'{{join .Deps "\n"}}\' ./...') {
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
- expect(subject).to receive(:capture).with('gradle --console plain downloadLicenses').and_return(['', true])
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
- "artifactId" => "hamcrest-core",
8
- "version" => "4.11",
9
- "licenses" => [{ "name" => "MIT" }]
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
- subject { Maven.new(project_path: Pathname('/fake/path')) }
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
- fake_file = double(:license_report, read: license_xml(deps))
28
- allow(subject).to receive(:license_report).and_return(fake_file)
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 true when the package names are equal' do
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(true)
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(p2, ['/path/to/package3', '/path/to/package2'])
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', '2.0.0'), ['/path/to/package2'])
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.2')
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])