Skip to content

Commit 8309a41

Browse files
authored
Merge pull request #2769 from rspec/fix-rails-main-build-27
Fix build for Rails 7.1 / Ruby 2.7 through vendoring capybara server fix
2 parents 07e5d35 + c6d5bda commit 8309a41

File tree

4 files changed

+67
-2
lines changed

4 files changed

+67
-2
lines changed

example_app_generator/generate_app.rb

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
'ci_retry_bundle_install.sh'
1212
)
1313
function_script_file = File.join(rspec_rails_repo_path, 'script/functions.sh')
14+
capybara_backport_path = File.join(rspec_rails_repo_path, 'example_app_generator/spec/support/capybara.rb')
1415

1516
in_root do
1617
prepend_to_file "Rakefile", "require 'active_support/all'"
@@ -64,6 +65,8 @@
6465
bundle_install_path
6566
chmod 'ci_retry_bundle_install.sh', 0755
6667

68+
copy_file capybara_backport_path, 'spec/support/capybara.rb'
69+
6770
if Rails::VERSION::STRING > '7'
6871
create_file 'app/assets/config/manifest.js' do
6972
"//= link application.css"

example_app_generator/generate_stuff.rb

+1
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ def using_source_path(path)
146146
end
147147

148148
gsub_file 'spec/spec_helper.rb', /^=(begin|end)/, ''
149+
gsub_file 'spec/rails_helper.rb', /^# Rails\.root\.glob\('spec.support/, "Rails.root.glob('spec/support"
149150

150151
# Warnings are too noisy in the sample apps
151152
gsub_file 'spec/spec_helper.rb',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# This is a backport of a fix that was included in capybara 3.40.0 which was also Ruby version locked to 3.0+
2+
if RUBY_VERSION.to_f < 3 && Rails::VERSION::STRING.to_f >= 7.1
3+
Capybara.register_server :puma do |app, port, host, **options|
4+
begin
5+
require 'rackup'
6+
rescue LoadError # rubocop:disable Lint/SuppressedException
7+
end
8+
begin
9+
require 'rack/handler/puma'
10+
rescue LoadError
11+
raise LoadError, 'Capybara is unable to load `puma` for its server, please add `puma` ' \
12+
'to your project or specify a different server via something like `Capybara.server = :webrick`.'
13+
end
14+
puma_rack_handler = defined?(Rackup::Handler::Puma) ? Rackup::Handler::Puma : Rack::Handler::Puma
15+
16+
unless puma_rack_handler.respond_to?(:config)
17+
raise LoadError, 'Capybara requires `puma` version 3.8.0 or higher,' \
18+
' please upgrade `puma` or register and specify your own server block'
19+
end
20+
21+
# If we just run the Puma Rack handler it installs signal handlers which prevent us from being able to interrupt tests.
22+
# Therefore construct and run the Server instance ourselves.
23+
# puma_rack_handler.run(app, { Host: host, Port: port, Threads: "0:4", workers: 0, daemon: false }.merge(options))
24+
default_options = { Host: host, Port: port, Threads: '0:4', workers: 0, daemon: false }
25+
options = default_options.merge(options)
26+
27+
conf = puma_rack_handler.config(app, options)
28+
conf.clamp
29+
30+
puma_ver = Gem::Version.new(Puma::Const::PUMA_VERSION)
31+
require 'capybara/registrations/patches/puma_ssl' if Gem::Requirement.new('>=4.0.0', '< 4.1.0').satisfied_by?(puma_ver)
32+
33+
logger = (defined?(Puma::LogWriter) ? Puma::LogWriter : Puma::Events).then do |cls|
34+
conf.options[:Silent] ? cls.strings : cls.stdio
35+
end
36+
conf.options[:log_writer] = logger
37+
38+
logger.log 'Capybara starting Puma...'
39+
logger.log "* Version #{Puma::Const::PUMA_VERSION}, codename: #{Puma::Const::CODE_NAME}"
40+
logger.log "* Min threads: #{conf.options[:min_threads]}, max threads: #{conf.options[:max_threads]}"
41+
42+
Puma::Server.new(
43+
conf.app,
44+
defined?(Puma::LogWriter) ? nil : logger,
45+
conf.options
46+
).tap do |s|
47+
s.binder.parse conf.options[:binds], (s.log_writer rescue s.events) # rubocop:disable Style/RescueModifier
48+
s.min_threads, s.max_threads = conf.options[:min_threads], conf.options[:max_threads] if s.respond_to? :min_threads=
49+
end.run.join
50+
end
51+
end

features/support/env.rb

+12-2
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,20 @@ def with_unbundled_env
5959
# We want fresh `example_app` project with empty `spec` dir except helpers.
6060
# FileUtils.cp_r on Ruby 1.9.2 doesn't preserve permissions.
6161
system('cp', '-r', example_app_dir, aruba_dir)
62-
helpers = %w[spec/spec_helper.rb spec/rails_helper.rb]
63-
Dir["#{aruba_dir}/spec/*"].each do |path|
62+
helpers = %w[spec/spec_helper.rb spec/rails_helper.rb spec/support/capybara.rb]
63+
directories = []
64+
65+
Dir["#{aruba_dir}/spec/**/*"].each do |path|
6466
next if helpers.any? { |helper| path.end_with?(helper) }
6567

68+
# Because we now check for things like spec/support we only want to delete empty directories
69+
if File.directory?(path)
70+
directories << path
71+
next
72+
end
73+
6674
FileUtils.rm_rf(path)
6775
end
76+
77+
directories.each { |dir| FileUtils.rm_rf(dir) if Dir.empty?(dir) }
6878
end

0 commit comments

Comments
 (0)