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.
65 66 67 68 69 70 71 |
# File 'lib/bundler/installer/parallel_installer.rb', line 65 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
56 57 58 |
# File 'lib/bundler/installer/parallel_installer.rb', line 56 def self.call(*args) new(*args).call end |
Instance Method Details
#call ⇒ Object
73 74 75 76 77 78 |
# File 'lib/bundler/installer/parallel_installer.rb', line 73 def call enqueue_specs process_specs until @specs.all?(&:installed?) ensure worker_pool && worker_pool.stop end |
#collect_post_install_message(spec) ⇒ Object
100 101 102 |
# File 'lib/bundler/installer/parallel_installer.rb', line 100 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.
109 110 111 112 113 114 115 116 |
# File 'lib/bundler/installer/parallel_installer.rb', line 109 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.
93 94 95 96 97 98 |
# File 'lib/bundler/installer/parallel_installer.rb', line 93 def process_specs spec = worker_pool.deq spec.state = :installed spec if spec. enqueue_specs end |
#worker_pool ⇒ Object
80 81 82 83 84 85 86 |
# File 'lib/bundler/installer/parallel_installer.rb', line 80 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 |