license_finder 0.8.0-java
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.
- data/.gitignore +12 -0
- data/.rspec +1 -0
- data/.travis.yml +15 -0
- data/Gemfile +3 -0
- data/LICENSE +22 -0
- data/Rakefile +21 -0
- data/bin/license_finder +54 -0
- data/db/migrate/201303290935_create_dependencies.rb +14 -0
- data/db/migrate/201303291155_create_licenses.rb +13 -0
- data/db/migrate/201303291402_create_approvals.rb +13 -0
- data/db/migrate/201303291456_create_ancestries.rb +9 -0
- data/db/migrate/201303291519_create_bundler_groups.rb +13 -0
- data/db/migrate/201303291720_move_manual_from_approvals_to_licenses.rb +11 -0
- data/db/migrate/201303291753_allow_null_license_names.rb +7 -0
- data/db/migrate/201304011027_allow_null_dependency_version.rb +7 -0
- data/db/migrate/201304020947_change_table_name_licenses_to_license_aliases.rb +5 -0
- data/features/approve_dependencies.feature +14 -0
- data/features/html_report.feature +38 -0
- data/features/ignore_bundle_groups.feature +11 -0
- data/features/license_finder.feature +47 -0
- data/features/license_finder_rake_task.feature +37 -0
- data/features/rails_rake.feature +9 -0
- data/features/set_license.feature +12 -0
- data/features/step_definitions/license_finder_steps.rb +25 -0
- data/features/step_definitions/steps.rb +376 -0
- data/features/text_report.feature +27 -0
- data/features/whitelist.feature +24 -0
- data/files/license_finder.yml +8 -0
- data/lib/data/licenses/Apache2.txt +172 -0
- data/lib/data/licenses/BSD.txt +24 -0
- data/lib/data/licenses/GPLv2.txt +339 -0
- data/lib/data/licenses/ISC.txt +2 -0
- data/lib/data/licenses/LGPL.txt +165 -0
- data/lib/data/licenses/MIT.txt +9 -0
- data/lib/data/licenses/NewBSD.txt +21 -0
- data/lib/data/licenses/Ruby.txt +52 -0
- data/lib/data/licenses/SimplifiedBSD.txt +23 -0
- data/lib/license_finder.rb +47 -0
- data/lib/license_finder/bundle.rb +48 -0
- data/lib/license_finder/bundle_syncer.rb +11 -0
- data/lib/license_finder/bundled_gem.rb +48 -0
- data/lib/license_finder/cli.rb +49 -0
- data/lib/license_finder/configuration.rb +71 -0
- data/lib/license_finder/dependency_report.rb +30 -0
- data/lib/license_finder/gem_saver.rb +69 -0
- data/lib/license_finder/html_report.rb +14 -0
- data/lib/license_finder/license.rb +90 -0
- data/lib/license_finder/license/apache2.rb +8 -0
- data/lib/license_finder/license/bsd.rb +4 -0
- data/lib/license_finder/license/gplv2.rb +4 -0
- data/lib/license_finder/license/isc.rb +3 -0
- data/lib/license_finder/license/lgpl.rb +3 -0
- data/lib/license_finder/license/mit.rb +23 -0
- data/lib/license_finder/license/new_bsd.rb +8 -0
- data/lib/license_finder/license/ruby.rb +11 -0
- data/lib/license_finder/license/simplified_bsd.rb +8 -0
- data/lib/license_finder/license_files.rb +36 -0
- data/lib/license_finder/license_url.rb +12 -0
- data/lib/license_finder/platform.rb +32 -0
- data/lib/license_finder/possible_license_file.rb +32 -0
- data/lib/license_finder/railtie.rb +7 -0
- data/lib/license_finder/reporter.rb +20 -0
- data/lib/license_finder/tables.rb +7 -0
- data/lib/license_finder/tables/approval.rb +4 -0
- data/lib/license_finder/tables/bundler_group.rb +4 -0
- data/lib/license_finder/tables/dependency.rb +31 -0
- data/lib/license_finder/tables/license_alias.rb +22 -0
- data/lib/license_finder/text_report.rb +9 -0
- data/lib/license_finder/yml_to_sql.rb +127 -0
- data/lib/tasks/license_finder.rake +7 -0
- data/lib/templates/html_report.erb +111 -0
- data/lib/templates/text_report.erb +3 -0
- data/license_finder.gemspec +36 -0
- data/readme.md +115 -0
- data/spec/fixtures/APACHE-2-LICENSE +202 -0
- data/spec/fixtures/GPLv2 +339 -0
- data/spec/fixtures/ISC-LICENSE +10 -0
- data/spec/fixtures/MIT-LICENSE +22 -0
- data/spec/fixtures/MIT-LICENSE-with-varied-disclaimer +22 -0
- data/spec/fixtures/README-with-MIT-LICENSE +222 -0
- data/spec/fixtures/license_directory/COPYING +0 -0
- data/spec/fixtures/license_directory/LICENSE/BSD-2-Clause.txt +25 -0
- data/spec/fixtures/license_directory/LICENSE/GPL-2.0.txt +339 -0
- data/spec/fixtures/license_directory/LICENSE/LICENSE +191 -0
- data/spec/fixtures/license_directory/LICENSE/MIT.txt +21 -0
- data/spec/fixtures/license_directory/LICENSE/RUBY.txt +60 -0
- data/spec/fixtures/license_names/COPYING.txt +0 -0
- data/spec/fixtures/license_names/LICENSE +0 -0
- data/spec/fixtures/license_names/Licence.rdoc +0 -0
- data/spec/fixtures/license_names/Mit-License +0 -0
- data/spec/fixtures/license_names/README.rdoc +0 -0
- data/spec/fixtures/mit_licensed_gem/LICENSE +22 -0
- data/spec/fixtures/nested_gem/vendor/LICENSE +0 -0
- data/spec/fixtures/nested_readme/vendor/README +0 -0
- data/spec/fixtures/other_licensed_gem/LICENSE +3 -0
- data/spec/fixtures/readme/Project ReadMe b/data/spec/fixtures/readme/Project → ReadMe +0 -0
- data/spec/fixtures/readme/README +0 -0
- data/spec/fixtures/readme/Readme.markdown +0 -0
- data/spec/fixtures/utf8_gem/README +210 -0
- data/spec/lib/license_finder/bundle_spec.rb +61 -0
- data/spec/lib/license_finder/bundle_syncer_spec.rb +16 -0
- data/spec/lib/license_finder/bundled_gem_spec.rb +62 -0
- data/spec/lib/license_finder/cli_spec.rb +38 -0
- data/spec/lib/license_finder/configuration_spec.rb +70 -0
- data/spec/lib/license_finder/gem_saver_spec.rb +155 -0
- data/spec/lib/license_finder/html_report_spec.rb +84 -0
- data/spec/lib/license_finder/license/apache_spec.rb +7 -0
- data/spec/lib/license_finder/license/bsd_spec.rb +41 -0
- data/spec/lib/license_finder/license/gplv2_spec.rb +7 -0
- data/spec/lib/license_finder/license/isc_spec.rb +7 -0
- data/spec/lib/license_finder/license/lgpl_spec.rb +7 -0
- data/spec/lib/license_finder/license/mit_spec.rb +33 -0
- data/spec/lib/license_finder/license/new_bsd_spec.rb +35 -0
- data/spec/lib/license_finder/license/ruby_spec.rb +19 -0
- data/spec/lib/license_finder/license/simplified_bsd_spec.rb +7 -0
- data/spec/lib/license_finder/license_files_spec.rb +50 -0
- data/spec/lib/license_finder/license_spec.rb +45 -0
- data/spec/lib/license_finder/license_url_spec.rb +20 -0
- data/spec/lib/license_finder/possible_license_file_spec.rb +37 -0
- data/spec/lib/license_finder/reporter_spec.rb +4 -0
- data/spec/lib/license_finder/tables/dependency_spec.rb +102 -0
- data/spec/lib/license_finder/tables/license_alias_spec.rb +54 -0
- data/spec/lib/license_finder/text_report_spec.rb +31 -0
- data/spec/lib/license_finder/yml_to_sql_spec.rb +99 -0
- data/spec/lib/license_finder_spec.rb +82 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/support/license_examples.rb +30 -0
- metadata +435 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe LicenseFinder::License::NewBSD do
|
|
4
|
+
subject { LicenseFinder::License::NewBSD.new("") }
|
|
5
|
+
|
|
6
|
+
it_behaves_like "a license matcher"
|
|
7
|
+
|
|
8
|
+
it "should match regardless of organization or copyright holder names" do
|
|
9
|
+
license = LicenseFinder::License::NewBSD.new <<-LICENSE
|
|
10
|
+
Redistribution and use in source and binary forms, with or without
|
|
11
|
+
modification, are permitted provided that the following conditions are met:
|
|
12
|
+
* Redistributions of source code must retain the above copyright
|
|
13
|
+
notice, this list of conditions and the following disclaimer.
|
|
14
|
+
* Redistributions in binary form must reproduce the above copyright
|
|
15
|
+
notice, this list of conditions and the following disclaimer in the
|
|
16
|
+
documentation and/or other materials provided with the distribution.
|
|
17
|
+
* Neither the name of Johnny %$#!.43298432, Guitar INC! nor the
|
|
18
|
+
names of its contributors may be used to endorse or promote products
|
|
19
|
+
derived from this software without specific prior written permission.
|
|
20
|
+
|
|
21
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
22
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
23
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
24
|
+
DISCLAIMED. IN NO EVENT SHALL Johnny %$#!.43298432, Guitar BE LIABLE FOR ANY
|
|
25
|
+
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
26
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
27
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
28
|
+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
29
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
30
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
LICENSE
|
|
32
|
+
|
|
33
|
+
license.should be_matches
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe LicenseFinder::License::Ruby do
|
|
4
|
+
subject { LicenseFinder::License::Ruby.new("") }
|
|
5
|
+
|
|
6
|
+
it_behaves_like "a license matcher"
|
|
7
|
+
|
|
8
|
+
describe "#matches?" do
|
|
9
|
+
it "should return true when the Ruby license URL is present" do
|
|
10
|
+
subject.text = "This gem is available under the following license:\nhttp://www.ruby-lang.org/en/LICENSE.txt\nOkay?"
|
|
11
|
+
should be_matches
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should return false when the Ruby License URL is not present" do
|
|
15
|
+
subject.text = "This gem is available under the following license:\nhttp://www.example.com\nOkay?"
|
|
16
|
+
should_not be_matches
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
describe LicenseFiles do
|
|
5
|
+
def fixture_path(fixture)
|
|
6
|
+
Pathname.new(File.join(File.dirname(__FILE__), '..', '..', '..', 'spec', 'fixtures', fixture)).realpath.to_s
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe "#files" do
|
|
10
|
+
it "is empty if there aren't any license files" do
|
|
11
|
+
subject = described_class.new('/not/a/dir')
|
|
12
|
+
subject.files.should == []
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "includes files with names like LICENSE, License or COPYING" do
|
|
16
|
+
subject = described_class.new(fixture_path('license_names'))
|
|
17
|
+
|
|
18
|
+
subject.files.map(&:file_name).should =~
|
|
19
|
+
%w[COPYING.txt LICENSE Mit-License README.rdoc Licence.rdoc]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "includes files deep in the hierarchy" do
|
|
23
|
+
subject = described_class.new(fixture_path('nested_gem'))
|
|
24
|
+
|
|
25
|
+
subject.files.map { |f| [f.file_name, f.file_path] }.should =~ [
|
|
26
|
+
%w[LICENSE vendor/LICENSE]
|
|
27
|
+
]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "includes both files nested inside LICENSE directory and top level files" do
|
|
31
|
+
subject = described_class.new(fixture_path('license_directory'))
|
|
32
|
+
found_license_files = subject.files
|
|
33
|
+
|
|
34
|
+
found_license_files.map { |f| [f.file_name, f.file_path] }.should =~ [
|
|
35
|
+
%w[BSD-2-Clause.txt LICENSE/BSD-2-Clause.txt],
|
|
36
|
+
%w[GPL-2.0.txt LICENSE/GPL-2.0.txt],
|
|
37
|
+
%w[MIT.txt LICENSE/MIT.txt],
|
|
38
|
+
%w[RUBY.txt LICENSE/RUBY.txt],
|
|
39
|
+
%w[COPYING COPYING],
|
|
40
|
+
%w[LICENSE LICENSE/LICENSE]
|
|
41
|
+
]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "handles non UTF8 encodings" do
|
|
45
|
+
subject = described_class.new(fixture_path('utf8_gem'))
|
|
46
|
+
expect { subject.files }.not_to raise_error
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
class FooLicense < LicenseFinder::License::Base
|
|
4
|
+
self.alternative_names = ["the foo license"]
|
|
5
|
+
self.license_url = "http://foo.license.com"
|
|
6
|
+
|
|
7
|
+
def self.pretty_name
|
|
8
|
+
"Ye Ole Foo License"
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module LicenseFinder
|
|
13
|
+
describe License do
|
|
14
|
+
describe ".find_by_name" do
|
|
15
|
+
it "should match on demodulized names" do
|
|
16
|
+
License.find_by_name("FooLicense").should == FooLicense
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "should match on pretty names" do
|
|
20
|
+
License.find_by_name("Ye Ole Foo License").should == FooLicense
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "should match on alternative names" do
|
|
24
|
+
License.find_by_name("the foo license").should == FooLicense
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "should return nil if no match" do
|
|
28
|
+
License.find_by_name(:unknown).should be_nil
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
describe LicenseFinder::License::Base do
|
|
35
|
+
describe ".names" do
|
|
36
|
+
subject do
|
|
37
|
+
Class.new(LicenseFinder::License::Base) do
|
|
38
|
+
def self.demodulized_name; "FooLicense"; end
|
|
39
|
+
self.alternative_names = ["foo license"]
|
|
40
|
+
end.names
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it { should =~ ["FooLicense", "foo license"] }
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
class FooLicense < LicenseFinder::License::Base
|
|
4
|
+
self.alternative_names = ["the foo license"]
|
|
5
|
+
self.license_url = "http://foo.license.com"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
describe LicenseFinder::LicenseUrl do
|
|
9
|
+
describe ".find_by_name" do
|
|
10
|
+
subject { LicenseFinder::LicenseUrl }
|
|
11
|
+
|
|
12
|
+
specify { subject.find_by_name("FooLicense").should == "http://foo.license.com" }
|
|
13
|
+
specify { subject.find_by_name("fOolICENse").should == "http://foo.license.com" }
|
|
14
|
+
specify { subject.find_by_name("the foo license").should == "http://foo.license.com" }
|
|
15
|
+
|
|
16
|
+
specify { subject.find_by_name(nil).should be_nil }
|
|
17
|
+
specify { subject.find_by_name("").should be_nil }
|
|
18
|
+
specify { subject.find_by_name("unknown license").should be_nil }
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe LicenseFinder::PossibleLicenseFile do
|
|
4
|
+
context "file parsing" do
|
|
5
|
+
subject { LicenseFinder::PossibleLicenseFile.new('root', 'root/nested/path') }
|
|
6
|
+
|
|
7
|
+
context "ignoring text" do
|
|
8
|
+
before do
|
|
9
|
+
subject.stub(:text).and_return('file text')
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
its(:file_path) { should == 'nested/path' }
|
|
13
|
+
its(:file_name) { should == 'path' }
|
|
14
|
+
its(:text) { should == 'file text' }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
subject { LicenseFinder::PossibleLicenseFile.new('gem', 'gem/license/path') }
|
|
19
|
+
|
|
20
|
+
context "with a known license" do
|
|
21
|
+
before do
|
|
22
|
+
subject.stub(:text).and_return('a known license')
|
|
23
|
+
|
|
24
|
+
LicenseFinder::License::MIT.stub(:new).with('a known license').and_return(double('MIT license', :matches? => true))
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
its(:license) { should == "MIT" }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context "with an unknown license" do
|
|
31
|
+
before do
|
|
32
|
+
subject.stub(:text).and_return('')
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
its(:license) { should be_nil }
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
describe Dependency do
|
|
5
|
+
let(:attributes) do
|
|
6
|
+
{
|
|
7
|
+
'name' => "spec_name",
|
|
8
|
+
'version' => "2.1.3",
|
|
9
|
+
'license' => "GPLv2",
|
|
10
|
+
'approved' => false,
|
|
11
|
+
'notes' => 'some notes',
|
|
12
|
+
'homepage' => 'homepage',
|
|
13
|
+
'license_files' => ['/Users/pivotal/foo/lic1', '/Users/pivotal/bar/lic2'],
|
|
14
|
+
'bundler_groups' => ["test"]
|
|
15
|
+
}
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
let(:config) { Configuration.new }
|
|
19
|
+
|
|
20
|
+
before do
|
|
21
|
+
LicenseFinder.stub(:config).and_return config
|
|
22
|
+
config.whitelist = ["MIT", "other"]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe ".destroy_obsolete" do
|
|
26
|
+
it "destroys every dependency except for the ones provided as 'current'" do
|
|
27
|
+
cur1 = Dependency.create(name: "current dependency 1")
|
|
28
|
+
cur2 = Dependency.create(name: "current dependency 2")
|
|
29
|
+
Dependency.create(name: "old dependency 1")
|
|
30
|
+
Dependency.create(name: "old dependency 2")
|
|
31
|
+
|
|
32
|
+
Dependency.destroy_obsolete([cur1, cur2])
|
|
33
|
+
Dependency.all.should =~ [cur1, cur2]
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe '.unapproved' do
|
|
38
|
+
it "should return all unapproved dependencies" do
|
|
39
|
+
dependency = Dependency.create(name: "unapproved dependency", version: '0.0.1')
|
|
40
|
+
dependency.approval = Approval.create(state: false)
|
|
41
|
+
dependency.save
|
|
42
|
+
approved = Dependency.create(name: "approved dependency", version: '0.0.1')
|
|
43
|
+
approved.approval = Approval.create(state: true)
|
|
44
|
+
approved.save
|
|
45
|
+
whitelisted = Dependency.create(name: "approved dependency", version: '0.0.1')
|
|
46
|
+
whitelisted.license = LicenseAlias.create(name: 'MIT')
|
|
47
|
+
whitelisted.approval = Approval.create(state: false)
|
|
48
|
+
whitelisted.save
|
|
49
|
+
|
|
50
|
+
unapproved = Dependency.unapproved
|
|
51
|
+
unapproved.count.should == 1
|
|
52
|
+
unapproved.should_not be_any(&:approved?)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
describe '#approve!' do
|
|
57
|
+
it "should update the database to show the dependency is approved" do
|
|
58
|
+
dependency = Dependency.create(name: "foo", version: '0.0.1')
|
|
59
|
+
dependency.approval = Approval.create(state: false)
|
|
60
|
+
dependency.save
|
|
61
|
+
dependency.approve!
|
|
62
|
+
dependency.reload.should be_approved
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
describe "#approved?" do
|
|
67
|
+
let(:dependency) { Dependency.create(name: 'some gem') }
|
|
68
|
+
|
|
69
|
+
it "is true if its license is whitelisted" do
|
|
70
|
+
dependency.stub_chain(:license, whitelisted?: true)
|
|
71
|
+
dependency.should be_approved
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "is true if it has been approved" do
|
|
75
|
+
dependency.stub_chain(:license, whitelisted?: false)
|
|
76
|
+
dependency.stub_chain(:approval, state: true)
|
|
77
|
+
dependency.should be_approved
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "is false otherwise" do
|
|
81
|
+
dependency.stub_chain(:license, whitelisted?: false)
|
|
82
|
+
dependency.stub_chain(:approval, state: false)
|
|
83
|
+
dependency.should_not be_approved
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
describe "#set_license_manually" do
|
|
88
|
+
let(:gem) do
|
|
89
|
+
dependency = Dependency.new(name: "bob", version: '0.0.1')
|
|
90
|
+
dependency.license = LicenseAlias.create(name: 'Original')
|
|
91
|
+
dependency.save
|
|
92
|
+
dependency
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it "delegates to the license" do
|
|
96
|
+
gem.license.should_receive(:set_manually).with('Updated')
|
|
97
|
+
gem.set_license_manually('Updated')
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
describe LicenseAlias do
|
|
5
|
+
describe 'initializes' do
|
|
6
|
+
it "delegates to LicenseUrl.find_by_name for the url" do
|
|
7
|
+
LicenseUrl.stub(:find_by_name).with("MIT").and_return "http://license-url.com"
|
|
8
|
+
license = described_class.new(name: 'MIT')
|
|
9
|
+
license.url.should == "http://license-url.com"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe "#set_manually" do
|
|
14
|
+
subject do
|
|
15
|
+
described_class.create(name: 'Original')
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "modifies the license" do
|
|
19
|
+
subject.set_manually('Updated')
|
|
20
|
+
subject.reload.name.should == 'Updated'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "marks the approval as manual" do
|
|
24
|
+
subject.set_manually('Updated')
|
|
25
|
+
subject.reload.manual.should be_true
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "#whitelisted?" do
|
|
30
|
+
let(:config) { Configuration.new }
|
|
31
|
+
|
|
32
|
+
before do
|
|
33
|
+
LicenseFinder.stub(:config).and_return config
|
|
34
|
+
config.whitelist = ["MIT", "other"]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should return true when the license is whitelisted" do
|
|
38
|
+
described_class.new(name: 'MIT').should be_whitelisted
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should return true when the license is an alternative name of a whitelisted license" do
|
|
42
|
+
described_class.new(name: 'Expat').should be_whitelisted
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "should return true when the license has no matching license class, but is whitelisted anyways" do
|
|
46
|
+
described_class.new(name: 'other').should be_whitelisted
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should return false when the license is not whitelisted" do
|
|
50
|
+
described_class.new(name: 'GPL').should_not be_whitelisted
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
module LicenseFinder
|
|
4
|
+
describe TextReport do
|
|
5
|
+
describe '#to_s' do
|
|
6
|
+
let(:dep1) do
|
|
7
|
+
dependency = Dependency.new(
|
|
8
|
+
'name' => 'gem_a',
|
|
9
|
+
'version' => '1.0',
|
|
10
|
+
)
|
|
11
|
+
dependency.license = LicenseFinder::LicenseAlias.create(name: 'MIT')
|
|
12
|
+
dependency
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
let(:dep2) do
|
|
16
|
+
dependency = Dependency.new(
|
|
17
|
+
'name' => 'gem_b',
|
|
18
|
+
'version' => '1.0',
|
|
19
|
+
)
|
|
20
|
+
dependency.license = LicenseFinder::LicenseAlias.create(name: 'MIT')
|
|
21
|
+
dependency
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
subject { TextReport.new([dep2, dep1]).to_s }
|
|
25
|
+
|
|
26
|
+
it 'should generate a text report with the name, version, and license of each dependency, sorted by name' do
|
|
27
|
+
should == "gem_a, 1.0, MIT\ngem_b, 1.0, MIT"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe LicenseFinder::YmlToSql do
|
|
4
|
+
let(:legacy_attributes) do
|
|
5
|
+
{
|
|
6
|
+
'name' => "spec_name",
|
|
7
|
+
'version' => "2.1.3",
|
|
8
|
+
'license' => "GPLv2",
|
|
9
|
+
'license_url' => "www.license_url.org",
|
|
10
|
+
'approved' => true,
|
|
11
|
+
'manual' => true,
|
|
12
|
+
'summary' => "some summary",
|
|
13
|
+
'description' => "some description",
|
|
14
|
+
'homepage' => 'www.homepage.com',
|
|
15
|
+
'children' => ["child1_name"],
|
|
16
|
+
'parents' => ["parent1_name"],
|
|
17
|
+
'bundler_groups' => [:test],
|
|
18
|
+
|
|
19
|
+
'notes' => 'some notes',
|
|
20
|
+
'license_files' => ['/Users/pivotal/foo/lic1', '/Users/pivotal/bar/lic2'],
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
let(:config) { LicenseFinder::Configuration.new }
|
|
24
|
+
|
|
25
|
+
before do
|
|
26
|
+
LicenseFinder.stub(:config) { config }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe ".needs_conversion?" do
|
|
30
|
+
it "is true if the yml still exists" do
|
|
31
|
+
config.stub(dependencies_dir: 'path/to')
|
|
32
|
+
File.should_receive(:exists?).with('path/to/dependencies.yml') { true }
|
|
33
|
+
described_class.needs_conversion?.should be_true
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "is false otherwise" do
|
|
37
|
+
config.stub(dependencies_dir: 'path/to')
|
|
38
|
+
File.should_receive(:exists?).with('path/to/dependencies.yml') { false }
|
|
39
|
+
described_class.needs_conversion?.should be_false
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe ".remove_yml" do
|
|
44
|
+
it "removes the yml file" do
|
|
45
|
+
config.stub(dependencies_dir: 'path/to')
|
|
46
|
+
File.should_receive(:delete).with('path/to/dependencies.yml')
|
|
47
|
+
described_class.remove_yml
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
describe '.convert_all' do
|
|
52
|
+
before do
|
|
53
|
+
(DB.tables - [:schema_migrations]).each { |table| DB[table].truncate }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "persists all of the dependency's attributes" do
|
|
57
|
+
described_class.convert_all([legacy_attributes])
|
|
58
|
+
|
|
59
|
+
described_class::Sql::Dependency.count.should == 1
|
|
60
|
+
saved_dep = described_class::Sql::Dependency.first
|
|
61
|
+
saved_dep.name.should == "spec_name"
|
|
62
|
+
saved_dep.version.should == "2.1.3"
|
|
63
|
+
saved_dep.summary.should == "some summary"
|
|
64
|
+
saved_dep.description.should == "some description"
|
|
65
|
+
saved_dep.homepage.should == "www.homepage.com"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "associates the license to the dependency" do
|
|
69
|
+
described_class.convert_all([legacy_attributes])
|
|
70
|
+
|
|
71
|
+
saved_dep = described_class::Sql::Dependency.first
|
|
72
|
+
saved_dep.license.name.should == "GPLv2"
|
|
73
|
+
saved_dep.license.url.should == "www.license_url.org"
|
|
74
|
+
saved_dep.license.manual.should == true
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "associates bundler groups" do
|
|
78
|
+
described_class.convert_all([legacy_attributes])
|
|
79
|
+
|
|
80
|
+
saved_dep = described_class::Sql::Dependency.first
|
|
81
|
+
saved_dep.bundler_groups.count.should == 1
|
|
82
|
+
saved_dep.bundler_groups.first.name.should == 'test'
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it "associates children" do
|
|
86
|
+
child_attrs = {
|
|
87
|
+
'name' => 'child1_name',
|
|
88
|
+
'version' => '0.0.1',
|
|
89
|
+
'license' => 'other'
|
|
90
|
+
}
|
|
91
|
+
described_class.convert_all([legacy_attributes, child_attrs])
|
|
92
|
+
|
|
93
|
+
described_class::Sql::Dependency.count.should == 2
|
|
94
|
+
saved_dep = described_class::Sql::Dependency.first(name: 'spec_name')
|
|
95
|
+
saved_dep.children.count.should == 1
|
|
96
|
+
saved_dep.children.first.name.should == 'child1_name'
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|