<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'><div style="text-align: left;">

<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
Luis Motta Campos luismottacampos em yahoo.co.uk<br></div>Terça Dezembro 4 08:45:53 PST 2007<br><br>&gt; Ahn... Alceu, isto estah... assim... um pouco abstrato demais, nao?<br>&gt; Que tal mais um pouco de informacao objetiva sobre o teu problema?<br>&gt; <br>&gt; Onde estah o codigo do TT que voce disse que estava usando?<br>&gt; <br>&gt; Voce alguma vez tentou falar com o Nelson Ferraz sobre ou olhou o AppML?<br>&gt; <br>&gt; Putamplexos interessados!<br>&gt; -- <br>&gt; Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,<br>&gt; Perl fanatic evangelist, and amateur {cook, photographer}<br><br>Oi Luis,<br><br>Eu já disse que não recebo nenhum email seu enviado pra lista? Pois é, tive que ir catar o seu lá no histórico da lista. Não faço a menor idéia porque isso acontece.<br><br>Bem, voltando ao problema, vou contar com mais detalhes o que estou tentando fazer.<br><br>Algumas vezes eu acabo escrevendo código Perl para ler as linhas de um arquivo e validar o leiaute de arquivos texto. Inevitavelmente os programas acabam ficando todos muito parecidos, então resolvi abstrair isso um pouco e criar módulos Perl que me permitissem gerar código Perl para executar testes automáticos usando Test::More.<br><br>Para isso eu crio um arquivo XML com os meta dados. Um script Perl interpreta isso e, utilizando os módulos, gera o código Perl para testar esse arquivo específico. Depois é só executar outro script apontando um arquivo em questão, que deverá estar no leiaute definido ou o teste irá gerar erro em algum ponto.<br><br>O código gerado funcionava mas era horrível de ler, se fosse necessário fazer algo. Eu também senti falta de ter algumas "lacunas" que poderiam ser preenchidas com código dependendo de algumas condições. Achei que o TT fosse ideal para fazer isso.<br><br>Alguns testes depois e ficou muito bom. Mas eu não achei interessante ter que forçar um diretório aonde esses templates ficariam. Eu queria ter isso mais simplificado. Utilizar o mecanismo de busca em @INC me pareceu uma boa alternativa: eu crio um módulo Perl (definindo um pacote para cada template) só para que ele armazene o código do TT depois do handle __DATA__. Com isso eu deixo de ter que usar um arquivo de configuração (ou variável de ambiente) para definir o local aonde os templates estão: o perl sempre vai achar eles, desde que os módulos estejam instalados.<br><br>À partir daí passei a ter erros. Para ter comodidade de uso, eu criei uma superclasse que tenha métodos para instanciar "objetos-template" e devolver o código posteriormente ao querer processar o modelo e gerar o código de teste. Eu utilizei um pouco de tabela de símbolos para poder ler o __DATA__ sempre da subclasse, nunca da superclasse (que não nada definido ali) mas isso não está funcionando: apesar de não ter erros ao ler __DATA__, a variável que recebe o conteúdo permanece com undef.<br><br>Segue o código de um dos templates:<br><br>&lt;codigo&gt;<br>package File::Validate::Template::Basic;<br><br>use base 'File::Validate::Template';<br><br>1;<br>__DATA__<br>use Test::More;<br>use warnings;<br>use strict;<br>[% IF locale %]<br>use POSIX qw(locale_h);<br>use locale;<br><br>setlocale( LC_CTYPE, '[% locale %]' );<br>[% END %]<br><br>my $format_regex = qr/[% format %]/;<br>my $file = $ENV{FILE_TO_READ};<br>plan tests =&gt; $ENV{TOTAL_LINES} * [% total_tests %];<br><br>open( my $in, [% file_mode %], $file ) or die "Cannot read $file: $!\n";<br><br>while (&lt;$in&gt;) {<br><br>&nbsp;&nbsp;&nbsp; chomp;<br><br>&nbsp;&nbsp;&nbsp; my @fields = split( /\|/, $_ );<br>&nbsp;&nbsp;&nbsp; [% IF nullable %]<br>&nbsp;&nbsp;&nbsp; SKIP: {<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; skip 'Field is nullable and the content is NULL', [% total_tests %], <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unless( ( defined( $fields[[% index %]] ) ) and ( $fields[[% index %]] ne '') );<br>&nbsp;&nbsp;&nbsp; [% END %]<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; like( $fields[[% index %]], $format_regex, "[% name %] content is correct, source line $." );<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cmp_ok( length( $fields[[% index %]] ), '&lt;=', [% size %], <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "[% name %] has length less or equal [% size %], source line $." );<br><br>&nbsp;&nbsp;&nbsp; [% IF nullable %]<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; [% END %]<br>}<br><br>close($in);<br>&lt;/codigo&gt;<br><br>Nunca ouvi falar em AppML e uma busca rápida no Wikipedia me diz que isso foi descontinuado (http://en.wikipedia.org/wiki/AppML).<br><br>[]'s<br><br>---<br>Alceu Rodrigues de Freitas Junior<br>glasswalk3r@hotmail.com<br>"Escolha um trabalho que você ama e você nunca mais terá que trabalhar um dia na sua vida" - Confúcio<br><br><br /><hr />Invite your mail contacts to join your friends list with Windows Live Spaces. It's easy! <a href='http://spaces.live.com/spacesapi.aspx?wx_action=create&wx_url=/friends.aspx&mkt=en-us' target='_new'>Try it!</a></body>
</html>