Get control of driver/server registrations

This commit is contained in:
Thomas Walpole 2020-05-25 14:49:51 -07:00
parent 3842679ecf
commit 6fcd43aec8
5 changed files with 53 additions and 8 deletions

View File

@ -5,6 +5,7 @@ require 'nokogiri'
require 'xpath'
require 'forwardable'
require 'capybara/config'
require 'capybara/registration_container'
module Capybara
class CapybaraError < StandardError; end
@ -126,7 +127,7 @@ module Capybara
# @yieldreturn [Capybara::Driver::Base] A Capybara driver instance
#
def register_driver(name, &block)
drivers[name] = block
drivers.send(:register, name, block)
end
##
@ -145,7 +146,7 @@ module Capybara
# @yieldparam host The host/ip to bind to
#
def register_server(name, &block)
servers[name.to_sym] = block
servers.send(:register, name.to_sym, block)
end
##
@ -199,11 +200,11 @@ module Capybara
end
def drivers
@drivers ||= {}
@drivers ||= RegistrationContainer.new
end
def servers
@servers ||= {}
@servers ||= RegistrationContainer.new
end
# Wraps the given string, which should contain an HTML document or fragment

View File

@ -22,6 +22,6 @@ end
Before do |scenario|
scenario.source_tag_names.each do |tag|
driver_name = tag.sub(/^@/, '').to_sym
Capybara.current_driver = driver_name if Capybara.drivers.key?(driver_name)
Capybara.current_driver = driver_name if Capybara.drivers[driver_name]
end
end

View File

@ -0,0 +1,44 @@
# frozen_string_literal: true
module Capybara
# @api private
class RegistrationContainer
def names
@registered.keys
end
def [](name)
@registered[name]
end
def []=(name, value)
warn 'DEPRECATED: Directly setting drivers/servers is deprecated, please use Capybara.register_driver/register_server instead'
@registered[name] = value
end
def method_missing(method_name, *args, **options, &block)
if @registered.respond_to?(method_name)
warn "DEPRECATED: Calling '#{method_name}' on the drivers/servers container is deprecated without replacement"
# RUBY 2.6 will send an empty hash rather than nothing with **options so fix that
return @registered.public_send(method_name, *args, &block) if options.empty?
return @registered.public_send(method_name, *args, **options, &block)
end
super
end
def respond_to_missing?(method_name, include_private = false)
@registered.respond_to?(method_name) || super
end
private
def initialize
@registered = {}
end
def register(name, block)
@registered[name] = block
end
end
end

View File

@ -97,8 +97,8 @@ module Capybara
def driver
@driver ||= begin
unless Capybara.drivers.key?(mode)
other_drivers = Capybara.drivers.keys.map(&:inspect)
unless Capybara.drivers[mode]
other_drivers = Capybara.drivers.names.map(&:inspect)
raise Capybara::DriverNotFoundError, "no driver called #{mode.inspect} was found, available drivers: #{other_drivers.join(', ')}"
end
driver = Capybara.drivers[mode].call(app)

View File

@ -32,7 +32,7 @@ RSpec.describe Capybara do
# do nothing
end
expect(described_class.servers).to have_key(:blob)
expect(described_class.servers[:blob]).to be_truthy
end
end