license_finder 0.4.5 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. data/README.markdown +43 -11
  2. data/bin/license_finder +2 -5
  3. data/features/executables/license_finder.feature +19 -0
  4. data/features/rake_tasks/action_items.feature +18 -4
  5. data/features/rake_tasks/action_items_ok.feature +10 -7
  6. data/features/rake_tasks/generate_dependencies.feature +43 -12
  7. data/features/rake_tasks/init.feature +8 -1
  8. data/features/rake_tasks/regressions.feature +18 -0
  9. data/features/step_definitions/steps.rb +163 -43
  10. data/lib/license_finder.rb +9 -4
  11. data/lib/license_finder/{gem_spec_details.rb → bundled_gem.rb} +12 -41
  12. data/lib/license_finder/bundler_dependency_query.rb +51 -0
  13. data/lib/license_finder/cli.rb +16 -0
  14. data/lib/license_finder/dependency.rb +80 -28
  15. data/lib/license_finder/dependency_list.rb +20 -35
  16. data/lib/license_finder/finder.rb +2 -2
  17. data/lib/license_finder/license.rb +74 -0
  18. data/lib/license_finder/license/apache.rb +5 -0
  19. data/lib/license_finder/license/bsd.rb +2 -0
  20. data/lib/license_finder/license/gplv2.rb +2 -0
  21. data/lib/license_finder/license/isc.rb +2 -0
  22. data/lib/license_finder/license/lgpl.rb +2 -0
  23. data/lib/license_finder/license/mit.rb +20 -0
  24. data/lib/license_finder/license/new_bsd.rb +5 -0
  25. data/lib/license_finder/license/ruby.rb +11 -0
  26. data/lib/license_finder/license/simplified_bsd.rb +5 -0
  27. data/lib/license_finder/{file_parser.rb → possible_license_file.rb} +9 -17
  28. data/lib/tasks/license_finder.rake +8 -8
  29. data/lib/templates/{Apache-2.0-body → Apache.txt} +0 -0
  30. data/lib/templates/BSD.txt +24 -0
  31. data/lib/templates/{GPL-2.0-body → GPLv2.txt} +0 -0
  32. data/lib/templates/{ISC-body → ISC.txt} +0 -0
  33. data/lib/templates/{LGPL-body → LGPL.txt} +0 -0
  34. data/lib/templates/{MIT-body → MIT.txt} +0 -0
  35. data/lib/templates/NewBSD.txt +21 -0
  36. data/lib/templates/Ruby.txt +52 -0
  37. data/lib/templates/SimplifiedBSD.txt +23 -0
  38. data/license_finder.gemspec +4 -3
  39. data/spec/fixtures/{no_license/.gitkeep → license_names/Licence.rdoc} +0 -0
  40. data/spec/lib/license_finder/bundled_gem_spec.rb +148 -0
  41. data/spec/lib/license_finder/dependency_list_spec.rb +133 -144
  42. data/spec/lib/license_finder/dependency_spec.rb +189 -5
  43. data/spec/lib/license_finder/license/apache_spec.rb +7 -0
  44. data/spec/lib/license_finder/license/bsd_spec.rb +41 -0
  45. data/spec/lib/license_finder/license/gplv2_spec.rb +7 -0
  46. data/spec/lib/license_finder/license/isc_spec.rb +7 -0
  47. data/spec/lib/license_finder/license/lgpl_spec.rb +7 -0
  48. data/spec/lib/license_finder/license/mit_spec.rb +33 -0
  49. data/spec/lib/license_finder/license/new_bsd_spec.rb +35 -0
  50. data/spec/lib/license_finder/license/ruby_spec.rb +19 -0
  51. data/spec/lib/license_finder/license/simplified_bsd_spec.rb +7 -0
  52. data/spec/lib/license_finder/possible_license_file_spec.rb +42 -0
  53. data/spec/spec_helper.rb +6 -0
  54. data/spec/support/license_examples.rb +24 -0
  55. metadata +89 -33
  56. data/lib/license_finder/license_file.rb +0 -98
  57. data/spec/fixtures/apache_licensed_gem/LICENSE +0 -191
  58. data/spec/fixtures/gplv2_licensed_gem/LICENSE +0 -339
  59. data/spec/fixtures/isc_licensed_gem/LICENSE +0 -10
  60. data/spec/fixtures/lgpl_licensed_gem/LICENSE +0 -165
  61. data/spec/fixtures/mit_licensed_gem_in_README/README.rdoc +0 -222
  62. data/spec/fixtures/mit_licensed_gem_via_url/README +0 -210
  63. data/spec/fixtures/mit_licensed_with_hashes/MIT-LICENSE +0 -20
  64. data/spec/lib/license_finder/file_parser_spec.rb +0 -16
  65. data/spec/lib/license_finder/gem_spec_details_spec.rb +0 -229
  66. data/spec/lib/license_finder/license_file_spec.rb +0 -155
