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.
- data/.gemtest +0 -0
- data/.gitignore +19 -0
- data/.gitmodules +3 -0
- data/BSDL +22 -0
- data/COPYING +56 -0
- data/COPYING.ja +51 -0
- data/Gemfile +4 -0
- data/LEGAL +8 -0
- data/README.markdown +51 -0
- data/Rakefile +12 -0
- data/lib/rss/nokogiri.rb +92 -0
- data/rss-nokogiri.gemspec +24 -0
- data/test/regression/dot.png +0 -0
- data/test/regression/rss-assertions.rb +2090 -0
- data/test/regression/rss-testcase.rb +478 -0
- data/test/regression/test_1.0.rb +295 -0
- data/test/regression/test_2.0.rb +409 -0
- data/test/regression/test_accessor.rb +103 -0
- data/test/regression/test_atom.rb +681 -0
- data/test/regression/test_content.rb +104 -0
- data/test/regression/test_dublincore.rb +279 -0
- data/test/regression/test_image.rb +214 -0
- data/test/regression/test_inherit.rb +40 -0
- data/test/regression/test_itunes.rb +347 -0
- data/test/regression/test_maker_0.9.rb +474 -0
- data/test/regression/test_maker_1.0.rb +516 -0
- data/test/regression/test_maker_2.0.rb +757 -0
- data/test/regression/test_maker_atom_entry.rb +393 -0
- data/test/regression/test_maker_atom_feed.rb +454 -0
- data/test/regression/test_maker_content.rb +47 -0
- data/test/regression/test_maker_dc.rb +149 -0
- data/test/regression/test_maker_image.rb +62 -0
- data/test/regression/test_maker_itunes.rb +471 -0
- data/test/regression/test_maker_slash.rb +37 -0
- data/test/regression/test_maker_sy.rb +44 -0
- data/test/regression/test_maker_taxo.rb +81 -0
- data/test/regression/test_maker_trackback.rb +41 -0
- data/test/regression/test_maker_xml-stylesheet.rb +83 -0
- data/test/regression/test_parser.rb +62 -0
- data/test/regression/test_parser_1.0.rb +528 -0
- data/test/regression/test_parser_2.0.rb +122 -0
- data/test/regression/test_parser_atom_entry.rb +163 -0
- data/test/regression/test_parser_atom_feed.rb +276 -0
- data/test/regression/test_setup_maker_0.9.rb +246 -0
- data/test/regression/test_setup_maker_1.0.rb +550 -0
- data/test/regression/test_setup_maker_2.0.rb +308 -0
- data/test/regression/test_setup_maker_atom_entry.rb +409 -0
- data/test/regression/test_setup_maker_atom_feed.rb +445 -0
- data/test/regression/test_setup_maker_itunes.rb +144 -0
- data/test/regression/test_setup_maker_slash.rb +38 -0
- data/test/regression/test_slash.rb +64 -0
- data/test/regression/test_syndication.rb +125 -0
- data/test/regression/test_taxonomy.rb +172 -0
- data/test/regression/test_to_s.rb +670 -0
- data/test/regression/test_trackback.rb +135 -0
- data/test/regression/test_version.rb +9 -0
- data/test/regression/test_xml-stylesheet.rb +108 -0
- metadata +220 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
require "rss-testcase"
|
2
|
+
|
3
|
+
require "rss/maker"
|
4
|
+
|
5
|
+
module RSS
|
6
|
+
class TestMakerContent < TestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@uri = "http://purl.org/rss/1.0/modules/content/"
|
10
|
+
|
11
|
+
@elements = {
|
12
|
+
:encoded => "<em>ATTENTION</em>",
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_rss10
|
17
|
+
rss = RSS::Maker.make("1.0") do |maker|
|
18
|
+
setup_dummy_channel(maker)
|
19
|
+
|
20
|
+
setup_dummy_item(maker)
|
21
|
+
item = maker.items.last
|
22
|
+
@elements.each do |name, value|
|
23
|
+
item.__send__("#{accessor_name(name)}=", value)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
assert_content(@elements, rss.items.last)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_rss20
|
30
|
+
rss = RSS::Maker.make("2.0") do |maker|
|
31
|
+
setup_dummy_channel(maker)
|
32
|
+
|
33
|
+
setup_dummy_item(maker)
|
34
|
+
item = maker.items.last
|
35
|
+
@elements.each do |name, value|
|
36
|
+
item.__send__("#{accessor_name(name)}=", value)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
assert_content(@elements, rss.items.last)
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def accessor_name(name)
|
44
|
+
"content_#{name}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
require "rss-testcase"
|
2
|
+
|
3
|
+
require "rss/maker"
|
4
|
+
|
5
|
+
module RSS
|
6
|
+
class TestMakerDublinCore < TestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@uri = "http://purl.org/dc/elements/1.1/"
|
10
|
+
|
11
|
+
t = Time.iso8601("2000-01-01T12:00:05+00:00")
|
12
|
+
class << t
|
13
|
+
alias_method(:to_s, :iso8601)
|
14
|
+
end
|
15
|
+
|
16
|
+
@elements = {
|
17
|
+
:title => "hoge",
|
18
|
+
:description =>
|
19
|
+
" XML is placing increasingly heavy loads on
|
20
|
+
the existing technical infrastructure of the Internet.",
|
21
|
+
:creator => "Rael Dornfest (mailto:rael@oreilly.com)",
|
22
|
+
:subject => "XML",
|
23
|
+
:publisher => "The O'Reilly Network",
|
24
|
+
:contributor => "hogehoge",
|
25
|
+
:type => "fugafuga",
|
26
|
+
:format => "hohoho",
|
27
|
+
:identifier => "fufufu",
|
28
|
+
:source => "barbar",
|
29
|
+
:language => "ja",
|
30
|
+
:relation => "cococo",
|
31
|
+
:rights => "Copyright (c) 2000 O'Reilly & Associates, Inc.",
|
32
|
+
:date => t,
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_rss10
|
37
|
+
rss = RSS::Maker.make("1.0") do |maker|
|
38
|
+
setup_dummy_channel(maker)
|
39
|
+
set_elements(maker.channel)
|
40
|
+
|
41
|
+
setup_dummy_image(maker)
|
42
|
+
set_elements(maker.image)
|
43
|
+
|
44
|
+
setup_dummy_item(maker)
|
45
|
+
item = maker.items.last
|
46
|
+
@elements.each do |name, value|
|
47
|
+
item.__send__("#{accessor_name(name)}=", value)
|
48
|
+
end
|
49
|
+
|
50
|
+
setup_dummy_textinput(maker)
|
51
|
+
set_elements(maker.textinput)
|
52
|
+
end
|
53
|
+
assert_dublin_core(@elements, rss.channel)
|
54
|
+
assert_dublin_core(@elements, rss.image)
|
55
|
+
assert_dublin_core(@elements, rss.items.last)
|
56
|
+
assert_dublin_core(@elements, rss.textinput)
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_rss10_multiple
|
60
|
+
assert_multiple_dublin_core_rss10("_list")
|
61
|
+
assert_multiple_dublin_core_rss10("es")
|
62
|
+
end
|
63
|
+
|
64
|
+
def assert_multiple_dublin_core_rss10(multiple_rights_suffix)
|
65
|
+
elems = []
|
66
|
+
@elements.each do |name, value|
|
67
|
+
plural = name.to_s + (name == :rights ? multiple_rights_suffix : "s")
|
68
|
+
values = [value]
|
69
|
+
if name == :date
|
70
|
+
values << value + 60
|
71
|
+
else
|
72
|
+
values << value * 2
|
73
|
+
end
|
74
|
+
elems << [name, values, plural]
|
75
|
+
end
|
76
|
+
|
77
|
+
rss = RSS::Maker.make("1.0") do |maker|
|
78
|
+
setup_dummy_channel(maker)
|
79
|
+
set_multiple_elements(maker.channel, elems)
|
80
|
+
|
81
|
+
setup_dummy_image(maker)
|
82
|
+
set_multiple_elements(maker.image, elems)
|
83
|
+
|
84
|
+
setup_dummy_item(maker)
|
85
|
+
item = maker.items.last
|
86
|
+
elems.each do |name, values, plural|
|
87
|
+
dc_elems = item.__send__("dc_#{plural}")
|
88
|
+
values.each do |value|
|
89
|
+
elem = dc_elems.__send__("new_#{name}")
|
90
|
+
elem.value = value
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
setup_dummy_textinput(maker)
|
95
|
+
set_multiple_elements(maker.textinput, elems)
|
96
|
+
end
|
97
|
+
assert_multiple_dublin_core(elems, rss.channel)
|
98
|
+
assert_multiple_dublin_core(elems, rss.image)
|
99
|
+
assert_multiple_dublin_core(elems, rss.items.last)
|
100
|
+
assert_multiple_dublin_core(elems, rss.textinput)
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_date
|
104
|
+
t1 = Time.iso8601("2000-01-01T12:00:05+00:00")
|
105
|
+
t2 = Time.iso8601("2005-01-01T12:00:05+00:00")
|
106
|
+
|
107
|
+
rss = RSS::Maker.make("1.0") do |maker|
|
108
|
+
setup_dummy_channel(maker)
|
109
|
+
maker.channel.date = t1
|
110
|
+
maker.channel.dc_dates.new_date do |date|
|
111
|
+
date.value = t2
|
112
|
+
end
|
113
|
+
|
114
|
+
setup_dummy_item(maker)
|
115
|
+
item = maker.items.last
|
116
|
+
item.date = t2
|
117
|
+
item.dc_dates.new_date do |date|
|
118
|
+
date.value = t1
|
119
|
+
end
|
120
|
+
end
|
121
|
+
assert_equal([t1, t2], rss.channel.dc_dates.collect{|x| x.value})
|
122
|
+
assert_equal([t2, t1], rss.items.last.dc_dates.collect{|x| x.value})
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
def accessor_name(name)
|
127
|
+
"dc_#{name}"
|
128
|
+
end
|
129
|
+
|
130
|
+
def set_elements(target, elems=@elements)
|
131
|
+
elems.each do |name, value|
|
132
|
+
target.__send__("#{accessor_name(name)}=", value)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def set_multiple_elements(target, elems)
|
137
|
+
elems.each do |name, values, plural|
|
138
|
+
plural ||= "#{name}s"
|
139
|
+
dc_elems = target.__send__("dc_#{plural}")
|
140
|
+
values.each do |value|
|
141
|
+
dc_elems.__send__("new_#{name}") do |new_dc_elem|
|
142
|
+
new_dc_elem.value = value
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require "rss-testcase"
|
2
|
+
|
3
|
+
require "rss/maker"
|
4
|
+
|
5
|
+
module RSS
|
6
|
+
class TestMakerImage < TestCase
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@uri = "http://web.resource.org/rss/1.0/modules/image/"
|
10
|
+
|
11
|
+
@favicon_infos = {
|
12
|
+
"about" => "http://www.kuro5hin.org/favicon.ico",
|
13
|
+
"image_size" => "small",
|
14
|
+
"dc_title" => "example",
|
15
|
+
}
|
16
|
+
@item_infos = {
|
17
|
+
"about" => "http://www.example.org/item.png",
|
18
|
+
"resource" => "http://www.example.org/item",
|
19
|
+
"dc_title" => "Example Image",
|
20
|
+
"image_width" => "100",
|
21
|
+
"image_height" => "65",
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_rss10
|
26
|
+
rss = RSS::Maker.make("1.0") do |maker|
|
27
|
+
setup_dummy_channel(maker)
|
28
|
+
@favicon_infos.each do |name, value|
|
29
|
+
maker.channel.image_favicon.__send__("#{name}=", value)
|
30
|
+
end
|
31
|
+
|
32
|
+
setup_dummy_image(maker)
|
33
|
+
|
34
|
+
setup_dummy_item(maker)
|
35
|
+
item = maker.items.last
|
36
|
+
@item_infos.each do |name, value|
|
37
|
+
item.image_item.__send__("#{name}=", value)
|
38
|
+
end
|
39
|
+
|
40
|
+
setup_dummy_textinput(maker)
|
41
|
+
end
|
42
|
+
|
43
|
+
setup_rss = RSS::Maker.make("1.0") do |maker|
|
44
|
+
rss.setup_maker(maker)
|
45
|
+
end
|
46
|
+
|
47
|
+
[rss, setup_rss].each_with_index do |target, i|
|
48
|
+
favicon = target.channel.image_favicon
|
49
|
+
assert_equal(@favicon_infos["about"], favicon.about)
|
50
|
+
assert_equal(@favicon_infos["image_size"], favicon.image_size)
|
51
|
+
assert_equal(@favicon_infos["dc_title"], favicon.dc_title)
|
52
|
+
|
53
|
+
item = target.items.last.image_item
|
54
|
+
assert_equal(@item_infos["about"], item.about)
|
55
|
+
assert_equal(@item_infos["resource"], item.resource)
|
56
|
+
assert_equal(@item_infos["image_width"].to_i, item.image_width)
|
57
|
+
assert_equal(@item_infos["image_height"].to_i, item.image_height)
|
58
|
+
assert_equal(@item_infos["dc_title"], item.dc_title)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,471 @@
|
|
1
|
+
require "rss-testcase"
|
2
|
+
|
3
|
+
require "rss/maker"
|
4
|
+
|
5
|
+
module RSS
|
6
|
+
class TestMakerITunes < TestCase
|
7
|
+
def test_author
|
8
|
+
assert_maker_itunes_author(%w(channel))
|
9
|
+
assert_maker_itunes_author(%w(items last))
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_block
|
13
|
+
assert_maker_itunes_block(%w(channel))
|
14
|
+
assert_maker_itunes_block(%w(items last))
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_category
|
18
|
+
assert_maker_itunes_category(%w(channel))
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_image
|
22
|
+
assert_maker_itunes_image(%w(channel))
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_duration
|
26
|
+
assert_maker_itunes_duration(%w(items last))
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_explicit
|
30
|
+
assert_maker_itunes_explicit(%w(channel))
|
31
|
+
assert_maker_itunes_explicit(%w(items last))
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_keywords
|
35
|
+
assert_maker_itunes_keywords(%w(channel))
|
36
|
+
assert_maker_itunes_keywords(%w(items last))
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_new_feed_url
|
40
|
+
assert_maker_itunes_new_feed_url(%w(channel))
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_owner
|
44
|
+
assert_maker_itunes_owner(%w(channel))
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_subtitle
|
48
|
+
assert_maker_itunes_subtitle(%w(channel))
|
49
|
+
assert_maker_itunes_subtitle(%w(items last))
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_summary
|
53
|
+
assert_maker_itunes_summary(%w(channel))
|
54
|
+
assert_maker_itunes_summary(%w(items last))
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def assert_maker_itunes_author(maker_readers, feed_readers=nil)
|
60
|
+
_wrap_assertion do
|
61
|
+
feed_readers ||= maker_readers
|
62
|
+
author = "John Doe"
|
63
|
+
rss20 = ::RSS::Maker.make("rss2.0") do |maker|
|
64
|
+
setup_dummy_channel(maker)
|
65
|
+
setup_dummy_item(maker)
|
66
|
+
|
67
|
+
target = chain_reader(maker, maker_readers)
|
68
|
+
target.itunes_author = author
|
69
|
+
end
|
70
|
+
target = chain_reader(rss20, feed_readers)
|
71
|
+
assert_equal(author, target.itunes_author)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def _assert_maker_itunes_block(value, boolean_value, maker_readers,
|
76
|
+
feed_readers)
|
77
|
+
rss20 = ::RSS::Maker.make("rss2.0") do |maker|
|
78
|
+
setup_dummy_channel(maker)
|
79
|
+
setup_dummy_item(maker)
|
80
|
+
|
81
|
+
target = chain_reader(maker, maker_readers)
|
82
|
+
target.itunes_block = value
|
83
|
+
assert_equal(value, target.itunes_block)
|
84
|
+
assert_equal(boolean_value, target.itunes_block?)
|
85
|
+
end
|
86
|
+
target = chain_reader(rss20, feed_readers)
|
87
|
+
if [true, false].include?(value)
|
88
|
+
feed_expected_value = value = value ? "yes" : "no"
|
89
|
+
else
|
90
|
+
feed_expected_value = value
|
91
|
+
end
|
92
|
+
assert_equal(value, target.itunes_block)
|
93
|
+
assert_equal(boolean_value, target.itunes_block?)
|
94
|
+
end
|
95
|
+
|
96
|
+
def assert_maker_itunes_block(maker_readers, feed_readers=nil)
|
97
|
+
_wrap_assertion do
|
98
|
+
feed_readers ||= maker_readers
|
99
|
+
_assert_maker_itunes_block("yes", true, maker_readers, feed_readers)
|
100
|
+
_assert_maker_itunes_block("Yes", true, maker_readers, feed_readers)
|
101
|
+
_assert_maker_itunes_block("no", false, maker_readers, feed_readers)
|
102
|
+
_assert_maker_itunes_block("", false, maker_readers, feed_readers)
|
103
|
+
_assert_maker_itunes_block(true, true, maker_readers, feed_readers)
|
104
|
+
_assert_maker_itunes_block(false, false, maker_readers, feed_readers)
|
105
|
+
_assert_maker_itunes_block(nil, false, maker_readers, feed_readers)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def _assert_maker_itunes_category(categories, maker_readers, feed_readers)
|
110
|
+
rss20 = ::RSS::Maker.make("rss2.0") do |maker|
|
111
|
+
setup_dummy_channel(maker)
|
112
|
+
setup_dummy_item(maker)
|
113
|
+
|
114
|
+
target = chain_reader(maker, maker_readers)
|
115
|
+
categories.each do |category|
|
116
|
+
sub_target = target.itunes_categories
|
117
|
+
if category.is_a?(Array)
|
118
|
+
category.each do |sub_category|
|
119
|
+
sub_target = sub_target.new_category
|
120
|
+
sub_target.text = sub_category
|
121
|
+
end
|
122
|
+
else
|
123
|
+
sub_target.new_category.text = category
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
target = chain_reader(rss20, feed_readers)
|
129
|
+
actual_categories = target.itunes_categories.collect do |category|
|
130
|
+
cat = category.text
|
131
|
+
if category.itunes_categories.empty?
|
132
|
+
cat
|
133
|
+
else
|
134
|
+
[cat, *category.itunes_categories.collect {|c| c.text}]
|
135
|
+
end
|
136
|
+
end
|
137
|
+
assert_equal(categories, actual_categories)
|
138
|
+
end
|
139
|
+
|
140
|
+
def assert_maker_itunes_category(maker_readers, feed_readers=nil)
|
141
|
+
_wrap_assertion do
|
142
|
+
feed_readers ||= maker_readers
|
143
|
+
_assert_maker_itunes_category(["Audio Blogs"],
|
144
|
+
maker_readers, feed_readers)
|
145
|
+
_assert_maker_itunes_category([["Arts & Entertainment", "Games"]],
|
146
|
+
maker_readers, feed_readers)
|
147
|
+
_assert_maker_itunes_category([["Arts & Entertainment", "Games"],
|
148
|
+
["Technology", "Computers"],
|
149
|
+
"Audio Blogs"],
|
150
|
+
maker_readers, feed_readers)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def assert_maker_itunes_image(maker_readers, feed_readers=nil)
|
155
|
+
_wrap_assertion do
|
156
|
+
feed_readers ||= maker_readers
|
157
|
+
url = "http://example.com/podcasts/everything/AllAboutEverything.jpg"
|
158
|
+
|
159
|
+
rss20 = ::RSS::Maker.make("rss2.0") do |maker|
|
160
|
+
setup_dummy_channel(maker)
|
161
|
+
setup_dummy_item(maker)
|
162
|
+
|
163
|
+
target = chain_reader(maker, maker_readers)
|
164
|
+
target.itunes_image = url
|
165
|
+
end
|
166
|
+
|
167
|
+
target = chain_reader(rss20, feed_readers)
|
168
|
+
assert_not_nil(target.itunes_image)
|
169
|
+
assert_equal(url, target.itunes_image.href)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def _assert_maker_itunes_duration(hour, minute, second, value,
|
174
|
+
maker_readers, feed_readers)
|
175
|
+
_assert_maker_itunes_duration_by_value(hour, minute, second, value,
|
176
|
+
maker_readers, feed_readers)
|
177
|
+
_assert_maker_itunes_duration_by_hour_minute_second(hour, minute, second,
|
178
|
+
value,
|
179
|
+
maker_readers,
|
180
|
+
feed_readers)
|
181
|
+
end
|
182
|
+
|
183
|
+
def _assert_maker_itunes_duration_by(hour, minute, second, value,
|
184
|
+
maker_readers, feed_readers)
|
185
|
+
expected_value = nil
|
186
|
+
rss20 = ::RSS::Maker.make("rss2.0") do |maker|
|
187
|
+
setup_dummy_channel(maker)
|
188
|
+
setup_dummy_item(maker)
|
189
|
+
|
190
|
+
target = chain_reader(maker, maker_readers)
|
191
|
+
expected_value = yield(target)
|
192
|
+
assert_equal(expected_value, target.itunes_duration)
|
193
|
+
target.itunes_duration do |duration|
|
194
|
+
assert_equal([hour, minute, second, expected_value],
|
195
|
+
[duration.hour, duration.minute,
|
196
|
+
duration.second, duration.content])
|
197
|
+
end
|
198
|
+
end
|
199
|
+
target = chain_reader(rss20, feed_readers)
|
200
|
+
duration = target.itunes_duration
|
201
|
+
assert_not_nil(duration)
|
202
|
+
assert_equal([hour, minute, second, expected_value],
|
203
|
+
[duration.hour, duration.minute,
|
204
|
+
duration.second, duration.content])
|
205
|
+
end
|
206
|
+
|
207
|
+
def _assert_maker_itunes_duration_by_value(hour, minute, second, value,
|
208
|
+
maker_readers, feed_readers)
|
209
|
+
_assert_maker_itunes_duration_by(hour, minute, second, value,
|
210
|
+
maker_readers, feed_readers) do |target|
|
211
|
+
target.itunes_duration = value
|
212
|
+
value
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
def _assert_maker_itunes_duration_by_hour_minute_second(hour, minute, second,
|
217
|
+
value,
|
218
|
+
maker_readers,
|
219
|
+
feed_readers)
|
220
|
+
_assert_maker_itunes_duration_by(hour, minute, second, value,
|
221
|
+
maker_readers, feed_readers) do |target|
|
222
|
+
target.itunes_duration do |duration|
|
223
|
+
duration.hour = hour
|
224
|
+
duration.minute = minute
|
225
|
+
duration.second = second
|
226
|
+
end
|
227
|
+
value.split(":").collect {|v| "%02d" % v.to_i}.join(":")
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
def _assert_maker_itunes_duration_invalid_value(value, maker_readers)
|
232
|
+
assert_raise(ArgumentError) do
|
233
|
+
::RSS::Maker.make("rss2.0") do |maker|
|
234
|
+
setup_dummy_channel(maker)
|
235
|
+
setup_dummy_item(maker)
|
236
|
+
|
237
|
+
target = chain_reader(maker, maker_readers)
|
238
|
+
target.itunes_duration = value
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
def assert_maker_itunes_duration(maker_readers, feed_readers=nil)
|
244
|
+
_wrap_assertion do
|
245
|
+
feed_readers ||= maker_readers
|
246
|
+
_assert_maker_itunes_duration(7, 14, 5, "07:14:05", maker_readers,
|
247
|
+
feed_readers)
|
248
|
+
_assert_maker_itunes_duration(7, 14, 5, "7:14:05", maker_readers,
|
249
|
+
feed_readers)
|
250
|
+
_assert_maker_itunes_duration(0, 4, 55, "04:55", maker_readers,
|
251
|
+
feed_readers)
|
252
|
+
_assert_maker_itunes_duration(0, 4, 5, "4:05", maker_readers,
|
253
|
+
feed_readers)
|
254
|
+
|
255
|
+
_assert_maker_itunes_duration_invalid_value("5", maker_readers)
|
256
|
+
_assert_maker_itunes_duration_invalid_value("09:07:14:05", maker_readers)
|
257
|
+
_assert_maker_itunes_duration_invalid_value("10:5", maker_readers)
|
258
|
+
_assert_maker_itunes_duration_invalid_value("10:03:5", maker_readers)
|
259
|
+
_assert_maker_itunes_duration_invalid_value("10:3:05", maker_readers)
|
260
|
+
|
261
|
+
_assert_maker_itunes_duration_invalid_value("xx:xx:xx", maker_readers)
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
def _assert_maker_itunes_explicit(explicit, value,
|
266
|
+
maker_readers, feed_readers)
|
267
|
+
rss20 = ::RSS::Maker.make("rss2.0") do |maker|
|
268
|
+
setup_dummy_channel(maker)
|
269
|
+
setup_dummy_item(maker)
|
270
|
+
|
271
|
+
target = chain_reader(maker, maker_readers)
|
272
|
+
target.itunes_explicit = value
|
273
|
+
assert_equal(explicit, target.itunes_explicit?)
|
274
|
+
end
|
275
|
+
target = chain_reader(rss20, feed_readers)
|
276
|
+
assert_equal(value, target.itunes_explicit)
|
277
|
+
assert_equal(explicit, target.itunes_explicit?)
|
278
|
+
end
|
279
|
+
|
280
|
+
def assert_maker_itunes_explicit(maker_readers, feed_readers=nil)
|
281
|
+
_wrap_assertion do
|
282
|
+
feed_readers ||= maker_readers
|
283
|
+
_assert_maker_itunes_explicit(true, "yes", maker_readers, feed_readers)
|
284
|
+
_assert_maker_itunes_explicit(false, "clean",
|
285
|
+
maker_readers, feed_readers)
|
286
|
+
_assert_maker_itunes_explicit(nil, "no", maker_readers, feed_readers)
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
def _assert_maker_itunes_keywords(keywords, value,
|
291
|
+
maker_readers, feed_readers)
|
292
|
+
_assert_maker_itunes_keywords_by_value(keywords, value,
|
293
|
+
maker_readers, feed_readers)
|
294
|
+
_assert_maker_itunes_keywords_by_keywords(keywords, maker_readers,
|
295
|
+
feed_readers)
|
296
|
+
end
|
297
|
+
|
298
|
+
def _assert_maker_itunes_keywords_by(keywords, maker_readers, feed_readers)
|
299
|
+
rss20 = ::RSS::Maker.make("rss2.0") do |maker|
|
300
|
+
setup_dummy_channel(maker)
|
301
|
+
setup_dummy_item(maker)
|
302
|
+
|
303
|
+
target = chain_reader(maker, maker_readers)
|
304
|
+
yield(target)
|
305
|
+
end
|
306
|
+
assert_nothing_raised do
|
307
|
+
rss20 = ::RSS::Parser.parse(rss20.to_s)
|
308
|
+
end
|
309
|
+
target = chain_reader(rss20, feed_readers)
|
310
|
+
assert_equal(keywords, target.itunes_keywords)
|
311
|
+
end
|
312
|
+
|
313
|
+
def _assert_maker_itunes_keywords_by_value(keywords, value,
|
314
|
+
maker_readers, feed_readers)
|
315
|
+
_assert_maker_itunes_keywords_by(keywords, maker_readers,
|
316
|
+
feed_readers) do |target|
|
317
|
+
target.itunes_keywords = value
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
def _assert_maker_itunes_keywords_by_keywords(keywords,
|
322
|
+
maker_readers, feed_readers)
|
323
|
+
_assert_maker_itunes_keywords_by(keywords, maker_readers,
|
324
|
+
feed_readers) do |target|
|
325
|
+
target.itunes_keywords = keywords
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
def assert_maker_itunes_keywords(maker_readers, feed_readers=nil)
|
330
|
+
_wrap_assertion do
|
331
|
+
feed_readers ||= maker_readers
|
332
|
+
_assert_maker_itunes_keywords(["salt"], "salt",
|
333
|
+
maker_readers, feed_readers)
|
334
|
+
_assert_maker_itunes_keywords(["salt"], " salt ",
|
335
|
+
maker_readers, feed_readers)
|
336
|
+
_assert_maker_itunes_keywords(["salt", "pepper", "shaker", "exciting"],
|
337
|
+
"salt, pepper, shaker, exciting",
|
338
|
+
maker_readers, feed_readers)
|
339
|
+
_assert_maker_itunes_keywords(["metric", "socket", "wrenches",
|
340
|
+
"toolsalt"],
|
341
|
+
"metric, socket, wrenches, toolsalt",
|
342
|
+
maker_readers, feed_readers)
|
343
|
+
_assert_maker_itunes_keywords(["olitics", "red", "blue", "state"],
|
344
|
+
"olitics, red, blue, state",
|
345
|
+
maker_readers, feed_readers)
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
def assert_maker_itunes_new_feed_url(maker_readers, feed_readers=nil)
|
350
|
+
feed_readers ||= maker_readers
|
351
|
+
url = "http://newlocation.com/example.rss"
|
352
|
+
|
353
|
+
rss20 = ::RSS::Maker.make("rss2.0") do |maker|
|
354
|
+
setup_dummy_channel(maker)
|
355
|
+
setup_dummy_item(maker)
|
356
|
+
|
357
|
+
target = chain_reader(maker, maker_readers)
|
358
|
+
target.itunes_new_feed_url = url
|
359
|
+
end
|
360
|
+
target = chain_reader(rss20, feed_readers)
|
361
|
+
assert_equal(url, target.itunes_new_feed_url)
|
362
|
+
end
|
363
|
+
|
364
|
+
def _assert_maker_itunes_owner(name, email, maker_readers, feed_readers)
|
365
|
+
rss20 = ::RSS::Maker.make("rss2.0") do |maker|
|
366
|
+
setup_dummy_channel(maker)
|
367
|
+
setup_dummy_item(maker)
|
368
|
+
|
369
|
+
target = chain_reader(maker, maker_readers)
|
370
|
+
owner = target.itunes_owner
|
371
|
+
owner.itunes_name = name
|
372
|
+
owner.itunes_email = email
|
373
|
+
end
|
374
|
+
owner = chain_reader(rss20, feed_readers).itunes_owner
|
375
|
+
if name.nil? and email.nil?
|
376
|
+
assert_nil(owner)
|
377
|
+
else
|
378
|
+
assert_not_nil(owner)
|
379
|
+
assert_equal(name, owner.itunes_name)
|
380
|
+
assert_equal(email, owner.itunes_email)
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
def assert_maker_itunes_owner(maker_readers, feed_readers=nil)
|
385
|
+
_wrap_assertion do
|
386
|
+
feed_readers ||= maker_readers
|
387
|
+
_assert_maker_itunes_owner("John Doe", "john.doe@example.com",
|
388
|
+
maker_readers, feed_readers)
|
389
|
+
|
390
|
+
not_set_name = (["maker"] + maker_readers + ["itunes_owner"]).join(".")
|
391
|
+
assert_not_set_error(not_set_name, ["itunes_name"]) do
|
392
|
+
_assert_maker_itunes_owner(nil, "john.doe@example.com",
|
393
|
+
maker_readers, feed_readers)
|
394
|
+
end
|
395
|
+
assert_not_set_error(not_set_name, ["itunes_email"]) do
|
396
|
+
_assert_maker_itunes_owner("John Doe", nil,
|
397
|
+
maker_readers, feed_readers)
|
398
|
+
end
|
399
|
+
|
400
|
+
_assert_maker_itunes_owner(nil, nil, maker_readers, feed_readers)
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
def _assert_maker_itunes_subtitle(subtitle, maker_readers, feed_readers)
|
405
|
+
rss20 = ::RSS::Maker.make("rss2.0") do |maker|
|
406
|
+
setup_dummy_channel(maker)
|
407
|
+
setup_dummy_item(maker)
|
408
|
+
|
409
|
+
target = chain_reader(maker, maker_readers)
|
410
|
+
target.itunes_subtitle = subtitle
|
411
|
+
end
|
412
|
+
|
413
|
+
target = chain_reader(rss20, feed_readers)
|
414
|
+
assert_equal(subtitle, target.itunes_subtitle)
|
415
|
+
end
|
416
|
+
|
417
|
+
def assert_maker_itunes_subtitle(maker_readers, feed_readers=nil)
|
418
|
+
_wrap_assertion do
|
419
|
+
feed_readers ||= maker_readers
|
420
|
+
_assert_maker_itunes_subtitle("A show about everything",
|
421
|
+
maker_readers, feed_readers)
|
422
|
+
_assert_maker_itunes_subtitle("A short primer on table spices",
|
423
|
+
maker_readers, feed_readers)
|
424
|
+
_assert_maker_itunes_subtitle("Comparing socket wrenches is fun!",
|
425
|
+
maker_readers, feed_readers)
|
426
|
+
_assert_maker_itunes_subtitle("Red + Blue != Purple",
|
427
|
+
maker_readers, feed_readers)
|
428
|
+
end
|
429
|
+
end
|
430
|
+
|
431
|
+
def _assert_maker_itunes_summary(summary, maker_readers, feed_readers)
|
432
|
+
rss20 = ::RSS::Maker.make("rss2.0") do |maker|
|
433
|
+
setup_dummy_channel(maker)
|
434
|
+
setup_dummy_item(maker)
|
435
|
+
|
436
|
+
target = chain_reader(maker, maker_readers)
|
437
|
+
target.itunes_summary = summary
|
438
|
+
end
|
439
|
+
|
440
|
+
target = chain_reader(rss20, feed_readers)
|
441
|
+
assert_equal(summary, target.itunes_summary)
|
442
|
+
end
|
443
|
+
|
444
|
+
def assert_maker_itunes_summary(maker_readers, feed_readers=nil)
|
445
|
+
_wrap_assertion do
|
446
|
+
feed_readers ||= maker_readers
|
447
|
+
_assert_maker_itunes_summary("All About Everything is a show about " +
|
448
|
+
"everything. Each week we dive into any " +
|
449
|
+
"subject known to man and talk about it " +
|
450
|
+
"as much as we can. Look for our Podcast " +
|
451
|
+
"in the iTunes Music Store",
|
452
|
+
maker_readers, feed_readers)
|
453
|
+
_assert_maker_itunes_summary("This week we talk about salt and pepper " +
|
454
|
+
"shakers, comparing and contrasting pour " +
|
455
|
+
"rates, construction materials, and " +
|
456
|
+
"overall aesthetics. Come and join the " +
|
457
|
+
"party!",
|
458
|
+
maker_readers, feed_readers)
|
459
|
+
_assert_maker_itunes_summary("This week we talk about metric vs. old " +
|
460
|
+
"english socket wrenches. Which one is " +
|
461
|
+
"better? Do you really need both? Get " +
|
462
|
+
"all of your answers here.",
|
463
|
+
maker_readers, feed_readers)
|
464
|
+
_assert_maker_itunes_summary("This week we talk about surviving in a " +
|
465
|
+
"Red state if you're a Blue person. Or " +
|
466
|
+
"vice versa.",
|
467
|
+
maker_readers, feed_readers)
|
468
|
+
end
|
469
|
+
end
|
470
|
+
end
|
471
|
+
end
|