license_finder 1.0.0.0-java → 1.1.1-java
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.
- checksums.yaml +4 -4
- data/.force-build +0 -0
- data/.travis.yml +8 -7
- data/CHANGELOG.rdoc +29 -1
- data/Rakefile +2 -2
- data/db/migrate/201311192003_reassociate_manual_approval.rb +2 -3
- data/db/migrate/201403181732_rename_manual_fields.rb +10 -0
- data/db/migrate/201403190028_add_manual_approvals.rb +22 -0
- data/db/migrate/201403191419_add_timestamps_to_manual_approvals.rb +15 -0
- data/db/migrate/201403191645_remove_license_aliases.rb +23 -0
- data/features/cli.feature +21 -20
- data/features/cocoapods_dependencies.feature +10 -0
- data/features/configure_bundler_groups.feature +23 -0
- data/features/configure_ignore_dependencies.feature +16 -0
- data/features/{project_name.feature → configure_project_name.feature} +1 -1
- data/features/{whitelist.feature → configure_whitelist.feature} +6 -6
- data/features/manually_added.feature +19 -0
- data/features/{approve_dependencies.feature → manually_approved.feature} +2 -2
- data/features/manually_assigned_license.feature +16 -0
- data/features/{text_report.feature → report_csv.feature} +2 -2
- data/features/{html_report.feature → report_html.feature} +2 -2
- data/features/step_definitions/cli_steps.rb +22 -32
- data/features/step_definitions/cocoapod_steps.rb +8 -0
- data/features/step_definitions/configure_bundler_groups_steps.rb +30 -0
- data/features/step_definitions/configure_ignore_dependencies.rb +35 -0
- data/features/step_definitions/{project_name_steps.rb → configure_project_name_steps.rb} +0 -0
- data/features/step_definitions/configure_whitelist_steps.rb +45 -0
- data/features/step_definitions/gradle_steps.rb +2 -2
- data/features/step_definitions/manually_added_steps.rb +28 -0
- data/features/step_definitions/manually_approved_steps.rb +24 -0
- data/features/step_definitions/manually_assigned_license_steps.rb +34 -0
- data/features/step_definitions/maven_steps.rb +2 -2
- data/features/step_definitions/node_steps.rb +2 -2
- data/features/step_definitions/python_steps.rb +1 -1
- data/features/step_definitions/report_csv_steps.rb +20 -0
- data/features/step_definitions/report_html_steps.rb +60 -0
- data/features/step_definitions/shared_steps.rb +125 -104
- data/{files/license_finder.yml → lib/data/license_finder.example.yml} +3 -0
- data/lib/license_finder.rb +3 -2
- data/lib/license_finder/cli.rb +94 -49
- data/lib/license_finder/configuration.rb +21 -14
- data/lib/license_finder/dependency_manager.rb +27 -19
- data/lib/license_finder/license.rb +33 -19
- data/lib/license_finder/license/definitions.rb +153 -104
- data/lib/license_finder/license/matcher.rb +6 -1
- data/lib/license_finder/license/none_matcher.rb +9 -0
- data/lib/license_finder/license/text.rb +1 -0
- data/lib/license_finder/package.rb +30 -6
- data/lib/license_finder/package_managers/bower.rb +2 -2
- data/lib/license_finder/package_managers/bower_package.rb +2 -2
- data/lib/license_finder/package_managers/bundler.rb +9 -17
- data/lib/license_finder/package_managers/bundler_package.rb +1 -1
- data/lib/license_finder/package_managers/cocoa_pods.rb +35 -0
- data/lib/license_finder/package_managers/cocoa_pods_package.rb +19 -0
- data/lib/license_finder/package_managers/gradle.rb +9 -5
- data/lib/license_finder/package_managers/gradle_package.rb +4 -4
- data/lib/license_finder/package_managers/maven.rb +7 -3
- data/lib/license_finder/package_managers/maven_package.rb +5 -5
- data/lib/license_finder/package_managers/npm.rb +2 -2
- data/lib/license_finder/package_managers/npm_package.rb +2 -2
- data/lib/license_finder/package_managers/pip.rb +2 -2
- data/lib/license_finder/package_managers/pip_package.rb +7 -11
- data/lib/license_finder/package_saver.rb +12 -10
- data/lib/license_finder/possible_license_file.rb +1 -1
- data/lib/license_finder/possible_license_files.rb +11 -15
- data/lib/license_finder/reports/formatted_report.rb +25 -6
- data/lib/license_finder/reports/html_report.rb +2 -1
- data/lib/license_finder/reports/reporter.rb +3 -3
- data/lib/license_finder/tables.rb +6 -4
- data/lib/license_finder/tables/dependency.rb +36 -16
- data/lib/license_finder/tables/manual_approval.rb +13 -0
- data/lib/license_finder/yml_to_sql.rb +12 -9
- data/lib/templates/html_report.erb +68 -74
- data/lib/templates/markdown_report.erb +20 -21
- data/license_finder.gemspec +7 -7
- data/readme.md +76 -79
- data/spec/fixtures/Podfile +3 -0
- data/spec/lib/license_finder/cli_spec.rb +71 -23
- data/spec/lib/license_finder/configuration_spec.rb +61 -21
- data/spec/lib/license_finder/dependency_manager_spec.rb +52 -33
- data/spec/lib/license_finder/license/definitions_spec.rb +30 -14
- data/spec/lib/license_finder/license_spec.rb +55 -12
- data/spec/lib/license_finder/package_managers/bower_package_spec.rb +38 -19
- data/spec/lib/license_finder/package_managers/bower_spec.rb +10 -16
- data/spec/lib/license_finder/package_managers/bundler_package_spec.rb +39 -15
- data/spec/lib/license_finder/package_managers/bundler_spec.rb +10 -22
- data/spec/lib/license_finder/package_managers/cocoa_pods_package_spec.rb +44 -0
- data/spec/lib/license_finder/package_managers/cocoa_pods_spec.rb +79 -0
- data/spec/lib/license_finder/package_managers/gradle_package_spec.rb +4 -5
- data/spec/lib/license_finder/package_managers/gradle_spec.rb +26 -20
- data/spec/lib/license_finder/package_managers/maven_package_spec.rb +4 -5
- data/spec/lib/license_finder/package_managers/maven_spec.rb +16 -19
- data/spec/lib/license_finder/package_managers/npm_package_spec.rb +39 -19
- data/spec/lib/license_finder/package_managers/npm_spec.rb +10 -16
- data/spec/lib/license_finder/package_managers/pip_package_spec.rb +8 -8
- data/spec/lib/license_finder/package_managers/pip_spec.rb +10 -16
- data/spec/lib/license_finder/package_saver_spec.rb +27 -3
- data/spec/lib/license_finder/possible_license_file_spec.rb +25 -23
- data/spec/lib/license_finder/reports/detailed_text_report_spec.rb +6 -8
- data/spec/lib/license_finder/reports/html_report_spec.rb +45 -44
- data/spec/lib/license_finder/reports/markdown_report_spec.rb +8 -9
- data/spec/lib/license_finder/reports/reporter_spec.rb +1 -1
- data/spec/lib/license_finder/reports/text_report_spec.rb +6 -8
- data/spec/lib/license_finder/tables/dependency_spec.rb +57 -41
- data/spec/lib/license_finder/yml_to_sql_spec.rb +94 -92
- data/spec/spec_helper.rb +1 -0
- data/spec/support/stdout_helpers.rb +25 -0
- metadata +86 -69
- data/MIT.LICENSE +0 -20
- data/features/ignore_bundle_groups.feature +0 -23
- data/features/manually_managed_dependencies.feature +0 -19
- data/features/set_license.feature +0 -10
- data/features/step_definitions/approve_dependencies_steps.rb +0 -25
- data/features/step_definitions/html_report_steps.rb +0 -62
- data/features/step_definitions/ignore_bundle_groups_steps.rb +0 -29
- data/features/step_definitions/manually_managed_steps.rb +0 -33
- data/features/step_definitions/set_license_steps.rb +0 -20
- data/features/step_definitions/text_report_steps.rb +0 -19
- data/features/step_definitions/whitelist_steps.rb +0 -45
- data/files/dependency_breakdown.png +0 -0
- data/files/report_breakdown.png +0 -0
- data/lib/license_finder/license_url.rb +0 -9
- data/lib/license_finder/tables/license_alias.rb +0 -22
- data/spec/lib/license_finder/license_url_spec.rb +0 -16
- data/spec/lib/license_finder/tables/license_alias_spec.rb +0 -37
- data/spec/support/silence_stdout.rb +0 -13
data/lib/license_finder.rb
CHANGED
|
@@ -11,7 +11,6 @@ module LicenseFinder
|
|
|
11
11
|
autoload :DependencyManager, 'license_finder/dependency_manager'
|
|
12
12
|
autoload :PackageSaver, 'license_finder/package_saver'
|
|
13
13
|
autoload :License, 'license_finder/license'
|
|
14
|
-
autoload :LicenseUrl, 'license_finder/license_url'
|
|
15
14
|
autoload :PossibleLicenseFile, 'license_finder/possible_license_file'
|
|
16
15
|
autoload :PossibleLicenseFiles, 'license_finder/possible_license_files'
|
|
17
16
|
autoload :Configuration, 'license_finder/configuration'
|
|
@@ -23,6 +22,7 @@ module LicenseFinder
|
|
|
23
22
|
autoload :NPM, 'license_finder/package_managers/npm'
|
|
24
23
|
autoload :Pip, 'license_finder/package_managers/pip'
|
|
25
24
|
autoload :Maven, 'license_finder/package_managers/maven'
|
|
25
|
+
autoload :CocoaPods, 'license_finder/package_managers/cocoa_pods'
|
|
26
26
|
autoload :Gradle, 'license_finder/package_managers/gradle'
|
|
27
27
|
autoload :BowerPackage, 'license_finder/package_managers/bower_package'
|
|
28
28
|
autoload :BundlerPackage, 'license_finder/package_managers/bundler_package'
|
|
@@ -30,11 +30,12 @@ module LicenseFinder
|
|
|
30
30
|
autoload :NpmPackage, 'license_finder/package_managers/npm_package'
|
|
31
31
|
autoload :MavenPackage, 'license_finder/package_managers/maven_package'
|
|
32
32
|
autoload :GradlePackage, 'license_finder/package_managers/gradle_package'
|
|
33
|
+
autoload :CocoaPodsPackage, 'license_finder/package_managers/cocoa_pods_package'
|
|
33
34
|
|
|
34
35
|
|
|
35
36
|
autoload :BundlerGroup, 'license_finder/tables/bundler_group'
|
|
36
37
|
autoload :Dependency, 'license_finder/tables/dependency'
|
|
37
|
-
autoload :
|
|
38
|
+
autoload :ManualApproval, 'license_finder/tables/manual_approval'
|
|
38
39
|
autoload :YmlToSql, 'license_finder/yml_to_sql'
|
|
39
40
|
|
|
40
41
|
autoload :DependencyReport, 'license_finder/reports/dependency_report'
|
data/lib/license_finder/cli.rb
CHANGED
|
@@ -11,12 +11,43 @@ module LicenseFinder
|
|
|
11
11
|
|
|
12
12
|
private
|
|
13
13
|
|
|
14
|
+
def sync_with_spinner
|
|
15
|
+
die_on_error {
|
|
16
|
+
spinner {
|
|
17
|
+
DependencyManager.sync_with_package_managers
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
end
|
|
21
|
+
|
|
14
22
|
def die_on_error
|
|
15
23
|
yield
|
|
16
24
|
rescue LicenseFinder::Error => e
|
|
17
25
|
say e.message, :red
|
|
18
26
|
exit 1
|
|
19
27
|
end
|
|
28
|
+
|
|
29
|
+
def spinner
|
|
30
|
+
if options[:quiet]
|
|
31
|
+
yield
|
|
32
|
+
else
|
|
33
|
+
begin
|
|
34
|
+
thread = Thread.new {
|
|
35
|
+
wheel = '\|/-'
|
|
36
|
+
i = 0
|
|
37
|
+
while true do
|
|
38
|
+
print "\r ---------- #{wheel[i]} ----------"
|
|
39
|
+
i = (i + 1) % 4
|
|
40
|
+
end
|
|
41
|
+
}
|
|
42
|
+
yield
|
|
43
|
+
ensure
|
|
44
|
+
if thread
|
|
45
|
+
thread.kill
|
|
46
|
+
puts "\r" + " "*24
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
20
51
|
end
|
|
21
52
|
|
|
22
53
|
# Thor fix for `license_finder <subcommand> help <action>`
|
|
@@ -40,11 +71,13 @@ module LicenseFinder
|
|
|
40
71
|
|
|
41
72
|
class Dependencies < Subcommand
|
|
42
73
|
method_option :approve, type: :boolean, desc: "Approve the added dependency"
|
|
43
|
-
|
|
74
|
+
method_option :approver, desc: "The person granting the approval"
|
|
75
|
+
method_option :message, desc: "The reason for the approval"
|
|
76
|
+
desc "add LICENSE DEPENDENCY_NAME [VERSION] [--approve] [--approver APPROVER_NAME] [--message APPROVAL_MESSAGE]", "Add a dependency that is not managed by a package manager, optionally storing who approved the dependency and why"
|
|
44
77
|
def add(license, name, version = nil)
|
|
45
78
|
die_on_error {
|
|
46
|
-
DependencyManager.
|
|
47
|
-
DependencyManager.approve!(name) if options[:approve]
|
|
79
|
+
DependencyManager.manually_add(license, name, version)
|
|
80
|
+
DependencyManager.approve!(name, options[:approver], options[:message]) if options[:approve]
|
|
48
81
|
}
|
|
49
82
|
if options[:approve]
|
|
50
83
|
say "The #{name} dependency has been added and approved!", :green
|
|
@@ -53,10 +86,10 @@ module LicenseFinder
|
|
|
53
86
|
end
|
|
54
87
|
end
|
|
55
88
|
|
|
56
|
-
desc "remove DEPENDENCY_NAME", "Remove a dependency that is not managed by
|
|
89
|
+
desc "remove DEPENDENCY_NAME", "Remove a dependency that is not managed by a package manager"
|
|
57
90
|
def remove(name)
|
|
58
91
|
die_on_error {
|
|
59
|
-
DependencyManager.
|
|
92
|
+
DependencyManager.manually_remove(name)
|
|
60
93
|
}
|
|
61
94
|
|
|
62
95
|
say "The #{name} dependency has been removed.", :green
|
|
@@ -71,7 +104,7 @@ module LicenseFinder
|
|
|
71
104
|
yield
|
|
72
105
|
|
|
73
106
|
LicenseFinder.config.save
|
|
74
|
-
|
|
107
|
+
sync_with_spinner
|
|
75
108
|
}
|
|
76
109
|
end
|
|
77
110
|
end
|
|
@@ -88,7 +121,8 @@ module LicenseFinder
|
|
|
88
121
|
end
|
|
89
122
|
|
|
90
123
|
desc "add LICENSE...", "Add one or more licenses to the whitelist"
|
|
91
|
-
def add(*
|
|
124
|
+
def add(license, *other_licenses)
|
|
125
|
+
licenses = other_licenses.unshift license
|
|
92
126
|
modifying {
|
|
93
127
|
licenses.each do |license|
|
|
94
128
|
LicenseFinder.config.whitelist.push(license)
|
|
@@ -98,7 +132,8 @@ module LicenseFinder
|
|
|
98
132
|
end
|
|
99
133
|
|
|
100
134
|
desc "remove LICENSE...", "Remove one or more licenses from the whitelist"
|
|
101
|
-
def remove(*
|
|
135
|
+
def remove(license, *other_licenses)
|
|
136
|
+
licenses = other_licenses.unshift license
|
|
102
137
|
modifying {
|
|
103
138
|
licenses.each do |license|
|
|
104
139
|
LicenseFinder.config.whitelist.delete(license)
|
|
@@ -146,31 +181,64 @@ module LicenseFinder
|
|
|
146
181
|
end
|
|
147
182
|
end
|
|
148
183
|
|
|
184
|
+
class IgnoredDependencies < ConfigSubcommand
|
|
185
|
+
desc "list", "List all the ignored dependencies"
|
|
186
|
+
def list
|
|
187
|
+
ignored = LicenseFinder.config.ignore_dependencies
|
|
188
|
+
|
|
189
|
+
say "Ignored Dependencies:", :blue
|
|
190
|
+
if ignored.any?
|
|
191
|
+
ignored.each do |group|
|
|
192
|
+
say group
|
|
193
|
+
end
|
|
194
|
+
else
|
|
195
|
+
say '(none)'
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
desc "add DEPENDENCY", "Add a dependency to be ignored"
|
|
200
|
+
def add(group)
|
|
201
|
+
modifying {
|
|
202
|
+
LicenseFinder.config.ignore_dependencies.push(group)
|
|
203
|
+
}
|
|
204
|
+
say "Added #{group} to the ignored dependencies"
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
desc "remove DEPENDENCY", "Remove a dependency from the ignored dependencies"
|
|
208
|
+
def remove(group)
|
|
209
|
+
modifying {
|
|
210
|
+
LicenseFinder.config.ignore_dependencies.delete(group)
|
|
211
|
+
}
|
|
212
|
+
say "Removed #{group} from the ignored dependencies"
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
149
216
|
class Main < Base
|
|
150
217
|
method_option :quiet, type: :boolean, desc: "silences loading output"
|
|
151
218
|
desc "rescan", "Find new dependencies. (Default action)"
|
|
152
219
|
def rescan
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}
|
|
157
|
-
}
|
|
220
|
+
sync_with_spinner
|
|
221
|
+
show_results
|
|
222
|
+
end
|
|
158
223
|
|
|
224
|
+
desc "show_results", "Display ignored dependencies and action items"
|
|
225
|
+
def show_results
|
|
226
|
+
IgnoredDependencies.new.list
|
|
159
227
|
action_items
|
|
160
228
|
end
|
|
229
|
+
|
|
161
230
|
default_task :rescan
|
|
162
231
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
232
|
+
method_option :approver, desc: "The person granting the approval"
|
|
233
|
+
method_option :message, desc: "The reason for the approval"
|
|
234
|
+
desc "approve DEPENDENCY_NAME... [--approver APPROVER_NAME] [--message APPROVAL_MESSAGE]", "Approve one or more dependencies by name, optionally storing who approved the dependency and why"
|
|
235
|
+
def approve(name, *other_names)
|
|
236
|
+
names = other_names.unshift name
|
|
237
|
+
die_on_error {
|
|
238
|
+
names.each { |name| DependencyManager.approve!(name, options[:approver], options[:message]) }
|
|
239
|
+
}
|
|
171
240
|
|
|
172
|
-
|
|
173
|
-
end
|
|
241
|
+
say "The #{names.join(", ")} dependency has been approved!", :green
|
|
174
242
|
end
|
|
175
243
|
|
|
176
244
|
desc "license LICENSE DEPENDENCY_NAME", "Update a dependency's license"
|
|
@@ -201,35 +269,12 @@ module LicenseFinder
|
|
|
201
269
|
end
|
|
202
270
|
end
|
|
203
271
|
|
|
204
|
-
subcommand "dependencies", Dependencies, "Manually manage dependencies
|
|
205
|
-
subcommand "ignored_bundler_groups", IgnoredBundlerGroups, "Manage ignored
|
|
272
|
+
subcommand "dependencies", Dependencies, "Manually manage dependencies that your package managers are not aware of"
|
|
273
|
+
subcommand "ignored_bundler_groups", IgnoredBundlerGroups, "Manage ignored Bundler groups"
|
|
274
|
+
subcommand "ignored_dependencies", IgnoredDependencies, "Manage ignored dependencies"
|
|
206
275
|
subcommand "whitelist", Whitelist, "Manage whitelisted licenses"
|
|
207
276
|
subcommand "project_name", ProjectName, "Manage the project name"
|
|
208
277
|
|
|
209
|
-
private
|
|
210
|
-
|
|
211
|
-
def spinner
|
|
212
|
-
if options[:quiet]
|
|
213
|
-
yield
|
|
214
|
-
else
|
|
215
|
-
begin
|
|
216
|
-
thread = Thread.new {
|
|
217
|
-
wheel = '\|/-'
|
|
218
|
-
i = 0
|
|
219
|
-
while true do
|
|
220
|
-
print "\r ---------- #{wheel[i]} ----------"
|
|
221
|
-
i = (i + 1) % 4
|
|
222
|
-
end
|
|
223
|
-
}
|
|
224
|
-
yield
|
|
225
|
-
ensure
|
|
226
|
-
if thread
|
|
227
|
-
thread.kill
|
|
228
|
-
puts "\r" + " "*24
|
|
229
|
-
end
|
|
230
|
-
end
|
|
231
|
-
end
|
|
232
|
-
end
|
|
233
278
|
end
|
|
234
279
|
end
|
|
235
280
|
end
|
|
@@ -7,6 +7,10 @@ module LicenseFinder
|
|
|
7
7
|
prepare(Persistence.get)
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
+
def last_modified
|
|
11
|
+
Persistence.last_modified
|
|
12
|
+
end
|
|
13
|
+
|
|
10
14
|
def self.move!
|
|
11
15
|
config = prepare(Persistence.get.merge('dependencies_file_dir' => './doc/'))
|
|
12
16
|
config.save
|
|
@@ -24,18 +28,15 @@ module LicenseFinder
|
|
|
24
28
|
result
|
|
25
29
|
end
|
|
26
30
|
|
|
27
|
-
attr_accessor :whitelist, :ignore_groups, :artifacts, :project_name
|
|
31
|
+
attr_accessor :whitelist, :ignore_groups, :ignore_dependencies, :artifacts, :project_name, :gradle_command
|
|
28
32
|
|
|
29
33
|
def initialize(config)
|
|
30
34
|
@whitelist = Array(config['whitelist'])
|
|
31
35
|
@ignore_groups = Array(config["ignore_groups"])
|
|
36
|
+
@ignore_dependencies = Array(config["ignore_dependencies"])
|
|
32
37
|
@artifacts = Artifacts.new(Pathname(config['dependencies_file_dir'] || './doc/'))
|
|
33
38
|
@project_name = config['project_name'] || determine_project_name
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def whitelisted?(license_name)
|
|
37
|
-
license = License.find_by_name(license_name)
|
|
38
|
-
whitelisted_licenses.include? license
|
|
39
|
+
@gradle_command = config['gradle_command'] || 'gradle'
|
|
39
40
|
end
|
|
40
41
|
|
|
41
42
|
def save
|
|
@@ -48,17 +49,13 @@ module LicenseFinder
|
|
|
48
49
|
{
|
|
49
50
|
'whitelist' => whitelist.uniq,
|
|
50
51
|
'ignore_groups' => ignore_groups.uniq,
|
|
52
|
+
'ignore_dependencies' => ignore_dependencies.uniq,
|
|
51
53
|
'dependencies_file_dir' => artifacts.dir.to_s,
|
|
52
|
-
'project_name' => project_name
|
|
54
|
+
'project_name' => project_name,
|
|
55
|
+
'gradle_command' => gradle_command
|
|
53
56
|
}
|
|
54
57
|
end
|
|
55
58
|
|
|
56
|
-
def whitelisted_licenses
|
|
57
|
-
whitelist.map do |license_name|
|
|
58
|
-
License.find_by_name(license_name) || license_name
|
|
59
|
-
end.compact
|
|
60
|
-
end
|
|
61
|
-
|
|
62
59
|
def determine_project_name
|
|
63
60
|
Pathname.pwd.basename.to_s
|
|
64
61
|
end
|
|
@@ -103,6 +100,12 @@ module LicenseFinder
|
|
|
103
100
|
def legacy_text_file
|
|
104
101
|
join("dependencies.txt")
|
|
105
102
|
end
|
|
103
|
+
|
|
104
|
+
def last_refreshed
|
|
105
|
+
[database_file, text_file, detailed_text_file, html_file, markdown_file].map do |path|
|
|
106
|
+
File.mtime(path)
|
|
107
|
+
end.min
|
|
108
|
+
end
|
|
106
109
|
end
|
|
107
110
|
|
|
108
111
|
module Persistence
|
|
@@ -122,6 +125,10 @@ module LicenseFinder
|
|
|
122
125
|
file.open('w') { |f| f.write(YAML.dump(hash)) }
|
|
123
126
|
end
|
|
124
127
|
|
|
128
|
+
def last_modified
|
|
129
|
+
File.mtime(file)
|
|
130
|
+
end
|
|
131
|
+
|
|
125
132
|
private
|
|
126
133
|
|
|
127
134
|
def inited?
|
|
@@ -142,7 +149,7 @@ module LicenseFinder
|
|
|
142
149
|
end
|
|
143
150
|
|
|
144
151
|
def file_template
|
|
145
|
-
ROOT_PATH.join('
|
|
152
|
+
ROOT_PATH.join('data', 'license_finder.example.yml')
|
|
146
153
|
end
|
|
147
154
|
end
|
|
148
155
|
end
|
|
@@ -6,42 +6,41 @@ module LicenseFinder
|
|
|
6
6
|
modifying {
|
|
7
7
|
current_dependencies = PackageSaver.save_all(current_packages)
|
|
8
8
|
|
|
9
|
-
Dependency.
|
|
9
|
+
Dependency.added_automatically.obsolete(current_dependencies).each(&:destroy)
|
|
10
10
|
}
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
def self.
|
|
13
|
+
def self.manually_add(license, name, version)
|
|
14
14
|
raise Error.new("#{name} dependency already exists") unless Dependency.where(name: name).empty?
|
|
15
15
|
|
|
16
16
|
modifying {
|
|
17
|
-
dependency = Dependency.new(
|
|
18
|
-
dependency.license =
|
|
17
|
+
dependency = Dependency.new(added_manually: true, name: name, version: version)
|
|
18
|
+
dependency.license = License.find_by_name(license)
|
|
19
19
|
dependency.save
|
|
20
20
|
}
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
def self.
|
|
24
|
-
modifying { find_by_name(name, Dependency.
|
|
23
|
+
def self.manually_remove(name)
|
|
24
|
+
modifying { find_by_name(name, Dependency.added_manually).destroy }
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
-
def self.license!(name,
|
|
27
|
+
def self.license!(name, license_name)
|
|
28
|
+
license = License.find_by_name(license_name)
|
|
28
29
|
modifying { find_by_name(name).set_license_manually!(license) }
|
|
29
30
|
end
|
|
30
31
|
|
|
31
|
-
def self.approve!(name)
|
|
32
|
-
modifying { find_by_name(name).approve! }
|
|
32
|
+
def self.approve!(name, approver = nil, notes = nil)
|
|
33
|
+
modifying { find_by_name(name).approve!(approver, notes) }
|
|
33
34
|
end
|
|
34
35
|
|
|
35
36
|
def self.modifying
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
checksum_after_modifying = checksum(database_file)
|
|
37
|
+
checksum_before = checksum
|
|
38
|
+
result = DB.transaction { yield }
|
|
39
|
+
checksum_after = checksum
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
unless LicenseFinder.config.artifacts.html_file.exist?
|
|
41
|
+
database_changed = checksum_before != checksum_after
|
|
42
|
+
|
|
43
|
+
if database_changed || reports_do_not_exist || reports_are_stale
|
|
45
44
|
Reporter.write_reports
|
|
46
45
|
end
|
|
47
46
|
|
|
@@ -50,12 +49,20 @@ module LicenseFinder
|
|
|
50
49
|
|
|
51
50
|
private # not really private, but it looks like it is!
|
|
52
51
|
|
|
52
|
+
def self.reports_do_not_exist
|
|
53
|
+
!(LicenseFinder.config.artifacts.html_file.exist?)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def self.reports_are_stale
|
|
57
|
+
LicenseFinder.config.last_modified > LicenseFinder.config.artifacts.last_refreshed
|
|
58
|
+
end
|
|
59
|
+
|
|
53
60
|
def self.current_packages
|
|
54
61
|
package_managers.select(&:active?).map(&:current_packages).flatten
|
|
55
62
|
end
|
|
56
63
|
|
|
57
64
|
def self.package_managers
|
|
58
|
-
[Bundler, NPM, Pip, Bower, Maven, Gradle]
|
|
65
|
+
[Bundler, NPM, Pip, Bower, Maven, Gradle, CocoaPods]
|
|
59
66
|
end
|
|
60
67
|
|
|
61
68
|
def self.find_by_name(name, scope = Dependency)
|
|
@@ -64,7 +71,8 @@ module LicenseFinder
|
|
|
64
71
|
dep
|
|
65
72
|
end
|
|
66
73
|
|
|
67
|
-
def self.checksum
|
|
74
|
+
def self.checksum
|
|
75
|
+
database_file = LicenseFinder.config.artifacts.database_file
|
|
68
76
|
if database_file.exist?
|
|
69
77
|
Digest::SHA2.file(database_file).hexdigest
|
|
70
78
|
end
|
|
@@ -2,34 +2,42 @@ module LicenseFinder
|
|
|
2
2
|
class License
|
|
3
3
|
class << self
|
|
4
4
|
def all
|
|
5
|
-
@all ||=
|
|
5
|
+
@all ||= Definitions.all(LicenseFinder.config.whitelist)
|
|
6
6
|
end
|
|
7
7
|
|
|
8
8
|
def find_by_name(name)
|
|
9
|
-
|
|
9
|
+
name ||= "other"
|
|
10
|
+
all.detect { |l| l.matches_name? name } || Definitions.build_unrecognized(name, LicenseFinder.config.whitelist)
|
|
10
11
|
end
|
|
11
12
|
|
|
12
13
|
def find_by_text(text)
|
|
13
|
-
all.detect { |l| l.matches_text? text }
|
|
14
|
+
all.detect { |l| l.matches_text? text }
|
|
14
15
|
end
|
|
15
16
|
end
|
|
16
17
|
|
|
18
|
+
autoload :Definitions, "license_finder/license/definitions"
|
|
17
19
|
autoload :Text, "license_finder/license/text"
|
|
18
20
|
autoload :Template, "license_finder/license/template"
|
|
19
21
|
autoload :Matcher, "license_finder/license/matcher"
|
|
20
22
|
autoload :HeaderMatcher, "license_finder/license/header_matcher"
|
|
21
23
|
autoload :AnyMatcher, "license_finder/license/any_matcher"
|
|
22
|
-
|
|
23
|
-
attr_reader :url, :pretty_name
|
|
24
|
+
autoload :NoneMatcher, "license_finder/license/none_matcher"
|
|
24
25
|
|
|
25
26
|
def initialize(settings)
|
|
26
27
|
@short_name = settings.fetch(:short_name)
|
|
27
28
|
@pretty_name = settings.fetch(:pretty_name, short_name)
|
|
28
29
|
@other_names = settings.fetch(:other_names, [])
|
|
29
30
|
@url = settings.fetch(:url)
|
|
31
|
+
@whitelisted = settings.fetch(:whitelisted, false)
|
|
30
32
|
@matcher = settings.fetch(:matcher) { Matcher.from_template(Template.named(short_name)) }
|
|
31
33
|
end
|
|
32
34
|
|
|
35
|
+
attr_reader :url
|
|
36
|
+
|
|
37
|
+
def name
|
|
38
|
+
pretty_name
|
|
39
|
+
end
|
|
40
|
+
|
|
33
41
|
def matches_name?(name)
|
|
34
42
|
names.map(&:downcase).include? name.to_s.downcase
|
|
35
43
|
end
|
|
@@ -38,27 +46,33 @@ module LicenseFinder
|
|
|
38
46
|
matcher.matches_text?(text)
|
|
39
47
|
end
|
|
40
48
|
|
|
49
|
+
def whitelisted?
|
|
50
|
+
@whitelisted
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def whitelist
|
|
54
|
+
copy(whitelisted: true)
|
|
55
|
+
end
|
|
56
|
+
|
|
41
57
|
private
|
|
42
58
|
|
|
43
|
-
attr_reader :short_name, :
|
|
59
|
+
attr_reader :short_name, :pretty_name, :other_names
|
|
60
|
+
attr_reader :matcher
|
|
44
61
|
|
|
45
62
|
def names
|
|
46
63
|
([short_name, pretty_name] + other_names).uniq
|
|
47
64
|
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
class UnknownLicense
|
|
51
|
-
attr_reader :pretty_name
|
|
52
|
-
|
|
53
|
-
def initialize(name = nil)
|
|
54
|
-
@pretty_name = name
|
|
55
|
-
end
|
|
56
|
-
def url; end
|
|
57
65
|
|
|
58
|
-
def
|
|
59
|
-
|
|
66
|
+
def copy(overrides)
|
|
67
|
+
settings = {
|
|
68
|
+
short_name: short_name,
|
|
69
|
+
pretty_name: pretty_name,
|
|
70
|
+
other_names: other_names,
|
|
71
|
+
url: url,
|
|
72
|
+
whitelisted: whitelisted?,
|
|
73
|
+
matcher: matcher
|
|
74
|
+
}
|
|
75
|
+
self.class.new(settings.merge(overrides))
|
|
60
76
|
end
|
|
61
77
|
end
|
|
62
78
|
end
|
|
63
|
-
|
|
64
|
-
require LicenseFinder::ROOT_PATH.join("license_finder", "license", "definitions.rb")
|