license_finder 0.7.3 → 0.8.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 (73) hide show
  1. data/.gitignore +4 -3
  2. data/.travis.yml +1 -8
  3. data/bin/license_finder +31 -1
  4. data/db/migrate/201303290935_create_dependencies.rb +14 -0
  5. data/db/migrate/201303291155_create_licenses.rb +13 -0
  6. data/db/migrate/201303291402_create_approvals.rb +13 -0
  7. data/db/migrate/201303291456_create_ancestries.rb +9 -0
  8. data/db/migrate/201303291519_create_bundler_groups.rb +13 -0
  9. data/db/migrate/201303291720_move_manual_from_approvals_to_licenses.rb +11 -0
  10. data/db/migrate/201303291753_allow_null_license_names.rb +7 -0
  11. data/db/migrate/201304011027_allow_null_dependency_version.rb +7 -0
  12. data/db/migrate/201304020947_change_table_name_licenses_to_license_aliases.rb +5 -0
  13. data/features/approve_dependencies.feature +0 -45
  14. data/features/html_report.feature +1 -11
  15. data/features/license_finder.feature +13 -27
  16. data/features/license_finder_rake_task.feature +2 -1
  17. data/features/set_license.feature +2 -4
  18. data/features/step_definitions/license_finder_steps.rb +25 -0
  19. data/features/step_definitions/steps.rb +40 -26
  20. data/features/text_report.feature +2 -2
  21. data/files/license_finder.yml +1 -1
  22. data/lib/license_finder.rb +14 -6
  23. data/lib/license_finder/bundle.rb +4 -17
  24. data/lib/license_finder/bundle_syncer.rb +2 -3
  25. data/lib/license_finder/bundled_gem.rb +4 -47
  26. data/lib/license_finder/cli.rb +9 -16
  27. data/lib/license_finder/configuration.rb +55 -3
  28. data/lib/license_finder/dependency_report.rb +1 -1
  29. data/lib/license_finder/gem_saver.rb +69 -0
  30. data/lib/license_finder/html_report.rb +2 -2
  31. data/lib/license_finder/license.rb +60 -58
  32. data/lib/license_finder/license_files.rb +36 -0
  33. data/lib/license_finder/license_url.rb +8 -6
  34. data/lib/license_finder/platform.rb +32 -0
  35. data/lib/license_finder/possible_license_file.rb +1 -1
  36. data/lib/license_finder/tables.rb +7 -0
  37. data/lib/license_finder/tables/approval.rb +4 -0
  38. data/lib/license_finder/tables/bundler_group.rb +4 -0
  39. data/lib/license_finder/tables/dependency.rb +31 -0
  40. data/lib/license_finder/tables/license_alias.rb +22 -0
  41. data/lib/license_finder/yml_to_sql.rb +127 -0
  42. data/lib/tasks/license_finder.rake +3 -0
  43. data/lib/templates/html_report.erb +50 -32
  44. data/lib/templates/text_report.erb +3 -2
  45. data/license_finder.gemspec +14 -5
  46. data/readme.md +10 -50
  47. data/spec/lib/license_finder/bundle_spec.rb +22 -19
  48. data/spec/lib/license_finder/bundle_syncer_spec.rb +4 -10
  49. data/spec/lib/license_finder/bundled_gem_spec.rb +40 -108
  50. data/spec/lib/license_finder/cli_spec.rb +3 -3
  51. data/spec/lib/license_finder/configuration_spec.rb +53 -21
  52. data/spec/lib/license_finder/gem_saver_spec.rb +155 -0
  53. data/spec/lib/license_finder/html_report_spec.rb +32 -15
  54. data/spec/lib/license_finder/license_files_spec.rb +50 -0
  55. data/spec/lib/license_finder/tables/dependency_spec.rb +102 -0
  56. data/spec/lib/license_finder/tables/license_alias_spec.rb +54 -0
  57. data/spec/lib/license_finder/text_report_spec.rb +6 -4
  58. data/spec/lib/license_finder/yml_to_sql_spec.rb +99 -0
  59. data/spec/lib/license_finder_spec.rb +5 -5
  60. data/spec/spec_helper.rb +17 -1
  61. metadata +79 -32
  62. data/lib/license_finder/dependency.rb +0 -50
  63. data/lib/license_finder/persistence.rb +0 -1
  64. data/lib/license_finder/persistence/yaml.rb +0 -7
  65. data/lib/license_finder/persistence/yaml/configuration.rb +0 -34
  66. data/lib/license_finder/persistence/yaml/dependency.rb +0 -127
  67. data/lib/license_finder/source_syncer.rb +0 -40
  68. data/lib/templates/dependency.html.erb +0 -54
  69. data/spec/lib/license_finder/dependency_spec.rb +0 -188
  70. data/spec/lib/license_finder/persistence/yaml/dependency_spec.rb +0 -5
  71. data/spec/lib/license_finder/source_syncer_spec.rb +0 -37
  72. data/spec/support/shared_examples/persistence/configuration.rb +0 -28
  73. data/spec/support/shared_examples/persistence/dependency.rb +0 -138
