feedtools 0.2.26 → 0.2.27

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. data/CHANGELOG +232 -216
  2. data/db/migration.rb +2 -0
  3. data/db/schema.mysql.sql +2 -0
  4. data/db/schema.postgresql.sql +3 -1
  5. data/db/schema.sqlite.sql +3 -1
  6. data/lib/feed_tools.rb +37 -14
  7. data/lib/feed_tools/database_feed_cache.rb +13 -2
  8. data/lib/feed_tools/feed.rb +430 -104
  9. data/lib/feed_tools/feed_item.rb +533 -268
  10. data/lib/feed_tools/helpers/generic_helper.rb +1 -1
  11. data/lib/feed_tools/helpers/html_helper.rb +78 -116
  12. data/lib/feed_tools/helpers/retrieval_helper.rb +33 -3
  13. data/lib/feed_tools/helpers/uri_helper.rb +46 -54
  14. data/lib/feed_tools/monkey_patch.rb +27 -1
  15. data/lib/feed_tools/vendor/html5/History.txt +10 -0
  16. data/lib/feed_tools/vendor/html5/Manifest.txt +117 -0
  17. data/lib/feed_tools/vendor/html5/README +45 -0
  18. data/lib/feed_tools/vendor/html5/Rakefile.rb +33 -0
  19. data/lib/feed_tools/vendor/html5/bin/html5 +217 -0
  20. data/lib/feed_tools/vendor/html5/lib/core_ext/string.rb +17 -0
  21. data/lib/feed_tools/vendor/html5/lib/html5.rb +13 -0
  22. data/lib/feed_tools/vendor/html5/lib/html5/constants.rb +1046 -0
  23. data/lib/feed_tools/vendor/html5/lib/html5/filters/base.rb +10 -0
  24. data/lib/feed_tools/vendor/html5/lib/html5/filters/inject_meta_charset.rb +82 -0
  25. data/lib/feed_tools/vendor/html5/lib/html5/filters/iso639codes.rb +752 -0
  26. data/lib/feed_tools/vendor/html5/lib/html5/filters/optionaltags.rb +198 -0
  27. data/lib/feed_tools/vendor/html5/lib/html5/filters/rfc2046.rb +30 -0
  28. data/lib/feed_tools/vendor/html5/lib/html5/filters/rfc3987.rb +89 -0
  29. data/lib/feed_tools/vendor/html5/lib/html5/filters/sanitizer.rb +15 -0
  30. data/lib/feed_tools/vendor/html5/lib/html5/filters/validator.rb +830 -0
  31. data/lib/feed_tools/vendor/html5/lib/html5/filters/whitespace.rb +36 -0
  32. data/lib/feed_tools/vendor/html5/lib/html5/html5parser.rb +248 -0
  33. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/after_body_phase.rb +46 -0
  34. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/after_frameset_phase.rb +33 -0
  35. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/after_head_phase.rb +50 -0
  36. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/before_head_phase.rb +41 -0
  37. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_body_phase.rb +613 -0
  38. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_caption_phase.rb +69 -0
  39. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_cell_phase.rb +78 -0
  40. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_column_group_phase.rb +55 -0
  41. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_frameset_phase.rb +57 -0
  42. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_head_phase.rb +138 -0
  43. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_row_phase.rb +89 -0
  44. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_select_phase.rb +85 -0
  45. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_table_body_phase.rb +86 -0
  46. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/in_table_phase.rb +115 -0
  47. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/initial_phase.rb +133 -0
  48. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/phase.rb +154 -0
  49. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/root_element_phase.rb +41 -0
  50. data/lib/feed_tools/vendor/html5/lib/html5/html5parser/trailing_end_phase.rb +35 -0
  51. data/lib/feed_tools/vendor/html5/lib/html5/inputstream.rb +648 -0
  52. data/lib/feed_tools/vendor/html5/lib/html5/liberalxmlparser.rb +158 -0
  53. data/lib/feed_tools/vendor/html5/lib/html5/sanitizer.rb +188 -0
  54. data/lib/feed_tools/vendor/html5/lib/html5/serializer.rb +2 -0
  55. data/lib/feed_tools/vendor/html5/lib/html5/serializer/htmlserializer.rb +179 -0
  56. data/lib/feed_tools/vendor/html5/lib/html5/serializer/xhtmlserializer.rb +20 -0
  57. data/lib/feed_tools/vendor/html5/lib/html5/sniffer.rb +45 -0
  58. data/lib/feed_tools/vendor/html5/lib/html5/tokenizer.rb +966 -0
  59. data/lib/feed_tools/vendor/html5/lib/html5/treebuilders.rb +24 -0
  60. data/lib/feed_tools/vendor/html5/lib/html5/treebuilders/base.rb +334 -0
  61. data/lib/feed_tools/vendor/html5/lib/html5/treebuilders/hpricot.rb +231 -0
  62. data/lib/feed_tools/vendor/html5/lib/html5/treebuilders/rexml.rb +209 -0
  63. data/lib/feed_tools/vendor/html5/lib/html5/treebuilders/simpletree.rb +185 -0
  64. data/lib/feed_tools/vendor/html5/lib/html5/treewalkers.rb +26 -0
  65. data/lib/feed_tools/vendor/html5/lib/html5/treewalkers/base.rb +162 -0
  66. data/lib/feed_tools/vendor/html5/lib/html5/treewalkers/hpricot.rb +48 -0
  67. data/lib/feed_tools/vendor/html5/lib/html5/treewalkers/rexml.rb +48 -0
  68. data/lib/feed_tools/vendor/html5/lib/html5/treewalkers/simpletree.rb +48 -0
  69. data/lib/feed_tools/vendor/html5/lib/html5/version.rb +3 -0
  70. data/lib/feed_tools/vendor/html5/testdata/encoding/chardet/test_big5.txt +51 -0
  71. data/lib/feed_tools/vendor/html5/testdata/encoding/test-yahoo-jp.dat +10 -0
  72. data/lib/feed_tools/vendor/html5/testdata/encoding/tests1.dat +394 -0
  73. data/lib/feed_tools/vendor/html5/testdata/encoding/tests2.dat +81 -0
  74. data/lib/feed_tools/vendor/html5/testdata/sanitizer/tests1.dat +416 -0
  75. data/lib/feed_tools/vendor/html5/testdata/serializer/core.test +104 -0
  76. data/lib/feed_tools/vendor/html5/testdata/serializer/injectmeta.test +65 -0
  77. data/lib/feed_tools/vendor/html5/testdata/serializer/optionaltags.test +900 -0
  78. data/lib/feed_tools/vendor/html5/testdata/serializer/options.test +60 -0
  79. data/lib/feed_tools/vendor/html5/testdata/serializer/whitespace.test +51 -0
  80. data/lib/feed_tools/vendor/html5/testdata/sites/google-results.htm +1 -0
  81. data/lib/feed_tools/vendor/html5/testdata/sites/python-ref-import.htm +1 -0
  82. data/lib/feed_tools/vendor/html5/testdata/sites/web-apps-old.htm +1 -0
  83. data/lib/feed_tools/vendor/html5/testdata/sites/web-apps.htm +34275 -0
  84. data/lib/feed_tools/vendor/html5/testdata/sniffer/htmlOrFeed.json +43 -0
  85. data/lib/feed_tools/vendor/html5/testdata/tokenizer/contentModelFlags.test +48 -0
  86. data/lib/feed_tools/vendor/html5/testdata/tokenizer/entities.test +2339 -0
  87. data/lib/feed_tools/vendor/html5/testdata/tokenizer/escapeFlag.test +21 -0
  88. data/lib/feed_tools/vendor/html5/testdata/tokenizer/test1.test +172 -0
  89. data/lib/feed_tools/vendor/html5/testdata/tokenizer/test2.test +129 -0
  90. data/lib/feed_tools/vendor/html5/testdata/tokenizer/test3.test +367 -0
  91. data/lib/feed_tools/vendor/html5/testdata/tokenizer/test4.test +198 -0
  92. data/lib/feed_tools/vendor/html5/testdata/tree-construction/tests1.dat +1950 -0
  93. data/lib/feed_tools/vendor/html5/testdata/tree-construction/tests2.dat +773 -0
  94. data/lib/feed_tools/vendor/html5/testdata/tree-construction/tests3.dat +270 -0
  95. data/lib/feed_tools/vendor/html5/testdata/tree-construction/tests4.dat +60 -0
  96. data/lib/feed_tools/vendor/html5/testdata/tree-construction/tests5.dat +175 -0
  97. data/lib/feed_tools/vendor/html5/testdata/tree-construction/tests6.dat +196 -0
  98. data/lib/feed_tools/vendor/html5/testdata/validator/attributes.test +1035 -0
  99. data/lib/feed_tools/vendor/html5/testdata/validator/base-href-attribute.test +787 -0
  100. data/lib/feed_tools/vendor/html5/testdata/validator/base-target-attribute.test +35 -0
  101. data/lib/feed_tools/vendor/html5/testdata/validator/blockquote-cite-attribute.test +7 -0
  102. data/lib/feed_tools/vendor/html5/testdata/validator/classattribute.test +152 -0
  103. data/lib/feed_tools/vendor/html5/testdata/validator/contenteditableattribute.test +59 -0
  104. data/lib/feed_tools/vendor/html5/testdata/validator/contextmenuattribute.test +115 -0
  105. data/lib/feed_tools/vendor/html5/testdata/validator/dirattribute.test +59 -0
  106. data/lib/feed_tools/vendor/html5/testdata/validator/draggableattribute.test +63 -0
  107. data/lib/feed_tools/vendor/html5/testdata/validator/html-xmlns-attribute.test +23 -0
  108. data/lib/feed_tools/vendor/html5/testdata/validator/idattribute.test +115 -0
  109. data/lib/feed_tools/vendor/html5/testdata/validator/inputattributes.test +2795 -0
  110. data/lib/feed_tools/vendor/html5/testdata/validator/irrelevantattribute.test +63 -0
  111. data/lib/feed_tools/vendor/html5/testdata/validator/langattribute.test +5579 -0
  112. data/lib/feed_tools/vendor/html5/testdata/validator/li-value-attribute.test +7 -0
  113. data/lib/feed_tools/vendor/html5/testdata/validator/link-href-attribute.test +7 -0
  114. data/lib/feed_tools/vendor/html5/testdata/validator/link-hreflang-attribute.test +7 -0
  115. data/lib/feed_tools/vendor/html5/testdata/validator/link-rel-attribute.test +271 -0
  116. data/lib/feed_tools/vendor/html5/testdata/validator/ol-start-attribute.test +7 -0
  117. data/lib/feed_tools/vendor/html5/testdata/validator/starttags.test +375 -0
  118. data/lib/feed_tools/vendor/html5/testdata/validator/style-scoped-attribute.test +7 -0
  119. data/lib/feed_tools/vendor/html5/testdata/validator/tabindexattribute.test +79 -0
  120. data/lib/feed_tools/vendor/html5/tests/preamble.rb +72 -0
  121. data/lib/feed_tools/vendor/html5/tests/test_encoding.rb +35 -0
  122. data/lib/feed_tools/vendor/html5/tests/test_lxp.rb +279 -0
  123. data/lib/feed_tools/vendor/html5/tests/test_parser.rb +68 -0
  124. data/lib/feed_tools/vendor/html5/tests/test_sanitizer.rb +142 -0
  125. data/lib/feed_tools/vendor/html5/tests/test_serializer.rb +68 -0
  126. data/lib/feed_tools/vendor/html5/tests/test_sniffer.rb +27 -0
  127. data/lib/feed_tools/vendor/html5/tests/test_stream.rb +62 -0
  128. data/lib/feed_tools/vendor/html5/tests/test_tokenizer.rb +94 -0
  129. data/lib/feed_tools/vendor/html5/tests/test_treewalkers.rb +135 -0
  130. data/lib/feed_tools/vendor/html5/tests/test_validator.rb +31 -0
  131. data/lib/feed_tools/vendor/html5/tests/tokenizer_test_parser.rb +63 -0
  132. data/lib/feed_tools/vendor/uri.rb +781 -0
  133. data/lib/feed_tools/version.rb +1 -1
  134. data/rakefile +27 -6
  135. data/test/unit/atom_test.rb +298 -210
  136. data/test/unit/helper_test.rb +7 -12
  137. data/test/unit/rdf_test.rb +51 -1
  138. data/test/unit/rss_test.rb +13 -3
  139. metadata +239 -116
  140. data/lib/feed_tools/vendor/htree.rb +0 -97
  141. data/lib/feed_tools/vendor/htree/container.rb +0 -10
  142. data/lib/feed_tools/vendor/htree/context.rb +0 -67
  143. data/lib/feed_tools/vendor/htree/display.rb +0 -27
  144. data/lib/feed_tools/vendor/htree/doc.rb +0 -149
  145. data/lib/feed_tools/vendor/htree/elem.rb +0 -262
  146. data/lib/feed_tools/vendor/htree/encoder.rb +0 -163
  147. data/lib/feed_tools/vendor/htree/equality.rb +0 -218
  148. data/lib/feed_tools/vendor/htree/extract_text.rb +0 -37
  149. data/lib/feed_tools/vendor/htree/fstr.rb +0 -33
  150. data/lib/feed_tools/vendor/htree/gencode.rb +0 -97
  151. data/lib/feed_tools/vendor/htree/htmlinfo.rb +0 -672
  152. data/lib/feed_tools/vendor/htree/inspect.rb +0 -108
  153. data/lib/feed_tools/vendor/htree/leaf.rb +0 -94
  154. data/lib/feed_tools/vendor/htree/loc.rb +0 -367
  155. data/lib/feed_tools/vendor/htree/modules.rb +0 -48
  156. data/lib/feed_tools/vendor/htree/name.rb +0 -124
  157. data/lib/feed_tools/vendor/htree/output.rb +0 -207
  158. data/lib/feed_tools/vendor/htree/parse.rb +0 -409
  159. data/lib/feed_tools/vendor/htree/raw_string.rb +0 -124
  160. data/lib/feed_tools/vendor/htree/regexp-util.rb +0 -15
  161. data/lib/feed_tools/vendor/htree/rexml.rb +0 -130
  162. data/lib/feed_tools/vendor/htree/scan.rb +0 -166
  163. data/lib/feed_tools/vendor/htree/tag.rb +0 -111
  164. data/lib/feed_tools/vendor/htree/template.rb +0 -909
  165. data/lib/feed_tools/vendor/htree/text.rb +0 -115
  166. data/lib/feed_tools/vendor/htree/traverse.rb +0 -465
