[project] name = "voice-server" version = "1.0.0" description = "Local HTTP service for text-to-speech playback" readme = "README.md" requires-python = ">=3.10" license = {text = "MIT"} authors = [ {name = "Cal Corum", email = "cal.corum@gmail.com"} ] keywords = ["tts", "text-to-speech", "piper", "fastapi", "voice"] dependencies = [ "fastapi>=0.115.0", "uvicorn[standard]>=0.32.0", "piper-tts>=1.2.0", "sounddevice>=0.5.0", "numpy>=1.26.0", "pydantic>=2.10.0", "pydantic-settings>=2.6.0", "python-dotenv>=1.0.0", "psutil>=6.0.0", ] [project.optional-dependencies] dev = [ "pytest>=8.3.0", "pytest-asyncio>=0.24.0", "pytest-cov>=6.0.0", "httpx>=0.28.0", "ruff>=0.8.0", ] [project.scripts] voice-server = "app.main:run" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["app"] [tool.pytest.ini_options] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" testpaths = ["tests"] python_files = ["test_*.py"] python_functions = ["test_*"] addopts = "-v --tb=short" [tool.ruff] line-length = 100 target-version = "py310" [tool.ruff.lint] select = ["E", "F", "I", "N", "W", "UP"] ignore = ["E501"] [tool.coverage.run] source = ["app"] omit = ["tests/*"] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "if TYPE_CHECKING:", "raise NotImplementedError", ]