Source code for fitrequest.request_params
import inspect
from collections.abc import Callable
from typing import Annotated, Any
from pydantic import BaseModel, BeforeValidator, ConfigDict, Field, PlainSerializer, create_model
from fitrequest.errors import InvalidParamsTypeError
from fitrequest.method_models import environment_models
from fitrequest.utils import (
check_reserved_names,
is_basemodel_subclass,
reserved_fitrequest_names,
reserved_httpx_names,
)
[docs]
def validate_init_value(value: Any) -> type[BaseModel] | None:
"""
Validate the provided parameters.
If a string is given, attempts to retrieve the corresponding model from the global environment.
If a list of fields' names is supplied, dynamically create a Pydantic model
to standardize the data type processed by `fitrequest` during method generation.
Raise an `InvalidParamsTypeError` if the provided value has an incorrect type.
"""
if isinstance(value, str):
value = environment_models.get(value, value)
if value is None:
return None
if is_basemodel_subclass(value):
check_reserved_names(set(value.model_fields))
return value
if isinstance(value, list):
attributes = dict.fromkeys(value, (str, None))
check_reserved_names(set(attributes))
return create_model('DynamicParamsModel', **attributes, __config__=ConfigDict(extra='allow'))
raise InvalidParamsTypeError(provided_params=value)
ValidParams = Annotated[
type[BaseModel] | list[str] | str | None,
Field(validate_default=True),
BeforeValidator(validate_init_value),
PlainSerializer(lambda model: getattr(model, '__qualname__', None), return_type=str),
]