lib/capistrano/puma.rb in capistrano3-puma-2.0.0 vs lib/capistrano/puma.rb in capistrano3-puma-3.0.0

- old
+ new

@@ -1,2 +1,118 @@ require 'capistrano/bundler' -load File.expand_path('../tasks/puma.rake', __FILE__) +require "capistrano/plugin" + +module Capistrano + module PumaCommon + def puma_switch_user(role, &block) + user = puma_user(role) + if user == role.user + block.call + else + as user do + block.call + end + end + end + + def puma_user(role) + properties = role.properties + properties.fetch(:puma_user) || # local property for puma only + fetch(:puma_user) || + properties.fetch(:run_as) || # global property across multiple capistrano gems + role.user + end + + def puma_bind + Array(fetch(:puma_bind)).collect do |bind| + "bind '#{bind}'" + end.join("\n") + end + + + def template_puma(from, to, role) + file = [ + "lib/capistrano/templates/#{from}-#{role.hostname}-#{fetch(:stage)}.rb", + "lib/capistrano/templates/#{from}-#{role.hostname}.rb", + "lib/capistrano/templates/#{from}-#{fetch(:stage)}.rb", + "lib/capistrano/templates/#{from}.rb.erb", + "lib/capistrano/templates/#{from}.rb", + "lib/capistrano/templates/#{from}.erb", + "config/deploy/templates/#{from}.rb.erb", + "config/deploy/templates/#{from}.rb", + "config/deploy/templates/#{from}.erb", + File.expand_path("../templates/#{from}.erb", __FILE__), + ].detect { |path| File.file?(path) } + erb = File.read(file) + backend.upload! StringIO.new(ERB.new(erb, nil, '-').result(binding)), to + end + end + + class Puma < Capistrano::Plugin + include PumaCommon + + def define_tasks + eval_rakefile File.expand_path('../tasks/puma.rake', __FILE__) + end + + def set_defaults + set_if_empty :puma_role, :app + set_if_empty :puma_env, -> { fetch(:rack_env, fetch(:rails_env, fetch(:stage))) } + # Configure "min" to be the minimum number of threads to use to answer + # requests and "max" the maximum. + set_if_empty :puma_threads, [0, 16] + set_if_empty :puma_workers, 0 + set_if_empty :puma_rackup, -> { File.join(current_path, 'config.ru') } + set_if_empty :puma_state, -> { File.join(shared_path, 'tmp', 'pids', 'puma.state') } + set_if_empty :puma_pid, -> { File.join(shared_path, 'tmp', 'pids', 'puma.pid') } + set_if_empty :puma_bind, -> { File.join("unix://#{shared_path}", 'tmp', 'sockets', 'puma.sock') } + set_if_empty :puma_default_control_app, -> { File.join("unix://#{shared_path}", 'tmp', 'sockets', 'pumactl.sock') } + set_if_empty :puma_conf, -> { File.join(shared_path, 'puma.rb') } + set_if_empty :puma_access_log, -> { File.join(shared_path, 'log', 'puma_access.log') } + set_if_empty :puma_error_log, -> { File.join(shared_path, 'log', 'puma_error.log') } + set_if_empty :puma_init_active_record, false + set_if_empty :puma_preload_app, false + set_if_empty :puma_daemonize, false + + # Chruby, Rbenv and RVM integration + append :chruby_map_bins, 'puma', 'pumactl' + append :rbenv_map_bins, 'puma', 'pumactl' + append :rvm_map_bins, 'puma', 'pumactl' + + # Bundler integration + append :bundle_bins, 'puma', 'pumactl' + end + + def register_hooks + after 'deploy:check', 'puma:check' + after 'deploy:finished', 'puma:smart_restart' + end + + def puma_workers + fetch(:puma_workers, 0) + end + + def puma_preload_app? + fetch(:puma_preload_app) + end + + def puma_daemonize? + fetch(:puma_daemonize) + end + + def puma_plugins + Array(fetch(:puma_plugins)).collect do |bind| + "plugin '#{bind}'" + end.join("\n") + end + + def upload_puma_rb(role) + template_puma 'puma.rb', fetch(:puma_conf), role + end + end +end +install_plugin Capistrano::Puma + +require 'capistrano/puma/workers' +require 'capistrano/puma/monit' +require 'capistrano/puma/jungle' +require 'capistrano/puma/nginx' \ No newline at end of file