Перейти к содержанию

Версионирование

Версионирование позволяет изменить ответ endpoint'а, не ломая приложения, которые им уже пользуются: старые клиенты продолжают ходить в /v1, новые получают /v2.

В EndoCore это не подсистема, а частный случай роутинга. Первый сегмент пути, совпадающий с ^v\d+$, — это версия, и это просто папка.

Модель

  • Версия применяется ко всему endpoint'у со всеми его методами.
  • v1 и v2 сосуществуют — старые клиенты продолжают работать.
  • После создания v2 версия v1 ведёт себя идентично прежнему. Если бы изменение в v2 могло задеть v1, версионирование было бы фикцией.
Api/
  v1/User/Role/Post.py     # POST /v1/user/role   (старый контракт)
  v2/User/Role/Post.py     # POST /v2/user/role   (новый контракт)

Создание версии

endo version create 2          # копировать последнюю версию -> v2
endo version create 2 --from 1 # ответвиться от конкретной версии
endo version create 2 --empty  # каркас без тел обработчиков
endo version list              # v1, v2

endo version create — это shutil.copytree с фильтром: копируются endpoint'ы и локальные сервисы, а импорты с указанием версии перенаправляются, чтобы v2 использовала свои сервисы — и никогда сервисы v1.

Локальные и глобальные сервисы

Api/v1/User/Services/create_role.py    # ЛОКАЛЬНЫЙ  — версионируется, копируется в v2
Services/auth_service.py               # ГЛОБАЛЬНЫЙ — общий для всех версий
  • Локальные сервисы (Api/vN/.../Services/) версионируются и копируются, поэтому изменение в v2 не может задеть v1.
  • Глобальные сервисы (/Services/ в корне приложения) общие для всех версий и никогда не копируются.

Именно это разделение делает версионирование честным: правки v2 касаются только локального кода и endpoint'ов v2.

Создание endpoint'ов в версии

endo create user/role post          # в последнюю версию
endo create v2/user/role post       # в явно указанную версию

Без префикса vN команда endo create нацеливается на последнюю существующую версию (или v1, если версий ещё нет).