<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rinaldi Fonseca</title>
	<atom:link href="http://rinaldifonseca.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://rinaldifonseca.com</link>
	<description>Só mais um blog do WordPress</description>
	<lastBuildDate>Tue, 03 Jan 2012 01:25:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Retrospectiva 2011</title>
		<link>http://rinaldifonseca.com/retrospectiva-2011/</link>
		<comments>http://rinaldifonseca.com/retrospectiva-2011/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 01:18:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Carreira]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=202</guid>
		<description><![CDATA[Até o presente momento havia publicado apenas posts técnicos, mas agora vou tentar iniciar uma série sobre outros assuntos que também me interessam e de certa forma estão relacionados com minha carreira. Iniciarei com uma retrospectiva.

2011 foi de longe um dos melhores anos que já tive. Profissionalmente e pessoalmente.
Já tinha me mudado para São Paulo [...]]]></description>
			<content:encoded><![CDATA[<p>Até o presente momento havia publicado apenas posts técnicos, mas agora vou tentar iniciar uma série sobre outros assuntos que também me interessam e de certa forma estão relacionados com minha carreira. Iniciarei com uma retrospectiva.<br />
<span id="more-202"></span><br />
2011 foi de longe um dos melhores anos que já tive. Profissionalmente e pessoalmente.<br />
Já tinha me mudado para São Paulo em 2010 com o objetivo de empreender e colocar uma ideia em prática. Mas foi em 2011 que tomei uma das decisões mais difíceis da minha vida, que foi a de deixar a vida do empreendedorismo e focar 100% em minha carreira como Desenvolvedor de Software.</p>
<p>A escolha foi difícil pois implicaria em muitas mudanças. Entre as mais difíceis eram: deixar grandes amigos, deixar a empresa que ajudei a fundar e ainda &#8220;enfrentar&#8221; um mundo desconhecido até então. O mundo das Consultorias.</p>
<p><strong>2011 &#8211; Fase 1</strong></p>
<p>Tive a sorte de conhecer grandes pessoas, e mesmo correndo o risco de não lembrar de algumas, não posso deixar de citar alguns nomes. O primeiro, <strong>Diego Carrion(@dcrec1)</strong> que no início de Janeiro de 2011 abriu uma grande porta em minha carreira me convidando para trabalhar no time de <strong>Rails</strong> da<a href="http://www.gonow.com.br"> Gonow Tecnologia</a>. </p>
<p>A minha meta para 2011 era muito simples: Aprender o máximo que eu puder. E a melhor maneira de conseguir isso, seria trabalhando com pessoas tecnicamente melhores do que eu. Felizmente eu tive esta oportunidade.</p>
<p>Atuando como consultor tive a oportunidade de passar por vários projetos em empresas grandes de pequenas. Participei de vários projetos. &#8220;Coloquei a mão&#8221; em muitos códigos diferentes. Escrevi código ruim e tive a felicidade de  receber críticas construtivas nos comentários do Github. Desenvolvi uma certa habilidade de &#8220;pegar o projeto andando&#8221; e ter que me virar. Enfim, aprendi muito mais do que achava que poderia aprender.</p>
<p>Para fechar a fase 1, uma outra pessoa que gostaria de citar é o<strong> Ricardo Almeida(@almeidaricardo) </strong>que me deu uma grande força no primeiro projeto que participei.</p>
<p><strong>2011 &#8211;  Fase 2</strong></p>
<p>Dizem por ai que a única constante é a mudança. Concordo com isso, e por este motivo chego na fase 2. Mantendo o foco na minha principal meta para 2011 decidi que seria mais interessante para minha carreira me dedicar ainda mais em Ruby e trabalhar em alguns projetos diferentes. Desta forma aceitei o convite para trabalhar na <a href="http://www.codeminer42.com">Codeminer42</a> e aproveito para agradecer ao<strong> Fábio Akita(@akitaonrails)</strong> pela confiança.<br />
Continuo tendo a sorte de trabalhar com excelentes pessoas e excelentes projetos. Se continuarmos com o mesmo foco que tivemos nos últimos 3 meses, 2012 será ainda melhor!</p>
<p>Com isso fecho o ano com a certeza de que aprendi muito e ainda não sei nada, e isso é o que mais me motiva para tentar fazer o próximo ano ainda melhor.</p>
]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/retrospectiva-2011/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Organize sua aplicação Rails</title>
		<link>http://rinaldifonseca.com/organize-sua-aplicacao-rails/</link>
		<comments>http://rinaldifonseca.com/organize-sua-aplicacao-rails/#comments</comments>
		<pubDate>Sat, 19 Nov 2011 23:26:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Boas práticas]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=198</guid>
		<description><![CDATA[Rails é um framework MVC e ao criar uma nova aplicação, os diretórios models, views e controllers são criados automaticamente. Será que precisamos apenas destes diretórios?

Eu acredito que não.
Pelo fato do framework, de certa forma guiar o nosso desenvolvimento, na maioria das vezes seguimos o padrão proposto e nos esquecemos de que podemos modificar algumas [...]]]></description>
			<content:encoded><![CDATA[<p>Rails é um framework MVC e ao criar uma nova aplicação, os diretórios models, views e controllers são criados automaticamente. Será que precisamos apenas destes diretórios?<br />
<span id="more-198"></span><br />
Eu acredito que não.<br />
Pelo fato do framework, de certa forma guiar o nosso desenvolvimento, na maioria das vezes seguimos o padrão proposto e nos esquecemos de que podemos modificar algumas coisas.</p>
<p>Trabalhando em consultorias, tenho a oportunidade de &#8220;colocar a mão&#8221; em muitos projetos. Em grande parte deles, o código escrito parecia ter sido obrigado a se &#8220;encaixar&#8221; em um dos 3 diretórios citados acima.</p>
<p>A questão é: <strong>nem tudo na sua aplicação é um model, um controller ou uma view</strong>. Logo não faz sentido inserir seu código lá.</p>
<p>Na aplicação que trabalho atualmente tenho a seguinte estrutura dentro do diretório <strong>app</strong>:</p>
<ul>
<li>adapters</li>
<li>assets</li>
<li>controllers</li>
<li>helpers</li>
<li>mailers</li>
<li>models</li>
<li>observers</li>
<li>presenters</li>
<li>uploaders</li>
<li>validators</li>
<li>views</li>
<li>workers</li>
</ul>
<p>Não tenha receio de acrescentar outros diretórios em sua aplicacão achando que você está saindo do padrão. A nova onda na comunidade é falar sobre <strong>SOLID</strong> e seguindo alguns destes princípios ajudará na organização.</p>
<p>Uma outra prática que costumo seguir em aplicações quem possuem um grande número de models por exemplo, é separá-los em subdiretórios dentro de <strong>app/models</strong>. Não preciso criar <strong>namespaces</strong> para isso. Basta acrescentar o novo diretório no <strong>load path</strong> da aplicação.</p>
<p>Se a sua aplicação possui vários domínios, faz sentido organizar desta forma.</p>
]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/organize-sua-aplicacao-rails/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>RVM ree no Mac OS X Lion</title>
		<link>http://rinaldifonseca.com/rvm-ree-no-mac-os-x-lion/</link>
		<comments>http://rinaldifonseca.com/rvm-ree-no-mac-os-x-lion/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 16:40:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[mac]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=192</guid>
		<description><![CDATA[Tive problemas ao tentar instalar o Ruby Enterprise Edition(ree) no Mac OS X Lion e resolvi com isso:


$ rvm remove ree
$ export CC=/usr/bin/gcc-4.2
$ rvm install --force ree

]]></description>
			<content:encoded><![CDATA[<p>Tive problemas ao tentar instalar o Ruby Enterprise Edition(ree) no Mac OS X Lion e resolvi com isso:<br />
<span id="more-192"></span></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ rvm remove ree
$ <span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">CC</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>gcc-<span style="color: #000000;">4.2</span>
$ rvm <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #660033;">--force</span> ree</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/rvm-ree-no-mac-os-x-lion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando um Framework com Rack em 10 minutos</title>
		<link>http://rinaldifonseca.com/criando-um-framework-com-rack-em-10-minutos/</link>
		<comments>http://rinaldifonseca.com/criando-um-framework-com-rack-em-10-minutos/#comments</comments>
		<pubDate>Sun, 11 Sep 2011 03:02:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Rack]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=185</guid>
		<description><![CDATA[Dia 03/09 foi o décimo oitavo encontro do Guru SP onde fiz um talk sobre Rack. Veja abaixo o vídeo e os slides.


Guru-SP &#8211; Criando um Framework com Rack em 10 minutos from agaelebe on Vimeo.
 Criando um Framework com Rack em 10 minutos 
 View more presentations from rinaldifonseca 

]]></description>
			<content:encoded><![CDATA[<p>Dia 03/09 foi o décimo oitavo encontro do Guru SP onde fiz um talk sobre <a href="http://rinaldifonseca.com/rack-para-leigos-ruby-webserver-interface/">Rack</a>. Veja abaixo o vídeo e os slides.<br />
<span id="more-185"></span><br />
<iframe src="http://player.vimeo.com/video/29227041?title=0&amp;byline=0&amp;portrait=0&amp;color=ffffff" width="533" height="300" frameborder="0" webkitAllowFullScreen allowFullScreen></iframe>
<p><a href="http://vimeo.com/29227041">Guru-SP &#8211; Criando um Framework com Rack em 10 minutos</a> from <a href="http://vimeo.com/agaelebe">agaelebe</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<div style="width:425px" id="__ss_9117181"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/rinaldifonseca/criando-um-framework-com-rack-em-10-minutos" title="Criando um Framework com Rack em 10 minutos" target="_blank">Criando um Framework com Rack em 10 minutos</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/9117181" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/rinaldifonseca" target="_blank">rinaldifonseca</a> </div>
</p></div>
]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/criando-um-framework-com-rack-em-10-minutos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testes de aceitação com Ruby on Rails, Rspec e Capybara</title>
		<link>http://rinaldifonseca.com/testes-de-aceitacao-com-ruby-on-rails-rspec-e-capybara/</link>
		<comments>http://rinaldifonseca.com/testes-de-aceitacao-com-ruby-on-rails-rspec-e-capybara/#comments</comments>
		<pubDate>Sat, 21 May 2011 18:35:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Testes]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=182</guid>
		<description><![CDATA[Por algum tempo utilizei a gem Steak para testes de aceitação em minhas aplicações Rails.
De forma resumida, podemos considerar o Steak como um facilitador para a integração do Rspec com o Capybara.

Porém a partir deste commit, a gem Capybara ganhou uma nova DSL que irá permitir a realização de testes de aceitação com Rspec sem [...]]]></description>
			<content:encoded><![CDATA[<p>Por algum tempo utilizei a gem <a href="https://github.com/cavalle/steak">Steak</a> para testes de aceitação em minhas aplicações Rails.<br />
De forma resumida, podemos considerar o Steak como um facilitador para a integração do Rspec com o <a href="https://github.com/jnicklas/capybara">Capybara</a>.<br />
<span id="more-182"></span></p>
<p>Porém a partir <a href="https://github.com/jnicklas/capybara/commit/f4897f890d8dd33215fef238902988e8823a6539">deste commit</a>, a gem Capybara ganhou uma nova DSL que irá permitir a realização de testes de aceitação com Rspec sem depender do Steak.<br />
Particularmente achei isso muito interessante. Será uma dependência a menos e as coisas estão ficando cada vez mais facilitadas.</p>
<p>Abaixo, vou listar alguns passos para utilizarmos esta nova funcionalidade do Capybara.</p>
<p><strong>1) Crie uma nova aplicação Rails e configure seu Gemfile como o seguinte:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">gem <span style="color:#996600;">'sqlite3'</span>
gem <span style="color:#996600;">'rspec-rails'</span>
gem <span style="color:#996600;">'capybara'</span>, <span style="color:#996600;">'1.0.0.beta1'</span>
gem <span style="color:#996600;">'database_cleaner'</span></pre></div></div>

<p>Obs: as versões anteriores a 1.0.0.beta1 do Capybara não possuem suporte a esta nova DSL</p>
<p><strong>2) Rode o comando bundle install para instalar todas as dependências</strong></p>
<p><strong> 3) Rode o comando rails g rspec:install  para setar as configurações base do Rspec</strong></p>
<p><strong> 4) Abra o arquivo spec/spec_helper.rb  e sete o parâmetro use_transactional_fixtures  para false, da seguinte forma:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">config.<span style="color:#9900CC;">use_transactional_fixtures</span> = <span style="color:#0000FF; font-weight:bold;">false</span></pre></div></div>

