Fork me on GitHub

Viagens, opiniões e afins

by Andre Fonseca


Usando parametros da linha de comando no Rake e no Capistrano

Pessoal, segue abaixo uma tradução livre de um post interessante que explica como você pode usar parametros da linha de comando dentro de sua task do RAKE ou do CAPISTRANO. O original se encontra aqui
todos os projetos que já trabalhei até hoje exigem um bom número de task em RAKE e CAPISTRANO. Desde que meus modelos são tão grandes quanto necessário, estas task e receitas são em geral pequenas e procuram fazer pouco lógica delegando para o modelo apropriado…
O que desejo é falar sobre é que sempre estamos precisando passar parametros para estas tasks, e na maioria das vezes é bastante escassa as documentações para fazer isso.
Imagine que você quer fazer algo como:

rake options:show opt1=value1

E dentro da task deseja pegar esse valor e fazer algo. Para resolver fica mais ou menos assim:

namespace :options do

  desc "Show how to read in command line options"
  task :show do
    p "option1 is #{ENV['opt1']}"
  end

end

Usando parametros da linha de comando do Capistrano:
Aqui as coisas são um pouco diferente. É necessário que use a opção -s na linha de comando para ativar a função de parser do chave/valor. Veja o exemplo abaixo:

cap -a show_options -s opt1=value1

Assim você um dicionário dentro do capistrano (receita) que a chave é opt1 e o valor dele é value1. voce pode acessar diretamente a chave por causa do method-missing que implementa isso para você. Fica assim o código.

task :show_options do
  p "option1 is #{opt1}"
end

Para maiores detalhes veja o artigo original e leia a documentação do Capistrano. Fiquem a vontade para comentar e assim que puder respondo.

Published by Andre, on setembro 6th, 2011 at 11:46 am. Filled under: ruby Tags: , , , , 2 Comments

Instalando RVM

O RVM é uma forma de criar diversos ambientes de ruby (ambiente Virtuais) de forma isolado um do outro. Assim podemos ter um ambiente para cada projeto nosso e evitar que alguma gem entre em conflito com outro projeto.
Para instalar é bem fácil e basta seguir as instruções do site do produto (clique aqui para ver)
No seu terminal digite o comando para baixar e instalar:

bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)

Fique atento que o comando acima precisa do git instalado. Depois disso, no meu caso, preciso de várias versões do ruby na minha máquina. Uma delas é o Ruby Enterprise. Para instalá-los, faça:

andre.fonseca@mac179016 ~ $ rvm install ree
Installing Ruby Enterprise Edition from source to: /Users/andre.fonseca/.rvm/rubies/ree-1.8.7-2011.03
ree-1.8.7-2011.03 - #fetching (ruby-enterprise-1.8.7-2011.03)
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 7713k  100 7713k    0     0   545k      0  0:00:14  0:00:14 --:--:-- 1499k

Esse comando de cima irá instalar o REE. O resto das distribuições deve procurar pelo nome (1.9 –> ruby-1.9.2, por exemplo).
Por fim, você pode criar um gemset (pasta de gems) para cada projeto. Para isso use os comandos (no meu exemplo abaixo estou criando um gemset chamado participacoes, para um projeto meu)

rvm gemset create participacoes
rvm gemset use participacoes

Agora é acessar meu projeto e dar um bundle install para instalar minhas Gems. Prontinho e tudo funcionando.

Published by Andre, on junho 3rd, 2011 at 5:07 pm. Filled under: ruby Tags: , , , No Comments

Setup Ambiente Ruby – instalando homebrew e git

Uma das coisas que mais admiro no Ubuntu é o sistema de gerenciamento de pacotes. Instalar, atualizar, desinstalar, etc no Ubuntu é tão simples quando uma comanda no console: “sudo apt-get install”. O problema é que para outros sistemas operacionais, como o MacOs isso não é tão simples. Na Globo.com, fui apresentado ao homebrew. Ele é muito legal, tem muitas formúlas(receitas de instalação) e é fácil de gerenciar e manter. Para instalar:

ruby -e "$(curl -fsSLk https://gist.github.com/raw/323731/install_homebrew.rb)"

Para instalar algumas bibliotecas, o brew, por algumas vezes usa, no caso do MacOS, o pacote XCode para compilar. Assim, você terá que instalar o XCode no seu sistema. Se tem o cd original do seu mac, ele estará lá para instalar. Caso não tenha, você pode usar a AppStore do Mac para instalar.
Existem caminhos alternativos para instalá-lo. Mas não recomendo.
Uma vez que tenha instalado o homebrew na sua máquina com sucesso, para usá-lo basta usar o comando brew. Teste no seu console e ele deverá ter uma saída semelhante a:

andre.fonseca@pimpao-computer ~/projects/participacoes/puppet/deploy $ brew
Usage: brew [-v|--version] [--prefix [formula]] [--cache [formula]]
[--cellar [formula]] [--config] [--env] [--repository]
[-h|--help] COMMAND [formula] ...

Principal Commands:
install formula ... [--ignore-dependencies] [--HEAD]
list [--unbrewed|--versions] [formula] ...
search [/regex/] [substring]
uninstall formula ...
update

Other Commands:
info formula [--github]
options formula
deps formula

Bom agora temos uma excelente ferramenta para instalarmos as coisas de forma simples, para montarmos nosso setup. A segunda coisa sem a qual eu não acho que tenhamos um ambiente completo é o Git. O git é um controle de versão descentralizado. Se você não está familiariado com ele, sugiro que estude, pois isso irá mudar completamente a sua forma de ver controles de versões. Acredito que já alguns post meus sobre o assunto, caso não aguarde e peçam ajuda ao google.
Voltando, vamos instalar o git em nossa máquina e assim começar. Para isso use o comando:

brew install git

Isso é tudo. Agora você já tem todo o git funcionando na sua máquina. Eu também gostou muito de colocar alguns atalhos para o git, para isso, eu adiciona “alias” no meu arquivo de bash_profile, desse jeito:

echo alias gpush="git push origin master" &gt; ~/.bash_profile
echo alias gpull="git pull origin master" &gt; ~/.bash_profile
echo alias gst="git status" &gt; ~/.bash_profile
echo alias gcm="git commit -am " &gt; ~/.bash_profile
echo alias gcko="git checkout " &gt; ~/.bash_profile

Para o começo ficamos por aqui. No próximo post mostrarei como instalar o RVM e gems para o seu projeto. No github do projeto tem um bom tutorial indicando como fazer. Para facilitar faça o comando abaixo no seu terminal:

Published by Andre, on maio 12th, 2011 at 3:56 pm. Filled under: agil,ruby Tags: , , , No Comments

Colocando auditoria de mudança na sua app Rails

Bom no meu projeto atual estou usando Ruby on Rails. Estou adorando. A coisa é realmente fantástica e me sinto obrigado a dizer que é a melhor opção para desenvolver produtos web.  Mas não é por isso que resolvi escrever este post. Quero compartilhar um aprendizado adquirido.

Dentro da nossa aplicação precisamos mapear (auditoria) as alterações que são feitas em um determinado objeto.  Seria registrar no banco de dados quais campos alterados e, além disso, registra também qual era o valor antes e depois da alteração. Vamos a um exemplo.  Imaginemos que tenho um usuario; esse usuário tem nome, telefone e endereço. Ao alterar o nome dele, quero que fique resgistrado que seu nome foi alterado de um valor “A” para um valor “B”.

Ficando claro a necessidades vamos para a solução.  Passei então para procurar algum plugin que me ajudasse nessa missão. Encontrei vários.  ”Acts_as_audited”,  foi um dos mais interessante que encontrei e recomendo se seu modelo for simples sem relacionamentos muito para muitos.  Mas apesar do plugin resolver o problema, fiquei intrigado de como seria possível fazer isso. Imaginei soluções das mais mirabolantes. Desde de criação de metodos proxies, a magias negras de alta classe (desculpem a brincadeira rubistas) .

Oque achei, como tudo no Ruby, foi a coisa mais simples e fácil já vista. Desde a versão 2.0 do rails, as classes active records ganharam alguns métodos que ajudam bastante nessa missão. São eles: changed?, changes, <atributo>_changed?, <atributo>_was, etc.

changed?  : ele indica se houve ou não alteração nos atributos do objeto. (false se não e true se sim)

changes : devolver um dicionario com as alterações que ocorreram. A chave dele é a propriedade e o valor é uma tupla com o valor antigo e o novo valor

<atributo>_changed? : é um metodo que diz se o atributo mudou. Algo como : usuario.nome_changed?

<atributo>_was : mostra o valor antigo do atributo

<atributo>_will_change! : meio que força a flag indicando que houve uma alteração.

Com esses métodos na mão é possível, sem ajuda do plugin fazer você mesmo sua funcionalidade de auditoria do sistema de forma bastante maneira.  Basta além deles usar os triggers before e after (create, update, etc) do model para chamar os métodos que farão a mágica acontecer.

Espero que ajude. Para saber mais, veja o screencast: tracking_attribute_changes.m4v

Abraços e até a próxima

Published by Andre, on julho 15th, 2010 at 6:51 pm. Filled under: ruby Tags: , , , , , No Comments