Улучшение Предложение по API: управление JS-парсерами и их тестирование

EceninPars

A-Parser Enterprise License
A-Parser Enterprise
Здравствуйте.

Мы автоматизируем разработку кастомных JS/TypeScript-парсеров (API v2). Сейчас Classic API хорошо покрывает задания и результаты, но не покрывает жизненный цикл самого парсера: файл приходится заливать через WebPanel/SSH, а новую папку — подхватывать только после перезапуска A-Parser.

Для удобства достаточно двух методов.

1. saveParser — создать или обновить JS/TS-парсер

Код:
 { "password": "...", "action": "saveParser", "data": { "name": "Custom-MyParser", "language": "typescript", "code": "import { BaseParser } from 'a-parser-types'; ...", "create": true, "reload": true, "backup": true } }

Ответ:

Код:
 { "success": 1, "data": { "name": "JS::Custom::MyParser", "saved": true, "compiled": true, "reloaded": true, "warnings": [], "errors": [] } }

При ошибке компиляции:

Код:
 { "success": 1, "data": { "saved": true, "compiled": false, "reloaded": false, "errors": [ { "line": 12, "column": 5, "message": "..." } ] } }

Требования:

name — имя папки без префикса JS::. Custom-MyParser превращается в парсер JS::Custom::MyParser.
create: false — обновить существующий, create: true — создать новый.
reload: true — сразу загрузить парсер без полного перезапуска A-Parser.
backup: true — сохранить предыдущую версию файла.
Возвращать не только saved, но и compiled, reloaded и errors с номерами строк.
Проверять соответствие имени класса папке: JS_ + папка, дефисы заменяются на подчёркивания. Предупреждать, если в парсере не выставлен results.success = 1.

2. testParser — протестировать парсер до сохранения

Код:
 { "password": "...", "action": "testParser", "data": { "name": "Custom-MyParser", "language": "typescript", "code": "...", "save": false, "queries": ["example.com", "ya.ru"], "preset": "default", "rawResults": 1, "doLog": 1, "timeout": 60 } }

Ответ:

Код:
 { "success": 1, "data": { "parser": "JS::Custom::MyParser", "compiled": true, "queries": 2, "successCount": 2, "failedCount": 0, "duration": 1.8, "results": [ { "query": "example.com", "success": 1, "fields": { "domain": "example.com", "status": "ok", "metrics_table": "Домен@!@Статус~!example.com@!@ok" }, "resultString": "Домен@!@Статус!~example.com@!@ok\n", "logs": [] } ], "errors": [] } }

Требования:

code — необязательный: если передан, тестируется новая версия без сохранения; если нет — текущая сохранённая.
queries — один или несколько запросов за вызов, чтобы проверять регрессию.
success в каждом результате — это results.success из парсера, а не только успех HTTP-запроса.
Возвращать compiled, errors с line и column, duration, successCount и failedCount.
Возвращать и rawResults, и resultString, для настройки формата.
save: true — сохранить только если все запросы успешны, атомарно.

Почему это важно

Не нужен доступ WebPanel/SSH.
Не нужен полный перезапуск A-Parser ради новой папки парсера.
Можно тестировать новую версию до сохранения и откатываться при ошибке.
Ошибки компиляции приходят с номерами строк, а не в виде Rollup failed: HASH(...) или CBOR::XS::Tagged=ARRAY.
Удобно строить CI/CD: сохранить, проверить, прогнать несколько доменов, задеплоить.
Этих двух методов достаточно для базового сценария. Готовы протестировать beta-версию на нашем инстансе и дать обратную связь.

Спасибо.
 
Последнее редактирование:
Назад
Верх