|
|
""" |
|
|
Input Validation Helpers |
|
|
""" |
|
|
|
|
|
from typing import Optional |
|
|
from datetime import datetime |
|
|
import re |
|
|
|
|
|
|
|
|
def validate_date(date_str: str) -> Optional[datetime]: |
|
|
"""Validate and parse date string""" |
|
|
try: |
|
|
return datetime.fromisoformat(date_str.replace('Z', '+00:00')) |
|
|
except: |
|
|
return None |
|
|
|
|
|
|
|
|
def validate_provider_name(name: str) -> bool: |
|
|
"""Validate provider name""" |
|
|
if not name or not isinstance(name, str): |
|
|
return False |
|
|
return len(name) >= 2 and len(name) <= 50 |
|
|
|
|
|
|
|
|
def validate_category(category: str) -> bool: |
|
|
"""Validate category name""" |
|
|
valid_categories = [ |
|
|
"market_data", |
|
|
"blockchain_explorers", |
|
|
"news", |
|
|
"sentiment", |
|
|
"onchain_analytics" |
|
|
] |
|
|
return category in valid_categories |
|
|
|
|
|
|
|
|
def validate_url(url: str) -> bool: |
|
|
"""Validate URL format""" |
|
|
url_pattern = re.compile( |
|
|
r'^https?://' |
|
|
r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|' |
|
|
r'localhost|' |
|
|
r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' |
|
|
r'(?::\d+)?' |
|
|
r'(?:/?|[/?]\S+)$', re.IGNORECASE) |
|
|
return url_pattern.match(url) is not None |
|
|
|