spix_parser 1.5.4 → 1.6.1
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/spix_parser/tools/discovery.rb +9 -0
- data/lib/spix_parser/tools/feed_discovery/base.rb +74 -0
- data/lib/spix_parser/tools/feed_discovery/document.rb +104 -0
- data/lib/spix_parser/tools/feed_discovery/feed.rb +30 -0
- data/lib/spix_parser/tools/feed_discovery.rb +7 -81
- data/lib/spix_parser/version.rb +2 -2
- data/lib/spix_parser.rb +1 -1
- data/spec/spix_parser/tools/feed_discovery/document_spec.rb +68 -0
- data/spec/spix_parser/tools/feed_discovery/feed_spec.rb +29 -0
- data/spec/spix_parser/tools/feed_discovery_spec.rb +56 -13
- data/spec/spix_parser/tools/feed_list_spec.rb +17 -0
- metadata +12 -2
@@ -0,0 +1,9 @@
|
|
1
|
+
$:.unshift File.expand_path(File.dirname(__FILE__))
|
2
|
+
module Spix
|
3
|
+
autoload :FeedDiscovery, 'feed_discovery'
|
4
|
+
module FeedDiscovery
|
5
|
+
autoload :Base, 'feed_discovery/base'
|
6
|
+
autoload :Feed, 'feed_discovery/feed'
|
7
|
+
autoload :Document, 'feed_discovery/document'
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Spix
|
2
|
+
module FeedDiscovery
|
3
|
+
class Base
|
4
|
+
# HTTP "User-Agent" header to send to servers when downloading feeds.
|
5
|
+
USER_AGENT = "SpixParser"
|
6
|
+
|
7
|
+
def initialize uri
|
8
|
+
self.uri = uri
|
9
|
+
self.document = FeedDiscovery::Document.new uri
|
10
|
+
end
|
11
|
+
|
12
|
+
def uri= value
|
13
|
+
@uri = URI.parse value
|
14
|
+
end
|
15
|
+
|
16
|
+
def uri
|
17
|
+
@uri
|
18
|
+
end
|
19
|
+
|
20
|
+
def document= value
|
21
|
+
@document = value
|
22
|
+
end
|
23
|
+
private :document=
|
24
|
+
|
25
|
+
def document
|
26
|
+
@document
|
27
|
+
end
|
28
|
+
private :document
|
29
|
+
|
30
|
+
def list
|
31
|
+
extract_feeds_from_anchors if html?
|
32
|
+
extract_feeds_from_links
|
33
|
+
include_it_self if feed?
|
34
|
+
items
|
35
|
+
end
|
36
|
+
|
37
|
+
def html?
|
38
|
+
document.html?
|
39
|
+
end
|
40
|
+
private :html?
|
41
|
+
|
42
|
+
def extract_feeds_from_anchors
|
43
|
+
document.feed_uris_from_anchors +
|
44
|
+
document.generic_uris_from_anchors.map { |uri|
|
45
|
+
FeedDiscovery::Document.new(uri).feed_uris_from_anchors
|
46
|
+
}.flatten.each { |uri|
|
47
|
+
items << Feed.new(uri, document.favicon)
|
48
|
+
}
|
49
|
+
end
|
50
|
+
private :extract_feeds_from_anchors
|
51
|
+
|
52
|
+
def extract_feeds_from_links
|
53
|
+
document.feed_uris_from_links.each { |uri|
|
54
|
+
items << Feed.new(uri, document.favicon)
|
55
|
+
}
|
56
|
+
end
|
57
|
+
private :extract_feeds_from_links
|
58
|
+
|
59
|
+
def include_it_self
|
60
|
+
items << Feed.new(uri.to_s, document.favicon)
|
61
|
+
end
|
62
|
+
|
63
|
+
def feed?
|
64
|
+
document.feed?
|
65
|
+
end
|
66
|
+
private :feed?
|
67
|
+
|
68
|
+
def items
|
69
|
+
@items ||= []
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module Spix
|
2
|
+
module FeedDiscovery
|
3
|
+
class Document
|
4
|
+
|
5
|
+
def initialize uri
|
6
|
+
@uri = URI.parse uri
|
7
|
+
@document = Nokogiri::XML(content)
|
8
|
+
end
|
9
|
+
|
10
|
+
def content
|
11
|
+
if @uri.respond_to?(:read)
|
12
|
+
@uri.read
|
13
|
+
else
|
14
|
+
req_headers = {}
|
15
|
+
req_headers["User-Agent"] = USER_AGENT
|
16
|
+
open(@uri.to_s, req_headers).read
|
17
|
+
end
|
18
|
+
end
|
19
|
+
private :content
|
20
|
+
|
21
|
+
def feed_uris_from_anchors
|
22
|
+
@document.search("a").select { |anchor|
|
23
|
+
rss_or_atom_content_type_in? anchor
|
24
|
+
}.map { |node|
|
25
|
+
uri = @uri.merge node.get_attribute 'href'
|
26
|
+
uri.to_s
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def generic_uris_from_anchors
|
31
|
+
@document.search("a").select { |anchor|
|
32
|
+
not rss_or_atom_content_type_in? anchor
|
33
|
+
}.map { |node|
|
34
|
+
uri = @uri.merge node.get_attribute 'href'
|
35
|
+
uri.to_s
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
def feed_uris_from_links
|
40
|
+
@document.search(
|
41
|
+
"link[@type='application/atom+xml']",
|
42
|
+
"link[@type='application/rss+xml']"
|
43
|
+
).map { |node|
|
44
|
+
uri = @uri.merge node.get_attribute 'href'
|
45
|
+
uri.to_s
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
def rss_or_atom_content_type_in? anchor
|
50
|
+
req, path = request_and_path_using address_from anchor
|
51
|
+
resp = req.request_head path
|
52
|
+
resp['content-type'] =~ /rss|atom/
|
53
|
+
end
|
54
|
+
private :rss_or_atom_content_type_in?
|
55
|
+
|
56
|
+
def request_and_path_using address
|
57
|
+
uri = @uri.merge URI.parse address
|
58
|
+
req = Net::HTTP.new uri.host, uri.port
|
59
|
+
path = uri - uri.select(:scheme, :host).join("://")
|
60
|
+
return req, path.to_s
|
61
|
+
end
|
62
|
+
private :request_and_path_using
|
63
|
+
|
64
|
+
def address_from node
|
65
|
+
node.get_attribute("href")
|
66
|
+
end
|
67
|
+
private :address_from
|
68
|
+
|
69
|
+
def html?
|
70
|
+
@document.root.name == "html"
|
71
|
+
end
|
72
|
+
|
73
|
+
def feed?
|
74
|
+
%w[rss feed].include? @document.root.name
|
75
|
+
end
|
76
|
+
|
77
|
+
def favicon
|
78
|
+
shortcuts_in_document or shortcuts_from(base_path) or base_path.merge('favicon.ico').to_s
|
79
|
+
end
|
80
|
+
|
81
|
+
def shortcuts_in_document
|
82
|
+
shortcuts = @document.search('link[@rel*=shortcut]')
|
83
|
+
shortcuts.any? ? shortcuts : nil
|
84
|
+
end
|
85
|
+
private :shortcuts_in_document
|
86
|
+
|
87
|
+
def shortcuts_from base_path
|
88
|
+
doc = Nokogiri::HTML Net::HTTP.get base_path
|
89
|
+
doc.search('link[@rel*=shortcut]')
|
90
|
+
|
91
|
+
rescue Net::HTTPError, Net::HTTPFatalError
|
92
|
+
logger.warn "error opening favicon: #{$!}"
|
93
|
+
nil
|
94
|
+
end
|
95
|
+
private :shortcuts_from
|
96
|
+
|
97
|
+
def base_path
|
98
|
+
URI.parse @uri.select(:scheme, :host).join("://")
|
99
|
+
end
|
100
|
+
private :base_path
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Spix
|
2
|
+
module FeedDiscovery
|
3
|
+
class Feed < Struct.new(:url, :favicon, :title)
|
4
|
+
|
5
|
+
def initialize url, favicon
|
6
|
+
self.url = url
|
7
|
+
self.favicon = favicon
|
8
|
+
self.title = get_title
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_title
|
12
|
+
content.search('title').first.content
|
13
|
+
end
|
14
|
+
private :get_title
|
15
|
+
|
16
|
+
def content
|
17
|
+
req = Net::HTTP.new uri.host, uri.port
|
18
|
+
path = uri - uri.select(:scheme, :host).join("://")
|
19
|
+
resp = req.request_get path.to_s
|
20
|
+
Nokogiri::XML(resp.body)
|
21
|
+
end
|
22
|
+
private :content
|
23
|
+
|
24
|
+
def uri
|
25
|
+
URI.parse url
|
26
|
+
end
|
27
|
+
private :uri
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,94 +1,20 @@
|
|
1
|
-
gem "feedzirra", ">=0.0.24"
|
2
1
|
require "feedzirra"
|
3
2
|
require "nokogiri"
|
4
3
|
require "uri"
|
5
4
|
require "open-uri"
|
6
5
|
|
7
6
|
module Spix
|
8
|
-
|
7
|
+
module FeedDiscovery
|
8
|
+
extend self
|
9
9
|
|
10
|
-
|
11
|
-
USER_AGENT = "SpixParser"
|
12
|
-
|
13
|
-
def self.feed?(uri)
|
10
|
+
def feed? uri
|
14
11
|
Spix::Parser.parse(uri, :mode => :fetch) ? true : false
|
15
12
|
end
|
16
13
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
doc = Nokogiri::HTML(content)
|
22
|
-
|
23
|
-
# get page title
|
24
|
-
title = doc.search('title')[0].content
|
25
|
-
|
26
|
-
items = doc.search("//link[@type='application/atom+xml']", "//link[@type='application/rss+xml']").collect do |link|
|
27
|
-
url_object = URI::parse(uri).normalize
|
28
|
-
|
29
|
-
href = link.get_attribute(:href).to_s
|
30
|
-
|
31
|
-
feed_url_object = URI::parse(href)
|
32
|
-
|
33
|
-
if feed_url_object.relative?
|
34
|
-
|
35
|
-
# there's 2 types of relative URIs
|
36
|
-
# the ones based on a path (base: http://sitewithfeed.com/foo/, relative: feed.xml, feed: http://sitewithfeed.com/foo/feed.xml)
|
37
|
-
# and the ones based on the top domain (base: http://sitewithfeed.com/foo/, relative: /feed.xml, feed: http://sitewithfeed.com/feed.xml)
|
38
|
-
if feed_url_object.path.match(/^\//)
|
39
|
-
# when the feed_url_object is relative and starts with a "/" we should ignore the domain path
|
40
|
-
path = nil
|
41
|
-
else
|
42
|
-
# when the feed_url_object is relative and do not starts with a "/" we should use the domain path
|
43
|
-
|
44
|
-
if url_object.path.match(/\/$/)
|
45
|
-
# when the url_object ends with a "/" we should use it
|
46
|
-
path = url_object.path
|
47
|
-
else
|
48
|
-
# when the url_object do not ends with a "/" we should add it
|
49
|
-
path = url_object.path + "/"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
href = "#{url_object.scheme}://" +
|
54
|
-
"#{url_object.host}" +
|
55
|
-
"#{path}" +
|
56
|
-
"#{url_object.query}" +
|
57
|
-
href
|
58
|
-
end
|
59
|
-
|
60
|
-
item = {
|
61
|
-
:title => link.get_attribute(:title) || title,
|
62
|
-
:url => href
|
63
|
-
}
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
if items.size == 0
|
68
|
-
# if there's no item found at the given URI, maybe it's a feed URI
|
69
|
-
if self.feed?(uri)
|
70
|
-
items = [
|
71
|
-
{
|
72
|
-
:title => title,
|
73
|
-
:url => uri
|
74
|
-
}
|
75
|
-
]
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
items
|
80
|
-
rescue
|
81
|
-
nil
|
14
|
+
def list uri
|
15
|
+
page = Base.new uri
|
16
|
+
page.list
|
82
17
|
end
|
83
18
|
|
84
|
-
def self.read(uri)
|
85
|
-
if uri.respond_to?(:read)
|
86
|
-
content = uri.read
|
87
|
-
else
|
88
|
-
req_headers = {}
|
89
|
-
req_headers["User-Agent"] = USER_AGENT
|
90
|
-
content = open(uri, req_headers).read
|
91
|
-
end
|
92
|
-
end
|
93
19
|
end
|
94
|
-
end
|
20
|
+
end
|
data/lib/spix_parser/version.rb
CHANGED
data/lib/spix_parser.rb
CHANGED
@@ -29,7 +29,7 @@ require "spix_parser/custom_parsers/atom"
|
|
29
29
|
require "spix_parser/custom_parsers/rss_entry"
|
30
30
|
require "spix_parser/custom_parsers/rss"
|
31
31
|
|
32
|
-
require "spix_parser/tools/
|
32
|
+
require "spix_parser/tools/discovery"
|
33
33
|
|
34
34
|
if RUBY_VERSION < '1.9'
|
35
35
|
$KCODE='u'
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spix::FeedDiscovery::Document do
|
4
|
+
|
5
|
+
let(:document) { Spix::FeedDiscovery::Document.new @rss_uri }
|
6
|
+
|
7
|
+
describe '#feed_uris_from_anchors' do
|
8
|
+
it 'should return only uris from anchors' do
|
9
|
+
document.feed_uris_from_anchors.should eql expected_uris_inside('a.has_feed')
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#feed_uris_from_links' do
|
14
|
+
it 'should return only uris from links' do
|
15
|
+
document.feed_uris_from_links.should eql expected_uris_inside('link.has_feed')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#generic_uris' do
|
20
|
+
it 'should return only ordinary uris from anchors' do
|
21
|
+
document.generic_uris_from_anchors.should eql expected_uris_inside('a.generic')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#html?' do
|
26
|
+
it 'should return true if is a html document' do
|
27
|
+
content = load_fixture('rss_list.html')
|
28
|
+
Spix::FeedDiscovery::Document.any_instance.stub(:content).and_return(content)
|
29
|
+
document.html?.should eql true
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should return false if is a rss/feed document' do
|
33
|
+
content = load_fixture('feed.rss')
|
34
|
+
Spix::FeedDiscovery::Document.any_instance.stub(:content).and_return(content)
|
35
|
+
document.html?.should eql false
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#feed?' do
|
40
|
+
it 'should return true if a feed document' do
|
41
|
+
content = load_fixture('feed.rss')
|
42
|
+
Spix::FeedDiscovery::Document.any_instance.stub(:content).and_return(content)
|
43
|
+
document.feed?.should eql true
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should return false if hot a html document' do
|
47
|
+
content = load_fixture('rss_list.html')
|
48
|
+
Spix::FeedDiscovery::Document.any_instance.stub(:content).and_return(content)
|
49
|
+
document.feed?.should eql false
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
before :all do
|
54
|
+
@rss_uri = 'http://myfeed.com/rss_list.html'
|
55
|
+
@content = load_fixture("rss_list.html")
|
56
|
+
@document = Nokogiri::XML(@content)
|
57
|
+
end
|
58
|
+
|
59
|
+
before :each do
|
60
|
+
Spix::FeedDiscovery::Document.any_instance.stub(:content).and_return(@content)
|
61
|
+
FakeWeb.register_uri(:head, 'http://myfeed.com/has_feed.html', :content_type => 'application/atom+xml')
|
62
|
+
FakeWeb.register_uri(:head, 'http://myfeed.com/generic.html', :content_type => 'text/html' )
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def expected_uris_inside to_search
|
67
|
+
@document.search(to_search).map { |node| URI.parse(@rss_uri).merge(node.get_attribute('href')).to_s }
|
68
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spix::FeedDiscovery::Feed do
|
4
|
+
|
5
|
+
context 'given an expecific uri' do
|
6
|
+
|
7
|
+
let(:feed) { Spix::FeedDiscovery::Feed.new @feed_uri, @favicon_uri }
|
8
|
+
|
9
|
+
it 'should set the favicon' do
|
10
|
+
feed.favicon.should == @favicon_uri
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should set the url' do
|
14
|
+
feed.url.should == @feed_uri
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should set title' do
|
18
|
+
feed.title.should == @document.search('title').first.content
|
19
|
+
end
|
20
|
+
|
21
|
+
before :all do
|
22
|
+
@feed_uri = "http://myfeed.com/feed.rss"
|
23
|
+
@favicon_uri = "http://myfeed.com/images/favicon.ico"
|
24
|
+
@document = Nokogiri::XML load_fixture 'feed.rss'
|
25
|
+
FakeWeb.register_uri(:get, @feed_uri, :body => @document.to_s)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -2,13 +2,11 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Spix::FeedDiscovery, "#list" do
|
4
4
|
|
5
|
-
before(:all) do
|
6
|
-
@domain_url = "http://sitewithfeed.com"
|
7
|
-
end
|
8
|
-
|
9
5
|
describe "when the feed have an absolute URI" do
|
10
6
|
it "should return the feed url" do
|
11
|
-
|
7
|
+
fake_requests_for :path_inside_content => '/html4-002.html',
|
8
|
+
:resource_path => @domain_url,
|
9
|
+
:content => load_fixture("absolute_uri.html")
|
12
10
|
Spix::FeedDiscovery.list(@domain_url).first[:url].should == "http://diveintomark.org/tests/client/autodiscovery/html4-001.xml"
|
13
11
|
end
|
14
12
|
end
|
@@ -16,30 +14,37 @@ describe Spix::FeedDiscovery, "#list" do
|
|
16
14
|
describe "when the feed have a relative URI" do
|
17
15
|
describe "which is relative to a path" do
|
18
16
|
it "should return the feed url when the URI is at the top domain" do
|
19
|
-
|
17
|
+
fake_requests_for :path_inside_content => '/html4-003.html',
|
18
|
+
:resource_path => @domain_url,
|
19
|
+
:content => load_fixture("relative_uri.html")
|
20
20
|
Spix::FeedDiscovery.list(@domain_url).first[:url].should == @domain_url + "/" + "html4-002.xml"
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should return the feed url when the URI is inside a path" do
|
24
|
-
@path_url = "/foo/bar"
|
24
|
+
@path_url = "/foo/bar/"
|
25
25
|
@feed_url = @domain_url + @path_url
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
fake_requests_for :path_inside_content => 'html4-003.html',
|
27
|
+
:resource_path => @feed_url,
|
28
|
+
:content => load_fixture('relative_uri.html')
|
29
|
+
Spix::FeedDiscovery.list(@feed_url).first[:url].should == @feed_url + "html4-002.xml"
|
29
30
|
end
|
30
31
|
end
|
31
32
|
|
32
33
|
describe "which is relative to the top domain" do
|
33
34
|
it "should return the feed url when the URI is at the top domain" do
|
34
|
-
|
35
|
+
fake_requests_for :path_inside_content => '/html4-004.html',
|
36
|
+
:resource_path => @domain_url,
|
37
|
+
:content => load_fixture("relative_uri_top_domain.html")
|
35
38
|
Spix::FeedDiscovery.list(@domain_url).first[:url].should == @domain_url + "/tests/client/autodiscovery/html4-003.xml"
|
36
39
|
end
|
37
40
|
|
38
41
|
it "should return the feed url when the URI is inside a path" do
|
39
|
-
@path_url = "/foo/bar"
|
42
|
+
@path_url = "/foo/bar/"
|
40
43
|
@feed_url = @domain_url + @path_url
|
41
44
|
|
42
|
-
|
45
|
+
fake_requests_for :path_inside_content => 'html4-004.html',
|
46
|
+
:resource_path => @feed_url,
|
47
|
+
:content => load_fixture("relative_uri_top_domain.html")
|
43
48
|
Spix::FeedDiscovery.list(@feed_url).first[:url].should == @domain_url + "/tests/client/autodiscovery/html4-003.xml"
|
44
49
|
end
|
45
50
|
end
|
@@ -68,5 +73,43 @@ describe Spix::FeedDiscovery, "#list" do
|
|
68
73
|
|
69
74
|
Spix::FeedDiscovery.list(@feed_url).first[:url].should == @feed_url
|
70
75
|
end
|
76
|
+
|
77
|
+
it "should return the title of feed" do
|
78
|
+
feed_xml = load_fixture("feed_without_self_link.xml")
|
79
|
+
|
80
|
+
FakeWeb.register_uri(:get, @feed_url, :body => feed_xml)
|
81
|
+
|
82
|
+
# feedzirra doesn't work with fakeweb
|
83
|
+
feed = Feedzirra::Feed.parse(feed_xml)
|
84
|
+
Feedzirra::Feed.stub!(:fetch_and_parse).and_return(feed)
|
85
|
+
|
86
|
+
Spix::FeedDiscovery.list(@feed_url).first[:title].should == feed.feed_title
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should return the title of feed when enclosed in CDATA" do
|
90
|
+
feed_xml = load_fixture("feed_with_content_in_cdata.xml")
|
91
|
+
|
92
|
+
FakeWeb.register_uri(:get, @feed_url, :body => feed_xml)
|
93
|
+
|
94
|
+
# feedzirra doesn't work with fakeweb
|
95
|
+
feed = Feedzirra::Feed.parse(feed_xml)
|
96
|
+
Feedzirra::Feed.stub!(:fetch_and_parse).and_return(feed)
|
97
|
+
|
98
|
+
Spix::FeedDiscovery.list(@feed_url).first[:title].should_not be_empty
|
99
|
+
end
|
71
100
|
end
|
101
|
+
|
102
|
+
before(:all) do
|
103
|
+
@domain_url = "http://sitewithfeed.com"
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
def fake_requests_for options = {}
|
109
|
+
content = options.delete(:content)
|
110
|
+
path_inside_content = options.delete(:path_inside_content)
|
111
|
+
resource_path = options.delete(:resource_path)
|
112
|
+
FakeWeb.register_uri(:get, resource_path, :body => content)
|
113
|
+
FakeWeb.register_uri(:head, resource_path + path_inside_content, :content => 'text/html')
|
114
|
+
FakeWeb.register_uri(:get, resource_path + path_inside_content, :content => content)
|
72
115
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Spix::FeedDiscoveryList do
|
4
|
+
|
5
|
+
let(:feed_discovery_list) { Spix::FeedDiscoveryList.new }
|
6
|
+
|
7
|
+
it "should inherit from array" do
|
8
|
+
feed_discovery_list.class.superclass.should == Array
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#invalids" do
|
12
|
+
it "should return an empty array from invalids accessor method" do
|
13
|
+
feed_discovery_list.invalids.should == []
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: spix_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 1.
|
5
|
+
version: 1.6.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Marcelo Eden
|
@@ -13,7 +13,7 @@ autorequire:
|
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
15
|
|
16
|
-
date: 2011-05-
|
16
|
+
date: 2011-05-31 00:00:00 -03:00
|
17
17
|
default_executable:
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
@@ -100,6 +100,10 @@ files:
|
|
100
100
|
- lib/spix_parser/custom_parsers/rss_entry.rb
|
101
101
|
- lib/spix_parser/datetime.rb
|
102
102
|
- lib/spix_parser/parser.rb
|
103
|
+
- lib/spix_parser/tools/discovery.rb
|
104
|
+
- lib/spix_parser/tools/feed_discovery/base.rb
|
105
|
+
- lib/spix_parser/tools/feed_discovery/document.rb
|
106
|
+
- lib/spix_parser/tools/feed_discovery/feed.rb
|
103
107
|
- lib/spix_parser/tools/feed_discovery.rb
|
104
108
|
- lib/spix_parser/tools/redirect_follower.rb
|
105
109
|
- lib/spix_parser/version.rb
|
@@ -110,7 +114,10 @@ files:
|
|
110
114
|
- lib/spix_parser.rb
|
111
115
|
- spec/parser_spec.rb
|
112
116
|
- spec/spix_parser/parser_spec.rb
|
117
|
+
- spec/spix_parser/tools/feed_discovery/document_spec.rb
|
118
|
+
- spec/spix_parser/tools/feed_discovery/feed_spec.rb
|
113
119
|
- spec/spix_parser/tools/feed_discovery_spec.rb
|
120
|
+
- spec/spix_parser/tools/feed_list_spec.rb
|
114
121
|
- spec/spix_parser/utils_spec.rb
|
115
122
|
has_rdoc: true
|
116
123
|
homepage: http://github.com/busk/spix_parser
|
@@ -143,5 +150,8 @@ summary: FeedParser for Spix
|
|
143
150
|
test_files:
|
144
151
|
- spec/parser_spec.rb
|
145
152
|
- spec/spix_parser/parser_spec.rb
|
153
|
+
- spec/spix_parser/tools/feed_discovery/document_spec.rb
|
154
|
+
- spec/spix_parser/tools/feed_discovery/feed_spec.rb
|
146
155
|
- spec/spix_parser/tools/feed_discovery_spec.rb
|
156
|
+
- spec/spix_parser/tools/feed_list_spec.rb
|
147
157
|
- spec/spix_parser/utils_spec.rb
|