Skip to content

Commit

Permalink
Allow combinations of --change-time, --delete, and --edit while…
Browse files Browse the repository at this point in the history
… correctly counting the number of entries affected (jrnl-org#1669)

* Remove search mode conditional that added explicit tag search behavior
* Fix failing change-time test by using same method signature as base journal class
* Fix user input mock - was not appropriately checking return value
* Clean up controller
  - streamline `run` function in `controller.py`
  - add debug logging
  - fix unnecessary import of Journal class (only needed for typing)
  - standardize summary display across different actions
* Add currently-failing test conditions for count messages when changing time and deleting
* Don't show summary if no entries found and prevent extra line break when no entries found by short-circuiting display method
* Track found entry count and remove incorrect modified stat logic
* Track journal entry deletion consistently
* Remove unneeded exception when editor is empty and fix test that was testing incorrect message
* Correct entry edit modified count test
* Track modification of entries with --change-time
* Preserve existing behavior when editor is empty but make the message more clear
* Reconcile tests with new error message when clearing editor in edit mode
* Add found/modified counts to edit tests
* Add tests for found count with -n equivalent argument
* Test combinations of found/deleted messages when using --delete
* Add tests for counting combinations of action arguments (change-time, edit, delete) and for change-time counts. Some are failing and should be investigated
* Remove extraneous comment in test
* Track added/deleted counts in a register in the Journal class instead of attempting to infer it via controller counting
* Add encrypted to more tests
* Fix merge conflict typo
* Change 'write mode' -> 'append mode' in more places

---------

Co-authored-by: Micah Jerome Ellison <[email protected]>
  • Loading branch information
wren and micahellison authored Mar 25, 2023
1 parent b3c6f90 commit 3c923ae
Show file tree
Hide file tree
Showing 18 changed files with 470 additions and 261 deletions.
323 changes: 153 additions & 170 deletions jrnl/controller.py

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion jrnl/editor.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ def get_text_from_stdin() -> str:
try:
raw = sys.stdin.read()
except KeyboardInterrupt:
logging.error("Write mode: keyboard interrupt")
logging.error("Append mode: keyboard interrupt")
raise JrnlException(
Message(MsgText.KeyboardInterruptMsg, MsgStyle.ERROR_ON_NEW_LINE),
Message(MsgText.JournalNotSaved, MsgStyle.WARNING),
Expand Down
4 changes: 4 additions & 0 deletions jrnl/exception.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

if TYPE_CHECKING:
from jrnl.messages import Message
from jrnl.messages import MsgText


class JrnlException(Exception):
Expand All @@ -18,3 +19,6 @@ def __init__(self, *messages: "Message"):
def print(self) -> None:
for msg in self.messages:
print_msg(msg)

def has_message_text(self, message_text: "MsgText"):
return any([m.text == message_text for m in self.messages])
8 changes: 6 additions & 2 deletions jrnl/journals/FolderJournal.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,17 +91,19 @@ def delete_entries(self, entries_to_delete: list["Entry"]) -> None:
for entry in entries_to_delete:
self.entries.remove(entry)
self._diff_entry_dates.append(entry.date)
self.deleted_entry_count += 1

def change_date_entries(self, date: str) -> None:
def change_date_entries(self, date: str, entries_to_change: list["Entry"]) -> None:
"""Changes entry dates to given date."""

date = time.parse(date)

self._diff_entry_dates.append(date)

for entry in self.entries:
for entry in entries_to_change:
self._diff_entry_dates.append(entry.date)
entry.date = date
entry.modified = True

def parse_editable_str(self, edited: str) -> None:
"""Parses the output of self.editable_str and updates its entries."""
Expand All @@ -114,4 +116,6 @@ def parse_editable_str(self, edited: str) -> None:
# modified and how many got deleted later.
for entry in mod_entries:
entry.modified = not any(entry == old_entry for old_entry in self.entries)

self.increment_change_counts_by_edit(mod_entries)
self.entries = mod_entries
30 changes: 27 additions & 3 deletions jrnl/journals/Journal.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ def __init__(self, name="default", **kwargs):
self.entries = []
self.encryption_method = None

# Track changes to journal in session. Modified is tracked in Entry
self.added_entry_count = 0
self.deleted_entry_count = 0

def __len__(self):
"""Returns the number of entries"""
return len(self.entries)
Expand Down Expand Up @@ -305,13 +309,17 @@ def delete_entries(self, entries_to_delete: list[Entry]) -> None:
"""Deletes specific entries from a journal."""
for entry in entries_to_delete:
self.entries.remove(entry)
self.deleted_entry_count += 1

def change_date_entries(self, date: datetime.datetime | None) -> None:
def change_date_entries(
self, date: datetime.datetime, entries_to_change: list[Entry]
) -> None:
"""Changes entry dates to given date."""
date = time.parse(date)

for entry in self.entries:
for entry in entries_to_change:
entry.date = date
entry.modified = True

def prompt_action_entries(self, msg: MsgText) -> list[Entry]:
"""Prompts for action for each entry in a journal, using given message.
Expand Down Expand Up @@ -383,8 +391,24 @@ def parse_editable_str(self, edited: str) -> None:
# modified and how many got deleted later.
for entry in mod_entries:
entry.modified = not any(entry == old_entry for old_entry in self.entries)

self.increment_change_counts_by_edit(mod_entries)

self.entries = mod_entries

def increment_change_counts_by_edit(self, mod_entries: Entry) -> None:
if len(mod_entries) > len(self.entries):
self.added_entry_count += len(mod_entries) - len(self.entries)
else:
self.deleted_entry_count += len(self.entries) - len(mod_entries)

def get_change_counts(self) -> dict:
return {
"added": self.added_entry_count,
"deleted": self.deleted_entry_count,
"modified": len([e for e in self.entries if e.modified]),
}


class LegacyJournal(Journal):
"""Legacy class to support opening journals formatted with the jrnl 1.x
Expand Down Expand Up @@ -444,7 +468,7 @@ def open_journal(journal_name: str, config: dict, legacy: bool = False) -> Journ
If legacy is True, it will open Journals with legacy classes build for
backwards compatibility with jrnl 1.x
"""
logging.debug("open_journal start")
logging.debug(f"open_journal '{journal_name}'")
validate_journal_name(journal_name, config)
config = config.copy()
config["journal"] = expand_path(config["journal"])
Expand Down
8 changes: 8 additions & 0 deletions jrnl/messages/MsgText.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,14 @@ def __str__(self) -> str:
https://jrnl.sh/en/stable/external-editors/
"""

NoEditsReceivedJournalNotDeleted = """
No text received from editor. Were you trying to delete all the entries?
This seems a bit drastic, so the operation was cancelled.
To delete all entries, use the --delete option.
"""

NoEditsReceived = "No edits to save, because nothing was changed"

NoTextReceived = """
Expand Down
108 changes: 108 additions & 0 deletions tests/bdd/features/actions.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# Copyright © 2012-2023 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html

Feature: Test combinations of edit, change-time, and delete

Scenario Outline: --change-time with --edit modifies selected entries
Given we use the config "<config_file>"
And we write nothing to the editor if opened
And we use the password "test" if prompted
When we run "jrnl --change-time '2022-04-23 10:30' --edit" and enter
Y
N
Y
Then the error output should contain "No text received from editor. Were you trying to delete all the entries?"
And the editor should have been called
When we run "jrnl -99 --short"
Then the output should be
2020-08-31 14:32 A second entry in what I hope to be a long series.
2022-04-23 10:30 Entry the first.
2022-04-23 10:30 The third entry finally after weeks without writing.

Examples: Configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_encrypted.yaml |
# | basic_dayone.yaml | @todo

Scenario Outline: --delete with --edit deletes selected entries
Given we use the config "<config_file>"
And we append to the editor if opened
[2023-02-21 10:32] Here is a new entry
And we use the password "test" if prompted
When we run "jrnl --delete --edit" and enter
Y
N
Y
Then the editor should have been called
And the error output should contain "3 entries found"
And the error output should contain "2 entries deleted"
And the error output should contain "1 entry added"
When we run "jrnl -99 --short"
Then the error output should contain "2 entries found"
And the output should be
2020-08-31 14:32 A second entry in what I hope to be a long series.
2023-02-21 10:32 Here is a new entry

Examples: Configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_encrypted.yaml |
# | basic_dayone.yaml | @todo

Scenario Outline: --change-time with --delete affects appropriate entries
Given we use the config "<config_file>"
And we use the password "test" if prompted
# --change-time is asked first, then --delete
When we run "jrnl --change-time '2022-04-23 10:30' --delete" and enter
N
N
Y
Y
N
N
Then the error output should contain "3 entries found"
And the error output should contain "1 entry deleted"
And the error output should contain "1 entry modified"
When we run "jrnl -99 --short"
Then the output should be
2020-08-31 14:32 A second entry in what I hope to be a long series.
2022-04-23 10:30 The third entry finally after weeks without writing.

Examples: Configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_encrypted.yaml |
# | basic_dayone.yaml | @todo

Scenario Outline: Combining --change-time and --delete and --edit affects appropriate entries
Given we use the config "<config_file>"
And we append to the editor if opened
[2023-02-21 10:32] Here is a new entry
And we use the password "test" if prompted
# --change-time is asked first, then --delete, then --edit
When we run "jrnl --change-time '2022-04-23 10:30' --delete --edit" and enter
N
Y
Y
Y
Y
N
Then the error output should contain "3 entries found"
And the error output should contain "2 entries deleted"
And the error output should contain "1 entry modified" # only 1, because the other was deleted
And the error output should contain "1 entry added" # by edit
When we run "jrnl -99 --short"
Then the output should be
2022-04-23 10:30 The third entry finally after weeks without writing.
2023-02-21 10:32 Here is a new entry

Examples: Configs
| config_file |
| basic_onefile.yaml |
| basic_folder.yaml |
| basic_encrypted.yaml |
# | basic_dayone.yaml | @todo
Loading

0 comments on commit 3c923ae

Please sign in to comment.