Skip to content

Commit

Permalink
Prefer super to alias method chain.
Browse files Browse the repository at this point in the history
WebMock was using alias method chain in lots of situations where it didn't need to, since most of the adapters subclass the HTTP client.
  • Loading branch information
myronmarston committed Aug 13, 2012
1 parent c31a3c0 commit caeb0da
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 115 deletions.
94 changes: 30 additions & 64 deletions lib/webmock/http_lib_adapters/curb_adapter.rb
Expand Up @@ -170,117 +170,83 @@ def build_webmock_response
### Mocks of Curl::Easy methods below here. ### Mocks of Curl::Easy methods below here.
### ###


def http_with_webmock(method) def http(method)
@webmock_method = method @webmock_method = method
http_without_webmock(method) super
end end
alias_method :http_without_webmock, :http
alias_method :http, :http_with_webmock


%w[ get head delete ].each do |verb| %w[ get head delete ].each do |verb|
define_method "http_#{verb}_with_webmock" do define_method "http_#{verb}" do
@webmock_method = verb @webmock_method = verb
send( "http_#{verb}_without_webmock" ) super()
end end

alias_method "http_#{verb}_without_webmock", "http_#{verb}"
alias_method "http_#{verb}", "http_#{verb}_with_webmock"
end end


def http_put_with_webmock data = nil def http_put data = nil
@webmock_method = :put @webmock_method = :put
@put_data = data if data @put_data = data if data
http_put_without_webmock(data) super
end end
alias_method :http_put_without_webmock, :http_put
alias_method :http_put, :http_put_with_webmock


def http_post_with_webmock *data def http_post *data
@webmock_method = :post @webmock_method = :post
@post_body = data.join('&') if data && !data.empty? @post_body = data.join('&') if data && !data.empty?
http_post_without_webmock(*data) super
end end
alias_method :http_post_without_webmock, :http_post
alias_method :http_post, :http_post_with_webmock



def perform_with_webmock def perform
@webmock_method ||= :get @webmock_method ||= :get
curb_or_webmock do curb_or_webmock { super }
perform_without_webmock
end
end end
alias :perform_without_webmock :perform
alias :perform :perform_with_webmock


def put_data_with_webmock= data def put_data= data
@webmock_method = :put @webmock_method = :put
@put_data = data @put_data = data
self.put_data_without_webmock = data super
end end
alias_method :put_data_without_webmock=, :put_data=
alias_method :put_data=, :put_data_with_webmock=


def post_body_with_webmock= data def post_body= data
@webmock_method = :post @webmock_method = :post
self.post_body_without_webmock = data super
end end
alias_method :post_body_without_webmock=, :post_body=
alias_method :post_body=, :post_body_with_webmock=


def delete_with_webmock= value def delete= value
@webmock_method = :delete if value @webmock_method = :delete if value
self.delete_without_webmock = value super
end end
alias_method :delete_without_webmock=, :delete=
alias_method :delete=, :delete_with_webmock=


def head_with_webmock= value def head= value
@webmock_method = :head if value @webmock_method = :head if value
self.head_without_webmock = value super
end end
alias_method :head_without_webmock=, :head=
alias_method :head=, :head_with_webmock=


def body_str_with_webmock def body_str
@body_str || body_str_without_webmock @body_str || super
end end
alias :body_str_without_webmock :body_str
alias :body_str :body_str_with_webmock


def response_code_with_webmock def response_code
@response_code || response_code_without_webmock @response_code || super
end end
alias :response_code_without_webmock :response_code
alias :response_code :response_code_with_webmock


def header_str_with_webmock def header_str
@header_str || header_str_without_webmock @header_str || super
end end
alias :header_str_without_webmock :header_str
alias :header_str :header_str_with_webmock


def last_effective_url_with_webmock def last_effective_url
@last_effective_url || last_effective_url_without_webmock @last_effective_url || super
end end
alias :last_effective_url_without_webmock :last_effective_url
alias :last_effective_url :last_effective_url_with_webmock


def content_type_with_webmock def content_type
@content_type || content_type_without_webmock @content_type || super
end end
alias :content_type_without_webmock :content_type
alias :content_type :content_type_with_webmock


