class ParallelInstaller
Public Class Methods
call(*args)
click to toggle source
# File lib/bundler/installer/parallel_installer.rb, line 62 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 67 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 71 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 79 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 108 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 117 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 101 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 86 def worker_pool @worker_pool ||= Bundler::Worker.new @size, 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