redd 0.7.8 → 0.7.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +34 -34
  3. data/.rspec +3 -3
  4. data/.rubocop.yml +5 -5
  5. data/.travis.yml +9 -9
  6. data/LICENSE.md +22 -22
  7. data/README.md +143 -143
  8. data/Rakefile +5 -5
  9. data/RedditKit.LICENSE.md +8 -8
  10. data/lib/redd.rb +50 -50
  11. data/lib/redd/access.rb +76 -76
  12. data/lib/redd/clients/base.rb +181 -181
  13. data/lib/redd/clients/base/account.rb +20 -20
  14. data/lib/redd/clients/base/identity.rb +22 -22
  15. data/lib/redd/clients/base/none.rb +27 -27
  16. data/lib/redd/clients/base/privatemessages.rb +33 -33
  17. data/lib/redd/clients/base/read.rb +113 -113
  18. data/lib/redd/clients/base/stream.rb +81 -81
  19. data/lib/redd/clients/base/submit.rb +19 -19
  20. data/lib/redd/clients/base/utilities.rb +104 -104
  21. data/lib/redd/clients/base/wikiread.rb +33 -33
  22. data/lib/redd/clients/installed.rb +56 -56
  23. data/lib/redd/clients/script.rb +41 -41
  24. data/lib/redd/clients/userless.rb +32 -32
  25. data/lib/redd/clients/web.rb +58 -58
  26. data/lib/redd/error.rb +151 -151
  27. data/lib/redd/objects/base.rb +39 -39
  28. data/lib/redd/objects/comment.rb +22 -22
  29. data/lib/redd/objects/labeled_multi.rb +13 -13
  30. data/lib/redd/objects/listing.rb +29 -29
  31. data/lib/redd/objects/more_comments.rb +11 -10
  32. data/lib/redd/objects/private_message.rb +28 -28
  33. data/lib/redd/objects/submission.rb +139 -139
  34. data/lib/redd/objects/subreddit.rb +330 -319
  35. data/lib/redd/objects/thing.rb +26 -26
  36. data/lib/redd/objects/thing/editable.rb +22 -22
  37. data/lib/redd/objects/thing/hideable.rb +18 -18
  38. data/lib/redd/objects/thing/inboxable.rb +25 -25
  39. data/lib/redd/objects/thing/messageable.rb +34 -34
  40. data/lib/redd/objects/thing/moderatable.rb +43 -43
  41. data/lib/redd/objects/thing/refreshable.rb +14 -14
  42. data/lib/redd/objects/thing/saveable.rb +21 -21
  43. data/lib/redd/objects/thing/votable.rb +33 -33
  44. data/lib/redd/objects/user.rb +52 -52
  45. data/lib/redd/objects/wiki_page.rb +15 -15
  46. data/lib/redd/rate_limit.rb +88 -88
  47. data/lib/redd/response/parse_json.rb +18 -18
  48. data/lib/redd/response/raise_error.rb +16 -16
  49. data/lib/redd/version.rb +4 -4
  50. data/redd.gemspec +31 -31
  51. data/spec/redd/objects/base_spec.rb +1 -1
  52. data/spec/redd/response/raise_error_spec.rb +11 -11
  53. data/spec/redd_spec.rb +5 -5
  54. data/spec/spec_helper.rb +71 -71
  55. metadata +21 -21
