Files
orion/app/core/environment.py

108 lines
3.1 KiB
Python

# app/core/environment.py
"""
Environment detection utilities.
Automatically detects environment based on runtime conditions
rather than relying on configuration.
"""
import os
from typing import Literal
EnvironmentType = Literal["development", "staging", "production"]
def get_environment() -> EnvironmentType:
"""
Detect current environment automatically.
Detection logic:
1. Check ENV environment variable if set
2. Check ENVIRONMENT environment variable if set
3. Auto-detect based on hostname/indicators:
- localhost, 127.0.0.1 → development
- Contains 'staging' → staging
- Otherwise → production (safe default)
Returns:
str: 'development', 'staging', or 'production'
"""
# Priority 1: Explicit ENV variable
env = os.getenv("ENV", "").lower()
if env in ["development", "dev", "local"]:
return "development"
elif env in ["staging", "stage"]:
return "staging"
elif env in ["production", "prod"]:
return "production"
# Priority 2: ENVIRONMENT variable
env = os.getenv("ENVIRONMENT", "").lower()
if env in ["development", "dev", "local"]:
return "development"
elif env in ["staging", "stage"]:
return "staging"
elif env in ["production", "prod"]:
return "production"
# Priority 3: Auto-detect from common indicators
# Check if running in debug mode (common in development)
if os.getenv("DEBUG", "").lower() in ["true", "1", "yes"]:
return "development"
# Check common development indicators
hostname = os.getenv("HOSTNAME", "").lower()
if any(dev_indicator in hostname for dev_indicator in ["local", "dev", "laptop", "desktop"]):
return "development"
# Check for staging indicators
if "staging" in hostname or "stage" in hostname:
return "staging"
# Default to development for safety (HTTPS not required in dev)
# Change this to "production" if you prefer secure-by-default
return "development"
def is_development() -> bool:
"""Check if running in development environment."""
return get_environment() == "development"
def is_staging() -> bool:
"""Check if running in staging environment."""
return get_environment() == "staging"
def is_production() -> bool:
"""Check if running in production environment."""
return get_environment() == "production"
def should_use_secure_cookies() -> bool:
"""
Determine if cookies should have secure flag (HTTPS only).
Returns:
bool: True if production or staging, False if development
"""
return not is_development()
# Cache the environment detection result
_cached_environment: EnvironmentType | None = None
def get_cached_environment() -> EnvironmentType:
"""
Get environment with caching.
Environment is detected once and cached for performance.
Useful if you call this frequently.
"""
global _cached_environment
if _cached_environment is None:
_cached_environment = get_environment()
return _cached_environment