Complex Expr#

This example showcases how to string together complex expressions.

This example is a python replica of https://github.com/argoproj/argo-workflows/blob/master/examples/expression-reusing-verbose-snippets.yaml

import base64
import json

from hera import Env, Parameter, Task, Workflow
from hera.expr import C, g, it, sprig


def base64_encode(input: str) -> str:
    return base64.b64encode(input.encode()).decode()


data = json.dumps({"temps": [34, 27, 15, 57, 46]})
encoded_data = json.dumps({"weekWeather": base64_encode(data)})


def construct_weekly_temps():
    weather = g.workflow.parameters.weather
    week_weather = sprig.b64dec(weather.jsonpath("$.weekWeather"))
    temps = C([week_weather.jsonpath("$.temps")])
    iterators = [it[i] for i in range(5)]
    return temps.map(
        C(
            {
                "avg": sprig.add(*iterators) / 5,
                "min": sprig.min(*iterators),
                "max": sprig.max(*iterators),
            }
        ).to_json()
    )[0]


with Workflow("expression-reusing-verbose-snippets-", generate_name=True) as w:
    w.parameters = [Parameter(name="weather", value=encoded_data)]
    week_temps = construct_weekly_temps()
    week_temps_jsonpath = g.inputs.parameters['week-temps'].jsonpath
    Task(
        name="main",
        inputs=[Parameter(name="week-temps", value=f"{week_temps:=}")],
        source='''echo "The week's average temperature was $AVG with a minimum of $MIN and a maximum of $MAX."''',
        env=[
            Env(name="MIN", value=f"{week_temps_jsonpath('$.min'):=}"),
            Env(name="MAX", value=f"{week_temps_jsonpath('$.max'):=}"),
            Env(name="AVG", value=f"{week_temps_jsonpath('$.avg'):=}"),
        ],
        command=["bash"],
        image="debian:9.4",
    )

print(w.to_yaml())