[Moscow.pm] Валидация шаблонов Mojo::Template

Alexander M. Pravkin pfduch на yandex.ru
Чт Июн 15 06:17:04 PDT 2017


Уважаемые почитатели Mojolicious, помогите с такой проблемой.

Есть некоторое число проектов, которые благополучно работают на perl
5.16-5.20, но на свежем валятся, ибо там повсеместно используются
конструкции, не рекомендованные к использованию. Собственно, встала
задача исправить это безобразие.

С самим кодом проблем нет, проблемы есть с embedded-perl-шаблонами Mojo.
Если бы их была пара штук или хотя бы пара десятков, можно было бы и
вручную обойти. Но их около сотни только в одном проекте.

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

Простые шаблоны нормально обрабатываются вот таким скриптом:


use strict;
use open qw(:std :utf8);
use Mojo::Template;

my $file = $ARGV[0]
    or die "Usage: $0 mojo-template.ep\n";

my $mt = Mojo::Template->new(vars => 1);

my $res;
# Проход первый: ищем необъявленные переменные
{
    local $SIG{__WARN__} = sub {};
    $res = $mt->render_file($file)
        or die "render_file $file returned nothing\n";
}

# Если ошибок не было -- всё OK
ref $res and $res->isa('Mojo::Exception')
    or exit 0;

# Ищем все переменные, используемые шаблоном
# Считаем, что автор кода тоже передаёт render'у все нужные
my $errors = "$res";
my %stash = map { $_ => undef }
    ($errors =~ /Global symbol "\$(\w+)" requires explicit package name/g);
delete $stash{_O}; # подставная переменная Mojo::Template

print "+++ $file variables: ", join(' ', sort keys %stash), "\n";

# Проход второй, настоящие ошибки
$res = $mt->render_file($file, \%stash);
if (ref $res and $res->isa('Mojo::Exception')) {
    die "\n--- $file has errors:\n$res\n";
}


Но он, как минимум, не понимает helper'ов от всяких плагинов (layout,
include и прочие form_for). Присобачить использование плагинов к
одинокому Mojo::Template я ниасилил. Кто-нибудь может подсказать?


-- 
Правкин Александр


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