[Moscow.pm] Test::Deep: проверка необязательных ключей хеша

Maxim Vuets maxim.vuets на gmail.com
Чт Июл 19 10:59:35 PDT 2012


On Thu, Jul 19, 2012 at 05:46:08PM +0400, Orlovsky Alexander wrote:
>А что, если попробовать https://metacpan.org/module/JSON::Schema ?

Спасибо, достойная альтернатива.

Против:

 - слишком много зависимостей;
 - слишком многословная схема.

За:

 - хорошие сообщения об ошибках.

Пример:

    use JSON::Schema;

    my $got = {
        login       => 'john smith',
        password    => 'Hello1',
        age         => 16,
        color       => 'yellow',
        greeting    => 'hi',
        some        => 'rubbish',
    };

    my $schema = {
        type => 'object',
        properties => {
            login    => {
                required => 1,
                type     => 'string',
                pattern  => '^[a-z0-9]+$',
            },
            password => {
                required => 1,
                type     => 'string',
                pattern  => '^[\x21-\x7e]+$',
            },
            age      => {
                type     => 'integer',
                minimum  => 18,
            },
            color    => {
                type     => 'string',
                enum     => [qw/red green blue/],
            },
            greeting => {
                type     => 'string',
                format   => 'palindrome',
            },
        },
    };
    my $validator = JSON::Schema->new($schema, format => {
        palindrome => sub {$_[0] eq reverse $_[0]},
    });
    my $result = $validator->validate($got);
    say $result ? 'ok' : ("fail:\n - ", join "\n - ", $result->errors);

Вывод:

    fail:
     - $.color: does not have a value in the enumeration {red,green,blue}
     - $.greeting: does not match format palindrome
     - $.age: must be greater than or equal to minimum value 18
     - $.login: does not match the regex pattern ^[a-z0-9]+$

-- 
maxim.vuets.name


Подробная информация о списке рассылки Moscow-pm