{"id":784,"date":"2010-02-12T17:05:19","date_gmt":"2010-02-12T19:05:19","guid":{"rendered":"http:\/\/blog.plataformatec.com.br\/?p=784"},"modified":"2010-02-12T17:05:19","modified_gmt":"2010-02-12T19:05:19","slug":"feliz-aniversario-devise","status":"publish","type":"post","link":"https:\/\/blog.plataformatec.com.br\/2010\/02\/feliz-aniversario-devise\/","title":{"rendered":"Feliz Anivers\u00e1rio Devise"},"content":{"rendered":"
Hoje estamos comemorando o anivers\u00e1rio do Devise<\/a>. Mas espere um pouco, se voc\u00ea est\u00e1 seguindo o Devise<\/a> desde o in\u00edcio pode estar se perguntando: “O Devise<\/a> j\u00e1 completou um ano de vida?”. N\u00e3o. Hoje estamos completando exatamente 4 meses desde que o Devise<\/a> foi lan\u00e7ado no Rails Summit Latin America 2009<\/a>. E estamos muito orgulhosos e felizes em dizer que alcan\u00e7amos a vers\u00e3o 1.0<\/a>! Yeah! Vamos comemorar e falar um pouquinho sobre a hist\u00f3ria do projeto.<\/p>\n Decidimos criar o Devise<\/a> com base em alguns requisitos de um projeto que tivemos no ano passado. A grande maioria de nossos projetos normalmente precisam de uma interface de administra\u00e7\u00e3o para configurar a aplica\u00e7\u00e3o e alguma informa\u00e7\u00e3o com CRUD. E neste projeto em espec\u00edfico, precis\u00e1vamos de dois pap\u00e9is diferentes na mesma aplica\u00e7\u00e3o: o administrador com todos os poderes para gerenciar a aplica\u00e7\u00e3o, e os usu\u00e1rios finais que deveriam estar devidamente logados para executarem algumas coisas na aplica\u00e7\u00e3o. Normalmente essa situa\u00e7\u00e3o requer um modelo, com alguma coluna de “tipo” ou flag para determinar se o usu\u00e1rio \u00e9 admin ou n\u00e3o, certo? Ok, mas n\u00e3o gost\u00e1vamos muito deste m\u00e9todo. Ent\u00e3o come\u00e7amos a analisar as possibilidades:<\/p>\n Certo, poder\u00edamos escolher um deles e com um pouco de trabalho extra alcan\u00e7ar\u00edamos nossos requisitos. Mas n\u00f3s precisar\u00edamos fazer isto toda vez que uma situa\u00e7\u00e3o dessas acontecesse? N\u00f3s respondemos n\u00e3o. N\u00e3o era DRY o suficiente. E n\u00f3s gostamos de ser DRY. Ent\u00e3o nasceu o Devise<\/a>.<\/p>\n O principal objetivo da primeira vers\u00e3o do Devise<\/a> era proporcionar o processo de login completo, incluindo recupera\u00e7\u00e3o de senha e confirma\u00e7\u00e3o de conta. E tudo deveria funcionar com pap\u00e9is diferentes, o que significa que voc\u00ea poderia facilmente adicionar em sua aplica\u00e7\u00e3o um papel de Admin, User, Account, ou qualquer outro que precisasse, sem muito trabalho. Tamb\u00e9m t\u00ednhamos um prazo: o Rails Summit<\/a>. Levou quase 1 m\u00eas de trabalho antes do Rails Summit<\/a>. Ainda me lembro os dias que antecederam o evento, n\u00f3s trabalhando quase como loucos para deixar o Devise<\/a> redondo, e tamb\u00e9m o README<\/a> que foi escrito durante o evento. Ent\u00e3o, est\u00e1vamos prontos e apresentando o Devise<\/a> para o mundo.<\/p>\n O Devise<\/a> nasceu com o intuito de gerenciar pap\u00e9is diferentes sem esfor\u00e7o, automaticamente, e isso \u00e9 conseguido atrav\u00e9s das Engines do Rails. Al\u00e9m disso, o Devise<\/a> \u00e9 constru\u00eddo sobre o Warden<\/a>, um \u00f3timo framework de autentica\u00e7\u00e3o para o Rack. Isso nos permitiu ser bastante flex\u00edveis e adicionar estrat\u00e9gias diferentes, hooks, a m\u00f3dulos facilmente. Em resumo, o Devise<\/a>:<\/p>\n Devise<\/a> foi lan\u00e7ado com os m\u00f3dulos b\u00e1sicos necess\u00e1rios para aquela aplica\u00e7\u00e3o espec\u00edfica: <\/p>\n Certo, t\u00ednhamos tudo que precis\u00e1vamos at\u00e9 ent\u00e3o. O restante estava em uma wishlist, a qual chamamos de TODO. E decidimos desde o princ\u00edpio n\u00e3o adicionar funcionalidades ao Devise<\/a> at\u00e9 que n\u00f3s ou outra pessoa realmente precisasse. Mas as pessoas pediram, as pessoas precisavam de novas funcionalidades. E elas sempre estiveram l\u00e1 para ajudar, para criar um fork e corrigir um bug, para comentar. Ent\u00e3o logo come\u00e7amos a adicionar novas funcionalidades, a primeira era:<\/p>\n Depois as pessoas pediram por maneiras mais f\u00e1ceis de criar as migratios, ent\u00e3o introduzimos um novo m\u00f3dulo com o Devise<\/a> 0.2:<\/p>\n Para ajudar as pessoas a iniciarem mais rapidamente, criamos ent\u00e3o alguns geradores. Atualmente s\u00e3o eles:<\/p>\n As vers\u00f5es 0.3 e 0.4 do Devise<\/a> vieram logo em seguida, com v\u00e1rios bugs corrigidos nos geradores, I18n, inicializa\u00e7\u00e3o, alguns m\u00e9todos deprecados e uma por\u00e7\u00e3o de c\u00f3digo refatorado.<\/p>\n As contribui\u00e7\u00f5es da comunidade estavam aparecendo cada vez mais. A primeira grande contribui\u00e7\u00e3o veio com a adi\u00e7\u00e3o dos encryptors. Atualmente o Devise<\/a> suporta a criptografia de senhas com SHA1, SHA512 e Bcrypt. Ele tamb\u00e9m possui suporte \u00e0s mesmas rotinas de criptografia do Authlogic<\/a>, Clearance<\/a> e Restful Authentication<\/a>, para auxili\u00e1-lo a migrar dessas solu\u00e7\u00f5es.<\/p>\n Neste ponto pensamos: certo, j\u00e1 deve ser o bastante. N\u00e3o era. As pessoas precisavam de ORMs diferentes do ActiveRecord<\/a>. Ent\u00e3o adicionamos suporte ao MongoMapper<\/a> e est\u00e1vamos alcan\u00e7ando o Devise<\/a> 0.5.<\/p>\n Est\u00e1vamos recebendo muito feedback sobre problemas com testes funcionais, ent\u00e3o constru\u00edmos o Devise::TestHelper, que cont\u00e9m m\u00e9todos para auxiliar as pessoas com o processo de sign in\/out nestes testes.<\/p>\n Conforme as aplica\u00e7\u00f5es crescem, mais pap\u00e9is podem ser necess\u00e1rios. Ent\u00e3o adicionamos a possibilidade de criar views espec\u00edficas para cada papel\/escopo de sua aplica\u00e7\u00e3o. Assim seu usu\u00e1rio poderia ter uma view para logar diferente do administrador, por exemplo. Chegando na vers\u00e3o 0.6, v\u00e1rias melhorias foram feitas na gera\u00e7\u00e3o de rotas e o suporte ao DataMapper<\/a> foi adicionado.<\/p>\n Est\u00e1vamos cheio de id\u00e9ias legais para adicionar novas funcionalidades, e nosso TODO estava maior do que gostamos. Ent\u00e3o surgimos com:<\/p>\n Tamb\u00e9m o processo de carregamento e o suporte a diferentes ORMs receberam uma boa aten\u00e7\u00e3o com o lan\u00e7amento do Devise<\/a> 0.7.<\/p>\n Para a vers\u00e3o 0.8 do Devise<\/a> melhoramos os testes para o MongoMapper<\/a> e fizemos uma grande revis\u00e3o no c\u00f3digo. Algum esfor\u00e7o tamb\u00e9m foi feito para ter o Devise<\/a> rodando com a \u00faltima vers\u00e3o do Warden<\/a> e as novas features, tais como os serializers. Outro m\u00f3dulo base foi extra\u00eddo do Confirmable:<\/p>\n Com muito feedback vindo da comunidade, fizemos merge de uma nova funcionalidade bacana:<\/p>\n Seguindo o mesmo padr\u00e3o do Rails neste commit<\/a> alteramos as mensagens flash para O Devise<\/a> 1.0 traz uma grande variedade de funcionalidades legais. A comunidade parece estar realmente apreciando o Devise<\/a>, e recebemos outra grande contribui\u00e7\u00e3o:<\/p>\n Al\u00e9m disso, criamos as duas funcionalidades mais pedidas para o Devise<\/a>:<\/p>\n Tamb\u00e9m adicionamos a possibilidade de usar o Migratable ao editar uma tabela, usando Estamos preparando um novo release do Devise<\/a> totalmente compat\u00edvel com o Rails 3. Isso significa que a partir de agora o Devise<\/a> est\u00e1 fechado para desenvolvimento de novas funcionalidades no Rails 2.x. Vamos manter um branch da vers\u00e3o 1.0 no github para corre\u00e7\u00e3o de bugs mantendo tudo funcionando.<\/p>\n Gostar\u00edamos de dizer muito obrigado a todos que nos ajudaram a chegar a vers\u00e3o 1.0 e a quem est\u00e1 utilizando o Devise<\/a>, testando, criando issues e nos dando todo este feedback.<\/p>\n Tamb\u00e9m, para aqueles que estavam no Rails Summit<\/a> do ano passado, n\u00f3s propusemos algo: alcan\u00e7ar o maior n\u00famero de seguidores no github t\u00e3o r\u00e1pido quanto poss\u00edvel! Quando apresentamos o Devise<\/a>, haviam 7 seguidores, e se estou correto n\u00f3s eramos 4 deles. No momento da reda\u00e7\u00e3o deste post n\u00f3s temos 762 seguidores. Yeah! Acho que posso assumir o risco e dizer que n\u00f3s conseguimos. Obrigado!<\/p>\n Vamos comemorar o Devise<\/a> 1.0, e aguardar ansiosos para ver o Devise<\/a> com o Rails 3. Aproveite!<\/p>\n Feliz anivers\u00e1rio Devise<\/a>! <\/p>\n","protected":false},"excerpt":{"rendered":" Hoje estamos comemorando o anivers\u00e1rio do Devise. Mas espere um pouco, se voc\u00ea est\u00e1 seguindo o Devise desde o in\u00edcio pode estar se perguntando: “O Devise j\u00e1 completou um ano de vida?”. N\u00e3o. Hoje estamos completando exatamente 4 meses desde que o Devise foi lan\u00e7ado no Rails Summit Latin America 2009. E estamos muito orgulhosos … \u00bb<\/a><\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[3],"tags":[],"aioseo_notices":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/posts\/784"}],"collection":[{"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/comments?post=784"}],"version-history":[{"count":12,"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/posts\/784\/revisions"}],"predecessor-version":[{"id":801,"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/posts\/784\/revisions\/801"}],"wp:attachment":[{"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/media?parent=784"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/categories?post=784"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.plataformatec.com.br\/wp-json\/wp\/v2\/tags?post=784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}O in\u00edcio<\/h3>\n
\n
Como ele funciona<\/h3>\n
\n
A estrada at\u00e9 agora<\/h3>\n
\n
\n
\n
t.authenticatable<\/code>,
t.confirmable<\/code> e assim por diante.<\/li>\n<\/ul>\n
\n
script\/generate devise_install<\/code><\/strong>: cria um arquivo de inicializa\u00e7\u00e3o para habilitar algumas configura\u00e7\u00f5es e tamb\u00e9m copia o arquivo padr\u00e3o de locale.<\/li>\n
script\/generate devise<\/strong> MyModel<\/code>: cria um modelo j\u00e1 configurado para o Devise<\/a>, adiciona rotas e uma migration.<\/li>\n
script\/generate devise_views<\/strong><\/code>: copia todas as views do Devise<\/a> para seu diret\u00f3rio app\/views, permitindo que voc\u00ea altere como achar necess\u00e1rio.<\/li>\n<\/ul>\n
\n
\n
\n
:notice<\/code> e
:alert<\/code>, e lan\u00e7amos o Devise<\/a> 0.9. Passo a passo a vers\u00e3o 1.0 estava chegando.<\/p>\n
O que h\u00e1 de novo<\/h3>\n
\n
\n
change_table<\/code>, dentre outras corre\u00e7\u00f5es.<\/p>\n
O que vem agora<\/h3>\n
Para terminar<\/h3>\n