redd 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{LICENSE.txt → LICENSE.md} +0 -0
- data/README.md +99 -1
- data/Rakefile +1 -1
- data/{lib/redd/RedditKit.LICENSE.md → RedditKit.LICENSE.md} +1 -1
- data/TODO.md +45 -0
- data/lib/redd/base.rb +22 -5
- data/lib/redd/client/authenticated.rb +4 -4
- data/lib/redd/client/authenticated/account.rb +8 -3
- data/lib/redd/client/authenticated/apps.rb +1 -1
- data/lib/redd/client/authenticated/flair.rb +1 -1
- data/lib/redd/client/authenticated/gold.rb +1 -1
- data/lib/redd/client/authenticated/links_comments.rb +131 -2
- data/lib/redd/client/authenticated/live.rb +3 -3
- data/lib/redd/client/authenticated/moderation.rb +2 -2
- data/lib/redd/client/authenticated/multis.rb +2 -2
- data/lib/redd/client/authenticated/private_messages.rb +1 -1
- data/lib/redd/client/authenticated/subreddits.rb +31 -2
- data/lib/redd/client/authenticated/users.rb +2 -2
- data/lib/redd/client/authenticated/wiki.rb +2 -2
- data/lib/redd/client/unauthenticated.rb +10 -9
- data/lib/redd/client/unauthenticated/links_comments.rb +14 -0
- data/lib/redd/client/unauthenticated/live.rb +0 -0
- data/lib/redd/client/unauthenticated/subreddits.rb +16 -2
- data/lib/redd/client/unauthenticated/utilities.rb +23 -7
- data/lib/redd/client/unauthenticated/wiki.rb +2 -2
- data/lib/redd/object/comment.rb +39 -24
- data/lib/redd/object/listing.rb +9 -4
- data/lib/redd/object/private_message.rb +31 -0
- data/lib/redd/object/submission.rb +47 -65
- data/lib/redd/object/subreddit.rb +61 -0
- data/lib/redd/object/user.rb +30 -0
- data/lib/redd/rate_limit.rb +5 -4
- data/lib/redd/version.rb +1 -1
- data/test.rb +6 -0
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 546ebcdeb092101a90012a2f2a3d088cdae13259
|
4
|
+
data.tar.gz: c0a9b544cd6e0786cf99d0d1fea4336929068ea6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 213c006802d87c57bcdd4236f793c7def0eeadb47d5991e3f7d2894dba3824373b9c7c6fe5ba817a65a9e0de54b12b2047c5a0200bc1487cfc11ef13791f9b34
|
7
|
+
data.tar.gz: a6ca604d6a3c55a9dd1dec45edc9537b5a2b5f153447c8d6ce05b49d721f4e12c6204af765cfc8c6d96f4848559757b8a21e38ea7361aef8f5ab5c14831b2ac1
|
data/{LICENSE.txt → LICENSE.md}
RENAMED
File without changes
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
<p align="center">
|
2
2
|
<img src="github/redd.png?raw=true" alt="redd"><br>
|
3
|
+
<a href="http://badge.fury.io/rb/redd"><img src="https://badge.fury.io/rb/redd.svg" alt="Gem Version" height="18"></a>
|
4
|
+
<a href="https://gemnasium.com/avidw/redd"><img src="https://gemnasium.com/avidw/redd.svg" alt="Dependency Status"></a>
|
3
5
|
</p>
|
4
6
|
|
5
7
|
**redd** is an API wrapper for [reddit](http://reddit.com/dev/api) written in ruby that focuses on being *simple and extensible*.
|
@@ -7,4 +9,100 @@
|
|
7
9
|
|
8
10
|
---
|
9
11
|
|
10
|
-
|
12
|
+
<p align="center">
|
13
|
+
<a href="#getting-started">Getting Started</a> |
|
14
|
+
<a href="#extending-redd">Extending Redd</a> |
|
15
|
+
<a href="#conventions">Conventions</a> |
|
16
|
+
<a href="#supported-rubies">Supported Rubies</a> |
|
17
|
+
<a href="#copyright">Copyright</a>
|
18
|
+
</p>
|
19
|
+
|
20
|
+
---
|
21
|
+
|
22
|
+
## Getting Started
|
23
|
+
TODO: Elaborate.
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
require "redd"
|
27
|
+
|
28
|
+
client = Redd.client
|
29
|
+
redditdev = client.subreddit("redditdev")
|
30
|
+
|
31
|
+
latest_post = redditdev.get_new.first
|
32
|
+
puts latest_post.title
|
33
|
+
```
|
34
|
+
|
35
|
+
## Extending Redd
|
36
|
+
Extending any ruby library, including redd is incredibly easy. Let's try this out by adding a gilding extension. Reddit provides an api to be able to gild posts and comments, given that you have "creddits".
|
37
|
+
|
38
|
+
1. Let's start by creating a module for the methods to live in.
|
39
|
+
```ruby
|
40
|
+
module MyGildingExtension
|
41
|
+
end
|
42
|
+
```
|
43
|
+
|
44
|
+
2. Let's add a method to gild a thing, using the [reddit api](http://www.reddit.com/dev/api#section_gold) and following the conventions.
|
45
|
+
```ruby
|
46
|
+
module MyGildingExtension
|
47
|
+
def gild(thing)
|
48
|
+
# Redd::Client::Unauthenticated::Utilities has some pretty helpful
|
49
|
+
# methods.
|
50
|
+
fullname = extract_fullname(thing)
|
51
|
+
|
52
|
+
meth = :post
|
53
|
+
path = "/api/v1/gold/gild/#{fullname}"
|
54
|
+
|
55
|
+
# We're using send instead of object_from_response, because we don't
|
56
|
+
# expect any object from the response.
|
57
|
+
send(meth, path)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
```
|
61
|
+
|
62
|
+
3. Let's add the method to the Authenticated client. You can also add it to the Unauthenticated client, but since unauthenticated users can't gild, there's no point.
|
63
|
+
```ruby
|
64
|
+
Redd::Client::Authenticated.include(MyGildingExtension)
|
65
|
+
```
|
66
|
+
|
67
|
+
4. You might also want to add the method to objects to make it easier to access.
|
68
|
+
```ruby
|
69
|
+
module Gildable
|
70
|
+
def gild
|
71
|
+
# Every Redd::Object is instantiated with the client that created
|
72
|
+
# it, so the method can be called on the client easily, similar to
|
73
|
+
# praw in python.
|
74
|
+
client.gild(self)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
Redd::Object::Submission.include(Gildable)
|
79
|
+
Redd::Object::Comment.include(Gildable)
|
80
|
+
```
|
81
|
+
|
82
|
+
## Conventions
|
83
|
+
### Method Names
|
84
|
+
- A method that returns a Redd::Object directly is called that in lowercase. For example, a method that returns a single `Redd::Object::Subreddit` is called `subreddit`
|
85
|
+
- Any method that return a listing is in the format `get_[thing]s`. For example, a method that returns a listing of subreddits is named `get_subreddits`.
|
86
|
+
- An **internal** method that edits an existing object is **usually** named `edit_[thing]`. Some exeptions to this rule are `vote` that edit a user's vote.
|
87
|
+
- Any method that returns something specific to the user must have "my" in the middle. For example, a method that returns a users subscribed subreddits is named `get_my_subscriptions`.
|
88
|
+
|
89
|
+
### Methods
|
90
|
+
- Most methods that use an http request should usually follow this convention. I haven't had time to check the methods to see if they follow this, but this should be the case
|
91
|
+
```ruby
|
92
|
+
def subreddit(thing, options = {})
|
93
|
+
fullname = extract_fullname(thing)
|
94
|
+
|
95
|
+
meth = :get
|
96
|
+
path = "/r/ruby/about.json"
|
97
|
+
params = options << {additional: "options"}
|
98
|
+
|
99
|
+
object_from_response(meth, path, params)
|
100
|
+
end
|
101
|
+
```
|
102
|
+
|
103
|
+
## Supported Rubies
|
104
|
+
TODO: Travis CI
|
105
|
+
|
106
|
+
## Copyright
|
107
|
+
Copyright (c) [Avinash Dwarapu](http://github.com/avidw) under the MIT License. See LICENSE.md for more details.
|
108
|
+
Some code has been used from [RedditKit.rb](http://github.com/samsymons/RedditKit.rb). See RedditKit.LICENSE.md for more details.
|
data/Rakefile
CHANGED
data/TODO.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
## TODO.md
|
2
|
+
|
3
|
+
#### Redd::Client
|
4
|
+
- [ ] Unauthenticated
|
5
|
+
- [ ] Account
|
6
|
+
- [ ] Links & Comments
|
7
|
+
- [ ] Listing
|
8
|
+
- [ ] Live
|
9
|
+
- [ ] Subreddit
|
10
|
+
- [ ] Utilities
|
11
|
+
- [ ] Wiki
|
12
|
+
- [ ] Authenticated
|
13
|
+
- [ ] Account
|
14
|
+
- [ ] Apps
|
15
|
+
- [ ] Flair
|
16
|
+
- [ ] Gold
|
17
|
+
- [ ] Links & Comments
|
18
|
+
- [ ] Live
|
19
|
+
- [ ] Moderation
|
20
|
+
- [ ] Multis
|
21
|
+
- [ ] Private Messages
|
22
|
+
- [ ] Subreddits
|
23
|
+
- [ ] Users
|
24
|
+
- [ ] Wiki
|
25
|
+
- [ ] OAuth2
|
26
|
+
|
27
|
+
#### Redd::Thing
|
28
|
+
- [ ] Creatable
|
29
|
+
- [ ] Editable
|
30
|
+
- [ ] Hideable
|
31
|
+
- [ ] Inboxable
|
32
|
+
- [ ] Messageable
|
33
|
+
- [ ] Moderatable
|
34
|
+
- [ ] Reportable
|
35
|
+
- [ ] Saveable
|
36
|
+
- [ ] Voteable
|
37
|
+
|
38
|
+
#### Redd::Object
|
39
|
+
- [ ] `listing` **Listing**
|
40
|
+
- [ ] `more` **MoreComments**
|
41
|
+
- [ ] `t1_` **Comment**
|
42
|
+
- [ ] `t2_` **User**
|
43
|
+
- [ ] `t3_` **Submission**
|
44
|
+
- [ ] `t4_` **PrivateMessage**
|
45
|
+
- [ ] `t5_` **Subreddit**
|
data/lib/redd/base.rb
CHANGED
@@ -16,11 +16,16 @@ module Redd
|
|
16
16
|
|
17
17
|
# Define and memoize the method that returns a key from the
|
18
18
|
# attributes hash.
|
19
|
-
# @param [Symbol, String]
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
# @param [Symbol, String] attr The attribute to construct a method out of.
|
20
|
+
def self.attr_reader(attr)
|
21
|
+
define_attribute_method(attr)
|
22
|
+
define_predicate_method(attr)
|
23
|
+
end
|
24
|
+
|
25
|
+
def [](method)
|
26
|
+
send(method.to_sym)
|
27
|
+
rescue NoMethodError
|
28
|
+
nil
|
24
29
|
end
|
25
30
|
|
26
31
|
# @param client The client to use when making requests with this object.
|
@@ -31,5 +36,17 @@ module Redd
|
|
31
36
|
@attributes = attributes[:data]
|
32
37
|
@attributes[:kind] = attributes[:kind]
|
33
38
|
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def self.define_attribute_method(method)
|
43
|
+
define_method(method) { @attributes[method] }
|
44
|
+
memoize method
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.define_predicate_method(method)
|
48
|
+
define_method(:"#{method}?") { !!@attributes[method] }
|
49
|
+
memoize :"#{method}?"
|
50
|
+
end
|
34
51
|
end
|
35
52
|
end
|
@@ -30,19 +30,19 @@ module Redd
|
|
30
30
|
include Redd::Client::Authenticated::Wiki
|
31
31
|
|
32
32
|
# @!attribute [r] username
|
33
|
-
#
|
33
|
+
# @return [String] The username of the logged-in user.
|
34
34
|
attr_reader :username
|
35
35
|
|
36
36
|
# @!attribute [r] cookie
|
37
|
-
#
|
37
|
+
# @return [String] The cookie used to store the current session.
|
38
38
|
attr_reader :cookie
|
39
39
|
|
40
40
|
# @!attribute [r] modhash
|
41
|
-
#
|
41
|
+
# @return [String] The returned modhash used when making requests.
|
42
42
|
attr_reader :modhash
|
43
43
|
|
44
44
|
# @!attribute [rw] auth_endpoint
|
45
|
-
#
|
45
|
+
# @return [String] The site to connect to authenticate with.
|
46
46
|
attr_accessor :auth_endpoint
|
47
47
|
|
48
48
|
# Set up an authenticated connection to reddit.
|
@@ -1,8 +1,137 @@
|
|
1
1
|
module Redd
|
2
2
|
module Client
|
3
|
-
|
3
|
+
class Authenticated
|
4
4
|
module LinksComments
|
5
|
-
|
5
|
+
def add_comment(thing, text, return_element = true)
|
6
|
+
fullname = extract_fullname(thing)
|
7
|
+
|
8
|
+
meth = :post
|
9
|
+
path = "/api/comment"
|
10
|
+
params = {api_type: "json", text: text, thing_id: fullname}
|
11
|
+
|
12
|
+
# TODO: Return the created object.
|
13
|
+
send(meth, path, params)
|
14
|
+
end
|
15
|
+
|
16
|
+
alias_method :reply, :add_comment
|
17
|
+
|
18
|
+
def delete(thing)
|
19
|
+
fullname = extract_fullname(thing)
|
20
|
+
|
21
|
+
meth = :post
|
22
|
+
path = "/api/del"
|
23
|
+
params = {id: fullname}
|
24
|
+
|
25
|
+
send(meth, path, params)
|
26
|
+
end
|
27
|
+
|
28
|
+
def edit(thing, text)
|
29
|
+
fullname = extract_fullname(thing)
|
30
|
+
|
31
|
+
meth = :post
|
32
|
+
path = "/api/editusertext"
|
33
|
+
params = {api_type: "json", text: text, thing_id: fullname}
|
34
|
+
|
35
|
+
# TODO: Return the edited object.
|
36
|
+
send(meth, path, params)
|
37
|
+
end
|
38
|
+
|
39
|
+
def hide(thing)
|
40
|
+
fullname = extract_fullname(thing)
|
41
|
+
|
42
|
+
meth = :post
|
43
|
+
path = "/api/hide"
|
44
|
+
params = {id: fullname}
|
45
|
+
|
46
|
+
send(meth, path, params)
|
47
|
+
end
|
48
|
+
|
49
|
+
def unhide(thing)
|
50
|
+
fullname = extract_fullname(thing)
|
51
|
+
|
52
|
+
meth = :post
|
53
|
+
path = "/api/unhide"
|
54
|
+
params = {id: fullname}
|
55
|
+
|
56
|
+
send(meth, path, params)
|
57
|
+
end
|
58
|
+
|
59
|
+
def mark_as_nsfw(thing)
|
60
|
+
fullname = extract_fullname(thing)
|
61
|
+
|
62
|
+
meth = :post
|
63
|
+
path = "/api/marknsfw"
|
64
|
+
params = {id: fullname}
|
65
|
+
|
66
|
+
send(meth, path, params)
|
67
|
+
end
|
68
|
+
|
69
|
+
def unmark_as_nsfw(thing)
|
70
|
+
fullname = extract_fullname(thing)
|
71
|
+
|
72
|
+
meth = :post
|
73
|
+
path = "/api/unmarknsfw"
|
74
|
+
params = {id: fullname}
|
75
|
+
|
76
|
+
send(meth, path, params)
|
77
|
+
end
|
78
|
+
|
79
|
+
alias_method :mark_as_safe, :unmark_as_nsfw
|
80
|
+
|
81
|
+
def report(thing)
|
82
|
+
fullname = extract_fullname(thing)
|
83
|
+
|
84
|
+
meth = :post
|
85
|
+
path = "/api/report"
|
86
|
+
params = {id: fullname}
|
87
|
+
|
88
|
+
send(meth, path, params)
|
89
|
+
end
|
90
|
+
|
91
|
+
def save(thing, category = nil)
|
92
|
+
fullname = extract_fullname(thing)
|
93
|
+
|
94
|
+
meth = :post
|
95
|
+
path = "/api/save"
|
96
|
+
params = {id: fullname}
|
97
|
+
params << {category: category} if category
|
98
|
+
|
99
|
+
send(meth, path, params)
|
100
|
+
end
|
101
|
+
|
102
|
+
def unsave(thing)
|
103
|
+
fullname = extract_fullname(thing)
|
104
|
+
|
105
|
+
meth = :post
|
106
|
+
path = "/api/unsave"
|
107
|
+
params = {id: fullname}
|
108
|
+
|
109
|
+
send(meth, path, params)
|
110
|
+
end
|
111
|
+
|
112
|
+
def upvote(thing)
|
113
|
+
vote(thing, 1)
|
114
|
+
end
|
115
|
+
|
116
|
+
def downvote(thing)
|
117
|
+
vote(thing, -1)
|
118
|
+
end
|
119
|
+
|
120
|
+
def unvote(thing)
|
121
|
+
vote(thing, 0)
|
122
|
+
end
|
123
|
+
|
124
|
+
private
|
125
|
+
|
126
|
+
def vote(thing, direction)
|
127
|
+
fullname = extract_fullname(thing)
|
128
|
+
|
129
|
+
meth = :post
|
130
|
+
path = "/api/vote"
|
131
|
+
params = {id: fullname, dir: direction}
|
132
|
+
|
133
|
+
send(meth, path, params)
|
134
|
+
end
|
6
135
|
end
|
7
136
|
end
|
8
137
|
end
|
@@ -1,8 +1,37 @@
|
|
1
1
|
module Redd
|
2
2
|
module Client
|
3
|
-
|
3
|
+
class Authenticated
|
4
4
|
module Subreddits
|
5
|
-
|
5
|
+
def subscribe(subreddit)
|
6
|
+
edit_subscription(:sub, subreddit)
|
7
|
+
end
|
8
|
+
|
9
|
+
def unsubscribe(subreddit)
|
10
|
+
edit_subscription(:unsub, subreddit)
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_subreddits(where = :subscriber, params = {})
|
14
|
+
meth = :get
|
15
|
+
path =
|
16
|
+
if [:popular, :new].include?(where)
|
17
|
+
"/subreddits/#{where}.json"
|
18
|
+
elsif [:subscriber, :contributor, :moderator].include?(where)
|
19
|
+
"/subreddits/mine/#{where}.json"
|
20
|
+
end
|
21
|
+
object_from_response(meth, path, params)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def edit_subscription(action, subreddit)
|
27
|
+
fullname = extract_fullname(subreddit)
|
28
|
+
|
29
|
+
meth = :post
|
30
|
+
path = "/api/subscribe"
|
31
|
+
params = {action: action, sr: fullname}
|
32
|
+
|
33
|
+
send(meth, path, params)
|
34
|
+
end
|
6
35
|
end
|
7
36
|
end
|
8
37
|
end
|
@@ -3,17 +3,18 @@ require "redd/version"
|
|
3
3
|
require "redd/rate_limit"
|
4
4
|
require "redd/response/parse_json"
|
5
5
|
require "redd/response/raise_error"
|
6
|
-
require "redd/client/unauthenticated/account"
|
7
|
-
require "redd/client/unauthenticated/links_comments"
|
8
|
-
require "redd/client/unauthenticated/listing"
|
9
|
-
require "redd/client/unauthenticated/subreddits"
|
10
|
-
require "redd/client/unauthenticated/utilities"
|
11
|
-
require "redd/client/unauthenticated/wiki"
|
12
6
|
|
13
7
|
module Redd
|
14
8
|
module Client
|
15
9
|
# The Client used to connect without needing login credentials.
|
16
10
|
class Unauthenticated
|
11
|
+
require "redd/client/unauthenticated/account"
|
12
|
+
require "redd/client/unauthenticated/links_comments"
|
13
|
+
require "redd/client/unauthenticated/listing"
|
14
|
+
require "redd/client/unauthenticated/subreddits"
|
15
|
+
require "redd/client/unauthenticated/utilities"
|
16
|
+
require "redd/client/unauthenticated/wiki"
|
17
|
+
|
17
18
|
include Redd::Client::Unauthenticated::Account
|
18
19
|
include Redd::Client::Unauthenticated::LinksComments
|
19
20
|
include Redd::Client::Unauthenticated::Listing
|
@@ -22,15 +23,15 @@ module Redd
|
|
22
23
|
include Redd::Client::Unauthenticated::Wiki
|
23
24
|
|
24
25
|
# @!attribute [r] api_endpoint
|
25
|
-
#
|
26
|
+
# @return [String] The site to connect to.
|
26
27
|
attr_accessor :api_endpoint
|
27
28
|
|
28
29
|
# @!attribute [r] user_agent
|
29
|
-
#
|
30
|
+
# @return [String] The user-agent used to communicate with reddit.
|
30
31
|
attr_accessor :user_agent
|
31
32
|
|
32
33
|
# @!attribute [r] rate_limit
|
33
|
-
#
|
34
|
+
# @return [#after_limit] The handler that takes care of rate limiting.
|
34
35
|
attr_accessor :rate_limit
|
35
36
|
|
36
37
|
# Set up an unauthenticated connection to reddit.
|
@@ -9,6 +9,20 @@ module Redd
|
|
9
9
|
path = "/api/info.json"
|
10
10
|
object_from_response(meth, path, params)
|
11
11
|
end
|
12
|
+
|
13
|
+
def get_comments(submission)
|
14
|
+
id = extract_id(submission)
|
15
|
+
|
16
|
+
meth = :get
|
17
|
+
path = "/comments/#{id}.json"
|
18
|
+
comments_from_response(meth, path)
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_replies(comment)
|
22
|
+
replies = comment.attributes[:replies]
|
23
|
+
return [] unless replies.is_a?(Hash) and replies.has_key?(:kind)
|
24
|
+
object_from_body(replies)
|
25
|
+
end
|
12
26
|
end
|
13
27
|
end
|
14
28
|
end
|
File without changes
|
@@ -2,11 +2,25 @@ module Redd
|
|
2
2
|
module Client
|
3
3
|
class Unauthenticated
|
4
4
|
module Subreddits
|
5
|
-
def subreddit(
|
5
|
+
def subreddit(title)
|
6
6
|
meth = :get
|
7
|
-
path = "/r/#{
|
7
|
+
path = "/r/#{title}/about.json"
|
8
8
|
object_from_response(meth, path)
|
9
9
|
end
|
10
|
+
|
11
|
+
def get_subreddits(where = :popular, params = {})
|
12
|
+
meth = :get
|
13
|
+
path = "/subreddits/#{where}.json"
|
14
|
+
object_from_response(meth, path, params)
|
15
|
+
end
|
16
|
+
|
17
|
+
def search_subreddits(query, params = {})
|
18
|
+
meth = :get
|
19
|
+
path = "/subreddits/search.json"
|
20
|
+
params << {q: query}
|
21
|
+
|
22
|
+
object_from_response(meth, path, params)
|
23
|
+
end
|
10
24
|
end
|
11
25
|
end
|
12
26
|
end
|
@@ -1,8 +1,10 @@
|
|
1
1
|
require "redd/thing"
|
2
2
|
require "redd/object/listing"
|
3
3
|
require "redd/object/comment"
|
4
|
+
require "redd/object/private_message"
|
4
5
|
require "redd/object/submission"
|
5
6
|
require "redd/object/subreddit"
|
7
|
+
require "redd/object/user"
|
6
8
|
|
7
9
|
module Redd
|
8
10
|
module Client
|
@@ -10,12 +12,16 @@ module Redd
|
|
10
12
|
module Utilities
|
11
13
|
private
|
12
14
|
|
15
|
+
def extract_attribute(object, attribute)
|
16
|
+
object.send(attribute) if object.respond_to?(attribute)
|
17
|
+
end
|
18
|
+
|
13
19
|
def extract_fullname(object)
|
14
20
|
object.is_a?(String) ? object : extract_attribute(object, :fullname)
|
15
21
|
end
|
16
22
|
|
17
|
-
def
|
18
|
-
object.
|
23
|
+
def extract_id(object)
|
24
|
+
object.is_a?(String) ? object : extract_attribute(object, :id)
|
19
25
|
end
|
20
26
|
|
21
27
|
# @todo "more"
|
@@ -25,8 +31,12 @@ module Redd
|
|
25
31
|
Redd::Object::Listing
|
26
32
|
when "t1"
|
27
33
|
Redd::Object::Comment
|
34
|
+
when "t2"
|
35
|
+
Redd::Object::User
|
28
36
|
when "t3"
|
29
37
|
Redd::Object::Submission
|
38
|
+
when "t4"
|
39
|
+
Redd::Object::PrivateMessage
|
30
40
|
when "t5"
|
31
41
|
Redd::Object::Subreddit
|
32
42
|
else
|
@@ -36,24 +46,30 @@ module Redd
|
|
36
46
|
|
37
47
|
def objects_from_listing(thing)
|
38
48
|
thing[:data][:children].map do |child|
|
39
|
-
|
49
|
+
object_from_body(child)
|
40
50
|
end
|
41
51
|
end
|
42
52
|
|
43
|
-
def
|
53
|
+
def object_from_body(body)
|
54
|
+
return nil unless body.is_a?(Hash) && body.has_key?(:kind)
|
44
55
|
object = object_from_kind(body[:kind])
|
45
56
|
|
46
57
|
if object == Redd::Object::Listing
|
47
|
-
|
48
|
-
object.new(
|
58
|
+
body[:data][:children] = objects_from_listing(body)
|
59
|
+
object.new(body)
|
49
60
|
else
|
50
61
|
object.new(self, body)
|
51
62
|
end
|
52
63
|
end
|
53
64
|
|
65
|
+
def comments_from_response(*args)
|
66
|
+
body = request(*args).body[1]
|
67
|
+
object_from_body(body)
|
68
|
+
end
|
69
|
+
|
54
70
|
def object_from_response(*args)
|
55
71
|
body = request(*args).body
|
56
|
-
|
72
|
+
object_from_body(body)
|
57
73
|
end
|
58
74
|
end
|
59
75
|
end
|
data/lib/redd/object/comment.rb
CHANGED
@@ -4,37 +4,52 @@ module Redd
|
|
4
4
|
module Object
|
5
5
|
# A comment made on links.
|
6
6
|
class Comment < Redd::Thing
|
7
|
-
|
8
|
-
|
9
|
-
# @todo Convert to a Subreddit object?
|
10
|
-
attr_reader :subreddit
|
11
|
-
|
12
|
-
# @!attribute [r] parent_id
|
13
|
-
# @return [String] The id of the parent comment.
|
14
|
-
# @todo parent - get the parent comment directly.
|
15
|
-
attr_reader :parent_id
|
7
|
+
attr_reader :created_utc
|
8
|
+
attr_reader :author
|
16
9
|
|
17
|
-
|
18
|
-
|
19
|
-
attr_reader :
|
10
|
+
attr_reader :edited
|
11
|
+
attr_reader :saved
|
12
|
+
attr_reader :gilded
|
20
13
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
attr_reader :
|
14
|
+
attr_reader :ups
|
15
|
+
attr_reader :downs
|
16
|
+
attr_reader :score
|
17
|
+
attr_reader :likes
|
18
|
+
attr_reader :controversiality
|
26
19
|
|
27
|
-
|
28
|
-
|
29
|
-
attr_reader :
|
20
|
+
attr_reader :banned_by
|
21
|
+
attr_reader :approved_by
|
22
|
+
attr_reader :score_hidden
|
23
|
+
attr_reader :distinguished
|
24
|
+
attr_reader :num_reports
|
30
25
|
|
31
|
-
|
32
|
-
|
26
|
+
attr_reader :parent_id
|
27
|
+
attr_reader :link_id
|
28
|
+
attr_reader :body
|
29
|
+
attr_reader :body_html
|
30
|
+
attr_reader :author_flair_text
|
33
31
|
attr_reader :author_flair_css_class
|
34
32
|
|
35
|
-
|
33
|
+
alias_method :reports_count, :num_reports
|
34
|
+
|
35
|
+
def replies
|
36
|
+
@replies ||= client.get_replies(self)
|
37
|
+
end
|
38
|
+
|
39
|
+
def subreddit
|
40
|
+
@subreddit ||= client.subreddit(@attributes[:subreddit])
|
41
|
+
end
|
42
|
+
|
43
|
+
def created
|
44
|
+
@created ||= Time.at(@attributes[:created])
|
45
|
+
end
|
46
|
+
|
36
47
|
def root?
|
37
|
-
!parent_id || parent_id ==
|
48
|
+
!parent_id || parent_id == link_id
|
49
|
+
end
|
50
|
+
|
51
|
+
def gilded?
|
52
|
+
gilded > 0
|
38
53
|
end
|
39
54
|
end
|
40
55
|
end
|
data/lib/redd/object/listing.rb
CHANGED
@@ -14,10 +14,15 @@ module Redd
|
|
14
14
|
# @return [Array] A list of things in the listing.
|
15
15
|
attr_reader :things
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
attr_reader :kind
|
18
|
+
attr_reader :after
|
19
|
+
attr_reader :before
|
20
|
+
|
21
|
+
def initialize(listing)
|
22
|
+
@kind = listing[:kind]
|
23
|
+
@things = listing[:data][:children]
|
24
|
+
@after = listing[:data][:after]
|
25
|
+
@before = listing[:data][:before]
|
21
26
|
end
|
22
27
|
end
|
23
28
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "redd/thing"
|
2
|
+
|
3
|
+
module Redd
|
4
|
+
module Object
|
5
|
+
class PrivateMessage < Redd::Thing
|
6
|
+
attr_reader :created_utc
|
7
|
+
attr_reader :body
|
8
|
+
attr_reader :body_html
|
9
|
+
attr_reader :subreddit
|
10
|
+
attr_reader :parent_id
|
11
|
+
attr_reader :distinguished
|
12
|
+
attr_reader :was_comment
|
13
|
+
attr_reader :first_message_name
|
14
|
+
attr_reader :context
|
15
|
+
|
16
|
+
attr_reader :dest
|
17
|
+
attr_reader :author
|
18
|
+
|
19
|
+
alias_method :from, :author
|
20
|
+
alias_method :to, :author
|
21
|
+
|
22
|
+
def created
|
23
|
+
@created ||= Time.at(@attributes[:created])
|
24
|
+
end
|
25
|
+
|
26
|
+
def replies
|
27
|
+
@replies ||= client.objects_from_listing(@attributes[:replies])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -4,91 +4,73 @@ module Redd
|
|
4
4
|
module Object
|
5
5
|
# A submission made in a subreddit.
|
6
6
|
class Submission < Redd::Thing
|
7
|
-
|
8
|
-
|
9
|
-
attr_reader :title
|
10
|
-
|
11
|
-
# @!attribute [r] url
|
12
|
-
# @return [String] The url the submission links to.
|
13
|
-
attr_reader :url
|
14
|
-
|
15
|
-
# @!attribute [r] num_comments
|
16
|
-
# @return [Integer] The number of comments the submission has.
|
17
|
-
attr_reader :num_comments
|
18
|
-
|
19
|
-
# @!attribute [r] domain
|
20
|
-
# @return [String] The domain the url belongs to.
|
21
|
-
attr_reader :domain
|
22
|
-
|
23
|
-
# @!attribute [r] subreddit
|
24
|
-
# @return [String] The name of the subreddit this comment belongs to.
|
25
|
-
# @todo Convert to a Subreddit object?
|
26
|
-
attr_reader :subreddit
|
27
|
-
|
28
|
-
# @!attribute [r] is_self?
|
29
|
-
# @return [Boolean] Whether the submission is a self submission.
|
30
|
-
attr_reader :self?, :is_self
|
7
|
+
attr_reader :created_utc
|
8
|
+
attr_reader :author
|
31
9
|
|
32
|
-
|
33
|
-
|
34
|
-
attr_reader :
|
35
|
-
|
10
|
+
attr_reader :edited
|
11
|
+
attr_reader :saved
|
12
|
+
attr_reader :gilded
|
13
|
+
attr_reader :clicked
|
14
|
+
attr_reader :visited
|
15
|
+
attr_reader :stickied
|
16
|
+
attr_reader :hidden
|
36
17
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
attr_reader :
|
18
|
+
attr_reader :ups
|
19
|
+
attr_reader :downs
|
20
|
+
attr_reader :score
|
21
|
+
attr_reader :likes
|
41
22
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
# <'s and >'s are converted to <'s and >'s.
|
47
|
-
attr_reader :selftext_html
|
23
|
+
attr_reader :banned_by
|
24
|
+
attr_reader :approved_by
|
25
|
+
attr_reader :distinguished
|
26
|
+
attr_reader :num_reports
|
48
27
|
|
49
|
-
# @!attribute [r] link_flair_text
|
50
|
-
# @return [String] The submission's flair.
|
51
28
|
attr_reader :link_flair_text
|
52
|
-
|
53
|
-
# @!attribute [r] link_flair_css_class
|
54
|
-
# @return [String] The CSS class of the submission's flair.
|
55
29
|
attr_reader :link_flair_css_class
|
56
|
-
|
57
|
-
# @!attribute [r] author_flair_text
|
58
|
-
# @return [String] The user's flair.
|
30
|
+
attr_reader :author_flair_css_class
|
59
31
|
attr_reader :author_flair_text
|
60
32
|
|
61
|
-
|
62
|
-
|
63
|
-
attr_reader :
|
33
|
+
attr_reader :domain
|
34
|
+
attr_reader :media
|
35
|
+
attr_reader :media_embed
|
36
|
+
attr_reader :selftext
|
37
|
+
attr_reader :selftext_html
|
38
|
+
attr_reader :secure_media
|
39
|
+
attr_reader :secure_media_embed
|
40
|
+
attr_reader :over_18
|
41
|
+
attr_reader :thumbnail
|
42
|
+
attr_reader :is_self
|
43
|
+
attr_reader :url
|
44
|
+
attr_reader :title
|
45
|
+
attr_reader :num_comments
|
64
46
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
attr_reader :clicked
|
47
|
+
alias_method :nsfw?, :over_18
|
48
|
+
alias_method :self?, :is_self
|
49
|
+
alias_method :comments_count, :num_comments
|
69
50
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
attr_reader :visited
|
51
|
+
def subreddit
|
52
|
+
@subreddit ||= client.subreddit(@attributes[:subreddit])
|
53
|
+
end
|
74
54
|
|
75
|
-
|
76
|
-
|
77
|
-
|
55
|
+
def comments
|
56
|
+
@comments ||= client.get_comments(id)
|
57
|
+
end
|
78
58
|
|
79
|
-
|
80
|
-
|
81
|
-
|
59
|
+
def created
|
60
|
+
@created ||= Time.at(@attributes[:created])
|
61
|
+
end
|
82
62
|
|
83
|
-
# @return [String] The full url to the post on reddit.com.
|
84
63
|
def permalink
|
85
64
|
"http://www.reddit.com" + attributes[:permalink]
|
86
65
|
end
|
87
66
|
|
88
|
-
# @return [String] The short url on redd.it.
|
89
67
|
def short_url
|
90
68
|
"http://redd.it/" + id
|
91
69
|
end
|
70
|
+
|
71
|
+
def gilded?
|
72
|
+
gilded > 0
|
73
|
+
end
|
92
74
|
end
|
93
75
|
end
|
94
76
|
end
|
@@ -5,6 +5,67 @@ module Redd
|
|
5
5
|
# A comment made on links.
|
6
6
|
# @note This model can sure benefit from some lazy-loading...
|
7
7
|
class Subreddit < Redd::Thing
|
8
|
+
attr_reader :display_name
|
9
|
+
attr_reader :title
|
10
|
+
|
11
|
+
attr_reader :description
|
12
|
+
attr_reader :description_html
|
13
|
+
|
14
|
+
attr_reader :header_img
|
15
|
+
attr_reader :header_title
|
16
|
+
attr_reader :header_size
|
17
|
+
|
18
|
+
attr_reader :user_is_banned
|
19
|
+
attr_reader :user_is_contributor
|
20
|
+
attr_reader :user_is_moderator
|
21
|
+
attr_reader :user_is_subscriber
|
22
|
+
|
23
|
+
attr_reader :submit_text
|
24
|
+
attr_reader :submit_text_html
|
25
|
+
attr_reader :submit_link_label
|
26
|
+
attr_reader :submit_text_label
|
27
|
+
|
28
|
+
attr_reader :over18
|
29
|
+
attr_reader :accounts_active
|
30
|
+
attr_reader :public_traffic
|
31
|
+
attr_reader :subscribers
|
32
|
+
attr_reader :created_utc
|
33
|
+
attr_reader :comment_score_hide_mins
|
34
|
+
attr_reader :subreddit_type
|
35
|
+
attr_reader :submission_type
|
36
|
+
|
37
|
+
alias_method :header_image, :header_img
|
38
|
+
alias_method :nsfw?, :over18
|
39
|
+
alias_method :users_online, :accounts_active
|
40
|
+
alias_method :type, :subreddit_type
|
41
|
+
|
42
|
+
def created
|
43
|
+
@created ||= Time.at(@attributes[:created])
|
44
|
+
end
|
45
|
+
|
46
|
+
def url
|
47
|
+
"http://reddit.com" + @attributes[:url]
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_hot(*args)
|
51
|
+
client.get_hot(display_name, *args)
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_new(*args)
|
55
|
+
client.get_new(display_name, *args)
|
56
|
+
end
|
57
|
+
|
58
|
+
def get_random(*args)
|
59
|
+
client.get_random(display_name, *args)
|
60
|
+
end
|
61
|
+
|
62
|
+
def get_top(*args)
|
63
|
+
client.get_top(display_name, *args)
|
64
|
+
end
|
65
|
+
|
66
|
+
def get_controversial(*args)
|
67
|
+
client.get_controversial(display_name, *args)
|
68
|
+
end
|
8
69
|
end
|
9
70
|
end
|
10
71
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "redd/thing"
|
2
|
+
|
3
|
+
module Redd
|
4
|
+
module Object
|
5
|
+
class User < Redd::Thing
|
6
|
+
attr_reader :created_utc
|
7
|
+
attr_reader :name
|
8
|
+
attr_reader :is_friend
|
9
|
+
attr_reader :link_karma
|
10
|
+
attr_reader :comment_karma
|
11
|
+
attr_reader :gold_creddits
|
12
|
+
attr_reader :gold_expiration
|
13
|
+
attr_reader :is_gold
|
14
|
+
attr_reader :is_mod
|
15
|
+
attr_reader :has_verified_email
|
16
|
+
attr_reader :has_mod_mail
|
17
|
+
attr_reader :has_mail
|
18
|
+
|
19
|
+
alias_method :has_gold, :is_gold
|
20
|
+
|
21
|
+
def created
|
22
|
+
@created ||= Time.at(@attributes[:created])
|
23
|
+
end
|
24
|
+
|
25
|
+
def fullname
|
26
|
+
@fullname ||= "#{kind}_#{id}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/redd/rate_limit.rb
CHANGED
@@ -26,20 +26,21 @@ module Redd
|
|
26
26
|
# @return [String] The time when the last request took place.
|
27
27
|
attr_reader :last_request_time
|
28
28
|
|
29
|
-
|
29
|
+
# @param [Float, Integer] gap The minimum time between each request.
|
30
|
+
def initialize(gap = 2)
|
30
31
|
# Some time ages ago, because we never made a request.
|
31
32
|
@last_request_time = Time.at(0)
|
33
|
+
@gap = gap
|
32
34
|
end
|
33
35
|
|
34
36
|
# Sleep until 2 seconds have passed since the last request and perform the
|
35
37
|
# given request.
|
36
38
|
#
|
37
|
-
# @param [Float, Integer] gap The minimum time between each request.
|
38
39
|
# @yield A block.
|
39
40
|
# @return The return value of the block.
|
40
|
-
def after_limit
|
41
|
+
def after_limit
|
41
42
|
seconds_passed = Time.now - @last_request_time
|
42
|
-
wait_time = gap - seconds_passed
|
43
|
+
wait_time = @gap - seconds_passed
|
43
44
|
sleep(wait_time) if wait_time > 0
|
44
45
|
@last_request_time = Time.now
|
45
46
|
yield
|
data/lib/redd/version.rb
CHANGED
data/test.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Avinash Dwarapu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -163,12 +163,13 @@ files:
|
|
163
163
|
- .travis.yml
|
164
164
|
- .yardopts
|
165
165
|
- Gemfile
|
166
|
-
- LICENSE.
|
166
|
+
- LICENSE.md
|
167
167
|
- README.md
|
168
168
|
- Rakefile
|
169
|
+
- RedditKit.LICENSE.md
|
170
|
+
- TODO.md
|
169
171
|
- github/redd.png
|
170
172
|
- lib/redd.rb
|
171
|
-
- lib/redd/RedditKit.LICENSE.md
|
172
173
|
- lib/redd/base.rb
|
173
174
|
- lib/redd/client/authenticated.rb
|
174
175
|
- lib/redd/client/authenticated/account.rb
|
@@ -188,14 +189,17 @@ files:
|
|
188
189
|
- lib/redd/client/unauthenticated/account.rb
|
189
190
|
- lib/redd/client/unauthenticated/links_comments.rb
|
190
191
|
- lib/redd/client/unauthenticated/listing.rb
|
192
|
+
- lib/redd/client/unauthenticated/live.rb
|
191
193
|
- lib/redd/client/unauthenticated/subreddits.rb
|
192
194
|
- lib/redd/client/unauthenticated/utilities.rb
|
193
195
|
- lib/redd/client/unauthenticated/wiki.rb
|
194
196
|
- lib/redd/error.rb
|
195
197
|
- lib/redd/object/comment.rb
|
196
198
|
- lib/redd/object/listing.rb
|
199
|
+
- lib/redd/object/private_message.rb
|
197
200
|
- lib/redd/object/submission.rb
|
198
201
|
- lib/redd/object/subreddit.rb
|
202
|
+
- lib/redd/object/user.rb
|
199
203
|
- lib/redd/rate_limit.rb
|
200
204
|
- lib/redd/response/parse_json.rb
|
201
205
|
- lib/redd/response/raise_error.rb
|
@@ -204,6 +208,7 @@ files:
|
|
204
208
|
- redd.gemspec
|
205
209
|
- spec/redd_spec.rb
|
206
210
|
- spec/spec_helper.rb
|
211
|
+
- test.rb
|
207
212
|
homepage: ''
|
208
213
|
licenses:
|
209
214
|
- MIT
|