@@ -9,7 +9,7 @@ from flask import Response, g, request
99
1010from flask_inputfilter.exceptions import ValidationError
1111
12- from flask_inputfilter.mixins.cimports cimport FieldMixin
12+ from flask_inputfilter.mixins.cimports cimport DataMixin
1313from flask_inputfilter.models.cimports cimport BaseCondition, BaseFilter, BaseValidator, ExternalApiConfig, FieldModel
1414
1515from libcpp.vector cimport vector
@@ -180,14 +180,12 @@ cdef class InputFilter:
180180 """
181181 data = data or self .data
182182 cdef:
183- dict [str , str ] errors = {},
184- dict [str , Any] validated_data = {}
183+ dict [str , str ] errors
184+ dict [str , Any] validated_data
185185
186- validated_data, errors = FieldMixin.validate_fields(
187- self .fields, data, self .global_filters, self .global_validators)
188-
189- if self .conditions:
190- self ._check_all_conditions(validated_data, errors)
186+ validated_data, errors = DataMixin.validate_with_conditions(
187+ self .fields, data, self .global_filters, self .global_validators, self .conditions
188+ )
191189
192190 if errors:
193191 raise ValidationError(errors)
@@ -230,25 +228,7 @@ cdef class InputFilter:
230228 represent field names and values represent the associated
231229 data to be filtered and stored.
232230 """
233- self .data = {}
234- cdef:
235- Py_ssize_t i, n = len (data) if data else 0
236- list keys = list (data.keys()) if n > 0 else []
237- list values = list (data.values()) if n > 0 else []
238- str field_name
239- object field_value
240-
241- for i in range (n):
242- field_name = keys[i]
243- field_value = values[i]
244- if field_name in self .fields:
245- field_value = FieldMixin.apply_filters(
246- self .fields[field_name].filters,
247- self .global_filters,
248- field_value,
249- )
250-
251- self .data[field_name] = field_value
231+ self .data = DataMixin.filter_data(data, self .fields, self .global_filters)
252232
253233 cpdef object get_value(self , str name):
254234 """
@@ -371,21 +351,7 @@ cdef class InputFilter:
371351 Returns:
372352 bool: True if there are any unknown fields; False otherwise.
373353 """
374- if not self .data and self .fields:
375- return True
376- cdef set field_set
377-
378- if len (self .fields) > 10 :
379- field_set = set (self .fields.keys())
380- for field_name in self .data.keys():
381- if field_name not in field_set:
382- return True
383- else :
384- for field_name in self .data.keys():
385- if field_name not in self .fields:
386- return True
387-
388- return False
354+ return DataMixin.has_unknown_fields(self .data, self .fields)
389355
390356 cpdef str get_error_message(self , str field_name):
391357 """
@@ -658,41 +624,7 @@ cdef class InputFilter:
658624 " Can only merge with another InputFilter instance."
659625 )
660626
661- cdef:
662- Py_ssize_t i, n
663- dict other_inputs = other.get_inputs()
664- list keys = list (other_inputs.keys()) if other_inputs else []
665- list new_fields = list (other_inputs.values()) if other_inputs else []
666-
667- # Merge fields
668- n = len (keys)
669- for i in range (n):
670- self .fields[keys[i]] = new_fields[i]
671-
672- # Merge conditions
673- self .conditions += other.conditions
674-
675- # Merge global filters (avoid duplicates by type)
676- for filter in other.global_filters:
677- existing_type_map = {
678- type (v): i for i, v in enumerate (self .global_filters)
679- }
680- if type (filter ) in existing_type_map:
681- self .global_filters[existing_type_map[type (filter )]] = filter
682- else :
683- self .global_filters.append(filter )
684-
685- # Merge global validators (avoid duplicates by type)
686- for validator in other.global_validators:
687- existing_type_map = {
688- type (v): i for i, v in enumerate (self .global_validators)
689- }
690- if type (validator) in existing_type_map:
691- self .global_validators[
692- existing_type_map[type (validator)]
693- ] = validator
694- else :
695- self .global_validators.append(validator)
627+ DataMixin.merge_input_filters(self , other)
696628
697629 cpdef void set_model(self , model_class: Type[T]):
698630 """
@@ -739,16 +671,3 @@ cdef class InputFilter:
739671 list[BaseValidator]: A list of global validators.
740672 """
741673 return self .global_validators
742-
743- cdef inline void _check_all_conditions(self , dict [str , Any] validated_data, dict [str , str ] errors):
744- """
745- Check all conditions against the validated data.
746-
747- Args:
748- validated_data (dict[str, Any]): The data that has been validated.
749- errors (dict[str, str]): A dictionary to store any validation errors.
750- """
751- try :
752- FieldMixin.check_conditions(self .conditions, validated_data)
753- except ValidationError as e:
754- errors[_INTERNED_STRINGS[" _condition" ]] = str (e)
0 commit comments