Esempio n. 1
0
def add_param_to_fields(*, field: Field, dependant: Dependant) -> None:
    field.schema = cast(params.Param, field.schema)
    if field.schema.in_ == params.ParamTypes.path:
        dependant.path_params.append(field)
    elif field.schema.in_ == params.ParamTypes.query:
        dependant.query_params.append(field)
    elif field.schema.in_ == params.ParamTypes.header:
        dependant.header_params.append(field)
    else:
        assert (
            field.schema.in_ == params.ParamTypes.cookie
        ), f"non-body parameters must be in path, query, header or cookie: {field.name}"
        dependant.cookie_params.append(field)
Esempio n. 2
0
def create_cloned_field(field: Field) -> Field:
    original_type = field.type_
    if is_dataclass(original_type) and hasattr(original_type,
                                               "__pydantic_model__"):
        original_type = original_type.__pydantic_model__  # type: ignore
    use_type = original_type
    if lenient_issubclass(original_type, BaseModel):
        original_type = cast(Type[BaseModel], original_type)
        use_type = create_model(  # type: ignore
            original_type.__name__,
            __config__=original_type.__config__,
            __validators__=original_type.__validators__,
        )
        for f in original_type.__fields__.values():
            use_type.__fields__[f.name] = f
    new_field = Field(
        name=field.name,
        type_=use_type,
        class_validators={},
        default=None,
        required=False,
        model_config=BaseConfig,
        schema=Schema(None),
    )
    new_field.has_alias = field.has_alias
    new_field.alias = field.alias
    new_field.class_validators = field.class_validators
    new_field.default = field.default
    new_field.required = field.required
    new_field.model_config = field.model_config
    new_field.schema = field.schema
    new_field.allow_none = field.allow_none
    new_field.validate_always = field.validate_always
    if field.sub_fields:
        new_field.sub_fields = [
            create_cloned_field(sub_field) for sub_field in field.sub_fields
        ]
    if field.key_field:
        new_field.key_field = create_cloned_field(field.key_field)
    new_field.validators = field.validators
    new_field.whole_pre_validators = field.whole_pre_validators
    new_field.whole_post_validators = field.whole_post_validators
    new_field.parse_json = field.parse_json
    new_field.shape = field.shape
    new_field._populate_validators()
    return new_field
Esempio n. 3
0
def get_openapi_operation_request_body(
    *, body_field: Field, model_name_map: Dict[Type, str]
) -> Optional[Dict]:
    if not body_field:
        return None
    assert isinstance(body_field, Field)
    body_schema, _ = field_schema(
        body_field, model_name_map=model_name_map, ref_prefix=REF_PREFIX
    )
    body_field.schema = cast(Body, body_field.schema)
    request_media_type = body_field.schema.media_type
    required = body_field.required
    request_body_oai: Dict[str, Any] = {}
    if required:
        request_body_oai["required"] = required
    request_body_oai["content"] = {request_media_type: {"schema": body_schema}}
    return request_body_oai
Esempio n. 4
0
def get_param_field(
    *,
    param: inspect.Parameter,
    default_schema: Type[params.Param] = params.Param,
    force_type: params.ParamTypes = None,
) -> Field:
    default_value = Required
    had_schema = False
    if not param.default == param.empty:
        default_value = param.default
    if isinstance(default_value, Schema):
        had_schema = True
        schema = default_value
        default_value = schema.default
        if isinstance(schema,
                      params.Param) and getattr(schema, "in_", None) is None:
            schema.in_ = default_schema.in_
        if force_type:
            schema.in_ = force_type
    else:
        schema = default_schema(default_value)
    required = default_value == Required
    annotation: Any = Any
    if not param.annotation == param.empty:
        annotation = param.annotation
    annotation = get_annotation_from_schema(annotation, schema)
    if not schema.alias and getattr(schema, "convert_underscores", None):
        alias = param.name.replace("_", "-")
    else:
        alias = schema.alias or param.name
    field = Field(
        name=param.name,
        type_=annotation,
        default=None if required else default_value,
        alias=alias,
        required=required,
        model_config=BaseConfig,
        class_validators={},
        schema=schema,
    )
    if not had_schema and not is_scalar_field(field=field):
        field.schema = params.Body(schema.default)
    return field