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 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: