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