hnruby 0.01.2 → 0.02
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.
- checksums.yaml +4 -4
- data/lib/hnruby.rb +2 -2
- data/lib/hnruby/comment.rb +14 -9
- data/lib/hnruby/newsitem.rb +12 -17
- data/lib/hnruby/storylist.rb +33 -7
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f1bb2f5a4c8b8fa3b1b78dc9438863f0506be8a3
|
4
|
+
data.tar.gz: dc9ab3e324b16719efd2f5e77734606d40ee76ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14030d713a3aeb6a065d6515913ae299f70f751ad1ea8d48ce841c4a0bc59fb01203c880c381b41cbd84b667b2624a8ec5d40659f0d05266bd8f2e0c4fa8220e
|
7
|
+
data.tar.gz: 7904c487d791b218a9306f8405e1587779d5409c885fd53a6eb4a9025c4460bdb0cb38520e9ba496b1ba6de610df98c950844b43eaa02ddfa0c1d3b287537387
|
data/lib/hnruby.rb
CHANGED
@@ -43,7 +43,7 @@ require 'hnruby/storylist.rb'
|
|
43
43
|
# From a CommentPage, specific comments can be accessed via index:
|
44
44
|
# comment = cpage[1] #=> <Comment> by user 1 day ago
|
45
45
|
module HackerNews
|
46
|
-
#Because clearly this is in danger of changing at any moment.
|
47
|
-
HN_URL = "https://news.ycombinator.com/"
|
46
|
+
#Because clearly this is in danger of changing at any moment.
|
47
|
+
HN_URL = "https://news.ycombinator.com/"
|
48
48
|
|
49
49
|
end
|
data/lib/hnruby/comment.rb
CHANGED
@@ -82,12 +82,16 @@ class Comment
|
|
82
82
|
end
|
83
83
|
|
84
84
|
# Represents the list of comments pertaining to a particluar HN story.
|
85
|
+
#---
|
86
|
+
#TODO: Support self-post content, polls, etc.
|
85
87
|
class CommentPage
|
86
88
|
include Enumerable
|
87
89
|
# Returns this comment page's title.
|
88
90
|
attr_reader :title
|
89
91
|
# Returns the URL for this comment page on Hacker News.
|
90
92
|
attr_reader :url
|
93
|
+
# Returns the URL for the story corresponding to this comment page.
|
94
|
+
attr_reader :story_url
|
91
95
|
|
92
96
|
# Returns a new CommentPage corresponding to <tt>url</tt>.
|
93
97
|
# cpage = HackerNews::CommentPage.new\
|
@@ -97,13 +101,14 @@ class CommentPage
|
|
97
101
|
# the story whose ID is +url+.
|
98
102
|
# cpage = HackerNews::CommentPage.new 6621679 #=> "C--" <12 Comments>
|
99
103
|
def initialize(url)
|
100
|
-
url = "#{HN_URL}
|
104
|
+
@url = url.is_a?(Numeric) ? "#{HN_URL}item?id=#{url.to_i}" : url
|
101
105
|
|
102
|
-
html = Nokogiri::HTML(open(url), nil, "UTF-8")
|
106
|
+
html = Nokogiri::HTML(open(@url), nil, "UTF-8")
|
103
107
|
@title = html.title.chomp " | Hacker News"
|
104
|
-
@
|
108
|
+
@story_url = ((html / "tr")[4] / "td")[1].at("a").attribute("href").value
|
105
109
|
|
106
|
-
html = (html / "tr")[8..-3]
|
110
|
+
html = (html / "tr")[(@story_url.start_with?("item?id=") ? 10 : 8)..-3].
|
111
|
+
drop_while { |i| i.children.length != 1 } # Fixes polls and such
|
107
112
|
@comments = []
|
108
113
|
lineage = []
|
109
114
|
(0...html.length).select{ |i| i.even? }.each do |i|
|
@@ -120,11 +125,6 @@ class CommentPage
|
|
120
125
|
self
|
121
126
|
end
|
122
127
|
|
123
|
-
# Returns array containing every Comment object within the page.
|
124
|
-
def to_a
|
125
|
-
@comments
|
126
|
-
end
|
127
|
-
|
128
128
|
# Returns the Comment object at <tt>index</tt>.
|
129
129
|
def [](index)
|
130
130
|
@comments[index]
|
@@ -136,6 +136,11 @@ class CommentPage
|
|
136
136
|
@comments[index]
|
137
137
|
end
|
138
138
|
|
139
|
+
# Returns the number of comments in +self+.
|
140
|
+
def length
|
141
|
+
@comments.length
|
142
|
+
end
|
143
|
+
|
139
144
|
# :nodoc:
|
140
145
|
def inspect
|
141
146
|
"\"#{@title}\" <#{@comments.length} comments>"
|
data/lib/hnruby/newsitem.rb
CHANGED
@@ -38,38 +38,32 @@ class NewsItem
|
|
38
38
|
|
39
39
|
@number = article.first.content.to_i
|
40
40
|
@url = article[2].at("a").attributes["href"].value
|
41
|
-
@url
|
41
|
+
@url.prepend(HN_URL) if url.start_with? "item?id="
|
42
42
|
@title = article[2].children.first.content
|
43
43
|
|
44
44
|
if meta.children.length == 5
|
45
45
|
#This is a normal article
|
46
|
-
@
|
47
|
-
|
48
|
-
@
|
49
|
-
@
|
50
|
-
@
|
51
|
-
@comment_url = meta[1].children[4].attributes["href"].value
|
52
|
-
@comment_page = nil #Don't needlessly download until asked
|
53
|
-
@comments = meta[1].children[4].content.to_i
|
46
|
+
@points = meta[1].children.first.content.to_i
|
47
|
+
@submitter = meta[1].children[2].content
|
48
|
+
@time = meta[1].children[3].content.delete("|").strip
|
49
|
+
@comment_url = meta[1].children[4].attributes["href"].value
|
50
|
+
@comments = meta[1].children[4].content.to_i
|
54
51
|
else
|
55
52
|
#This, by contrast, is a job offer, which lacks all meta-info aside
|
56
53
|
#from submission time
|
57
|
-
@category = :joboffer
|
58
|
-
|
59
54
|
@time = meta[1].content
|
60
|
-
@points, @submitter, @comment_url, @comment_page, @comments = nil
|
61
55
|
end
|
62
56
|
end
|
63
57
|
# :startdoc:
|
64
58
|
|
65
59
|
# Returns true if <tt>self</tt> is an article (with points, comments, etc.).
|
66
60
|
def article?
|
67
|
-
|
61
|
+
!@points.nil?
|
68
62
|
end
|
69
63
|
# Returns true if <tt>self</tt> is a job offer (without points, comments,
|
70
64
|
# etc.).
|
71
65
|
def joboffer?
|
72
|
-
@
|
66
|
+
@points.nil?
|
73
67
|
end
|
74
68
|
|
75
69
|
# Returns the URL to the HN profile of the submitter.
|
@@ -85,12 +79,13 @@ class NewsItem
|
|
85
79
|
def comment_url
|
86
80
|
"#{HN_URL}#{@comment_url}" if @comment_url
|
87
81
|
end
|
88
|
-
# Returns the CommentPage corresponding to <tt>self</tt
|
82
|
+
# Returns the CommentPage corresponding to <tt>self</tt>.
|
83
|
+
#
|
84
|
+
# If +self+ is a job offer, returns +nil+.
|
89
85
|
# news_item.comment_page\
|
90
86
|
# #=> "Amazon and the "profitless business model" fallacy" <21 comments>
|
91
87
|
def comment_page
|
92
|
-
|
93
|
-
@comment_page = CommentPage.new comment_url if @comment_url
|
88
|
+
@comment_page ||= CommentPage.new comment_url if @comment_url
|
94
89
|
end
|
95
90
|
|
96
91
|
# :nodoc:
|
data/lib/hnruby/storylist.rb
CHANGED
@@ -16,13 +16,20 @@ module HackerNews
|
|
16
16
|
# story == HackerNews::StoryList[1] #=> false
|
17
17
|
module StoryList
|
18
18
|
@@items = {}
|
19
|
+
@@page_urls = {} #sketchiness ensues
|
19
20
|
|
20
21
|
private
|
22
|
+
def self.get_page_url(index)
|
23
|
+
update_page(index - 1) unless @@page_urls[index]
|
24
|
+
HN_URL + @@page_urls[index]
|
25
|
+
end
|
26
|
+
|
21
27
|
def self.update_page(index)
|
22
|
-
url =
|
23
|
-
html =
|
28
|
+
url = (index > 1) ? get_page_url(index) : HN_URL
|
29
|
+
html = Nokogiri::HTML(open(url), nil, "UTF-8") / "tr"
|
30
|
+
@@page_urls[index+1] = html[-3].at("a").attribute("href").content.sub "/",""
|
24
31
|
|
25
|
-
(
|
32
|
+
(4...(html.length - 6)).step(3) do |i|
|
26
33
|
item = NewsItem.new(html[i], html[i + 1])
|
27
34
|
@@items[item.number] = item
|
28
35
|
end
|
@@ -33,6 +40,7 @@ public
|
|
33
40
|
#updated, though.
|
34
41
|
def self.update
|
35
42
|
@@items.clear
|
43
|
+
@@page_urls.clear
|
36
44
|
end
|
37
45
|
|
38
46
|
# If <tt>index</tt> is a number, returns a NewsItem representing the story
|
@@ -48,10 +56,11 @@ public
|
|
48
56
|
# #=> ["C--" <article: 6621679>, "Profitless Prosperity" <article: 6622394>]
|
49
57
|
# :arg: index
|
50
58
|
def self.[](i)
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
59
|
+
case i
|
60
|
+
when Numeric
|
61
|
+
at(i.to_i)
|
62
|
+
when Enumerable
|
63
|
+
stories(i)
|
55
64
|
else
|
56
65
|
raise TypeError, "#{i.class} objects cannot be used to access stories"
|
57
66
|
end
|
@@ -81,6 +90,23 @@ public
|
|
81
90
|
def self.stories(range)
|
82
91
|
range.map{ |i| at i }
|
83
92
|
end
|
93
|
+
|
94
|
+
# Returns (up to) the first +count+ NewsItems that return +true+ in the
|
95
|
+
# accompanying block--- if no argument is given, returns the first such
|
96
|
+
# NewsItem.
|
97
|
+
#
|
98
|
+
# May return fewer than +count+ items, if a smaller number than are requested
|
99
|
+
# can be found.
|
100
|
+
def self.get_by(count = 1)
|
101
|
+
i = 0
|
102
|
+
items = []
|
103
|
+
until items.count == count
|
104
|
+
i += 1
|
105
|
+
items << at(i) if yield at(i)
|
106
|
+
end
|
107
|
+
rescue OpenURI::HTTPError #NOTE: May be unnecessary since page-loading's fixed
|
108
|
+
items
|
109
|
+
end
|
84
110
|
end
|
85
111
|
|
86
112
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hnruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.02'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jem Orgun
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-terminfo
|