From 3cedf3b288f6eecdbfd3f23e122698f44a83cc93 Mon Sep 17 00:00:00 2001 From: Elliot Gunton Date: Wed, 5 Mar 2025 21:26:46 +0000 Subject: [PATCH] Fix edge case for model arguments Parameter conversion Signed-off-by: Elliot Gunton --- src/hera/workflows/_mixins.py | 7 +++++++ tests/test_unit/test_mixins.py | 26 +++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/hera/workflows/_mixins.py b/src/hera/workflows/_mixins.py index b722155a..8a8f18c3 100644 --- a/src/hera/workflows/_mixins.py +++ b/src/hera/workflows/_mixins.py @@ -587,6 +587,13 @@ def _build_arguments(self) -> Optional[ModelArguments]: if normalized_arguments is None: return None elif isinstance(normalized_arguments, ModelArguments): + # Special case as Parameter is a subclass of ModelParameter + # We need to convert Parameters to ModelParameters + if normalized_arguments.parameters: + normalized_arguments.parameters = [ + ModelParameter.parse_obj(p.dict()) if isinstance(p, Parameter) else p + for p in normalized_arguments.parameters + ] return normalized_arguments from hera.workflows.workflow_template import WorkflowTemplate diff --git a/tests/test_unit/test_mixins.py b/tests/test_unit/test_mixins.py index 3181109c..9d8a5f77 100644 --- a/tests/test_unit/test_mixins.py +++ b/tests/test_unit/test_mixins.py @@ -1,6 +1,6 @@ import pytest -from hera.workflows import Env, Parameter +from hera.workflows import Env, Parameter, Workflow from hera.workflows._mixins import ArgumentsMixin, ContainerMixin, EnvMixin, IOMixin from hera.workflows.models import ( Arguments as ModelArguments, @@ -113,6 +113,30 @@ def test_model_arguments_value_is_not_normalized_to_list(self): assert args_mixin.arguments == ModelArguments() + def test_build_arguments_of_parameter_converted(self): + args_mixin = ArgumentsMixin( + arguments=[ + Parameter(name="my-param-1"), + Parameter(name="my-param-2"), + ] + ) + built_args = args_mixin._build_arguments() + assert built_args and built_args.parameters == [ + ModelParameter(name="my-param-1"), + ModelParameter(name="my-param-2"), + ] + + def test_build_workflow(self): + with Workflow( + name="test", + arguments=ModelArguments(parameters=[Parameter(name="test", value="value")]), + ) as w: + pass + + workflow = w.build() + assert workflow.spec.arguments.parameters == [ModelParameter(name="test", value="value")] + + class TestEnvMixin: def test_list_normalized_to_list(self): env_mixin = EnvMixin(