|
| 1 | +from __future__ import annotations |
| 2 | + |
| 3 | +from typing import TYPE_CHECKING, Any, Optional, Union |
| 4 | + |
| 5 | +from .field_descriptor import FieldDescriptor |
| 6 | + |
| 7 | +if TYPE_CHECKING: |
| 8 | + from flask_inputfilter.models import ( |
| 9 | + BaseFilter, |
| 10 | + BaseValidator, |
| 11 | + ExternalApiConfig, |
| 12 | + ) |
| 13 | + |
| 14 | + |
| 15 | +def field( |
| 16 | + required: bool = False, |
| 17 | + default: Any = None, |
| 18 | + fallback: Any = None, |
| 19 | + filters: Optional[list[BaseFilter]] = None, |
| 20 | + validators: Optional[list[BaseValidator]] = None, |
| 21 | + steps: Optional[list[Union[BaseFilter, BaseValidator]]] = None, |
| 22 | + external_api: Optional[ExternalApiConfig] = None, |
| 23 | + copy: Optional[str] = None, |
| 24 | +) -> FieldDescriptor: |
| 25 | + """ |
| 26 | + Create a field descriptor for declarative field definition. |
| 27 | +
|
| 28 | + This function creates a FieldDescriptor that can be used as a class |
| 29 | + attribute to define input filter fields declaratively. |
| 30 | +
|
| 31 | + **Parameters:** |
| 32 | +
|
| 33 | + - **required** (*bool*): Whether the field is required. Default: False. |
| 34 | + - **default** (*Any*): The default value of the field. Default: None. |
| 35 | + - **fallback** (*Any*): The fallback value of the field, if |
| 36 | + validations fail or field is None, although it is required. Default: None. |
| 37 | + - **filters** (*Optional[list[BaseFilter]]*): The filters to apply to |
| 38 | + the field value. Default: None. |
| 39 | + - **validators** (*Optional[list[BaseValidator]]*): The validators to |
| 40 | + apply to the field value. Default: None. |
| 41 | + - **steps** (*Optional[list[Union[BaseFilter, BaseValidator]]]*): Allows |
| 42 | + to apply multiple filters and validators in a specific order. Default: None. |
| 43 | + - **external_api** (*Optional[ExternalApiConfig]*): Configuration for an |
| 44 | + external API call. Default: None. |
| 45 | + - **copy** (*Optional[str]*): The name of the field to copy the value |
| 46 | + from. Default: None. |
| 47 | +
|
| 48 | + **Returns:** |
| 49 | +
|
| 50 | + A field descriptor configured with the given parameters. |
| 51 | +
|
| 52 | + **Example:** |
| 53 | +
|
| 54 | + .. code-block:: python |
| 55 | +
|
| 56 | + from flask_inputfilter import InputFilter |
| 57 | + from flask_inputfilter.declarative import field |
| 58 | + from flask_inputfilter.validators import IsStringValidator |
| 59 | +
|
| 60 | + class UserInputFilter(InputFilter): |
| 61 | + name: str = field(required=True, validators=[IsStringValidator()]) |
| 62 | + age: int = field(required=True, default=18) |
| 63 | + """ |
| 64 | + return FieldDescriptor( |
| 65 | + required=required, |
| 66 | + default=default, |
| 67 | + fallback=fallback, |
| 68 | + filters=filters, |
| 69 | + validators=validators, |
| 70 | + steps=steps, |
| 71 | + external_api=external_api, |
| 72 | + copy=copy, |
| 73 | + ) |
0 commit comments