<p>Esta configuração será necessária quando desejarmos rodar nossos testes com o <strong>driver de javascript</strong></p>
<p><strong>5) Crie o diretório spec/support e adicione o arquivo capybara.rb com o seguinte conteúdo:<br />
</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'capybara/rails'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'capybara/dsl'</span>
&nbsp;
RSpec.<span style="color:#9900CC;">configure</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>c<span style="color:#006600; font-weight:bold;">|</span>
  c.<span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">Capybara::DSL</span>, <span style="color:#ff3333; font-weight:bold;">:example_group</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff3333; font-weight:bold;">:file_path</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">/</span>\bspec\<span style="color:#006600; font-weight:bold;">/</span>acceptance\<span style="color:#006600; font-weight:bold;">//</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>É com esta configuração que fazemos esta integração da nova DSL do Capybara com o Rspec. Ainda, estamos configurando que os nossos arquivos de testes de aceitação irão ficar em spec/acceptance.</p>
<p><strong>6) Crie o arquivo spec/support/database_cleaner.rb  com o seguinte arquivo:<br />
</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'database_cleaner'</span> 
&nbsp;
RSpec.<span style="color:#9900CC;">configure</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>config<span style="color:#006600; font-weight:bold;">|</span> 
&nbsp;
  DatabaseCleaner.<span style="color:#9900CC;">strategy</span> = <span style="color:#ff3333; font-weight:bold;">:truncation</span> 
&nbsp;
  config.<span style="color:#9900CC;">before</span> <span style="color:#ff3333; font-weight:bold;">:each</span> <span style="color:#9966CC; font-weight:bold;">do</span> 
    Capybara.<span style="color:#9900CC;">reset_sessions</span>! 
    DatabaseCleaner.<span style="color:#9900CC;">clean</span> 
  <span style="color:#9966CC; font-weight:bold;">end</span> 
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Basicamente estamos usando a gem <a href="https://github.com/bmabey/database_cleaner">DatabaseCleaner</a> para limpar a nossa base de dados a cada execução dos testes. Também estamos resetando as sessões do Capybara.</p>
<p>Neste ponto terminamos a fase de configuração. Agora já poderemos escrever nossos testes.<br />
Vamos usar o nosso bom e velho exemplo de Blog, e criar o seguinte teste em: <strong>spec/acceptance/post_spec.rb</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'spec_helper'</span>
&nbsp;
feature <span style="color:#996600;">&quot;Post Blogs&quot;</span>, <span style="color:#006600; font-weight:bold;">%</span>q<span style="color:#006600; font-weight:bold;">&#123;</span>
  <span style="color:#9966CC; font-weight:bold;">In</span> order to have an awesome blog
  As an author
  I want to create a post
<span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
&nbsp;
  background <span style="color:#9966CC; font-weight:bold;">do</span>
    Post.<span style="color:#9900CC;">create</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:title</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;My Post Title&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:body</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;My Body&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  scenario <span style="color:#996600;">&quot;Post index&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:js</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    visit posts_path
    page.<span style="color:#9900CC;">should</span> have_content<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'My Post Title'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    page.<span style="color:#9900CC;">should</span> have_content<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'My Body'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Basicamente estamos definindo nossa feature, e no bloco <strong>background</strong> estamos criando um Post antes da execução de cada teste.</p>
