faraday-conductivity 0.0.4 → 0.1.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/.gitignore +1 -0
- data/README.md +30 -0
- data/faraday-conductivity.gemspec +1 -0
- data/lib/faraday/conductivity.rb +2 -0
- data/lib/faraday/conductivity/repeater.rb +61 -0
- data/lib/faraday/conductivity/version.rb +1 -1
- data/spec/fake_server.rb +21 -0
- data/spec/middleware/repeater_spec.rb +36 -0
- data/spec/spec_helper.rb +9 -0
- metadata +23 -2
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -140,6 +140,36 @@ The User-Agent will looks like this on my machine:
|
|
140
140
|
MarketingSite/1.1 (iain.local; iain; 30360) ruby/1.9.3 (327; x86_64-darwin12.2.0)
|
141
141
|
```
|
142
142
|
|
143
|
+
### Repeater
|
144
|
+
|
145
|
+
The Repeater will retry your requests until they succeed. This is handy for
|
146
|
+
reaching servers that are not too reliable.
|
147
|
+
|
148
|
+
``` ruby
|
149
|
+
connection = Faraday.new(url: "http://slow.website.com") do |faraday|
|
150
|
+
faraday.use :repeater, retries: 6, mode: :rapid
|
151
|
+
end
|
152
|
+
```
|
153
|
+
|
154
|
+
The `retries` parameter specifies how many times to retry before succeeding.
|
155
|
+
|
156
|
+
The `mode` parameter specifies how long to wait before retrying. `:rapid` will
|
157
|
+
retry instantly, `:one`, will wait one second between retries, `:linear` and
|
158
|
+
`:exponential` will retry longer and longer after every retry.
|
159
|
+
|
160
|
+
It's also possible to specify your own pattern by providing a lambda, that
|
161
|
+
returns the number of seconds to wait. For example:
|
162
|
+
|
163
|
+
``` ruby
|
164
|
+
connection = Faraday.new(url: "http://slow.website.com") do |faraday|
|
165
|
+
faraday.use :repeater, retries: 6, pattern: ->(n) { rand < 0.5 ? 10 : 2 }
|
166
|
+
end
|
167
|
+
```
|
168
|
+
|
169
|
+
You can use the repeater together with the `raise_error` middleware to also
|
170
|
+
retry after getting 404s and other succeeded requests, but failed statuses.
|
171
|
+
|
172
|
+
|
143
173
|
## Contributing
|
144
174
|
|
145
175
|
1. Fork it
|
data/lib/faraday/conductivity.rb
CHANGED
@@ -7,6 +7,7 @@ require "faraday/conductivity/mimetype"
|
|
7
7
|
require "faraday/conductivity/request_id"
|
8
8
|
require "faraday/conductivity/request_id_filter"
|
9
9
|
require "faraday/conductivity/user_agent"
|
10
|
+
require "faraday/conductivity/repeater"
|
10
11
|
|
11
12
|
module Faraday
|
12
13
|
module Conductivity
|
@@ -15,5 +16,6 @@ module Faraday
|
|
15
16
|
register_middleware :request, :user_agent => Faraday::Conductivity::UserAgent
|
16
17
|
register_middleware :request, :request_id => Faraday::Conductivity::RequestId
|
17
18
|
register_middleware :request, :mimetype => Faraday::Conductivity::Mimetype
|
19
|
+
register_middleware :middleware, :repeater => Faraday::Conductivity::Repeater
|
18
20
|
end
|
19
21
|
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Faraday
|
2
|
+
module Conductivity
|
3
|
+
class Repeater < Faraday::Middleware
|
4
|
+
|
5
|
+
PATTERNS = {
|
6
|
+
:rapid => lambda { |n| 0 },
|
7
|
+
:one => lambda { |n| 1 },
|
8
|
+
:linear => lambda { |n| n },
|
9
|
+
:exponential => lambda { |n| n ** 2 },
|
10
|
+
}
|
11
|
+
|
12
|
+
def initialize(app, options = {})
|
13
|
+
@app = app
|
14
|
+
@retries = options[:retries] || 10
|
15
|
+
|
16
|
+
if mode = options[:mode]
|
17
|
+
@pattern = build_pattern(PATTERNS.fetch(mode))
|
18
|
+
elsif pattern = options[:pattern]
|
19
|
+
@pattern = build_pattern(pattern)
|
20
|
+
else
|
21
|
+
@pattern = build_pattern(PATTERNS.fetch(:exponential))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def call(env)
|
26
|
+
tries = 0
|
27
|
+
begin
|
28
|
+
@app.call(env)
|
29
|
+
rescue Faraday::Error::ClientError
|
30
|
+
if tries < @retries
|
31
|
+
tries += 1
|
32
|
+
@pattern.wait(tries)
|
33
|
+
retry
|
34
|
+
else
|
35
|
+
raise
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def build_pattern(pattern)
|
41
|
+
Pattern.new(pattern)
|
42
|
+
end
|
43
|
+
|
44
|
+
class Pattern
|
45
|
+
|
46
|
+
def initialize(pattern)
|
47
|
+
@pattern = pattern
|
48
|
+
end
|
49
|
+
|
50
|
+
def wait(num)
|
51
|
+
seconds = @pattern.call(num)
|
52
|
+
if seconds != 0
|
53
|
+
sleep num
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/spec/fake_server.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Faraday::Conductivity::Repeater do
|
4
|
+
|
5
|
+
let(:connection) {
|
6
|
+
Faraday.new(url: $service_double_url) { |faraday|
|
7
|
+
faraday.use :repeater, mode: :rapid, retries: 6
|
8
|
+
faraday.adapter Faraday.default_adapter
|
9
|
+
}
|
10
|
+
}
|
11
|
+
|
12
|
+
it "retries after timeouts" do
|
13
|
+
get_with_max(4).body.should eq "fast"
|
14
|
+
end
|
15
|
+
|
16
|
+
it "gives up after a number of retries" do
|
17
|
+
expect { get_with_max(9) }.to raise_error(Faraday::Error::TimeoutError)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "waits according to a pattern" do
|
21
|
+
pattern = double :pattern
|
22
|
+
Faraday::Conductivity::Repeater::Pattern.should_receive(:new).and_return(pattern)
|
23
|
+
pattern.should_receive(:wait).with(1).ordered
|
24
|
+
pattern.should_receive(:wait).with(2).ordered
|
25
|
+
pattern.should_receive(:wait).with(3).ordered
|
26
|
+
get_with_max(3)
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_with_max(num)
|
30
|
+
connection.get("/unreliable/#{num}") { |req|
|
31
|
+
req.options[:timeout] = 1
|
32
|
+
req.options[:open_timeout] = 1
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -34,3 +34,12 @@ RSpec.configure do |config|
|
|
34
34
|
config.order = 'random'
|
35
35
|
config.include SpecHelper
|
36
36
|
end
|
37
|
+
|
38
|
+
require 'service_double'
|
39
|
+
|
40
|
+
$service_double_url = "http://localhost:3434"
|
41
|
+
|
42
|
+
$service_double = ServiceDouble.hook_into(:rspec) do |config|
|
43
|
+
config.server = File.expand_path('../fake_server.rb', __FILE__)
|
44
|
+
config.url = $service_double_url
|
45
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: faraday-conductivity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: faraday
|
@@ -75,6 +75,22 @@ dependencies:
|
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: service_double
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
78
94
|
description: Extra Faraday middleware, geared towards a service oriented architecture.
|
79
95
|
email:
|
80
96
|
- iain@iain.nl
|
@@ -92,12 +108,15 @@ files:
|
|
92
108
|
- lib/faraday/conductivity.rb
|
93
109
|
- lib/faraday/conductivity/extended_logging.rb
|
94
110
|
- lib/faraday/conductivity/mimetype.rb
|
111
|
+
- lib/faraday/conductivity/repeater.rb
|
95
112
|
- lib/faraday/conductivity/request_id.rb
|
96
113
|
- lib/faraday/conductivity/request_id_filter.rb
|
97
114
|
- lib/faraday/conductivity/user_agent.rb
|
98
115
|
- lib/faraday/conductivity/version.rb
|
116
|
+
- spec/fake_server.rb
|
99
117
|
- spec/middleware/extended_logging_spec.rb
|
100
118
|
- spec/middleware/mimetype_spec.rb
|
119
|
+
- spec/middleware/repeater_spec.rb
|
101
120
|
- spec/middleware/request_id_spec.rb
|
102
121
|
- spec/middleware/user_agent_spec.rb
|
103
122
|
- spec/spec_helper.rb
|
@@ -127,8 +146,10 @@ signing_key:
|
|
127
146
|
specification_version: 3
|
128
147
|
summary: Extra Faraday middleware, geared towards a service oriented architecture.
|
129
148
|
test_files:
|
149
|
+
- spec/fake_server.rb
|
130
150
|
- spec/middleware/extended_logging_spec.rb
|
131
151
|
- spec/middleware/mimetype_spec.rb
|
152
|
+
- spec/middleware/repeater_spec.rb
|
132
153
|
- spec/middleware/request_id_spec.rb
|
133
154
|
- spec/middleware/user_agent_spec.rb
|
134
155
|
- spec/spec_helper.rb
|