redd 0.6.5 → 0.7.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.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +34 -33
  3. data/.rspec +3 -4
  4. data/.rubocop.yml +5 -5
  5. data/.travis.yml +9 -7
  6. data/{LICENSE.md → LICENSE.txt} +22 -22
  7. data/README.md +126 -241
  8. data/Rakefile +5 -6
  9. data/{RedditKit.LICENSE.md → RedditKit.LICENSE.txt} +13 -13
  10. data/lib/redd.rb +50 -4
  11. data/lib/redd/access.rb +76 -0
  12. data/lib/redd/clients/base.rb +178 -0
  13. data/lib/redd/clients/base/account.rb +20 -0
  14. data/lib/redd/clients/base/identity.rb +22 -0
  15. data/lib/redd/clients/base/none.rb +27 -0
  16. data/lib/redd/clients/base/privatemessages.rb +28 -0
  17. data/lib/redd/clients/base/read.rb +66 -0
  18. data/lib/redd/clients/base/stream.rb +74 -0
  19. data/lib/redd/clients/base/submit.rb +54 -0
  20. data/lib/redd/clients/base/utilities.rb +80 -0
  21. data/lib/redd/clients/base/wikiread.rb +33 -0
  22. data/lib/redd/clients/installed.rb +55 -0
  23. data/lib/redd/clients/script.rb +37 -0
  24. data/lib/redd/clients/userless.rb +31 -0
  25. data/lib/redd/clients/web.rb +57 -0
  26. data/lib/redd/error.rb +138 -153
  27. data/lib/redd/objects/base.rb +36 -0
  28. data/lib/redd/objects/comment.rb +22 -0
  29. data/lib/redd/objects/listing.rb +29 -0
  30. data/lib/redd/objects/more_comments.rb +10 -0
  31. data/lib/redd/objects/private_message.rb +18 -0
  32. data/lib/redd/objects/submission.rb +72 -0
  33. data/lib/redd/objects/subreddit.rb +152 -0
  34. data/lib/redd/objects/thing.rb +33 -0
  35. data/lib/redd/objects/thing/editable.rb +22 -0
  36. data/lib/redd/objects/thing/hideable.rb +18 -0
  37. data/lib/redd/objects/thing/inboxable.rb +25 -0
  38. data/lib/redd/objects/thing/messageable.rb +34 -0
  39. data/lib/redd/objects/thing/moderatable.rb +43 -0
  40. data/lib/redd/objects/thing/refreshable.rb +14 -0
  41. data/lib/redd/objects/thing/saveable.rb +21 -0
  42. data/lib/redd/objects/thing/votable.rb +33 -0
  43. data/lib/redd/objects/user.rb +52 -0
  44. data/lib/redd/objects/wiki_page.rb +15 -0
  45. data/lib/redd/rate_limit.rb +50 -49
  46. data/lib/redd/response/parse_json.rb +17 -33
  47. data/lib/redd/response/raise_error.rb +16 -25
  48. data/lib/redd/version.rb +4 -5
  49. data/redd.gemspec +30 -31
  50. data/spec/redd/objects/base_spec.rb +1 -0
  51. data/spec/redd/rate_limit_spec.rb +29 -29
  52. data/spec/redd/response/parse_json_spec.rb +12 -0
  53. data/spec/redd/response/raise_error_spec.rb +11 -0
  54. data/spec/redd_spec.rb +7 -5
  55. data/spec/spec_helper.rb +69 -50
  56. metadata +73 -136
  57. data/.yardopts +0 -1
  58. data/lib/redd/base.rb +0 -56
  59. data/lib/redd/client/authenticated.rb +0 -83
  60. data/lib/redd/client/authenticated/account.rb +0 -13
  61. data/lib/redd/client/authenticated/apps.rb +0 -13
  62. data/lib/redd/client/authenticated/flair.rb +0 -71
  63. data/lib/redd/client/authenticated/gold.rb +0 -13
  64. data/lib/redd/client/authenticated/links_comments.rb +0 -189
  65. data/lib/redd/client/authenticated/live.rb +0 -13
  66. data/lib/redd/client/authenticated/moderation.rb +0 -126
  67. data/lib/redd/client/authenticated/multis.rb +0 -9
  68. data/lib/redd/client/authenticated/private_messages.rb +0 -73
  69. data/lib/redd/client/authenticated/subreddits.rb +0 -172
  70. data/lib/redd/client/authenticated/users.rb +0 -9
  71. data/lib/redd/client/authenticated/wiki.rb +0 -9
  72. data/lib/redd/client/oauth2.rb +0 -71
  73. data/lib/redd/client/oauth2/authorization.rb +0 -108
  74. data/lib/redd/client/oauth2/identity.rb +0 -16
  75. data/lib/redd/client/oauth2_script.rb +0 -24
  76. data/lib/redd/client/oauth2_script/authorization.rb +0 -21
  77. data/lib/redd/client/unauthenticated.rb +0 -118
  78. data/lib/redd/client/unauthenticated/account.rb +0 -30
  79. data/lib/redd/client/unauthenticated/captcha.rb +0 -27
  80. data/lib/redd/client/unauthenticated/links_comments.rb +0 -60
  81. data/lib/redd/client/unauthenticated/listing.rb +0 -65
  82. data/lib/redd/client/unauthenticated/live.rb +0 -9
  83. data/lib/redd/client/unauthenticated/moderation.rb +0 -26
  84. data/lib/redd/client/unauthenticated/subreddits.rb +0 -49
  85. data/lib/redd/client/unauthenticated/users.rb +0 -67
  86. data/lib/redd/client/unauthenticated/utilities.rb +0 -109
  87. data/lib/redd/client/unauthenticated/wiki.rb +0 -33
  88. data/lib/redd/oauth2_access.rb +0 -70
  89. data/lib/redd/object/comment.rb +0 -74
  90. data/lib/redd/object/listing.rb +0 -29
  91. data/lib/redd/object/more_comments.rb +0 -14
  92. data/lib/redd/object/private_message.rb +0 -35
  93. data/lib/redd/object/submission.rb +0 -94
  94. data/lib/redd/object/subreddit.rb +0 -74
  95. data/lib/redd/object/user.rb +0 -34
  96. data/lib/redd/object/wiki_page.rb +0 -27
  97. data/lib/redd/thing.rb +0 -27
  98. data/lib/redd/thing/commentable.rb +0 -27
  99. data/lib/redd/thing/editable.rb +0 -16
  100. data/lib/redd/thing/hideable.rb +0 -16
  101. data/lib/redd/thing/inboxable.rb +0 -20
  102. data/lib/redd/thing/messageable.rb +0 -12
  103. data/lib/redd/thing/moderatable.rb +0 -32
  104. data/lib/redd/thing/reportable.rb +0 -12
  105. data/lib/redd/thing/saveable.rb +0 -16
  106. data/lib/redd/thing/voteable.rb +0 -22
  107. data/spec/README.md +0 -18
  108. data/spec/redd/base_spec.rb +0 -36
  109. data/spec/redd/client/authenticated/account_spec.rb +0 -5
  110. data/spec/redd/client/authenticated/apps_spec.rb +0 -2
  111. data/spec/redd/client/authenticated/flair_spec.rb +0 -26
  112. data/spec/redd/client/authenticated/gold_spec.rb +0 -2
  113. data/spec/redd/client/authenticated/links_comments_spec.rb +0 -231
  114. data/spec/redd/client/authenticated/live_spec.rb +0 -2
  115. data/spec/redd/client/unauthenticated/account_spec.rb +0 -15
  116. data/spec/redd/client/unauthenticated/captcha_spec.rb +0 -23
  117. data/spec/redd/client/unauthenticated/links_comments_spec.rb +0 -28
  118. data/spec/redd/client/unauthenticated/listing_spec.rb +0 -23
  119. data/spec/redd/client/unauthenticated/live_spec.rb +0 -2
  120. data/spec/redd/client/unauthenticated/moderation_spec.rb +0 -14
  121. data/spec/redd/client/unauthenticated/subreddits_spec.rb +0 -35
  122. data/spec/redd/client/unauthenticated/users_spec.rb +0 -34
  123. data/spec/redd/client/unauthenticated/wiki_spec.rb +0 -18
  124. data/spec/redd/oauth2_access_spec.rb +0 -83
  125. data/spec/redd/thing_spec.rb +0 -22
