Class: ParallelInstaller
- Inherits:
-
Object
- Object
- ParallelInstaller
- Defined in:
- lib/bundler/installer/parallel_installer.rb
Defined Under Namespace
Classes: SpecInstallation
Class Method Summary collapse
- .call(*args) ⇒ Object
-
.max_threads ⇒ Object
Returns max number of threads machine can handle with a min of 1.
Instance Method Summary collapse
- #call ⇒ Object
- #collect_post_install_message(spec) ⇒ Object
-
#enqueue_specs ⇒ Object
Keys in the remains hash represent uninstalled gems specs.
-
#initialize(installer, all_specs, size, standalone, force) ⇒ ParallelInstaller
constructor
A new instance of ParallelInstaller.
-
#process_specs ⇒ Object
Dequeue a spec and save its post-install message and then enqueue the remaining specs.
- #worker_pool ⇒ Object
Constructor Details
#initialize(installer, all_specs, size, standalone, force) ⇒ ParallelInstaller
Returns a new instance of ParallelInstaller.
64 65 66 67 68 69 70 |
# 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 |
Class Method Details
.call(*args) ⇒ Object
55 56 57 |
# File 'lib/bundler/installer/parallel_installer.rb', line 55 def self.call(*args) new(*args).call end |
Instance Method Details
#call ⇒ Object
72 73 74 75 76 77 |
# 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) ⇒ Object
99 100 101 |
# File 'lib/bundler/installer/parallel_installer.rb', line 99 def (spec) Bundler::Installer.[spec.name] = spec. end |
#enqueue_specs ⇒ Object
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.
108 109 110 111 112 113 114 115 |
# 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 ⇒ Object
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.
92 93 94 95 96 97 |
# File 'lib/bundler/installer/parallel_installer.rb', line 92 def process_specs spec = worker_pool.deq spec.state = :installed spec if spec. enqueue_specs end |
#worker_pool ⇒ Object
79 80 81 82 83 84 85 |
# File 'lib/bundler/installer/parallel_installer.rb', line 79 def worker_pool @worker_pool ||= Bundler::Worker.new @size, lambda { |spec_install, worker_num| = @installer.install_gem_from_spec spec_install.spec, @standalone, worker_num, @force spec_install. = unless .nil? spec_install } end |