[build-system]
requires = ["setuptools>=68", "wheel"]
build-backend = "setuptools.build_meta"

[project]
name = "cyclone"
version = "0.1.0"
description = "Cyclone EDI suite — X12 837P/835 parser"
requires-python = ">=3.11"
dependencies = [
    "pydantic>=2.6,<3",
    "click>=8.1,<9",
    "fastapi>=0.110,<1",
    "uvicorn[standard]>=0.27,<1",
    "python-multipart>=0.0.9,<1",
    "sqlalchemy>=2.0,<3",
    "pyyaml>=6.0,<7",
    "keyring>=25.0,<26",
    # backup_service / backup: encryption-at-rest (SP17). Used at module
    # top-level by cyclone.backup, so it has to be a hard dep — not an
    # extra — or the test suite fails to collect when the venv is built
    # from a clean `uv sync`.
    "cryptography>=49.0,<50",
    # passlib 1.7.4 + bcrypt >= 4.1 are incompatible (passlib probes bcrypt.__about__
    # which 4.x removed). Pin bcrypt < 4.1.
    "passlib[bcrypt]>=1.7.4",
    "bcrypt<4.1",
]

[project.optional-dependencies]
dev = [
    "pytest>=8.0",
    "pytest-cov>=4.1",
    "pytest-asyncio>=0.23,<1",
    "httpx>=0.27,<1",
    "pytest-randomly>=4.1",
]
sqlcipher = [
    # SP12: encryption at rest. Optional — without it the DB is plain SQLite.
    # Install via: pip install -e .[sqlcipher] (after brew install sqlcipher).
    "sqlcipher3>=0.6,<1",
]
sftp = [
    # SP13: real SFTP wire-up. Optional — without it the stub keeps working.
    # Install via: pip install -e .[sftp].
    "paramiko>=3.4,<6",
]

[project.scripts]
cyclone = "cyclone.cli:main"

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

[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-ra --strict-markers"
asyncio_mode = "auto"
