Class: Puma::Launcher::BundlePruner
| Relationships & Source Files | |
| Inherits: | Object |
| Defined in: | lib/puma/launcher/bundle_pruner.rb |
Overview
This class is used to pickup Gemfile changes during application restarts.
Class Method Summary
Instance Method Summary
- #prune
- #extra_runtime_deps_paths private
- #log(str) private
- #paths_to_require_after_prune private
- #puma_require_paths private
- #puma_wild_path private
- #require_paths_for_gem(gem_spec) private
- #require_rubygems_min_version! private
- #spec_for_gem(gem_name) private
- #with_unbundled_env private
Constructor Details
.new(original_argv, extra_runtime_dependencies, log_writer) ⇒ BundlePruner
# File 'lib/puma/launcher/bundle_pruner.rb', line 10
def initialize(original_argv, extra_runtime_dependencies, log_writer) @original_argv = Array(original_argv) @extra_runtime_dependencies = Array(extra_runtime_dependencies) @log_writer = log_writer end
Instance Method Details
#extra_runtime_deps_paths (private)
[ GitHub ]# File 'lib/puma/launcher/bundle_pruner.rb', line 73
def extra_runtime_deps_paths t = @extra_runtime_dependencies.map do |dep_name| if (spec = spec_for_gem(dep_name)) require_paths_for_gem(spec) else log "* Could not load extra dependency: #{dep_name}" nil end end t.flatten!; t.compact!; t end
#log(str) (private)
[ GitHub ]# File 'lib/puma/launcher/bundle_pruner.rb', line 97
def log(str) @log_writer.log(str) end
#paths_to_require_after_prune (private)
[ GitHub ]# File 'lib/puma/launcher/bundle_pruner.rb', line 69
def paths_to_require_after_prune puma_require_paths + extra_runtime_deps_paths end
#prune
[ GitHub ]# File 'lib/puma/launcher/bundle_pruner.rb', line 16
def prune return if ENV['PUMA_BUNDLER_PRUNED'] return unless defined?(Bundler) require_rubygems_min_version! unless puma_wild_path log "! Unable to prune Bundler environment, continuing" return end dirs = paths_to_require_after_prune log '* Pruning Bundler environment' home = ENV['GEM_HOME'] original_bundle_env = Bundler.original_env.select { |k, v| k.start_with?('BUNDLE_') && v } with_unbundled_env do ENV['GEM_HOME'] = home ENV['PUMA_BUNDLER_PRUNED'] = '1' original_bundle_env.each { |k, v| ENV[k] = v } args = [Gem.ruby, puma_wild_path, '-I', dirs.join(':')] + @original_argv # Defaults to true which breaks socket activation args += [{:close_others => false}] Kernel.exec(*args) end end
#puma_require_paths (private)
[ GitHub ]# File 'lib/puma/launcher/bundle_pruner.rb', line 85
def puma_require_paths require_paths_for_gem(spec_for_gem('puma')) end
#puma_wild_path (private)
[ GitHub ]# File 'lib/puma/launcher/bundle_pruner.rb', line 55
def puma_wild_path puma_lib_dir = puma_require_paths.detect { |x| File.exist? File.join(x, '../bin/puma-wild') } File.(File.join(puma_lib_dir, '../bin/puma-wild')) end
#require_paths_for_gem(gem_spec) (private)
[ GitHub ]# File 'lib/puma/launcher/bundle_pruner.rb', line 93
def require_paths_for_gem(gem_spec) gem_spec.full_require_paths end
#require_rubygems_min_version! (private)
[ GitHub ]# File 'lib/puma/launcher/bundle_pruner.rb', line 46
def require_rubygems_min_version! min_version = Gem::Version.new('2.2') return if min_version <= Gem::Version.new(Gem::VERSION) raise "prune_bundler is not supported on your version of RubyGems. " \ "You must have RubyGems #{min_version}+ to use this feature." end
#spec_for_gem(gem_name) (private)
[ GitHub ]# File 'lib/puma/launcher/bundle_pruner.rb', line 89
def spec_for_gem(gem_name) Bundler.rubygems.loaded_specs(gem_name) end