|
10 | 10 | from functools import partial
|
11 | 11 | from http import HTTPStatus
|
12 | 12 | from typing import (
|
| 13 | + TYPE_CHECKING, |
13 | 14 | Any,
|
14 | 15 | Callable,
|
15 | 16 | Dict,
|
|
29 | 30 |
|
30 | 31 | from aws_lambda_powertools.event_handler import content_types
|
31 | 32 | from aws_lambda_powertools.event_handler.exceptions import NotFoundError, ServiceError
|
32 |
| -from aws_lambda_powertools.event_handler.openapi.compat import ( |
33 |
| - GenerateJsonSchema, |
34 |
| - JsonSchemaValue, |
35 |
| - ModelField, |
36 |
| - get_compat_model_name_map, |
37 |
| - get_definitions, |
38 |
| - get_schema_from_model_field, |
39 |
| -) |
40 |
| -from aws_lambda_powertools.event_handler.openapi.dependant import get_dependant, get_flat_params |
41 |
| -from aws_lambda_powertools.event_handler.openapi.models import Contact, License, OpenAPI, Server, Tag |
42 |
| -from aws_lambda_powertools.event_handler.openapi.params import Dependant, Param |
43 |
| -from aws_lambda_powertools.event_handler.openapi.types import ( |
44 |
| - COMPONENT_REF_TEMPLATE, |
45 |
| - TypeModelOrEnum, |
46 |
| -) |
47 | 33 | from aws_lambda_powertools.event_handler.response import Response
|
48 | 34 | from aws_lambda_powertools.shared.functions import powertools_dev_is_set
|
49 | 35 | from aws_lambda_powertools.shared.json_encoder import Encoder
|
|
66 | 52 | _NAMED_GROUP_BOUNDARY_PATTERN = rf"(?P\1[{_SAFE_URI}{_UNSAFE_URI}\\w]+)"
|
67 | 53 | _ROUTE_REGEX = "^{}$"
|
68 | 54 |
|
| 55 | +if TYPE_CHECKING: |
| 56 | + from aws_lambda_powertools.event_handler.openapi.compat import ( |
| 57 | + JsonSchemaValue, |
| 58 | + ModelField, |
| 59 | + ) |
| 60 | + from aws_lambda_powertools.event_handler.openapi.models import ( |
| 61 | + Contact, |
| 62 | + License, |
| 63 | + OpenAPI, |
| 64 | + Server, |
| 65 | + Tag, |
| 66 | + ) |
| 67 | + from aws_lambda_powertools.event_handler.openapi.params import Dependant |
| 68 | + from aws_lambda_powertools.event_handler.openapi.types import TypeModelOrEnum |
| 69 | + |
69 | 70 |
|
70 | 71 | class ProxyEventType(Enum):
|
71 | 72 | """An enumerations of the supported proxy event types."""
|
@@ -202,7 +203,7 @@ def __init__(
|
202 | 203 | cache_control: Optional[str],
|
203 | 204 | middlewares: Optional[List[Callable[..., Response]]],
|
204 | 205 | description: Optional[str],
|
205 |
| - tags: Optional[List[Tag]], |
| 206 | + tags: Optional[List["Tag"]], |
206 | 207 | ):
|
207 | 208 | """
|
208 | 209 |
|
@@ -339,11 +340,15 @@ def _build_middleware_stack(self, router_middlewares: List[Callable[..., Any]])
|
339 | 340 | def _get_openapi_path(
|
340 | 341 | self,
|
341 | 342 | *,
|
342 |
| - dependant: Dependant, |
| 343 | + dependant: "Dependant", |
343 | 344 | operation_ids: Set[str],
|
344 |
| - model_name_map: Dict[TypeModelOrEnum, str], |
345 |
| - field_mapping: Dict[Tuple[ModelField, Literal["validation", "serialization"]], JsonSchemaValue], |
| 345 | + model_name_map: Dict["TypeModelOrEnum", str], |
| 346 | + field_mapping: Dict[Tuple["ModelField", Literal["validation", "serialization"]], "JsonSchemaValue"], |
346 | 347 | ) -> Tuple[Dict[str, Any], Dict[str, Any]]:
|
| 348 | + from aws_lambda_powertools.event_handler.openapi.dependant import ( |
| 349 | + get_flat_params, |
| 350 | + ) |
| 351 | + |
347 | 352 | path = {}
|
348 | 353 | definitions: Dict[str, Any] = {}
|
349 | 354 |
|
@@ -411,13 +416,18 @@ def _openapi_operation_metadata(self, operation_ids: Set[str]) -> Dict[str, Any]
|
411 | 416 | @staticmethod
|
412 | 417 | def _openapi_operation_parameters(
|
413 | 418 | *,
|
414 |
| - all_route_params: Sequence[ModelField], |
415 |
| - model_name_map: Dict[TypeModelOrEnum, str], |
| 419 | + all_route_params: Sequence["ModelField"], |
| 420 | + model_name_map: Dict["TypeModelOrEnum", str], |
416 | 421 | field_mapping: Dict[
|
417 |
| - Tuple[ModelField, Literal["validation", "serialization"]], |
418 |
| - JsonSchemaValue, |
| 422 | + Tuple["ModelField", Literal["validation", "serialization"]], |
| 423 | + "JsonSchemaValue", |
419 | 424 | ],
|
420 | 425 | ) -> List[Dict[str, Any]]:
|
| 426 | + from aws_lambda_powertools.event_handler.openapi.compat import ( |
| 427 | + get_schema_from_model_field, |
| 428 | + ) |
| 429 | + from aws_lambda_powertools.event_handler.openapi.params import Param |
| 430 | + |
421 | 431 | parameters = []
|
422 | 432 | for param in all_route_params:
|
423 | 433 | field_info = param.field_info
|
@@ -452,16 +462,20 @@ def _openapi_operation_parameters(
|
452 | 462 | def _openapi_operation_return(
|
453 | 463 | *,
|
454 | 464 | operation_id: str,
|
455 |
| - param: Optional[ModelField], |
456 |
| - model_name_map: Dict[TypeModelOrEnum, str], |
| 465 | + param: Optional["ModelField"], |
| 466 | + model_name_map: Dict["TypeModelOrEnum", str], |
457 | 467 | field_mapping: Dict[
|
458 |
| - Tuple[ModelField, Literal["validation", "serialization"]], |
459 |
| - JsonSchemaValue, |
| 468 | + Tuple["ModelField", Literal["validation", "serialization"]], |
| 469 | + "JsonSchemaValue", |
460 | 470 | ],
|
461 | 471 | ) -> Dict[str, Any]:
|
462 | 472 | if param is None:
|
463 | 473 | return {}
|
464 | 474 |
|
| 475 | + from aws_lambda_powertools.event_handler.openapi.compat import ( |
| 476 | + get_schema_from_model_field, |
| 477 | + ) |
| 478 | + |
465 | 479 | return_schema = get_schema_from_model_field(
|
466 | 480 | field=param,
|
467 | 481 | model_name_map=model_name_map,
|
@@ -582,7 +596,7 @@ def route(
|
582 | 596 | compress: bool = False,
|
583 | 597 | cache_control: Optional[str] = None,
|
584 | 598 | description: Optional[str] = None,
|
585 |
| - tags: Optional[List[Tag]] = None, |
| 599 | + tags: Optional[List["Tag"]] = None, |
586 | 600 | middlewares: Optional[List[Callable[..., Any]]] = None,
|
587 | 601 | ):
|
588 | 602 | raise NotImplementedError()
|
@@ -636,7 +650,7 @@ def get(
|
636 | 650 | cache_control: Optional[str] = None,
|
637 | 651 | middlewares: Optional[List[Callable[..., Any]]] = None,
|
638 | 652 | description: Optional[str] = None,
|
639 |
| - tags: Optional[List[Tag]] = None, |
| 653 | + tags: Optional[List["Tag"]] = None, |
640 | 654 | ):
|
641 | 655 | """Get route decorator with GET `method`
|
642 | 656 |
|
@@ -670,7 +684,7 @@ def post(
|
670 | 684 | cache_control: Optional[str] = None,
|
671 | 685 | middlewares: Optional[List[Callable[..., Any]]] = None,
|
672 | 686 | description: Optional[str] = None,
|
673 |
| - tags: Optional[List[Tag]] = None, |
| 687 | + tags: Optional[List["Tag"]] = None, |
674 | 688 | ):
|
675 | 689 | """Post route decorator with POST `method`
|
676 | 690 |
|
@@ -705,7 +719,7 @@ def put(
|
705 | 719 | cache_control: Optional[str] = None,
|
706 | 720 | middlewares: Optional[List[Callable[..., Any]]] = None,
|
707 | 721 | description: Optional[str] = None,
|
708 |
| - tags: Optional[List[Tag]] = None, |
| 722 | + tags: Optional[List["Tag"]] = None, |
709 | 723 | ):
|
710 | 724 | """Put route decorator with PUT `method`
|
711 | 725 |
|
@@ -740,7 +754,7 @@ def delete(
|
740 | 754 | cache_control: Optional[str] = None,
|
741 | 755 | middlewares: Optional[List[Callable[..., Any]]] = None,
|
742 | 756 | description: Optional[str] = None,
|
743 |
| - tags: Optional[List[Tag]] = None, |
| 757 | + tags: Optional[List["Tag"]] = None, |
744 | 758 | ):
|
745 | 759 | """Delete route decorator with DELETE `method`
|
746 | 760 |
|
@@ -774,7 +788,7 @@ def patch(
|
774 | 788 | cache_control: Optional[str] = None,
|
775 | 789 | middlewares: Optional[List[Callable]] = None,
|
776 | 790 | description: Optional[str] = None,
|
777 |
| - tags: Optional[List[Tag]] = None, |
| 791 | + tags: Optional[List["Tag"]] = None, |
778 | 792 | ):
|
779 | 793 | """Patch route decorator with PATCH `method`
|
780 | 794 |
|
@@ -1005,12 +1019,12 @@ def get_openapi_schema(
|
1005 | 1019 | openapi_version: str = "3.1.0",
|
1006 | 1020 | summary: Optional[str] = None,
|
1007 | 1021 | description: Optional[str] = None,
|
1008 |
| - tags: Optional[List[Tag]] = None, |
1009 |
| - servers: Optional[List[Server]] = None, |
| 1022 | + tags: Optional[List["Tag"]] = None, |
| 1023 | + servers: Optional[List["Server"]] = None, |
1010 | 1024 | terms_of_service: Optional[str] = None,
|
1011 |
| - contact: Optional[Contact] = None, |
1012 |
| - license_info: Optional[License] = None, |
1013 |
| - ) -> OpenAPI: |
| 1025 | + contact: Optional["Contact"] = None, |
| 1026 | + license_info: Optional["License"] = None, |
| 1027 | + ) -> "OpenAPI": |
1014 | 1028 | """
|
1015 | 1029 | Returns the OpenAPI schema as a pydantic model.
|
1016 | 1030 |
|
@@ -1043,6 +1057,17 @@ def get_openapi_schema(
|
1043 | 1057 | The OpenAPI schema as a pydantic model.
|
1044 | 1058 | """
|
1045 | 1059 |
|
| 1060 | + from aws_lambda_powertools.event_handler.openapi.compat import ( |
| 1061 | + GenerateJsonSchema, |
| 1062 | + get_compat_model_name_map, |
| 1063 | + get_definitions, |
| 1064 | + ) |
| 1065 | + from aws_lambda_powertools.event_handler.openapi.dependant import get_dependant |
| 1066 | + from aws_lambda_powertools.event_handler.openapi.models import OpenAPI, Server |
| 1067 | + from aws_lambda_powertools.event_handler.openapi.types import ( |
| 1068 | + COMPONENT_REF_TEMPLATE, |
| 1069 | + ) |
| 1070 | + |
1046 | 1071 | # Start with the bare minimum required for a valid OpenAPI schema
|
1047 | 1072 | info: Dict[str, Any] = {"title": title, "version": version}
|
1048 | 1073 |
|
@@ -1119,11 +1144,11 @@ def get_openapi_json_schema(
|
1119 | 1144 | openapi_version: str = "3.1.0",
|
1120 | 1145 | summary: Optional[str] = None,
|
1121 | 1146 | description: Optional[str] = None,
|
1122 |
| - tags: Optional[List[Tag]] = None, |
1123 |
| - servers: Optional[List[Server]] = None, |
| 1147 | + tags: Optional[List["Tag"]] = None, |
| 1148 | + servers: Optional[List["Server"]] = None, |
1124 | 1149 | terms_of_service: Optional[str] = None,
|
1125 |
| - contact: Optional[Contact] = None, |
1126 |
| - license_info: Optional[License] = None, |
| 1150 | + contact: Optional["Contact"] = None, |
| 1151 | + license_info: Optional["License"] = None, |
1127 | 1152 | ) -> str:
|
1128 | 1153 | """
|
1129 | 1154 | Returns the OpenAPI schema as a JSON serializable dict
|
@@ -1177,7 +1202,7 @@ def route(
|
1177 | 1202 | compress: bool = False,
|
1178 | 1203 | cache_control: Optional[str] = None,
|
1179 | 1204 | description: Optional[str] = None,
|
1180 |
| - tags: Optional[List[Tag]] = None, |
| 1205 | + tags: Optional[List["Tag"]] = None, |
1181 | 1206 | middlewares: Optional[List[Callable[..., Any]]] = None,
|
1182 | 1207 | ):
|
1183 | 1208 | """Route decorator includes parameter `method`"""
|
@@ -1556,12 +1581,18 @@ def include_router(self, router: "Router", prefix: Optional[str] = None) -> None
|
1556 | 1581 | self.route(*new_route, middlewares=middlewares)(func) # type: ignore
|
1557 | 1582 |
|
1558 | 1583 | @staticmethod
|
1559 |
| - def _get_fields_from_routes(routes: Sequence[Route]) -> List[ModelField]: |
| 1584 | + def _get_fields_from_routes(routes: Sequence[Route]) -> List["ModelField"]: |
1560 | 1585 | """
|
1561 | 1586 | Returns a list of fields from the routes
|
1562 | 1587 | """
|
1563 |
| - responses_from_routes: List[ModelField] = [] |
1564 |
| - request_fields_from_routes: List[ModelField] = [] |
| 1588 | + |
| 1589 | + from aws_lambda_powertools.event_handler.openapi.dependant import ( |
| 1590 | + get_dependant, |
| 1591 | + get_flat_params, |
| 1592 | + ) |
| 1593 | + |
| 1594 | + responses_from_routes: List["ModelField"] = [] |
| 1595 | + request_fields_from_routes: List["ModelField"] = [] |
1565 | 1596 |
|
1566 | 1597 | for route in routes:
|
1567 | 1598 | dependant = get_dependant(path=route.path, call=route.func)
|
@@ -1592,7 +1623,7 @@ def route(
|
1592 | 1623 | compress: bool = False,
|
1593 | 1624 | cache_control: Optional[str] = None,
|
1594 | 1625 | description: Optional[str] = None,
|
1595 |
| - tags: Optional[List[Tag]] = None, |
| 1626 | + tags: Optional[List["Tag"]] = None, |
1596 | 1627 | middlewares: Optional[List[Callable[..., Any]]] = None,
|
1597 | 1628 | ):
|
1598 | 1629 | def register_route(func: Callable):
|
@@ -1640,7 +1671,7 @@ def route(
|
1640 | 1671 | compress: bool = False,
|
1641 | 1672 | cache_control: Optional[str] = None,
|
1642 | 1673 | description: Optional[str] = None,
|
1643 |
| - tags: Optional[List[Tag]] = None, |
| 1674 | + tags: Optional[List["Tag"]] = None, |
1644 | 1675 | middlewares: Optional[List[Callable[..., Any]]] = None,
|
1645 | 1676 | ):
|
1646 | 1677 | # NOTE: see #1552 for more context.
|
|
0 commit comments