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

Akzhan Abdulin akzhan.abdulin на gmail.com
Чт Июн 15 06:25:44 PDT 2017


прочтое чтение доки подсказывает

$template_processor = Mojo::Template->new()->prepend("use YourHelpers;");

package YourHelpers'

use Exporter qw( import );

our @EXPORT = qw( my_helper );

1;


15 июня 2017 г., 16:17 пользователь 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
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20170615/f77b49b2/attachment.html>


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