Blueprinter — это рендерер API Blueprint. Он получает на вход AST API в формате Elements и генерирует HTML-страницу с документацией.
Стандарт API Blueprint разрабатывает компания Apiary, ей принадлежит официальный парсер Drafter. Параллельно энтузиасты разрабатывают другие инструменты для работы с API Blueprint, в том числе и рендерилки.
Долгое время стандартным набором в компании для работы с APIB было сочетание парсера Drafter и рендерера aglio. Через Drafter и aglio удобно работать с документацией, но их функционала нам стало недостаточно: во время работы над проектами часто требуются новые фичи и исправление багов.
Blueprinter появился как замена aglio, поскольку код в aglio трудно читать и поддерживать, а используемые технологии устарели. Автор aglio забросил проект и не принимает новые PR. Drafter также был заменён собственным парсером Crafter.
Наши реализации написаны на JavaScript, их легко развивать и поддерживать силами разработчиков фронтенда без привлечения других специалистов.
- Современный дизайн. С поддержкой тёмной темы!
- Поиск по документации. Можно быстро переходить к группам, ресурсам и экшенам, находя их по части URL или заголовкам.
- Версия для печати. В режиме печати со страницы удаляется всё лишнее и остаётся только нужный контент в адаптированном виде.
- Выбор опций One Of. В нашей реализации можно выбирать разные опции внутри One Of и динамически формировать пример тела ответа.
- Страница ручного поиска. Функциональности поисковой строки может быть недостаточно, если нужно найти часть описания или отдельно взятый атрибут. На странице ручного поиска можно воспользоваться стандартным браузерным поиском по тексту.
- Отображение предупреждений и ошибок парсинга. Предупреждения, связанные с парсингом документации, отображаются в виде специального уведомления. Ошибка парсинга, не позволяющая отобразить весь документ, выводится в виде отдельной страницы с детальной информацией.
npm install --save @funboxteam/blueprinter
Добавить команды в package.json
:
{
"scripts": {
"dev": "blueprinter -i doc.apib -s -p 3000",
"doc": "blueprinter -i doc.apib -o index.html"
}
}
Скрипт dev
запустит на порту 3000 live-сервер с отрендеренной документацией и будет следить за изменениями исходных файлов.
Скрипт doc
сгенерирует конечный HTML-файл с документацией и сохранит его как index.html
.
-i, --input <file>
— задаёт исходный APIB-файл, который нужно отрендерить.-o, --output <file>
— задаёт название конечного HTML-файла.-s, --server
— активирует режим live-сервера.-h, --host <host>
— задаёт адрес локального live-сервера. По умолчанию127.0.0.1
.-p, --port <port>
— задаёт порт локального live-сервера. По умолчанию3000
.--strict
— включает «строгий» режим парсинга, в котором любое предупреждение приведёт к ошибке сборки.--css <file>
— позволяет указать путь к кастомному CSS-файлу, стили из которого будут подключены на странице. Любые проблемы совместимости актуальной версии Blueprinter и кастомного CSS-файла остаются на совести разработчика файла.--locale <locale>
— задаёт язык интерфейса конечного HTML. По умолчаниюen
. Возможные варианты:en
,ru
.--favicon <file>
— позволяет указать путь к кастомной фавиконке. Фавиконка применяется только в режиме сборки и не учитывается при запуске dev-сервера. Разрешены только файлы в формате PNG.
Blueprinter можно запустить в виде Docker-контейнера, выполнив следующую команду в директории с APIB-документацией:
docker run \
--rm \
-v $(pwd):/app \
funbox/blueprinter -i doc.apib -o index.html
Здесь опция --rm
автоматически удалит созданный контейнер после завершения рендера документации,
а опция -v
примонтирует текущую хост-директорию с документацией в некоторую директорию в контейнере.
По умолчанию рабочей директорией образа задана директория /app
, поэтому удобнее всего смонтировать хост-директорию
непосредственно в /app
, как это сделано в примере выше. В таком случае в качестве параметра -i
можно передать
просто название файла файл-с-документацией.apib
, иначе придётся указывать путь к APIB-файлу относительно созданного в контейнере пути.
Чтобы запустить Blueprinter в контейнере в режиме dev-сервера, нужно выполнить следующую команду в директории с вашей APIB-документацией:
docker run \
--rm \
-v $(pwd):/app \
-p 3000:3000 \
funbox/blueprinter -i doc.apib -s -p 3000
Если в параметре -p
для Blueprinter передаётся порт, отличный от 3000
, нужно также открыть доступ к этому порту
в контейнере из хост-системы, указав в параметрах Docker опцию -p port:port
.
Внимание! При завершении процесса dev-сервера через Ctrl/Cmd + C
процесс с
контейнером отсоединяется (переводится в detached
), но контейнер при этом
остаётся запущенным.
Чтобы остановить контейнер, необходимо использовать команды:
docker ps # смотрим ID запущенного контейнера
docker stop <container> # останавливаем контейнер с указанным ID
При запуске контейнера в Windows нужно добавлять слэш (/
) перед вызовом pwd
:
docker run \
--rm \
-v /$(pwd):/app \
funbox/blueprinter -i doc.apib -o index.html
Кроме того, примонтированная директория может быть пустой. В таком случае
необходимо убедиться, что в настройках Docker Desktop for Windows, в разделе
Shared Drives включен шаринг нужного диска (стоит галка). Если диск не расшарен,
необходимо отметить его как shared
, применить изменения и перезапустить Docker
Desktop.
HTML-страница с отрендеренной документацией содержит поле для поиска различных
ресурсов. Автоматически установить фокус на поле поиска можно клавишей /
.
Поиск производится по следующим сущностям:
- Заголовки и описания групп, ресурсов и экшенов.
- href экшенов.
При этом результаты поиска выводятся в следующем порядке:
- Совпадения по href экшенов.
- Совпадения по заголовкам групп, ресурсов и экшенов.
- Совпадения по описаниям групп, ресурсов и экшенов.
Кроме ввода обычного поискового запроса, например empl
или сотр
, также
доступны некоторые модификаторы (фильтры) поиска. В общем виде запрос с
модификатором имеет вид modType:modValue query
, где query
— нужный поисковый
запрос. В частности, доступны фильтры по типу ресурса и по HTTP-методу:
- Фильтр по типу —
type:action query
. Возможные значения:type:group query
,type:resource query
,type:action query
. - Фильтр по методу —
method:METHOD query
, гдеMETHOD
— нужный HTTP-метод (GET, POST, DELETE и так далее). Метод можно вводить как в нижнем регистре, так и в верхнем.
Таким образом, чтобы вывести только GET-запросы, у которых href содержит
employ
, можно ввести в поисковой строке:
method:get employ
Чтобы модификатор применился, поисковый запрос должен начинаться с modType
.
Это значит, что если необходимо найти в документации фразу
method:get - пример фильтра
, то можно использовать первым символом запроса
пробел ( method:get - пример фильтра
). Модификатор при этом не применится,
пробел учитываться не будет, а поиск будет выполняться именно по фразе
method:get - пример фильтра
.
APIB-документация содержит много разнородных сущностей, поэтому поле поиска может не помочь в ряде случаев, когда нужно искать по значению атрибута или по URI-параметру. Для ручного поиска добавлена страница с последовательным выводом всего контента документации, попасть на которую можно через кнопку-пиктограмму справа от поля поиска.
На этой странице все группы, ресурсы, запросы и ответы выводятся
последовательно, также раскрыты все атрибуты в секциях Attributes. Таким
образом, можно искать по документации, используя браузерные средства, например
через комбинацию клавиш Ctrl + F
.
PDF-версия документации оптимизирована для удобного просмотра. Содержание в начале документа упрощает навигацию к выбранному разделу. Блок с описанием JSON-схемы скрыт в версии для печати.
Для сохранения документации в формате PDF средствами браузера Chrome нужно выполнить следующие действия:
- перейти на страницу ручного поиска, попасть на которую можно через кнопку-пиктограмму справа от поля поиска;
- в меню браузера выбрать опцию печати страницы;
- в открывшемся диалоге просмотра печати страницы выбрать в настройках принтера «Сохранить как PDF» и вид раскладки «Книжная»;
- сохранить документацию с указанными настройками.
npm install
Запуск проекта в режиме разработки:
npm start
Проект запустится по адресу http://localhost:8080.
Для локальной сборки проекта:
npm run build
В этом проекте добавлена поддержка нескольких языков для текстов интерфейса (на данный момент, поддерживаются русский и английский языки).
Чтобы отметить текст, который должен быть переведён, нужно применить макросы t
или Trans
из пакета @lingui/macro.
Чтобы перевод появился в интерфейсе, нужно выполнить следующее:
- запустить
npm run extract
, чтобы обновить JSON-файлы с каталогами переводов (см.src/locales/{locale}/messages
); - внести в каталоги отсутствующий перевод новых текстов;
- запустить
npm run compile
, чтобы скомпилировать каталоги в JavaScript-файлы; - закоммитить внесённые изменения.
В нашей компании разрабатывается большое количество JSON API. Их необходимо описывать и согласовывать, отслеживать изменения и показывать документацию большому кругу лиц, поэтому возникла необходимость в удобном формате и средствах для работы с документацией.
Исторически в компании происходил выбор между
API Blueprint и Swagger. Мы
выбрали API Blueprint по двум причинам. Во-первых, исходный код документации,
описанной с помощью API Blueprint, проще воспринимается человеком. Во-вторых, на
момент исследования в Swagger не хватало ряда важных возможностей, например One Of
.
Клёвый логотип для проекта нарисовал Игорь Гарибальди.