feed-normalizer 1.5.1 → 1.5.2
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/History.txt +48 -48
- data/License.txt +27 -27
- data/Manifest.txt +18 -19
- data/README.txt +63 -63
- data/Rakefile +29 -25
- data/lib/feed-normalizer.rb +149 -149
- data/lib/html-cleaner.rb +181 -190
- data/lib/parsers/rss.rb +110 -95
- data/lib/parsers/simple-rss.rb +138 -137
- data/lib/structures.rb +245 -244
- data/test/data/atom03.xml +128 -127
- data/test/data/atom10.xml +114 -112
- data/test/data/rdf10.xml +1498 -1498
- data/test/data/rss20.xml +64 -63
- data/test/data/rss20diff.xml +59 -59
- data/test/data/rss20diff_short.xml +51 -51
- data/test/test_feednormalizer.rb +265 -267
- data/test/test_htmlcleaner.rb +156 -155
- metadata +99 -63
- data/test/test_all.rb +0 -6
data/test/test_htmlcleaner.rb
CHANGED
@@ -1,155 +1,156 @@
|
|
1
|
-
|
2
|
-
require '
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
assert_equal "
|
11
|
-
assert_equal "\"
|
12
|
-
assert_equal "
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
assert_equal "
|
18
|
-
assert_equal "
|
19
|
-
assert_equal "&
|
20
|
-
assert_equal "& { &
|
21
|
-
assert_equal "
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
assert_equal "<p>foo > *</p>", HtmlCleaner.clean("<p>foo
|
29
|
-
|
30
|
-
|
31
|
-
assert_equal "<p>para</p>
|
32
|
-
|
33
|
-
|
34
|
-
assert_equal "<p>para</p>", HtmlCleaner.clean("<p>para</p></
|
35
|
-
|
36
|
-
|
37
|
-
assert_equal "<p>para</p>", HtmlCleaner.clean("<p>para</p><
|
38
|
-
assert_equal "<p>para</p>", HtmlCleaner.clean("<p>para</p><
|
39
|
-
assert_equal "<p>para</p>", HtmlCleaner.clean("<p>para</p><iframe src='http://evil.example.org'>")
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
assert_equal "<a href=\"http://example.org
|
45
|
-
|
46
|
-
|
47
|
-
assert_equal "<p>two</p>", HtmlCleaner.clean("<p>para</p><body><p>two</p>")
|
48
|
-
assert_equal "<p>
|
49
|
-
assert_equal "<p>para</p><bo
|
50
|
-
assert_equal "<p>two</p>", HtmlCleaner.clean("<p>para</p><
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
assert_equal "<p id=\"p\">para</p>", HtmlCleaner.clean("<p id=\"p\"
|
56
|
-
|
57
|
-
|
58
|
-
assert_equal "<img />", HtmlCleaner.clean("<img src=\"
|
59
|
-
|
60
|
-
|
61
|
-
assert_equal "
|
62
|
-
assert_equal ""what's new?"", HtmlCleaner.clean("
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
assert_equal "<
|
77
|
-
|
78
|
-
|
79
|
-
assert_equal "<img src=\"
|
80
|
-
assert_equal "
|
81
|
-
|
82
|
-
|
83
|
-
#
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
assert_equal "
|
89
|
-
assert_equal "<p
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
assert_equal "hello
|
99
|
-
|
100
|
-
|
101
|
-
assert_equal "
|
102
|
-
assert_equal "
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
assert_equal "http://example.org
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
assert HtmlCleaner.dodgy_uri?("
|
116
|
-
assert HtmlCleaner.dodgy_uri?("
|
117
|
-
assert HtmlCleaner.dodgy_uri?("
|
118
|
-
|
119
|
-
|
120
|
-
#
|
121
|
-
|
122
|
-
assert HtmlCleaner.dodgy_uri?("javascript:alert('img-ob-2'
|
123
|
-
|
124
|
-
|
125
|
-
assert HtmlCleaner.dodgy_uri?("&#
|
126
|
-
assert HtmlCleaner.dodgy_uri?("&#
|
127
|
-
assert HtmlCleaner.dodgy_uri?("&#
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
assert HtmlCleaner.dodgy_uri?("
|
135
|
-
assert HtmlCleaner.dodgy_uri?("
|
136
|
-
assert HtmlCleaner.dodgy_uri?("
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
assert HtmlCleaner.dodgy_uri?("
|
141
|
-
assert HtmlCleaner.dodgy_uri?("
|
142
|
-
assert HtmlCleaner.dodgy_uri?("jav&#
|
143
|
-
assert HtmlCleaner.dodgy_uri?("jav
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
assert_nil HtmlCleaner.dodgy_uri?(
|
148
|
-
assert_nil HtmlCleaner.dodgy_uri?("http://example.org
|
149
|
-
assert_nil HtmlCleaner.dodgy_uri?("http://example.org/foo.
|
150
|
-
assert_nil HtmlCleaner.dodgy_uri?("http://example.org/foo.cgi?x=y&
|
151
|
-
assert_nil HtmlCleaner.dodgy_uri?("http://example.org/foo.cgi?x=y
|
152
|
-
assert_nil HtmlCleaner.dodgy_uri?("http://example.org/foo.cgi?x=y&#
|
153
|
-
|
154
|
-
|
155
|
-
|
1
|
+
$LOAD_PATH.unshift(File.expand_path(File.join(File.dirname(__FILE__), '../lib')))
|
2
|
+
require 'test/unit'
|
3
|
+
require 'html-cleaner'
|
4
|
+
|
5
|
+
include FeedNormalizer
|
6
|
+
|
7
|
+
class HtmlCleanerTest < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def test_unescape
|
10
|
+
assert_equal "' ' °", FeedNormalizer::HtmlCleaner.unescapeHTML("' ' °")
|
11
|
+
assert_equal "\" °", FeedNormalizer::HtmlCleaner.unescapeHTML("" °")
|
12
|
+
assert_equal "\"\"\"\"", FeedNormalizer::HtmlCleaner.unescapeHTML("""""")
|
13
|
+
assert_equal "heavily subnet’d network,", FeedNormalizer::HtmlCleaner.unescapeHTML("heavily subnet’d network,")
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_add_entities
|
17
|
+
assert_equal "", HtmlCleaner.add_entities(nil)
|
18
|
+
assert_equal "x > y", HtmlCleaner.add_entities("x > y")
|
19
|
+
assert_equal "1 & 2", HtmlCleaner.add_entities("1 & 2")
|
20
|
+
assert_equal "& { ´ ģ", HtmlCleaner.add_entities("& { ´ ģ")
|
21
|
+
assert_equal "& { &ACUTE; ሺ ࠏ", HtmlCleaner.add_entities("& { &ACUTE; ሺ ࠏ")
|
22
|
+
assert_equal "heavily subnet’d network,", HtmlCleaner.add_entities("heavily subnet’d network,")
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_html_clean
|
26
|
+
assert_equal "", HtmlCleaner.clean("")
|
27
|
+
|
28
|
+
assert_equal "<p>foo > *</p>", HtmlCleaner.clean("<p>foo > *</p>")
|
29
|
+
assert_equal "<p>foo > *</p>", HtmlCleaner.clean("<p>foo > *</p>")
|
30
|
+
|
31
|
+
assert_equal "<p>para</p>", HtmlCleaner.clean("<p foo=bar>para</p>")
|
32
|
+
assert_equal "<p>para</p> outsider", HtmlCleaner.clean("<p foo=bar>para</p> outsider")
|
33
|
+
|
34
|
+
assert_equal "<p>para</p>", HtmlCleaner.clean("<p>para</p></notvalid>")
|
35
|
+
assert_equal "<p>para</p>", HtmlCleaner.clean("<p>para</p></body>")
|
36
|
+
|
37
|
+
assert_equal "<p>para</p>", HtmlCleaner.clean("<p>para</p><plaintext>")
|
38
|
+
assert_equal "<p>para</p>", HtmlCleaner.clean("<p>para</p><object><param></param></object>")
|
39
|
+
assert_equal "<p>para</p>", HtmlCleaner.clean("<p>para</p><iframe src='http://evil.example.org'></iframe>")
|
40
|
+
assert_equal "<p>para</p>", HtmlCleaner.clean("<p>para</p><iframe src='http://evil.example.org'>")
|
41
|
+
|
42
|
+
assert_equal "<p>para</p>", HtmlCleaner.clean("<p>para</p><invalid>invalid</invalid>")
|
43
|
+
|
44
|
+
assert_equal "<a href=\"http://example.org\">para</a>", HtmlCleaner.clean("<a href='http://example.org'>para</a>")
|
45
|
+
assert_equal "<a href=\"http://example.org/proc?a&b\">para</a>", HtmlCleaner.clean("<a href='http://example.org/proc?a&b'>para</a>")
|
46
|
+
|
47
|
+
assert_equal "<p>two</p>", HtmlCleaner.clean("<p>para</p><body><p>two</p></body>")
|
48
|
+
assert_equal "<p>two</p>", HtmlCleaner.clean("<p>para</p><body><p>two</p>")
|
49
|
+
assert_equal "<p>para</p><bo /dy><p>two</p>", HtmlCleaner.clean("<p>para</p><bo /dy><p>two</p></body>")
|
50
|
+
assert_equal "<p>para</p><bo\\/dy><p>two</p>", HtmlCleaner.clean("<p>para</p><bo\\/dy><p>two</p></body>")
|
51
|
+
assert_equal "<p>two</p>", HtmlCleaner.clean("<p>para</p><body/><p>two</p></body>")
|
52
|
+
|
53
|
+
assert_equal "<p>one & two</p>", HtmlCleaner.clean(HtmlCleaner.clean("<p>one & two</p>"))
|
54
|
+
|
55
|
+
assert_equal "<p id=\"p\">para</p>", HtmlCleaner.clean("<p id=\"p\" ignore=\"this\">para</p>")
|
56
|
+
assert_equal "<p id=\"p\">para</p>", HtmlCleaner.clean("<p id=\"p\" onclick=\"this\">para</p>")
|
57
|
+
|
58
|
+
assert_equal "<img src=\"http://example.org/pic\" />", HtmlCleaner.clean("<img src=\"http://example.org/pic\" />")
|
59
|
+
assert_equal "<img />", HtmlCleaner.clean("<img src=\"jav a script:call()\" />")
|
60
|
+
|
61
|
+
assert_equal "what's new", HtmlCleaner.clean("what's new")
|
62
|
+
assert_equal ""what's new?"", HtmlCleaner.clean("\"what's new?\"")
|
63
|
+
assert_equal ""what's new?"", HtmlCleaner.clean(""what's new?"")
|
64
|
+
|
65
|
+
# Real-world examples from selected feeds
|
66
|
+
assert_equal "I have a heavily subnet’d/vlan’d network,", HtmlCleaner.clean("I have a heavily subnet’d/vlan’d network,")
|
67
|
+
|
68
|
+
assert_equal "<pre><blockquote><%= start_form_tag :action => "create" %></blockquote></pre>",
|
69
|
+
HtmlCleaner.clean("<pre><blockquote><%= start_form_tag :action => \"create\" %></blockquote></pre>")
|
70
|
+
|
71
|
+
assert_equal "<a href=\"http://www.mcall.com/news/local/all-smashedmachine1107-cn,0,1574203.story?coll=all-news-hed\">[link]</a><a href=\"http://reddit.com/info/pyhc/comments\">[more]</a>",
|
72
|
+
HtmlCleaner.clean("<a href=\"http://www.mcall.com/news/local/all-smashedmachine1107-cn,0,1574203.story?coll=all-news-hed\">[link]</a><a href=\"http://reddit.com/info/pyhc/comments\">[more]</a>")
|
73
|
+
|
74
|
+
|
75
|
+
# Various exploits from the past
|
76
|
+
assert_equal "", HtmlCleaner.clean("<_img foo=\"<IFRAME width='80%' height='400' src='http://alive.znep.com/~marcs/passport/grabit.html'></IFRAME>\" >")
|
77
|
+
assert_equal "<a href=\"https://bugzilla.mozilla.org/attachment.cgi?id=&action=force_internal_error<script>alert(document.cookie)</script>\">link</a>",
|
78
|
+
HtmlCleaner.clean("<a href=\"https://bugzilla.mozilla.org/attachment.cgi?id=&action=force_internal_error<script>alert(document.cookie)</script>\">link</a>")
|
79
|
+
assert_equal "<img src=\"doesntexist.jpg\" />", HtmlCleaner.clean("<img src='doesntexist.jpg' onerror='alert(document.cookie)'/>")
|
80
|
+
assert_equal "<img src=\"'doesntexist.jpg\" />", HtmlCleaner.clean("<img src=\"'doesntexist.jpg\" onmouseover=\"alert('img-ob-11');''\"/>")
|
81
|
+
assert_equal "<IMG """>">", HtmlCleaner.clean("<IMG \"\"\"><SCRIPT>alert(\"XSS\")</SCRIPT>\">")
|
82
|
+
|
83
|
+
# This doesnt come out as I would like, but the result is still safe.
|
84
|
+
# (Apparently, this would work in Gecko.)
|
85
|
+
assert HtmlCleaner.clean("<p onclick!\#$%&()*~+-_.,:;?@[/|\\]^=alert(\"XSS\")>para</p>") !~ /\<\>/
|
86
|
+
assert_equal "<SCRIPT/XSS SRC="http://ha.ckers.org/xss.js">", HtmlCleaner.clean("<SCRIPT/XSS SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>")
|
87
|
+
|
88
|
+
assert_equal "", HtmlCleaner.clean("<!--[if gte IE 4]><SCRIPT>alert('XSS');</SCRIPT><![endif]-->")
|
89
|
+
assert_equal "<p></p>", HtmlCleaner.clean("<p><!--[if gte IE 4]><SCRIPT>alert('XSS');</SCRIPT><![endif]--></p>")
|
90
|
+
assert_equal "<p>hi</p><p></p>", HtmlCleaner.clean("<p>hi</p><p><!--[if gte IE 4]><SCRIPT>alert('XSS');</SCRIPT><![endif]--></p>")
|
91
|
+
|
92
|
+
assert_equal "<p>hello</p>", HtmlCleaner.clean("<p>h<!-- hoho -->ell<!-- hoho -->o</p>")
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_html_flatten
|
96
|
+
assert_equal "", HtmlCleaner.flatten("")
|
97
|
+
|
98
|
+
assert_equal "hello", HtmlCleaner.flatten("hello")
|
99
|
+
assert_equal "hello world", HtmlCleaner.flatten("hello\nworld")
|
100
|
+
|
101
|
+
assert_equal "A > B : C", HtmlCleaner.flatten("A > B : C")
|
102
|
+
assert_equal "what's new", HtmlCleaner.flatten("what's new")
|
103
|
+
assert_equal ""what's new?"", HtmlCleaner.flatten("\"what's new?\"")
|
104
|
+
|
105
|
+
assert_equal "we’ve got <a hre", HtmlCleaner.flatten("we’ve got <a hre")
|
106
|
+
|
107
|
+
assert_equal "http://example.org", HtmlCleaner.flatten("http://example.org")
|
108
|
+
assert_equal "http://example.org/proc?a&b", HtmlCleaner.flatten("http://example.org/proc?a&b")
|
109
|
+
|
110
|
+
assert_equal ""what's new?"", HtmlCleaner.flatten(HtmlCleaner.flatten("\"what's new?\""))
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_dodgy_uri
|
114
|
+
# All of these javascript urls work in IE6.
|
115
|
+
assert HtmlCleaner.dodgy_uri?("javascript:alert('HI');")
|
116
|
+
assert HtmlCleaner.dodgy_uri?(" javascript \n :alert('HI');")
|
117
|
+
assert HtmlCleaner.dodgy_uri?("JaVaScRiPt:alert('HI');")
|
118
|
+
assert HtmlCleaner.dodgy_uri?("JaV \naSc\nRiPt:alert('HI');")
|
119
|
+
|
120
|
+
# entities lacking ending ';'
|
121
|
+
# This only works if they're all packed together without spacing.
|
122
|
+
assert HtmlCleaner.dodgy_uri?("javascript:alert('img-ob-2')")
|
123
|
+
assert HtmlCleaner.dodgy_uri?("javascript:alert('img-ob-2' ) ; ")
|
124
|
+
# catch extra spacing anyway.. support for this is possible, depending where the spaces are.
|
125
|
+
assert HtmlCleaner.dodgy_uri?("j a v a s c r i p t : a l e r t ( ' i m g - o b - 2 ' ) ; ")
|
126
|
+
assert HtmlCleaner.dodgy_uri?("j a v a s c r i p t : a l e r t ( ' i m g - o b - 2 ' ) ; ")
|
127
|
+
assert HtmlCleaner.dodgy_uri?("javascript")
|
128
|
+
assert HtmlCleaner.dodgy_uri?("javascript")
|
129
|
+
|
130
|
+
# url-encoded
|
131
|
+
assert HtmlCleaner.dodgy_uri?("%6A%61%76%61%73%63%72%69%70%74%3A%61%6C%65%72%74%28%27%69%6D%67%2D%6F%62%2D%33%27%29")
|
132
|
+
|
133
|
+
# Other evil schemes
|
134
|
+
assert HtmlCleaner.dodgy_uri?("vbscript:MsgBox(\"hi\")")
|
135
|
+
assert HtmlCleaner.dodgy_uri?("mocha:alert('hi')")
|
136
|
+
assert HtmlCleaner.dodgy_uri?("livescript:alert('hi')")
|
137
|
+
assert HtmlCleaner.dodgy_uri?("data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K")
|
138
|
+
|
139
|
+
# Various non-printing chars
|
140
|
+
assert HtmlCleaner.dodgy_uri?("javas\0cript:foo()")
|
141
|
+
assert HtmlCleaner.dodgy_uri?("  javascript:foo()")
|
142
|
+
assert HtmlCleaner.dodgy_uri?("jav
ascript:foo()")
|
143
|
+
assert HtmlCleaner.dodgy_uri?("jav	ascript:foo()")
|
144
|
+
assert HtmlCleaner.dodgy_uri?("jav\tascript:foo()")
|
145
|
+
|
146
|
+
# The Good
|
147
|
+
assert_nil HtmlCleaner.dodgy_uri?(nil)
|
148
|
+
assert_nil HtmlCleaner.dodgy_uri?("http://example.org")
|
149
|
+
assert_nil HtmlCleaner.dodgy_uri?("http://example.org/foo.html")
|
150
|
+
assert_nil HtmlCleaner.dodgy_uri?("http://example.org/foo.cgi?x=y&a=b")
|
151
|
+
assert_nil HtmlCleaner.dodgy_uri?("http://example.org/foo.cgi?x=y&a=b")
|
152
|
+
assert_nil HtmlCleaner.dodgy_uri?("http://example.org/foo.cgi?x=y&a=b")
|
153
|
+
assert_nil HtmlCleaner.dodgy_uri?("http://example.org/foo.cgi?x=yVa=b")
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
metadata
CHANGED
@@ -1,74 +1,22 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.4
|
3
|
-
specification_version: 1
|
4
2
|
name: feed-normalizer
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.5.
|
7
|
-
date: 2008-02-06 00:00:00 -08:00
|
8
|
-
summary: Extensible Ruby wrapper for Atom and RSS parsers
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: andy@tinnedfruit.org
|
12
|
-
homepage: http://feed-normalizer.rubyforge.org/
|
13
|
-
rubyforge_project: feed-normalizer
|
14
|
-
description: An extensible Ruby wrapper for Atom and RSS parsers. Feed normalizer wraps various RSS and Atom parsers, and returns a single unified object graph, regardless of the underlying feed format.
|
15
|
-
autorequire:
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 1.5.2
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors:
|
30
7
|
- Andrew A. Smith
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
- Manifest.txt
|
35
|
-
- Rakefile
|
36
|
-
- README.txt
|
37
|
-
- lib/feed-normalizer.rb
|
38
|
-
- lib/html-cleaner.rb
|
39
|
-
- lib/parsers/rss.rb
|
40
|
-
- lib/parsers/simple-rss.rb
|
41
|
-
- lib/structures.rb
|
42
|
-
- test/data/atom03.xml
|
43
|
-
- test/data/atom10.xml
|
44
|
-
- test/data/rdf10.xml
|
45
|
-
- test/data/rss20.xml
|
46
|
-
- test/data/rss20diff.xml
|
47
|
-
- test/data/rss20diff_short.xml
|
48
|
-
- test/test_all.rb
|
49
|
-
- test/test_feednormalizer.rb
|
50
|
-
- test/test_htmlcleaner.rb
|
51
|
-
test_files:
|
52
|
-
- test/test_all.rb
|
53
|
-
rdoc_options:
|
54
|
-
- --main
|
55
|
-
- README.txt
|
56
|
-
extra_rdoc_files:
|
57
|
-
- History.txt
|
58
|
-
- License.txt
|
59
|
-
- Manifest.txt
|
60
|
-
- README.txt
|
61
|
-
executables: []
|
62
|
-
|
63
|
-
extensions: []
|
64
|
-
|
65
|
-
requirements: []
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
66
11
|
|
12
|
+
date: 2010-01-25 00:00:00 -08:00
|
13
|
+
default_executable:
|
67
14
|
dependencies:
|
68
15
|
- !ruby/object:Gem::Dependency
|
69
16
|
name: simple-rss
|
17
|
+
type: :runtime
|
70
18
|
version_requirement:
|
71
|
-
version_requirements: !ruby/object:Gem::
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
20
|
requirements:
|
73
21
|
- - ">="
|
74
22
|
- !ruby/object:Gem::Version
|
@@ -76,19 +24,107 @@ dependencies:
|
|
76
24
|
version:
|
77
25
|
- !ruby/object:Gem::Dependency
|
78
26
|
name: hpricot
|
27
|
+
type: :runtime
|
79
28
|
version_requirement:
|
80
|
-
version_requirements: !ruby/object:Gem::
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
30
|
requirements:
|
82
31
|
- - ">="
|
83
32
|
- !ruby/object:Gem::Version
|
84
33
|
version: "0.6"
|
85
34
|
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rubyforge
|
37
|
+
type: :development
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 2.0.3
|
44
|
+
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: gemcutter
|
47
|
+
type: :development
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.3.0
|
54
|
+
version:
|
86
55
|
- !ruby/object:Gem::Dependency
|
87
56
|
name: hoe
|
57
|
+
type: :development
|
88
58
|
version_requirement:
|
89
|
-
version_requirements: !ruby/object:Gem::
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
60
|
requirements:
|
91
61
|
- - ">="
|
92
62
|
- !ruby/object:Gem::Version
|
93
|
-
version:
|
63
|
+
version: 2.5.0
|
94
64
|
version:
|
65
|
+
description: |-
|
66
|
+
An extensible Ruby wrapper for Atom and RSS parsers.
|
67
|
+
|
68
|
+
Feed normalizer wraps various RSS and Atom parsers, and returns a single unified
|
69
|
+
object graph, regardless of the underlying feed format.
|
70
|
+
email: andy@tinnedfruit.org
|
71
|
+
executables: []
|
72
|
+
|
73
|
+
extensions: []
|
74
|
+
|
75
|
+
extra_rdoc_files:
|
76
|
+
- History.txt
|
77
|
+
- License.txt
|
78
|
+
- Manifest.txt
|
79
|
+
- README.txt
|
80
|
+
files:
|
81
|
+
- History.txt
|
82
|
+
- License.txt
|
83
|
+
- Manifest.txt
|
84
|
+
- Rakefile
|
85
|
+
- README.txt
|
86
|
+
- lib/feed-normalizer.rb
|
87
|
+
- lib/html-cleaner.rb
|
88
|
+
- lib/parsers/rss.rb
|
89
|
+
- lib/parsers/simple-rss.rb
|
90
|
+
- lib/structures.rb
|
91
|
+
- test/data/atom03.xml
|
92
|
+
- test/data/atom10.xml
|
93
|
+
- test/data/rdf10.xml
|
94
|
+
- test/data/rss20.xml
|
95
|
+
- test/data/rss20diff.xml
|
96
|
+
- test/data/rss20diff_short.xml
|
97
|
+
- test/test_feednormalizer.rb
|
98
|
+
- test/test_htmlcleaner.rb
|
99
|
+
has_rdoc: true
|
100
|
+
homepage: http://github.com/aasmith/feed-normalizer
|
101
|
+
licenses: []
|
102
|
+
|
103
|
+
post_install_message:
|
104
|
+
rdoc_options:
|
105
|
+
- --main
|
106
|
+
- README.txt
|
107
|
+
require_paths:
|
108
|
+
- lib
|
109
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: "0"
|
114
|
+
version:
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: "0"
|
120
|
+
version:
|
121
|
+
requirements: []
|
122
|
+
|
123
|
+
rubyforge_project: feed-normalizer
|
124
|
+
rubygems_version: 1.3.5
|
125
|
+
signing_key:
|
126
|
+
specification_version: 3
|
127
|
+
summary: Extensible Ruby wrapper for Atom and RSS parsers
|
128
|
+
test_files:
|
129
|
+
- test/test_feednormalizer.rb
|
130
|
+
- test/test_htmlcleaner.rb
|