diff --git a/lib/rss/itunes.rb b/lib/rss/itunes.rb index 0c2274d..1272ee2 100644 --- a/lib/rss/itunes.rb +++ b/lib/rss/itunes.rb @@ -80,6 +80,7 @@ def append_features(klass) ["image", :attribute, "href"], ["owner", :element], ["new-feed-url"], + ["type", :itunes_episode], ] + ITunesBaseModel::ELEMENT_INFOS class ITunesCategory < Element diff --git a/lib/rss/maker/itunes.rb b/lib/rss/maker/itunes.rb index 2a91b10..612b76b 100644 --- a/lib/rss/maker/itunes.rb +++ b/lib/rss/maker/itunes.rb @@ -15,6 +15,8 @@ def def_class_accessor(klass, name, type, *args) def_yes_other_accessor(klass, full_name) when :explicit_clean_other def_explicit_clean_other_accessor(klass, full_name) + when :itunes_episode + def_itunes_episode_accessor(klass, full_name) when :csv def_csv_accessor(klass, full_name) when :element, :attribute @@ -52,6 +54,10 @@ def #{full_name}? EOC end + def def_itunes_episode_accessor(klass, full_name) + klass.def_other_element(full_name) + end + def def_csv_accessor(klass, full_name) klass.def_csv_element(full_name) end diff --git a/lib/rss/rss.rb b/lib/rss/rss.rb index 63bf855..0ee4506 100644 --- a/lib/rss/rss.rb +++ b/lib/rss/rss.rb @@ -577,6 +577,18 @@ def #{name}=(new_value) EOC end + def itunes_episode_writer(name, disp_name=name) + module_eval(<<-EOC, __FILE__, __LINE__ + 1) + def #{name}=(new_value) + if @do_validate and + !["episodic", "serial", nil].include?(new_value) + raise NotAvailableValueError.new('#{disp_name}', new_value) + end + @#{name} = new_value + end + EOC + end + def def_children_accessor(accessor_name, plural_name) module_eval(<<-EOC, *get_file_and_line_from_caller(2)) def #{plural_name} @@ -763,9 +775,11 @@ def def_corresponded_attr_writer(name, type=nil, disp_name=nil) when :yes_other yes_other_writer name, disp_name when :csv - csv_writer name + csv_writer name, disp_name when :csv_integer - csv_integer_writer name + csv_integer_writer name, disp_name + when :itunes_episode + itunes_episode_writer name, disp_name else attr_writer name end diff --git a/test/test-itunes.rb b/test/test-itunes.rb index 0ab8f92..5a4a4ea 100644 --- a/test/test-itunes.rb +++ b/test/test-itunes.rb @@ -73,6 +73,12 @@ def test_new_feed_url end end + def test_type + assert_itunes_type(%w(channel)) do |content, xmlns| + make_rss20(make_channel20(content), xmlns) + end + end + def test_owner assert_itunes_owner(%w(channel)) do |content, xmlns| make_rss20(make_channel20(content), xmlns) @@ -275,6 +281,28 @@ def assert_itunes_new_feed_url(readers, &rss20_maker) end end + def _assert_itunes_type(type, readers, &rss20_maker) + content = tag("itunes:type", type) + rss20 = itunes_rss20_parse(content, &rss20_maker) + target = chain_reader(rss20, readers) + assert_equal(type, target.itunes_type) + end + + def _assert_itunes_type_not_available_value(value, &rss20_maker) + assert_not_available_value("type", value) do + content = tag("itunes:type", value) + itunes_rss20_parse(content, &rss20_maker) + end + end + + def assert_itunes_type(readers, &rss20_maker) + _wrap_assertion do + _assert_itunes_type("episodic", readers, &rss20_maker) + _assert_itunes_type("serial", readers, &rss20_maker) + _assert_itunes_type_not_available_value("invalid", &rss20_maker) + end + end + def _assert_itunes_owner(name, email, readers, &rss20_maker) content = tag("itunes:owner", tag("itunes:name", name) + tag("itunes:email", email)) diff --git a/test/test-maker-itunes.rb b/test/test-maker-itunes.rb index 116b385..f8df50e 100644 --- a/test/test-maker-itunes.rb +++ b/test/test-maker-itunes.rb @@ -42,6 +42,10 @@ def test_new_feed_url assert_maker_itunes_new_feed_url(%w(channel)) end + def test_type + assert_maker_itunes_type(%w(channel)) + end + def test_owner assert_maker_itunes_owner(%w(channel)) end @@ -378,6 +382,21 @@ def assert_maker_itunes_new_feed_url(maker_readers, feed_readers=nil) assert_equal(url, target.itunes_new_feed_url) end + def assert_maker_itunes_type(maker_readers, feed_readers=nil) + feed_readers ||= maker_readers + type = "serial" + + rss20 = ::RSS::Maker.make("rss2.0") do |maker| + setup_dummy_channel(maker) + setup_dummy_item(maker) + + target = chain_reader(maker, maker_readers) + target.itunes_type = type + end + target = chain_reader(rss20, feed_readers) + assert_equal(type, target.itunes_type) + end + def _assert_maker_itunes_owner(name, email, maker_readers, feed_readers) rss20 = ::RSS::Maker.make("rss2.0") do |maker| setup_dummy_channel(maker)