Package: django-tg-bot-framework
Django Telegram Bot FrameworkФреймворк для создания чат-ботов Telegram на базе Django. Предоставляет свою стейт-машину, вебхук и редактируемые текстовки в БД.Как развернуть local-окружениеДля запуска ПО вам понадобятся консольный Git, Docker и Docker Compose. Инструкции по их установке ищите на официальных сайтах:Install Docker DesktopInstall Docker ComposeСклонируйте репозиторий.В репозитории используются хуки pre-commit, чтобы автоматически запускать линтеры и автотесты. Перед началом разработки установитеpre-commit package manager.В корне репозитория запустите команду для настройки хуков:$pre-commitinstallВ последующем при коммите автоматически будут запускаться линтеры и автотесты. Есть линтеры будет недовольны, или автотесты сломаются, то коммит прервётся с ошибкой.Сначала скачайте и соберите докер-образы с помощью Docker Сompose:$dockercomposepull--ignore-buildable
$dockercomposebuildКак вести разработкуКак обновить local-окружениеЧтобы обновить local-окружение до последней версии подтяните код из центрального окружения и пересоберите докер-образы:$gitpull
$dockercomposebuildКак установить python-пакет в образВ качестве менеджера пакетов для образа используетсяPoetry.Конфигурационные файлы Poetrypyproject.tomlиpoetry.lockпроброшены в контейнер в виде volume, поэтому изменения зависимостей внутри контейнера попадают и наружу в git-репозиторий.Вот пример как добавить в зависимости библиотеку asks. Запустите все контейнеры. Подключитесь к уже работающему контейнеруdjango_tg_bot_frameworkи внутри запустите командуpoetry add asks:$dockercomposeup-d
$dockercomposeexecdjango_tg_bot_frameworkbash
container:$poetryaddasksКонфигурационные файлыpyproject.tomlиpoetry.lockобновятся не только внутри контейнера, но и в репозитории благодаря настроенным docker volumes. Осталось только закоммитить изменения.Чтобы все новые контейнеры также получали свежий набор зависимостей не забудьте обновить докер-образ:$dockercomposebuilddjango_tg_bot_frameworkАналогичным образом можно удалять python-пакеты.Как запустить линтеры PythonЛинтеры запускаются в отдельном docker-контейнере, а код подключается к нему с помощью volume. Например, чтобы проверить линтером код в каталогахdjango_tg_bot_frameworkиtestsзапустите команду:$dockercomposerun--rmpy-lintersflake8/django_tg_bot_framework//tests/[+]Building0.0s(0/0)[+]Building0.0s(0/0)/django_tg_bot_framework/models.py:118:1:W391blanklineatendoffile1Цифра в конце1-- это количество найденных линтером ошибок форматирования кода.Тот же образ с линтером можно использовать, чтобы подсветить ошибки форматирования прямо внутри IDE. Вот пример настройки Sublime Text с предустановленными плагинамиSublimeLinterиSublimeLinter-flake8:// project settings file
{
    "settings": {
        // specify folder where docker-compose.yaml file placed to be able to launch `docker compose`
        "SublimeLinter.linters.flake8.working_dir": "/path/to/repo/",
        "SublimeLinter.linters.flake8.executable": ["docker", "compose", "run", "--rm", "py-linters", "flake8"],
    },
}Как запустить тестыВ проекте используются автотестыpytest. Запустить их можно так:$dockercomposerun--rmdjango_tg_bot_frameworkpytest===========================testsessionstarts===========================platformlinux--Python3.11.4,pytest-7.3.2,pluggy-1.2.0
rootdir:/opt/app/src
plugins:django-4.5.2,httpx-0.22.0,anyio-3.7.0
collected23items

test_decorators.py......[26%]test_route_validation.py........[60%]test_router.py...[73%]test_state_machine.py.....[95%]test_states.py.[100%]=============================================================6passedin0.22s==============================================Если вы чините поломанный тест, часто его запускаете и не хотите ждать когда отработают остальные, то можно запускать их по-отдельности. При этом полезно включать опцию-s, чтобы pytest не перехватывал вывод в консоль и выводил все сообщения. Пример для тестаtest_redirect_tg_commandsиз файлаtests/test_decorators.py.py:$dockercomposerun--rmdjango_tg_bot_frameworkpytest-stest_decorators.py::test_redirect_tg_commandsПодробнее проPytest usage.