config.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import logging
  2. import os
  3. from pathlib import Path
  4. from pydantic_settings import BaseSettings
  5. # Application version - single source of truth
  6. APP_VERSION = "0.1.6"
  7. GITHUB_REPO = "maziggy/bambuddy"
  8. # App directory - where the application is installed (for static files)
  9. _app_dir = Path(__file__).resolve().parent.parent.parent.parent
  10. # Data directory - for persistent data (database, archives)
  11. # Use DATA_DIR env var if set (Docker), otherwise use project root (local dev)
  12. _data_dir_env = os.environ.get("DATA_DIR")
  13. _data_dir = Path(_data_dir_env) if _data_dir_env else _app_dir
  14. # Log directory - use LOG_DIR env var if set, otherwise use app_dir/logs
  15. _log_dir_env = os.environ.get("LOG_DIR")
  16. _log_dir = Path(_log_dir_env) if _log_dir_env else _app_dir / "logs"
  17. def _migrate_database() -> Path:
  18. """Migrate database from old name to new name if needed."""
  19. old_db = _data_dir / "bambutrack.db"
  20. new_db = _data_dir / "bambuddy.db"
  21. # If old database exists and new one doesn't, rename it
  22. if old_db.exists() and not new_db.exists():
  23. try:
  24. old_db.rename(new_db)
  25. logging.info(f"Migrated database: {old_db} -> {new_db}")
  26. except Exception as e:
  27. logging.warning(f"Could not migrate database: {e}. Using old location.")
  28. return old_db
  29. # If old database exists (and new one now exists too), it was migrated
  30. # If only new exists, use new
  31. # If neither exists, use new (will be created)
  32. return new_db if new_db.exists() or not old_db.exists() else old_db
  33. # Determine database path (handles migration)
  34. _db_path = _migrate_database()
  35. class Settings(BaseSettings):
  36. app_name: str = "Bambuddy"
  37. debug: bool = False # Default to production mode
  38. # Paths
  39. base_dir: Path = _data_dir # For backwards compatibility
  40. archive_dir: Path = _data_dir / "archive"
  41. static_dir: Path = _app_dir / "static" # Static files are part of app, not data
  42. log_dir: Path = _log_dir
  43. database_url: str = f"sqlite+aiosqlite:///{_db_path}"
  44. # Logging
  45. log_level: str = "INFO" # Override with LOG_LEVEL env var or DEBUG=true
  46. log_to_file: bool = True # Set to false to disable file logging
  47. # API
  48. api_prefix: str = "/api/v1"
  49. class Config:
  50. env_file = ".env"
  51. env_file_encoding = "utf-8"
  52. settings = Settings()
  53. # Ensure directories exist
  54. settings.archive_dir.mkdir(exist_ok=True)
  55. settings.static_dir.mkdir(exist_ok=True)
  56. if settings.log_to_file:
  57. settings.log_dir.mkdir(exist_ok=True)