В репозитории лежит тестовый проект для изменений.
- Починить ошибки, сделать код запускаемым
- Добавить класс Like, использовать его в main
- Добавить типы
- Добавить комментарии
- Исправить все ошибки flake8 и mypy
- Прочитать весь README.md (этот большой текст) до конца.
- Кто-то из группы форкает этот репозиторий и делится со всеми в группе.
- Каждый участник берёт себе по задаче и создаёт отдельную ветку.
- После решения задачи в своей ветке, участники делают Pull Request в главную ветку (main).
- Участники проверяют реквесты друг друга, и, если всё хорошо, то подтверждают пулл реквест. 4.1. Если что-то не так, то оставляют комментарий и требуют доработки.
GitHub flow, или как использовать GitHub в команде
Если просто всем скачать ветку main и пушить сразу в неё все изменения без каких либо проверок, то:
- Код рано или поздно сломается из-за упущенной баги.
- Кодобаза начнёт загрязняться, так как стиль добавляемого кода никем не проверяется.
Чтобы избежать этого, многие команды используют т.н. GitHub flow - особый процесс работы с GitHub репозиторием, который обеспечивает больше уровней проверки кода и позволяет поддерживать более высокое качество кодобазы.
- При появлении желания внести в код какое-то изменение (например, исправление бага или новая фича), создаётся новая ветка (с наглядным названием, вроде
feature-add-new-userclass
илиfix-connetion-lag
), и человек начинает работать в ней. - После внесения всех изменений, человек пушит свои изменение на GitHub (всё ещё в свою ветку), а затем создаёт Pull Request в основную ветку.
Pull Request (пулл реквест) - запрос на внесение изменений из другой ветки. Чтобы внести изменения, один из разработчиков должен проверить код и подтвердить что всё хорошо. В ином случае, можно оставить комментарий с указаниями проблем прямо в коде.
- Pull Request проверяется другими разработчиками, они оставляют замечания и просят исправить код.
- Разработчки исправляет указанные замечания, коммитит и пушит в свою ветку. Коммит автоматически присоединяется к Pull Request.
- После финальной проверки, Pull Request подтверждают и начинается процесс внесения изменений (merge).
- Если новый и старый код расходятся в чём-то кроме внесённых разработчиком изменений, то нужно вручную выбрать правильную версию. Если такого нет - то всё произойдёт автоматически.
- Остаётся только удалить ветку в которой происходила разработка.
В командной разработке очень важно поддерживать читаемый и чистый код, чтобы любой мог быстро разобраться, что в нём происходит.
-
Хорошая структура кода, например SOLID.
-
Хороший кодстайл (PEP8, Google Style Guide).
-
Комментарии к коду
-
requirements.txt
- файл с версиями библиотек, которые используются в коде. -
Типизация
- Использовать виртуальное окружение (для воспроизводимости кода).
python -m venv .venv
source .venv/bin/activate
-
Использовать
pipreqs
для наполненияrequirements.txt
. Альтернатива -poetry
-
Генерировать шаблоны для комментариев с помощью IDE (плагин для VS Code)
-
Использовать линтеры (программы, которые проходятся по всему коды и находят плохие и вредные практики). Например, flake8 + плагины.
pip install flake8 flake8 ./mycode.py
-
Использовать type checker (проверщик типов, помогает находить баги в коде) - mypy.
pip install mypy mypy ./mycode.py
-
Использовать форматировщики кода (black). Как использовать - см. ниже.
pip install black black ./mycode.py
-
pre-commit хуки (позволяют при каждом коммите/пуше автоматически производить операции над кодом, например, применять к нему последовательно
black
,flake8
иmypy
). Список хуков.pip install pre-commit pre-commit install pre-commit run --all-files
-
GitHub Actions (позволяет автоматизировать любые действия при заливке кода на гитхаб (линтинг, форматтирование, тестирование, сборка, ...).
-
GitHub Copilot (пишет код за тебя по текстовому описанию) [требует перепроверки!].
Для включения pre-commit, нужно добавить в корневую папку файл .pre-commit-config.yaml
. Он описывает, какие действия нужно производить над кодом при коммите.
Пример начинки файла:
repos:
# форматирует код
- repo: https://github.com/psf/black
rev: 22.10.0
hooks:
- id: black
args: ["-S"]
types: [python]
# удаляет лишние импорты
- repo: https://github.com/PyCQA/autoflake
rev: v2.0.0
hooks:
- id: autoflake
types: [python]
# сортирует импорты
- repo: https://github.com/pycqa/isort
rev: 5.10.1
hooks:
- id: isort
args: ["--profile", "black"]
types: [python]
# дополнительные проверки и исправления
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.3.0
hooks:
- id: check-added-large-files
- id: detect-private-key
- id: double-quote-string-fixer
- id: end-of-file-fixer
# линтер
- repo: https://gitlab.com/pycqa/flake8
rev: 5.0.0
hooks:
- id: flake8
additional_dependencies: ["flake8-bugbear==22.9.23","flake8-bandit==4.1.1"]
types: [python]
# проверяет ошибки типизации
- repo: local
hooks:
- id: mypy
name: mypy
entry: mypy
language: system
types: [python]
После этого можно выполнить
pre-commit install
чтобы установить эти хуки. Затем, можно запустить их ко всем файлам репозитория с помощью команды pre-commit run --all-files
Чтобы использовать GitHub Actions для дополнительной проверки кода, нужно создать в корне репозитория папки и файл .github/workflows/<имя файла>.yaml
. Пример начинки такого файла (применяет к коду flake8 и mypy):
name: Проверка
on: [push]
jobs:
linter:
name: Линтер
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Установка Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Установка зависимостей
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install mypy==0.991 flake8==6.0.0
- name: Flake8
run: flake8 $(git ls-files '*.py')
- name: MyPy
run: mypy $(git ls-files '*.py')
После этого, при пуше изменений на гитхаб, возле иконки коммита будет загораться красный или зелёный огонёк, в зависимости от того, прошёл ли код все проверки.