method serialization contains signature instead of parameter key-value pair

This commit is contained in:
Mose Müller 2024-02-27 11:30:00 +01:00
parent 53676131a6
commit d33e9f9dbf

View File

@ -3,7 +3,7 @@ import logging
import sys import sys
from collections.abc import Callable from collections.abc import Callable
from enum import Enum from enum import Enum
from typing import Any from typing import Any, TypedDict
import pydase.units as u import pydase.units as u
from pydase.data_service.abstract_data_service import AbstractDataService from pydase.data_service.abstract_data_service import AbstractDataService
@ -166,58 +166,6 @@ class Serializer:
"doc": doc, "doc": doc,
} }
@staticmethod
def _get_default_value_of_method_arg(
obj: Callable[..., Any], arg_name: str, arg_value: inspect.Parameter
) -> Any:
default_value = arg_value.default
if default_value is None:
raise KeywordArgumentError(
f"Default value for keyword {arg_name!r} of function {obj.__name__!r} "
"cannot be 'None'."
)
if default_value is inspect.Parameter.empty:
annotation = arg_value.annotation
if annotation is not inspect._empty:
if annotation is None:
raise KeywordArgumentError(
f"Type hint of keyword {arg_name!r} of function "
f"{obj.__name__!r} cannot be 'None'."
)
if issubclass(annotation, u.Quantity):
raise KeywordArgumentError(
f"Keyword {arg_name!r} of function {obj.__name__!r} needs "
"default argument. Quantity objects have no obvious default "
"value."
)
if annotation == str:
default_value = ""
elif annotation == int:
default_value = 0
elif annotation == float:
default_value = 0.0
elif annotation == bool:
default_value = False
elif issubclass(annotation, Enum):
default_value = next(iter(annotation))
else:
raise KeywordArgumentError(
f"Type of keyword {arg_name!r} of function {obj.__name__} "
"should be a simple type (str, int, float, bool, Enum, Quantity"
")."
)
else:
logger.warning(
"Keyword %a of function %a has no type hint. "
"Defaulting to float...",
arg_name,
obj.__name__,
)
default_value = 0.0
return default_value
@staticmethod @staticmethod
def _serialize_method(obj: Callable[..., Any]) -> dict[str, Any]: def _serialize_method(obj: Callable[..., Any]) -> dict[str, Any]:
obj_type = "method" obj_type = "method"
@ -228,11 +176,21 @@ class Serializer:
# Store parameters and their anotations in a dictionary # Store parameters and their anotations in a dictionary
sig = inspect.signature(obj) sig = inspect.signature(obj)
parameters: dict[str, dict[str, Any]] = {} sig.return_annotation
class SignatureDict(TypedDict):
parameters: dict[str, dict[str, Any]]
return_annotation: dict[str, Any]
signature: SignatureDict = {"parameters": {}, "return_annotation": {}}
for k, v in sig.parameters.items(): for k, v in sig.parameters.items():
default_value = Serializer._get_default_value_of_method_arg(obj, k, v) signature["parameters"][k] = {
parameters[k] = dump(default_value) "name": v.name,
"annotation": str(v.annotation),
"default": dump(v.default) if v.default != inspect._empty else {},
}
print(signature["parameters"][k])
return { return {
"type": obj_type, "type": obj_type,
@ -240,7 +198,7 @@ class Serializer:
"readonly": readonly, "readonly": readonly,
"doc": doc, "doc": doc,
"async": inspect.iscoroutinefunction(obj), "async": inspect.iscoroutinefunction(obj),
"parameters": parameters, "signature": signature,
"frontend_render": frontend_render, "frontend_render": frontend_render,
} }