bterlson-reddit 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,4 @@
1
+ == 0.1.0 2008-05-22
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
data/License.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 Brian Terlson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Manifest.txt ADDED
@@ -0,0 +1,29 @@
1
+ History.txt
2
+ License.txt
3
+ Manifest.txt
4
+ PostInstall.txt
5
+ README.txt
6
+ Rakefile
7
+ config/hoe.rb
8
+ config/requirements.rb
9
+ lib/reddit.rb
10
+ lib/reddit/article.rb
11
+ lib/reddit/comment.rb
12
+ lib/reddit/comment_list.rb
13
+ lib/reddit/reddit.rb
14
+ lib/reddit/resource_list.rb
15
+ lib/reddit/session.rb
16
+ lib/reddit/user.rb
17
+ lib/reddit/version.rb
18
+ script/console
19
+ script/destroy
20
+ script/generate
21
+ script/txt2html
22
+ setup.rb
23
+ spec/reddit_spec.rb
24
+ spec/spec.opts
25
+ spec/spec_helper.rb
26
+ tasks/deployment.rake
27
+ tasks/environment.rake
28
+ tasks/rspec.rake
29
+ tasks/website.rake
data/README.txt ADDED
@@ -0,0 +1,66 @@
1
+ = reddit
2
+
3
+ * http://github.com/bterlson/reddit/
4
+
5
+ == DESCRIPTION:
6
+
7
+ An interface to the reddit API.
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * Retreive articles and their comments
12
+ * Retreive user pages
13
+
14
+ == SYNOPSIS:
15
+
16
+ require 'rubygems'
17
+ require 'reddit'
18
+
19
+ reddit = Reddit::Session.new
20
+
21
+ reddit.main.articles.each do |article|
22
+ p article.url
23
+
24
+ article.comments.each do |comment|
25
+ p comment.body
26
+ end
27
+ end
28
+
29
+ p reddit.subreddit("programming").articles[1].author
30
+
31
+ reddit.user("radhruin").comments.each do |comment|
32
+ p comment.body
33
+ end
34
+
35
+ == REQUIREMENTS:
36
+
37
+ * JSON >= 1.1.2
38
+
39
+ == INSTALL:
40
+
41
+ * sudo gem install bterlson-reddit --source=http://gems.github.com
42
+
43
+ == LICENSE:
44
+
45
+ (The MIT License)
46
+
47
+ Copyright (c) 2008 FIX
48
+
49
+ Permission is hereby granted, free of charge, to any person obtaining
50
+ a copy of this software and associated documentation files (the
51
+ 'Software'), to deal in the Software without restriction, including
52
+ without limitation the rights to use, copy, modify, merge, publish,
53
+ distribute, sublicense, and/or sell copies of the Software, and to
54
+ permit persons to whom the Software is furnished to do so, subject to
55
+ the following conditions:
56
+
57
+ The above copyright notice and this permission notice shall be
58
+ included in all copies or substantial portions of the Software.
59
+
60
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
61
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
62
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
63
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
64
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
65
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
66
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ require 'rake/gempackagetask'
2
+
3
+ Dir['tasks/**/*.rake'].each { |rake| load rake }
@@ -0,0 +1,44 @@
1
+ module Reddit
2
+ # A reddit article or submission.
3
+ class Article
4
+ attr_reader :score, :name, :title, :comment_count, :ups, :downs, :url, :domain, :author, :id, :created_at
5
+
6
+ # Initializes the data for the article. Takes a hash of the various attributes as taken from the API.
7
+ def initialize(attributes)
8
+ @score = attributes['score']
9
+ @name = attributes['name']
10
+ @title = attributes['title']
11
+ @comment_count = attributes['num_comments']
12
+ @ups = attributes['ups']
13
+ @downs = attributes['downs']
14
+ @url = attributes['url']
15
+ @domain = attributes['domain']
16
+ @author = User.new(attributes['author']) unless attributes['author'].nil?
17
+ @id = attributes['id']
18
+ @created_at = Time.at(attributes['created']) unless attributes['created'].nil?
19
+ @saved = attributes['saved']
20
+ @clicked = attributes['clicked']
21
+ @hidden = attributes['hidden']
22
+ end
23
+
24
+ # indicates if the current logged in user has saved the article.
25
+ def saved?
26
+ return @saved
27
+ end
28
+
29
+ # indicates if the current logged in user has clicked the article.
30
+ def clicked?
31
+ return @clicked
32
+ end
33
+
34
+ # indicates if the current logged in user has hidden the article.
35
+ def hidden?
36
+ return @hidden
37
+ end
38
+
39
+ # returns a CommentList of this article's comments.
40
+ def comments
41
+ return CommentList.new(@id)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,33 @@
1
+ module Reddit
2
+
3
+ # A reddit comment.
4
+ class Comment
5
+ attr_reader :body, :name, :ups, :downs, :url, :domain, :author, :id, :created_at, :replies
6
+
7
+ # Initializes the data for the comment. Takes a hash of the various attributes as taken from the API.
8
+ def initialize(attributes)
9
+ @score = attributes['score']
10
+ @name = attributes['name']
11
+ @ups = attributes['ups']
12
+ @downs = attributes['downs']
13
+ @author = User.new(attributes['author']) unless attributes['author'].nil?
14
+ @id = attributes['id']
15
+ @created_at = Time.at(attributes['created']) unless attributes['created'].nil?
16
+ @body = attributes['body']
17
+ @replies = []
18
+
19
+ unless attributes['replies'].nil?
20
+ attributes['replies']['data']['children'].each do |reply|
21
+ @replies << Comment.new(reply['data'])
22
+ end
23
+ end
24
+
25
+ end
26
+
27
+ # Returns the score for this comment.
28
+ def score
29
+ return @ups - @downs
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,31 @@
1
+ module Reddit
2
+
3
+ # The list of comments found for an article.
4
+ class CommentList < ResourceList
5
+
6
+ # Initializes a comments list. Takes the ID of the article for which the comments belong to.
7
+ def initialize(article_id)
8
+ @article_id = article_id
9
+ @url = COMMENTS_URL.gsub('[id]', @article_id)
10
+ end
11
+
12
+ # returns the top level comments for the thread.
13
+ def top_level
14
+ resources = get_resources(@url)
15
+
16
+ comments = []
17
+ resources.each do |comment|
18
+ comments << Comment.new(comment['data'])
19
+ end
20
+
21
+ return comments
22
+ end
23
+
24
+ private
25
+
26
+ # forward any method calls to the top level comments array.
27
+ def method_missing(meth, *args, &block)
28
+ top_level.send(meth, *args, &block)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ module Reddit
2
+
3
+ # The main reddit or a subreddit.
4
+ class Reddit < ResourceList
5
+
6
+ # Initialize the reddit. If no name is specified, the reddit will be the main reddit.
7
+ def initialize(name = nil)
8
+ @name = name
9
+ @url = @name.nil? ? BASE_URL : SUBREDDIT_URL.gsub('[subreddit]', @name)
10
+ end
11
+
12
+ # Returns the articles found in this reddit.
13
+ def articles
14
+ resources = get_resources(@url)
15
+
16
+ articles = []
17
+
18
+ resources.each do |article|
19
+ articles << Article.new(article['data'])
20
+ end
21
+
22
+ return articles
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ module Reddit
2
+
3
+ # A list of resources, such as a list of comments from an article or a user's page.
4
+ class ResourceList
5
+ attr_reader :url
6
+
7
+ private
8
+
9
+ # Grabs the resources at the URL and returns the parsed json.
10
+ def get_resources(url)
11
+ url = URI.parse(url)
12
+
13
+ res = Net::HTTP.start(url.host, url.port) {|http|
14
+ http.get(url.path + ".json")
15
+ }
16
+
17
+ raise SubredditNotFound if res.is_a?(Net::HTTPRedirection)
18
+ resources = JSON.parse(res.body, :max_nesting => 0)
19
+
20
+ # comments pages are contained in an array where the first element is the article
21
+ # and the second is the actual comments. This is hackish.
22
+ resources = resources.last if resources.is_a?(Array)
23
+
24
+ return resources['data']['children']
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,41 @@
1
+ module Reddit
2
+ BASE_URL = "http://www.beta.reddit.com/"
3
+ PROFILE_URL = BASE_URL + "user/[username]/"
4
+ SUBREDDIT_URL = BASE_URL + "r/[subreddit]/"
5
+ COMMENTS_URL = BASE_URL + "info/[id]/comments/"
6
+
7
+ # raised when attempting to interact with a subreddit that doesn't exist.
8
+ class SubredditNotFound < StandardError; end
9
+
10
+ # raised when attempting to interact with a profile that doesn't exist.
11
+ class ProfileNotFound < StandardError; end
12
+
13
+ # raised when attempting to log in with incorrect credentials.
14
+ class AuthenticationException < StandardError; end
15
+
16
+ # A reddit browsing session.
17
+ class Session
18
+
19
+ # initialize the session with a username and password. Currently not used.
20
+ def initialize(username = "", password = "")
21
+ @username = username
22
+ @password = password
23
+ end
24
+
25
+ # return the main reddit.
26
+ def main
27
+ return Reddit.new()
28
+ end
29
+
30
+ # return a specific subreddit.
31
+ def subreddit(subreddit)
32
+ return Reddit.new(subreddit)
33
+ end
34
+
35
+ # return a specific user's page.
36
+ def user(username)
37
+ return User.new(username)
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,25 @@
1
+ module Reddit
2
+
3
+ # A user's page.
4
+ class User < ResourceList
5
+ attr_reader :name
6
+
7
+ # Initialize based on the user's name.
8
+ def initialize(name)
9
+ @name = name
10
+ @url = PROFILE_URL.gsub('[username]', @name)
11
+ end
12
+
13
+ # Get the user's comments.
14
+ def comments
15
+ resources = get_resources(@url)
16
+
17
+ comments = []
18
+ resources.each do |comment|
19
+ comments << Comment.new(comment['data'])
20
+ end
21
+
22
+ return comments
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,9 @@
1
+ module Reddit #:nodoc:
2
+ module VERSION #:nodoc:
3
+ MAJOR = 0
4
+ MINOR = 1
5
+ TINY = 0
6
+
7
+ STRING = [MAJOR, MINOR, TINY].join('.')
8
+ end
9
+ end
data/lib/reddit.rb ADDED
@@ -0,0 +1,14 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'rubygems'
5
+ require 'json'
6
+ require 'net/http'
7
+ require 'reddit/resource_list'
8
+ require 'reddit/comment_list'
9
+ require 'reddit/comment'
10
+ require 'reddit/session'
11
+ require 'reddit/version'
12
+ require 'reddit/reddit'
13
+ require 'reddit/article'
14
+ require 'reddit/user'
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Reddit::Article do
4
+ before do
5
+ @article = Reddit::Article.new({"id" => "id"})
6
+ end
7
+
8
+ it "should be able to get the article's comments comments" do
9
+ Reddit::CommentList.should_receive(:new).with("id").and_return("reddit!")
10
+ @article.comments.should == "reddit!"
11
+ end
12
+ end
@@ -0,0 +1,31 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Reddit::CommentList do
4
+ before do
5
+ @comments_list = Reddit::CommentList.new('id')
6
+ end
7
+
8
+ it "should know its url" do
9
+ @comments_list.url.should == Reddit::COMMENTS_URL.gsub('[id]', 'id')
10
+ end
11
+
12
+ it "should fetch the top level comments" do
13
+ @comments_list.should_receive(:get_resources).and_return([
14
+ {:type => 't1', :data => {:attribute => 'value'}},
15
+ {:type => 't1', :data => {:attribute => 'value2'}}
16
+ ])
17
+
18
+ mock_comment = mock(Reddit::Comment)
19
+ Reddit::Comment.should_receive(:new).twice.and_return(mock_comment)
20
+
21
+ @comments_list.top_level.should == [mock_comment, mock_comment]
22
+ end
23
+
24
+ it "should redirect method calls to the top level comments" do
25
+ top_level_mock = mock('top_level')
26
+ top_level_mock.should_receive(:[]).and_return("array")
27
+ @comments_list.stub!(:top_level).and_return(top_level_mock)
28
+
29
+ @comments_list[1].should == "array"
30
+ end
31
+ end
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Reddit::Comment do
4
+ before do
5
+ @comment = Reddit::Comment.new({
6
+ 'ups' => 5,
7
+ 'downs' => 6,
8
+ 'replies' => {'data' => {'children' => [
9
+ {'data' => {'ups' => 1, 'downs' => 6}}
10
+ ]}}
11
+ })
12
+ end
13
+
14
+ it "should have replies" do
15
+ @comment.replies.should_not be_nil
16
+ end
17
+
18
+ it "should calculate its score" do
19
+ @comment.score.should == -1
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Reddit::Reddit do
4
+ before do
5
+ @reddit = Reddit::Reddit.new("programming")
6
+ end
7
+
8
+ it "should know its url" do
9
+ @reddit.url.should == Reddit::SUBREDDIT_URL.gsub('[subreddit]', 'programming')
10
+ end
11
+
12
+ it "should find the articles" do
13
+ @reddit.should_receive(:get_resources).and_return([
14
+ {:type => 't1', :data => {:attribute => 'value'}},
15
+ {:type => 't1', :data => {:attribute => 'value2'}}
16
+ ])
17
+
18
+ mock_article = mock(Reddit::Article)
19
+ Reddit::Article.should_receive(:new).twice.and_return(mock_article)
20
+
21
+ @reddit.articles.should == [mock_article, mock_article]
22
+ end
23
+ end
24
+
25
+ describe Reddit::Reddit, "With no subreddit specified" do
26
+ it "should use the main reddit" do
27
+ reddit = Reddit::Reddit.new()
28
+ reddit.url.should == Reddit::BASE_URL
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Reddit::ResourceList, ".get_resources" do
4
+ before do
5
+ @resource_list = Reddit::ResourceList.new
6
+ @http_mock = mock('http')
7
+ @http_mock.stub!(:get)
8
+ @response_mock = mock(Net::HTTPResponse)
9
+ @response_mock.stub!(:body).and_return('{"kind": "Listing", "data": {"children": [{"kind": "t3", "data": {"attribute": "value"}}]}}')
10
+ Net::HTTP.stub!(:start).and_yield(@http_mock).and_return(@response_mock)
11
+ end
12
+
13
+ it "should get the resources from Reddit" do
14
+ Net::HTTP.should_receive(:start).and_yield(@http_mock).and_return(@response_mock)
15
+ @resource_list.send(:get_resources, "http://reddit.com")
16
+ end
17
+
18
+ it "should parse the JSON" do
19
+ JSON.should_receive(:parse).and_return({'kind' => 'Listing', 'data' => {'children' => [{'data' => {'attribute' => 'value'}}]}})
20
+ @resource_list.send(:get_resources, "http://reddit.com")
21
+ end
22
+
23
+ it "should raise an error when the subreddit is not found" do
24
+ reddit = Reddit::Reddit.new("not found")
25
+ @response_mock.stub!(:is_a?).and_return(Net::HTTPRedirection)
26
+
27
+ proc {@resource_list.send(:get_resources, "http://reddit.com")}.should raise_error(Reddit::SubredditNotFound)
28
+ end
29
+ end
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Reddit::Session, "without logging in" do
4
+
5
+ before(:each) do
6
+ @reddit = Reddit::Session.new()
7
+ end
8
+
9
+ it "should grab the main page" do
10
+ @reddit.main.should_not be_nil
11
+ end
12
+
13
+ it "should grab a user's profile page" do
14
+ @reddit.user("radhruin").should_not be_nil
15
+ end
16
+
17
+ it "should grab a subreddit" do
18
+ @reddit.subreddit("programming").should_not be_nil
19
+ end
20
+ end
21
+
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,10 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
10
+ require 'reddit'
data/spec/user_spec.rb ADDED
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Reddit::User do
4
+ before do
5
+ @user = Reddit::User.new('radhruin')
6
+ end
7
+
8
+ it "should know its url" do
9
+ @user.url.should == Reddit::PROFILE_URL.gsub('[username]', 'radhruin')
10
+ end
11
+
12
+ it "should fetch the user's comments" do
13
+ @user.should_receive(:get_resources).and_return([
14
+ {:type => 't1', :data => {:attribute => 'value'}},
15
+ {:type => 't1', :data => {:attribute => 'value2'}}
16
+ ])
17
+
18
+ mock_comment = mock(Reddit::Comment)
19
+ Reddit::Comment.should_receive(:new).twice.and_return(mock_comment)
20
+
21
+ @user.comments.should == [mock_comment, mock_comment]
22
+ end
23
+ end
@@ -0,0 +1,7 @@
1
+ task :ruby_env do
2
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
3
+ "jruby"
4
+ else
5
+ "ruby"
6
+ end unless defined? RUBY_APP
7
+ end
data/tasks/rspec.rake ADDED
@@ -0,0 +1,21 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'spec'
6
+ end
7
+ begin
8
+ require 'spec/rake/spectask'
9
+ rescue LoadError
10
+ puts <<-EOS
11
+ To use rspec for testing you must install rspec gem:
12
+ gem install rspec
13
+ EOS
14
+ exit(0)
15
+ end
16
+
17
+ desc "Run the specs under spec/models"
18
+ Spec::Rake::SpecTask.new do |t|
19
+ t.spec_opts = ['--options', "spec/spec.opts"]
20
+ t.spec_files = FileList['spec/**/*_spec.rb']
21
+ end
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bterlson-reddit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Brian Terlson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-05-14 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: json
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.1.2
23
+ version:
24
+ description:
25
+ email: btthalion@gmail.com
26
+ executables: []
27
+
28
+ extensions: []
29
+
30
+ extra_rdoc_files:
31
+ - README.txt
32
+ files:
33
+ - History.txt
34
+ - lib/reddit.rb
35
+ - lib/reddit/article.rb
36
+ - lib/reddit/comment.rb
37
+ - lib/reddit/comment_list.rb
38
+ - lib/reddit/reddit.rb
39
+ - lib/reddit/resource_list.rb
40
+ - lib/reddit/session.rb
41
+ - lib/reddit/user.rb
42
+ - lib/reddit/version.rb
43
+ - License.txt
44
+ - Manifest.txt
45
+ - Rakefile
46
+ - README.txt
47
+ - spec/article_spec.rb
48
+ - spec/comment_list_spec.rb
49
+ - spec/comment_spec.rb
50
+ - spec/reddit_spec.rb
51
+ - spec/resource_list_spec.rb
52
+ - spec/session_spec.rb
53
+ - spec/spec.opts
54
+ - spec/spec_helper.rb
55
+ - spec/user_spec.rb
56
+ - tasks/environment.rake
57
+ - tasks/rspec.rake
58
+ has_rdoc: true
59
+ homepage: http://github.com/bterlson/reddit/
60
+ post_install_message:
61
+ rdoc_options: []
62
+
63
+ require_paths:
64
+ - lib
65
+ required_ruby_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: "0"
70
+ version:
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: "0"
76
+ version:
77
+ requirements: []
78
+
79
+ rubyforge_project:
80
+ rubygems_version: 1.0.1
81
+ signing_key:
82
+ specification_version: 2
83
+ summary: Interface with the Reddit.com API.
84
+ test_files: []
85
+