license_finder 0.7.3 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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
data/.gitignore CHANGED
@@ -5,7 +5,8 @@ Gemfile.lock
5
5
  .rvmrc
6
6
  .idea/*
7
7
  tmp/
8
- dependencies.yml
9
- dependencies.txt
10
- dependencies.html
8
+ dependencies.*
9
+ doc/dependencies.*
10
+ db/schema.rb
11
11
  config/
12
+ .pairs
@@ -1,22 +1,15 @@
1
1
  rvm:
2
+ - 2.0.0
2
3
  - 1.9.3
3
4
  - 1.9.2
4
- - jruby-18mode
5
5
  - jruby-19mode
6
- - rbx-18mode
7
6
  - rbx-19mode
8
7
  - ruby-head
9
8
  - jruby-head
10
- - 1.8.7
11
- - ree
12
9
 
13
10
  matrix:
14
11
  allow_failures:
15
- - rvm: jruby-18mode
16
12
  - rvm: jruby-19mode
17
- - rvm: rbx-18mode
18
13
  - rvm: rbx-19mode
19
14
  - rvm: ruby-head
20
15
  - rvm: jruby-head
21
- - rvm: 1.8.7
22
- - rvm: ree
@@ -3,7 +3,31 @@
3
3
  require 'license_finder'
4
4
  require 'optparse'
5
5
 
6
+ module SpinnerStrategy
7
+ module Spin
8
+ def self.run
9
+ thread = Thread.new() {
10
+ wheel = '\|/-'
11
+ i = 0
12
+ while not LicenseFinder::CLI.class_variable_get("@@run_complete") do
13
+ print "\r ---------- #{wheel[i]} ----------"
14
+ i = (i + 1) % 4
15
+ end
16
+ }
17
+ yield
18
+ thread.join
19
+ end
20
+ end
21
+
22
+ module Noop
23
+ def self.run
24
+ yield
25
+ end
26
+ end
27
+ end
28
+
6
29
  options = {}
30
+ spinner = SpinnerStrategy::Spin
7
31
 
8
32
  OptionParser.new do |opts|
9
33
  opts.banner = "Usage: license_finder [options] [dependency]"
@@ -15,10 +39,16 @@ OptionParser.new do |opts|
15
39
  opts.on("-l", "--license [LICENSE]", "Update a gem's license.") do |license|
16
40
  options[:license] = license
17
41
  end
42
+
43
+ opts.on("-q", "--quiet") do
44
+ spinner = SpinnerStrategy::Noop
45
+ end
18
46
  end.parse!
19
47
 
20
48
  unless options.empty?
21
49
  options[:dependency] = ARGV.last
22
50
  end
23
51
 
24
- LicenseFinder::CLI.execute! options
52
+ spinner.run {
53
+ LicenseFinder::CLI.execute! options
54
+ }
@@ -0,0 +1,14 @@
1
+ # sequel -m db/migrate -E sqlite://doc/dependencies.db
2
+
3
+ Sequel.migration do
4
+ change do
5
+ create_table(:dependencies) do
6
+ primary_key :id
7
+ String :name, null: false
8
+ String :version, null: false
9
+ String :summary
10
+ String :description
11
+ String :homepage
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ Sequel.migration do
2
+ change do
3
+ create_table(:licenses) do
4
+ primary_key :id
5
+ String :name, null: false
6
+ String :url
7
+ end
8
+
9
+ alter_table(:dependencies) do
10
+ add_column :license_id, Integer
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ Sequel.migration do
2
+ change do
3
+ create_table(:approvals) do
4
+ primary_key :id
5
+ Boolean :state
6
+ String :approval_type
7
+ end
8
+
9
+ alter_table(:dependencies) do
10
+ add_column :approval_id, Integer
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ Sequel.migration do
2
+ change do
3
+ create_table(:ancestries) do
4
+ primary_key :id
5
+ Integer :parent_dependency_id
6
+ Integer :child_dependency_id
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ Sequel.migration do
2
+ change do
3
+ create_table(:bundler_groups) do
4
+ primary_key :id
5
+ String :name
6
+ end
7
+
8
+ create_table(:bundler_groups_dependencies) do
9
+ Integer :bundler_group_id
10
+ Integer :dependency_id
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ Sequel.migration do
2
+ change do
3
+ alter_table(:approvals) do
4
+ drop_column :approval_type
5
+ end
6
+
7
+ alter_table(:licenses) do
8
+ add_column :manual, TrueClass # i.e., keep this license eternally
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ Sequel.migration do
2
+ change do
3
+ alter_table(:licenses) do
4
+ set_column_allow_null :name
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ Sequel.migration do
2
+ change do
3
+ alter_table(:dependencies) do
4
+ set_column_allow_null :version
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ Sequel.migration do
2
+ change do
3
+ rename_table(:licenses, :license_aliases)
4
+ end
5
+ end
@@ -12,48 +12,3 @@ Feature: Approving non-whitelisted Dependencies
12
12
  When I run "license_finder"
13
13
  Then I should not see "gpl_gem" in its output
14
14
  Then I should see the "gpl_gem" in the html flagged as "approved"
15
-
16
- Scenario: Manually approving a non-whitelisted dependency
17
- Given I have an app with license finder
18
- And my app depends on a gem "gpl_gem" licensed with "GPL"
19
- And I whitelist the "MIT" license
20
-
21
- When I run "license_finder"
22
- Then I should see the following settings for "gpl_gem":
23
- """
24
- version: "0.0.0"
25
- license: "GPL"
26
- approved: false
27
- """
28
-
29
- When I update the settings for "gpl_gem" with the following content:
30
- """
31
- approved: true
32
- """
33
- When I run "license_finder"
34
- Then I should not see "gpl_gem" in its output
35
-
36
- Scenario: Manually adding a non-bundled dependency
37
- Given I have an app with license finder
38
- When I run "license_finder"
39
- And I add the following content to "dependencies.yml":
40
- """
41
- - name: "my_javascript_library"
42
- version: "0.0.0"
43
- license: "GPL"
44
- approved: false
45
- """
46
- Then I should see the following settings for "my_javascript_library":
47
- """
48
- version: "0.0.0"
49
- license: "GPL"
50
- approved: false
51
- """
52
- When I run "license_finder"
53
- Then I should see "my_javascript_library" in its output
54
- When I update the settings for "my_javascript_library" with the following content:
55
- """
56
- approved: true
57
- """
58
- When I run "license_finder"
59
- Then I should not see "my_javascript_library" in its output
@@ -31,18 +31,8 @@ Feature: HTML Report
31
31
  And I whitelist the following licenses: "MIT, other"
32
32
  When I run "license_finder"
33
33
  # rake, bundler, license_finder, my_app, gpl_licensed_gem, mit_licensed_gem
34
- Then I should see "6 total" in the html
34
+ Then I should see "8 total" in the html
35
35
  # gpl_licensed_gem
36
36
  And I should see "1 unapproved" in the html
37
37
  # gpl_licensed_gem
38
38
  And I should see "1 GPL" in the html
39
-
40
- Scenario: Implicit dependencies list their parent dependencies
41
- Given I have a rails app with license finder
42
- When I run "license_finder"
43
- Then I should see the "activerecord" in the html with the following details:
44
- | parent |
45
- | rails |
46
- And I should see "rails" in the html with the following details:
47
- | children |
48
- | activerecord |
@@ -6,7 +6,7 @@ Feature: License Finder command line executable
6
6
  Scenario: Running without a configuration file
7
7
  Given I have an app with license finder
8
8
  And my app does not have a "config" directory
9
- When I run "license_finder"
9
+ When I run "license_finder -q"
10
10
  Then I should see a "config" directory
11
11
  And I should see the file "config/license_finder.yml" with the following content:
12
12
  """
@@ -17,45 +17,31 @@ Feature: License Finder command line executable
17
17
  ignore_groups:
18
18
  #- test
19
19
  #- development
20
- dependencies_file_dir: './'
21
- """
20
+ dependencies_file_dir: './doc/'
22
21
 
23
- Scenario: Running with an empty dependencies.yml
24
- Given I have an app with license finder
25
- And my app depends on a gem "mit_licensed_gem" licensed with "MIT"
26
- And I have a truncated dependencies.yml file
27
- When I run "license_finder"
28
- Then it should exit with status code 1
29
- And I should see "mit_licensed_gem" in its output
22
+ """
30
23
 
31
24
  Scenario: Auditing an application with non-whitelisted licenses
32
25
  Given I have an app with license finder
33
26
  And my app depends on a gem "mit_licensed_gem" licensed with "MIT"
34
- When I run "license_finder"
27
+ When I run "license_finder -q"
35
28
  Then it should exit with status code 1
36
29
  And I should see "mit_licensed_gem" in its output
37
30
 
38
31
  Scenario: Auditing an application with whitelisted licenses
39
32
  Given I have an app with license finder
40
33
  And my app depends on a gem "mit_licensed_gem" licensed with "MIT"
41
- When I run "license_finder"
34
+ When I run "license_finder -q"
42
35
  Then I should see "mit_licensed_gem" in its output
43
36
  When I whitelist the following licenses: "MIT, other"
44
- And I run "license_finder"
37
+ And I run "license_finder -q"
45
38
  Then I should see "All gems are approved for use" in its output
46
39
  And it should exit with status code 0
47
40
 
48
- Scenario: Merging a legacy dependencies.yml file
49
- Given I have an app with license finder
50
- And my app depends on a gem "random_licensed_gem" licensed with "random_license"
51
- And I have a legacy dependencies.yml file with "random_licensed_gem" approved with its "random_license" license
52
- And I whitelist the following licenses: "MIT, other"
53
- When I run "license_finder"
54
- Then I should see exactly one entry for "random_licensed_gem" in "dependencies.yml"
55
-
56
- Scenario: Remove readme file paths from legacy dependencies.yml
57
- Given I have an app with license finder
58
- And my app depends on a gem "random_licensed_gem" licensed with "random_license"
59
- And I have a legacy dependencies.yml file with readme_files entry for gem "random_licensed_gem"
60
- When I run "license_finder"
61
- Then I should not see an entry "readme_files" for gem "random_licensed_gem" in my dependencies.yml
41
+ Scenario: Keep manually set license dependencies
42
+ Given I have a project that depends on mime-types
43
+ And I manually set the license type to Ruby
44
+ And I run license_finder again
45
+ Then the mime-types license is set to Ruby
46
+ When I run license_finder again
47
+ Then the mime-types license is set to Ruby
@@ -17,7 +17,8 @@ Feature: License Finder rake task
17
17
  ignore_groups:
18
18
  #- test
19
19
  #- development
20
- dependencies_file_dir: './'
20
+ dependencies_file_dir: './doc/'
21
+
21
22
  """
22
23
 
23
24
  Scenario: Auditing an application with non-whitelisted licenses
@@ -8,7 +8,5 @@ Feature: Set a dependency's license through a command line interface
8
8
  And my app depends on a gem "other_license_gem" licensed with "other"
9
9
  When I run "license_finder"
10
10
  When I run "license_finder -l MIT other_license_gem"
11
- Then I should see the following settings for "other_license_gem":
12
- """
13
- license: "MIT"
14
- """
11
+ And I run license_finder again
12
+ Then I should see other_license_gem set to MIT license
@@ -0,0 +1,25 @@
1
+ require 'license_finder'
2
+ require 'fileutils'
3
+ require 'pathname'
4
+ require 'bundler'
5
+ require 'capybara'
6
+
7
+ Given /^I have a project that depends on mime\-types$/ do
8
+ @user = ::DSL::User.new
9
+ @user.create_rails_app
10
+ @user.add_gem_dependency('mime-types')
11
+ @user.bundle_app
12
+ @user.execute_command "license_finder"
13
+ end
14
+
15
+ Given /^I manually set the license type to Ruby$/ do
16
+ @output = @user.execute_command "license_finder -l Ruby mime-types"
17
+ end
18
+
19
+ When /^I run license_finder again$/ do
20
+ @output = @user.execute_command "license_finder -q"
21
+ end
22
+
23
+ Then /^the mime\-types license is set to Ruby$/ do
24
+ @output.should =~ /mime-types.*Ruby/
25
+ end
@@ -2,7 +2,6 @@ require 'fileutils'
2
2
  require 'pathname'
3
3
  require 'bundler'
4
4
  require 'capybara'
5
- require 'pry'
6
5
 
7
6
  Given /^I have a rails app(?:lication)? with license finder$/ do
8
7
  @user = ::DSL::User.new
@@ -44,8 +43,8 @@ Given /^I whitelist the following licenses: "([^"]*)"$/ do |licenses|
44
43
  end
45
44
 
46
45
  Given /^I have a legacy dependencies\.yml file with "(.*?)" approved with its "(.*?)" license$/ do |gem_name, license_name|
47
- File.open(@user.dependencies_file_path, 'w+') do |f|
48
- <<-YAML
46
+ @user.modifying_dependencies_file do |f|
47
+ f.write <<-YAML
49
48
  - name: #{gem_name}
50
49
  version: 1.5.0
51
50
  license: #{license_name}
@@ -58,8 +57,8 @@ Given /^I have a legacy dependencies\.yml file with "(.*?)" approved with its "(
58
57
  end
59
58
 
60
59
  And /^I have a legacy dependencies\.yml file with readme_files entry for gem "(.*?)"$/ do |gem_name|
61
- File.open(@user.dependencies_file_path, 'w+') do |f|
62
- <<-YAML
60
+ @user.modifying_dependencies_file do |f|
61
+ f.write <<-YAML
63
62
  - name: #{gem_name}
64
63
  version: 1.5.0
65
64
  license: some_license
@@ -73,6 +72,21 @@ And /^I have a legacy dependencies\.yml file with readme_files entry for gem "(.
73
72
  end
74
73
  end
75
74
 
75
+ Given /^I have a legacy dependencies\.yml file with a blank readme_files entry for gem "(.*?)"$/ do |gem_name|
76
+ @user.modifying_dependencies_file do |f|
77
+ f.write(<<-YAML)
78
+ - name: #{gem_name}
79
+ version: 1.5.0
80
+ license: some_license
81
+ approved: true
82
+ notes: ''
83
+ license_files:
84
+ - path: /some/path/to/files/that/are/rad
85
+ readme_files:
86
+ YAML
87
+ end
88
+ end
89
+
76
90
  When /^I run "(.*?)"$/ do |command|
77
91
  @output = @user.execute_command command
78
92
  end
@@ -102,12 +116,6 @@ When /^the text "([^"]*)" should link to "([^"]*)"$/ do |text, link|
102
116
  html.all(:xpath, "//a[@href='#{link}']").first.text.should == text
103
117
  end
104
118
 
105
- When /^I have a truncated dependencies.yml file$/ do
106
- File.open(@user.dependencies_file_path, 'w+') do |f|
107
- f.puts ""
108
- end
109
- end
110
-
111
119
  When /^"([^"]*)" is an alternative name for the "MIT" license$/ do |alternative_name|
112
120
  # this step is simply for readability
113
121
  end
@@ -116,6 +124,10 @@ When /^I whitelist the "([^"]*)" bundler group$/ do |group|
116
124
  @user.configure_license_finder_bundler_whitelist(group)
117
125
  end
118
126
 
127
+ Then(/^I should see other_license_gem set to MIT license$/) do
128
+ @output.should =~ /other_license_gem.*MIT/
129
+ end
130
+
119
131
  Then /^I should see a "([^"]+)" directory$/ do |name|
120
132
  File.should be_exists(@user.app_path(name))
121
133
  end
@@ -141,13 +153,6 @@ Then /^I should see exactly one entry for "(.*?)" in "(.*?)"$/ do |gem_name, fil
141
153
  file_contents.scan(/#{gem_name}/).size.should == 1
142
154
  end
143
155
 
144
- Then /^I should see the following settings for "([^"]*)":$/ do |name, yaml|
145
- expected_settings = YAML.load(yaml)
146
- all_settings = YAML.load(File.read(@user.dependencies_file_path))
147
- actual_settings = all_settings.detect { |gem| gem['name'] == name }
148
- actual_settings.should include expected_settings
149
- end
150
-
151
156
  Then /^I should not see an entry "(.*?)" for gem "(.*?)" in my dependencies\.yml$/ do |entry_key, gem_name|
152
157
  settings = YAML.load(File.read(@user.dependencies_file_path))
153
158
  gem_settings = settings.detect { |gem| gem['name'] == gem_name }
@@ -303,15 +308,24 @@ module DSL
303
308
  File.join(app_path, 'config')
304
309
  end
305
310
 
311
+ def doc_path
312
+ File.join(app_path, 'doc')
313
+ end
314
+
306
315
  def dependencies_file_path
307
- File.join(app_path, 'dependencies.yml')
316
+ File.join(doc_path, 'dependencies.yml')
308
317
  end
309
318
 
310
319
  def dependencies_html_path
311
- File.join(app_path, 'dependencies.html')
320
+ File.join(doc_path, 'dependencies.html')
312
321
  end
313
322
 
314
- private
323
+ def add_gem_dependency(name, options = {})
324
+ line = "gem #{name.inspect}"
325
+ line << ", " + options.inspect unless options.empty?
326
+
327
+ add_to_gemfile(line)
328
+ end
315
329
 
316
330
  def bundle_app
317
331
  Bundler.with_clean_env do
@@ -319,13 +333,13 @@ module DSL
319
333
  end
320
334
  end
321
335
 
322
- def add_gem_dependency(name, options = {})
323
- line = "gem #{name.inspect}"
324
- line << ", " + options.inspect unless options.empty?
325
-
326
- add_to_gemfile(line)
336
+ def modifying_dependencies_file
337
+ FileUtils.mkdir_p(File.dirname(dependencies_file_path))
338
+ File.open(dependencies_file_path, 'w+') { |f| yield f }
327
339
  end
328
340
 
341
+ private
342
+
329
343
  def add_to_gemfile(line)
330
344
  `echo #{line.inspect} >> #{File.join(app_path, "Gemfile")}`
331
345
  end