feedisco 0.1.2 → 0.1.3

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/README.md CHANGED
@@ -107,6 +107,10 @@ Contribute by forking, tweaking, and sending pull requests, but please add the a
107
107
 
108
108
  ### History
109
109
 
110
+ #### `0.1.3`
111
+
112
+ * Corrected bug causing some links to appear several times in the result.
113
+
110
114
  #### `0.1.2`
111
115
 
112
116
  * Supports `StringIO` as a return from the open-uri `open` method (which is returned instead of a `Tempfile` when the content is smaller than a given size - 10KB).
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.1.3
data/feedisco.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "feedisco"
8
- s.version = "0.1.2"
8
+ s.version = "0.1.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Romain Champourlier"]
@@ -30,23 +30,25 @@ module Feedisco
30
30
 
31
31
  # Check <link> elements
32
32
  doc.css('link').each do |link|
33
- feeds << complete_extracted_url(link[:href], harmonized_url) if link[:rel] =~ %r{(alternate|service.feed)}i && Feedisco.feed_content_types.include?(link[:type].downcase.strip)
33
+ discovery = complete_extracted_url(link[:href], harmonized_url) if link[:rel] =~ %r{(alternate|service.feed)}i && Feedisco.feed_content_types.include?(link[:type].downcase.strip)
34
+ feeds << discovery unless discovery.nil? or feeds.include? discovery
34
35
  end
35
36
 
36
37
  # Check <a> elements
37
38
  doc.css('a').each do |a|
