excon 0.61.0 → 0.63.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of excon might be problematic. Click here for more details.

Files changed (54) hide show
  1. checksums.yaml +5 -5
  2. data/.github/stale.yml +17 -0
  3. data/.travis.yml +7 -19
  4. data/LICENSE.md +1 -1
  5. data/README.md +5 -4
  6. data/changelog.txt +30 -0
  7. data/data/cacert.pem +440 -994
  8. data/excon.gemspec +9 -0
  9. data/lib/excon/connection.rb +53 -36
  10. data/lib/excon/constants.rb +33 -13
  11. data/lib/excon/error.rb +3 -0
  12. data/lib/excon/instrumentors/logging_instrumentor.rb +3 -14
  13. data/lib/excon/instrumentors/standard_instrumentor.rb +1 -8
  14. data/lib/excon/middlewares/base.rb +6 -0
  15. data/lib/excon/middlewares/expects.rb +6 -0
  16. data/lib/excon/middlewares/idempotent.rb +20 -3
  17. data/lib/excon/middlewares/instrumentor.rb +8 -0
  18. data/lib/excon/middlewares/mock.rb +8 -0
  19. data/lib/excon/middlewares/response_parser.rb +3 -0
  20. data/lib/excon/pretty_printer.rb +1 -8
  21. data/lib/excon/socket.rb +36 -10
  22. data/lib/excon/ssl_socket.rb +7 -0
  23. data/lib/excon/utils.rb +23 -4
  24. data/lib/excon/version.rb +1 -1
  25. data/lib/excon.rb +9 -1
  26. data/spec/excon/test/server_spec.rb +2 -2
  27. data/spec/helpers/warning_helpers.rb +9 -0
  28. data/spec/requests/unix_socket_spec.rb +2 -10
  29. data/spec/requests/validation_spec.rb +80 -0
  30. data/spec/spec_helper.rb +2 -0
  31. data/spec/support/shared_contexts/test_stub_context.rb +11 -0
  32. data/spec/support/shared_examples/shared_example_for_clients.rb +13 -2
  33. data/tests/authorization_header_tests.rb +19 -21
  34. data/tests/bad_tests.rb +22 -0
  35. data/tests/batch_requests.rb +1 -1
  36. data/tests/complete_responses.rb +1 -1
  37. data/tests/data/127.0.0.1.cert.crt +15 -18
  38. data/tests/data/127.0.0.1.cert.key +28 -27
  39. data/tests/data/excon.cert.crt +15 -18
  40. data/tests/data/excon.cert.key +28 -27
  41. data/tests/error_tests.rb +1 -1
  42. data/tests/instrumentors/logging_instrumentor_tests.rb +28 -0
  43. data/tests/middlewares/decompress_tests.rb +1 -1
  44. data/tests/middlewares/idempotent_tests.rb +56 -17
  45. data/tests/middlewares/mock_tests.rb +2 -2
  46. data/tests/pipeline_tests.rb +1 -1
  47. data/tests/request_tests.rb +5 -6
  48. data/tests/response_tests.rb +1 -1
  49. data/tests/servers/bad.rb +5 -0
  50. data/tests/servers/good.rb +0 -8
  51. data/tests/servers/good_ipv4.rb +8 -0
  52. data/tests/servers/good_ipv6.rb +8 -0
  53. data/tests/test_helper.rb +27 -36
  54. metadata +17 -5
@@ -9,12 +9,12 @@ Shindo.tests('Excon request idempotencey') do
9
9
  Excon.stubs.clear
10
10
  end
11
11
 
12
- tests("Non-idempotent call with an erroring socket").raises(Excon::Errors::SocketError) do
12
+ tests("Non-idempotent call with an erroring socket").raises(Excon::Error::Socket) do
13
13
  run_count = 0