@@ -2,7 +2,7 @@ module FeedTools
2
2
  module FEED_TOOLS_VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 2
5
- TINY = 26
5
+ TINY = 27
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
data/rakefile CHANGED
@@ -14,8 +14,9 @@ PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
14
14
 
15
15
  RELEASE_NAME = "REL #{PKG_VERSION}"
16
16
 
17
- RUBY_FORGE_PROJECT = "feedtools"
17
+ RUBY_FORGE_PROJECT = PKG_NAME
18
18
  RUBY_FORGE_USER = "sporkmonger"
19
+ RUBY_FORGE_PATH = "/var/www/gforge-projects/#{RUBY_FORGE_PROJECT}"
19
20
 
20
21
  PKG_FILES = FileList[
21
22
  "lib/**/*", "test/**/*", "examples/**/*", "doc/**/*", "db/**/*",
@@ -123,7 +124,17 @@ spec = Gem::Specification.new do |s|
123
124
  s.add_dependency('builder', '>= 1.2.4')
124
125
 
125
126
  s.require_path = 'lib'
126
- s.autorequire = 'feed_tools'
127
+
128
+ begin
129
+ s.post_install_message = <<-TEXT
130
+
131
+ FeedTool's caching schema has changed to allow Feed objects to be
132
+ serialized to the cache. This should offer some limited speed up
133
+ in some cases.
134
+
135
+ TEXT
136
+ rescue Exception
137
+ end
127
138
 
128
139
  s.has_rdoc = true
129
140
  s.extra_rdoc_files = %w( README )
@@ -180,7 +191,17 @@ end
180
191
 
181
192
  # Publishing ------------------------------------------------------
182
193
 
183
- desc "Publish the API documentation"
184
- task :pdoc => [:rdoc] do
185
- Rake::SshDirPublisher.new("vacindak@sporkmonger.com", "public_html/projects/feedtools/api", "doc").upload
186
- end
194
+ namespace :publish do
195
+ desc "Publish the API documentation"
196
+ task :api => [ "rdoc" ] do
197
+ Rake::SshDirPublisher.new(
198
+ "#{RUBY_FORGE_USER}@rubyforge.org",
199
+ "#{RUBY_FORGE_PATH}/",
200
+ "doc"
201
+ ).upload
202
+ end
203
+
204
+ desc "Runs all of the publishing tasks"
205
+ task :all => ["publish:api"] do
206
+ end
207
+ end
@@ -126,6 +126,7 @@ class AtomTest < Test::Unit::TestCase
126
126
  </feed>
127
127
  FEED
128
128
  ) { |feed|
129
+ assert_equal(2, feed.links.size)
129
130
  assert_equal("http://www.intertwingly.net/blog/index.atom", feed.href)
130
131
  assert_equal("http://www.intertwingly.net/blog/", feed.link)
131
132
  assert_equal("http://www.intertwingly.net/blog/", feed.author.href)
@@ -149,6 +150,7 @@ class AtomTest < Test::Unit::TestCase
149
150
  </feed>
150
151
  FEED
151
152
  ) { |feed|
153
+ assert_equal(2, feed.links.size)
152
154
  assert_equal("http://www.intertwingly.net/blog/", feed.link)
153
155
  assert_equal("http://www.intertwingly.net/blog/index.atom", feed.href)
154
156
  assert_equal("http://www.intertwingly.net/blog/", feed.author.href)
@@ -177,218 +179,218 @@ class AtomTest < Test::Unit::TestCase
177
179
  <?xml version="1.0" encoding="utf-8"?>
178
180
  <feed xmlns="http://www.w3.org/2005/Atom"
179
181
  xml:base="http://example.org/tests/">
180
- <title>xml:base support tests</title>
181
- <subtitle type="html">
182
- All alternate links should point to
183
- &lt;code>http://example.org/tests/base/result.html&lt;/code>;
184
- all links in content should point where their label says.
185
- </subtitle>
186
- <link href="http://example.org/tests/base/result.html"/>
187
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base</id>
188
- <updated>2006-01-17T12:35:16+01:00</updated>
182
+ <title>xml:base support tests</title>
183
+ <subtitle type="html">
184
+ All alternate links should point to
185
+ &lt;code>http://example.org/tests/base/result.html&lt;/code>;
186
+ all links in content should point where their label says.
187
+ </subtitle>
188
+ <link href="http://example.org/tests/base/result.html"/>
189
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base</id>
190
+ <updated>2006-01-17T12:35:16+01:00</updated>
189
191
 
190
- <entry>
191
- <title>1: Alternate link: Absolute URL</title>
192
- <link href="http://example.org/tests/base/result.html"/>
193
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test1</id>
194
- <updated>2006-01-17T12:35:16+01:00</updated>
195
- </entry>
192
+ <entry>
193
+ <title>1: Alternate link: Absolute URL</title>
194
+ <link href="http://example.org/tests/base/result.html"/>
195
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test1</id>
196
+ <updated>2006-01-17T12:35:16+01:00</updated>
197
+ </entry>
196
198
 
197
- <entry>
198
- <title>2: Alternate link: Host-relative absolute URL</title>
199
- <link href="/tests/base/result.html"/>
200
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test2</id>
201
- <updated>2006-01-17T12:35:15+01:00</updated>
202
- </entry>
199
+ <entry>
200
+ <title>2: Alternate link: Host-relative absolute URL</title>
201
+ <link href="/tests/base/result.html"/>
202
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test2</id>
203
+ <updated>2006-01-17T12:35:15+01:00</updated>
204
+ </entry>
203
205
 
204
- <entry>
205
- <title>3: Alternate link: Relative URL</title>
206
- <link href="base/result.html"/>
207
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test3</id>
208
- <updated>2006-01-17T12:35:14+01:00</updated>
209
- </entry>
206
+ <entry>
207
+ <title>3: Alternate link: Relative URL</title>
208
+ <link href="base/result.html"/>
209
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test3</id>
210
+ <updated>2006-01-17T12:35:14+01:00</updated>
211
+ </entry>
210
212
 
211
- <entry>
212
- <title>
213
- 4: Alternate link: Relative URL with parent directory component
214
- </title>
215
- <link href="../tests/base/result.html"/>
216
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test4</id>
217
- <updated>2006-01-17T12:35:13+01:00</updated>
218
- </entry>
213
+ <entry>
214
+ <title>
215
+ 4: Alternate link: Relative URL with parent directory component
216
+ </title>
217
+ <link href="../tests/base/result.html"/>
218
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test4</id>
219
+ <updated>2006-01-17T12:35:13+01:00</updated>
220
+ </entry>
219
221
 
220
- <entry>
221
- <title>5: Content: Absolute URL</title>
222
- <link href="http://example.org/tests/base/result.html"/>
223
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test5</id>
224
- <content type="html">
225
- &lt;a href="http://example.org/tests/base/result.html"&gt;
226
- http://example.org/tests/base/result.html
227
- &lt;/a&gt;
228
- </content>
229
- <updated>2006-01-17T12:35:12+01:00</updated>
230
- </entry>
222
+ <entry>
223
+ <title>5: Content: Absolute URL</title>
224
+ <link href="http://example.org/tests/base/result.html"/>
225
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test5</id>
226
+ <content type="html">
227
+ &lt;a href="http://example.org/tests/base/result.html"&gt;
228
+ http://example.org/tests/base/result.html
229
+ &lt;/a&gt;
230
+ </content>
231
+ <updated>2006-01-17T12:35:12+01:00</updated>
232
+ </entry>
231
233
 
232
- <entry>
233
- <title>6: Content: Host-relative URL</title>
234
- <link href="http://example.org/tests/base/result.html"/>
235
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test6</id>
236
- <content type="html">
237
- &lt;a href="/tests/base/result.html"&gt;
238
- http://example.org/tests/base/result.html
239
- &lt;/a&gt;
240
- </content>
241
- <updated>2006-01-17T12:35:11+01:00</updated>
242
- </entry>
234
+ <entry>
235
+ <title>6: Content: Host-relative URL</title>
236
+ <link href="http://example.org/tests/base/result.html"/>
237
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test6</id>
238
+ <content type="html">
239
+ &lt;a href="/tests/base/result.html"&gt;
240
+ http://example.org/tests/base/result.html
241
+ &lt;/a&gt;
242
+ </content>
243
+ <updated>2006-01-17T12:35:11+01:00</updated>
244
+ </entry>
243
245
 
244
- <entry>
245
- <title>7: Content: Relative URL</title>
246
- <link href="http://example.org/tests/base/result.html"/>
247
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test7</id>
248
- <content type="html">
249
- &lt;a href="base/result.html"&gt;
250
- http://example.org/tests/base/result.html
251
- &lt;/a&gt;
252
- </content>
253
- <updated>2006-01-17T12:35:10+01:00</updated>
254
- </entry>
246
+ <entry>
247
+ <title>7: Content: Relative URL</title>
248
+ <link href="http://example.org/tests/base/result.html"/>
249
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test7</id>
250
+ <content type="html">
251
+ &lt;a href="base/result.html"&gt;
252
+ http://example.org/tests/base/result.html
253
+ &lt;/a&gt;
254
+ </content>
255
+ <updated>2006-01-17T12:35:10+01:00</updated>
256
+ </entry>
255
257
 
256
- <entry>
257
- <title>
258
- 8: Content: Relative URL with parent directory component
259
- </title>
260
- <link href="http://example.org/tests/base/result.html"/>
261
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test8</id>
262
- <content type="html">
263
- &lt;a href="../tests/base/result.html"&gt;
264
- http://example.org/tests/base/result.html
265
- &lt;/a&gt;
266
- </content>
267
- <updated>2006-01-17T12:35:9+01:00</updated>
268
- </entry>
258
+ <entry>
259
+ <title>
260
+ 8: Content: Relative URL with parent directory component
261
+ </title>
262
+ <link href="http://example.org/tests/base/result.html"/>
263
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test8</id>
264
+ <content type="html">
265
+ &lt;a href="../tests/base/result.html"&gt;
266
+ http://example.org/tests/base/result.html
267
+ &lt;/a&gt;
268
+ </content>
269
+ <updated>2006-01-17T12:35:9+01:00</updated>
270
+ </entry>
269
271
 
270
- <entry xml:base="http://example.org/tests/entrybase/">
271
- <title type="html">
272
- 9: Content, &lt;code>&amp;lt;entry>&lt;/code> has base:
273
- Absolute URL
274
- </title>
275
- <link href="http://example.org/tests/base/result.html"/>
276
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test9</id>
277
- <content type="html">
278
- &lt;a href="http://example.org/tests/entrybase/result.html"&gt;
279
- http://example.org/tests/entrybase/result.html
280
- &lt;/a&gt;
281
- </content>
282
- <updated>2006-01-17T12:35:8+01:00</updated>
283
- </entry>
272
+ <entry xml:base="http://example.org/tests/entrybase/">
273
+ <title type="html">
274
+ 9: Content, &lt;code>&amp;lt;entry>&lt;/code> has base:
275
+ Absolute URL
276
+ </title>
277
+ <link href="http://example.org/tests/base/result.html"/>
278
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test9</id>
279
+ <content type="html">
280
+ &lt;a href="http://example.org/tests/entrybase/result.html"&gt;
281
+ http://example.org/tests/entrybase/result.html
282
+ &lt;/a&gt;
283
+ </content>
284
+ <updated>2006-01-17T12:35:8+01:00</updated>
285
+ </entry>
284
286
 
285
- <entry xml:base="http://example.org/tests/entrybase/">
286
- <title type="html">
287
- 10: Content, &lt;code>&amp;lt;entry>&lt;/code> has base:
288
- Host-relative URL
289
- </title>
290
- <link href="http://example.org/tests/base/result.html"/>
291
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test10</id>
292
- <content type="html">
293
- &lt;a href="/tests/entrybase/result.html"&gt;
294
- http://example.org/tests/entrybase/result.html
295
- &lt;/a&gt;
296
- </content>
297
- <updated>2006-01-17T12:35:7+01:00</updated>
298
- </entry>
287
+ <entry xml:base="http://example.org/tests/entrybase/">
288
+ <title type="html">
289
+ 10: Content, &lt;code>&amp;lt;entry>&lt;/code> has base:
290
+ Host-relative URL
291
+ </title>
292
+ <link href="http://example.org/tests/base/result.html"/>
293
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test10</id>
294
+ <content type="html">
295
+ &lt;a href="/tests/entrybase/result.html"&gt;
296
+ http://example.org/tests/entrybase/result.html
297
+ &lt;/a&gt;
298
+ </content>
299
+ <updated>2006-01-17T12:35:7+01:00</updated>
300
+ </entry>
299
301
 
300
- <entry xml:base="http://example.org/tests/entrybase/">
301
- <title type="html">
302
- 11: Content, &lt;code>&amp;lt;entry>&lt;/code> has base:
303
- Relative URL
304
- </title>
305
- <link href="http://example.org/tests/base/result.html"/>
306
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test11</id>
307
- <content type="html">
308
- &lt;a href="result.html"&gt;
309
- http://example.org/tests/entrybase/result.html
310
- &lt;/a&gt;
311
- </content>
312
- <updated>2006-01-17T12:35:6+01:00</updated>
313
- </entry>
302
+ <entry xml:base="http://example.org/tests/entrybase/">
303
+ <title type="html">
304
+ 11: Content, &lt;code>&amp;lt;entry>&lt;/code> has base:
305
+ Relative URL
306
+ </title>
307
+ <link href="http://example.org/tests/base/result.html"/>
308
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test11</id>
309
+ <content type="html">
310
+ &lt;a href="result.html"&gt;
311
+ http://example.org/tests/entrybase/result.html
312
+ &lt;/a&gt;
313
+ </content>
314
+ <updated>2006-01-17T12:35:6+01:00</updated>
315
+ </entry>
314
316
 
315
- <entry xml:base="http://example.org/tests/entrybase/">
316
- <title type="html">
317
- 12: Content, &lt;code>&amp;lt;entry>&lt;/code> has base:
318
- Relative URL with parent directory component</title>
319
- <link href="http://example.org/tests/base/result.html"/>
320
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test12</id>
321
- <content type="html">
322
- &lt;a href="../entrybase/result.html"&gt;
323
- http://example.org/tests/entrybase/result.html
324
- &lt;/a&gt;
325
- </content>
326
- <updated>2006-01-17T12:35:5+01:00</updated>
327
- </entry>
317
+ <entry xml:base="http://example.org/tests/entrybase/">
318
+ <title type="html">
319
+ 12: Content, &lt;code>&amp;lt;entry>&lt;/code> has base:
320
+ Relative URL with parent directory component</title>
321
+ <link href="http://example.org/tests/base/result.html"/>
322
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test12</id>
323
+ <content type="html">
324
+ &lt;a href="../entrybase/result.html"&gt;
325
+ http://example.org/tests/entrybase/result.html
326
+ &lt;/a&gt;
327
+ </content>
328
+ <updated>2006-01-17T12:35:5+01:00</updated>
329
+ </entry>
328
330
 
329
- <entry>
330
- <title type="html">
331
- 13: Content, &lt;code>&amp;lt;content>&lt;/code> has base:
332
- Absolute URL
333
- </title>
334
- <link href="http://example.org/tests/base/result.html"/>
335
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test13</id>
336
- <content type="html"
337
- xml:base="http://example.org/tests/contentbase/">
338
- &lt;a href="http://example.org/tests/contentbase/result.html"&gt;
339
- http://example.org/tests/contentbase/result.html
340
- &lt;/a&gt;
341
- </content>
342
- <updated>2006-01-17T12:35:4+01:00</updated>
343
- </entry>
331
+ <entry>
332
+ <title type="html">
333
+ 13: Content, &lt;code>&amp;lt;content>&lt;/code> has base:
334
+ Absolute URL
335
+ </title>
336
+ <link href="http://example.org/tests/base/result.html"/>
337
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test13</id>
338
+ <content type="html"
339
+ xml:base="http://example.org/tests/contentbase/">
340
+ &lt;a href="http://example.org/tests/contentbase/result.html"&gt;
341
+ http://example.org/tests/contentbase/result.html
342
+ &lt;/a&gt;
343
+ </content>
344
+ <updated>2006-01-17T12:35:4+01:00</updated>
345
+ </entry>
344
346
 
345
- <entry>
346
- <title type="html">
347
- 14: Content, &lt;code>&amp;lt;content>&lt;/code> has base:
348
- Host-relative URL
349
- </title>
350
- <link href="http://example.org/tests/base/result.html"/>
351
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test14</id>
352
- <content type="html"
353
- xml:base="http://example.org/tests/contentbase/">
354
- &lt;a href="/tests/contentbase/result.html"&gt;
355
- http://example.org/tests/contentbase/result.html
356
- &lt;/a&gt;
357
- </content>
358
- <updated>2006-01-17T12:35:3+01:00</updated>
359
- </entry>
347
+ <entry>
348
+ <title type="html">
349
+ 14: Content, &lt;code>&amp;lt;content>&lt;/code> has base:
350
+ Host-relative URL
351
+ </title>
352
+ <link href="http://example.org/tests/base/result.html"/>
353
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test14</id>
354
+ <content type="html"
355
+ xml:base="http://example.org/tests/contentbase/">
356
+ &lt;a href="/tests/contentbase/result.html"&gt;
357
+ http://example.org/tests/contentbase/result.html
358
+ &lt;/a&gt;
359
+ </content>
360
+ <updated>2006-01-17T12:35:3+01:00</updated>
361
+ </entry>
360
362
 
361
- <entry>
362
- <title type="html">
363
- 15: Content, &lt;code>&amp;lt;content>&lt;/code> has base:
364
- Relative URL
365
- </title>
366
- <link href="http://example.org/tests/base/result.html"/>
367
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test15</id>
368
- <content type="html"
369
- xml:base="http://example.org/tests/contentbase/">
370
- &lt;a href="result.html"&gt;
371
- http://example.org/tests/contentbase/result.html
372
- &lt;/a&gt;
373
- </content>
374
- <updated>2006-01-17T12:35:2+01:00</updated>
375
- </entry>
363
+ <entry>
364
+ <title type="html">
365
+ 15: Content, &lt;code>&amp;lt;content>&lt;/code> has base:
366
+ Relative URL
367
+ </title>
368
+ <link href="http://example.org/tests/base/result.html"/>
369
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test15</id>
370
+ <content type="html"
371
+ xml:base="http://example.org/tests/contentbase/">
372
+ &lt;a href="result.html"&gt;
373
+ http://example.org/tests/contentbase/result.html
374
+ &lt;/a&gt;
375
+ </content>
376
+ <updated>2006-01-17T12:35:2+01:00</updated>
377
+ </entry>
376
378
 
377
- <entry>
378
- <title type="html">
379
- 16: Content, &lt;code>&amp;lt;content>&lt;/code> has base:
380
- Relative URL with parent directory component
381
- </title>
382
- <link href="http://example.org/tests/base/result.html"/>
383
- <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test16</id>
384
- <content type="html"
385
- xml:base="http://example.org/tests/contentbase/">
386
- &lt;a href="../contentbase/result.html"&gt;
387
- http://example.org/tests/contentbase/result.html
388
- &lt;/a&gt;
389
- </content>
390
- <updated>2006-01-17T12:35:1+01:00</updated>
391
- </entry>
379
+ <entry>
380
+ <title type="html">
381
+ 16: Content, &lt;code>&amp;lt;content>&lt;/code> has base:
382
+ Relative URL with parent directory component
383
+ </title>
384
+ <link href="http://example.org/tests/base/result.html"/>
385
+ <id>tag:plasmasturm.org,2005:Atom-Tests:xml-base:Test16</id>
386
+ <content type="html"
387
+ xml:base="http://example.org/tests/contentbase/">
388
+ &lt;a href="../contentbase/result.html"&gt;
389
+ http://example.org/tests/contentbase/result.html
390
+ &lt;/a&gt;
391
+ </content>
392
+ <updated>2006-01-17T12:35:1+01:00</updated>
393
+ </entry>
392
394
 
393
395
  </feed>
394
396
  FEED
@@ -398,29 +400,41 @@ class AtomTest < Test::Unit::TestCase
398
400
  "Broken link for: " + entry.title)
399
401
  end
400
402
  assert_equal(2, feed.entries[4].content.scan(
401
- 'http://example.org/tests/base/result.html').size)
403
+ 'http://example.org/tests/base/result.html').size,
404
+ "Invalid URI resolution:\n#{feed.entries[4].content}")
402
405
  assert_equal(2, feed.entries[5].content.scan(
403
- 'http://example.org/tests/base/result.html').size)
406
+ 'http://example.org/tests/base/result.html').size,
407
+ "Invalid URI resolution:\n#{feed.entries[5].content}")
404
408
  assert_equal(2, feed.entries[6].content.scan(
405
- 'http://example.org/tests/base/result.html').size)
409
+ 'http://example.org/tests/base/result.html').size,
410
+ "Invalid URI resolution:\n#{feed.entries[6].content}")
406
411
  assert_equal(2, feed.entries[7].content.scan(
407
- 'http://example.org/tests/base/result.html').size)
412
+ 'http://example.org/tests/base/result.html').size,
413
+ "Invalid URI resolution:\n#{feed.entries[7].content}")
408
414
  assert_equal(2, feed.entries[8].content.scan(
409
- 'http://example.org/tests/entrybase/result.html').size)
415
+ 'http://example.org/tests/entrybase/result.html').size,
416
+ "Invalid URI resolution:\n#{feed.entries[8].content}")
410
417
  assert_equal(2, feed.entries[9].content.scan(
411
- 'http://example.org/tests/entrybase/result.html').size)
418
+ 'http://example.org/tests/entrybase/result.html').size,
419
+ "Invalid URI resolution:\n#{feed.entries[9].content}")
412
420
  assert_equal(2, feed.entries[10].content.scan(
413
- 'http://example.org/tests/entrybase/result.html').size)
421
+ 'http://example.org/tests/entrybase/result.html').size,
422
+ "Invalid URI resolution:\n#{feed.entries[10].content}")
414
423
  assert_equal(2, feed.entries[11].content.scan(
415
- 'http://example.org/tests/entrybase/result.html').size)
424
+ 'http://example.org/tests/entrybase/result.html').size,
425
+ "Invalid URI resolution:\n#{feed.entries[11].content}")
416
426
  assert_equal(2, feed.entries[12].content.scan(
417
- 'http://example.org/tests/contentbase/result.html').size)
427
+ 'http://example.org/tests/contentbase/result.html').size,
428
+ "Invalid URI resolution:\n#{feed.entries[12].content}")
418
429
  assert_equal(2, feed.entries[13].content.scan(
419
- 'http://example.org/tests/contentbase/result.html').size)
430
+ 'http://example.org/tests/contentbase/result.html').size,
431
+ "Invalid URI resolution:\n#{feed.entries[13].content}")
420
432
  assert_equal(2, feed.entries[14].content.scan(
421
- 'http://example.org/tests/contentbase/result.html').size)
433
+ 'http://example.org/tests/contentbase/result.html').size,
434
+ "Invalid URI resolution:\n#{feed.entries[14].content}")
422
435
  assert_equal(2, feed.entries[15].content.scan(
423
- 'http://example.org/tests/contentbase/result.html').size)
436
+ 'http://example.org/tests/contentbase/result.html').size,
437
+ "Invalid URI resolution:\n#{feed.entries[15].content}")
424
438
  }
