ciyidogan commited on
Commit
95d76b3
·
verified ·
1 Parent(s): 488c215

Upload validation_engine.py

Browse files
Files changed (1) hide show
  1. llm/validation_engine.py +132 -0
llm/validation_engine.py ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Flare – Parameter Validation (locale-aware)
3
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
+ Locale-based validation with multi-language support
5
+ """
6
+
7
+ import re
8
+ from typing import Any, Optional, List
9
+ from datetime import datetime
10
+ from config_models import ParameterConfig
11
+ from locale_manager import LocaleManager
12
+ from logger import log_info, log_error, log_warning, log_debug
13
+
14
+ def validate(value: str, param: ParameterConfig, locale: Optional[str] = None) -> bool:
15
+ """Validate parameter value based on type and locale"""
16
+ t = param.canonical_type()
17
+
18
+ if t == "int":
19
+ if not value.isdigit():
20
+ return False
21
+ elif t == "float":
22
+ try:
23
+ float(value)
24
+ except ValueError:
25
+ return False
26
+ elif t in ("str", "string"):
27
+ pass # All strings are valid
28
+ elif t == "bool":
29
+ # Locale-aware boolean validation
30
+ return validate_boolean(value, locale)
31
+ elif t == "date":
32
+ try:
33
+ # Check if it's a valid ISO date format (YYYY-MM-DD)
34
+ datetime.strptime(value, "%Y-%m-%d")
35
+ except ValueError:
36
+ return False
37
+
38
+ # Regex validation if provided
39
+ if param.validation_regex and not re.fullmatch(param.validation_regex, value, re.I):
40
+ return False
41
+
42
+ return True
43
+
44
+ def validate_boolean(value: str, locale: Optional[str] = None) -> bool:
45
+ """Validate boolean value based on locale"""
46
+ # Default values (always accepted)
47
+ default_true = ["1", "true"]
48
+ default_false = ["0", "false"]
49
+
50
+ value_lower = value.lower().strip()
51
+
52
+ # Check default values first
53
+ if value_lower in default_true or value_lower in default_false:
54
+ return True
55
+
56
+ # If no locale specified, use minimal validation
57
+ if not locale:
58
+ return value_lower in ["yes", "no", "evet", "hayır"]
59
+
60
+ try:
61
+ # Get locale data
62
+ locale_data = LocaleManager.get_locale(locale)
63
+
64
+ # Get boolean values from locale
65
+ boolean_values = locale_data.get("boolean_values", {})
66
+ true_values = boolean_values.get("true_values", [])
67
+ false_values = boolean_values.get("false_values", [])
68
+
69
+ # Include synonyms if available
70
+ yes_synonyms = boolean_values.get("yes_synonyms", [])
71
+ no_synonyms = boolean_values.get("no_synonyms", [])
72
+
73
+ # Combine all accepted values
74
+ all_true_values = set(true_values + yes_synonyms + default_true)
75
+ all_false_values = set(false_values + no_synonyms + default_false)
76
+
77
+ # Convert to lowercase for comparison
78
+ all_true_values = {v.lower() for v in all_true_values}
79
+ all_false_values = {v.lower() for v in all_false_values}
80
+
81
+ return value_lower in all_true_values or value_lower in all_false_values
82
+
83
+ except Exception as e:
84
+ log_error("⚠️ Error in locale-based boolean validation", e)
85
+ # Fallback to basic validation
86
+ return value_lower in ["yes", "no", "evet", "hayır", "1", "0", "true", "false"]
87
+
88
+ def get_boolean_value(value: str, locale: Optional[str] = None) -> Optional[bool]:
89
+ """Convert locale-specific boolean string to Python bool"""
90
+ value_lower = value.lower().strip()
91
+
92
+ # Default true values
93
+ if value_lower in ["1", "true"]:
94
+ return True
95
+ if value_lower in ["0", "false"]:
96
+ return False
97
+
98
+ if not locale:
99
+ # Basic conversion without locale
100
+ if value_lower in ["yes", "evet"]:
101
+ return True
102
+ elif value_lower in ["no", "hayır"]:
103
+ return False
104
+ return None
105
+
106
+ try:
107
+ # Get locale data
108
+ locale_data = LocaleManager.get_locale(locale)
109
+ boolean_values = locale_data.get("boolean_values", {})
110
+
111
+ true_values = set(v.lower() for v in boolean_values.get("true_values", []))
112
+ false_values = set(v.lower() for v in boolean_values.get("false_values", []))
113
+ yes_synonyms = set(v.lower() for v in boolean_values.get("yes_synonyms", []))
114
+ no_synonyms = set(v.lower() for v in boolean_values.get("no_synonyms", []))
115
+
116
+ # Check if it's a true value
117
+ if value_lower in true_values or value_lower in yes_synonyms or value_lower == "1":
118
+ return True
119
+
120
+ # Check if it's a false value
121
+ if value_lower in false_values or value_lower in no_synonyms or value_lower == "0":
122
+ return False
123
+
124
+ return None
125
+
126
+ except Exception as e:
127
+ log_error("⚠️ Error converting boolean value", e)
128
+ return None
129
+
130
+ def get_supported_locales() -> List[str]:
131
+ """Get list of supported locales for validation"""
132
+ return LocaleManager.list_available_locales()