dataclass implementation

This commit is contained in:
Corban-Lee Jones 2024-07-09 18:47:55 +01:00
parent 1f199c36f9
commit 92e9e63e53

View File

@ -1,7 +1,7 @@
import json import json
import logging import logging
from dataclasses import dataclass from dataclasses import dataclass, field
from datetime import datetime from datetime import datetime
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
@ -22,17 +22,29 @@ log = logging.getLogger(__name__)
dumps = lambda _dict: json.dumps(_dict, indent=8) dumps = lambda _dict: json.dumps(_dict, indent=8)
@dataclass(slots=True)
class RSSItem: 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): guid: str
return self.title 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): def create_mutated_copy(self, mutators):
pass pass
@ -112,17 +124,16 @@ class RSSItem:
image_content = image_element.get("content") image_content = image_element.get("content")
return image_content if validators.url(image_content) else None return image_content if validators.url(image_content) else None
import json @dataclass(slots=True)
class RSSFeed: class RSSFeed:
def __init__(self, title, link, description, language='en-gb', pub_date=None, last_build_date=None, image_href=None):
self.title = title title: str
self.link = link description: str
self.description = description link: str
self.language = language lang: str
self.pub_date = pub_date last_build_date = datetime
self.last_build_date = last_build_date image_href: str
self.image_href = image_href items: list[RSSItem] = field(default_factory=list)
self.items = []
def add_item(self, item: RSSItem): def add_item(self, item: RSSItem):
if not isinstance(item, RSSItem): if not isinstance(item, RSSItem):
@ -130,36 +141,28 @@ class RSSFeed:
self.items.append(item) self.items.append(item)
def __str__(self):
return self.guid
@classmethod @classmethod
def from_parsed_feed(cls, parsed_feed): def from_parsed_feed(cls, pf: FeedParserDict):
title = parsed_feed.feed.get('title', 'No title') title = pf.feed.get('title', None)
link = parsed_feed.feed.get('link', 'No link') description = pf.feed.get('description', None)
description = parsed_feed.feed.get('description', 'No description') link = pf.feed.get('link', None)
language = parsed_feed.feed.get('language', 'en-gb') language = pf.feed.get('language', None)
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")
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: image_href = pf.get("image", {}).get("href")
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")
# 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.add_item(item)
feed.items.reverse() feed.items.reverse()
return feed return feed