ci:
  skip: [pylint]

repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v6.0.0
    hooks:
      - id: trailing-whitespace
        exclude: tests(/\w*)*/functional/t/trailing_whitespaces.py|tests/pyreverse/data/.*.html|doc/data/messages/t/trailing-whitespace/bad.py
      #      - id: file-contents-sorter # commented out because it does not preserve comments order
      #        args: ["--ignore-case", "--unique"]
      #        files: "custom_dict.txt"
      - id: end-of-file-fixer
        exclude: |
          (?x)^(
            tests(/\w*)*/functional/m/missing/missing_final_newline.py|
            tests/functional/t/trailing_newlines.py|
            doc/data/messages/t/trailing-newlines/bad.py|
            doc/data/messages/m/missing-final-newline/bad/lf.py|
            doc/data/messages/m/missing-final-newline/bad/crlf.py
          )$
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: "v0.13.3"
    hooks:
      - id: ruff-check
        args: ["--fix"]
        exclude: doc/data/messages
      - id: ruff-check
        name: ruff-doc
        files: doc/data/messages
        # Please exclude using doc/data/ruff.toml
        # exclude: ""  # Leave empty
  - repo: https://github.com/Pierre-Sassoulas/copyright_notice_precommit
    rev: 0.1.2
    hooks:
      - id: copyright-notice
        args: ["--notice=script/copyright.txt", "--enforce-all"]
        exclude: tests(/\w*)*/functional/|tests/input|doc/data/messages|examples/|setup.py|tests(/\w*)*data/
        types: [python]
  - repo: https://github.com/PyCQA/isort
    rev: 6.1.0
    hooks:
      - id: isort
        exclude: doc/data/messages/
  - repo: https://github.com/psf/black-pre-commit-mirror
    rev: 25.9.0
    hooks:
      - id: black
        args: [--safe, --quiet]
        exclude: &fixtures tests(/\w*)*/functional/|tests/input|doc/data/messages|tests(/\w*)*data/
      - id: black
        name: black-doc
        args: [--safe, --quiet]
        files: doc/data/messages/
        exclude: |
          (?x)^(
            doc/data/messages/b/bad-indentation/bad.py|
            doc/data/messages/i/inconsistent-quotes/bad.py|
            doc/data/messages/i/invalid-format-index/bad.py|
            doc/data/messages/l/line-too-long/bad.py|
            doc/data/messages/m/missing-final-newline/bad/crlf.py|
            doc/data/messages/m/missing-final-newline/bad/lf.py|
            doc/data/messages/m/multiple-statements/bad.py|
            doc/data/messages/r/redundant-u-string-prefix/bad.py|
            doc/data/messages/s/superfluous-parens/bad/example_1.py|
            doc/data/messages/s/syntax-error/bad.py|
            doc/data/messages/t/too-many-ancestors/bad.py|
            doc/data/messages/t/trailing-comma-tuple/bad.py|
            doc/data/messages/t/trailing-newlines/bad.py|
            doc/data/messages/t/trailing-whitespace/bad.py|
            doc/data/messages/u/unnecessary-semicolon/bad.py
          )$
  - repo: https://github.com/Pierre-Sassoulas/black-disable-checker
    rev: v1.1.3
    hooks:
      - id: black-disable-checker
  - repo: local
    hooks:
      - id: pylint
        name: pylint
        entry: pylint
        language: system
        types: [python]
        # Not that problematic to run in parallel see Pre-commit
        # integration in the doc for details
        # require_serial: true
        args: ["-rn", "-sn", "--rcfile=pylintrc", "--fail-on=I"]
        exclude: tests(/\w*)*/functional/|tests/input|tests(/\w*)*data/|doc/
      - id: pyright
        name: pyright
        description: "Python command line wrapper for pyright, a static type checker"
        entry: pyright
        language: python
        "types_or": [python, pyi]
        require_serial: true
        minimum_pre_commit_version: "2.9.2"
        exclude: tests(/\w*)*/functional/|tests/input|tests(/.*)+/conftest.py|doc/data/messages|tests(/\w*)*data/
        stages: [manual]
      # We define an additional manual step to allow running pylint with a spelling
      # checker in CI.
      - id: pylint
        alias: pylint-with-spelling
        name: pylint
        entry: pylint
        language: system
        types: [python]
        args:
          [
            "-rn",
            "-sn",
            "--rcfile=pylintrc",
            "--fail-on=I",
            "--spelling-dict=en",
            "--output-format=github",
          ]
        exclude: tests(/\w*)*/functional/|tests/input|tests(/\w*)*data/|doc/
        stages: [manual]
      - id: check-newsfragments
        name: Check newsfragments
        entry: python3 -m script.check_newsfragments
        language: system
        types: [text]
        files: ^(doc/whatsnew/fragments)
        exclude: doc/whatsnew/fragments/_.*.rst
  - repo: https://github.com/rstcheck/rstcheck
    rev: "v6.2.5"
    hooks:
      - id: rstcheck
        args: ["--report-level=warning"]
        files: ^(doc/(.*/)*.*\.rst)
        # TODO remove pydantic once 2.12.0 is released
        additional_dependencies:
          ["Sphinx==7.4.3", "pydantic>=2.12.0a1;python_version>='3.14'"]
  - repo: https://github.com/pre-commit/mirrors-mypy
    rev: v1.18.2
    hooks:
      - id: mypy
        name: mypy
        args: []
        additional_dependencies:
          ["isort>=5", "platformdirs==2.2.0", "py==1.11", "tomlkit>=0.10.1"]
        exclude: tests(/\w*)*/functional/|tests/input|tests(/.*)+/conftest.py|doc/data/messages|tests(/\w*)*data/
  - repo: https://github.com/rbubley/mirrors-prettier
    rev: v3.6.2
    hooks:
      - id: prettier
        args: [--prose-wrap=always, --print-width=88]
        exclude: (tests(/\w*)*data/|.github/FUNDING.yml)
  - repo: https://github.com/DanielNoord/pydocstringformatter
    rev: v0.7.5
    hooks:
      - id: pydocstringformatter
        exclude: *fixtures
        args: ["--max-summary-lines=2", "--linewrap-full-docstring"]
        files: "pylint"
  - repo: https://github.com/PyCQA/bandit
    rev: 1.8.6
    hooks:
      - id: bandit
        args: ["-r", "-lll"]
        exclude: *fixtures
  - repo: https://github.com/codespell-project/codespell
    rev: v2.4.1
    hooks:
      - id: codespell
        args: ["--toml=pyproject.toml"]
        additional_dependencies:
          - tomli
  - repo: https://github.com/tox-dev/pyproject-fmt
    rev: "v2.7.0"
    hooks:
      - id: pyproject-fmt
  - repo: https://github.com/abravalheri/validate-pyproject
    rev: v0.24.1
    hooks:
      - id: validate-pyproject
