diff --git a/backend/alembic/env.py b/backend/alembic/env.py index a3c9c021d..3616b8075 100644 --- a/backend/alembic/env.py +++ b/backend/alembic/env.py @@ -3,7 +3,7 @@ from pathlib import Path from logging.config import fileConfig from sqlalchemy import create_engine -from config.config_loader import ConfigLoader +from config.config_manager import ConfigManager from alembic import context from models.base import BaseModel @@ -42,7 +42,7 @@ def run_migrations_offline() -> None: """ context.configure( - url=ConfigLoader.get_db_engine(), + url=ConfigManager.get_db_engine(), target_metadata=target_metadata, render_as_batch=True, literal_binds=True, @@ -62,7 +62,7 @@ def run_migrations_online() -> None: """ - engine = create_engine(ConfigLoader.get_db_engine()) + engine = create_engine(ConfigManager.get_db_engine()) with engine.connect() as connection: context.configure( diff --git a/backend/config/config_loader.py b/backend/config/config_manager.py similarity index 87% rename from backend/config/config_loader.py rename to backend/config/config_manager.py index 535b46b59..13f5c127c 100644 --- a/backend/config/config_loader.py +++ b/backend/config/config_manager.py @@ -57,7 +57,7 @@ class Config: self.HIGH_PRIO_STRUCTURE_PATH = f"{LIBRARY_BASE_PATH}/{self.ROMS_FOLDER_NAME}" -class ConfigLoader: +class ConfigManager: """Parse and load the user configuration from the config.yml file Raises: @@ -143,5 +143,26 @@ class ConfigLoader: ), ) + def _update_config(self) -> None: + try: + with open(self.config_path, 'w') as config_file: + yaml.dump(self._raw_config, config_file) + except FileNotFoundError: + self._raw_config = {} + finally: + self._parse_config() -config = ConfigLoader().config + def add_binding(self, fs_slug: str, slug: str): + self._raw_config['system']['platforms'][fs_slug] = slug + self._update_config() + + def remove_binding(self, fs_slug): + try: + del self._raw_config['system']['platforms'][fs_slug] + except KeyError: + pass + self._update_config() + + +config_manager = ConfigManager() +config = config_manager.config diff --git a/backend/config/tests/test_config_loader.py b/backend/config/tests/test_config_loader.py index 2b2df1e84..50b5ce62a 100644 --- a/backend/config/tests/test_config_loader.py +++ b/backend/config/tests/test_config_loader.py @@ -1,11 +1,11 @@ import os from pathlib import Path -from config.config_loader import ConfigLoader +from config.config_manager import ConfigManager def test_config_loader(): - loader = ConfigLoader( + loader = ConfigManager( os.path.join(Path(__file__).resolve().parent, "fixtures", "config.yml") ) @@ -23,7 +23,7 @@ def test_config_loader(): def test_empty_config_loader(): - loader = ConfigLoader("") + loader = ConfigManager("") assert loader.config.EXCLUDED_PLATFORMS == [] assert loader.config.EXCLUDED_SINGLE_EXT == [] diff --git a/backend/endpoints/assets.py b/backend/endpoints/assets.py index 78bb7f23b..d70ba8ea5 100644 --- a/backend/endpoints/assets.py +++ b/backend/endpoints/assets.py @@ -8,7 +8,7 @@ from handler import dbh from utils.fs import build_upload_file_path, remove_file from utils.fastapi import scan_save, scan_state from logger.logger import log -from config.config_loader import config +from config.config_manager import config router = APIRouter() diff --git a/backend/handler/db_handler.py b/backend/handler/db_handler.py index b227d33de..5fb59220e 100644 --- a/backend/handler/db_handler.py +++ b/backend/handler/db_handler.py @@ -1,6 +1,6 @@ import functools -from config.config_loader import ConfigLoader +from config.config_manager import ConfigManager from models import Platform, Rom, User, Role, Save, State, Screenshot from fastapi import HTTPException, status from logger.logger import log @@ -11,7 +11,7 @@ from sqlalchemy.orm import Session, sessionmaker class DBHandler: def __init__(self) -> None: - self.engine = create_engine(ConfigLoader.get_db_engine(), pool_pre_ping=True) + self.engine = create_engine(ConfigManager.get_db_engine(), pool_pre_ping=True) self.session = sessionmaker(bind=self.engine, expire_on_commit=False) @staticmethod diff --git a/backend/handler/tests/conftest.py b/backend/handler/tests/conftest.py index 18ed2ebd7..125b3146f 100644 --- a/backend/handler/tests/conftest.py +++ b/backend/handler/tests/conftest.py @@ -3,13 +3,13 @@ import alembic.config from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker -from config.config_loader import ConfigLoader +from config.config_manager import ConfigManager from models import Platform, Rom, User, Save, State, Screenshot from models.user import Role from utils.auth import get_password_hash from .. import dbh -engine = create_engine(ConfigLoader.get_db_engine(), pool_pre_ping=True) +engine = create_engine(ConfigManager.get_db_engine(), pool_pre_ping=True) session = sessionmaker(bind=engine, expire_on_commit=False) diff --git a/backend/main.py b/backend/main.py index 5b038209f..bf686ab38 100644 --- a/backend/main.py +++ b/backend/main.py @@ -3,7 +3,7 @@ import sys import alembic.config import uvicorn -from config.config_loader import ConfigDict, config +from config.config_manager import ConfigDict, config from endpoints import identity, oauth, platform, rom, scan, search, tasks # noqa from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware diff --git a/backend/utils/fastapi.py b/backend/utils/fastapi.py index e05b1954c..567dd93ba 100644 --- a/backend/utils/fastapi.py +++ b/backend/utils/fastapi.py @@ -2,7 +2,7 @@ from typing import Any import emoji import os -from config.config_loader import config +from config.config_manager import config from models import Platform, Rom, Save, State, Screenshot from handler import dbh, igdbh from logger.logger import log diff --git a/backend/utils/fs.py b/backend/utils/fs.py index 200cf50d2..bca43ebe4 100644 --- a/backend/utils/fs.py +++ b/backend/utils/fs.py @@ -17,7 +17,7 @@ from config import ( DEFAULT_URL_COVER_S, DEFAULT_PATH_COVER_S, ) -from config.config_loader import config +from config.config_manager import config from exceptions.fs_exceptions import ( PlatformsNotFoundException, RomAlreadyExistsException, diff --git a/backend/utils/tests/test_fs.py b/backend/utils/tests/test_fs.py index 74ecd49a9..35518206a 100644 --- a/backend/utils/tests/test_fs.py +++ b/backend/utils/tests/test_fs.py @@ -132,7 +132,7 @@ def test_rom_size(): assert rom_size == (2.0, "KB") def test__exclude_files(): - from config.config_loader import config + from config.config_manager import config config.EXCLUDED_SINGLE_FILES = ["Super Mario 64 (J) (Rev A) [Part 1].z64"] diff --git a/backend/watcher.py b/backend/watcher.py index 4a352b4cf..a4945ea06 100644 --- a/backend/watcher.py +++ b/backend/watcher.py @@ -8,7 +8,7 @@ from config import ( LIBRARY_BASE_PATH, RESCAN_ON_FILESYSTEM_CHANGE_DELAY, ) -from config.config_loader import config +from config.config_manager import config from endpoints.scan import scan_platforms from logger.logger import log from tasks.utils import tasks_scheduler