license_finder 0.9.0-java → 0.9.1-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.
Files changed (50) hide show
  1. data/.travis.yml +0 -1
  2. data/CHANGELOG.rdoc +27 -3
  3. data/db/migrate/201307250917_add_license_manual_to_dependencies.rb +7 -0
  4. data/db/migrate/201307251004_data_fix_manual_licenses.rb +15 -0
  5. data/db/migrate/201307251107_reassociate_license.rb +23 -0
  6. data/db/migrate/201307251340_remove_manual_from_license_aliases.rb +7 -0
  7. data/features/cli.feature +1 -1
  8. data/features/html_report.feature +3 -2
  9. data/features/project_name.feature +10 -0
  10. data/features/set_license.feature +1 -0
  11. data/features/step_definitions/cli_steps.rb +3 -3
  12. data/features/step_definitions/project_name_steps.rb +3 -0
  13. data/features/step_definitions/set_license_steps.rb +9 -4
  14. data/features/step_definitions/shared_steps.rb +11 -2
  15. data/features/step_definitions/text_report_steps.rb +12 -2
  16. data/features/text_report.feature +7 -1
  17. data/files/dependency_breakdown.png +0 -0
  18. data/files/license_finder.yml +1 -0
  19. data/files/report_breakdown.png +0 -0
  20. data/lib/license_finder.rb +0 -5
  21. data/lib/license_finder/bundle.rb +22 -4
  22. data/lib/license_finder/bundled_gem.rb +17 -10
  23. data/lib/license_finder/bundled_gem_saver.rb +42 -30
  24. data/lib/license_finder/cli.rb +37 -5
  25. data/lib/license_finder/configuration.rb +13 -2
  26. data/lib/license_finder/dependency_manager.rb +21 -8
  27. data/lib/license_finder/reports/dependency_report.rb +1 -1
  28. data/lib/license_finder/reports/reporter.rb +4 -0
  29. data/lib/license_finder/tables/dependency.rb +9 -1
  30. data/lib/license_finder/tables/license_alias.rb +0 -4
  31. data/lib/license_finder/yml_to_sql.rb +1 -11
  32. data/lib/templates/html_report.erb +13 -3
  33. data/license_finder.gemspec +3 -4
  34. data/readme.md +25 -3
  35. data/release/gem_version.rb +3 -0
  36. data/{release.md → release/manual_instructions.md} +6 -0
  37. data/release/publish.sh +29 -0
  38. data/spec/lib/license_finder/bundle_spec.rb +16 -4
  39. data/spec/lib/license_finder/bundled_gem_saver_spec.rb +41 -38
  40. data/spec/lib/license_finder/bundled_gem_spec.rb +22 -4
  41. data/spec/lib/license_finder/cli_spec.rb +22 -0
  42. data/spec/lib/license_finder/configuration_spec.rb +34 -14
  43. data/spec/lib/license_finder/dependency_manager_spec.rb +61 -10
  44. data/spec/lib/license_finder/reporter_spec.rb +35 -1
  45. data/spec/lib/license_finder/tables/dependency_spec.rb +23 -0
  46. data/spec/lib/license_finder/tables/license_alias_spec.rb +0 -16
  47. data/spec/lib/license_finder/yml_to_sql_spec.rb +11 -3
  48. data/spec/lib/license_finder_spec.rb +2 -2
  49. data/spec/spec_helper.rb +3 -13
  50. metadata +64 -69
@@ -5,7 +5,7 @@ module LicenseFinder
5
5
  let(:definition) do
6
6
  double('definition', {
7
7
  :dependencies => [],
8
- :groups => [],
8
+ :groups => [:dev, :production],
9
9
  :specs_for => [
10
10
  build_gemspec('gem1', '1.2.3'),
11
11
  build_gemspec('gem2', '0.4.2')
@@ -28,7 +28,13 @@ module LicenseFinder
28
28
 
29
29
  describe '.current_gems' do
30
30
  subject do
31
- Bundle.current_gems(definition)
31
+ Bundle.current_gems(config)
32
+ end
33
+
34
+ let(:config) { double(:config, ignore_groups: ['dev', 'test']) }
35
+
36
+ before do
37
+ Bundler::Definition.stub(:build).and_return(definition)
32
38
  end
33
39
 
34
40
  it "should have 2 dependencies" do
@@ -37,9 +43,9 @@ module LicenseFinder
37
43
 
38
44
  context "when initialized with a parent and child gem" do
39
45
  before do
40
- definition.stub(:specs_for).and_return([
46
+ definition.stub(:specs_for).with([:production]).and_return([
41
47
  build_gemspec('gem1', '1.2.3', 'gem2'),
42
- build_gemspec('gem2', '0.4.2')
48
+ build_gemspec('gem2', '0.4.2', 'gem3')
43
49
  ])
44
50
  end
45
51
 
@@ -48,6 +54,12 @@ module LicenseFinder
48
54
 
49
55
  gem1.children.should == ["gem2"]
50
56
  end
57
+
58
+ it "should only include the children which are project dependencies" do
59
+ gem2 = subject[1]
60
+
61
+ gem2.children.should == []
62
+ end
51
63
  end
52
64
  end
53
65
  end
@@ -14,9 +14,22 @@ module LicenseFinder
14
14
  end
15
15
  end
16
16
 
17
+ describe ".save_gems" do
18
+ let(:bundled_gems) { [gem] }
19
+ let(:gem) { double(:bundled_gem) }
20
+
21
+ it "calls find_or_create_by_name on all passed in gems" do
22
+ described_class.should_receive(:find_or_create_by_name).with(gem).and_return(gem)
23
+ gem.should_receive(:save)
24
+ described_class.save_gems(bundled_gems)
25
+ end
26
+ end
27
+
17
28
  describe "#save" do
18
29
  let(:bundled_gem) { BundledGem.new(gemspec) }
19
- subject { described_class.find_or_create_by_name('spec_name', bundled_gem).save }
30
+ subject { described_class.find_or_create_by_name(bundled_gem).save }
31
+
32
+ before { bundled_gem.children = ["foo"] }
20
33
 
21
34
  context "when the dependency is new" do
22
35
  it "persists gem data" do
@@ -29,20 +42,9 @@ module LicenseFinder
29
42
  end
30
43
 
31
44
  describe "associating children" do
32
- context "when the child is in Bundler's current gems" do
33
- before { LicenseFinder.stub(:current_gems).and_return([double(:gemspec, name: "foo 0.0")]) }
34
-
35
- it "associates children" do
36
- subject.children.map(&:name).should == ['foo']
37
- subject.children.each { |child| child.id.should_not be_nil }
38
- end
39
- end
40
-
41
- context "when the child is not in Bundler's current gems" do
42
- it "does not associates children" do
43
- subject.children.map(&:name).should == []
44
- subject.children.each { |child| child.id.should be_nil }
45
- end
45
+ it "associates children" do
46
+ subject.children.map(&:name).should == ['foo']
47
+ subject.children.each { |child| child.id.should_not be_nil }
46
48
  end
47
49
  end
48
50
 
@@ -76,7 +78,7 @@ module LicenseFinder
76
78
  license: license
77
79
  )
78
80
  end
79
- let(:bundled_gem_saver) { described_class.find_or_create_by_name('spec_name', bundled_gem) }
81
+ let(:bundled_gem_saver) { described_class.find_or_create_by_name(bundled_gem) }
80
82
 
81
83
  it "does not save the dependency" do
82
84
  bundled_gem_saver.dependency.should_not_receive(:save)
@@ -107,7 +109,8 @@ module LicenseFinder
107
109
  end
108
110
 
109
111
  it "keeps a manually assigned license" do
110
- old_copy.license = LicenseAlias.create(name: 'foo', manual: true)
112
+ old_copy.license = LicenseAlias.create(name: 'foo')
113
+ old_copy.license_manual = true
111
114
  old_copy.save
112
115
  subject.license.name.should == 'foo'
113
116
  end
@@ -115,7 +118,12 @@ module LicenseFinder
115
118
  it "keeps approval" do
116
119
  old_copy.approval = Approval.create(state: true)
117
120
  old_copy.save
118
- subject.approval.state.should == true
121
+ subject.approval.state.should
122
+ if LicenseFinder::Platform.java?
123
+ subject.approval.state.should == 1
124
+ else
125
+ subject.approval.state.should == true
126
+ end
119
127
  end
120
128
 
121
129
  it "ensures correct children are associated" do
@@ -126,19 +134,20 @@ module LicenseFinder
126
134
  end
127
135
 
128
136
  context "with a bundler dependency" do
129
- let(:bundled_gem) { BundledGem.new(gemspec, double(:bundler_dependency, groups: %w[1 2 3]))}
137
+ let(:bundled_gem) { BundledGem.new(gemspec, double(:bundler_dependency)) }
130
138
 
131
139
  before do
140
+ bundled_gem.stub(:groups) { [:group_1, :group_2, :b] }
132
141
  old_copy.add_bundler_group BundlerGroup.find_or_create(name: 'a')
133
142
  old_copy.add_bundler_group BundlerGroup.find_or_create(name: 'b')
134
143
  end
135
144
 
136
145
  it "ensures the correct bundler groups are associated" do
137
- subject.bundler_groups.map(&:name).should =~ %w[1 2 3]
146
+ subject.bundler_groups.map(&:name).should =~ %w[group_1 group_2 b]
138
147
  end
139
148
  end
140
149
 
141
- context "license changes to something other than 'other'" do
150
+ context "license has changed" do
142
151
  before do
143
152
  old_copy.license = LicenseAlias.create(name: 'other')
144
153
  old_copy.save
@@ -158,27 +167,17 @@ module LicenseFinder
158
167
  subject.should_not be_approved
159
168
  end
160
169
  end
161
- end
162
170
 
163
- context "license changes to unknown (i.e., 'other')" do
164
- before do
165
- old_copy.license = LicenseAlias.create(name: 'MIT')
166
- old_copy.approval = Approval.create(state: false)
167
- old_copy.save
168
- gemspec.license = "other"
169
- end
170
-
171
- it "should not change the license" do
172
- subject.license.name.should == 'MIT'
173
- end
174
-
175
- it "should not change the approval" do
176
- subject.should_not be_approved
171
+ context "license already exists" do
172
+ it "uses the existing license" do
173
+ new_license = LicenseAlias.create(name: 'new license')
174
+ subject.license.should == new_license
175
+ end
177
176
  end
178
177
  end
179
178
 
180
179
  context "license does not change" do
181
- let(:bundled_gem_saver) { described_class.find_or_create_by_name('spec_name', bundled_gem) }
180
+ let(:bundled_gem_saver) { described_class.find_or_create_by_name(bundled_gem) }
182
181
 
183
182
  before do
184
183
  old_copy.license = LicenseAlias.create(name: 'MIT')
@@ -189,7 +188,11 @@ module LicenseFinder
189
188
 
190
189
  it "should not change the license or approval" do
191
190
  dependency = bundled_gem_saver.save
192
- dependency.should_not be_approved
191
+ if LicenseFinder::Platform.java?
192
+ dependency.approved?.should_not == 1
193
+ else
194
+ dependency.should_not be_approved
195
+ end
193
196
  dependency.license.name.should == "MIT"
194
197
  end
195
198
 
@@ -24,7 +24,7 @@ module LicenseFinder
24
24
  its(:dependency_name) { should == 'spec_name' }
25
25
  its(:dependency_version) { should == '2.1.3' }
26
26
 
27
- describe "#determine_license" do
27
+ describe "#license" do
28
28
  subject do
29
29
  details = BundledGem.new(gemspec)
30
30
  details.stub(:license_files).and_return([license_file])
@@ -36,19 +36,19 @@ module LicenseFinder
36
36
  it "returns the license from the gemspec if provided" do
37
37
  gemspec.stub(:license).and_return('Some License')
38
38
 
39
- subject.determine_license.should == "Some License"
39
+ subject.license.should == "Some License"
40
40
  end
41
41
 
42
42
  it "returns the matched license if detected" do
43
43
  license_file.stub(:license).and_return('Detected License')
44
44
 
45
- subject.determine_license.should == "Detected License"
45
+ subject.license.should == "Detected License"
46
46
  end
47
47
 
48
48
  it "returns 'other' otherwise" do
49
49
  license_file.stub(:license).and_return(nil)
50
50
 
51
- subject.determine_license.should == "other"
51
+ subject.license.should == "other"
52
52
  end
53
53
  end
54
54
 
@@ -58,5 +58,23 @@ module LicenseFinder
58
58
  subject.license_files
59
59
  end
60
60
  end
61
+
62
+ describe "#groups" do
63
+ context "bundler_dependency is present" do
64
+ subject { described_class.new(gemspec, bundler_dependency) }
65
+
66
+ let(:bundler_dependency) { double(:dependency, groups: [1, 2, 3]) }
67
+
68
+ it "returns bundler dependency's groups" do
69
+ subject.groups.should == bundler_dependency.groups
70
+ end
71
+ end
72
+
73
+ context "bundler_dependency is nil" do
74
+ it "returns empty array" do
75
+ subject.groups.should == []
76
+ end
77
+ end
78
+ end
61
79
  end
62
80
  end
@@ -57,6 +57,7 @@ module LicenseFinder
57
57
  it "adds the specified license to the whitelist" do
58
58
  config.whitelist.should_receive(:push).with("test")
59
59
  config.should_receive(:save)
60
+ Reporter.should_receive(:write_reports)
60
61
 
61
62
  silence_stdout do
62
63
  subject.add("test")
@@ -68,6 +69,7 @@ module LicenseFinder
68
69
  it "removes the specified license from the whitelist" do
69
70
  config.should_receive(:save)
70
71
  config.whitelist.should_receive(:delete).with("test")
72
+ Reporter.should_receive(:write_reports)
71
73
 
72
74
  silence_stdout do
73
75
  subject.remove("test")
@@ -76,6 +78,24 @@ module LicenseFinder
76
78
  end
77
79
  end
78
80
 
81
+ describe ProjectName do
82
+ let(:config) { LicenseFinder.config }
83
+
84
+ describe "set" do
85
+ it "sets the project name" do
86
+ config.should_receive(:save)
87
+ config.project_name.should_not eq("new_project_name")
88
+ Reporter.should_receive(:write_reports)
89
+
90
+ silence_stdout do
91
+ subject.set("new_project_name")
92
+ end
93
+
94
+ config.project_name.should eq("new_project_name")
95
+ end
96
+ end
97
+ end
98
+
79
99
  describe IgnoredBundlerGroups do
80
100
  let(:config) { LicenseFinder.config }
81
101
 
@@ -93,6 +113,7 @@ module LicenseFinder
93
113
  it "adds the specified group to the ignored groups list" do
94
114
  config.ignore_groups.should_receive(:push).with("test")
95
115
  config.should_receive(:save)
116
+ Reporter.should_receive(:write_reports)
96
117
 
97
118
  silence_stdout do
98
119
  subject.add("test")
@@ -104,6 +125,7 @@ module LicenseFinder
104
125
  it "removes the specified group from the ignored groups list" do
105
126
  config.ignore_groups.should_receive(:delete).with("test")
106
127
  config.should_receive(:save)
128
+ Reporter.should_receive(:write_reports)
107
129
 
108
130
  silence_stdout do
109
131
  subject.remove("test")
@@ -11,7 +11,8 @@ module LicenseFinder
11
11
  {
12
12
  "whitelist" => ["FooLicense", "BarLicense"],
13
13
  "ignore_groups" => [:test, :development],
14
- "dependencies_file_dir" => "."
14
+ "dependencies_file_dir" => ".",
15
+ "project_name" => "my_app"
15
16
  }
16
17
  end
17
18
 
@@ -22,6 +23,7 @@ module LicenseFinder
22
23
  subject.whitelist.should == attributes['whitelist']
23
24
  subject.ignore_groups.should == attributes['ignore_groups']
24
25
  subject.dependencies_dir.should == attributes['dependencies_file_dir']
26
+ subject.project_name.should == attributes['project_name']
25
27
  end
26
28
  end
27
29
  end
@@ -39,6 +41,19 @@ module LicenseFinder
39
41
  end
40
42
  end
41
43
 
44
+ describe "#project_name" do
45
+ let(:directory_name) { "test_dir" }
46
+
47
+ before do
48
+ Configuration.stub(:config_hash).and_return({})
49
+ Dir.stub(:getwd).and_return("/path/to/#{directory_name}")
50
+ end
51
+
52
+ it "should default to the directory name" do
53
+ klass.new.project_name.should == directory_name
54
+ end
55
+ end
56
+
42
57
  describe "whitelisted?" do
43
58
  context "canonical name whitelisted" do
44
59
  before { config.whitelist = [License::Apache2.names[rand(License::Apache2.names.count)]]}
@@ -61,32 +76,39 @@ module LicenseFinder
61
76
 
62
77
  describe "#save" do
63
78
  let(:tmp_yml) { '.tmp.configuration_spec.yml' }
79
+ let(:yaml) { YAML.load(File.read(tmp_yml)) }
64
80
 
65
81
  before do
66
82
  Configuration.stub(:config_file_path).and_return(tmp_yml)
67
83
  config.whitelist = ['my_gem']
68
84
  config.ignore_groups = ['other_group', 'test']
85
+ config.project_name = "New Project Name"
86
+ config.dependencies_dir = "./deps"
69
87
  end
70
88
 
71
89
  after do
72
90
  File.delete(tmp_yml)
73
91
  end
74
92
 
75
- it "writes the whitelist to the yaml file" do
76
- config.save
77
-
78
- yaml = YAML.load(File.read(tmp_yml))
93
+ describe "writes the configuration attributes to the yaml file" do
94
+ before { config.save }
79
95
 
80
- yaml["whitelist"].should include("my_gem")
81
- end
96
+ it "writes the whitelist" do
97
+ yaml["whitelist"].should include("my_gem")
98
+ end
82
99
 
83
- it "writes the ignored bundler groups to the yaml file" do
84
- config.save
100
+ it "writes the ignored bundler groups" do
101
+ yaml["ignore_groups"].should include("other_group")
102
+ yaml["ignore_groups"].should include("test")
103
+ end
85
104
 
86
- yaml = YAML.load(File.read(tmp_yml))
105
+ it "writes the dependencies_dir" do
106
+ yaml["dependencies_file_dir"].should eq("./deps")
107
+ end
87
108
 
88
- yaml["ignore_groups"].should include("other_group")
89
- yaml["ignore_groups"].should include("test")
109
+ it "writes the project name" do
110
+ yaml["project_name"].should eq("New Project Name")
111
+ end
90
112
  end
91
113
 
92
114
  it "doesn't write duplicate entries" do
@@ -95,8 +117,6 @@ module LicenseFinder
95
117
 
96
118
  config.save
97
119
 
98
- yaml = YAML.load(File.read(tmp_yml))
99
-
100
120
  yaml["whitelist"].count("my_gem").should == 1
101
121
  yaml["ignore_groups"].count("test").should == 1
102
122
  end
@@ -1,4 +1,5 @@
1
1
  require 'spec_helper'
2
+ require 'digest'
2
3
 
3
4
  module LicenseFinder
4
5
  describe DependencyManager do
@@ -11,6 +12,9 @@ module LicenseFinder
11
12
  end
12
13
 
13
14
  describe "#sync_with_bundler" do
15
+ let(:gem1) { double(:bundled_gem) }
16
+ let(:gem2) { double(:bundled_gem) }
17
+
14
18
  it "destroys every dependency except for the ones Bundler reports as 'current' or are marked as 'manual'" do
15
19
  cur1 = Dependency.create(name: "current dependency 1")
16
20
  cur2 = Dependency.create(name: "current dependency 2")
@@ -18,11 +22,9 @@ module LicenseFinder
18
22
  Dependency.create(name: "old dependency 1")
19
23
  Dependency.create(name: "old dependency 2")
20
24
 
21
- current_gems = [
22
- double(:gem1, save_as_dependency: cur1),
23
- double(:gem2, save_as_dependency: cur2)
24
- ]
25
- LicenseFinder.stub(:current_gems) { current_gems }
25
+ current_gems = [gem1, gem2]
26
+ Bundle.stub(:current_gems).with(config) { current_gems }
27
+ BundledGemSaver.should_receive(:save_gems).with(current_gems).and_return([cur1, cur2])
26
28
 
27
29
  described_class.sync_with_bundler
28
30
  Dependency.all.map(&:name).should =~ [cur1, cur2, man1].map(&:name)
@@ -89,11 +91,12 @@ module LicenseFinder
89
91
  end
90
92
 
91
93
  describe ".license!" do
94
+ let(:dependency) { double(:dependency) }
95
+
92
96
  it "adds a license for the dependency" do
93
- dep = described_class.create_non_bundler("old license", "current dependency", nil)
94
- dep.reload.license.name.should == "old license"
95
- described_class.license!("current dependency", "a license")
96
- dep.reload.license.name.should == "a license"
97
+ DependencyManager.stub(:find_by_name).with("dependency").and_return(dependency)
98
+ dependency.should_receive(:set_license_manually!).with("MIT")
99
+ described_class.license!("dependency", "MIT")
97
100
  end
98
101
 
99
102
  it "should raise an error if it can't find the dependency" do
@@ -102,6 +105,54 @@ module LicenseFinder
102
105
  end
103
106
  end
104
107
 
108
+ describe ".modifying" do
109
+ context "when the database doesn't exist" do
110
+ before { File.stub(:exists?) { false } }
111
+
112
+ it "writes reports" do
113
+ Reporter.should_receive(:write_reports)
114
+ DependencyManager.modifying {}
115
+ end
116
+ end
117
+
118
+ context "when the database exists" do
119
+ before { File.stub(:exists?) { true } }
120
+
121
+ context "when the database has changed" do
122
+ before do
123
+ i = 0
124
+ Digest::SHA2.stub_chain(:file, :hexdigest) { i += 1 }
125
+ end
126
+
127
+ it "writes reports" do
128
+ Reporter.should_receive(:write_reports)
129
+ DependencyManager.modifying {}
130
+ end
131
+ end
132
+
133
+ context "when the database has not changed" do
134
+ before do
135
+ Digest::SHA2.stub_chain(:file, :hexdigest) { 5 }
136
+ end
137
+
138
+ it "does not write reports" do
139
+ Reporter.should_not_receive(:write_reports)
140
+ DependencyManager.modifying {}
141
+ end
142
+ end
143
+
144
+ context "when the reports do not exist" do
145
+ before do
146
+ Digest::SHA2.stub_chain(:file, :hexdigest) { 5 }
147
+ File.stub(:exists?).with(LicenseFinder.config.dependencies_html) { false }
148
+ end
149
+
150
+ it "writes reports" do
151
+ Reporter.should_receive(:write_reports)
152
+ DependencyManager.modifying {}
153
+ end
154
+ end
155
+ end
156
+ end
105
157
  end
106
158
  end
107
-