hnruby 0.01.1 → 0.01.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f1b2d89d4f5fc0c1382e12b0f61a013a44e82a8
4
- data.tar.gz: dd86d0841ee82738e9a979d4ae1f087243c6efd7
3
+ metadata.gz: 4b6d68737114cfb703d4d7007b6719583bc99331
4
+ data.tar.gz: 4f93b627eb99063c28fc9a0e870e87d399663e7d
5
5
  SHA512:
6
- metadata.gz: 80972f3f6816814943d8e1ac34a94a471a530ac5381b7df20bb1d17fa9facf26f4b2d895d1fe94b94a5f43e921e3cee6e666aa8b537540b2298e0836d35f2ec9
7
- data.tar.gz: f5c38130b920c884734d4bbc7f1855d13aea976b32173b658e4acd9263569359fe0b4fda73a6feb5ffbb2ccc067930c4289b298d7e5f2f7e6f7a5b437645478f
6
+ metadata.gz: f2404fb955d07e5aa329766ba34d4561e5e04d20aa49930d759a787152e05dfb62401157bd7b15ea3438076fc04c78bf2999f6cf38453f4826b1c0be61ce40d5
7
+ data.tar.gz: 3ffe6c85c9e4df51dabf563a270a8c863f26b8238d0ec79179ba5b9e9bda930a032c4843dc912fd265c6da67d4226a4d1d5bf7c09e88f3ebbafab6d1910c81ad
@@ -57,44 +57,49 @@ class Comment
57
57
 
58
58
  # Returns true if +comment+ is a child of +self+.
59
59
  def parent_of?(comment)
60
- comment.parent && comment.parent.id == @id
60
+ if comment.respond_to?(:parent)
61
+ comment.parent && comment.parent.id == @id
62
+ end
61
63
  end
62
64
 
63
65
  # Returns true if +self+ is a child of +comment+.
64
66
  def child_of?(comment)
65
- @parent && @parent.id == comment.id
67
+ @parent && comment.respond_to?(:id) && @parent.id == comment.id
66
68
  end
67
69
 
68
- # :nodoc:
69
- def inspect
70
- "<Comment> by #{@submitter} at #{@time}"
70
+ # Returns 1 if +self+ is older than +comment+, and -1 if +comment+ is older
71
+ # than +self+. Since comments can't be exactly the same age, never returns 0.
72
+ #
73
+ # If +comment+ isn't actually a Comment, returns +nil+.
74
+ def <=>(comment) #Since IDs are sequential, this sorts by time
75
+ comment.respond_to?(:id) && comment.id <=> @id
71
76
  end
72
77
 
73
- def <=>(comment)
74
- left, right = [self, comment].map do |i|
75
- i.time.split[0].to_i * {
76
- "minute" => 60, "minutes" => 60,
77
- "hour" => 3600, "hours" => 3600,
78
- "day" => 86400, "days" => 86400
79
- }[i.time.split[1]]
80
- end
81
-
82
- -(right <=> left)
78
+ # :nodoc:
79
+ def inspect
80
+ "<Comment> by #{@submitter}, #{@time}"
83
81
  end
84
82
  end
85
83
 
86
84
  # Represents the list of comments pertaining to a particluar HN story.
87
85
  class CommentPage
88
86
  include Enumerable
89
- # Represents the title of
87
+ # Returns this comment page's title.
90
88
  attr_reader :title
89
+ # Returns the URL for this comment page on Hacker News.
91
90
  attr_reader :url
92
91
 
93
92
  # Returns a new CommentPage corresponding to <tt>url</tt>.
94
93
  # cpage = HackerNews::CommentPage.new\
95
94
  # "https://news.ycombinator.com/item?id=6621679" #=> "C--" <12 Comments>
95
+ #
96
+ # Alternately, if passed an integer, returns the CommentPage corresponding to
97
+ # the story whose ID is +url+.
98
+ # cpage = HackerNews::CommentPage.new 6621679 #=> "C--" <12 Comments>
96
99
  def initialize(url)
97
- html = Nokogiri::HTML open(url)
100
+ url = "#{HN_URL}/item?id=#{url.to_i}" if url.is_a? Numeric
101
+
102
+ html = Nokogiri::HTML(open(url), nil, "UTF-8")
98
103
  @title = html.title.chomp " | Hacker News"
99
104
  @url = url
100
105
 
@@ -20,7 +20,7 @@ module StoryList
20
20
  private
21
21
  def self.update_page(index)
22
22
  url = HN_URL + "#{"news#{index}" if index > 1}"
23
- html = (Nokogiri::HTML(open(url)) / "tr").to_a[4..-6]
23
+ html = (Nokogiri::HTML(open(url), nil, "UTF-8") / "tr").to_a[4..-6]
24
24
 
25
25
  (0...html.length).step(3) do |i|
26
26
  item = NewsItem.new(html[i], html[i + 1])
@@ -32,7 +32,7 @@ public
32
32
  #Clear story cache--- any actual NewsItem objects will still need to be
33
33
  #updated, though.
34
34
  def self.update
35
- @@items = {}
35
+ @@items.clear
36
36
  end
37
37
 
38
38
  # If <tt>index</tt> is a number, returns a NewsItem representing the story
@@ -53,7 +53,7 @@ public
53
53
  elsif i.is_a? Enumerable
54
54
  self.stories i
55
55
  else
56
- raise TypeError
56
+ raise TypeError, "#{i.class} objects cannot be used to access stories"
57
57
  end
58
58
  end
59
59
 
@@ -45,6 +45,10 @@ class TestHackerNews < Test::Unit::TestCase
45
45
  def test_comments
46
46
  cpage = HackerNews::CommentPage.new File.dirname(__FILE__)+"/commentpage.html"
47
47
 
48
+ assert_equal 6640155, cpage.sort.first.id
49
+ assert_equal 6637431, cpage.sort.last.id
50
+ assert_equal 6638715, cpage.sort[20].id
51
+
48
52
  first = cpage[0]
49
53
 
50
54
  assert_equal 0, first.depth
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.01.1
4
+ version: 0.01.2
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-01 00:00:00.000000000 Z
11
+ date: 2013-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-terminfo
@@ -95,3 +95,4 @@ specification_version: 4
95
95
  summary: Hacker News scraper
96
96
  test_files:
97
97
  - test/test_hackernews.rb
98
+ has_rdoc: