license_finder 0.6.0 → 0.7.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.
Files changed (51) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +0 -1
  3. data/bin/license_finder +21 -1
  4. data/features/approve_dependencies.feature +10 -0
  5. data/features/license_finder.feature +13 -3
  6. data/features/license_finder_rake_task.feature +3 -3
  7. data/features/set_license.feature +14 -0
  8. data/features/step_definitions/steps.rb +5 -0
  9. data/lib/license_finder.rb +13 -2
  10. data/lib/license_finder/bundle.rb +25 -3
  11. data/lib/license_finder/bundle_syncer.rb +12 -0
  12. data/lib/license_finder/bundled_gem.rb +12 -1
  13. data/lib/license_finder/cli.rb +42 -3
  14. data/lib/license_finder/configuration.rb +1 -31
  15. data/lib/license_finder/dependency.rb +30 -94
  16. data/lib/license_finder/dependency_report.rb +30 -0
  17. data/lib/license_finder/html_report.rb +14 -0
  18. data/lib/license_finder/persistence.rb +1 -0
  19. data/lib/license_finder/persistence/yaml.rb +7 -0
  20. data/lib/license_finder/persistence/yaml/configuration.rb +34 -0
  21. data/lib/license_finder/persistence/yaml/dependency.rb +127 -0
  22. data/lib/license_finder/reporter.rb +7 -38
  23. data/lib/license_finder/source_syncer.rb +40 -0
  24. data/lib/license_finder/text_report.rb +9 -0
  25. data/lib/templates/dependency.html.erb +2 -2
  26. data/lib/templates/html_report.erb +93 -0
  27. data/lib/templates/text_report.erb +2 -0
  28. data/license_finder.gemspec +2 -2
  29. data/{README.markdown → readme.md} +22 -11
  30. data/spec/lib/license_finder/bundle_spec.rb +58 -0
  31. data/spec/lib/license_finder/bundle_syncer_spec.rb +22 -0
  32. data/spec/lib/license_finder/bundled_gem_spec.rb +17 -14
  33. data/spec/lib/license_finder/cli_spec.rb +38 -0
  34. data/spec/lib/license_finder/dependency_spec.rb +130 -223
  35. data/spec/lib/license_finder/html_report_spec.rb +67 -0
  36. data/spec/lib/license_finder/persistence/yaml/configuration_spec.rb +5 -0
  37. data/spec/lib/license_finder/persistence/yaml/dependency_spec.rb +5 -0
  38. data/spec/lib/license_finder/possible_license_file_spec.rb +4 -9
  39. data/spec/lib/license_finder/reporter_spec.rb +0 -1
  40. data/spec/lib/license_finder/source_syncer_spec.rb +37 -0
  41. data/spec/lib/license_finder/text_report_spec.rb +29 -0
  42. data/spec/lib/license_finder_spec.rb +9 -11
  43. data/spec/spec_helper.rb +1 -1
  44. data/spec/support/license_examples.rb +1 -1
  45. data/spec/support/shared_examples/persistence/configuration.rb +34 -0
  46. data/spec/support/shared_examples/persistence/dependency.rb +139 -0
  47. metadata +38 -26
  48. data/lib/license_finder/dependency_list.rb +0 -80
  49. data/lib/license_finder/viewable.rb +0 -31
  50. data/lib/templates/dependency_list.html.erb +0 -38
  51. data/spec/lib/license_finder/dependency_list_spec.rb +0 -243
