requires = [ "tox>=4.27" ]
env_list = [
  "3.15",
  "3.14",
  "3.13",
  "3.12",
  "3.11",
  "3.10",
  "3.14t",
  "3.15t",
  "cov",
  "docs",
  "fix",
  "pkg_meta",
  "type",
  "type-min",
]
skip_missing_interpreters = true

[env_run_base]
description = "run the tests with pytest under {env_name}"
package = "wheel"
wheel_build_env = ".pkg"
dependency_groups = [ "test" ]
extras = [ "completion" ]
pass_env = [ "PYTEST_*", "SSL_CERT_FILE" ]
set_env.COVERAGE_FILE = { replace = "env", name = "COVERAGE_FILE", default = "{work_dir}{/}.coverage.{env_name}" }
set_env.COVERAGE_FILECOVERAGE_PROCESS_START = "{tox_root}{/}pyproject.toml"
commands = [
  [
    "pytest",
    { replace = "posargs", default = [
      "--durations",
      "0",
      "--durations-min",
      "0.5",
      "-n",
      { replace = "env", name = "PYTEST_XDIST_AUTO_NUM_WORKERS", default = "auto" },
      "--junitxml",
      "{work_dir}{/}junit.{env_name}.xml",
      "--no-cov-on-fail",
      "--cov",
      "{env_site_packages_dir}{/}tox",
      "--cov",
      "{tox_root}{/}tests",
      "--cov-config",
      "{tox_root}{/}pyproject.toml",
      "--cov-context",
      "test",
      "--cov-report",
      "term-missing:skip-covered",
      "--cov-report",
      "html:{env_tmp_dir}{/}htmlcov",
      "--cov-report",
      "xml:{work_dir}{/}coverage.{env_name}.xml",
      "tests",
      "--run-integration",
    ], extend = true },
  ],
  [
    "diff-cover",
    "--compare-branch",
    { replace = "env", name = "DIFF_AGAINST", default = "origin/main" },
    "{work_dir}{/}coverage.{env_name}.xml",
  ],
]
uv_seed = true

[env.docs]
description = "build documentation"
base_python = [ "3.14" ]
dependency_groups = [ "docs", "test" ]
commands = [
  [
    "sphinx-build",
    "-d",
    "{env_tmp_dir}{/}docs_tree",
    "docs",
    "{env:READTHEDOCS_OUTPUT:{work_dir}{/}docs_out}/html",
    "--color",
    "-b",
    "html",
    { replace = "posargs", default = [], extend = true },
    "-W",
  ],
  [
    "python",
    "-c",
    'print(r"documentation available under file://{work_dir}{/}docs_out{/}html{/}index.html")',
  ],
]

[env.fix]
description = "format the code base to adhere to our styles, and complain about what we cannot do automatically"
skip_install = true
dependency_groups = [ "fix" ]
pass_env = [
  { replace = "ref", of = [
    "env_run_base",
    "pass_env",
  ], extend = true },
  "DISABLE_PRE_COMMIT_UV_PATCH",
  "PROGRAMDATA",
]
commands = [ [ "pre-commit", "run", "--all-files", "--show-diff-on-failure", { replace = "posargs", extend = true } ] ]

[env.pkg_meta]
description = "check that the long description is valid"
skip_install = true
dependency_groups = [ "pkg_meta" ]
commands = [
  [
    "uv",
    "build",
    "--sdist",
    "--wheel",
    "--out-dir",
    "{env_tmp_dir}",
    ".",
  ],
  [
    "twine",
    "check",
    "{env_tmp_dir}{/}*",
  ],
  [
    "check-wheel-contents",
    "--no-config",
    "{env_tmp_dir}",
  ],
]

[env.type]
description = "run type check on code base"
base_python = [ "3.14" ]
dependency_groups = [ "type" ]
extras = [ "completion" ]
commands = [ [ "ty", "check", "--python-platform", "all", "--output-format", "concise", "--error-on-warning", "." ] ]

[env.type-min]
description = "run type check on code base for the minimum supported Python"
base_python = [ "3.10" ]
dependency_groups = [ "type-min" ]
extras = [ "completion" ]
commands = [
  [
    "ty",
    "check",
    "--python-version",
    "3.10",
    "--python-platform",
    "all",
    "--output-format",
    "concise",
    "--error-on-warning",
    "src",
    "tests",
  ],
]

[env.dev]
description = "dev environment with all deps at {envdir}"
package = "editable"
dependency_groups = [ "dev" ]
extras = [ "completion" ]
commands = [ [ "python", "-m", "pip", "list", "--format=columns" ], [ "python", "-c", 'print(r"{env_python}")' ] ]
uv_seed = true

[env.fast]
description = "fast test run for development (no integration, no slow tests, no coverage)"
package = "editable"
dependency_groups = [ "test" ]
commands = [
  [
    "pytest",
    { replace = "posargs", default = [
      "-m",
      "not integration and not slow",
      "-n",
      { replace = "env", name = "PYTEST_XDIST_AUTO_NUM_WORKERS", default = "auto" },
      "--no-cov",
      "-q",
      "tests",
    ], extend = true },
  ],
]

[env.manpage]
description = "generate the manpage RST from the CLI parser"
package = "editable"
skip_install = false
dependency_groups = [ "docs" ]
extras = [ "completion" ]
commands = [ [ "python", "{tox_root}/tools/generate_manpage.py" ] ]

[env.release]
description = "do a release, required posargs of the version number"
skip_install = true
dependency_groups = [ "release" ]
pass_env = [ "GH_TOKEN" ]
commands = [ [ "python", "{tox_root}/tasks/release.py", "--version", "{posargs}" ] ]
