feedparser 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Manifest.txt +40 -29
- data/README.md +32 -12
- data/Rakefile +3 -3
- data/lib/feedparser/builder/atom.rb +14 -1
- data/lib/feedparser/builder/json.rb +11 -9
- data/lib/feedparser/feed.rb +17 -1
- data/lib/feedparser/item.rb +23 -1
- data/lib/feedparser/parser.rb +7 -11
- data/lib/feedparser/version.rb +2 -2
- data/test/feeds/byparker.json +9 -2
- data/test/feeds/daringfireball.atom +1866 -0
- data/test/feeds/daringfireball.json +591 -0
- data/test/feeds/inessential.json +173 -0
- data/test/feeds/intertwingly.atom +1197 -0
- data/test/feeds/learnenough.atom +744 -0
- data/test/feeds/spec/json/example.json +36 -0
- data/test/feeds/spec/json/microblog.json +34 -0
- data/test/feeds/xkcd.atom +48 -0
- data/test/feeds/xkcd.rss2 +55 -0
- data/test/helper.rb +14 -2
- data/test/test_dates.rb +52 -0
- data/test/test_feeds.rb +27 -0
- data/test/test_json.rb +4 -0
- metadata +17 -6
@@ -0,0 +1,36 @@
|
|
1
|
+
{
|
2
|
+
"version": "https://jsonfeed.org/version/1",
|
3
|
+
"title": "My Example Feed",
|
4
|
+
"home_page_url": "https://example.org/",
|
5
|
+
"feed_url": "https://example.org/feed.json",
|
6
|
+
"items": [
|
7
|
+
{
|
8
|
+
"id": "2",
|
9
|
+
"content_text": "This is a second item.",
|
10
|
+
"url": "https://example.org/second-item"
|
11
|
+
},
|
12
|
+
{
|
13
|
+
"id": "1",
|
14
|
+
"content_html": "<p>Hello, world!</p>",
|
15
|
+
"url": "https://example.org/initial-post"
|
16
|
+
}
|
17
|
+
]
|
18
|
+
}
|
19
|
+
|
20
|
+
---
|
21
|
+
|
22
|
+
feed.format: json
|
23
|
+
feed.title: My Example Feed
|
24
|
+
feed.url: https://example.org/
|
25
|
+
feed.feed_url: https://example.org/feed.json
|
26
|
+
|
27
|
+
feed.items.size: >>> 2
|
28
|
+
|
29
|
+
feed.items[0].id: 2
|
30
|
+
feed.items[0].content_text: This is a second item.
|
31
|
+
feed.items[0].url: https://example.org/second-item
|
32
|
+
|
33
|
+
|
34
|
+
feed.items[1].id: 1
|
35
|
+
feed.items[1].content_html: <p>Hello, world!</p>
|
36
|
+
feed.items[1].url: https://example.org/initial-post
|
@@ -0,0 +1,34 @@
|
|
1
|
+
{
|
2
|
+
"version": "https://jsonfeed.org/version/1",
|
3
|
+
"user_comment": "This is a microblog feed. You can add this to your feed reader using the following URL: https://example.org/feed.json",
|
4
|
+
"title": "Brent Simmons’s Microblog",
|
5
|
+
"home_page_url": "https://example.org/",
|
6
|
+
"feed_url": "https://example.org/feed.json",
|
7
|
+
"author": {
|
8
|
+
"name": "Brent Simmons",
|
9
|
+
"url": "http://example.org/",
|
10
|
+
"avatar": "https://example.org/avatar.png"
|
11
|
+
},
|
12
|
+
"items": [
|
13
|
+
{
|
14
|
+
"id": "2347259",
|
15
|
+
"url": "https://example.org/2347259",
|
16
|
+
"content_text": "Cats are neat. \n\nhttps://example.org/cats",
|
17
|
+
"date_published": "2016-02-09T14:22:00-07:00"
|
18
|
+
}
|
19
|
+
]
|
20
|
+
}
|
21
|
+
|
22
|
+
---
|
23
|
+
|
24
|
+
feed.format: json
|
25
|
+
feed.title: Brent Simmons’s Microblog
|
26
|
+
feed.url: https://example.org/
|
27
|
+
feed.feed_url: https://example.org/feed.json
|
28
|
+
|
29
|
+
feed.items.size: >>> 1
|
30
|
+
|
31
|
+
feed.items[0].id: 2347259
|
32
|
+
feed.items[0].url: https://example.org/2347259
|
33
|
+
feed.items[0].content_text: Cats are neat. \n\nhttps://example.org/cats
|
34
|
+
feed.items[0].published: >>> DateTime.new( 2016, 2, 9, 14, 22, 0, '-7')
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
|
3
|
+
<title>xkcd.com</title>
|
4
|
+
<link href="https://xkcd.com/" rel="alternate"></link>
|
5
|
+
<id>https://xkcd.com/</id>
|
6
|
+
<updated>2017-05-22T00:00:00Z</updated>
|
7
|
+
<entry>
|
8
|
+
<title>Genetic Testing Results</title>
|
9
|
+
<link href="https://xkcd.com/1840/" rel="alternate"></link>
|
10
|
+
<updated>2017-05-22T00:00:00Z</updated>
|
11
|
+
<id>https://xkcd.com/1840/</id>
|
12
|
+
<summary type="html"><img src="https://imgs.xkcd.com/comics/genetic_testing_results.png" title="That's very exciting! The bad news is that it's a risk factor for a lot of things." alt="That's very exciting! The bad news is that it's a risk factor for a lot of things." /></summary>
|
13
|
+
</entry>
|
14
|
+
<entry>
|
15
|
+
<title>Doctor Visit</title>
|
16
|
+
<link href="https://xkcd.com/1839/" rel="alternate"></link>
|
17
|
+
<updated>2017-05-19T00:00:00Z</updated>
|
18
|
+
<id>https://xkcd.com/1839/</id>
|
19
|
+
<summary type="html"><img src="https://imgs.xkcd.com/comics/doctor_visit.png" title="According to these blood tests, you're like 30% cereal." alt="According to these blood tests, you're like 30% cereal." /></summary>
|
20
|
+
</entry>
|
21
|
+
<entry>
|
22
|
+
<title>Machine Learning</title>
|
23
|
+
<link href="https://xkcd.com/1838/" rel="alternate"></link>
|
24
|
+
<updated>2017-05-17T00:00:00Z</updated>
|
25
|
+
<id>https://xkcd.com/1838/</id>
|
26
|
+
<summary type="html"><img src="https://imgs.xkcd.com/comics/machine_learning.png" title="The pile gets soaked with data and starts to get mushy over time, so it's technically recurrent." alt="The pile gets soaked with data and starts to get mushy over time, so it's technically recurrent." /></summary>
|
27
|
+
</entry>
|
28
|
+
<entry>
|
29
|
+
<title>Rental Car</title>
|
30
|
+
<link href="https://xkcd.com/1837/" rel="alternate"></link>
|
31
|
+
<updated>2017-05-15T00:00:00Z</updated>
|
32
|
+
<id>https://xkcd.com/1837/</id>
|
33
|
+
<summary type="html"><img src="https://imgs.xkcd.com/comics/rental_car.png" title="Technically, both cars are haunted, but the murder ghosts can't stand listening to the broken GPS for more than a few minutes." alt="Technically, both cars are haunted, but the murder ghosts can't stand listening to the broken GPS for more than a few minutes." /></summary>
|
34
|
+
</entry>
|
35
|
+
</feed>
|
36
|
+
|
37
|
+
---
|
38
|
+
|
39
|
+
feed.format: atom
|
40
|
+
feed.title: xkcd.com
|
41
|
+
feed.url: https://xkcd.com/
|
42
|
+
feed.updated: >>> DateTime.new( 2017, 5, 22 )
|
43
|
+
feed.items.size: >>> 4
|
44
|
+
|
45
|
+
feed.items[0].title: Genetic Testing Results
|
46
|
+
feed.items[0].url: https://xkcd.com/1840/
|
47
|
+
feed.items[0].guid: https://xkcd.com/1840/
|
48
|
+
feed.items[0].updated: >>> DateTime.new( 2017, 5, 22 )
|
@@ -0,0 +1,55 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<rss version="2.0">
|
3
|
+
<channel>
|
4
|
+
<title>xkcd.com</title>
|
5
|
+
<link>https://xkcd.com/</link>
|
6
|
+
<description>xkcd.com: A webcomic of romance and math humor.</description>
|
7
|
+
<language>en</language>
|
8
|
+
<item>
|
9
|
+
<title>Genetic Testing Results</title>
|
10
|
+
<link>https://xkcd.com/1840/</link>
|
11
|
+
<description><img src="https://imgs.xkcd.com/comics/genetic_testing_results.png" title="That's very exciting! The bad news is that it's a risk factor for a lot of things." alt="That's very exciting! The bad news is that it's a risk factor for a lot of things." /></description>
|
12
|
+
<pubDate>Mon, 22 May 2017 04:00:00 -0000</pubDate>
|
13
|
+
<guid>https://xkcd.com/1840/</guid>
|
14
|
+
</item>
|
15
|
+
<item>
|
16
|
+
<title>Doctor Visit</title>
|
17
|
+
<link>https://xkcd.com/1839/</link>
|
18
|
+
<description><img src="https://imgs.xkcd.com/comics/doctor_visit.png" title="According to these blood tests, you're like 30% cereal." alt="According to these blood tests, you're like 30% cereal." /></description>
|
19
|
+
<pubDate>Fri, 19 May 2017 04:00:00 -0000</pubDate>
|
20
|
+
<guid>https://xkcd.com/1839/</guid>
|
21
|
+
</item>
|
22
|
+
<item>
|
23
|
+
<title>Machine Learning</title>
|
24
|
+
<link>https://xkcd.com/1838/</link>
|
25
|
+
<description><img src="https://imgs.xkcd.com/comics/machine_learning.png" title="The pile gets soaked with data and starts to get mushy over time, so it's technically recurrent." alt="The pile gets soaked with data and starts to get mushy over time, so it's technically recurrent." /></description>
|
26
|
+
<pubDate>Wed, 17 May 2017 04:00:00 -0000</pubDate>
|
27
|
+
<guid>https://xkcd.com/1838/</guid>
|
28
|
+
</item>
|
29
|
+
<item>
|
30
|
+
<title>Rental Car</title>
|
31
|
+
<link>https://xkcd.com/1837/</link>
|
32
|
+
<description><img src="https://imgs.xkcd.com/comics/rental_car.png" title="Technically, both cars are haunted, but the murder ghosts can't stand listening to the broken GPS for more than a few minutes." alt="Technically, both cars are haunted, but the murder ghosts can't stand listening to the broken GPS for more than a few minutes." /></description>
|
33
|
+
<pubDate>Mon, 15 May 2017 04:00:00 -0000</pubDate>
|
34
|
+
<guid>https://xkcd.com/1837/</guid>
|
35
|
+
</item>
|
36
|
+
</channel>
|
37
|
+
</rss>
|
38
|
+
|
39
|
+
---
|
40
|
+
|
41
|
+
feed.format: rss 2.0
|
42
|
+
feed.title: xkcd.com
|
43
|
+
feed.summary: xkcd.com: A webcomic of romance and math humor.
|
44
|
+
feed.url: https://xkcd.com/
|
45
|
+
feed.items.size: >>> 4
|
46
|
+
|
47
|
+
feed.items[0].title: Genetic Testing Results
|
48
|
+
feed.items[0].url: https://xkcd.com/1840/
|
49
|
+
feed.items[0].guid: https://xkcd.com/1840/
|
50
|
+
feed.items[0].updated: >>> DateTime.new( 2017, 5, 22, 4, 0 )
|
51
|
+
|
52
|
+
feed.items[1].title: Doctor Visit
|
53
|
+
feed.items[1].url: https://xkcd.com/1839/
|
54
|
+
feed.items[1].guid: https://xkcd.com/1839/
|
55
|
+
feed.items[1].updated: >>> DateTime.new( 2017, 5, 19, 4, 0 )
|
data/test/helper.rb
CHANGED
@@ -43,7 +43,20 @@ class Test
|
|
43
43
|
expr = line[0...pos].strip ## NOTE: do NOT include colon (thus, use tree dots ...)
|
44
44
|
value = line[pos+1..-1].strip
|
45
45
|
|
46
|
-
|
46
|
+
|
47
|
+
## for ruby code use |> or >> or >>> or => or $ or | or RUN or ????
|
48
|
+
## otherwise assume "literal" string
|
49
|
+
|
50
|
+
if value.start_with? '>>>'
|
51
|
+
value = value[3..-1].strip
|
52
|
+
code="assert_equal #{value}, #{expr}"
|
53
|
+
elsif value.start_with? 'DateTime' ## todo/fix: remove; use >>> style
|
54
|
+
code="assert_equal #{value}, #{expr}"
|
55
|
+
else # assume value is a "plain" string
|
56
|
+
## note use %{ } so value can include quotes ('') etc.
|
57
|
+
code="assert_equal %{#{value}}, #{expr}"
|
58
|
+
end
|
59
|
+
|
47
60
|
puts "eval #{code}"
|
48
61
|
eval( code )
|
49
62
|
end # each line
|
@@ -59,4 +72,3 @@ def fetch_and_parse_feed( url )
|
|
59
72
|
|
60
73
|
FeedParser::Parser.parse( xml )
|
61
74
|
end
|
62
|
-
|
data/test/test_dates.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
###
|
2
|
+
# to run use
|
3
|
+
# ruby -I ./lib -I ./test test/test_dates.rb
|
4
|
+
# or better
|
5
|
+
# rake test
|
6
|
+
|
7
|
+
require 'helper'
|
8
|
+
|
9
|
+
|
10
|
+
class TestDates < MiniTest::Test
|
11
|
+
|
12
|
+
def test_iso8601 # used by atom, json feed
|
13
|
+
|
14
|
+
recs = [
|
15
|
+
[ '2017-05-20T19:23:06Z', DateTime.new(2017, 5,20,19,23, 6) ], # from daringfireball.json
|
16
|
+
[ '2017-05-20T19:23:08Z', DateTime.new(2017, 5,20,19,23, 8) ],
|
17
|
+
[ '2017-05-17T08:02:12-07:00', DateTime.new(2017, 5,17, 8, 2,12,'-7') ], # from jsonfeed.json
|
18
|
+
[ '2017-05-18T21:08:49+00:00', DateTime.new(2017, 5,18,21, 8,49) ], # from byparker.json
|
19
|
+
[ '2017-05-18T21:08:49.123+00:00', DateTime.new(2017, 5,18,21, 8,49.123) ], ### try with usec e.g. 49.124
|
20
|
+
[ '2017-05-17T08:02:12.567-07:00', DateTime.new(2017, 5,17, 8, 2,12.567,'-7') ],
|
21
|
+
]
|
22
|
+
|
23
|
+
recs.each do |rec|
|
24
|
+
d = DateTime.iso8601( rec[0] )
|
25
|
+
puts "class: #{d.class.name} - #{d.utc} (#{d.usec}) <= iso8601 #{rec[0]}"
|
26
|
+
pp d
|
27
|
+
assert_equal rec[1], d
|
28
|
+
end
|
29
|
+
end # test_iso8601
|
30
|
+
|
31
|
+
|
32
|
+
def test_rfc822 # used by rss 2.0
|
33
|
+
|
34
|
+
recs = [
|
35
|
+
[ 'Sat, 17 Jan 2015 11:57:47 +0000', DateTime.new( 2015, 1,17,11,57,47) ], # from sitepoint.rss2
|
36
|
+
[ 'Thu, 15 Jan 2015 15:00:56 +0000', DateTime.new( 2015, 1,15,15,00,56) ],
|
37
|
+
[ 'Fri, 16 Jan 2015 17:33:47 +0100', DateTime.new( 2015, 1,16,17,33,47,'+1') ], # from rubyflow.rss2
|
38
|
+
[ 'Fri, 16 Jan 2015 09:33:57 +0100', DateTime.new( 2015, 1,16, 9,33,57,'+1') ],
|
39
|
+
[ 'Wed, 17 Dec 2014 12:30:48 +0000', DateTime.new( 2014,12,17,12,30,48) ], # from rubymine.rss2
|
40
|
+
]
|
41
|
+
|
42
|
+
recs.each do |rec|
|
43
|
+
d = DateTime.rfc822( rec[0] )
|
44
|
+
puts "class: #{d.class.name} - #{d.utc} (#{d.usec}) <= rfc822 #{rec[0]}"
|
45
|
+
pp d
|
46
|
+
assert_equal rec[1], d
|
47
|
+
end
|
48
|
+
|
49
|
+
end # test_rfc822
|
50
|
+
|
51
|
+
|
52
|
+
end # class TestDates
|
data/test/test_feeds.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
###
|
2
|
+
# to run use
|
3
|
+
# ruby -I ./lib -I ./test test/test_feeds.rb
|
4
|
+
# or better
|
5
|
+
# rake test
|
6
|
+
|
7
|
+
require 'helper'
|
8
|
+
|
9
|
+
|
10
|
+
class TestFeeds < MiniTest::Test
|
11
|
+
|
12
|
+
def test_all
|
13
|
+
names = [
|
14
|
+
'learnenough.atom',
|
15
|
+
'xkcd.atom',
|
16
|
+
'xkcd.rss2',
|
17
|
+
'daringfireball.atom',
|
18
|
+
'intertwingly.atom',
|
19
|
+
]
|
20
|
+
|
21
|
+
names.each do |name|
|
22
|
+
assert_feed_tests_for( name )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
end # class TestFeeds
|
data/test/test_json.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: feedparser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logutils
|
@@ -66,8 +66,8 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '3.16'
|
69
|
-
description: feedparser - web feed parser and normalizer (RSS 2.0, Atom, etc.)
|
70
|
-
email:
|
69
|
+
description: feedparser - web feed parser and normalizer (RSS 2.0, Atom, JSON, etc.)
|
70
|
+
email: wwwmake@googlegroups.com
|
71
71
|
executables: []
|
72
72
|
extensions: []
|
73
73
|
extra_rdoc_files:
|
@@ -88,23 +88,34 @@ files:
|
|
88
88
|
- lib/feedparser/parser.rb
|
89
89
|
- lib/feedparser/version.rb
|
90
90
|
- test/feeds/byparker.json
|
91
|
+
- test/feeds/daringfireball.atom
|
92
|
+
- test/feeds/daringfireball.json
|
91
93
|
- test/feeds/googlegroups.atom
|
92
94
|
- test/feeds/googlegroups2.atom
|
93
95
|
- test/feeds/headius.atom
|
96
|
+
- test/feeds/inessential.json
|
97
|
+
- test/feeds/intertwingly.atom
|
94
98
|
- test/feeds/jsonfeed.json
|
95
99
|
- test/feeds/lambdatheultimate.rss2
|
100
|
+
- test/feeds/learnenough.atom
|
96
101
|
- test/feeds/railstutorial.atom
|
97
102
|
- test/feeds/rubyflow.rss2
|
98
103
|
- test/feeds/rubymine.rss2
|
99
104
|
- test/feeds/rubyonrails.atom
|
100
105
|
- test/feeds/sitepoint.rss2
|
106
|
+
- test/feeds/spec/json/example.json
|
107
|
+
- test/feeds/spec/json/microblog.json
|
108
|
+
- test/feeds/xkcd.atom
|
109
|
+
- test/feeds/xkcd.rss2
|
101
110
|
- test/helper.rb
|
102
111
|
- test/test_atom.rb
|
103
112
|
- test/test_atom_live.rb
|
113
|
+
- test/test_dates.rb
|
114
|
+
- test/test_feeds.rb
|
104
115
|
- test/test_json.rb
|
105
116
|
- test/test_rss.rb
|
106
117
|
- test/test_rss_live.rb
|
107
|
-
homepage: https://github.com/feedreader/
|
118
|
+
homepage: https://github.com/feedreader/feedparser
|
108
119
|
licenses:
|
109
120
|
- Public Domain
|
110
121
|
metadata: {}
|
@@ -129,5 +140,5 @@ rubyforge_project:
|
|
129
140
|
rubygems_version: 2.6.7
|
130
141
|
signing_key:
|
131
142
|
specification_version: 4
|
132
|
-
summary: feedparser - web feed parser and normalizer (RSS 2.0, Atom, etc.)
|
143
|
+
summary: feedparser - web feed parser and normalizer (RSS 2.0, Atom, JSON, etc.)
|
133
144
|
test_files: []
|