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,38 @@
1
+ require "rss-testcase"
2
+
3
+ require "rss/maker"
4
+
5
+ module RSS
6
+ class TestSetupMakerSlash < TestCase
7
+ def test_setup_maker
8
+ elements = {
9
+ "section" => "articles",
10
+ "department" => "not-an-ocean-unless-there-are-lobsters",
11
+ "comments" => 177,
12
+ "hit_parades" => [177, 155, 105, 33, 6, 3, 0],
13
+ }
14
+
15
+ rss = RSS::Maker.make("rss1.0") do |maker|
16
+ setup_dummy_channel(maker)
17
+ setup_dummy_item(maker)
18
+
19
+ item = maker.items.last
20
+ item.slash_section = elements["section"]
21
+ item.slash_department = elements["department"]
22
+ item.slash_comments = elements["comments"]
23
+ item.slash_hit_parade = elements["hit_parades"].join(",")
24
+ end
25
+ assert_not_nil(rss)
26
+
27
+ new_rss = RSS::Maker.make("rss1.0") do |maker|
28
+ rss.setup_maker(maker)
29
+ end
30
+ assert_not_nil(new_rss)
31
+
32
+ item = new_rss.items.last
33
+ assert_not_nil(item)
34
+
35
+ assert_slash_elements(elements, item)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,64 @@
1
+ require "cgi"
2
+ require "rexml/document"
3
+
4
+ require "rss-testcase"
5
+
6
+ require "rss/1.0"
7
+ require "rss/slash"
8
+
9
+ module RSS
10
+ class TestSlash < TestCase
11
+ def setup
12
+ @elements = {
13
+ "section" => "articles",
14
+ "department" => "not-an-ocean-unless-there-are-lobsters",
15
+ "comments" => 177,
16
+ "hit_parades" => [177, 155, 105, 33, 6, 3, 0],
17
+ }
18
+
19
+ slash_nodes = @elements.collect do |name, value|
20
+ if name == "hit_parades"
21
+ name = "hit_parade"
22
+ value = value.join(",")
23
+ end
24
+ "<slash:#{name}>#{value}</slash:#{name}>"
25
+ end.join("\n")
26
+
27
+ slash_ns = {"slash" => "http://purl.org/rss/1.0/modules/slash/"}
28
+ @source = make_RDF(<<-EOR, slash_ns)
29
+ #{make_channel}
30
+ #{make_image}
31
+ #{make_item(slash_nodes)}
32
+ #{make_textinput}
33
+ EOR
34
+ end
35
+
36
+ def test_parser
37
+ rss = RSS::Parser.parse(@source)
38
+
39
+ assert_not_nil(rss)
40
+
41
+ item = rss.items[0]
42
+ assert_not_nil(item)
43
+
44
+ assert_slash_elements(item)
45
+ end
46
+
47
+ def test_to_s
48
+ rss = RSS::Parser.parse(@source)
49
+ rss = RSS::Parser.parse(rss.to_s)
50
+
51
+ assert_not_nil(rss)
52
+
53
+ item = rss.items[0]
54
+ assert_not_nil(item)
55
+
56
+ assert_slash_elements(item)
57
+ end
58
+
59
+ private
60
+ def assert_slash_elements(target)
61
+ super(@elements, target)
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,125 @@
1
+ require "cgi"
2
+ require "rexml/document"
3
+
4
+ require "rss-testcase"
5
+
6
+ require "rss/1.0"
7
+ require "rss/syndication"
8
+
9
+ module RSS
10
+ class TestSyndication < TestCase
11
+
12
+ def setup
13
+ @prefix = "sy"
14
+ @uri = "http://purl.org/rss/1.0/modules/syndication/"
15
+
16
+ @parents = %w(channel)
17
+
18
+ t = Time.iso8601("2000-01-01T12:00:05+00:00")
19
+ class << t
20
+ alias_method(:to_s, :iso8601)
21
+ end
22
+
23
+ @elems = {
24
+ :updatePeriod => "hourly",
25
+ :updateFrequency => "2",
26
+ :updateBase => t,
27
+ }
28
+
29
+ @sy_nodes = @elems.collect do |name, value|
30
+ "<#{@prefix}:#{name}>#{CGI.escapeHTML(value.to_s)}</#{@prefix}:#{name}>"
31
+ end.join("\n")
32
+
33
+ @rss_source = make_RDF(<<-EOR, {@prefix => @uri})
34
+ #{make_channel(@sy_nodes)}
35
+ #{make_image()}
36
+ #{make_item()}
37
+ #{make_textinput()}
38
+ EOR
39
+
40
+ @rss = Parser.parse(@rss_source)
41
+ end
42
+
43
+ def test_parser
44
+
45
+ assert_nothing_raised do
46
+ Parser.parse(@rss_source)
47
+ end
48
+
49
+ @elems.each do |tag, value|
50
+ assert_too_much_tag(tag.to_s, "channel") do
51
+ Parser.parse(make_RDF(<<-EOR, {@prefix => @uri}))
52
+ #{make_channel(("<" + @prefix + ":" + tag.to_s + ">" +
53
+ CGI.escapeHTML(value.to_s) +
54
+ "</" + @prefix + ":" + tag.to_s + ">") * 2)}
55
+ #{make_item}
56
+ EOR
57
+ end
58
+ end
59
+
60
+ end
61
+
62
+ def test_accessor
63
+
64
+ t = Time.iso8601("2003-01-01T12:00:23+09:00")
65
+ class << t
66
+ alias_method(:to_s, :iso8601)
67
+ end
68
+
69
+ new_value = {
70
+ :updatePeriod => "daily",
71
+ :updateFrequency => "11",
72
+ :updateBase => t,
73
+ }
74
+
75
+ @elems.each do |name, value|
76
+ value = value.to_i if name == :updateFrequency
77
+ @parents.each do |parent|
78
+ assert_equal(value, @rss.__send__(parent).__send__("sy_#{name}"))
79
+ @rss.__send__(parent).__send__("sy_#{name}=", new_value[name])
80
+ new_val = new_value[name]
81
+ new_val = new_val.to_i if name == :updateFrequency
82
+ assert_equal(new_val, @rss.__send__(parent).__send__("sy_#{name}"))
83
+ end
84
+ end
85
+
86
+ %w(hourly daily weekly monthly yearly).each do |x|
87
+ @parents.each do |parent|
88
+ assert_nothing_raised do
89
+ @rss.__send__(parent).sy_updatePeriod = x
90
+ end
91
+ end
92
+ end
93
+
94
+ %w(-2 0.3 -0.4).each do |x|
95
+ @parents.each do |parent|
96
+ assert_not_available_value("sy:updateBase", x) do
97
+ @rss.__send__(parent).sy_updateBase = x
98
+ end
99
+ end
100
+ end
101
+
102
+ end
103
+
104
+ def test_to_s
105
+
106
+ @elems.each do |name, value|
107
+ excepted = "<#{@prefix}:#{name}>#{value}</#{@prefix}:#{name}>"
108
+ @parents.each do |parent|
109
+ assert_equal(excepted,
110
+ @rss.__send__(parent).__send__("sy_#{name}_element"))
111
+ end
112
+ end
113
+
114
+ REXML::Document.new(@rss_source).root.each_element do |parent|
115
+ if @parents.include?(parent.name)
116
+ parent.each_element do |elem|
117
+ if elem.namespace == @uri
118
+ assert_equal(elem.text, @elems[elem.name.intern].to_s)
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,172 @@
1
+ require "cgi"
2
+
3
+ require "rss-testcase"
4
+
5
+ require "rss/1.0"
6
+ require "rss/2.0"
7
+ require "rss/taxonomy"
8
+
9
+ module RSS
10
+ class TestTaxonomy < TestCase
11
+
12
+ def setup
13
+ @prefix = "taxo"
14
+ @uri = "http://purl.org/rss/1.0/modules/taxonomy/"
15
+ @dc_prefix = "dc"
16
+ @dc_uri = "http://purl.org/dc/elements/1.1/"
17
+
18
+ @ns = {
19
+ @prefix => @uri,
20
+ @dc_prefix => @dc_uri,
21
+ }
22
+
23
+ @topics_parents = %w(channel item)
24
+
25
+ @topics_lis = [
26
+ "http://meerkat.oreillynet.com/?c=cat23",
27
+ "http://meerkat.oreillynet.com/?c=47",
28
+ "http://dmoz.org/Computers/Data_Formats/Markup_Languages/XML/",
29
+ ]
30
+
31
+ @topics_node = "<#{@prefix}:topics>\n"
32
+ @topics_node << " <rdf:Bag>\n"
33
+ @topics_lis.each do |value|
34
+ resource = CGI.escapeHTML(value)
35
+ @topics_node << " <rdf:li resource=\"#{resource}\"/>\n"
36
+ end
37
+ @topics_node << " </rdf:Bag>\n"
38
+ @topics_node << "</#{@prefix}:topics>"
39
+
40
+ @topic_topics_lis = \
41
+ [
42
+ "http://meerkat.oreillynet.com/?c=cat23",
43
+ "http://dmoz.org/Computers/Data_Formats/Markup_Languages/SGML/",
44
+ "http://dmoz.org/Computers/Programming/Internet/",
45
+ ]
46
+
47
+ @topic_contents = \
48
+ [
49
+ {
50
+ :link => "http://meerkat.oreillynet.com/?c=cat23",
51
+ :title => "Data: XML",
52
+ :description => "A Meerkat channel",
53
+ },
54
+ {
55
+ :link => "http://dmoz.org/Computers/Data_Formats/Markup_Languages/XML/",
56
+ :title => "XML",
57
+ :subject => "XML",
58
+ :description => "DMOZ category",
59
+ :topics => @topic_topics_lis,
60
+ }
61
+ ]
62
+
63
+ @topic_nodes = @topic_contents.collect do |info|
64
+ link = info[:link]
65
+ rv = "<#{@prefix}:topic rdf:about=\"#{link}\">\n"
66
+ info.each do |name, value|
67
+ case name
68
+ when :topics
69
+ rv << " <#{@prefix}:topics>\n"
70
+ rv << " <rdf:Bag>\n"
71
+ value.each do |li|
72
+ resource = CGI.escapeHTML(li)
73
+ rv << " <rdf:li resource=\"#{resource}\"/>\n"
74
+ end
75
+ rv << " </rdf:Bag>\n"
76
+ rv << " </#{@prefix}:topics>\n"
77
+ else
78
+ prefix = (name == :link ? @prefix : @dc_prefix)
79
+ rv << " <#{prefix}:#{name}>#{value}</#{prefix}:#{name}>\n"
80
+ end
81
+ end
82
+ rv << "</#{@prefix}:topic>"
83
+ end
84
+
85
+ @rss_source = make_RDF(<<-EOR, @ns)
86
+ #{make_channel(@topics_node)}
87
+ #{make_image()}
88
+ #{make_item(@topics_node)}
89
+ #{make_textinput()}
90
+ #{@topic_nodes.join("\n")}
91
+ EOR
92
+
93
+ @rss = Parser.parse(@rss_source)
94
+ end
95
+
96
+ def test_parser
97
+ assert_nothing_raised do
98
+ Parser.parse(@rss_source)
99
+ end
100
+
101
+ assert_too_much_tag("topics", "channel") do
102
+ Parser.parse(make_RDF(<<-EOR, @ns))
103
+ #{make_channel(@topics_node * 2)}
104
+ #{make_item()}
105
+ EOR
106
+ end
107
+
108
+ assert_too_much_tag("topics", "item") do
109
+ Parser.parse(make_RDF(<<-EOR, @ns))
110
+ #{make_channel()}
111
+ #{make_item(@topics_node * 2)}
112
+ EOR
113
+ end
114
+ end
115
+
116
+ def test_accessor
117
+ topics = @rss.channel.taxo_topics
118
+ assert_equal(@topics_lis.sort,
119
+ topics.Bag.lis.collect {|li| li.resource}.sort)
120
+ assert_equal(@topics_lis.sort, topics.resources.sort)
121
+
122
+ assert_equal(@rss.taxo_topics.first, @rss.taxo_topic)
123
+
124
+ @topic_contents.each_with_index do |info, i|
125
+ topic = @rss.taxo_topics[i]
126
+ info.each do |name, value|
127
+ case name
128
+ when :link
129
+ assert_equal(value, topic.about)
130
+ assert_equal(value, topic.taxo_link)
131
+ when :topics
132
+ assert_equal(value.sort, topic.taxo_topics.resources.sort)
133
+ else
134
+ assert_equal(value, topic.__send__("dc_#{name}"))
135
+ end
136
+ end
137
+ end
138
+ end
139
+
140
+ def test_to_s
141
+ @topics_parents.each do |parent|
142
+ meth = "taxo_topics_element"
143
+ assert_equal(@topics_node, @rss.__send__(parent).__send__(meth))
144
+ end
145
+
146
+ @topic_nodes.each_with_index do |node, i|
147
+ expected_xml = taxo_xmlns_container(node)
148
+ expected = REXML::Document.new(expected_xml).root.elements[1]
149
+ actual_xml = taxo_xmlns_container(@rss.taxo_topics[i].to_s(true, ""))
150
+ actual = REXML::Document.new(actual_xml).root.elements[1]
151
+ expected_elems = expected.reject {|x| x.is_a?(REXML::Text)}
152
+ actual_elems = actual.reject {|x| x.is_a?(REXML::Text)}
153
+ expected_elems.sort! {|x, y| x.name <=> y.name}
154
+ actual_elems.sort! {|x, y| x.name <=> y.name}
155
+ assert_equal(expected_elems.collect {|x| x.to_s},
156
+ actual_elems.collect {|x| x.to_s})
157
+ assert_equal(expected.attributes.sort, actual.attributes.sort)
158
+ end
159
+ end
160
+
161
+ private
162
+ def taxo_xmlns_container(content)
163
+ xmlns_container({
164
+ @prefix => @uri,
165
+ "dc" => "http://purl.org/dc/elements/1.1/",
166
+ "rdf" => "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
167
+ },
168
+ content)
169
+ end
170
+ end
171
+ end
172
+
@@ -0,0 +1,670 @@
1
+ require "rexml/document"
2
+
3
+ require "rss-testcase"
4
+
5
+ require "rss/maker"
6
+ require "rss/1.0"
7
+ require "rss/2.0"
8
+ require "rss/content"
9
+ require "rss/dublincore"
10
+ require "rss/syndication"
11
+ require "rss/trackback"
12
+
13
+ module RSS
14
+ class TestToS < TestCase
15
+ def setup
16
+ @image_url = "http://example.com/foo.png"
17
+ @textinput_link = "http://example.com/search.cgi"
18
+ @item_links = [
19
+ "http://example.com/1",
20
+ "http://example.com/2",
21
+ ]
22
+
23
+ setup_xml_declaration_info
24
+ setup_xml_stylesheet_infos
25
+ setup_channel_info
26
+ setup_item_infos
27
+ setup_image_info
28
+ setup_textinput_info
29
+
30
+ setup_dublin_core_info
31
+ setup_syndication_info
32
+ setup_content_info
33
+ setup_trackback_info
34
+ end
35
+
36
+ def test_to_s_10
37
+ rss = RSS::Maker.make("1.0") do |maker|
38
+ setup_full(maker)
39
+ end
40
+
41
+ assert_xml_declaration(@version, @encoding, @standalone, rss)
42
+ assert_xml_stylesheets(@xs_infos, rss.xml_stylesheets)
43
+ assert_channel10(@channel_info, rss.channel)
44
+ assert_items10(@item_infos, rss.items)
45
+ rss.items.each do |item|
46
+ assert_trackback(@trackback_info, item)
47
+ end
48
+ assert_image10(@image_info, rss.image)
49
+ assert_textinput10(@textinput_info, rss.textinput)
50
+
51
+ rss = RSS::Parser.parse(rss.to_s)
52
+
53
+ assert_xml_declaration(@version, @encoding, @standalone, rss)
54
+ assert_xml_stylesheets(@xs_infos, rss.xml_stylesheets)
55
+ assert_channel10(@channel_info, rss.channel)
56
+ assert_items10(@item_infos, rss.items)
57
+ assert_image10(@image_info, rss.image)
58
+ assert_textinput10(@textinput_info, rss.textinput)
59
+ end
60
+
61
+ def test_to_s_09
62
+ rss = RSS::Maker.make("0.91") do |maker|
63
+ setup_full(maker)
64
+ end
65
+
66
+ assert_xml_declaration(@version, @encoding, @standalone, rss)
67
+ assert_xml_stylesheets(@xs_infos, rss.xml_stylesheets)
68
+ assert_channel09(@channel_info, rss.channel)
69
+ assert_items09(@item_infos, rss.items)
70
+ assert_image09(@image_info, rss.image)
71
+ assert_textinput09(@textinput_info, rss.textinput)
72
+
73
+ rss = RSS::Parser.parse(rss.to_s)
74
+
75
+ assert_xml_declaration(@version, @encoding, @standalone, rss)
76
+ assert_xml_stylesheets(@xs_infos, rss.xml_stylesheets)
77
+ assert_channel09(@channel_info, rss.channel)
78
+ assert_items09(@item_infos, rss.items)
79
+ assert_image09(@image_info, rss.image)
80
+ assert_textinput09(@textinput_info, rss.textinput)
81
+ end
82
+
83
+ def test_to_s_20
84
+ rss = RSS::Maker.make("2.0") do |maker|
85
+ setup_full(maker)
86
+ end
87
+
88
+ assert_xml_declaration(@version, @encoding, @standalone, rss)
89
+ assert_xml_stylesheets(@xs_infos, rss.xml_stylesheets)
90
+ assert_channel20(@channel_info, rss.channel)
91
+ assert_items20(@item_infos, rss.items)
92
+ assert_image20(@image_info, rss.image)
93
+ assert_textinput20(@textinput_info, rss.textinput)
94
+
95
+ rss = RSS::Parser.parse(rss.to_s)
96
+
97
+ assert_xml_declaration(@version, @encoding, @standalone, rss)
98
+ assert_xml_stylesheets(@xs_infos, rss.xml_stylesheets)
99
+ assert_channel20(@channel_info, rss.channel)
100
+ assert_items20(@item_infos, rss.items)
101
+ assert_image20(@image_info, rss.image)
102
+ assert_textinput20(@textinput_info, rss.textinput)
103
+ end
104
+
105
+ private
106
+ def setup_xml_declaration_info
107
+ @version = "1.0"
108
+ @encoding = "UTF-8"
109
+ @standalone = false
110
+ end
111
+
112
+ def setup_xml_stylesheet_infos
113
+ @xs_infos = [
114
+ {
115
+ "href" => "XXX.xsl",
116
+ "type" => "text/xsl",
117
+ "title" => "XXX",
118
+ "media" => "print",
119
+ "alternate" => "no",
120
+ },
121
+ {
122
+ "href" => "YYY.css",
123
+ "type" => "text/css",
124
+ "title" => "YYY",
125
+ "media" => "all",
126
+ "alternate" => "no",
127
+ },
128
+ ]
129
+ end
130
+
131
+ def setup_channel_info
132
+ @channel_info = {
133
+ "about" => "http://example.com/index.rdf",
134
+ "title" => "Sample RSS",
135
+ "link" => "http://example.com/",
136
+ "description" => "Sample\n\n\n\n\nSite",
137
+ "language" => "en",
138
+ "copyright" => "FDL",
139
+ "managingEditor" => "foo@example.com",
140
+ "webMaster" => "webmaster@example.com",
141
+ "rating" => '(PICS-1.1 "http://www.rsac.org/ratingsv01.html" l gen true comment "RSACi North America Server" for "http://www.rsac.org" on "1996.04.16T08:15-0500" r (n 0 s 0 v 0 l 0))',
142
+ "docs" => "http://backend.userland.com/rss091",
143
+ "skipDays" => [
144
+ "Monday",
145
+ "Friday",
146
+ ],
147
+ "skipHours" => [
148
+ "12",
149
+ "23",
150
+ ],
151
+ "date" => Time.now,
152
+ "lastBuildDate" => Time.now - 3600,
153
+ "generator" => "RSS Maker",
154
+ "ttl" => "60",
155
+ "cloud" => {
156
+ "domain" => "rpc.sys.com",
157
+ "port" => "80",
158
+ "path" => "/RPC2",
159
+ "registerProcedure" => "myCloud.rssPleaseNotify",
160
+ "protocol" => "xml-rpc",
161
+ },
162
+ "category" => {
163
+ "domain" => "http://example.com/misc/",
164
+ "content" => "misc",
165
+ },
166
+
167
+ "image" => {
168
+ "resource" => @image_url,
169
+ },
170
+
171
+ "textinput" => {
172
+ "resource" => @textinput_link,
173
+ },
174
+
175
+ "items" => @item_links.collect{|link| {"resource" => link}},
176
+ }
177
+ end
178
+
179
+ def setup_item_infos
180
+ @item_infos = [
181
+ {
182
+ "title" => "Sample item1",
183
+ "link" => @item_links[0],
184
+ "description" => "Sample description1",
185
+ "date" => Time.now - 3600,
186
+ "author" => "foo@example.com",
187
+ "comments" => "http://example.com/1/comments",
188
+ "guid" => {
189
+ "isPermaLink" => "true",
190
+ "content" => "http://example.com/1",
191
+ },
192
+ "enclosure" => {
193
+ "url" => "http://example.com/1.mp3",
194
+ "length" => "100",
195
+ "type" => "audio/mpeg",
196
+ },
197
+ "source" => {
198
+ "url" => "http:/example.com/",
199
+ "content" => "Sample site",
200
+ },
201
+ "category" => {
202
+ "domain" => "http://example.com/misc/",
203
+ "content" => "misc",
204
+ },
205
+ },
206
+
207
+ {
208
+ "title" => "Sample item2",
209
+ "link" => @item_links[1],
210
+ "description" => "Sample description2",
211
+ "date" => Time.now - 7200,
212
+ "author" => "foo@example.com",
213
+ "comments" => "http://example.com/2/comments",
214
+ "guid" => {
215
+ "isPermaLink" => "false",
216
+ "content" => "http://example.com/2",
217
+ },
218
+ "enclosure" => {
219
+ "url" => "http://example.com/2.mp3",
220
+ "length" => "200",
221
+ "type" => "audio/mpeg",
222
+ },
223
+ "source" => {
224
+ "url" => "http:/example.com/",
225
+ "content" => "Sample site",
226
+ },
227
+ "category" => {
228
+ "domain" => "http://example.com/misc/",
229
+ "content" => "misc",
230
+ },
231
+ },
232
+ ]
233
+ end
234
+
235
+ def setup_image_info
236
+ @image_info = {
237
+ "title" => "Sample image",
238
+ "url" => @image_url,
239
+ "width" => "88",
240
+ "height" => "31",
241
+ "description" => "Sample",
242
+ }
243
+ end
244
+
245
+ def setup_textinput_info
246
+ @textinput_info = {
247
+ "title" => "Sample textinput",
248
+ "description" => "Search",
249
+ "name" => "key",
250
+ "link" => @textinput_link,
251
+ }
252
+ end
253
+
254
+ def setup_dublin_core_info
255
+ @dc_info = {
256
+ "title" => "DC title",
257
+ "description" => "DC desc",
258
+ "creator" => "DC creator",
259
+ "subject" => "DC subject",
260
+ "publisher" => "DC publisher",
261
+ "contributor" => "DC contributor",
262
+ "type" => "DC type",
263
+ "format" => "DC format",
264
+ "identifier" => "DC identifier",
265
+ "source" => "DC source",
266
+ "language" => "ja",
267
+ "relation" => "DC relation",
268
+ "coverage" => "DC coverage",
269
+ "rights" => "DC rights",
270
+ "date" => Time.now - 60,
271
+ }
272
+ end
273
+
274
+ def setup_syndication_info
275
+ @sy_info = {
276
+ "updatePeriod" => "hourly",
277
+ "updateFrequency" => "2",
278
+ "updateBase" => Time.now - 3600,
279
+ }
280
+ end
281
+
282
+ def setup_content_info
283
+ @content_info = {
284
+ "encoded" => "<p>p</p>",
285
+ }
286
+ end
287
+
288
+ def setup_trackback_info
289
+ @trackback_info = {
290
+ "ping" => "http://example.com/tb.cgi?tb_id=XXX",
291
+ "abouts" => [
292
+ "http://example.net/tb.cgi?tb_id=YYY",
293
+ "http://example.org/tb.cgi?tb_id=ZZZ",
294
+ ]
295
+ }
296
+ end
297
+
298
+
299
+ def setup_full(maker)
300
+ setup_xml_declaration(maker)
301
+ setup_xml_stylesheets(maker)
302
+ setup_channel(maker)
303
+ setup_image(maker)
304
+ setup_items(maker)
305
+ setup_textinput(maker)
306
+ end
307
+
308
+ def setup_xml_declaration(maker)
309
+ %w(version encoding standalone).each do |name|
310
+ maker.__send__("#{name}=", instance_eval("@#{name}"))
311
+ end
312
+ end
313
+
314
+ def setup_xml_stylesheets(maker)
315
+ @xs_infos.each do |info|
316
+ xs = maker.xml_stylesheets.new_xml_stylesheet
317
+ info.each do |name, value|
318
+ xs.__send__("#{name}=", value)
319
+ end
320
+ end
321
+ end
322
+
323
+ def setup_channel(maker)
324
+ channel = maker.channel
325
+ info = @channel_info
326
+
327
+ %w(about title link description language copyright
328
+ managingEditor webMaster rating docs date
329
+ lastBuildDate generator ttl).each do |name|
330
+ channel.__send__("#{name}=", info[name])
331
+ end
332
+
333
+ skipDays = channel.skipDays
334
+ info["skipDays"].each do |day|
335
+ new_day = skipDays.new_day
336
+ new_day.content = day
337
+ end
338
+
339
+ skipHours = channel.skipHours
340
+ info["skipHours"].each do |hour|
341
+ new_hour = skipHours.new_hour
342
+ new_hour.content = hour
343
+ end
344
+
345
+ cloud = channel.cloud
346
+ %w(domain port path registerProcedure protocol).each do |name|
347
+ cloud.__send__("#{name}=", info["cloud"][name])
348
+ end
349
+
350
+ category = channel.categories.new_category
351
+ %w(domain content).each do |name|
352
+ category.__send__("#{name}=", info["category"][name])
353
+ end
354
+ end
355
+
356
+ def setup_image(maker)
357
+ image = maker.image
358
+ info = @image_info
359
+
360
+ %w(title url width height description).each do |name|
361
+ image.__send__("#{name}=", info[name])
362
+ end
363
+ end
364
+
365
+ def setup_items(maker)
366
+ items = maker.items
367
+
368
+ @item_infos.each do |info|
369
+ item = items.new_item
370
+ %w(title link description date author comments).each do |name|
371
+ item.__send__("#{name}=", info[name])
372
+ end
373
+
374
+ guid = item.guid
375
+ %w(isPermaLink content).each do |name|
376
+ guid.__send__("#{name}=", info["guid"][name])
377
+ end
378
+
379
+ enclosure = item.enclosure
380
+ %w(url length type).each do |name|
381
+ enclosure.__send__("#{name}=", info["enclosure"][name])
382
+ end
383
+
384
+ source = item.source
385
+ %w(url content).each do |name|
386
+ source.__send__("#{name}=", info["source"][name])
387
+ end
388
+
389
+ category = item.categories.new_category
390
+ %w(domain content).each do |name|
391
+ category.__send__("#{name}=", info["category"][name])
392
+ end
393
+
394
+ setup_trackback(item)
395
+ end
396
+ end
397
+
398
+ def setup_textinput(maker)
399
+ textinput = maker.textinput
400
+ info = @textinput_info
401
+
402
+ %w(title description name link).each do |name|
403
+ textinput.__send__("#{name}=", info[name])
404
+ end
405
+ end
406
+
407
+ def setup_content(target)
408
+ prefix = "content"
409
+ %w(encoded).each do |name|
410
+ target.__send__("#{prefix}_#{name}=", @content_info[name])
411
+ end
412
+ end
413
+
414
+ def setup_dublin_core(target)
415
+ prefix = "dc"
416
+ %w(title description creator subject publisher
417
+ contributor type format identifier source language
418
+ relation coverage rights).each do |name|
419
+ target.__send__("#{prefix}_#{name}=", @dc_info[name])
420
+ end
421
+ end
422
+
423
+ def setup_syndicate(target)
424
+ prefix = "sy"
425
+ %w(updatePeriod updateFrequency updateBase).each do |name|
426
+ target.__send__("#{prefix}_#{name}=", @sy_info[name])
427
+ end
428
+ end
429
+
430
+ def setup_trackback(target)
431
+ target.trackback_ping = @trackback_info["ping"]
432
+ @trackback_info["abouts"].each do |about|
433
+ new_about = target.trackback_abouts.new_about
434
+ new_about.value = about
435
+ end
436
+ end
437
+
438
+
439
+ def assert_channel10(attrs, channel)
440
+ _wrap_assertion do
441
+ n_attrs = normalized_attrs(attrs)
442
+
443
+ names = %w(about title link description)
444
+ assert_attributes(attrs, names, channel)
445
+
446
+ %w(image items textinput).each do |name|
447
+ value = n_attrs[name]
448
+ if value
449
+ target = channel.__send__(name)
450
+ __send__("assert_channel10_#{name}", value, target)
451
+ end
452
+ end
453
+ end
454
+ end
455
+
456
+ def assert_channel10_image(attrs, image)
457
+ _wrap_assertion do
458
+ assert_attributes(attrs, %w(resource), image)
459
+ end
460
+ end
461
+
462
+ def assert_channel10_textinput(attrs, textinput)
463
+ _wrap_assertion do
464
+ assert_attributes(attrs, %w(resource), textinput)
465
+ end
466
+ end
467
+
468
+ def assert_channel10_items(attrs, items)
469
+ _wrap_assertion do
470
+ assert_equal(items.resources, items.Seq.lis.collect {|x| x.resource})
471
+ items.Seq.lis.each_with_index do |li, i|
472
+ assert_attributes(attrs[i], %w(resource), li)
473
+ end
474
+ end
475
+ end
476
+
477
+ def assert_image10(attrs, image)
478
+ _wrap_assertion do
479
+ names = %w(about title url link)
480
+ assert_attributes(attrs, names, image)
481
+ end
482
+ end
483
+
484
+ def assert_items10(attrs, items)
485
+ _wrap_assertion do
486
+ names = %w(about title link description)
487
+ items.each_with_index do |item, i|
488
+ assert_attributes(attrs[i], names, item)
489
+ end
490
+ end
491
+ end
492
+
493
+ def assert_textinput10(attrs, textinput)
494
+ _wrap_assertion do
495
+ names = %w(about title description name link)
496
+ assert_attributes(attrs, names, textinput)
497
+ end
498
+ end
499
+
500
+
501
+ def assert_channel09(attrs, channel)
502
+ _wrap_assertion do
503
+ n_attrs = normalized_attrs(attrs)
504
+
505
+ names = %w(title description link language rating
506
+ copyright pubDate lastBuildDate docs
507
+ managingEditor webMaster)
508
+ assert_attributes(attrs, names, channel)
509
+
510
+ %w(skipHours skipDays).each do |name|
511
+ value = n_attrs[name]
512
+ if value
513
+ target = channel.__send__(name)
514
+ __send__("assert_channel09_#{name}", value, target)
515
+ end
516
+ end
517
+ end
518
+ end
519
+
520
+ def assert_channel09_skipDays(contents, skipDays)
521
+ _wrap_assertion do
522
+ days = skipDays.days
523
+ contents.each_with_index do |content, i|
524
+ assert_equal(content, days[i].content)
525
+ end
526
+ end
527
+ end
528
+
529
+ def assert_channel09_skipHours(contents, skipHours)
530
+ _wrap_assertion do
531
+ hours = skipHours.hours
532
+ contents.each_with_index do |content, i|
533
+ assert_equal(content.to_i, hours[i].content)
534
+ end
535
+ end
536
+ end
537
+
538
+ def assert_image09(attrs, image)
539
+ _wrap_assertion do
540
+ names = %w(url link title description)
541
+ names << ["width", :integer]
542
+ names << ["height", :integer]
543
+ assert_attributes(attrs, names, image)
544
+ end
545
+ end
546
+
547
+ def assert_items09(attrs, items)
548
+ _wrap_assertion do
549
+ names = %w(title link description)
550
+ items.each_with_index do |item, i|
551
+ assert_attributes(attrs[i], names, item)
552
+ end
553
+ end
554
+ end
555
+
556
+ def assert_textinput09(attrs, textinput)
557
+ _wrap_assertion do
558
+ names = %w(title description name link)
559
+ assert_attributes(attrs, names, textinput)
560
+ end
561
+ end
562
+
563
+
564
+ def assert_channel20(attrs, channel)
565
+ _wrap_assertion do
566
+ n_attrs = normalized_attrs(attrs)
567
+
568
+ names = %w(title link description language copyright
569
+ managingEditor webMaster pubDate
570
+ lastBuildDate generator docs rating)
571
+ names << ["ttl", :integer]
572
+ assert_attributes(attrs, names, channel)
573
+
574
+ %w(cloud categories skipHours skipDays).each do |name|
575
+ value = n_attrs[name]
576
+ if value
577
+ target = channel.__send__(name)
578
+ __send__("assert_channel20_#{name}", value, target)
579
+ end
580
+ end
581
+ end
582
+ end
583
+
584
+ def assert_channel20_skipDays(contents, skipDays)
585
+ assert_channel09_skipDays(contents, skipDays)
586
+ end
587
+
588
+ def assert_channel20_skipHours(contents, skipHours)
589
+ assert_channel09_skipHours(contents, skipHours)
590
+ end
591
+
592
+ def assert_channel20_cloud(attrs, cloud)
593
+ _wrap_assertion do
594
+ names = %w(domain path registerProcedure protocol)
595
+ names << ["port", :integer]
596
+ assert_attributes(attrs, names, cloud)
597
+ end
598
+ end
599
+
600
+ def assert_channel20_categories(attrs, categories)
601
+ _wrap_assertion do
602
+ names = %w(domain content)
603
+ categories.each_with_index do |category, i|
604
+ assert_attributes(attrs[i], names, category)
605
+ end
606
+ end
607
+ end
608
+
609
+ def assert_image20(attrs, image)
610
+ _wrap_assertion do
611
+ names = %w(url link title description)
612
+ names << ["width", :integer]
613
+ names << ["height", :integer]
614
+ assert_attributes(attrs, names, image)
615
+ end
616
+ end
617
+
618
+ def assert_items20(attrs, items)
619
+ _wrap_assertion do
620
+ names = %w(about title link description)
621
+ items.each_with_index do |item, i|
622
+ assert_attributes(attrs[i], names, item)
623
+
624
+ n_attrs = normalized_attrs(attrs[i])
625
+
626
+ %w(source enclosure categories guid).each do |name|
627
+ value = n_attrs[name]
628
+ if value
629
+ target = item.__send__(name)
630
+ __send__("assert_items20_#{name}", value, target)
631
+ end
632
+ end
633
+ end
634
+ end
635
+ end
636
+
637
+ def assert_items20_source(attrs, source)
638
+ _wrap_assertion do
639
+ assert_attributes(attrs, %w(url content), source)
640
+ end
641
+ end
642
+
643
+ def assert_items20_enclosure(attrs, enclosure)
644
+ _wrap_assertion do
645
+ names = ["url", ["length", :integer], "type"]
646
+ assert_attributes(attrs, names, enclosure)
647
+ end
648
+ end
649
+
650
+ def assert_items20_categories(attrs, categories)
651
+ _wrap_assertion do
652
+ assert_channel20_categories(attrs, categories)
653
+ end
654
+ end
655
+
656
+ def assert_items20_guid(attrs, guid)
657
+ _wrap_assertion do
658
+ names = [["isPermaLink", :boolean], ["content"]]
659
+ assert_attributes(attrs, names, guid)
660
+ end
661
+ end
662
+
663
+ def assert_textinput20(attrs, textinput)
664
+ _wrap_assertion do
665
+ names = %w(title description name link)
666
+ assert_attributes(attrs, names, textinput)
667
+ end
668
+ end
669
+ end
670
+ end