Move XML parsing onto Episode.parse
Assisted-by: Claude Opus 4.6 via pi
diff --git a/lib/feed.rb b/lib/feed.rb
index 6e259f8..db94f5e 100644
--- a/lib/feed.rb
+++ b/lib/feed.rb
@@ -2,6 +2,18 @@ require "nokogiri"
module CookingIssues
Episode = Data.define(:number, :title, :published_at, :audio_url) do
+ def self.parse(item)
+ number = item.at_xpath("itunes:episode")&.text&.to_i
+ return nil unless number && number > 0
+
+ new(
+ number: number,
+ title: item.at_xpath("title").text,
+ published_at: item.at_xpath("pubDate").text,
+ audio_url: item.at_xpath("enclosure")&.[]("url")
+ )
+ end
+
def slug
formatted_number = format("%03d", number)
safe_title = title
@@ -17,21 +29,7 @@ module CookingIssues
module Feed
def self.parse(path)
doc = Nokogiri::XML(File.read(path))
- doc.xpath("//item").filter_map { |item| parse_item(item) }
+ doc.xpath("//item").filter_map { |item| Episode.parse(item) }
end
-
- def self.parse_item(item)
- number = item.at_xpath("itunes:episode")&.text&.to_i
- return nil unless number && number > 0
-
- Episode.new(
- number: number,
- title: item.at_xpath("title").text,
- published_at: item.at_xpath("pubDate").text,
- audio_url: item.at_xpath("enclosure")&.[]("url")
- )
- end
-
- private_class_method :parse_item
end
end