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