@@ -26,6 +26,8 @@ def validate_expression(
2626 match expression_type :
2727 case "DATETIME" :
2828 return self ._validate_datetime (expression_rule , field_name , field_value , row )
29+ case "STRING" :
30+ return self ._validate_for_string_values (expression_rule , field_name , field_value , row )
2931 case "DATE" :
3032 return self ._validate_datetime (expression_rule , field_name , field_value , row )
3133 case "UUID" :
@@ -426,6 +428,47 @@ def _validate_empty(self, _expression_rule: str, field_name: str, field_value: s
426428 message = MESSAGES [ExceptionLevels .UNEXPECTED_EXCEPTION ] % (e .__class__ .__name__ , e )
427429 return ErrorReport (ExceptionLevels .UNEXPECTED_EXCEPTION , message , row , field_name , "" , self .summarise )
428430
431+ # String Pre-Validation
432+ def _validate_for_string_values (
433+ self , _expression_rule : str , field_name : str , field_value : str , row : dict
434+ ) -> ErrorReport :
435+ """
436+ Apply validation to a string field to ensure it is a non-empty string which meets
437+ the length requirements and predefined values requirements
438+ """
439+ defined_length : int = (10 ,)
440+ max_length : int = (None ,)
441+ predefined_values : list = (None ,)
442+ spaces_allowed : bool = False
443+ try :
444+ if not isinstance (field_value , str ):
445+ raise TypeError (f"{ field_name } must be a string" )
446+
447+ if field_value .isspace ():
448+ raise ValueError (f"{ field_name } must be a non-empty string" )
449+
450+ if defined_length :
451+ if len (field_value ) != defined_length :
452+ raise ValueError (f"{ field_name } must be { defined_length } characters" )
453+ else :
454+ if len (field_value ) == 0 :
455+ raise ValueError (f"{ field_name } must be a non-empty string" )
456+
457+ if max_length :
458+ if len (field_value ) > max_length :
459+ raise ValueError (f"{ field_name } must be { max_length } or fewer characters" )
460+ if predefined_values :
461+ if field_value not in predefined_values :
462+ raise ValueError (f"{ field_name } must be one of the following: " + str (", " .join (predefined_values )))
463+
464+ if not spaces_allowed :
465+ if " " in field_value :
466+ raise ValueError (f"{ field_name } must not contain spaces" )
467+ except Exception as e :
468+ if self .report_unexpected_exception :
469+ message = MESSAGES [ExceptionLevels .UNEXPECTED_EXCEPTION ] % (e .__class__ .__name__ , e )
470+ return ErrorReport (ExceptionLevels .UNEXPECTED_EXCEPTION , message , row , field_name , "" , self .summarise )
471+
429472 # Not Empty Validate
430473 def _validate_not_empty (self , _expression_rule : str , field_name : str , field_value : str , row : dict ) -> ErrorReport :
431474 try :
0 commit comments