faraday 0.9.0 → 0.9.2

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.
Files changed (61) hide show
  1. data/LICENSE.md +1 -1
  2. data/README.md +52 -23
  3. data/lib/faraday.rb +1 -1
  4. data/lib/faraday/adapter/em_synchrony.rb +8 -0
  5. data/lib/faraday/adapter/excon.rb +1 -0
  6. data/lib/faraday/adapter/httpclient.rb +14 -3
  7. data/lib/faraday/adapter/net_http.rb +26 -20
  8. data/lib/faraday/adapter/net_http_persistent.rb +5 -3
  9. data/lib/faraday/adapter/patron.rb +13 -3
  10. data/lib/faraday/autoload.rb +0 -1
  11. data/lib/faraday/connection.rb +8 -3
  12. data/lib/faraday/options.rb +9 -0
  13. data/lib/faraday/parameters.rb +62 -58
  14. data/lib/faraday/rack_builder.rb +3 -2
  15. data/lib/faraday/request/retry.rb +40 -4
  16. data/lib/faraday/response.rb +2 -2
  17. data/lib/faraday/response/logger.rb +26 -1
  18. data/lib/faraday/utils.rb +13 -1
  19. metadata +61 -120
  20. checksums.yaml +0 -7
  21. data/.document +0 -6
  22. data/CHANGELOG.md +0 -15
  23. data/CONTRIBUTING.md +0 -36
  24. data/Gemfile +0 -29
  25. data/Rakefile +0 -71
  26. data/faraday.gemspec +0 -34
  27. data/script/console +0 -7
  28. data/script/generate_certs +0 -42
  29. data/script/package +0 -7
  30. data/script/proxy-server +0 -42
  31. data/script/release +0 -17
  32. data/script/server +0 -36
  33. data/script/test +0 -172
  34. data/test/adapters/default_test.rb +0 -14
  35. data/test/adapters/em_http_test.rb +0 -20
  36. data/test/adapters/em_synchrony_test.rb +0 -20
  37. data/test/adapters/excon_test.rb +0 -20
  38. data/test/adapters/httpclient_test.rb +0 -21
  39. data/test/adapters/integration.rb +0 -254
  40. data/test/adapters/logger_test.rb +0 -37
  41. data/test/adapters/net_http_persistent_test.rb +0 -20
  42. data/test/adapters/net_http_test.rb +0 -14
  43. data/test/adapters/patron_test.rb +0 -20
  44. data/test/adapters/rack_test.rb +0 -31
  45. data/test/adapters/test_middleware_test.rb +0 -114
  46. data/test/adapters/typhoeus_test.rb +0 -28
  47. data/test/authentication_middleware_test.rb +0 -65
  48. data/test/composite_read_io_test.rb +0 -111
  49. data/test/connection_test.rb +0 -522
  50. data/test/env_test.rb +0 -210
  51. data/test/helper.rb +0 -81
  52. data/test/live_server.rb +0 -67
  53. data/test/middleware/instrumentation_test.rb +0 -88
  54. data/test/middleware/retry_test.rb +0 -109
  55. data/test/middleware_stack_test.rb +0 -173
  56. data/test/multibyte.txt +0 -1
  57. data/test/options_test.rb +0 -252
  58. data/test/request_middleware_test.rb +0 -142
  59. data/test/response_middleware_test.rb +0 -72
  60. data/test/strawberry.rb +0 -2
  61. data/test/utils_test.rb +0 -58
@@ -151,8 +151,9 @@ module Faraday
151
151
  lock!
152
152
  to_app(lambda { |env|
153
153
  response = Response.new
154
- response.finish(env) unless env.parallel?
155
154
  env.response = response
155
+ response.finish(env) unless env.parallel?
156
+ response
156
157
  })
157
158
  end
158
159
  end
@@ -188,7 +189,7 @@ module Faraday
188
189
  # :ssl - Hash of options for configuring SSL requests.
189
190
  def build_env(connection, request)
190
191
  Env.new(request.method, request.body,
191
- connection.build_exclusive_url(request.path, request.params),
192
+ connection.build_exclusive_url(request.path, request.params, request.options.params_encoder),
192
193
  request.options, request.headers, connection.ssl,
193
194
  connection.parallel_manager)
194
195
  end
@@ -19,7 +19,13 @@ module Faraday
19
19
  # interval that is random between 0.1 and 0.15
20
20
  #
21
21
  class Request::Retry < Faraday::Middleware
22
- class Options < Faraday::Options.new(:max, :interval, :interval_randomness, :backoff_factor, :exceptions)
22
+
23
+ IDEMPOTENT_METHODS = [:delete, :get, :head, :options, :put]
24
+
25
+ class Options < Faraday::Options.new(:max, :interval, :max_interval, :interval_randomness,
26
+ :backoff_factor, :exceptions, :methods, :retry_if)
27
+ DEFAULT_CHECK = lambda { |env,exception| false }
28
+
23
29
  def self.from(value)