@@ -1,13 +0,0 @@
1
- module Redd
2
- module Client
3
- class Authenticated
4
- # Methods to manage the logged-in user
5
- module Account
6
- # @return [Redd::Object::User] The logged-in user.
7
- def me
8
- object_from_response :get, "/api/me.json"
9
- end
10
- end
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- module Redd
2
- module Client
3
- class Authenticated
4
- # Methods to interact with OAuth2 Apps
5
- module Apps
6
- # Low-Priority
7
- #
8
- # There should be very little reasons for bots to mess around with app
9
- # settings, so this module might be worked on later or not at all.
10
- end
11
- end
12
- end
13
- end
@@ -1,71 +0,0 @@
1
- module Redd
2
- module Client
3
- class Authenticated
4
- # Methods to interact with link and user flairs.
5
- module Flair
6
- # Get a list of everbody on the subreddit with a user flair.
7
- #
8
- # @param subreddit [Redd::Object::Subreddit, String] The subreddit to
9
- # find the users in.
10
- # @param params [Hash] A list of params to send with the request.
11
- # @option params [String] :after Return results after the given
12
- # fullname.
13
- # @option params [String] :before Return results before the given
14
- # fullname.
15
- # @option params [Integer] :count (0) The number of items already seen
16
- # in the listing.
17
- # @option params [1..1000] :limit (25) The maximum number of things to
18
- # return.
19
- # @return [Array<Hash>] An array of users.
20
- def get_flair_list(subreddit, params = {})
21
- name = extract_attribute(subreddit, :display_name)
22
-
23
- path = "/api/flairlist.json"
24
- path = path.prepend("/r/#{name}")
25
-
26
- get(path, params)[:users]
27
- end
28
-
29
- # Get the flair of a user.
30
- #
31
- # @param subreddit [Redd::Object::Subreddit, String] The subreddit to
32
- # find the user in.
33
- # @param user [Redd::Object::User, String] The user to find.
34
- # @return [Hash, nil] Flair info about the user or nil if nobody was
35
- # found.
36
- def get_flair(subreddit, user)
37
- display_name = extract_attribute(subreddit, :display_name)
38
- username = extract_attribute(user, :name)
39
- options = {name: username}
40
-
41
- flair = get_flair_list(display_name, options).first
42
- flair if flair[:user].casecmp(username.downcase) == 0
43
- end
44
-
45
- # Set the flair of a user or link.
46
- # @param subreddit [Redd::Object::Subreddit, String] The subreddit to
47
- # find the user in.
48
- # @param user_or_link [Redd::Object::Subreddit, Redd::Object::User]
49
- # The user or link to set the flair to.
50
- # @param text [String] The text to set the flair to.
51
- # @param css_class [String] The css_class of the flair.
52
- def set_flair(subreddit, user_or_link, text = "", css_class = "")
53
- name = extract_attribute(subreddit, :display_name)
54
- path = "/r/#{name}/api/flair"
55
- params = {api_type: "json", text: text, css_class: css_class}
56
-
57
- case user_or_link
58
- when Redd::Object::User
59
- params[:name] = extract_attribute(user_or_link, :name)
60
- when Redd::Object::Submission
61
- params[:link] = extract_attribute(user_or_link, :display_name)
62
- else
63
- fail "You should provide a User or Submission object."
64
- end
65
-
66
- post path, params
67
- end
68
- end
69
- end
70
- end
71
- end
@@ -1,13 +0,0 @@
1
- module Redd
2
- module Client
3
- class Authenticated
4
- # Methods to gild a user, link or comment
5
- module Gold
6
- # Low-Priority
7
- #
8
- # Yeeaahh... Handing conrol of spending money to some code is pretty
9
- # stupid. This might not be developed.
10
- end
11
- end
12
- end
13
- end
@@ -1,189 +0,0 @@
1
- module Redd
2
- module Client
3
- class Authenticated
4
- # Methods to deal with comments and links
5
- module LinksComments
6
- # Submit a link or a text post to a subreddit.
7
- #
8
- # @param title [String] The title of the submission.
9
- # @param kind [:self, :link] The type of submission to make.
10
- # @param text_or_url [String] The url of the post if :link or the
11
- # content of the post if :text
12
- # @param subreddit [Redd::Object::Submission, String] The subreddit
13
- # to submit to.
14
- # @param captcha [String] A possible captcha result to send if one
15
- # is required.
16
- # @param identifier [String] The identifier for the captcha if one
17
- # is required.
18
- # @param options [Hash] A hash of additional options to send.
19
- # @option options [Boolean] :resubmit (false) Whether to post a link
20
- # to a subreddit despite it having been posted there before.
21
- # @option options [Boolean] :resubmit (false) Whether to automatically
22
- # save the post to the user's account after posting.
23
- def submit(
24
- title, kind, text_or_url, subreddit, captcha = nil, identifier = nil,
25
- options = {}
26
- )
27
-
28
- params = {
29
- api_type: "json", extension: "json", title: title, kind: kind
30
- }
31
- sr_name = extract_attribute(subreddit, :display_name)
32
- params << {sr: sr_name}
33
-
34
- case kind.to_sym
35
- when :self
36
- params[:text] = text_or_url
37
- when :link
38
- params[:url] = text_or_url
39
- end
40
-
41
- params << {captcha: captcha, iden: identifier} if captcha
42
- params << options
43
-
44
- post "/api/submit", params
45
- end
46
-
47
- # Add a comment to a link, reply to a comment or reply to a message.
48
- # Bit of an all-purpose method, this one.
49
- #
50
- # @param thing [Redd::Object::Submission, Redd::Object::Comment,
51
- # Redd::Object::PrivateMessage, String] A thing to add a comment to.
52
- # @param text [String] The text to comment.
53
- def add_comment(thing, text)
54
- fullname = extract_fullname(thing)
55
- post "/api/comment", api_type: "json", text: text, thing_id: fullname
56
- end
57
-
58
- alias_method :reply, :add_comment
59
-
60
- # Delete a thing.
61
- #
62
- # @param thing [Redd::Object::Submission, Redd::Object::Comment,
63
- # String] A thing to delete.
64
- def delete(thing)
65
- fullname = extract_fullname(thing)
66
- post "/api/del", id: fullname
67
- end
68
-
69
- # Edit a thing.
70
- #
71
- # @param thing [Redd::Object::Submission, Redd::Object::Comment,
72
- # String] A thing to delete.
73
- # @param text [String] The new text.
74
- def edit(thing, text)
75
- fullname = extract_fullname(thing)
76
- post "/api/editusertext", api_type: "json",
77
- thing_id: fullname,
78
- text: text
79
- end
80
-
81
- # Hide a link from the logged-in user.
82
- #
83
- # @param thing [Redd::Object::Submission, String] A link to hide.
84
- def hide(thing)
85
- fullname = extract_fullname(thing)
86
- post "/api/hide", id: fullname
87
- end
88
-
89
- # Unhide a previously hidden link.
90
- #
91
- # @param thing [Redd::Object::Submission, String] A link to show.
92
- def unhide(thing)
93
- fullname = extract_fullname(thing)
94
- post "/api/unhide", id: fullname
95
- end
96
-
97
- # Mark a link as "NSFW" (Not Suitable For Work)
98
- #
99
- # @param thing [Redd::Object::Submission, String] A link to mark.
100
- def mark_as_nsfw(thing)
101
- fullname = extract_fullname(thing)
102
- post "/api/marknsfw", id: fullname
103
- end
104
-
105
- # Remove the NSFW label from the link.
106
- #
107
- # @param thing [Redd::Object::Submission, String] A link to mark.
108
- def unmark_as_nsfw(thing)
109
- fullname = extract_fullname(thing)
110
- post "/api/unmarknsfw", id: fullname
111
- end
112
-
113
- alias_method :mark_as_safe, :unmark_as_nsfw
114
-
115
- # Report the link or comment to the subreddit moderators.
116
- #
117
- # @param thing [Redd::Object::Submission, Redd::Object::Comment,
118
- # String] A link to report.
119
- def report(thing)
120
- fullname = extract_fullname(thing)
121
- post "/api/report", id: fullname
122
- end
123
-
124
- # Save a link or comment (if gilded) to the user's account.
125
- #
126
- # @param thing [Redd::Object::Submission, Redd::Object::Comment,
127
- # String] A link to save.
128
- # @param category [String] A category to save to (if gilded).
129
- def save(thing, category = nil)
130
- fullname = extract_fullname(thing)
131
- params = {id: fullname}
132
- params << {category: category} if category
133
- post "/api/save", params
134
- end
135
-
136
- # Remove the link or comment from the user's saved links.
137
- #
138
- # @param thing [Redd::Object::Submission, Redd::Object::Comment,
139
- # String] A link to unsave.
140
- def unsave(thing)
141
- fullname = extract_fullname(thing)
142
- post "/api/unsave", id: fullname
143
- end
144
-
145
- # Upvote the thing.
146
- #
147
- # @param thing [Redd::Object::Submission, Redd::Object::Comment,
148
- # String] A link or comment to upvote.
149
- # @see #vote
150
- def upvote(thing)
151
- vote(thing, 1)
152
- end
153
-
154
- # Downvote the thing.
155
- #
156
- # @param thing [Redd::Object::Submission, Redd::Object::Comment,
157
- # String] A link or comment to downvote.
158
- # @see #vote
159
- def downvote(thing)
160
- vote(thing, -1)
161
- end
162
-
163
- # Clear the user's vote on the thing.
164
- #
165
- # @param thing [Redd::Object::Submission, Redd::Object::Comment,
166
- # String] A link or comment to remove the vote on.
167
- # @see #vote
168
- def unvote(thing)
169
- vote(thing, 0)
170
- end
171
-
172
- alias_method :clear_vote, :unvote
173
-
174
- private
175
-
176
- # Set a vote on the thing.
177
- #
178
- # @param thing [Redd::Object::Submission, Redd::Object::Comment,
179
- # String] A link or comment to set a vote on.
180
- # @note Votes must be cast by humans only! Your script can proxy a
181
- # user's actions, but it cannot decide what to vote.
182
- def vote(thing, direction)
183
- fullname = extract_fullname(thing)
184
- post "/api/vote", id: fullname, dir: direction
185
- end
186
- end
187
- end
188
- end
189
- end
@@ -1,13 +0,0 @@
1
- module Redd
2
- module Client
3
- class Authenticated
4
- # Methods to interact with /r/live threads
5
- module Live
6
- # Low-priority
7
- #
8
- # When was this a thing? Let's just hope this doesn't become popular
9
- # that quickly before I get to it.
10
- end
11
- end
12
- end
13
- end
@@ -1,126 +0,0 @@
1
- module Redd
2
- module Client
3
- class Authenticated
4
- # Methods for moderating subreddits
5
- module Moderation
6
- # Approve a submission.
7
- # @param thing [Redd::Object::Submission] The link to approve.
8
- def approve(thing)
9
- fullname = extract_fullname(thing)
10
- post "/api/approve", id: fullname
11
- end
12
-
13
- # Remove a submission.
14
- # @param thing [Redd::Object::Submission] The link to remove.
15
- def remove(thing)
16
- fullname = extract_fullname(thing)
17
- post "/api/remove", id: fullname
18
- end
19
-
20
- # Distinguish a link or comment with a sigil to show that it has
21
- # been created by a moderator.
22
- #
23
- # @param thing [Redd::Object::Submission, Redd::Object::Comment]
24
- # The link or comment to distinguish.
25
- # @param how [:yes, :no, :admin, :special] How to distinguish the
26
- # thing.
27
- def distinguish(thing, how = :yes)
28
- fullname = extract_fullname(thing)
29
- post "/api/distinguish", api_type: "json", id: fullname, how: how
30
- end
31
-
32
- # Remove the sigil that shows a thing was created by a moderator.
33
- # @param thing [Redd::Object::Submission, Redd::Object::Comment]
34
- # The link or comment to undistinguish.
35
- def undistinguish(thing)
36
- distinguish(thing, :no)
37
- end
38
-
39
- # Accept a moderator invite from a subreddit.
40
- # @param subreddit [Redd::Object::Subreddit] The subreddit to accept
41
- # the invitation from.
42
- def accept_moderator_invite(subreddit)
43
- name = extract_attribute(subreddit, :display_name)
44
- post "/r/#{name}/api/accept_moderator_invite", api_type: "json"
45
- end
46
-
47
- # Stop being a contributor of the subreddit.
48
- # @param subreddit [Redd::Object::Subreddit] The subreddit to stop
49
- # being a contributor of.
50
- def leave_contributor_status(subreddit)
51
- fullname = extract_fullname(subreddit)
52
- post "/api/leavecontributor", id: fullname
53
- end
54
-
55
- # Stop being a moderator of the subreddit.
56
- # @param subreddit [Redd::Object::Subreddit] The subreddit to stop
57
- # being a moderator of.
58
- def leave_moderator_status(subreddit)
59
- fullname = extract_fullname(subreddit)
60
- post "/api/leavemoderator", id: fullname
61
- end
62
-
63
- # Stop getting any moderator-related reports on the thing.
64
- # @param thing [Redd::Object::Submission, Redd::Object::Comment]
65
- # The thing to stop getting reports on.
66
- def ignore_reports(thing)
67
- fullname = extract_fullname(thing)
68
- post "/api/ignore_reports", id: fullname
69
- end
70
-
71
- # Start getting moderator-related reports on the thing again.
72
- # @param thing [Redd::Object::Submission, Redd::Object::Comment]
73
- # The thing to start getting reports on.
74
- def unignore_reports(thing)
75
- fullname = extract_fullname(thing)
76
- post "/api/unignore_reports", id: fullname
77
- end
78
-
79
- # @!method get_reports
80
- # @!method get_spam
81
- # @!method get_modqueue
82
- # @!method get_unmoderated
83
- #
84
- # Get the appropriate listing.
85
- # @param subreddit [Redd::Object::Subreddit] The subreddit to query.
86
- # @param params [Hash] A list of params to send with the request.
87
- #
88
- # @see #get_submissions
89
- %w(reports spam modqueue unmoderated).each do |sort|
90
- define_method :"get_#{sort}" do |subreddit = nil, params = {}|
91
- get_submissions(sort, subreddit, params)
92
- end
93
- end
94
-
95
- private
96
-
97
- # Get a listing to moderator-related subreddits.
98
- #
99
- # @param type [:reports, :spam, :modqueue, :unmoderated] How the
100
- # results are sorted.
101
- # @param subreddit [Redd::Object::Subreddit, String] The subreddit to
102
- # query.
103
- # @param params [Hash] A list of params to send with the request.
104
- # @option params [String] :after Return results after the given
105
- # fullname.
106
- # @option params [String] :before Return results before the given
107
- # fullname.
108
- # @option params [Integer] :count (0) The number of items already seen
109
- # in the listing.
110
- # @option params [1..100] :limit (25) The maximum number of things to
111
- # return.
112
- # @option params :location No idea what this does.
113
- # @option params [:links, :comments] :only The type of things to show.
114
- # @return [Redd::Object::Listing] A listing of submissions or comments.
115
- #
116
- def get_submissions(type, subreddit = nil, params = {})
117
- subreddit_name = extract_attribute(subreddit, :display_name)
118
- path = "/about/#{type}.json"
119
- path = path.prepend("/r/#{subreddit_name}") if subreddit_name
120
-
121
- object_from_response :get, path, params
122
- end
123
- end
124
- end
125
- end
126
- end