jsl-feedzirra 0.0.12.4 → 0.0.12.5
Sign up to get free protection for your applications and to get access to all the features.
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
|