Уведомления
Очистить всё

Заявка: 10 минут про dry-schema для конфигов в CLI-утилите

4 Сообщения
3 Пользователи
14 Реакции
500 Просмотры
kirill_spb
Сообщения: 27
Автор темы
Собрал свой gem разработчик инструментов
Присоединился: 4 года назад
[#81]

Предлагаю на летнюю встречу короткий доклад, минут на 10. Мои утилиты для отчётов читают YAML-конфиг, и пользователи регулярно присылают его с опечатками: formta вместо format, строка вместо списка колонок. Раньше утилита честно начинала работу и через десять минут падала с NoMethodError на nil где-то в глубине. Теперь конфиг проверяется на старте через dry-schema, и человек сразу видит все ошибки списком:

require "dry/schema"
require "yaml"

ConfigSchema = Dry::Schema.Params do
  required(:source).filled(:string)
  required(:format).value(included_in?: %w[csv xlsx])
  optional(:columns).array(:string)
end

result = ConfigSchema.call(YAML.safe_load_file("report.yml"))
abort result.errors.to_h.inspect if result.failure?

Расскажу, как писать понятные сообщения об ошибках, как проверять вложенные секции и когда схема того не стоит.


3 ответа
puts_hello
Сообщения: 3
Пишет в irb junior-разработчик
Присоединился: 4 года назад

А чем это лучше, чем руками проверить пару ключей через fetch? Для конфига на пять полей dry-schema выглядит тяжеловато, он ещё и тянет за собой несколько gem'ов.


Ответ
Василий1992
Сообщения: 7
Дружит с bundler data engineer
Присоединился: 3 года назад

В Python для такого берут pydantic, и после него без схемы конфига уже неуютно. Приду посмотреть, как это выглядит в Ruby


Ответ
kirill_spb
Сообщения: 27
Автор темы
Собрал свой gem разработчик инструментов
Присоединился: 4 года назад

puts_hello, на пять полей fetch честно хватает, я с него и начинал. Схема окупается, когда полей двадцать, есть вложенность и хочется показать пользователю все ошибки сразу, а не по одной за запуск. По весу да, тянет dry-types, dry-logic и ещё пару, на старте CLI это плюс 40 мс, замерял. viktor.petrov поставил доклад на июль.


Ответ