excon 0.99.0 → 1.0.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.
data/lib/excon/utils.rb CHANGED
@@ -62,11 +62,33 @@ module Excon
62
62
  end
63
63
 
64
64
  def port_string(datum)
65
- if datum[:port].nil? || (datum[:omit_default_port] && ((datum[:scheme].casecmp('http') == 0 && datum[:port] == 80) || (datum[:scheme].casecmp('https') == 0 && datum[:port] == 443)))
66
- ''
65
+ if !default_port?(datum) || datum[:include_default_port] || !datum[:omit_default_port]
66
+ ":#{datum[:port]}"
67
67
  else
68
- ':' + datum[:port].to_s
68
+ ''
69
+ end
70
+ end
71
+
72
+ # Used to normalize queries for stubs, based on Rack::Utils.parse_query
73
+ def parse_query_string(string)
74
+ params = {}
75
+
76
+ string.split(/[&;] */n).each do |pair|
77
+ key, value = pair.split('=', 2).map { |x| CGI.unescape(x) }
78
+
79
+ params[key] = if params[key]
80
+ [params[key], value].flatten
81
+ else
82
+ value
83
+ end
69
84
  end
85
+
86
+ params
87
+ end
88
+
89
+ def default_port?(datum)
90
+ (datum[:scheme].casecmp('http').zero? && datum[:port] == 80) ||
91
+ (datum[:scheme].casecmp('https').zero? && datum[:port] == 443)
70
92
  end
71
93
 
72
94
  def query_string(datum)
data/lib/excon/version.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Excon
3
- VERSION = '0.99.0'
4
+ VERSION = '1.0.0'
4
5
  end
data/lib/excon.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  $:.unshift(File.dirname(__FILE__)) unless
3
4
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
4
5
 
5
6
  require 'cgi'
6
7
  require 'forwardable'
8
+ require 'ipaddr'
7
9
  require 'openssl'
8
10
  require 'rbconfig'
9
11
  require 'socket'
@@ -17,6 +19,7 @@ require 'excon/version'
17
19
  require 'excon/extensions/uri'
18
20
 
19
21
  require 'excon/middlewares/base'
22
+ require 'excon/middlewares/decompress'
20
23
  require 'excon/middlewares/expects'
21
24
  require 'excon/middlewares/idempotent'
22
25
  require 'excon/middlewares/instrumentor'
@@ -30,7 +33,6 @@ require 'excon/utils'
30
33
  require 'excon/connection'
31
34
  require 'excon/headers'
32
35
  require 'excon/response'
33
- require 'excon/middlewares/decompress'
34
36
  require 'excon/middlewares/escape_path'
35
37
  require 'excon/middlewares/redirect_follower'
36
38
  require 'excon/middlewares/capture_cookies'
@@ -44,7 +46,6 @@ require 'excon/unix_socket'
44
46
  # Define defaults first so they will be available to other files
45
47
  module Excon
46
48
  class << self
47
-
48
49
  # @return [Hash] defaults for Excon connections
49
50
  def defaults
50
51
  @defaults ||= DEFAULTS
@@ -52,19 +53,15 @@ module Excon
52
53
 
53
54
  # Change defaults for Excon connections
54
55
  # @return [Hash] defaults for Excon connections
55
- def defaults=(new_defaults)
56
- @defaults = new_defaults
57
- end
56
+ attr_writer :defaults
58
57
 
59
58
  def display_warning(warning)
60
59
  # Show warning if $VERBOSE or ENV['EXCON_DEBUG'] is set
61
- if $VERBOSE || ENV['EXCON_DEBUG']
62
- $stderr.puts "[excon][WARNING] #{warning}\n#{ caller.join("\n") }"
63
- end
60
+ ($VERBOSE || ENV['EXCON_DEBUG']) && Warning.warn("[excon][WARNING] #{warning}\n#{caller.join("\n")}")
64
61
 
65
- if @raise_on_warnings
66
- raise Error::Warning.new(warning)
67
- end
62
+ return unless @raise_on_warnings
63
+
64
+ raise(Error::Warning, warning)
68
65
  end
69
66
 
70
67
  def set_raise_on_warnings!(should_raise)
@@ -119,32 +116,25 @@ module Excon
119
116
  def new(url, params = {})
120
117
  uri_parser = params[:uri_parser] || defaults[:uri_parser]
121
118
  uri = uri_parser.parse(url)
122
- if params[:path]
123
- uri_parser.parse(params[:path])
124
- end
125
- unless uri.scheme
126
- raise ArgumentError.new("Invalid URI: #{uri}")
127
- end
119
+ params[:path] && uri_parser.parse(params[:path])
120
+ raise(ArgumentError, "Invalid URI: #{uri}") unless uri.scheme
121
+
128
122
  params = {
129
- :host => uri.host,
130
- :hostname => uri.hostname,
131
- :path => uri.path,
132
- :port => uri.port,
133
- :query => uri.query,
134
- :scheme => uri.scheme
123
+ host: uri.host,
124
+ hostname: uri.hostname,
125
+ path: uri.path,
126
+ port: uri.port,
127
+ query: uri.query,
128
+ scheme: uri.scheme
135
129
  }.merge(params)
136
- if uri.password
137
- params[:password] = Utils.unescape_uri(uri.password)
138
- end
139
- if uri.user
140
- params[:user] = Utils.unescape_uri(uri.user)
141
- end
130
+ uri.password && params[:password] = Utils.unescape_uri(uri.password)
131
+ uri.user && params[:user] = Utils.unescape_uri(uri.user)
142
132
  Excon::Connection.new(params)
