From b00c35f19b5af5a52cc8dbe87457888ff9080d18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Ur=C3=ADa?= Date: Sun, 8 Feb 2026 18:55:16 +0100 Subject: [PATCH] [WIP] Testing and reformuling --- app/api/config/actions/__init__.py | 1 + app/api/config/actions/install.py | 7 +++-- app/api/config/cruds/library/__init__.py | 4 +++ app/api/config/cruds/library/create.py | 14 ++++++++-- app/api/config/cruds/library/delete.py | 4 +-- app/api/config/cruds/library/read.py | 4 +-- app/api/config/cruds/library/update.py | 4 +-- app/api/config/cruds/path/create.py | 6 ++++ app/api/config/cruds/path/delete.py | 7 +++++ app/api/config/cruds/path/read.py | 10 +++++++ app/api/config/cruds/path/update.py | 7 +++++ app/db/config/__init__.py | 2 +- app/db/config/config.py | 8 ++++-- app/db/config/engine.py | 4 --- app/schema/config/__init__.py | 4 +++ app/schema/config/env.py | 6 ++-- app/schema/config/library.py | 18 +++++++----- app/schema/config/path.py | 21 ++++++++++++++ pyproject.toml | 5 ++++ requirements.txt | 3 +- tests/__init__.py | 0 tests/test_config.py | 35 ++++++++++++++++++++++++ 22 files changed, 144 insertions(+), 30 deletions(-) create mode 100644 app/api/config/actions/__init__.py create mode 100644 app/api/config/cruds/library/__init__.py create mode 100644 app/api/config/cruds/path/create.py create mode 100644 app/api/config/cruds/path/delete.py create mode 100644 app/api/config/cruds/path/read.py create mode 100644 app/api/config/cruds/path/update.py delete mode 100644 app/db/config/engine.py create mode 100644 app/schema/config/path.py create mode 100644 pyproject.toml create mode 100644 tests/__init__.py create mode 100644 tests/test_config.py diff --git a/app/api/config/actions/__init__.py b/app/api/config/actions/__init__.py new file mode 100644 index 0000000..8dede47 --- /dev/null +++ b/app/api/config/actions/__init__.py @@ -0,0 +1 @@ +from .install import install \ No newline at end of file diff --git a/app/api/config/actions/install.py b/app/api/config/actions/install.py index 6b34498..4cabefb 100644 --- a/app/api/config/actions/install.py +++ b/app/api/config/actions/install.py @@ -1,11 +1,12 @@ from sqlalchemy import create_engine +from sqlalchemy.orm import Session from ....schema.config.base import Base from ....db.config.config import get_engine_configuration def install(): engine_string, echo = get_engine_configuration() - engine = create_engine(engine_string, echo=echo) - metadata = Base.metadata(engine) - metadata.create_all() + engine = create_engine(engine_string, echo=echo=="true", future=True) # TODO + metadata = Base.metadata + metadata.create_all(engine) return engine \ No newline at end of file diff --git a/app/api/config/cruds/library/__init__.py b/app/api/config/cruds/library/__init__.py new file mode 100644 index 0000000..9dcb188 --- /dev/null +++ b/app/api/config/cruds/library/__init__.py @@ -0,0 +1,4 @@ +from .create import create +from .read import read +from .update import update +from .delete import delete \ No newline at end of file diff --git a/app/api/config/cruds/library/create.py b/app/api/config/cruds/library/create.py index c9ab085..c78222f 100644 --- a/app/api/config/cruds/library/create.py +++ b/app/api/config/cruds/library/create.py @@ -1,6 +1,14 @@ from sqlalchemy.orm import Session -from .....schema.config.library import LibraryConfig +from .....schema.config.library import Library -def create(session:Session, library:LibraryConfig): +import logging +logger = logging.getLogger(__name__) + +def create(session:Session, library:Library): + logger.debug("Add Library") session.add(library) - session.commit() \ No newline at end of file + logger.debug("Added Library") + session.commit() + logger.debug("Committed Library") + session.refresh(library) + logger.debug("Rerfreshed Library") diff --git a/app/api/config/cruds/library/delete.py b/app/api/config/cruds/library/delete.py index ea1d9b1..0f2ade9 100644 --- a/app/api/config/cruds/library/delete.py +++ b/app/api/config/cruds/library/delete.py @@ -1,7 +1,7 @@ from sqlalchemy.orm import Session -from .....schema.config.library import LibraryConfig +from .....schema.config.library import Library -def delete(session:Session, library:LibraryConfig): +def delete(session:Session, library:Library): session.delete(library) session.commit() \ No newline at end of file diff --git a/app/api/config/cruds/library/read.py b/app/api/config/cruds/library/read.py index 29c9192..8960725 100644 --- a/app/api/config/cruds/library/read.py +++ b/app/api/config/cruds/library/read.py @@ -1,8 +1,8 @@ from sqlalchemy.orm import Session from sqlalchemy import select -from .....schema.config.library import LibraryConfig +from .....schema.config.library import Library def read(session:Session, _id:int): - stmt = select(LibraryConfig).where(LibraryConfig.id == _id) + stmt = select(Library).where(Library.id == _id) return session.scalars(stmt).one() \ No newline at end of file diff --git a/app/api/config/cruds/library/update.py b/app/api/config/cruds/library/update.py index 4fd071e..d35651d 100644 --- a/app/api/config/cruds/library/update.py +++ b/app/api/config/cruds/library/update.py @@ -1,6 +1,6 @@ from sqlalchemy.orm import Session -from .....schema.config.library import LibraryConfig +from .....schema.config.library import Library -def update(session:Session, library:LibraryConfig): +def update(session:Session, library:Library): session.commit() \ No newline at end of file diff --git a/app/api/config/cruds/path/create.py b/app/api/config/cruds/path/create.py new file mode 100644 index 0000000..87cea76 --- /dev/null +++ b/app/api/config/cruds/path/create.py @@ -0,0 +1,6 @@ +from sqlalchemy.orm import Session +from .....schema.config.path import Path + +def create(session:Session, path:Path): + session.add(path) + session.commit() \ No newline at end of file diff --git a/app/api/config/cruds/path/delete.py b/app/api/config/cruds/path/delete.py new file mode 100644 index 0000000..3bd4444 --- /dev/null +++ b/app/api/config/cruds/path/delete.py @@ -0,0 +1,7 @@ +from sqlalchemy.orm import Session + +from .....schema.config.path import Path + +def delete(session:Session, path:Path): + session.delete(path) + session.commit() \ No newline at end of file diff --git a/app/api/config/cruds/path/read.py b/app/api/config/cruds/path/read.py new file mode 100644 index 0000000..a5b9e67 --- /dev/null +++ b/app/api/config/cruds/path/read.py @@ -0,0 +1,10 @@ +import os +from sqlalchemy.orm import Session +from sqlalchemy import select + +from .....schema.config.path import Path + +def read(session:Session, _id:int): + stmt = select(Path).where(Path.id == _id) + path:Path = session.scalars(stmt).one() + return path \ No newline at end of file diff --git a/app/api/config/cruds/path/update.py b/app/api/config/cruds/path/update.py new file mode 100644 index 0000000..e9c0534 --- /dev/null +++ b/app/api/config/cruds/path/update.py @@ -0,0 +1,7 @@ +import os +from sqlalchemy.orm import Session + +from .....schema.config.path import Path + +def update(session:Session, path:Path): + session.commit() \ No newline at end of file diff --git a/app/db/config/__init__.py b/app/db/config/__init__.py index 9d088ff..2f827b0 100644 --- a/app/db/config/__init__.py +++ b/app/db/config/__init__.py @@ -1 +1 @@ -from .engine import engine \ No newline at end of file +from .config import get_engine_configuration \ No newline at end of file diff --git a/app/db/config/config.py b/app/db/config/config.py index c285547..b2398c7 100644 --- a/app/db/config/config.py +++ b/app/db/config/config.py @@ -1,6 +1,10 @@ import os +import logging +logger = logging.getLogger(__name__) + def get_engine_configuration(): - engine_string = os.getenv("DEV_URIA_BIBLIOGAME_DEBUG", False) - echo = os.getenv("DEV_URIA_BIBLIOGAME_CONFIG_DB", "sqlite://") + echo = os.getenv("DEV_URIA_BIBLIOGAME_DEBUG", "false") + engine_string = os.getenv("DEV_URIA_BIBLIOGAME_CONFIG_DB", "sqlite://") + logger.debug(f"engine_string, {engine_string}") return (engine_string, echo) \ No newline at end of file diff --git a/app/db/config/engine.py b/app/db/config/engine.py deleted file mode 100644 index f6fe154..0000000 --- a/app/db/config/engine.py +++ /dev/null @@ -1,4 +0,0 @@ -from sqlalchemy import create_engine -from .config import engine_string, echo - -engine = create_engine(engine_string, echo=echo) \ No newline at end of file diff --git a/app/schema/config/__init__.py b/app/schema/config/__init__.py index e69de29..6b3335a 100644 --- a/app/schema/config/__init__.py +++ b/app/schema/config/__init__.py @@ -0,0 +1,4 @@ +from .base import Base +from .env import Env +from .library import Library +from .path import Path \ No newline at end of file diff --git a/app/schema/config/env.py b/app/schema/config/env.py index 92ed3d5..7eabed9 100644 --- a/app/schema/config/env.py +++ b/app/schema/config/env.py @@ -1,6 +1,7 @@ from typing import List from typing import Optional from sqlalchemy import String +from sqlalchemy import ForeignKey from sqlalchemy.orm import Mapped from sqlalchemy.orm import mapped_column from sqlalchemy.orm import relationship @@ -13,9 +14,8 @@ class Env(Base): key: Mapped[str] = mapped_column(String(255)) value: Mapped[str] = mapped_column(String(65656)) - libraries: Mapped[List["Library"]] = relationship( - back_populates="libraries", cascade="all, delete-orphan" - ) + library_id: Mapped[int] = mapped_column(ForeignKey("library.id")) + library: Mapped[int] = relationship("Library", back_populates="envs") def __repr__(self) -> str: return f"Book(id={self.id!r}, name={self.name!r}, publisher={self.publisher!r}," \ diff --git a/app/schema/config/library.py b/app/schema/config/library.py index 535cbaf..b20c01b 100644 --- a/app/schema/config/library.py +++ b/app/schema/config/library.py @@ -7,17 +7,21 @@ from sqlalchemy.orm import relationship from .base import Base -class LibraryConfig(Base): - __tablename__ = "library_config" +class Library(Base): + __tablename__ = "library" id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(255)) notes: Mapped[str] = mapped_column(String(65656)) - connection_string = Mapped[str] = mapped_column(String(65656)) + connection_string: Mapped[str] = mapped_column(String(65656)) - env: Mapped[List["Env"]] = relationship( - back_populates="env", cascade="all, delete-orphan" + envs: Mapped[List["Env"]] = relationship( + back_populates="library", cascade="all, delete-orphan" + ) + + paths: Mapped[List["Path"]] = relationship( + back_populates="library", cascade="all, delete-orphan" ) def __repr__(self) -> str: - return f"Book(id={self.id!r}, name={self.name!r}, publisher={self.publisher!r}," \ - " notes={self.notes!r}, classification={self.classification!r})" \ No newline at end of file + return f"Library(id={self.id!r}, name={self.name!r}, notes={self.notes!r}," \ + f" connection_string={self.connection_string!r})" \ No newline at end of file diff --git a/app/schema/config/path.py b/app/schema/config/path.py new file mode 100644 index 0000000..dd4785f --- /dev/null +++ b/app/schema/config/path.py @@ -0,0 +1,21 @@ +from typing import List +from typing import Optional +from sqlalchemy import String +from sqlalchemy import ForeignKey +from sqlalchemy.orm import Mapped +from sqlalchemy.orm import mapped_column +from sqlalchemy.orm import relationship + +from .base import Base + +class Path(Base): + __tablename__ = "path" + id: Mapped[int] = mapped_column(primary_key=True) + path: Mapped[str] = mapped_column(String(65656)) + + library_id: Mapped[int] = mapped_column(ForeignKey("library.id")) + library: Mapped[int] = relationship("Library", back_populates="paths") + + def __repr__(self) -> str: + return f"Book(id={self.id!r}, name={self.name!r}, publisher={self.publisher!r}," \ + " notes={self.notes!r}, classification={self.classification!r})" \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..0bb10ae --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,5 @@ +[tool.pytest.ini_options] +log_cli = true +log_cli_level = "DEBUG" +log_cli_format = "%(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)" +log_cli_date_format = "%Y-%m-%d %H:%M:%S" \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index ef535e1..508702e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ flask sqlalchemy requests -py-dotenv \ No newline at end of file +py-dotenv +pytest \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 0000000..6dc9f55 --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,35 @@ +import os +import unittest + +from sqlalchemy.orm import Session +from sqlalchemy.orm import sessionmaker + +from app.api.config.actions import install +from app.api.config.cruds.library import create, read +from app.schema.config import Library + +import logging +logger = logging.getLogger(__name__) + +class TestConfig(unittest.TestCase): + + def setUp(self): + os.environ["DEV_URIA_BIBLIOGAME_CONFIG_DB"] = "sqlite:///" + os.environ["DEV_URIA_BIBLIOGAME_DEBUG"] = "true" + self.engine = install() + self.library = Library( + name="Library Test", + notes="My duckling library test", + connection_string="sqlite:///" + ) + self.Session = sessionmaker(bind=self.engine) + self.session = self.Session() + create(self.session, self.library) + return super().setUp() + + def test_install(self): + library_string = str(read(self.session, 1)) + self.assertEqual(library_string, str(self.library)) + +if __name__ == "__main__": + unittest.main() \ No newline at end of file