38
- if (looks_like_feed?(a[:href]) &&
39
- (a[:href] =~ %r{\A/} || a[:href] =~ %r{#{URI.parse(harmonized_url).host}/}) &&
40
- !feeds.include?(a[:href]))
39
+ if looks_like_feed? a[:href] and
40
+ (a[:href] =~ %r{\A/} or a[:href] =~ %r{#{URI.parse(harmonized_url).host}/})
41
41
 
42
- feeds << complete_extracted_url(a[:href], harmonized_url)
42
+ discovery = complete_extracted_url(a[:href], harmonized_url)
43
+ feeds << discovery unless discovery.nil? or feeds.include?(discovery)
43
44
  end
44
45
  end
45
46
 
46
47
  # Check <a> elements again, less restrictively, so we add all discovered feeds even the ones
47
48
  # on external domains, but the will come after in the feeds array.
48
49
  doc.css('a').each do |a|
49
- feeds << complete_extracted_url(a[:href], harmonized_url) if (looks_like_feed?(a[:href]) && !feeds.include?(a[:href]))
50
+ discovery = complete_extracted_url(a[:href], harmonized_url) if looks_like_feed? a[:href]
51
+ feeds << discovery unless discovery.nil? or feeds.include?(discovery)
50
52
  end
51
53
  end
52
54
  end
@@ -1,6 +1,6 @@
1
1
  class Feedisco
2
2
 
3
3
  def version
4
- '0.1.2'
4
+ '0.1.3'
5
5
  end
6
6
  end
@@ -10,6 +10,7 @@
10
10
  <a href="http://example.com/feed.rss">feed.rss</a>
11
11
  <a href="http://another.domain.com/feed.rss">another domain's feed.rss</a>
12
12
  <a href="http://example.com/feed.rss">feed.rss</a>
13
+ <a href="feed.rss">feed.rss, without the prefix part</a>
13
14
  </body>
14
15
 
15
16
  </html>
@@ -19,16 +19,19 @@ describe "Feedisco::Discovery" do
19
19
 
20
20
  context 'from fixtures' do
21
21
 
22
- it 'should return an empty array' do
23
- file = File.open(File.join(File.dirname(__FILE__), '..', 'fixtures', 'no_link.html'))
22
+ def file_for_fixture(fixture_file_name)
23
+ file = File.open(File.join(File.dirname(__FILE__), '..', 'fixtures', fixture_file_name))
24
24
  file.stub!(:class => stub(:to_s => 'Tempfile'), :content_type => 'text/html')
25
+ file
26
+ end
25
27
 
26
- Feedisco.should_receive(:open).and_yield(file)
28
+ it 'should return an empty array' do
29
+ Feedisco.should_receive(:open).and_yield(file_for_fixture 'no_link.html')
27
30
  Feedisco.find('example.com').should == []
28
31
  end
29
32
 
30
33
  it 'should include the alternate link' do
31
- file = File.open(File.join(File.dirname(__FILE__), '..', 'fixtures', 'alternate.html'))
34
+ file = file_for_fixture 'alternate.html'
32
35
  file.stub!(:class => stub(:to_s => 'Tempfile'), :content_type => 'text/html')
33
36
 
34
37
  Feedisco.should_receive(:open).and_yield(file)
@@ -36,40 +39,35 @@ describe "Feedisco::Discovery" do
36
39
  end
37
40
 
38
41
  it 'should include a <a> link in the body' do
39
- file = File.open(File.join(File.dirname(__FILE__), '..', 'fixtures', 'one_link_in_body.html'))
40
- file.stub!(:class => stub(:to_s => 'Tempfile'), :content_type => 'text/html')
42
+ file = file_for_fixture 'one_link_in_body.html'
41
43
 
42
44
  Feedisco.should_receive(:open).and_yield(file)
43
45
  Feedisco.find('example.com').should include("http://example.com/feed.rss")
44
46
  end
45
47
 
46
48
  it 'should include link to feeds on the URL\'s domain' do
47
- file = File.open(File.join(File.dirname(__FILE__), '..', 'fixtures', 'several_links.html'))
48
- file.stub!(:class => stub(:to_s => 'Tempfile'), :content_type => 'text/html')
49
+ file = file_for_fixture 'several_links.html'
49
50
 
50
51
  Feedisco.should_receive(:open).and_yield(file)
51
52
  Feedisco.find('example.com').should include("http://example.com/feed.rss")
52
53
  end
53
54
 
54
55
  it 'should have the alternate link as the first of the returned feed' do
55
- file = File.open(File.join(File.dirname(__FILE__), '..', 'fixtures', 'several_links.html'))
56
- file.stub!(:class => stub(:to_s => 'Tempfile'), :content_type => 'text/html')
56
+ file = file_for_fixture 'several_links.html'
57
57
 
58
58
  Feedisco.should_receive(:open).and_yield(file)
59
59
  Feedisco.find('example.com').first.should == "http://example.com/feed.xml"
60
60
  end
61
61
 
62
62
  it 'should include link to feeds on other domains' do
63
- file = File.open(File.join(File.dirname(__FILE__), '..', 'fixtures', 'several_links.html'))
64
- file.stub!(:class => stub(:to_s => 'Tempfile'), :content_type => 'text/html')
63
+ file = file_for_fixture 'several_links.html'
65
64
 
66
65
  Feedisco.should_receive(:open).and_yield(file)
67
66
  Feedisco.find('example.com').should include "http://another.domain.com/feed.rss"
68
67
  end
69
68
 
70
69
  it 'should have links to feeds on other domains after links to feeds on the same domain' do
71
- file = File.open(File.join(File.dirname(__FILE__), '..', 'fixtures', 'several_links.html'))
72
- file.stub!(:class => stub(:to_s => 'Tempfile'), :content_type => 'text/html')
70
+ file = file_for_fixture 'several_links.html'
73
71
 
74
72
  Feedisco.should_receive(:open).and_yield(file)
75
73
  feeds = Feedisco.find('example.com')
@@ -77,13 +75,18 @@ describe "Feedisco::Discovery" do
77
75
  end
78
76
 
79
77
  it 'should include each link only once' do
80
- file = File.open(File.join(File.dirname(__FILE__), '..', 'fixtures', 'several_links.html'))
81
- file.stub!(:class => stub(:to_s => 'Tempfile'), :content_type => 'text/html')
78
+ file = file_for_fixture 'several_links.html'
82
79
 
83
80
  Feedisco.should_receive(:open).and_yield(file)
84
81
  feeds = Feedisco.find('example.com')
85
82
  feeds.select { |f| f == 'http://example.com/feed.rss' }.count.should == 1
86
83
  end
84
+
85
+ it "should complete a relative link" do
86
+ Feedisco.should_receive(:open).and_yield(file_for_fixture 'several_links.html')
87
+ feeds = Feedisco.find('example.com')
88
+ feeds.should include 'http://example.com/feed.rss'
89
+ end
87
90
  end
88
91
 
89
92
  context 'from real websites (this may change so some examples may break)' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: feedisco
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -104,7 +104,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
104
104
  version: '0'
105
105
  segments:
106
106
  - 0
107
- hash: -1864332675888607997
107
+ hash: 2342868453426803014
108
108
  required_rubygems_version: !ruby/object:Gem::Requirement
109
109
  none: false
110
110
  requirements: