feed_parser 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/feed_parser.rb CHANGED
@@ -3,7 +3,7 @@ require 'nokogiri'
3
3
 
4
4
  class FeedParser
5
5
 
6
- VERSION = "0.1.0"
6
+ VERSION = "0.1.1"
7
7
 
8
8
  def initialize(opts)
9
9
  @url = opts[:url]
@@ -3,7 +3,8 @@ class FeedParser
3
3
  attr_reader :type
4
4
 
5
5
  def initialize(feed_url)
6
- @feed = Nokogiri::XML(open(feed_url))
6
+ parsed_url = parse_url(feed_url)
7
+ @feed = Nokogiri::XML(open(parsed_url[:url], :http_basic_authentication => parsed_url[:basic_auth]))
7
8
  @feed.remove_namespaces!
8
9
  @type = (@feed.search('rss')[0] && :rss || :atom)
9
10
  self
@@ -33,5 +34,13 @@ class FeedParser
33
34
  :items => items.map(&:as_json)
34
35
  }
35
36
  end
37
+
38
+ private
39
+ def parse_url(feed_url)
40
+ protocol, auth, *the_rest = URI.split(feed_url)
41
+ url = (protocol && [protocol, the_rest.join].join('://') || the_rest.join)
42
+ basic_auth = auth.split(':') if auth
43
+ {:url => url, :basic_auth => basic_auth}
44
+ end
36
45
  end
37
46
  end
@@ -7,6 +7,38 @@ class NotSaneSanitizer
7
7
  end
8
8
 
9
9
  describe FeedParser do
10
+ describe FeedParser::Feed, "#new" do
11
+ it "should be able to open a feed url" do
12
+ parser = FeedParser.new(:url => "http://blog.example.com/feed/")
13
+ lambda {
14
+ parser.parse
15
+ }.should_not raise_error(ArgumentError)
16
+ lambda {
17
+ parser.parse
18
+ }.should raise_error(SocketError, /getaddrinfo: nodename nor servname provided, or not known/)
19
+ end
20
+
21
+ it "should be able to open feed urls with basic auth embedded to the url" do
22
+ parser = FeedParser.new(:url => "http://user:pass@blog.example.com/feed/")
23
+ lambda {
24
+ parser.parse
25
+ }.should_not raise_error(ArgumentError, /userinfo not supported/)
26
+ lambda {
27
+ parser.parse
28
+ }.should raise_error(SocketError, /getaddrinfo: nodename nor servname provided, or not known/)
29
+ end
30
+
31
+ it "should be able to open feed urls with only a user name embedded to the url" do
32
+ parser = FeedParser.new(:url => "http://user@blog.example.com/feed/")
33
+ lambda {
34
+ parser.parse
35
+ }.should_not raise_error(ArgumentError, /userinfo not supported/)
36
+ lambda {
37
+ parser.parse
38
+ }.should raise_error(SocketError, /getaddrinfo: nodename nor servname provided, or not known/)
39
+ end
40
+ end
41
+
10
42
  describe "#parse" do
11
43
  shared_examples_for "feed parser" do
12
44
  it "should not fail" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: feed_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-11-23 00:00:00.000000000 Z
12
+ date: 2011-11-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
16
- requirement: &2156421000 !ruby/object:Gem::Requirement
16
+ requirement: &2156409240 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2156421000
24
+ version_requirements: *2156409240
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec-rails
27
- requirement: &2156419940 !ruby/object:Gem::Requirement
27
+ requirement: &2156408420 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '2.6'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *2156419940
35
+ version_requirements: *2156408420
36
36
  description: Rss and Atom feed parser with sanitizer support built on top of Nokogiri.
37
37
  email:
38
38
  - arttu.tervo@gmail.com