feedtools 0.2.26 → 0.2.27

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.
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