ruby-reddit 0.1.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.
@@ -0,0 +1,5 @@
1
+ == 0.1.0 / 2008-01-22
2
+
3
+ * 1 minor enhancement
4
+ * 1st release. Link scraping from reddit's hot and new pages.
5
+
@@ -0,0 +1,8 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ bin/ruby-reddit
6
+ lib/reddit.rb
7
+ test/test_helper.rb
8
+ test/test_reddit.rb
@@ -0,0 +1,60 @@
1
+ ruby-reddit
2
+ by Julia West
3
+ http://ruby-reddit.rubyforge.org
4
+
5
+ == DESCRIPTION:
6
+
7
+ Interact with reddit.com. Read links and post links (coming soon!).
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * Scrapes links from reddit's hot page and new page.
12
+
13
+ == SYNOPSIS:
14
+
15
+ # Get all the "hot" links on the first page
16
+ links = Reddit::Data.read :hot, :page => 0
17
+
18
+ # Check out the links!
19
+ for link in links
20
+ puts link.rank
21
+ puts link.site_id
22
+ puts link.url
23
+ puts link.title
24
+ puts link.date
25
+ end
26
+
27
+ == REQUIREMENTS:
28
+
29
+ * hpricot
30
+ * open-uri
31
+ * mechanize
32
+
33
+ == INSTALL:
34
+
35
+ * sudo gem install ruby-reddit
36
+
37
+ == LICENSE:
38
+
39
+ (The MIT License)
40
+
41
+ Copyright (c) 2008 Julia West
42
+
43
+ Permission is hereby granted, free of charge, to any person obtaining
44
+ a copy of this software and associated documentation files (the
45
+ 'Software'), to deal in the Software without restriction, including
46
+ without limitation the rights to use, copy, modify, merge, publish,
47
+ distribute, sublicense, and/or sell copies of the Software, and to
48
+ permit persons to whom the Software is furnished to do so, subject to
49
+ the following conditions:
50
+
51
+ The above copyright notice and this permission notice shall be
52
+ included in all copies or substantial portions of the Software.
53
+
54
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
55
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
56
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
57
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
58
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
59
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
60
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,17 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './lib/reddit.rb'
6
+
7
+ Hoe.new('ruby-reddit', Reddit::VERSION) do |p|
8
+ p.rubyforge_name = 'ruby-reddit'
9
+ p.author = 'Julia West'
10
+ p.email = 'juliamae@gmail.com'
11
+ p.summary = 'Plug reddit.com into your ruby apps.'
12
+ p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
13
+ p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
14
+ p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
15
+ end
16
+
17
+ # vim: syntax=Ruby
File without changes
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require "rubygems"
4
+ require "hpricot"
5
+ require "open-uri"
6
+ require "mechanize"
7
+
8
+ module Reddit
9
+
10
+ VERSION = '0.1.0'
11
+
12
+ DefaultOptions = {
13
+ :page => 0
14
+ }
15
+
16
+ Subreddits = %w{programming science politics business gadgets sports gaming entertainment netsec}
17
+
18
+ class Data
19
+
20
+ def self.read(section, options)
21
+ conf = Reddit::DefaultOptions.update options
22
+ reader = Reader.new section, conf[:page]
23
+ reader.links
24
+ end
25
+
26
+ def self.subreddit_url(subreddit)
27
+ "http://reddit.com/r/#{subreddit}/.rss"
28
+ end
29
+
30
+ end
31
+
32
+ class Reader
33
+ GuidRegExp = /id=t3_(.+)$/
34
+ DescriptionRegExp = /href="(.+)">\[link\]/
35
+
36
+ Urls = {
37
+ :hot => "http://reddit.com/.rss",
38
+ :new => "http://reddit.com/new.rss",
39
+ }
40
+
41
+ def initialize(section, page)
42
+ @section = section
43
+ @page = page
44
+ end
45
+
46
+ def links
47
+ index=0
48
+ collection = (page_data/:item).map do |item|
49
+ rank = link_start + (index += 1)
50
+ site_id = parse_guid((item/:guid).inner_html)
51
+ title = (item/:title).inner_html
52
+ date = (item/:"dc:date").inner_html
53
+ url = parse_description((item/:description).inner_html)
54
+
55
+ Link.new(rank, site_id, title, date, url)
56
+ end
57
+ end
58
+
59
+ def parse_guid(guid)
60
+ GuidRegExp.match(guid)[1]
61
+ end
62
+
63
+ def parse_description(description)
64
+ DescriptionRegExp.match(description)[1]
65
+ end
66
+
67
+ def page_data
68
+ params = "?count=#{link_start}"
69
+ doc = Hpricot.XML(open("#{Urls[@section]}#{params}"))
70
+ end
71
+
72
+ def link_start
73
+ @page * 25
74
+ end
75
+ end
76
+
77
+ class Link
78
+ attr_accessor :rank, :site_id, :url, :title, :date, :points, :author
79
+
80
+ def initialize(rank, site_id, url, title, date, points=nil, author=nil)
81
+ @rank = rank
82
+ @site_id = site_id
83
+ @url = url
84
+ @title = title
85
+ @date = date
86
+ @points = points
87
+ @author = author
88
+ end
89
+ end
90
+
91
+ end
@@ -0,0 +1,2 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/reddit'
@@ -0,0 +1,68 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class RedditTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ end
7
+
8
+ def assert_not_blank(attribute)
9
+ !attribute.nil? && attribute != ""
10
+ end
11
+
12
+ def test_main_urls
13
+ for section, url in Reddit::Reader::Urls
14
+ page = open(url)
15
+ assert_equal "200", page.status[0]
16
+ end
17
+ end
18
+
19
+ def test_subreddit_urls
20
+ # First assert a bad subreddit will throw an HTTPError
21
+ assert_raise OpenURI::HTTPError do
22
+ page = open(Reddit::Data.subreddit_url("thefakestsubreddit"))
23
+ end
24
+
25
+ # Now make sure these are all 200s
26
+ for subreddit in Reddit::Subreddits
27
+ page = open(Reddit::Data.subreddit_url(subreddit))
28
+ assert_equal "200", page.status[0]
29
+ end
30
+ end
31
+
32
+ def test_get_hot_links
33
+ links = Reddit::Data.read :hot, :page => 0
34
+
35
+ assert_equal 25, links.length
36
+ links.each_with_index do |link, index|
37
+ assert_equal index + 1, link.rank
38
+ assert_not_blank link.site_id
39
+ assert_not_blank link.url
40
+ assert_not_blank link.title
41
+ assert_not_blank link.date
42
+ end
43
+ end
44
+
45
+ def test_parse_guid
46
+ reader = Reddit::Reader.new :hot, 0
47
+ link_start = reader.link_start
48
+ page_data = reader.page_data
49
+
50
+ item = (page_data/:item)[0]
51
+ site_id = reader.parse_guid((item/:guid).inner_html)
52
+
53
+ assert_not_blank site_id
54
+ assert site_id.length >= 4
55
+ assert /^[a-zA-Z0-9]+$/.match(site_id)
56
+ end
57
+
58
+ def test_parse_description
59
+ reader = Reddit::Reader.new :hot, 0
60
+ link_start = reader.link_start
61
+ page_data = reader.page_data
62
+
63
+ (page_data/:item).each do |item|
64
+ assert URI.parse(reader.parse_description((item/:description).inner_html))
65
+ end
66
+ end
67
+
68
+ end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-reddit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Julia West
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-01-22 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.4.0
23
+ version:
24
+ description: "== FEATURES/PROBLEMS: * Scrapes links from reddit's hot page and new page. == SYNOPSIS: # Get all the \"hot\" links on the first page links = Reddit::Data.read :hot, :page => 0 # Check out the links! for link in links puts link.rank puts link.site_id puts link.url puts link.title puts link.date end == REQUIREMENTS: * hpricot * open-uri * mechanize"
25
+ email: juliamae@gmail.com
26
+ executables:
27
+ - ruby-reddit
28
+ extensions: []
29
+
30
+ extra_rdoc_files:
31
+ - History.txt
32
+ - Manifest.txt
33
+ - README.txt
34
+ files:
35
+ - History.txt
36
+ - Manifest.txt
37
+ - README.txt
38
+ - Rakefile
39
+ - bin/ruby-reddit
40
+ - lib/reddit.rb
41
+ - test/test_helper.rb
42
+ - test/test_reddit.rb
43
+ has_rdoc: true
44
+ homepage: " by Julia West"
45
+ post_install_message:
46
+ rdoc_options:
47
+ - --main
48
+ - README.txt
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: "0"
56
+ version:
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: "0"
62
+ version:
63
+ requirements: []
64
+
65
+ rubyforge_project: ruby-reddit
66
+ rubygems_version: 1.0.1
67
+ signing_key:
68
+ specification_version: 2
69
+ summary: Plug reddit.com into your ruby apps.
70
+ test_files:
71
+ - test/test_helper.rb
72
+ - test/test_reddit.rb