# Python
__pycache__/
*.py[cod]
*.egg-info/
.eggs/
build/
dist/

# Virtualenvs
.venv/
.venv-wsl/
venv/

# uv
.uv/

# Tooling caches
.pytest_cache/
.mypy_cache/
.ruff_cache/

# Coverage (the CI coverage job writes these; so does a local `pytest --cov`)
.coverage
.coverage.*
coverage.xml
htmlcov/

# Sphinx (docs/Makefile and the CI docs job both build into here)
docs/build/

# SSH host keys (never commit private keys)
#
# `host_key*` alone is not enough: gitignore matches on the basename, and the
# examples call ensure_host_key("ssh_host_key"), which writes a private key named
# `ssh_host_key` into the working directory on first run. That starts with `ssh_`,
# so it matched neither `*.key` nor `host_key*`. Keep the patterns anchored to the
# suffix as well as the prefix.
*.key
*host_key*
known_hosts

# ...but `*host_key*` also matches docs/source/guide/host_keys.rst, which is a
# page *about* host keys rather than one. It silently swallowed that file the
# first time it was written. Private keys have no extension and their public
# halves end in `.pub`, so re-including the docs sources costs nothing and keeps
# the broad pattern that catches `ssh_host_key`.
!docs/source/**/*.rst

# Editors / OS
.idea/
.vscode/
.DS_Store
