Skip to content

Commit

Permalink
Python: Improve handling of previous overrides in eval command (#313)
Browse files Browse the repository at this point in the history
  • Loading branch information
jamesL92 committed Dec 28, 2023
1 parent da4069d commit 3ebb70d
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 9 deletions.
29 changes: 25 additions & 4 deletions py/configu/commands/eval_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -233,16 +233,16 @@ def reduce_prev(
current: Tuple[str, EvalCommandReturnValue],
):
key, value = current
if key not in merged or (
merged[key]["result"]["origin"] == EvaluatedConfigOrigin.EmptyValue
and value["result"]["origin"] != EvaluatedConfigOrigin.EmptyValue
if key not in merged or self._should_override_origin(
value["result"]["origin"],
merged[key]["result"]["origin"],
):
merged[key] = value
return merged

return reduce(
reduce_prev,
reversed(list(previous_result.items()) + list(result.items())),
iter(list(previous_result.items()) + list(result.items())),
{},
)

Expand Down Expand Up @@ -292,6 +292,27 @@ def _eval_templates(result: EvalCommandReturn) -> EvalCommandReturn:
should_render_templates = has_rendered_at_least_once
return result

@staticmethod
def _should_override_origin(
next_origin: EvaluatedConfigOrigin, previous_origin: EvaluatedConfigOrigin
) -> bool:
if previous_origin is None:
return True
if previous_origin == EvaluatedConfigOrigin.EmptyValue:
return next_origin != EvaluatedConfigOrigin.EmptyValue
if previous_origin == EvaluatedConfigOrigin.SchemaDefault:
return next_origin in (
EvaluatedConfigOrigin.SchemaDefault,
EvaluatedConfigOrigin.StoreSet,
EvaluatedConfigOrigin.ConfigsOverride,
EvaluatedConfigOrigin.SchemaTemplate,
)
return next_origin in (
EvaluatedConfigOrigin.StoreSet,
EvaluatedConfigOrigin.ConfigsOverride,
EvaluatedConfigOrigin.SchemaTemplate,
)

def run(self):
"""
Runs the eval command.
Expand Down
10 changes: 5 additions & 5 deletions py/tests/commands/test_eval_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ def test_configs_override_store():
assert result["GREETING"]["result"]["value"] == "bonjour"
assert result["GREETING"]["result"]["origin"] == EvaluatedConfigOrigin.ConfigsOverride

def test_previous_overrides_configs():
def test_previous_does_not_override_configs():
store = InMemoryConfigStore()
config_set = ConfigSet("")
config_schema = ConfigSchema("tests/staticfiles/config_schemas/valid/complex.cfgu.json")
Expand All @@ -65,15 +65,15 @@ def test_previous_overrides_configs():
schema=config_schema,
configs={"GREETING": "bonjour", "SUBJECT": "foo"},
).run()

result = EvalCommand(
store=store,
set=config_set,
schema=config_schema,
previous=previous
).run()
assert result["GREETING"]["result"]["value"] == "hello"
assert result["GREETING"]["result"]["origin"] == EvaluatedConfigOrigin.SchemaDefault
)
result = result.run()
assert result["GREETING"]["result"]["value"] == "bonjour"
assert result["GREETING"]["result"]["origin"] == EvaluatedConfigOrigin.ConfigsOverride

def test_latest_configs_override_previous():
store = InMemoryConfigStore()
Expand Down

0 comments on commit 3ebb70d

Please sign in to comment.