associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Revisão 3e 2004-10-07 13:58:29

Excluir mensagem

TemplatesGenericos

Introdução

O projeto TemplatesGenéricos visa disponibilizar uma biblioteca geral para expressar estruturas de dados complexas em código Python. Trata-se ainda de uma abordagem experimental. O conceito básico é simples:

class Pessoa(GenericTemplate):
    nome = 'José da Silva'
    class endereco(GenericTemplate):
        rua = 'Rua das Bobos, 0'
        cidade = 'Patópolis'
    class documentos(GenericTemplate):
        cpf = '00.000.000-00'
        rg  = '0.000.000'

A princípio, o template acima é bastante similar a qualquer outro escrito em XML, ou em um dicionário Python. Qual seriam as vantagens, então?

  • Legibilidade: o código em Python é bem estruturado e legível. Já o código em XML não é tão legível, e é mais difícil de editar manualmente. O dicionário também se torna confuso, porque muitas definições ficam dentro de strings, o que polui o código com aspas e chaves que não são nada 'pitônicas';

  • Integração: o código pode residir dentro de um arquivo convencional Python. Não há necessidade de ler a descrição de outro lugar.

  • Orientação a objeto: é muito fácil criar novas classes e construir estruturas dinâmicas e inteligentes, que processam os atributos de forma automatizada. Estas estruturas podem ser herdadas e reutilizadas dentro do ambiente normal de programação Python.

Aplicações

O sistema foi criado a partir de uma idéia ambiciosa: um ambiente de desenvolvimento de aplicações comerciais, capaz de converter definições de telas de entrada em múltiplos formatos de saída. Para viabilizar o desenvolvimento, optamos pelo crescimento gradual. A biblioteca de templates está sendo focada em duas aplicações até o momento:

  • Templates para Web: permite a especificação de páginas com layouts complexos, incluindo forms de entrada de dados. A descrição final é facilmente legível, e o uso de objetos facilita a composição de telas complexas, com vários elementos, em tempo de execução. Exemplos:

     class Page(htmlcontainer.HtmlPage):
         class head(htmlcontainer.HtmlPage.head):
             stylesheet = CSSStyleSheet
         class body(htmlcontainer.HtmlPage.body):
             contents = """
             Hello World!
             """
    
     class FormEdicaoUsuario(Form):
         title = 'Dados do usuário'
         class dadosbasicos(Panel):
             style    = 'form-section'
             apelido  = EditBox(caption = 'Identificação', size = 15)
             senha    = EditBox(caption = 'Senha', size = 10, password = True)
             nome     = EditBox(caption = 'Nome completo', size = 40)
         class endereco(Panel):
             style    = 'form-section'
             endereco = EditBox(caption = 'Endereço', size = 40)
             bairro   = EditBox(caption = 'Bairro', size = 40)
             cidade   = EditBox(caption = 'Cidade', size = 40)
         class extras(Panel):
             style    = 'form-section'
             observacao= EditBox(caption = 'Observações',
                                 multiline= True, rows = 10, cols = 40)
  • Arquivos de inicialização (.ini): permite a especificação de uma estrutura de arquivo de inicialização .ini, com a divisão em seções. Cada atributo pode ter seu tipo e um valor default definido de forma simples e legível:

     class SimpleIni(IniFile):
        class server(IniSection):
            socketPort = TypedAttribute(8080)
            threadPool = TypedAttribute(10)
        class staticContent(IniSection):
            bitmaps = TypedAttribute('c:/work/sidercom/bitmaps')
        class session(IniSection):
            storageType = TypedAttribute('ram')

    O tipo TypedAttribute é um atributo especial, que quando colocado dentro de um Template, gera automaticamente uma 'property' que checa o tipo do argumento. O tipo é inferido a partir do valor default. Assim, as seguintes atribuições serão tratadas de formas diferentes:

     ini = SimpleIni()
     ini.server.socketPort = 10     # aceito -> 10 é um inteiro
     ini.staticContent.bitmaps = 0  # gera exceção -> 0 não é string

Funcionamento

O sistema de templates depende de algumas regras básicas para garantir o funcionamento transparente. As regras são:

  • Todas as classes aninhadas devem ser herdadas de Template. Classes não herdadas de Template poderão ser aninhadas, mas sem garantia de comportamento correto.
  • Os atributos aninhados que não forem classes devem ser herdeiros de GenericAttribute. Esta classe já tem o código necessário para operar em conjunto com o GenericTemplate.

  • Os atributos simples (strings, inteiros, etc.) podem ser especificados diretamente no código. A metaclasse que cria o GenericTemplate processa automaticamente estes valores, e os encapsula dentro de um atributo genérico (sem tipo).

  • O TypedAttribute é um herdeiro do atributo genérico, que verifica o tipo do argumento nas chamadas ao método set.

Código fonte

De que vale esta conversa sem o código fonte? (Ainda não coloquei a licença; preciso de ajuda com isso! aceito sugestões!)

PS: os comentários e nomes estão em inglês. O código se propõe a ser de uso livre, e não faria sentido escrevê-lo em português. Espero que todos compreendam.