license_finder-rubyzip3 7.2.1.1

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