33# cython: wraparound=False
44# cython: cdivision=True
55
6+ from .._input_filter cimport InputFilter
7+ from flask_inputfilter.models.cimports cimport BaseFilter, BaseValidator, ExternalApiConfig
68
79cdef class FieldDescriptor:
810 """
@@ -18,14 +20,23 @@ cdef class FieldDescriptor:
1820 - **default** (*Any*): Default value if field is missing.
1921 - **fallback** (*Any*): Fallback value if validation fails.
2022 - **filters** (*Optional[list[BaseFilter]]*): List of filters to apply.
21- - **validators** (*Optional[list[BaseValidator]]*): List of validators to apply.
22- - **steps** (*Optional[list[Union[BaseFilter, BaseValidator]]]*): List of combined filters and validators.
23- - **external_api** (*Optional[ExternalApiConfig]*): External API configuration.
24- - **copy** (*Optional[str]*): Field to copy value from if this field is missing.
23+ - **validators** (*Optional[list[BaseValidator]]*): List of validators
24+ to apply.
25+ - **steps** (*Optional[list[Union[BaseFilter, BaseValidator]]]*): List of
26+ combined filters and validators.
27+ - **external_api** (*Optional[ExternalApiConfig]*): External API
28+ configuration.
29+ - **copy** (*Optional[str]*): Field to copy value from if this field
30+ is missing.
31+ - **computed** (*Optional[Callable[[dict[str, Any]], Any]]*): A callable
32+ that computes the field value from validated data.
33+ - **input_filter** (*Optional[InputFilter]*): An InputFilter class for
34+ nested validation.
2535
2636 **Expected Behavior:**
2737
28- Automatically registers field configuration during class creation and provides
38+ Automatically registers field configuration during class creation and
39+ provides
2940 attribute access to validated field values.
3041 """
3142
@@ -34,12 +45,13 @@ cdef class FieldDescriptor:
3445 bint required = False ,
3546 object default = None ,
3647 object fallback = None ,
37- list filters = None ,
38- list validators = None ,
39- list steps = None ,
40- object external_api = None ,
48+ list[BaseFilter] filters = None ,
49+ list[BaseValidator] validators = None ,
50+ list[BaseFilter | BaseValidator] steps = None ,
51+ ExternalApiConfig external_api = None ,
4152 str copy = None ,
4253 object computed = None ,
54+ InputFilter input_filter = None ,
4355 ) -> None:
4456 """
4557 Initialize a field descriptor.
@@ -62,6 +74,8 @@ cdef class FieldDescriptor:
6274 from .
6375 - ** computed** (* Optional[Callable[[dict [str , Any]], Any]]* ): A callable
6476 that computes the field value from validated data.
77+ - ** input_filter** (* Optional[InputFilter]* ): An InputFilter class
78+ for nested validation.
6579 """
6680 self.required = required
6781 self._default = default
@@ -72,6 +86,7 @@ cdef class FieldDescriptor:
7286 self.external_api = external_api
7387 self.copy = copy
7488 self.computed = computed
89+ self.input_filter = input_filter
7590 self.name = None
7691
7792 @property
@@ -147,6 +162,11 @@ cdef class FieldDescriptor:
147162 f"required={self.required}, "
148163 f"default={self.default!r}, "
149164 f"filters={len(self.filters)}, "
150- f"validators={len(self.validators)}"
165+ f"validators={len(self.validators)}, "
166+ f"steps={len(self.steps)}, "
167+ f"external_api={self.external_api!r}, "
168+ f"copy={self.copy!r}, "
169+ f"computed={self.computed!r}, "
170+ f"input_filter={self.input_filter!r}"
151171 f")"
152172 )
0 commit comments