ci:
  skip: [pylint]

repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.6.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.6.5"
    hooks:
      - id: ruff
        args: ["--fix"]
        exclude: doc/data/messages
      - id: ruff
        name: ruff-doc
        files: doc/data/messages
  - 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: 5.13.2
    hooks:
      - id: isort
        exclude: doc/data/messages/
  - repo: https://github.com/psf/black
    rev: 24.8.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/
      # 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: sphinx-generated-doc
        alias: sphinx-generated-doc
        name: sphinx-generated-doc
        entry: make -C doc/ html
        pass_filenames: false
        language: system
        stages: [pre-push]
      - 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.4"
    hooks:
      - id: rstcheck
        args: ["--report-level=warning"]
        files: ^(doc/(.*/)*.*\.rst)
        additional_dependencies: [Sphinx==7.4.3]
  - repo: https://github.com/pre-commit/mirrors-mypy
    rev: v1.11.2
    hooks:
      - id: mypy
        name: mypy
        entry: mypy
        language: python
        types: [python]
        args: []
        require_serial: true
        additional_dependencies:
          [
            "isort>=5",
            "platformdirs==2.2.0",
            "py==1.11",
            "tomlkit>=0.10.1",
            "types-setuptools==75.6.0.20241126",
          ]
        exclude: tests(/\w*)*/functional/|tests/input|tests(/.*)+/conftest.py|doc/data/messages|tests(/\w*)*data/
  - repo: https://github.com/rbubley/mirrors-prettier
    rev: v3.3.3
    hooks:
      - id: prettier
        args: [--prose-wrap=always, --print-width=88]
        exclude: tests(/\w*)*data/
  - repo: https://github.com/DanielNoord/pydocstringformatter
    rev: v0.7.3
    hooks:
      - id: pydocstringformatter
        exclude: *fixtures
        args: ["--max-summary-lines=2", "--linewrap-full-docstring"]
        files: "pylint"
  - repo: https://github.com/PyCQA/bandit
    rev: 1.7.9
    hooks:
      - id: bandit
        args: ["-r", "-lll"]
        exclude: *fixtures
  - repo: https://github.com/codespell-project/codespell
    rev: v2.3.0
    hooks:
      - id: codespell
        args: ["--toml=pyproject.toml"]
        additional_dependencies:
          - tomli
  - repo: https://github.com/tox-dev/pyproject-fmt
    rev: "v2.5.0"
    hooks:
      - id: pyproject-fmt
