| import os |
| import platform |
| import secrets |
| from dotenv import load_dotenv |
|
|
| |
| load_dotenv() |
|
|
| def get_system_encoding(): |
| """Get the system's preferred encoding with UTF-8 fallback.""" |
| try: |
| |
| import locale |
| preferred_encoding = locale.getpreferredencoding(False) |
|
|
| |
| if preferred_encoding.lower() not in ['utf-8', 'utf8', 'utf_8']: |
| |
| if platform.system() == 'Windows': |
| try: |
| os.environ['PYTHONIOENCODING'] = 'utf-8' |
| preferred_encoding = 'utf-8' |
| except: |
| preferred_encoding = 'utf-8' |
| else: |
| preferred_encoding = 'utf-8' |
|
|
| return preferred_encoding |
| except: |
| return 'utf-8' |
|
|
| class Config: |
| """Base configuration class.""" |
|
|
| |
| DEFAULT_ENCODING = get_system_encoding() |
|
|
| |
| SUPABASE_URL = os.environ.get('SUPABASE_URL') or '' |
| SUPABASE_KEY = os.environ.get('SUPABASE_KEY') or '' |
|
|
| |
| CLIENT_ID = os.environ.get('CLIENT_ID') or '' |
| CLIENT_SECRET = os.environ.get('CLIENT_SECRET') or '' |
| REDIRECT_URL = os.environ.get('REDIRECT_URL') or '' |
|
|
| |
| |
| HUGGING_KEY = os.environ.get('hugging_key') or os.environ.get('HUGGING_KEY') or '' |
|
|
| |
| JWT_SECRET_KEY = os.environ.get('JWT_SECRET_KEY') or os.environ.get('SECRET_KEY') or secrets.token_hex(32) |
|
|
| |
| DATABASE_URL = os.environ.get('DATABASE_URL') or '' |
|
|
| |
| SECRET_KEY = os.environ.get('SECRET_KEY') or secrets.token_hex(32) |
| DEBUG = os.environ.get('DEBUG', 'False').lower() == 'true' |
|
|
| |
| SCHEDULER_ENABLED = os.environ.get('SCHEDULER_ENABLED', 'True').lower() == 'true' |
|
|
| |
| FORCE_UTF8 = os.environ.get('FORCE_UTF8', 'True').lower() == 'true' |
| UNICODE_LOGGING = os.environ.get('UNICODE_LOGGING', 'True').lower() == 'true' |
|
|
| |
| ENVIRONMENT = os.environ.get('ENVIRONMENT', 'development').lower() |
| IS_WINDOWS = platform.system() == 'Windows' |
| IS_DOCKER = os.environ.get('DOCKER_CONTAINER', '').lower() == 'true' |
|
|
| |
| if FORCE_UTF8: |
| os.environ['PYTHONIOENCODING'] = 'utf-8' |
| os.environ['PYTHONUTF8'] = '1' |
|
|
| |
| LOG_LEVEL = os.environ.get('LOG_LEVEL', 'INFO' if ENVIRONMENT == 'production' else 'DEBUG') |
| UNICODE_SAFE_LOGGING = UNICODE_LOGGING and not IS_WINDOWS |
|
|
| |
| REDIS_URL = os.environ.get('REDIS_URL', 'redis://localhost:6379/0') |
|
|
| |
| CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL', 'redis://localhost:6379/0') |
| CELERY_RESULT_BACKEND = os.environ.get('CELERY_RESULT_BACKEND', 'redis://localhost:6379/0') |
|
|
| |
| @classmethod |
| def validate_config(cls): |
| """Validate that all required config values are set.""" |
| required_vars = ['SUPABASE_URL', 'SUPABASE_KEY', 'JWT_SECRET_KEY'] |
| missing_vars = [] |
|
|
| for var in required_vars: |
| if not getattr(cls, var, None) or getattr(cls, var) == 'your-secret-key-change-in-production': |
| missing_vars.append(var) |
|
|
| if missing_vars: |
| raise ValueError(f"Missing required environment variables: {', '.join(missing_vars)}. Please check your .env file.") |
|
|
| |
| Config.validate_config() |