lib/spandx/cli/commands/scan.rb in spandx-0.12.3 vs lib/spandx/cli/commands/scan.rb in spandx-0.13.0

- old
+ new

@@ -2,63 +2,69 @@ module Spandx module Cli module Commands class Scan + NULL_BAR = Class.new do + def advance(*args); end + end.new + attr_reader :scan_path def initialize(scan_path, options) @scan_path = ::Pathname.new(scan_path) @options = options require(options[:require]) if options[:require] end def execute(output: $stdout) - report = ::Spandx::Core::Report.new - each_file_in(scan_path) do |file| - each_dependency_from(file) do |dependency| - report.add(dependency) + Spandx::Core::ThreadPool.open do |pool| + report = ::Spandx::Core::Report.new + each_file do |file| + each_dependency_from(file, pool) do |dependency| + report.add(dependency) + end end + output.puts(format(report.to(@options[:format]))) end - output.puts(format(report.to(@options[:format]))) end private - def recursive? - @options['recursive'] + def each_file + Spandx::Core::PathTraversal + .new(scan_path, recursive: @options['recursive']) + .each { |file| yield file } end - def each_file_in(dir, &block) - files = File.directory?(dir) ? Dir.glob(File.join(dir, '*')) : [dir] - files.each do |file| - if File.directory?(file) - each_file_in(file, &block) if recursive? - else - Spandx.logger.debug(file) - block.call(file) + def each_dependency_from(file, pool) + dependencies = ::Spandx::Core::Parser.for(file).parse(file) + with_progress(title_for(file), dependencies.size) do |bar| + ::Spandx::Core::Concurrent + .map(dependencies, pool: pool) { |dependency| enhance(dependency) } + .each do |dependency| + bar.advance(1) + yield dependency end end end - def each_dependency_from(file) - ::Spandx::Core::Parser - .for(file) - .parse(file) - .map { |dependency| enhance(dependency) } - .each { |dependency| yield dependency } - rescue StandardError => error - Spandx.logger.error(error) - end - def format(output) Array(output).map(&:to_s) end def enhance(dependency) ::Spandx::Core::Plugin .all .inject(dependency) { |memo, plugin| plugin.enhance(memo) } + end + + def title_for(file) + "#{file} [:bar, :elapsed] :percent" + end + + def with_progress(title, total) + yield @options[:show_progress] ? TTY::ProgressBar.new(title, total: total) : NULL_BAR end end end end end