From 92e9e63e53383a0be8efaef78f75c81669aa4824 Mon Sep 17 00:00:00 2001 From: Corban-Lee Date: Tue, 9 Jul 2024 18:47:55 +0100 Subject: [PATCH] dataclass implementation --- src/feed.py | 87 +++++++++++++++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/src/feed.py b/src/feed.py index 77e69ae..a947e37 100644 --- a/src/feed.py +++ b/src/feed.py @@ -1,7 +1,7 @@ import json import logging -from dataclasses import dataclass +from dataclasses import dataclass, field from datetime import datetime from abc import ABC, abstractmethod @@ -22,17 +22,29 @@ log = logging.getLogger(__name__) dumps = lambda _dict: json.dumps(_dict, indent=8) +@dataclass(slots=True) class RSSItem: - def __init__(self, title, link, description, pub_date, guid, image_url): - self.title = title - self.link = link - self.description = description - self.pub_date = pub_date - self.guid = guid - self.image_url = image_url - def __str__(self): - return self.title + guid: str + link: str + title: str + description: str + pub_date: datetime + image_url: str + + @classmethod + def from_parsed_entry(cls, entry): + guid = entry.get('id', None) or entry.get("guid", None) + link = entry.get('link', None) + title = entry.get('title', None) + description = entry.get('description', None) + + pub_date = entry.get('published_parsed', None) + pub_date = datetime(*pub_date[0:-2] if pub_date else None) + + image_url = entry.get("media_content", [{}])[0].get("url") + + return cls(guid, link, title, description, pub_date, image_url) def create_mutated_copy(self, mutators): pass @@ -112,17 +124,16 @@ class RSSItem: image_content = image_element.get("content") return image_content if validators.url(image_content) else None -import json +@dataclass(slots=True) class RSSFeed: - def __init__(self, title, link, description, language='en-gb', pub_date=None, last_build_date=None, image_href=None): - self.title = title - self.link = link - self.description = description - self.language = language - self.pub_date = pub_date - self.last_build_date = last_build_date - self.image_href = image_href - self.items = [] + + title: str + description: str + link: str + lang: str + last_build_date = datetime + image_href: str + items: list[RSSItem] = field(default_factory=list) def add_item(self, item: RSSItem): if not isinstance(item, RSSItem): @@ -130,36 +141,28 @@ class RSSFeed: self.items.append(item) - def __str__(self): - return self.guid - @classmethod - def from_parsed_feed(cls, parsed_feed): - title = parsed_feed.feed.get('title', 'No title') - link = parsed_feed.feed.get('link', 'No link') - description = parsed_feed.feed.get('description', 'No description') - language = parsed_feed.feed.get('language', 'en-gb') - pub_date = parsed_feed.feed.get('published', None) - last_build_date = parsed_feed.feed.get('updated', None) - image_href = parsed_feed.get("image", {}).get("href") + def from_parsed_feed(cls, pf: FeedParserDict): + title = pf.feed.get('title', None) + description = pf.feed.get('description', None) + link = pf.feed.get('link', None) + language = pf.feed.get('language', None) - feed = cls(title, link, description, language, pub_date, last_build_date, image_href) + last_build_date = pf.feed.get('updated_parsed', None) + last_build_date = datetime(*last_build_date[0:-2] if last_build_date else None) - for entry in parsed_feed.entries: - item_title = entry.get('title', 'No title') - item_link = entry.get('link', 'No link') - item_description = entry.get('description', 'No description') - item_pub_data = entry.get('published_parsed', None) - item_guid = entry.get('id', None) or entry.get("guid", None) - item_image_url = entry.get("media_content", [{}])[0].get("url") + image_href = pf.get("image", {}).get("href") - # item_published = datetime(*entry.published_parsed[0:-2]) if item_pub_data else None + feed = cls(title, description, link, language, last_build_date, image_href) - item = RSSItem(item_title, item_link, item_description, item_pub_data, item_guid, item_image_url) + log.debug(feed.items) + log.debug(type(feed.items)) + + for entry in pf.entries: + item = RSSItem.from_parsed_entry(entry) feed.add_item(item) feed.items.reverse() - return feed