Держите свой код в чистоте с помощью Black & Pylint, Git Hooks и Pre-commit
Кодирование может быть очень сложной задачей, особенно при работе над проектом с разными разработчиками. Каждый член команды использует свой собственный способ кодирования, что приводит к очень разнородным сценариям.
Вот почему важно иметь аналогичный формататор кода и линтер кода, чтобы сделать ваши коммиты git более чистыми. Это может быть выполнено либо между этапами постановки и фиксации, либо во время цепочки CI / CD.
В этой статье мы увидим, как это сделать на этапе перед фиксацией с помощью хуков git.
Оглавление
Резюме выглядит следующим образом:
- Black
- Pylint
- Предварительные коммиты в виде хуков Git
Black
Black - это форматер кода python, конфигурации стилей которого намеренно ограничены. Это делает ваш код чище, поэтому вы можете больше сосредоточиться на содержании. Проверка кода также более эффективна, поскольку различия минимальны.
Его можно установить с помощью следующей командной строки:
pip install black
Вы можете запустить black в любом файле Python, набрав:
Black pathtofile.py
Black можно слегка настроить с помощью файла pyproject.toml, который следует поместить в корень вашего проекта. Ниже пример этого файла:
[tool.black]
line-length = 88
target-version = [‘py36’, ‘py37’, ‘py38’]
include = ‘\.pyi?$’
exclude = '''
/(
\.toml
|\.sh
|\.git
|\.ini
|Dockerfile
|Jenkinfile
)/
'''
Например, мы можем выбрать длину строк кодов, а также установить расширения, файлы которых не должны форматироваться.
Pylint
Pylint - это «инструмент статического анализа кода Python», который оценивает качество разработанных скриптов. Он направляет команду к принятию одних и тех же стандартов.
Pylint можно установить с помощью следующей командной строки:
pip install pylint
Чтобы оценить качество написания кода для данного скрипта, вы можете запустить:
pylint pathtofile.py
NB: чтобы запустить pylint для всего проекта, ваш репозиторий должен включать файл __init__.py
.
Как и Black, Pylint также можно настроить с помощью файла .pylintrc
, который также размещается в корне вашего проекта.
[MASTER]
jobs=4 #number of processes to use
[BASIC]
good-names=nameOfYourProject #names to be considered ok
[pre-commit-hook]
command=custom_pylint
disable=E0401, C0301
Вы можете проверить эту страницу для получения более подробной информации о конфигурации.
Предварительные коммиты в виде хуков Git
Хуки Git - это определенные сценарии, которые запускаются при запуске действия git.
Есть два типа хуков:
- Хуки на стороне клиента: запускаются после фиксации и слияния
- Хуки на стороне сервера: запускаются в сетевых операциях, например, после нажатия коммитов.
В этой статье мы сосредоточимся на клиентских, рабочий процесс которых можно описать следующим графиком:
В репозитории git хуки помещаются в .git / hooks /
. Их можно визуализировать в VSCode, например, добавив следующие строки в настройки Json:
"files.exclude": {
"**/.git": false
}
Изображение автора
Настройка предварительных коммитов
Чтобы добавить действие перед фиксацией в ваш репозиторий:
1. Создайте файл pre-commit в папке .git / hooks /
. Вы не должны включать в его имя какое-либо расширение.
2. Добавьте в файл команды bash. В нашем случае:
#!/bin/sh
black .
python lint.py -p ../projectName/
Первая строка применяет форматировщик black, а вторая строка применяет linting к каждому файлу python вашего проекта. Вы можете скачать файл lint.py по этой ссылке:
import argparse
import logging
from pylint.lint import Run
logging.getLogger().setLevel(logging.INFO)
parser = argparse.ArgumentParser(prog="LINT")
parser.add_argument('-p',
'--path',
help='path to directory you want to run pylint | '
'Default: %(default)s | '
'Type: %(type)s ',
default='./src',
type=str)
parser.add_argument('-t',
'--threshold',
help='score threshold to fail pylint runner | '
'Default: %(default)s | '
'Type: %(type)s ',
default=7,
type=float)
args = parser.parse_args()
path = str(args.path)
threshold = float(args.threshold)
logging.info('PyLint Starting | '
'Path: {} | '
'Threshold: {} '.format(path, threshold))
results = Run([path], do_exit=False)
final_score = results.linter.stats['global_note']
if final_score < threshold:
message = ('PyLint Failed | '
'Score: {} | '
'Threshold: {} '.format(final_score, threshold))
logging.error(message)
raise Exception(message)
else:
message = ('PyLint Passed | '
'Score: {} | '
'Threshold: {} '.format(final_score, threshold))
logging.info(message)
exit(0)
NB: по умолчанию установлено пороговое значение 7. Если оценка pylint ниже этого числа, фиксация завершится ошибкой, и вам придется очистить свой скрипт перед повторной фиксацией.
3. Сделайте его исполняемым, выполнив следующую команду bash:
chmod +x .git/hooks/pre-commit
После этого каждой фиксации вашего проекта будет предшествовать форматирование Black и linting pylint.
В качестве иллюстрации рассмотрим следующее приложение:
При фиксации нового изменения мы получаем следующие результаты:
Совместное использование linter и formatter
Теперь, когда вы настроили black в качестве средства форматирования и pylint в качестве linter, вы определенно хотите, чтобы ваша команда имела такую же конфигурацию.
Для этого вы можете использовать следующий файл bash, который будет помещен в корень вашего проекта и запущен каждым членом вашей команды после клонирования репозитория:
#!/bin/bash
echo $"#/bin/sh\nblack .\npython lint.py -p ../projectName/'> .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
Заключение
Предварительные коммиты - это очень мощные инструменты, позволяющие поддерживать правильный формат кода и стандартизировать методы разработки для членов вашей команды. Точно так же они могут включать и другие проверки, помимо линтинга и форматирования.
В этой статье мы использовали классический метод, который вызывает установленные библиотеки Python, вы также можете использовать предварительную фиксацию модуля python, которая включает в себя множество проверок и вызовов их репозиториев GitHub. Это очень эффективно, но может быть сложно настроить, особенно при использовании прокси- фильтров