поэзия бег старт

Здесь, в Octopus Wealth, я работаю над рядом проектов, в которых есть интерфейс Typescript и бэкэнд Python. Чтобы переключиться с одного на другой, я должен помнить, как меняются инструменты, например, в кодовой базе Typescript я могу запускать yarn run test (или npm run test), тогда как в Python я выполнял pytest tests/. К счастью, я считаю, что нашел для Python способ следовать Typescript, poetry run test который объясняется в этой статье.

package.json скрипты / пряжа-скрипты

Файл package.json, присутствующий в базах кода Javascript и Typescript, имеет необязательный раздел scripts, который сопоставляет одно имя с пользовательской командой, которая крайне важна для запуска в установленной среде. Это означает, что я могу выполнить yarn run lint и запустить eslint src/**/*.js src/**/*.jsx (используя eslint, установленный вместе с проектом). Обычно в моем package.json файле есть следующие сопоставления:

"scripts": {
    "start": "node scripts/start.js",
    "format": "prettier --list-different \"src/**/*.{js,jsx}\"",
    "reformat": "prettier --write \"src/**/*.{js,jsx}\"",
    "lint": "eslint src/**/*.{ts,tsx}",
    "test": "jest --env=jsdom",
  },

Помимо сценариев

Сценарии предназначены для предоставления отдельных команд CI для проверки форматирования, линтинга и тестирования базы кода, а также для предоставления полезных помощников, предназначенных только для разработки, для запуска и переформатирования базы кода. Названия format и reformat можно улучшить.

скрипты pyproject.toml / поэтические скрипты

Поэзия - это инструмент Python для упаковки и управления зависимостями. Как и yarn, он управляет зависимостями концептуально и через файл блокировки с эквивалентом package.json, называемым pyproject.toml, и эквивалентом yarn.lock, называемым poetry.lock. Одно это означает, что я могу просто запустить yarn install или poetry install, чтобы установить и настроить зависимости для любой базы кода.

Поэзия также понимает раздел скриптов в pyproject.toml файле, хотя, к сожалению, поэзия пока не позволяет указывать команду, скорее скрипт должен отображаться в модуль Python и функционировать в формате module:function. Чтобы обойти это, я добавил это в файл pyproject.toml,

[tool.poetry.scripts]
format = "scripts:format"
reformat = "scripts:reformat"
lint = "scripts:lint"
start = "scripts:start"
test = "scripts:test"

затем я создал файл с именем scripts.py в корневом каталоге кодовой базы со следующим кодом:

# This is a temporary workaround till Poetry supports scripts, see
# https://github.com/sdispater/poetry/issues/241.
from subprocess import check_call


def format() -> None:
    check_call(
        ["black", "--check", "--diff", "src/", "tests/"],
    )


def reformat() -> None:
    check_call(["black", "src/", "tests/"])


def lint() -> None:
    check_call(["flake8", "src/", "tests/"])
    check_call(["mypy", "src/backend/", "tests/"])


def start() -> None:
    check_call(["python", "src/backend/run.py"])


def test() -> None:
    check_call(["pytest", "tests/"])

Ключевым моментом является то, что check_call вызовет исключение, если вызов вернет ненулевой код, что, в свою очередь, гарантирует, что вызов поэзии вернет ненулевой код. Это означает, что стандартные сценарии CI могут понимать успехи и неудачи.

Заключение

При такой настройке мне и моим коллегам нужно только помнить, что любой инструмент, который я использую в кодовой базе Javascript / Typescript как yarn run abc, доступен в кодовой базе Python как poetry run abc. Подробно это указано в таблице ниже,

Aim                    | Javascript          | Python           
--------------------------------------------------------------------
Install dependencies   | yarn install        | poetry install
Lint the code          | yarn run lint       | poetry run lint
Test the code          | yarn run test       | poetry run test
Check formatting       | yarn run format     | poetry run format
Format the code        | yarn run reformat   | poetry run reformat

С благодарностью за это предложение, которое вдохновило на это.