From 69c4f96181620b6f874fd361903b60269da473e9 Mon Sep 17 00:00:00 2001 From: Luis Alfredo Lorenzo Date: Tue, 12 May 2020 14:09:36 -0500 Subject: [PATCH 1/2] Adds the 'itunes:type' tag The type of show is used to specify when episodes are intended to be consumed in sequential order or not. --- lib/rss/itunes.rb | 1 + test/test-itunes.rb | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/rss/itunes.rb b/lib/rss/itunes.rb index 0c2274d..8217322 100644 --- a/lib/rss/itunes.rb +++ b/lib/rss/itunes.rb @@ -53,6 +53,7 @@ module ITunesBaseModel ["block", :yes_other], ["explicit", :explicit_clean_other], ["keywords", :csv], + ["type"], ["subtitle"], ["summary"]] end diff --git a/test/test-itunes.rb b/test/test-itunes.rb index 0ab8f92..5a39410 100644 --- a/test/test-itunes.rb +++ b/test/test-itunes.rb @@ -99,6 +99,12 @@ def test_summary end end + def test_type + assert_itunes_type(%w(channel)) do |content, xmlns| + make_rss20(make_channel20(content), xmlns) + end + end + private def itunes_rss20_parse(content, &maker) xmlns = {"itunes" => "http://www.itunes.com/dtds/podcast-1.0.dtd"} @@ -356,5 +362,19 @@ def assert_itunes_summary(readers, &rss20_maker) 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(readers, &rss20_maker) + _wrap_assertion do + _assert_itunes_type("episodic", readers, &rss20_maker) + _assert_itunes_type("serial", readers, &rss20_maker) + end + end end end From 9e69180f196c911147d6f495972c35353b726eb1 Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Sun, 21 Jun 2020 10:59:55 +0900 Subject: [PATCH 2/2] Make itunes:type available only in Add validation. Add support for maker. --- lib/rss/itunes.rb | 2 +- lib/rss/maker/itunes.rb | 6 +++++ lib/rss/rss.rb | 18 +++++++++++++-- test/test-itunes.rb | 48 +++++++++++++++++++++++---------------- test/test-maker-itunes.rb | 19 ++++++++++++++++ 5 files changed, 70 insertions(+), 23 deletions(-) diff --git a/lib/rss/itunes.rb b/lib/rss/itunes.rb index 8217322..1272ee2 100644 --- a/lib/rss/itunes.rb +++ b/lib/rss/itunes.rb @@ -53,7 +53,6 @@ module ITunesBaseModel ["block", :yes_other], ["explicit", :explicit_clean_other], ["keywords", :csv], - ["type"], ["subtitle"], ["summary"]] end @@ -81,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 5a39410..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) @@ -99,12 +105,6 @@ def test_summary end end - def test_type - assert_itunes_type(%w(channel)) do |content, xmlns| - make_rss20(make_channel20(content), xmlns) - end - end - private def itunes_rss20_parse(content, &maker) xmlns = {"itunes" => "http://www.itunes.com/dtds/podcast-1.0.dtd"} @@ -281,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)) @@ -362,19 +384,5 @@ def assert_itunes_summary(readers, &rss20_maker) 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(readers, &rss20_maker) - _wrap_assertion do - _assert_itunes_type("episodic", readers, &rss20_maker) - _assert_itunes_type("serial", readers, &rss20_maker) - end - end end end 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)