BlogBlogs.Com.Br

sexta-feira, 23 de janeiro de 2009

Testando Seu Código Java com Ruby

Galera essa foi muito boa, eu procurando sobre usar o BDD em Java, algo parecido com o RSpec, que gosto tanto, e me familiarizei fácil usando no Rails. Achei um que pareceu interessante o JBehave, porém parecia mais com os Stories do RSpec, é não com os Spec, que era justamente o que eu queria, também encontrei um tal de JDave, mas ainda é um projeto embrionário, e resolvi procurar se havia uma versão do RSpec para Java, eis que caio no Blog do Ola Bini, um dos Team Leaders do JRuby, e ele mostra usando o RSpec com Java usando JRuby. Não era bem isso que queria, mas mesmo assim, resolvi experimentar, nunca mexi muito com o JRuby, já brinquei com Java e Ruby separados mas não nessa versão, usando recurso das duas linguagens juntas. Então lá fui eu copiar o exemplo do Ola Bini, e para minha surpresa funcionou muito bem, melhor do que eu esperava. Então pequei um código e comecei a testar para ver se funcionava com minhas entidades, testar um programa escrito em puro Java, em outras palavras usar as classes do Projeto e as do Ruby juntas.

Então comecei a luta para o JRuby reconhecer minhas classes, e após algumas tentativas frustradas, que incluíam adicionar o jar do Projeto no classpath, não funcionou. Estava pronto para estudar o JDave ou o JBehave, quando recorri ao senhor supremo da internet, o Google. Encontrei uma wiki sobre JRuby, e lá tinha um código relativamente ridículo, que eles diziam que adicionava a biblioteca ao JRuby. Vejam o código simples:


require "caminho/para/arquivo.jar"
module Models
include_package "pacote/suppacote"
end


Um Module em ruby, é quase uma classe, ele é um complemento para uma classe, todo o código de um module incorporado a uma classe pode ser usado, sem restrição (ou talvez haja e eu não sei, não estudei muito essa parte.). Esse module só vai simplificar nosso trabalho, ao invés de fazer a chamada usando o padrão do JRuby que é de:


pacote.subpacote.Classe


Chamamos direto pelo estilo Ruby de Models::Classe, pode parecer poca coisa mais se você for seguir as convenções da Sun da um caminho grande até a classe.

Agora sim podemos criar nossos testes com o JRuby usando projetos Java. Vocês podem ver o exemplo do Ola Bini, e testar suas classe com o RSpec, caso não saiba ainda utilizar o RSpec, é uma chance de aprender. Para você usar na sua classe de Teste, tem que adicionar também no início do arquivo o require do seu module como, por exemplo:


require "caminho/para/models.rb"


Assim você pode usar qualquer classe do seu Projeto.jar sem problemas e testa-las usando RSpec. Pra que sofrer com JUnit?

Logo logo sai um artigo sobre MVC em PHP a pedido do meu amigo Renato, aguardem.

[]'s

domingo, 11 de janeiro de 2009

ActsAsPoll – meu primeiro plugin para Rails

Galera é com muita felicidade que comunico a todos que acabei de publicar no github, meu primeiro plugin, o ActsAsPoll, ele está bem simples, e provavelmente não está bem escrito, por isso ele esta disponivel para quem quiser ajudar no desenvolvimento do mesmo.

O que ele faz?
Esse plugin cria enquetes para um site em Rails, contendo a votação, e uma tela de resultado usando AJAX.

Como se usa?

Para utiliza-lo faça o download do github usando o comando


script/plugin install git://github.com/fellix/acts_as_poll.git


assim está instalado o plugin na sua aplicação, para utilizado você precisará gerar os arquivos principais utilizando o gerador poll, bem simples de se criar basta utilizar o comando:


script/generate poll poll


o primerio parametro e o generator poll que vem junto com o plugin, e o segundo argumento e o nome que será utilizado por migrações, models, controllers, etc. Executando esse comando serão criados alguns arquivos:


  • 2 migrações, uma para a classe Poll, e outra para a classe PollOption

  • 2 models, cada um correspondente a cada migração

  • 1 controller, que vai gerenciar a votação via AJAX

  • 2 partials, na pasta shared, que se não existir será criada. Uma delas monta o formulário de votação, e o outro mostra o resultado na tela.

  • E por ultimo 1 helper na pasta app/helpers, PollHelper, que conterá um metodo de ajuda que renderizará o partial que monta o formulário de votação.


Por enquanto o plugin não contem a parte de administração e cadastro de enquetes, mas está nos planos, caso alguém queira ajudar, essa é a hora :).
Com esse material você já pode usar a enquete, como citei anteriormente ele usa AJAX, certifique-se que no seu application.html.erb possui a tag


javascript_include_tag :defaults


e em alguma view que você queira mostrar a enquete pasta chamar o metodo helper poller e passar como parametro o argumento uma variavel do tipo Poll, e ele montará um formulário para votação.
Também é possível utilizar os metodos do ActiveRecord como por exemplo:


