fandango 0.2.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.irbrc +5 -0
- data/README.md +1 -3
- data/fandango.gemspec +4 -20
- data/lib/fandango.rb +27 -16
- data/lib/fandango/movie.rb +30 -0
- data/lib/fandango/parser.rb +34 -19
- data/lib/fandango/theater.rb +50 -0
- data/lib/fandango/version.rb +1 -1
- data/spec/fandango.spec.rb +23 -25
- data/spec/movie.spec.rb +24 -0
- data/spec/parser.spec.rb +12 -0
- data/spec/spec_helper.rb +5 -3
- data/spec/support/fixtures/item.html +1 -0
- data/spec/support/fixtures/movies_near_me_73142.rss +1 -1
- data/spec/support/fixtures/movies_near_me_73142.yaml +349 -0
- data/spec/support/helpers.rb +25 -0
- data/spec/support/vcr_cassettes/movies_near_me_123BADZIP.yml +48 -0
- data/spec/support/vcr_cassettes/movies_near_me_73142.yml +247 -0
- data/spec/theater.spec.rb +16 -0
- metadata +41 -130
- data/lib/fandango/parsers/movie.rb +0 -30
- data/lib/fandango/parsers/theater.rb +0 -37
- data/lib/feedzirra.rb +0 -4
- data/lib/vendor/feedzirra/.gitignore +0 -6
- data/lib/vendor/feedzirra/.rspec +0 -1
- data/lib/vendor/feedzirra/lib/feedzirra.rb +0 -19
- data/lib/vendor/feedzirra/lib/feedzirra/core_ext.rb +0 -3
- data/lib/vendor/feedzirra/lib/feedzirra/core_ext/date.rb +0 -19
- data/lib/vendor/feedzirra/lib/feedzirra/core_ext/string.rb +0 -9
- data/lib/vendor/feedzirra/lib/feedzirra/feed.rb +0 -383
- data/lib/vendor/feedzirra/lib/feedzirra/feed_entry_utilities.rb +0 -65
- data/lib/vendor/feedzirra/lib/feedzirra/feed_utilities.rb +0 -72
- data/lib/vendor/feedzirra/lib/feedzirra/parser.rb +0 -17
- data/lib/vendor/feedzirra/lib/feedzirra/parser/atom.rb +0 -29
- data/lib/vendor/feedzirra/lib/feedzirra/parser/atom_entry.rb +0 -30
- data/lib/vendor/feedzirra/lib/feedzirra/parser/atom_feed_burner.rb +0 -21
- data/lib/vendor/feedzirra/lib/feedzirra/parser/atom_feed_burner_entry.rb +0 -31
- data/lib/vendor/feedzirra/lib/feedzirra/parser/itunes_rss.rb +0 -50
- data/lib/vendor/feedzirra/lib/feedzirra/parser/itunes_rss_item.rb +0 -32
- data/lib/vendor/feedzirra/lib/feedzirra/parser/itunes_rss_owner.rb +0 -12
- data/lib/vendor/feedzirra/lib/feedzirra/parser/rss.rb +0 -22
- data/lib/vendor/feedzirra/lib/feedzirra/parser/rss_entry.rb +0 -34
- data/lib/vendor/feedzirra/lib/feedzirra/parser/rss_feed_burner.rb +0 -22
- data/lib/vendor/feedzirra/lib/feedzirra/parser/rss_feed_burner_entry.rb +0 -40
- data/lib/vendor/feedzirra/lib/feedzirra/version.rb +0 -3
- data/spec/support/macros.rb +0 -18
@@ -1,65 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
module FeedEntryUtilities
|
3
|
-
|
4
|
-
include Enumerable
|
5
|
-
|
6
|
-
def published
|
7
|
-
@published ||= @updated
|
8
|
-
end
|
9
|
-
|
10
|
-
def parse_datetime(string)
|
11
|
-
begin
|
12
|
-
DateTime.parse(string).feed_utils_to_gm_time
|
13
|
-
rescue
|
14
|
-
puts "DATE CAN'T BE PARSED: [#{string}]"
|
15
|
-
nil
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
##
|
20
|
-
# Returns the id of the entry or its url if not id is present, as some formats don't support it
|
21
|
-
def id
|
22
|
-
@entry_id ||= @url
|
23
|
-
end
|
24
|
-
|
25
|
-
##
|
26
|
-
# Writer for published. By default, we keep the "oldest" publish time found.
|
27
|
-
def published=(val)
|
28
|
-
parsed = parse_datetime(val)
|
29
|
-
@published = parsed if !@published || parsed < @published
|
30
|
-
end
|
31
|
-
|
32
|
-
##
|
33
|
-
# Writer for updated. By default, we keep the most recent update time found.
|
34
|
-
def updated=(val)
|
35
|
-
parsed = parse_datetime(val)
|
36
|
-
@updated = parsed if !@updated || parsed > @updated
|
37
|
-
end
|
38
|
-
|
39
|
-
def sanitize!
|
40
|
-
self.title.sanitize! if self.title
|
41
|
-
self.author.sanitize! if self.author
|
42
|
-
self.summary.sanitize! if self.summary
|
43
|
-
self.content.sanitize! if self.content
|
44
|
-
end
|
45
|
-
|
46
|
-
alias_method :last_modified, :published
|
47
|
-
|
48
|
-
def each
|
49
|
-
@rss_fields ||= self.instance_variables
|
50
|
-
|
51
|
-
@rss_fields.each do |field|
|
52
|
-
yield(field.to_s.sub('@', ''), self.instance_variable_get(field))
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def [](field)
|
57
|
-
self.instance_variable_get("@#{field.to_s}")
|
58
|
-
end
|
59
|
-
|
60
|
-
def []=(field, value)
|
61
|
-
self.instance_variable_set("@#{field.to_s}", value)
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
65
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
module FeedUtilities
|
3
|
-
UPDATABLE_ATTRIBUTES = %w(title feed_url url last_modified etag)
|
4
|
-
|
5
|
-
attr_writer :new_entries, :updated, :last_modified
|
6
|
-
attr_accessor :etag
|
7
|
-
|
8
|
-
def last_modified
|
9
|
-
@last_modified ||= begin
|
10
|
-
entry = entries.reject {|e| e.published.nil? }.sort_by { |entry| entry.published if entry.published }.last
|
11
|
-
entry ? entry.published : nil
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def updated?
|
16
|
-
@updated
|
17
|
-
end
|
18
|
-
|
19
|
-
def new_entries
|
20
|
-
@new_entries ||= []
|
21
|
-
end
|
22
|
-
|
23
|
-
def has_new_entries?
|
24
|
-
new_entries.size > 0
|
25
|
-
end
|
26
|
-
|
27
|
-
def update_from_feed(feed)
|
28
|
-
self.new_entries += find_new_entries_for(feed)
|
29
|
-
self.entries.unshift(*self.new_entries)
|
30
|
-
|
31
|
-
@updated = false
|
32
|
-
UPDATABLE_ATTRIBUTES.each do |name|
|
33
|
-
updated = update_attribute(feed, name)
|
34
|
-
@updated ||= updated
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def update_attribute(feed, name)
|
39
|
-
old_value, new_value = send(name), feed.send(name)
|
40
|
-
|
41
|
-
if old_value != new_value
|
42
|
-
send("#{name}=", new_value)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def sanitize_entries!
|
47
|
-
entries.each {|entry| entry.sanitize!}
|
48
|
-
end
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
def find_new_entries_for(feed)
|
53
|
-
# this implementation is a hack, which is why it's so ugly.
|
54
|
-
# it's to get around the fact that not all feeds have a published date.
|
55
|
-
# however, they're always ordered with the newest one first.
|
56
|
-
# So we go through the entries just parsed and insert each one as a new entry
|
57
|
-
# until we get to one that has the same url as the the newest for the feed
|
58
|
-
return feed.entries if self.entries.length == 0
|
59
|
-
latest_entry = self.entries.first
|
60
|
-
found_new_entries = []
|
61
|
-
feed.entries.each do |entry|
|
62
|
-
break if entry.url == latest_entry.url
|
63
|
-
found_new_entries << entry
|
64
|
-
end
|
65
|
-
found_new_entries
|
66
|
-
end
|
67
|
-
|
68
|
-
def existing_entry?(test_entry)
|
69
|
-
entries.any? { |entry| entry.url == test_entry.url }
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
module Parser
|
3
|
-
autoload :RSS, 'feedzirra/parser/rss'
|
4
|
-
autoload :RSSEntry, 'feedzirra/parser/rss_entry'
|
5
|
-
autoload :RSSFeedBurner, 'feedzirra/parser/rss_feed_burner'
|
6
|
-
autoload :RSSFeedBurnerEntry, 'feedzirra/parser/rss_feed_burner_entry'
|
7
|
-
|
8
|
-
autoload :ITunesRSS, 'feedzirra/parser/itunes_rss'
|
9
|
-
autoload :ITunesRSSItem, 'feedzirra/parser/itunes_rss_item'
|
10
|
-
autoload :ITunesRSSOwner, 'feedzirra/parser/itunes_rss_owner'
|
11
|
-
|
12
|
-
autoload :Atom, 'feedzirra/parser/atom'
|
13
|
-
autoload :AtomEntry, 'feedzirra/parser/atom_entry'
|
14
|
-
autoload :AtomFeedBurner, 'feedzirra/parser/atom_feed_burner'
|
15
|
-
autoload :AtomFeedBurnerEntry, 'feedzirra/parser/atom_feed_burner_entry'
|
16
|
-
end
|
17
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
|
3
|
-
module Parser
|
4
|
-
# Parser for dealing with Atom feeds.
|
5
|
-
class Atom
|
6
|
-
include SAXMachine
|
7
|
-
include FeedUtilities
|
8
|
-
element :title
|
9
|
-
element :subtitle, :as => :description
|
10
|
-
element :link, :as => :url, :value => :href, :with => {:type => "text/html"}
|
11
|
-
element :link, :as => :feed_url, :value => :href, :with => {:type => "application/atom+xml"}
|
12
|
-
elements :link, :as => :links, :value => :href
|
13
|
-
elements :entry, :as => :entries, :class => AtomEntry
|
14
|
-
|
15
|
-
def self.able_to_parse?(xml) #:nodoc:
|
16
|
-
/\<feed[^\>]+xmlns=[\"|\'](http:\/\/www\.w3\.org\/2005\/Atom|http:\/\/purl\.org\/atom\/ns\#)[\"|\'][^\>]*\>/ =~ xml
|
17
|
-
end
|
18
|
-
|
19
|
-
def url
|
20
|
-
@url || links.last
|
21
|
-
end
|
22
|
-
|
23
|
-
def feed_url
|
24
|
-
@feed_url ||= links.first
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
|
3
|
-
module Parser
|
4
|
-
# Parser for dealing with Atom feed entries.
|
5
|
-
class AtomEntry
|
6
|
-
include SAXMachine
|
7
|
-
include FeedEntryUtilities
|
8
|
-
|
9
|
-
element :title
|
10
|
-
element :link, :as => :url, :value => :href, :with => {:type => "text/html", :rel => "alternate"}
|
11
|
-
element :name, :as => :author
|
12
|
-
element :content
|
13
|
-
element :summary
|
14
|
-
element :published
|
15
|
-
element :id, :as => :entry_id
|
16
|
-
element :created, :as => :published
|
17
|
-
element :issued, :as => :published
|
18
|
-
element :updated
|
19
|
-
element :modified, :as => :updated
|
20
|
-
elements :category, :as => :categories, :value => :term
|
21
|
-
elements :link, :as => :links, :value => :href
|
22
|
-
|
23
|
-
def url
|
24
|
-
@url ||= links.first
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
|
3
|
-
module Parser
|
4
|
-
# Parser for dealing with Feedburner Atom feeds.
|
5
|
-
class AtomFeedBurner
|
6
|
-
include SAXMachine
|
7
|
-
include FeedUtilities
|
8
|
-
element :title
|
9
|
-
element :subtitle, :as => :description
|
10
|
-
element :link, :as => :url, :value => :href, :with => {:type => "text/html"}
|
11
|
-
element :link, :as => :feed_url, :value => :href, :with => {:type => "application/atom+xml"}
|
12
|
-
elements :entry, :as => :entries, :class => AtomFeedBurnerEntry
|
13
|
-
|
14
|
-
def self.able_to_parse?(xml) #:nodoc:
|
15
|
-
((/Atom/ =~ xml) && (/feedburner/ =~ xml) && !(/\<rss|\<rdf/ =~ xml)) || false
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
|
3
|
-
module Parser
|
4
|
-
# Parser for dealing with Feedburner Atom feed entries.
|
5
|
-
class AtomFeedBurnerEntry
|
6
|
-
include SAXMachine
|
7
|
-
include FeedEntryUtilities
|
8
|
-
|
9
|
-
element :title
|
10
|
-
element :name, :as => :author
|
11
|
-
element :link, :as => :url, :value => :href, :with => {:type => "text/html", :rel => "alternate"}
|
12
|
-
element :"feedburner:origLink", :as => :url
|
13
|
-
element :summary
|
14
|
-
element :content
|
15
|
-
element :published
|
16
|
-
element :id, :as => :entry_id
|
17
|
-
element :issued, :as => :published
|
18
|
-
element :created, :as => :published
|
19
|
-
element :updated
|
20
|
-
element :modified, :as => :updated
|
21
|
-
elements :category, :as => :categories, :value => :term
|
22
|
-
elements :link, :as => :links, :value => :href
|
23
|
-
|
24
|
-
def url
|
25
|
-
@url ||= links.first
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
@@ -1,50 +0,0 @@
|
|
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
|
-
/xmlns:itunes=\"http:\/\/www.itunes.com\/dtds\/podcast-1.0.dtd\"/i =~ xml
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
@@ -1,32 +0,0 @@
|
|
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 FeedEntryUtilities
|
9
|
-
|
10
|
-
element :author
|
11
|
-
element :guid
|
12
|
-
element :title
|
13
|
-
element :link, :as => :url
|
14
|
-
element :description, :as => :summary
|
15
|
-
element :pubDate, :as => :published
|
16
|
-
|
17
|
-
# If author is not present use author tag on the item
|
18
|
-
element :"itunes:author", :as => :itunes_author
|
19
|
-
element :"itunes:block", :as => :itunes_block
|
20
|
-
element :"itunes:duration", :as => :itunes_duration
|
21
|
-
element :"itunes:explicit", :as => :itunes_explicit
|
22
|
-
element :"itunes:keywords", :as => :itunes_keywords
|
23
|
-
element :"itunes:subtitle", :as => :itunes_subtitle
|
24
|
-
# If summary is not present, use the description tag
|
25
|
-
element :"itunes:summary", :as => :itunes_summary
|
26
|
-
element :enclosure, :value => :length, :as => :enclosure_length
|
27
|
-
element :enclosure, :value => :type, :as => :enclosure_type
|
28
|
-
element :enclosure, :value => :url, :as => :enclosure_url
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
|
3
|
-
module Parser
|
4
|
-
# Parser for dealing with RSS feeds.
|
5
|
-
class RSS
|
6
|
-
include SAXMachine
|
7
|
-
include FeedUtilities
|
8
|
-
element :title
|
9
|
-
element :description
|
10
|
-
element :link, :as => :url
|
11
|
-
elements :item, :as => :entries, :class => RSSEntry
|
12
|
-
|
13
|
-
attr_accessor :feed_url
|
14
|
-
|
15
|
-
def self.able_to_parse?(xml) #:nodoc:
|
16
|
-
(/\<rss|\<rdf/ =~ xml) && !(/feedburner/ =~ xml)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
|
3
|
-
module Parser
|
4
|
-
# Parser for dealing with RDF feed entries.
|
5
|
-
class RSSEntry
|
6
|
-
include SAXMachine
|
7
|
-
include FeedEntryUtilities
|
8
|
-
|
9
|
-
element :title
|
10
|
-
element :link, :as => :url
|
11
|
-
|
12
|
-
element :"dc:creator", :as => :author
|
13
|
-
element :author, :as => :author
|
14
|
-
element :"content:encoded", :as => :content
|
15
|
-
element :description, :as => :summary
|
16
|
-
|
17
|
-
element :pubDate, :as => :published
|
18
|
-
element :pubdate, :as => :published
|
19
|
-
element :"dc:date", :as => :published
|
20
|
-
element :"dc:Date", :as => :published
|
21
|
-
element :"dcterms:created", :as => :published
|
22
|
-
|
23
|
-
|
24
|
-
element :"dcterms:modified", :as => :updated
|
25
|
-
element :issued, :as => :published
|
26
|
-
elements :category, :as => :categories
|
27
|
-
|
28
|
-
element :guid, :as => :entry_id
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Feedzirra
|
2
|
-
|
3
|
-
module Parser
|
4
|
-
# Parser for dealing with RSS feeds.
|
5
|
-
class RSSFeedBurner
|
6
|
-
include SAXMachine
|
7
|
-
include FeedUtilities
|
8
|
-
element :title
|
9
|
-
element :description
|
10
|
-
element :link, :as => :url
|
11
|
-
elements :item, :as => :entries, :class => RSSFeedBurnerEntry
|
12
|
-
|
13
|
-
attr_accessor :feed_url
|
14
|
-
|
15
|
-
def self.able_to_parse?(xml) #:nodoc:
|
16
|
-
(/\<rss|\<rdf/ =~ xml) && (/feedburner/ =~ xml)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|