Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow combinations of --change-time, --delete, and --edit while correctly counting the number of entries affected #1669

Merged
merged 37 commits into from
Mar 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
6eb7d85
WIP
wren Jan 15, 2023
dc6900e
Remove ipdb and remove search mode conditional that added explicit ta…
micahellison Jan 28, 2023
6e24769
Fix failing change-time test by using same method signature as base j…
micahellison Jan 28, 2023
bade98e
Fix user input mock - was not appropriately checking return value
micahellison Jan 28, 2023
c182395
Clean up controller
wren Feb 11, 2023
752e55d
Add currently-failing test conditions for count messages when changin…
micahellison Feb 15, 2023
d341f32
Don't show summary if no entries found and prevent extra line break w…
micahellison Feb 18, 2023
0c43920
Track found entry count and remove incorrect modified stat logic
micahellison Feb 18, 2023
2e06e3d
Track journal entry deletion consistently
micahellison Feb 18, 2023
1873f69
Remove unneeded exception when editor is empty and fix test that was …
micahellison Feb 18, 2023
80a4b07
Correct entry edit modified count test
micahellison Feb 18, 2023
742a16b
Track modification of entries with --change-time
micahellison Feb 18, 2023
cac3b43
Preserve existing behavior when editor is empty but make the message …
micahellison Feb 18, 2023
46b7a64
Reconcile tests with new error message when clearing editor in edit mode
micahellison Feb 18, 2023
8ee1632
Fix unit test that did not account for new short-circuit when display…
micahellison Feb 18, 2023
2be80a5
Fix other unit test that did not account for short-circuit
micahellison Feb 18, 2023
905a9ec
Update documentation on temporary files naming (#1673)
giuseppedandrea Feb 11, 2023
99c29f2
Update changelog [ci skip]
jrnl-bot Feb 11, 2023
3ec0839
Add documentation about information leaks in Vim/Neovim (#1674)
Granddave Feb 11, 2023
a708c15
Don't save templated journal entries if the received raw text is the …
Briscoooe Feb 11, 2023
c8d79d0
Update changelog [ci skip]
jrnl-bot Feb 11, 2023
14fd024
Add found/modified counts to edit tests
micahellison Feb 21, 2023
4ad9f58
Add tests for found count with -n equivalent argument
micahellison Feb 21, 2023
94d78f3
Test combinations of found/deleted messages when using --delete
micahellison Feb 21, 2023
0e70a57
Add tests for counting combinations of action arguments (change-time,…
micahellison Feb 21, 2023
9f44ab2
Remove extraneous comment in test
micahellison Mar 1, 2023
7eec231
Track added/deleted counts in a register in the Journal class instead…
micahellison Mar 1, 2023
eac0571
run poe format
micahellison Mar 1, 2023
9bca32b
Merge branch 'develop' into mode-actions-1639
wren Mar 4, 2023
e6a36a9
run format
wren Mar 4, 2023
85a759e
add encrypted to tests
wren Mar 4, 2023
33263f1
rename test file
wren Mar 4, 2023
e813ff7
add encrypted to tests for change-time
wren Mar 4, 2023
15a5b14
Merge branch 'develop' into mode-actions-1639
wren Mar 25, 2023
22409ff
fix merge conflict typo
wren Mar 25, 2023
64c0824
'write mode' -> 'append mode' in more places
wren Mar 25, 2023
24b962b
run format
wren Mar 25, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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