poller(Poll.find(1))


assim teria montada a enquete com o ID 1 no sua página. Inicialmente está bem simples, pretendo melhorar mais tarde, a ideia principal é deixa-lo simples, ainda há diversas ideias a serem colocadas no projeto, como por exemplo um gerador randomico, que pegaria uma enquete randomica a cada request, essa pode ser para um futuro update.

quinta-feira, 8 de janeiro de 2009

Utilizando restful_authorization e restful_authentication

Esse tema estava no rails-br, e tinha um comentario de que faltavam documentos em português explicando o uso desses dois excelentes plugin para rails.

O que são e o que fazem?
o restful_authentication é um plugin que faz o login de um usuário de acordo com o uma tabela no banco.
e o restful_authorization é um plugin que funciona com o authentication, ele ministra as regras de authenticação de um usuário, as permissões de acesso.

Instalando
Você não precisa do authorization caso deseje somente um login.
para instalar vamos instalar apartir do github, faça o dowload do git, para o seu sistema operacional, como uso Ubuntu, para quem usa também basta utilizar

sudo apt-get install git-core

agora basta criar uma aplicação em rails, levando em consideração que já deve ter o ruby, rails e git instalados.

rails teste

agora vamos instalar nossos plugins, quando se instala um plugin do github, ele cria um repositorio git, onde vc pode atualizar seu plugin sem problemas, vamos ao que insteressa, instalando os plugins

script/plugin install git://github.com/technoweenie/restful-authentication.git

script/plugin install git://github.com/jbarket/restful-authorization.git

Na pasta teste/vendor/plugins, foram adicionadas duas pastas os nossos queridos plugins.

Agora a unica coisa que precisamos é chamar os respectivos generators, no restful-atuthorization o README esta com problemas, pois o generator dele esta com nome diferente, apenas um pequeno detalhe.

vamos criar então nosso model de autenticação

script/generate authenticated user sessions

explicando detalhadamente esse comando, estamos gerando um model chamado user, e um controller chamado sessions, o model user, vai ser nosso modelo em tabela para fazer o login, e o controller sessions, vai ser o responsavel pelos logins e logouts.

Apos rodar o generator ele adiciona algumas rotas ao seu routes.rb


map.logout '/logout', :controller => 'sessions', :action => 'destroy'
map.login '/login', :controller => 'sessions', :action => 'new'
map.register '/register', :controller => 'users', :action => 'create'
map.signup '/signup', :controller => 'users', :action => 'new'

você pode usar logout_path nos controllers, logout_url nas views etc.

para utilizar em algum controller as validações vc tem que adicionar um include no seu controller



include AuthenticatedSystem


Após fazer fazer isso vc pode usar self.current_user que vai lhe retornar o usuário logado atualmente.

para abrir a tela de registro de usuário utilize localhost:3000/singup e pode se registrar e criar uma conta, e em localhost:3000/login

tem um metodo que ajuda muito é o logged_in?, pode ser usado para verificar se um usuário está logado. por exemplo em um before_filter em um controler, ou em uma view para verificar se o usuário esta logado.


Utilizando o Restful-Authorization

O restful-authorizaiton, esta com um problema no README, pois o generator esta com nome diferente, mas nada que va estragar seu sono.
Para gerar as autorizações precisamos de alguns parametros


script/generate authorized role user


São dois simples parametros que devemos utilizar, um deles é o novo modelo, o role, que vai manter as regras da aplicação, é um model bem simples. O segundo parametro é o model que pertence ao restful-authentication, que nós criamos acima.

Após rodar o comando acima, se abrirmos nossa classe user, veremos que alguns detalhes foram adicionados nela


has_and_belongs_to_many :roles



# has_role? simply needs to return true or false whether a user has a role or not.

# It may be a good idea to have "admin" roles return true always

def has_role?(role_in_question)

@roles_list ||= self.roles.collect(&:name).collect(&:downcase)

return true if @roles_list.include?("admin")

(@roles_list.include?(role_in_question.downcase.to_s))

end


um novo metodo (has_role?) foi criado na classe e podemos utilizado para os usuário, ele verifica se o usuário possui alguma role, percebem a detalhe, já tem uma validação caso a role seja admin, que por padrão ira permitir tudo ao usuario.

Em qualquer lugar da apliçao que você possa chamar o self.current_user (veja mais acima), também poderá chamar o metodo has_role?

Ex:
self.current_user.has_role?("financeiro")

retornará true se o usuário atual tem a regra financeiro.

Essa segunda parte, eu nunca testei, mas segundo README no github do restful-authorization você pode deixar ele mesmo filtrar pelas regras adicionando em algum controle o comando:


authorized_role :financeiro


e assim ele vai validar se o usuário possui a role determinada no controller.

Muito util e simples.
Espero que tenha ajudado

Até a próxima

[]'s