From 497caa3c5ec0a43a2d138b6d14b8d7f2b1f3cbf7 Mon Sep 17 00:00:00 2001 From: technoweenie Date: Sat, 20 Oct 2012 17:30:05 -0600 Subject: [PATCH] add some autoloading abilities to MiddlewareRegistry --- lib/faraday.rb | 34 +++++++++++++++++++++++++++++----- test/middleware_stack_test.rb | 11 +++++++++++ test/strawberry.rb | 2 ++ 3 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 test/strawberry.rb diff --git a/lib/faraday.rb b/lib/faraday.rb index 894c2ea6..4f9a225b 100644 --- a/lib/faraday.rb +++ b/lib/faraday.rb @@ -133,11 +133,22 @@ module Faraday # class Whatever # # Middleware looked up by :foo returns Faraday::Whatever::Foo. # register_middleware :foo => Foo + # + # # Middleware looked up by :bar returns Faraday::Whatever.const_get(:Bar) + # register_middleware :bar => :Bar + # + # # Middleware looked up by :baz requires 'baz' and returns Faraday::Whatever.const_get(:Baz) + # register_middleware :baz => [:Baz, 'baz'] # end # end # # Returns nothing. - def register_middleware(mapping) + def register_middleware(autoload_path = nil, mapping = nil) + if mapping.nil? + mapping = autoload_path + autoload_path = nil + end + @middleware_autoload_path = autoload_path if autoload_path (@registered_middleware ||= {}).update(mapping) end @@ -158,11 +169,24 @@ module Faraday # # Returns a middleware Class. def lookup_middleware(key) - unless defined? @registered_middleware and found = @registered_middleware[key] - raise "#{key.inspect} is not registered on #{self}" + value = defined?(@registered_middleware) && @registered_middleware[key] + case value + when Module then value + when Symbol, String + @registered_middleware[key] = const_get(value) + when Proc + @registered_middleware[key] = value.call + when Array + const, path = value + if root = @middleware_autoload_path + path = "#{root}/#{path}" + end + require(path) + @registered_middleware[key] = const + lookup_middleware(key) + else + raise Faraday::Error.new("#{key.inspect} is not registered on #{self}") end - found = @registered_middleware[key] = found.call if found.is_a? Proc - found.is_a?(Module) ? found : const_get(found) end end diff --git a/test/middleware_stack_test.rb b/test/middleware_stack_test.rb index b8d0e3e8..ff8df309 100644 --- a/test/middleware_stack_test.rb +++ b/test/middleware_stack_test.rb @@ -123,6 +123,17 @@ class MiddlewareStackTest < Faraday::TestCase end end + def test_registered_symbol_with_array + Faraday::Middleware.register_middleware File.expand_path("..", __FILE__), + :strawberry => [lambda { Strawberry }, 'strawberry'] + begin + build_stack :strawberry + assert_handlers %w[Strawberry] + ensure + unregister_middleware Faraday::Middleware, :strawberry + end + end + def test_missing_dependencies build_stack Broken err = assert_raises RuntimeError do diff --git a/test/strawberry.rb b/test/strawberry.rb new file mode 100644 index 00000000..80c8d0b3 --- /dev/null +++ b/test/strawberry.rb @@ -0,0 +1,2 @@ +class MiddlewareStackTest::Strawberry < MiddlewareStackTest::Handler +end