Perl библиотека Test::Format

Иногда очень удобно коммитить в репозиторий с проектом не только файлы с исходным кодом, но и вские небольшие справочники, например, в формате 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.

Иван Бессарабов
ivan@bessarabov.ru

28 декабря 2018