Interactive delete (#850)

* fixup alichtman's implementation
* cleanup imports

Co-authored-by: Aaron Lichtman <aaronlichtman@gmail.com>
Co-authored-by: Jonathan Wren <jonathan@nowandwren.com>
This commit is contained in:
dbxnr 2020-03-21 20:22:30 +00:00
parent f4fca3e5a4
commit 15429d4f61
4 changed files with 36 additions and 25 deletions

View file

@ -93,17 +93,3 @@ 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."

20
features/delete.feature Normal file
View file

@ -0,0 +1,20 @@
Feature: Delete entries from journal
Scenario: --delete flag allows deletion of single entry
Given we use the config "deletion.yaml"
When we run "jrnl -n 1"
Then the output should contain
"""
2019-10-29 11:13 Third entry.
"""
When we run "jrnl --delete" and enter
"""
N
N
Y
"""
When we run "jrnl -n 1"
Then the output should contain
"""
2019-10-29 11:11 Second entry.
"""

View file

@ -1,13 +1,12 @@
#!/usr/bin/env python #!/usr/bin/env python
from . import Entry import logging
from . import util
from . import time
import os import os
import sys import sys
import re import re
from datetime import datetime from datetime import datetime
import logging from jrnl import Entry, util, time
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -111,7 +110,8 @@ class Journal:
def _load(self, filename): def _load(self, filename):
raise NotImplementedError raise NotImplementedError
def _store(self, filename, text): @classmethod
def _store(filename, text):
raise NotImplementedError raise NotImplementedError
def _parse(self, journal_txt): def _parse(self, journal_txt):
@ -236,21 +236,26 @@ class Journal:
def prompt_delete_entries(self): def prompt_delete_entries(self):
"""Prompts for deletion of entries in a journal.""" """Prompts for deletion of entries in a journal."""
print("Confirm each entry you want to delete [N/y]:")
to_delete: List[Entry] = [] to_delete = []
def ask_delete(entry):
return util.yesno(
f"Delete entry '{entry.pprint(short=True)}'?", default=False,
)
for entry in self.entries: for entry in self.entries:
response = input("jrnl: Delete entry '{}'? ".format(entry.pprint(short=True))) if ask_delete(entry):
if response == "y":
to_delete.append(entry) to_delete.append(entry)
self.entries = [entry for entry in self.entries if entry not in to_delete] self.entries = [entry for entry in self.entries if entry not in to_delete]
self.write()
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."""
raw = raw.replace("\\n ", "\n").replace("\\n", "\n") raw = raw.replace("\\n ", "\n").replace("\\n", "\n")
starred = False
# Split raw text into title and body # Split raw text into title and body
sep = re.search(r"\n|[?!.]+ +\n?", raw) sep = re.search(r"\n|[?!.]+ +\n?", raw)
first_line = raw[: sep.end()].strip() if sep else raw first_line = raw[: sep.end()].strip() if sep else raw

View file

@ -112,7 +112,7 @@ def set_keychain(journal_name, password):
def yesno(prompt, default=True): def yesno(prompt, default=True):
prompt = f"{prompt.strip()} {'[Y/n]' if default else '[y/N]'} " prompt = f"{prompt.strip()} {'[Y/n]' if default else '[y/N]'} "
response = input(prompt) response = input(prompt)
return {"y": True, "n": False}.get(response.lower(), default) return {"y": True, "n": False}.get(response.lower().strip(), default)
def load_config(config_path): def load_config(config_path):