@@ -1,52 +1,52 @@
1
- require_relative "thing"
2
-
3
- module Redd
4
- module Objects
5
- # The model for a reddit user
6
- class User < Thing
7
- include Thing::Messageable
8
-
9
- # @!method get_overview(**params)
10
- # @!method get_submitted(**params)
11
- # @!method get_comments(**params)
12
- # @!method get_liked(**params)
13
- # @!method get_disliked(**params)
14
- # @!method get_hidden(**params)
15
- # @!method get_saved(**params)
16
- # @!method get_gilded(**params)
17
- #
18
- # Get the appropriate listing.
19
- # @option params [String] :after Return results after the given
20
- # fullname.
21
- # @option params [String] :before Return results before the given
22
- # fullname.
23
- # @option params [Integer] :count The number of items already seen
24
- # in the listing.
25
- # @option params [1..100] :limit The maximum number of things to
26
- # return.
27
- # @option params [:hot, :new, :top, :controversial] :sort The type of
28
- # sort to use.
29
- # @option params [:hour, :day, :week, :month, :year, :all] :t The
30
- # time period to consider when sorting.
31
- # @option params [:given] :show For {#get_gilded}, whether to show the
32
- # gildings given.
33
- # @note The option :t only applies to the top and controversial sorts.
34
- # @return [Listing<Submission>]
35
- %w(
36
- overview submitted comments liked disliked hidden saved gilded
37
- ).each do |type|
38
- define_method :"get_#{type}" do |**params|
39
- client.request_object(
40
- :get, "/user/#{name}/#{type}.json", **params
41
- )
42
- end
43
- end
44
-
45
- # Get posts that the user has gilded.
46
- # @see #get_gilded
47
- def get_gildings_given(**params)
48
- get_gilded(**params.merge(show: "given"))
49
- end
50
- end
51
- end
52
- end
1
+ require_relative "thing"
2
+
3
+ module Redd
4
+ module Objects
5
+ # The model for a reddit user
6
+ class User < Thing
7
+ include Thing::Messageable
8
+
9
+ # @!method get_overview(**params)
10
+ # @!method get_submitted(**params)
11
+ # @!method get_comments(**params)
12
+ # @!method get_liked(**params)
13
+ # @!method get_disliked(**params)
14
+ # @!method get_hidden(**params)
15
+ # @!method get_saved(**params)
16
+ # @!method get_gilded(**params)
17
+ #
18
+ # Get the appropriate listing.
19
+ # @option params [String] :after Return results after the given
20
+ # fullname.
21
+ # @option params [String] :before Return results before the given
22
+ # fullname.
23
+ # @option params [Integer] :count The number of items already seen
24
+ # in the listing.
25
+ # @option params [1..100] :limit The maximum number of things to
26
+ # return.
27
+ # @option params [:hot, :new, :top, :controversial] :sort The type of
28
+ # sort to use.
29
+ # @option params [:hour, :day, :week, :month, :year, :all] :t The
30
+ # time period to consider when sorting.
31
+ # @option params [:given] :show For {#get_gilded}, whether to show the
32
+ # gildings given.
33
+ # @note The option :t only applies to the top and controversial sorts.
34
+ # @return [Listing<Submission>]
35
+ %w(
36
+ overview submitted comments liked disliked hidden saved gilded
37
+ ).each do |type|
38
+ define_method :"get_#{type}" do |**params|
39
+ client.request_object(
40
+ :get, "/user/#{name}/#{type}.json", **params
41
+ )
42
+ end
43
+ end
44
+
45
+ # Get posts that the user has gilded.
46
+ # @see #get_gilded
47
+ def get_gildings_given(**params)
48
+ get_gilded(**params.merge(show: "given"))
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,15 +1,15 @@
1
- require_relative "thing"
2
-
3
- module Redd
4
- module Objects
5
- # A submission made in a subreddit.
6
- class WikiPage < Thing
7
- alias_property :content, :content_md
8
- alias_property :body, :content_md
9
-
10
- def revision_user
11
- @revision_by ||= client.object_from_body(revision_by)
12
- end
13
- end
14
- end
15
- end
1
+ require_relative "thing"
2
+
3
+ module Redd
4
+ module Objects
5
+ # A submission made in a subreddit.
6
+ class WikiPage < Thing
7
+ alias_property :content, :content_md
8
+ alias_property :body, :content_md
9
+
10
+ def revision_user
11
+ @revision_by ||= client.object_from_body(revision_by)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,88 +1,88 @@
1
- # The main Redd module.
2
- module Redd
3
- # The class that handles rate limiting for reddit.
4
- #
5
- # If you'd rather have an asynchronous or queue-based limiting, it's easy to
6
- # write one yourself. A rate limiting class is any class that has an
7
- # {#after_limit} method. The block returns a Faraday::Response object, so you
8
- # can also extract the headers from the response and use those instead. To
9
- # remove rate limiting entirely, follow the example below.
10
- #
11
- # @example To remove rate limiting entirely, just burst forever.
12
- # rt = Redd::RateLimit.new
13
- # rt.burst!(Float::INFINITY)
14
- class RateLimit
15
- # @!attribute [rw] gap
16
- # @return [Integer, Float] The minimum time between requests.
17
- attr_accessor :gap
18
-
19
- # @!attribute [rw] burst_length
20
- # @return [Integer] The number of requests left to burst.
21
- attr_accessor :burst_length
22
-
23
- # @!attribute [r] last_request
24
- # @return [Time] The time the last request was made.
25
- attr_reader :last_request
26
-
27
- # @!attribute [r] used
28
- # @!attribute [r] remaining
29
- # @!attribute [r] reset
30
- # @return [Integer] The data from reddit's response headers.
31
- attr_reader :used, :remaining, :reset
32
-
33
- # @param [Float, Integer] gap The minimum time between each request.
34
- def initialize(gap)
35
- # Some time ages ago, because we never made a request.
36
- @last_request = Time.at(0)
37
- @gap = gap
38
- @burst_length = 0
39
- end
40
-
41
- # Don't sleep for the next few requests.
42
- # @param [Integer] times The number of times to ignore limiting.
43
- # @return [Integer] The total times rate limiting will be ignored.
44
- def burst!(times)
45
- @burst_length += times
46
- end
47
-
48
- # Sleep until 1 second has passed since the last request and perform the
49
- # given request unless bursting.
50
- #
51
- # @yield [Faraday::Response] A response.
52
- # @return [Faraday::Response] The response.
53
- def after_limit
54
- response = yield
55
- update!(response)
56
- sleep(wait_time)
57
- response
58
- end
59
-
60
- private
61
-
62
- # Update necessary info with each request.
63
- # @param [Faraday::Response] response The response to the request made.
64
- def update!(response)
65
- @last_request_time = Time.now
66
- %w(used remaining reset).each do |type|
67
- value = response.headers["x-ratelimit-#{type}"]
68
- instance_variable_set("@#{type}", value.to_i) unless value.nil?
69
- end
70
- end
71
-
72
- # @return [Float, Integer] The number of seconds to sleep.
73
- def wait_time
74
- if @burst_length > 0 && @remaining > 0
75
- # Don't sleep if we are in burst mode.
76
- @burst_length -= 1
77
- 0
78
- elsif @reset.nil? || @remaining.nil?
79
- # Just guess if no headers were given (max 1 sec after last request).
80
- time = @last_request_time - Time.now + @gap
81
- time > 0 ? time : 0
82
- else
83
- # Most cases, spread out requests over available time.
84
- @reset.to_f / (@gap * @remaining + 1)
85
- end
86
- end
87
- end
88
- end
1
+ # The main Redd module.
2
+ module Redd
3
+ # The class that handles rate limiting for reddit.
4
+ #
5
+ # If you'd rather have an asynchronous or queue-based limiting, it's easy to
6
+ # write one yourself. A rate limiting class is any class that has an
7
+ # {#after_limit} method. The block returns a Faraday::Response object, so you
8
+ # can also extract the headers from the response and use those instead. To
9
+ # remove rate limiting entirely, follow the example below.
10
+ #
11
+ # @example To remove rate limiting entirely, just burst forever.
12
+ # rt = Redd::RateLimit.new
13
+ # rt.burst!(Float::INFINITY)
14
+ class RateLimit
15
+ # @!attribute [rw] gap
16
+ # @return [Integer, Float] The minimum time between requests.
17
+ attr_accessor :gap
18
+
19
+ # @!attribute [rw] burst_length
20
+ # @return [Integer] The number of requests left to burst.
21
+ attr_accessor :burst_length
22
+
23
+ # @!attribute [r] last_request
24
+ # @return [Time] The time the last request was made.
25
+ attr_reader :last_request
26
+
27
+ # @!attribute [r] used
28
+ # @!attribute [r] remaining
29
+ # @!attribute [r] reset
30
+ # @return [Integer] The data from reddit's response headers.
31
+ attr_reader :used, :remaining, :reset
32
+
33
+ # @param [Float, Integer] gap The minimum time between each request.
34
+ def initialize(gap)
35
+ # Some time ages ago, because we never made a request.
36
+ @last_request = Time.at(0)
37
+ @gap = gap
38
+ @burst_length = 0
39
+ end
40
+
41
+ # Don't sleep for the next few requests.
42
+ # @param [Integer] times The number of times to ignore limiting.
43
+ # @return [Integer] The total times rate limiting will be ignored.
44
+ def burst!(times)
45
+ @burst_length += times
46
+ end
47
+
48
+ # Sleep until 1 second has passed since the last request and perform the
49
+ # given request unless bursting.
50
+ #
51
+ # @yield [Faraday::Response] A response.
52
+ # @return [Faraday::Response] The response.
53
+ def after_limit
54
+ response = yield
55
+ update!(response)
56
+ sleep(wait_time)
57
+ response
58
+ end
59
+
60
+ private
61
+
62
+ # Update necessary info with each request.
63
+ # @param [Faraday::Response] response The response to the request made.
64
+ def update!(response)
65
+ @last_request_time = Time.now
66
+ %w(used remaining reset).each do |type|
67
+ value = response.headers["x-ratelimit-#{type}"]
68
+ instance_variable_set("@#{type}", value.to_i) unless value.nil?
69
+ end
70
+ end
71
+
72
+ # @return [Float, Integer] The number of seconds to sleep.
73
+ def wait_time
74
+ if @burst_length > 0 && @remaining > 0
75
+ # Don't sleep if we are in burst mode.
76
+ @burst_length -= 1
77
+ 0
78
+ elsif @reset.nil? || @remaining.nil?
79
+ # Just guess if no headers were given (max 1 sec after last request).
80
+ time = @last_request_time - Time.now + @gap
81
+ time > 0 ? time : 0
82
+ else
83
+ # Most cases, spread out requests over available time.
84
+ @reset.to_f / (@gap * @remaining + 1)
85
+ end
86
+ end
87
+ end
88
+ end
@@ -1,18 +1,18 @@
1
- require "faraday/response"
2
- require_relative "../error"
3
-
4
- module Redd
5
- # The module that contains middleware that alters the Faraday response.
6
- module Response
7
- # Faraday Middleware that parses JSON using OJ, via MultiJson.
8
- class ParseJson < Faraday::Response::Middleware
9
- dependency "multi_json"
10
-
11
- def on_complete(env)
12
- env[:body] = MultiJson.load(env[:body], symbolize_keys: true)
13
- rescue MultiJson::ParseError
14
- raise JSONError.new(env), env[:body]
15
- end
16
- end
17
- end
18
- end
1
+ require "faraday/response"
2
+ require_relative "../error"
3
+
4
+ module Redd
5
+ # The module that contains middleware that alters the Faraday response.
6
+ module Response
7
+ # Faraday Middleware that parses JSON using OJ, via MultiJson.
8
+ class ParseJson < Faraday::Response::Middleware
9
+ dependency "multi_json"
10
+
11
+ def on_complete(env)
12
+ env[:body] = MultiJson.load(env[:body], symbolize_keys: true)
13
+ rescue MultiJson::ParseError
14
+ raise ::Redd::Error::JSONError.new(env), env[:body]
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,16 +1,16 @@
1
- require "faraday/response"
2
- require_relative "../error"
3
-
4
- module Redd
5
- # The module that contains middleware that alters the Faraday response.
6
- module Response
7
- # Faraday Middleware that raises an error if there's one.
8
- # @see Error
9
- class RaiseError < Faraday::Response::Middleware
10
- def on_complete(env)
11
- error = Redd::Error.from_response(env)
12
- fail error.new(env), env[:body] if error
13
- end
14
- end
15
- end
16
- end
1
+ require "faraday/response"
2
+ require_relative "../error"
3
+
4
+ module Redd
5
+ # The module that contains middleware that alters the Faraday response.
6
+ module Response
7
+ # Faraday Middleware that raises an error if there's one.
8
+ # @see Error
9
+ class RaiseError < Faraday::Response::Middleware
10
+ def on_complete(env)
11
+ error = Redd::Error.from_response(env)
12
+ fail error.new(env), env[:body] if error
13
+ end
14
+ end
15
+ end
16
+ end
data/lib/redd/version.rb CHANGED
@@ -1,4 +1,4 @@
1
- module Redd # rubocop:disable Style/Documentation
2
- # The semantic version number.
3
- VERSION = "0.7.8"
4
- end
1
+ module Redd # rubocop:disable Style/Documentation
2
+ # The semantic version number.
3
+ VERSION = "0.7.9"
4
+ end
data/redd.gemspec CHANGED
@@ -1,31 +1,31 @@
1
- # coding: utf-8
2
- lib = File.expand_path("../lib", __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "redd/version"
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "redd"
8
- spec.version = Redd::VERSION
9
- spec.authors = ["Avinash Dwarapu"]
10
- spec.email = ["avinash@dwarapu.me"]
11
- spec.summary = "A Reddit API Wrapper for Ruby."
12
- spec.homepage = "https://github.com/avidw/redd"
13
- spec.license = "MIT"
14
- spec.required_ruby_version = ">= 2.1.0"
15
-
16
- spec.files = `git ls-files -z`.split("\x0")
17
- spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(/^(test|spec|features)\//)
19
- spec.require_paths = ["lib"]
20
-
21
- spec.add_development_dependency "bundler", "~> 1.10.6"
22
- spec.add_development_dependency "rake", "~> 10.4.2"
23
- spec.add_development_dependency "rspec", "~> 3.2.0"
24
- spec.add_development_dependency "vcr", "~> 2.9.3"
25
- spec.add_development_dependency "webmock", "~> 1.20.4"
26
-
27
- spec.add_dependency "hashie", "~> 3.4.0"
28
- spec.add_dependency "faraday", "~> 0.9.1"
29
- spec.add_dependency "multi_json", "~> 1.10.1"
30
- spec.add_dependency "fastimage", "~> 1.6.6"
31
- end
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "redd/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "redd"
8
+ spec.version = Redd::VERSION
9
+ spec.authors = ["Avinash Dwarapu"]
10
+ spec.email = ["avinash@dwarapu.me"]
11
+ spec.summary = "A Reddit API Wrapper for Ruby."
12
+ spec.homepage = "https://github.com/avidw/redd"
13
+ spec.license = "MIT"
14
+ spec.required_ruby_version = ">= 2.1.0"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(/^(test|spec|features)\//)
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.12"
22
+ spec.add_development_dependency "rake", "~> 11.2"
23
+ spec.add_development_dependency "rspec", "~> 3.5"
24
+ spec.add_development_dependency "vcr", "~> 3.0"
25
+ spec.add_development_dependency "webmock", "~> 2.1"
26
+
27
+ spec.add_dependency "hashie", "~> 3.4"
28
+ spec.add_dependency "faraday", "~> 0.9"
29
+ spec.add_dependency "multi_json", "~> 1.12"
30
+ spec.add_dependency "fastimage", "~> 2.0"
31
+ end