webmock 1.10.2 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.11.0
4
+
5
+ * Excon >= 0.17 support.
6
+
7
+ Thanks to [Nathan Sutton](https://github.com/nate) for reporting this issue and to [Wesley Beary](https://github.com/geemus) and [Myron Marston](https://github.com/myronmarston) for help.
8
+
3
9
  ## 1.10.2
4
10
 
5
11
  * '+' in request path is treated as plus, but in query params always as a space.
@@ -11,18 +11,71 @@ if defined?(Excon)
11
11
  module HttpLibAdapters
12
12
 
13
13
  class ExconAdapter < HttpLibAdapter
14
+ PARAMS_TO_DELETE = [:expects, :idempotent,
15
+ :instrumentor_name, :instrumentor,
16
+ :response_block, :request_block,
17
+ :__construction_args, :stack,
18
+ :connection, :response]
19
+
14
20
  adapter_for :excon
15
21
 
16
22
  def self.enable!
17
- Excon.send(:remove_const, :Connection)
18
- Excon.send(:const_set, :Connection, ExconConnection)
23
+ self.add_excon_stub
19
24
  end
20
25
 
21
26
  def self.disable!
22
- Excon.send(:remove_const, :Connection)
23
- Excon.send(:const_set, :Connection, ExconConnection.superclass)
27
+ self.remove_excon_stub
28
+ end
29
+
30
+ def self.add_excon_stub
31
+ if not @stub
32
+ @original_excon_mock_default = ::Excon.defaults[:mock]
33
+ ::Excon.defaults[:mock] = true
34
+ @stub = ::Excon.stub({}) do |params|
35
+ self.handle_request(params)
36
+ end
37
+ end
24
38
  end
25
39
 
40
+ def self.remove_excon_stub
41
+ ::Excon.defaults[:mock] = @original_excon_mock_default
42
+ @original_excon_mock_default = nil
43
+ Excon.stubs.delete(@stub)
44
+ @stub = nil
45
+ end
46
+
47
+ def self.handle_request(params)
48
+ mock_request = self.build_request params.dup
49
+ WebMock::RequestRegistry.instance.requested_signatures.put(mock_request)
50
+
51
+ if mock_response = WebMock::StubRegistry.instance.response_for_request(mock_request)
52
+ self.perform_callbacks(mock_request, mock_response, :real_request => false)
53
+ response = self.real_response(mock_response)
54
+ response
55
+ elsif WebMock.net_connect_allowed?(mock_request.uri)
56
+ conn = new_excon_connection(params)
57
+ real_response = conn.request(scrub_params_from(params.merge(:mock => false)))
58
+
59
+ ExconAdapter.perform_callbacks(mock_request, ExconAdapter.mock_response(real_response), :real_request => true)
60
+
61
+ real_response.data
62
+ else
63
+ raise WebMock::NetConnectNotAllowedError.new(mock_request)
64
+ end
65
+ end
66
+
67
+ def self.new_excon_connection(params)
68
+ # Ensure the connection is constructed with the exact same args
69
+ # that the orginal connection was constructed with.
70
+ args = params.fetch(:__construction_args)
71
+ ::Excon::Connection.new(scrub_params_from args.merge(:mock => false))
72
+ end
73
+
74
+ def self.scrub_params_from(hash)
75
+ hash = hash.dup
76
+ PARAMS_TO_DELETE.each { |key| hash.delete(key) }
77
+ hash
78
+ end
26
79
 
27
80
  def self.to_query(hash)
28
81
  string = ""
@@ -58,17 +111,18 @@ if defined?(Excon)
58
111
  def self.real_response(mock)
59
112
  raise Excon::Errors::Timeout if mock.should_timeout
60
113
  mock.raise_error_if_any
61
- Excon::Response.new \
114
+ {
62
115
  :body => mock.body,
63
116
  :status => mock.status[0].to_i,
64
- :headers => mock.headers
117
+ :headers => mock.headers || {}
118
+ }
65
119
  end
66
120
 
67
- def self.mock_response(real, response_body_from_chunks)
121
+ def self.mock_response(real)
68
122
  mock = WebMock::Response.new
69
123
  mock.status = real.status
70
124
  mock.headers = real.headers
71
- mock.body = response_body_from_chunks || real.body
125
+ mock.body = real.body
72
126
  mock
73
127
  end
74
128
 
@@ -76,54 +130,15 @@ if defined?(Excon)
76
130
  return unless WebMock::CallbackRegistry.any_callbacks?
77
131
  WebMock::CallbackRegistry.invoke_callbacks(options.merge(:lib => :excon), request, response)
78
132
  end
79
-
80
133
  end
134
+ end
135
+ end
81
136
 
82
- class ExconConnection < ::Excon::Connection
83
-
84
- def request_kernel(params)
85
- mock_request = ExconAdapter.build_request params.dup
86
- WebMock::RequestRegistry.instance.requested_signatures.put(mock_request)
87
-
88
- if mock_response = WebMock::StubRegistry.instance.response_for_request(mock_request)
89
- ExconAdapter.perform_callbacks(mock_request, mock_response, :real_request => false)
90
- response = ExconAdapter.real_response(mock_response)
91
-
92
- if params.has_key?(:expects) && ![*params[:expects]].include?(response.status)
93
- raise(Excon::Errors.status_error(params, response))
94
- elsif params.has_key?(:response_block)
95
- content_length = remaining = response.body.bytesize
96
- body = response.body
97
- response.body = ""
98
- i = 0
99
- while i < body.length
100
- params[:response_block].call(body[i, params[:chunk_size]], [remaining - params[:chunk_size], 0].max, content_length)
101
- remaining -= params[:chunk_size]
102
- i += params[:chunk_size]
103
- end
104
- end
105
- response
106
-
107
- elsif WebMock.net_connect_allowed?(mock_request.uri)
108
- response_body_from_chunks = nil
109
- if params.has_key?(:response_block)
110
- response_body_from_chunks = ""
111
- original_block = params[:response_block]
112
- params[:response_block] = lambda {|chunk, remaining, total|
113
- response_body_from_chunks << chunk
114
- original_block.call(chunk, remaining, total)
115
- }
116
- end
117
- real_response = super
118
- ExconAdapter.perform_callbacks(mock_request, ExconAdapter.mock_response(real_response, response_body_from_chunks), :real_request => true)
119
- real_response
120
- else
121
- raise WebMock::NetConnectNotAllowedError.new(mock_request)
122
- end
123
- end
124
-
137
+ Excon::Connection.class_eval do
138
+ def self.new(args)
139
+ super.tap do |instance|
140
+ instance.data[:__construction_args] = args
125
141
  end
126
142
  end
127
143
  end
128
-
129
144
  end
@@ -1,3 +1,3 @@
1
1
  module WebMock
2
- VERSION = '1.10.2' unless defined?(::WebMock::VERSION)
2
+ VERSION = '1.11.0' unless defined?(::WebMock::VERSION)
3
3
  end
@@ -8,19 +8,19 @@ describe "Excon" do
8
8
 
9
9
  it 'should allow Excon requests to use query hash paramters' do
10
10
  stub_request(:get, "http://example.com/resource/?a=1&b=2").to_return(:body => "abc")
11
- Excon.get('http://example.com', :path => "resource/", :query => {:a => 1, :b => 2}).body.should == "abc"
11
+ Excon.new('http://example.com').get(:path => "resource/", :query => {:a => 1, :b => 2}).body.should == "abc"
12
12
  end
13
13
 
14
14
  it 'should support Excon :expects options' do
15
15
  stub_request(:get, "http://example.com/").to_return(:body => 'a')
16
- lambda { Excon.get('http://example.com', :expects => 204) }.should raise_error(Excon::Errors::OK)
16
+ lambda { Excon.new('http://example.com').get(:expects => 204) }.should raise_error(Excon::Errors::OK)
17
17
  end
18
18
 
19
19
  context "with response_block" do
20
20
  it "should support excon response_block for real requests" do
21
21
  a = []
22
22
  WebMock.allow_net_connect!
23
- r = Excon.get('http://httpstat.us/200', :response_block => lambda {|e,remaining, total| a << e}, :chunk_size => 1)
23
+ r = Excon.new('http://httpstat.us/200').get(:response_block => lambda {|e, remaining, total| a << e}, :chunk_size => 1)
24
24
  a.should == ["2", "0", "0", " ", "O", "K"]
25
25
  r.body.should == ""
26
26
  end
@@ -28,7 +28,7 @@ describe "Excon" do
28
28
  it "should support excon response_block" do
29
29
  a = []
30
30
  stub_request(:get, "http://example.com/").to_return(:body => "abc")
31
- r = Excon.get('http://example.com', :response_block => lambda {|e, remaining, total| a << e}, :chunk_size => 1)
31
+ r = Excon.new('http://example.com').get(:response_block => lambda {|e, remaining, total| a << e}, :chunk_size => 1)
32
32
  a.should == ['a', 'b', 'c']
33
33
  r.body.should == ""
34
34
  end
@@ -40,7 +40,7 @@ describe "Excon" do
40
40
  WebMock.after_request { |_, res|
41
41
  response = res
42
42
  }
43
- r = Excon.get('http://httpstat.us/200', :response_block => lambda {|e,remaining, total| a << e}, :chunk_size => 1)
43
+ r = Excon.new('http://httpstat.us/200').get(:response_block => lambda {|e, remaining, total| a << e}, :chunk_size => 1)
44
44
  response.body.should == "200 OK"
45
45
  a.should == ["2", "0", "0", " ", "O", "K"]
46
46
  r.body.should == ""
@@ -58,7 +58,7 @@ describe "Excon" do
58
58
  yielded_request_body = req.body
59
59
  end
60
60
 
61
- Excon.put("http://example.com", :path => "upload", :body => file)
61
+ Excon.new("http://example.com").put(:path => "upload", :body => file)
62
62
 
63
63
  yielded_request_body.should eq(file_contents)
64
64
  end
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
- - 10
9
- - 2
10
- version: 1.10.2
8
+ - 11
9
+ - 0
10
+ version: 1.11.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Bartosz Blimke