24
30
  if Fixnum === value
25
31
  new(value)
@@ -36,8 +42,12 @@ module Faraday
36
42
  (self[:interval] ||= 0).to_f
37
43
  end
38
44
 
45
+ def max_interval
46
+ (self[:max_interval] ||= Float::MAX).to_f
47
+ end
48
+
39
49
  def interval_randomness
40
- (self[:interval_randomness] ||= 0).to_i
50
+ (self[:interval_randomness] ||= 0).to_f
41
51
  end
42
52
 
43
53
  def backoff_factor
@@ -49,6 +59,14 @@ module Faraday
49
59
  Error::TimeoutError])
50
60
  end
51
61
 
62
+ def methods
63
+ Array(self[:methods] ||= IDEMPOTENT_METHODS)
64
+ end
65
+
66
+ def retry_if
67
+ self[:retry_if] ||= DEFAULT_CHECK
68
+ end
69
+
52
70
  end
53
71
 
54
72
  # Public: Initialize middleware
@@ -59,6 +77,7 @@ module Faraday
59
77
  # interval_randomness - The maximum random interval amount expressed
60
78
  # as a float between 0 and 1 to use in addition to the
61
79
  # interval. (default: 0)
80
+ # max_interval - An upper limit for the interval (default: Float::MAX)
62
81
  # backoff_factor - The amount to multiple each successive retry's
63
82
  # interval amount by in order to provide backoff
64
83
  # (default: 1)
@@ -66,6 +85,15 @@ module Faraday
66
85
  # given as Class, Module, or String. (default:
67
86
  # [Errno::ETIMEDOUT, Timeout::Error,
68
87
  # Error::TimeoutError])
88
+ # methods - A list of HTTP methods to retry without calling retry_if. Pass
89
+ # an empty Array to call retry_if for all exceptions.
90
+ # (defaults to the idempotent HTTP methods in IDEMPOTENT_METHODS)
91
+ # retry_if - block that will receive the env object and the exception raised
92
+ # and should decide if the code should retry still the action or
93
+ # not independent of the retry count. This would be useful
94
+ # if the exception produced is non-recoverable or if the
95
+ # the HTTP method called is not idempotent.
96
+ # (defaults to return false)
69
97
  def initialize(app, options = nil)
70
98
  super(app)
71
99
  @options = Options.from(options)
@@ -75,6 +103,7 @@ module Faraday
75
103
  def sleep_amount(retries)
76
104
  retry_index = @options.max - retries
77
105
  current_interval = @options.interval * (@options.backoff_factor ** retry_index)
106
+ current_interval = [current_interval, @options.max_interval].min
78
107
  random_interval = rand * @options.interval_randomness.to_f * @options.interval
79
108
  current_interval + random_interval
80
109
  end
@@ -85,8 +114,8 @@ module Faraday
85
114
  begin
86
115
  env[:body] = request_body # after failure env[:body] is set to the response body
87
116
  @app.call(env)
88
- rescue @errmatch
89
- if retries > 0
117
+ rescue @errmatch => exception
118
+ if retries > 0 && retry_request?(env, exception)
90
119
  retries -= 1
91
120
  sleep sleep_amount(retries + 1)
92
121
  retry
@@ -114,5 +143,12 @@ module Faraday
114
143
  end
115
144
  matcher
116
145
  end
146
+
147
+ private
148
+
149
+ def retry_request?(env, exception)
150
+ @options.methods.include?(env[:method]) || @options.retry_if.call(env, exception)
151
+ end
152
+
117
153
  end
118
154
  end
@@ -61,8 +61,8 @@ module Faraday
61
61
 
62
62
  def finish(env)
63
63
  raise "response already finished" if finished?
64
- @env = Env.from(env)
65
- @on_complete_callbacks.each { |callback| callback.call(env) }
64
+ @env = env.is_a?(Env) ? env : Env.from(env)
65
+ @on_complete_callbacks.each { |callback| callback.call(@env) }
66
66
  return self
67
67
  end
68
68
 
@@ -4,12 +4,15 @@ module Faraday
4
4
  class Response::Logger < Response::Middleware
5
5
  extend Forwardable
6
6
 
7
- def initialize(app, logger = nil)
7
+ DEFAULT_OPTIONS = { :bodies => false }
8
+
9
+ def initialize(app, logger = nil, options = {})
8
10
  super(app)
9
11
  @logger = logger || begin
10
12
  require 'logger'
11
13
  ::Logger.new(STDOUT)
12
14
  end
