Схема и спецификации стадий¶
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-контракта:
__version__ читается из установленного дистрибутива. В чекауте, который
никогда не устанавливали, там будет 0.0.0+unknown — намеренно неправдоподобный
номер, чтобы его никто не сравнивал с настоящими.
