Skip to content

Commit 25c3b13

Browse files
committed
Added openapi module testing and some code refactoring
1 parent cf68986 commit 25c3b13

File tree

14 files changed

+880
-20
lines changed

14 files changed

+880
-20
lines changed

ellar/common/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from .decorators.html import render, template_filter, template_global
99
from .decorators.middleware import middleware
1010
from .decorators.modules import Module
11-
from .decorators.openapi import openapi
11+
from .decorators.openapi import openapi_info
1212
from .decorators.request import on_shutdown, on_startup
1313
from .decorators.serializer import serializer_filter
1414
from .decorators.versioning import version
@@ -48,7 +48,7 @@
4848
"ParamTypes",
4949
"set_meta",
5050
"Controller",
51-
"openapi",
51+
"openapi_info",
5252
"version",
5353
"delete",
5454
"get",

ellar/common/decorators/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from .html import render, template_filter, template_global # noqa
66
from .middleware import middleware # noqa
77
from .modules import Module # noqa
8-
from .openapi import openapi # noqa
8+
from .openapi import openapi_info # noqa
99
from .request import on_shutdown, on_startup # noqa
1010
from .serializer import serializer_filter # noqa
1111
from .versioning import version # noqa

ellar/common/decorators/openapi.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from .base import set_meta
77

88

9-
def openapi(
9+
def openapi_info(
1010
operation_id: t.Optional[str] = None,
1111
summary: t.Optional[str] = None,
1212
description: t.Optional[str] = None,

ellar/core/modules/helper.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1+
import inspect
12
import typing as t
23
from functools import wraps
34

4-
from starlette.routing import iscoroutinefunction_or_partial
5-
65

76
def _executor_wrapper_async(
87
cls: t.Type, func: t.Callable
@@ -25,7 +24,7 @@ def _decorator(*args: t.Any, **kwargs: t.Any) -> t.Any:
2524
def class_parameter_executor_wrapper(
2625
cls: t.Type, func: t.Callable
2726
) -> t.Union[t.Callable, t.Callable[..., t.Coroutine]]:
28-
if iscoroutinefunction_or_partial(func):
27+
if inspect.iscoroutinefunction(func):
2928
return _executor_wrapper_async(cls, func)
3029

3130
return _executor_wrapper(cls, func)

ellar/core/routing/route.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1+
import inspect
12
import typing as t
23

34
from starlette.concurrency import run_in_threadpool
4-
from starlette.routing import (
5-
Route as StarletteRoute,
6-
compile_path,
7-
iscoroutinefunction_or_partial,
8-
)
5+
from starlette.routing import Route as StarletteRoute, compile_path
96

107
from ellar.constants import (
118
CONTROLLER_OPERATION_HANDLER_KEY,
@@ -50,7 +47,7 @@ def __init__(
5047
name: t.Optional[str] = None,
5148
include_in_schema: bool = True,
5249
) -> None:
53-
self._is_coroutine = iscoroutinefunction_or_partial(endpoint)
50+
self._is_coroutine = inspect.iscoroutinefunction(endpoint)
5451
self._defined_responses: t.Dict[int, t.Type] = dict(response)
5552

5653
assert path.startswith("/"), "Routed paths must start with '/'"

ellar/core/routing/router/module.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ def _build_ws_route_operation(self, route: WebsocketRouteOperation) -> None:
118118
def get_flatten_routes(self) -> t.List[BaseRoute]:
119119
if not self._build:
120120
for route in self.routes:
121-
_route: RouteOperation = t.cast("RouteOperation", route)
121+
_route: RouteOperation = t.cast(RouteOperation, route)
122122

123123
route_versioning = reflect.get_metadata(VERSIONING_KEY, _route.endpoint)
124124
route_guards = reflect.get_metadata(GUARDS_KEY, _route.endpoint)
@@ -161,7 +161,7 @@ class ModuleRouter(ModuleMount):
161161

162162
def __init__(
163163
self,
164-
path: str,
164+
path: str = "",
165165
name: str = None,
166166
tag: str = NOT_SET,
167167
description: str = None,

ellar/core/schema.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
from pydantic import BaseModel, Field, root_validator, validator
44

55
from ellar.constants import ROUTE_METHODS
6-
from ellar.core.response.model import EmptyAPIResponseModel, IResponseModel
6+
from ellar.core.response.model import (
7+
EmptyAPIResponseModel,
8+
IResponseModel,
9+
create_response_model,
10+
)
711
from ellar.serializer import BaseSerializer, Serializer
812

913
if t.TYPE_CHECKING: # pragma: no cover
@@ -70,7 +74,7 @@ def validate_root(cls, values: t.Any):
7074

7175
response = values["response"]
7276
if not response:
73-
values["response"] = {200: EmptyAPIResponseModel.create_model()}
77+
values["response"] = {200: create_response_model(EmptyAPIResponseModel)}
7478
elif not isinstance(response, dict):
7579
values["response"] = {200: response}
7680
return values

ellar/openapi/builder.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ def __init__(self) -> None:
4141
self._build.setdefault("openapi", default_openapi_version)
4242

4343
def set_openapi_version(self, openapi_version: str) -> "OpenAPIDocumentBuilder":
44+
"""
45+
Sets OpenAPI version
46+
This is not fully supported yet
47+
:param openapi_version:
48+
:return: "OpenAPIDocumentBuilder"
49+
"""
4450
self._build["openapi"] = openapi_version
4551
return self
4652

tests/schema.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
from dataclasses import dataclass
2+
from datetime import datetime
23
from typing import Optional, Union
34

4-
from pydantic import BaseModel
5+
from pydantic import BaseModel, Field
6+
7+
from ellar.core.schema import Schema
58

69

710
class BlogObjectDTO:
@@ -26,3 +29,15 @@ class Item(BaseModel):
2629
class User(BaseModel):
2730
username: str
2831
full_name: Optional[str] = None
32+
33+
34+
class Filter(Schema):
35+
to_datetime: datetime = Field(alias="to")
36+
from_datetime: datetime = Field(alias="from")
37+
38+
39+
class CreateCarSchema(Schema):
40+
name: str
41+
model: str
42+
brand: str
43+
author: User

tests/test_common/test_decorators/test_openapi.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
from ellar.common import openapi
1+
from ellar.common import openapi_info
22
from ellar.compatible import AttributeDict
33
from ellar.constants import OPENAPI_KEY
44
from ellar.reflect import reflect
55

66

7-
@openapi(
7+
@openapi_info(
88
summary="Endpoint Summary",
99
description="Endpoint Description",
1010
deprecated=False,

0 commit comments

Comments
 (0)