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 CherryPyIni(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')