<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss 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" version="2.0">

<channel>
	<title>Learning on Rails</title>
	
	<link>http://www.makemesimple.com/blog</link>
	<description>Conhecimento nunca é o bastante</description>
	<pubDate>Fri, 24 Oct 2008 21:09:32 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/LearningOnRails" type="application/rss+xml" /><item>
		<title>Jogue fora os testes quebradiços</title>
		<link>http://www.makemesimple.com/blog/2008/10/24/jogue-fora-os-testes-quebradicos/</link>
		<comments>http://www.makemesimple.com/blog/2008/10/24/jogue-fora-os-testes-quebradicos/#comments</comments>
		<pubDate>Fri, 24 Oct 2008 17:23:03 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Desenvolvimento]]></category>

		<category><![CDATA[Opinião]]></category>

		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Test-Driven Development]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=141</guid>
		<description><![CDATA[É isso mesmo! Jogue fora. Todos eles! Você não precisa de deles. Você precisa de testes que garantam o comportamento do seu sistema. Software não é sobre o código escrito, software é sobre gerar o comportamento esperado a partir de um conjunto de requerimentos.
Bem, não sou um especialista em testes nem um guru da programação, [...]]]></description>
			<content:encoded><![CDATA[<p>É isso mesmo! Jogue fora. Todos eles! Você não precisa de deles. Você precisa de testes que garantam o comportamento do seu sistema. Software não é sobre o código escrito, software é sobre gerar o comportamento esperado a partir de um conjunto de requerimentos.</p>
<p>Bem, não sou um especialista em testes nem um guru da programação, mas tenho algumas opiniões. <img src='http://www.makemesimple.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong style="font-size: 15px;">O que é um teste quebradiço (ou &#8220;brittle test&#8221;)?</strong></p>
<p>Um teste quebradiço é aquele que passa a falhar após uma alteração em código não relacionado ao que ele deveria testar ou quando o código que ele testa é alterado, mas o comportamento do sistema não muda.</p>
<p>Além do custo de manutenção inerente à correção de testes que quebram &#8220;sem motivo&#8221;, ocorre também um impacto na moral e na motivação dos desenvolvedores. Se um desenvolvedor faz mudanças em um código e, ao integrá-lo, testes começam a falhar por motivos como inconsistência de dados em banco ou alto acoplamento, é praticamente certo que isso irá irritá-lo e, a médio prazo, fazer com que ele abandone os testes, criando verdadeiros &#8220;ferros-velhos&#8221; de testes sucateados. As quebras se tornarão cada vez mais frequentes e, logo, processos como integração contínua serão completamente abandonados.</p>
<p><strong style="font-size: 15px;">Casos comuns</strong></p>
<p><strong>Fixtures</strong></p>
<p>Manter os grafos de objetos através de fixtures torna-se exponencialmente mais complexo à medida que sua aplicação aumenta de tamanho e cria mais relacionamentos entre os objetos. Adicione um atributo ou relacionamento entre modelos e um grande número de testes automaticamente começará a quebrar, exigindo esforço considerável para correção.</p>
<p>Utilize algo como object_daddy e factory_girl que, sim, também precisarão de alguma manutenção após alterações na estrutura de dados, mas exigindo esforço muito menor.</p>
<p><strong>Testes de views em código</strong> (usando coisas como assert_tag ou o matcher have_tag)</p>
<p>Esses testes são uma completa e desnecessária perda de tempo. Uma mudança em alguma classe ou nome de campo e, bang!, testes quebrando sem que o comportamento da aplicação tenha sido afetado.</p>
<p>Você pode ser moderado nesses testes e não torná-los muito específicos para evitar isso mas, nesse caso, use algo como o Selenium, também com cuidado, pois é possível cair no mesmo erro com essa ferramenta.</p>
<p>Teste o que influi no comportamento, como o fluxo de redirecionamentos ou elementos com ids utilizados para chamadas ajax.</p>
<p>O Selenium também tem a vantagem de poder ser utilizado por testadores com algum conhecimento de estrutura Html.</p>
<p><strong>Abuso de mocks e stubs</strong></p>
<p>Isto é, para mim, um dos grandes vilões dos testes quebradiços. Esse abuso leva os testes a ficarem altamente acoplados a detalhes de implementação. Por exemplo (o exemplo é bobo, apenas para ilustrar):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Delivery
  <span style="color:#9966CC; font-weight:bold;">def</span> has_packages?
    <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">packages</span>.<span style="color:#9900CC;">count</span> <span style="color:#006600; font-weight:bold;">&gt;</span> 0
  <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> DeliveryTest <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">Test::Unit::TestCase</span>
  context <span style="color:#996600;">&quot;A scheduled delivery&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    setup <span style="color:#9966CC; font-weight:bold;">do</span>
      Delivery.<span style="color:#9900CC;">stubs</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:count</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">returns</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">10</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#0066ff; font-weight:bold;">@delivery</span> = Delivery.<span style="color:#9900CC;">new</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
    should <span style="color:#996600;">&quot;have packages&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
      assert <span style="color:#0066ff; font-weight:bold;">@delivery</span>.<span style="color:#9900CC;">has_packages</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></pre></div></div>

<p>Se, por um motivo qualquer, a implementação do método <em>has_packages?</em> mudar e passar a utilizar, por exemplo, o método <em>size</em> ao invés de <em>count</em>, o teste passará a quebrar sem que o comportamento tenha sido alterado. O exemplo é simples mas, em casos reais, isso é um grande problema. Note que stubs tendem a deixar os testes mais acoplados do que mocks.</p>
<p>Algumas soluções pra isso são: não utilizar mocks e stubs (o que é um tanto extremista), aumentar o encapsulamento das classes ou aceitar isso e continuar.</p>
<p>Esse tipo de coisa costuma acontecer quando queremos utilizar mocks e stubs para tornarmos os testes independentes de recursos externos, como banco de dados. Nesses casos, o trade-off entre acoplamento do teste ao código e o ganho em velocidade de execução ou tempo de manutenção através do isolamento deve ser avaliado.</p>
<p><strong style="font-size: 15px;">Guias gerais</strong></p>
<p>Para evitar testes quebradiços, algumas guias podem ser utilizadas para a maioria dos casos:</p>
<ul>
<li>Especifique apenas o que você quer que aconteça e nada mais</li>
<li>Em termos de mocks e stubs: use stubs para queries (tudo o que retorna dados e não modifica estado) e mocks para comandos (que não necessariamente retornam algo, mas modificam estado)</li>
<li>Lembre-se de que o que importa é o comportamento do método/classe/sistema. Como isto é implementado, em nível de código, não deve fazer diferença nos seus testes</li>
</ul>
<p>Como já disse, não sou um especialista. Então, se você percebeu alguma grande besteira nesse post, não exite em discutir, eu tenho a mente aberta. <img src='http://www.makemesimple.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Update</strong></p>
<p>Note que mocks e stubs, quando usados corretamente, são uma importante ferramenta de design. Esse tipo de ferramenta, além de isolar os testes de recursos externos, tem o intuito (e talvez até o principal objetivo) de servir como apoio à prática do TDD: enquanto escreve os testes antes do código, mocks e stubs (e dublês em geral) permitem que você especifique o comportamento de partes ainda não existentes da aplicação. Nesse processo, torna-se mais fácil detectar falhas como alto acoplamento e corrigí-las o quanto antes, gerando menos stress.</p>
<p>Leia mais:</p>
<ul>
<li><a href="http://szeryf.wordpress.com/2008/01/07/does-stubbing-make-your-tests-brittle/" target="_blank">Does stubbing make your tests brittle?</a></li>
<li><a href="http://evang.eli.st/blog/2008/2/4/sorry-you-re-just-not-my-type" target="_blank">Sorry, you&#8217;re just not my type</a></li>
<li><a href="http://giantrobots.thoughtbot.com/2007/9/6/brittle-tests" target="_blank">Brittle tests</a></li>
<li><a href="http://www.martinfowler.com/articles/mocksArentStubs.html" target="_blank">Mocks aren&#8217;t stubs</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2008/10/24/jogue-fora-os-testes-quebradicos/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Matchers vs Assertions: DSLs não são linguagens naturais</title>
		<link>http://www.makemesimple.com/blog/2008/10/20/matchers-vs-assertions-dsls-nao-sao-linguagens-naturais/</link>
		<comments>http://www.makemesimple.com/blog/2008/10/20/matchers-vs-assertions-dsls-nao-sao-linguagens-naturais/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 03:15:54 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Opinião]]></category>

		<category><![CDATA[Rails]]></category>

		<category><![CDATA[Test-Driven Development]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=139</guid>
		<description><![CDATA[Ok, todo o tempo eu escuto o mesmo argumento quando alguém fala do RSpec (o mesmo foi usado por Jay Fields em sua palestra no Rails Summit, semana passada):
Matchers são superiores à asserções porque, quando estou conversando com alguém, eu não afirmo &#8220;Ei, assira que são iguais: 2, 1+1&#8243;, eu afirmo &#8220;Ei, 1+1 deve ser [...]]]></description>
			<content:encoded><![CDATA[<p>Ok, todo o tempo eu escuto o mesmo argumento quando alguém fala do RSpec (o mesmo foi usado por Jay Fields em sua palestra no Rails Summit, semana passada):</p>
<blockquote><p>Matchers são superiores à asserções porque, quando estou conversando com alguém, eu não afirmo &#8220;Ei, assira que são iguais: 2, 1+1&#8243;, eu afirmo &#8220;Ei, 1+1 deve ser igual a 2&#8243;.</p></blockquote>
<p><strong>Bullshit!</strong></p>
<p style="text-align: center"><img class="aligncenter size-medium wp-image-140" title="Bullshit" src="http://www.makemesimple.com/blog/wp-content/uploads/2008/10/originals_bullshit1_ranndino-225x300.jpg" alt="Absolute Bullshit!" width="225" height="300" /></p>
<p>Trata-se de uma falácia (<strong><em>Dicto Simpliciter</em></strong>) e bem frágil. O que é óbvio e passa despercebido nesse caso é que Linguagens Específicas de Domínio (Domain Specific Languages, DSLs) não são linguagens naturais. Uh-oh! <strong>Tão</strong> óbvio.</p>
<p>Você com certeza fica completamente perdido nas discussões médicas do seriado House. Tente conversar com um engenheiro elétrico sobre o processo de geração de energia elétrica numa usina nuclear. <strong>Tente</strong> entender 20% do que ele fala.</p>
<p>Linguagens específicas de domínio são utilizadas por <strong>especialistas</strong> no domínio em questão. Então me diga se, dentro de um teste, não está o pragmático desenvolvedor em um domínio <strong>muito específico</strong> onde, sim, asserções fazem todo o sentido. Nem sequer tente argumentar que especificações (que substituem os malfadados testes do TDD) são feitos para que clientes entendam. Don&#8217;t fool yourself.</p>
<p>Matchers <strong>não</strong> são ruins, não me entenda mal. São, sim, muito legais e <strong>legíveis</strong>. Mas dizer que asserções &#8220;não são naturais&#8221; e tentar fazer disso um ponto de superioridade é falta de conhecimento.</p>
<p><strong>Observações</strong>: sim, eu prefiro o Shoulda ao RSpec e não vejo problema nenhum na utilização de nenhum dos dois. O ponto aqui é lembrar que DSLs não são inglês ou português, são linguagens muito específicas em um dado contexto. O exemplo citado foi o que me veio à cabeça mais rapidamente, talvez devido ao Rails Summit e à palestra de Jay Fields.</p>
<p>Leia mais:</p>
<p><a href="http://pragdave.blogs.pragprog.com/pragdave/2008/03/the-language-in.html" target="_blank">The &#8216;Language&#8217; in Domain-Specific Language Doesn&#8217;t Mean English (or French, or Japanese, or &#8230;)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2008/10/20/matchers-vs-assertions-dsls-nao-sao-linguagens-naturais/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Edit in place restful com Rails 2.1</title>
		<link>http://www.makemesimple.com/blog/2008/09/03/edit-in-place-restful-com-rails-21/</link>
		<comments>http://www.makemesimple.com/blog/2008/09/03/edit-in-place-restful-com-rails-21/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 03:37:59 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=137</guid>
		<description><![CDATA[A funcionalidade &#8220;edit in place&#8221; é aquela na qual, ao clicar em um texto na página web, disponibiliza-se um campo para edição do texto clicado.
Nas versões &#8220;não-Rest&#8221; do Rails, era comum o uso do plugin in_place_editing para conseguir essa funcionalidade. Para as versões mais novas, ainda é possível utilizar esse plugin, mas a solução acaba [...]]]></description>
			<content:encoded><![CDATA[<p>A funcionalidade &#8220;edit in place&#8221; é aquela na qual, ao clicar em um texto na página web, disponibiliza-se um campo para edição do texto clicado.</p>
<p>Nas versões &#8220;não-Rest&#8221; do Rails, era comum o uso do plugin in_place_editing para conseguir essa funcionalidade. Para as versões mais novas, ainda é possível utilizar esse plugin, mas a solução acaba ficando bem grosseira. Pesquisando sobre isso, encontrei o plugin <a href="http://github.com/nakajima/better-edit-in-place/tree/master" target="_blank">better-edit-in-place</a>, que permite utilizar a interface Rest padrão do Rails para conseguir a funcionalidade.</p>
<p>Depois de instalar o plugin, você precisa de apenas três passos para fazer tudo funcionar:</p>
<p>1. Escrever/incrementar os testes funcionais do controller (test first, aqui com Shoulda e&#8230; ahn&#8230; fixtures&#8230;):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;">context <span style="color:#996600;">&quot;on Ajax PUT to :update&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  setup <span style="color:#9966CC; font-weight:bold;">do</span>
    xhr <span style="color:#ff3333; font-weight:bold;">:put</span>, <span style="color:#ff3333; font-weight:bold;">:update</span>, <span style="color:#ff3333; font-weight:bold;">:id</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> emails<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:one</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">id</span>, <span style="color:#ff3333; font-weight:bold;">:email</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>:address <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'new_email@email.com'</span><span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  should_assign_to <span style="color:#ff3333; font-weight:bold;">:email</span>
  should_respond_with <span style="color:#ff3333; font-weight:bold;">:success</span>
  should_not_set_the_flash
&nbsp;
  should <span style="color:#996600;">&quot;update the email address&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    assert_equal assigns<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:email</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">address</span>, <span style="color:#996600;">'new_email@email.com'</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>2. Criar uma ação update no controller do recurso ou adicionar o formato correto ao bloco respond_to:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> update
  <span style="color:#0066ff; font-weight:bold;">@email</span> = Email.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span>params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:id</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#0066ff; font-weight:bold;">@email</span>.<span style="color:#9900CC;">update_attribute</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:address</span>, params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:email</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:address</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  respond_to <span style="color:#9966CC; font-weight:bold;">do</span> |format|
    <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">js</span> <span style="color:#006600; font-weight:bold;">&#123;</span> render <span style="color:#ff3333; font-weight:bold;">:json</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@email</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#CC0066; font-weight:bold;">format</span>.<span style="color:#9900CC;">html</span> <span style="color:#008000; font-style:italic;">#voce que sabe...</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>3. Ajustar seu markup para que a parte JavaScript do plugin funcione. Para isso, basta utilizar um helper disponibilizado pelo plugin:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&lt;%</span>= edit_in_place<span style="color:#006600; font-weight:bold;">&#40;</span>email, <span style="color:#ff3333; font-weight:bold;">:address</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">-%&gt;</span></pre></div></div>

<p>Pronto. Ao abrir a página e clicar sobre o elemento <em>span</em> que exibe o texto do atributo passado ao helper, o mesmo será substituído por uma caixa de texto com um botão para salvar e um link para cancelar a ação. Tudo simples e de forma muito mais limpa. O plugin também funciona com recursos aninhados.</p>
<p><strong>Obs:</strong> note que ignorei &#8220;detalhes&#8221; como validação do modelo, entre outros importantes. Fiz isso apenas pra encurtar o post, não faça o mesmo em aplicações reais. <img src='http://www.makemesimple.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2008/09/03/edit-in-place-restful-com-rails-21/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Um ano</title>
		<link>http://www.makemesimple.com/blog/2008/08/11/um-ano/</link>
		<comments>http://www.makemesimple.com/blog/2008/08/11/um-ano/#comments</comments>
		<pubDate>Mon, 11 Aug 2008 05:08:41 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Blog]]></category>

		<category><![CDATA[Pessoal]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=136</guid>
		<description><![CDATA[No último sábado, dia nove de agosto, este blog completou um ano de vida, contados a partir do primeiro post. Tem sido uma caminhada muito boa. Aprendi muita coisa (sou meio viciado nisso  ), mudei muita coisa e, hoje, Ruby e Rails &#8220;me sustentam&#8221;.
Obrigado a todos que acompanham, prestigiam e comentam. Já são mais [...]]]></description>
			<content:encoded><![CDATA[<p>No último sábado, dia nove de agosto, este blog completou um ano de vida, contados a partir do <a href="http://www.makemesimple.com/blog/2007/08/09/iniciando/" target="_blank">primeiro post</a>. Tem sido uma caminhada muito boa. Aprendi muita coisa (sou meio viciado nisso <img src='http://www.makemesimple.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ), <a href="http://www.makemesimple.com/blog/2008/03/11/migrando-para-a-terra-da-maca/" target="_blank">mudei muita coisa</a> e, hoje, <a href="http://www.makemesimple.com/blog/2008/05/09/2008-que-ano/" target="_blank">Ruby e Rails &#8220;me sustentam&#8221;</a>.</p>
<p>Obrigado a todos que acompanham, prestigiam e comentam. Já são mais de 200 assinantes do feed, o que me deixa muito feliz! <img src='http://www.makemesimple.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Reprisando aquele primeiro post: Ao trabalho! <img src='http://www.makemesimple.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2008/08/11/um-ano/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Um pouco mais sobre named_scopes</title>
		<link>http://www.makemesimple.com/blog/2008/07/30/um-pouco-mais-sobre-named_scopes/</link>
		<comments>http://www.makemesimple.com/blog/2008/07/30/um-pouco-mais-sobre-named_scopes/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 03:23:13 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Dicas]]></category>

		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=135</guid>
		<description><![CDATA[Um pouco mais? Mas cadê o primeiro artigo sobre isso? Bom, não o escrevi, mas vou partir do ponto em que parou o Nando Vieira em seu artigo sobre named_scopes. Logo, assumo que você já sabe o que é um named_scope e conhece algumas possibilidades, como condições dinâmicas e encadeamento de named_scopes.
Apenas lendo uma introdução [...]]]></description>
			<content:encoded><![CDATA[<p>Um pouco mais? Mas cadê o primeiro artigo sobre isso? Bom, não o escrevi, mas vou partir do ponto em que parou o <a href="http://simplesideias.com.br/" target="_blank">Nando Vieira</a> em seu <a href="http://simplesideias.com.br/utilizando-o-named_scope-no-activerecord-do-ruby-on-rails-21/" target="_blank">artigo sobre named_scopes</a>. Logo, assumo que você já sabe o que é um named_scope e conhece algumas possibilidades, como condições dinâmicas e encadeamento de named_scopes.</p>
<p>Apenas lendo uma introdução aos named_scopes já dá pra ficar bem empolgado. É um recurso simples e, ao mesmo tempo, poderoso e, quando bem utilizado, pode resulta no código bonito e sucinto que buscamos todo dia.</p>
<p>Vamos, então, explorar mais algumas possibilidades desse recurso.</p>
<p><span id="more-135"></span><br />
<strong>Modificadores para filtros</strong></p>
<p>Além de estabelecer condições de filtro, podemos aplicar modificadores a eles. Um exemplo é aplicando ordenação:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> User <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  named_scope <span style="color:#ff3333; font-weight:bold;">:boys</span>, <span style="color:#ff3333; font-weight:bold;">:conditions</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;gender = ?&quot;</span>, <span style="color:#996600;">'M'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  named_scope <span style="color:#ff3333; font-weight:bold;">:girls</span>, <span style="color:#ff3333; font-weight:bold;">:conditions</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;gender = ?&quot;</span>, <span style="color:#996600;">'F'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  named_scope <span style="color:#ff3333; font-weight:bold;">:created_since</span>, <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#006600; font-weight:bold;">&#123;</span> |days| <span style="color:#006600; font-weight:bold;">&#123;</span>:conditions <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;created_at &gt;= ?&quot;</span>, days<span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
 <span style="color:#008000; font-style:italic;">#modificando o filtro com ordenação</span>
  named_scope <span style="color:#ff3333; font-weight:bold;">:by_first_name</span>, <span style="color:#ff3333; font-weight:bold;">:order</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;first_name ASC&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Isso possibilita os seguintes usos:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;">User.<span style="color:#9900CC;">girls</span>.<span style="color:#9900CC;">by_first_name</span>
User.<span style="color:#9900CC;">boys</span>.<span style="color:#9900CC;">by_first_name</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#ou, somente:</span>
User.<span style="color:#9900CC;">by_first_name</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#encadeando como se não houvesse amanhã e operando sobre o resultado!</span>
User.<span style="color:#9900CC;">girls</span>.<span style="color:#9900CC;">created_since</span><span style="color:#006600; font-weight:bold;">&#40;</span>5.<span style="color:#9900CC;">days</span>.<span style="color:#9900CC;">ago</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">by_first_name</span>.<span style="color:#9900CC;">map</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&amp;</span>:first_name<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p><strong>Flexibilizando os escopos</strong></p>
<p>Que tal um filtro aplicável a diferentes atributos do modelo? Vamos lá:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#adding the scope to ActiveRecord::Base so it's available to all models</span>
<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  named_scope <span style="color:#ff3333; font-weight:bold;">:contains</span>, <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#006600; font-weight:bold;">&#123;</span> |column, text| <span style="color:#006600; font-weight:bold;">&#123;</span>:conditions <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;lower(#{column}) LIKE ?&quot;</span>, <span style="color:#996600;">&quot;%#{text.downcase}%&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Utilizando:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;">User.<span style="color:#9900CC;">contains</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:first_name</span>, <span style="color:#996600;">&quot;%mat%&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
User.<span style="color:#9900CC;">contains</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:last_name</span>, <span style="color:#996600;">&quot;Sinclair&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#encadeando...</span>
User.<span style="color:#9900CC;">boys</span>.<span style="color:#9900CC;">contains</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:last_name</span>, <span style="color:#996600;">&quot;S%&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">by_first_name</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#enlouquecendo...</span>
User.<span style="color:#9900CC;">girls</span>.<span style="color:#9900CC;">contains</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:first_name</span>, <span style="color:#996600;">&quot;Je%&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">created_since</span><span style="color:#006600; font-weight:bold;">&#40;</span>5.<span style="color:#9900CC;">days</span>.<span style="color:#9900CC;">ago</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">by_first_name</span>.<span style="color:#9900CC;">map</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&amp;</span>:first_name<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p><strong>Mesclando finders dinâmicos e escopos</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;">User.<span style="color:#9900CC;">boys</span>.<span style="color:#9900CC;">find_all_by_first_name</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Peter&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Note que o finder deve ser o último método na cadeia, pois retorna um Array, onde seus escopos não existem:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">=&gt;</span> User.<span style="color:#9900CC;">find_all_by_first_name</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;A%&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">boys</span>
<span style="color:#CC00FF; font-weight:bold;">NoMethodError</span>: undefined method <span style="color:#996600;">`boys' for #&lt;Array:0x21e7bf0&gt;</span></pre></div></div>

<p><strong>Testando named_scopes</strong></p>
<p>É claro que temos que testar se os escopos estão formando as condições da maneira que desejamos. Existem alguns métodos que ajudam a fazer isso:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;">should <span style="color:#996600;">&quot;correctly generate the 'boys' scope&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  expected = <span style="color:#006600; font-weight:bold;">&#123;</span>:conditions <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;gender = ?&quot;</span>, <span style="color:#996600;">&quot;M&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
  assert_equal<span style="color:#006600; font-weight:bold;">&#40;</span>expected, User.<span style="color:#9900CC;">boys</span>.<span style="color:#9900CC;">proxy_options</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p><strong>Observação:</strong> os exemplos são para ilustrar o que pode ser feito com esse recurso. Tome muito cuidado com os encadeamentos que executar, sempre observando as queries resultantes. Um pequeno deslize pode significar um gargalo significativo. </p>
<p><strong>Leia mais:</strong><br />
<a target="_blank" href="http://www.pathf.com/blogs/2008/06/more-named-scope-awesomeness/">More Named Scope Awesomeness</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2008/07/30/um-pouco-mais-sobre-named_scopes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ruby quick tip: Blocos para fallback em hash lookups</title>
		<link>http://www.makemesimple.com/blog/2008/07/13/ruby-quick-tip-blocos-para-fallback-em-hash-lookups/</link>
		<comments>http://www.makemesimple.com/blog/2008/07/13/ruby-quick-tip-blocos-para-fallback-em-hash-lookups/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 01:50:35 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Dicas]]></category>

		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=134</guid>
		<description><![CDATA[Normalmente, ao tentar fazer um lookup em um hash com uma chave não existente, você tem o seguinte comportamento:

&#62;&#62; h = &#123;:foo =&#62; &#34;bar&#34;&#125;
=&#62; &#123;:foo=&#62;&#34;bar&#34;&#125;
&#62;&#62; h&#91;:other_foo&#93;
=&#62; nil

Você pode adicionar um bloco para tratar esses casos:

&#62;&#62; h = Hash.new &#123; &#124;hash, key&#124; &#34;#{key} is not here&#34;&#125;
=&#62; &#123;&#125;
&#62;&#62; h&#91;:foo&#93;
=&#62; &#34;foo is not here&#34;

É possível, inclusive, alterar o [...]]]></description>
			<content:encoded><![CDATA[<p>Normalmente, ao tentar fazer um lookup em um hash com uma chave não existente, você tem o seguinte comportamento:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&gt;&gt;</span> h = <span style="color:#006600; font-weight:bold;">&#123;</span>:foo <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;bar&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>:foo<span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;bar&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> h<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:other_foo</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">nil</span></pre></div></div>

<p>Você pode adicionar um bloco para tratar esses casos:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&gt;&gt;</span> h = <span style="color:#CC00FF; font-weight:bold;">Hash</span>.<span style="color:#9900CC;">new</span> <span style="color:#006600; font-weight:bold;">&#123;</span> |hash, key| <span style="color:#996600;">&quot;#{key} is not here&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> h<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:foo</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;foo is not here&quot;</span></pre></div></div>

<p>É possível, inclusive, alterar o hash em questão:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&gt;&gt;</span> h = <span style="color:#CC00FF; font-weight:bold;">Hash</span>.<span style="color:#9900CC;">new</span> <span style="color:#006600; font-weight:bold;">&#123;</span> |hash, key| hash<span style="color:#006600; font-weight:bold;">&#91;</span>key<span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">&quot;value for #{key}&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#006600; font-weight:bold;">&gt;&gt;</span> h<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:foo</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;value for foo&quot;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2008/07/13/ruby-quick-tip-blocos-para-fallback-em-hash-lookups/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Learncast #1: BDD leve com Shoulda - testando modelos ActiveRecord</title>
		<link>http://www.makemesimple.com/blog/2008/06/27/learncast1-bdd-leve-com-shoulda-testando-modelos-activerecord/</link>
		<comments>http://www.makemesimple.com/blog/2008/06/27/learncast1-bdd-leve-com-shoulda-testando-modelos-activerecord/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 05:10:17 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Learncast]]></category>

		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=132</guid>
		<description><![CDATA[Behavior Driven Development parece ganhar tração constantemente nas comunidades de desenvolvedores de teste. Isso não é à toa: essa &#8220;nova&#8221; mentalidade dá o toque semântico que faltava às técnicas de Test Driven Development.
Na comunidade Rails, os três projetos mais conhecidos na área de BDD são RSpec, Shoulda e test/spec. Minha escolha é o Shoulda, que [...]]]></description>
			<content:encoded><![CDATA[<p>Behavior Driven Development parece ganhar tração constantemente nas comunidades de desenvolvedores de teste. Isso não é à toa: essa &#8220;nova&#8221; mentalidade dá o toque semântico que faltava às técnicas de Test Driven Development.</p>
<p>Na comunidade Rails, os três projetos mais conhecidos na área de BDD são <a href="http://rspec.info/" target="_blank">RSpec</a>, <a href="http://thoughtbot.com/projects/shoulda/" target="_blank">Shoulda</a> e <a href="http://test-spec.rubyforge.org/test-spec/" target="_blank">test/spec</a>. Minha escolha é o Shoulda, que utilizo <a href="http://giantrobots.thoughtbot.com/2007/4/6/shoulda-coulda-woulda" target="_blank">desde o lançamento</a> com muito sucesso. Há um bom tempo venho &#8220;rascunhando&#8221; um screencast introdutório e, finalmente, ele está pronto. <a href="http://www.makemesimple.com/files/learncast1.mov" target="_blank">Clique aqui para baixá-lo</a> em formato QuickTime.</p>
<p>O objetivo do screencast é apenas mostrar superficialmente o que é Shoulda e como testar funcionalidades de modelos ActiveRecord (como validações e associações). Em breve virão mais alguns cobrindo testes de controllers e mais detalhes sobre o uso do plugin.</p>
<p>Links interessantes:</p>
<p><a href="http://thoughtbot.com/projects/shoulda/" target="_blank">Shoulda</a>: <a href="http://thoughtbot.com/projects/shoulda/tutorial" target="_blank">tutorial</a> | <a href="http://github.com/thoughtbot/shoulda/tree/master">repositório</a> | <a href="http://dev.thoughtbot.com/shoulda/" target="_blank">RDocs</a> | <a href="http://github.com/drnic/ruby-shoulda-tmbundle/tree/master" target="_blank">bundle para TextMate</a></p>
<p>Plugin <a href="http://github.com/thoughtbot/quietbacktrace/tree/master" target="_blank">QuietBacktrace</a></p>
<p>Comentários, críticas e complementos são muito bem-vindos!</p>
<p><strong>Obs</strong>: estou resfriado, mas fiz o possível para deixar o som o mais claro possível. Por favor, avise caso eu não tenha conseguido. <img src='http://www.makemesimple.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Update</strong>: como apontado nos comentários, subi o vídeo sem o som (duh!), mas isso já foi corrigido. Obrigado pelo aviso, pessoal.</p>
<p><strong>Update 2</strong>: <a href="http://makemesimple.com/files/autotest_pack.zip" target="_blank">disponibilizei o script e as imagens que utilizo para o Autotest</a> com o Shoulda em minha máquina, rodando o Leopard. Crie, na pasta home de seu usuário (/Users/&lt;nome_do_seu_usuário&gt;/), uma pasta chamada .autotest_images e copie as duas imagens para lá. Crie, também na home, um arquivo chamado .autotest e preencha-o com o script contido no pacote. Esse script é baseado em um script publicado pelo <a href="http://www.nomedojogo.com/" target="_blank">Carlos Brando</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2008/06/27/learncast1-bdd-leve-com-shoulda-testando-modelos-activerecord/feed/</wfw:commentRss>
<enclosure url="http://www.makemesimple.com/files/learncast1.mov" length="9642106" type="video/quicktime" />
		</item>
		<item>
		<title>Rails-footnotes, um plugin fundamental</title>
		<link>http://www.makemesimple.com/blog/2008/06/26/rails-footnotes-mais-um-plugin-de-dr-nic/</link>
		<comments>http://www.makemesimple.com/blog/2008/06/26/rails-footnotes-mais-um-plugin-de-dr-nic/#comments</comments>
		<pubDate>Thu, 26 Jun 2008 19:13:01 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=133</guid>
		<description><![CDATA[Se você desenvolve em Rails no MacOS X com TextMate, você tem que utilizar o plugin rails-footnotes. Sério. É obrigatório. Mesmo.
Esse plugin coloca um rodapé em todas as páginas de sua aplicação, quando no ambiente de desenvolvimento, mostrando várias informações, como parâmetros da requisição, sessão, cookies, filtros, rotas, queries e log. Além disso, contém também [...]]]></description>
			<content:encoded><![CDATA[<p>Se você desenvolve em Rails no MacOS X com TextMate, você tem que utilizar o plugin <a href="http://github.com/drnic/rails-footnotes/tree/master" target="_blank">rails-footnotes</a>. Sério. É obrigatório. Mesmo.</p>
<p>Esse plugin coloca um rodapé em todas as páginas de sua aplicação, quando no ambiente de desenvolvimento, mostrando várias informações, como parâmetros da requisição, sessão, cookies, filtros, rotas, queries e log. Além disso, contém também links para abrir arquivos (como o controller ou view atual) no TextMate. Isso permite que você, enquanto navega pela aplicação, possa abrir no TextMate arquivos relacionados a página aberta no navegador, como o controller, a view, o layout ou a folha de estilos.</p>
<p>Parabéns ao <a href="http://josevalim.blogspot.com/" target="_blank">José Valim</a>, principal desenvolvedor do plugin atualmente.</p>
<p>Extremamente recomendado.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2008/06/26/rails-footnotes-mais-um-plugin-de-dr-nic/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dica: Migrations com comandos SQL e problemas com testes no Rails</title>
		<link>http://www.makemesimple.com/blog/2008/06/11/dica-migrations-sql-e-testes-no-rails/</link>
		<comments>http://www.makemesimple.com/blog/2008/06/11/dica-migrations-sql-e-testes-no-rails/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 19:43:09 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Dicas]]></category>

		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=131</guid>
		<description><![CDATA[Se você utiliza o método execute em suas migrations para rodar comandos SQL na criação de sua base de dados, cuidado ao rodar os testes de sua aplicação. Na criação da base de testes, o Rails não roda as migrations, ele utiliza o script contido no arquivo schema.rb. O problema é que, ao fazer o [...]]]></description>
			<content:encoded><![CDATA[<p>Se você utiliza o método <em>execute</em> em suas migrations para rodar comandos SQL na criação de sua base de dados, cuidado ao rodar os testes de sua aplicação. Na criação da base de testes, o Rails não roda as migrations, ele utiliza o script contido no arquivo schema.rb. O problema é que, ao fazer o dump da base para esse arquivo, o Rails não utiliza os comandos SQL definidos nas migrations e sim os métodos da DSL de manipulação de estrutura e dados (como add_index, create_table, add_column etc).</p>
<p>Devido a isso, se você utilizou alguma particularidade do sistema gerenciador de banco de dados que utiliza ao definir sua base, muito provavelmente ocorrerá um erro no banco de dados ao tentar rodar os testes de sua aplicação.</p>
<p>Exemplo:</p>
<p>Em uma migration:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;"><span style="color:#006600; font-weight:bold;">&#40;</span>...<span style="color:#006600; font-weight:bold;">&#41;</span>
  create_table <span style="color:#ff3333; font-weight:bold;">:tests</span> <span style="color:#9966CC; font-weight:bold;">do</span> |t|
    t.<span style="color:#9900CC;">column</span> <span style="color:#ff3333; font-weight:bold;">:test_column</span>,         <span style="color:#ff3333; font-weight:bold;">:text</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  execute<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;ALTER TABLE test ADD INDEX test_index(test_column(200));&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">&#40;</span>...<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>No MySQL é necessário definir um comprimento para índices em colunas dos tipos TEXT e BLOB e, como não há essa opção no método add_index, utilizamos um comando SQL. No entanto, no arquivo schema.rb, a criação do índice é feita da seguinte maneira:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;">  add_index <span style="color:#996600;">&quot;tests&quot;</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;test_column&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#ff3333; font-weight:bold;">:name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;test_index&quot;</span></pre></div></div>

<p>E isso causa um erro no MySQL. Para corrigí-lo, procure em seu arquivo environment.rb pela seguinte linha:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby ruby" style="font-family:monospace;">  config.<span style="color:#9900CC;">active_record</span>.<span style="color:#9900CC;">schema_format</span> = <span style="color:#ff3333; font-weight:bold;">:sql</span></pre></div></div>

<p>Por padrão ela vem comentada. Retire o comentário para fazer com que o banco de dados de testes seja criado diretamente com comandos SQL. Caso não a encontre comentada, adicione-a dentro do bloco <em>Rails::Initializer.run</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2008/06/11/dica-migrations-sql-e-testes-no-rails/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A TIM, assim como as outras operadoras, é uma porcaria</title>
		<link>http://www.makemesimple.com/blog/2008/06/11/a-tim-assim-como-as-outras-operadoras-e-uma-porcaria/</link>
		<comments>http://www.makemesimple.com/blog/2008/06/11/a-tim-assim-como-as-outras-operadoras-e-uma-porcaria/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 14:14:17 +0000</pubDate>
		<dc:creator>Lucas Húngaro</dc:creator>
		
		<category><![CDATA[Pessoal]]></category>

		<category><![CDATA[Protesto]]></category>

		<guid isPermaLink="false">http://www.makemesimple.com/blog/?p=130</guid>
		<description><![CDATA[Sempre recomendei a TIM como operadora móvel GSM no estado de São Paulo&#8230; até recentemente, quando precisei da empresa para algo a mais do que triviais ligações e mensagens.
Eu possuía um plano pós-pago e um número com DDD 14 (interior de São Paulo). Me mudei para a cidade de São Paulo e entrei em contato [...]]]></description>
			<content:encoded><![CDATA[<p>Sempre recomendei a TIM como operadora móvel GSM no estado de São Paulo&#8230; até recentemente, quando precisei da empresa para algo a mais do que triviais ligações e mensagens.</p>
<p>Eu possuía um plano pós-pago e um número com DDD 14 (interior de São Paulo). Me mudei para a cidade de São Paulo e entrei em contato com a TIM para mudar meu DDD (perderia meu número anterior) e mudar para um plano pré-pago. Fui informado de que isso era possível mas, mesmo assim, tive que ficar <strong>uma hora e quarenta minutos</strong> negando um plano de conta fix que o atendente ficava continuamente empurrando. A regra deve ser: &#8220;Não basta dizer <strong>NÃO</strong> uma vez, são necessárias cinqüenta vezes para ter certeza&#8221;.</p>
<p>Após isso, o atendente inicia a migração. Note que ele deveria, em primeiro lugar, mudar o número e, após isso, o plano. Se você tem um plano pré-pago, não consegue alterar seu número, deve comprar outro chip.</p>
<p>Fico meia hora na linha enquanto a migração era realizada, a ligação cai e fico sem qualquer sinal por uns dez minutos. O sinal retorna, consulto o plano via SMS e vejo que estou com cinco reais de crédito num plano pré-pago. Mas o número permanecia o mesmo. Entro em contato novamente e sou informado de que clientes de planos pré-pagos não podem alterar seu número. Passo os números de protocolo e nome do atendente e me afirmam que, mesmo sendo um erro da empresa, teria que comprar um outro chip ou entrar com um processo na justiça (claro, com uma risadinha irônica, pois o trabalho pra levar adiante um processo é muito comparado a quinze reais de um novo chip).</p>
<p>Resultado: estou com o número antigo e plano pré-pago, graças a mais um show de incompetência e desrespeito.</p>
<p>Ingenuamente eu ainda acreditava e recomendava a TIM para meus amigos. Não mais. Estamos mergulhados em um mar de incompetência e amadorismo quando se trata de telefonia no Brasil.</p>
<p>Fui mais educado no título, mas a melhor frase para descrevê-las é: &#8220;A TIM, assim como as outras operadoras, é uma <strong>merda</strong>&#8220;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.makemesimple.com/blog/2008/06/11/a-tim-assim-como-as-outras-operadoras-e-uma-porcaria/feed/</wfw:commentRss>
		</item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 2.980 seconds -->
