[project] name = "shelly-manager" version = "0.1.0" description = "Shelly device management: shared core, Textual CLI, Streamlit UI" readme = "README.md" requires-python = ">=3.11" dependencies = [ "aioshelly>=13.0.0", "aiohttp>=3.9.0", "aiosqlite>=0.20.0", "pydantic>=2.5.0", "zeroconf>=0.132.0", "textual>=0.86.0", "rich>=13.7.0", "streamlit>=1.40.0", "typer>=0.12.0", "pyyaml>=6.0.0", "watchdog>=6.0.0", ] [project.optional-dependencies] dev = [ "pytest>=8.0.0", "pytest-asyncio>=0.24.0", "ruff>=0.8.0", ] [project.scripts] shelly-manager = "shelly_manager.cli.app:app_cli" shelly-manager-ui = "shelly_manager.ui.entry:main" [build-system] requires = ["setuptools>=61", "wheel"] build-backend = "setuptools.build_meta" [tool.setuptools.packages.find] where = ["src"] [tool.ruff] line-length = 100 target-version = "py311" [tool.pytest.ini_options] testpaths = ["tests"] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" markers = [ "integration: real LAN / Shelly devices (enable with SHELLY_INTEGRATION=1)", ] # Streamlit AppTest + asyncio.run in page scripts leave sockets/event loops that GC # clears after tests; pytest's unraisableexception plugin then raises ExceptionGroup and # exit code 1 even when all tests passed. Disable that plugin for this project. addopts = "-p no:unraisableexception" # Also quiet ResourceWarning text on stderr for the same teardown noise. filterwarnings = [ "ignore:unclosed event loop:ResourceWarning", "ignore:unclosed =9.0.2", "pytest-asyncio>=1.3.0", ]