jsl-feedzirra 0.0.12.4 → 0.0.12.5
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.
data/lib/feedzirra/http_multi.rb
CHANGED
@@ -77,7 +77,7 @@ module Feedzirra
|
|
77
77
|
retrievable.update_from_feed(updated_feed)
|
78
78
|
else
|
79
79
|
# all elements are "new", since we weren't dealing with a Feed element.
|
80
|
-
updated_feed.
|
80
|
+
updated_feed.mark_all_entries_new!
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
@@ -88,7 +88,7 @@ module Feedzirra
|
|
88
88
|
begin
|
89
89
|
if curl.response_code == 304
|
90
90
|
updated_feed = retrievable
|
91
|
-
updated_feed.
|
91
|
+
updated_feed.mark_all_entries_old!
|
92
92
|
else
|
93
93
|
updated_feed = parser_for_xml(curl.body_str).run
|
94
94
|
updated_feed.feed_url = curl.last_effective_url
|
@@ -19,6 +19,18 @@ module Feedzirra
|
|
19
19
|
@id || @url
|
20
20
|
end
|
21
21
|
|
22
|
+
def new_entry?
|
23
|
+
@_new_entry.nil? ? true : @_new_entry
|
24
|
+
end
|
25
|
+
|
26
|
+
def mark_old!
|
27
|
+
@_new_entry = false
|
28
|
+
end
|
29
|
+
|
30
|
+
def mark_new!
|
31
|
+
@_new_entry = true
|
32
|
+
end
|
33
|
+
|
22
34
|
##
|
23
35
|
# Writter for published. By default, we keep the "oldest" publish time found.
|
24
36
|
def published=(val)
|
@@ -27,7 +39,7 @@ module Feedzirra
|
|
27
39
|
end
|
28
40
|
|
29
41
|
##
|
30
|
-
# Writter for
|
42
|
+
# Writter for updated. By default, we keep the most recent update time found.
|
31
43
|
def updated=(val)
|
32
44
|
parsed = parse_datetime(val)
|
33
45
|
@updated = parsed if !@updated || parsed > @updated
|
@@ -2,9 +2,14 @@ module Feedzirra
|
|
2
2
|
module FeedUtilities
|
3
3
|
UPDATABLE_ATTRIBUTES = %w(title feed_url url last_modified)
|
4
4
|
|
5
|
-
attr_writer
|
5
|
+
attr_writer :updated, :last_modified, :entries
|
6
6
|
attr_accessor :etag
|
7
7
|
|
8
|
+
def initialize
|
9
|
+
@entries = []
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
8
13
|
def last_modified
|
9
14
|
@last_modified ||= begin
|
10
15
|
entry = entries.reject {|e| e.published.nil? }.sort_by { |entry| entry.published if entry.published }.last
|
@@ -12,12 +17,18 @@ module Feedzirra
|
|
12
17
|
end
|
13
18
|
end
|
14
19
|
|
20
|
+
[ :old, :new ].each do |flag|
|
21
|
+
define_method("mark_all_entries_#{flag}!") do # def mark_all_entries_new!
|
22
|
+
@entries.each{ |e| e.__send__(:"mark_#{flag}!") } # @entries.each {|e| e.mark_new! }
|
23
|
+
end # end
|
24
|
+
end
|
25
|
+
|
15
26
|
def updated?
|
16
27
|
@updated
|
17
28
|
end
|
18
29
|
|
19
30
|
def new_entries
|
20
|
-
@
|
31
|
+
@entries.select{ |e| e.new_entry? }
|
21
32
|
end
|
22
33
|
|
23
34
|
def has_new_entries?
|
@@ -25,8 +36,13 @@ module Feedzirra
|
|
25
36
|
end
|
26
37
|
|
27
38
|
def update_from_feed(feed)
|
28
|
-
|
29
|
-
|
39
|
+
# Mark all existing entries as old, then add new entries, which are
|
40
|
+
# marked as new by default.
|
41
|
+
self.entries.each{|e| e.mark_old! }
|
42
|
+
|
43
|
+
find_new_entries_for(feed).each do |e|
|
44
|
+
self.entries << e
|
45
|
+
end
|
30
46
|
|
31
47
|
updated! if UPDATABLE_ATTRIBUTES.any? { |name| update_attribute(feed, name) }
|
32
48
|
end
|
@@ -50,18 +66,14 @@ module Feedzirra
|
|
50
66
|
end
|
51
67
|
|
52
68
|
def find_new_entries_for(feed)
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
feed.entries.each do |entry|
|
61
|
-
break if entry.url == latest_entry.url
|
62
|
-
found_new_entries << entry
|
69
|
+
# This implementation is a hack to get around the fact that not all feeds
|
70
|
+
# have a published date - we exploit the fact that feeds are always
|
71
|
+
# ordered with newest element first to work backwards until we reach feed urls
|
72
|
+
# that we've already seen.
|
73
|
+
feed.entries.reverse.inject([]) do |res, entry|
|
74
|
+
break res if entry.url == self.entries.first.url
|
75
|
+
res << entry
|
63
76
|
end
|
64
|
-
found_new_entries
|
65
77
|
end
|
66
78
|
|
67
79
|
def existing_entry?(test_entry)
|
data/lib/feedzirra.rb
CHANGED
@@ -1,12 +1,44 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), %w[.. spec_helper])
|
2
2
|
|
3
3
|
describe Feedzirra::FeedUtilities do
|
4
|
-
before
|
4
|
+
before do
|
5
5
|
@klass = Class.new do
|
6
6
|
include Feedzirra::FeedEntryUtilities
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
+
describe "new_entry?" do
|
11
|
+
it "should default to being a new entry" do
|
12
|
+
@klass.new.new_entry?.should be_true
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#mark_old!" do
|
17
|
+
before do
|
18
|
+
@entry = @klass.new
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should make new_entry? return false" do
|
22
|
+
@entry.new_entry?.should be_true
|
23
|
+
@entry.mark_old!
|
24
|
+
@entry.new_entry?.should be_false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#mark_new!" do
|
29
|
+
before do
|
30
|
+
@entry = @klass.new
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should make new_entry? return true" do
|
34
|
+
@entry.new_entry?.should be_true
|
35
|
+
@entry.mark_old!
|
36
|
+
@entry.new_entry?.should be_false
|
37
|
+
@entry.mark_new!
|
38
|
+
@entry.new_entry?.should be_true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
10
42
|
describe "handling dates" do
|
11
43
|
it "should parse an ISO 8601 formatted datetime into Time" do
|
12
44
|
time = @klass.new.parse_datetime("2008-02-20T8:05:00-010:00")
|
@@ -16,7 +48,7 @@ describe Feedzirra::FeedUtilities do
|
|
16
48
|
end
|
17
49
|
|
18
50
|
describe "sanitizing" do
|
19
|
-
before
|
51
|
+
before do
|
20
52
|
@feed = Feedzirra::FeedParser.new(sample_atom_feed).run
|
21
53
|
@entry = @feed.entries.first
|
22
54
|
end
|
@@ -1,44 +1,37 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), %w[.. spec_helper])
|
2
2
|
|
3
3
|
describe Feedzirra::FeedUtilities do
|
4
|
-
before
|
4
|
+
before do
|
5
5
|
@klass = Class.new do
|
6
6
|
include Feedzirra::FeedUtilities
|
7
7
|
end
|
8
|
+
@feed = @klass.new
|
8
9
|
end
|
9
10
|
|
10
11
|
describe "instance methods" do
|
11
12
|
it "should provide an updated? accessor" do
|
12
|
-
feed
|
13
|
-
feed.
|
14
|
-
feed.
|
15
|
-
feed.should be_updated
|
16
|
-
end
|
17
|
-
|
18
|
-
it "should provide a new_entries accessor" do
|
19
|
-
feed = @klass.new
|
20
|
-
feed.new_entries.should == []
|
21
|
-
feed.new_entries = [:foo]
|
22
|
-
feed.new_entries.should == [:foo]
|
13
|
+
@feed.should_not be_updated
|
14
|
+
@feed.updated = true
|
15
|
+
@feed.should be_updated
|
23
16
|
end
|
24
17
|
|
25
18
|
it "should provide an etag accessor" do
|
26
|
-
feed =
|
27
|
-
feed.etag
|
28
|
-
feed.etag.should == "foo"
|
19
|
+
@feed.etag = "foo"
|
20
|
+
@feed.etag.should == "foo"
|
29
21
|
end
|
30
22
|
|
31
23
|
it "should provide a last_modified accessor" do
|
32
|
-
feed = @klass.new
|
24
|
+
@feed = @klass.new
|
33
25
|
time = Time.now
|
34
|
-
feed.last_modified = time
|
35
|
-
feed.last_modified.should == time
|
26
|
+
@feed.last_modified = time
|
27
|
+
@feed.last_modified.should == time
|
36
28
|
end
|
37
|
-
|
29
|
+
|
38
30
|
it "should return new_entries? as true when entries are put into new_entries" do
|
39
|
-
feed = @klass.new
|
40
|
-
|
41
|
-
feed.
|
31
|
+
@feed = @klass.new
|
32
|
+
feed_entry = Feedzirra::Parser::AtomEntry.new
|
33
|
+
@feed.instance_variable_set(:@entries, [ feed_entry ])
|
34
|
+
@feed.should have_new_entries
|
42
35
|
end
|
43
36
|
|
44
37
|
it "should return a last_modified value from the entry with the most recent published date if the last_modified date hasn't been set" do
|
@@ -59,9 +52,33 @@ describe Feedzirra::FeedUtilities do
|
|
59
52
|
end
|
60
53
|
end
|
61
54
|
|
55
|
+
describe "#mark_all_entries_old!" do
|
56
|
+
before do
|
57
|
+
@mock_entry = mock('entry')
|
58
|
+
@feed.entries = [ @mock_entry ]
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should call #mark_old! on all entries" do
|
62
|
+
@mock_entry.expects(:mark_old!)
|
63
|
+
@feed.mark_all_entries_old!
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "#mark_all_entries_new!" do
|
68
|
+
before do
|
69
|
+
@mock_entry = mock('entry')
|
70
|
+
@feed.entries = [ @mock_entry ]
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should call #mark_new! on all entries" do
|
74
|
+
@mock_entry.expects(:mark_new!)
|
75
|
+
@feed.mark_all_entries_new!
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
62
79
|
describe "#update_from_feed" do
|
63
80
|
describe "updating feed attributes" do
|
64
|
-
before
|
81
|
+
before do
|
65
82
|
# I'm using the Atom class when I know I should be using a different one. However, this update_from_feed
|
66
83
|
# method would only be called against a feed item.
|
67
84
|
@feed = Feedzirra::Parser::Atom.new
|
@@ -109,7 +126,7 @@ describe Feedzirra::FeedUtilities do
|
|
109
126
|
end
|
110
127
|
|
111
128
|
describe "updating entries" do
|
112
|
-
before
|
129
|
+
before do
|
113
130
|
# I'm using the Atom class when I know I should be using a different one. However, this update_from_feed
|
114
131
|
# method would only be called against a feed item.
|
115
132
|
@feed = Feedzirra::Parser::Atom.new
|
@@ -117,16 +134,24 @@ describe Feedzirra::FeedUtilities do
|
|
117
134
|
@feed.url = "http://pauldix.net"
|
118
135
|
@feed.feed_url = "http://feeds.feedburner.com/PaulDixExplainsNothing"
|
119
136
|
@feed.updated = false
|
120
|
-
|
137
|
+
|
138
|
+
# Using a clone or dup would only copy references to instance variables in the
|
139
|
+
# object, so we serialize and deserialize it here to avoid problems caused by
|
140
|
+
# variable references being passed around.
|
141
|
+
@updated_feed = Marshal.load(Marshal.dump(@feed))
|
142
|
+
|
121
143
|
@old_entry = Feedzirra::Parser::AtomEntry.new
|
122
144
|
@old_entry.url = "http://pauldix.net/old.html"
|
123
145
|
@old_entry.published = Time.now.to_s
|
146
|
+
|
124
147
|
@new_entry = Feedzirra::Parser::AtomEntry.new
|
125
148
|
@new_entry.url = "http://pauldix.net/new.html"
|
126
149
|
@new_entry.published = (Time.now + 10).to_s
|
150
|
+
|
127
151
|
@feed.entries << @old_entry
|
128
|
-
|
152
|
+
|
129
153
|
@updated_feed.entries << @old_entry
|
154
|
+
@updated_feed.entries << @new_entry
|
130
155
|
end
|
131
156
|
|
132
157
|
it "should update last-modified from the latest entry date" do
|