[project]
name = "meshview"
version = "3.0.0"
description = "Real-time monitoring and diagnostic tool for the Meshtastic mesh network"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
    # Core async + networking
    "aiohttp>=3.11.12,<4.0.0",
    "aiohttp-sse",
    "aiodns>=3.2.0,<4.0.0",
    "aiomqtt>=2.3.0,<3.0.0",
    "asyncpg>=0.30.0,<0.31.0",
    "aiosqlite>=0.21.0,<0.22.0",
    # Database + ORM
    "sqlalchemy[asyncio]>=2.0.38,<3.0.0",
    "alembic>=1.14.0,<2.0.0",
    # Serialization / security
    "protobuf>=5.29.3,<6.0.0",
    "cryptography>=44.0.1,<45.0.0",
    # Templates
    "Jinja2>=3.1.5,<4.0.0",
    "MarkupSafe>=3.0.2,<4.0.0",
    # Graphs / diagrams
    "pydot>=3.0.4,<4.0.0",
]

[project.optional-dependencies]
dev = [
    # Data science stack
    "numpy>=2.2.3,<3.0.0",
    "pandas>=2.2.3,<3.0.0",
    "matplotlib>=3.10.0,<4.0.0",
    "seaborn>=0.13.2,<1.0.0",
    "plotly>=6.0.0,<7.0.0",
    # Image support
    "pillow>=11.1.0,<12.0.0",
    # Debugging / profiling
    "psutil>=7.0.0,<8.0.0",
    "objgraph>=3.6.2,<4.0.0",
    # Testing
    "pytest>=8.3.4,<9.0.0",
    "pytest-aiohttp>=1.0.5,<2.0.0",
    "pytest-asyncio>=0.24.0,<1.0.0",
]

[tool.ruff]
# Linting
target-version = "py313"
line-length = 100
extend-exclude = ["build", "dist", ".venv"]

[tool.ruff.lint]
select = ["E", "F", "I", "UP", "B"]     # pick your rulesets
ignore = ["E501"]                       # example; let formatter handle line length

[tool.ruff.format]
quote-style = "preserve"
indent-style = "space"