Skip to content
This repository has been archived by the owner on Mar 7, 2018. It is now read-only.

Commit

Permalink
Switch server to puma, provide puma config and adapt command line
Browse files Browse the repository at this point in the history
- configure puma using config/puma.rb config file
- add default puma.rb config file for new projects
- adapt dashing cli to use the config file and correctly handle -d (daemonize) arg.
- adapt cli_test.rb to the new setup
- remove tmp dir from gitignore as we want to generate it in the project template
- add tmp/pids/ dir in project template (for saving puma pid / state files.
  • Loading branch information
qbrossard committed Mar 9, 2016
1 parent 34ec439 commit ee64d7d
Show file tree
Hide file tree
Showing 8 changed files with 72 additions and 26 deletions.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,5 @@
*.gem
coverage/
log/
tmp/
.ruby-version
history.yml
3 changes: 2 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@ rvm:
- 2.3.0
- 2.2.4
- 2.1.8

- jruby-19mode
- jruby-9.0.4.0
script: "rake test"
2 changes: 1 addition & 1 deletion dashing.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Gem::Specification.new do |s|
s.add_dependency('execjs', '~> 2.0.2')
s.add_dependency('sinatra', '~> 1.4.4')
s.add_dependency('sinatra-contrib', '~> 1.4.2')
s.add_dependency('thin', '~> 1.6.1')
s.add_dependency('puma', '~> 2.16.0')
s.add_dependency('rufus-scheduler', '~> 2.0.24')
s.add_dependency('thor', '> 0.18.1')
s.add_dependency('sprockets', '~> 2.10.1')
Expand Down
11 changes: 0 additions & 11 deletions lib/dashing/app.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
require 'sinatra/streaming'
require 'sprockets'
require 'yaml'
require 'thin'

SCHEDULER = Rufus::Scheduler.new

Expand Down Expand Up @@ -134,16 +133,6 @@ def authenticated?(token)
end
end

Thin::Server.class_eval do
def stop_with_connection_closing
Sinatra::Application.settings.connections.dup.each(&:close)
stop_without_connection_closing
end

alias_method :stop_without_connection_closing, :stop
alias_method :stop, :stop_with_connection_closing
end

def send_event(id, body, target=nil)
body[:id] = id
body[:updatedAt] ||= Time.now.to_i
Expand Down
14 changes: 9 additions & 5 deletions lib/dashing/cli.rb
Original file line number Diff line number Diff line change
Expand Up @@ -57,16 +57,20 @@ def install(gist_id, *args)
desc "start", "Starts the server in style!"
method_option :job_path, :desc => "Specify the directory where jobs are stored"
def start(*args)
port_option = args.include?('-p') ? '' : ' -p 3030'
daemonize = args.include?('-d')
args = args.join(' ')
command = "bundle exec thin -R config.ru start#{port_option} #{args}"
command = "bundle exec puma #{args}"
command.prepend "export JOB_PATH=#{options[:job_path]}; " if options[:job_path]
command.prepend "export DAEMONIZE=true; " if daemonize
run_command(command)
end

desc "stop", "Stops the thin server"
def stop
command = "bundle exec thin stop"
desc "stop", "Stops the puma server (daemon mode only)"
def stop(*args)
args = args.join(' ')
# TODO correctly handle pidfile location change in puma config
daemon_pidfile = !args.include?('--pidfile') ? '--pidfile ./tmp/pids/puma.pid' : args
command = "bundle exec pumactl #{daemon_pidfile} stop"
run_command(command)
end

Expand Down
42 changes: 42 additions & 0 deletions templates/project/config/puma.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# For a complete list of puma configuration parameters, please see
# https://github.com/puma/puma

# Puma can serve each request in a thread from an internal thread pool.
# The `threads` method setting takes two numbers a minimum and maximum.
# Any libraries that use thread pools should be configured to match
# the maximum value specified for Puma. Default is set to 5 threads for minimum
# and maximum.
#
threads_count = ENV.fetch("PUMA_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count

# Specifies the `port` that Puma will listen on to receive requests, default is 2020.
#
port ENV.fetch("DASHING_PORT") { 3030 }

# Specifies the `environment` that Puma will run in.
#
environment ENV.fetch("RACK_ENV") { "production" }

# Daemonize the server into the background. Highly suggest that
# this be combined with "pidfile" and "stdout_redirect".
#
# The default is "false".
#
daemonize ENV.fetch("DAEMONIZE") { false }

# Store the pid of the server in the file at "path".
#
pidfile './tmp/pids/puma.pid'

# Use "path" as the file to store the server info state. This is
# used by "pumactl" to query and control the server.
#
state_path './tmp/pids/puma.state'

# Redirect STDOUT and STDERR to files specified. The 3rd parameter
# ("append") specifies whether the output is appended, the default is
# "false".
#
# stdout_redirect '/u/apps/lolcat/log/stdout', '/u/apps/lolcat/log/stderr'
# stdout_redirect '/u/apps/lolcat/log/stdout', '/u/apps/lolcat/log/stderr', true
1 change: 1 addition & 0 deletions templates/project/tmp/pids/.empty_directory
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.empty_directory
24 changes: 17 additions & 7 deletions test/cli_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -101,31 +101,41 @@ def test_install_task_warns_when_gist_not_found
assert_includes output, 'Could not find gist at '
end

def test_start_task_starts_thin_with_default_port
command = 'bundle exec thin -R config.ru start -p 3030 '
def test_start_task_starts_puma_with_default_port
command = 'bundle exec puma '
@cli.stubs(:run_command).with(command).once
@cli.start
end

def test_start_task_starts_thin_with_specified_port
command = 'bundle exec thin -R config.ru start -p 2020'
def test_start_task_starts_puma_in_daemon_mode
commands = [
'export DAEMONIZE=true; ',
'bundle exec puma -d'
]

@cli.stubs(:run_command).with(commands.join('')).once
@cli.start('-d')
end

def test_start_task_starts_puma_with_specified_port
command = 'bundle exec puma -p 2020'
@cli.stubs(:run_command).with(command).once
@cli.start('-p', '2020')
end

def test_start_task_supports_job_path_option
commands = [
'export JOB_PATH=other_spot; ',
'bundle exec thin -R config.ru start -p 3030 '
'bundle exec puma '
]

@cli.stubs(:options).returns(job_path: 'other_spot')
@cli.stubs(:run_command).with(commands.join('')).once
@cli.start
end

def test_stop_task_stops_thin_server
@cli.stubs(:run_command).with('bundle exec thin stop')
def test_stop_task_stops_puma_server
@cli.stubs(:run_command).with('bundle exec pumactl --pidfile ./tmp/pids/puma.pid stop')
@cli.stop
end

Expand Down

0 comments on commit ee64d7d

Please sign in to comment.