O que esperar do Grails 1.4Saudações!!

Estamos muito ocupados aqui na Lambda3, e dentro de uma de nossas consultorias surgiu a possibilidade de estudar e dar uma olhada no que nós aguarda a próxima atualização do framework opensource Grails, que tem ganho bastante buzz nos últimos tempos. Já trabalho há algum tempo com grails, e estou ansioso para sua atualização (entre os sites que já trabalhei: WhereToEatCMRF, Grant Central Online, IIEA, Speir Energy,etc)

Se você não conhece, um pequeno “WTF“: Grails é um framework web, utilizando a linguagem Groovy, inicialmente baseado no framework Ruby on Rails. O principal motivador para se dar uma olhada: a integração transparente com sua base de código Java. Aprofunde um pouco mais seu conhecimento com a minha apresentação feita na Globalcode no ano passado: Minicurso Groovy / Grails (outro link MUITO interessante é o texto do Henrique Lobo Weissmann: Grails, um guia Rápido e indireto)

Mas vamos lá: semana passada foi lançada a versao 1.4.0.M1, que é um grande avanço. Gostaria de apresentar algumas das melhorias em maiores detalhes. Os principais highlights desse milestone:

  • Upgraded Dependencies: Spring 3.1 M1, Hibernate 3.6, Tomcat 7 and Servlet 3.0 all included
  • A new reloading agent to make development time changes more reliable * HTML5 enhanced scaffolding UI
  • New documentation and test templates
  • Integrated static resource handling with the resources plugin
  • Hugely improved unit testing via mixins
  • GORM Improvements: Abstract inheritance, findByOrCreate etc.

Links importantes:

Atualização Automática de dependencias

Ao iniciar, o grails verifica todas as dependencias terminadas com SNAPSHOT e atualiza automáticamente para uma versão mais nova. Pra você que gosta de viver na “bleeding edge” de suas dependências.

Prototype x JQuery

Partindo de uma discussão antiga na lista de emails do grupo, agora é oficial: Jquery é o framework padrão para desenvolvimento em Grails.

Se você estava cansado de desinstalar o prototype (apagando os arquivos), e instalar o plugin do Jquery (se é que vc fazia isso), seus problemas acabaram…

Geração de Código

Mesmo sendo a fonte de MUITA discussão, grails possui mecanismos de geração de código (telas de scaffold, controllers, tests ). Na nova versão:

  • Melhorada a engine de geração de código, incorporando templates de HTML5 para scaffold
  • Mesmo já utilizando JUnit 4 há muito tempo, o template de geração de testes estava desatualizado. Pois agora já foi modificado! 🙂
  • Além disso, o scaffold também gera os testes relativos às funcionalidades de CRUD (bem parecido com os geradores de specs para Rails).

Melhorias em layout

Nem só de funcionalidades novas vivem os desenvolvedores… às vezes é importante um pouco de “sugar”. Templates de scaffold e Test reports foram atualizados… e ficaram realmente melhores! 🙂

O scaffold:

Os Test Results

Resources Plugin agora é Nativo

Integracao nativa com o Resources Plugin

O plugin ataca os seguintes problemas com aplicações web (extraido da documentacao):

  • Web performance tuning
  • Correção de ordem de carregamento para recursos dependentes
  • Satisfaz uma boa prática de incluir entradas javascripts apenas no final dos documentos
  • Padroniza a disponibilizacao de recursos estáticos para Plugins Grails
  • Previnir a inclusao dos mesmos recursos mais de uma vez

Entenda melhor o que o plugin é capaz em: http://grails-plugins.github.com/grails-resources/

Testes

Este tópico merece um post próprio, então não vou me extender. Mas para dar um gosto da mudança:

Toda documentação sobre testes foi reescrita! Dê uma olhada: http://grails.org/doc/1.4.x/guide/9.%20Testing.html

A elaboração de testes for bastante facilitada com a exploração de variáveis implícitas e melhorias no acesso aos objetos. Está ficando cada vez mais simples escrever código de testes para controllers:

class BookController {
   def create() {
      render view:"new", model:[bookInstance:new Book()]
   }
}

