[build-system] requires = ["hatchling>=1.27,<2"] build-backend = "hatchling.build" [project] name = "vmware-api-simulator" version = "0.1.1" description = "Stateful asynchronous VMware / vSphere API simulator" readme = "README.md" requires-python = ">=3.13,<3.14" license = { text = "Apache-2.0" } authors = [{ name = "vmware-api-simulator contributors" }] dependencies = [ "asyncpg>=0.30,<0.31", "fastapi>=0.116,<0.117", "httpx>=0.28,<0.29", "pydantic>=2.11,<3", "pydantic-settings>=2.10,<3", "uvicorn[standard]>=0.35,<0.36", ] [project.optional-dependencies] dev = [ "hypothesis>=6.135,<7", "mypy>=1.17,<1.18", "pytest>=8.4,<9", "pytest-asyncio>=1.1,<2", "pytest-cov>=6.2,<7", "proxmoxer>=2.3,<2.4", "requests>=2.32,<3", "ruff>=0.12,<0.13", ] [project.scripts] vmware-api-contract = "app.contracts.cli:main" [tool.hatch.build.targets.wheel] packages = ["app"] [tool.ruff] target-version = "py313" line-length = 100 [tool.ruff.lint] select = ["E", "F", "I", "UP", "B", "ASYNC", "S", "RUF"] [tool.ruff.lint.per-file-ignores] "tests/**/*.py" = ["S101", "S105", "S106", "S108", "E501"] # FastAPI Depends(...) defaults are idiomatic; long SOAP XML helpers exceed 100. "app/vsphere/**/*.py" = ["B008", "E501", "S105", "S108", "S110"] "app/lifespan.py" = ["BLE001", "S110"] [tool.mypy] python_version = "3.13" strict = true plugins = ["pydantic.mypy"] files = ["app", "tests"] [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] markers = [ "integration: requires PostgreSQL or another external service", "contract: validates imported API contracts", "compatibility: exercises an external client against a running simulator", "pve_stub: optional legacy Proxmox VE /api2 plane (ENABLE_PVE_STUB=true)", ] [tool.coverage.run] branch = true source = ["app"] omit = [ "app/surface_probe.py", "app/evidence_gen.py", "app/simulation/seed_cli.py", "app/db/migrate_cli.py", ] [tool.coverage.report] # Offline unit coverage of the full handler surface stays below the former 80% # bar; behavioral gate is make test-surface (all majors × verbs). Raise this as # focused unit tests catch up. fail_under = 50 show_missing = true