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
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