fixup alichtman's implementation

This commit is contained in:
dbxnr 2020-02-12 05:15:47 +00:00
parent 972a00f478
commit 9bbc38b7ce
5 changed files with 46 additions and 26 deletions

View file

@ -71,17 +71,3 @@ Feature: Basic reading and writing to a journal
Given we use the config "basic.yaml" Given we use the config "basic.yaml"
When we run "jrnl -on 2013-06-10 -s" When we run "jrnl -on 2013-06-10 -s"
Then the output should be "2013-06-10 15:40 Life is good." Then the output should be "2013-06-10 15:40 Life is good."
# 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,15 @@
#!/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 itertools import filterfalse
from jrnl import Entry
from jrnl import util
from jrnl import time
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -111,7 +113,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):
@ -249,20 +252,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")
# 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

@ -173,7 +173,12 @@ 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.') exporting.add_argument(
"--delete",
dest="delete",
action="store_true",
help="Opens an interactive interface for deleting entries.",
)
return parser.parse_args(args) return parser.parse_args(args)

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):