@Test
void testCreate() {
   def model = controller.create()
   assert model.bookInstance != null

}

Associated Named Queries

Essa é muito legal! Foi criada a possibilidade de incluir namequeries para consultas de dominios dependentes. Isto é, se um objeto de domínio depende de outro, você pode acessar suas namedQueries para construir a consulta. Como no exemplo:

Direto do site:

class Publication {
   Author author
   static namedQueries = {
    recentPublications {
       def now = new Date()
       gt 'datePublished', now - 10
    }
  }
}
class Author {
    static hasMany = [publications:Publication]

    static namedQueries = {
       authorsWithRecentPublications {
          publications {
             recentPublications() // invoking a named query defined in the Publication class…
          }
      }
    }
}

FindOrCreate

Mais Sugar sintax na linguagem: classes de domínio não agora suportam os metodos findOrCreateWhere, findOrSaveWhere, findOrCreateBy and findOrSaveBy.
Todos os métodos funcionam da mesma forma que o findWhere, com a ressalva de que será criado um objeto caso o elemento buscado não exista. No caso de findOrSaveBy, o objeto será inclusive salvo, caso não seja encontrado.

Book book = Book.findOrCreateWhere(author:"José Saramago", title:"Ensaio sobre a Cegueira")

Banco de Dados

Muita coisa nova!!

Incorporação do H2(Hypersonic 2)

Evolução (já antiga) do HSQLDB, também criado pelo Thomas Myeller [fonte].
– (port pre-1.4 também disponível) como plugin: http://www.grails.org/plugin/dbconsole
– Console web incluso  disponível como plugin (inseguro) – CUIDADO!
– melhor desempenho para db em memoria

DB Reverse Engineering

The DB Reverse Engineering plugin reads database table information using JDBC and uses the schema data to create domain classes. This is a complex problem and the plugin is unlikely to get things 100% correct. But it should save you a lot of work and hopefully not require too much tweaking after the domain classes are generated.

Tradução: O Plugin DB Reverse Engineering lê as tabelas de um banco de dados utilizando JDBC e cria as classes de domínio. Este é um problema complexo e é muito difícil de tudo sair 100% correto. Entretando, isto pode salvar muito tempo e esperamos que não seja necessario muito trabalho extra depois das classes serem geradas.

Pagina Oficial:http://grails.org/plugin/db-reverse-engineer

A premissa do plugin é interessante, principalmente se você tem que atacar problemas utilizando base de dados pre-existentes. Já existia possibilidade de mapear sua base através de entradas nas classes de domínio, e esse plugin lhe dará uma força no processo de mapeamento. Tudo isso utilizando sua configuração definia no datasource. O princípio é simples:

 Sua base de dados + Comando Grails = classes GORM

O que tem de bom

  • Reconhece limites e constraints para campos
  • Cria relacoes entre entidades (até mesmo consegue validar chaves compostas)
  • Pode salvar muito tempo no mapeamento

O que não é tao bom

  • Todo código gerado exige cuidado!!
  • Sempre revise as classes geradas (nunca será 100%)

Database Migrations

Normalmente seu código está num Controle de Versao (claro, somente nas empresas normais)… mas e a sua base de dados? Seria possivel armazenar as versoes de sua base?

Grails 1.4 incorporará um plugin baseado no Liquibase , que é uma forma de armazenar changesets de sua base em xml. Assim, será possível extrair changelogs de sua base, para armazená-los no seu controle de versão, possibilitando:

  • Tracking manual de mudanças(changeset first) OU criar diffs automatics (GORM first)
  • Aplicar modificações incrementalmente em uma base gerada, ampliando o gerenciamento de aplicações em produção
  • Simplifica desenvolvimento para dbs mutáveis

IMPORTANTE: Sempre esteja ciente de que esta não é a bala de prata para o problema de controle de banco de dados. A comunidade Ruby já sabe disso há muito tempo, e é importante criar esta cultura para grails tb.

Bem, espero que esta “pequena” introdução sirva para você se empolgar com a nova versão, e já se preparar. Já é possível baixar a versão e sair testando no site http://www.grails.org

[]s

Victo Hugo Germano

Victor Hugo Germano

CEO da Lambda3