mirror of
https://github.com/jrnl-org/jrnl.git
synced 2025-06-27 21:16:14 +02:00
Only read text files that look like entries when opening folder journal (#1697)
* Add text file that should be ignored to basic test folder journal. Makes tons of tests fail * Add additional files that should be ignored by FolderJournal * Ignore all files in folder journal except year/month/day.txt * Completely remake get_files in FolderJournal: - move get_files into FolderJournal class and add underscore prefix - create iterables to get for year/month folders and day files - make year/month/day file reading strict: only exact expected months and days out of all possible months and days * Restore accidentally-deleted self.sort() line * Use match instead of string comparison to be os-agnostic * Explicitly declare static methods * Filter with glob first for max performance * Explicitly check for valid dates in FolderJournal and add unit test * Remove unneeded jrnl import * Clean up method comment and add type hints * Add is_valid_date unit test * Elucidate comment Co-authored-by: Jonathan Wren <jonathan@nowandwren.com>
This commit is contained in:
parent
88aa2491b0
commit
95836a7dd1
7 changed files with 153 additions and 16 deletions
|
@ -0,0 +1,4 @@
|
|||
[2022-03-02 9:25:00 AM] This file should be ignored (month)
|
||||
This text file is in a folder journal's month directory ("2020/09"), but it's not in the file name format used by jrnl for folder journal entries, so it should be ignored.
|
||||
|
||||
This file should not ever appear in a test.
|
|
@ -0,0 +1,4 @@
|
|||
[2022-03-02 9:25:00 AM] This file should be ignored (year)
|
||||
This text file is in a folder journal's year directory ("2020"), but it's not in the file name format used by jrnl for folder journal entries, so it should be ignored.
|
||||
|
||||
This file should not ever appear in a test.
|
4
tests/data/journals/basic_folder/should-be-ignored.txt
Normal file
4
tests/data/journals/basic_folder/should-be-ignored.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
[2022-03-02 9:25:00 AM] This file should be ignored (root)
|
||||
This text file is in a folder journal's root directory, but it's not in the file name format used by jrnl for folder journal entries, so it should be ignored.
|
||||
|
||||
This file should not ever appear in a test.
|
59
tests/unit/test_journals_folder_journal.py
Normal file
59
tests/unit/test_journals_folder_journal.py
Normal file
|
@ -0,0 +1,59 @@
|
|||
# Copyright © 2012-2023 jrnl contributors
|
||||
# License: https://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
import pathlib
|
||||
from unittest import mock
|
||||
|
||||
import pytest
|
||||
|
||||
from jrnl.journals.FolderJournal import Folder
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"inputs_and_outputs",
|
||||
[
|
||||
[
|
||||
"/2020/01",
|
||||
["02.txt", "03.txt", "31.txt"],
|
||||
["/2020/01/02.txt", "/2020/01/03.txt", "/2020/01/31.txt"],
|
||||
],
|
||||
[
|
||||
"/2020/02", # leap year
|
||||
["02.txt", "03.txt", "28.txt", "29.txt", "31.txt", "39.txt"],
|
||||
[
|
||||
"/2020/02/02.txt",
|
||||
"/2020/02/03.txt",
|
||||
"/2020/02/28.txt",
|
||||
"/2020/02/29.txt",
|
||||
],
|
||||
],
|
||||
[
|
||||
"/2100/02", # not a leap year
|
||||
["01.txt", "28.txt", "29.txt", "39.txt"],
|
||||
["/2100/02/01.txt", "/2100/02/28.txt"],
|
||||
],
|
||||
[
|
||||
"/2023/04",
|
||||
["29.txt", "30.txt", "31.txt", "39.txt"],
|
||||
["/2023/04/29.txt", "/2023/04/30.txt"],
|
||||
],
|
||||
],
|
||||
)
|
||||
def test_get_day_files_expected_filtering(inputs_and_outputs):
|
||||
year_month_path, glob_filenames, expected_output = inputs_and_outputs
|
||||
|
||||
year_month_path = pathlib.Path(year_month_path)
|
||||
|
||||
glob_files = map(lambda x: year_month_path / x, glob_filenames)
|
||||
expected_output = list(map(lambda x: str(pathlib.PurePath(x)), expected_output))
|
||||
|
||||
with (
|
||||
mock.patch("pathlib.Path.glob", return_value=glob_files),
|
||||
mock.patch.object(pathlib.Path, "is_file", return_value=True),
|
||||
):
|
||||
actual_output = list(Folder._get_day_files(year_month_path))
|
||||
actual_output.sort()
|
||||
|
||||
expected_output.sort()
|
||||
|
||||
assert actual_output == expected_output
|
|
@ -3,6 +3,8 @@
|
|||
|
||||
import datetime
|
||||
|
||||
import pytest
|
||||
|
||||
from jrnl import time
|
||||
|
||||
|
||||
|
@ -20,3 +22,23 @@ def test_default_minute_is_added():
|
|||
default_minute=30,
|
||||
bracketed=False,
|
||||
) == datetime.datetime(2020, 6, 20, 0, 30)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"inputs",
|
||||
[
|
||||
[2000, 2, 29, True],
|
||||
[2023, 1, 0, False],
|
||||
[2023, 1, 1, True],
|
||||
[2023, 4, 31, False],
|
||||
[2023, 12, 31, True],
|
||||
[2023, 12, 32, False],
|
||||
[2023, 13, 1, False],
|
||||
[2100, 2, 27, True],
|
||||
[2100, 2, 28, True],
|
||||
[2100, 2, 29, False],
|
||||
],
|
||||
)
|
||||
def test_is_valid_date(inputs):
|
||||
year, month, day, expected_result = inputs
|
||||
assert time.is_valid_date(year, month, day) == expected_result
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue