Pre-commit Pre-commit logo¶

https://pre-commit.com/

Git logo

🎓 https://learngitbranching.js.org/
🔫🦶 🧔‍♂️⁉️

git hooks¶

commit, merge-commit, push, prepare-commit-msg, commit-msg, post-checkout, post-commit, post-merge, post-rewrite, and manual

Instalar¶

pip install pre-commit
pre-commit --version

Activar¶

cd /path/al/repositorio/git/a/configurar
# git init

pre-commit sample-config # Crea un .pre-commit-config.yaml de ejemplo
vim .pre-commit # Configurar

pre-commit install   # Fácil de poner
pre-commit uninstall # Fácil de sacar

Configurar¶

.pre-commit-config.yaml

default_install_hook_types: # En que git hooks llamamos a pre-commit
  - commit-msg
  - pre-commit
default_stages: # Cuales git hooks usamos implícitamente en los repos 
  - commit
  - manual
fail_fast: true # Parar al primer fallo
exclude: LICENSE|CHANGELOG.md|\.gitlab/ # Ficheros a no comprobar
repos: 
  - repo: 'https://github.com/pre-commit/pre-commit-hooks'
    rev: v4.3.0
    hooks:
      - id: check-merge-conflict # Detecta merge conflict strings
      - id: end-of-file-fixer # El fichero acaba en un enter
      - id: mixed-line-ending # Enters crlf/lf reemplaza por el mayoritario
      - id: trailing-whitespace # Borra los espacios al final de línea
        args:
          - --markdown-linebreak-ext=md # Excepto en markdown (hard linebreaks)

Subcomandos de pre-commit¶

pre-commit help
usage: pre-commit [-h] [-V] {autoupdate,clean,gc,init-templatedir,install,install-hooks,migrate-config,run,sample-config,try-repo,uninstall,validate-config,validate-manifest,help,hook-impl} ...

positional arguments:
  {autoupdate,clean,gc,init-templatedir,install,install-hooks,migrate-config,run,sample-config,try-repo,uninstall,validate-config,validate-manifest,help,hook-impl}
...

pre-commit autoupdate  # Auto-update pre-commit config to the latest repos' versions.
pre-commit run --all-files # Run hooks on all files

Repos¶

Listados en https://pre-commit.com/hooks.html

Repos - commitizen¶

  • Estandariza commits mediante Conventional Commits (basados en la convención de Angular).
  • Posibilita CHANGELOG y tags automáticos (fuera de pre-commit)
repos: 
  - repo: 'https://github.com/commitizen-tools/commitizen'
    rev: v2.37.0
    hooks:
      - id: commitizen
        stages:
          - commit-msg

Repos - isort, black¶

  • Formateado automático de código python
repos: 
  - repo: 'https://github.com/PyCQA/isort'
    rev: 5.10.1
    hooks:
      - id: isort
        args:
          - --profile
          - black
          - --filter-files
        language_version: python3
  - repo: 'https://github.com/psf/black'
    rev: 22.10.0
    hooks:
      - id: black

Repos - pre-commit (meta)¶

  • Meta chequeo
repos: 
  - repo: meta # https://pre-commit.com/#meta-hooks
    hooks:
      - id: check-hooks-apply
      - id: check-useless-excludes

Repos - pre-commit¶

  • xxx
repos: 
  - repo: 'https://github.com/pre-commit/pre-commit-hooks'
    rev: v4.3.0
    hooks:
      # Identify invalid files
      - id: check-ast
      - id: check-yaml
      - id: check-json
      - id: check-toml
      # Git checks
      - id: check-added-large-files
      - id: detect-private-key
      - id: check-case-conflict
      # Python check
      - id: check-docstring-first
      - id: debug-statements
      - id: requirements-txt-fixer
      - id: fix-byte-order-marker
      # General quality checks
      - id: check-executables-have-shebangs

Repos - pyupgrade¶

  • Actualiza la sintáxis de código fuente python
repos: 
  - repo: 'https://github.com/asottile/pyupgrade'
    rev: v3.2.2
    hooks:
      - id: pyupgrade
        args:
          - --py37-plus

Repos - flake8¶

  • Python linter flake8
repos: 
  - repo: https://github.com/PyCQA/flake8
    rev: 5.0.4
    hooks:
      - id: flake8
        args:
          - --max-line-length=89
          - --ignore=E203,E266,E501,W503,F403,F401

Repos - vulture¶

  • Limpia de código "muerto"
repos: 
  - repo: 'https://github.com/jendrikseipp/vulture'
    rev: v2.6
    hooks:
      - id: vulture
        # entry: python scripts/run_vulture.py
        pass_filenames: false
        require_serial: true

Repos - varios¶

  • https://github.com/lyz-code/yamlfix/
  • https://github.com/dosisod/refurb
  • https://github.com/asottile/pyupgrade
  • https://github.com/pre-commit/mirrors-mypy
  • https://github.com/codespell-project/codespell
  • ...

Atribuciones (imágenes)¶

  • pre-commit-logo-top-shelf.png → https://pre-commit.com/
  • Git-logo.svg → https://upload.wikimedia.org/wikipedia/commons/e/e0/Git-logo.svg

🏁¶