From 9a89e99a29e364a5e34b4ba2e992e1c870f855a9 Mon Sep 17 00:00:00 2001 From: Kyle Bowman Date: Sun, 26 Jan 2025 18:44:29 -0500 Subject: [PATCH] add tests and show --full vs urls (default) --- src/nom/base.py | 17 ++++++++++------- src/nom/main.py | 6 +++++- tests/test_cli.py | 15 ++++++++++++++- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/nom/base.py b/src/nom/base.py index dc5192c..4d0a78c 100644 --- a/src/nom/base.py +++ b/src/nom/base.py @@ -26,8 +26,11 @@ class NomListItem(BaseModel): self.__setattr__(key, val) # TODO: What if there's a pipe in one of the fields? - def to_str(self, delimiter: str ='|'): - return delimiter.join([str(v) for v in self.__dict__.values()]) + def to_str(self, fields: Optional[list[str]]=None, delimiter: str ='|'): + if not fields: + fields = [str(k) for k in self.__dict__.keys()] + lst = [str(v) for k,v in self.__dict__.items() if k in fields] + return delimiter.join(lst) def to_dict(self): return vars(self) @@ -66,9 +69,9 @@ class NomList(set): items = {item for item in self if predicate(item)} return self.__class__(items) - def to_stdout(self): - for item in self.items: - print(item.to_str(delimiter="\t")) + #def to_stdout(self, fields=[]): + # for item in self.items: + # print(item.to_str(fields=fields, delimiter="\t")) @classmethod def from_csv(cls, file: Path, delimiter="|"): @@ -97,12 +100,12 @@ class NomList(set): for item in self: writer.writerow(item.to_dict()) - def to_stdout(self, show_header=False, delimiter="|"): + def to_stdout(self, fields=None, show_header=False, delimiter="|"): if not self: raise NomError("There are no entries to write.") if show_header: headers = next(iter(self)).get_fieldnames() print(delimiter.join(headers)) for item in self: - print(item.to_str()) + print(item.to_str(fields=fields, delimiter=delimiter)) \ No newline at end of file diff --git a/src/nom/main.py b/src/nom/main.py index 3aafdbe..3336fd1 100644 --- a/src/nom/main.py +++ b/src/nom/main.py @@ -26,6 +26,7 @@ def cli(): entry_subparsers = entry_parser.add_subparsers(dest='entry_command', help='Dispatches entry commands.') entry_show_parser = entry_subparsers.add_parser('show', parents=[label_parser], help='Show entries.') entry_show_parser.set_defaults(func=handle_entry_show) + entry_show_parser.add_argument('--full', action='store_true', help="when specified, show the full entry data, not just the URLs.") entry_update_parser = entry_subparsers.add_parser('update', parents=[label_parser], help='update entry data.') entry_update_parser.set_defaults(func=handle_entry_update) entry_update_parser.add_argument('--update', dest="updates", nargs="*", help="Update values as key=value pairs") @@ -48,7 +49,10 @@ def handle_entry_show(args): elist = EntryList.from_csv(ENTRY_LIST) if args.label: elist = elist.select(lambda e: e.label in args.label) - elist.to_stdout(show_header=True) + if args.full: + elist.to_stdout(show_header=True) + else: + elist.to_stdout(fields=['url']) def handle_entry_update(args): if not ENTRY_LIST.exists(): diff --git a/tests/test_cli.py b/tests/test_cli.py index 6ee4f1a..556fb1a 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -19,11 +19,24 @@ def test_nom_feed_show(): def test_nom_entry_show(): argtest('entry show') +def test_nom_entry_show_full(): + argtest('entry show --full') + def test_nom_entry_show_one(): argtest('entry show 1') -def test_nom_entry_update(): +def test_nom_entry_update_no_elist(tmp_path): + ENTRY_LIST = tmp_path / "entry_list" / "default" + argtest('entry update') + +def test_nom_entry_update_from_feeds(): + argtest('entry update') + +def test_nom_entry_update_value(tmp_path): + ENTRY_LIST = tmp_path / "entry_list" / "default" + # Note: it looks like select selects None by default. argtest('entry update') + argtest('entry update 1 --update url="https://path/to/other.html') def test_nom_entry_update_val(): NomListItem.update = print("Don't really update") #This actually works, lol -- 2.39.5