Skip to content

Commit

Permalink
Issue #346/#347 minor ProcessArgs implementation tweaks
Browse files Browse the repository at this point in the history
  • Loading branch information
soxofaan committed Jan 14, 2025
1 parent 7d83483 commit b26527c
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 4 deletions.
13 changes: 11 additions & 2 deletions openeo_driver/processes.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from pathlib import Path
from typing import Any, Callable, Collection, Dict, List, Optional, Tuple, Union

from openeo_driver.datacube import DriverDataCube
from openeo_driver.errors import (
OpenEOApiException,
ProcessParameterInvalidException,
Expand Down Expand Up @@ -332,6 +333,8 @@ def _check_value(
):
if expected_type:
if not isinstance(value, expected_type):
if expected_type is DriverDataCube:
expected_type = "raster cube"
raise ProcessParameterInvalidException(
parameter=name, process=self.process_id, reason=f"Expected {expected_type} but got {type(value)}."
)
Expand Down Expand Up @@ -430,13 +433,19 @@ def get_subset(self, names: List[str], aliases: Optional[Dict[str, str]] = None)
kwargs[key] = self[alias]
return kwargs

def get_enum(self, name: str, options: Collection[ArgumentValue]) -> ArgumentValue:
def get_enum(
self, name: str, options: Collection[ArgumentValue], default: Optional[ArgumentValue] = None
) -> ArgumentValue:
"""
Get argument by name and check if it belongs to given set of (enum) values.
Originally: `extract_arg_enum`
"""
value = self.get_required(name=name)
# TODO: use an "unset" sentinel value instead of None for default?
if default is None:
value = self.get_required(name=name)
else:
value = self.get_optional(name=name, default=default)
if value not in options:
raise ProcessParameterInvalidException(
parameter=name,
Expand Down
13 changes: 11 additions & 2 deletions tests/test_processes.py
Original file line number Diff line number Diff line change
Expand Up @@ -458,7 +458,7 @@ def test_get_required_with_type(self):
with pytest.raises(
ProcessParameterInvalidException,
match=re.escape(
"The value passed for parameter 'color' in process 'wibble' is invalid: Expected <class 'openeo_driver.datacube.DriverDataCube'> but got <class 'str'>."
"The value passed for parameter 'color' in process 'wibble' is invalid: Expected raster cube but got <class 'str'>."
),
):
_ = args.get_required("color", expected_type=DriverDataCube)
Expand Down Expand Up @@ -521,7 +521,7 @@ def test_get_optional_with_type(self):
with pytest.raises(
ProcessParameterInvalidException,
match=re.escape(
"The value passed for parameter 'foo' in process 'wibble' is invalid: Expected <class 'openeo_driver.datacube.DriverDataCube'> but got <class 'str'>."
"The value passed for parameter 'foo' in process 'wibble' is invalid: Expected raster cube but got <class 'str'>."
),
):
_ = args.get_optional("foo", expected_type=DriverDataCube)
Expand Down Expand Up @@ -615,6 +615,15 @@ def test_get_enum(self):
):
_ = args.get_enum("color", options=["R", "G", "B"])

def test_get_enum_optional(self):
args = ProcessArgs({"size": 3, "color": "red"}, process_id="wibble")
assert args.get_enum("color", options=["red", "green", "blue"], default="green") == "red"
assert args.get_enum("colour", options=["red", "green", "blue"], default="green") == "green"

assert args.get_enum("size", options=[0, 1, 2, 3], default=0) == 3
assert args.get_enum("dim", options=[0, 1, 2, 3], default=0) == 0
assert args.get_enum("dim", options=[0, 1, 2, 3], default=2) == 2

def test_validator_generic(self):
args = ProcessArgs({"size": 11}, process_id="wibble")

Expand Down

0 comments on commit b26527c

Please sign in to comment.