rss 0.2.8 → 0.2.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS.md +16 -0
  3. data/Rakefile +8 -1
  4. data/lib/rss/itunes.rb +49 -1
  5. data/lib/rss/maker/itunes.rb +13 -0
  6. data/lib/rss/parser.rb +1 -1
  7. data/lib/rss/version.rb +1 -1
  8. data/rss.gemspec +6 -56
  9. data/test/dot.png +0 -0
  10. data/test/rss-assertions.rb +2116 -0
  11. data/test/rss-testcase.rb +479 -0
  12. data/test/run-test.rb +15 -0
  13. data/test/test_1.0.rb +308 -0
  14. data/test/test_2.0.rb +412 -0
  15. data/test/test_accessor.rb +104 -0
  16. data/test/test_atom.rb +684 -0
  17. data/test/test_content.rb +105 -0
  18. data/test/test_dublincore.rb +270 -0
  19. data/test/test_image.rb +215 -0
  20. data/test/test_inherit.rb +41 -0
  21. data/test/test_itunes.rb +360 -0
  22. data/test/test_maker_0.9.rb +477 -0
  23. data/test/test_maker_1.0.rb +519 -0
  24. data/test/test_maker_2.0.rb +758 -0
  25. data/test/test_maker_atom_entry.rb +394 -0
  26. data/test/test_maker_atom_feed.rb +455 -0
  27. data/test/test_maker_content.rb +48 -0
  28. data/test/test_maker_dc.rb +150 -0
  29. data/test/test_maker_image.rb +63 -0
  30. data/test/test_maker_itunes.rb +488 -0
  31. data/test/test_maker_slash.rb +38 -0
  32. data/test/test_maker_sy.rb +45 -0
  33. data/test/test_maker_taxo.rb +82 -0
  34. data/test/test_maker_trackback.rb +42 -0
  35. data/test/test_maker_xml-stylesheet.rb +84 -0
  36. data/test/test_parser.rb +122 -0
  37. data/test/test_parser_1.0.rb +529 -0
  38. data/test/test_parser_2.0.rb +123 -0
  39. data/test/test_parser_atom_entry.rb +164 -0
  40. data/test/test_parser_atom_feed.rb +277 -0
  41. data/test/test_setup_maker_0.9.rb +247 -0
  42. data/test/test_setup_maker_1.0.rb +551 -0
  43. data/test/test_setup_maker_2.0.rb +309 -0
  44. data/test/test_setup_maker_atom_entry.rb +410 -0
  45. data/test/test_setup_maker_atom_feed.rb +446 -0
  46. data/test/test_setup_maker_itunes.rb +146 -0
  47. data/test/test_setup_maker_slash.rb +39 -0
  48. data/test/test_slash.rb +65 -0
  49. data/test/test_syndication.rb +126 -0
  50. data/test/test_taxonomy.rb +173 -0
  51. data/test/test_to_s.rb +701 -0
  52. data/test/test_trackback.rb +136 -0
  53. data/test/test_xml-stylesheet.rb +109 -0
  54. metadata +109 -7
  55. data/.gitignore +0 -9
  56. data/.travis.yml +0 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0661103c506f9158deefa370289f1f197422d06b500b92319e63d953d8243842
4
- data.tar.gz: f855b9669a566ac469b85820a5bbe2ff6d60be14e72040096d997057c653e596
3
+ metadata.gz: 228e90a8417df4ef1a69fe4f26f41df3e8e8058aa8e2ff5e777d046d5ddb80ef
4
+ data.tar.gz: a2ebe156cafdb3f3f7b6db774d6dda4af3a06050831abd9b56eb6b347c97a4f8
5
5
  SHA512:
6
- metadata.gz: cd38d5deb4396141f6e8a7e384cea8c3af86d7a54c42dc1e8f20d8447129c2e1f12a5fcb169d836353687ab16b6838999618f760b09f8d46246b17442977889e
7
- data.tar.gz: 4cfaf4d6c6794344edee289fe73a0cc810e8a9ffe95c47f845f47a883c14dcb7ae64cdf6d4ce0a3e89bd1aa96ba8440958a4cb8294a78c648886d3e91e41a857
6
+ metadata.gz: dd0353495019535ddec0da221dca824b83edee471f93f28ec9046c3239c8fdaed9d5fa16a5942af86065957153ecd643287319b302030be680116f2b96b886d6
7
+ data.tar.gz: edfbad62f743b1b324b5ff8a2ed695e154684077a7045649e45200f1233768eafa6c9a2e6c9681b964a658279b5dc2f00a1f43b2a9f7487d5def5f2441bf6aa3
data/NEWS.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # News
2
2
 
