Move XML parsing onto Episode.parse
Assisted-by: Claude Opus 4.6 via pi
change qyyyyrlwnomwonkkltorkuvxvqupltot
commit e0fed79ba0b4abde805f43493c2890af3749b05b
author Alpha Chen <alpha@kejadlen.dev>
date
parent oyyosywt
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