143
133
  end
144
134
 
145
135
  # push an additional stub onto the list to check for mock requests
146
136
  # @param request_params [Hash<Symbol, >] request params to match against, omitted params match all
147
- # @param response_params [Hash<Symbol, >] response params to return from matched request or block to call with params
137
+ # @param response_params [Hash<Symbol, >] response params to return or block to call with matched params
148
138
  def stub(request_params = {}, response_params = nil, &block)
149
139
  if (method = request_params.delete(:method))
150
140
  request_params[:method] = method.to_s.downcase.to_sym
@@ -152,35 +142,37 @@ module Excon
152
142
  if (url = request_params.delete(:url))
153
143
  uri = URI.parse(url)
154
144
  request_params = {
155
- :host => uri.host,
156
- :path => uri.path,
157
- :port => uri.port,
158
- :query => uri.query,
159
- :scheme => uri.scheme
145
+ host: uri.host,
146
+ path: uri.path.empty? ? '/' : uri.path,
147
+ port: uri.port,
148
+ query: uri.query,
149
+ scheme: uri.scheme
160
150
  }.merge!(request_params)
161
151
  if uri.user || uri.password
162
152
  request_params[:headers] ||= {}
163
- user, pass = Utils.unescape_form(uri.user.to_s), Utils.unescape_form(uri.password.to_s)
153
+ user = Utils.unescape_form(uri.user.to_s)
154
+ pass = Utils.unescape_form(uri.password.to_s)
164
155
  request_params[:headers]['Authorization'] ||= 'Basic ' + ["#{user}:#{pass}"].pack('m').delete(Excon::CR_NL)
165
156
  end
166
157
  end
167
- if request_params.has_key?(:headers)
158
+ if request_params.key?(:headers)
168
159
  headers = Excon::Headers.new
169
160
  request_params[:headers].each do |key, value|
170
161
  headers[key] = value
171
162
  end
172
163
  request_params[:headers] = headers
173
164
  end
165
+ if request_params.key?(:query) && request_params[:query].instance_of?(String)
166
+ request_params[:query] = Utils.parse_query_string(request_params[:query])
167
+ end
174
168
  if block_given?
175
- if response_params
176
- raise(ArgumentError.new("stub requires either response_params OR a block"))
177
- else
178
- stub = [request_params, block]
179
- end
169
+ raise(ArgumentError, 'stub requires either response_params OR a block') if response_params
170
+
171
+ stub = [request_params, block]
180
172
  elsif response_params
181
173
  stub = [request_params, response_params]
182
174
  else
183
- raise(ArgumentError.new("stub requires either response_params OR a block"))
175
+ raise(ArgumentError, 'stub requires either response_params OR a block')
184
176
  end
185
177
  stubs.unshift(stub)
186
178
  stub
@@ -193,9 +185,12 @@ module Excon
193
185
  if (method = request_params.delete(:method))
194
186
  request_params[:method] = method.to_s.downcase.to_sym
195
187
  end
188
+ if request_params.key?(:query) && request_params[:query].instance_of?(String)
189
+ request_params[:query] = Utils.parse_query_string(request_params[:query])
190
+ end
196
191
  Excon.stubs.each do |stub, response_params|
197
- captures = { :headers => {} }
198
- headers_match = !stub.has_key?(:headers) || stub[:headers].keys.all? do |key|
192
+ captures = { headers: {} }
193
+ headers_match = !stub.key?(:headers) || stub[:headers].keys.all? do |key|
199
194
  case value = stub[:headers][key]
200
195
  when Regexp
201
196
  case request_params[:headers][key]
@@ -245,11 +240,12 @@ module Excon
245
240
  end
246
241
  end
247
242
 
248
- # remove first/oldest stub matching request_params
243
+ # remove first/oldest stub matching request_params or nil if none match
249
244
  # @param request_params [Hash<Symbol, >] request params to match against, omitted params match all
250
245
  # @return [Hash<Symbol, >] response params from deleted stub
251
246
  def unstub(request_params = {})
252
- stub = stub_for(request_params)
247
+ return unless (stub = stub_for(request_params))
248
+
253
249
  Excon.stubs.delete_at(Excon.stubs.index(stub))
254
250
  end
255
251
 
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: excon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.99.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - dpiddy (Dan Peterson)
8
8
  - geemus (Wesley Beary)
9
9
  - nextmat (Matt Sanders)
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2023-02-03 00:00:00.000000000 Z
13
+ date: 2024-10-24 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
@@ -235,7 +235,7 @@ metadata:
235
235
  documentation_uri: https://github.com/excon/excon/blob/master/README.md
236
236
  source_code_uri: https://github.com/excon/excon
237
237
  wiki_uri: https://github.com/excon/excon/wiki
238
- post_install_message:
238
+ post_install_message:
239
239
  rdoc_options:
240
240
  - "--charset=UTF-8"
241
241
  require_paths:
@@ -244,15 +244,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
244
244
  requirements:
245
245
  - - ">="
246
246
  - !ruby/object:Gem::Version
247
- version: '0'
247
+ version: 2.7.0
248
248
  required_rubygems_version: !ruby/object:Gem::Requirement
249
249
  requirements:
250
250
  - - ">="
251
251
  - !ruby/object:Gem::Version
252
252
  version: '0'
253
253
  requirements: []
254
- rubygems_version: 3.4.1
255
- signing_key:
254
+ rubygems_version: 3.5.18
255
+ signing_key:
256
256
  specification_version: 4
257
257
  summary: speed, persistence, http(s)
258
258
  test_files: []