пятница, 13 января 2012 г.

Валидация данных в Mojolicious

Написал небольшой плагин для Mojolicious  - Mojolicious::Plugin::ValidateTiny. По сути - это обертка над Validate::Tiny с дополнительными удобными плюшками.

Для валидации входящий параметров мы просто используем хелпер:
$self->do_validation($validate_rules);
$validate_rules - это описание проверок в формате Validate::Tiny.

По-умолчанию, включена опция "autofields", которая позволяет использовать сокращенный вариант правил проверки. И вместо:
  {  
     fields => ['user', 'pass'],
     checks => [user => is_required(), pass => is_required()] 
  }
можно писать:
 [ user => is_required(), pass => is_required() ]
и fields автоматически заполнятся исходя из описания проверок.

Также очень полезна опции "explicit", которая обязывает нас описать явно правила валидации для каждого поля. По-умолчанию, выключена, но в своих проекта я всегда ее включаю.

Кроме хелпера "validator_error", есть еще хелпер "validator_any_error".
  my $errors     = $self->validator_error;         # hashref with errors
  my $pass_error = $self->validator_error('pass'); # password error text
  my $any_error  = $self->validator_any_error;     # any error

четверг, 5 января 2012 г.

Быстрая установка зависимостей Perl-приложения

Имеется приложение на Perl, которое имеет множество зависимостей. Задача - упростить установку зависимостей такого приложения.
Есть несколько подходов к решению данной задачи, но я расскажу лишь про тот вариант, который я использую и он мне нравится больше всего.

 Все модули я ставлю с CPAN в локальную директорию пользователя, использую для этого "local::lib".

Предварительно необходимо описать все зависимости приложения в Makefile.PL. Например, файл может выглядеть вот так:
use strict;
use warnings;
use ExtUtils::MakeMaker;
WriteMakefile(
NAME => 'MyApp',
VERSION => 0.01,
MIN_PERL_VERSION => 5.010,
PREREQ_PM => {
'Mojolicious' => 2.41,
'Mojolicious::Plugin::YamlConfig' => 0,
'Mojolicious::Plugin::Recaptcha' => 0.3,
'Mojolicious::Plugin::JSUrlFor' => 0.06,
'Mojolicious::Plugin::CSRFProtect' => 0.07,
'DBI' => 1.38,
'DBD::mysql' => 4.016,
'Rose::DB::Object' => 0.797,
'YAML::Syck' => 1.05,
'Locale::Maketext::Lexicon' => 0.82,
'Email::Valid' => 0.184,
'MIME::Lite' => 0,
'Try::Tiny' => 0,
'Test::Most' => 0,
'Locale::PO' => 0,
'Validate::Tiny' => 0.09,
'Text::CSV' => 1.21,
'List::MoreUtils' => 0.32,
'Math::Round' => 0.06,
'Mouse' => 0.97,
'Log::Log4perl' => 1.28,
'File::Slurp' => 0,
},
PREREQ_PRINT => 1,
dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', },
clean => { FILES => 'MyApp-*' },
test => { TESTS => 't/*.t' },
);
view raw Makefile.PL hosted with ❤ by GitHub

Процедура установки:
  1. Копируем код приложения на чистый сервер.
  2. Устанавливаем и настраиваем "local::lib" (инструкция)
  3. Устанавливаем "App::cpanminus" в локальную директорию ( возможно придется установить вручную - make, make test, make install ).
  4. Переходим в папку с приложением и выполняем команду - "cpanm --installdeps ." и ждем пока установятся все зависимости.
Вот так все просто и быстро :)