diff --git a/jrnl/Journal.py b/jrnl/Journal.py index c2c43142..2fa1d465 100644 --- a/jrnl/Journal.py +++ b/jrnl/Journal.py @@ -8,6 +8,7 @@ import re from jrnl import Entry from jrnl import time +from jrnl.config import validate_journal_name from jrnl.messages import Message from jrnl.messages import MsgStyle from jrnl.messages import MsgText @@ -430,6 +431,7 @@ def open_journal(journal_name, config, legacy=False): If legacy is True, it will open Journals with legacy classes build for backwards compatibility with jrnl 1.x """ + validate_journal_name(journal_name, config) config = config.copy() config["journal"] = expand_path(config["journal"]) diff --git a/jrnl/commands.py b/jrnl/commands.py index 6100422b..28f7bee8 100644 --- a/jrnl/commands.py +++ b/jrnl/commands.py @@ -17,6 +17,7 @@ avoid any possible overhead for these standalone commands. import platform import sys +from jrnl.config import cmd_requires_valid_journal_name from jrnl.exception import JrnlException from jrnl.messages import Message from jrnl.messages import MsgStyle @@ -62,6 +63,7 @@ def postconfig_list(args, config, **kwargs): print(list_journals(config, args.export)) +@cmd_requires_valid_journal_name def postconfig_import(args, config, **kwargs): from jrnl.Journal import open_journal from jrnl.plugins import get_importer @@ -73,6 +75,7 @@ def postconfig_import(args, config, **kwargs): get_importer(format).import_(journal, args.filename) +@cmd_requires_valid_journal_name def postconfig_encrypt(args, config, original_config, **kwargs): """ Encrypt a journal in place, or optionally to a new file @@ -123,6 +126,7 @@ def postconfig_encrypt(args, config, original_config, **kwargs): save_config(original_config) +@cmd_requires_valid_journal_name def postconfig_decrypt(args, config, original_config, **kwargs): """Decrypts into new file. If filename is not set, we encrypt the journal file itself.""" from jrnl.config import update_config diff --git a/jrnl/config.py b/jrnl/config.py index aed17200..ccda2053 100644 --- a/jrnl/config.py +++ b/jrnl/config.py @@ -213,14 +213,27 @@ def get_journal_name(args, config): args.journal_name = potential_journal_name args.text = args.text[1:] - if args.journal_name not in config["journals"]: - raise JrnlException( - Message( - MsgText.NoDefaultJournal, - MsgStyle.ERROR, - {"journals": list_journals(config)}, - ), - ) - logging.debug("Using journal name: %s", args.journal_name) return args + + +def cmd_requires_valid_journal_name(func): + def wrapper(args, config, original_config): + validate_journal_name(args.journal_name, config) + func(args, config, original_config) + + return wrapper + + +def validate_journal_name(journal_name, config): + if journal_name not in config["journals"]: + raise JrnlException( + Message( + MsgText.NoNamedJournal, + MsgStyle.ERROR, + { + "journal_name": journal_name, + "journals": list_journals(config), + }, + ), + ) diff --git a/jrnl/messages/MsgText.py b/jrnl/messages/MsgText.py index 0f509645..b3cc50e7 100644 --- a/jrnl/messages/MsgText.py +++ b/jrnl/messages/MsgText.py @@ -101,7 +101,7 @@ class MsgText(Enum): {template} """ - NoDefaultJournal = "No default journal configured\n{journals}" + NoNamedJournal = "No '{journal_name}' journal configured\n{journals}" DoesNotExist = "{name} does not exist" diff --git a/tests/bdd/features/config_file.feature b/tests/bdd/features/config_file.feature index 7a19facd..3369e666 100644 --- a/tests/bdd/features/config_file.feature +++ b/tests/bdd/features/config_file.feature @@ -67,7 +67,7 @@ Feature: Multiple journals Given the config "no_default_journal.yaml" exists And we use the config "basic_onefile.yaml" When we run "jrnl --cf no_default_journal.yaml a long day in the office" - Then the output should contain "No default journal configured" + Then the output should contain "No 'default' journal configured" Scenario: Don't crash if no file exists for a configured encrypted journal using an alternate config Given the config "multiple.yaml" exists diff --git a/tests/bdd/features/format.feature b/tests/bdd/features/format.feature index 2cc7d9a1..54715495 100644 --- a/tests/bdd/features/format.feature +++ b/tests/bdd/features/format.feature @@ -612,3 +612,20 @@ Feature: Custom formats config_path: .+basic_onefile\.yaml journals: default: features/journals/basic_onefile\.journal + + Scenario: Export journal list to formats with no default journal + Given we use the config "no_default_journal.yaml" + When we run "jrnl --list" + Then the output should match + Journals defined in config \(.+no_default_journal\.yaml\) + \* simple -> features/journals/simple\.journal + \* work -> features/journals/work\.journal + When we run "jrnl --list --format json" + Then the output should match + {"config_path": ".+no_default_journal\.yaml", "journals": {"simple": "features/journals/simple\.journal", "work": "features/journals/work\.journal"}} + When we run "jrnl --list --format yaml" + Then the output should match + config_path: .+no_default_journal\.yaml + journals: + simple: features/journals/simple\.journal + work: features/journals/work\.journal diff --git a/tests/bdd/features/multiple_journals.feature b/tests/bdd/features/multiple_journals.feature index f4463732..ee90b8a9 100644 --- a/tests/bdd/features/multiple_journals.feature +++ b/tests/bdd/features/multiple_journals.feature @@ -82,7 +82,7 @@ Feature: Multiple journals Scenario: Don't crash if no default journal is specified Given we use the config "no_default_journal.yaml" When we run "jrnl a long day in the office" - Then the output should contain "No default journal configured" + Then the output should contain "No 'default' journal configured" Scenario: Don't crash if no file exists for a configured encrypted journal Given we use the config "multiple.yaml"