From: Kyle Bowman Date: Sun, 12 Jan 2025 22:06:20 +0000 (-0500) Subject: fix nom show; start working on entrylist X-Git-Url: https://git.rocketbowman.com/?a=commitdiff_plain;h=dca6c8657c9cc00cfe4357f5ce62a608e133078a;p=nom.git fix nom show; start working on entrylist --- diff --git a/src/nom/entry.py b/src/nom/entry.py index 7161925..fdb34f9 100644 --- a/src/nom/entry.py +++ b/src/nom/entry.py @@ -1,14 +1,70 @@ +from csv import DictReader, DictWriter, excel_tab from dataclasses import dataclass +from pathlib import Path +from typing import Optional +from nom.utils import NomError -# TODO: This should probably use Pydantic. +# TODO: Use proper types, not strings. (Pydantic?) @dataclass -class Entry: +class EntryListItem: + id_: str title: str - url: str - updated: str # TODO: Make this datetime when I add filters - # summary: str # TODO: Add this when you feel like stripping HTML + url: Optional[str] = None + date: Optional[str] = "test" + feed_url: Optional[str] = None + feed_alias: Optional[str] = None + viewed: Optional[bool] = False + summary: Optional[str] = None # TODO: Add this when you feel like stripping HTML # TODO: What if there's a pipe in one of the fields? - def write_line(self, delimiter: str ='|'): - return delimiter.join([self.title, self.url, self.updated]) \ No newline at end of file + def to_str(self, delimiter: str ='|'): + # values = [value for value in self.__dict__.values()] + return delimiter.join([self.title, self.url, self.date]) + + def to_dict(self): + return self.__dict__ + + @classmethod + def from_dict(cls, dct: dict): + return cls(**dct) + + +class EntryList: + + def __init__(self, delimiter='|'): + self.entries : list[EntryListItem] = [] + self.dicts : list[dict] = [] + self.delimiter = delimiter + self.fieldnames = EntryListItem("","").to_dict().keys() + + def add_entry(self, entry): + self.entries.append(entry) + + # TODO: "Append" doesn't feel right. + def append_feed(self,feed): + pass + + def from_file(self, file: Path): + pass + + def to_file(self, file: Path): + if not self.dicts: + raise NomError("There are no entries to write.") + + with open(file, "w") as f: + dialect = excel_tab + dialect.delimiter="|" + writer = DictWriter(f, fieldnames=self.fieldnames, dialect=dialect) + writer.writeheader() + writer.writerows(self.dicts) + + +if __name__ == "__main__": + dct = dict(id_="1", title="Entry One", url="https://path/to/entry1.html") + path=Path("/home/kyle/projects/nom/tests/data/entry.csv") + elist = EntryList() + entry = EntryListItem.from_dict(dct) + elist.add_entry(entry) + elist.dicts = [entry.__dict__ for entry in elist.entries] + elist.to_file(path) diff --git a/src/nom/feed.py b/src/nom/feed.py index d192bef..f2ee124 100644 --- a/src/nom/feed.py +++ b/src/nom/feed.py @@ -5,7 +5,7 @@ from typing import Optional import feedparser import requests -from nom.entry import Entry +from nom.entry import EntryListItem from nom.utils import url2filename @@ -16,8 +16,8 @@ class Feed: self.d = d self.name = d.feed.title self.url = url # how is this different from d.feed.link? - self.entries : list[Entry] = [ - Entry( + self.entries : list[EntryListItem] = [ + EntryListItem( e.title, e.link, e.updated @@ -27,7 +27,7 @@ class Feed: def to_stdout(self, file: Optional[Path]=None): for entry in self.entries: if entry: - print(entry.write_line()) + print(entry.to_str()) class FeedList: diff --git a/src/nom/main.py b/src/nom/main.py index d823ff7..a66f314 100644 --- a/src/nom/main.py +++ b/src/nom/main.py @@ -1,7 +1,6 @@ from pathlib import Path from nom.utils import url2filename, NomError -from nom.entry import Entry from nom.feed import Feed, FeedList from nom.cli import cli diff --git a/tests/data/entry.csv b/tests/data/entry.csv new file mode 100644 index 0000000..3d7f348 --- /dev/null +++ b/tests/data/entry.csv @@ -0,0 +1,2 @@ +id_|title|url|date|feed_url|feed_alias|viewed|summary +1|Kyle was here!|||||False| diff --git a/tests/test_entry.py b/tests/test_entry.py new file mode 100644 index 0000000..679d19b --- /dev/null +++ b/tests/test_entry.py @@ -0,0 +1,25 @@ +from tempfile import NamedTemporaryFile + +from nom.entry import EntryListItem + +e1=EntryListItem( + id_="1", + title="Entry One", + url="https://path/to/entry1.html", + date="dummy-date", + feed_url="https://path/to/feed1.xml", + feed_alias=None, + viewed=False, + summary="Summary of entry one." +) + + +def test_eli_constructors(): + assert EntryListItem.from_dict(e1.to_dict()) == e1 + + #with NamedTemporaryFile(delete_on_close=False) as tmp_file: + # to_file(tmp_file.name, data) + # tmp_file.close() + # with open(tmp_file.name, 'r') as f: + # reader = csv.DictReader(f, delimiter='|') + # rows = list(reader) \ No newline at end of file