feedutils 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/{History.md → HISTORY.md} +0 -0
- data/Manifest.txt +4 -1
- data/README.md +1 -0
- data/Rakefile +5 -6
- data/lib/feedutils.rb +2 -16
- data/lib/feedutils/builder/atom.rb +30 -1
- data/lib/feedutils/version.rb +22 -2
- data/test/feeds/googlegroups.atom +18 -0
- data/test/feeds/googlegroups2.atom +20 -0
- data/test/helper.rb +10 -5
- data/test/test_atom.rb +10 -4
- data/test/test_atom_from_file.rb +28 -0
- data/test/test_rss.rb +1 -1
- metadata +41 -28
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: fc27ca90a5876fa6ae3ca6abaad1dba94d95a19b
|
4
|
+
data.tar.gz: 704c4187ca9e9b903fe99ecee3f45c7e5d0150cc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 19f0245d4dd3e01403ef6d822ddca5022178b6718201af402fcdd9f7963252acea856cdc45b3e28103f1e5efc92f9be5c2ee4abd78d2896d85af2f7929c96584
|
7
|
+
data.tar.gz: 8b684e82f2ba8473dc80ec5f4a02a0c10df15e0342aa4b182aaba6a55746dc8fd343d620e864a718056e1c6df4253c1e7d10e8e3d169d3551711e9c7a31c706f
|
data/{History.md → HISTORY.md}
RENAMED
File without changes
|
data/Manifest.txt
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
HISTORY.md
|
2
2
|
Manifest.txt
|
3
3
|
README.md
|
4
4
|
Rakefile
|
@@ -9,6 +9,9 @@ lib/feedutils/feed.rb
|
|
9
9
|
lib/feedutils/item.rb
|
10
10
|
lib/feedutils/parser.rb
|
11
11
|
lib/feedutils/version.rb
|
12
|
+
test/feeds/googlegroups.atom
|
13
|
+
test/feeds/googlegroups2.atom
|
12
14
|
test/helper.rb
|
13
15
|
test/test_atom.rb
|
16
|
+
test/test_atom_from_file.rb
|
14
17
|
test/test_rss.rb
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -15,19 +15,18 @@ Hoe.spec 'feedutils' do
|
|
15
15
|
|
16
16
|
# switch extension to .markdown for gihub formatting
|
17
17
|
self.readme_file = 'README.md'
|
18
|
-
self.history_file = '
|
18
|
+
self.history_file = 'HISTORY.md'
|
19
19
|
|
20
20
|
self.extra_deps = [
|
21
|
-
['logutils', '>= 0.
|
21
|
+
['logutils', '>= 0.6.1']
|
22
22
|
]
|
23
|
-
|
23
|
+
|
24
24
|
### todo: add fetcher dep for testing (e.g. development only)
|
25
25
|
|
26
26
|
self.licenses = ['Public Domain']
|
27
27
|
|
28
28
|
self.spec_extras = {
|
29
|
-
:
|
29
|
+
required_ruby_version: '>= 1.9.2'
|
30
30
|
}
|
31
31
|
|
32
|
-
|
33
|
-
end
|
32
|
+
end
|
data/lib/feedutils.rb
CHANGED
@@ -20,20 +20,6 @@ require 'feedutils/item'
|
|
20
20
|
require 'feedutils/parser'
|
21
21
|
|
22
22
|
|
23
|
-
module FeedUtils
|
24
|
-
|
25
|
-
def self.banner
|
26
|
-
"feedutils/#{VERSION} (with stdlib rss/#{RSS::VERSION}) on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
27
|
-
end
|
28
|
-
|
29
|
-
=begin
|
30
|
-
def self.root
|
31
|
-
"#{File.expand_path( File.dirname(File.dirname(__FILE__)) )}"
|
32
|
-
end
|
33
|
-
=end
|
34
|
-
|
35
|
-
end # module FeedUtils
|
36
|
-
|
37
|
-
|
38
|
-
puts FeedUtils.banner # say hello
|
39
23
|
|
24
|
+
# say hello
|
25
|
+
puts FeedUtils.banner if $DEBUG || (defined?($RUBYLIBS_DEBUG) && $RUBYLIBS_DEBUG)
|
@@ -27,6 +27,34 @@ class AtomFeedBuilder
|
|
27
27
|
feed.title = atom_feed.title.content
|
28
28
|
logger.debug " atom | title.content >#{atom_feed.title.content}< : #{atom_feed.title.content.class.name}"
|
29
29
|
|
30
|
+
|
31
|
+
## note: for now assume id is feed (html)url
|
32
|
+
## use url only if starts_with http
|
33
|
+
## might not be link e.g blogger uses for ids =>
|
34
|
+
## <id>tag:blogger.com,1999:blog-4704664917418794835</id>
|
35
|
+
##
|
36
|
+
## Note: remove (strip) leading and trailing spaces and newlines
|
37
|
+
|
38
|
+
if atom_feed.id.content.strip.start_with?( 'http' )
|
39
|
+
feed.url = atom_feed.id.content.strip
|
40
|
+
else
|
41
|
+
feed.url = nil
|
42
|
+
end
|
43
|
+
|
44
|
+
logger.debug " atom | id.content >#{atom_feed.id.content}< : #{atom_feed.id.content.class.name}"
|
45
|
+
|
46
|
+
## note: use links (plural to allow multiple links e.g. self,alternate,etc.)
|
47
|
+
atom_feed.links.each_with_index do |link,i|
|
48
|
+
logger.debug " atom | link[#{i+1}] link rel=>#{link.rel}< : #{link.rel.class.name} type=#{link.type} href=#{link.href}"
|
49
|
+
|
50
|
+
## for now assume alternate is link or no rel specified (assumes alterante)
|
51
|
+
## note: only set if feed.url is NOT already set (via <id> for example)
|
52
|
+
if feed.url.nil? && (link.rel == 'alternate' || link.rel.nil?)
|
53
|
+
feed.url = link.href
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
|
30
58
|
if atom_feed.updated
|
31
59
|
# NOTE: empty updated.content e.g. used by google groups feed
|
32
60
|
# will return nil : NilClass
|
@@ -38,7 +66,8 @@ class AtomFeedBuilder
|
|
38
66
|
end
|
39
67
|
|
40
68
|
if atom_feed.generator
|
41
|
-
|
69
|
+
## Note: remove (strip) leading and trailing spaces and newlines
|
70
|
+
feed.generator = atom_feed.generator.content.strip
|
42
71
|
logger.debug " atom | generator.content >#{atom_feed.generator.content}< : #{atom_feed.generator.content.class.name}"
|
43
72
|
|
44
73
|
# pp atom_feed.generator
|
data/lib/feedutils/version.rb
CHANGED
@@ -1,4 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
|
2
3
|
module FeedUtils
|
3
|
-
|
4
|
-
|
4
|
+
|
5
|
+
MAJOR = 0
|
6
|
+
MINOR = 5
|
7
|
+
PATCH = 0
|
8
|
+
VERSION = [MAJOR,MINOR,PATCH].join('.')
|
9
|
+
|
10
|
+
def self.version
|
11
|
+
VERSION
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
def self.banner
|
16
|
+
"feedutils/#{VERSION} (with stdlib rss/#{RSS::VERSION}) on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.root
|
20
|
+
"#{File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )}"
|
21
|
+
end
|
22
|
+
|
23
|
+
end # module FeedUtils
|
24
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<feed xmlns="http://www.w3.org/2005/Atom">
|
2
|
+
<id>https://groups.google.com/d/forum/beerdb</id>
|
3
|
+
<title type="text">Open Beer & Brewery Database (beer.db)</title>
|
4
|
+
<subtitle>Free open public domain beer database &amp; schema (beer.db) for use in any (programming) language (e.g. uses plain text fixtures/data sets). Questions? Comments?</subtitle>
|
5
|
+
<link rel="self" href="https://groups.google.com/forum/feed/beerdb/topics/atom_v1_0.xml" title="beerdb feed"></link>
|
6
|
+
<updated></updated>
|
7
|
+
<generator>Google Groups</generator>
|
8
|
+
<entry>
|
9
|
+
<author>
|
10
|
+
<name>Joe Sixpack</name>
|
11
|
+
</author>
|
12
|
+
<updated>2014-12-17T11:54:43Z</updated>
|
13
|
+
<id>https://groups.google.com/d/topic/beerdb/KpQOUDYJ3J8</id>
|
14
|
+
<link href="https://groups.google.com/d/topic/beerdb/KpQOUDYJ3J8"></link>
|
15
|
+
<title type="text">Planet Beer (Austria, Belgium) - Feeds Incl. Craft Fest Wien, Beer-A-Day, proBier n Friends</title>
|
16
|
+
<summary type="html">Hello, I've started putting together a planet site for beer, that is, Planet Beer [1]. The first feed lists include: - Austria [2] - Belgium [3] You're welcome and invited to suggest new countries and feeds. Cheers. Prost. [1] http://planetbeer.herokuapp.com [2] http://github.com/openbeer/planet/blob/master/</summary>
|
17
|
+
</entry>
|
18
|
+
</feed>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<feed xmlns="http://www.w3.org/2005/Atom">
|
2
|
+
<id>https://groups.google.com/d/forum/beerdb</id>
|
3
|
+
<title type="text">Open Beer & Brewery Database (beer.db)</title>
|
4
|
+
<subtitle>Free open public domain beer database &amp; schema (beer.db) for use in any (programming) language (e.g. uses plain text fixtures/data sets). Questions? Comments?</subtitle>
|
5
|
+
<link rel="self" href="https://groups.google.com/forum/feed/beerdb/topics/atom_v1_0.xml" title="beerdb feed"></link>
|
6
|
+
<updated></updated>
|
7
|
+
<generator>
|
8
|
+
Google Groups (w/ leading n trailing newlines stripped)
|
9
|
+
</generator>
|
10
|
+
<entry>
|
11
|
+
<author>
|
12
|
+
<name>Joe Sixpack</name>
|
13
|
+
</author>
|
14
|
+
<updated>2014-12-17T11:54:43Z</updated>
|
15
|
+
<id>https://groups.google.com/d/topic/beerdb/KpQOUDYJ3J8</id>
|
16
|
+
<link href="https://groups.google.com/d/topic/beerdb/KpQOUDYJ3J8"></link>
|
17
|
+
<title type="text">Planet Beer (Austria, Belgium) - Feeds Incl. Craft Fest Wien, Beer-A-Day, proBier n Friends</title>
|
18
|
+
<summary type="html">Hello, I've started putting together a planet site for beer, that is, Planet Beer [1]. The first feed lists include: - Austria [2] - Belgium [3] You're welcome and invited to suggest new countries and feeds. Cheers. Prost. [1] http://planetbeer.herokuapp.com [2] http://github.com/openbeer/planet/blob/master/</summary>
|
19
|
+
</entry>
|
20
|
+
</feed>
|
data/test/helper.rb
CHANGED
@@ -3,11 +3,8 @@
|
|
3
3
|
|
4
4
|
## minitest setup
|
5
5
|
|
6
|
-
# require 'minitest/unit'
|
7
6
|
require 'minitest/autorun'
|
8
7
|
|
9
|
-
# include MiniTest::Unit # lets us use TestCase instead of MiniTest::Unit::TestCase
|
10
|
-
|
11
8
|
require 'logutils'
|
12
9
|
require 'fetcher'
|
13
10
|
|
@@ -18,8 +15,16 @@ require 'feedutils'
|
|
18
15
|
|
19
16
|
LogUtils::Logger.root.level = :debug
|
20
17
|
|
21
|
-
def parse_feed(
|
22
|
-
xml = Fetcher.read(
|
18
|
+
def parse_feed( url )
|
19
|
+
xml = Fetcher.read( url )
|
23
20
|
|
24
21
|
FeedUtils::Parser.parse( xml )
|
25
22
|
end
|
23
|
+
|
24
|
+
|
25
|
+
def parse_feed_from_file( name )
|
26
|
+
xml = File.read( "#{FeedUtils.root}/test/feeds/#{name}")
|
27
|
+
|
28
|
+
FeedUtils::Parser.parse( xml )
|
29
|
+
end
|
30
|
+
|
data/test/test_atom.rb
CHANGED
@@ -1,29 +1,34 @@
|
|
1
1
|
###
|
2
2
|
# to run use
|
3
|
-
# ruby -I ./lib -I ./test test/
|
3
|
+
# ruby -I ./lib -I ./test test/test_atom.rb
|
4
4
|
# or better
|
5
5
|
# rake test
|
6
6
|
|
7
7
|
require 'helper'
|
8
8
|
|
9
|
-
class TestAtom < MiniTest::
|
9
|
+
class TestAtom < MiniTest::Test
|
10
10
|
|
11
11
|
def test_rubyonrails
|
12
12
|
feed = parse_feed( 'http://weblog.rubyonrails.org/feed/atom.xml' )
|
13
13
|
|
14
|
-
assert_equal 'atom',
|
14
|
+
assert_equal 'atom', feed.format
|
15
|
+
assert_equal 'http://weblog.rubyonrails.org/', feed.url
|
15
16
|
end
|
16
17
|
|
18
|
+
|
17
19
|
def test_railstutorial
|
18
20
|
feed = parse_feed( 'http://feeds.feedburner.com/railstutorial?format=xml' )
|
19
21
|
|
20
|
-
assert_equal 'atom',
|
22
|
+
assert_equal 'atom', feed.format
|
23
|
+
assert_equal 'http://news.railstutorial.org/', feed.url
|
21
24
|
end
|
22
25
|
|
26
|
+
|
23
27
|
def test_googlegroup
|
24
28
|
feed = parse_feed( 'https://groups.google.com/forum/feed/beerdb/topics/atom.xml?num=15' )
|
25
29
|
|
26
30
|
assert_equal 'atom', feed.format
|
31
|
+
assert_equal 'https://groups.google.com/d/forum/beerdb', feed.url
|
27
32
|
end
|
28
33
|
|
29
34
|
|
@@ -34,6 +39,7 @@ class TestAtom < MiniTest::Unit::TestCase
|
|
34
39
|
assert_equal 'Blogger', feed.generator
|
35
40
|
assert_equal 'Headius', feed.title
|
36
41
|
assert_equal 'Helping the JVM Into the 21st Century', feed.title2 # aka subtitle in atom
|
42
|
+
assert_equal 'http://blog.headius.com/', feed.url
|
37
43
|
end
|
38
44
|
|
39
45
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
###
|
2
|
+
# to run use
|
3
|
+
# ruby -I ./lib -I ./test test/test_atom_from_file.rb
|
4
|
+
# or better
|
5
|
+
# rake test
|
6
|
+
|
7
|
+
require 'helper'
|
8
|
+
|
9
|
+
|
10
|
+
class TestAtomFromFile < MiniTest::Test
|
11
|
+
|
12
|
+
def test_googlegroup
|
13
|
+
feed = parse_feed_from_file( 'googlegroups.atom' )
|
14
|
+
|
15
|
+
assert_equal 'atom', feed.format
|
16
|
+
assert_equal 'Google Groups', feed.generator
|
17
|
+
assert_equal 'https://groups.google.com/d/forum/beerdb', feed.url
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_googlegroup2
|
21
|
+
feed = parse_feed_from_file( 'googlegroups2.atom' )
|
22
|
+
|
23
|
+
assert_equal 'atom', feed.format
|
24
|
+
assert_equal 'Google Groups (w/ leading n trailing newlines stripped)', feed.generator
|
25
|
+
assert_equal 'https://groups.google.com/d/forum/beerdb', feed.url
|
26
|
+
end
|
27
|
+
|
28
|
+
end # class TestAtomFromFile
|
data/test/test_rss.rb
CHANGED
metadata
CHANGED
@@ -1,57 +1,68 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: feedutils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.5.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Gerald Bauer
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-12-20 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: logutils
|
16
|
-
requirement:
|
17
|
-
none: false
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
19
|
+
version: 0.6.1
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
|
-
version_requirements:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.6.1
|
25
27
|
- !ruby/object:Gem::Dependency
|
26
28
|
name: rdoc
|
27
|
-
requirement:
|
28
|
-
none: false
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
|
-
- - ~>
|
31
|
+
- - "~>"
|
31
32
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
33
|
+
version: '4.0'
|
33
34
|
type: :development
|
34
35
|
prerelease: false
|
35
|
-
version_requirements:
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4.0'
|
36
41
|
- !ruby/object:Gem::Dependency
|
37
42
|
name: hoe
|
38
|
-
requirement:
|
39
|
-
none: false
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
40
44
|
requirements:
|
41
|
-
- - ~>
|
45
|
+
- - "~>"
|
42
46
|
- !ruby/object:Gem::Version
|
43
|
-
version: '3.
|
47
|
+
version: '3.13'
|
44
48
|
type: :development
|
45
49
|
prerelease: false
|
46
|
-
version_requirements:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.13'
|
47
55
|
description: feedutils - web feed parser and normalizer (RSS 2.0, Atom, etc.)
|
48
56
|
email: feedreader@googlegroups.com
|
49
57
|
executables: []
|
50
58
|
extensions: []
|
51
59
|
extra_rdoc_files:
|
60
|
+
- HISTORY.md
|
52
61
|
- Manifest.txt
|
62
|
+
- README.md
|
53
63
|
files:
|
54
|
-
-
|
64
|
+
- ".gemtest"
|
65
|
+
- HISTORY.md
|
55
66
|
- Manifest.txt
|
56
67
|
- README.md
|
57
68
|
- Rakefile
|
@@ -62,37 +73,39 @@ files:
|
|
62
73
|
- lib/feedutils/item.rb
|
63
74
|
- lib/feedutils/parser.rb
|
64
75
|
- lib/feedutils/version.rb
|
76
|
+
- test/feeds/googlegroups.atom
|
77
|
+
- test/feeds/googlegroups2.atom
|
65
78
|
- test/helper.rb
|
66
79
|
- test/test_atom.rb
|
80
|
+
- test/test_atom_from_file.rb
|
67
81
|
- test/test_rss.rb
|
68
|
-
- .gemtest
|
69
82
|
homepage: https://github.com/rubylibs/feedutils
|
70
83
|
licenses:
|
71
84
|
- Public Domain
|
85
|
+
metadata: {}
|
72
86
|
post_install_message:
|
73
87
|
rdoc_options:
|
74
|
-
- --main
|
88
|
+
- "--main"
|
75
89
|
- README.md
|
76
90
|
require_paths:
|
77
91
|
- lib
|
78
92
|
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
-
none: false
|
80
93
|
requirements:
|
81
|
-
- -
|
94
|
+
- - ">="
|
82
95
|
- !ruby/object:Gem::Version
|
83
96
|
version: 1.9.2
|
84
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
-
none: false
|
86
98
|
requirements:
|
87
|
-
- -
|
99
|
+
- - ">="
|
88
100
|
- !ruby/object:Gem::Version
|
89
101
|
version: '0'
|
90
102
|
requirements: []
|
91
|
-
rubyforge_project:
|
92
|
-
rubygems_version:
|
103
|
+
rubyforge_project:
|
104
|
+
rubygems_version: 2.4.2
|
93
105
|
signing_key:
|
94
|
-
specification_version:
|
106
|
+
specification_version: 4
|
95
107
|
summary: feedutils - web feed parser and normalizer (RSS 2.0, Atom, etc.)
|
96
108
|
test_files:
|
97
109
|
- test/test_atom.rb
|
110
|
+
- test/test_atom_from_file.rb
|
98
111
|
- test/test_rss.rb
|