diff --git a/pyproject.toml b/pyproject.toml index 46bfc044..20bfda2a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -68,7 +68,6 @@ relative_files = true source = ["src"] omit = [ "**/__init__.py", - "src/app/config/logging_.py", "src/app/main/**", "**/health/**", "**/alembic/**", @@ -97,14 +96,13 @@ type = "layers" containers = ["app"] layers = [ "(main)", - "(config)", "presentation", "infrastructure", "core", ] ignore_imports = [ - "app.infrastructure.persistence_sqla.alembic.env -> app.config.loader", - "app.infrastructure.persistence_sqla.alembic.env -> app.config.settings", + "app.infrastructure.persistence_sqla.alembic.env -> app.main.config.loader", + "app.infrastructure.persistence_sqla.alembic.env -> app.main.config.settings", ] [[tool.importlinter.contracts]] diff --git a/src/app/infrastructure/persistence_sqla/alembic/env.py b/src/app/infrastructure/persistence_sqla/alembic/env.py index f5fd83f9..face40d7 100644 --- a/src/app/infrastructure/persistence_sqla/alembic/env.py +++ b/src/app/infrastructure/persistence_sqla/alembic/env.py @@ -6,8 +6,8 @@ from sqlalchemy.engine import Connection from sqlalchemy.ext.asyncio import async_engine_from_config -from app.config.loader import load_postgres_settings -from app.config.settings import PostgresSettings +from app.main.config.loader import load_postgres_settings +from app.main.config.settings import PostgresSettings from app.infrastructure.persistence_sqla.mappings.all import map_tables from app.infrastructure.persistence_sqla.registry import mapper_registry diff --git a/src/app/config/__init__.py b/src/app/main/config/__init__.py similarity index 100% rename from src/app/config/__init__.py rename to src/app/main/config/__init__.py diff --git a/src/app/config/loader.py b/src/app/main/config/loader.py similarity index 95% rename from src/app/config/loader.py rename to src/app/main/config/loader.py index 30e69a68..35ccb5dc 100644 --- a/src/app/config/loader.py +++ b/src/app/main/config/loader.py @@ -3,7 +3,7 @@ from pydantic_settings import BaseSettings, SettingsConfigDict -from app.config.settings import ( +from app.main.config.settings import ( AppSettings, CookieSettings, JwtSettings, @@ -13,7 +13,7 @@ SqlaSettings, ) -BASE_DIR: Final[Path] = Path(__file__).resolve().parents[3] +BASE_DIR: Final[Path] = Path(__file__).resolve().parents[4] _ENV_FILE: Final[Path] = BASE_DIR.joinpath(".env") _DEFAULT_CONFIG_DICT: Final[SettingsConfigDict] = SettingsConfigDict( env_file=_ENV_FILE, diff --git a/src/app/config/logging_.py b/src/app/main/config/logging_.py similarity index 100% rename from src/app/config/logging_.py rename to src/app/main/config/logging_.py diff --git a/src/app/config/settings.py b/src/app/main/config/settings.py similarity index 97% rename from src/app/config/settings.py rename to src/app/main/config/settings.py index def10f83..b3a7a308 100644 --- a/src/app/config/settings.py +++ b/src/app/main/config/settings.py @@ -3,8 +3,8 @@ from pydantic import BaseModel, Field, PostgresDsn -from app.config.logging_ import LoggingLevel from app.infrastructure.auth_ctx.jwt_types import JwtAlgorithm +from app.main.config.logging_ import LoggingLevel class AppSettings(BaseModel): diff --git a/src/app/main/ioc/core.py b/src/app/main/ioc/core.py index 42aab8d3..56f6cda0 100644 --- a/src/app/main/ioc/core.py +++ b/src/app/main/ioc/core.py @@ -1,6 +1,5 @@ from dishka import Provider, Scope, provide -from app.config.settings import PasswordHasherSettings from app.core.commands.activate_user import ActivateUser from app.core.commands.create_user import CreateUser from app.core.commands.deactivate_user import DeactivateUser @@ -31,6 +30,7 @@ from app.infrastructure.adapters.sqla_user_reader import SqlaUserReader from app.infrastructure.adapters.sqla_user_tx_storage import SqlaUserTxStorage from app.infrastructure.adapters.system_utc_timer import SystemUtcTimer +from app.main.config.settings import PasswordHasherSettings class CoreProvider(Provider): diff --git a/src/app/main/ioc/infrastructure.py b/src/app/main/ioc/infrastructure.py index 0dcb0c76..75c69179 100644 --- a/src/app/main/ioc/infrastructure.py +++ b/src/app/main/ioc/infrastructure.py @@ -8,14 +8,6 @@ from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_sessionmaker, create_async_engine from starlette.requests import Request -from app.config.settings import ( - CookieSettings, - JwtSettings, - PasswordHasherSettings, - PostgresSettings, - SessionSettings, - SqlaSettings, -) from app.infrastructure.adapters.bcrypt_password_hasher import HasherSemaphore, HasherThreadPoolExecutor from app.infrastructure.auth_ctx.cookie_manager import CookieManager, CookieName from app.infrastructure.auth_ctx.handlers.change_password import ChangePassword @@ -29,6 +21,14 @@ from app.infrastructure.auth_ctx.sqla_user_tx_storage import AuthSqlaUserTxStorage from app.infrastructure.auth_ctx.types_ import AuthAsyncSession from app.infrastructure.auth_ctx.utc_timer import AuthSessionUtcTimer +from app.main.config.settings import ( + CookieSettings, + JwtSettings, + PasswordHasherSettings, + PostgresSettings, + SessionSettings, + SqlaSettings, +) logger = logging.getLogger(__name__) diff --git a/src/app/main/run.py b/src/app/main/run.py index 87844045..9d52d1b4 100644 --- a/src/app/main/run.py +++ b/src/app/main/run.py @@ -5,7 +5,8 @@ from dishka.integrations.fastapi import setup_dishka from fastapi import FastAPI -from app.config.loader import ( +from app.infrastructure.persistence_sqla.mappings.all import map_tables +from app.main.config.loader import ( load_app_settings, load_cookie_settings, load_jwt_settings, @@ -14,7 +15,7 @@ load_session_settings, load_sqla_settings, ) -from app.config.settings import ( +from app.main.config.settings import ( AppSettings, CookieSettings, JwtSettings, @@ -23,7 +24,6 @@ SessionSettings, SqlaSettings, ) -from app.infrastructure.persistence_sqla.mappings.all import map_tables from app.main.ioc.provider_registry import get_providers from app.main.setup import setup_global_exception_handlers, setup_logging, setup_middlewares from app.presentation.http.root_router import make_fastapi_root_router diff --git a/src/app/main/setup.py b/src/app/main/setup.py index 66fb1bc5..7f889735 100644 --- a/src/app/main/setup.py +++ b/src/app/main/setup.py @@ -2,8 +2,8 @@ from fastapi import FastAPI -from app.config.logging_ import DATEFMT, FMT, LoggingLevel -from app.config.settings import CookieSettings +from app.main.config.logging_ import DATEFMT, FMT, LoggingLevel +from app.main.config.settings import CookieSettings from app.presentation.http.auth_cookie_middleware import AuthCookieMiddleware logger = logging.getLogger(__name__) diff --git a/tests/integration/with_infra/conftest.py b/tests/integration/with_infra/conftest.py index f62549f7..72876d62 100644 --- a/tests/integration/with_infra/conftest.py +++ b/tests/integration/with_infra/conftest.py @@ -10,9 +10,9 @@ from sqlalchemy import text from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker -from app.config.settings import AppSettings from app.core.common.services.user import UserService from app.infrastructure.persistence_sqla.registry import mapper_registry +from app.main.config.settings import AppSettings from app.main.run import make_app LIFESPAN_MANAGER_STARTUP_TIMEOUT_S: Final[int] = 30 diff --git a/tests/integration/with_infra/test_stairway.py b/tests/integration/with_infra/test_stairway.py index 6b94d600..5aac2037 100644 --- a/tests/integration/with_infra/test_stairway.py +++ b/tests/integration/with_infra/test_stairway.py @@ -16,8 +16,8 @@ from alembic.config import Config from alembic.script import Script, ScriptDirectory -from app.config.loader import BASE_DIR, load_postgres_settings -from app.config.settings import PostgresSettings +from app.main.config.loader import BASE_DIR, load_postgres_settings +from app.main.config.settings import PostgresSettings ALEMBIC_INI_PATH: Final[str] = str(BASE_DIR / "alembic.ini") diff --git a/tests/sanity/config/__init__.py b/tests/sanity/main/__init__.py similarity index 100% rename from tests/sanity/config/__init__.py rename to tests/sanity/main/__init__.py diff --git a/tests/unit/config/__init__.py b/tests/sanity/main/config/__init__.py similarity index 100% rename from tests/unit/config/__init__.py rename to tests/sanity/main/config/__init__.py diff --git a/tests/sanity/config/test_loader.py b/tests/sanity/main/config/test_loader.py similarity index 68% rename from tests/sanity/config/test_loader.py rename to tests/sanity/main/config/test_loader.py index 93bcfd6c..299357fa 100644 --- a/tests/sanity/config/test_loader.py +++ b/tests/sanity/main/config/test_loader.py @@ -1,4 +1,4 @@ -from app.config.loader import BASE_DIR +from app.main.config.loader import BASE_DIR def test_base_dir_points_to_root() -> None: diff --git a/tests/unit/main/__init__.py b/tests/unit/main/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/unit/main/config/__init__.py b/tests/unit/main/config/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/unit/config/test_loader.py b/tests/unit/main/config/test_loader.py similarity index 97% rename from tests/unit/config/test_loader.py rename to tests/unit/main/config/test_loader.py index 5c36e345..4977d7da 100644 --- a/tests/unit/config/test_loader.py +++ b/tests/unit/main/config/test_loader.py @@ -1,6 +1,6 @@ import pytest -from app.config.loader import ( +from app.main.config.loader import ( load_app_settings, load_cookie_settings, load_jwt_settings, @@ -9,7 +9,7 @@ load_session_settings, load_sqla_settings, ) -from app.config.logging_ import LoggingLevel +from app.main.config.logging_ import LoggingLevel @pytest.mark.parametrize( diff --git a/tests/unit/config/test_settings.py b/tests/unit/main/config/test_settings.py similarity index 88% rename from tests/unit/config/test_settings.py rename to tests/unit/main/config/test_settings.py index 9b08a3f2..5aa9a59d 100644 --- a/tests/unit/config/test_settings.py +++ b/tests/unit/main/config/test_settings.py @@ -2,7 +2,7 @@ import pytest -from app.config.settings import SessionSettings +from app.main.config.settings import SessionSettings @pytest.mark.parametrize(