pauldix-feedzirra 0.0.10 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +1 -1
- data/Rakefile +3 -0
- data/lib/feedzirra/feed.rb +11 -25
- data/lib/feedzirra/parser/atom.rb +26 -0
- data/lib/feedzirra/parser/atom_entry.rb +34 -0
- data/lib/feedzirra/parser/atom_feed_burner.rb +27 -0
- data/lib/feedzirra/parser/atom_feed_burner_entry.rb +35 -0
- data/lib/feedzirra/parser/itunes_rss.rb +50 -0
- data/lib/feedzirra/parser/itunes_rss_item.rb +31 -0
- data/lib/feedzirra/parser/itunes_rss_owner.rb +12 -0
- data/lib/feedzirra/parser/rss.rb +28 -0
- data/lib/feedzirra/parser/rss_entry.rb +40 -0
- data/lib/feedzirra.rb +10 -10
- data/spec/feedzirra/feed_spec.rb +30 -27
- data/spec/feedzirra/feed_utilities_spec.rb +9 -9
- data/spec/feedzirra/{atom_entry_spec.rb → parser/atom_entry_spec.rb} +3 -3
- data/spec/feedzirra/{atom_feed_burner_entry_spec.rb → parser/atom_feed_burner_entry_spec.rb} +4 -4
- data/spec/feedzirra/{atom_feed_burner_spec.rb → parser/atom_feed_burner_spec.rb} +6 -6
- data/spec/feedzirra/{atom_spec.rb → parser/atom_spec.rb} +5 -5
- data/spec/feedzirra/{itunes_rss_item_spec.rb → parser/itunes_rss_item_spec.rb} +3 -3
- data/spec/feedzirra/{itunes_rss_owner_spec.rb → parser/itunes_rss_owner_spec.rb} +3 -3
- data/spec/feedzirra/{itunes_rss_spec.rb → parser/itunes_rss_spec.rb} +5 -5
- data/spec/feedzirra/{rss_entry_spec.rb → parser/rss_entry_spec.rb} +3 -3
- data/spec/feedzirra/{rss_spec.rb → parser/rss_spec.rb} +5 -5
- metadata +19 -19
- data/lib/feedzirra/atom.rb +0 -22
- data/lib/feedzirra/atom_entry.rb +0 -29
- data/lib/feedzirra/atom_feed_burner.rb +0 -22
- data/lib/feedzirra/atom_feed_burner_entry.rb +0 -30
- data/lib/feedzirra/itunes_rss.rb +0 -46
- data/lib/feedzirra/itunes_rss_item.rb +0 -28
- data/lib/feedzirra/itunes_rss_owner.rb +0 -8
- data/lib/feedzirra/rss.rb +0 -23
- data/lib/feedzirra/rss_entry.rb +0 -35
data/README.textile
CHANGED
@@ -93,7 +93,7 @@ updated_feed.new_entries # a collection of the entry objects that are newer tha
|
|
93
93
|
|
94
94
|
# fetching multiple feeds
|
95
95
|
feed_urls = ["http://feeds.feedburner.com/PaulDixExplainsNothing", "http://feeds.feedburner.com/trottercashion"]
|
96
|
-
feeds = Feedzirra::Feed.fetch_and_parse(
|
96
|
+
feeds = Feedzirra::Feed.fetch_and_parse(feed_urls)
|
97
97
|
|
98
98
|
# feeds is now a hash with the feed_urls as keys and the parsed feed objects as values. If an error was thrown
|
99
99
|
# there will be a Fixnum of the http response code instead of a feed object
|
data/Rakefile
CHANGED
data/lib/feedzirra/feed.rb
CHANGED
@@ -46,7 +46,7 @@ module Feedzirra
|
|
46
46
|
# === Returns
|
47
47
|
# A array of class names.
|
48
48
|
def self.feed_classes
|
49
|
-
@feed_classes ||= [RSS, AtomFeedBurner, Atom]
|
49
|
+
@feed_classes ||= [Feedzirra::Parser::RSS, Feedzirra::Parser::AtomFeedBurner, Feedzirra::Parser::Atom]
|
50
50
|
end
|
51
51
|
|
52
52
|
# Makes all entry types look for the passed in element to parse. This is actually just a call to
|
@@ -58,25 +58,11 @@ module Feedzirra
|
|
58
58
|
def self.add_common_feed_entry_element(element_tag, options = {})
|
59
59
|
# need to think of a better way to do this. will break for people who want this behavior
|
60
60
|
# across their added classes
|
61
|
-
feed_classes.each do |klass|
|
61
|
+
feed_classes.map{|k| eval("#{k}Entry") }.each do |klass|
|
62
62
|
klass.send(:element, element_tag, options)
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
-
# Makes all entry types look for the passed in elements to parse. This is actually just a call to
|
67
|
-
# elements (a SAXMachine call) in the class
|
68
|
-
#
|
69
|
-
# === Parameters
|
70
|
-
# [element_tag<String>]
|
71
|
-
# [options<Hash>] Valid keys are same as with SAXMachine
|
72
|
-
def self.add_common_feed_entry_elements(element_tag, options = {})
|
73
|
-
# need to think of a better way to do this. will break for people who want this behavior
|
74
|
-
# across their added classes
|
75
|
-
[RSSEntry, AtomFeedBurnerEntry, AtomEntry].each do |klass|
|
76
|
-
klass.send(:elements, element_tag, options)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
66
|
# Fetches and returns the raw XML for each URL provided.
|
81
67
|
#
|
82
68
|
# === Parameters
|
@@ -115,7 +101,7 @@ module Feedzirra
|
|
115
101
|
end
|
116
102
|
|
117
103
|
multi.perform
|
118
|
-
|
104
|
+
urls.is_a?(String) ? responses.values.first : responses
|
119
105
|
end
|
120
106
|
|
121
107
|
# Fetches and returns the parsed XML for each URL provided.
|
@@ -123,11 +109,11 @@ module Feedzirra
|
|
123
109
|
# === Parameters
|
124
110
|
# [urls<String> or <Array>] A single feed URL, or an array of feed URLs.
|
125
111
|
# [options<Hash>] Valid keys for this argument as as followed:
|
126
|
-
#
|
127
|
-
#
|
128
|
-
#
|
129
|
-
#
|
130
|
-
#
|
112
|
+
# * :user_agent - String that overrides the default user agent.
|
113
|
+
# * :if_modified_since - Time object representing when the feed was last updated.
|
114
|
+
# * :if_none_match - String, an etag for the request that was stored previously.
|
115
|
+
# * :on_success - Block that gets executed after a successful request.
|
116
|
+
# * :on_failure - Block that gets executed after a failed request.
|
131
117
|
# === Returns
|
132
118
|
# A Feed object if a single URL is passed.
|
133
119
|
#
|
@@ -137,12 +123,12 @@ module Feedzirra
|
|
137
123
|
multi = Curl::Multi.new
|
138
124
|
responses = {}
|
139
125
|
|
140
|
-
# I broke these down so I would only try to do 30 simultaneously because
|
126
|
+
# I broke these down so I would only try to do 30 simultaneously because
|
141
127
|
# I was getting weird errors when doing a lot. As one finishes it pops another off the queue.
|
142
128
|
url_queue.slice!(0, 30).each do |url|
|
143
129
|
add_url_to_multi(multi, url, url_queue, responses, options)
|
144
130
|
end
|
145
|
-
|
131
|
+
|
146
132
|
multi.perform
|
147
133
|
return urls.is_a?(String) ? responses.values.first : responses
|
148
134
|
end
|
@@ -194,7 +180,7 @@ module Feedzirra
|
|
194
180
|
end
|
195
181
|
|
196
182
|
multi.perform
|
197
|
-
|
183
|
+
responses.size == 1 ? responses.values.first : responses.values
|
198
184
|
end
|
199
185
|
|
200
186
|
# An abstraction for adding a feed by URL to the passed Curb::multi stack.
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Feedzirra
|
2
|
+
|
3
|
+
module Parser
|
4
|
+
# == Summary
|
5
|
+
# Parser for dealing with Atom feeds.
|
6
|
+
#
|
7
|
+
# == Attributes
|
8
|
+
# * title
|
9
|
+
# * feed_url
|
10
|
+
# * url
|
11
|
+
# * entries
|
12
|
+
class Atom
|
13
|
+
include SAXMachine
|
14
|
+
include FeedUtilities
|
15
|
+
element :title
|
16
|
+
element :link, :as => :url, :value => :href, :with => {:type => "text/html"}
|
17
|
+
element :link, :as => :feed_url, :value => :href, :with => {:type => "application/atom+xml"}
|
18
|
+
elements :entry, :as => :entries, :class => AtomEntry
|
19
|
+
|
20
|
+
def self.able_to_parse?(xml) #:nodoc:
|
21
|
+
xml =~ /(Atom)|(#{Regexp.escape("http://purl.org/atom")})/
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Feedzirra
|
2
|
+
|
3
|
+
module Parser
|
4
|
+
# == Summary
|
5
|
+
# Parser for dealing with Atom feed entries.
|
6
|
+
#
|
7
|
+
# == Attributes
|
8
|
+
# * title
|
9
|
+
# * url
|
10
|
+
# * author
|
11
|
+
# * content
|
12
|
+
# * summary
|
13
|
+
# * published
|
14
|
+
# * categories
|
15
|
+
class AtomEntry
|
16
|
+
include SAXMachine
|
17
|
+
include FeedEntryUtilities
|
18
|
+
element :title
|
19
|
+
element :link, :as => :url, :value => :href, :with => {:type => "text/html", :rel => "alternate"}
|
20
|
+
element :name, :as => :author
|
21
|
+
element :content
|
22
|
+
element :summary
|
23
|
+
element :published
|
24
|
+
element :id
|
25
|
+
element :created, :as => :published
|
26
|
+
element :issued, :as => :published
|
27
|
+
element :updated
|
28
|
+
element :modified, :as => :updated
|
29
|
+
elements :category, :as => :categories, :value => :term
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Feedzirra
|
2
|
+
|
3
|
+
module Parser
|
4
|
+
# == Summary
|
5
|
+
# Parser for dealing with Feedburner Atom feeds.
|
6
|
+
#
|
7
|
+
# == Attributes
|
8
|
+
# * title
|
9
|
+
# * feed_url
|
10
|
+
# * url
|
11
|
+
# * entries
|
12
|
+
class AtomFeedBurner
|
13
|
+
include SAXMachine
|
14
|
+
include FeedUtilities
|
15
|
+
element :title
|
16
|
+
element :link, :as => :url, :value => :href, :with => {:type => "text/html"}
|
17
|
+
element :link, :as => :feed_url, :value => :href, :with => {:type => "application/atom+xml"}
|
18
|
+
elements :entry, :as => :entries, :class => AtomFeedBurnerEntry
|
19
|
+
|
20
|
+
def self.able_to_parse?(xml) #:nodoc:
|
21
|
+
(xml =~ /Atom/ && xml =~ /feedburner/) || false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Feedzirra
|
2
|
+
|
3
|
+
module Parser
|
4
|
+
# == Summary
|
5
|
+
# Parser for dealing with Feedburner Atom feed entries.
|
6
|
+
#
|
7
|
+
# == Attributes
|
8
|
+
# * title
|
9
|
+
# * url
|
10
|
+
# * author
|
11
|
+
# * content
|
12
|
+
# * summary
|
13
|
+
# * published
|
14
|
+
# * categories
|
15
|
+
class AtomFeedBurnerEntry
|
16
|
+
include SAXMachine
|
17
|
+
include FeedEntryUtilities
|
18
|
+
element :title
|
19
|
+
element :name, :as => :author
|
20
|
+
element :link, :as => :url, :value => :href, :with => {:type => "text/html", :rel => "alternate"}
|
21
|
+
element :"feedburner:origLink", :as => :url
|
22
|
+
element :summary
|
23
|
+
element :content
|
24
|
+
element :published
|
25
|
+
element :id
|
26
|
+
element :issued, :as => :published
|
27
|
+
element :created, :as => :published
|
28
|
+
element :updated
|
29
|
+
element :modified, :as => :updated
|
30
|
+
elements :category, :as => :categories, :value => :term
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Feedzirra
|
2
|
+
|
3
|
+
module Parser
|
4
|
+
# iTunes is RSS 2.0 + some apple extensions
|
5
|
+
# Source: http://www.apple.com/itunes/whatson/podcasts/specs.html
|
6
|
+
class ITunesRSS
|
7
|
+
include SAXMachine
|
8
|
+
include FeedUtilities
|
9
|
+
|
10
|
+
attr_accessor :feed_url
|
11
|
+
|
12
|
+
# RSS 2.0 elements that need including
|
13
|
+
element :copyright
|
14
|
+
element :description
|
15
|
+
element :language
|
16
|
+
element :managingEditor
|
17
|
+
element :title
|
18
|
+
element :link, :as => :url
|
19
|
+
|
20
|
+
# If author is not present use managingEditor on the channel
|
21
|
+
element :"itunes:author", :as => :itunes_author
|
22
|
+
element :"itunes:block", :as => :itunes_block
|
23
|
+
element :"itunes:image", :value => :href, :as => :itunes_image
|
24
|
+
element :"itunes:explicit", :as => :itunes_explicit
|
25
|
+
element :"itunes:keywords", :as => :itunes_keywords
|
26
|
+
# New URL for the podcast feed
|
27
|
+
element :"itunes:new-feed-url", :as => :itunes_new_feed_url
|
28
|
+
element :"itunes:subtitle", :as => :itunes_subtitle
|
29
|
+
# If summary is not present, use the description tag
|
30
|
+
element :"itunes:summary", :as => :itunes_summary
|
31
|
+
|
32
|
+
# iTunes RSS feeds can have multiple main categories...
|
33
|
+
# ...and multiple sub-categories per category
|
34
|
+
# TODO subcategories not supported correctly - they are at the same level
|
35
|
+
# as the main categories
|
36
|
+
elements :"itunes:category", :as => :itunes_categories, :value => :text
|
37
|
+
|
38
|
+
elements :"itunes:owner", :as => :itunes_owners, :class => ITunesRSSOwner
|
39
|
+
|
40
|
+
elements :item, :as => :entries, :class => ITunesRSSItem
|
41
|
+
|
42
|
+
def self.able_to_parse?(xml)
|
43
|
+
xml =~ /xmlns:itunes=\"http:\/\/www.itunes.com\/dtds\/podcast-1.0.dtd\"/
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Feedzirra
|
2
|
+
|
3
|
+
module Parser
|
4
|
+
# iTunes extensions to the standard RSS2.0 item
|
5
|
+
# Source: http://www.apple.com/itunes/whatson/podcasts/specs.html
|
6
|
+
class ITunesRSSItem
|
7
|
+
include SAXMachine
|
8
|
+
include FeedUtilities
|
9
|
+
element :author
|
10
|
+
element :guid
|
11
|
+
element :title
|
12
|
+
element :link, :as => :url
|
13
|
+
element :description, :as => :summary
|
14
|
+
element :pubDate, :as => :published
|
15
|
+
|
16
|
+
# If author is not present use author tag on the item
|
17
|
+
element :"itunes:author", :as => :itunes_author
|
18
|
+
element :"itunes:block", :as => :itunes_block
|
19
|
+
element :"itunes:duration", :as => :itunes_duration
|
20
|
+
element :"itunes:explicit", :as => :itunes_explicit
|
21
|
+
element :"itunes:keywords", :as => :itunes_keywords
|
22
|
+
element :"itunes:subtitle", :as => :itunes_subtitle
|
23
|
+
# If summary is not present, use the description tag
|
24
|
+
element :"itunes:summary", :as => :itunes_summary
|
25
|
+
element :enclosure, :value => :length, :as => :enclosure_length
|
26
|
+
element :enclosure, :value => :type, :as => :enclosure_type
|
27
|
+
element :enclosure, :value => :url, :as => :enclosure_url
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Feedzirra
|
2
|
+
|
3
|
+
module Parser
|
4
|
+
# == Summary
|
5
|
+
# Parser for dealing with RSS feeds.
|
6
|
+
#
|
7
|
+
# == Attributes
|
8
|
+
# * title
|
9
|
+
# * feed_url
|
10
|
+
# * url
|
11
|
+
# * entries
|
12
|
+
class RSS
|
13
|
+
include SAXMachine
|
14
|
+
include FeedUtilities
|
15
|
+
element :title
|
16
|
+
element :link, :as => :url
|
17
|
+
elements :item, :as => :entries, :class => RSSEntry
|
18
|
+
|
19
|
+
attr_accessor :feed_url
|
20
|
+
|
21
|
+
def self.able_to_parse?(xml) #:nodoc:
|
22
|
+
xml =~ /\<rss|rdf/
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Feedzirra
|
2
|
+
|
3
|
+
module Parser
|
4
|
+
# == Summary
|
5
|
+
# Parser for dealing with RDF feed entries.
|
6
|
+
#
|
7
|
+
# == Attributes
|
8
|
+
# * title
|
9
|
+
# * url
|
10
|
+
# * author
|
11
|
+
# * content
|
12
|
+
# * summary
|
13
|
+
# * published
|
14
|
+
# * categories
|
15
|
+
class RSSEntry
|
16
|
+
include SAXMachine
|
17
|
+
include FeedEntryUtilities
|
18
|
+
element :title
|
19
|
+
element :link, :as => :url
|
20
|
+
|
21
|
+
element :"dc:creator", :as => :author
|
22
|
+
element :"content:encoded", :as => :content
|
23
|
+
element :description, :as => :summary
|
24
|
+
|
25
|
+
element :pubDate, :as => :published
|
26
|
+
element :"dc:date", :as => :published
|
27
|
+
element :"dc:Date", :as => :published
|
28
|
+
element :"dcterms:created", :as => :published
|
29
|
+
|
30
|
+
|
31
|
+
element :"dcterms:modified", :as => :updated
|
32
|
+
element :issued, :as => :published
|
33
|
+
elements :category, :as => :categories
|
34
|
+
|
35
|
+
element :guid, :as => :id
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
data/lib/feedzirra.rb
CHANGED
@@ -18,17 +18,17 @@ require 'feedzirra/feed_utilities'
|
|
18
18
|
require 'feedzirra/feed_entry_utilities'
|
19
19
|
require 'feedzirra/feed'
|
20
20
|
|
21
|
-
require 'feedzirra/rss_entry'
|
22
|
-
require 'feedzirra/itunes_rss_owner'
|
23
|
-
require 'feedzirra/itunes_rss_item'
|
24
|
-
require 'feedzirra/atom_entry'
|
25
|
-
require 'feedzirra/atom_feed_burner_entry'
|
21
|
+
require 'feedzirra/parser/rss_entry'
|
22
|
+
require 'feedzirra/parser/itunes_rss_owner'
|
23
|
+
require 'feedzirra/parser/itunes_rss_item'
|
24
|
+
require 'feedzirra/parser/atom_entry'
|
25
|
+
require 'feedzirra/parser/atom_feed_burner_entry'
|
26
26
|
|
27
|
-
require 'feedzirra/rss'
|
28
|
-
require 'feedzirra/itunes_rss'
|
29
|
-
require 'feedzirra/atom'
|
30
|
-
require 'feedzirra/atom_feed_burner'
|
27
|
+
require 'feedzirra/parser/rss'
|
28
|
+
require 'feedzirra/parser/itunes_rss'
|
29
|
+
require 'feedzirra/parser/atom'
|
30
|
+
require 'feedzirra/parser/atom_feed_burner'
|
31
31
|
|
32
32
|
module Feedzirra
|
33
|
-
VERSION = "0.0.
|
33
|
+
VERSION = "0.0.12"
|
34
34
|
end
|
data/spec/feedzirra/feed_spec.rb
CHANGED
@@ -11,11 +11,11 @@ describe Feedzirra::Feed do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should parse the added element out of Atom Feedburner feeds" do
|
14
|
-
Feedzirra::AtomEntry.new.should respond_to(:comment_rss)
|
14
|
+
Feedzirra::Parser::AtomEntry.new.should respond_to(:comment_rss)
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should parse the added element out of RSS feeds" do
|
18
|
-
Feedzirra::RSSEntry.new.should respond_to(:comment_rss)
|
18
|
+
Feedzirra::Parser::RSSEntry.new.should respond_to(:comment_rss)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
@@ -49,11 +49,14 @@ describe Feedzirra::Feed do
|
|
49
49
|
feed.entries.size.should == 5
|
50
50
|
end
|
51
51
|
|
52
|
-
it "should parse an itunes feed" do
|
52
|
+
it "should parse an itunes feed as a standard RSS feed" do
|
53
53
|
feed = Feedzirra::Feed.parse(sample_itunes_feed)
|
54
54
|
feed.title.should == "All About Everything"
|
55
|
-
feed.entries.first.published.
|
56
|
-
|
55
|
+
feed.entries.first.published.should == Time.parse("Wed, 15 Jun 2005 19:00:00 GMT")
|
56
|
+
|
57
|
+
# Since the commit 621957879, iTunes feeds will be parsed as standard RSS, so this
|
58
|
+
# entry should now not have a method for itunes_author.
|
59
|
+
feed.entries.first.should_not respond_to(:itunes_author)
|
57
60
|
feed.entries.size.should == 3
|
58
61
|
end
|
59
62
|
end
|
@@ -75,28 +78,28 @@ describe Feedzirra::Feed do
|
|
75
78
|
end
|
76
79
|
|
77
80
|
describe "#determine_feed_parser_for_xml" do
|
78
|
-
it "should return the Feedzirra::Atom class for an atom feed" do
|
79
|
-
Feedzirra::Feed.determine_feed_parser_for_xml(sample_atom_feed).should == Feedzirra::Atom
|
81
|
+
it "should return the Feedzirra::Parser::Atom class for an atom feed" do
|
82
|
+
Feedzirra::Feed.determine_feed_parser_for_xml(sample_atom_feed).should == Feedzirra::Parser::Atom
|
80
83
|
end
|
81
84
|
|
82
|
-
it "should return the Feedzirra::AtomFeedBurner class for an atom feedburner feed" do
|
83
|
-
Feedzirra::Feed.determine_feed_parser_for_xml(sample_feedburner_atom_feed).should == Feedzirra::AtomFeedBurner
|
85
|
+
it "should return the Feedzirra::Parser::AtomFeedBurner class for an atom feedburner feed" do
|
86
|
+
Feedzirra::Feed.determine_feed_parser_for_xml(sample_feedburner_atom_feed).should == Feedzirra::Parser::AtomFeedBurner
|
84
87
|
end
|
85
88
|
|
86
|
-
it "should return the Feedzirra::RSS class for an rdf/rss 1.0 feed" do
|
87
|
-
Feedzirra::Feed.determine_feed_parser_for_xml(sample_rdf_feed).should == Feedzirra::RSS
|
89
|
+
it "should return the Feedzirra::Parser::RSS class for an rdf/rss 1.0 feed" do
|
90
|
+
Feedzirra::Feed.determine_feed_parser_for_xml(sample_rdf_feed).should == Feedzirra::Parser::RSS
|
88
91
|
end
|
89
92
|
|
90
|
-
it "should return the Feedzirra::RSS class for an rss feedburner feed" do
|
91
|
-
Feedzirra::Feed.determine_feed_parser_for_xml(sample_rss_feed_burner_feed).should == Feedzirra::RSS
|
93
|
+
it "should return the Feedzirra::Parser::RSS class for an rss feedburner feed" do
|
94
|
+
Feedzirra::Feed.determine_feed_parser_for_xml(sample_rss_feed_burner_feed).should == Feedzirra::Parser::RSS
|
92
95
|
end
|
93
96
|
|
94
|
-
it "should return the Feedzirra::RSS object for an rss 2.0 feed" do
|
95
|
-
Feedzirra::Feed.determine_feed_parser_for_xml(sample_rss_feed).should == Feedzirra::RSS
|
97
|
+
it "should return the Feedzirra::Parser::RSS object for an rss 2.0 feed" do
|
98
|
+
Feedzirra::Feed.determine_feed_parser_for_xml(sample_rss_feed).should == Feedzirra::Parser::RSS
|
96
99
|
end
|
97
100
|
|
98
|
-
it "should return
|
99
|
-
Feedzirra::Feed.determine_feed_parser_for_xml(sample_itunes_feed).should == Feedzirra::
|
101
|
+
it "should return a Feedzirra::Parser::RSS object for an itunes feed" do
|
102
|
+
Feedzirra::Feed.determine_feed_parser_for_xml(sample_itunes_feed).should == Feedzirra::Parser::RSS
|
100
103
|
end
|
101
104
|
|
102
105
|
end
|
@@ -104,7 +107,7 @@ describe Feedzirra::Feed do
|
|
104
107
|
describe "when adding feed types" do
|
105
108
|
it "should prioritize added types over the built in ones" do
|
106
109
|
feed_text = "Atom asdf"
|
107
|
-
Feedzirra::Atom.should be_able_to_parse(feed_text)
|
110
|
+
Feedzirra::Parser::Atom.should be_able_to_parse(feed_text)
|
108
111
|
new_feed_type = Class.new do
|
109
112
|
def self.able_to_parse?(val)
|
110
113
|
true
|
@@ -193,7 +196,7 @@ describe Feedzirra::Feed do
|
|
193
196
|
end
|
194
197
|
|
195
198
|
it 'should set accepted encodings' do
|
196
|
-
Feedzirra::Feed.fetch_raw(@paul_feed[:url])
|
199
|
+
Feedzirra::Feed.fetch_raw(@paul_feed[:url], :compress => true)
|
197
200
|
@curl.headers["Accept-encoding"].should == 'gzip, deflate'
|
198
201
|
end
|
199
202
|
|
@@ -265,7 +268,7 @@ describe Feedzirra::Feed do
|
|
265
268
|
end
|
266
269
|
|
267
270
|
it 'should set accepted encodings' do
|
268
|
-
Feedzirra::Feed.add_url_to_multi(@multi, @paul_feed[:url], [], {}, {})
|
271
|
+
Feedzirra::Feed.add_url_to_multi(@multi, @paul_feed[:url], [], {}, {:compress => true})
|
269
272
|
@easy_curl.headers["Accept-encoding"].should == 'gzip, deflate'
|
270
273
|
end
|
271
274
|
|
@@ -278,8 +281,8 @@ describe Feedzirra::Feed do
|
|
278
281
|
before(:each) do
|
279
282
|
@feed = mock('feed', :feed_url= => true, :etag= => true, :last_modified= => true)
|
280
283
|
Feedzirra::Feed.stub!(:decode_content).and_return(@paul_feed[:xml])
|
281
|
-
Feedzirra::Feed.stub!(:determine_feed_parser_for_xml).and_return(Feedzirra::AtomFeedBurner)
|
282
|
-
Feedzirra::AtomFeedBurner.stub!(:parse).and_return(@feed)
|
284
|
+
Feedzirra::Feed.stub!(:determine_feed_parser_for_xml).and_return(Feedzirra::Parser::AtomFeedBurner)
|
285
|
+
Feedzirra::Parser::AtomFeedBurner.stub!(:parse).and_return(@feed)
|
283
286
|
Feedzirra::Feed.stub!(:etag_from_header).and_return('ziEyTl4q9GH04BR4jgkImd0GvSE')
|
284
287
|
Feedzirra::Feed.stub!(:last_modified_from_header).and_return('Wed, 28 Jan 2009 04:10:32 GMT')
|
285
288
|
end
|
@@ -291,13 +294,13 @@ describe Feedzirra::Feed do
|
|
291
294
|
end
|
292
295
|
|
293
296
|
it 'should determine the xml parser class' do
|
294
|
-
Feedzirra::Feed.should_receive(:determine_feed_parser_for_xml).with(@paul_feed[:xml]).and_return(Feedzirra::AtomFeedBurner)
|
297
|
+
Feedzirra::Feed.should_receive(:determine_feed_parser_for_xml).with(@paul_feed[:xml]).and_return(Feedzirra::Parser::AtomFeedBurner)
|
295
298
|
Feedzirra::Feed.add_url_to_multi(@multi, @paul_feed[:url], [], {}, {})
|
296
299
|
@easy_curl.on_success.call(@easy_curl)
|
297
300
|
end
|
298
301
|
|
299
302
|
it 'should parse the xml' do
|
300
|
-
Feedzirra::AtomFeedBurner.should_receive(:parse).with(@paul_feed[:xml]).and_return(@feed)
|
303
|
+
Feedzirra::Parser::AtomFeedBurner.should_receive(:parse).with(@paul_feed[:xml]).and_return(@feed)
|
301
304
|
Feedzirra::Feed.add_url_to_multi(@multi, @paul_feed[:url], [], {}, {})
|
302
305
|
@easy_curl.on_success.call(@easy_curl)
|
303
306
|
end
|
@@ -415,8 +418,8 @@ describe Feedzirra::Feed do
|
|
415
418
|
@new_feed = @feed.clone
|
416
419
|
@feed.stub!(:update_from_feed)
|
417
420
|
Feedzirra::Feed.stub!(:decode_content).and_return(@paul_feed[:xml])
|
418
|
-
Feedzirra::Feed.stub!(:determine_feed_parser_for_xml).and_return(Feedzirra::AtomFeedBurner)
|
419
|
-
Feedzirra::AtomFeedBurner.stub!(:parse).and_return(@new_feed)
|
421
|
+
Feedzirra::Feed.stub!(:determine_feed_parser_for_xml).and_return(Feedzirra::Parser::AtomFeedBurner)
|
422
|
+
Feedzirra::Parser::AtomFeedBurner.stub!(:parse).and_return(@new_feed)
|
420
423
|
Feedzirra::Feed.stub!(:etag_from_header).and_return('ziEyTl4q9GH04BR4jgkImd0GvSE')
|
421
424
|
Feedzirra::Feed.stub!(:last_modified_from_header).and_return('Wed, 28 Jan 2009 04:10:32 GMT')
|
422
425
|
end
|
@@ -424,7 +427,7 @@ describe Feedzirra::Feed do
|
|
424
427
|
it 'should process the next feed in the queue'
|
425
428
|
|
426
429
|
it 'should parse the updated feed' do
|
427
|
-
Feedzirra::AtomFeedBurner.should_receive(:parse).and_return(@new_feed)
|
430
|
+
Feedzirra::Parser::AtomFeedBurner.should_receive(:parse).and_return(@new_feed)
|
428
431
|
Feedzirra::Feed.add_feed_to_multi(@multi, @feed, [], {}, {})
|
429
432
|
@easy_curl.on_success.call(@easy_curl)
|
430
433
|
end
|
@@ -42,19 +42,19 @@ describe Feedzirra::FeedUtilities do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
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
|
45
|
-
feed = Feedzirra::Atom.new
|
46
|
-
entry =Feedzirra::AtomEntry.new
|
45
|
+
feed = Feedzirra::Parser::Atom.new
|
46
|
+
entry =Feedzirra::Parser::AtomEntry.new
|
47
47
|
entry.published = Time.now.to_s
|
48
48
|
feed.entries << entry
|
49
49
|
feed.last_modified.should == entry.published
|
50
50
|
end
|
51
51
|
|
52
52
|
it "should not throw an error if one of the entries has published date of nil" do
|
53
|
-
feed = Feedzirra::Atom.new
|
54
|
-
entry = Feedzirra::AtomEntry.new
|
53
|
+
feed = Feedzirra::Parser::Atom.new
|
54
|
+
entry = Feedzirra::Parser::AtomEntry.new
|
55
55
|
entry.published = Time.now.to_s
|
56
56
|
feed.entries << entry
|
57
|
-
feed.entries << Feedzirra::AtomEntry.new
|
57
|
+
feed.entries << Feedzirra::Parser::AtomEntry.new
|
58
58
|
feed.last_modified.should == entry.published
|
59
59
|
end
|
60
60
|
end
|
@@ -64,7 +64,7 @@ describe Feedzirra::FeedUtilities do
|
|
64
64
|
before(:each) do
|
65
65
|
# I'm using the Atom class when I know I should be using a different one. However, this update_from_feed
|
66
66
|
# method would only be called against a feed item.
|
67
|
-
@feed = Feedzirra::Atom.new
|
67
|
+
@feed = Feedzirra::Parser::Atom.new
|
68
68
|
@feed.title = "A title"
|
69
69
|
@feed.url = "http://pauldix.net"
|
70
70
|
@feed.feed_url = "http://feeds.feedburner.com/PaulDixExplainsNothing"
|
@@ -112,16 +112,16 @@ describe Feedzirra::FeedUtilities do
|
|
112
112
|
before(:each) do
|
113
113
|
# I'm using the Atom class when I know I should be using a different one. However, this update_from_feed
|
114
114
|
# method would only be called against a feed item.
|
115
|
-
@feed = Feedzirra::Atom.new
|
115
|
+
@feed = Feedzirra::Parser::Atom.new
|
116
116
|
@feed.title = "A title"
|
117
117
|
@feed.url = "http://pauldix.net"
|
118
118
|
@feed.feed_url = "http://feeds.feedburner.com/PaulDixExplainsNothing"
|
119
119
|
@feed.updated = false
|
120
120
|
@updated_feed = @feed.dup
|
121
|
-
@old_entry = Feedzirra::AtomEntry.new
|
121
|
+
@old_entry = Feedzirra::Parser::AtomEntry.new
|
122
122
|
@old_entry.url = "http://pauldix.net/old.html"
|
123
123
|
@old_entry.published = Time.now.to_s
|
124
|
-
@new_entry = Feedzirra::AtomEntry.new
|
124
|
+
@new_entry = Feedzirra::Parser::AtomEntry.new
|
125
125
|
@new_entry.url = "http://pauldix.net/new.html"
|
126
126
|
@new_entry.published = (Time.now + 10).to_s
|
127
127
|
@feed.entries << @old_entry
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
|
2
2
|
|
3
|
-
describe Feedzirra::AtomEntry do
|
3
|
+
describe Feedzirra::Parser::AtomEntry do
|
4
4
|
before(:each) do
|
5
5
|
# I don't really like doing it this way because these unit test should only rely on AtomEntry,
|
6
6
|
# but this is actually how it should work. You would never just pass entry xml straight to the AtomEnry
|
7
|
-
@entry = Feedzirra::Atom.parse(sample_atom_feed).entries.first
|
7
|
+
@entry = Feedzirra::Parser::Atom.parse(sample_atom_feed).entries.first
|
8
8
|
end
|
9
9
|
|
10
10
|
it "should parse the title" do
|
data/spec/feedzirra/{atom_feed_burner_entry_spec.rb → parser/atom_feed_burner_entry_spec.rb}
RENAMED
@@ -1,10 +1,10 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
|
2
2
|
|
3
|
-
describe Feedzirra::AtomFeedBurnerEntry do
|
3
|
+
describe Feedzirra::Parser::AtomFeedBurnerEntry do
|
4
4
|
before(:each) do
|
5
5
|
# I don't really like doing it this way because these unit test should only rely on AtomEntry,
|
6
6
|
# but this is actually how it should work. You would never just pass entry xml straight to the AtomEnry
|
7
|
-
@entry = Feedzirra::AtomFeedBurner.parse(sample_feedburner_atom_feed).entries.first
|
7
|
+
@entry = Feedzirra::Parser::AtomFeedBurner.parse(sample_feedburner_atom_feed).entries.first
|
8
8
|
end
|
9
9
|
|
10
10
|
it "should parse the title" do
|
@@ -12,7 +12,7 @@ describe Feedzirra::AtomFeedBurnerEntry do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it "should be able to fetch a url via the 'alternate' rel if no origLink exists" do
|
15
|
-
entry = Feedzirra::AtomFeedBurner.parse(File.read("#{File.dirname(__FILE__)}
|
15
|
+
entry = Feedzirra::Parser::AtomFeedBurner.parse(File.read("#{File.dirname(__FILE__)}/../../sample_feeds/PaulDixExplainsNothingAlternate.xml")).entries.first
|
16
16
|
entry.url.should == 'http://feeds.feedburner.com/~r/PaulDixExplainsNothing/~3/519925023/making-a-ruby-c-library-even-faster.html'
|
17
17
|
end
|
18
18
|
|
@@ -1,23 +1,23 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
|
2
2
|
|
3
|
-
describe Feedzirra::AtomFeedBurner do
|
3
|
+
describe Feedzirra::Parser::AtomFeedBurner do
|
4
4
|
describe "#will_parse?" do
|
5
5
|
it "should return true for a feedburner atom feed" do
|
6
|
-
Feedzirra::AtomFeedBurner.should be_able_to_parse(sample_feedburner_atom_feed)
|
6
|
+
Feedzirra::Parser::AtomFeedBurner.should be_able_to_parse(sample_feedburner_atom_feed)
|
7
7
|
end
|
8
8
|
|
9
9
|
it "should return false for an rdf feed" do
|
10
|
-
Feedzirra::AtomFeedBurner.should_not be_able_to_parse(sample_rdf_feed)
|
10
|
+
Feedzirra::Parser::AtomFeedBurner.should_not be_able_to_parse(sample_rdf_feed)
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should return false for a regular atom feed" do
|
14
|
-
Feedzirra::AtomFeedBurner.should_not be_able_to_parse(sample_atom_feed)
|
14
|
+
Feedzirra::Parser::AtomFeedBurner.should_not be_able_to_parse(sample_atom_feed)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
describe "parsing" do
|
19
19
|
before(:each) do
|
20
|
-
@feed = Feedzirra::AtomFeedBurner.parse(sample_feedburner_atom_feed)
|
20
|
+
@feed = Feedzirra::Parser::AtomFeedBurner.parse(sample_feedburner_atom_feed)
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should parse the title" do
|
@@ -1,19 +1,19 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
|
2
2
|
|
3
|
-
describe Feedzirra::Atom do
|
3
|
+
describe Feedzirra::Parser::Atom do
|
4
4
|
describe "#will_parse?" do
|
5
5
|
it "should return true for an atom feed" do
|
6
|
-
Feedzirra::Atom.should be_able_to_parse(sample_atom_feed)
|
6
|
+
Feedzirra::Parser::Atom.should be_able_to_parse(sample_atom_feed)
|
7
7
|
end
|
8
8
|
|
9
9
|
it "should return false for an rdf feed" do
|
10
|
-
Feedzirra::Atom.should_not be_able_to_parse(sample_rdf_feed)
|
10
|
+
Feedzirra::Parser::Atom.should_not be_able_to_parse(sample_rdf_feed)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
describe "parsing" do
|
15
15
|
before(:each) do
|
16
|
-
@feed = Feedzirra::Atom.parse(sample_atom_feed)
|
16
|
+
@feed = Feedzirra::Parser::Atom.parse(sample_atom_feed)
|
17
17
|
end
|
18
18
|
|
19
19
|
it "should parse the title" do
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
|
2
2
|
|
3
|
-
describe Feedzirra::ITunesRSSItem do
|
3
|
+
describe Feedzirra::Parser::ITunesRSSItem do
|
4
4
|
before(:each) do
|
5
5
|
# I don't really like doing it this way because these unit test should only rely on ITunesRssItem,
|
6
6
|
# but this is actually how it should work. You would never just pass entry xml straight to the ITunesRssItem
|
7
|
-
@item = Feedzirra::ITunesRSS.parse(sample_itunes_feed).entries.first
|
7
|
+
@item = Feedzirra::Parser::ITunesRSS.parse(sample_itunes_feed).entries.first
|
8
8
|
end
|
9
9
|
|
10
10
|
it "should parse the title" do
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
|
2
2
|
|
3
|
-
describe Feedzirra::ITunesRSSOwner do
|
3
|
+
describe Feedzirra::Parser::ITunesRSSOwner do
|
4
4
|
before(:each) do
|
5
5
|
# I don't really like doing it this way because these unit test should only rely on RSSEntry,
|
6
6
|
# but this is actually how it should work. You would never just pass entry xml straight to the ITunesRssOwner
|
7
|
-
@owner = Feedzirra::ITunesRSS.parse(sample_itunes_feed).itunes_owners.first
|
7
|
+
@owner = Feedzirra::Parser::ITunesRSS.parse(sample_itunes_feed).itunes_owners.first
|
8
8
|
end
|
9
9
|
|
10
10
|
it "should parse the name" do
|
@@ -1,19 +1,19 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
|
2
2
|
|
3
|
-
describe Feedzirra::ITunesRSS do
|
3
|
+
describe Feedzirra::Parser::ITunesRSS do
|
4
4
|
describe "#will_parse?" do
|
5
5
|
it "should return true for an itunes RSS feed" do
|
6
|
-
Feedzirra::ITunesRSS.should be_able_to_parse(sample_itunes_feed)
|
6
|
+
Feedzirra::Parser::ITunesRSS.should be_able_to_parse(sample_itunes_feed)
|
7
7
|
end
|
8
8
|
|
9
9
|
it "should return fase for an atom feed" do
|
10
|
-
Feedzirra::ITunesRSS.should_not be_able_to_parse(sample_atom_feed)
|
10
|
+
Feedzirra::Parser::ITunesRSS.should_not be_able_to_parse(sample_atom_feed)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
describe "parsing" do
|
15
15
|
before(:each) do
|
16
|
-
@feed = Feedzirra::ITunesRSS.parse(sample_itunes_feed)
|
16
|
+
@feed = Feedzirra::Parser::ITunesRSS.parse(sample_itunes_feed)
|
17
17
|
end
|
18
18
|
|
19
19
|
it "should parse the subtitle" do
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
|
2
2
|
|
3
|
-
describe Feedzirra::RSSEntry do
|
3
|
+
describe Feedzirra::Parser::RSSEntry do
|
4
4
|
before(:each) do
|
5
5
|
# I don't really like doing it this way because these unit test should only rely on RSSEntry,
|
6
6
|
# but this is actually how it should work. You would never just pass entry xml straight to the AtomEnry
|
7
|
-
@entry = Feedzirra::RSS.parse(sample_rss_feed).entries.first
|
7
|
+
@entry = Feedzirra::Parser::RSS.parse(sample_rss_feed).entries.first
|
8
8
|
end
|
9
9
|
|
10
10
|
it "should parse the title" do
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
|
2
2
|
|
3
|
-
describe Feedzirra::RSS do
|
3
|
+
describe Feedzirra::Parser::RSS do
|
4
4
|
describe "#will_parse?" do
|
5
5
|
it "should return true for an RSS feed" do
|
6
|
-
Feedzirra::RSS.should be_able_to_parse(sample_rss_feed)
|
6
|
+
Feedzirra::Parser::RSS.should be_able_to_parse(sample_rss_feed)
|
7
7
|
end
|
8
8
|
|
9
9
|
# this is no longer true. combined rdf and rss into one
|
@@ -12,13 +12,13 @@ describe Feedzirra::RSS do
|
|
12
12
|
# end
|
13
13
|
|
14
14
|
it "should return fase for an atom feed" do
|
15
|
-
Feedzirra::RSS.should_not be_able_to_parse(sample_atom_feed)
|
15
|
+
Feedzirra::Parser::RSS.should_not be_able_to_parse(sample_atom_feed)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
describe "parsing" do
|
20
20
|
before(:each) do
|
21
|
-
@feed = Feedzirra::RSS.parse(sample_rss_feed)
|
21
|
+
@feed = Feedzirra::Parser::RSS.parse(sample_rss_feed)
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should parse the title" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pauldix-feedzirra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Dix
|
@@ -85,15 +85,15 @@ files:
|
|
85
85
|
- lib/core_ext/string.rb
|
86
86
|
- lib/feedzirra.rb
|
87
87
|
- lib/feedzirra/feed.rb
|
88
|
-
- lib/feedzirra/atom.rb
|
89
|
-
- lib/feedzirra/atom_entry.rb
|
90
|
-
- lib/feedzirra/atom_feed_burner.rb
|
91
|
-
- lib/feedzirra/atom_feed_burner_entry.rb
|
92
|
-
- lib/feedzirra/itunes_rss.rb
|
93
|
-
- lib/feedzirra/itunes_rss_item.rb
|
94
|
-
- lib/feedzirra/itunes_rss_owner.rb
|
95
|
-
- lib/feedzirra/rss.rb
|
96
|
-
- lib/feedzirra/rss_entry.rb
|
88
|
+
- lib/feedzirra/parser/atom.rb
|
89
|
+
- lib/feedzirra/parser/atom_entry.rb
|
90
|
+
- lib/feedzirra/parser/atom_feed_burner.rb
|
91
|
+
- lib/feedzirra/parser/atom_feed_burner_entry.rb
|
92
|
+
- lib/feedzirra/parser/itunes_rss.rb
|
93
|
+
- lib/feedzirra/parser/itunes_rss_item.rb
|
94
|
+
- lib/feedzirra/parser/itunes_rss_owner.rb
|
95
|
+
- lib/feedzirra/parser/rss.rb
|
96
|
+
- lib/feedzirra/parser/rss_entry.rb
|
97
97
|
- lib/feedzirra/feed_utilities.rb
|
98
98
|
- lib/feedzirra/feed_entry_utilities.rb
|
99
99
|
- README.textile
|
@@ -101,15 +101,15 @@ files:
|
|
101
101
|
- spec/spec.opts
|
102
102
|
- spec/spec_helper.rb
|
103
103
|
- spec/feedzirra/feed_spec.rb
|
104
|
-
- spec/feedzirra/atom_spec.rb
|
105
|
-
- spec/feedzirra/atom_entry_spec.rb
|
106
|
-
- spec/feedzirra/atom_feed_burner_spec.rb
|
107
|
-
- spec/feedzirra/atom_feed_burner_entry_spec.rb
|
108
|
-
- spec/feedzirra/itunes_rss_spec.rb
|
109
|
-
- spec/feedzirra/itunes_rss_item_spec.rb
|
110
|
-
- spec/feedzirra/itunes_rss_owner_spec.rb
|
111
|
-
- spec/feedzirra/rss_spec.rb
|
112
|
-
- spec/feedzirra/rss_entry_spec.rb
|
104
|
+
- spec/feedzirra/parser/atom_spec.rb
|
105
|
+
- spec/feedzirra/parser/atom_entry_spec.rb
|
106
|
+
- spec/feedzirra/parser/atom_feed_burner_spec.rb
|
107
|
+
- spec/feedzirra/parser/atom_feed_burner_entry_spec.rb
|
108
|
+
- spec/feedzirra/parser/itunes_rss_spec.rb
|
109
|
+
- spec/feedzirra/parser/itunes_rss_item_spec.rb
|
110
|
+
- spec/feedzirra/parser/itunes_rss_owner_spec.rb
|
111
|
+
- spec/feedzirra/parser/rss_spec.rb
|
112
|
+
- spec/feedzirra/parser/rss_entry_spec.rb
|
113
113
|
- spec/feedzirra/feed_utilities_spec.rb
|
114
114
|
- spec/feedzirra/feed_entry_utilities_spec.rb
|
115
115
|
has_rdoc: true
|
data/lib/feedzirra/atom.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
# == Summary
|
3
|
-
# Parser for dealing with Atom feeds.
|
4
|
-
#
|
5
|
-
# == Attributes
|
6
|
-
# * title
|
7
|
-
# * feed_url
|
8
|
-
# * url
|
9
|
-
# * entries
|
10
|
-
class Atom
|
11
|
-
include SAXMachine
|
12
|
-
include FeedUtilities
|
13
|
-
element :title
|
14
|
-
element :link, :as => :url, :value => :href, :with => {:type => "text/html"}
|
15
|
-
element :link, :as => :feed_url, :value => :href, :with => {:type => "application/atom+xml"}
|
16
|
-
elements :entry, :as => :entries, :class => AtomEntry
|
17
|
-
|
18
|
-
def self.able_to_parse?(xml) #:nodoc:
|
19
|
-
xml =~ /(Atom)|(#{Regexp.escape("http://purl.org/atom")})/
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
data/lib/feedzirra/atom_entry.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
# == Summary
|
3
|
-
# Parser for dealing with Atom feed entries.
|
4
|
-
#
|
5
|
-
# == Attributes
|
6
|
-
# * title
|
7
|
-
# * url
|
8
|
-
# * author
|
9
|
-
# * content
|
10
|
-
# * summary
|
11
|
-
# * published
|
12
|
-
# * categories
|
13
|
-
class AtomEntry
|
14
|
-
include SAXMachine
|
15
|
-
include FeedEntryUtilities
|
16
|
-
element :title
|
17
|
-
element :link, :as => :url, :value => :href, :with => {:type => "text/html", :rel => "alternate"}
|
18
|
-
element :name, :as => :author
|
19
|
-
element :content
|
20
|
-
element :summary
|
21
|
-
element :published
|
22
|
-
element :id
|
23
|
-
element :created, :as => :published
|
24
|
-
element :issued, :as => :published
|
25
|
-
element :updated
|
26
|
-
element :modified, :as => :updated
|
27
|
-
elements :category, :as => :categories, :value => :term
|
28
|
-
end
|
29
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
# == Summary
|
3
|
-
# Parser for dealing with Feedburner Atom feeds.
|
4
|
-
#
|
5
|
-
# == Attributes
|
6
|
-
# * title
|
7
|
-
# * feed_url
|
8
|
-
# * url
|
9
|
-
# * entries
|
10
|
-
class AtomFeedBurner
|
11
|
-
include SAXMachine
|
12
|
-
include FeedUtilities
|
13
|
-
element :title
|
14
|
-
element :link, :as => :url, :value => :href, :with => {:type => "text/html"}
|
15
|
-
element :link, :as => :feed_url, :value => :href, :with => {:type => "application/atom+xml"}
|
16
|
-
elements :entry, :as => :entries, :class => AtomFeedBurnerEntry
|
17
|
-
|
18
|
-
def self.able_to_parse?(xml) #:nodoc:
|
19
|
-
(xml =~ /Atom/ && xml =~ /feedburner/) || false
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
# == Summary
|
3
|
-
# Parser for dealing with Feedburner Atom feed entries.
|
4
|
-
#
|
5
|
-
# == Attributes
|
6
|
-
# * title
|
7
|
-
# * url
|
8
|
-
# * author
|
9
|
-
# * content
|
10
|
-
# * summary
|
11
|
-
# * published
|
12
|
-
# * categories
|
13
|
-
class AtomFeedBurnerEntry
|
14
|
-
include SAXMachine
|
15
|
-
include FeedEntryUtilities
|
16
|
-
element :title
|
17
|
-
element :name, :as => :author
|
18
|
-
element :link, :as => :url, :value => :href, :with => {:type => "text/html", :rel => "alternate"}
|
19
|
-
element :"feedburner:origLink", :as => :url
|
20
|
-
element :summary
|
21
|
-
element :content
|
22
|
-
element :published
|
23
|
-
element :id
|
24
|
-
element :issued, :as => :published
|
25
|
-
element :created, :as => :published
|
26
|
-
element :updated
|
27
|
-
element :modified, :as => :updated
|
28
|
-
elements :category, :as => :categories, :value => :term
|
29
|
-
end
|
30
|
-
end
|
data/lib/feedzirra/itunes_rss.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
# iTunes is RSS 2.0 + some apple extensions
|
3
|
-
# Source: http://www.apple.com/itunes/whatson/podcasts/specs.html
|
4
|
-
class ITunesRSS
|
5
|
-
include SAXMachine
|
6
|
-
include FeedUtilities
|
7
|
-
|
8
|
-
attr_accessor :feed_url
|
9
|
-
|
10
|
-
# RSS 2.0 elements that need including
|
11
|
-
element :copyright
|
12
|
-
element :description
|
13
|
-
element :language
|
14
|
-
element :managingEditor
|
15
|
-
element :title
|
16
|
-
element :link, :as => :url
|
17
|
-
|
18
|
-
# If author is not present use managingEditor on the channel
|
19
|
-
element :"itunes:author", :as => :itunes_author
|
20
|
-
element :"itunes:block", :as => :itunes_block
|
21
|
-
element :"itunes:image", :value => :href, :as => :itunes_image
|
22
|
-
element :"itunes:explicit", :as => :itunes_explicit
|
23
|
-
element :"itunes:keywords", :as => :itunes_keywords
|
24
|
-
# New URL for the podcast feed
|
25
|
-
element :"itunes:new-feed-url", :as => :itunes_new_feed_url
|
26
|
-
element :"itunes:subtitle", :as => :itunes_subtitle
|
27
|
-
# If summary is not present, use the description tag
|
28
|
-
element :"itunes:summary", :as => :itunes_summary
|
29
|
-
|
30
|
-
# iTunes RSS feeds can have multiple main categories...
|
31
|
-
# ...and multiple sub-categories per category
|
32
|
-
# TODO subcategories not supported correctly - they are at the same level
|
33
|
-
# as the main categories
|
34
|
-
elements :"itunes:category", :as => :itunes_categories, :value => :text
|
35
|
-
|
36
|
-
elements :"itunes:owner", :as => :itunes_owners, :class => ITunesRSSOwner
|
37
|
-
|
38
|
-
elements :item, :as => :entries, :class => ITunesRSSItem
|
39
|
-
|
40
|
-
def self.able_to_parse?(xml)
|
41
|
-
xml =~ /xmlns:itunes=\"http:\/\/www.itunes.com\/dtds\/podcast-1.0.dtd\"/
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
# iTunes extensions to the standard RSS2.0 item
|
3
|
-
# Source: http://www.apple.com/itunes/whatson/podcasts/specs.html
|
4
|
-
class ITunesRSSItem
|
5
|
-
include SAXMachine
|
6
|
-
include FeedUtilities
|
7
|
-
element :author
|
8
|
-
element :guid
|
9
|
-
element :title
|
10
|
-
element :link, :as => :url
|
11
|
-
element :description, :as => :summary
|
12
|
-
element :pubDate, :as => :published
|
13
|
-
|
14
|
-
# If author is not present use author tag on the item
|
15
|
-
element :"itunes:author", :as => :itunes_author
|
16
|
-
element :"itunes:block", :as => :itunes_block
|
17
|
-
element :"itunes:duration", :as => :itunes_duration
|
18
|
-
element :"itunes:explicit", :as => :itunes_explicit
|
19
|
-
element :"itunes:keywords", :as => :itunes_keywords
|
20
|
-
element :"itunes:subtitle", :as => :itunes_subtitle
|
21
|
-
# If summary is not present, use the description tag
|
22
|
-
element :"itunes:summary", :as => :itunes_summary
|
23
|
-
element :enclosure, :value => :length, :as => :enclosure_length
|
24
|
-
element :enclosure, :value => :type, :as => :enclosure_type
|
25
|
-
element :enclosure, :value => :url, :as => :enclosure_url
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
data/lib/feedzirra/rss.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
# == Summary
|
3
|
-
# Parser for dealing with RSS feeds.
|
4
|
-
#
|
5
|
-
# == Attributes
|
6
|
-
# * title
|
7
|
-
# * feed_url
|
8
|
-
# * url
|
9
|
-
# * entries
|
10
|
-
class RSS
|
11
|
-
include SAXMachine
|
12
|
-
include FeedUtilities
|
13
|
-
element :title
|
14
|
-
element :link, :as => :url
|
15
|
-
elements :item, :as => :entries, :class => RSSEntry
|
16
|
-
|
17
|
-
attr_accessor :feed_url
|
18
|
-
|
19
|
-
def self.able_to_parse?(xml) #:nodoc:
|
20
|
-
xml =~ /\<rss|rdf/
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/lib/feedzirra/rss_entry.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
# == Summary
|
3
|
-
# Parser for dealing with RDF feed entries.
|
4
|
-
#
|
5
|
-
# == Attributes
|
6
|
-
# * title
|
7
|
-
# * url
|
8
|
-
# * author
|
9
|
-
# * content
|
10
|
-
# * summary
|
11
|
-
# * published
|
12
|
-
# * categories
|
13
|
-
class RSSEntry
|
14
|
-
include SAXMachine
|
15
|
-
include FeedEntryUtilities
|
16
|
-
element :title
|
17
|
-
element :link, :as => :url
|
18
|
-
|
19
|
-
element :"dc:creator", :as => :author
|
20
|
-
element :"content:encoded", :as => :content
|
21
|
-
element :description, :as => :summary
|
22
|
-
|
23
|
-
element :pubDate, :as => :published
|
24
|
-
element :"dc:date", :as => :published
|
25
|
-
element :"dc:Date", :as => :published
|
26
|
-
element :"dcterms:created", :as => :published
|
27
|
-
|
28
|
-
|
29
|
-
element :"dcterms:modified", :as => :updated
|
30
|
-
element :issued, :as => :published
|
31
|
-
elements :category, :as => :categories
|
32
|
-
|
33
|
-
element :guid, :as => :id
|
34
|
-
end
|
35
|
-
end
|