| """ |
| 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 |
|
|