gitlab-license_finder 6.14.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. checksums.yaml +7 -0
  2. data/.force-build +0 -0
  3. data/.gitignore +13 -0
  4. data/.rspec +1 -0
  5. data/.rubocop.yml +70 -0
  6. data/CHANGELOG.md +981 -0
  7. data/CONTRIBUTING.md +121 -0
  8. data/Dockerfile +249 -0
  9. data/Gemfile +2 -0
  10. data/LICENSE +22 -0
  11. data/README.md +555 -0
  12. data/Rakefile +77 -0
  13. data/TODO.md +12 -0
  14. data/VERSION +1 -0
  15. data/appveyor.yml +21 -0
  16. data/bin/license_finder +6 -0
  17. data/bin/license_finder_pip.py +43 -0
  18. data/ci/pipelines/pull-request.yml.erb +141 -0
  19. data/ci/pipelines/release.yml.erb +200 -0
  20. data/ci/scripts/containerize-tests.sh +14 -0
  21. data/ci/scripts/pushscript.sh +32 -0
  22. data/ci/scripts/run-rubocop.sh +15 -0
  23. data/ci/scripts/run-tests.sh +24 -0
  24. data/ci/scripts/test.ps1 +81 -0
  25. data/ci/scripts/updateChangelog.sh +84 -0
  26. data/ci/tasks/build-and-push-gem.yml +10 -0
  27. data/ci/tasks/build-windows.yml +6 -0
  28. data/ci/tasks/build.yml +16 -0
  29. data/ci/tasks/rubocop.yml +15 -0
  30. data/ci/tasks/run-tests.yml +10 -0
  31. data/ci/tasks/update-changelog.yml +18 -0
  32. data/dlf +12 -0
  33. data/examples/Gemfile +4 -0
  34. data/examples/custom_erb_template.rb +24 -0
  35. data/examples/extract_license_data.rb +63 -0
  36. data/examples/sample_template.erb +7 -0
  37. data/lib/license_finder/cli/approvals.rb +28 -0
  38. data/lib/license_finder/cli/base.rb +107 -0
  39. data/lib/license_finder/cli/dependencies.rb +44 -0
  40. data/lib/license_finder/cli/ignored_dependencies.rb +32 -0
  41. data/lib/license_finder/cli/ignored_groups.rb +32 -0
  42. data/lib/license_finder/cli/inherited_decisions.rb +50 -0
  43. data/lib/license_finder/cli/licenses.rb +26 -0
  44. data/lib/license_finder/cli/main.rb +221 -0
  45. data/lib/license_finder/cli/makes_decisions.rb +38 -0
  46. data/lib/license_finder/cli/patched_thor.rb +33 -0
  47. data/lib/license_finder/cli/permitted_licenses.rb +32 -0
  48. data/lib/license_finder/cli/project_name.rb +32 -0
  49. data/lib/license_finder/cli/restricted_licenses.rb +32 -0
  50. data/lib/license_finder/cli.rb +20 -0
  51. data/lib/license_finder/configuration.rb +186 -0
  52. data/lib/license_finder/core.rb +118 -0
  53. data/lib/license_finder/decision_applier.rb +70 -0
  54. data/lib/license_finder/decisions.rb +312 -0
  55. data/lib/license_finder/decisions_factory.rb +13 -0
  56. data/lib/license_finder/diff.rb +51 -0
  57. data/lib/license_finder/license/any_matcher.rb +15 -0
  58. data/lib/license_finder/license/definitions.rb +366 -0
  59. data/lib/license_finder/license/header_matcher.rb +17 -0
  60. data/lib/license_finder/license/matcher.rb +24 -0
  61. data/lib/license_finder/license/none_matcher.rb +11 -0
  62. data/lib/license_finder/license/template.rb +19 -0
  63. data/lib/license_finder/license/templates/0BSD.txt +10 -0
  64. data/lib/license_finder/license/templates/Apache1_1.txt +16 -0
  65. data/lib/license_finder/license/templates/Apache2.txt +172 -0
  66. data/lib/license_finder/license/templates/BSD.txt +24 -0
  67. data/lib/license_finder/license/templates/CC01.txt +30 -0
  68. data/lib/license_finder/license/templates/CDDL1.txt +131 -0
  69. data/lib/license_finder/license/templates/EPL1.txt +86 -0
  70. data/lib/license_finder/license/templates/GPLv2.txt +339 -0
  71. data/lib/license_finder/license/templates/GPLv3.txt +674 -0
  72. data/lib/license_finder/license/templates/ISC.txt +2 -0
  73. data/lib/license_finder/license/templates/LGPL.txt +165 -0
  74. data/lib/license_finder/license/templates/LGPL2_1.txt +169 -0
  75. data/lib/license_finder/license/templates/MIT.txt +9 -0
  76. data/lib/license_finder/license/templates/MPL1_1.txt +469 -0
  77. data/lib/license_finder/license/templates/MPL2.txt +373 -0
  78. data/lib/license_finder/license/templates/NewBSD.txt +21 -0
  79. data/lib/license_finder/license/templates/OFL.txt +91 -0
  80. data/lib/license_finder/license/templates/Python.txt +47 -0
  81. data/lib/license_finder/license/templates/Ruby.txt +52 -0
  82. data/lib/license_finder/license/templates/SimplifiedBSD.txt +19 -0
  83. data/lib/license_finder/license/templates/WTFPL.txt +14 -0
  84. data/lib/license_finder/license/templates/Zlib.txt +17 -0
  85. data/lib/license_finder/license/text.rb +45 -0
  86. data/lib/license_finder/license.rb +117 -0
  87. data/lib/license_finder/license_aggregator.rb +59 -0
  88. data/lib/license_finder/logger.rb +69 -0
  89. data/lib/license_finder/package.rb +202 -0
  90. data/lib/license_finder/package_delta.rb +61 -0
  91. data/lib/license_finder/package_manager.rb +181 -0
  92. data/lib/license_finder/package_managers/bower.rb +37 -0
  93. data/lib/license_finder/package_managers/bundler.rb +110 -0
  94. data/lib/license_finder/package_managers/cargo.rb +38 -0
  95. data/lib/license_finder/package_managers/carthage.rb +68 -0
  96. data/lib/license_finder/package_managers/cocoa_pods.rb +61 -0
  97. data/lib/license_finder/package_managers/composer.rb +63 -0
  98. data/lib/license_finder/package_managers/conan.rb +28 -0
  99. data/lib/license_finder/package_managers/conda.rb +131 -0
  100. data/lib/license_finder/package_managers/dep.rb +43 -0
  101. data/lib/license_finder/package_managers/dotnet.rb +83 -0
  102. data/lib/license_finder/package_managers/erlangmk.rb +50 -0
  103. data/lib/license_finder/package_managers/glide.rb +36 -0
  104. data/lib/license_finder/package_managers/go_15vendorexperiment.rb +87 -0
  105. data/lib/license_finder/package_managers/go_dep.rb +80 -0
  106. data/lib/license_finder/package_managers/go_modules.rb +93 -0
  107. data/lib/license_finder/package_managers/go_workspace.rb +116 -0
  108. data/lib/license_finder/package_managers/govendor.rb +73 -0
  109. data/lib/license_finder/package_managers/gradle.rb +99 -0
  110. data/lib/license_finder/package_managers/gvt.rb +69 -0
  111. data/lib/license_finder/package_managers/maven.rb +65 -0
  112. data/lib/license_finder/package_managers/mix.rb +131 -0
  113. data/lib/license_finder/package_managers/npm.rb +57 -0
  114. data/lib/license_finder/package_managers/nuget.rb +154 -0
  115. data/lib/license_finder/package_managers/pip.rb +70 -0
  116. data/lib/license_finder/package_managers/pipenv.rb +63 -0
  117. data/lib/license_finder/package_managers/rebar.rb +65 -0
  118. data/lib/license_finder/package_managers/sbt.rb +50 -0
  119. data/lib/license_finder/package_managers/spm.rb +93 -0
  120. data/lib/license_finder/package_managers/trash.rb +43 -0
  121. data/lib/license_finder/package_managers/yarn.rb +107 -0
  122. data/lib/license_finder/package_utils/activation.rb +40 -0
  123. data/lib/license_finder/package_utils/conan_info_parser.rb +77 -0
  124. data/lib/license_finder/package_utils/gradle_dependency_finder.rb +15 -0
  125. data/lib/license_finder/package_utils/license_files.rb +41 -0
  126. data/lib/license_finder/package_utils/licensing.rb +39 -0
  127. data/lib/license_finder/package_utils/maven_dependency_finder.rb +15 -0
  128. data/lib/license_finder/package_utils/notice_files.rb +40 -0
  129. data/lib/license_finder/package_utils/possible_license_file.rb +27 -0
  130. data/lib/license_finder/package_utils/pypi.rb +41 -0
  131. data/lib/license_finder/package_utils/sbt_dependency_finder.rb +15 -0
  132. data/lib/license_finder/packages/bower_package.rb +42 -0
  133. data/lib/license_finder/packages/bundler_package.rb +33 -0
  134. data/lib/license_finder/packages/cargo_package.rb +28 -0
  135. data/lib/license_finder/packages/carthage_package.rb +18 -0
  136. data/lib/license_finder/packages/cocoa_pods_package.rb +22 -0
  137. data/lib/license_finder/packages/composer_package.rb +13 -0
  138. data/lib/license_finder/packages/conan_package.rb +23 -0
  139. data/lib/license_finder/packages/conda_package.rb +74 -0
  140. data/lib/license_finder/packages/erlangmk_package.rb +114 -0
  141. data/lib/license_finder/packages/go_package.rb +32 -0
  142. data/lib/license_finder/packages/gradle_package.rb +30 -0
  143. data/lib/license_finder/packages/manual_package.rb +27 -0
  144. data/lib/license_finder/packages/maven_package.rb +27 -0
  145. data/lib/license_finder/packages/merged_package.rb +44 -0
  146. data/lib/license_finder/packages/mix_package.rb +13 -0
  147. data/lib/license_finder/packages/npm_package.rb +171 -0
  148. data/lib/license_finder/packages/nuget_package.rb +13 -0
  149. data/lib/license_finder/packages/pip_package.rb +50 -0
  150. data/lib/license_finder/packages/rebar_package.rb +13 -0
  151. data/lib/license_finder/packages/sbt_package.rb +22 -0
  152. data/lib/license_finder/packages/spm_package.rb +18 -0
  153. data/lib/license_finder/packages/yarn_package.rb +13 -0
  154. data/lib/license_finder/platform.rb +15 -0
  155. data/lib/license_finder/project_finder.rb +62 -0
  156. data/lib/license_finder/report.rb +33 -0
  157. data/lib/license_finder/reports/csv_report.rb +99 -0
  158. data/lib/license_finder/reports/diff_report.rb +29 -0
  159. data/lib/license_finder/reports/erb_report.rb +58 -0
  160. data/lib/license_finder/reports/html_report.rb +13 -0
  161. data/lib/license_finder/reports/json_report.rb +30 -0
  162. data/lib/license_finder/reports/junit_report.rb +19 -0
  163. data/lib/license_finder/reports/markdown_report.rb +9 -0
  164. data/lib/license_finder/reports/merged_report.rb +16 -0
  165. data/lib/license_finder/reports/templates/bootstrap.css +9 -0
  166. data/lib/license_finder/reports/templates/html_report.erb +113 -0
  167. data/lib/license_finder/reports/templates/junit_report.erb +41 -0
  168. data/lib/license_finder/reports/templates/markdown_report.erb +49 -0
  169. data/lib/license_finder/reports/templates/xml_report.erb +19 -0
  170. data/lib/license_finder/reports/text_report.rb +12 -0
  171. data/lib/license_finder/reports/xml_report.rb +19 -0
  172. data/lib/license_finder/scanner.rb +83 -0
  173. data/lib/license_finder/shared_helpers/cmd.rb +13 -0
  174. data/lib/license_finder/shared_helpers/common_path.rb +29 -0
  175. data/lib/license_finder/version.rb +6 -0
  176. data/lib/license_finder.rb +14 -0
  177. data/license_finder.gemspec +72 -0
  178. data/release/instructions.md +8 -0
  179. data/swift-all-keys.asc +240 -0
  180. metadata +544 -0
