redd 0.6.5 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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