diff --git a/jrnl/controller.py b/jrnl/controller.py index d07c857a..52cfd8db 100644 --- a/jrnl/controller.py +++ b/jrnl/controller.py @@ -79,10 +79,6 @@ def run(args: "Namespace"): append_mode(**kwargs) return - # Get stats now for summary later - old_stats = _get_predit_stats(journal) - logging.debug(f"old_stats: {old_stats}") - # If not append mode, then we're in search mode (only 2 modes exist) search_mode(**kwargs) entries_found_count = len(journal) @@ -92,7 +88,7 @@ def run(args: "Namespace"): _perform_actions_on_search_results(**kwargs) if entries_found_count != 0 and _has_action_args(args): - _print_edited_summary(journal, old_stats) + _print_changed_counts(journal) else: # display only occurs if no other action occurs _display_search_results(**kwargs) @@ -188,11 +184,7 @@ def search_mode(args: "Namespace", journal: "Journal", **kwargs) -> None: logging.debug("Search mode: starting") # If no search args, then return all results (don't filter anything) - if ( - not _has_search_args(args) - and not _has_display_args(args) - and not args.text - ): + if not _has_search_args(args) and not _has_display_args(args) and not args.text: logging.debug("Search mode: has no search args") return @@ -281,9 +273,7 @@ def _print_entries_found_count(count: int, args: "Namespace") -> None: logging.debug("Printing general summary") my_msg = ( - MsgText.EntryFoundCountSingular - if count == 1 - else MsgText.EntryFoundCountPlural + MsgText.EntryFoundCountSingular if count == 1 else MsgText.EntryFoundCountPlural ) print_msg(Message(my_msg, MsgStyle.NORMAL, {"num": count})) @@ -318,7 +308,9 @@ def _edit_search_results( edited = get_text_from_editor(config, journal.editable_str()) except JrnlException as e: if e.has_message_text(MsgText.NoTextReceived): - raise JrnlException(Message(MsgText.NoEditsReceivedJournalNotDeleted, MsgStyle.WARNING)) + raise JrnlException( + Message(MsgText.NoEditsReceivedJournalNotDeleted, MsgStyle.WARNING) + ) else: raise e @@ -330,14 +322,8 @@ def _edit_search_results( journal.write() -def _print_edited_summary( - journal: "Journal", old_stats: dict[str, int], **kwargs -) -> None: - stats = { - "added": len(journal) - old_stats["count"], - "deleted": old_stats["count"] - len(journal), - "modified": len([e for e in journal.entries if e.modified]), - } +def _print_changed_counts(journal: "Journal", **kwargs) -> None: + stats = journal.get_change_counts() msgs = [] if stats["added"] > 0: @@ -380,7 +366,7 @@ def _delete_search_results( entries_to_delete = journal.prompt_action_entries(MsgText.DeleteEntryQuestion) journal.entries = old_entries - + if entries_to_delete: journal.delete_entries(entries_to_delete) diff --git a/jrnl/journals/FolderJournal.py b/jrnl/journals/FolderJournal.py index 2eca0978..88fa21e1 100644 --- a/jrnl/journals/FolderJournal.py +++ b/jrnl/journals/FolderJournal.py @@ -91,6 +91,7 @@ class Folder(Journal): 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, entries_to_change: list["Entry"]) -> None: """Changes entry dates to given date.""" @@ -115,4 +116,6 @@ class Folder(Journal): # 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 diff --git a/jrnl/journals/Journal.py b/jrnl/journals/Journal.py index fb5d9e33..7ca93daf 100644 --- a/jrnl/journals/Journal.py +++ b/jrnl/journals/Journal.py @@ -51,6 +51,10 @@ class Journal: 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) @@ -298,6 +302,7 @@ class Journal: """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, entries_to_change: list[Entry] @@ -378,8 +383,24 @@ class Journal: # 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 diff --git a/tests/bdd/features/action-combinations.feature b/tests/bdd/features/action-combinations.feature index 2fec89e2..f7a06851 100644 --- a/tests/bdd/features/action-combinations.feature +++ b/tests/bdd/features/action-combinations.feature @@ -36,10 +36,8 @@ Feature: Test combinations of edit, change-time, and delete Y Then the editor should have been called And the error output should contain "3 entries found" - # 2 deleted minus 1 for the 1 added - And the error output should contain "1 entry deleted" - # Added entry counts as modified because it replaced a deleted entry - And the error output should contain "1 entry modified" + 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 @@ -65,7 +63,7 @@ Feature: Test combinations of edit, change-time, and delete 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 "2 entries modified" + 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. @@ -91,11 +89,9 @@ Feature: Test combinations of edit, change-time, and delete Y N Then the error output should contain "3 entries found" - # deleted = 2 deleted minus 1 added by edit = 1 - # modified = 2 modified by change-time minus 1 of those deleted plus 1 of the deleted replaced by edit = 2 - # added = 1 added minus 2 deleted = none - And the error output should contain "1 entry deleted" - And the error output should contain "2 entries modified" + 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.