From f4fca3e5a431d3a94e466670c4db871e3349bd6d Mon Sep 17 00:00:00 2001 From: Aaron Lichtman Date: Sat, 21 Mar 2020 14:32:20 -0500 Subject: [PATCH] Add --delete for interactive removal of entries (#698) * Add --delete for interactive removal of entries * Add inquirer dependency for fancy prompting * Fix some minor style issues * Fix #434 * Use PyInquirer instead of inquirer for Windows compatibility * Add WIP (broken) test * Change deletion interface to be more basic * Update environment.py Co-authored-by: Jonathan Wren --- features/core.feature | 14 ++++++++++++++ features/data/configs/deletion.yaml | 12 ++++++++++++ features/data/journals/deletion.journal | 5 +++++ jrnl/Journal.py | 11 +++++++++++ jrnl/cli.py | 13 ++++++++++++- 5 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 features/data/configs/deletion.yaml create mode 100644 features/data/journals/deletion.journal diff --git a/features/core.feature b/features/core.feature index df214494..c3399da5 100644 --- a/features/core.feature +++ b/features/core.feature @@ -93,3 +93,17 @@ Feature: Basic reading and writing to a journal 2013-06-10 15:40 Life is good. """ And we should get no error + + # The input for this test is y + Scenario: --delete flag allows deletion of single entry + Given we use the config "deletion.yaml" + When we run "jrnl --delete" + And we type " " + And we type + """ + + y + """ + When we run "jrnl -on 2019-10-29 -s" + Then the output should not contain "2019-10-29 11:11 First entry." + diff --git a/features/data/configs/deletion.yaml b/features/data/configs/deletion.yaml new file mode 100644 index 00000000..d4155260 --- /dev/null +++ b/features/data/configs/deletion.yaml @@ -0,0 +1,12 @@ +default_hour: 9 +default_minute: 0 +editor: "" +encrypt: false +highlight: true +journals: + default: features/journals/deletion.journal +linewrap: 80 +tagsymbols: "@" +template: false +timeformat: "%Y-%m-%d %H:%M" +indent_character: "|" diff --git a/features/data/journals/deletion.journal b/features/data/journals/deletion.journal new file mode 100644 index 00000000..c0fa689d --- /dev/null +++ b/features/data/journals/deletion.journal @@ -0,0 +1,5 @@ +[2019-10-29 11:11] First entry. + +[2019-10-29 11:11] Second entry. + +[2019-10-29 11:13] Third entry. \ No newline at end of file diff --git a/jrnl/Journal.py b/jrnl/Journal.py index 3302cfdd..2eaf8705 100644 --- a/jrnl/Journal.py +++ b/jrnl/Journal.py @@ -234,6 +234,17 @@ class Journal: self.entries = result + def prompt_delete_entries(self): + """Prompts for deletion of entries in a journal.""" + print("Confirm each entry you want to delete [N/y]:") + to_delete: List[Entry] = [] + for entry in self.entries: + response = input("jrnl: Delete entry '{}'? ".format(entry.pprint(short=True))) + if response == "y": + to_delete.append(entry) + + self.entries = [entry for entry in self.entries if entry not in to_delete] + def new_entry(self, raw, date=None, sort=True): """Constructs a new entry from some raw text input. If a date is given, it will parse and use this, otherwise scan for a date in the input first.""" diff --git a/jrnl/cli.py b/jrnl/cli.py index 408f3518..52ca8c19 100644 --- a/jrnl/cli.py +++ b/jrnl/cli.py @@ -174,6 +174,13 @@ def parse_args(args=None): action="store_true", ) + exporting.add_argument( + "--delete", + dest="delete", + action="store_true", + help="Opens an interactive interface for deleting entries.", + ) + # Handle '-123' as a shortcut for '-n 123' num = re.compile(r"^-(\d+)$") if args is None: @@ -194,7 +201,7 @@ def guess_mode(args, config): args.decrypt is not False or args.encrypt is not False or args.export is not False - or any((args.short, args.tags, args.edit)) + or any((args.short, args.tags, args.edit, args.delete)) ): compose = False export = True @@ -456,3 +463,7 @@ def run(manual_args=None): journal.entries += other_entries journal.sort() journal.write() + + elif args.delete: + journal.prompt_delete_entries() + journal.write()