3
+ ## 0.2.9 - 2020-02-19
4
+
5
+ ### Improvements
6
+
7
+ * Removed needless taint check with Ruby 2.7.
8
+ [GitHub#7][Patch by Jeremy Evans]
9
+
10
+ * Added support for `itunes:image` in `item` element.
11
+ [GitHub#11][Patch by Ian McKenzie]
12
+
13
+ ### Thanks
14
+
15
+ * Jeremy Evans
16
+
17
+ * Ian McKenzie
18
+
3
19
  ## 0.2.8 - 2019-01-24
4
20
 
5
21
  ### Improvements
data/Rakefile CHANGED
@@ -1,8 +1,15 @@
1
1
  require "bundler/gem_tasks"
2
2
 
3
+ helper = Bundler::GemHelper.new(__dir__)
4
+ def helper.version_tag
5
+ version
6
+ end
7
+
8
+ helper.install
9
+
3
10
  desc "Run test"
4
11
  task :test do
5
- ruby("run-test.rb")
12
+ ruby("test/run-test.rb")
6
13
  end
7
14
 
8
15
  task :default => :test
@@ -258,7 +258,55 @@ module RSS
258
258
  end
259
259
 
260
260
  ELEMENT_INFOS = ITunesBaseModel::ELEMENT_INFOS +
261
- [["duration", :element, "content"]]
261
+ [["duration", :element, "content"], ["image", :attribute, "href"]]
262
+
263
+ class ITunesImage < Element
264
+ include RSS09
265
+
266
+ @tag_name = "image"
267
+
268
+ class << self
269
+ def required_prefix
270
+ ITUNES_PREFIX
271
+ end
272
+
273
+ def required_uri
274
+ ITUNES_URI
275
+ end
276
+ end
277
+
278
+ [
279
+ ["href", "", true]
280
+ ].each do |name, uri, required|
281
+ install_get_attribute(name, uri, required)
282
+ end
283
+
284
+ def initialize(*args)
285
+ if Utils.element_initialize_arguments?(args)
286
+ super
287
+ else
288
+ super()
289
+ self.href = args[0]
290
+ end
291
+ end
292
+
293
+ def full_name
294
+ tag_name_with_prefix(ITUNES_PREFIX)
295
+ end
296
+
297
+ private
298
+ def maker_target(target)
299
+ if href
300
+ target.itunes_image {|image| image}
301
+ else
302
+ nil
303
+ end
304
+ end
305
+
306
+ def setup_maker_attributes(image)
307
+ image.href = href
308
+ end
309
+ end
262
310
 
263
311
  class ITunesDuration < Element
264
312
  include RSS09
@@ -171,6 +171,18 @@ module RSS
171
171
  end
172
172
  end
173
173
 
174
+ class ITunesImageBase < Base
175
+ add_need_initialize_variable("href")
176
+ attr_accessor("href")
177
+
178
+ def to_feed(feed, current)
179
+ if @href and current.respond_to?(:itunes_image)
180
+ current.itunes_image ||= current.class::ITunesImage.new
181
+ current.itunes_image.href = @href
182
+ end
183
+ end
184
+ end
185
+
174
186
  class ITunesDurationBase < Base
175
187
  attr_reader :content
176
188
  add_need_initialize_variable("content")
@@ -237,6 +249,7 @@ module RSS
237
249
  class ItemBase
238
250
  include Maker::ITunesItemModel
239
251
  class ITunesDuration < ITunesDurationBase; end
252
+ class ITunesImage < ITunesImageBase; end
240
253
  end
241
254
  end
242
255
  end
@@ -120,7 +120,7 @@ module RSS
120
120
 
121
121
  if uri.respond_to?(:read)
122
122
  uri.read
123
- elsif !rss.tainted? and File.readable?(rss)
123
+ elsif (RUBY_VERSION >= '2.7' || !rss.tainted?) and File.readable?(rss)
124
124
  File.open(rss) {|f| f.read}
125
125
  else
126
126
  rss
@@ -1,4 +1,4 @@
1
1
  module RSS
2
2
  # The current version of RSS
3
- VERSION = "0.2.8"
3
+ VERSION = "0.2.9"
4
4
  end
@@ -1,9 +1,4 @@
1
- begin
2
- require_relative "lib/rss/version"
3
- rescue LoadError
4
- # for Ruby core repository
5
- require_relative "version"
6
- end
1
+ require_relative "lib/rss/version"
7
2
 
8
3
  Gem::Specification.new do |spec|
9
4
  spec.name = "rss"
@@ -16,64 +11,19 @@ Gem::Specification.new do |spec|
16
11
  spec.homepage = "https://github.com/ruby/rss"
17
12
  spec.license = "BSD-2-Clause"
18
13
 
19
- spec.files = [
20
- ".gitignore",
21
- ".travis.yml",
14
+ spec.files = [
15
+ "#{spec.name}.gemspec",
22
16
  "Gemfile",
23
17
  "LICENSE.txt",
24
18
  "NEWS.md",
25
19
  "README.md",
26
20
  "Rakefile",
27
- "lib/rss.rb",
28
- "lib/rss/0.9.rb",
29
- "lib/rss/1.0.rb",
30
- "lib/rss/2.0.rb",
31
- "lib/rss/atom.rb",
32
- "lib/rss/content.rb",
33
- "lib/rss/content/1.0.rb",
34
- "lib/rss/content/2.0.rb",
35
- "lib/rss/converter.rb",
36
- "lib/rss/dublincore.rb",
37
- "lib/rss/dublincore/1.0.rb",
38
- "lib/rss/dublincore/2.0.rb",
39
- "lib/rss/dublincore/atom.rb",
40
- "lib/rss/image.rb",
41
- "lib/rss/itunes.rb",
42
- "lib/rss/maker.rb",
43
- "lib/rss/maker/0.9.rb",
44
- "lib/rss/maker/1.0.rb",
45
- "lib/rss/maker/2.0.rb",
46
- "lib/rss/maker/atom.rb",
47
- "lib/rss/maker/base.rb",
48
- "lib/rss/maker/content.rb",
49
- "lib/rss/maker/dublincore.rb",
50
- "lib/rss/maker/entry.rb",
51
- "lib/rss/maker/feed.rb",
52
- "lib/rss/maker/image.rb",
53
- "lib/rss/maker/itunes.rb",
54
- "lib/rss/maker/slash.rb",
55
- "lib/rss/maker/syndication.rb",
56
- "lib/rss/maker/taxonomy.rb",
57
- "lib/rss/maker/trackback.rb",
58
- "lib/rss/parser.rb",
59
- "lib/rss/rexmlparser.rb",
60
- "lib/rss/rss.rb",
61
- "lib/rss/slash.rb",
62
- "lib/rss/syndication.rb",
63
- "lib/rss/taxonomy.rb",
64
- "lib/rss/trackback.rb",
65
- "lib/rss/utils.rb",
66
- "lib/rss/version.rb",
67
- "lib/rss/xml-stylesheet.rb",
68
- "lib/rss/xml.rb",
69
- "lib/rss/xmlparser.rb",
70
- "lib/rss/xmlscanner.rb",
71
- "rss.gemspec",
72
21
  ]
73
- spec.bindir = "exe"
74
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.files += Dir.glob("lib/**/*.rb")
23
+ spec.test_files += Dir.glob("test/**/*")
75
24
  spec.require_paths = ["lib"]
76
25
 
26
+ spec.add_dependency "rexml"
77
27
  spec.add_development_dependency "bundler"
78
28
  spec.add_development_dependency "rake"
79
29
  spec.add_development_dependency "test-unit"
Binary file
@@ -0,0 +1,2116 @@
1
+ # frozen_string_literal: false
2
+ require 'erb'
3
+
4
+ module RSS
5
+ module Assertions
6
+ def assert_parse(rss, assert_method, *args)
7
+ __send__("assert_#{assert_method}", *args) do
8
+ ::RSS::Parser.parse(rss)
9
+ end
10
+ __send__("assert_#{assert_method}", *args) do
11
+ ::RSS::Parser.parse(rss, false).validate
12
+ end
13
+ end
14
+
15
+ def assert_ns(prefix, uri)
16
+ _wrap_assertion do
17
+ begin
18
+ yield
19
+ flunk("Not raise NSError")
20
+ rescue ::RSS::NSError => e
21
+ assert_equal(prefix, e.prefix)
22
+ assert_equal(uri, e.uri)
23
+ end
24
+ end
25
+ end
26
+
27
+ def assert_missing_tag(tag, parent)
28
+ _wrap_assertion do
29
+ begin
30
+ yield
31
+ flunk("Not raise MissingTagError")
32
+ rescue ::RSS::MissingTagError => e
33
+ assert_equal(tag, e.tag)
34
+ assert_equal(parent, e.parent)
35
+ end
36
+ end
37
+ end
38
+
39
+ def assert_too_much_tag(tag, parent)
40
+ _wrap_assertion do
41
+ begin
42
+ yield
43
+ flunk("Not raise TooMuchTagError")
44
+ rescue ::RSS::TooMuchTagError => e
45
+ assert_equal(tag, e.tag)
46
+ assert_equal(parent, e.parent)
47
+ end
48
+ end
49
+ end
50
+
51
+ def assert_missing_attribute(tag, attrname)
52
+ _wrap_assertion do
53
+ begin
54
+ yield
55
+ flunk("Not raise MissingAttributeError")
56
+ rescue ::RSS::MissingAttributeError => e
57
+ assert_equal(tag, e.tag)
58
+ assert_equal(attrname, e.attribute)
59
+ end
60
+ end
61
+ end
62
+
63
+ def assert_not_expected_tag(tag, uri, parent)
64
+ _wrap_assertion do
65
+ begin
66
+ yield
67
+ flunk("Not raise NotExpectedTagError")
68
+ rescue ::RSS::NotExpectedTagError => e
69
+ assert_equal(tag, e.tag)
70
+ assert_equal(uri, e.uri)
71
+ assert_equal(parent, e.parent)
72
+ end
73
+ end
74
+ end
75
+
76
+ def assert_not_available_value(tag, value, attribute=nil)
77
+ _wrap_assertion do
78
+ begin
79
+ yield
80
+ flunk("Not raise NotAvailableValueError")
81
+ rescue ::RSS::NotAvailableValueError => e
82
+ assert_equal(tag, e.tag)
83
+ assert_equal(value, e.value)
84
+ assert_equal(attribute, e.attribute)
85
+ end
86
+ end
87
+ end
88
+
89
+ def assert_not_set_error(name, variables)
90
+ _wrap_assertion do
91
+ begin
92
+ yield
93
+ flunk("Not raise NotSetError")
94
+ rescue ::RSS::NotSetError => e
95
+ assert_equal(name, e.name)
96
+ assert_kind_of(Array, variables)
97
+ assert_equal(variables.sort, e.variables.sort)
98
+ end
99
+ end
100
+ end
101
+
102
+ def assert_xml_declaration(version, encoding, standalone, rss)
103
+ _wrap_assertion do
104
+ assert_equal(version, rss.version)
105
+ assert_equal(encoding, rss.encoding)
106
+ assert_equal(standalone, rss.standalone)
107
+ end
108
+ end
109
+
110
+ def assert_xml_stylesheet_attrs(attrs, xsl)
111
+ _wrap_assertion do
112
+ n_attrs = normalized_attrs(attrs)
113
+ ::RSS::XMLStyleSheet::ATTRIBUTES.each do |name|
114
+ assert_equal(n_attrs[name], xsl.__send__(name))
115
+ end
116
+ end
117
+ end
118
+
119
+ def assert_xml_stylesheet(target, attrs, xsl)
120
+ _wrap_assertion do
121
+ if attrs.has_key?(:href)
122
+ if !attrs.has_key?(:type) and attrs.has_key?(:guess_type)
123
+ attrs[:type] = attrs[:guess_type]
124
+ end
125
+ assert_equal("xml-stylesheet", target)
126
+ assert_xml_stylesheet_attrs(attrs, xsl)
127
+ else
128
+ assert_nil(target)
129
+ assert_equal("", xsl.to_s)
130
+ end
131
+ end
132
+ end
133
+
134
+ def assert_xml_stylesheet_pis(attrs_ary, rss=nil)
135
+ _wrap_assertion do
136
+ if rss.nil?
137
+ rss = ::RSS::RDF.new
138
+ setup_rss10(rss)
139
+ end
140
+ xss_strs = []
141
+ attrs_ary.each do |attrs|
142
+ xss = ::RSS::XMLStyleSheet.new(attrs)
143
+ xss_strs.push(xss.to_s)
144
+ rss.xml_stylesheets.push(xss)
145
+ end
146
+ pi_str = rss.to_s.gsub(/<\?xml .*\n/, "").gsub(/\s*<[^\?].*\z/m, "")
147
+ assert_equal(xss_strs.join("\n"), pi_str)
148
+ end
149
+ end
150
+
151
+ def assert_xml_stylesheets(attrs, xss)
152
+ _wrap_assertion do
153
+ xss.each_with_index do |xs, i|
154
+ assert_xml_stylesheet_attrs(attrs[i], xs)
155
+ end
156
+ end
157
+ end
158
+
159
+
160
+ def assert_atom_person(tag_name, generator)
161
+ _wrap_assertion do
162
+ name = "Mark Pilgrim"
163
+ uri = "http://example.org/"
164
+ email = "f8dy@example.com"
165
+
166
+ assert_parse(generator.call(<<-EOA), :missing_tag, "name", tag_name)
167
+ <#{tag_name}/>
168
+ EOA
169
+
170
+ assert_parse(generator.call(<<-EOA), :missing_tag, "name", tag_name)
171
+ <#{tag_name}>
172
+ <uri>#{uri}</uri>
173
+ <email>#{email}</email>
174
+ </#{tag_name}>
175
+ EOA
176
+
177
+ assert_parse(generator.call(<<-EOA), :nothing_raised)
178
+ <#{tag_name}>
179
+ <name>#{name}</name>
180
+ </#{tag_name}>
181
+ EOA
182
+
183
+ feed = RSS::Parser.parse(generator.call(<<-EOA))
184
+ <#{tag_name}>
185
+ <name>#{name}</name>
186
+ <uri>#{uri}</uri>
187
+ <email>#{email}</email>
188
+ </#{tag_name}>
189
+ EOA
190
+
191
+ person = yield(feed)
192
+ assert_not_nil(person)
193
+ assert_equal(name, person.name.content)
194
+ assert_equal(uri, person.uri.content)
195
+ assert_equal(email, person.email.content)
196
+ end
197
+ end
198
+
199
+ def assert_atom_category(generator)
200
+ _wrap_assertion do
201
+ term = "Music"
202
+ scheme = "http://xmlns.com/wordnet/1.6/"
203
+ label = "music"
204
+
205
+ missing_args = [:missing_attribute, "category", "term"]
206
+ assert_parse(generator.call(<<-EOA), *missing_args)
207
+ <category/>
208
+ EOA
209
+
210
+ assert_parse(generator.call(<<-EOA), *missing_args)
211
+ <category scheme="#{scheme}" label="#{label}"/>
212
+ EOA
213
+
214
+ assert_parse(generator.call(<<-EOA), :nothing_raised)
215
+ <category term="#{term}"/>
216
+ EOA
217
+
218
+ feed = RSS::Parser.parse(generator.call(<<-EOA))
219
+ <category term="#{term}" scheme="#{scheme}" label="#{label}"/>
220
+ EOA
221
+
222
+ category = yield(feed)
223
+ assert_not_nil(category)
224
+ assert_equal(term, category.term)
225
+ assert_equal(scheme, category.scheme)
226
+ assert_equal(label, category.label)
227
+ end
228
+ end
229
+
230
+ def assert_atom_link(generator)
231
+ _wrap_assertion do
232
+ href = "http://example.org/feed.atom"
233
+ rel = "self"
234
+ type = "application/atom+xml"
235
+ hreflang = "en"
236
+ title = "Atom"
237
+ length = "1024"
238
+
239
+ assert_parse(generator.call(<<-EOA), :missing_attribute, "link", "href")
240
+ <link/>
241
+ EOA
242
+
243
+ assert_parse(generator.call(<<-EOA), :missing_attribute, "link", "href")
244
+ <link rel="#{rel}" type="#{type}" hreflang="#{hreflang}"
245
+ title="#{title}" length="#{length}"/>
246
+ EOA
247
+
248
+ assert_parse(generator.call(<<-EOA), :nothing_raised)
249
+ <link href="#{href}"/>
250
+ EOA
251
+
252
+ feed = RSS::Parser.parse(generator.call(<<-EOA))
253
+ <link href="#{href}" rel="#{rel}" type="#{type}" hreflang="#{hreflang}"
254
+ title="#{title}" length="#{length}"/>
255
+ EOA
256
+
257
+ link = yield(feed)
258
+ assert_not_nil(link)
259
+ assert_equal(href, link.href)
260
+ assert_equal(rel, link.rel)
261
+ assert_equal(type, link.type)
262
+ assert_equal(hreflang, link.hreflang)
263
+ assert_equal(title, link.title)
264
+ assert_equal(length, link.length)
265
+
266
+
267
+ href = "http://example.org/index.html.ja"
268
+ parent = link.parent.tag_name
269
+ return if parent == "source"
270
+
271
+ optional_attributes = %w(hreflang="ja" type="text/html")
272
+ 0.upto(optional_attributes.size) do |i|
273
+ combination(optional_attributes, i).each do |attributes|
274
+ attrs = attributes.join(" ")
275
+ assert_parse(generator.call(<<-EOA), :too_much_tag, "link", parent)
276
+ <link rel="alternate" #{attrs} href="#{href}"/>
277
+ <link rel="alternate" #{attrs} href="#{href}"/>
278
+ EOA
279
+ end
280
+ end
281
+ end
282
+ end
283
+
284
+ def assert_atom_generator(generator)
285
+ _wrap_assertion do
286
+ uri = "http://www.example.com/"
287
+ version = "1.0"
288
+ content = "Example Toolkit"
289
+
290
+ assert_parse(generator.call(<<-EOA), :nothing_raised)
291
+ <generator/>
292
+ EOA
293
+
294
+ assert_parse(generator.call(<<-EOA), :nothing_raised)
295
+ <generator uri="#{uri}" version="#{version}"/>
296
+ EOA
297
+
298
+ feed = RSS::Parser.parse(generator.call(<<-EOA))
299
+ <generator uri="#{uri}" version="#{version}">#{content}</generator>
300
+ EOA
301
+
302
+ gen = yield(feed)
303
+ assert_not_nil(gen)
304
+ assert_equal(uri, gen.uri)
305
+ assert_equal(version, gen.version)
306
+ assert_equal(content, gen.content)
307
+ end
308
+ end
309
+
310
+ def assert_atom_icon(generator)
311
+ _wrap_assertion do
312
+ content = "http://www.example.com/example.png"
313
+
314
+ assert_parse(generator.call(<<-EOA), :nothing_raised)
315
+ <icon/>
316
+ EOA
317
+
318
+ feed = RSS::Parser.parse(generator.call(<<-EOA))
319
+ <icon>#{content}</icon>
320
+ EOA
321
+
322
+ icon = yield(feed)
323
+ assert_not_nil(icon)
324
+ assert_equal(content, icon.content)
325
+ end
326
+ end
327
+
328
+ def assert_atom_text_construct(tag_name, generator)
329
+ _wrap_assertion do
330
+ [nil, "text", "html"].each do |type|
331
+ attr = ""
332
+ attr = " type=\"#{type}\"" if type
333
+ assert_parse(generator.call(<<-EOA), :nothing_raised)
334
+ <#{tag_name}#{attr}/>
335
+ EOA
336
+ end
337
+
338
+ assert_parse(generator.call(<<-EOA), :missing_tag, "div", tag_name)
339
+ <#{tag_name} type="xhtml"/>
340
+ EOA
341
+
342
+ args = ["x", Atom::URI, tag_name]
343
+ assert_parse(generator.call(<<-EOA), :not_expected_tag, *args)
344
+ <#{tag_name} type="xhtml"><x/></#{tag_name}>
345
+ EOA
346
+
347
+ invalid_value = "invalid"
348
+ args = ["type", invalid_value]
349
+ assert_parse(generator.call(<<-EOA), :not_available_value, *args)
350
+ <#{tag_name} type="#{invalid_value}"/>
351
+ EOA
352
+
353
+ [
354
+ [nil, "A lot of effort went into making this effortless"],
355
+ ["text", "A lot of effort went into making this effortless"],
356
+ ["html", "A <em>lot</em> of effort went into making this effortless"],
357
+ ].each do |type, content|
358
+ attr = ""
359
+ attr = " type=\"#{type}\"" if type
360
+ feed = RSS::Parser.parse(generator.call(<<-EOA))
361
+ <#{tag_name}#{attr}>#{h content}</#{tag_name}>
362
+ EOA
363
+
364
+ element = yield(feed)
365
+ assert_not_nil(element)
366
+ assert_equal(type, element.type)
367
+ assert_equal(content, element.content)
368
+ end
369
+
370
+ [false, true].each do |with_space|
371
+ xhtml_uri = "http://www.w3.org/1999/xhtml"
372
+ xhtml_content = "<div xmlns=\"#{xhtml_uri}\">abc</div>"
373
+ xhtml_element = RSS::XML::Element.new("div", nil, xhtml_uri,
374
+ {"xmlns" => xhtml_uri},
375
+ ["abc"])
376
+ content = xhtml_content
377
+ content = " #{content} " if with_space
378
+ feed = RSS::Parser.parse(generator.call(<<-EOA))
379
+ <#{tag_name} type="xhtml">#{content}</#{tag_name}>
380
+ EOA
381
+
382
+ element = yield(feed)
383
+ assert_not_nil(element)
384
+ assert_equal("xhtml", element.type)
385
+ assert_equal(xhtml_content, element.content)
386
+ assert_equal(xhtml_element, element.xhtml)
387
+ end
388
+ end
389
+ end
390
+
391
+ def assert_atom_date_construct(tag_name, generator)
392
+ _wrap_assertion do
393
+ args = [tag_name, ""]
394
+ assert_parse(generator.call(<<-EOR), :not_available_value, *args)
395
+ <#{tag_name}/>
396
+ EOR
397
+
398
+ [
399
+ ["xxx", false],
400
+ ["2007", false],
401
+ ["2007/02/09", true],
402
+ ].each do |invalid_value, can_parse|
403
+ assert_not_available_value(tag_name, invalid_value) do
404
+ RSS::Parser.parse(generator.call(<<-EOR))
405
+ <#{tag_name}>#{invalid_value}</#{tag_name}>
406
+ EOR
407
+ end
408
+
409
+ feed = RSS::Parser.parse(generator.call(<<-EOR), false)
410
+ <#{tag_name}>#{invalid_value}</#{tag_name}>
411
+ EOR
412
+ value = yield(feed).content
413
+ if can_parse
414
+ assert_equal(Time.parse(invalid_value), value)
415
+ else
416
+ assert_nil(value)
417
+ end
418
+ end
419
+
420
+ [
421
+ "2003-12-13T18:30:02Z",
422
+ "2003-12-13T18:30:02.25Z",
423
+ "2003-12-13T18:30:02+01:00",
424
+ "2003-12-13T18:30:02.25+01:00",
425
+ ].each do |valid_value|
426
+ assert_parse(generator.call(<<-EOR), :nothing_raised)
427
+ <#{tag_name}>#{valid_value}</#{tag_name}>
428
+ EOR
429
+
430
+ feed = RSS::Parser.parse(generator.call(<<-EOR))
431
+ <#{tag_name}>#{valid_value}</#{tag_name}>
432
+ EOR
433
+ assert_equal(Time.parse(valid_value), yield(feed).content)
434
+ end
435
+ end
436
+ end
437
+
438
+ def assert_atom_logo(generator)
439
+ _wrap_assertion do
440
+ content = "http://www.example.com/example.png"
441
+
442
+ assert_parse(generator.call(<<-EOA), :nothing_raised)
443
+ <logo/>
444
+ EOA
445
+
446
+ feed = RSS::Parser.parse(generator.call(<<-EOA))
447
+ <logo>#{content}</logo>
448
+ EOA
449
+
450
+ logo = yield(feed)
451
+ assert_not_nil(logo)
452
+ assert_equal(content, logo.content)
453
+ end
454
+ end
455
+
456
+ def assert_atom_content(generator, &getter)
457
+ _wrap_assertion do
458
+ assert_atom_content_inline_text(generator, &getter)
459
+ assert_atom_content_inline_xhtml(generator, &getter)
460
+ assert_atom_content_inline_other(generator, &getter)
461
+ assert_atom_content_out_of_line(generator, &getter)
462
+ end
463
+ end
464
+
465
+ def assert_atom_content_inline_text(generator)
466
+ _wrap_assertion do
467
+ [nil, "text", "html"].each do |type|
468
+ content = "<content"
469
+ content << " type='#{type}'" if type
470
+
471
+ suffix = "/>"
472
+ assert_parse(generator.call(content + suffix), :nothing_raised)
473
+ suffix = ">xxx</content>"
474
+ assert_parse(generator.call(content + suffix), :nothing_raised)
475
+ end
476
+
477
+ [
478
+ ["text", "sample content"],
479
+ ["text/plain", "sample content"],
480
+ ["html", "<em>sample</em> content"]
481
+ ].each do |type, content_content|
482
+ feed = RSS::Parser.parse(generator.call(<<-EOA))
483
+ <content type="#{type}">#{h content_content}</content>
484
+ EOA
485
+ content = yield(feed)
486
+ assert_equal(type, content.type)
487
+ if %w(text html).include?(type)
488
+ assert(content.inline_text?)
489
+ else
490
+ assert(!content.inline_text?)
491
+ end
492
+ if type == "html"
493
+ assert(content.inline_html?)
494
+ else
495
+ assert(!content.inline_html?)
496
+ end
497
+ assert(!content.inline_xhtml?)
498
+ if type == "text/plain"
499
+ assert(content.inline_other?)
500
+ assert(content.inline_other_text?)
501
+ else
502
+ assert(!content.inline_other?)
503
+ assert(!content.inline_other_text?)
504
+ end
505
+ assert(!content.inline_other_xml?)
506
+ assert(!content.inline_other_base64?)
507
+ assert(!content.out_of_line?)
508
+ assert(!content.have_xml_content?)
509
+ assert_equal(content_content, content.content)
510
+ end
511
+ end
512
+ end
513
+
514
+ def assert_atom_content_inline_xhtml(generator)
515
+ _wrap_assertion do
516
+ args = ["div", "content"]
517
+ assert_parse(generator.call(<<-EOA), :missing_tag, *args)
518
+ <content type="xhtml"/>
519
+ EOA
520
+
521
+ args = ["x", Atom::URI, "content"]
522
+ assert_parse(generator.call(<<-EOA), :not_expected_tag, *args)
523
+ <content type="xhtml"><x/></content>
524
+ EOA
525
+
526
+ xhtml_uri = "http://www.w3.org/1999/xhtml"
527
+ xhtml_content = "<div xmlns=\"#{xhtml_uri}\">abc</div>"
528
+ xhtml_element = RSS::XML::Element.new("div", nil, xhtml_uri,
529
+ {"xmlns" => xhtml_uri},
530
+ ["abc"])
531
+ feed = RSS::Parser.parse(generator.call(<<-EOA))
532
+ <content type="xhtml">#{xhtml_content}</content>
533
+ EOA
534
+
535
+ content = yield(feed)
536
+ assert_not_nil(content)
537
+ assert_equal("xhtml", content.type)
538
+ assert(!content.inline_text?)
539
+ assert(!content.inline_html?)
540
+ assert(content.inline_xhtml?)
541
+ assert(!content.inline_other?)
542
+ assert(!content.inline_other_text?)
543
+ assert(!content.inline_other_xml?)
544
+ assert(!content.inline_other_base64?)
545
+ assert(!content.out_of_line?)
546
+ assert(content.have_xml_content?)
547
+ assert_equal(xhtml_content, content.content)
548
+ assert_equal(xhtml_element, content.xhtml)
549
+ end
550
+ end
551
+
552
+ def assert_atom_content_inline_other(generator, &getter)
553
+ _wrap_assertion do
554
+ assert_atom_content_inline_other_text(generator, &getter)
555
+ assert_atom_content_inline_other_xml(generator, &getter)
556
+ end
557
+ end
558
+
559
+ def assert_atom_content_inline_other_text(generator)
560
+ _wrap_assertion do
561
+ type = "image/png"
562
+ assert_parse(generator.call(<<-EOA), :nothing_raised)
563
+ <content type="#{type}"/>
564
+ EOA
565
+
566
+ png_file = File.join(File.dirname(__FILE__), "dot.png")
567
+ png = File.open(png_file, "rb") do |file|
568
+ file.read.force_encoding("binary")
569
+ end
570
+ base64_content = [png].pack("m").delete("\n")
571
+
572
+ [false, true].each do |with_space|
573
+ xml_content = base64_content
574
+ xml_content = " #{base64_content}" if with_space
575
+ feed = RSS::Parser.parse(generator.call(<<-EOA))
576
+ <content type="#{type}">#{xml_content}</content>
577
+ EOA
578
+
579
+ content = yield(feed)
580
+ assert_not_nil(content)
581
+ assert_equal(type, content.type)
582
+ assert(!content.inline_text?)
583
+ assert(!content.inline_html?)
584
+ assert(!content.inline_xhtml?)
585
+ assert(content.inline_other?)
586
+ assert(!content.inline_other_text?)
587
+ assert(!content.inline_other_xml?)
588
+ assert(content.inline_other_base64?)
589
+ assert(!content.out_of_line?)
590
+ assert(!content.have_xml_content?)
591
+ assert_equal(png, content.content)
592
+
593
+ xml = REXML::Document.new(content.to_s).root
594
+ assert_rexml_element([], {"type" => type}, base64_content, xml)
595
+ end
596
+ end
597
+ end
598
+
599
+ def assert_atom_content_inline_other_xml(generator)
600
+ _wrap_assertion do
601
+ type = "image/svg+xml"
602
+
603
+ assert_parse(generator.call(<<-EOA), :nothing_raised)
604
+ <content type="#{type}"/>
605
+ EOA
606
+
607
+ svg_uri = "http://www.w3.org/2000/svg"
608
+ svg_width = "50pt"
609
+ svg_height = "20pt"
610
+ svg_version = "1.0"
611
+ text_x = "15"
612
+ text_y = "15"
613
+ text = "text"
614
+ svg_content = <<-EOS
615
+ <svg
616
+ xmlns="#{svg_uri}"
617
+ width="#{svg_width}"
618
+ height="#{svg_height}"
619
+ version="#{svg_version}"
620
+ ><text x="#{text_x}" y="#{text_y}">#{text}</text
621
+ ></svg>
622
+ EOS
623
+
624
+ text_element = RSS::XML::Element.new("text", nil, svg_uri,
625
+ {
626
+ "x" => text_x,
627
+ "y" => text_y,
628
+ },
629
+ [text])
630
+ svg_element = RSS::XML::Element.new("svg", nil, svg_uri,
631
+ {
632
+ "xmlns" => svg_uri,
633
+ "width" => svg_width,
634
+ "height" => svg_height,
635
+ "version" => svg_version,
636
+ },
637
+ [text_element])
638
+ feed = RSS::Parser.parse(generator.call(<<-EOA))
639
+ <content type="#{type}">#{svg_content}</content>
640
+ EOA
641
+
642
+ content = yield(feed)
643
+ assert_not_nil(content)
644
+ assert_equal(type, content.type)
645
+ assert(!content.inline_text?)
646
+ assert(!content.inline_html?)
647
+ assert(!content.inline_xhtml?)
648
+ assert(content.inline_other?)
649
+ assert(!content.inline_other_text?)
650
+ assert(content.inline_other_xml?)
651
+ assert(!content.inline_other_base64?)
652
+ assert(!content.out_of_line?)
653
+ assert(content.have_xml_content?)
654
+ assert_equal(REXML::Document.new(svg_content).to_s.chomp,
655
+ REXML::Document.new(content.content).to_s.chomp)
656
+ assert_equal(svg_element, content.xml)
657
+ assert_nil(content.xhtml)
658
+ end
659
+ end
660
+
661
+ def assert_atom_content_out_of_line(generator)
662
+ _wrap_assertion do
663
+ text_type = "text/plain"
664
+ text_src = "http://example.com/README.txt"
665
+
666
+ missing_args = [:missing_attribute, "content", "type"]
667
+ # RSS Parser raises error even if this is "should" not "must".
668
+ assert_parse(generator.call(<<-EOA), *missing_args)
669
+ <content src="#{text_src}"/>
670
+ EOA
671
+
672
+ content_content = "xxx"
673
+ not_available_value_args = [:not_available_value,
674
+ "content", content_content]
675
+ assert_parse(generator.call(<<-EOA), *not_available_value_args)
676
+ <content type="#{text_type}" src="#{text_src}">#{content_content}</content>
677
+ EOA
678
+
679
+ feed = RSS::Parser.parse(generator.call(<<-EOA))
680
+ <content type="#{text_type}" src="#{text_src}"/>
681
+ EOA
682
+ content = yield(feed)
683
+ assert_not_nil(content)
684
+ assert_equal(text_type, content.type)
685
+ assert_equal(text_src, content.src)
686
+ assert(!content.inline_text?)
687
+ assert(!content.inline_html?)
688
+ assert(!content.inline_xhtml?)
689
+ assert(!content.inline_other?)
690
+ assert(!content.inline_other_text?)
691
+ assert(!content.inline_other_xml?)
692
+ assert(!content.inline_other_base64?)
693
+ assert(content.out_of_line?)
694
+ assert(!content.have_xml_content?)
695
+ assert_nil(content.xml)
696
+ assert_nil(content.xhtml)
697
+ assert_equal("", content.content)
698
+ end
699
+ end
700
+
701
+ def assert_atom_source(generator, &getter)
702
+ _wrap_assertion do
703
+ assert_atom_source_author(generator, &getter)
704
+ assert_atom_source_category(generator, &getter)
705
+ assert_atom_source_contributor(generator, &getter)
706
+ assert_atom_source_generator(generator, &getter)
707
+ assert_atom_source_icon(generator, &getter)
708
+ assert_atom_source_id(generator, &getter)
709
+ assert_atom_source_link(generator, &getter)
710
+ assert_atom_source_logo(generator, &getter)
711
+ assert_atom_source_rights(generator, &getter)
712
+ assert_atom_source_subtitle(generator, &getter)
713
+ assert_atom_source_title(generator, &getter)
714
+ assert_atom_source_updated(generator, &getter)
715
+ end
716
+ end
717
+
718
+ def assert_atom_source_author(generator)
719
+ assert_atom_person("author", generator) do |feed|
720
+ source = yield(feed)
721
+ assert_equal(1, source.authors.size)
722
+ source.author
723
+ end
724
+ end
725
+
726
+ def assert_atom_source_category(generator)
727
+ assert_atom_category(generator) do |feed|
728
+ source = yield(feed)
729
+ assert_equal(1, source.categories.size)
730
+ source.category
731
+ end
732
+ end
733
+
734
+ def assert_atom_source_contributor(generator)
735
+ assert_atom_person("contributor", generator) do |feed|
736
+ source = yield(feed)
737
+ assert_equal(1, source.contributors.size)
738
+ source.contributor
739
+ end
740
+ end
741
+
742
+ def assert_atom_source_generator(generator)
743
+ assert_atom_generator(generator) do |feed|
744
+ yield(feed).generator
745
+ end
746
+ end
747
+
748
+ def assert_atom_source_icon(generator)
749
+ assert_atom_icon(generator) do |feed|
750
+ yield(feed).icon
751
+ end
752
+ end
753
+
754
+ def assert_atom_source_id(generator)
755
+ id_content = "urn:uuid:a2fb588b-5674-4898-b420-265a734fea69"
756
+ id = "<id>#{id_content}</id>"
757
+ feed = RSS::Parser.parse(generator.call(id))
758
+ assert_equal(id_content, yield(feed).id.content)
759
+ end
760
+
761
+ def assert_atom_source_link(generator)
762
+ assert_atom_link(generator) do |feed|
763
+ source = yield(feed)
764
+ assert_equal(1, source.links.size)
765
+ source.link
766
+ end
767
+ end
768
+
769
+ def assert_atom_source_logo(generator)
770
+ assert_atom_logo(generator) do |feed|
771
+ yield(feed).logo
772
+ end
773
+ end
774
+
775
+ def assert_atom_source_rights(generator)
776
+ assert_atom_text_construct("rights", generator) do |feed|
777
+ yield(feed).rights
778
+ end
779
+ end
780
+
781
+ def assert_atom_source_subtitle(generator)
782
+ assert_atom_text_construct("subtitle", generator) do |feed|
783
+ yield(feed).subtitle
784
+ end
785
+ end
786
+
787
+ def assert_atom_source_title(generator)
788
+ assert_atom_text_construct("title", generator) do |feed|
789
+ yield(feed).title
790
+ end
791
+ end
792
+
793
+ def assert_atom_source_updated(generator)
794
+ assert_atom_date_construct("updated", generator) do |feed|
795
+ yield(feed).updated
796
+ end
797
+ end
798
+
799
+ def assert_dublin_core(elems, target)
800
+ _wrap_assertion do
801
+ elems.each do |name, value|
802
+ assert_equal(value, target.__send__("dc_#{name}"))
803
+ end
804
+ end
805
+ end
806
+
807
+ def assert_multiple_dublin_core(elems, target)
808
+ _wrap_assertion do
809
+ elems.each do |name, values, plural|
810
+ plural ||= "#{name}s"
811
+ actual = target.__send__("dc_#{plural}").collect{|x| x.value}
812
+ assert_equal(values, actual)
813
+ end
814
+ end
815
+ end
816
+
817
+ def assert_syndication(elems, target)
818
+ _wrap_assertion do
819
+ elems.each do |name, value|
820
+ meth = "sy_#{name}"
821
+ value = value.to_i if meth == "sy_updateFrequency"
822
+ assert_equal(value, target.__send__(meth ))
823
+ end
824
+ end
825
+ end
826
+
827
+ def assert_content(elems, target)
828
+ _wrap_assertion do
829
+ elems.each do |name, value|
830
+ assert_equal(value, target.__send__("content_#{name}"))
831
+ end
832
+ end
833
+ end
834
+
835
+ def assert_trackback(attrs, target)
836
+ _wrap_assertion do
837
+ n_attrs = normalized_attrs(attrs)
838
+ if n_attrs["ping"]
839
+ assert_equal(n_attrs["ping"], target.trackback_ping)
840
+ end
841
+ if n_attrs["abouts"]
842
+ n_attrs["abouts"].each_with_index do |about, i|
843
+ assert_equal(about, target.trackback_abouts[i].value)
844
+ end
845
+ end
846
+ end
847
+ end
848
+
849
+ def assert_taxo_topic(topics, target)
850
+ _wrap_assertion do
851
+ topics.each_with_index do |topic, i|
852
+ taxo_topic = target.taxo_topics[i]
853
+ topic.each do |name, value|
854
+ case name
855
+ when :link
856
+ assert_equal(value, taxo_topic.about)
857
+ assert_equal(value, taxo_topic.taxo_link)
858
+ when :topics
859
+ assert_equal(value, taxo_topic.taxo_topics.resources)
860
+ else
861
+ assert_equal(value, taxo_topic.__send__("dc_#{name}"))
862
+ end
863
+ end
864
+ end
865
+ end
866
+ end
867
+
868
+
869
+ def assert_attributes(attrs, names, target)
870
+ _wrap_assertion do
871
+ n_attrs = normalized_attrs(attrs)
872
+ names.each do |info|
873
+ if info.is_a?(String)
874
+ name = info
875
+ type = nil
876
+ else
877
+ name, type = info
878
+ end
879
+ value = n_attrs[name]
880
+ if value.is_a?(Time)
881
+ actual = target.__send__(name)
882
+ assert_instance_of(Time, actual)
883
+ assert_equal(value.to_i, actual.to_i)
884
+ elsif value
885
+ case type
886
+ when :integer
887
+ value = value.to_i
888
+ when :boolean
889
+ value = value == "true" if value.is_a?(String)
890
+ end
891
+ assert_equal(value, target.__send__(name))
892
+ end
893
+ end
894
+ end
895
+ end
896
+
897
+ def assert_rexml_element(children, attrs, text, element, text_type=nil)
898
+ _wrap_assertion do
899
+ if children
900
+ children_info = element.elements.collect {|e| [e.namespace, e.name]}
901
+ assert_equal(children.collect {|uri, name| [uri, name]}.sort,
902
+ children_info.sort)
903
+ end
904
+ if attrs
905
+ assert_equal(attrs.collect {|k, v| [k, v]}.sort,
906
+ element.attributes.collect {|k, v| [k, v]}.sort)
907
+ end
908
+ case text_type
909
+ when :time
910
+ assert_not_nil(element.text)
911
+ assert_equal(Time.parse(text).to_s, Time.parse(element.text).to_s)
912
+ else
913
+ assert_equal(text, element.text)
914
+ end
915
+ end
916
+ end
917
+
918
+ def _assert_maker_atom_persons(feed_type, maker_readers, feed_readers)
919
+ _wrap_assertion do
920
+ persons = []
921
+ feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
922
+ yield maker
923
+ targets = chain_reader(maker, maker_readers)
924
+ targets.each do |target|
925
+ person = {
926
+ :name => target.name,
927
+ :uri => target.uri,
928
+ :email => target.email,
929
+ }
930
+ persons << person if person[:name]
931
+ end
932
+ end
933
+
934
+ actual_persons = chain_reader(feed, feed_readers) || []
935
+ actual_persons = actual_persons.collect do |person|
936
+ {
937
+ :name => person.name ? person.name.content : nil,
938
+ :uri => person.uri ? person.uri.content : nil,
939
+ :email => person.email ? person.email.content : nil,
940
+ }
941
+ end
942
+ assert_equal(persons, actual_persons)
943
+ end
944
+ end
945
+
946
+ def assert_maker_atom_persons(feed_type, maker_readers, feed_readers,
947
+ not_set_error_name=nil,
948
+ parent_not_set_error_name=nil,
949
+ parent_not_set_variable=nil)
950
+ _wrap_assertion do
951
+ not_set_error_name ||= "maker.#{maker_readers.join('.')}"
952
+
953
+ args = [feed_type, maker_readers, feed_readers]
954
+ if parent_not_set_error_name or parent_not_set_variable
955
+ assert_not_set_error(parent_not_set_error_name,
956
+ parent_not_set_variable) do
957
+ _assert_maker_atom_persons(*args) do |maker|
958
+ yield maker
959
+ end
960
+ end
961
+ else
962
+ _assert_maker_atom_persons(*args) do |maker|
963
+ yield maker
964
+ end
965
+ end
966
+
967
+ assert_not_set_error(not_set_error_name, %w(name)) do
968
+ _assert_maker_atom_persons(feed_type, maker_readers,
969
+ feed_readers) do |maker|
970
+ yield maker
971
+ targets = chain_reader(maker, maker_readers)
972
+ targets.new_child
973
+ end
974
+ end
975
+
976
+ assert_not_set_error(not_set_error_name, %w(name)) do
977
+ _assert_maker_atom_persons(feed_type, maker_readers,
978
+ feed_readers) do |maker|
979
+ yield maker
980
+ targets = chain_reader(maker, maker_readers)
981
+ target = targets.new_child
982
+ target.uri = "http://example.com/~me/"
983
+ end
984
+ end
985
+
986
+ assert_not_set_error(not_set_error_name, %w(name)) do
987
+ _assert_maker_atom_persons(feed_type, maker_readers,
988
+ feed_readers) do |maker|
989
+ yield maker
990
+ targets = chain_reader(maker, maker_readers)
991
+ target = targets.new_child
992
+ target.email = "me@example.com"
993
+ end
994
+ end
995
+
996
+ assert_not_set_error(not_set_error_name, %w(name)) do
997
+ _assert_maker_atom_persons(feed_type, maker_readers,
998
+ feed_readers) do |maker|
999
+ yield maker
1000
+ targets = chain_reader(maker, maker_readers)
1001
+ target = targets.new_child
1002
+ target.uri = "http://example.com/~me/"
1003
+ target.email = "me@example.com"
1004
+ end
1005
+ end
1006
+
1007
+ _assert_maker_atom_persons(feed_type, maker_readers,
1008
+ feed_readers) do |maker|
1009
+ yield maker
1010
+ targets = chain_reader(maker, maker_readers)
1011
+ target = targets.new_child
1012
+ target.name = "me"
1013
+ end
1014
+
1015
+ _assert_maker_atom_persons(feed_type, maker_readers,
1016
+ feed_readers) do |maker|
1017
+ yield maker
1018
+ targets = chain_reader(maker, maker_readers)
1019
+ target = targets.new_child
1020
+ target.name = "me"
1021
+ target.uri = "http://example.com/~me/"
1022
+ end
1023
+
1024
+ _assert_maker_atom_persons(feed_type, maker_readers,
1025
+ feed_readers) do |maker|
1026
+ yield maker
1027
+ targets = chain_reader(maker, maker_readers)
1028
+ target = targets.new_child
1029
+ target.name = "me"
1030
+ target.email = "me@example.com"
1031
+ end
1032
+
1033
+ _assert_maker_atom_persons(feed_type, maker_readers,
1034
+ feed_readers) do |maker|
1035
+ yield maker
1036
+ targets = chain_reader(maker, maker_readers)
1037
+ target = targets.new_child
1038
+ target.name = "me"
1039
+ target.uri = "http://example.com/~me/"
1040
+ target.email = "me@example.com"
1041
+ end
1042
+
1043
+ _assert_maker_atom_persons(feed_type, maker_readers,
1044
+ feed_readers) do |maker|
1045
+ yield maker
1046
+ targets = chain_reader(maker, maker_readers)
1047
+
1048
+ target = targets.new_child
1049
+ target.name = "me"
1050
+ target.uri = "http://example.com/~me/"
1051
+ target.email = "me@example.com"
1052
+
1053
+ target = targets.new_child
1054
+ target.name = "you"
1055
+ target.uri = "http://example.com/~you/"
1056
+ target.email = "you@example.com"
1057
+ end
1058
+
1059
+ assert_not_set_error(not_set_error_name, %w(name)) do
1060
+ _assert_maker_atom_persons(feed_type, maker_readers,
1061
+ feed_readers) do |maker|
1062
+ yield maker
1063
+ targets = chain_reader(maker, maker_readers)
1064
+
1065
+ target = targets.new_child
1066
+ target.name = "me"
1067
+ target.uri = "http://example.com/~me/"
1068
+ target.email = "me@example.com"
1069
+
1070
+ targets.new_child
1071
+ end
1072
+ end
1073
+ end
1074
+ end
1075
+
1076
+ def _assert_maker_atom_text_construct(feed_type, maker_readers,
1077
+ feed_readers, &block)
1078
+ maker_extractor = Proc.new do |target|
1079
+ text = {
1080
+ :type => target.type,
1081
+ :content => target.content,
1082
+ :xml_content => target.xml_content,
1083
+ }
1084
+ if text[:type] == "xhtml"
1085
+ if text[:xml_content]
1086
+ xml_content = text[:xml_content]
1087
+ xhtml_uri = "http://www.w3.org/1999/xhtml"
1088
+ unless xml_content.is_a?(RSS::XML::Element) and
1089
+ ["div", xhtml_uri] == [xml_content.name, xml_content.uri]
1090
+ children = xml_content
1091
+ children = [children] unless children.is_a?(Array)
1092
+ xml_content = RSS::XML::Element.new("div", nil, xhtml_uri,
1093
+ {"xmlns" => xhtml_uri},
1094
+ children)
1095
+ text[:xml_content] = xml_content
1096
+ end
1097
+ text
1098
+ else
1099
+ nil
1100
+ end
1101
+ else
1102
+ text[:content] ? text : nil
1103
+ end
1104
+ end
1105
+ feed_extractor = Proc.new do |target|
1106
+ {
1107
+ :type => target.type,
1108
+ :content => target.content,
1109
+ :xml_content => target.xhtml,
1110
+ }
1111
+ end
1112
+ _assert_maker_atom_element(feed_type,
1113
+ maker_readers, true,
1114
+ feed_readers,
1115
+ maker_extractor,
1116
+ feed_extractor,
1117
+ &block)
1118
+ end
1119
+
1120
+ def assert_maker_atom_text_construct(feed_type, maker_readers, feed_readers,
1121
+ parent_not_set_error_name=nil,
1122
+ parent_not_set_variable=nil,
1123
+ not_set_error_name=nil)
1124
+ _wrap_assertion do
1125
+ not_set_error_name ||= "maker.#{maker_readers.join('.')}"
1126
+
1127
+ args = [feed_type, maker_readers, feed_readers]
1128
+ if parent_not_set_error_name or parent_not_set_variable
1129
+ assert_not_set_error(parent_not_set_error_name,
1130
+ parent_not_set_variable) do
1131
+ _assert_maker_atom_text_construct(*args) do |maker|
1132
+ yield maker
1133
+ end
1134
+ end
1135
+ else
1136
+ _assert_maker_atom_text_construct(*args) do |maker|
1137
+ yield maker
1138
+ end
1139
+ end
1140
+
1141
+ assert_not_set_error(not_set_error_name, %w(content)) do
1142
+ _assert_maker_atom_text_construct(*args) do |maker|
1143
+ yield maker
1144
+ target = chain_reader(maker, maker_readers) {|x| x}
1145
+ target.type = "text"
1146
+ end
1147
+ end
1148
+
1149
+ assert_not_set_error(not_set_error_name, %w(content)) do
1150
+ _assert_maker_atom_text_construct(*args) do |maker|
1151
+ yield maker
1152
+ target = chain_reader(maker, maker_readers) {|x| x}
1153
+ target.type = "html"
1154
+ end
1155
+ end
1156
+
1157
+ assert_not_set_error(not_set_error_name, %w(xml_content)) do
1158
+ _assert_maker_atom_text_construct(*args) do |maker|
1159
+ yield maker
1160
+ target = chain_reader(maker, maker_readers) {|x| x}
1161
+ target.type = "xhtml"
1162
+ end
1163
+ end
1164
+
1165
+ assert_not_set_error(not_set_error_name, %w(xml_content)) do
1166
+ _assert_maker_atom_text_construct(*args) do |maker|
1167
+ yield maker
1168
+ target = chain_reader(maker, maker_readers) {|x| x}
1169
+ target.type = "xhtml"
1170
+ target.content = "Content"
1171
+ end
1172
+ end
1173
+
1174
+ _assert_maker_atom_text_construct(*args) do |maker|
1175
+ yield maker
1176
+ target = chain_reader(maker, maker_readers) {|x| x}
1177
+ target.type = "text"
1178
+ target.content = "Content"
1179
+ end
1180
+
1181
+ _assert_maker_atom_text_construct(*args) do |maker|
1182
+ yield maker
1183
+ target = chain_reader(maker, maker_readers) {|x| x}
1184
+ target.type = "html"
1185
+ target.content = "<em>Content</em>"
1186
+ end
1187
+
1188
+ _assert_maker_atom_text_construct(*args) do |maker|
1189
+ yield maker
1190
+ target = chain_reader(maker, maker_readers) {|x| x}
1191
+ target.type = "xhtml"
1192
+ target.xml_content = "text only"
1193
+ end
1194
+
1195
+ _assert_maker_atom_text_construct(*args) do |maker|
1196
+ yield maker
1197
+ target = chain_reader(maker, maker_readers) {|x| x}
1198
+ target.type = "xhtml"
1199
+ target.xml_content = RSS::XML::Element.new("unknown")
1200
+ end
1201
+ end
1202
+ end
1203
+
1204
+ def _assert_maker_atom_date_construct(feed_type, maker_readers,
1205
+ feed_readers, &block)
1206
+ maker_extractor = Proc.new do |target|
1207
+ date = {
1208
+ :content => target,
1209
+ }
1210
+ date[:content] ? date : nil
1211
+ end
1212
+ feed_extractor = Proc.new do |target|
1213
+ {
1214
+ :content => target.content,
1215
+ }
1216
+ end
1217
+ _assert_maker_atom_element(feed_type,
1218
+ maker_readers, false,
1219
+ feed_readers,
1220
+ maker_extractor,
1221
+ feed_extractor,
1222
+ &block)
1223
+ end
1224
+
1225
+ def assert_maker_atom_date_construct(feed_type, maker_readers, feed_readers,
1226
+ parent_not_set_error_name=nil,
1227
+ parent_not_set_variable=nil)
1228
+ _wrap_assertion do
1229
+ args = [feed_type, maker_readers, feed_readers]
1230
+ if parent_not_set_error_name or parent_not_set_variable
1231
+ assert_not_set_error(parent_not_set_error_name,
1232
+ parent_not_set_variable) do
1233
+ _assert_maker_atom_date_construct(*args) do |maker|
1234
+ yield maker
1235
+ end
1236
+ end
1237
+ else
1238
+ _assert_maker_atom_date_construct(*args) do |maker|
1239
+ yield maker
1240
+ end
1241
+ end
1242
+
1243
+ maker_readers = maker_readers.dup
1244
+ writer = "#{maker_readers.pop}="
1245
+ _assert_maker_atom_date_construct(*args) do |maker|
1246
+ yield maker
1247
+ target = chain_reader(maker, maker_readers)
1248
+ target.__send__(writer, Time.now)
1249
+ end
1250
+ end
1251
+ end
1252
+
1253
+ def _assert_maker_atom_element(feed_type,
1254
+ maker_readers,
1255
+ maker_readers_need_block,
1256
+ feed_readers,
1257
+ maker_extractor,
1258
+ feed_extractor)
1259
+ _wrap_assertion do
1260
+ element = nil
1261
+ feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
1262
+ yield maker
1263
+ if maker_readers_need_block
1264
+ target = chain_reader(maker, maker_readers) {|x| x}
1265
+ else
1266
+ target = chain_reader(maker, maker_readers)
1267
+ end
1268
+ element = maker_extractor.call(target)
1269
+ end
1270
+
1271
+ target = chain_reader(feed, feed_readers)
1272
+ if target
1273
+ actual_element = feed_extractor.call(target)
1274
+ else
1275
+ actual_element = nil
1276
+ end
1277
+ assert_equal(element, actual_element)
1278
+ end
1279
+ end
1280
+
1281
+ def _assert_maker_atom_elements(feed_type, maker_readers, feed_readers,
1282
+ maker_extractor, feed_extractor,
1283
+ invalid_feed_checker=nil)
1284
+ _wrap_assertion do
1285
+ elements = []
1286
+ invalid_feed_exception = nil
1287
+ feed = nil
1288
+ begin
1289
+ feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
1290
+ yield maker
1291
+ targets = chain_reader(maker, maker_readers)
1292
+ targets.each do |target|
1293
+ element = maker_extractor.call(target)
1294
+ elements << element if element
1295
+ end
1296
+ if invalid_feed_checker
1297
+ invalid_feed_exception = invalid_feed_checker.call(targets)
1298
+ end
1299
+ end
1300
+ rescue RSS::Error
1301
+ if invalid_feed_exception.is_a?(RSS::TooMuchTagError)
1302
+ assert_too_much_tag(invalid_feed_exception.tag,
1303
+ invalid_feed_exception.parent) do
1304
+ raise
1305
+ end
1306
+ else
1307
+ raise
1308
+ end
1309
+ end
1310
+
1311
+ if invalid_feed_exception.nil?
1312
+ actual_elements = chain_reader(feed, feed_readers) || []
1313
+ actual_elements = actual_elements.collect do |target|
1314
+ feed_extractor.call(target)
1315
+ end
1316
+ assert_equal(elements, actual_elements)
1317
+ end
1318
+ end
1319
+ end
1320
+
1321
+ def assert_maker_atom_element(feed_type, maker_readers, feed_readers,
1322
+ setup_target, optional_variables,
1323
+ required_variable, assert_method_name,
1324
+ not_set_error_name=nil,
1325
+ *additional_args)
1326
+ _wrap_assertion do
1327
+ not_set_error_name ||= "maker.#{maker_readers.join('.')}"
1328
+
1329
+ 0.upto(optional_variables.size) do |i|
1330
+ combination(optional_variables, i).each do |names|
1331
+ have = {}
1332
+ names.each do |name|
1333
+ have[name.intern] = true
1334
+ end
1335
+ have_required_variable_too =
1336
+ have.merge({required_variable.intern => true})
1337
+
1338
+ assert_not_set_error(not_set_error_name, [required_variable]) do
1339
+ __send__(assert_method_name, feed_type, maker_readers,
1340
+ feed_readers, *additional_args) do |maker|
1341
+ yield maker
1342
+ target = chain_reader(maker, maker_readers) {|x| x}
1343
+ setup_target.call(target, have)
1344
+ end
1345
+ end
1346
+
1347
+ __send__(assert_method_name, feed_type, maker_readers, feed_readers,
1348
+ *additional_args) do |maker|
1349
+ yield maker
1350
+ target = chain_reader(maker, maker_readers) {|x| x}
1351
+ setup_target.call(target, have_required_variable_too)
1352
+ end
1353
+ end
1354
+ end
1355
+ end
1356
+ end
1357
+
1358
+ def assert_maker_atom_elements(feed_type, maker_readers, feed_readers,
1359
+ setup_target, optional_variables,
1360
+ required_variable, assert_method_name,
1361
+ not_set_error_name=nil,
1362
+ *additional_args)
1363
+ _wrap_assertion do
1364
+ not_set_error_name ||= "maker.#{maker_readers.join('.')}"
1365
+
1366
+ 0.upto(optional_variables.size) do |i|
1367
+ combination(optional_variables, i).each do |names|
1368
+ have = {}
1369
+ names.each do |name|
1370
+ have[name.intern] = true
1371
+ end
1372
+ have_required_variable_too =
1373
+ have.merge({required_variable.intern => true})
1374
+
1375
+ assert_not_set_error(not_set_error_name, [required_variable]) do
1376
+ __send__(assert_method_name, feed_type, maker_readers,
1377
+ feed_readers, *additional_args) do |maker|
1378
+ yield maker
1379
+ targets = chain_reader(maker, maker_readers)
1380
+ setup_target.call(targets, have)
1381
+ end
1382
+ end
1383
+
1384
+ __send__(assert_method_name, feed_type, maker_readers, feed_readers,
1385
+ *additional_args) do |maker|
1386
+ yield maker
1387
+ targets = chain_reader(maker, maker_readers)
1388
+ setup_target.call(targets, have_required_variable_too)
1389
+ end
1390
+
1391
+ __send__(assert_method_name, feed_type, maker_readers, feed_readers,
1392
+ *additional_args) do |maker|
1393
+ yield maker
1394
+ targets = chain_reader(maker, maker_readers)
1395
+ setup_target.call(targets, have_required_variable_too)
1396
+ setup_target.call(targets, have_required_variable_too)
1397
+ end
1398
+
1399
+ assert_not_set_error(not_set_error_name, [required_variable]) do
1400
+ __send__(assert_method_name, feed_type, maker_readers, feed_readers,
1401
+ *additional_args) do |maker|
1402
+ yield maker
1403
+ targets = chain_reader(maker, maker_readers)
1404
+ setup_target.call(targets, have_required_variable_too)
1405
+ setup_target.call(targets, have)
1406
+ end
1407
+ end
1408
+ end
1409
+ end
1410
+ end
1411
+ end
1412
+
1413
+ def _assert_maker_atom_categories(feed_type, maker_readers,
1414
+ feed_readers, &block)
1415
+ maker_extractor = Proc.new do |target|
1416
+ category = {
1417
+ :term => target.term,
1418
+ :scheme => target.scheme,
1419
+ :label => target.label,
1420
+ }
1421
+ category[:term] ? category : nil
1422
+ end
1423
+ feed_extractor = Proc.new do |target|
1424
+ {
1425
+ :term => target.term,
1426
+ :scheme => target.scheme,
1427
+ :label => target.label,
1428
+ }
1429
+ end
1430
+ _assert_maker_atom_elements(feed_type, maker_readers, feed_readers,
1431
+ maker_extractor, feed_extractor, &block)
1432
+ end
1433
+
1434
+ def assert_maker_atom_categories(feed_type, maker_readers, feed_readers,
1435
+ not_set_error_name=nil, &block)
1436
+ _wrap_assertion do
1437
+ _assert_maker_atom_categories(feed_type, maker_readers,
1438
+ feed_readers) do |maker|
1439
+ yield maker
1440
+ end
1441
+
1442
+ setup_target = Proc.new do |targets, have|
1443
+ target = targets.new_child
1444
+ target.term = "music" if have[:term]
1445
+ target.scheme = "http://example.com/category/music" if have[:scheme]
1446
+ target.label = "Music" if have[:label]
1447
+ end
1448
+
1449
+ optional_variables = %w(scheme label)
1450
+
1451
+ assert_maker_atom_elements(feed_type, maker_readers, feed_readers,
1452
+ setup_target, optional_variables,
1453
+ "term", :_assert_maker_atom_categories,
1454
+ not_set_error_name, &block)
1455
+ end
1456
+ end
1457
+
1458
+ def _assert_maker_atom_generator(feed_type, maker_readers,
1459
+ feed_readers, &block)
1460
+ maker_extractor = Proc.new do |target|
1461
+ generator = {
1462
+ :uri => target.uri,
1463
+ :version => target.version,
1464
+ :content => target.content,
1465
+ }
1466
+ generator[:content] ? generator : nil
1467
+ end
1468
+ feed_extractor = Proc.new do |target|
1469
+ {
1470
+ :uri => target.uri,
1471
+ :version => target.version,
1472
+ :content => target.content,
1473
+ }
1474
+ end
1475
+ _assert_maker_atom_element(feed_type,
1476
+ maker_readers, true,
1477
+ feed_readers,
1478
+ maker_extractor,
1479
+ feed_extractor,
1480
+ &block)
1481
+ end
1482
+
1483
+ def assert_maker_atom_generator(feed_type, maker_readers, feed_readers,
1484
+ not_set_error_name=nil, &block)
1485
+ _wrap_assertion do
1486
+ not_set_error_name ||= "maker.#{maker_readers.join('.')}"
1487
+
1488
+ _assert_maker_atom_generator(feed_type, maker_readers,
1489
+ feed_readers) do |maker|
1490
+ yield maker
1491
+ end
1492
+
1493
+ setup_target = Proc.new do |target, have|
1494
+ target.content = "RSS Maker" if have[:content]
1495
+ target.uri = "http://example.com/rss/maker" if have[:uri]
1496
+ target.version = "0.0.1" if have[:version]
1497
+ end
1498
+
1499
+ optional_variables = %w(uri version)
1500
+
1501
+ assert_maker_atom_element(feed_type, maker_readers, feed_readers,
1502
+ setup_target, optional_variables,
1503
+ "content", :_assert_maker_atom_generator,
1504
+ not_set_error_name, &block)
1505
+ end
1506
+ end
1507
+
1508
+ def _assert_maker_atom_icon(feed_type, maker_readers, feed_readers,
1509
+ accessor_base, &block)
1510
+ maker_extractor = Proc.new do |target|
1511
+ icon = {
1512
+ :content => target.__send__(accessor_base),
1513
+ }
1514
+ icon[:content] ? icon : nil
1515
+ end
1516
+ feed_extractor = Proc.new do |target|
1517
+ {
1518
+ :content => target.content,
1519
+ }
1520
+ end
1521
+ _assert_maker_atom_element(feed_type,
1522
+ maker_readers, true,
1523
+ feed_readers,
1524
+ maker_extractor,
1525
+ feed_extractor,
1526
+ &block)
1527
+ end
1528
+
1529
+ def assert_maker_atom_icon(feed_type, maker_readers, feed_readers,
1530
+ accessor_base=nil, not_set_error_name=nil)
1531
+ _wrap_assertion do
1532
+ accessor_base ||= "url"
1533
+ not_set_error_name ||= "maker.#{maker_readers.join('.')}"
1534
+
1535
+ _assert_maker_atom_icon(feed_type, maker_readers, feed_readers,
1536
+ accessor_base) do |maker|
1537
+ yield maker
1538
+ end
1539
+
1540
+ _assert_maker_atom_icon(feed_type, maker_readers, feed_readers,
1541
+ accessor_base) do |maker|
1542
+ yield maker
1543
+ target = chain_reader(maker, maker_readers)
1544
+ target.__send__("#{accessor_base}=", "http://example.com/icon.png")
1545
+ end
1546
+ end
1547
+ end
1548
+
1549
+ def _assert_maker_atom_links(feed_type, maker_readers, feed_readers,
1550
+ allow_duplication=false, &block)
1551
+ maker_extractor = Proc.new do |target|
1552
+ link = {
1553
+ :href => target.href,
1554
+ :rel => target.rel,
1555
+ :type => target.type,
1556
+ :hreflang => target.hreflang,
1557
+ :title => target.title,
1558
+ :length => target.length,
1559
+ }
1560
+ link[:href] ? link : nil
1561
+ end
1562
+ feed_extractor = Proc.new do |target|
1563
+ {
1564
+ :href => target.href,
1565
+ :rel => target.rel,
1566
+ :type => target.type,
1567
+ :hreflang => target.hreflang,
1568
+ :title => target.title,
1569
+ :length => target.length,
1570
+ }
1571
+ end
1572
+
1573
+ if feed_readers.first == "entries"
1574
+ parent = "entry"
1575
+ else
1576
+ parent = feed_type
1577
+ end
1578
+ invalid_feed_checker = Proc.new do |targets|
1579
+ infos = {}
1580
+ invalid_exception = nil
1581
+ targets.each do |target|
1582
+ key = [target.hreflang, target.type]
1583
+ if infos.has_key?(key)
1584
+ invalid_exception = RSS::TooMuchTagError.new("link", parent)
1585
+ break
1586
+ end
1587
+ infos[key] = true if target.rel.nil? or target.rel == "alternate"
1588
+ end
1589
+ invalid_exception
1590
+ end
1591
+ invalid_feed_checker = nil if allow_duplication
1592
+ _assert_maker_atom_elements(feed_type, maker_readers, feed_readers,
1593
+ maker_extractor, feed_extractor,
1594
+ invalid_feed_checker,
1595
+ &block)
1596
+ end
1597
+
1598
+ def assert_maker_atom_links(feed_type, maker_readers, feed_readers,
1599
+ not_set_error_name=nil, allow_duplication=false,
1600
+ &block)
1601
+ _wrap_assertion do
1602
+ _assert_maker_atom_links(feed_type, maker_readers,
1603
+ feed_readers) do |maker|
1604
+ yield maker
1605
+ end
1606
+
1607
+ langs = %(ja en fr zh po)
1608
+ setup_target = Proc.new do |targets, have|
1609
+ target = targets.new_child
1610
+ lang = langs[targets.size % langs.size]
1611
+ target.href = "http://example.com/index.html.#{lang}" if have[:href]
1612
+ target.rel = "alternate" if have[:rel]
1613
+ target.type = "text/xhtml" if have[:type]
1614
+ target.hreflang = lang if have[:hreflang]
1615
+ target.title = "FrontPage(#{lang})" if have[:title]
1616
+ target.length = 1024 if have[:length]
1617
+ end
1618
+
1619
+ optional_variables = %w(rel type hreflang title length)
1620
+
1621
+ assert_maker_atom_elements(feed_type, maker_readers, feed_readers,
1622
+ setup_target, optional_variables,
1623
+ "href", :_assert_maker_atom_links,
1624
+ not_set_error_name, allow_duplication,
1625
+ &block)
1626
+ end
1627
+ end
1628
+
1629
+ def _assert_maker_atom_logo(feed_type, maker_readers, feed_readers,
1630
+ accessor_base, &block)
1631
+ maker_extractor = Proc.new do |target|
1632
+ logo = {
1633
+ :uri => target.__send__(accessor_base),
1634
+ }
1635
+ logo[:uri] ? logo : nil
1636
+ end
1637
+ feed_extractor = Proc.new do |target|
1638
+ {
1639
+ :uri => target.content,
1640
+ }
1641
+ end
1642
+ _assert_maker_atom_element(feed_type,
1643
+ maker_readers, true,
1644
+ feed_readers,
1645
+ maker_extractor,
1646
+ feed_extractor,
1647
+ &block)
1648
+ end
1649
+
1650
+ def assert_maker_atom_logo(feed_type, maker_readers, feed_readers,
1651
+ accessor_base=nil, not_set_error_name=nil)
1652
+ _wrap_assertion do
1653
+ accessor_base ||= "uri"
1654
+ not_set_error_name ||= "maker.#{maker_readers.join('.')}"
1655
+
1656
+ _assert_maker_atom_logo(feed_type, maker_readers, feed_readers,
1657
+ accessor_base) do |maker|
1658
+ yield maker
1659
+ end
1660
+
1661
+ _assert_maker_atom_logo(feed_type, maker_readers, feed_readers,
1662
+ accessor_base) do |maker|
1663
+ yield maker
1664
+ target = chain_reader(maker, maker_readers)
1665
+ target.__send__("#{accessor_base}=", "http://example.com/logo.png")
1666
+ end
1667
+ end
1668
+ end
1669
+
1670
+ def _assert_maker_atom_id(feed_type, maker_readers, feed_readers, &block)
1671
+ maker_extractor = Proc.new do |target|
1672
+ id = {
1673
+ :uri => target.id,
1674
+ }
1675
+ id[:uri] ? id : nil
1676
+ end
1677
+ feed_extractor = Proc.new do |target|
1678
+ if target.id
1679
+ {
1680
+ :uri => target.id.content,
1681
+ }
1682
+ else
1683
+ nil
1684
+ end
1685
+ end
1686
+ _assert_maker_atom_element(feed_type,
1687
+ maker_readers, true,
1688
+ feed_readers,
1689
+ maker_extractor,
1690
+ feed_extractor,
1691
+ &block)
1692
+ end
1693
+
1694
+ def assert_maker_atom_id(feed_type, maker_readers, feed_readers,
1695
+ not_set_error_name=nil)
1696
+ _wrap_assertion do
1697
+ not_set_error_name ||= "maker.#{maker_readers.join('.')}"
1698
+
1699
+ args = [feed_type, maker_readers, feed_readers]
1700
+ _assert_maker_atom_id(*args) do |maker|
1701
+ yield maker
1702
+ end
1703
+
1704
+ _assert_maker_atom_id(*args) do |maker|
1705
+ yield maker
1706
+ target = chain_reader(maker, maker_readers)
1707
+ target.id = "http://example.com/id/1"
1708
+ end
1709
+ end
1710
+ end
1711
+
1712
+ def _assert_maker_atom_content(feed_type, maker_readers,
1713
+ feed_readers, &block)
1714
+ maker_extractor = Proc.new do |target|
1715
+ content = {
1716
+ :type => target.type,
1717
+ :src => target.src,
1718
+ :content => target.content,
1719
+ :xml => target.xml,
1720
+ :inline_text => target.inline_text?,
1721
+ :inline_html => target.inline_html?,
1722
+ :inline_xhtml => target.inline_xhtml?,
1723
+ :inline_other => target.inline_other?,
1724
+ :inline_other_text => target.inline_other_text?,
1725
+ :inline_other_xml => target.inline_other_xml?,
1726
+ :inline_other_base64 => target.inline_other_base64?,
1727
+ :out_of_line => target.out_of_line?,
1728
+ }
1729
+ content[:src] = nil if content[:src] and content[:content]
1730
+ if content[:type] or content[:content]
1731
+ content
1732
+ else
1733
+ nil
1734
+ end
1735
+ end
1736
+ feed_extractor = Proc.new do |target|
1737
+ {
1738
+ :type => target.type,
1739
+ :src => target.src,
1740
+ :content => target.content,
1741
+ :xml => target.xml,
1742
+ :inline_text => target.inline_text?,
1743
+ :inline_html => target.inline_html?,
1744
+ :inline_xhtml => target.inline_xhtml?,
1745
+ :inline_other => target.inline_other?,
1746
+ :inline_other_text => target.inline_other_text?,
1747
+ :inline_other_xml => target.inline_other_xml?,
1748
+ :inline_other_base64 => target.inline_other_base64?,
1749
+ :out_of_line => target.out_of_line?,
1750
+ }
1751
+ end
1752
+ _assert_maker_atom_element(feed_type,
1753
+ maker_readers, true,
1754
+ feed_readers,
1755
+ maker_extractor,
1756
+ feed_extractor,
1757
+ &block)
1758
+ end
1759
+
1760
+ def assert_maker_atom_content(feed_type, maker_readers, feed_readers,
1761
+ not_set_error_name=nil, &block)
1762
+ _wrap_assertion do
1763
+ not_set_error_name ||= "maker.#{maker_readers.join('.')}"
1764
+ args = [feed_type, maker_readers, feed_readers, not_set_error_name]
1765
+ assert_maker_atom_content_inline_text(*args, &block)
1766
+ assert_maker_atom_content_inline_xhtml(*args, &block)
1767
+ assert_maker_atom_content_inline_other(*args, &block)
1768
+ assert_maker_atom_content_out_of_line(*args, &block)
1769
+ end
1770
+ end
1771
+
1772
+ def assert_maker_atom_content_inline_text(feed_type, maker_readers,
1773
+ feed_readers, not_set_error_name)
1774
+ _wrap_assertion do
1775
+ args = [feed_type, maker_readers, feed_readers]
1776
+ _assert_maker_atom_content(*args) do |maker|
1777
+ yield maker
1778
+ end
1779
+
1780
+ assert_not_set_error(not_set_error_name, %w(content)) do
1781
+ RSS::Maker.make("atom:#{feed_type}") do |maker|
1782
+ yield maker
1783
+ target = chain_reader(maker, maker_readers)
1784
+ target.type = "text"
1785
+ end
1786
+ end
1787
+
1788
+ assert_not_set_error(not_set_error_name, %w(content)) do
1789
+ RSS::Maker.make("atom:#{feed_type}") do |maker|
1790
+ yield maker
1791
+ target = chain_reader(maker, maker_readers)
1792
+ target.type = "html"
1793
+ end
1794
+ end
1795
+
1796
+ _assert_maker_atom_content(*args) do |maker|
1797
+ yield maker
1798
+ target = chain_reader(maker, maker_readers)
1799
+ target.content = ""
1800
+ end
1801
+
1802
+ _assert_maker_atom_content(*args) do |maker|
1803
+ yield maker
1804
+ target = chain_reader(maker, maker_readers)
1805
+ target.type = "text"
1806
+ target.content = "example content"
1807
+ end
1808
+
1809
+ _assert_maker_atom_content(*args) do |maker|
1810
+ yield maker
1811
+ target = chain_reader(maker, maker_readers)
1812
+ target.type = "html"
1813
+ target.content = "<em>text</em>"
1814
+ end
1815
+ end
1816
+ end
1817
+
1818
+ def assert_maker_atom_content_inline_xhtml(feed_type, maker_readers,
1819
+ feed_readers, not_set_error_name)
1820
+ _wrap_assertion do
1821
+ args = [feed_type, maker_readers, feed_readers]
1822
+ assert_not_set_error(not_set_error_name, %w(xml_content)) do
1823
+ RSS::Maker.make("atom:#{feed_type}") do |maker|
1824
+ yield maker
1825
+ target = chain_reader(maker, maker_readers)
1826
+ target.type = "xhtml"
1827
+ end
1828
+ end
1829
+
1830
+ assert_not_set_error(not_set_error_name, %w(xml_content)) do
1831
+ RSS::Maker.make("atom:#{feed_type}") do |maker|
1832
+ yield maker
1833
+ target = chain_reader(maker, maker_readers)
1834
+ target.type = "xhtml"
1835
+ target.content = "dummy"
1836
+ end
1837
+ end
1838
+
1839
+ _assert_maker_atom_content(*args) do |maker|
1840
+ yield maker
1841
+ target = chain_reader(maker, maker_readers)
1842
+ target.type = "xhtml"
1843
+ target.xml_content = "text"
1844
+ end
1845
+
1846
+ _assert_maker_atom_content(*args) do |maker|
1847
+ yield maker
1848
+ target = chain_reader(maker, maker_readers)
1849
+ target.type = "xhtml"
1850
+ target.xml = "text"
1851
+ end
1852
+
1853
+ _assert_maker_atom_content(*args) do |maker|
1854
+ yield maker
1855
+ target = chain_reader(maker, maker_readers)
1856
+ target.type = "xhtml"
1857
+ target.xml_content =
1858
+ RSS::XML::Element.new("em", nil, nil, {}, ["text"])
1859
+ end
1860
+
1861
+ _assert_maker_atom_content(*args) do |maker|
1862
+ yield maker
1863
+ target = chain_reader(maker, maker_readers)
1864
+ target.type = "xhtml"
1865
+ target.xml = RSS::XML::Element.new("em", nil, nil, {}, ["text"])
1866
+ end
1867
+
1868
+
1869
+ xhtml_uri = "http://www.w3.org/1999/xhtml"
1870
+ em = RSS::XML::Element.new("em", nil, nil, {}, ["text"])
1871
+ em_with_xhtml_uri =
1872
+ RSS::XML::Element.new("em", nil, xhtml_uri, {}, ["text"])
1873
+ feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
1874
+ yield maker
1875
+ target = chain_reader(maker, maker_readers)
1876
+ target.type = "xhtml"
1877
+ target.xml = em
1878
+ end
1879
+ assert_equal(RSS::XML::Element.new("div", nil, xhtml_uri,
1880
+ {"xmlns" => xhtml_uri},
1881
+ [em_with_xhtml_uri]),
1882
+ chain_reader(feed, feed_readers).xml)
1883
+
1884
+ div = RSS::XML::Element.new("div", nil, xhtml_uri,
1885
+ {"xmlns" => xhtml_uri,
1886
+ "class" => "sample"},
1887
+ ["text"])
1888
+ feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
1889
+ yield maker
1890
+ target = chain_reader(maker, maker_readers)
1891
+ target.type = "xhtml"
1892
+ target.xml = div
1893
+ end
1894
+ assert_equal(div, chain_reader(feed, feed_readers).xml)
1895
+ end
1896
+ end
1897
+
1898
+ def assert_maker_atom_content_inline_other(*args, &block)
1899
+ _wrap_assertion do
1900
+ assert_maker_atom_content_inline_other_xml(*args, &block)
1901
+ assert_maker_atom_content_inline_other_text(*args, &block)
1902
+ assert_maker_atom_content_inline_other_base64(*args, &block)
1903
+ end
1904
+ end
1905
+
1906
+ def assert_maker_atom_content_inline_other_xml(feed_type, maker_readers,
1907
+ feed_readers,
1908
+ not_set_error_name)
1909
+ _wrap_assertion do
1910
+ args = [feed_type, maker_readers, feed_readers]
1911
+ assert_not_set_error(not_set_error_name, %w(xml_content)) do
1912
+ RSS::Maker.make("atom:#{feed_type}") do |maker|
1913
+ yield maker
1914
+ target = chain_reader(maker, maker_readers)
1915
+ target.type = "application/xml"
1916
+ end
1917
+ end
1918
+
1919
+ assert_not_set_error(not_set_error_name, %w(xml_content)) do
1920
+ RSS::Maker.make("atom:#{feed_type}") do |maker|
1921
+ yield maker
1922
+ target = chain_reader(maker, maker_readers)
1923
+ target.type = "svg/image+xml"
1924
+ end
1925
+ end
1926
+
1927
+ svg_uri = "http://www.w3.org/2000/svg"
1928
+ rect = RSS::XML::Element.new("rect", nil, svg_uri,
1929
+ {"x" => "0.5cm",
1930
+ "y" => "0.5cm",
1931
+ "width" => "2cm",
1932
+ "height" => "1cm"})
1933
+ svg = RSS::XML::Element.new("svg", nil, svg_uri,
1934
+ {"xmlns" => svg_uri,
1935
+ "version" => "1.1",
1936
+ "width" => "5cm",
1937
+ "height" => "4cm"},
1938
+ [rect])
1939
+ _assert_maker_atom_content(*args) do |maker|
1940
+ yield maker
1941
+ target = chain_reader(maker, maker_readers)
1942
+ target.type = "image/svg+xml"
1943
+ target.xml = svg
1944
+ end
1945
+
1946
+ feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
1947
+ yield maker
1948
+ target = chain_reader(maker, maker_readers)
1949
+ target.type = "image/svg+xml"
1950
+ target.xml = svg
1951
+ end
1952
+ assert_equal(svg, chain_reader(feed, feed_readers).xml)
1953
+ end
1954
+ end
1955
+
1956
+ def assert_maker_atom_content_inline_other_text(feed_type, maker_readers,
1957
+ feed_readers,
1958
+ not_set_error_name)
1959
+ _wrap_assertion do
1960
+ args = [feed_type, maker_readers, feed_readers]
1961
+ assert_not_set_error(not_set_error_name, %w(content)) do
1962
+ RSS::Maker.make("atom:#{feed_type}") do |maker|
1963
+ yield maker
1964
+ target = chain_reader(maker, maker_readers)
1965
+ target.type = "text/plain"
1966
+ end
1967
+ end
1968
+
1969
+ _assert_maker_atom_content(*args) do |maker|
1970
+ yield maker
1971
+ target = chain_reader(maker, maker_readers)
1972
+ target.type = "text/plain"
1973
+ target.content = "text"
1974
+ end
1975
+ end
1976
+ end
1977
+
1978
+ def assert_maker_atom_content_inline_other_base64(feed_type, maker_readers,
1979
+ feed_readers,
1980
+ not_set_error_name)
1981
+ _wrap_assertion do
1982
+ args = [feed_type, maker_readers, feed_readers]
1983
+ content = "\211PNG\r\n\032\n"
1984
+ _assert_maker_atom_content(*args) do |maker|
1985
+ yield maker
1986
+ target = chain_reader(maker, maker_readers)
1987
+ target.type = "image/png"
1988
+ target.content = content
1989
+ end
1990
+
1991
+ _assert_maker_atom_content(*args) do |maker|
1992
+ yield maker
1993
+ target = chain_reader(maker, maker_readers)
1994
+ target.type = "image/png"
1995
+ target.src = "http://example.com/logo.png"
1996
+ target.content = content
1997
+ end
1998
+
1999
+ feed = RSS::Maker.make("atom:#{feed_type}") do |maker|
2000
+ yield maker
2001
+ target = chain_reader(maker, maker_readers)
2002
+ target.type = "image/png"
2003
+ target.src = "http://example.com/logo.png"
2004
+ target.content = content
2005
+ end
2006
+ target = chain_reader(feed, feed_readers)
2007
+ assert_nil(target.src)
2008
+ assert_equal(content, target.content)
2009
+ end
2010
+ end
2011
+
2012
+ def assert_maker_atom_content_out_of_line(feed_type, maker_readers,
2013
+ feed_readers, not_set_error_name)
2014
+ _wrap_assertion do
2015
+ args = [feed_type, maker_readers, feed_readers]
2016
+ assert_not_set_error(not_set_error_name, %w(content)) do
2017
+ RSS::Maker.make("atom:#{feed_type}") do |maker|
2018
+ yield maker
2019
+ target = chain_reader(maker, maker_readers)
2020
+ target.type = "image/png"
2021
+ end
2022
+ end
2023
+
2024
+ assert_not_set_error(not_set_error_name, %w(type)) do
2025
+ RSS::Maker.make("atom:#{feed_type}") do |maker|
2026
+ yield maker
2027
+ target = chain_reader(maker, maker_readers)
2028
+ target.src = "http://example.com/logo.png"
2029
+ end
2030
+ end
2031
+
2032
+ _assert_maker_atom_content(*args) do |maker|
2033
+ yield maker
2034
+ target = chain_reader(maker, maker_readers)
2035
+ target.type = "image/png"
2036
+ target.src = "http://example.com/logo.png"
2037
+ end
2038
+
2039
+ _assert_maker_atom_content(*args) do |maker|
2040
+ yield maker
2041
+ target = chain_reader(maker, maker_readers)
2042
+ target.type = "image/png"
2043
+ target.content = "\211PNG\r\n\032\n"
2044
+ end
2045
+
2046
+ _assert_maker_atom_content(*args) do |maker|
2047
+ yield maker
2048
+ target = chain_reader(maker, maker_readers)
2049
+ target.type = "application/xml"
2050
+ target.src = "http://example.com/sample.xml"
2051
+ end
2052
+
2053
+
2054
+ _assert_maker_atom_content(*args) do |maker|
2055
+ yield maker
2056
+ target = chain_reader(maker, maker_readers)
2057
+ target.type = "text/plain"
2058
+ target.src = "http://example.com/README.txt"
2059
+ end
2060
+ end
2061
+ end
2062
+
2063
+ def assert_slash_elements(expected, target)
2064
+ assert_equal(expected,
2065
+ {
2066
+ "section" => target.slash_section,
2067
+ "department" => target.slash_department,
2068
+ "comments" => target.slash_comments,
2069
+ "hit_parades" => target.slash_hit_parades,
2070
+ })
2071
+ assert_equal(expected["hit_parades"].join(","),
2072
+ target.slash_hit_parade)
2073
+ end
2074
+
2075
+ def chain_reader(target, readers, &block)
2076
+ readers.inject(target) do |result, reader|
2077
+ return nil if result.nil?
2078
+ result.__send__(reader, &block)
2079
+ end
2080
+ end
2081
+
2082
+ def normalized_attrs(attrs)
2083
+ n_attrs = {}
2084
+ attrs.each do |name, value|
2085
+ n_attrs[name.to_s] = value
2086
+ end
2087
+ n_attrs
2088
+ end
2089
+
2090
+ def combination(elements, n)
2091
+ if n <= 0 or elements.size < n
2092
+ []
2093
+ elsif n == 1
2094
+ elements.collect {|element| [element]}
2095
+ else
2096
+ first, *rest = elements
2097
+ combination(rest, n - 1).collect do |sub_elements|
2098
+ [first, *sub_elements]
2099
+ end + combination(rest, n)
2100
+ end
2101
+ end
2102
+
2103
+ def tag(name, content=nil, attributes={})
2104
+ attributes = attributes.collect do |key, value|
2105
+ "#{ERB::Util.h(key)}=\"#{ERB::Util.h(value)}\""
2106
+ end.join(" ")
2107
+ begin_tag = "<#{name}"
2108
+ begin_tag << " #{attributes}" unless attributes.empty?
2109
+ if content
2110
+ "#{begin_tag}>#{content}</#{name}>\n"
2111
+ else
2112
+ "#{begin_tag}/>\n"
2113
+ end
2114
+ end
2115
+ end
2116
+ end