rss-nokogiri 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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