[build-system]
requires = ["setuptools>=68.0"]
build-backend = "setuptools.build_meta"

[project]
name = "polygateway"
version = "1.2.4"
description = "PolyGateway：实验室统一的大语言模型（LLM/VLM/OCR）调度与中转库——多源、限流、重试、熔断、缓存、遥测"
# registry 包页面的正文只认这一项:缺了页面就是一片空白(1.1.2 的教训,twine 会警告
# long_description missing 但不阻塞上传)。README 在打包时被固化进产物,发布后再改无效。
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
    "httpx>=0.27",
    "pydantic>=2.8",
    "pydantic-settings>=2.4",
    # 显式声明(2026-07-20 人类确认): config.py 的多源动态键族直接使用 dotenv_values,
    # 不能只依赖 pydantic-settings 的传递安装
    "python-dotenv>=1.0",
    "loguru>=0.7",
]

[project.optional-dependencies]
redis = ["redis>=5.0"]
postgres = ["asyncpg>=0.29"]
structured = ["json-repair>=0.28"]
sdk = ["openai>=1.30"]
dev = [
    "pytest>=8.0",
    "pytest-cov>=5.0",
    "pytest-asyncio>=0.23",
    "ruff>=0.6",
    "radon>=6.0",
    "import-linter>=2.0",
]

[project.urls]
Homepage = "https://gitea.iomgaa.online/iomgaa/PolyGateway"
Changelog = "https://gitea.iomgaa.online/iomgaa/PolyGateway/src/branch/main/CHANGELOG.md"
Issues = "https://gitea.iomgaa.online/iomgaa/PolyGateway/issues"

[tool.setuptools.packages.find]
where = ["src"]

[tool.pytest.ini_options]
pythonpath = ["src"]
testpaths = ["tests"]
asyncio_mode = "auto"
# slow(真实等待的时间语义变体,单文件 12-15 分钟)默认排除;
# 显式 `pytest -m slow` 覆盖(CLI 的 -m 后到优先)。M2 T12 全量跑。
addopts = "-m 'not slow'"
markers = [
    "requires_redis: 需要可达的 Redis（无则 skip）",
    "requires_llm: 需要真实 LLM 网关（无则 skip，输出落 tests/outputs/）",
    "slow: 慢速测试（CI 按需跑）",
]

[tool.ruff]
target-version = "py312"
line-length = 100

[tool.ruff.lint]
select = ["E", "F", "W", "I", "N", "UP", "B", "A", "C4", "SIM", "TCH"]
ignore = ["E501"]

[tool.ruff.lint.isort]
known-first-party = ["polygateway"]

# 依赖纪律（ARCHITECTURE.md §8）：ports/types/errors/streaming 为最内层；
# middleware 只依赖端口；transports/backends/telemetry/structured/providers/sources
# 只实现端口且互不依赖；client 是唯一组装层。
# 注：M1 模块落地前 lint-imports 由 Makefile 门控跳过。
[tool.importlinter]
root_packages = ["polygateway"]

[[tool.importlinter.contracts]]
name = "洋葱分层：client → config → middleware → 实现层（互不依赖）→ 叶子 → 内核"
type = "layers"
layers = [
    "polygateway.client",
    "polygateway.config",
    "polygateway.middleware",
    "polygateway.transports | polygateway.backends | polygateway.telemetry | polygateway.structured",
    "polygateway.providers : polygateway.sources",
    "polygateway.ports : polygateway.types : polygateway.errors : polygateway.streaming",
]
