|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
| 3 | +from functools import partial |
3 | 4 | from typing import TYPE_CHECKING |
4 | 5 |
|
5 | 6 | from litestar._openapi.schema_generation import SchemaCreator |
|
14 | 15 | from litestar.typing import FieldDefinition |
15 | 16 |
|
16 | 17 | if TYPE_CHECKING: |
| 18 | + from collections.abc import Mapping |
| 19 | + |
17 | 20 | from litestar._openapi.datastructures import OpenAPIContext |
18 | 21 | from litestar.handlers.base import BaseRouteHandler |
19 | 22 | from litestar.openapi.spec import Reference |
|
24 | 27 | _PARAM_TYPE_ORDER = {"path": 0, "query": 1, "cookie": 2, "header": 3} |
25 | 28 |
|
26 | 29 |
|
| 30 | +def _parameter_sort_key(parameter: Parameter, path_order: Mapping[str, int]) -> tuple[int, int | str]: |
| 31 | + if parameter.param_in == ParamType.PATH: |
| 32 | + return _PARAM_TYPE_ORDER[ParamType.PATH], path_order[parameter.name] |
| 33 | + return _PARAM_TYPE_ORDER[parameter.param_in], parameter.name |
| 34 | + |
| 35 | + |
27 | 36 | class ParameterCollection: |
28 | 37 | """Facilitates conditional deduplication of parameters. |
29 | 38 |
|
@@ -265,13 +274,7 @@ def _order_parameters(self, parameters: list[Parameter]) -> list[Parameter]: |
265 | 274 | The parameters, ordered by type and then by url position or name. |
266 | 275 | """ |
267 | 276 | path_order = {name: index for index, name in enumerate(self.path_parameters)} |
268 | | - return sorted( |
269 | | - parameters, |
270 | | - key=lambda parameter: ( |
271 | | - _PARAM_TYPE_ORDER[parameter.param_in], |
272 | | - path_order[parameter.name] if parameter.param_in == ParamType.PATH else parameter.name, |
273 | | - ), |
274 | | - ) |
| 277 | + return sorted(parameters, key=partial(_parameter_sort_key, path_order=path_order)) |
275 | 278 |
|
276 | 279 |
|
277 | 280 | def create_parameters_for_handler( |
|
0 commit comments