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

KES kes-kes на yandex.ru
Вт Авг 29 03:23:24 PDT 2017


Все хелперы в Mojolicious работают через AUTOLOAD

Просто перегрузите в своём коде Mojolicious::Controller::AUTOLOAD

sub Mojolicious::Controller::AUTOLOAD { '' }

и все вызовы к хелперам пройдут успешно, за исключением когда хелпер возвращает объект
$c->some_helper->object_method

для этих случаев можете попробовать dispatch табличку

my $table = { method_name => sub { 'вернуть нужный объект тут' }, method_name2 => sub { ... } }
sub Mojolicious::Controller::AUTOLOAD { return $table->{ $AUTOLOAD }->() }

15.06.2017, 16:19, "Alexander M. Pravkin via Moscow-pm" <moscow-pm на pm.org>:
> Уважаемые почитатели 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 mailing list
> moscow-pm на pm.org | http://moscow.pm.org


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