Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Split openapi.create_paramter_for_handler into several methods to reduce complexity #292

Merged
merged 3 commits into from
Jul 21, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ dist/
node_modules/
results/
site/
.scannerwork/

# files
*.iml
Expand Down
115 changes: 74 additions & 41 deletions starlite/openapi/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from pydantic.fields import ModelField

from starlite.handlers import BaseRouteHandler
from starlite.provide import Provide


def create_path_parameter_schema(
Expand Down Expand Up @@ -115,6 +116,64 @@ def create_parameter(
)


def _get_unlayered_params(
field_name: str,
model_field: "ModelField",
dependencies: Dict[str, "Provide"],
route_handler: "BaseRouteHandler",
path_parameters: List[Dict[str, Any]],
generate_examples: bool,
) -> List[Parameter]:
if field_name not in dependencies:
return [
create_parameter(
model_field=model_field,
parameter_name=field_name,
path_parameters=path_parameters,
generate_examples=generate_examples,
)
]
dependency_fields = cast(BaseModel, dependencies[field_name].signature_model).__fields__
return create_parameter_for_handler(route_handler, dependency_fields, path_parameters, generate_examples)


def _get_layered_param(
field_name: str,
signature_model_field: "ModelField",
layered_parameters: Dict[str, "ModelField"],
path_parameters: List[Dict[str, Any]],
generate_examples: bool,
) -> Parameter:
layer_field_info = layered_parameters[field_name].field_info
signature_field_info = signature_model_field.field_info

field_info = layer_field_info
# allow users to manually override Parameter definition using Parameter
if signature_field_info.extra.get(EXTRA_KEY_IS_PARAMETER):
field_info = signature_field_info

field_info.default = (
signature_field_info.default
if signature_field_info.default not in [Undefined, Ellipsis]
else layer_field_info.default
)

model_field = copy(signature_model_field)
model_field.field_info = field_info

extra = field_info.extra
parameter_name = (
extra.get(ParamType.QUERY) or extra.get(ParamType.HEADER) or extra.get(ParamType.COOKIE) or field_name
)

return create_parameter(
model_field=model_field,
parameter_name=parameter_name,
path_parameters=path_parameters,
generate_examples=generate_examples,
)


def create_parameter_for_handler(
route_handler: "BaseRouteHandler",
handler_fields: Dict[str, "ModelField"],
Expand All @@ -135,21 +194,16 @@ def create_parameter_for_handler(
if extra.get("is_dependency") and field_name not in dependencies:
# never document explicit dependencies
continue
if field_name in dependencies:
dependency_fields = cast(BaseModel, dependencies[field_name].signature_model).__fields__
for parameter in create_parameter_for_handler(
route_handler, dependency_fields, path_parameters, generate_examples
):
parameters.add(parameter)
else:
parameters.add(
create_parameter(
model_field=model_field,
parameter_name=field_name,
path_parameters=path_parameters,
generate_examples=generate_examples,
)
)
for parameter in _get_unlayered_params(
field_name=field_name,
model_field=model_field,
dependencies=dependencies,
route_handler=route_handler,
path_parameters=path_parameters,
generate_examples=generate_examples,
):
parameters.add(parameter)

for field_name, model_field in filter(
lambda items: items[0] not in RESERVED_KWARGS and items[0] not in handler_fields, layered_parameters.items()
):
Expand All @@ -164,35 +218,14 @@ def create_parameter_for_handler(
for field_name, signature_model_filed in filter(
lambda items: items[0] not in RESERVED_KWARGS and items[0] in layered_parameters, handler_fields.items()
):

layer_field_info = layered_parameters[field_name].field_info
signature_field_info = signature_model_filed.field_info

field_info = layer_field_info
# allow users to manually override Parameter definition using Parameter
if signature_field_info.extra.get(EXTRA_KEY_IS_PARAMETER):
field_info = signature_field_info

field_info.default = (
signature_field_info.default
if signature_field_info.default not in [Undefined, Ellipsis]
else layer_field_info.default
)

model_field = copy(signature_model_filed)
model_field.field_info = field_info

extra = field_info.extra
parameter_name = (
extra.get(ParamType.QUERY) or extra.get(ParamType.HEADER) or extra.get(ParamType.COOKIE) or field_name
)

parameters.add(
create_parameter(
model_field=model_field,
parameter_name=parameter_name,
_get_layered_param(
field_name=field_name,
signature_model_field=signature_model_filed,
layered_parameters=layered_parameters,
path_parameters=path_parameters,
generate_examples=generate_examples,
)
)

return parameters.list()
2 changes: 1 addition & 1 deletion tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ envlist = py37,py38,py39,py310,lint
[testenv]
whitelist_externals = poetry
commands =
poetry install -v
poetry install -v -E brotli
poetry run pytest .

[testenv:lint]
Expand Down