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

Схема и спецификации стадий

JSON Schema пайплайна и спецификации зарегистрированных стадий:

from stageflow.docs import generate_pipeline_schema, generate_stages_json, load_pipeline_schema
from stageflow import get_stages

schema = generate_pipeline_schema(get_stages())   # схема с enum имён стадий
stages = generate_stages_json(get_stages())       # спеки стадий для редактора

load_pipeline_schema() отдаёт схему без подстановки enum — её же использует Pipeline.validate(). Из этих двух функций и собирается всё, что нужно внешнему инструменту: редактору, валидатору в CI, генератору документации.

Редактор — как раз такой инструмент. Своих стадий у него нет: он спрашивает спецификации у бэкенда и рисует по ним палитру, карточки и формы аргументов.

Проза в этих спеках — описание стадии и описание каждого её аргумента и выхода — выходит на всех языках, какие есть у сборки, таблицей {локаль: текст}, а выбирает тот инструмент, который её рисует. Поэтому один дамп обслуживает любого читателя, и язык — не причина генерировать файл заново. generate_stages_json(registry, locale="ru") сворачивает прозу к одному языку для файла, который собираются читать, а не рисовать по нему, — см. Локализацию.

Что умеет эта сборка

Редактор пишут под одну версию ядра, а направляют на тот бэкенд, который у пользователя запущен. Вопрос, на который ему нужен ответ, — не «что это за релиз», а «можно ли здесь предложить узел map», и ядро отвечает ровно на него:

from stageflow import capabilities, __version__

capabilities()
# {"stageflow": "0.10.0",
#  "node_types": ["condition", "entry", "map", "parallel", "stage",
#                 "subpipeline", "switch", "terminal", "try"],
#  "stages": 17}

node_types — это сам реестр, а не список, записанный рядом с ним: тип, зарегистрированный плагином, тоже окажется здесь, а имя, которого в списке нет, — это ровно то имя, которое Pipeline.from_dict отвергнет с Unknown node type. По такому ответу клиент может ветвиться, а по диапазону версий не может: сборка с собственным типом узла не попадает ни в один диапазон.

Ожидается, что бэкенд отдаёт это своим клиентам. Бэкенд-пример отдаёт по GET /api/meta, вместе с версией собственного HTTP-контракта:

{ "api": 1, "stageflow": "0.10.0", "node_types": ["condition", "…"], "stages": 17 }

__version__ читается из установленного дистрибутива. В чекауте, который никогда не устанавливали, там будет 0.0.0+unknown — намеренно неправдоподобный номер, чтобы его никто не сравнивал с настоящими.

Редактор, работающий на спецификациях бэкенда