diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..ccce6bd --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,43 @@ +# --------------------------------------------------------------------------- +# NeuroPose pre-commit configuration. +# +# Run locally with: +# uv run pre-commit install # one-time setup in the dev venv +# uv run pre-commit run --all-files # full-tree lint + format pass +# +# Pyright is intentionally NOT in this config. It is run in CI only, so that +# pre-commit stays fast on every commit and so we do not have to maintain a +# duplicate declaration of the project's runtime dependencies inside +# `additional_dependencies`. See `.github/workflows/ci.yml` (commit 3). +# --------------------------------------------------------------------------- +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: check-added-large-files + args: ["--maxkb=500"] + - id: check-yaml + - id: check-toml + - id: check-json + - id: check-merge-conflict + - id: check-case-conflict + - id: check-executables-have-shebangs + - id: check-shebang-scripts-are-executable + - id: end-of-file-fixer + - id: trailing-whitespace + - id: mixed-line-ending + args: ["--fix=lf"] + - id: detect-private-key + - id: forbid-submodules + + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.8.0 + hooks: + - id: ruff + args: ["--fix"] + - id: ruff-format + + - repo: https://github.com/gitleaks/gitleaks + rev: v8.21.2 + hooks: + - id: gitleaks diff --git a/pyproject.toml b/pyproject.toml index 871413e..b64e736 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -70,6 +70,91 @@ Issues = "https://git.levineuwirth.org/neuwirth/neuropose/issues" # [project.scripts] # neuropose = "neuropose.cli:app" +# --------------------------------------------------------------------------- +# Dependency groups (PEP 735). Install a group with `uv sync --group dev` or +# `uv pip install --group dev`. These are not shipped with the wheel. +# --------------------------------------------------------------------------- +[dependency-groups] +dev = [ + "pytest>=8.0", + "pytest-cov>=5.0", + "ruff>=0.8", + "pyright>=1.1.390", + "pre-commit>=4.0", +] + +# --------------------------------------------------------------------------- +# Ruff (linter + formatter). See https://docs.astral.sh/ruff/rules/ for the +# meaning of each rule code. The selection is deliberately broader than the +# Python community default — we want lint noise early rather than cruft late. +# --------------------------------------------------------------------------- +[tool.ruff] +line-length = 100 +target-version = "py311" +src = ["src", "tests"] +extend-exclude = ["notebooks"] + +[tool.ruff.lint] +select = [ + "E", "W", # pycodestyle + "F", # pyflakes + "I", # isort + "B", # flake8-bugbear + "UP", # pyupgrade + "SIM", # flake8-simplify + "RUF", # ruff-specific + "N", # pep8-naming + "C4", # flake8-comprehensions + "PTH", # flake8-use-pathlib + "PT", # flake8-pytest-style + "TID", # flake8-tidy-imports + "NPY", # numpy-specific + "D", # pydocstyle +] +ignore = [ + "D100", # missing module docstring — too strict for internal modules + "D104", # missing package docstring — too strict for __init__.py + "D203", # conflicts with D211 + "D213", # conflicts with D212 +] + +[tool.ruff.lint.per-file-ignores] +"tests/**" = ["D", "PLR2004"] +"scripts/**" = ["D"] +"src/neuropose/_*.py" = ["D"] + +[tool.ruff.lint.pydocstyle] +convention = "numpy" + +[tool.ruff.lint.isort] +known-first-party = ["neuropose"] + +[tool.ruff.format] +docstring-code-format = true + +# --------------------------------------------------------------------------- +# Pyright. "standard" rather than "strict" because the TensorFlow / OpenCV / +# scikit-learn stubs would generate thousands of unknown-type warnings under +# strict mode. We tighten toward strict after the MeTRAbs stack is pinned. +# --------------------------------------------------------------------------- +[tool.pyright] +include = ["src", "tests"] +exclude = [ + "**/__pycache__", + "**/.venv", + "notebooks", +] +pythonVersion = "3.11" +typeCheckingMode = "standard" +reportMissingTypeStubs = "none" +reportUnknownMemberType = "none" +reportUnknownArgumentType = "none" +reportUnknownVariableType = "none" +reportUnknownParameterType = "none" + +# --------------------------------------------------------------------------- +# Hatch build configuration. +# --------------------------------------------------------------------------- [tool.hatch.build.targets.wheel] packages = ["src/neuropose"]