Skip to content

Commit

Permalink
Merge pull request #245 from python-ellar/custom_resolver_gen
Browse files Browse the repository at this point in the history
Custom resolver gen
  • Loading branch information
eadwinCode authored Sep 20, 2024
2 parents ac7621c + bebfdd6 commit c2c0e71
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 6 deletions.
3 changes: 2 additions & 1 deletion ellar/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
"""Ellar - Python ASGI web framework for building fast, efficient, and scalable RESTful APIs and server-side applications."""

__version__ = "0.8.3"
__version__ = "0.8.4"

2 changes: 1 addition & 1 deletion ellar/common/params/args/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
}


def add_get_resolver_generator(
def add_resolver_generator(
param: t.Type[params.ParamFieldInfo],
resolver_gen: t.Type[BulkArgsResolverGenerator],
) -> None:
Expand Down
14 changes: 14 additions & 0 deletions ellar/common/params/params.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,20 @@ def __init__(
def create_resolver(
self, model_field: ModelField
) -> t.Union[BaseRouteParameterResolver, IRouteParameterResolver]:
"""
Create a resolver for a given model field.
This method is responsible for creating the appropriate resolver for a given
model field.
It checks if the model field has been split into many sub-models that are referred to as MultipleResolvers.
And then creates an appropriate resolver for each of them.
Args:
model_field (ModelField): The model field to create a resolver for.
Returns:
BaseRouteParameterResolver: The created resolver.
"""
multiple_resolvers = model_field.field_info.json_schema_extra.pop( # type:ignore[union-attr]
MULTI_RESOLVER_KEY, None
)
Expand Down
40 changes: 36 additions & 4 deletions ellar/common/params/resolvers/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@


class ResolverResult(t.NamedTuple):
"""
A named tuple containing the resolved value, any errors, and the raw data.
"""

data: t.Optional[t.Any]
errors: t.Optional[t.List[t.Dict[str, t.Any]]]
raw_data: t.Dict[str, t.Any]
Expand All @@ -27,12 +31,29 @@ class IRouteParameterResolver(ABC, metaclass=ABCMeta):
@abstractmethod
@t.no_type_check
async def resolve(self, *args: t.Any, **kwargs: t.Any) -> ResolverResult:
"""Resolve handle"""
"""
Resolves the value of the parameter during request processing.
Args:
*args: Additional positional arguments.
**kwargs: Additional keyword arguments.
Returns:
`ResolverResult`: A named tuple containing the resolved value, any errors, and the raw data.
"""

@abstractmethod
@t.no_type_check
def create_raw_data(self, data: t.Any) -> t.Dict:
"""Essential for debugging"""
"""
Creates the raw data for the parameter.
Args:
data: The resolved value of the parameter.
Returns:
`dict`: A dictionary containing the raw data.
"""


class BaseRouteParameterResolver(IRouteParameterResolver, ABC):
Expand All @@ -42,10 +63,12 @@ def __init__(self, model_field: ModelField, *args: t.Any, **kwargs: t.Any) -> No
)

def create_raw_data(self, data: t.Any) -> t.Dict:
"""Essential for debugging"""
return {self.model_field.name: data}

def assert_field_info(self) -> None:
"""
Asserts that the field info is of the correct type.
"""
from .. import params

assert isinstance(
Expand All @@ -69,4 +92,13 @@ async def resolve(self, *args: t.Any, **kwargs: t.Any) -> ResolverResult:
@abstractmethod
@t.no_type_check
async def resolve_handle(self, *args: t.Any, **kwargs: t.Any) -> ResolverResult:
"""resolver action"""
"""
Resolves the value of the parameter during request processing.
Args:
*args: Additional positional arguments.
**kwargs: Additional keyword arguments.
Returns:
`ResolverResult`: A named tuple containing the resolved value, any errors, and the raw data.
"""

0 comments on commit c2c0e71

Please sign in to comment.