diff --git a/src/pilgrim/application.py b/src/pilgrim/application.py index 674cc0c..81973f8 100644 --- a/src/pilgrim/application.py +++ b/src/pilgrim/application.py @@ -1,16 +1,47 @@ from pilgrim.database import Database from pilgrim.service.servicemanager import ServiceManager from pilgrim.ui.ui import UIApp +from pathlib import Path +import os +import sys class Application: def __init__(self): + self.config_dir = self._ensure_config_directory() self.database = Database() session = self.database.session() session_manager = ServiceManager() session_manager.set_session(session) self.ui = UIApp(session_manager) + def _ensure_config_directory(self) -> Path: + """ + Ensures the ~/.pilgrim directory exists and has the correct permissions. + Creates it if it doesn't exist. + Returns the Path object for the config directory. + """ + home = Path.home() + config_dir = home / ".pilgrim" + + try: + # Create directory if it doesn't exist + config_dir.mkdir(exist_ok=True) + + # Ensure correct permissions (rwx for user only) + os.chmod(config_dir, 0o700) + + # Create an empty .gitignore if it doesn't exist + gitignore = config_dir / ".gitignore" + if not gitignore.exists(): + gitignore.write_text("*\n") + + return config_dir + + except Exception as e: + print(f"Error setting up Pilgrim configuration directory: {str(e)}", file=sys.stderr) + sys.exit(1) + def run(self): self.database.create() self.ui.run() diff --git a/src/pilgrim/database.py b/src/pilgrim/database.py index b940c54..aba4219 100644 --- a/src/pilgrim/database.py +++ b/src/pilgrim/database.py @@ -1,14 +1,42 @@ from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker +from pathlib import Path +import os +import shutil Base = declarative_base() +def get_database_path() -> Path: + """ + Get the database file path following XDG Base Directory specification. + Creates the directory if it doesn't exist. + """ + # Get home directory + home = Path.home() + + # Create .pilgrim directory if it doesn't exist + pilgrim_dir = home / ".pilgrim" + pilgrim_dir.mkdir(exist_ok=True) + + # Database file path + db_path = pilgrim_dir / "database.db" + + # If database doesn't exist in new location but exists in current directory, + # migrate it + if not db_path.exists(): + current_db = Path("database.db") + if current_db.exists(): + shutil.copy2(current_db, db_path) + print(f"Database migrated from {current_db} to {db_path}") + + return db_path class Database: def __init__(self): + db_path = get_database_path() self.engine = create_engine( - "sqlite:///database.db", + f"sqlite:///{db_path}", echo=False, connect_args={"check_same_thread": False}, )