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)
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="|"):
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
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")
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():
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