[project]
name = "mainline"
version = "0.1.0"
description = "Terminal news ticker with Matrix aesthetic"
readme = "README.md"
requires-python = ">=3.10"
authors = [
    { name = "Mainline", email = "mainline@example.com" }
]
license = { text = "MIT" }
classifiers = [
    "Development Status :: 4 - Beta",
    "Environment :: Console",
    "License :: OSI Approved :: MIT License",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Topic :: Terminals",
]

dependencies = [
    "feedparser>=6.0.0",
    "Pillow>=10.0.0",
    "pyright>=1.1.408",
    "numpy>=1.24.0",
]

[project.optional-dependencies]
mic = [
    "sounddevice>=0.4.0",
    "numpy>=1.24.0",
]
websocket = [
    "websockets>=12.0",
]
pygame = [
    "pygame>=2.0.0",
]
browser = [
    "playwright>=1.40.0",
]
figment = [
    "cairosvg>=2.7.0",
]
dev = [
    "pytest>=8.0.0",
    "pytest-benchmark>=4.0.0",
    "pytest-cov>=4.1.0",
    "pytest-mock>=3.12.0",
    "ruff>=0.1.0",
]

[project.scripts]
mainline = "engine.app:main"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[dependency-groups]
dev = [
    "pytest>=8.0.0",
    "pytest-benchmark>=4.0.0",
    "pytest-cov>=4.1.0",
    "pytest-mock>=3.12.0",
    "ruff>=0.1.0",
    "tomli>=2.0.0",
]

[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
python_functions = ["test_*"]
addopts = [
    "--strict-markers",
    "--tb=short",
    "-v",
]
markers = [
    "benchmark: marks tests as performance benchmarks (may be slow)",
    "e2e: marks tests as end-to-end tests (require network/display)",
    "integration: marks tests as integration tests (require external services)",
    "ntfy: marks tests that require ntfy service",
]
filterwarnings = [
    "ignore::DeprecationWarning",
]

[tool.coverage.run]
source = ["engine"]
branch = true

[tool.coverage.report]
exclude_lines = [
    "pragma: no cover",
    "def __repr__",
    "raise AssertionError",
    "raise NotImplementedError",
    "if __name__ == .__main__.:",
    "if TYPE_CHECKING:",
    "@abstractmethod",
]

[tool.ruff]
line-length = 88
target-version = "py310"

[tool.ruff.lint]
select = ["E", "F", "W", "I", "N", "UP", "B", "C4", "SIM"]
ignore = ["E501", "SIM105", "N806", "B007", "SIM108"]
