rss-nokogiri 0.0.1

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 (58) hide show
  1. data/.gemtest +0 -0
  2. data/.gitignore +19 -0
  3. data/.gitmodules +3 -0
  4. data/BSDL +22 -0
  5. data/COPYING +56 -0
  6. data/COPYING.ja +51 -0
  7. data/Gemfile +4 -0
  8. data/LEGAL +8 -0
  9. data/README.markdown +51 -0
  10. data/Rakefile +12 -0
  11. data/lib/rss/nokogiri.rb +92 -0
  12. data/rss-nokogiri.gemspec +24 -0
  13. data/test/regression/dot.png +0 -0
  14. data/test/regression/rss-assertions.rb +2090 -0
  15. data/test/regression/rss-testcase.rb +478 -0
  16. data/test/regression/test_1.0.rb +295 -0
  17. data/test/regression/test_2.0.rb +409 -0
  18. data/test/regression/test_accessor.rb +103 -0
  19. data/test/regression/test_atom.rb +681 -0
  20. data/test/regression/test_content.rb +104 -0
  21. data/test/regression/test_dublincore.rb +279 -0
  22. data/test/regression/test_image.rb +214 -0
  23. data/test/regression/test_inherit.rb +40 -0
  24. data/test/regression/test_itunes.rb +347 -0
  25. data/test/regression/test_maker_0.9.rb +474 -0
  26. data/test/regression/test_maker_1.0.rb +516 -0
  27. data/test/regression/test_maker_2.0.rb +757 -0
  28. data/test/regression/test_maker_atom_entry.rb +393 -0
  29. data/test/regression/test_maker_atom_feed.rb +454 -0
  30. data/test/regression/test_maker_content.rb +47 -0
  31. data/test/regression/test_maker_dc.rb +149 -0
  32. data/test/regression/test_maker_image.rb +62 -0
  33. data/test/regression/test_maker_itunes.rb +471 -0
  34. data/test/regression/test_maker_slash.rb +37 -0
  35. data/test/regression/test_maker_sy.rb +44 -0
  36. data/test/regression/test_maker_taxo.rb +81 -0
  37. data/test/regression/test_maker_trackback.rb +41 -0
  38. data/test/regression/test_maker_xml-stylesheet.rb +83 -0
  39. data/test/regression/test_parser.rb +62 -0
  40. data/test/regression/test_parser_1.0.rb +528 -0
  41. data/test/regression/test_parser_2.0.rb +122 -0
  42. data/test/regression/test_parser_atom_entry.rb +163 -0
  43. data/test/regression/test_parser_atom_feed.rb +276 -0
  44. data/test/regression/test_setup_maker_0.9.rb +246 -0
  45. data/test/regression/test_setup_maker_1.0.rb +550 -0
  46. data/test/regression/test_setup_maker_2.0.rb +308 -0
  47. data/test/regression/test_setup_maker_atom_entry.rb +409 -0
  48. data/test/regression/test_setup_maker_atom_feed.rb +445 -0
  49. data/test/regression/test_setup_maker_itunes.rb +144 -0
  50. data/test/regression/test_setup_maker_slash.rb +38 -0
  51. data/test/regression/test_slash.rb +64 -0
  52. data/test/regression/test_syndication.rb +125 -0
  53. data/test/regression/test_taxonomy.rb +172 -0
  54. data/test/regression/test_to_s.rb +670 -0
  55. data/test/regression/test_trackback.rb +135 -0
  56. data/test/regression/test_version.rb +9 -0
  57. data/test/regression/test_xml-stylesheet.rb +108 -0
  58. metadata +220 -0
