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.
- data/.gitignore +4 -0
- data/Gemfile +0 -1
- data/bin/license_finder +21 -1
- data/features/approve_dependencies.feature +10 -0
- data/features/license_finder.feature +13 -3
- data/features/license_finder_rake_task.feature +3 -3
- data/features/set_license.feature +14 -0
- data/features/step_definitions/steps.rb +5 -0
- data/lib/license_finder.rb +13 -2
- data/lib/license_finder/bundle.rb +25 -3
- data/lib/license_finder/bundle_syncer.rb +12 -0
- data/lib/license_finder/bundled_gem.rb +12 -1
- data/lib/license_finder/cli.rb +42 -3
- data/lib/license_finder/configuration.rb +1 -31
- data/lib/license_finder/dependency.rb +30 -94
- data/lib/license_finder/dependency_report.rb +30 -0
- data/lib/license_finder/html_report.rb +14 -0
- data/lib/license_finder/persistence.rb +1 -0
- data/lib/license_finder/persistence/yaml.rb +7 -0
- data/lib/license_finder/persistence/yaml/configuration.rb +34 -0
- data/lib/license_finder/persistence/yaml/dependency.rb +127 -0
- data/lib/license_finder/reporter.rb +7 -38
- data/lib/license_finder/source_syncer.rb +40 -0
- data/lib/license_finder/text_report.rb +9 -0
- data/lib/templates/dependency.html.erb +2 -2
- data/lib/templates/html_report.erb +93 -0
- data/lib/templates/text_report.erb +2 -0
- data/license_finder.gemspec +2 -2
- data/{README.markdown → readme.md} +22 -11
- data/spec/lib/license_finder/bundle_spec.rb +58 -0
- data/spec/lib/license_finder/bundle_syncer_spec.rb +22 -0
- data/spec/lib/license_finder/bundled_gem_spec.rb +17 -14
- data/spec/lib/license_finder/cli_spec.rb +38 -0
- data/spec/lib/license_finder/dependency_spec.rb +130 -223
- data/spec/lib/license_finder/html_report_spec.rb +67 -0
- data/spec/lib/license_finder/persistence/yaml/configuration_spec.rb +5 -0
- data/spec/lib/license_finder/persistence/yaml/dependency_spec.rb +5 -0
- data/spec/lib/license_finder/possible_license_file_spec.rb +4 -9
- data/spec/lib/license_finder/reporter_spec.rb +0 -1
- data/spec/lib/license_finder/source_syncer_spec.rb +37 -0
- data/spec/lib/license_finder/text_report_spec.rb +29 -0
- data/spec/lib/license_finder_spec.rb +9 -11
- data/spec/spec_helper.rb +1 -1
- data/spec/support/license_examples.rb +1 -1
- data/spec/support/shared_examples/persistence/configuration.rb +34 -0
- data/spec/support/shared_examples/persistence/dependency.rb +139 -0
- metadata +38 -26
- data/lib/license_finder/dependency_list.rb +0 -80
- data/lib/license_finder/viewable.rb +0 -31
- data/lib/templates/dependency_list.html.erb +0 -38
- 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
|