class Puma::Configuration
The main configuration class of Puma.
It can be initialized with a set of āuserā options and ādefaultā options. Defaults will be merged with āConfiguration.puma_default_options`.
This class works together with 2 main other classes the āUserFileDefaultOptions` which stores configuration options in order so the precedence is that user set configuration wins over āfileā based configuration wins over ādefaultā configuration. These configurations are set via the `DSL` class. This class powers the Puma config file syntax and does double duty as a configuration DSL used by the `Puma::CLI` and Puma rack handler.
It also handles loading plugins.
- Note:
-
ā:port` and `:host` are not valid keys. By the time they make it to the configuration options they are expected to be incorporated into a `:binds` key. Under the hood the
DSLmaps `port` and `host` calls to `:binds`config = Configuration.new({}) do |user_config, file_config, default_config| user_config.port 3003 end config.load puts config.options[:port] # => 3003
It is expected that āload` is called on the configuration instance after setting config. This method expands any values in `config_file` and puts them into the correct configuration option hash.
Once all configuration is complete it is expected that āclamp` will be called on the instance. This will expand any procs stored under ādefaultā values. This is done because an environment variable may have been modified while loading configuration files.
Constants
- DEFAULTS
Attributes
Public Class Methods
Source
# File lib/puma/configuration.rb, line 176 def initialize(user_options={}, default_options = {}, &block) default_options = self.puma_default_options.merge(default_options) @options = UserFileDefaultOptions.new(user_options, default_options) @plugins = PluginLoader.new @user_dsl = DSL.new(@options.user_options, self) @file_dsl = DSL.new(@options.file_options, self) @default_dsl = DSL.new(@options.default_options, self) if !@options[:prune_bundler] default_options[:preload_app] = (@options[:workers] > 1) && Puma.forkable? end if block configure(&block) end end
Source
# File lib/puma/configuration.rb, line 383 def self.random_token require 'securerandom' unless defined?(SecureRandom) SecureRandom.hex(16) end
Source
# File lib/puma/configuration.rb, line 333 def self.temp_path require 'tmpdir' t = (Time.now.to_f * 1000).to_i "#{Dir.tmpdir}/puma-status-#{t}-#{$$}" end
Public Instance Methods
Source
# File lib/puma/configuration.rb, line 289 def app found = options[:app] || load_rackup if @options[:log_requests] require_relative 'commonlogger' logger = @options[:logger] found = CommonLogger.new(found, logger) end ConfigMiddleware.new(self, found) end
Load the specified rackup file, pull options from the rackup file, and set @app.
Source
# File lib/puma/configuration.rb, line 278 def app_configured? @options[:app] || File.exist?(rackup) end
Indicate if there is a properly configured app
Source
# File lib/puma/configuration.rb, line 259 def clamp @options.finalize_values end
Call once all configuration (included from rackup files) is loaded to flesh out any defaults
Source
# File lib/puma/configuration.rb, line 244 def config_files files = @options.all_of(:config_files) return [] if files == ['-'] return files if files.any? first_default_file = %W(config/puma/#{@options[:environment]}.rb config/puma.rb).find do |f| File.exist?(f) end [first_default_file] end
Source
# File lib/puma/configuration.rb, line 196 def configure yield @user_dsl, @file_dsl, @default_dsl ensure @user_dsl._offer_plugins @file_dsl._offer_plugins @default_dsl._offer_plugins end
Source
# File lib/puma/configuration.rb, line 302 def environment @options[:environment] end
Return which environment weāre running in
Source
# File lib/puma/configuration.rb, line 329 def final_options @options.final_options end
Source
# File lib/puma/configuration.rb, line 214 def flatten! @options = @options.flatten self end
Source
# File lib/puma/configuration.rb, line 204 def initialize_copy(other) @conf = nil @cli_options = nil @options = @options.dup end
Source
# File lib/puma/configuration.rb, line 238 def load config_files.each { |config_file| @file_dsl._load_from(config_file) } @options end
Source
# File lib/puma/configuration.rb, line 306 def load_plugin(name) @plugins.create name end
Source
# File lib/puma/configuration.rb, line 219 def puma_default_options defaults = DEFAULTS.dup puma_options_from_env.each { |k,v| defaults[k] = v if v } defaults end
Source
# File lib/puma/configuration.rb, line 225 def puma_options_from_env min = ENV['PUMA_MIN_THREADS'] || ENV['MIN_THREADS'] max = ENV['PUMA_MAX_THREADS'] || ENV['MAX_THREADS'] workers = ENV['WEB_CONCURRENCY'] { min_threads: min && Integer(min), max_threads: max && Integer(max), workers: workers && Integer(workers), environment: ENV['APP_ENV'] || ENV['RACK_ENV'] || ENV['RAILS_ENV'], } end
Source
# File lib/puma/configuration.rb, line 313 def run_hooks(key, arg, log_writer, hook_data = nil) @options.all_of(key).each do |b| begin if Array === b hook_data[b[1]] ||= Hash.new b[0].call arg, hook_data[b[1]] else b.call arg end rescue => e log_writer.log "WARNING hook #{key} failed with exception (#{e.class}) #{e.message}" log_writer.debug e.backtrace.join("\n") end end end
@param key [:Symbol] hook to run @param arg [Launcher, Int] ā:on_restart` passes Launcher
Private Instance Methods
Source
# File lib/puma/configuration.rb, line 365 def load_rackup raise "Missing rackup file '#{rackup}'" unless File.exist?(rackup) rack_app, rack_options = rack_builder.parse_file(rackup) rack_options = rack_options || {} @options.file_options.merge!(rack_options) config_ru_binds = [] rack_options.each do |k, v| config_ru_binds << v if k.to_s.start_with?("bind") end @options.file_options[:binds] = config_ru_binds unless config_ru_binds.empty? rack_app end
Source
# File lib/puma/configuration.rb, line 344 def rack_builder # Load bundler now if we can so that we can pickup rack from # a Gemfile if ENV.key? 'PUMA_BUNDLER_PRUNED' begin require 'bundler/setup' rescue LoadError end end begin require 'rack' require 'rack/builder' rescue LoadError # ok, use builtin version return Puma::Rack::Builder else return ::Rack::Builder end end
Load and use the normal Rack builder if we can, otherwise fallback to our minimal version.