faraday_middleware-reddit 0.4.0 → 0.4.1
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 +19 -12
- data/lib/faraday_middleware/reddit/error.rb +42 -5
- data/lib/faraday_middleware/reddit/helpers/modhash.rb +2 -2
- data/lib/faraday_middleware/reddit/response/raise_error.rb +4 -11
- data/lib/faraday_middleware/reddit/use/modhash.rb +2 -1
- data/lib/faraday_middleware/reddit/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3a8bf096bc82afbfb647b67b46d95a2197a760ae
|
4
|
+
data.tar.gz: f1cea4e6ffe5be56610905ecf3471e7279383c61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b5462123374a82de0a701da5188855bd1b2766478c027b8070d0c56fe460effd53013af394341bce6cb9d6bad5ecef64c220f5a6b22fac281a5be9e5ae7db2e
|
7
|
+
data.tar.gz: ab18755c20a5c60d31b9b600d2dd26aacafc8e7f4b90d314767fd22fe76fc5a381531a609a1dbec30785d5300f6e6d56fcd93a29115c8b4b1acc58d43d4172d5
|
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
A collection of Faraday middleware for use with the Reddit API.
|
4
4
|
|
5
|
+
This project is the backbone for [reddit-base](https://github.com/dobs/reddit-base). If you're building a client from scratch or just want to get up and running quickly you might want to check it out instead.
|
6
|
+
|
5
7
|
## Installation
|
6
8
|
|
7
9
|
Add this line to your application's Gemfile:
|
@@ -29,29 +31,34 @@ Like `faraday_middleware`, `faraday_middleware-reddit` requires a `json` library
|
|
29
31
|
| Middleware | Type | Description |
|
30
32
|
| --- | --- | --- |
|
31
33
|
| `:reddit_authentication` | request | Authentication based on a username, password or pre-generated cookie. |
|
32
|
-
| `:reddit_force_json` |
|
34
|
+
| `:reddit_force_json` | use | Coerces reddit into returnign JSON for GET and POST requests. |
|
33
35
|
| `:reddit_modhash` | use | Automatic modhash handling. |
|
36
|
+
| `:reddit_raise_error` | response | Raises errors for common reddit error cases. |
|
34
37
|
| `:reddit_rate_limit` | use | Rate limiting based on reddit's `x-ratelimit` headers. Accepts a `strategy` proc to override default linear strategy. |
|
35
38
|
|
36
39
|
## Examples
|
37
40
|
|
38
41
|
An example Farday client might look like:
|
39
42
|
|
40
|
-
|
43
|
+
```ruby
|
44
|
+
require 'faraday_middleware/reddit'
|
41
45
|
|
42
|
-
|
43
|
-
|
44
|
-
|
46
|
+
conn = Faraday.new(url: 'http://www.reddit.com', headers: {'User-Agent' => 'faraday_middleware-reddit example (v 0.0.1)'}) do |faraday|
|
47
|
+
faraday.request :url_encoded
|
48
|
+
faraday.request :reddit_authentication, user: 'yourusername', password: 'yourpassword'
|
49
|
+
faraday.request :retry, max: 2, interval: 2, exceptions: FaradayMiddleware::Reddit::RETRIABLE_ERRORS
|
45
50
|
|
46
|
-
|
47
|
-
|
51
|
+
faraday.response :logger
|
52
|
+
faraday.response :follow_redirects
|
53
|
+
faraday.response :reddit_raise_error
|
48
54
|
|
49
|
-
|
50
|
-
|
51
|
-
|
55
|
+
faraday.use :reddit_force_json
|
56
|
+
faraday.use :reddit_rate_limit
|
57
|
+
faraday.use :reddit_modhash
|
52
58
|
|
53
|
-
|
54
|
-
|
59
|
+
faraday.adapter Faraday.default_adapter
|
60
|
+
end
|
61
|
+
```
|
55
62
|
|
56
63
|
## Contributing
|
57
64
|
|
@@ -2,11 +2,48 @@ require 'faraday/error'
|
|
2
2
|
|
3
3
|
module FaradayMiddleware
|
4
4
|
module Reddit
|
5
|
-
class
|
6
|
-
class
|
7
|
-
class ServiceUnavailableError < Faraday::ClientError; end # HTTP Status 503
|
8
|
-
class GatewayTimeoutError < Faraday::ClientError; end # HTTP Status 504
|
5
|
+
class ClientError < Faraday::ClientError; end
|
6
|
+
class ServerError < Faraday::ClientError; end
|
9
7
|
|
10
|
-
|
8
|
+
# Many of these errors are hypothetical, but better safe than sorry.
|
9
|
+
class BadRequestError < ClientError; end
|
10
|
+
class UnauthorizedError < ClientError; end
|
11
|
+
class ForbiddenError < ClientError; end
|
12
|
+
class NotFoundError < ClientError; end
|
13
|
+
class MethodNotAllowedError < ClientError; end
|
14
|
+
class NotAcceptableError < ClientError; end
|
15
|
+
class RequestTimeoutError < ClientError; end
|
16
|
+
class RequestEntityTooLargeError < ClientError; end
|
17
|
+
class RequestURITooLongError < ClientError; end
|
18
|
+
class UnsupportedMediaTypeError < ClientError; end
|
19
|
+
class TooManyRequestsError < ClientError; end
|
20
|
+
class InternalServerError < ServerError; end
|
21
|
+
class NotImplementedError < ServerError; end
|
22
|
+
class BadGatewayError < ServerError; end
|
23
|
+
class ServiceUnavailableError < ServerError; end
|
24
|
+
class GatewayTimeoutError < ServerError; end
|
25
|
+
|
26
|
+
ERROR_CODES = {
|
27
|
+
400 => BadRequestError,
|
28
|
+
401 => UnauthorizedError,
|
29
|
+
403 => ForbiddenError,
|
30
|
+
404 => NotFoundError,
|
31
|
+
405 => MethodNotAllowedError,
|
32
|
+
406 => NotAcceptableError,
|
33
|
+
408 => RequestTimeoutError,
|
34
|
+
413 => RequestEntityTooLargeError,
|
35
|
+
414 => RequestURITooLongError,
|
36
|
+
429 => TooManyRequestsError,
|
37
|
+
500 => InternalServerError,
|
38
|
+
501 => NotImplementedError,
|
39
|
+
502 => BadGatewayError,
|
40
|
+
503 => ServiceUnavailableError,
|
41
|
+
504 => GatewayTimeoutError
|
42
|
+
}.freeze
|
43
|
+
|
44
|
+
RETRIABLE_ERRORS = [
|
45
|
+
ServiceUnavailableError,
|
46
|
+
GatewayTimeoutError
|
47
|
+
].freeze
|
11
48
|
end
|
12
49
|
end
|
@@ -14,8 +14,8 @@ module FaradayMiddleware
|
|
14
14
|
|
15
15
|
body = env[:body]
|
16
16
|
body = JSON.parse(body) if body.is_a?(String) && !body.strip.empty?
|
17
|
-
body = body['json'] if body['json']
|
18
|
-
body['data']['modhash'] if body['data']
|
17
|
+
body = body['json'] if body.is_a?(Hash) && body['json']
|
18
|
+
body['data']['modhash'] if body.is_a?(Hash) && body['data']
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -8,18 +8,11 @@ module FaradayMiddleware
|
|
8
8
|
# 429 for hitting the API rate limit or 504 for gateway timeouts.
|
9
9
|
class RaiseError < Faraday::Response::RaiseError
|
10
10
|
def on_complete(env)
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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)
|
11
|
+
if FaradayMiddleware::Reddit::ERROR_CODES.include? env[:status]
|
12
|
+
raise FaradayMiddleware::Reddit::ERROR_CODES[env[:status]], response_values(env)
|
13
|
+
else
|
14
|
+
super
|
20
15
|
end
|
21
|
-
|
22
|
-
super
|
23
16
|
end
|
24
17
|
end
|
25
18
|
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.4.
|
4
|
+
version: 0.4.1
|
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-05-
|
11
|
+
date: 2014-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|