@@ -1,80 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module LicenseFinder
4
- class DependencyList
5
- include Viewable
6
-
7
- attr_reader :dependencies
8
-
9
- def self.from_bundler
10
- dep_list = new(Bundle.new.gems.map(&:to_dependency))
11
- setup_parents_of_dependencies(dep_list)
12
- dep_list
13
- end
14
-
15
- def self.setup_parents_of_dependencies(dep_list)
16
- dependency_index = {}
17
- dep_list.dependencies.each do |dep|
18
- dependency_index[dep.name] = dep
19
- end
20
-
21
- dep_list.dependencies.each do |dep|
22
- dep.children.each do |child_dep|
23
- license_finder_dependency = dependency_index[child_dep.name]
24
- license_finder_dependency.parents << dep if license_finder_dependency
25
- end
26
- end
27
- end
28
-
29
- def self.from_yaml(yaml)
30
- deps = YAML.load(yaml)
31
- new(deps.map { |attrs| Dependency.from_hash(attrs) })
32
- end
33
-
34
- def initialize(dependencies)
35
- @dependencies = dependencies
36
- end
37
-
38
- def merge(new_list)
39
- deps = new_list.dependencies.map do |new_dep|
40
- old_dep = dependencies.detect { |d| d.name == new_dep.name }
41
-
42
- if old_dep
43
- old_dep.merge(new_dep)
44
- else
45
- new_dep
46
- end
47
- end
48
-
49
- deps += dependencies.select { |d| d.source != "bundle" }
50
-
51
- self.class.new(deps)
52
- end
53
-
54
- def as_yaml
55
- sorted_dependencies.map(&:as_yaml)
56
- end
57
-
58
- def to_s
59
- sorted_dependencies.map(&:to_s).join("\n")
60
- end
61
-
62
- def action_items
63
- sorted_dependencies.reject(&:approved).map(&:to_s).join "\n"
64
- end
65
-
66
- private
67
-
68
- def unapproved_dependencies
69
- dependencies.reject(&:approved)
70
- end
71
-
72
- def sorted_dependencies
73
- dependencies.sort_by(&:name)
74
- end
75
-
76
- def grouped_dependencies
77
- dependencies.group_by(&:license).sort_by { |_, group| group.size }.reverse
78
- end
79
- end
80
- end
@@ -1,31 +0,0 @@
1
- module LicenseFinder
2
- module Viewable
3
- def self.included(base)
4
- base.class_eval do
5
- extend ClassMethods
6
- end
7
- end
8
-
9
- module ClassMethods
10
- def underscored_name
11
- @underscored_name ||= begin
12
- str = name.dup
13
- str.sub!(/.*::/, '')
14
- str.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
15
- str.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
16
- str.downcase!
17
- end
18
- end
19
- end
20
-
21
- def to_yaml
22
- as_yaml.to_yaml
23
- end
24
-
25
- def to_html
26
- filename = File.join(File.dirname(__FILE__), '..', 'templates', "#{self.class.underscored_name}.html.erb")
27
- template = ERB.new(File.read(filename))
28
- template.result(binding)
29
- end
30
- end
31
- end
@@ -1,38 +0,0 @@
1
- <html>
2
- <head>
3
- <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.1.1/css/bootstrap.min.css" rel="stylesheet">
4
- <style type="text/css">
5
- body {
6
- margin: 50px;
7
- }
8
-
9
- .unapproved h2, .unapproved h2 a {
10
- color: red;
11
- }
12
- </style>
13
- </head>
14
- <body>
15
- <div class="container">
16
- <div class="summary hero-unit">
17
- <h1>Dependencies</h1>
18
-
19
- <h4>
20
- <%= dependencies.size %> total
21
-
22
- <% if unapproved_dependencies.any? %>
23
- <span class="badge badge-important"><%= unapproved_dependencies.size %> unapproved</span>
24
- <% end %>
25
- </h4>
26
-
27
- <ul>
28
- <% grouped_dependencies.each do |license, group| %>
29
- <li><%= group.size %> <%= license %></li>
30
- <% end %>
31
- </ul>
32
- </div>
33
- <div class="dependencies">
34
- <%= sorted_dependencies.map(&:to_html).join("\n") %>
35
- </div>
36
- </div>
37
- </body>
38
- </html>
@@ -1,243 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe LicenseFinder::DependencyList do
4
- def build_gemspec(name, version, dependency=nil)
5
- Gem::Specification.new do |s|
6
- s.name = name
7
- s.version = version
8
- s.summary = 'summary'
9
- s.description = 'description'
10
-
11
- if dependency
12
- s.add_dependency dependency
13
- end
14
- end
15
- end
16
-
17
- before do
18
- config = stub(LicenseFinder).config.stub!
19
- config.whitelist { [] }
20
- config.ignore_groups { [] }
21
- end
22
-
23
- describe '.from_bundler' do
24
- subject do
25
- bundle = stub(Bundler::Definition).build.stub!
26
- bundle.dependencies { [] }
27
- bundle.groups { [] }
28
- bundle.specs_for { [build_gemspec('gem1', '1.2.3'), build_gemspec('gem2', '0.4.2')] }
29
-
30
- LicenseFinder::DependencyList.from_bundler
31
- end
32
-
33
- it "should have 2 dependencies" do
34
- subject.dependencies.size.should == 2
35
- end
36
-
37
- it 'should maintain the incoming order' do
38
- subject.dependencies[0].name.should == 'gem1'
39
- subject.dependencies[0].version.should == '1.2.3'
40
-
41
- subject.dependencies[1].name.should == 'gem2'
42
- subject.dependencies[1].version.should == '0.4.2'
43
- end
44
-
45
- context "when initialized with a parent and child gem" do
46
- subject do
47
- bundle = stub(Bundler::Definition).build.stub!
48
- bundle.dependencies { [] }
49
- bundle.groups { [] }
50
- bundle.specs_for { [build_gemspec('gem1', '1.2.3', 'gem2'), build_gemspec('gem2', '0.4.2')] }
51
-
52
- LicenseFinder::DependencyList.from_bundler
53
- end
54
-
55
- it "should update the child dependency with its parent data" do
56
- gem1 = subject.dependencies.first
57
- gem2 = subject.dependencies.last
58
-
59
- gem2.parents.should == [gem1]
60
- end
61
- end
62
- end
63
-
64
- describe '#from_yaml' do
65
- subject do
66
- LicenseFinder::DependencyList.from_yaml([
67
- {'name' => 'gem1', 'version' => '1.2.3', 'license' => 'MIT', 'approved' => false},
68
- {'name' => 'gem2', 'version' => '0.4.2', 'license' => 'MIT', 'approved' => false}
69
- ].to_yaml)
70
- end
71
-
72
- it 'should have 2 dependencies' do
73
- subject.dependencies.size.should == 2
74
- end
75
-
76
- it 'should maintain the incoming order' do
77
- subject.dependencies[0].name.should == 'gem1'
78
- subject.dependencies[0].version.should == '1.2.3'
79
-
80
- subject.dependencies[1].name.should == 'gem2'
81
- subject.dependencies[1].version.should == '0.4.2'
82
- end
83
- end
84
-
85
- describe '#as_yaml' do
86
- it "should generate yaml" do
87
- list = LicenseFinder::DependencyList.new([
88
- LicenseFinder::Dependency.new('name' => 'b_gem', 'version' => '0.4.2', 'license' => 'MIT', 'approved' => false, 'source' => "bundle"),
89
- LicenseFinder::Dependency.new('name' => 'a_gem', 'version' => '1.2.3', 'license' => 'MIT', 'approved' => false)
90
- ])
91
-
92
- list.as_yaml.should == [
93
- {
94
- 'name' => 'a_gem',
95
- 'version' => '1.2.3',
96
- 'license' => 'MIT',
97
- 'approved' => false,
98
- 'source' => nil,
99
- 'homepage' => nil,
100
- 'license_url' => LicenseFinder::License::MIT.license_url,
101
- 'notes' => '',
102
- 'license_files' => nil,
103
- 'readme_files' => nil
104
- },
105
- {
106
- 'name' => 'b_gem',
107
- 'version' => '0.4.2',
108
- 'license' => 'MIT',
109
- 'approved' => false,
110
- 'source' => 'bundle',
111
- 'homepage' => nil,
112
- 'license_url' => LicenseFinder::License::MIT.license_url,
113
- 'notes' => '',
114
- 'license_files' => nil,
115
- 'readme_files' => nil
116
- }
117
- ]
118
- end
119
- end
120
-
121
- describe '#to_yaml' do
122
- it "should generate yaml" do
123
- list = LicenseFinder::DependencyList.new([
124
- LicenseFinder::Dependency.new('name' => 'b_gem', 'version' => '0.4.2', 'license' => 'MIT', 'approved' => false, 'source' => "bundle"),
125
- LicenseFinder::Dependency.new('name' => 'a_gem', 'version' => '1.2.3', 'license' => 'MIT', 'approved' => false)
126
- ])
127
-
128
- yaml = YAML.load(list.to_yaml)
129
- yaml.should == list.as_yaml
130
- end
131
- end
132
-
133
- describe 'round trip' do
134
- it 'should recreate from to_yaml' do
135
- list = LicenseFinder::DependencyList.new([
136
- LicenseFinder::Dependency.new('name' => 'gem1', 'version' => '1.2.3', 'license' => 'MIT', 'approved' => false),
137
- LicenseFinder::Dependency.new('name' => 'gem2', 'version' => '0.4.2', 'license' => 'MIT', 'approved' => false)
138
- ])
139
-
140
- new_list = LicenseFinder::DependencyList.from_yaml(list.to_yaml)
141
- new_list.dependencies.size.should == 2
142
- new_list.dependencies.first.name.should == 'gem1'
143
- new_list.dependencies[1].name.should == 'gem2'
144
- end
145
- end
146
-
147
- describe '#merge' do
148
- let(:old_dep) do
149
- LicenseFinder::Dependency.new(
150
- 'name' => 'foo',
151
- 'version' => '0.0.1',
152
- 'source' => 'bundle'
153
- )
154
- end
155
- let(:old_list) { LicenseFinder::DependencyList.new([old_dep]) }
156
-
157
- let(:new_dep) do
158
- LicenseFinder::Dependency.new(
159
- 'name' => 'foo',
160
- 'version' => '0.0.2',
161
- 'source' => 'bundle'
162
- )
163
- end
164
- let(:new_list) { LicenseFinder::DependencyList.new([new_dep]) }
165
-
166
- it 'should merge dependencies with the same name' do
167
- merged_list = old_list.merge(new_list)
168
-
169
- merged_deps = merged_list.dependencies.select { |d| d.name == 'foo' }
170
- merged_deps.should have(1).item
171
-
172
- merged_dep = merged_deps.first
173
- merged_dep.name.should == 'foo'
174
- merged_dep.version.should == '0.0.2'
175
- end
176
-
177
- it 'should add new dependencies' do
178
- new_dep.name = 'bar'
179
-
180
- merged_list = old_list.merge(new_list)
181
- merged_list.dependencies.should include(new_dep)
182
- end
183
-
184
- it 'should keep dependencies not originating from the bundle' do
185
- old_dep.source = ''
186
-
187
- merged_list = old_list.merge(new_list)
188
- merged_list.dependencies.should include(old_dep)
189
- end
190
-
191
- it 'should remove dependencies missing from the bundle' do
192
- old_dep.source = 'bundle'
193
-
194
- merged_list = old_list.merge(new_list)
195
- merged_list.dependencies.should_not include(old_dep)
196
- end
197
- end
198
-
199
- describe "#to_s" do
200
- it "should return a human readable list of dependencies" do
201
-
202
- gem1 = Struct.new(:name, :to_s).new("a", "a string")
203
- gem2 = Struct.new(:name, :to_s).new("b", "b string")
204
-
205
- list = LicenseFinder::DependencyList.new([gem2, gem1])
206
-
207
- list.to_s.should == "a string\nb string"
208
- end
209
- end
210
-
211
- describe '#action_items' do
212
- it "should return all unapproved dependencies" do
213
- gem1 = LicenseFinder::Dependency.new('name' => 'a', 'approved' => true)
214
- stub(gem1).to_s { 'a string' }
215
-
216
- gem2 = LicenseFinder::Dependency.new('name' => 'b', 'approved' => false)
217
- stub(gem2).to_s { 'b string' }
218
-
219
- gem3 = LicenseFinder::Dependency.new('name' => 'c', 'approved' => false)
220
- stub(gem3).to_s { 'c string' }
221
-
222
- list = LicenseFinder::DependencyList.new([gem1, gem2, gem3])
223
-
224
- list.action_items.should == "b string\nc string"
225
- end
226
- end
227
-
228
- describe '#to_html' do
229
- it "should concatenate the results of the each dependency's #to_html and plop it into a proper HTML document" do
230
- gem1 = LicenseFinder::Dependency.new('name' => 'a')
231
- stub(gem1).to_html { 'A' }
232
-
233
- gem2 = LicenseFinder::Dependency.new('name' => 'b')
234
- stub(gem2).to_html { 'B' }
235
-
236
- list = LicenseFinder::DependencyList.new([gem1, gem2])
237
-
238
- html = list.to_html
239
- html.should include "A"
240
- html.should include "B"
241
- end
242
- end
243
- end