<p>No cenário <strong>Post index</strong>, estamos escrevendo algumas ações e poderíamos utilizar todos os métodos do Capybara para interagir com a página, como por exemplo <strong>fill_in, click_link</strong> etc.</p>
<p>Também estamos usando o <strong>“ :js => true”</strong> para que o nosso teste seja executado com o browser aberto. Isso será necessário quando precisarmos interagir com alguma funcionalidade que envolva <strong>javascript, ajax</strong> etc. Se seu teste não depende de javascript, recomendo não usar o   :js => true, pois fará apenas que ele fique mais lento.</p>
<p>Por fim, estamos verificando se o post está presente na página.<br />
É importante observar que a ideia, é apenas mostrar o que é possível de se fazer. Não estamos discutindo sobre a melhor maneira de testar esta tipo de funcionalidade(cadastro de post).</p>
<p>Obviamente, se rodarmos o teste agora ele irá falhar.<br />
Agora, vamos implementar nosso código para que o teste passe, e um simples Scaffold resolverá a questão.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">rails g scaffold Post title:<span style="color:#CC0066; font-weight:bold;">string</span> body:text
rake db:migrate RAILS_ENV=test</pre></div></div>

<p>Ao rodarmos o teste com o comando:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">rspec spec<span style="color:#006600; font-weight:bold;">/</span>acceptance<span style="color:#006600; font-weight:bold;">/</span>posts_spec.<span style="color:#9900CC;">rb</span></pre></div></div>