425
439
  end
426
440
 
@@ -436,6 +450,56 @@ class AtomTest < Test::Unit::TestCase
436
450
  feed.copyright)
437
451
  }
438
452
  end
453
+
454
+ def test_feed_license
455
+ with_feed(:from_data => <<-FEED
456
+ <feed xmlns="http://www.w3.org/2005/Atom">
457
+ <id>http://www.example.com/myfeed</id>
458
+ <title>My Example Feed</title>
459
+ <updated>2005-07-28T12:00:00Z</updated>
460
+ <link href="http://www.example.com/myfeed" />
461
+ <link rel="license" type="application/rdf+xml"
462
+ href="http://creativecommons.org/licenses/by-nc/2.5/rdf" />
463
+ <rights>
464
+ Copyright (c) 2005. Some rights reserved. This feed
465
+ is licensed under a Creative Commons Attribute-NonCommercial
466
+ Use License. It contains material originally published by
467
+ Jane Smith at http://www.example.com/entries/1 under the
468
+ Creative Commons Attribute License.
469
+ </rights>
470
+ <author><name>James</name></author>
471
+ <entry>
472
+ <id>tag:entries.org,2005:1</id>
473
+ <title>Atom Powered Robots Run Amok</title>
474
+ <updated>2005-06-28T12:00:00Z</updated>
475
+ <link href="http://www.example.org/entries/1" />
476
+ <summary>Atom Powered Robots Run Amok</summary>
477
+ <author><name>Jane Smith</name></author>
478
+ <link rel="license" type="text/html"
479
+ href="http://creativecommons.org/licenses/by/2.5/" />
480
+ </entry>
481
+ </feed>
482
+ FEED
483
+ ) { |feed|
484
+ assert_equal(1, feed.entries.size)
485
+ assert_equal(
486
+ "http://creativecommons.org/licenses/by-nc/2.5/rdf",
487
+ feed.license.href
488
+ )
489
+ assert_equal(
490
+ "application/rdf+xml",
491
+ feed.license.type
492
+ )
493
+ assert_equal(
494
+ "http://creativecommons.org/licenses/by/2.5/",
495
+ feed.entries[0].license.href
496
+ )
497
+ assert_equal(
498
+ "text/html",
499
+ feed.entries[0].license.type
500
+ )
501
+ }
502
+ end
439
503
 
