Skip to content

Commit e00033b

Browse files
committed
Issue #522 support optional child callbacks in generated openeo.processes
1 parent 3b8272a commit e00033b

File tree

5 files changed

+75
-3
lines changed

5 files changed

+75
-3
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2525
### Fixed
2626

2727
- Fix band name support in `DataCube.band()` when no metadata is available ([#515](https://github.com/Open-EO/openeo-python-client/issues/515))
28+
- Support optional child callbacks in generated `openeo.processes`, e.g. `merge_cubes` ([#522]((https://github.com/Open-EO/openeo-python-client/issues/522)))
2829

2930

3031
## [0.26.0] - 2023-11-27 - "SRR6" release

openeo/internal/processes/generator.py

+2
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ def _call_args(self, process: Process) -> Iterator[str]:
8282
if parameter.schema.is_process_graph():
8383
parent_parameters = [p["name"] for p in parameter.schema.schema["parameters"]]
8484
arg_expression = f"build_child_callback({arg_expression}, parent_parameters={parent_parameters})"
85+
if parameter.optional:
86+
arg_expression = f"({arg_expression} if {arg_name} not in [None, {self.optional_default}] else {arg_name})"
8587
yield f"{par_name}={arg_expression}"
8688

8789
def _def_arguments(self, process: Process) -> Iterator[str]:

openeo/processes.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# It is automatically generated.
44
# Used command line arguments:
55
# openeo/internal/processes/generator.py specs/openeo-processes specs/openeo-processes/proposals specs/openeo-processes-legacy --output openeo/processes.py
6-
# Generated on 2023-11-28
6+
# Generated on 2024-01-09
77

88
from __future__ import annotations
99

@@ -1942,7 +1942,7 @@ def merge_cubes(self, cube2, overlap_resolver=UNSET, context=UNSET) -> ProcessBu
19421942
return merge_cubes(
19431943
cube1=self,
19441944
cube2=cube2,
1945-
overlap_resolver=build_child_callback(overlap_resolver, parent_parameters=['x', 'y', 'context']),
1945+
overlap_resolver=(build_child_callback(overlap_resolver, parent_parameters=['x', 'y', 'context']) if overlap_resolver not in [None, UNSET] else overlap_resolver),
19461946
context=context
19471947
)
19481948

@@ -4707,7 +4707,7 @@ def merge_cubes(cube1, cube2, overlap_resolver=UNSET, context=UNSET) -> ProcessB
47074707
return _process('merge_cubes',
47084708
cube1=cube1,
47094709
cube2=cube2,
4710-
overlap_resolver=build_child_callback(overlap_resolver, parent_parameters=['x', 'y', 'context']),
4710+
overlap_resolver=(build_child_callback(overlap_resolver, parent_parameters=['x', 'y', 'context']) if overlap_resolver not in [None, UNSET] else overlap_resolver),
47114711
context=context
47124712
)
47134713

tests/internal/processes/test_generator.py

+47
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,53 @@ def apply_dimension(data, dimension, process):
293293
)
294294

295295

296+
def test_render_process_graph_optional_callback():
297+
process = Process.from_dict(
298+
{
299+
"id": "apply",
300+
"description": "Apply",
301+
"summary": "Apply",
302+
"parameters": [
303+
{
304+
"name": "data",
305+
"description": "Data cube",
306+
"schema": {"type": "object", "subtype": "raster-cube"},
307+
},
308+
{
309+
"name": "process",
310+
"description": "Process",
311+
"schema": {
312+
"type": "object",
313+
"subtype": "process-graph",
314+
"parameters": [{"name": "data", "schema": {"type": "array"}}],
315+
},
316+
"optional": True,
317+
},
318+
],
319+
"returns": {"description": "Data cube", "schema": {"type": "object", "subtype": "raster-cube"}},
320+
}
321+
)
322+
323+
renderer = PythonRenderer(optional_default="UNSET")
324+
src = renderer.render_process(process)
325+
assert src == dedent(
326+
'''\
327+
def apply(data, process=UNSET):
328+
"""
329+
Apply
330+
331+
:param data: Data cube
332+
:param process: Process
333+
334+
:return: Data cube
335+
"""
336+
return _process('apply',
337+
data=data,
338+
process=(build_child_callback(process, parent_parameters=['data']) if process not in [None, UNSET] else process)
339+
)'''
340+
)
341+
342+
296343
def test_collect_processes_basic(tmp_path):
297344
processes = collect_processes(sources=[get_test_resource("data/processes/1.0")])
298345
assert [p.id for p in processes] == ["add", "cos"]

tests/test_processes.py

+22
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,25 @@ def test_apply_udf():
7777
"result": True,
7878
}
7979
}
80+
81+
82+
def test_merge_cubes_no_overlap_resolver():
83+
res = openeo.processes.merge_cubes(cube1="dummy1", cube2="dummy2")
84+
assert res.flat_graph() == {
85+
"mergecubes1": {
86+
"process_id": "merge_cubes",
87+
"arguments": {"cube1": "dummy1", "cube2": "dummy2"},
88+
"result": True,
89+
}
90+
}
91+
92+
93+
def test_merge_cubes_overlap_resolver_none():
94+
res = openeo.processes.merge_cubes(cube1="dummy1", cube2="dummy2", overlap_resolver=None)
95+
assert res.flat_graph() == {
96+
"mergecubes1": {
97+
"process_id": "merge_cubes",
98+
"arguments": {"cube1": "dummy1", "cube2": "dummy2", "overlap_resolver": None},
99+
"result": True,
100+
}
101+
}

0 commit comments

Comments
 (0)