Иногда очень удобно коммитить в репозиторий с проектом не только файлы с исходным кодом, но и вские небольшие справочники, например, в формате json (и это могуть быть не только справочники, но и всякие конфиги, да и формат может быть не json, а какой-нибудь yaml или что-то другое популярное, или вообще свой собственный формат).
Если не задать строго формат для хранения этих файлов, то через какое-то время случается бардак — у всех кто работает с этими файлами разное понимание в каком виде их нужно хранить: кто-то добавляет новые ключи в объект, чтобы все ключи были отсортированы, кто-то это не делает, кто-то использует одни отступы, кто-то другие, у кого-то в редакторе автоматически срабатывает форматтер и файл целиком переформатируется.
Это не добавляет больших проблем, но создает мелкие проблемы из-за которых теряется время:
Для того чтобы убрать все эти мелкие проблемы нужно просто строго зафиксировать формат файлов. Чтобы был специальный тест который упадет если содержимое файлов не соответсвует правилам. А еще, было бы совсем хорошо, чтобы был очень простой способ привести файлы к нужному формату.
Я несколько раз решал эти задачи с помощю написания мелких тестов в проекте и скриптов нормализации, но мне это надоело делать, поэтому я написал и зарелизил библиотеку Test::Format которая упрощает решение подобных задач.
Создаешь файл с тестом t/format.t
use Test::More tests => 1;
use Test::Format;
test_format(
files => [
'data/countries.json',
],
format => 'pretty_json',
);
Запускаешь и видишь: либо все хорошо, либо тест падает и нужно поправить формат.
А для того чтобы поправить формат есть очень простой способ: нужно запустить этот же тест, но дополнительно указать ему флаг. Такой запуск теста отредактирует файлы и прведет их к тому формату как ожидает тест:
SELF_UPDATE=1 prove t/format.t
"Из коробки" эта библиотека умеет проверят (и исправлять) только json. Но есть возможность написать свой собственный код нормализации, который будет использоваться при тестировании и исправлении:
test_format(
files => [
'data/file.asdf',
],
format_sub => sub {
my ($content) = @_;
# Код который берет текст из переменной $content,
# форматирует его — приводит его к каноническому виду
return $expected_content;
},
);
Сегодня я зарелизил версию 1.0.0. Ссылка на библиотеку — Test::Format.
Обсуждение, предложения, баги — пишити в Issues на GitHub.
28 декабря 2018