Использование утилиты contract#
Поскольку мы разработали собственный формат контрактов данных, нам потребовался набор утилит и библиотек для работы с ним (pkg/).
Утилита contract позволяет генерировать Avro Schema, проверять контракты на
соответствие спецификации и генерировать их заготовки из различных форматов (Go struct, Avro Schema, JSON Schema, Protobuf)
для упрощения их написания.
Кроме того, утилита используется в наших CI-пайплайнах, для генерации моделей, используемых в рамках платформы, и для генерации синтетических данных при тестировании.
В статье примеры использования представлены только для той функциональности, которая непосредственно необходима издателям.
Также функциональность, аналогичная описанной в статье, доступна в веб-версии утилиты.
Установка#
Доступ к репозиторию с утилитой есть у всех авторизованных пользователей.
Также вам может понадобиться репозиторий с примерами контрактов.
Релизы#
Скачать последний релиз можно в репозитории data-contract-utils.
Сборка из исходников#
- Убедитесь, что установлен Go.
- Склонируйте репозиторий:
git clone git@gitlab.kruma.ru:data-office/data-contract-utils.git. - Перейдите в директорию проекта:
cd data-contract-utils. - Выполните сборку:
make build. - Используйте бинарный файл:
build/contract.
Основные возможности#
contract валидирует и преобразует контракты данных. Основные команды:
validate: Проверяет контракты на соответствие спецификации.avsc: Генерирует Avro Schema (.avsc) из контрактов.template: Генерирует шаблоны контрактов из различных моделей данных: Avro Schema, Go struct, JSON Schema или Protobuf.
Примеры#
Валидация контракта#
Проверяет контракт на соответствие спецификации.
Команда:
Входной файл (contract.yaml):
title: entity
specification: 1.4.0
type: object
description: "Сущность"
properties:
id:
type: int64
description: "Идентификатор сущности в системе"
name:
type: string
description: "Название сущности"
required:
- id
- name
Если валидация прошла успешно, утилита завершится с кодом 0. В противном случае, код завершения будет равен 1.
Также в случае ошибки вы увидите её в логе.
Генерация Avro Schema из контракта#
Команда:
* Параметр namespace представляет собой название домена данных, обычно оно соответствует названию репозитория с контрактами.
Входной файл (contract.yaml):
title: entity
specification: 1.4.0
type: object
description: "Сущность"
properties:
id:
type: int64
description: "Идентификатор сущности в системе"
name:
type: string
description: "Название сущности"
required:
- id
- name
Вывод (schema.avsc):
{
"name": "wb.entity",
"type": "record",
"fields": [
{
"name": "id",
"type": "long"
},
{
"name": "name",
"type": "string"
}
]
}
Генерация контракта из Avro Schema, Go struct, JSON Schema или Protobuf#
Команда:
* Тип исходной модели определяется автоматически по расширению файла.
В случае необходимости тип можно задать вручную параметром -s, --source. Доступные варианты: auto, go, avsc, json-schema, protobuf.
Входной файл (model.go):
package main
type Entity struct {
ID int64 `json:"id"` // Идентификатор сущности в системе
Name string `json:"name"` // Название сущности
}
Вывод (contract.yaml):
title: entity
specification: 1.4.0
description: '' # TODO: заполнить description
type: object
properties:
id:
type: int64
description: Идентификатор сущности в системе
name:
type: string
description: Название сущности
required:
- id
- name
primaryKey: [] # TODO: заполнить массив primaryKey
* При генерации контрактов description заполняется из комментариев к структуре или к полям (при наличии оных).
Если поле осталось пустым, его необходимо заполнить самостоятельно.
* Поле primaryKey может присутствовать в сгенерированных контрактах, однако его наличие будет ошибкой в будущих версиях тулинга (1.5+).
Полный список команд можно получить, вызвав contract help.
Для получения подсказки для каждой отдельной команды, выполните contract help <команда>.