diff --git a/docs/journal-types.md b/docs/journal-types.md index 31806572..65efc143 100644 --- a/docs/journal-types.md +++ b/docs/journal-types.md @@ -28,9 +28,10 @@ you have an entry on May 5th, 2021 in a folder journal at `~/folderjournal`, it be located in: `~/folderjournal/2021/05/05.txt` !!! note -When creating a new folder journal, you will need to create the folder before running -`jrnl`. Otherwise, when you run `jrnl` for the first time, it will assume that you -are creating a single file journal instead, and it will create a file at that path. +Creating a new folder journal can be done in two ways: + +* Create a folder with the name of the journal before running `jrnl`. Otherwise, when you run `jrnl` for the first time, it will assume that you are creating a single file journal instead, and it will create a file at that path. +* Create a new journal in your [config_file](advanced.md) and end the path with a ``/`` (on a POSIX system like Linux or MacOSX) or a ``\`` (on a Windows system). The folder will be created automatically if it doesn't exist. !!! note Folder journals can't be encrypted. diff --git a/jrnl/Journal.py b/jrnl/Journal.py index 987c5426..5a2f0b5a 100644 --- a/jrnl/Journal.py +++ b/jrnl/Journal.py @@ -434,6 +434,10 @@ def open_journal(journal_name, config, legacy=False): if not config["encrypt"]: if legacy: return LegacyJournal(journal_name, **config).open() + if config["journal"].endswith(os.sep): + from . import FolderJournal + + return FolderJournal.Folder(journal_name, **config).open() return PlainJournal(journal_name, **config).open() from . import EncryptedJournal diff --git a/tests/bdd/features/file_storage.feature b/tests/bdd/features/file_storage.feature index 89069568..5cb6ba45 100644 --- a/tests/bdd/features/file_storage.feature +++ b/tests/bdd/features/file_storage.feature @@ -30,6 +30,24 @@ Feature: Journals iteracting with the file system in a way that users can see Then the journal should exist When we run "jrnl -99 --short" Then the output should contain "This is a new entry in my journal" + + @on_posix + Scenario: If the directory for a Folder journal ending in a slash ('/') doesn't exist, then it should be created + Given we use the config "missing_directory.yaml" + Then the journal "endslash" directory should not exist + When we run "jrnl endslash This is a new entry in my journal" + Then the journal "endslash" directory should exist + When we run "jrnl endslash -1" + Then the output should contain "This is a new entry in my journal" + + @on_win + Scenario: If the directory for a Folder journal ending in a backslash ('\') doesn't exist, then it should be created + Given we use the config "missing_directory.yaml" + Then the journal "endbackslash" directory should not exist + When we run "jrnl endbackslash This is a new entry in my journal" + Then the journal "endbackslash" directory should exist + When we run "jrnl endbackslash -1" + Then the output should contain "This is a new entry in my journal" Scenario: Creating journal with relative path should update to absolute path Given we use no config diff --git a/tests/data/configs/missing_directory.yaml b/tests/data/configs/missing_directory.yaml index d600404c..acf3fa09 100644 --- a/tests/data/configs/missing_directory.yaml +++ b/tests/data/configs/missing_directory.yaml @@ -5,6 +5,8 @@ encrypt: false highlight: true journals: default: features/journals/missing_directory/simple.journal + endslash: features/journals/missing_folder/ + endbackslash: features\journals\missing_folder\ linewrap: 80 tagsymbols: "@" template: false diff --git a/tests/lib/then_steps.py b/tests/lib/then_steps.py index 4ef1681b..8dc4da71 100644 --- a/tests/lib/then_steps.py +++ b/tests/lib/then_steps.py @@ -210,6 +210,16 @@ def journal_should_not_exist(config_on_disk, should_or_should_not): ) +@then(parse('the journal "{journal_name}" directory {should_or_should_not} exist')) +def directory_should_not_exist(config_on_disk, should_or_should_not, journal_name): + scoped_config = scope_config(config_on_disk, journal_name) + expected_path = scoped_config["journal"] + we_should = parse_should_or_should_not(should_or_should_not) + dir_exists = os.path.isdir(expected_path) + + assert dir_exists == we_should + + @then(parse('the content of file "{file_path}" in the cache should be\n{file_content}')) def content_of_file_should_be(file_path, file_content, cache_dir): assert cache_dir["exists"]