summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormo khan <mo.khan@gmail.com>2020-05-15 16:17:15 -0600
committermo khan <mo.khan@gmail.com>2020-05-15 16:17:15 -0600
commitab4276bd4eef5d88b3ac0f4c44defa8b68cb14bf (patch)
tree7a28e6ef75e610c15398d8e6742d89527e9c964b
parentbad4a70e1588b282505a3f31ca04ee5cce2a3efe (diff)
Extract concurrent class
-rw-r--r--lib/spandx/cli/commands/scan.rb17
-rw-r--r--lib/spandx/core/concurrent.rb42
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