Add --config-file argument to use alternate config file at runtime (#1290)

* added new CLI argument option --config-file

* pass argument and fetch alt config file if specified

* argparse argument setting update

* argument alias --cf added

* documentation update - usage of CLI argument

* fixed name-clash + unit tests

* feature test added

* #1170-alternate-config-file: Auto stash before rebase of "refs/heads/#1170-alternate-config-file"

* Update docs/advanced.md

Co-authored-by: Jonathan Wren <jonathan@nowandwren.com>

* BDD tests added

* Begin migrating/rewording --cf tests in pytest-bdd.

Uses current directory instead of deep directory structure, but requires a given for each config file referenced

* Fix issue where specifying a config-file that needs to be upgraded ended up upgrading the user config file instead

* Uncomment and rework remaining tests for pytest-bdd instead of behave

* Fix copytree for Python 3.7 (which doesn't support dirs_exist_ok)

* Minor fixes to alternative config examples

* Remove behave tests (behave is no longer in use)

* Move config file unit test to unit test dir and use pytext path fixture instead of current directory to find test data

* Use explicit "given the config exists" for copying config files instead of shoehorning in "given we use the config" twice

* Change when/when to when/and

* Clarify scenarios and fix indentation

* Confirm primary config file isn't modified when encrypting/decrypting a journal in an alternate config file

* Remove try/except on copytree since I'm no longer using the same

Co-authored-by: Jonathan Wren <jonathan@nowandwren.com>
Co-authored-by: Micah Jerome Ellison <micah.jerome.ellison@gmail.com>
This commit is contained in:
samuelgregorovic 2021-11-06 22:12:34 +01:00 committed by GitHub
parent 5057c290c1
commit ae009099ed
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 209 additions and 15 deletions

View file

@ -0,0 +1,92 @@
Feature: Multiple journals
Scenario: Read a journal from an alternate config
Given the config "basic_onefile.yaml" exists
And we use the config "multiple.yaml"
When we run "jrnl --cf basic_onefile.yaml -999"
Then the output should not contain "My first entry" # from multiple.yaml
And the output should contain "Lorem ipsum" # from basic_onefile.yaml
Scenario: Write to default journal by default using an alternate config
Given the config "multiple.yaml" exists
And we use the config "basic_onefile.yaml"
When we run "jrnl --cf multiple.yaml this goes to default"
And we run "jrnl -1"
Then the output should not contain "this goes to default"
When we run "jrnl --cf multiple.yaml -1"
Then the output should contain "this goes to default"
Scenario: Write to specified journal using an alternate config
Given the config "multiple.yaml" exists
And we use the config "basic_onefile.yaml"
When we run "jrnl work --cf multiple.yaml a long day in the office"
And we run "jrnl default --cf multiple.yaml -1"
Then the output should contain "But I'm better"
When we run "jrnl work --cf multiple.yaml -1"
Then the output should contain "a long day in the office"
Scenario: Tell user which journal was used while using an alternate config
Given the config "multiple.yaml" exists
And we use the config "basic_onefile.yaml"
When we run "jrnl --cf multiple.yaml work a long day in the office"
Then we should see the message "Entry added to work journal"
Scenario: Write to specified journal with a timestamp using an alternate config
Given the config "multiple.yaml" exists
And we use the config "basic_onefile.yaml"
When we run "jrnl work --cf multiple.yaml 23 july 2012: a long day in the office"
And we run "jrnl --cf multiple.yaml -1"
Then the output should contain "But I'm better"
When we run "jrnl --cf multiple.yaml work -1"
Then the output should contain "a long day in the office"
And the output should contain "2012-07-23"
Scenario: Write to specified journal without a timestamp but with colon using an alternate config
Given the config "multiple.yaml" exists
And we use the config "basic_onefile.yaml"
When we run "jrnl work --cf multiple.yaml : a long day in the office"
And we run "jrnl --cf multiple.yaml -1"
Then the output should contain "But I'm better"
When we run "jrnl --cf multiple.yaml work -1"
Then the output should contain "a long day in the office"
Scenario: Create new journals as required using an alternate config
Given the config "multiple.yaml" exists
And we use the config "basic_onefile.yaml"
When we run "jrnl ideas -1"
Then the output should be empty
When we run "jrnl ideas --cf multiple.yaml 23 july 2012: sell my junk on ebay and make lots of money"
Then the output should contain "Journal 'ideas' created"
When we run "jrnl ideas --cf multiple.yaml -1"
Then the output should contain "sell my junk on ebay and make lots of money"
Scenario: Don't crash if no default journal is specified using an alternate config
Given the config "bug343.yaml" exists
And we use the config "basic_onefile.yaml"
When we run "jrnl --cf bug343.yaml a long day in the office"
Then we should see the message "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
And we use the config "basic_onefile.yaml"
When we run "jrnl new_encrypted --cf multiple.yaml Adding first entry" and enter
these three eyes
these three eyes
n
Then we should see the message "Encrypted journal 'new_encrypted' created"
Scenario: Don't overwrite main config when encrypting a journal in an alternate config
Given the config "basic_onefile.yaml" exists
And we use the config "multiple.yaml"
When we run "jrnl --cf basic_onefile.yaml --encrypt" and enter
these three eyes
these three eyes
n
Then we should see the message "Journal encrypted to features/journals/basic_onefile.journal"
And the config should contain "encrypt: false" # multiple.yaml remains unchanged
Scenario: Don't overwrite main config when decrypting a journal in an alternate config
Given the config "editor_encrypted.yaml" exists
And we use the config "basic_encrypted.yaml"
When we run "jrnl --cf editor_encrypted.yaml --decrypt"
Then the config should contain "encrypt: true" # basic_encrypted remains unchanged

View file

@ -1,6 +1,7 @@
from pytest_bdd import scenarios
scenarios("features/build.feature")
scenarios("features/config_file.feature")
scenarios("features/core.feature")
scenarios("features/datetime.feature")
scenarios("features/delete.feature")

View file

@ -105,6 +105,14 @@ def we_use_the_config(config_file, temp_dir, working_dir):
return config_dest
@given(parse('the config "{config_file}" exists'), target_fixture="config_path")
@given('the config "<config_file>" exists', target_fixture="config_path")
def config_exists(config_file, temp_dir, working_dir):
config_source = os.path.join(working_dir, "data", "configs", config_file)
config_dest = os.path.join(temp_dir.name, config_file)
shutil.copy2(config_source, config_dest)
@given(parse('we use the password "{pw}" if prompted'), target_fixture="password")
def use_password_forever(pw):
return pw

View file

@ -0,0 +1,22 @@
import pytest
import os
from jrnl.install import find_alt_config
def test_find_alt_config(request):
work_config_path = os.path.join(
request.fspath.dirname, "..", "data", "configs", "basic_onefile.yaml"
)
found_alt_config = find_alt_config(work_config_path)
assert found_alt_config == work_config_path
def test_find_alt_config_not_exist(request):
bad_config_path = os.path.join(
request.fspath.dirname, "..", "data", "configs", "not-existing-config.yaml"
)
with pytest.raises(SystemExit) as ex:
found_alt_config = find_alt_config(bad_config_path)
assert found_alt_config is not None
assert isinstance(ex.value, SystemExit)

View file

@ -37,6 +37,7 @@ def expected_args(**kwargs):
"tags": False,
"text": [],
"config_override": [],
"config_file_path": "",
}
return {**default_args, **kwargs}