merge config override step with existing config_var step in core

delete config_override step

unify step description syntax
This commit is contained in:
sriniv27 2021-02-18 08:28:34 -05:00
parent ca8e9f85e4
commit 0b79128023
3 changed files with 63 additions and 37 deletions

View file

@ -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

View file

@ -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')

View file

@ -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):