440
504
  def test_feed_item_author
441
505
  with_feed(:from_data => <<-FEED
@@ -635,11 +699,11 @@ class AtomTest < Test::Unit::TestCase
635
699
  FEED
636
700
  ) { |feed|
637
701
  assert_equal(
638
- '&#60;title&gt;',
702
+ '&lt;title&gt;',
639
703
  feed.title, "XHTML NCR failed")
640
704
  assert_equal(1, feed.items.size)
641
705
  assert_equal(
642
- '&#60;title&gt;',
706
+ '&lt;title&gt;',
643
707
  feed.items[0].title, "XHTML NCR failed")
644
708
  }
645
709
  with_feed(:from_data => <<-FEED
@@ -665,4 +729,28 @@ class AtomTest < Test::Unit::TestCase
665
729
  feed.items[0].title, "XHTML NCR failed")
666
730
  }
667
731
  end
732
+
733
+ def test_feed_item_content_sanitization
734
+ with_feed(:from_data => <<-FEED
735
+ <?xml version="1.0" encoding="iso-8859-1"?>
736
+ <feed version="1.0" xmlns="http://www.w3.org/2005/Atom">
737
+ <entry>
738
+ <content type="xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml">
739
+ <xhtml:div>
740
+ <xhtml:script>alert('Content Attack Succeeded');</xhtml:script>
741
+ </xhtml:div>
742
+ </content>
743
+ </entry>
744
+ </feed>
745
+ FEED
746
+ ) { |feed|
747
+ assert_equal(1, feed.items.size)
748
+ assert_equal(0,
749
+ feed.items[0].content.scan("<xhtml:script>").size,
750
+ "Sanitization of content element failed")
751
+ assert_equal(0,
752
+ feed.items[0].content.scan("<script>").size,
753
+ "Sanitization of content element failed")
754
+ }
755
+ end
668
756
  end