15
+ @options = DEFAULT_OPTIONS.merge(options)
13
16
  end
14
17
 
15
18
  def_delegators :@logger, :debug, :info, :warn, :error, :fatal
@@ -17,12 +20,14 @@ module Faraday
17
20
  def call(env)
18
21
  info "#{env.method} #{env.url.to_s}"
19
22
  debug('request') { dump_headers env.request_headers }
23
+ debug('request') { dump_body(env[:body]) } if env[:body] && log_body?(:request)
20
24
  super
21
25
  end
22
26
 
23
27
  def on_complete(env)
24
28
  info('Status') { env.status.to_s }
25
29
  debug('response') { dump_headers env.response_headers }
30
+ debug('response') { dump_body env[:body] } if env[:body] && log_body?(:response)
26
31
  end
27
32
 
28
33
  private
@@ -30,5 +35,25 @@ module Faraday
30
35
  def dump_headers(headers)
31
36
  headers.map { |k, v| "#{k}: #{v.inspect}" }.join("\n")
32
37
  end
38
+
39
+ def dump_body(body)
40
+ if body.respond_to?(:to_str)
41
+ body.to_str
42
+ else
43
+ pretty_inspect(body)
44
+ end
45
+ end
46
+
47
+ def pretty_inspect(body)
48
+ require 'pp' unless body.respond_to?(:pretty_inspect)
49
+ body.pretty_inspect
50
+ end
51
+
52
+ def log_body?(type)
53
+ case @options[:bodies]
54
+ when Hash then @options[:bodies][type]
55
+ else @options[:bodies]
56
+ end
57
+ end
33
58
  end
34
59
  end
data/lib/faraday/utils.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'thread'
2
- Faraday.require_libs 'parameters'
3
2
 
4
3
  module Faraday
5
4
  module Utils
@@ -17,6 +16,12 @@ module Faraday
17
16
  self.update(hash || {})
18
17
  end
19
18
 
19
+ # on dup/clone, we need to duplicate @names hash
20
+ def initialize_copy(other)
21
+ super
22
+ @names = other.names.dup
23
+ end
24
+
20
25
  # need to synchronize concurrent writes to the shared KeyMap
21
26
  keymap_mutex = Mutex.new
22
27
 
@@ -81,6 +86,7 @@ module Faraday
81
86
 
82
87
  def replace(other)
83
88
  clear
89
+ @names.clear
84
90
  self.update other
85
91
  self
86
92
  end
@@ -101,6 +107,12 @@ module Faraday
101
107
  end
102
108
  }
103
109
  end
110
+
111
+ protected
112
+
113
+ def names
114
+ @names
115
+ end
104
116
  end
105
117
 
106
118
  # hash with stringified keys
metadata CHANGED
@@ -1,63 +1,55 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: faraday
3
- version: !ruby/object:Gem::Version
4
- version: 0.9.0
3
+ version: !ruby/object:Gem::Version
4
+ hash: 63
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 9
9
+ - 2
10
+ version: 0.9.2
5
11
  platform: ruby
6
- authors:
12
+ authors:
7
13
  - Rick Olson
8
14
  autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
- date: 2014-01-16 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2015-10-06 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
14
22
  name: multipart-post
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '1.2'
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: '3'
23
- type: :runtime
24
23
  prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
26
- requirements:
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
27
  - - ">="
28
- - !ruby/object:Gem::Version
29
- version: '1.2'
30
- - - "<"
31
- - !ruby/object:Gem::Version
32
- version: '3'
33
- - !ruby/object:Gem::Dependency
34
- name: bundler
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - "~>"
38
- - !ruby/object:Gem::Version
39
- version: '1.0'
40
- type: :development
41
- prerelease: false
42
- version_requirements: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: '1.0'
28
+ - !ruby/object:Gem::Version
29
+ hash: 11
30
+ segments:
31
+ - 1
32
+ - 2
33
+ version: "1.2"
34
+ - - <
35
+ - !ruby/object:Gem::Version
36
+ hash: 5
37
+ segments:
38
+ - 3
39
+ version: "3"
40
+ type: :runtime
41
+ version_requirements: *id001
47
42
  description:
48
43
  email: technoweenie@gmail.com
49
44
  executables: []
45
+
50
46
  extensions: []
47
+
51
48
  extra_rdoc_files: []
52
- files:
53
- - ".document"
54
- - CHANGELOG.md
55
- - CONTRIBUTING.md
56
- - Gemfile
49
+
50
+ files:
57
51
  - LICENSE.md
58
52
  - README.md
59
- - Rakefile
60
- - faraday.gemspec
61
53
  - lib/faraday.rb
62
54
  - lib/faraday/adapter.rb
63
55
  - lib/faraday/adapter/em_http.rb
