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 <jonathan@nowandwren.com>
This commit is contained in:
Aaron Lichtman 2020-03-21 14:32:20 -05:00
parent d4a0895163
commit f4fca3e5a4
5 changed files with 54 additions and 1 deletions

View file

@ -93,3 +93,17 @@ Feature: Basic reading and writing to a journal
2013-06-10 15:40 Life is good. 2013-06-10 15:40 Life is good.
""" """
And we should get no error And we should get no error
# The input for this test is <SPACE><ENTER>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."

View file

@ -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: "|"

View file

@ -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.

View file

@ -234,6 +234,17 @@ class Journal:
self.entries = result 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): def new_entry(self, raw, date=None, sort=True):
"""Constructs a new entry from some raw text input. """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.""" If a date is given, it will parse and use this, otherwise scan for a date in the input first."""

View file

@ -174,6 +174,13 @@ def parse_args(args=None):
action="store_true", 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' # Handle '-123' as a shortcut for '-n 123'
num = re.compile(r"^-(\d+)$") num = re.compile(r"^-(\d+)$")
if args is None: if args is None:
@ -194,7 +201,7 @@ def guess_mode(args, config):
args.decrypt is not False args.decrypt is not False
or args.encrypt is not False or args.encrypt is not False
or args.export 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 compose = False
export = True export = True
@ -456,3 +463,7 @@ def run(manual_args=None):
journal.entries += other_entries journal.entries += other_entries
journal.sort() journal.sort()
journal.write() journal.write()
elif args.delete:
journal.prompt_delete_entries()
journal.write()