class ParallelInstaller
Public Class Methods
call(*args)
click to toggle source
# File lib/bundler/installer/parallel_installer.rb, line 63 def self.call(*args) new(*args).call end
max_threads()
click to toggle source
Returns max number of threads machine can handle with a min of 1
# File lib/bundler/installer/parallel_installer.rb, line 68 def self.max_threads [Bundler.settings[:jobs].to_i - 1, 1].max end
new(installer, all_specs, size, standalone, force)
click to toggle source
# File lib/bundler/installer/parallel_installer.rb, line 72 def initialize(installer, all_specs, size, standalone, force) @installer = installer @size = size @standalone = standalone @force = force @specs = all_specs.map {|s| SpecInstallation.new(s) } end
Public Instance Methods
call()
click to toggle source
# File lib/bundler/installer/parallel_installer.rb, line 80 def call enqueue_specs process_specs until @specs.all?(&:installed?) ensure worker_pool && worker_pool.stop end
collect_post_install_message(spec)
click to toggle source
# File lib/bundler/installer/parallel_installer.rb, line 109 def collect_post_install_message(spec) Bundler::Installer.post_install_messages[spec.name] = spec.post_install_message end
enqueue_specs()
click to toggle source
Keys in the remains hash represent uninstalled gems specs. We enqueue all gem specs that do not have any dependencies. Later we call this lambda again to install specs that depended on previously installed specifications. We continue until all specs are installed.
# File lib/bundler/installer/parallel_installer.rb, line 118 def enqueue_specs @specs.select(&:ready_to_enqueue?).each do |spec| if spec.dependencies_installed? @specs worker_pool.enq spec spec.state = :enqueued end end end
process_specs()
click to toggle source
Dequeue a spec and save its post-install message and then enqueue the remaining specs. Some specs might've had to wait til this spec was installed to be processed so the call to `enqueue_specs` is important after every dequeue.
# File lib/bundler/installer/parallel_installer.rb, line 102 def process_specs spec = worker_pool.deq spec.state = :installed collect_post_install_message spec if spec.has_post_install_message? enqueue_specs end
worker_pool()
click to toggle source
# File lib/bundler/installer/parallel_installer.rb, line 87 def worker_pool @worker_pool ||= Bundler::Worker.new @size, "Parallel Installer", lambda { |spec_install, worker_num| message = Bundler::GemInstaller.new( spec_install.spec, @installer, @standalone, worker_num, @force ).install_from_spec spec_install.post_install_message = message unless message.nil? spec_install } end