@@ -1,20 +0,0 @@
1
- # Copyright (c) 2010, 2011 Matthew Kocher
2
- #
3
- # Permission is hereby granted, free of charge, to any person obtaining
4
- # a copy of this software and associated documentation files (the
5
- # "Software"), to deal in the Software without restriction, including
6
- # without limitation the rights to use, copy, modify, merge, publish,
7
- # distribute, sublicense, and/or sell copies of the Software, and to
8
- # permit persons to whom the Software is furnished to do so, subject to
9
- # the following conditions:
10
- #
11
- # The above copyright notice and this permission notice shall be
12
- # included in all copies or substantial portions of the Software.
13
- #
14
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,16 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe LicenseFinder::FileParser do
4
- subject { LicenseFinder::FileParser.new('root', 'root/nested/path') }
5
-
6
- context "ignoring text" do
7
- before do
8
- stub(IO).read { "file text" }
9
- stub(IO).binread { "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
@@ -1,229 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe LicenseFinder::GemSpecDetails do
4
- before do
5
- @mock_gemspec = Class.new do
6
- def initialize(path = nil)
7
- @path = path
8
- end
9
-
10
- def name
11
- 'spec_name'
12
- end
13
-
14
- def version
15
- '2.1.3'
16
- end
17
-
18
- def full_gem_path
19
- if @path
20
- gem_install_path = File.join(File.dirname(__FILE__), '..', '..', '..', @path)
21
- raise Errno::ENOENT, @path unless File.exists?(gem_install_path)
22
- gem_install_path
23
- else
24
- 'install/path'
25
- end
26
- end
27
-
28
- def license
29
- nil
30
- end
31
- end
32
- end
33
-
34
- subject { LicenseFinder::GemSpecDetails.new(@mock_gemspec.new) }
35
-
36
- its(:name) { should == 'spec_name 2.1.3' }
37
- its(:dependency_name) { should == 'spec_name' }
38
- its(:dependency_version) { should == '2.1.3' }
39
- its(:install_path) { should == 'install/path' }
40
-
41
- describe "#gemspec licenses" do
42
- it "returns the license from the gemspec if provided" do
43
- mock_gemspec = @mock_gemspec.new
44
- stub(mock_gemspec).license { "MIT" }
45
- LicenseFinder::GemSpecDetails.new(mock_gemspec).determine_license.should == "MIT"
46
- end
47
-
48
- it "returns 'ruby' if if is a ruby license" do
49
- mock_gemspec = @mock_gemspec.new
50
- mock_license_file = LicenseFinder::LicenseFile.new('gem', 'gem/license/path')
51
- stub(mock_license_file).mit_license_body? { false }
52
- stub(mock_license_file).mit_license_header? { false }
53
- stub(mock_license_file).apache_license_body? { false }
54
- stub(mock_license_file).gplv2_license_body? { false }
55
-
56
- stub(mock_license_file).ruby_license_body? { true }
57
-
58
-
59
- gemspec_details = LicenseFinder::GemSpecDetails.new(mock_gemspec)
60
- stub(gemspec_details).license_files { [ mock_license_file ] }
61
-
62
- gemspec_details.determine_license.should == "ruby"
63
- end
64
- end
65
-
66
- describe "#license_files" do
67
- it "is empty if there aren't any license files" do
68
- LicenseFinder::GemSpecDetails.new(@mock_gemspec.new).license_files.should == []
69
- end
70
-
71
- it "includes files with names like LICENSE, License or COPYING" do
72
- gem_spec = @mock_gemspec.new('spec/fixtures/license_names')
73
- LicenseFinder::GemSpecDetails.new(gem_spec).license_files.map(&:file_name).should =~
74
- %w[COPYING.txt LICENSE Mit-License README.rdoc]
75
- end
76
-
77
- it "includes files deep in the hierarchy" do
78
- gem_spec = @mock_gemspec.new('spec/fixtures/nested_gem')
79
- LicenseFinder::GemSpecDetails.new(gem_spec).license_files.map { |f| [f.file_name, f.file_path] }.should =~
80
- [['LICENSE', 'vendor/LICENSE']]
81
- end
82
-
83
- it "includes both files nested inside LICENSE directory and top level files" do
84
- gem_spec = @mock_gemspec.new('spec/fixtures/license_directory')
85
- found_license_files = LicenseFinder::GemSpecDetails.new(gem_spec).license_files
86
- found_license_files.map(&:file_name).should =~
87
- %w[BSD-2-Clause.txt GPL-2.0.txt MIT.txt RUBY.txt COPYING LICENSE]
88
- found_license_files.map(&:file_path).should =~
89
- %w[LICENSE/BSD-2-Clause.txt LICENSE/GPL-2.0.txt LICENSE/MIT.txt LICENSE/RUBY.txt COPYING LICENSE/LICENSE]
90
- end
91
- end
92
-
93
-
94
-
95
- describe "#readme_files" do
96
- it "is empty if there aren't any readme files" do
97
- LicenseFinder::GemSpecDetails.new(@mock_gemspec.new).readme_files.should == []
98
- end
99
-
100
- it "includes files with names like README, Readme or COPYING" do
101
- gem_spec = @mock_gemspec.new('spec/fixtures/readme')
102
- LicenseFinder::GemSpecDetails.new(gem_spec).readme_files.map(&:file_name).should =~
103
- %w[Project\ ReadMe README Readme.markdown]
104
- end
105
-
106
- it "includes files deep in the hierarchy" do
107
- gem_spec = @mock_gemspec.new('spec/fixtures/nested_readme')
108
- LicenseFinder::GemSpecDetails.new(gem_spec).readme_files.map { |f| [f.file_name, f.file_path] }.should =~
109
- [['README', 'vendor/README']]
110
- end
111
- end
112
-
113
- describe 'to dependency' do
114
- before do
115
- stub(LicenseFinder).config.stub!.whitelist { ['MIT', 'Apache 2.0', 'LGPL', 'GPLv2'] }
116
- end
117
-
118
- describe 'with MIT License' do
119
- subject do
120
- LicenseFinder::GemSpecDetails.new(@mock_gemspec.new('spec/fixtures/mit_licensed_gem')).dependency
121
- end
122
-
123
- its(:name) { should == 'spec_name' }
124
- its(:version) { should == '2.1.3' }
125
- its(:license) { should == 'MIT' }
126
- its(:approved) { should == true }
127
- its(:license_url) { should == '' }
128
- its(:notes) { should == '' }
129
- end
130
-
131
- describe 'with MIT License in README' do
132
- subject do
133
- LicenseFinder::GemSpecDetails.new(@mock_gemspec.new('spec/fixtures/mit_licensed_gem_in_README')).dependency
134
- end
135
-
136
- its(:name) { should == 'spec_name' }
137
- its(:version) { should == '2.1.3' }
138
- its(:license) { should == 'MIT' }
139
- its(:approved) { should == true }
140
- its(:license_url) { should == '' }
141
- its(:notes) { should == '' }
142
- end
143
-
144
- describe 'with MIT License in README' do
145
- subject do
146
- LicenseFinder::GemSpecDetails.new(@mock_gemspec.new('spec/fixtures/mit_licensed_gem_via_url')).dependency
147
- end
148
-
149
- its(:name) { should == 'spec_name' }
150
- its(:version) { should == '2.1.3' }
151
- its(:license) { should == 'MIT' }
152
- its(:approved) { should == true }
153
- its(:license_url) { should == '' }
154
- its(:notes) { should == '' }
155
- end
156
-
157
- describe 'with MIT License with hashes' do
158
- subject do
159
- LicenseFinder::GemSpecDetails.new(@mock_gemspec.new('spec/fixtures/mit_licensed_with_hashes')).dependency
160
- end
161
-
162
- its(:name) { should == 'spec_name' }
163
- its(:version) { should == '2.1.3' }
164
- its(:license) { should == 'MIT' }
165
- its(:approved) { should == true }
166
- its(:license_url) { should == '' }
167
- its(:notes) { should == '' }
168
- end
169
-
170
- describe 'with Apache License' do
171
- subject do
172
- LicenseFinder::GemSpecDetails.new(@mock_gemspec.new('spec/fixtures/apache_licensed_gem')).dependency
173
- end
174
-
175
- its(:name) { should == 'spec_name' }
176
- its(:version) { should == '2.1.3' }
177
- its(:license) { should == 'Apache 2.0' }
178
- its(:approved) { should == true }
179
- its(:license_url) { should == '' }
180
- its(:notes) { should == '' }
181
- end
182
-
183
- describe 'with GPLv2 License' do
184
- subject do
185
- LicenseFinder::GemSpecDetails.new(@mock_gemspec.new('spec/fixtures/gplv2_licensed_gem')).dependency
186
- end
187
-
188
- its(:name) { should == 'spec_name' }
189
- its(:version) { should == '2.1.3' }
190
- its(:license) { should == 'GPLv2' }
191
- its(:approved) { should == true }
192
- its(:license_url) { should == '' }
193
- its(:notes) { should == '' }
194
- end
195
-
196
- describe 'with LGPL License' do
197
- it "should detect the license as LGPL" do
198
- dependency = LicenseFinder::GemSpecDetails.new(@mock_gemspec.new('spec/fixtures/lgpl_licensed_gem')).dependency
199
- dependency.license.should == "LGPL"
200
- end
201
- end
202
-
203
- describe 'with ISC License' do
204
- it "should detect the license as ISC" do
205
- dependency = LicenseFinder::GemSpecDetails.new(@mock_gemspec.new('spec/fixtures/isc_licensed_gem')).dependency
206
- dependency.license.should == "ISC"
207
- end
208
- end
209
-
210
- describe 'with unknown license' do
211
- subject { LicenseFinder::GemSpecDetails.new(@mock_gemspec.new('spec/fixtures/other_licensed_gem')).dependency }
212
-
213
- its(:name) { should == 'spec_name' }
214
- its(:version) { should == '2.1.3' }
215
- its(:license) { should == 'other' }
216
- its(:approved) { should == false }
217
- its(:license_url) { should == '' }
218
- its(:notes) { should == '' }
219
- end
220
-
221
- describe 'with UTF8 file License' do
222
- it "handles non UTF8 encodings" do
223
- expect do
224
- LicenseFinder::GemSpecDetails.new(@mock_gemspec.new('spec/fixtures/utf8_gem')).dependency
225
- end.not_to raise_error ArgumentError, "invalid byte sequence in UTF-8"
226
- end
227
- end
228
- end
229
- end
@@ -1,155 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe LicenseFinder::LicenseFile do
4
- subject { LicenseFinder::LicenseFile.new('gem', 'gem/license/path') }
5
-
6
- context "ignoring text" do
7
- before do
8
- stub(IO).read { "file text" }
9
- stub(IO).binread { "file text" }
10
- end
11
-
12
- describe "#to_hash" do
13
- it "includes file path" do
14
- subject.to_hash['file_name'].should == 'license/path'
15
- end
16
-
17
- it "does not include file text by default" do
18
- subject.to_hash['text'].should be_nil
19
- end
20
-
21
- it "includes file text if requested" do
22
- subject.include_license_text = true
23
- subject.to_hash['text'].should == 'file text'
24
- end
25
-
26
- it "includes data about license" do
27
- subject.to_hash.should have_key 'body_type'
28
- subject.to_hash.should have_key 'header_type'
29
- subject.to_hash.should have_key 'disclaimer_of_liability'
30
- end
31
- end
32
- end
33
-
34
- context "with MIT like license" do
35
- before do
36
- stub(IO).read { File.read(File.join(File.dirname(__FILE__), '../../fixtures/MIT-LICENSE')) }
37
- stub(IO).binread { File.read(File.join(File.dirname(__FILE__), '../../fixtures/MIT-LICENSE')) }
38
- end
39
-
40
- its(:body_type) { should == 'mit' }
41
- its(:header_type) { should == 'mit' }
42
- its(:disclaimer_of_liability) { should == 'mit: THE AUTHORS OR COPYRIGHT HOLDERS' }
43
- end
44
-
45
- context "with MIT reference in README" do
46
- before do
47
- stub(IO).read { File.read(File.join(File.dirname(__FILE__), '../../fixtures/README-with-MIT-LICENSE')) }
48
- stub(IO).binread { File.read(File.join(File.dirname(__FILE__), '../../fixtures/README-with-MIT-LICENSE')) }
49
- end
50
-
51
- its(:body_type) { should == 'other' }
52
- its(:header_type) { should == 'mit' }
53
- its(:disclaimer_of_liability) { should == 'other' }
54
- end
55
-
56
- context "with MIT url in README" do
57
- before do
58
- stub(IO).read { 'MIT Licence (http://www.opensource.org/licenses/mit-license.html)' }
59
- stub(IO).binread { 'MIT Licence (http://www.opensource.org/licenses/mit-license.html)' }
60
- end
61
-
62
- its(:body_type) { should == 'mit' }
63
- its(:disclaimer_of_liability) { should == 'mit: THE AUTHORS OR COPYRIGHT HOLDERS' }
64
- end
65
-
66
- context "with ruby url in README" do
67
- before do
68
- stub(IO).read { "Same as Ruby's \n\nhttp://www.ruby-lang.org/en/LICENSE.txt" }
69
- stub(IO).binread { "Same as Ruby's \n\nhttp://www.ruby-lang.org/en/LICENSE.txt" }
70
- end
71
-
72
- its(:body_type) { should == 'ruby' }
73
- its(:disclaimer_of_liability) { should == 'other' }
74
- end
75
-
76
- context "with Apache like license" do
77
- before do
78
- stub(IO).read { File.read(File.join(File.dirname(__FILE__), '../..//fixtures/APACHE-2-LICENSE')) }
79
- stub(IO).binread { File.read(File.join(File.dirname(__FILE__), '../..//fixtures/APACHE-2-LICENSE')) }
80
- end
81
-
82
- its(:body_type) { should == 'apache' }
83
- end
84
-
85
- context "with GPLv2 like license" do
86
- before do
87
- stub(IO).read { File.read(File.join(File.dirname(__FILE__), '../..//fixtures/GPLv2')) }
88
- stub(IO).binread { File.read(File.join(File.dirname(__FILE__), '../..//fixtures/GPLv2')) }
89
- end
90
-
91
- its(:body_type) { should == 'gplv2' }
92
- end
93
-
94
- context "with LGPL like license" do
95
- before do
96
- stub(IO).read { File.read(File.join(File.dirname(__FILE__), '..', '..', '..', 'lib', 'templates', 'LGPL-body')) }
97
- stub(IO).binread { File.read(File.join(File.dirname(__FILE__), '..', '..', '..', 'lib', 'templates', 'LGPL-body')) }
98
- end
99
-
100
- its(:body_type) { should == 'lgpl' }
101
- end
102
-
103
- context "with an ISC license" do
104
- before do
105
- stub(IO).read { File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'ISC-LICENSE')) }
106
- stub(IO).binread { File.read(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'ISC-LICENSE')) }
107
- end
108
-
109
- its(:body_type) { should == 'isc' }
110
- end
111
-
112
- context "with another license" do
113
- before do
114
- stub(IO).read { "a non-standard license" }
115
- stub(IO).binread { "a non-standard license" }
116
- end
117
-
118
- its(:body_type) { should == 'other' }
119
- its(:header_type) { should == 'other' }
120
- its(:disclaimer_of_liability) { should == 'other' }
121
- end
122
-
123
- context "with variation in disclaimer of liability" do
124
- before do
125
- stub(IO).read { File.read(File.join(File.dirname(__FILE__), '../../../fixtures/MIT-LICENSE-with-varied-disclaimer')) }
126
- stub(IO).binread { File.read(File.join(File.dirname(__FILE__), '../../../spec/fixtures/MIT-LICENSE-with-varied-disclaimer')) }
127
- end
128
-
129
- its(:body_type) { should == 'mit' }
130
- its(:header_type) { should == 'mit' }
131
- its(:disclaimer_of_liability) { should == 'mit: THE AUTHORS' }
132
- end
133
-
134
- context "with empty license file" do
135
- before do
136
- stub(IO).read { "" }
137
- stub(IO).binread { "" }
138
- end
139
-
140
- describe "#to_hash" do
141
- it "is safe" do
142
- lambda { subject.to_hash }.should_not raise_error
143
- end
144
- end
145
- end
146
-
147
- describe "with variations on MIT header" do
148
- before do
149
- stub(IO).read { '(The MIT License)' }
150
- stub(IO).binread { '(The MIT License)' }
151
- end
152
-
153
- its(:header_type) { should == 'mit' }
154
- end
155
- end