[global]
alwayscopy = True

[gh]
use_discover = False

[tox]
envlist =
    clean
    validate
    i18n
    compile
    minimal
    release

minversion = 4.0
requires = virtualenv>=20.0.0
isolated_build = True

[testenv]
skip_install = false
usedevelop = true
changedir = {toxinidir}
allowlist_externals = *
ensurepip = true
setenv =
    COVERAGE_RCFILE = {toxinidir}/pyproject.toml

[testenv:build-src-rpm]
description = Build source RPM and place .src.rpm in dist/
skip_install = true
allowlist_externals =
    bash
    cp
    mkdir
    find
    rpmbuild
setenv =
    HOME = {envtmpdir}
    RPMTOP = {envtmpdir}/rpmbuild
commands_pre =
    mkdir -p {envtmpdir}/rpmbuild/SOURCES
    mkdir -p {envtmpdir}/rpmbuild/SPECS
    mkdir -p dist/rpm
    cp packaging/man/apprise.1 {envtmpdir}/rpmbuild/SOURCES/
    cp packaging/redhat/python-apprise.spec {envtmpdir}/rpmbuild/SPECS/
    find packaging/redhat/ -iname '*.patch' -exec cp {} {envtmpdir}/rpmbuild/SOURCES/ \;
    bash -c 'cp dist/*.tar.gz {envtmpdir}/rpmbuild/SOURCES/'
    bash -c 'echo "%_topdir {envtmpdir}/rpmbuild" > {envtmpdir}/.rpmmacros'
commands =
    rpmbuild --nodeps -bs {envtmpdir}/rpmbuild/SPECS/python-apprise.spec
    find {envtmpdir}/rpmbuild/SRPMS -name '*.src.rpm' -exec mv {} dist/rpm \;

[testenv:build-el9-rpm]
description = Run RPM packaging for EPEL9 via Docker
skip_install = true
allowlist_externals =
    docker
commands =
    docker compose run --rm rpmbuild.el9 bash /usr/bin/build-rpm.sh

[testenv:build-f42-rpm]
description = Run RPM packaging for Fedora 42 via Docker
skip_install = true
allowlist_externals =
    docker
commands =
    docker compose run --rm rpmbuild.f42 bash /usr/bin/build-rpm.sh

[testenv:build-rawhide-rpm]
description = Run RPM packaging for Fedora Rawhide via Docker
skip_install = true
allowlist_externals =
    docker
commands =
    docker compose run --rm rpmbuild.rawhide bash /usr/bin/build-rpm.sh

[testenv:lint]
description = Run static analysis using Ruff
deps = ruff
commands = ruff check . {posargs}

[testenv:format]
description = Auto-format code using Ruff
deps = ruff
commands = ruff check . --fix {posargs}

# - This defines a CLI script entry point for packaging.
# - It ensures that pip install . or python -m build includes
#    a working apprise command.
# - This is required for proper packaging and end-user usage
[project.scripts]
apprise = "apprise.cli:main"

[testenv:apprise]
description = Run Apprise CLI with args
commands =
    apprise {posargs}

[testenv:cli]
description = Sanity-check Apprise CLI invocation
commands =
    apprise --version

[testenv:checkdone]
description = Lint + full test run to ensure PR readiness
extras = dev,all-plugins
commands =
    pip install --no-cache-dir -e ".[dev,all-plugins]"
    ruff check .
    coverage run --source=apprise -m pytest tests {posargs}
    coverage report

[testenv:qa]
description = Full tests with all plugins + code coverage
extras = dev,all-plugins
commands =
    pip install --no-cache-dir -e ".[dev,all-plugins]"
    coverage erase
    coverage run --source=apprise -m pytest tests {posargs}
    coverage report -m
    coverage xml -o coverage.xml

[testenv:minimal]
description = Minimal dependencies + code coverage
extras = dev
commands =
    pip install --no-cache-dir -e ".[dev]"
    coverage erase
    coverage run --source=apprise -m pytest tests {posargs}
    coverage report -m
    coverage xml -o coverage.xml

[testenv:test]
description = Run simplified tests without coverage
extras = dev,all-plugins
commands =
    pip install --no-cache-dir -e ".[dev,all-plugins]"
    pytest --tb=short -q {posargs}

[testenv:clean]
description = Remove build artifacts and cache files
skip_install = true
allowlist_externals =
    find
    rm
commands =
    find . -type f -name "*.pyc" -delete
    find . -type f -name "*.pyo" -delete
    find . -type f -name "*.orig" -delete
    find . -type f -name "*.orig" -delete
    find ./apprise/i18n -type f -name "*.mo" -delete
    rm -rf BUILD SOURCES SRPMS BUILDROOT .cache .ruff_cache .coverage-reports .coverage coverage.xml dist build apprise.egg-info .mypy_cache .pytest_cache  "__pycache__"
    find . -type d -name "__pycache__" -delete

[testenv:i18n]
description = Extract and update .pot/.po files for translation
extras = dev
deps = Babel
ensurepip = true
commands =
    mkdir -p apprise/i18n
    pybabel extract -F babel.cfg -o apprise/i18n/apprise.pot apprise
    pybabel update --domain=apprise -i apprise/i18n/apprise.pot -d apprise/i18n

[testenv:compile]
description = Compile .mo files
deps = Babel
commands =
    pybabel compile --domain=apprise -d apprise/i18n

[testenv:build]
description = Build sdist and wheel (assumes translations compiled)
deps =
	build
commands =
    python -m build

[testenv:build-sdist]
deps = build
commands = python -m build --sdist

[testenv:build-wheel]
deps = build
commands = python -m build --wheel

[testenv:validate]
description = Validate pyproject.toml against PEP 621/508
deps =
   rpmlint
	validate-pyproject
	packaging
commands =
	validate-pyproject pyproject.toml
   rpmlint packaging/redhat/python-apprise.spec

[testenv:twine-check]
description = Run twine check on dist artifacts
deps = twine
commands =
    python -m twine check dist/*.whl dist/*.tar.gz

[testenv:man]
description = Rebuild the Apprise man page
allowlist_externals = docker
commands =
    docker compose run --rm rpmbuild.el9 ronn \
      --organization="Chris Caron <lead2gold@gmail.com>" \
      packaging/man/apprise.md

[testenv:release]
description = Prepare translations, compile, and build all artifacts
deps =
    validate-pyproject
    packaging
    Babel
    build
    twine
commands =
    tox -e clean
    tox -e validate
    tox -e i18n
    tox -e compile
    tox -e man
    tox -e build
    tox -e build-src-rpm
    tox -e twine-check
