]> git.rocketbowman.com Git - nom.git/commitdiff
fix nom show; start working on entrylist
authorKyle Bowman <kylebowman14@gmail.com>
Sun, 12 Jan 2025 22:06:20 +0000 (17:06 -0500)
committerKyle Bowman <kylebowman14@gmail.com>
Sun, 12 Jan 2025 22:06:20 +0000 (17:06 -0500)
src/nom/entry.py
src/nom/feed.py
src/nom/main.py
tests/data/entry.csv [new file with mode: 0644]
tests/test_entry.py [new file with mode: 0644]

index 7161925d8d4c4d9e3196438fd5734df34a471629..fdb34f94c503b4a2003fb6f1131bb29f62c851c8 100644 (file)
@@ -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)
index d192befd35182901666af7e7d0f3656f3323edd9..f2ee1245c91773a4f22abb8b6486a43a0dc5b86f 100644 (file)
@@ -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:
 
index d823ff7ae8ec04ea7a451d9de0d88a14dd57c375..a66f3146371adf4a23d0828e22cec527ac82832a 100644 (file)
@@ -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 (file)
index 0000000..3d7f348
--- /dev/null
@@ -0,0 +1,2 @@
+id_|title|url|date|feed_url|feed_alias|viewed|summary\r
+1|Kyle was here!|||||False|\r
diff --git a/tests/test_entry.py b/tests/test_entry.py
new file mode 100644 (file)
index 0000000..679d19b
--- /dev/null
@@ -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