faraday_middleware-reddit 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 126f0eb8d05054996da34d5bd58dbdc0f4382bf6
4
- data.tar.gz: a74cfa20ebc7484a892ecf8a22b49a64c23fed0f
3
+ metadata.gz: 6c8176b8963036b5df1a473466816f24c7097f01
4
+ data.tar.gz: 4aec072756fcbccb834d32ed8dd3aeb1c66f8858
5
5
  SHA512:
6
- metadata.gz: 2e00559891603a725434bdee4edc9bf87ec36f8493a5387ba6cbfa49cbabd2309e09f8613d871229b5ab264c27f5ed6a05d24fba186ee3bcc8c1fff40213f21b
7
- data.tar.gz: 886f50b45522fdf140b6dc5c250d369d68cbcba1855df2fc90d207d0bbbeeaeba0f4dcd2bad535d91447aee8f1f3ba4171562c625a4fdc31c3b8376d419c0059
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(:url => 'http://www.reddit.com', :headers => {'User-Agent' => 'faraday_middleware-reddit example (v 0.0.1)'}) do |faraday|
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
- AUTH_URL = 'https://ssl.reddit.com/api/login'.freeze
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 = Faraday.post AUTH_URL, user: @user, passwd: @passwd, rem: @rem, api_type: 'json'
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-ratelimit_remaining.
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
- if @ratelimit_remaining <= 0 || env[:status] == 429
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module FaradayMiddleware
4
4
  module Reddit
5
- VERSION = '0.3.2'
5
+ VERSION = '0.4.0'
6
6
  end
7
7
  end
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.3.2
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-04-28 00:00:00.000000000 Z
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.2.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: