# .importlinter — машинная защита границ слоёв (волна 0, задача 4).
#
# ОСОЗНАННОЕ ОТКЛОНЕНИЕ ОТ КАНОНА. Шаблон сетки безопасности
# (devcontour/tools/kits/template/importlinter.ini) даёт МИНИМАЛЬНЫЙ контракт
# «не импортируй кит, которого нет в зависимостях». Здесь его место занимают
# пять СОБСТВЕННЫХ, более строгих контрактов кита (продукты сверху, единственная
# дверь к clikit и adapterkit, домен и сервисный слой без ORM). Минимум шаблона —
# пол, а не потолок, поэтому `apply_template.py --check` закономерно и навсегда
# показывает расхождение по этому файлу: см. docs/kits/SAFETY-NET.md,
# «Что делать при расхождении», п.2 (прецедент — adapterkit).
#
# Запуск:  uv run --with import-linter lint-imports
#
# src-раскладка: root_packages=accountpoolkit резолвится через editable-install
# кита в его собственном .venv (src/accountpoolkit уже на sys.path через
# package metadata) — отдельный PYTHONPATH=src не понадобился, uv run уже
# активирует нужное окружение.
#
# accountpoolkit — пул аккаунтов (L2): не знает про продукты сверху; clikit —
# только через accountpoolkit.cli (CLI-обвязка кита, единственная дверь);
# adapterkit — только через accountpoolkit.ports.registry (DI-порт к реестру
# адаптеров, единственная дверь). Отдельный контракт держит домен/модель кита
# без ORM: sqlalchemy — только в repository/*, не в domain/model.

[importlinter]
include_external_packages = True
root_packages =
    accountpoolkit
exclude_type_checking_imports = True

[importlinter:contract:accountpoolkit-no-products]
name = accountpoolkit не знает про продукты сверху
type = forbidden
source_modules =
    accountpoolkit
forbidden_modules =
    gateway
    bublictr

[importlinter:contract:accountpoolkit-clikit-single-door]
name = clikit допустим только через accountpoolkit.cli
type = forbidden
source_modules =
    accountpoolkit
forbidden_modules =
    clikit
ignore_imports =
    accountpoolkit.cli -> clikit

[importlinter:contract:accountpoolkit-adapterkit-single-door]
name = adapterkit допустим только через accountpoolkit.ports.registry
type = forbidden
source_modules =
    accountpoolkit
forbidden_modules =
    adapterkit
ignore_imports =
    accountpoolkit.ports.registry -> adapterkit

[importlinter:contract:accountpoolkit-domain-no-orm]
name = домен и модель кита не знают про sqlalchemy
type = forbidden
source_modules =
    accountpoolkit.domain
    accountpoolkit.model
forbidden_modules =
    sqlalchemy

[importlinter:contract:accountpoolkit-services-no-orm]
name = сервисный слой не знает про sqlalchemy/ormkit (extra registry опционален)
type = forbidden
source_modules =
    accountpoolkit.services
forbidden_modules =
    sqlalchemy
    ormkit
# ЛЕНИВЫЕ импорты: РАНТАЙМ-конструкторы (`Registry(...)`, `get_engine`,
# `IdentityJournalRepository(...)`) живут ВНУТРИ функций/методов (`_registry`,
# `__init__`, `.open()`, `attach`/`snapshot`/`followers`/`mark_synced`), не на
# верхнем уровне модуля — сам `import accountpoolkit.services.gate` их не
# исполняет. `exclude_type_checking_imports` их не прячет (это не аннотации, а
# настоящий рантайм), поэтому они ПЕРЕЧИСЛЕНЫ явно: контракт целится в жадный
# импорт верхнего уровня, а не в отложенный вызов внутри метода.
ignore_imports =
    accountpoolkit.services.authority -> accountpoolkit.repository
    accountpoolkit.services.authority -> accountpoolkit.repository.registry
    accountpoolkit.services.gate -> accountpoolkit.repository
    accountpoolkit.services.gate -> accountpoolkit.repository.registry
    accountpoolkit.services.journal -> accountpoolkit.repository
    accountpoolkit.services.journal -> accountpoolkit.repository.journal
    accountpoolkit.services.linkage -> accountpoolkit.repository.registry
    accountpoolkit.services.onboarding -> accountpoolkit.repository.registry
    accountpoolkit.services.refresh -> accountpoolkit.repository.registry
    accountpoolkit.services.relogin -> accountpoolkit.repository.registry
    accountpoolkit.services.session_health -> accountpoolkit.repository.registry
    accountpoolkit.services.sso -> accountpoolkit.repository.registry
    accountpoolkit.services.sso -> accountpoolkit.repository.session_state
