Внедрение хука перед фиксацией для преобразования кода моего собственного веб-сайта

Над одним и тем же репозиторием работает команда специалистов по данным и инженеров. Имена переменных меняются между каждым членом команды, где один использует CamelCase, а другой использует подчеркивание. Что делать, если неиспользуемые импорты все еще находятся в коде или импорты не отсортированы, поэтому импорты нелегко идентифицировать. Я воочию убедился в неэффективности, возникающей из-за мелочей, подобных тем, которые были определены ранее.

Один из способов, с помощью которого разработчики данных могут повысить свою эффективность, — привести весь код в соответствие со стандартом и следовать протоколу. Стандартизация упрощает совместную работу, упрощает разработку процессов и позволяет программистам одновременно работать над разными частями одного и того же проекта.

Простой способ сделать это — добавить хук перед фиксацией, чтобы стандартизация происходила автоматически как часть процесса фиксации.

Скачать репозиторий

В этой статье я буду использовать пример шаблона, который у меня есть для моего веб-сайта dutchengineer.org. В основной ветке хранится ужасный код, тогда как более очищенная версия находится в ветке, очищенной до коммита.

Первый шаг — клонировать мой репозиторий. Если у вас уже настроен gh, вы можете быстро запустить эти команды, чтобы получить локальный каталог.

gh repo clone sdf94/flask-dash-blog

or

Вы можете получить следующий репозиторий локально, загрузить zip-файл и т. д.

Далее вам нужно будет войти в каталог:

cd flask-dash-blog

Настройка предварительной фиксации

Давайте начнем.

  1. Установка пакета
pip install pre-commit

or

brew install pre-commit #if you are on macOS

2. Добавьте предварительную конфигурацию в .pre-commit-config.yaml.

Здесь у нас есть два варианта. Либо мы можем

  • Добавьте .pre-commit-config.yaml из другого репозитория.

or

  • Создайте один из их образца конфигурации (запустивpre-commit sample-config )

Первая версия моего файла .pre-commit-config.yaml выглядела так:

repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.2.0
    hooks:
    -   id: check-yaml
    -   id: end-of-file-fixer
    -   id: trailing-whitespace

3. Установите определенные git-хуки в .pre-commit-config.yaml.

pre-commit install
pre-commit installed at .git/hooks/pre-commit

Эта команда устанавливает хук перед фиксацией в git.

4. Запустите все файлы

pre-commit run --all-files
INFO] Installing environment for https://github.com/pre-commit/pre-commit-hooks.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
[INFO] Installing environment for https://github.com/pycqa/pylint.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...

и тогда он должен дать вам очень длинный список ошибок.

Теперь это проходит. Я знаю, что мой код не самый лучший, поэтому я добавлю линтер python; Мне лично нравится Pylint, поэтому я добавлю именно его.

repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.2.0
    hooks:
    -   id: check-yaml
    -   id: end-of-file-fixer
    -   id: trailing-whitespace
-   repo: https://github.com/pre-commit/mirrors-mypy
    rev: 'v0.942'  # Use the sha you want to point at
    hooks:
    -   id: mypy
-   repo: https://github.com/pre-commit/mirrors-pylint
    rev: ''  # Use the sha / tag you want to point at
    hooks:
    -   id: pylint

и если я сейчас запущу эту команду

pre-commit autoupdate
************* Module main
main/__init__.py:1:0: C0114: Missing module docstring (missing-module-docstring)
main/__init__.py:1:0: E0401: Unable to import 'flask' (import-error)
main/__init__.py:2:0: E0401: Unable to import 'flask_flatpages' (import-error)
main/__init__.py:3:0: E0401: Unable to import 'flask_frozen' (import-error)
main/__init__.py:4:0: E0401: Unable to import 'flask_flatpages.utils' (import-error)
main/__init__.py:5:0: E0401: Unable to import 'markdown2' (import-error)
main/__init__.py:6:0: E0401: Unable to import 'dash' (import-error)
main/__init__.py:9:0: E0401: Unable to import 'bs4' (import-error)
main/__init__.py:10:0: W0404: Reimport 'markdown2' (imported line 5) (reimported)
main/__init__.py:10:0: E0401: Unable to import 'markdown2' (import-error)
main/__init__.py:11:0: E0401: Unable to import 'pandas' (import-error)
main/__init__.py:22:0: C0116: Missing function or method docstring (missing-function-docstring)
main/__init__.py:28:0: C0116: Missing function or method docstring (missing-function-docstring)
main/__init__.py:37:0: C0116: Missing function or method docstring (missing-function-docstring)
...

Я хочу удалить ошибки невозможности импорта и могу сделать это, добавив аргумент в хук Pylint в файле .pre-commit-config.yaml:

-   repo: https://github.com/pre-commit/mirrors-pylint
    rev: ''  # Use the sha / tag you want to point at
    hooks:
    -   id: pylint
        args: ["--disable=W0142,W0403,W0613,W0232,R0903,R0913,C0103,R0914,C0304,F0401,W0402,E1101,W0614,C0111,C0301"]

Я могу настроить Pylint еще больше, используя параметры, перечисленные здесь. Мы используем зеркально-пилинтовое репо, немного отличающееся от той ветви репо.

Я вижу слишком длинный список ошибок, которые необходимо устранить. Команда, которую мы запускаем, заставляет ее проверять все файлы, но сейчас я хочу сосредоточиться только на одном файле за раз.

Я могу сосредоточиться только на одном файле или на нескольких файлах, используя следующее ключевое слово:

pre-commit run --files "main/content/about_website.md" "main/das
h/__init__.py" "main/dash/dashboard.py"

Я вижу много неиспользуемых и несортированных импортов в этом результате, поэтому мне нужно удалить их, прежде чем мы зафиксируем код. Таким образом, я добавил autoflake для удаления неиспользуемого импорта и isort для сортировки импорта.

repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.2.0
    hooks:
    -   id: check-yaml
    -   id: end-of-file-fixer
    -   id: trailing-whitespace
-   repo: https://github.com/myint/autoflake
    rev: ''
    hooks:
    -   id: autoflake
        args: ["-i","--remove-all-unused-imports"]
-   repo: https://github.com/PyCQA/isort
    rev: ''
    hooks:
    -   id: isort
-   repo: https://github.com/pre-commit/mirrors-pylint
    rev: ''  # Use the sha / tag you want to point at
    hooks:
    -   id: pylint
        args: ["--disable=W0142,W0403,W0613,W0232,R0903,R0913,C0103,R0914,C0304,F0401,W0402,E1101,W0614,C0111,C0301"]

Есть еще несколько изменений, которые я мог бы внести, но это, по крайней мере, даст нам хорошую основу на данный момент.

И если вам нужны другие хуки, у них есть все поддерживаемые хуки, перечисленные здесь.

Git-коммит

Выполнение этой команды

git commit -m "Adding pre-commit changes"

не позволит мне зафиксировать, потому что хук pylint не сработает.

Если я хочу сохранить эти изменения, несмотря на эти сбои, я могу удалить предварительную фиксацию в git-хуках.

pre-commit uninstall

А затем, используя ту же команду фиксации, мы можем выполнить фиксацию сейчас.

git commit -m "Adding pre-commit changes"

Заключение

Теперь вы на один шаг ближе к тому, чтобы привести свой код в соответствие со стандартами Python или с вашими товарищами по команде.

Я очень надеюсь, что вам понравился этот пост так же, как мне понравилось его написание! Не стесняйтесь обращаться ко мне здесь или на Linkedin.