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.
72 73 74 75 76 77 78 |
# 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 |
Class Method Details
.call(*args) ⇒ Object
63 64 65 |
# File 'lib/bundler/installer/parallel_installer.rb', line 63 def self.call(*args) new(*args).call end |
Instance Method Details
#call ⇒ Object
80 81 82 83 84 85 |
# 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) ⇒ Object
109 110 111 |
# File 'lib/bundler/installer/parallel_installer.rb', line 109 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.
118 119 120 121 122 123 124 125 |
# 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 ⇒ 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.
102 103 104 105 106 107 |
# File 'lib/bundler/installer/parallel_installer.rb', line 102 def process_specs spec = worker_pool.deq spec.state = :installed spec if spec. enqueue_specs end |
#worker_pool ⇒ Object
87 88 89 90 91 92 93 94 95 |
# 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| = Bundler::GemInstaller.new( spec_install.spec, @installer, @standalone, worker_num, @force ).install_from_spec spec_install. = unless .nil? spec_install } end |