14
14
  Excon.stub({:method => :get}) { |params|
15
15
  run_count += 1
16
16
  if run_count <= 3 # First 3 calls fail.
17
- raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
17
+ raise Excon::Error::Socket.new(Exception.new "Mock Error")
18
18
  else
19
19
  {:body => params[:body], :headers => params[:headers], :status => 200}
20
20
  end
@@ -28,7 +28,7 @@ Shindo.tests('Excon request idempotencey') do
28
28
  Excon.stub({:method => :get}) { |params|
29
29
  run_count += 1
30
30
  if run_count <= 3 # First 3 calls fail.
31
- raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
31
+ raise Excon::Error::Socket.new(Exception.new "Mock Error")
32
32
  else
33
33
  {:body => params[:body], :headers => params[:headers], :status => 200}
34
34
  end
@@ -38,12 +38,12 @@ Shindo.tests('Excon request idempotencey') do
38
38
  response.status
39
39
  end
40
40
 
41
- tests("Idempotent request with socket erroring first 5 times").raises(Excon::Errors::SocketError) do
41
+ tests("Idempotent request with socket erroring first 5 times").raises(Excon::Error::Socket) do
42
42
  run_count = 0
43
43
  Excon.stub({:method => :get}) { |params|
44
44
  run_count += 1
45
45
  if run_count <= 5 # First 5 calls fail.
46
- raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
46
+ raise Excon::Error::Socket.new(Exception.new "Mock Error")
47
47
  else
48
48
  {:body => params[:body], :headers => params[:headers], :status => 200}
49
49
  end
@@ -58,7 +58,7 @@ Shindo.tests('Excon request idempotencey') do
58
58
  Excon.stub({:method => :get}) { |params|
59
59
  run_count += 1
60
60
  if run_count <= 1 # First call fails.
61
- raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
61
+ raise Excon::Error::Socket.new(Exception.new "Mock Error")
62
62
  else
63
63
  {:body => params[:body], :headers => params[:headers], :status => 200}
64
64
  end
@@ -68,12 +68,12 @@ Shindo.tests('Excon request idempotencey') do
68
68
  response.status
69
69
  end
70
70
 
71
- tests("Lowered retry limit with socket erroring first 3 times").raises(Excon::Errors::SocketError) do
71
+ tests("Lowered retry limit with socket erroring first 3 times").raises(Excon::Error::Socket) do
72
72
  run_count = 0
73
73
  Excon.stub({:method => :get}) { |params|
74
74
  run_count += 1
75
75
  if run_count <= 3 # First 3 calls fail.
76
- raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
76
+ raise Excon::Error::Socket.new(Exception.new "Mock Error")
77
77
  else
78
78
  {:body => params[:body], :headers => params[:headers], :status => 200}
79
79
  end
@@ -88,7 +88,7 @@ Shindo.tests('Excon request idempotencey') do
88
88
  Excon.stub({:method => :get}) { |params|
89
89
  run_count += 1
90
90
  if run_count <= 5 # First 5 calls fail.
91
- raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
91
+ raise Excon::Error::Socket.new(Exception.new "Mock Error")
92
92
  else
93
93
  {:body => params[:body], :headers => params[:headers], :status => 200}
94
94
  end
@@ -98,12 +98,12 @@ Shindo.tests('Excon request idempotencey') do
98
98
  response.status
99
99
  end
100
100
 
101
- tests("Raised retry limit with socket erroring first 9 times").raises(Excon::Errors::SocketError) do
101
+ tests("Raised retry limit with socket erroring first 9 times").raises(Excon::Error::Socket) do
102
102
  run_count = 0
103
103
  Excon.stub({:method => :get}) { |params|
104
104
  run_count += 1
105
105
  if run_count <= 9 # First 9 calls fail.
106
- raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
106
+ raise Excon::Error::Socket.new(Exception.new "Mock Error")
107
107
  else
108
108
  {:body => params[:body], :headers => params[:headers], :status => 200}
109
109
  end
@@ -118,7 +118,7 @@ Shindo.tests('Excon request idempotencey') do
118
118
  Excon.stub({:method => :get}) { |params|
119
119
  run_count += 1
120
120
  if run_count <= 5 # First 5 calls fail.
121
- raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
121
+ raise Excon::Error::Socket.new(Exception.new "Mock Error")
122
122
  else
123
123
  {:body => params[:body], :headers => params[:headers], :status => 200}
124
124
  end
@@ -133,7 +133,7 @@ Shindo.tests('Excon request idempotencey') do
133
133
  Excon.stub({:method => :get}) { |params|
134
134
  run_count += 1
135
135
  if run_count <= 2 # First 5 calls fail.
136
- raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
136
+ raise Excon::Error::Socket.new(Exception.new "Mock Error")
137
137
  else
138
138
  {:body => params[:body], :headers => params[:headers], :status => 200}
139
139
  end
@@ -145,12 +145,12 @@ Shindo.tests('Excon request idempotencey') do
145
145
  response.status
146
146
  end
147
147
 
148
- tests("Retry limit and sleep in constructor with socket erroring first 2 times").raises(Excon::Errors::SocketError) do
148
+ tests("Retry limit and sleep in constructor with socket erroring first 2 times").raises(Excon::Error::Socket) do
149
149
  run_count = 0
150
150
  Excon.stub({:method => :get}) { |params|
151
151
  run_count += 1
152
152
  if run_count <= 2 # First 5 calls fail.
153
- raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
153
+ raise Excon::Error::Socket.new(Exception.new "Mock Error")
154
154
  else
155
155
  {:body => params[:body], :headers => params[:headers], :status => 200}
156
156
  end
@@ -161,6 +161,45 @@ Shindo.tests('Excon request idempotencey') do
161
161
  response.status
162
162
  end
163
163
 
164
+ tests("Idempotent request with custom error first 3 times").returns(200) do
165
+ run_count = 0
166
+ Excon.stub({:method => :get}) { |params|
167
+ run_count += 1
168
+ if run_count <= 3 # First 3 calls fail.
169
+ raise "oops"
170
+ else
171
+ {:body => params[:body], :headers => params[:headers], :status => 200}
172
+ end
173
+ }
174
+
175
+ response = @connection.request(:method => :get, :idempotent => true, :retry_errors => [RuntimeError], :path => '/some-path')
176
+ response.status
177
+ end
178
+
179
+ tests("Idempotent request with custom error first 5 times").raises(RuntimeError) do
180
+ run_count = 0
181
+ Excon.stub({:method => :get}) { |params|
182
+ run_count += 1
183
+ if run_count <= 5 # First 5 calls fail.
184
+ raise "oops"
185
+ else
186
+ {:body => params[:body], :headers => params[:headers], :status => 200}
187
+ end
188
+ }
189
+
190
+ response = @connection.request(:method => :get, :idempotent => true, :retry_errors => [RuntimeError], :path => '/some-path')
191
+ response.status
192
+ end
193
+
194
+ tests("Overriding default retry_errors").raises(Excon::Error::Socket) do
195
+ Excon.stub({:method => :get}) { |params|
196
+ raise Excon::Error::Socket.new(Exception.new "Mock Error")
197
+ }
198
+
199
+ response = @connection.request(:method => :get, :idempotent => true, :retry_errors => [RuntimeError], :path => '/some-path')
200
+ response.status
201
+ end
202
+
164
203
  class Block
165
204
  attr_reader :rewound
166
205
  def initialize
@@ -178,7 +217,7 @@ Shindo.tests('Excon request idempotencey') do
178
217
  Excon.stub({:method => :get}) { |params|
179
218
  run_count += 1
180
219
  if run_count <= 1 # First call fails.
181
- raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
220
+ raise Excon::Error::Socket.new(Exception.new "Mock Error")
182
221
  else
183
222
  {:body => params[:body], :headers => params[:headers], :status => 200}
184
223
  end
@@ -193,7 +232,7 @@ Shindo.tests('Excon request idempotencey') do
193
232
  Excon.stub({:method => :get}) { |params|
194
233
  run_count += 1
195
234
  if run_count <= 1 # First call fails.
196
- raise Excon::Errors::SocketError.new(Exception.new "Mock Error")
235
+ raise Excon::Error::Socket.new(Exception.new "Mock Error")
197
236
  else
198
237
  {:body => params[:body], :headers => params[:headers], :status => 200}
199
238
  end
@@ -96,7 +96,7 @@ Shindo.tests('Excon stubs') do
96
96
  response.body
97
97
  end
98
98
 
99
- tests('response.headers').returns({'Host' => '127.0.0.1:9292', 'User-Agent' => "excon/#{Excon::VERSION}"}) do
99
+ tests('response.headers').returns({'Accept' => '*/*', 'Host' => '127.0.0.1:9292', 'User-Agent' => "excon/#{Excon::VERSION}"}) do
100
100
  response.headers
101
101
  end
102
102
 
@@ -153,7 +153,7 @@ Shindo.tests('Excon stubs') do
153
153
  Excon.get('http://127.0.0.1:9292/', :mock => true)
154
154
  end
155
155
 
156
- with_server('good') do
156
+ with_server('good_ipv4') do
157
157
  tests('allow mismatched stub').returns(200) do
158
158
  Excon.stub({:path => '/echo/request_count'}, {:body => 'body'})
159
159
  Excon.get(
@@ -1,5 +1,5 @@
1
1
  Shindo.tests('Pipelined Requests') do
2
- with_server('good') do
2
+ with_server('good_ipv4') do
3
3
 
4
4
  tests('with default :persistent => true') do
5
5
  returns(%w{ 1 2 3 4 }, 'connection is persistent') do
@@ -1,10 +1,9 @@
1
1
  Shindo.tests('Request Tests') do
2
- with_server('good') do
3
-
4
- tests('persistent connections') do
5
- ip_ports = %w(127.0.0.1:9292)
6
- ip_ports << "[::1]:9293" unless RUBY_PLATFORM == 'java'
7
- ip_ports.each do |ip_port|
2
+ tests('persistent connections') do
3
+ ip_ports = [['127.0.0.1:9292', 'good_ipv4']]
4
+ ip_ports << ['[::1]:9293', 'good_ipv6'] unless RUBY_PLATFORM == 'java'
5
+ ip_ports.each do |ip_port, server|
6
+ with_server(server) do
8
7
 
9
8
  tests("with default :persistent => true, #{ip_port}") do
10
9
  connection = nil
@@ -1,7 +1,7 @@
1
1
  Shindo.tests('Excon Response Parsing') do
2
2
  env_init
3
3
 
4
- with_server('good') do
4
+ with_server('good_ipv4') do
5
5
 
6
6
  tests('responses with chunked transfer-encoding') do
7
7
 
data/tests/servers/bad.rb CHANGED
@@ -5,6 +5,11 @@ require "eventmachine"
5
5
  module BadServer
6
6
  def receive_data(data)
7
7
  case data
8
+ when %r{^GET /echo\s}
9
+ send_data "HTTP/1.1 200 OK\r\n"
10
+ send_data "\r\n"
11
+ send_data data
12
+ close_connection(true)
8
13
  when %r{^GET /eof/no_content_length_and_no_chunking\s}
9
14
  send_data "HTTP/1.1 200 OK\r\n"
10
15
  send_data "\r\n"
@@ -1,5 +1,3 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  require 'eventmachine'
4
2
  require 'stringio'
5
3
  require 'uri'
@@ -342,9 +340,3 @@ module GoodServer
342
340
  (?:,\s*|\Z)'xn).flatten
343
341
  end
344
342
  end
345
-
346
- EM.run do
347
- EM.start_server("127.0.0.1", 9292, GoodServer)
348
- EM.start_server("::1", 9293, GoodServer) unless RUBY_PLATFORM == 'java'
349
- $stderr.puts "ready"
350
- end
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.join(File.expand_path(File.dirname(__FILE__)), 'good')
4
+
5
+ EM.run do
6
+ EM.start_server("127.0.0.1", 9292, GoodServer)
7
+ $stderr.puts "ready"
8
+ end
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.join(File.expand_path(File.dirname(__FILE__)), 'good')
4
+
5
+ EM.run do
6
+ EM.start_server("::1", 9293, GoodServer) unless RUBY_PLATFORM == 'java'
7
+ $stderr.puts "ready"
8
+ end
data/tests/test_helper.rb CHANGED
@@ -4,11 +4,14 @@ require 'excon'
4
4
  require 'delorean'
5
5
  require 'open4'
6
6
 
7
+ require './spec/helpers/warning_helpers.rb'
8
+
7
9
  Excon.defaults.merge!(
8
10
  :connect_timeout => 5,
9
11
  :read_timeout => 5,
10
12
  :write_timeout => 5
11
13
  )
14
+ Excon.set_raise_on_warnings!(true)
12
15
 
13
16
  def basic_tests(url = 'http://127.0.0.1:9292', options = {})
14
17
  ([true, false] * 2).combination(2).to_a.uniq.each do |nonblock, persistent|
@@ -211,14 +214,6 @@ def env_stack
211
214
  @env_stack ||= []
212
215
  end
213
216
 
214
- def silence_warnings
215
- orig_verbose = $VERBOSE
216
- $VERBOSE = nil
217
- yield
218
- ensure
219
- $VERBOSE = orig_verbose
220
- end
221
-
222
217
  def capture_response_block
223
218
  captures = []
224
219
  yield lambda {|chunk, remaining_bytes, total_bytes|
@@ -227,25 +222,34 @@ def capture_response_block
227
222
  captures
228
223
  end
229
224
 
230
- def rackup_path(*parts)
231
- File.expand_path(File.join(File.dirname(__FILE__), 'rackups', *parts))
232
- end
233
-
234
- def with_rackup(name, host="127.0.0.1")
225
+ def launch_process(*args)
235
226
  unless RUBY_PLATFORM == 'java'
236
227
  GC.disable if RUBY_VERSION < '1.9'
237
- pid, w, r, e = Open4.popen4("rackup", "-s", "webrick", "--host", host, rackup_path(name))
228
+ pid, w, r, e = Open4.popen4(*args)
238
229
  else
239
- pid, w, r, e = IO.popen4("rackup", "-s", "webrick", "--host", host, rackup_path(name))
230
+ pid, w, r, e = IO.popen4(*args)
240
231
  end
241
- until e.gets =~ /HTTPServer#start:/; end
242
- yield
243
- ensure
232
+ return pid, w, r, e
233
+ end
234
+
235
+ def cleanup_process(pid)
244
236
  Process.kill(9, pid)
245
237
  unless RUBY_PLATFORM == 'java'
246
238
  GC.enable if RUBY_VERSION < '1.9'
247
239
  Process.wait(pid)
248
240
  end
241
+ end
242
+
243
+ def rackup_path(*parts)
244
+ File.expand_path(File.join(File.dirname(__FILE__), 'rackups', *parts))
245
+ end
246
+
247
+ def with_rackup(name, host="127.0.0.1")
248
+ pid, w, r, e = launch_process("rackup", "-s", "webrick", "--host", host, rackup_path(name))
249
+ until e.gets =~ /HTTPServer#start:/; end
250
+ yield
251
+ ensure
252
+ cleanup_process(pid)
249
253
 
250
254
  # dump server errors
251
255
  lines = e.read.split($/)
@@ -265,20 +269,16 @@ end
265
269
 
266
270
  def with_unicorn(name, listen='127.0.0.1:9292')
267
271
  unless RUBY_PLATFORM == 'java'
268
- GC.disable if RUBY_VERSION < '1.9'
269
272
  unix_socket = listen.sub('unix://', '') if listen.start_with? 'unix://'
270
- pid, w, r, e = Open4.popen4("unicorn", "--no-default-middleware","-l", listen, rackup_path(name))
273
+ pid, w, r, e = launch_process("unicorn", "--no-default-middleware","-l", listen, rackup_path(name))
271
274
  until e.gets =~ /worker=0 ready/; end
272
275
  else
273
276
  # need to find suitable server for jruby
274
277
  end
275
278
  yield
276
279
  ensure
277
- unless RUBY_PLATFORM == 'java'
278
- Process.kill(9, pid)
279
- GC.enable if RUBY_VERSION < '1.9'
280
- Process.wait(pid)
281
- end
280
+ cleanup_process(pid)
281
+
282
282
  if not unix_socket.nil? and File.exist?(unix_socket)
283
283
  File.delete(unix_socket)
284
284
  end
@@ -289,18 +289,9 @@ def server_path(*parts)
289
289
  end
290
290
 
291
291
  def with_server(name)
292
- unless RUBY_PLATFORM == 'java'
293
- GC.disable if RUBY_VERSION < '1.9'
294
- pid, w, r, e = Open4.popen4(server_path("#{name}.rb"))
295
- else
296
- pid, w, r, e = IO.popen4(server_path("#{name}.rb"))
297
- end
292
+ pid, w, r, e = launch_process("ruby", server_path("#{name}.rb"))
298
293
  until e.gets =~ /ready/; end
299
294
  yield
300
295
  ensure
301
- Process.kill(9, pid)
302
- unless RUBY_PLATFORM == 'java'
303
- GC.enable if RUBY_VERSION < '1.9'
304
- Process.wait(pid)
305
- end
296
+ cleanup_process(pid)
306
297
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: excon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.61.0
4
+ version: 0.63.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - dpiddy (Dan Peterson)
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2018-03-16 00:00:00.000000000 Z
13
+ date: 2019-04-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
@@ -190,6 +190,7 @@ extra_rdoc_files:
190
190
  - CONTRIBUTING.md
191
191
  files:
192
192
  - ".document"
193
+ - ".github/stale.yml"
193
194
  - ".gitignore"
194
195
  - ".rspec"
195
196
  - ".travis.yml"
@@ -254,11 +255,14 @@ files:
254
255
  - spec/excon/test/server_spec.rb
255
256
  - spec/excon_spec.rb
256
257
  - spec/helpers/file_path_helpers.rb
258
+ - spec/helpers/warning_helpers.rb
257
259
  - spec/requests/basic_spec.rb
258
260
  - spec/requests/eof_requests_spec.rb
259
261
  - spec/requests/unix_socket_spec.rb
262
+ - spec/requests/validation_spec.rb
260
263
  - spec/spec_helper.rb
261
264
  - spec/support/shared_contexts/test_server_context.rb
265
+ - spec/support/shared_contexts/test_stub_context.rb
262
266
  - spec/support/shared_examples/shared_example_for_clients.rb
263
267
  - spec/support/shared_examples/shared_example_for_streaming_clients.rb
264
268
  - spec/support/shared_examples/shared_example_for_test_servers.rb
@@ -274,6 +278,7 @@ files:
274
278
  - tests/data/xs
275
279
  - tests/error_tests.rb
276
280
  - tests/header_tests.rb
281
+ - tests/instrumentors/logging_instrumentor_tests.rb
277
282
  - tests/middlewares/canned_response_tests.rb
278
283
  - tests/middlewares/capture_cookies_tests.rb
279
284
  - tests/middlewares/decompress_tests.rb
@@ -311,6 +316,8 @@ files:
311
316
  - tests/servers/eof.rb
312
317
  - tests/servers/error.rb
313
318
  - tests/servers/good.rb
319
+ - tests/servers/good_ipv4.rb
320
+ - tests/servers/good_ipv6.rb
314
321
  - tests/test_helper.rb
315
322
  - tests/thread_safety_tests.rb
316
323
  - tests/timeout_tests.rb
@@ -318,7 +325,13 @@ files:
318
325
  homepage: https://github.com/excon/excon
319
326
  licenses:
320
327
  - MIT
321
- metadata: {}
328
+ metadata:
329
+ homepage_uri: https://github.com/excon/excon
330
+ bug_tracker_uri: https://github.com/excon/excon/issues
331
+ changelog_uri: https://github.com/excon/excon/blob/master/changelog.txt
332
+ documentation_uri: https://github.com/excon/excon/blob/master/README.md
333
+ source_code_uri: https://github.com/excon/excon
334
+ wiki_uri: https://github.com/excon/excon/wiki
322
335
  post_install_message:
323
336
  rdoc_options:
324
337
  - "--charset=UTF-8"
@@ -335,8 +348,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
335
348
  - !ruby/object:Gem::Version
336
349
  version: '0'
337
350
  requirements: []
338
- rubyforge_project:
339
- rubygems_version: 2.6.13
351
+ rubygems_version: 3.0.2
340
352
  signing_key:
341
353
  specification_version: 4
342
354
  summary: speed, persistence, http(s)