Кейс · Бэкенд · Python

cron-clock: объяснение cron и ближайшие запуски

Сервис разбора cron-выражений на Python (FastAPI, только стандартная библиотека и zoneinfo). Объясняет выражение по-русски и по-английски, считает ближайшие запуски в заданном часовом поясе с учётом перехода на летнее время, предупреждает об «опасных» расписаниях и сравнивает два выражения. Поддержаны L, W, #, шесть полей с секундами.

  • Python
  • FastAPI
  • uvicorn
  • zoneinfo
  • hypothesis
  • mypy --strict
  • ruff
  • pip-audit
  • Docker
  • GitHub Actions

01 · Как выглядит

Скриншоты

Скриншот проекта «cron-clock: объяснение cron и ближайшие запуски» на экране 1280 пикселей
Десктоп, 1280 px
Скриншот проекта «cron-clock: объяснение cron и ближайшие запуски» на экране телефона, 390 пикселей
Телефон, 390 px

02 · О проекте

Что это и зачем

Сервис разбора cron-выражений на Python (FastAPI, только стандартная библиотека и zoneinfo). Объясняет выражение по-русски и по-английски, считает ближайшие запуски в заданном часовом поясе с учётом перехода на летнее время, предупреждает об «опасных» расписаниях и сравнивает два выражения. Поддержаны L, W, #, шесть полей с секундами.

Ограничения

Нумерация дней недели как в стандартном cron (воскресенье 0 или 7), не как в Quartz; седьмое поле года не поддерживается.

@reboot отклоняется: у него нет расписания.

Правила DST сознательно просты; реальный cron (Vixie, systemd timers, Quartz) может вести себя иначе.

Проект работает на небольшом VPS с демо-данными: без отказоустойчивости и резервных копий.

Что внутри

  • Ближайшие запуски с DST: границы Europe/Berlin 2024-03-31 и 2024-10-27, пояс Lord Howe с получасовым переходом
  • 64 теста; hypothesis по 150 примеров на свойство: запуск удовлетворяет выражению, нет пропущенной минуты (проверка перебором)
  • Сравнение `* * * * * *` против `* * * * *` на 400 дней за 0,6 с
  • /api/parse: около 800 запросов в секунду, p95 35 мс; 37 МиБ RAM в покое

03 · Как запустить

Запуск одной командой

git clone <репозиторий по запросу> cron-clock
cd cron-clock
python -m app

04 · Код

Репозиторий приватный

Исходники лежат в приватном репозитории. Напишите в Telegram, открою доступ.

Запросить код