@@ -0,0 +1,445 @@
1
+ require "rss-testcase"
2
+
3
+ require "rss/maker"
4
+
5
+ module RSS
6
+ class TestSetupMakerAtomFeed < TestCase
7
+ def setup
8
+ t = Time.iso8601("2000-01-01T12:00:05+00:00")
9
+ class << t
10
+ alias_method(:to_s, :iso8601)
11
+ end
12
+
13
+ @dc_elems = {
14
+ :title => "hoge",
15
+ :description =>
16
+ " XML is placing increasingly heavy loads on
17
+ the existing technical infrastructure of the Internet.",
18
+ :creator => "Rael Dornfest (mailto:rael@oreilly.com)",
19
+ :subject => "XML",
20
+ :publisher => "The O'Reilly Network",
21
+ :contributor => "hogehoge",
22
+ :type => "fugafuga",
23
+ :format => "hohoho",
24
+ :identifier => "fufufu",
25
+ :source => "barbar",
26
+ :language => "ja",
27
+ :relation => "cococo",
28
+ :rights => "Copyright (c) 2000 O'Reilly &amp; Associates, Inc.",
29
+ :date => t,
30
+ }
31
+ end
32
+
33
+ def test_setup_maker_feed(with_dc=true)
34
+ authors = [
35
+ {
36
+ :name => "Bob",
37
+ :uri => "http://example.com/~bob/",
38
+ :email => "bob@example.com",
39
+ },
40
+ {
41
+ :name => "Alice",
42
+ :uri => "http://example.com/~alice/",
43
+ :email => "alice@example.com",
44
+ },
45
+ ]
46
+ categories = [
47
+ {
48
+ :term => "music",
49
+ :label => "Music",
50
+ },
51
+ {
52
+ :term => "book",
53
+ :scheme => "http://example.com/category/book/",
54
+ :label => "Book",
55
+ },
56
+ ]
57
+ contributors = [
58
+ {
59
+ :name => "Chris",
60
+ :email => "chris@example.com",
61
+ },
62
+ {
63
+ :name => "Eva",
64
+ :uri => "http://example.com/~eva/",
65
+ },
66
+ ]
67
+ generator = {
68
+ :uri => "http://example.com/generator/",
69
+ :version => "0.0.1",
70
+ :content => "Feed Generator",
71
+ }
72
+ icon = "http://example.com/icon.png"
73
+ about = "http://hoge.com"
74
+ title = "fugafuga"
75
+ link = "http://hoge.com"
76
+ logo = "http://example.com/logo.png"
77
+ rights = "Copyrights (c) 2007 Alice and Bob"
78
+ description = "fugafugafugafuga"
79
+ updated = Time.now
80
+
81
+ feed = RSS::Maker.make("atom") do |maker|
82
+ authors.each do |author_info|
83
+ maker.channel.authors.new_author do |author|
84
+ author_info.each do |key, value|
85
+ author.__send__("#{key}=", value)
86
+ end
87
+ end
88
+ end
89
+
90
+ categories.each do |category_info|
91
+ maker.channel.categories.new_category do |category|
92
+ category_info.each do |key, value|
93
+ category.__send__("#{key}=", value)
94
+ end
95
+ end
96
+ end
97
+
98
+ contributors.each do |contributor_info|
99
+ maker.channel.contributors.new_contributor do |contributor|
100
+ contributor_info.each do |key, value|
101
+ contributor.__send__("#{key}=", value)
102
+ end
103
+ end
104
+ end
105
+
106
+ generator.each do |key, value|
107
+ maker.channel.generator do |g|
108
+ g.__send__("#{key}=", value)
109
+ end
110
+ end
111
+
112
+ maker.channel.icon = icon
113
+
114
+ maker.channel.about = about
115
+ maker.channel.link = link
116
+ maker.channel.logo = logo
117
+ maker.channel.rights = rights
118
+ maker.channel.title = title
119
+ maker.channel.description = description
120
+ maker.channel.updated = updated
121
+
122
+ if with_dc
123
+ @dc_elems.each do |var, value|
124
+ if var == :date
125
+ maker.channel.new_dc_date(value)
126
+ else
127
+ maker.channel.__send__("dc_#{var}=", value)
128
+ end
129
+ end
130
+ end
131
+
132
+ setup_dummy_item_atom(maker)
133
+ end
134
+ assert_not_nil(feed)
135
+
136
+ new_feed = RSS::Maker.make("atom") do |maker|
137
+ feed.setup_maker(maker)
138
+ end
139
+ assert_not_nil(new_feed)
140
+
141
+ new_authors = new_feed.authors.collect do |author|
142
+ {
143
+ :name => author.name.content,
144
+ :uri => author.uri.content,
145
+ :email => author.email.content,
146
+ }
147
+ end
148
+ assert_equal(authors, new_authors)
149
+
150
+ new_categories = new_feed.categories.collect do |category|
151
+ {
152
+ :term => category.term,
153
+ :scheme => category.scheme,
154
+ :label => category.label,
155
+ }.reject {|key, value| value.nil?}
156
+ end
157
+ assert_equal(categories, new_categories)
158
+
159
+ new_contributors = new_feed.contributors.collect do |contributor|
160
+ info = {}
161
+ info[:name] = contributor.name.content
162
+ info[:uri] = contributor.uri.content if contributor.uri
163
+ info[:email] = contributor.email.content if contributor.email
164
+ info
165
+ end
166
+ assert_equal(contributors, new_contributors)
167
+
168
+ new_generator = {
169
+ :uri => new_feed.generator.uri,
170
+ :version => new_feed.generator.version,
171
+ :content => new_feed.generator.content,
172
+ }
173
+ assert_equal(generator, new_generator)
174
+
175
+ assert_equal(icon, new_feed.icon.content)
176
+ assert_equal(about, new_feed.id.content)
177
+ assert_equal(link, new_feed.link.href)
178
+ assert_equal(logo, new_feed.logo.content)
179
+ assert_equal(rights, new_feed.rights.content)
180
+ assert_equal(description, new_feed.subtitle.content)
181
+ assert_equal(title, new_feed.title.content)
182
+ assert_equal(updated, new_feed.updated.content)
183
+
184
+ if with_dc
185
+ @dc_elems.each do |var, value|
186
+ if var == :date
187
+ assert_equal([updated, value],
188
+ new_feed.dc_dates.collect {|date| date.value})
189
+ else
190
+ assert_equal(value, new_feed.__send__("dc_#{var}"))
191
+ end
192
+ end
193
+ end
194
+
195
+ assert_equal(1, new_feed.items.size)
196
+ end
197
+
198
+ def test_setup_maker_feed_without_dc
199
+ test_setup_maker_feed(false)
200
+ end
201
+
202
+ def test_setup_maker_items(for_backward_compatibility=false)
203
+ title = "TITLE"
204
+ link = "http://hoge.com/"
205
+ description = "text hoge fuga"
206
+ updated = Time.now
207
+
208
+ item_size = 5
209
+ feed = RSS::Maker.make("atom") do |maker|
210
+ setup_dummy_channel_atom(maker)
211
+
212
+ item_size.times do |i|
213
+ maker.items.new_item do |item|
214
+ item.title = "#{title}#{i}"
215
+ item.link = "#{link}#{i}"
216
+ item.description = "#{description}#{i}"
217
+ item.updated = updated + i * 60
218
+ end
219
+ end
220
+ end
221
+
222
+ new_feed = RSS::Maker.make("atom") do |maker|
223
+ feed.items.each do |item|
224
+ if for_backward_compatibility
225
+ item.setup_maker(maker)
226
+ else
227
+ item.setup_maker(maker.items)
228
+ end
229
+ end
230
+
231
+ feed.items.clear
232
+ feed.setup_maker(maker)
233
+ end
234
+
235
+ assert_equal(item_size, new_feed.items.size)
236
+ new_feed.items.each_with_index do |item, i|
237
+ assert_equal("#{title}#{i}", item.title.content)
238
+ assert_equal("#{link}#{i}", item.link.href)
239
+ assert_equal("#{description}#{i}", item.summary.content)
240
+ assert_equal(updated + i * 60, item.updated.content)
241
+ end
242
+ end
243
+
244
+ def test_setup_maker_items_sort
245
+ title = "TITLE"
246
+ link = "http://hoge.com/"
247
+ summary = "text hoge fuga"
248
+ updated = Time.now
249
+
250
+ feed_size = 5
251
+ feed = RSS::Maker.make("atom") do |maker|
252
+ setup_dummy_channel_atom(maker)
253
+
254
+ feed_size.times do |i|
255
+ entry_class = RSS::Atom::Feed::Entry
256
+ entry = entry_class.new
257
+ entry.title = entry_class::Title.new(:content => "#{title}#{i}")
258
+ entry.links << entry_class::Link.new(:href => "#{link}#{i}")
259
+ entry.summary = entry_class::Summary.new(:content => "#{summary}#{i}")
260
+ entry.updated = entry_class::Updated.new(:content => updated + i * 60)
261
+ entry.setup_maker(maker.items)
262
+ end
263
+ maker.items.do_sort = false
264
+ end
265
+ assert_equal(feed_size, feed.entries.size)
266
+ feed.entries.each_with_index do |entry, i|
267
+ assert_equal("#{title}#{i}", entry.title.content)
268
+ assert_equal("#{link}#{i}", entry.link.href)
269
+ assert_equal("#{summary}#{i}", entry.summary.content)
270
+ end
271
+
272
+
273
+ feed = RSS::Maker.make("atom") do |maker|
274
+ setup_dummy_channel_atom(maker)
275
+
276
+ feed_size.times do |i|
277
+ entry_class = RSS::Atom::Feed::Entry
278
+ entry = entry_class.new
279
+ entry.title = entry_class::Title.new(:content => "#{title}#{i}")
280
+ entry.links << entry_class::Link.new(:href => "#{link}#{i}")
281
+ entry.summary = entry_class::Summary.new(:content => "#{summary}#{i}")
282
+ entry.updated = entry_class::Updated.new(:content => updated + i * 60)
283
+ entry.setup_maker(maker.items)
284
+ end
285
+ maker.items.do_sort = true
286
+ end
287
+ assert_equal(feed_size, feed.entries.size)
288
+ feed.entries.reverse.each_with_index do |entry, i|
289
+ assert_equal("#{title}#{i}", entry.title.content)
290
+ assert_equal("#{link}#{i}", entry.link.href)
291
+ assert_equal("#{summary}#{i}", entry.summary.content)
292
+ end
293
+ end
294
+
295
+ def test_setup_maker_items_backward_compatibility
296
+ test_setup_maker_items(true)
297
+ end
298
+
299
+ def test_setup_maker
300
+ encoding = "EUC-JP"
301
+ standalone = true
302
+
303
+ href = 'a.xsl'
304
+ type = 'text/xsl'
305
+ title = 'sample'
306
+ media = 'printer'
307
+ charset = 'UTF-8'
308
+ alternate = 'yes'
309
+
310
+ feed = RSS::Maker.make("atom") do |maker|
311
+ maker.encoding = encoding
312
+ maker.standalone = standalone
313
+
314
+ maker.xml_stylesheets.new_xml_stylesheet do |xss|
315
+ xss.href = href
316
+ xss.type = type
317
+ xss.title = title
318
+ xss.media = media
319
+ xss.charset = charset
320
+ xss.alternate = alternate
321
+ end
322
+
323
+ setup_dummy_channel_atom(maker)
324
+ setup_dummy_item_atom(maker)
325
+ end
326
+ assert_not_nil(feed)
327
+
328
+ new_feed = RSS::Maker.make("atom") do |maker|
329
+ feed.setup_maker(maker)
330
+ end
331
+
332
+ assert_equal(["atom", "1.0", "feed"], new_feed.feed_info)
333
+ assert_equal(encoding, new_feed.encoding)
334
+ assert_equal(standalone, new_feed.standalone)
335
+
336
+ xss = new_feed.xml_stylesheets.first
337
+ assert_equal(1, new_feed.xml_stylesheets.size)
338
+ assert_equal(href, xss.href)
339
+ assert_equal(type, xss.type)
340
+ assert_equal(title, xss.title)
341
+ assert_equal(media, xss.media)
342
+ assert_equal(charset, xss.charset)
343
+ assert_equal(alternate, xss.alternate)
344
+ end
345
+
346
+ def test_setup_maker_full
347
+ encoding = "EUC-JP"
348
+ standalone = true
349
+
350
+ href = 'a.xsl'
351
+ type = 'text/xsl'
352
+ title = 'sample'
353
+ media = 'printer'
354
+ charset = 'UTF-8'
355
+ alternate = 'yes'
356
+
357
+ channel_about = "http://hoge.com"
358
+ channel_title = "fugafuga"
359
+ channel_link = "http://hoge.com"
360
+ channel_description = "fugafugafugafuga"
361
+ channel_author = "Bob"
362
+
363
+ image_url = "http://hoge.com/hoge.png"
364
+
365
+ item_title = "TITLE"
366
+ item_link = "http://hoge.com/"
367
+ item_description = "text hoge fuga"
368
+
369
+ entry_size = 5
370
+ feed = RSS::Maker.make("atom") do |maker|
371
+ maker.encoding = encoding
372
+ maker.standalone = standalone
373
+
374
+ maker.xml_stylesheets.new_xml_stylesheet do |xss|
375
+ xss.href = href
376
+ xss.type = type
377
+ xss.title = title
378
+ xss.media = media
379
+ xss.charset = charset
380
+ xss.alternate = alternate
381
+ end
382
+
383
+ maker.channel.about = channel_about
384
+ maker.channel.title = channel_title
385
+ maker.channel.link = channel_link
386
+ maker.channel.description = channel_description
387
+ maker.channel.author = channel_author
388
+ @dc_elems.each do |var, value|
389
+ maker.channel.__send__("dc_#{var}=", value)
390
+ end
391
+
392
+ maker.image.url = image_url
393
+
394
+ entry_size.times do |i|
395
+ maker.items.new_item do |item|
396
+ item.title = "#{item_title}#{i}"
397
+ item.link = "#{item_link}#{i}"
398
+ item.description = "#{item_description}#{i}"
399
+
400
+ @dc_elems.each do |var, value|
401
+ item.__send__("dc_#{var}=", value)
402
+ end
403
+ end
404
+ end
405
+ end
406
+
407
+ new_feed = RSS::Maker.make("atom") do |maker|
408
+ feed.setup_maker(maker)
409
+ end
410
+
411
+ assert_equal(["atom", "1.0", "feed"], new_feed.feed_info)
412
+ assert_equal(encoding, new_feed.encoding)
413
+ assert_equal(standalone, new_feed.standalone)
414
+
415
+ xss = new_feed.xml_stylesheets.first
416
+ assert_equal(1, new_feed.xml_stylesheets.size)
417
+ assert_equal(href, xss.href)
418
+ assert_equal(type, xss.type)
419
+ assert_equal(title, xss.title)
420
+ assert_equal(media, xss.media)
421
+ assert_equal(charset, xss.charset)
422
+ assert_equal(alternate, xss.alternate)
423
+
424
+ assert_equal(channel_title, new_feed.title.content)
425
+ assert_equal(channel_link, new_feed.link.href)
426
+ assert_equal(channel_description, new_feed.subtitle.content)
427
+ assert_equal(channel_author, new_feed.author.name.content)
428
+ assert_equal(image_url, new_feed.logo.content)
429
+ @dc_elems.each do |var, value|
430
+ assert_equal(value, new_feed.__send__("dc_#{var}"))
431
+ end
432
+
433
+ assert_equal(entry_size, new_feed.entries.size)
434
+ new_feed.entries.each_with_index do |entry, i|
435
+ assert_equal("#{item_title}#{i}", entry.title.content)
436
+ assert_equal("#{item_link}#{i}", entry.link.href)
437
+ assert_equal("#{item_description}#{i}", entry.summary.content)
438
+
439
+ @dc_elems.each do |var, value|
440
+ assert_equal(value, entry.__send__("dc_#{var}"))
441
+ end
442
+ end
443
+ end
444
+ end
445
+ end
@@ -0,0 +1,144 @@
1
+ require "rss-testcase"
2
+
3
+ require "rss/maker"
4
+
5
+ module RSS
6
+ class TestSetupMakerITunes < TestCase
7
+ def test_setup_maker_simple
8
+ author = "John Doe"
9
+ block = true
10
+ categories = ["Audio Blogs"]
11
+ image = "http://example.com/podcasts/everything/AllAboutEverything.jpg"
12
+ duration = "4:05"
13
+ duration_components = [0, 4, 5]
14
+ explicit = true
15
+ keywords = ["salt", "pepper", "shaker", "exciting"]
16
+ new_feed_url = "http://newlocation.com/example.rss"
17
+ owner = {:name => "John Doe", :email => "john.doe@example.com"}
18
+ subtitle = "A show about everything"
19
+ summary = "All About Everything is a show about " +
20
+ "everything. Each week we dive into any " +
21
+ "subject known to man and talk about it " +
22
+ "as much as we can. Look for our Podcast " +
23
+ "in the iTunes Music Store"
24
+
25
+ feed = RSS::Maker.make("rss2.0") do |maker|
26
+ setup_dummy_channel(maker)
27
+ setup_dummy_item(maker)
28
+
29
+ channel = maker.channel
30
+ channel.itunes_author = author
31
+ channel.itunes_block = block
32
+ categories.each do |category|
33
+ channel.itunes_categories.new_category.text = category
34
+ end
35
+ channel.itunes_image = image
36
+ channel.itunes_explicit = explicit
37
+ channel.itunes_keywords = keywords
38
+ channel.itunes_owner.itunes_name = owner[:name]
39
+ channel.itunes_owner.itunes_email = owner[:email]
40
+ channel.itunes_subtitle = subtitle
41
+ channel.itunes_summary = summary
42
+
43
+ item = maker.items.last
44
+ item.itunes_author = author
45
+ item.itunes_block = block
46
+ item.itunes_duration = duration
47
+ item.itunes_explicit = explicit
48
+ item.itunes_keywords = keywords
49
+ item.itunes_subtitle = subtitle
50
+ item.itunes_summary = summary
51
+ end
52
+ assert_not_nil(feed)
53
+
54
+ new_feed = RSS::Maker.make("rss2.0") do |maker|
55
+ feed.setup_maker(maker)
56
+ end
57
+ assert_not_nil(new_feed)
58
+
59
+ channel = new_feed.channel
60
+ item = new_feed.items.last
61
+
62
+ assert_equal(author, channel.itunes_author)
63
+ assert_equal(author, item.itunes_author)
64
+
65
+ assert_equal(block, channel.itunes_block?)
66
+ assert_equal(block, item.itunes_block?)
67
+
68
+ assert_equal(categories,
69
+ collect_itunes_categories(channel.itunes_categories))
70
+
71
+ assert_equal(image, channel.itunes_image.href)
72
+
73
+ assert_equal(duration_components,
74
+ [item.itunes_duration.hour,
75
+ item.itunes_duration.minute,
76
+ item.itunes_duration.second])
77
+
78
+ assert_equal(explicit, channel.itunes_explicit?)
79
+ assert_equal(explicit, item.itunes_explicit?)
80
+
81
+ assert_equal(keywords, channel.itunes_keywords)
82
+ assert_equal(keywords, item.itunes_keywords)
83
+
84
+ assert_equal(owner,
85
+ {
86
+ :name => channel.itunes_owner.itunes_name,
87
+ :email => channel.itunes_owner.itunes_email
88
+ })
89
+
90
+ assert_equal(subtitle, channel.itunes_subtitle)
91
+ assert_equal(subtitle, item.itunes_subtitle)
92
+
93
+ assert_equal(summary, channel.itunes_summary)
94
+ assert_equal(summary, item.itunes_summary)
95
+ end
96
+
97
+ def test_setup_maker_with_nested_categories
98
+ categories = [["Arts & Entertainment", "Games"],
99
+ ["Technology", "Computers"],
100
+ "Audio Blogs"]
101
+
102
+ feed = RSS::Maker.make("rss2.0") do |maker|
103
+ setup_dummy_channel(maker)
104
+ setup_dummy_item(maker)
105
+
106
+ channel = maker.channel
107
+ categories.each do |category|
108
+ target = channel.itunes_categories
109
+ if category.is_a?(Array)
110
+ category.each do |sub_category|
111
+ target = target.new_category
112
+ target.text = sub_category
113
+ end
114
+ else
115
+ target.new_category.text = category
116
+ end
117
+ end
118
+ end
119
+ assert_not_nil(feed)
120
+
121
+ new_feed = RSS::Maker.make("rss2.0") do |maker|
122
+ feed.setup_maker(maker)
123
+ end
124
+ assert_not_nil(new_feed)
125
+
126
+ channel = new_feed.channel
127
+
128
+ assert_equal(categories,
129
+ collect_itunes_categories(channel.itunes_categories))
130
+ end
131
+
132
+ private
133
+ def collect_itunes_categories(categories)
134
+ categories.collect do |c|
135
+ rest = collect_itunes_categories(c.itunes_categories)
136
+ if rest.empty?
137
+ c.text
138
+ else
139
+ [c.text, *rest]
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end