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