Skip to content

Commit e51b658

Browse files
Pavel.PrudkyPavel.Prudky
authored andcommitted
v0.1.2 ( minor bug fixes )
- better file save error handling - adding numerics to section names allowed regex - minor adjustments - adding file dump in case of write error
1 parent 941b8b9 commit e51b658

File tree

5 files changed

+29
-3
lines changed

5 files changed

+29
-3
lines changed

notes_app/controller/notes_controller.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import datetime
12
from notes_app.view.notes_view import NotesView
23

34

@@ -53,6 +54,9 @@ def save_file_data(self, data) -> None:
5354
with open(self.model.file_path, "w") as f:
5455
f.write(data)
5556
except Exception as exc:
57+
# another attempt at writing at least a dump file
58+
with open(f"__dump__{datetime.now():%Y_%m_%d_%H_%M_%S}", "w") as f:
59+
f.write(data)
5660
raise exc
5761

5862
self.model.update()

notes_app/view/notes_view.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,9 @@ def save_current_section_to_file(self):
722722
self.controller.save_file_data(data=raw_text_data)
723723

724724
except Exception as exc:
725-
self.show_error_bar(error_message=f"Error while saving file, details: {exc}")
725+
self.show_error_bar(
726+
error_message=f"Error while saving file, try recovering from dump file, details: {exc}"
727+
)
726728
return
727729

728730
def press_menu_item_save_file(self, *args):

tests/conftest.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
EMPTY_FILE_PATH = f"{TEST_OVERRIDE_DEFAULT_NOTES_FILE_DIR_PATH}/{EMPTY_FILE_NAME}"
2323
EMPTY_FILE_CONTENT = """"""
2424

25+
DUMP_FILES_PATH = f"{TEST_OVERRIDE_DEFAULT_NOTES_FILE_DIR_PATH}/"
2526

2627
defaults = Defaults()
2728
defaults.DEFAULT_NOTES_FILE_NAME = TEST_OVERRIDE_DEFAULT_NOTES_FILE_PATH
@@ -91,6 +92,12 @@ def delete_default_notes_empty_file():
9192
os.remove(EMPTY_FILE_PATH)
9293

9394

95+
def delete_dump_files():
96+
for file in os.listdir(DUMP_FILES_PATH):
97+
if file.startswith("__dump__"):
98+
os.remove(file)
99+
100+
94101
@pytest.fixture(autouse=True)
95102
def get_default_test_files_state():
96103
create_settings_file()
@@ -102,6 +109,7 @@ def get_default_test_files_state():
102109
delete_model_file()
103110
delete_default_notes_file()
104111
delete_default_notes_empty_file()
112+
delete_dump_files()
105113

106114

107115
@pytest.fixture

tests/test_unit_controller.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from time import sleep
44
from datetime import datetime
5-
from os import path, remove
5+
from os import path, remove, listdir, getcwd
66
from os.path import exists
77

88
from notes_app.defaults import Defaults
@@ -116,6 +116,18 @@ def test_save_file_data_handle_error(self, get_app):
116116
assert controller.model.file_size > 0 # exact file size differs between OS types
117117
assert datetime.fromtimestamp(controller.model.last_updated_on) >= _epoch_before
118118

119+
# assert the file gets correctly dumped to disk
120+
dump_files_to_evaluate = []
121+
for file in listdir(getcwd()):
122+
if file.startswith("__dump__"):
123+
dump_files_to_evaluate.append(file)
124+
125+
# assert only 1 dump file is written
126+
assert len(dump_files_to_evaluate) == 1
127+
with open(file=dump_files_to_evaluate[0], mode="r") as f:
128+
assert f.readlines() == ['<section=first> Quod equidem non reprehendo\n',
129+
'<section=second> Quis istum dolorem timet <section=third> !\n']
130+
119131
def test_get_screen(self, get_app):
120132
controller = get_app.controller
121133
assert isinstance(controller.get_screen(), NotesView)

tests/test_unit_view.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -886,7 +886,7 @@ def test_save_current_section_to_file_handle_error(self, get_app):
886886
)
887887

888888
assert isinstance(screen.snackbar, CustomSnackbar)
889-
assert screen.snackbar.text.startswith("Error while saving file, details:")
889+
assert screen.snackbar.text.startswith("Error while saving file, try recovering from dump file, details:")
890890

891891
def test_press_menu_item_save_file_is_not_external_update(self, get_app):
892892
# setting model._last_updated_on manually will guarantee model.external_update returns False

0 commit comments

Comments
 (0)