diff options
| author | mo khan <mo.khan@gmail.com> | 2020-05-15 16:17:15 -0600 |
|---|---|---|
| committer | mo khan <mo.khan@gmail.com> | 2020-05-15 16:17:15 -0600 |
| commit | ab4276bd4eef5d88b3ac0f4c44defa8b68cb14bf (patch) | |
| tree | 7a28e6ef75e610c15398d8e6742d89527e9c964b /lib | |
| parent | bad4a70e1588b282505a3f31ca04ee5cce2a3efe (diff) | |
Extract concurrent class
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/spandx/cli/commands/scan.rb | 17 | ||||
| -rw-r--r-- | lib/spandx/core/concurrent.rb | 42 |
2 files changed, 52 insertions, 7 deletions
diff --git a/lib/spandx/cli/commands/scan.rb b/lib/spandx/cli/commands/scan.rb index 9c864de..dbc6d9b 100644 --- a/lib/spandx/cli/commands/scan.rb +++ b/lib/spandx/cli/commands/scan.rb @@ -32,14 +32,13 @@ module Spandx def each_dependency_from(file) dependencies = ::Spandx::Core::Parser.for(file).parse(file) - bar = TTY::ProgressBar.new("#{file} [:bar, :elapsed] :percent", total: dependencies.size) - queue = Queue.new - dependencies.each do |dependency| - Spandx.thread_pool.schedule(dependency) { |item| queue.enq(enhance(item)) } - end - dependencies.size.times do - yield queue.deq + bar = TTY::ProgressBar.new(title_for(file), total: dependencies.size) + + ::Spandx::Core::Concurrent + .map(dependencies) { |dependency| enhance(dependency) } + .each do |dependency| bar.advance(1) + yield dependency end end @@ -52,6 +51,10 @@ module Spandx .all .inject(dependency) { |memo, plugin| plugin.enhance(memo) } end + + def title_for(file) + "#{file} [:bar, :elapsed] :percent" + end end end end diff --git a/lib/spandx/core/concurrent.rb b/lib/spandx/core/concurrent.rb new file mode 100644 index 0000000..2cefbee --- /dev/null +++ b/lib/spandx/core/concurrent.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module Spandx + module Core + class Concurrent + include Enumerable + + def self.map(items, pool: Spandx.thread_pool) + queue = Queue.new + + items.each do |item| + pool.schedule(item) do |marshalled_item| + queue.enq(yield(marshalled_item)) + end + end + + new(queue, items.size) + end + + attr_reader :queue, :size + + def initialize(queue, size) + @queue = queue + @size = size + end + + def each + size.times do |_n| + yield queue.deq + end + end + + def to_enum + Enumerator.new do |yielder| + each do |item| + yielder.yield item + end + end + end + end + end +end |
