mirror of
https://github.com/jrnl-org/jrnl.git
synced 2025-05-20 04:58:32 +02:00
merge config override step with existing config_var step in core
delete config_override step unify step description syntax
This commit is contained in:
parent
ca8e9f85e4
commit
0b79128023
3 changed files with 63 additions and 37 deletions
|
@ -41,15 +41,15 @@ Feature: Implementing Runtime Overrides for Select Configuration Keys
|
||||||
Given we use the config "basic_encrypted.yaml"
|
Given we use the config "basic_encrypted.yaml"
|
||||||
And we use the password "test" if prompted
|
And we use the password "test" if prompted
|
||||||
When we run "jrnl -1 --config-override colors.body blue"
|
When we run "jrnl -1 --config-override colors.body blue"
|
||||||
Then the runtime config should have colors.body set to blue
|
Then the config should have "colors.body" set to "blue"
|
||||||
|
|
||||||
@skip_win
|
@skip_win
|
||||||
Scenario: Apply multiple config overrides
|
Scenario: Apply multiple config overrides
|
||||||
Given we use the config "basic_encrypted.yaml"
|
Given we use the config "basic_encrypted.yaml"
|
||||||
And we use the password "test" if prompted
|
And we use the password "test" if prompted
|
||||||
When we run "jrnl -1 --config-override colors.body green --config-override editor 'nano'"
|
When we run "jrnl -1 --config-override colors.body green --config-override editor 'nano'"
|
||||||
Then the runtime config should have colors.body set to green
|
Then the config should have "colors.body" set to "green"
|
||||||
And the runtime config should have editor set to nano
|
And the config should have "editor" set to "nano"
|
||||||
|
|
||||||
|
|
||||||
@skip_win
|
@skip_win
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
import ast
|
import ast
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
from jrnl.args import parse_args
|
||||||
import os
|
import os
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import re
|
import re
|
||||||
|
@ -26,6 +27,7 @@ from jrnl import plugins
|
||||||
from jrnl.cli import cli
|
from jrnl.cli import cli
|
||||||
from jrnl.config import load_config
|
from jrnl.config import load_config
|
||||||
from jrnl.os_compat import split_args
|
from jrnl.os_compat import split_args
|
||||||
|
from jrnl.override import apply_overrides, _recursively_apply
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import parsedatetime.parsedatetime_consts as pdt
|
import parsedatetime.parsedatetime_consts as pdt
|
||||||
|
@ -117,8 +119,15 @@ def read_value_from_string(string):
|
||||||
return ast.literal_eval(string)
|
return ast.literal_eval(string)
|
||||||
|
|
||||||
# Takes strings like "bool:true" or "int:32" and coerces them into proper type
|
# Takes strings like "bool:true" or "int:32" and coerces them into proper type
|
||||||
t, value = string.split(":")
|
string_parts = string.split(":")
|
||||||
value = {"bool": lambda v: v.lower() == "true", "int": int, "str": str}[t](value)
|
if len(string_parts) > 1:
|
||||||
|
type = string_parts[0]
|
||||||
|
value = string_parts[1:][0] # rest of the text
|
||||||
|
value = {"bool": lambda v: v.lower() == "true", "int": int, "str": str}[type](
|
||||||
|
value
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
value = string_parts[0]
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
@ -318,6 +327,7 @@ def run_with_input(context, command, inputs=""):
|
||||||
text = iter([inputs])
|
text = iter([inputs])
|
||||||
|
|
||||||
args = split_args(command)[1:]
|
args = split_args(command)[1:]
|
||||||
|
context.args = args
|
||||||
|
|
||||||
def _mock_editor(command):
|
def _mock_editor(command):
|
||||||
context.editor_command = command
|
context.editor_command = command
|
||||||
|
@ -611,15 +621,61 @@ def journal_exists(context, journal_name="default"):
|
||||||
@then('the config should have "{key}" set to')
|
@then('the config should have "{key}" set to')
|
||||||
@then('the config should have "{key}" set to "{value}"')
|
@then('the config should have "{key}" set to "{value}"')
|
||||||
@then('the config for journal "{journal}" should have "{key}" set to "{value}"')
|
@then('the config for journal "{journal}" should have "{key}" set to "{value}"')
|
||||||
|
@then('the config should have "{key}" set to "{value}"')
|
||||||
def config_var(context, key, value="", journal=None):
|
def config_var(context, key, value="", journal=None):
|
||||||
|
key_as_vec = key.split(".")
|
||||||
|
|
||||||
|
if "args" in context:
|
||||||
|
parsed = parse_args(context.args)
|
||||||
|
overrides = parsed.config_override
|
||||||
value = read_value_from_string(value or context.text or "")
|
value = read_value_from_string(value or context.text or "")
|
||||||
configuration = load_config(context.config_path)
|
configuration = load_config(context.config_path)
|
||||||
|
|
||||||
if journal:
|
if journal:
|
||||||
configuration = configuration["journals"][journal]
|
configuration = configuration["journals"][journal]
|
||||||
|
|
||||||
assert key in configuration
|
if overrides:
|
||||||
assert configuration[key] == value
|
with patch.object(
|
||||||
|
jrnl.override, "_recursively_apply", wraps=_recursively_apply
|
||||||
|
) as spy_recurse:
|
||||||
|
configuration = apply_overrides(overrides, configuration)
|
||||||
|
runtime_cfg = spy_recurse.call_args_list[0][0][0]
|
||||||
|
else:
|
||||||
|
runtime_cfg = configuration
|
||||||
|
# extract the value of the desired key from the configuration after overrides have been applied
|
||||||
|
for k in key_as_vec:
|
||||||
|
runtime_cfg = runtime_cfg["%s" % k]
|
||||||
|
assert runtime_cfg == value
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@then("the runtime config should have {key_as_dots} set to {override_value}")
|
||||||
|
def config_override(context, key_as_dots: str, override_value: str):
|
||||||
|
key_as_vec = key_as_dots.split(".")
|
||||||
|
if "password" in context:
|
||||||
|
password = context.password
|
||||||
|
else:
|
||||||
|
password = ""
|
||||||
|
# fmt: off
|
||||||
|
try:
|
||||||
|
with \
|
||||||
|
mock.patch.object(jrnl.override,"_recursively_apply",wraps=jrnl.override._recursively_apply) as spy_recurse, \
|
||||||
|
mock.patch('jrnl.install.load_or_install_jrnl', return_value=context.jrnl_config), \
|
||||||
|
mock.patch('getpass.getpass',side_effect=_mock_getpass(password)) \
|
||||||
|
:
|
||||||
|
parsed_args = parse_args(context.args)
|
||||||
|
run(parsed_args)
|
||||||
|
runtime_cfg = spy_recurse.call_args_list[0][0][0]
|
||||||
|
|
||||||
|
# extract the value of the desired key from the configuration after overrides have been applied
|
||||||
|
for k in key_as_vec:
|
||||||
|
runtime_cfg = runtime_cfg['%s'%k]
|
||||||
|
|
||||||
|
assert runtime_cfg == override_value
|
||||||
|
except SystemExit as e :
|
||||||
|
context.exit_status = e.code
|
||||||
|
# fmt: on
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@then('the config for journal "{journal}" should not have "{key}" set')
|
@then('the config for journal "{journal}" should not have "{key}" set')
|
||||||
|
|
|
@ -5,39 +5,9 @@ from unittest import mock
|
||||||
from jrnl.args import parse_args
|
from jrnl.args import parse_args
|
||||||
from behave import then
|
from behave import then
|
||||||
|
|
||||||
import jrnl
|
|
||||||
|
|
||||||
from features.steps.core import _mock_getpass, _mock_time_parse
|
from features.steps.core import _mock_getpass, _mock_time_parse
|
||||||
|
|
||||||
|
|
||||||
@then("the runtime config should have {key_as_dots} set to {override_value}")
|
|
||||||
def config_override(context, key_as_dots: str, override_value: str):
|
|
||||||
key_as_vec = key_as_dots.split(".")
|
|
||||||
if "password" in context:
|
|
||||||
password = context.password
|
|
||||||
else:
|
|
||||||
password = ""
|
|
||||||
# fmt: off
|
|
||||||
try:
|
|
||||||
with \
|
|
||||||
mock.patch.object(jrnl.override,"_recursively_apply",wraps=jrnl.override._recursively_apply) as spy_recurse, \
|
|
||||||
mock.patch('jrnl.install.load_or_install_jrnl', return_value=context.jrnl_config), \
|
|
||||||
mock.patch('getpass.getpass',side_effect=_mock_getpass(password)) \
|
|
||||||
:
|
|
||||||
parsed_args = parse_args(context.args)
|
|
||||||
run(parsed_args)
|
|
||||||
runtime_cfg = spy_recurse.call_args_list[0][0][0]
|
|
||||||
|
|
||||||
# extract the value of the desired key from the configuration after overrides have been applied
|
|
||||||
for k in key_as_vec:
|
|
||||||
runtime_cfg = runtime_cfg['%s'%k]
|
|
||||||
|
|
||||||
assert runtime_cfg == override_value
|
|
||||||
except SystemExit as e :
|
|
||||||
context.exit_status = e.code
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
|
|
||||||
@then("the editor {editor} should have been called")
|
@then("the editor {editor} should have been called")
|
||||||
@then("No editor should have been called")
|
@then("No editor should have been called")
|
||||||
def editor_override(context, editor=None):
|
def editor_override(context, editor=None):
|
||||||
|
|
Loading…
Add table
Reference in a new issue