def parse( cls: Type[T], *, call: Callable[..., Any], parameterless: Optional[List[Any]] = None, allow_types: Optional[List[Type[Param]]] = None, ) -> T: signature = get_typed_signature(call) params = signature.parameters dependent = cls( call=call, allow_types=allow_types, ) for param_name, param in params.items(): default_value = Required if param.default != param.empty: default_value = param.default if isinstance(default_value, Param): field_info = default_value default_value = field_info.default else: field_info = dependent.parse_param(param_name, param) default_value = field_info.default annotation: Any = Any required = default_value == Required if param.annotation != param.empty: annotation = param.annotation annotation = get_annotation_from_field_info( annotation, field_info, param_name ) dependent.params.append( ModelField( name=param_name, type_=annotation, class_validators=None, model_config=CustomConfig, default=None if required else default_value, required=required, field_info=field_info, ) ) parameterless_params = [ dependent.parse_parameterless(param) for param in (parameterless or []) ] dependent.parameterless.extend(parameterless_params) logger.trace( f"Parsed dependent with call={call}, " f"params={[param.field_info for param in dependent.params]}, " f"parameterless={dependent.parameterless}" ) return dependent
def get_param_field( *, param: inspect.Parameter, param_name: str, default_field_info: Type[params.Param] = params.Param, force_type: Optional[params.ParamTypes] = None, ignore_default: bool = False, ) -> ModelField: default_value: Any = Undefined had_schema = False if not param.default == param.empty and ignore_default is False: default_value = param.default if isinstance(default_value, FieldInfo): had_schema = True field_info = default_value default_value = field_info.default if (isinstance(field_info, params.Param) and getattr(field_info, "in_", None) is None): field_info.in_ = default_field_info.in_ if force_type: field_info.in_ = force_type # type: ignore else: field_info = default_field_info(default=default_value) required = True if default_value is Required or ignore_default: required = True default_value = None elif default_value is not Undefined: required = False annotation: Any = Any if not param.annotation == param.empty: annotation = param.annotation annotation = get_annotation_from_field_info(annotation, field_info, param_name) if not field_info.alias and getattr(field_info, "convert_underscores", None): alias = param.name.replace("_", "-") else: alias = field_info.alias or param.name field = create_response_field( name=param.name, type_=annotation, default=default_value, alias=alias, required=required, field_info=field_info, ) if not had_schema and not is_scalar_field(field=field): field.field_info = params.Body(field_info.default) if not had_schema and lenient_issubclass(field.type_, UploadFile): field.field_info = params.File(field_info.default) return field
def get_param_field( *, param: inspect.Parameter, param_name: str, default_field_info: Type[params.Param] = params.Param, force_type: params.ParamTypes = None, ignore_default: bool = False, ) -> ModelField: default_value = Required had_schema = False if not param.default == param.empty and ignore_default is False: default_value = param.default if isinstance(default_value, FieldInfo): had_schema = True field_info = default_value default_value = field_info.default if (isinstance(field_info, params.Param) and getattr(field_info, "in_", None) is None): field_info.in_ = default_field_info.in_ if force_type: field_info.in_ = force_type # type: ignore else: field_info = default_field_info(default_value) required = default_value == Required annotation: Any = Any if not param.annotation == param.empty: annotation = param.annotation annotation = get_annotation_from_field_info(annotation, field_info, param_name) if not field_info.alias and getattr(field_info, "convert_underscores", None): alias = param.name.replace("_", "-") else: alias = field_info.alias or param.name field = create_response_field( name=param.name, type_=annotation, default=None if required else default_value, alias=alias, required=required, field_info=field_info, ) field.required = required if not had_schema and not is_scalar_field(field=field): if PYDANTIC_1: field.field_info = params.Body(field_info.default) else: field.schema = params.Body( field_info.default) # type: ignore # pragma: nocover return field
def get_param_field( cls, *, param: inspect.Parameter, default_field_info_class: Type[Param] = Param ) -> ModelField: """Wrapper param to pydantic ModelField""" default_value = Required had_schema = False if param.default != param.empty: default_value = param.default # wrapper default_value to spec param if isinstance(default_value, FieldInfo): had_schema = True field_info = default_value default_value = field_info.default if ( isinstance(field_info, Param) and getattr(field_info, "in_", None) is None ): field_info.in_ = default_field_info_class.in_ else: field_info = default_field_info_class(default_value) required = default_value == Required annotation: Any = Any if not param.annotation == param.empty: annotation = param.annotation annotation = get_annotation_from_field_info(annotation, field_info, param.name) if not field_info.alias and getattr(field_info, "convert_underscores", None): # header alias = param.name.replace("_", "-") else: alias = field_info.alias or param.name field = cls.create_model_field( name=param.name, type_=annotation, default=None if required else default_value, alias=alias, required=required, field_info=field_info, ) if not had_schema and not cls.is_scalar_field(field=field): field.field_info = Body(field_info.default) return field