Внедрение хука перед фиксацией для преобразования кода моего собственного веб-сайта
Над одним и тем же репозиторием работает команда специалистов по данным и инженеров. Имена переменных меняются между каждым членом команды, где один использует CamelCase, а другой использует подчеркивание. Что делать, если неиспользуемые импорты все еще находятся в коде или импорты не отсортированы, поэтому импорты нелегко идентифицировать. Я воочию убедился в неэффективности, возникающей из-за мелочей, подобных тем, которые были определены ранее.
Один из способов, с помощью которого разработчики данных могут повысить свою эффективность, — привести весь код в соответствие со стандартом и следовать протоколу. Стандартизация упрощает совместную работу, упрощает разработку процессов и позволяет программистам одновременно работать над разными частями одного и того же проекта.
Простой способ сделать это — добавить хук перед фиксацией, чтобы стандартизация происходила автоматически как часть процесса фиксации.
Скачать репозиторий
В этой статье я буду использовать пример шаблона, который у меня есть для моего веб-сайта dutchengineer.org. В основной ветке хранится ужасный код, тогда как более очищенная версия находится в ветке, очищенной до коммита.
Первый шаг — клонировать мой репозиторий. Если у вас уже настроен gh, вы можете быстро запустить эти команды, чтобы получить локальный каталог.
gh repo clone sdf94/flask-dash-blog
or
Вы можете получить следующий репозиторий локально, загрузить zip-файл и т. д.
Далее вам нужно будет войти в каталог:
cd flask-dash-blog
Настройка предварительной фиксации
Давайте начнем.
- Установка пакета
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.