<p>O teste deverá passar.</p>
<p><strong>Conclusão</strong></p>
<p>Pensando no cenário em que a equipe não tem o cliente ajudando ou escrevendo histórias com <a href="http://cukes.info">Cucumber</a>, acho muito válido escrever testes de aceitação com estas ferramentas. Ainda mas agora, que poderemos utilizar apenas Rspec e Capybara. </p>
]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/testes-de-aceitacao-com-ruby-on-rails-rspec-e-capybara/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Download de arquivos com Ruby</title>
		<link>http://rinaldifonseca.com/download-de-arquivos-com-ruby/</link>
		<comments>http://rinaldifonseca.com/download-de-arquivos-com-ruby/#comments</comments>
		<pubDate>Sun, 15 May 2011 01:06:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=179</guid>
		<description><![CDATA[Dica simples: Estava criando uma aplicação onde precisei fazer o download de um arquivo e salvar no file system. Com este simples trecho de código é possível fazer isso:

require 'net/http'
&#160;
Net::HTTP.start&#40;&#34;rinaldifonseca.com&#34;&#41; do &#124;http&#124;
    resp = http.get&#40;&#34;/my_file.jpg&#34;&#41;
    open&#40;&#34;my_file.jpg&#34;, &#34;wb&#34;&#41; do &#124;file&#124;
        file.write&#40;resp.body&#41;
   [...]]]></description>
			<content:encoded><![CDATA[<p>Dica simples: Estava criando uma aplicação onde precisei fazer o download de um arquivo e salvar no file system. Com este simples trecho de código é possível fazer isso:<br/><span id="more-179"></span></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'net/http'</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">Net::HTTP</span>.<span style="color:#9900CC;">start</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;rinaldifonseca.com&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>http<span style="color:#006600; font-weight:bold;">|</span>
    resp = http.<span style="color:#9900CC;">get</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;/my_file.jpg&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;my_file.jpg&quot;</span>, <span style="color:#996600;">&quot;wb&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>file<span style="color:#006600; font-weight:bold;">|</span>
        file.<span style="color:#9900CC;">write</span><span style="color:#006600; font-weight:bold;">&#40;</span>resp.<span style="color:#9900CC;">body</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/download-de-arquivos-com-ruby/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Rails Metal e Devise</title>
		<link>http://rinaldifonseca.com/rails-metal-e-devise/</link>
		<comments>http://rinaldifonseca.com/rails-metal-e-devise/#comments</comments>
		<pubDate>Fri, 13 May 2011 04:29:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Devise]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=173</guid>
		<description><![CDATA[O Rails Metal está disponível desde a versão 2.3, mas com a nova arquitetura do Action Controller no Rails 3, ficou muito mais fácil adicionar funcionalidades e recursos.

A principal vantagem da utilização do Rails Metal torna-se evidente quando não necessitamos carregar toda a stack do Rails para realizar determinada atividade.
Um exemplo prático é a criação [...]]]></description>
			<content:encoded><![CDATA[<p>O Rails Metal está disponível desde a versão 2.3, mas com a nova arquitetura do Action Controller no Rails 3, ficou muito mais fácil adicionar funcionalidades e recursos.<br />
<span id="more-173"></span><br />
A principal vantagem da utilização do Rails Metal torna-se evidente quando <strong>não</strong> necessitamos carregar toda a stack do Rails para realizar determinada atividade.</p>
<p>Um exemplo prático é a criação de APIs. Podemos por exemplo, ter uma determinada action em nossa aplicação, que é responsável por apenas devolver um JSON. Neste caso o uso do Rails Metal é extremamente indicado, pois evitamos carregar funcionalidades nas quais não precisaremos..</p>
<p>De forma resumida, o Rails Metal praticamente provê um código suficiente para uma <a href="http://rinaldifonseca.com/rack-para-leigos-ruby-webserver-interface/">aplicação Rack</a>.</p>
<p>No Rails 3 temos o <strong>ActionController::Base</strong> que herda de <strong>ActionController::Metal</strong>, que por sua vez herda de<strong> AbstractController::Base.</strong></p>
<p>Esta nova arquitetura nos dá muita flexibilidade para utilizar somente o que necessitamos.<br />
Veja um exemplo prático abaixo:</p>
<p><strong>Download de arquivos</strong></p>
<p>Vamos imaginar que nossa aplicação possui uma funcionalidade de upload de arquivos, e que posteriormente desejamos disponibilizá-los para download. Porém existe uma restrição: Apenas usuários autenticados poderão fazer o download dos arquivos.</p>
<p>Neste caso, não podemos simplesmente fazer o upload dos arquivos dentro do diretório public. Caso contrário os arquivos estariam disponíveis sem autenticação.</p>
<p>Uma possível solução seria realizar o upload em um diretório fora de public, e em seguida criar um controller que direciona o usuário para o download do arquivo em questão.<br />
Esta é uma situação ideal para usar o Rails Metal, afinal precisamos apenas verificar a autenticação do usuário e em seguida enviar o arquivo.</p>
<p>Abaixo uma possível implementação de exemplo:</p>
<p>Em nosso arquivo <strong>routes.rb</strong> teríamos algo do tipo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"> match <span style="color:#996600;">'/download/:file'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> DownloadController.<span style="color:#9900CC;">action</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:file</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>E nosso controller seria:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> DownloadController <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActionController::Metal</span>
&nbsp;
  before_filter <span style="color:#ff3333; font-weight:bold;">:authenticate_user</span>!
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> file
    <span style="color:#008000; font-style:italic;">#implementação da lógica para recuperar qual arquivo o usuário deseja</span>
    send_file<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;/path/to/your/file.csv&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Simples e prático! Porém esta implementação não irá funcionar, pois precisamos incluir alguns módulos em nosso controller.</p>
<ul>
<li>Para utilizarmos o <strong>send_file</strong> precisamos incluir o módulo <strong>ActionController::Streaming</strong></li>
<li>Para utilizar o <strong>before_filter </strong>precisamos incluir o módulo <strong>AbstractController::Callbacks</strong></li>
<li>Para verificarmos a autenticação do usuário com o Devise precisamos incluir o módulo  <strong>Devise::Controllers::Helpers</strong></li>
<li>E para finalizar precisaremos também do módulo <strong>ActionController::Helpers</strong> pois o Devise utiliza o método  <strong>helper_method</strong> para criação dinâmica do método <strong>:authenticate_user!</strong></li>
</ul>
<p>Agora nossa implementação seria:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> DownloadController <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActionController::Metal</span>
&nbsp;
 <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">ActionController::Streaming</span>
 <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">AbstractController::Callbacks</span>
 <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">ActionController::Helpers</span>
 <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">Devise::Controllers::Helpers</span>
&nbsp;
 before_filter <span style="color:#ff3333; font-weight:bold;">:authenticate_user</span>!
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> file
    <span style="color:#008000; font-style:italic;">#implementação da lógica para recuperar qual arquivo o usuário deseja</span>
    send_file<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;/path/to/your/file.csv&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Com isso temos um controller mais leve e ainda podemos utilizar diversas funcionalidades que as demais gems, módulos etc nos fornecem.</p>
]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/rails-metal-e-devise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2 situações para utilizar o método try no Rails</title>
		<link>http://rinaldifonseca.com/2-situacoes-para-utilizar-o-metodo-try-no-rails/</link>
		<comments>http://rinaldifonseca.com/2-situacoes-para-utilizar-o-metodo-try-no-rails/#comments</comments>
		<pubDate>Fri, 29 Apr 2011 04:23:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=167</guid>
		<description><![CDATA[O método try do Rails já é um velho conhecido. Ele foi adicionado no ActiveSupport na versão 2.3.2. Porém, percebo que algumas pessoas acabam esquecendo de sua utilidade, e com isso códigos desnecessários acabam sendo escritos.

Antes de mostrar os exemplos, vamos &#8220;recordar&#8221; o funcionamento do método try:
&#8220;O método try permite-nos invocar qualquer método, sem nos [...]]]></description>
			<content:encoded><![CDATA[<p>O método <strong>try</strong> do Rails já é um velho conhecido. Ele foi adicionado no <strong>ActiveSupport</strong> na versão <strong>2.3.2</strong>. Porém, percebo que algumas pessoas acabam esquecendo de sua utilidade, e com isso códigos desnecessários acabam sendo escritos.<br />
<span id="more-167"></span><br />
Antes de mostrar os exemplos, vamos &#8220;recordar&#8221; o funcionamento do método try:</p>
<p>&#8220;O método try permite-nos invocar qualquer método, sem nos preocupar com o fato do objeto receiver ser <strong>nil</strong>. Caso o objeto seja <strong>nil</strong>, a exceção <strong>NoMethodError</strong> seria lançada, mas utilizando o try isso não aconteceria. Ao invés disso, nil seria <strong>retornado</strong>.&#8221;</p>
<p><strong>Situação 1)</strong></p>
<p>Ao invés disso:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">person = Person.<span style="color:#9900CC;">find_by_name</span><span style="color:#006600; font-weight:bold;">&#40;</span>“Rinaldi”<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">unless</span> person.<span style="color:#0000FF; font-weight:bold;">nil</span>?
 person.<span style="color:#9900CC;">age</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Poderíamos fazer isso:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">person = Person.<span style="color:#9900CC;">find_by_name</span><span style="color:#006600; font-weight:bold;">&#40;</span>“Rinaldi”<span style="color:#006600; font-weight:bold;">&#41;</span>
person.<span style="color:#9900CC;">try</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:age</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p><strong>Situação 2)</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;a&quot;</span>,<span style="color:#996600;">&quot;b&quot;</span>,<span style="color:#996600;">&quot;c&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#CC0066; font-weight:bold;">select</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>letter<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;g&quot;</span>,<span style="color:#996600;">&quot;m&quot;</span>,<span style="color:#996600;">&quot;k&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9966CC; font-weight:bold;">include</span>? letter<span style="color:#006600; font-weight:bold;">&#125;</span>.<span style="color:#9900CC;">last</span>.<span style="color:#9900CC;">try</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:upcase</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>No exemplo acima, estamos invocando o método upcase em um objeto que talvez não exista. Logo, é recomendável utilizar o try. </p>
<p>Se por algum motivo precisássemos utilizar o método try diretamente no Ruby poderíamos fazer a seguinte implementação:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC00FF; font-weight:bold;">Object</span>
 <span style="color:#9966CC; font-weight:bold;">def</span> try<span style="color:#006600; font-weight:bold;">&#40;</span>method<span style="color:#006600; font-weight:bold;">&#41;</span>
   send method <span style="color:#9966CC; font-weight:bold;">if</span> respond_to? method
 <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/2-situacoes-para-utilizar-o-metodo-try-no-rails/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Ruby Extend Self</title>
		<link>http://rinaldifonseca.com/ruby-extend-self/</link>
		<comments>http://rinaldifonseca.com/ruby-extend-self/#comments</comments>
		<pubDate>Sat, 23 Apr 2011 04:16:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=163</guid>
		<description><![CDATA[É comum encontrarmos instruções como: extend self em códigos Ruby.
Quem é iniciante na linguagem normalmente acha isso um pouco estranho.
Neste post citarei algumas utilidades para esta técnica.

Inicialmente é importante compreender o que realmente acontece quando usamos o extend self.
Considere o seguinte código:

module MyModule
 def hello
   &#34;hello&#34;
 end
end
&#160;
class MyClass
 extend MyModule
end
&#160;
puts MyClass.hello

Basicamente estamos realizando o mixin de class methods. Ou [...]]]></description>
			<content:encoded><![CDATA[<p>É comum encontrarmos instruções como: <strong>extend self</strong> em códigos Ruby.<br />
Quem é iniciante na linguagem normalmente acha isso um pouco estranho.<br />
Neste post citarei algumas utilidades para esta técnica.<br />
<span id="more-163"></span></p>
<p>Inicialmente é importante compreender o que realmente acontece quando usamos o <strong>extend self</strong>.</p>
<p>Considere o seguinte código:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> MyModule
 <span style="color:#9966CC; font-weight:bold;">def</span> hello
   <span style="color:#996600;">&quot;hello&quot;</span>
 <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> MyClass
 extend MyModule
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> MyClass.<span style="color:#9900CC;">hello</span></pre></div></div>

<p>Basicamente estamos realizando o <strong>mixin de class methods</strong>. Ou seja, com o extend, os métodos definidos no módulo estarão disponíveis na classe <strong>MyClass</strong>(que por sua vez é um objeto). Por este motivo é que acessamos <strong>MyClass.hello</strong> ao invés de primeiramente criarmos um objeto da classe MyClass.<br />
Isso seria necessário se utilizássemos o <strong>include</strong>, ao invés do extend.</p>
<p>Agora o que aconteceria se utilizássemos o extend self dentro de nosso módulo conforme o código abaixo?</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> MyModule
extend <span style="color:#0000FF; font-weight:bold;">self</span> 
<span style="color:#9966CC; font-weight:bold;">def</span> hello
   <span style="color:#996600;">&quot;hello&quot;</span>
 <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Quem é self? Neste caso self é o próprio MyModule. Logo seria o mesmo que escrevêssemos: extend MyModule.</p>
<p>Com isso, o método hello também estará disponível no objeto MyModule(que é uma instância da classe Module).</p>
<p>Isso nos permite escrever:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">MyModule.<span style="color:#9900CC;">hello</span></pre></div></div>

<p><strong>O que podemos fazer com isso?<br />
</strong></p>
<p><strong>1)</strong> Esta abordagem facilita nosso trabalho no momento de testarmos, pois podemos isolar nosso módulo/classe e testar seu comportamento de forma separada. Não precisaríamos por exemplo, realizar um include/extend em alguma outra classe/objeto somente para este fim.</p>
<p><strong>2)</strong> Uma alternativa para implementar o Singleton Pattern.</p>
<p>Considere o seguinte código:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;singleton&quot;</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> MyLib
 <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#CC00FF; font-weight:bold;">Singleton</span>
&nbsp;
 <span style="color:#9966CC; font-weight:bold;">def</span> initialize
   @var = <span style="color:#996600;">&quot;hello&quot;</span>
 <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
 <span style="color:#9966CC; font-weight:bold;">def</span> hello
   <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#0066ff; font-weight:bold;">@var</span>
 <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
MyLib.<span style="color:#9900CC;">instance</span>.<span style="color:#9900CC;">hello</span>  <span style="color:#008000; font-style:italic;">#=&gt;hello</span></pre></div></div>

<p>Estamos apenas implementando o Singleton Pattern em uma classe.</p>
<p>Utilizando o extend self podemos ter basicamente o mesmo comportamento:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> MyLib
 extend <span style="color:#0000FF; font-weight:bold;">self</span>
&nbsp;
 <span style="color:#9966CC; font-weight:bold;">def</span> var
   @var <span style="color:#006600; font-weight:bold;">||</span>= <span style="color:#996600;">&quot;hello&quot;</span>
 <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
 <span style="color:#9966CC; font-weight:bold;">def</span> hello
   <span style="color:#CC0066; font-weight:bold;">puts</span> var
 <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
MyLib.<span style="color:#9900CC;">hello</span> <span style="color:#008000; font-style:italic;">#=&gt; hello</span></pre></div></div>

<p><strong>Obs:</strong> a intenção não é substituir uma implementação pela outra, mas sim mostrar alguns recursos da linguagem que nos permitem resolver determinados problemas de maneiras diferentes. Inclusive esta é uma das filosofias do Ruby.</p>
]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/ruby-extend-self/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rubismos &#8211; Configurações</title>
		<link>http://rinaldifonseca.com/rubismos-configuracoes/</link>
		<comments>http://rinaldifonseca.com/rubismos-configuracoes/#comments</comments>
		<pubDate>Wed, 13 Apr 2011 02:29:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://rinaldifonseca.com/?p=160</guid>
		<description><![CDATA[Muitas Gems que usamos no dia a dia, utilizam o seguinte formato para realizar configurações:


MyLib.configure do &#124;config&#124;  
  config.my_property = 25  
end

Ou seja, estamos setando uma propriedade com o valor 25.
A Gem Capybara utiliza esta mesma abordagem. Veja abaixo:

Capybara.configure do &#124;config&#124;            [...]]]></description>
			<content:encoded><![CDATA[<p>Muitas Gems que usamos no dia a dia, utilizam o seguinte formato para realizar configurações:<br />
<span id="more-160"></span></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">MyLib.<span style="color:#9900CC;">configure</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>config<span style="color:#006600; font-weight:bold;">|</span>  
  config.<span style="color:#9900CC;">my_property</span> = <span style="color:#006666;">25</span>  
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Ou seja, estamos setando uma propriedade com o valor 25.</p>
<p>A Gem <a href="https://github.com/jnicklas/capybara">Capybara</a> utiliza esta mesma abordagem. Veja abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Capybara.<span style="color:#9900CC;">configure</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>config<span style="color:#006600; font-weight:bold;">|</span>             	
  config.<span style="color:#9900CC;">default_wait_time</span> = <span style="color:#006666;">2</span>  
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Vamos ver abaixo, como funciona esta implementação. Considere o seguinte código abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> MyLib
  <span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#0000FF; font-weight:bold;">self</span>
    attr_accessor <span style="color:#ff3333; font-weight:bold;">:my_property</span>
    <span style="color:#9966CC; font-weight:bold;">def</span> configure
      <span style="color:#9966CC; font-weight:bold;">yield</span> <span style="color:#0000FF; font-weight:bold;">self</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
MyLib.<span style="color:#9900CC;">configure</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>config<span style="color:#006600; font-weight:bold;">|</span>
  config.<span style="color:#9900CC;">my_property</span> = <span style="color:#006666;">2011</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> MyLib.<span style="color:#9900CC;">my_property</span></pre></div></div>

<p>Basicamente estamos<strong> definindo um módulo chamado MyLib</strong>. Dentro dele, estamos definindo um <strong>accessor</strong> chamado<strong> my_property</strong> e também um <strong>método chamado configure.</strong><br />
Porém o accessor e o método, são definidos na <strong>singleton class do objeto</strong> MyLib.</p>
<p>Se você não entendeu muito bem esta questão de singleton classes, eu expliquei com mais detalhes no post “<a href="http://rinaldifonseca.com/ruby-relacoes-e-interacoes-entre-classes-e-objetos/">Ruby: relações e interações entre classes e objetos</a>”.</p>
<p>A grande “sacada” está no método configure. Ele executa o método yield passando o <strong>self</strong> como parâmetro. Mas neste caso, quem será <strong>self</strong>?  Self será o <strong>próprio módulo MyLib</strong>. Esta é a &#8220;chave&#8221; da questão.</p>
<p>É importante lembrar que o yield é o responsável por  executar o bloco passado como parâmetro. E no exemplo acima, nosso bloco é:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>config<span style="color:#006600; font-weight:bold;">|</span> config.<span style="color:#9900CC;">my_property</span> = <span style="color:#006666;">2011</span> <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Seguindo a ideia de como os blocos funcionam em Ruby, o módulo MyLib(que foi passado como self para o bloco) será mapeado para o <strong>config</strong> do bloco. Logo, quando fazemos  <strong>config.my_property = 2011</strong> de dentro do bloco, é como se estivéssemos fazendo  <strong>MyLib.my_property = 2011. </strong></p>
<p>Isso só foi possível pelo fato de termos definido um accessor para a nossa propriedade.</p>
<p>Uma outra abordagem que poderíamos utilizar para deixar a configuração um pouco mais modular seria com o seguinte código abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Configuration
    attr_accessor <span style="color:#ff3333; font-weight:bold;">:my_property</span>
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">def</span> initialize
      <span style="color:#0066ff; font-weight:bold;">@my_property</span> = <span style="color:#996600;">'default value'</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">module</span> MyLib
  <span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#0000FF; font-weight:bold;">self</span>
    attr_accessor <span style="color:#ff3333; font-weight:bold;">:configuration</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">configure</span>
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">configuration</span> <span style="color:#006600; font-weight:bold;">||</span>= Configuration.<span style="color:#9900CC;">new</span>
    <span style="color:#9966CC; font-weight:bold;">yield</span><span style="color:#006600; font-weight:bold;">&#40;</span>configuration<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
MyLib.<span style="color:#9900CC;">configure</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>config<span style="color:#006600; font-weight:bold;">|</span>
  config.<span style="color:#9900CC;">my_property</span> = <span style="color:#996600;">&quot;new value&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">puts</span> MyLib.<span style="color:#9900CC;">configuration</span>.<span style="color:#9900CC;">my_property</span></pre></div></div>

<p>Basicamente estamos armazenando um objeto de configuração dentro do nosso módulo. </p>
]]></content:encoded>
			<wfw:commentRss>http://rinaldifonseca.com/rubismos-configuracoes/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

