def _get_param_type(self, name: str, arg: inspect.Parameter) -> FuncParam: # _EMPTY = self.signature.empty annotation = arg.annotation if annotation == self.signature.empty: if arg.default == self.signature.empty: annotation = str else: if isinstance(arg.default, params.Param): annotation = type(arg.default.default) else: annotation = type(arg.default) if annotation == type(None) or annotation == type(Ellipsis): # noqa annotation = str is_collection = is_collection_type(annotation) if annotation == UploadedFile or ( is_collection and annotation.__args__[0] == UploadedFile): # People often forgot to mark UploadedFile as a File, so we better assign it automatically if arg.default == self.signature.empty or arg.default is None: default = arg.default == self.signature.empty and ... or arg.default return FuncParam(name, name, File(default), annotation, is_collection) # 1) if type of the param is defined as one of the Param's subclasses - we just use that definition if isinstance(arg.default, params.Param): param_source = arg.default # 2) if param name is a part of the path parameter elif name in self.path_params_names: assert (arg.default == self.signature.empty ), f"'{name}' is a path param, default not allowed" param_source = params.Path(...) # 3) if param is a collection, or annotation is part of pydantic model: elif is_collection or is_pydantic_model(annotation): if arg.default == self.signature.empty: param_source = params.Body(...) else: param_source = params.Body(arg.default) # 4) the last case is query param else: if arg.default == self.signature.empty: param_source = params.Query(...) else: param_source = params.Query(arg.default) return FuncParam(name, param_source.alias or name, param_source, annotation, is_collection)
def Body( # noqa: N802 default: Any, *, alias: Optional[str] = None, title: Optional[str] = None, description: Optional[str] = None, gt: Optional[float] = None, ge: Optional[float] = None, lt: Optional[float] = None, le: Optional[float] = None, min_length: Optional[int] = None, max_length: Optional[int] = None, regex: Optional[str] = None, deprecated: Optional[bool] = None, **extra: Any, ) -> Any: return params.Body( default, alias=alias, title=title, description=description, gt=gt, ge=ge, lt=lt, le=le, min_length=min_length, max_length=max_length, regex=regex, deprecated=deprecated, **extra, )
def _get_param_type(self, name: str, arg: inspect.Parameter) -> FuncParam: # _EMPTY = self.signature.empty annotation = arg.annotation if annotation == self.signature.empty: if arg.default == self.signature.empty: annotation = str else: if isinstance(arg.default, params.Param): annotation = type(arg.default.default) else: annotation = type(arg.default) if annotation == type(None) or annotation == type(Ellipsis): # noqa annotation = str is_collection = is_collection_type(annotation) # 1) if type of the param is defined as one of the Param's subclasses - we just use that definition if isinstance(arg.default, params.Param): param_source = arg.default # 2) if param name is a part of the path parameter elif name in self.path_params_names: assert arg.default == self.signature.empty, "'{name}' is a path param" param_source = params.Path(...) # 3) if param have no type annotation or annotation is not part of pydantic model: elif is_collection or is_pydantic_model(annotation): if arg.default == self.signature.empty: param_source = params.Body(...) else: param_source = params.Body(arg.default) # 4) the last case is body param else: if arg.default == self.signature.empty: param_source = params.Query(...) else: param_source = params.Query(arg.default) return FuncParam(name, param_source, annotation, is_collection)