[project] name = "undercooked" version = "0.1.0" description = "Cooperative in-browser kitchen chaos game: anonymous lobbies, server-authoritative real-time play, escalating data-driven levels." readme = "README.md" requires-python = ">=3.12" license = { text = "MIT" } authors = [{ name = "Reese Apps" }] dependencies = [ "fastapi>=0.115", "uvicorn[standard]>=0.32", "pydantic>=2.9", "python-dotenv>=1.0", "pyyaml>=6.0", "websockets>=13.0", ] [project.optional-dependencies] dev = [ "debugpy>=1.8", "ruff>=0.7", "pyright>=1.1.380", "pytest>=8.3", "pytest-asyncio>=0.24", "pytest-cov>=5.0", "httpx>=0.27", "playwright>=1.48", ] [project.scripts] undercooked = "undercooked.__main__:main" undercooked-levels = "undercooked.tools.levels:main" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/undercooked"] [tool.ruff] line-length = 100 target-version = "py312" src = ["src", "tests"] [tool.ruff.lint] select = [ "E", "F", "W", "I", "N", "UP", "B", "C4", "SIM", "ASYNC", "S", "RUF", "ARG", "RET", "PL", "PERF", ] ignore = [ "PLR0913", # simulation constructors legitimately take many entity args "PLR2004", # readable numeric assertions in tests "S101", # assert is the test language; unsafe-usages reviewed manually ] [tool.ruff.lint.per-file-ignores] "tests/**" = ["S101", "PLR2004", "ARG001", "ARG002"] "tests/sim/_cook_policy.py" = ["PLR0911", "PLR0912"] # a state machine: one branch per kitchen state "tests/sim/helpers.py" = ["PLR0911", "PLR0912", "PLR0915", "PLR0917"] # the scripted policy: one branch per kitchen state, one optional knob per builder [tool.pyright] include = ["src", "tests"] pythonVersion = "3.12" typeCheckingMode = "standard" reportMissingImports = "error" reportUnusedImport = "warning" strictListInference = true strictDictionaryInference = true [tool.pytest.ini_options] testpaths = ["tests"] addopts = "-ra --strict-markers --cov=undercooked --cov-report=term-missing --cov-fail-under=90" asyncio_mode = "auto" markers = [ "unit: pure, no I/O (fast)", "integration: multi-module, in-process server/room tests", "e2e: Playwright browser suites, one per user story", "slow: replay/stress tests excluded from the quick loop", ] [tool.coverage.run] branch = true source = ["src/undercooked"] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "if TYPE_CHECKING:", "raise NotImplementedError", ]