[project] name = "mirror" version = "0.1.0" description = "Device-agnostic, browser-only screen mirroring for the local network." readme = "README.md" requires-python = ">=3.13" license = { text = "MIT" } authors = [{ name = "Reese Apps" }] dependencies = [ "fastapi>=0.115", "uvicorn[standard]>=0.30", "python-dotenv>=1.0", ] [project.optional-dependencies] dev = [ "debugpy>=1.8", "pytest>=8.3", "pytest-asyncio>=0.24", "pytest-cov>=5.0", "httpx>=0.27", "ruff>=0.6", "pyright>=1.1.380", "playwright>=1.47", "pytest-timeout>=2.3", ] [project.scripts] mirror = "mirror.__main__:main" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/mirror"] [tool.ruff] line-length = 100 target-version = "py313" src = ["src", "tests"] [tool.ruff.lint] select = ["E", "F", "W", "I", "UP", "B", "C4", "SIM", "ARG", "RUF"] [tool.pytest.ini_options] testpaths = ["tests"] addopts = "-ra --strict-markers --cov=mirror --cov-report=term-missing" timeout = 60 asyncio_default_fixture_loop_scope = "function" asyncio_mode = "auto" markers = [ "e2e: browser end-to-end tests (require Playwright browsers)", "realdisplay: end-to-end tests that capture a real X11 display", ] [tool.coverage.run] source = ["src/mirror"] [tool.pyright] include = ["src"] pythonVersion = "3.13" typeCheckingMode = "standard" [dependency-groups] dev = [ "pytest-timeout>=2.4.0", ]