%w[ success failure header body complete progress ].each do |callback| %w[ success failure header body complete progress ].each do |callback|
class_eval <<-METHOD, __FILE__, __LINE__ class_eval <<-METHOD, __FILE__, __LINE__
def on_#{callback}_with_webmock &block def on_#{callback} &block
@on_#{callback} = block @on_#{callback} = block
on_#{callback}_without_webmock &block super
end end
METHOD METHOD
alias_method "on_#{callback}_without_webmock", "on_#{callback}"
alias_method "on_#{callback}", "on_#{callback}_with_webmock"
end end
end end
end end
Expand Down
Expand Up @@ -47,7 +47,7 @@ def close_connection
end end
end end


def send_request_with_webmock(&block) def send_request(&block)
request_signature = build_request_signature request_signature = build_request_signature


WebMock::RequestRegistry.instance.requested_signatures.put(request_signature) WebMock::RequestRegistry.instance.requested_signatures.put(request_signature)
Expand All @@ -61,7 +61,7 @@ def send_request_with_webmock(&block)
webmock_response.should_timeout ? "WebMock timeout error" : nil) webmock_response.should_timeout ? "WebMock timeout error" : nil)
client client
elsif WebMock.net_connect_allowed?(request_signature.uri) elsif WebMock.net_connect_allowed?(request_signature.uri)
http = send_request_without_webmock(&block) http = super
http.callback { http.callback {
if WebMock::CallbackRegistry.any_callbacks? if WebMock::CallbackRegistry.any_callbacks?
webmock_response = build_webmock_response(http) webmock_response = build_webmock_response(http)
Expand All @@ -76,10 +76,6 @@ def send_request_with_webmock(&block)
end end
end end


alias_method :send_request_without_webmock, :send_request
alias_method :send_request, :send_request_with_webmock


private private


def build_webmock_response(http) def build_webmock_response(http)
Expand Down
Expand Up @@ -48,7 +48,7 @@ def #{type}(options = {}, &blk)
end end


class WebMockHttpConnection < HttpConnection class WebMockHttpConnection < HttpConnection
def webmock_activate_connection(client) def activate_connection(client)
request_signature = client.request_signature request_signature = client.request_signature


if client.stubbed_webmock_response if client.stubbed_webmock_response
Expand All @@ -65,13 +65,11 @@ def webmock_activate_connection(client)
finalize_request(client) finalize_request(client)
@conn.set_deferred_status :succeeded @conn.set_deferred_status :succeeded
elsif WebMock.net_connect_allowed?(request_signature.uri) elsif WebMock.net_connect_allowed?(request_signature.uri)
real_activate_connection(client) super
else else
raise WebMock::NetConnectNotAllowedError.new(request_signature) raise WebMock::NetConnectNotAllowedError.new(request_signature)
end end
end end
alias_method :real_activate_connection, :activate_connection
alias_method :activate_connection, :webmock_activate_connection
end end


class WebMockHttpClient < EventMachine::HttpClient class WebMockHttpClient < EventMachine::HttpClient
Expand All @@ -92,7 +90,7 @@ def setup(response, uri, error = nil)
end end
end end


def send_request_with_webmock(head, body) def send_request(head, body)
WebMock::RequestRegistry.instance.requested_signatures.put(request_signature) WebMock::RequestRegistry.instance.requested_signatures.put(request_signature)


if stubbed_webmock_response if stubbed_webmock_response
Expand All @@ -104,15 +102,12 @@ def send_request_with_webmock(head, body)
} }
self self
elsif WebMock.net_connect_allowed?(request_signature.uri) elsif WebMock.net_connect_allowed?(request_signature.uri)
send_request_without_webmock(head, body) super
else else
raise WebMock::NetConnectNotAllowedError.new(request_signature) raise WebMock::NetConnectNotAllowedError.new(request_signature)
end end
end end


alias_method :send_request_without_webmock, :send_request
alias_method :send_request, :send_request_with_webmock

def set_deferred_status(status, *args) def set_deferred_status(status, *args)
if status == :succeeded && !stubbed_webmock_response && WebMock::CallbackRegistry.any_callbacks? if status == :succeeded && !stubbed_webmock_response && WebMock::CallbackRegistry.any_callbacks?
webmock_response = build_webmock_response webmock_response = build_webmock_response
Expand Down
25 changes: 9 additions & 16 deletions lib/webmock/http_lib_adapters/httpclient_adapter.rb
Expand Up @@ -28,16 +28,18 @@ def self.disable!




class WebMockHTTPClient < HTTPClient class WebMockHTTPClient < HTTPClient
alias_method :do_get_block_without_webmock, :do_get_block
alias_method :do_get_stream_without_webmock, :do_get_stream


def do_get_block_with_webmock(req, proxy, conn, &block) def do_get_block(req, proxy, conn, &block)
do_get_with_webmock(req, proxy, conn, false, &block) do_get(req, proxy, conn, false, &block)
end end


def do_get_stream_with_webmock(req, proxy, conn, &block) def do_get_stream(req, proxy, conn, &block)
do_get_with_webmock(req, proxy, conn, true, &block) do_get(req, proxy, conn, true, &block)
end end


def do_get_with_webmock(req, proxy, conn, stream = false, &block) def do_get(req, proxy, conn, stream = false, &block)
request_signature = build_request_signature(req, :reuse_existing) request_signature = build_request_signature(req, :reuse_existing)


WebMock::RequestRegistry.instance.requested_signatures.put(request_signature) WebMock::RequestRegistry.instance.requested_signatures.put(request_signature)
Expand Down Expand Up @@ -72,27 +74,18 @@ def do_get_with_webmock(req, proxy, conn, stream = false, &block)
end end
end end


def do_request_async_with_webmock(method, uri, query, body, extheader) def do_request_async(method, uri, query, body, extheader)
req = create_request(method, uri, query, body, extheader) req = create_request(method, uri, query, body, extheader)
request_signature = build_request_signature(req) request_signature = build_request_signature(req)
webmock_request_signatures << request_signature webmock_request_signatures << request_signature


if webmock_responses[request_signature] || WebMock.net_connect_allowed?(request_signature.uri) if webmock_responses[request_signature] || WebMock.net_connect_allowed?(request_signature.uri)
do_request_async_without_webmock(method, uri, query, body, extheader) super
else else
raise WebMock::NetConnectNotAllowedError.new(request_signature) raise WebMock::NetConnectNotAllowedError.new(request_signature)
end end
end end


alias_method :do_get_block_without_webmock, :do_get_block
alias_method :do_get_block, :do_get_block_with_webmock

alias_method :do_get_stream_without_webmock, :do_get_stream
alias_method :do_get_stream, :do_get_stream_with_webmock

alias_method :do_request_async_without_webmock, :do_request_async
alias_method :do_request_async, :do_request_async_with_webmock

def build_httpclient_response(webmock_response, stream = false, &block) def build_httpclient_response(webmock_response, stream = false, &block)
body = stream ? StringIO.new(webmock_response.body) : webmock_response.body body = stream ? StringIO.new(webmock_response.body) : webmock_response.body
response = HTTP::Message.new_response(body) response = HTTP::Message.new_response(body)
Expand Down
24 changes: 9 additions & 15 deletions lib/webmock/http_lib_adapters/net_http.rb
Expand Up @@ -32,11 +32,9 @@ def self.disable!


@webMockNetHTTP = Class.new(Net::HTTP) do @webMockNetHTTP = Class.new(Net::HTTP) do
class << self class << self
def socket_type_with_webmock def socket_type
StubSocket StubSocket
end end
alias_method :socket_type_without_webmock, :socket_type
alias_method :socket_type, :socket_type_with_webmock


if Module.method(:const_defined?).arity == 1 if Module.method(:const_defined?).arity == 1
def const_defined?(name) def const_defined?(name)
Expand All @@ -63,7 +61,7 @@ def constants(inherit=true)
end end
end end


def request_with_webmock(request, body = nil, &block) def request(request, body = nil, &block)
request_signature = WebMock::NetHTTPUtility.request_signature_from_request(self, request, body) request_signature = WebMock::NetHTTPUtility.request_signature_from_request(self, request, body)


WebMock::RequestRegistry.instance.requested_signatures.put(request_signature) WebMock::RequestRegistry.instance.requested_signatures.put(request_signature)
Expand All @@ -88,19 +86,17 @@ def request_with_webmock(request, body = nil, &block)
response = if (started? && !WebMock::Config.instance.net_http_connect_on_start) || !started? response = if (started? && !WebMock::Config.instance.net_http_connect_on_start) || !started?
@started = false #otherwise start_with_connect wouldn't execute and connect @started = false #otherwise start_with_connect wouldn't execute and connect
start_with_connect { start_with_connect {
response = request_without_webmock(request, nil) response = super(request, nil, &nil)
after_request.call(response) after_request.call(response)
} }
else else
response = request_without_webmock(request, nil) response = super(request, nil, &nil)
after_request.call(response) after_request.call(response)
end end
else else
raise WebMock::NetConnectNotAllowedError.new(request_signature) raise WebMock::NetConnectNotAllowedError.new(request_signature)
end end
end end
alias_method :request_without_webmock, :request
alias_method :request, :request_with_webmock


def start_without_connect def start_without_connect
raise IOError, 'HTTP session already opened' if @started raise IOError, 'HTTP session already opened' if @started
Expand All @@ -116,15 +112,15 @@ def start_without_connect
self self
end end


def start_with_conditional_connect(&block) alias_method :start_with_connect, :start

def start(&block)
if WebMock::Config.instance.net_http_connect_on_start if WebMock::Config.instance.net_http_connect_on_start
start_with_connect(&block) super(&block)
else else
start_without_connect(&block) start_without_connect(&block)
end end
end end
alias_method :start_with_connect, :start
alias_method :start, :start_with_conditional_connect


def build_net_http_response(webmock_response, &block) def build_net_http_response(webmock_response, &block)
response = Net::HTTPResponse.send(:response_class, webmock_response.status[0].to_s).new("1.0", webmock_response.status[0].to_s, webmock_response.status[1]) response = Net::HTTPResponse.send(:response_class, webmock_response.status[0].to_s).new("1.0", webmock_response.status[0].to_s, webmock_response.status[1])
Expand Down Expand Up @@ -204,7 +200,7 @@ def readuntil(*args)
module Net #:nodoc: all module Net #:nodoc: all


class WebMockNetBufferedIO < BufferedIO class WebMockNetBufferedIO < BufferedIO
def initialize_with_webmock(io, debug_output = nil) def initialize(io, debug_output = nil)
@read_timeout = 60 @read_timeout = 60
@rbuf = '' @rbuf = ''
@debug_output = debug_output @debug_output = debug_output
Expand All @@ -217,8 +213,6 @@ def initialize_with_webmock(io, debug_output = nil)
end end
raise "Unable to create local socket" unless @io raise "Unable to create local socket" unless @io
end end
alias_method :initialize_without_webmock, :initialize
alias_method :initialize, :initialize_with_webmock
end end


end end
Expand Down
7 changes: 2 additions & 5 deletions lib/webmock/http_lib_adapters/patron_adapter.rb
Expand Up @@ -13,7 +13,7 @@ class PatronAdapter < ::WebMock::HttpLibAdapter
OriginalPatronSession = ::Patron::Session unless const_defined?(:OriginalPatronSession) OriginalPatronSession = ::Patron::Session unless const_defined?(:OriginalPatronSession)


class WebMockPatronSession < ::Patron::Session class WebMockPatronSession < ::Patron::Session
def handle_request_with_webmock(req) def handle_request(req)
request_signature = request_signature =
WebMock::HttpLibAdapters::PatronAdapter.build_request_signature(req) WebMock::HttpLibAdapters::PatronAdapter.build_request_signature(req)


Expand All @@ -28,7 +28,7 @@ def handle_request_with_webmock(req)
{:lib => :patron}, request_signature, webmock_response) {:lib => :patron}, request_signature, webmock_response)
res res
elsif WebMock.net_connect_allowed?(request_signature.uri) elsif WebMock.net_connect_allowed?(request_signature.uri)
res = handle_request_without_webmock(req) res = super
if WebMock::CallbackRegistry.any_callbacks? if WebMock::CallbackRegistry.any_callbacks?
webmock_response = WebMock::HttpLibAdapters::PatronAdapter. webmock_response = WebMock::HttpLibAdapters::PatronAdapter.
build_webmock_response(res) build_webmock_response(res)
Expand All @@ -41,9 +41,6 @@ def handle_request_with_webmock(req)
raise WebMock::NetConnectNotAllowedError.new(request_signature) raise WebMock::NetConnectNotAllowedError.new(request_signature)
end end
end end

alias_method :handle_request_without_webmock, :handle_request
alias_method :handle_request, :handle_request_with_webmock
end end


def self.enable! def self.enable!
Expand Down

0 comments on commit caeb0da

Please sign in to comment.