[project]
name = "exosphere-cli"
version = "3.0.0"
description = "CLI/TUI driven patch reporting for remote Unix-like systems."
readme = "README.md"
authors = [
    { name = "Alexandre Gauthier", email = "alex@underwares.org" }
]
requires-python = ">=3.13"
classifiers = [
    "Development Status :: 5 - Production/Stable",
    "Environment :: Console",
    "Intended Audience :: System Administrators",
    "Natural Language :: English",
    "Operating System :: OS Independent",
    "Programming Language :: Python :: 3.13",
    "Programming Language :: Python :: 3.14",
    "Topic :: System :: Monitoring",
    "Topic :: System :: Systems Administration",
    "Topic :: Utilities",
    "Typing :: Typed",
]
license = "MIT"
license-files = [
    "LICENSE",
    "LICENSES/*",
    "COPYRIGHT",
]

dependencies = [
    "fabric>=3.2.2",
    "textual>=6.7.0",
    "pyyaml>=6.0.3",
    "platformdirs>=4.3.8",
    "prompt-toolkit>=3.0.51",
    "jinja2>=3.1.6",
    "packaging>=24.0",
    "rich>=14.1.0",
    "cyclopts>=4.16.1",
    "filelock>=3.29.4",
    "pydantic>=2.12",
]

[dependency-groups]
dev = [
    "fabric[pytest]>=3.2.2",
    "jsonschema>=4.25.1",
    "poethepoet>=0.33.1",
    "pyright>=1.1.400",
    "pytest>=8.4.2",
    "pytest-asyncio>=1.2.0",
    "pytest-cov>=6.1.1",
    "pytest-json-ctrf>=0.3.5",
    "pytest-mock>=3.14.1",
    "sphinx-rtd-theme>=3.0.2",
    "ruff>=0.15.0",
    "sphinx>=8.2.3",
    "sphinx-autobuild>=2024.10.3",
    "sphinx-lint>=1.0.0",
    "sphinx-tabs>=3.4.7",
    "sphinxcontrib-spelling>=8.0.2",
    "textual-dev>=1.7.0",
    "codespell>=2.4.0",
    "myst-parser[linkify]>=4.0.0",
]

[project.urls]
homepage = "https://exosphere.readthedocs.io"
repository = "https://github.com/mrdaemon/exosphere"
issues = "https://github.com/mrdaemon/exosphere/issues"

[project.scripts]
exosphere = "exosphere.main:main"

[build-system]
requires = ["uv_build>=0.7.19,<0.12.0"]
build-backend = "uv_build"

[tool.uv.build-backend]
module-name = "exosphere"

[tool.pytest.ini_options]
testpaths = ["tests"]

[tool.codespell]
skip = "*.lock,*.woff,*.woff2,*.ttf,*.ttx,*.svg,*.png,*.gif,*.html,*.htm,docs/source/_static"

[tool.poe.tasks]
lint = "ruff check src tests scripts"
isort = "ruff check --select I --fix src tests scripts"
isort-check = "ruff check --select I src tests scripts --diff"
typecheck = "pyright src tests scripts"
ruff-format = "ruff format src tests scripts"
ruff-format-check = "ruff format --check src tests scripts --diff"
spellcheck = "codespell src tests scripts docs/source README.md"
spellcheck-fix = "codespell --write-changes src tests scripts docs/source README.md"
format = ['ruff-format', 'isort']
format-check = ['ruff-format-check', 'isort-check']
check = ['format-check', 'lint', 'typecheck', 'spellcheck']
test = "pytest -v --ctrf .tests_report.json"
coverage = "pytest --cov-report term-missing --cov-report html --cov=src tests/"
docs-build = "sphinx-build -b html -W --keep-going docs/source docs/build/html"
docs-lint = "sphinx-lint docs/source"
docs-spellcheck = "sphinx-build -b spelling -W --keep-going docs/source docs/build"
docs-linkcheck = "sphinx-build -b linkcheck docs/source docs/build/linkcheck"
docs = ['docs-lint', 'docs-spellcheck', 'docs-build']
docs-serve = "sphinx-autobuild -b html docs/source docs/build/html --port 8000 --open-browser"
docs-mkreports = "python scripts/generate_example_reports.py"
demo = "vhs scripts/demo.tape"
release-preflight = "python scripts/release_preflight.py"
release-check = ['check', 'test', 'docs', 'release-preflight']
