faraday_middleware-reddit 0.3.2 → 0.4.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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/faraday_middleware/reddit.rb +4 -0
- data/lib/faraday_middleware/reddit/error.rb +12 -0
- data/lib/faraday_middleware/reddit/request/authentication.rb +13 -2
- data/lib/faraday_middleware/reddit/response/raise_error.rb +26 -0
- data/lib/faraday_middleware/reddit/use/modhash.rb +3 -0
- data/lib/faraday_middleware/reddit/use/rate_limit.rb +4 -7
- data/lib/faraday_middleware/reddit/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c8176b8963036b5df1a473466816f24c7097f01
|
4
|
+
data.tar.gz: 4aec072756fcbccb834d32ed8dd3aeb1c66f8858
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae93fb75328474ccf279951bb7582de3273794550708428e180c91d2e34030c18ae5ba956fc9c8b24f7262817cc9ace6b7da8f0e50659b17965f872708068185
|
7
|
+
data.tar.gz: eb6393b04f2a06a7abd3c4019a7cd3959685d8983db670140779d5bbc87393892bdd372555e44da6adc3880214b9f181fadd0d28dafe6016fdbdbc6f0abe651e
|
data/README.md
CHANGED
@@ -39,7 +39,7 @@ An example Farday client might look like:
|
|
39
39
|
|
40
40
|
require 'faraday_middleware/reddit'
|
41
41
|
|
42
|
-
conn = Faraday.new(:
|
42
|
+
conn = Faraday.new(url: 'http://www.reddit.com', headers: {'User-Agent' => 'faraday_middleware-reddit example (v 0.0.1)'}) do |faraday|
|
43
43
|
faraday.request :url_encoded
|
44
44
|
faraday.request :reddit_authentication, user: 'yourusername', password: 'yourpassword'
|
45
45
|
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
require 'faraday'
|
4
|
+
require 'faraday_middleware/reddit/error'
|
4
5
|
require 'faraday_middleware/reddit/helpers/modhash'
|
5
6
|
|
6
7
|
module FaradayMiddleware
|
@@ -8,11 +9,14 @@ module FaradayMiddleware
|
|
8
9
|
autoload :Authentication, 'faraday_middleware/reddit/request/authentication'
|
9
10
|
autoload :ForceJson, 'faraday_middleware/reddit/use/force_json'
|
10
11
|
autoload :Modhash, 'faraday_middleware/reddit/use/modhash'
|
12
|
+
autoload :RaiseError, 'faraday_middleware/reddit/response/raise_error'
|
11
13
|
autoload :RateLimit, 'faraday_middleware/reddit/use/rate_limit'
|
12
14
|
|
13
15
|
if Faraday::Middleware.respond_to? :register_middleware
|
14
16
|
Faraday::Request.register_middleware \
|
15
17
|
reddit_authentication: -> { Authentication }
|
18
|
+
Faraday::Response.register_middleware \
|
19
|
+
reddit_raise_error: -> { RaiseError }
|
16
20
|
Faraday::Middleware.register_middleware \
|
17
21
|
reddit_force_json: -> { ForceJson },
|
18
22
|
reddit_modhash: -> { Modhash },
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'faraday/error'
|
2
|
+
|
3
|
+
module FaradayMiddleware
|
4
|
+
module Reddit
|
5
|
+
class TooManyRequestsError < Faraday::ClientError; end # HTTP Status 429
|
6
|
+
class BadGatewayError < Faraday::ClientError; end # HTTP Status 502
|
7
|
+
class ServiceUnavailableError < Faraday::ClientError; end # HTTP Status 503
|
8
|
+
class GatewayTimeoutError < Faraday::ClientError; end # HTTP Status 504
|
9
|
+
|
10
|
+
RETRIABLE_ERRORS = [ServiceUnavailableError, GatewayTimeoutError]
|
11
|
+
end
|
12
|
+
end
|
@@ -12,7 +12,9 @@ module FaradayMiddleware
|
|
12
12
|
class Authentication < Faraday::Middleware
|
13
13
|
include ModhashHelpers
|
14
14
|
|
15
|
-
|
15
|
+
AUTH_DOMAIN = 'https://ssl.reddit.com'.freeze
|
16
|
+
AUTH_PATH = "/api/login".freeze
|
17
|
+
AUTH_URL = "#{AUTH_DOMAIN}#{AUTH_PATH}"
|
16
18
|
|
17
19
|
def initialize(app, options)
|
18
20
|
super(app)
|
@@ -54,10 +56,19 @@ module FaradayMiddleware
|
|
54
56
|
end
|
55
57
|
|
56
58
|
def authenticate(env)
|
57
|
-
response =
|
59
|
+
response = connection(env).post AUTH_PATH, user: @user, passwd: @passwd, rem: @rem, api_type: 'json'
|
58
60
|
env[:modhash] = extract_modhash(response.env)
|
59
61
|
@cookie = response.headers['set-cookie']
|
60
62
|
end
|
63
|
+
|
64
|
+
def connection(env)
|
65
|
+
Faraday.new(url: AUTH_DOMAIN, headers: env['request_headers']) do |faraday|
|
66
|
+
faraday.request :url_encoded
|
67
|
+
faraday.request :retry, max: 5, interval: 2, exceptions: FaradayMiddleware::Reddit::RETRIABLE_ERRORS
|
68
|
+
faraday.response :reddit_raise_error
|
69
|
+
faraday.adapter Faraday.default_adapter
|
70
|
+
end
|
71
|
+
end
|
61
72
|
end
|
62
73
|
end
|
63
74
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'faraday_middleware/reddit/error'
|
2
|
+
|
3
|
+
module FaradayMiddleware
|
4
|
+
module Reddit
|
5
|
+
# Extended version of Faraday::Response::RaiseError
|
6
|
+
#
|
7
|
+
# Provides additional exception cases for common reddit errors, such as
|
8
|
+
# 429 for hitting the API rate limit or 504 for gateway timeouts.
|
9
|
+
class RaiseError < Faraday::Response::RaiseError
|
10
|
+
def on_complete(env)
|
11
|
+
case env[:status]
|
12
|
+
when 429
|
13
|
+
raise FaradayMiddleware::Reddit::TooManyRequestsError, response_values(env)
|
14
|
+
when 502
|
15
|
+
raise FaradayMiddleware::Reddit::BadGatewayError, response_values(env)
|
16
|
+
when 503
|
17
|
+
raise FaradayMiddleware::Reddit::ServiceUnavailableError, response_values(env)
|
18
|
+
when 504
|
19
|
+
raise FaradayMiddleware::Reddit::GatewayTimeoutError, response_values(env)
|
20
|
+
end
|
21
|
+
|
22
|
+
super
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -19,6 +19,9 @@ module FaradayMiddleware
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def call(env)
|
22
|
+
# Modhash unnecessary when using OAuth.
|
23
|
+
return @app.call(env) if env[:request_headers]['Authorization']
|
24
|
+
|
22
25
|
@modhash = env[:modhash] if env[:modhash]
|
23
26
|
env[:request_headers]['X-Modhash'] = @modhash if @modhash
|
24
27
|
@app.call(env).on_complete do |response_env|
|
@@ -8,7 +8,7 @@ module FaradayMiddleware
|
|
8
8
|
#
|
9
9
|
# Logs reddit's ratelimit HTTP headers and applies a caching strategy
|
10
10
|
# based on them. The default strategy is to block for x-ratelimit-reset /
|
11
|
-
# x-
|
11
|
+
# x-ratelimit-remaining.
|
12
12
|
class RateLimit < Faraday::Middleware
|
13
13
|
def initialize(app, options = nil)
|
14
14
|
super(app)
|
@@ -23,12 +23,7 @@ module FaradayMiddleware
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def call(env)
|
26
|
-
|
27
|
-
sleep(@ratelimit_reset)
|
28
|
-
else
|
29
|
-
@strategy.call
|
30
|
-
end
|
31
|
-
|
26
|
+
@strategy.call
|
32
27
|
@app.call(env).on_complete { |response_env| on_complete_callback(response_env) }
|
33
28
|
end
|
34
29
|
|
@@ -37,6 +32,8 @@ module FaradayMiddleware
|
|
37
32
|
@ratelimit_used = env[:response_headers]['x-ratelimit-used'].to_i
|
38
33
|
@ratelimit_reset = env[:response_headers]['x-ratelimit-reset'].to_i
|
39
34
|
@ratelimit_cap = @ratelimit_remaining + @ratelimit_used
|
35
|
+
|
36
|
+
sleep(@ratelimit_reset) if @ratelimit_remaining == 0 || env[:status] == 429
|
40
37
|
end
|
41
38
|
|
42
39
|
def linear_strategy
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: faraday_middleware-reddit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel O'Brien
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-05-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -81,8 +81,10 @@ files:
|
|
81
81
|
- Rakefile
|
82
82
|
- faraday_middleware-reddit.gemspec
|
83
83
|
- lib/faraday_middleware/reddit.rb
|
84
|
+
- lib/faraday_middleware/reddit/error.rb
|
84
85
|
- lib/faraday_middleware/reddit/helpers/modhash.rb
|
85
86
|
- lib/faraday_middleware/reddit/request/authentication.rb
|
87
|
+
- lib/faraday_middleware/reddit/response/raise_error.rb
|
86
88
|
- lib/faraday_middleware/reddit/use/force_json.rb
|
87
89
|
- lib/faraday_middleware/reddit/use/modhash.rb
|
88
90
|
- lib/faraday_middleware/reddit/use/rate_limit.rb
|
@@ -108,10 +110,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
110
|
version: '0'
|
109
111
|
requirements: []
|
110
112
|
rubyforge_project:
|
111
|
-
rubygems_version: 2.
|
113
|
+
rubygems_version: 2.0.3
|
112
114
|
signing_key:
|
113
115
|
specification_version: 4
|
114
116
|
summary: A collection of Faraday middleware for use with the Reddit API.
|
115
117
|
test_files:
|
116
118
|
- spec/helper.rb
|
117
|
-
has_rdoc:
|