@@ -1,50 +0,0 @@
1
- module LicenseFinder
2
- class Dependency < LicenseFinder::Persistence::Dependency
3
- def approved
4
- self.approved = !!(config.whitelisted?(license) || super)
5
- end
6
-
7
- def license_files
8
- super || (self.license_files = [])
9
- end
10
-
11
- def bundler_groups
12
- super || (self.bundler_groups = [])
13
- end
14
-
15
- def children
16
- super || (self.children = [])
17
- end
18
-
19
- def parents
20
- super || (self.parents = [])
21
- end
22
-
23
- def approve!
24
- self.approved = true
25
- save
26
- end
27
-
28
- def license_url
29
- LicenseFinder::LicenseUrl.find_by_name license
30
- end
31
-
32
- def merge(other)
33
- raise "Cannot merge dependencies with different names. Expected #{name}, was #{other.name}." unless other.name == name
34
-
35
- new_attributes = other.attributes.merge("notes" => notes)
36
-
37
- if other.license == license || other.license == 'other'
38
- new_attributes["approved"] = approved
39
- new_attributes["license"] = license
40
- else
41
- new_attributes["approved"] = nil
42
- end
43
-
44
- update_attributes new_attributes
45
-
46
- self
47
- end
48
- end
49
- end
50
-
@@ -1,7 +0,0 @@
1
- module LicenseFinder
2
- module Persistence
3
- autoload :Dependency, 'license_finder/persistence/yaml/dependency'
4
- autoload :Configuration, 'license_finder/persistence/yaml/configuration'
5
- end
6
- end
7
-
@@ -1,34 +0,0 @@
1
- module LicenseFinder
2
- module Persistence
3
- class Configuration
4
- attr_accessor :whitelist, :ignore_groups, :dependencies_dir
5
-
6
- def initialize(config={})
7
- if File.exists?(config_file_path)
8
- yaml = File.read(config_file_path)
9
- config = YAML.load(yaml).merge config
10
- end
11
-
12
- @whitelist = config['whitelist'] || []
13
- @ignore_groups = (config["ignore_groups"] || []).map(&:to_sym)
14
- @dependencies_dir = config['dependencies_file_dir'] || '.'
15
- end
16
-
17
- def config_file_path
18
- File.join('.', 'config', 'license_finder.yml')
19
- end
20
-
21
- def dependencies_yaml
22
- File.join(dependencies_dir, "dependencies.yml")
23
- end
24
-
25
- def dependencies_text
26
- File.join(dependencies_dir, "dependencies.txt")
27
- end
28
-
29
- def dependencies_html
30
- File.join(dependencies_dir, "dependencies.html")
31
- end
32
- end
33
- end
34
- end
@@ -1,127 +0,0 @@
1
- module LicenseFinder
2
- module Persistence
3
- class Dependency
4
- class Database
5
- def initialize
6
- @dependency_attributes = YAML.load File.read(LicenseFinder.config.dependencies_yaml) if File.exists?(LicenseFinder.config.dependencies_yaml)
7
- end
8
-
9
- def find(&block)
10
- dependency_attributes.detect &block
11
- end
12
-
13
- def update(dependency_hash)
14
- destroy_by_name_without_saving dependency_hash['name']
15
- dependency_attributes << dependency_hash
16
- persist!
17
- end
18
-
19
- def delete_all
20
- File.delete(LicenseFinder.config.dependencies_yaml) if File.exists?(LicenseFinder.config.dependencies_yaml)
21
- @dependency_attributes = nil
22
- end
23
-
24
- def destroy_by_name(name)
25
- destroy_by_name_without_saving name
26
- persist!
27
- end
28
-
29
- def persist!
30
- File.open(LicenseFinder.config.dependencies_yaml, 'w+') do |f|
31
- f.write dependency_attributes.to_yaml
32
- end
33
- end
34
-
35
- def all
36
- dependency_attributes
37
- end
38
-
39
- private
40
- def destroy_by_name_without_saving(name)
41
- dependency_attributes.reject! { |a| a['name'] == name }
42
- end
43
-
44
- def dependency_attributes
45
- @dependency_attributes ||= []
46
- end
47
- end
48
-
49
- attr_accessor *LicenseFinder::DEPENDENCY_ATTRIBUTES
50
-
51
- class << self
52
- def find_by_name(name)
53
- attributes = database.find { |a| a['name'] == name }
54
- new(attributes) if attributes
55
- end
56
-
57
- def delete_all
58
- database.delete_all
59
- end
60
-
61
- def all
62
- database.all.map { |attributes| new(attributes) }
63
- end
64
-
65
- def unapproved
66
- all.select {|d| d.approved == false }
67
- end
68
-
69
- def update(attributes)
70
- database.update attributes
71
- end
72
-
73
- def destroy_by_name(name)
74
- database.destroy_by_name name
75
- end
76
-
77
- private
78
- def database
79
- @database ||= Database.new
80
- end
81
- end
82
-
83
- def initialize(attributes = {})
84
- update_attributes_without_saving attributes
85
- end
86
-
87
- def config
88
- LicenseFinder.config
89
- end
90
-
91
- def update_attributes new_values
92
- update_attributes_without_saving(new_values)
93
- save
94
- end
95
-
96
- def approved?
97
- !!approved
98
- end
99
-
100
- def save
101
- self.class.update(attributes)
102
- end
103
-
104
- def destroy
105
- self.class.destroy_by_name(name)
106
- end
107
-
108
- def attributes
109
- attributes = {}
110
-
111
- LicenseFinder::DEPENDENCY_ATTRIBUTES.each do |attrib|
112
- attributes[attrib] = send attrib
113
- end
114
-
115
- attributes
116
- end
117
-
118
- private
119
- def update_attributes_without_saving(new_values)
120
- new_values.each do |key, value|
121
- send("#{key}=", value)
122
- end
123
- end
124
- end
125
- end
126
- end
127
-
@@ -1,40 +0,0 @@
1
- module LicenseFinder
2
- class SourceSyncer
3
- def initialize(source_dependencies, dependencies)
4
- @source_dependencies = Array source_dependencies
5
- @dependencies = dependencies
6
- end
7
-
8
- def sync!
9
- destroy_obsolete_dependencies
10
- update_existing_dependencies
11
- create_new_dependencies
12
- dependencies
13
- end
14
-
15
- protected
16
- attr_accessor :dependencies, :source_dependencies
17
-
18
- def destroy_obsolete_dependencies
19
- obsolete_dependencies = dependencies.select {|d| !source_dependencies.detect {|s| s.name == d.name }}
20
- obsolete_dependencies.map &:destroy
21
-
22
- self.dependencies -= obsolete_dependencies
23
- end
24
-
25
- def update_existing_dependencies
26
- dependencies.each do |d|
27
- source_dep = source_dependencies.detect { |s| s.name == d.name }
28
- d.merge(source_dep)
29
- self.source_dependencies -= [source_dep]
30
- end
31
- end
32
-
33
- def create_new_dependencies
34
- source_dependencies.each do |d|
35
- dependencies << d
36
- d.save
37
- end
38
- end
39
- end
40
- end
@@ -1,54 +0,0 @@
1
- <div id="<%= name %>" class="<%= approved ? "approved" : "unapproved" %>">
2
- <h2>
3
- <% if homepage && !homepage.empty? %>
4
- <a href="<%= homepage %>"><%= name %></a>
5
- <% else %>
6
- <%= name %>
7
- <% end %>
8
- v<%= version %>
9
- <% if bundler_groups.any? %>
10
- (<%= bundler_groups.join(", ") %>)
11
- <% end %>
12
- </h2>
13
- <table class="table table-striped table-bordered">
14
- <thead>
15
- <tr>
16
- <th>Summary</th>
17
- <th>Description</th>
18
- <th>License</th>
19
- </tr>
20
- </thead>
21
- <tbody>
22
- <tr>
23
- <td><%= summary %></td>
24
- <td><%= description %></td>
25
- <td>
26
- <% if license_url && !license_url.empty? %>
27
- <a href="<%= license_url %>"><%= license %></a>
28
- <% else %>
29
- <%= license %>
30
- <% end %>
31
- </td>
32
- </td>
33
- </tr>
34
- </tbody>
35
- </table>
36
-
37
- <% if parents.any? %>
38
- <dl>
39
- <dt>Parents</dt>
40
- <% parents.each do |parent| %>
41
- <dd><%= parent %></dd>
42
- <% end %>
43
- </dl>
44
- <% end %>
45
-
46
- <% if children.any? %>
47
- <dl>
48
- <dt>Children</dt>
49
- <% children.each do |child| %>
50
- <dd><%= child %></dd>
51
- <% end %>
52
- </dl>
53
- <% end %>
54
- </div>
@@ -1,188 +0,0 @@
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
- 'source' => "bundle",
15
- 'bundler_groups' => ["test"]
16
- }
17
- end
18
-
19
- let(:config) { LicenseFinder::Configuration.new }
20
-
21
- before do
22
- LicenseFinder.stub(:config).and_return config
23
- config.whitelist = ["MIT", "other"]
24
- end
25
-
26
- describe "#approved" do
27
- it "should return true when the license is whitelisted" do
28
- dependency = Dependency.new('license' => 'MIT')
29
- dependency.should be_approved
30
- end
31
-
32
- it "should return true when the license is an alternative name of a whitelisted license" do
33
- dependency = Dependency.new('license' => 'Expat')
34
- dependency.should be_approved
35
- end
36
-
37
- it "should return true when the license has no matching license class, but is whitelisted anyways" do
38
- dependency = Dependency.new('license' => 'other')
39
- dependency.should be_approved
40
- end
41
-
42
- it "should return false when the license is not whitelisted" do
43
- dependency = Dependency.new('license' => 'GPL')
44
- dependency.approved.should == false
45
- end
46
-
47
-
48
-
49
- it "should be overridable" do
50
- dependency = Dependency.new
51
- dependency.approved = true
52
- dependency.approved.should == true
53
- end
54
- end
55
-
56
- describe '#license_url' do
57
- it "should delegate to LicenseUrl.find_by_name" do
58
- LicenseFinder::LicenseUrl.stub(:find_by_name).with("MIT").and_return "http://license-url.com"
59
- Dependency.new(:license => "MIT").license_url.should == "http://license-url.com"
60
- end
61
- end
62
-
63
- describe '#merge' do
64
- subject do
65
- Dependency.new(
66
- 'name' => 'foo',
67
- 'license' => 'MIT',
68
- 'version' => '0.0.1',
69
- 'license_files' => "old license files"
70
- )
71
- end
72
-
73
- let(:new_dep) do
74
- Dependency.new(
75
- 'name' => 'foo',
76
- 'license' => 'MIT',
77
- 'version' => '0.0.2',
78
- 'license_files' => "new license files",
79
- 'summary' => 'foo summary',
80
- 'description' => 'awesome foo description!',
81
- 'bundler_groups' => [1, 2, 3],
82
- 'homepage' => "http://new.homepage"
83
- )
84
- end
85
-
86
- it 'should raise an error if the names do not match' do
87
- new_dep.name = 'bar'
88
-
89
- expect {
90
- subject.merge(new_dep)
91
- }.to raise_error
92
- end
93
-
94
- it 'should return the new version, license files, source, and homepage' do
95
- merged = subject.merge(new_dep)
96
-
97
- merged.version.should == '0.0.2'
98
- merged.license_files.should == new_dep.license_files
99
- merged.source.should == new_dep.source
100
- merged.homepage.should == new_dep.homepage
101
- end
102
-
103
- it 'should return the new summary and description and bundle groups' do
104
- merged = subject.merge new_dep
105
-
106
- merged.summary.should == new_dep.summary
107
- merged.description.should == new_dep.description
108
- merged.bundler_groups.should == new_dep.bundler_groups
109
- end
110
-
111
- it 'should return the old notes' do
112
- subject.notes = 'old notes'
113
- new_dep.notes = 'new notes'
114
-
115
- merged = subject.merge(new_dep)
116
-
117
- merged.notes.should == 'old notes'
118
- end
119
-
120
- context "license changes to something other than 'other'" do
121
- before { new_dep.license = 'new license' }
122
-
123
- context "new license is whitelisted" do
124
- before { LicenseFinder.config.stub(:whitelist).and_return [new_dep.license] }
125
-
126
- it "should set the approval to true" do
127
- merged = subject.merge new_dep
128
- merged.should be_approved
129
- end
130
- end
131
-
132
- context "new license is not whitelisted" do
133
- it "should set the approval to false" do
134
- merged = subject.merge new_dep
135
- merged.should_not be_approved
136
- end
137
- end
138
- end
139
-
140
- context "license changes to unknown (i.e., 'other')" do
141
- before { new_dep.license = 'other' }
142
-
143
- it "should not change the license" do
144
- merged = subject.merge new_dep
145
- merged.license.should == 'MIT'
146
- end
147
-
148
- it "should not change the approval" do
149
- approved = subject.approved?
150
- merged = subject.merge new_dep
151
- merged.approved?.should == approved
152
- end
153
- end
154
-
155
- context "license does not change" do
156
- before { new_dep.license.should == subject.license }
157
-
158
- it "should not change the license or approval" do
159
- existing_license = subject.license
160
- existing_approval = subject.approved?
161
- merged = subject.merge new_dep
162
- merged.approved?.should == existing_approval
163
- merged.license.should == existing_license
164
- end
165
- end
166
- end
167
-
168
- describe '#approve!' do
169
- it "should update the yaml file to show the gem is approved" do
170
- gem = Dependency.new(name: "foo")
171
- gem.approve!
172
- reloaded_gem = Dependency.find_by_name(gem.name)
173
- reloaded_gem.approved.should be_true
174
- end
175
- end
176
-
177
- describe "defaults" do
178
- %w(license_files bundler_groups children parents).each do |attribute|
179
- describe "##{attribute}" do
180
- it "should default to an empty array" do
181
- Dependency.new.send(attribute).should == []
182
- end
183
- end
184
- end
185
- end
186
- end
187
- end
188
-