diff --git a/lib/license_finder/cli/approvals.rb b/lib/license_finder/cli/approvals.rb index 7b7b39cf..2b7bd10a 100644 --- a/lib/license_finder/cli/approvals.rb +++ b/lib/license_finder/cli/approvals.rb @@ -13,7 +13,7 @@ def add(*names) assert_some names modifying { names.each { |name| decisions.approve(name, txn) } } - say "The #{names.join(', ')} dependency has been approved!", :green + printer.say "The #{names.join(', ')} dependency has been approved!", :green end auditable @@ -21,7 +21,7 @@ def add(*names) def remove(dep) modifying { decisions.unapprove(dep, txn) } - say "The dependency #{dep} no longer has a manual approval" + printer.say "The dependency #{dep} no longer has a manual approval" end end end diff --git a/lib/license_finder/cli/base.rb b/lib/license_finder/cli/base.rb index 524ad9d0..3c7d4c53 100644 --- a/lib/license_finder/cli/base.rb +++ b/lib/license_finder/cli/base.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require 'thor' - module LicenseFinder module CLI class Base < Thor @@ -24,12 +23,16 @@ def decisions def config @config ||= Configuration.with_optional_saved_config(license_finder_config) end + + def printer + @printer || Printer.new + end end private def fail(message) - say(message) && exit(1) + printer.say(message) && exit(1) end def license_finder_config @@ -85,10 +88,10 @@ def logger_mode def say_each(coll) if coll.any? coll.each do |item| - say(block_given? ? yield(item) : item) + printer.say(block_given? ? yield(item) : item) end else - say '(none)' + printer.say '(none)' end end diff --git a/lib/license_finder/cli/dependencies.rb b/lib/license_finder/cli/dependencies.rb index bd28abe7..4dce1775 100644 --- a/lib/license_finder/cli/dependencies.rb +++ b/lib/license_finder/cli/dependencies.rb @@ -20,9 +20,9 @@ def add(name, license, version) decisions.approve(name, txn) if options[:approve] end if options[:approve] - say "The #{name} dependency has been added and approved!", :green + printer.say "The #{name} dependency has been added and approved!", :green else - say "The #{name} dependency has been added!", :green + printer.say "The #{name} dependency has been added!", :green end end @@ -31,12 +31,12 @@ def add(name, license, version) def remove(name) modifying { decisions.remove_package(name, txn) } - say "The #{name} dependency has been removed.", :green + printer.say "The #{name} dependency has been removed.", :green end desc 'list', 'List manually added dependencies' def list - say 'Manually Added Dependencies:', :blue + printer.say 'Manually Added Dependencies:', :blue say_each(decisions.packages, &:name) end end diff --git a/lib/license_finder/cli/ignored_dependencies.rb b/lib/license_finder/cli/ignored_dependencies.rb index b312cea1..308a25d9 100644 --- a/lib/license_finder/cli/ignored_dependencies.rb +++ b/lib/license_finder/cli/ignored_dependencies.rb @@ -8,7 +8,7 @@ class IgnoredDependencies < Base desc 'list', 'List all the ignored dependencies' def list - say 'Ignored Dependencies:', :blue + printer.say 'Ignored Dependencies:', :blue say_each(decisions.ignored) end @@ -17,7 +17,7 @@ def list def add(dep) modifying { decisions.ignore(dep, txn) } - say "Added #{dep} to the ignored dependencies" + printer.say "Added #{dep} to the ignored dependencies" end auditable @@ -25,7 +25,7 @@ def add(dep) def remove(dep) modifying { decisions.heed(dep, txn) } - say "Removed #{dep} from the ignored dependencies" + printer.say "Removed #{dep} from the ignored dependencies" end end end diff --git a/lib/license_finder/cli/ignored_groups.rb b/lib/license_finder/cli/ignored_groups.rb index 3133b534..637f0e32 100644 --- a/lib/license_finder/cli/ignored_groups.rb +++ b/lib/license_finder/cli/ignored_groups.rb @@ -8,7 +8,7 @@ class IgnoredGroups < Base desc 'list', 'List all the ignored groups' def list - say 'Ignored Groups:', :blue + printer.say 'Ignored Groups:', :blue say_each(decisions.ignored_groups) end @@ -17,7 +17,7 @@ def list def add(group) modifying { decisions.ignore_group(group, txn) } - say "Added #{group} to the ignored groups" + printer.say "Added #{group} to the ignored groups" end auditable @@ -25,7 +25,7 @@ def add(group) def remove(group) modifying { decisions.heed_group(group, txn) } - say "Removed #{group} from the ignored groups" + printer.say "Removed #{group} from the ignored groups" end end end diff --git a/lib/license_finder/cli/inherited_decisions.rb b/lib/license_finder/cli/inherited_decisions.rb index 6987686c..3656beda 100644 --- a/lib/license_finder/cli/inherited_decisions.rb +++ b/lib/license_finder/cli/inherited_decisions.rb @@ -8,7 +8,7 @@ class InheritedDecisions < Base desc 'list', 'List all the inherited decision files' def list - say 'Inherited Decision Files:', :blue + printer.say 'Inherited Decision Files:', :blue say_each(decisions.inherited_decisions) end @@ -17,7 +17,7 @@ def list def add(*decision_files) assert_some decision_files modifying { decision_files.each { |filepath| decisions.inherit_from(filepath) } } - say "Added #{decision_files.join(', ')} to the inherited decisions" + printer.say "Added #{decision_files.join(', ')} to the inherited decisions" end auditable @@ -26,7 +26,7 @@ def add_with_auth(*params) url, auth_type, token_or_env = params auth_info = { 'url' => url, 'authorization' => "#{auth_type} #{token_or_env}" } modifying { decisions.add_decision [:inherit_from, auth_info] } - say "Added #{url} to the inherited decisions" + printer.say "Added #{url} to the inherited decisions" end auditable @@ -34,7 +34,7 @@ def add_with_auth(*params) def remove(*decision_files) assert_some decision_files modifying { decision_files.each { |filepath| decisions.remove_inheritance(filepath) } } - say "Removed #{decision_files.join(', ')} from the inherited decisions" + printer.say "Removed #{decision_files.join(', ')} from the inherited decisions" end auditable @@ -43,7 +43,7 @@ def remove_with_auth(*params) url, auth_type, token_or_env = params auth_info = { 'url' => url, 'authorization' => "#{auth_type} #{token_or_env}" } modifying { decisions.remove_inheritance(auth_info) } - say "Removed #{url} from the inherited decisions" + printer.say "Removed #{url} from the inherited decisions" end end end diff --git a/lib/license_finder/cli/licenses.rb b/lib/license_finder/cli/licenses.rb index da2541d0..f99edc18 100644 --- a/lib/license_finder/cli/licenses.rb +++ b/lib/license_finder/cli/licenses.rb @@ -11,7 +11,7 @@ class Licenses < Base def add(name, license) modifying { decisions.license(name, license, txn) } - say "The #{name} dependency has been marked as using #{license} license!", :green + printer.say "The #{name} dependency has been marked as using #{license} license!", :green end auditable @@ -19,7 +19,7 @@ def add(name, license) def remove(dep, lic) modifying { decisions.unlicense(dep, lic, txn) } - say "The dependency #{dep} no longer has a manual license" + printer.say "The dependency #{dep} no longer has a manual license" end end end diff --git a/lib/license_finder/cli/main.rb b/lib/license_finder/cli/main.rb index 9177a359..357b6892 100644 --- a/lib/license_finder/cli/main.rb +++ b/lib/license_finder/cli/main.rb @@ -7,6 +7,7 @@ require 'license_finder/license_aggregator' require 'license_finder/project_finder' require 'license_finder/logger' +require 'license_finder/printer' module LicenseFinder module CLI @@ -107,7 +108,7 @@ def project_roots filtered_project_roots << project_path if aggregate_paths.include?(project_path) && !filtered_project_roots.include?(project_path) - say(filtered_project_roots) + printer.say(filtered_project_roots) end desc 'action_items', 'List unapproved dependencies (the default action for `license_finder`)' @@ -120,25 +121,25 @@ def action_items restricted = finder.restricted # Ensure to start output on a new line even with dot progress indicators. - say "\n" + printer.say "\n" unless any_packages - say 'No dependencies recognized!', :red + printer.say 'No dependencies recognized!', :red exit 0 end if unapproved.empty? - say 'All dependencies are approved for use', :green + printer.say 'All dependencies are approved for use', :green else unless restricted.empty? - say 'Restricted dependencies:', :red - say report_of(restricted) + printer.say 'Restricted dependencies:', :red + printer.say report_of(restricted) end other_unapproved = unapproved - restricted unless other_unapproved.empty? - say 'Dependencies that need approval:', :yellow - say report_of(other_unapproved) + printer.say 'Dependencies that need approval:', :yellow + printer.say report_of(other_unapproved) end exit 1 @@ -156,7 +157,7 @@ def action_items def report finder = LicenseAggregator.new(config, aggregate_paths) report = report_of(finder.dependencies) - save? ? save_report(report, config.save_file) : say(report) + save? ? save_report(report, config.save_file) : printer.say(report) end desc 'version', 'Print the version of LicenseFinder' @@ -171,7 +172,7 @@ def diff(file1, file2) f1 = IO.read(file1) f2 = IO.read(file2) report = DiffReport.new(Diff.compare(f1, f2)) - save? ? save_report(report, config.save_file) : say(report) + save? ? save_report(report, config.save_file) : printer.say(report) end subcommand 'dependencies', Dependencies, 'Add or remove dependencies that your package managers are not aware of' diff --git a/lib/license_finder/cli/permitted_licenses.rb b/lib/license_finder/cli/permitted_licenses.rb index 087cd6a0..a3773599 100644 --- a/lib/license_finder/cli/permitted_licenses.rb +++ b/lib/license_finder/cli/permitted_licenses.rb @@ -8,7 +8,7 @@ class PermittedLicenses < Base desc 'list', 'List all the permitted licenses' def list - say 'Permitted Licenses:', :blue + printer.say 'Permitted Licenses:', :blue say_each(decisions.permitted, &:name) end @@ -17,7 +17,7 @@ def list def add(*licenses) assert_some licenses modifying { licenses.each { |l| decisions.permit(l, txn) } } - say "Added #{licenses.join(', ')} to the permitted licenses" + printer.say "Added #{licenses.join(', ')} to the permitted licenses" end auditable @@ -25,7 +25,7 @@ def add(*licenses) def remove(*licenses) assert_some licenses modifying { licenses.each { |l| decisions.unpermit(l, txn) } } - say "Removed #{licenses.join(', ')} from the license permitted licenses" + printer.say "Removed #{licenses.join(', ')} from the license permitted licenses" end end end diff --git a/lib/license_finder/cli/project_name.rb b/lib/license_finder/cli/project_name.rb index 64a0b813..137e5b89 100644 --- a/lib/license_finder/cli/project_name.rb +++ b/lib/license_finder/cli/project_name.rb @@ -8,8 +8,8 @@ class ProjectName < Base desc 'show', 'Show the project name' def show - say 'Project Name:', :blue - say decisions.project_name + printer.say 'Project Name:', :blue + printer.say decisions.project_name end auditable @@ -17,7 +17,7 @@ def show def add(name) modifying { decisions.name_project(name, txn) } - say "Set the project name to #{name}", :green + printer.say "Set the project name to #{name}", :green end auditable @@ -25,7 +25,7 @@ def add(name) def remove modifying { decisions.unname_project(txn) } - say 'Removed the project name' + printer.say 'Removed the project name' end end end diff --git a/lib/license_finder/cli/restricted_licenses.rb b/lib/license_finder/cli/restricted_licenses.rb index cec34c20..43721c5e 100644 --- a/lib/license_finder/cli/restricted_licenses.rb +++ b/lib/license_finder/cli/restricted_licenses.rb @@ -8,7 +8,7 @@ class RestrictedLicenses < Base desc 'list', 'List all the restricted licenses' def list - say 'Restricted Licenses:', :blue + printer.say 'Restricted Licenses:', :blue say_each(decisions.restricted, &:name) end @@ -17,7 +17,7 @@ def list def add(*licenses) assert_some licenses modifying { licenses.each { |l| decisions.restrict(l, txn) } } - say "Added #{licenses.join(', ')} to the restricted licenses" + printer.say "Added #{licenses.join(', ')} to the restricted licenses" end auditable @@ -25,7 +25,7 @@ def add(*licenses) def remove(*licenses) assert_some licenses modifying { licenses.each { |l| decisions.unrestrict(l, txn) } } - say "Removed #{licenses.join(', ')} from the restricted licenses" + printer.say "Removed #{licenses.join(', ')} from the restricted licenses" end end end diff --git a/lib/license_finder/core.rb b/lib/license_finder/core.rb index 74ecfc0e..7b98c555 100644 --- a/lib/license_finder/core.rb +++ b/lib/license_finder/core.rb @@ -21,6 +21,10 @@ def self.default_logger Logger.new end + # def self.default_printer + # Printer.new + # end + # Default +options+: # { # project_path: Pathname.pwd @@ -31,6 +35,7 @@ def self.default_logger # rebar_deps_dir: "deps", # } def initialize(configuration) + @printer = Printer.new @logger = Logger.new(configuration.logger_mode) @config = configuration @scanner = Scanner.new(options) @@ -68,7 +73,7 @@ def prepare_projects private - attr_reader :logger + attr_reader :logger, :printer # The core of the system. The saved decisions are applied to the current # packages. diff --git a/lib/license_finder/printer.rb b/lib/license_finder/printer.rb new file mode 100644 index 00000000..7bc7c47e --- /dev/null +++ b/lib/license_finder/printer.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +module LicenseFinder + class Printer + attr_reader :padding + + def initialize #:nodoc: + @base = nil + @mute = false + @padding = 0 + @always_force = false + end + + def say(message = '', color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/)) + buffer = prepare_message(message, *color) + buffer << "\n" if force_new_line && !message.to_s.end_with?("\n") + + stdout.print(buffer) + stdout.flush + end + + def prepare_message(message, *color) + spaces = ' ' * padding + spaces + set_color(message.to_s, *color) + end + + def set_color(string, *) #:nodoc: + string + end + + def padding=(value) + @padding = [0, value].max + end + + def stdout + $stdout + end + end +end diff --git a/license_finder.gemspec b/license_finder.gemspec index d72357d6..ae6b7f9f 100644 --- a/license_finder.gemspec +++ b/license_finder.gemspec @@ -45,7 +45,7 @@ Gem::Specification.new do |s| s.add_dependency 'bundler' s.add_dependency 'rubyzip', '>=1', '<3' - s.add_dependency 'thor', '~> 1.0.1' + s.add_dependency 'thor', '~> 1.2' s.add_dependency 'tomlrb', '>= 1.3', '< 2.1' s.add_dependency 'with_env', '1.1.0' s.add_dependency 'xml-simple', '~> 1.1.5' @@ -57,16 +57,16 @@ Gem::Specification.new do |s| s.add_development_dependency 'fakefs', '~> 1.4.1' s.add_development_dependency 'matrix', '~> 0.1.0' s.add_development_dependency 'mime-types', '3.4.1' - s.add_development_dependency 'pry', '~> 0.14.0' - s.add_development_dependency 'rake', '~> 13.0.1' + s.add_development_dependency 'pry', '~> 0.14.1' + s.add_development_dependency 'rake', '~> 13.0.6' s.add_development_dependency 'rspec', '~> 3' s.add_development_dependency 'rspec-its', '~> 1.3.0' - s.add_development_dependency 'rubocop', '~> 0.81.0' - s.add_development_dependency 'rubocop-performance', '~> 1.5.0' + s.add_development_dependency 'rubocop', '~> 1.25.1' + s.add_development_dependency 'rubocop-performance', '~> 1.13.2' s.add_development_dependency 'webmock', '~> 3.14' s.add_development_dependency 'nokogiri', '~>1.10' - s.add_development_dependency 'rack', '~> 2.2.2' + s.add_development_dependency 'rack', '~> 2.2.3' s.add_development_dependency 'rack-test', '~> 1.1.0', '> 0.7' s.files = `git ls-files`.split("\n").reject { |f| f.start_with?('spec', 'features') } diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 505aa02e..6cf5b143 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -8,8 +8,6 @@ require 'webmock/rspec' require 'rspec/its' -require 'pry' - Dir[File.join(File.dirname(__FILE__), 'support', '**', '*.rb')].sort.each do |file| require file end