@@ -0,0 +1,221 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'license_finder/report'
4
+ require 'license_finder/version'
5
+ require 'license_finder/diff'
6
+ require 'license_finder/package_delta'
7
+ require 'license_finder/license_aggregator'
8
+ require 'license_finder/project_finder'
9
+ require 'license_finder/logger'
10
+
11
+ module LicenseFinder
12
+ module CLI
13
+ class Main < Base
14
+ extend Rootcommand
15
+
16
+ FORMATS = {
17
+ 'text' => TextReport,
18
+ 'html' => HtmlReport,
19
+ 'markdown' => MarkdownReport,
20
+ 'csv' => CsvReport,
21
+ 'xml' => XmlReport,
22
+ 'json' => JsonReport,
23
+ 'junit' => JunitReport
24
+ }.freeze
25
+
26
+ class_option :go_full_version, desc: 'Whether dependency version should include full version. Only meaningful if used with a Go project. Defaults to false.'
27
+ class_option :gradle_include_groups, desc: 'Whether dependency name should include group id. Only meaningful if used with a Java/gradle project. Defaults to false.'
28
+ class_option :gradle_command,
29
+ desc: "Command to use when fetching gradle packages. Only meaningful if used with a Java/gradle project.
30
+ Defaults to 'gradlew' / 'gradlew.bat' if the wrapper is present, otherwise to 'gradle'."
31
+ class_option :maven_include_groups, desc: 'Whether dependency name should include group id. Only meaningful if used with a Java/maven project. Defaults to false.'
32
+ class_option :maven_options, desc: 'Maven options to append to command. Defaults to empty.'
33
+ class_option :npm_options, desc: 'npm options to append to command. Defaults to empty.'
34
+ class_option :pip_requirements_path, desc: 'Path to python requirements file. Defaults to requirements.txt.'
35
+ class_option :python_version, desc: 'Python version to invoke pip with. Valid versions: 2 or 3. Default: 2'
36
+ class_option :rebar_command, desc: "Command to use when fetching rebar packages. Only meaningful if used with a Erlang/rebar project. Defaults to 'rebar'."
37
+ class_option :rebar_deps_dir, desc: "Path to rebar dependencies directory. Only meaningful if used with a Erlang/rebar project. Defaults to 'deps'."
38
+ class_option :elixir_command, desc: "Command to use when parsing package metadata for Mix. Only meaningful if used with a Mix project (i.e., Elixir or Erlang). Defaults to 'elixir'."
39
+ class_option :mix_command, desc: "Command to use when fetching packages through Mix. Only meaningful if used with a Mix project (i.e., Elixir or Erlang). Defaults to 'mix'."
40
+ class_option :mix_deps_dir, desc: "Path to Mix dependencies directory. Only meaningful if used with a Mix project (i.e., Elixir or Erlang). Defaults to 'deps'."
41
+ class_option :sbt_include_groups, desc: 'Whether dependency name should include group id. Only meaningful if used with a Scala/sbt project. Defaults to false.'
42
+ class_option :conda_bash_setup_script, desc: "Path to conda.sh script. Only meaningful if used with a Conda project. Defaults to '~/miniconda3/etc/profile.d/conda.sh'."
43
+ class_option :composer_check_require_only,
44
+ desc: "Whether to only check for licenses from dependencies on the 'require' section. Only meaningful if used with a Composer project. Defaults to false."
45
+
46
+ # Method options which are shared between report and action_item
47
+ def self.format_option
48
+ method_option :format,
49
+ desc: 'Emit detailed info about what LicenseFinder is doing',
50
+ default: 'text',
51
+ enum: FORMATS.keys
52
+ end
53
+
54
+ def self.shared_options
55
+ method_option :debug,
56
+ aliases: '-d',
57
+ type: :boolean,
58
+ desc: 'Emit detailed info about what LicenseFinder is doing'
59
+
60
+ method_option :prepare,
61
+ aliases: '-p',
62
+ type: :boolean,
63
+ desc: 'Prepares the project first for license_finder',
64
+ default: false,
65
+ required: false
66
+
67
+ method_option :prepare_no_fail,
68
+ type: :boolean,
69
+ desc: 'Prepares the project first for license_finder but carries on despite any potential failures',
70
+ default: false,
71
+ required: false
72
+
73
+ method_option :recursive,
74
+ aliases: '-r',
75
+ type: :boolean,
76
+ default: false,
77
+ desc: 'Recursively runs License Finder on all sub-projects'
78
+
79
+ method_option :aggregate_paths,
80
+ aliases: '-a',
81
+ type: :array,
82
+ desc: "Generate a single report for multiple projects. Ex: --aggregate_paths='path/to/project1' 'path/to/project2'"
83
+
84
+ method_option :quiet,
85
+ aliases: '-q',
86
+ type: :boolean,
87
+ desc: 'Silences progress report',
88
+ required: false
89
+
90
+ method_option :columns,
91
+ desc: "For text or CSV reports, which columns to print. Pick from: #{CsvReport::AVAILABLE_COLUMNS}",
92
+ type: :array
93
+ end
94
+
95
+ desc 'project_roots', 'List project directories to be scanned'
96
+ shared_options
97
+ def project_roots
98
+ config.strict_matching = true
99
+ project_path = config.project_path.to_s || Pathname.pwd.to_s
100
+ paths = aggregate_paths
101
+ filtered_project_roots = Scanner.remove_subprojects(paths)
102
+
103
+ filtered_project_roots << project_path if aggregate_paths.include?(project_path) && !filtered_project_roots.include?(project_path)
104
+
105
+ say(filtered_project_roots)
106
+ end
107
+
108
+ desc 'action_items', 'List unapproved dependencies (the default action for `license_finder`)'
109
+ shared_options
110
+ format_option
111
+ def action_items
112
+ finder = LicenseAggregator.new(config, aggregate_paths)
113
+ any_packages = finder.any_packages?
114
+ unapproved = finder.unapproved
115
+ restricted = finder.restricted
116
+
117
+ # Ensure to start output on a new line even with dot progress indicators.
118
+ say "\n"
119
+
120
+ unless any_packages
121
+ say 'No dependencies recognized!', :red
122
+ exit 0
123
+ end
124
+
125
+ if unapproved.empty?
126
+ say 'All dependencies are approved for use', :green
127
+ else
128
+ unless restricted.empty?
129
+ say 'Restricted dependencies:', :red
130
+ say report_of(restricted)
131
+ end
132
+
133
+ other_unapproved = unapproved - restricted
134
+ unless other_unapproved.empty?
135
+ say 'Dependencies that need approval:', :yellow
136
+ say report_of(other_unapproved)
137
+ end
138
+
139
+ exit 1
140
+ end
141
+ end
142
+
143
+ default_task :action_items
144
+
145
+ desc 'report', "Print a report of the project's dependencies to stdout"
146
+ shared_options
147
+ format_option
148
+ method_option :write_headers, type: :boolean, desc: 'Write exported columns as header row (csv).', default: false, required: false
149
+ method_option :save, desc: "Save report to a file. Default: 'license_report.csv' in project root.", lazy_default: 'license_report'
150
+
151
+ def report
152
+ finder = LicenseAggregator.new(config, aggregate_paths)
153
+ report = report_of(finder.dependencies)
154
+ save? ? save_report(report, config.save_file) : say(report)
155
+ end
156
+
157
+ desc 'version', 'Print the version of LicenseFinder'
158
+ def version
159
+ puts LicenseFinder::VERSION
160
+ end
161
+
162
+ desc 'diff OLDFILE NEWFILE', 'Command to view the differences between two generated reports (csv).'
163
+ format_option
164
+ method_option :save, desc: "Save report to a file. Default: 'license_report.csv' in project root.", lazy_default: 'license_report'
165
+ def diff(file1, file2)
166
+ f1 = IO.read(file1)
167
+ f2 = IO.read(file2)
168
+ report = DiffReport.new(Diff.compare(f1, f2))
169
+ save? ? save_report(report, config.save_file) : say(report)
170
+ end
171
+
172
+ subcommand 'dependencies', Dependencies, 'Add or remove dependencies that your package managers are not aware of'
173
+ subcommand 'licenses', Licenses, "Set a dependency's licenses, if the licenses found by license_finder are missing or wrong"
174
+ subcommand 'approvals', Approvals, 'Manually approve dependencies, even if their licenses are not permitted'
175
+ subcommand 'ignored_groups', IgnoredGroups, 'Exclude test and development dependencies from action items and reports'
176
+ subcommand 'ignored_dependencies', IgnoredDependencies, 'Exclude individual dependencies from action items and reports'
177
+ subcommand 'permitted_licenses', PermittedLicenses, 'Automatically approve any dependency that has a permitted license'
178
+ subcommand 'restricted_licenses', RestrictedLicenses, 'Forbid approval of any dependency whose licenses are all restricted'
179
+ subcommand 'project_name', ProjectName, 'Set the project name, for display in reports'
180
+ subcommand 'inherited_decisions', InheritedDecisions, 'Add or remove decision files you want to inherit from'
181
+
182
+ private
183
+
184
+ def check_valid_project_path
185
+ raise "Project path '#{config.project_path}' does not exist!" unless config.valid_project_path?
186
+ end
187
+
188
+ def aggregate_paths
189
+ check_valid_project_path
190
+ aggregate_paths = config.aggregate_paths
191
+ project_path = config.project_path.to_s || Pathname.pwd.to_s
192
+ aggregate_paths = ProjectFinder.new(project_path, config.strict_matching).find_projects if config.recursive
193
+
194
+ if aggregate_paths.nil? || aggregate_paths.empty?
195
+ [project_path]
196
+ else
197
+ aggregate_paths
198
+ end
199
+ end
200
+
201
+ def save_report(content, file_name)
202
+ dir = File.dirname(file_name)
203
+ FileUtils.mkdir_p(dir) unless Dir.exist?(dir)
204
+
205
+ File.open(file_name, 'w') do |f|
206
+ f.write(content)
207
+ end
208
+ end
209
+
210
+ def report_of(content)
211
+ report = FORMATS[config.format] || FORMATS['text']
212
+ report = MergedReport if report == CsvReport && config.aggregate_paths
213
+ report.of(content, columns: config.columns, project_name: decisions.project_name || config.project_path.basename.to_s, write_headers: config.write_headers)
214
+ end
215
+
216
+ def save?
217
+ !!config.save_file
218
+ end
219
+ end
220
+ end
221
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseFinder
4
+ module CLI
5
+ module MakesDecisions
6
+ def self.included(mod)
7
+ mod.extend(ClassMethods)
8
+ end
9
+
10
+ module ClassMethods
11
+ def auditable
12
+ method_option :who, desc: 'The person making this decision'
13
+ method_option :why, desc: 'The reason for making this decision'
14
+ end
15
+
16
+ def approvable
17
+ method_option :version, desc: 'The version that will be approved'
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def txn
24
+ @txn ||= {
25
+ who: options[:who],
26
+ why: options[:why],
27
+ versions: options[:version] ? [options[:version]] : [],
28
+ when: Time.now.getutc
29
+ }
30
+ end
31
+
32
+ def modifying
33
+ yield
34
+ decisions.save!(config.decisions_file_path)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseFinder
4
+ module CLI
5
+ module Rootcommand
6
+ # Helper to auto-generate the documentation for a group of commands
7
+ def subcommand(namespace, klass, namespace_description)
8
+ description = "#{namespace} [#{(klass.tasks.keys - ['help']).join('|')}]"
9
+ desc description, "#{namespace_description} - see `license_finder #{namespace} help` for more information"
10
+ super namespace, klass
11
+ end
12
+ end
13
+
14
+ # Thor fix for `license_finder <subcommand> help <action>`
15
+ module Subcommand
16
+ # Hack to override the help message produced by Thor.
17
+ # https://github.com/wycats/thor/issues/261#issuecomment-16880836
18
+ def banner(command, _namespace = nil, _subcommand = nil)
19
+ "#{basename} #{underscore_name(name)} #{command.usage}"
20
+ end
21
+
22
+ protected
23
+
24
+ def underscore_name(name)
25
+ underscored = name.split('::').last
26
+ underscored.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
27
+ underscored.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
28
+ underscored.tr!('-', '_')
29
+ underscored.downcase
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseFinder
4
+ module CLI
5
+ class PermittedLicenses < Base
6
+ extend Subcommand
7
+ include MakesDecisions
8
+
9
+ desc 'list', 'List all the permitted licenses'
10
+ def list
11
+ say 'Permitted Licenses:', :blue
12
+ say_each(decisions.permitted, &:name)
13
+ end
14
+
15
+ auditable
16
+ desc 'add LICENSE...', 'Add one or more licenses to the permitted licenses'
17
+ def add(*licenses)
18
+ assert_some licenses
19
+ modifying { licenses.each { |l| decisions.permit(l, txn) } }
20
+ say "Added #{licenses.join(', ')} to the permitted licenses"
21
+ end
22
+
23
+ auditable
24
+ desc 'remove LICENSE...', 'Remove one or more licenses from the permitted licenses'
25
+ def remove(*licenses)
26
+ assert_some licenses
27
+ modifying { licenses.each { |l| decisions.unpermit(l, txn) } }
28
+ say "Removed #{licenses.join(', ')} from the license permitted licenses"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseFinder
4
+ module CLI
5
+ class ProjectName < Base
6
+ extend Subcommand
7
+ include MakesDecisions
8
+
9
+ desc 'show', 'Show the project name'
10
+ def show
11
+ say 'Project Name:', :blue
12
+ say decisions.project_name
13
+ end
14
+
15
+ auditable
16
+ desc 'add NAME', 'Set the project name'
17
+ def add(name)
18
+ modifying { decisions.name_project(name, txn) }
19
+
20
+ say "Set the project name to #{name}", :green
21
+ end
22
+
23
+ auditable
24
+ desc 'remove', 'Remove the project name'
25
+ def remove
26
+ modifying { decisions.unname_project(txn) }
27
+
28
+ say 'Removed the project name'
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseFinder
4
+ module CLI
5
+ class RestrictedLicenses < Base
6
+ extend Subcommand
7
+ include MakesDecisions
8
+
9
+ desc 'list', 'List all the restricted licenses'
10
+ def list
11
+ say 'Restricted Licenses:', :blue
12
+ say_each(decisions.restricted, &:name)
13
+ end
14
+
15
+ auditable
16
+ desc 'add LICENSE...', 'Add one or more licenses to the restricted licenses'
17
+ def add(*licenses)
18
+ assert_some licenses
19
+ modifying { licenses.each { |l| decisions.restrict(l, txn) } }
20
+ say "Added #{licenses.join(', ')} to the restricted licenses"
21
+ end
22
+
23
+ auditable
24
+ desc 'remove LICENSE...', 'Remove one or more licenses from the restricted licenses'
25
+ def remove(*licenses)
26
+ assert_some licenses
27
+ modifying { licenses.each { |l| decisions.unrestrict(l, txn) } }
28
+ say "Removed #{licenses.join(', ')} from the restricted licenses"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LicenseFinder
4
+ module CLI
5
+ end
6
+ end
7
+
8
+ require 'license_finder/cli/patched_thor'
9
+ require 'license_finder/cli/base'
10
+ require 'license_finder/cli/makes_decisions'
11
+ require 'license_finder/cli/inherited_decisions'
12
+ require 'license_finder/cli/permitted_licenses'
13
+ require 'license_finder/cli/restricted_licenses'
14
+ require 'license_finder/cli/dependencies'
15
+ require 'license_finder/cli/licenses'
16
+ require 'license_finder/cli/approvals'
17
+ require 'license_finder/cli/ignored_groups'
18
+ require 'license_finder/cli/ignored_dependencies'
19
+ require 'license_finder/cli/project_name'
20
+ require 'license_finder/cli/main'
@@ -0,0 +1,186 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'platform'
4
+
5
+ module LicenseFinder
6
+ class Configuration
7
+ def self.with_optional_saved_config(primary_config)
8
+ project_path = Pathname(primary_config.fetch(:project_path, Pathname.pwd)).expand_path
9
+ config_file = project_path.join('config', 'license_finder.yml')
10
+ saved_config = config_file.exist? ? YAML.safe_load(config_file.read) : {}
11
+ new(primary_config, saved_config)
12
+ end
13
+
14
+ def initialize(primary_config, saved_config)
15
+ @primary_config = primary_config
16
+ @saved_config = saved_config
17
+ end
18
+
19
+ def valid_project_path?
20
+ return project_path.exist? if get(:project_path)
21
+
22
+ true
23
+ end
24
+
25
+ def elixir_command
26
+ get(:elixir_command) || 'elixir'
27
+ end
28
+
29
+ def mix_command
30
+ get(:mix_command) || 'mix'
31
+ end
32
+
33
+ def merge(other_hash)
34
+ dup_with other_hash
35
+ end
36
+
37
+ def rebar_deps_dir
38
+ path = get(:rebar_deps_dir) || '_build/default/lib'
39
+ project_path.join(path).expand_path
40
+ end
41
+
42
+ def mix_deps_dir
43
+ path = get(:mix_deps_dir) || 'deps'
44
+ project_path.join(path).expand_path
45
+ end
46
+
47
+ def decisions_file_path
48
+ path = File.join(project_path, 'doc/dependency_decisions.yml') unless project_path.nil?
49
+ path = get(:decisions_file) unless get(:decisions_file).nil?
50
+ path = 'doc/dependency_decisions.yml' if path.nil?
51
+ Pathname.new(path)
52
+ end
53
+
54
+ def log_directory
55
+ path = get(:log_directory) || 'lf_logs'
56
+
57
+ if (aggregate_paths || recursive) && project_path == ''
58
+ Pathname(path).expand_path
59
+ else
60
+ project_path.join(path).expand_path
61
+ end
62
+ end
63
+
64
+ def project_path
65
+ Pathname(path_prefix).expand_path
66
+ end
67
+
68
+ def enabled_package_manager_ids
69
+ get(:enabled_package_managers)
70
+ end
71
+
72
+ def logger_mode
73
+ get(:logger)
74
+ end
75
+
76
+ def gradle_command
77
+ get(:gradle_command)
78
+ end
79
+
80
+ def go_full_version
81
+ get(:go_full_version)
82
+ end
83
+
84
+ def gradle_include_groups
85
+ get(:gradle_include_groups)
86
+ end
87
+
88
+ def maven_include_groups
89
+ get(:maven_include_groups)
90
+ end
91
+
92
+ def maven_options
93
+ get(:maven_options)
94
+ end
95
+
96
+ def npm_options
97
+ get(:npm_options)
98
+ end
99
+
100
+ def pip_requirements_path
101
+ get(:pip_requirements_path)
102
+ end
103
+
104
+ def conda_bash_setup_script
105
+ get(:conda_bash_setup_script)
106
+ end
107
+
108
+ def python_version
109
+ get(:python_version)
110
+ end
111
+
112
+ def rebar_command
113
+ get(:rebar_command)
114
+ end
115
+
116
+ def prepare
117
+ get(:prepare) || prepare_no_fail
118
+ end
119
+
120
+ def prepare_no_fail
121
+ get(:prepare_no_fail)
122
+ end
123
+
124
+ def write_headers
125
+ get(:write_headers)
126
+ end
127
+
128
+ def save_file
129
+ get(:save)
130
+ end
131
+
132
+ def aggregate_paths
133
+ get(:aggregate_paths)
134
+ end
135
+
136
+ def recursive
137
+ get(:recursive)
138
+ end
139
+
140
+ def format
141
+ get(:format)
142
+ end
143
+
144
+ def columns
145
+ get(:columns)
146
+ end
147
+
148
+ def sbt_include_groups
149
+ get(:sbt_include_groups)
150
+ end
151
+
152
+ def composer_check_require_only
153
+ get(:composer_check_require_only)
154
+ end
155
+
156
+ attr_writer :strict_matching
157
+
158
+ attr_reader :strict_matching
159
+
160
+ protected
161
+
162
+ attr_accessor :primary_config
163
+ def dup_with(other_hash)
164
+ dup.tap do |dup|
165
+ dup.primary_config.merge!(other_hash)
166
+ end
167
+ end
168
+
169
+ private
170
+
171
+ attr_reader :saved_config
172
+
173
+ def get(key)
174
+ @primary_config[key.to_sym] || @saved_config[key.to_s]
175
+ end
176
+
177
+ def initialize_copy(orig)
178
+ super
179
+ @primary_config = @primary_config.dup
180
+ end
181
+
182
+ def path_prefix
183
+ get(:project_path) || ''
184
+ end
185
+ end
186
+ end