class ParallelInstaller
Public Class Methods
call(*args)
click to toggle source
# File lib/bundler/installer/parallel_installer.rb, line 55 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 60 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 64 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 72 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 99 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 108 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 92 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 79 def worker_pool @worker_pool ||= Bundler::Worker.new @size, lambda { |spec_install, worker_num| message = @installer.install_gem_from_spec spec_install.spec, @standalone, worker_num, @force spec_install.post_install_message = message unless message.nil? spec_install } end