@@ -92,90 +84,39 @@ files:
92
84
  - lib/faraday/response/raise_error.rb
93
85
  - lib/faraday/upload_io.rb
94
86
  - lib/faraday/utils.rb
95
- - script/console
96
- - script/generate_certs
97
- - script/package
98
- - script/proxy-server
99
- - script/release
100
- - script/server
101
- - script/test
102
- - test/adapters/default_test.rb
103
- - test/adapters/em_http_test.rb
104
- - test/adapters/em_synchrony_test.rb
105
- - test/adapters/excon_test.rb
106
- - test/adapters/httpclient_test.rb
107
- - test/adapters/integration.rb
108
- - test/adapters/logger_test.rb
109
- - test/adapters/net_http_persistent_test.rb
110
- - test/adapters/net_http_test.rb
111
- - test/adapters/patron_test.rb
112
- - test/adapters/rack_test.rb
113
- - test/adapters/test_middleware_test.rb
114
- - test/adapters/typhoeus_test.rb
115
- - test/authentication_middleware_test.rb
116
- - test/composite_read_io_test.rb
117
- - test/connection_test.rb
118
- - test/env_test.rb
119
- - test/helper.rb
120
- - test/live_server.rb
121
- - test/middleware/instrumentation_test.rb
122
- - test/middleware/retry_test.rb
123
- - test/middleware_stack_test.rb
124
- - test/multibyte.txt
125
- - test/options_test.rb
126
- - test/request_middleware_test.rb
127
- - test/response_middleware_test.rb
128
- - test/strawberry.rb
129
- - test/utils_test.rb
87
+ has_rdoc: true
130
88
  homepage: https://github.com/lostisland/faraday
131
- licenses:
89
+ licenses:
132
90
  - MIT
133
- metadata: {}
134
91
  post_install_message:
135
92
  rdoc_options: []
136
- require_paths:
93
+
94
+ require_paths:
137
95
  - lib
138
- required_ruby_version: !ruby/object:Gem::Requirement
139
- requirements:
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
140
99
  - - ">="
141
- - !ruby/object:Gem::Version
142
- version: '0'
143
- required_rubygems_version: !ruby/object:Gem::Requirement
144
- requirements:
100
+ - !ruby/object:Gem::Version
101
+ hash: 3
102
+ segments:
103
+ - 0
104
+ version: "0"
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
145
108
  - - ">="
146
- - !ruby/object:Gem::Version
147
- version: 1.3.5
109
+ - !ruby/object:Gem::Version
110
+ hash: 3
111
+ segments:
112
+ - 0
113
+ version: "0"
148
114
  requirements: []
115
+
149
116
  rubyforge_project:
150
- rubygems_version: 2.2.0
117
+ rubygems_version: 1.6.2
151
118
  signing_key:
152
- specification_version: 2
119
+ specification_version: 3
153
120
  summary: HTTP/REST API client library.
154
- test_files:
155
- - test/adapters/default_test.rb
156
- - test/adapters/em_http_test.rb
157
- - test/adapters/em_synchrony_test.rb
158
- - test/adapters/excon_test.rb
159
- - test/adapters/httpclient_test.rb
160
- - test/adapters/integration.rb
161
- - test/adapters/logger_test.rb
162
- - test/adapters/net_http_persistent_test.rb
163
- - test/adapters/net_http_test.rb
164
- - test/adapters/patron_test.rb
165
- - test/adapters/rack_test.rb
166
- - test/adapters/test_middleware_test.rb
167
- - test/adapters/typhoeus_test.rb
168
- - test/authentication_middleware_test.rb
169
- - test/composite_read_io_test.rb
170
- - test/connection_test.rb
171
- - test/env_test.rb
172
- - test/helper.rb
173
- - test/live_server.rb
174
- - test/middleware/instrumentation_test.rb
175
- - test/middleware/retry_test.rb
176
- - test/middleware_stack_test.rb
177
- - test/options_test.rb
178
- - test/request_middleware_test.rb
179
- - test/response_middleware_test.rb
180
- - test/strawberry.rb
181
- - test/utils_test.rb
121
+ test_files: []
122
+
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 0e442daff424089e143751d7cb1d684c169bf4fc
4
- data.tar.gz: ba1dd50171576d5064350e48b8869364c0710a26
5
- SHA512:
6
- metadata.gz: 80c7a955f7d0a2217fcde0be2760649b9e5fc2d950929b118383ba61ea7282410b224315e289b40fec12be13898b0b00551e441704462ac39269368a8f9d5931
7
- data.tar.gz: cdef47ebdb9519d0e45e7511326ed1368fa520ad314a4055ea154187193c967f8821573705161e3bbca5d3cbbf40f219071223ba8d24821c5dd89e37ddd16a9e