Skip to content

Commit 915df22

Browse files
committed
Bail on multiple Puma workers
1 parent 0cdb94e commit 915df22

File tree

5 files changed

+74
-0
lines changed

5 files changed

+74
-0
lines changed

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ gemspec
55
gem "rails", ">= 7.0.1"
66
gem "rake"
77
gem "debug"
8+
gem "puma"

Gemfile.lock

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ GEM
134134
racc (~> 1.4)
135135
psych (5.1.2)
136136
stringio
137+
puma (6.4.2)
138+
nio4r (~> 2.0)
137139
racc (1.8.1)
138140
rack (3.1.7)
139141
rack-session (2.0.0)
@@ -199,6 +201,7 @@ PLATFORMS
199201
DEPENDENCIES
200202
debug
201203
propshaft!
204+
puma
202205
rails (>= 7.0.1)
203206
rake
204207

lib/propshaft/puma_config.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
begin
2+
require "puma"
3+
require "puma/configuration"
4+
rescue LoadError
5+
end
6+
7+
class Propshaft::PumaConfig
8+
def initialize
9+
if defined?(Puma)
10+
@resolved_config = Puma::Configuration.new.load.final_options
11+
end
12+
end
13+
14+
def multiple_workers?
15+
return false unless @resolved_config
16+
@resolved_config[:workers] > 1
17+
end
18+
19+
def self.perform_dev_check!
20+
return true unless new.multiple_workers?
21+
22+
message = "#" * 80 + "\n"
23+
message += "# " + " " * 76 + " #\n"
24+
message += "# " + "WARNING!!".center(76) + " #\n"
25+
message += "# " + " " * 76 + " #\n"
26+
message += "# Running multiple Puma workers in development is not supported with Propshaft #\n"
27+
message += "# " + " " * 76 + " #\n"
28+
message += "# " + "Make sure WEB_CONCURRENCY is not set or ensure".center(76) + " #\n"
29+
message += "# " + "workers is not set for development in config/puma.rb.".center(76) + " #\n"
30+
message += "# " + " " * 76 + " #\n"
31+
message += "#" * 80 + "\n"
32+
33+
puts message
34+
false
35+
end
36+
end

lib/propshaft/railtie.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
require "active_support/ordered_options"
33
require "propshaft"
44
require "propshaft/quiet_assets"
5+
require "propshaft/puma_config"
56

67
module Propshaft
78
class Railtie < ::Rails::Railtie
@@ -43,6 +44,10 @@ class Railtie < ::Rails::Railtie
4344
app.routes.prepend do
4445
mount app.assets.server, at: app.assets.config.prefix
4546
end
47+
48+
if Rails.env.development?
49+
exit 1 unless PumaConfig.perform_dev_check!
50+
end
4651
end
4752

4853
ActiveSupport.on_load(:action_view) do

test/propshaft/puma_config_test.rb

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
require "test_helper"
2+
require "puma"
3+
require "propshaft/puma_config"
4+
require "minitest/mock"
5+
6+
class Propshaft::PumaConfigTest < ActiveSupport::TestCase
7+
class PumaConfigurationStub
8+
def initialize(workers)
9+
@workers = workers
10+
end
11+
12+
def load
13+
OpenStruct.new(final_options: { workers: @workers })
14+
end
15+
end
16+
17+
{
18+
0 => false,
19+
1 => false,
20+
2 => true
21+
}.each_pair do |workers, expected|
22+
test "multiple_workers? is #{expected} when config resolves to #{workers}" do
23+
mock = PumaConfigurationStub.new(workers)
24+
Puma::Configuration.stub :new, mock do
25+
assert Propshaft::PumaConfig.new.multiple_workers? == expected
26+
end
27+
end
28+
end
29+
end

0 commit comments

Comments
 (0)