<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><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" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Simples Ideias. Por Nando Vieira.</title>
	
	<link>http://simplesideias.com.br</link>
	<description />
	<lastBuildDate>Mon, 01 Feb 2010 00:44:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/simplesideias" /><feedburner:info uri="simplesideias" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>simplesideias</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Documentando projetos com RDoc - PDF Grátis!</title>
		<link>http://feedproxy.google.com/~r/simplesideias/~3/engleTHFmCo/</link>
		<comments>http://simplesideias.com.br/documentando-projetos-com-rdoc-pdf-gratis/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 11:58:49 +0000</pubDate>
		<dc:creator>Nando Vieira</dc:creator>
				<category><![CDATA[HOWTO]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[documentação]]></category>
		<category><![CDATA[rdoc]]></category>

		<guid isPermaLink="false">http://simplesideias.com.br/?p=475</guid>
		<description><![CDATA[


	E está no ar mais um PDF da série HOWTO, desta vez abordando o RDoc, marcação de documentação para códigos escritos em Ruby. 



O RDoc é utilizado por quase todos os grandes projetos como Ruby on Rails e RSpec, dentre muitos outros.



	Este guia de 17 páginas mostra como utilizar o RDoc, com muitos exemplos de [...]]]></description>
			<content:encoded><![CDATA[<p class="align-right"><img src="http://m.simplesideias.com.br/howto-documentando-projetos-com-rdoc.png" alt="" /></p>

<p>
	E está no ar mais um PDF da série <a href="http://howtocode.com.br" rel="external">HOWTO</a>, desta vez abordando o <a href="http://rdoc.rubyforge.org" rel="external">RDoc</a>, marcação de documentação para códigos escritos em Ruby. 
</p>

<p>
O RDoc é utilizado por quase todos os grandes projetos como <a href="http://api.rubyonrails.com" rel="external">Ruby on Rails</a> e <a href="http://rspec.rubyforge.org/rspec/1.2.9/" rel="external">RSpec</a>, dentre muitos outros.
</p>

<p>
	Este guia de <strong>17 páginas</strong> mostra como utilizar o RDoc, com muitos exemplos de formatação.
</p>

<p>
	O PDF é gratuito pode ser baixado em <a href="http://howtocode.com.br/documentando-projetos-com-rdoc" rel="external">http://howtocode.com.br/documentando-projetos-com-rdoc</a>.
</p>

<p>Não perca tempo e baixe já a sua cópia!</p><img src="http://feeds.feedburner.com/~r/simplesideias/~4/engleTHFmCo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://simplesideias.com.br/documentando-projetos-com-rdoc-pdf-gratis/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://simplesideias.com.br/documentando-projetos-com-rdoc-pdf-gratis/</feedburner:origLink></item>
		<item>
		<title>Criando eventos recorrentes com Recurrence</title>
		<link>http://feedproxy.google.com/~r/simplesideias/~3/PiTCIFN0CWo/</link>
		<comments>http://simplesideias.com.br/criando-eventos-recorrentes-com-recurrence/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 14:38:36 +0000</pubDate>
		<dc:creator>Nando Vieira</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Recurrence]]></category>

		<guid isPermaLink="false">http://simplesideias.com.br/?p=468</guid>
		<description><![CDATA[Recurrence é uma biblioteca criada para gerar eventos recorrentes de maneira simples. Eu criei essa gem há tempos, mas nunca escrevi nada sobre ela. Eis que muitas pessoas começaram a me mandar e-mails perguntando como utilizá-la e chegou a hora de fazer um artigo mostrando seu uso na prática.

A primeira coisa que você precisa fazer [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="external" href="http://github.com/fnando/recurrence">Recurrence</a> é uma biblioteca criada para gerar eventos recorrentes de maneira simples. Eu criei essa gem há tempos, mas nunca escrevi nada sobre ela. Eis que muitas pessoas começaram a me mandar e-mails perguntando como utilizá-la e chegou a hora de fazer um artigo mostrando seu uso na prática.</p>

<p>A primeira coisa que você precisa fazer é instalar a gem.</p>

<pre class="ruby"><code>sudo gem install recurrence</code></pre>

<p>Depois, basta adicionar à biblioteca.</p>

<pre class="ruby"><code><span class="kw3">require</span> <span class="st0">&quot;rubygems&quot;</span>
<span class="kw3">require</span> <span class="st0">&quot;recurrence&quot;</span></code></pre>

<p>A maneira mais simples de usar é instanciar um objeto através dos métodos de classe <code>daily</code>, <code>weekly</code>, <code>monthly</code> e <code>yearly</code>, que permitem criar eventos diários, semanais, mensais e anuais, respectivamente.</p>

<pre class="ruby"><code>r = Recurrence.<span class="me1">daily</span></code></pre>

<p>Para retornar a próxima data, você deve utilizar o método <code>Recurrence#next</code>.</p>

<pre class="ruby"><code>r.<span class="kw1">next</span>
<span class="co1">#=&gt; Fri, 18 Dec 2009</span>
&nbsp;
r.<span class="kw1">next</span>
<span class="co1">#=&gt; Fri, 18 Dec 2009</span></code></pre>

<p>Você também pode utilizar o método <code>Recurrence#next!</code>, que altera a variável interna de data, como mostra o exemplo abaixo.</p>

<pre class="ruby"><code>r.<span class="kw1">next</span>!
<span class="co1">#=&gt; Fri, 18 Dec 2009</span>
&nbsp;
r.<span class="kw1">next</span>!
<span class="co1">#=&gt; Sat, 19 Dec 2009</span></code></pre>

<p>Se você quiser, pode especificar o intervalo de dias que o evento pode se repetir; basta utilizar a opção <code>:starts</code> e <code>:ends</code>.</p>

<pre class="ruby"><code><span class="co1"># define the starting date to 2009-12-24</span>
r = Recurrence.<span class="me1">daily</span><span class="br0">&#40;</span><span class="re3">:starts</span> =&gt; <span class="kw4">Date</span>.<span class="me1">new</span><span class="br0">&#40;</span><span class="nu0">2009</span>, <span class="nu0">12</span>, <span class="nu0">24</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span class="co1"># define the ending date to 2009-12-31</span>
r = Recurrence.<span class="me1">daily</span><span class="br0">&#40;</span><span class="re3">:ends</span> =&gt; <span class="kw4">Date</span>.<span class="me1">new</span><span class="br0">&#40;</span><span class="nu0">2009</span>, <span class="nu0">12</span>, <span class="nu0">31</span><span class="br0">&#41;</span><span class="br0">&#41;</span></code></pre>

<p>Você também pode passar essas datas como strings, desde que elas sejam interpretadas pelo método <code>Date#parse</code>.</p>

<pre class="ruby"><code>r = Recurrence.<span class="me1">daily</span><span class="br0">&#40;</span><span class="re3">:starts</span> =&gt; <span class="st0">&quot;2009-12-24&quot;</span><span class="br0">&#41;</span></code></pre>

<p>Os atalhos são uma excelente maneira de tornar o código mais semântico, mas em alguns casos é melhor seguir com o bom e velho método <code>new</code>.</p>

<pre class="ruby"><code>r = Recurrence.<span class="me1">new</span><span class="br0">&#40;</span><span class="re3">:every</span> =&gt; <span class="re3">:week</span>, <span class="re3">:on</span> =&gt; <span class="re3">:saturday</span>, <span class="re3">:interval</span> =&gt; <span class="nu0">2</span><span class="br0">&#41;</span></code></pre>

<p>Como você pode ver no exemplo acima, estamos criando um evento <strong>semanal</strong>, que acontece aos <strong>sábados</strong>, a cada <strong>duas semanas</strong>. Ao utilizar o método <strong>Recurrence#next!</strong> você terá algo como isso:</p>

<pre class="ruby"><code>r.<span class="kw1">next</span>!
<span class="co1">#=&gt; Sat, 19 Dec 2009</span>
&nbsp;
r.<span class="kw1">next</span>!
<span class="co1">#=&gt; Sat, 02 Jan 2010</span></code></pre>

<p>Você também pode especificar uma lista com os dias da semana que o evento deve ocorrer.</p>

<pre class="ruby"><code>r = Recurrence.<span class="me1">weekly</span><span class="br0">&#40;</span><span class="re3">:on</span> =&gt; <span class="br0">&#91;</span><span class="re3">:saturday</span>, <span class="re3">:sunday</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
&nbsp;
r.<span class="kw1">next</span>!
<span class="co1">#=&gt; Sat, 19 Dec 2009</span>
&nbsp;
r.<span class="kw1">next</span>!
<span class="co1">#=&gt; Sun, 20 Dec 2009</span>
&nbsp;
r.<span class="kw1">next</span>!
<span class="co1">#=&gt; Sat, 26 Dec 2009</span></code></pre>

<p>Para acessar uma lista com todos os eventos disponíveis, basta utilizar o método <code>Recurrence#events</code>.</p>

<pre class="ruby"><code>r.<span class="me1">events</span>
<span class="co1">#=&gt; [Sun, 20 Dec 2009, Sun, 27 Dec 2009]</span></code></pre>

<p>Esse método fará irá guardar a lista de datas geradas, aumentando a performance se ele for acessado mais de uma vez. Se você quiser regerar essas datas, pode utilizar o método <code>Recurrence#events!</code>.</p>

<p>Também é possível verificar se uma data está no intervalo especificado no objeto <code>Recurrence</code>.</p>

<pre class="ruby"><code>r = Recurrence.<span class="me1">weekly</span><span class="br0">&#40;</span><span class="re3">:on</span> =&gt; <span class="re3">:saturday</span><span class="br0">&#41;</span>
&nbsp;
r.<span class="kw1">include</span>? <span class="st0">&quot;2009-12-19&quot;</span>
<span class="co1">#=&gt; true</span></code></pre>

<h3>Como usar na prática</h3>

<p>Como você pode ver, o Recurrence é totalmente parametrizado. Essa abordagem permite que você armazene os itens necessários para montar sua recorrência em um banco de dados, por exemplo. Digamos que você tenha um modelo <code>Event</code>, com o seguinte schema:</p>

<pre class="ruby"><code><span class="kw1">class</span> CreateEvents &lt; <span class="re2">ActiveRecord::Migration</span>
  <span class="kw1">def</span> <span class="kw2">self</span>.<span class="me1">up</span>
    create_table <span class="re3">:events</span> <span class="kw1">do</span> |t|
      t.<span class="kw3">string</span> <span class="re3">:title</span>,        <span class="re3">:null</span> =&gt; <span class="kw2">false</span>
      t.<span class="me1">binary</span> <span class="re3">:meta</span>,         <span class="re3">:null</span> =&gt; <span class="kw2">false</span>
      t.<span class="me1">date</span>   <span class="re3">:scheduled_to</span>, <span class="re3">:null</span> =&gt; <span class="kw2">false</span>
    <span class="kw1">end</span>
  <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>

<p>Os atributos que serão utilizados no Recurrence são <code>:meta</code> e <code>:scheduled_to</code>. O primeiro irá armazenar o tipo de recorrência e as informações como dia, intervalo, etc. Já o segundo, irá armazenar a próxima data do evento, para diminuir a geração de datas. O modelo <code>Event</code> pode armazenar os atributos como este exemplo:</p>

<pre class="ruby"><code><span class="kw1">class</span> Event &lt; <span class="re2">ActiveRecord::Base</span>
  serialize <span class="re3">:meta</span>, <span class="kw4">Hash</span>
&nbsp;
  validates_presence_of <span class="re3">:meta</span>, <span class="re3">:title</span>, <span class="re3">:scheduled_to</span>
<span class="kw1">end</span></code></pre>

<p>Veja um exemplo de como cadastrar um evento &#8220;Pagamento&#8221;, que acontece todo mês no dia 5.</p>

<pre class="rails"><code>options = <span class="br0">&#123;</span>:every =&gt; <span class="re3">:month</span>, <span class="re3">:on</span> =&gt; <span class="nu0">5</span><span class="br0">&#125;</span>
r = Recurrence.<span class="kw5">new</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span>
&nbsp;
event = Event.<span class="kw5">new</span><span class="br0">&#40;</span><span class="re3">:title</span> =&gt; <span class="st0">&quot;Pagamento&quot;</span>, <span class="re3">:meta</span> =&gt; options, <span class="re3">:scheduled_to</span> =&gt; r.<span class="kw1">next</span><span class="br0">&#41;</span>
event.<span class="kw5">save</span>!</code></pre>

<p>Na hora de montar o objeto de recorrência, você pode utilizar algo como isto:</p>

<pre class="rails"><code>event = Event.<span class="kw5">first</span>
&nbsp;
r = Recurrence.<span class="kw5">new</span><span class="br0">&#40;</span>event.<span class="me1">meta</span>.<span class="me1">merge</span><span class="br0">&#40;</span><span class="re3">:starts</span> =&gt; event.<span class="me1">scheduled_to</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
r.<span class="kw1">next</span>
<span class="co1">#=&gt; Tue, 05 Jan 2010</span></code></pre>

<p>Se você precisar exibir um evento mais de uma vez, utilize este mesmo processo e exiba os eventos com o método <code>events</code>.</p>

<h3>Finalizando</h3>

<p>Criar eventos recorrentes nem sempre é uma tarefa simples, principalmente no que diz respeito à performance. O <a rel="external" href="http://github.com/josevalim">José Valim</a> fez uma série de contribuições que ajudaram a melhor esse ponto, além de outras funcionalidades como os atalhos.</p>

<p>Para conhecer mais sobre as opções disponíveis do <a rel="external" href="http://github.com/fnando/recurrence">Recurrence</a>, acesse o <a rel="external" href="http://github.com/fnando/recurrence/blob/master/README.markdown"><span class="caps">README</span></a> do projeto no <a rel="external" href="http://github.com">Github</a>.</p>
<img src="http://feeds.feedburner.com/~r/simplesideias/~4/PiTCIFN0CWo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://simplesideias.com.br/criando-eventos-recorrentes-com-recurrence/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://simplesideias.com.br/criando-eventos-recorrentes-com-recurrence/</feedburner:origLink></item>
		<item>
		<title>7 coisas que você precisa conhecer no RSpec</title>
		<link>http://feedproxy.google.com/~r/simplesideias/~3/l6HHG5kN_Ak/</link>
		<comments>http://simplesideias.com.br/7-coisas-que-voce-precisa-conhecer-no-rspec/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 11:42:19 +0000</pubDate>
		<dc:creator>Nando Vieira</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[RSpec]]></category>

		<guid isPermaLink="false">http://simplesideias.com.br/?p=456</guid>
		<description><![CDATA[O RSpec é um framework bastante completo e, por isso mesmo, muitas coisas são desconhecidas por grande parte dos desenvolvedores. Neste artigo, você conhecerá 7 coisas que irão mudar a maneira como você utiliza o RSpec.

Subject

O RSpec possui um método muito útil chamado subject, que retorna uma instância da classe que está sendo utilizada como [...]]]></description>
			<content:encoded><![CDATA[<p>O <a rel="external" href="http://rspec.info">RSpec</a> é um framework bastante completo e, por isso mesmo, muitas coisas são desconhecidas por grande parte dos desenvolvedores. Neste artigo, você conhecerá 7 coisas que irão mudar a maneira como você utiliza o RSpec.</p>

<h3>Subject</h3>

<p>O RSpec possui um método muito útil chamado <code>subject</code>, que retorna uma instância da classe que está sendo utilizada como contexto do exemplo.</p>

<pre class="rails"><code>describe User <span class="kw1">do</span>
  it <span class="br0">&#123;</span> should_not be_admin <span class="br0">&#125;</span>
<span class="kw1">end</span></code></pre>

<p>A grande vantagem desta abordagem é que você aumenta consideravelmente a legibilidade de suas especificações. Mas você não precisa utilizar apenas o contexto especificado no método <code>describe</code>; se quiser, você pode definir o seu próprio!</p>

<pre class="rails"><code>describe User <span class="kw1">do</span>
  subject <span class="br0">&#123;</span> User.<span class="kw5">new</span><span class="br0">&#40;</span><span class="re3">:admin</span> =&gt; <span class="kw2">true</span><span class="br0">&#41;</span> <span class="br0">&#125;</span>
  it <span class="br0">&#123;</span> should be_admin <span class="br0">&#125;</span>
<span class="kw1">end</span></code></pre>

<p>Quando outros tipos de objetos (como módulos ou strings) são passados ao método <code>describe</code>, ele irá retornar o próprio objeto.</p>

<h3>Message expectation</h3>

<h4>O método stub_chain</h4>

<p>Sempre que você precisar fazer uma chamada encadeada e quiser verificar o último valor, utilize o método <code>stub_chain</code>. Ele permite transformar um bloco como este</p>

<pre class="rails"><code>describe <span class="st0">&quot;Mocks&quot;</span> <span class="kw1">do</span>
  before <span class="kw1">do</span>
    <span class="re1">@user</span> = mock<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="re1">@things</span> = mock<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="re1">@recent</span> = mock<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp;
    <span class="re1">@user</span>.<span class="me1">stub</span>!<span class="br0">&#40;</span><span class="re3">:things</span><span class="br0">&#41;</span>.<span class="me1">and_return</span><span class="br0">&#40;</span>@things<span class="br0">&#41;</span>
    <span class="re1">@things</span>.<span class="me1">stub</span>!<span class="br0">&#40;</span><span class="re3">:recent</span><span class="br0">&#41;</span>.<span class="me1">and_return</span><span class="br0">&#40;</span>@recent<span class="br0">&#41;</span>
    <span class="re1">@recent</span>.<span class="me1">should_receive</span><span class="br0">&#40;</span><span class="re3">:count</span><span class="br0">&#41;</span>.<span class="me1">and_return</span><span class="br0">&#40;</span><span class="nu0">100</span><span class="br0">&#41;</span>
  <span class="kw1">end</span>
&nbsp;
  it <span class="st0">&quot;should return the recent things count from an user&quot;</span> <span class="kw1">do</span>
    <span class="re1">@user</span>.<span class="me1">things</span>.<span class="me1">recent</span>.<span class="kw5">count</span>.<span class="me1">should</span> == <span class="nu0">100</span>
  <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>

<p>em uma coisa bem mais simples como esta</p>

<pre class="rails"><code>describe <span class="st0">&quot;Mocks&quot;</span> <span class="kw1">do</span>
  before <span class="kw1">do</span>
    <span class="re1">@user</span> = mock<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="re1">@user</span>.<span class="me1">stub_chain</span><span class="br0">&#40;</span><span class="re3">:things</span>, <span class="re3">:recent</span>, <span class="re3">:count</span><span class="br0">&#41;</span>.<span class="me1">and_return</span><span class="br0">&#40;</span><span class="nu0">100</span><span class="br0">&#41;</span>
  <span class="kw1">end</span>
&nbsp;
  it <span class="st0">&quot;should return the recent things count from an user&quot;</span> <span class="kw1">do</span>
    <span class="re1">@user</span>.<span class="me1">things</span>.<span class="me1">recent</span>.<span class="kw5">count</span>.<span class="me1">should</span> == <span class="nu0">100</span>
  <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>

<h4>O método and_return</h4>

<p>Você alguma vez precisou acessar um stub mais de uma vez e queria que ele retornasse diferentes valores em cada chamada? Veja este exemplo.</p>

<pre class="rails"><code><span class="kw3">require</span> <span class="st0">&quot;open-uri&quot;</span>
&nbsp;
<span class="kw1">class</span> Dice
  API_URL = <span class="st0">&quot;http://www.random.org/integers/?num=1&amp;min=1&amp;max=6&amp;col=1&amp;base=10&amp;format=plain&amp;rnd=new&quot;</span>
&nbsp;
  <span class="kw1">def</span> roll
    <span class="kw3">open</span><span class="br0">&#40;</span>API_URL<span class="br0">&#41;</span>.<span class="kw5">to_i</span>
  <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>

<p>Toda vez que o método <code>roll</code> for chamado, ele irá fazer uma requisição diferente ao <a rel="external" href="http://random.org">http://random.org</a>. Imagine que por algum motivo você precisasse retornar diferentes valores toda vez que o método <code>open</code> você invocado. Tudo o que você precisa fazer é retornar mais de um valor com o método <code>and_return</code>.</p>

<pre class="rails"><code>describe Dice <span class="kw1">do</span>
  before <span class="kw1">do</span>
    subject.<span class="me1">should_receive</span><span class="br0">&#40;</span><span class="re3">:open</span><span class="br0">&#41;</span>.<span class="me1">and_return</span><span class="br0">&#40;</span><span class="st0">&quot;1&quot;</span>, <span class="st0">&quot;4&quot;</span>, <span class="st0">&quot;2&quot;</span><span class="br0">&#41;</span>
  <span class="kw1">end</span>
&nbsp;
  it <span class="st0">&quot;should not cache request&quot;</span> <span class="kw1">do</span>
    subject.<span class="me1">roll</span>.<span class="me1">should</span> == <span class="nu0">1</span>
    subject.<span class="me1">roll</span>.<span class="me1">should</span> == <span class="nu0">4</span>
    subject.<span class="me1">roll</span>.<span class="me1">should</span> == <span class="nu0">2</span>
  <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>

<h4>O método with</h4>

<p>O RSpec disponibiliza uma série de métodos que podem ser usados em conjunto com o método <code>with</code>. Veja alguns exemplos:</p>

<pre class="rails"><code><span class="kw1">module</span> Echo
  extend <span class="kw2">self</span>
&nbsp;
  <span class="kw1">def</span> echo<span class="br0">&#40;</span>*args<span class="br0">&#41;</span>
    args.<span class="me1">inspect</span>
  <span class="kw1">end</span>
<span class="kw1">end</span>
&nbsp;
describe Echo <span class="kw1">do</span>
  <span class="co1"># with any kind of argument</span>
  specify<span class="br0">&#40;</span><span class="st0">&quot;anything&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    subject.<span class="me1">should_receive</span><span class="br0">&#40;</span><span class="re3">:echo</span><span class="br0">&#41;</span>.<span class="me1">with</span><span class="br0">&#40;</span>anything<span class="br0">&#41;</span>
    subject.<span class="me1">echo</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>
  <span class="br0">&#125;</span>
&nbsp;
  <span class="co1"># with hash containing values</span>
  specify<span class="br0">&#40;</span><span class="st0">&quot;hash_including&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    subject.<span class="me1">should_receive</span><span class="br0">&#40;</span><span class="re3">:echo</span><span class="br0">&#41;</span>.<span class="me1">with</span><span class="br0">&#40;</span>hash_including<span class="br0">&#40;</span><span class="re3">:say</span> =&gt; <span class="st0">&quot;hello&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    subject.<span class="me1">echo</span><span class="br0">&#40;</span><span class="re3">:say</span> =&gt; <span class="st0">&quot;hello&quot;</span><span class="br0">&#41;</span>
  <span class="br0">&#125;</span>
&nbsp;
  <span class="co1"># with an instance of String</span>
  specify<span class="br0">&#40;</span><span class="st0">&quot;instance_of&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    subject.<span class="me1">should_receive</span><span class="br0">&#40;</span><span class="re3">:echo</span><span class="br0">&#41;</span>.<span class="me1">with</span><span class="br0">&#40;</span>instance_of<span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    subject.<span class="me1">echo</span><span class="br0">&#40;</span><span class="st0">&quot;hello&quot;</span><span class="br0">&#41;</span>
  <span class="br0">&#125;</span>
&nbsp;
  <span class="co1"># with an object that responds to some methods</span>
  specify<span class="br0">&#40;</span><span class="st0">&quot;duck_type&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
    subject.<span class="me1">should_receive</span><span class="br0">&#40;</span><span class="re3">:echo</span><span class="br0">&#41;</span>.<span class="me1">twice</span>.<span class="me1">with</span><span class="br0">&#40;</span>duck_type<span class="br0">&#40;</span>:&lt;&lt;<span class="br0">&#41;</span><span class="br0">&#41;</span>
    subject.<span class="me1">echo</span><span class="br0">&#40;</span><span class="kw3">Array</span>.<span class="kw5">new</span><span class="br0">&#41;</span>
    subject.<span class="me1">echo</span><span class="br0">&#40;</span><span class="kw3">String</span>.<span class="kw5">new</span><span class="br0">&#41;</span>
  <span class="br0">&#125;</span>
<span class="kw1">end</span></code></pre>

<p>Para ver mais exemplos, acesse <a rel="external" href="https://gist.github.com/45b97f90a83c8acf3f29">https://gist.github.com/45b97f90a83c8acf3f29</a>.</p>

<h3>before e after globais</h3>

<p>Muitas vezes precisamos preparar nosso ambiente antes de executarmos nossos testes. Quando isso precisa ser feito em mais de uma especificação, você pode diminuir a duplicação de código utilizando blocos globais.</p>

<p>No seu arquivo <code>spec_helper.rb</code>, você pode utilizar os métodos <code>append_before</code>, <code>append_after</code>, <code>prepend_before</code> e <code>prepend_after</code>.</p>

<pre class="rails"><code><span class="re2">Spec::Runner</span>.<span class="me1">configure</span> <span class="kw1">do</span> |config|
  config.<span class="me1">prepend_after</span> <span class="br0">&#123;</span> <span class="st0">`rm -rf some/path`</span> <span class="br0">&#125;</span>
<span class="kw1">end</span></code></pre>

<h3>Pending</h3>

<p>Em vez de comentar temporariamente exemplos que você não quer que sejam executados, você pode utilizar o método <code>pending</code>. O método <code>pending</code> pode ser utilizado nos blocos de <code>before</code>. Assim, todos os exemplos daquele contexto de <code>describe</code> serão automaticamente marcados como pendente.</p>

<pre class="rails"><code>describe <span class="st0">&quot;Pending examples&quot;</span> <span class="kw1">do</span>
  before <span class="kw1">do</span>
    pending
  <span class="kw1">end</span>
&nbsp;
  <span class="co1"># lots of examples</span>
<span class="kw1">end</span></code></pre>

<p>Você também pode deixar apenas um exemplo pendente.</p>

<pre class="rails"><code>describe <span class="st0">&quot;Pending examples&quot;</span> <span class="kw1">do</span>
  it <span class="st0">&quot;should be pending&quot;</span> <span class="kw1">do</span>
    pending <span class="st0">&quot;need to work on it&quot;</span>
    Env.<span class="me1">setup</span>!
  <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>

<p>Ou apenas uma parte dele.</p>

<pre class="rails"><code>describe <span class="st0">&quot;Pending examples&quot;</span> <span class="kw1">do</span>
  it <span class="st0">&quot;should be pending with a block&quot;</span> <span class="kw1">do</span>
    pending<span class="br0">&#40;</span><span class="st0">&quot;need to working on it as well&quot;</span><span class="br0">&#41;</span> <span class="kw1">do</span>
      Env.<span class="me1">setup</span>!
    <span class="kw1">end</span>
  <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>

<p>Uma outra alternativa (que não é deixar como pendente mas sim desabilitado) é utilizar o método <code>xit</code> em vez de <code>it</code>.</p>

<pre class="rails"><code>describe <span class="st0">&quot;Pending examples&quot;</span> <span class="kw1">do</span>
  xit <span class="st0">&quot;should be pending with alias&quot;</span> <span class="kw1">do</span>
    Env.<span class="me1">setup</span>!
  <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>

<h3>Matchers personalizados</h3>

<p>Sempre que você perceber que está repetindo um padrão na hora de escrever seus exemplos, automatize o processo criando novos matchers. O RSpec possui duas maneiras diferentes de fazer isso. A mais simples delas é utilizando o método <code>simple_matcher</code>. Crie um módulo chamado <code>TheAnswerMatchers</code> para adicionarmos novos matchers.</p>

<pre class="rails"><code><span class="kw1">module</span> TheAnswerMatchers
  <span class="kw1">def</span> be_the_answer
    simple_matcher <span class="kw1">do</span> |given, matcher|
      <span class="co1"># save some typing</span>
      the_answer = <span class="st0">&quot;the Answer to Life, the Universe, and Everything&quot;</span>
&nbsp;
      matcher.<span class="me1">description</span> = <span class="st0">&quot;be #{the_answer}&quot;</span>
      matcher.<span class="me1">failure_message</span> = <span class="st0">&quot;expected #{given.inspect} to be #{the_answer}&quot;</span>
      matcher.<span class="me1">negative_failure_message</span> = <span class="st0">&quot;expected #{given.inspect} not to be #{the_answer}&quot;</span>
      given == <span class="nu0">42</span>
    <span class="kw1">end</span>
  <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>

<p>Agora, basta fazer com que o RSpec reconheça esses novos matchers; é só incluir o módulo.</p>

<pre class="rails"><code><span class="re2">Spec::Runner</span>.<span class="me1">configure</span> <span class="kw1">do</span> |config|
  config.<span class="kw1">include</span> TheAnswerMatchers
<span class="kw1">end</span></code></pre>

<p>E para escrever seus exemplos, você pode usar o matcher <code>be_the_answer</code>:</p>

<pre class="rails"><code>describe <span class="st0">&quot;The Answer to Life, the Universe, and Everything&quot;</span> <span class="kw1">do</span>
  specify <span class="br0">&#123;</span> <span class="nu0">42</span>.<span class="me1">should</span> be_the_answer <span class="br0">&#125;</span>
  specify <span class="br0">&#123;</span> <span class="st0">&quot;the wrong answer&quot;</span>.<span class="me1">should_not</span> be_the_answer <span class="br0">&#125;</span>
<span class="kw1">end</span></code></pre>

<h3>Finalizando&#8230;</h3>

<p>Como você pode perceber, é bem simples escrever exemplos melhores no RSpec. Se você olhar as specs do RSpec, encontrará bastante coisa legal que você normalmente não veria (porque tem muita coisa para ler) no <a rel="external" href="http://rspec.rubyforge.org/rspec/1.2.9/">RDocs</a>.</p>

<p>E você, tem alguma dica para compartilhar?</p><img src="http://feeds.feedburner.com/~r/simplesideias/~4/l6HHG5kN_Ak" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://simplesideias.com.br/7-coisas-que-voce-precisa-conhecer-no-rspec/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://simplesideias.com.br/7-coisas-que-voce-precisa-conhecer-no-rspec/</feedburner:origLink></item>
		<item>
		<title>Ceará on Rails 2009: Testando Rails apps com RSpec</title>
		<link>http://feedproxy.google.com/~r/simplesideias/~3/kJT1g420OuI/</link>
		<comments>http://simplesideias.com.br/ceara-on-rails-2009-testando-rails-apps-com-rspec/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 23:31:46 +0000</pubDate>
		<dc:creator>Nando Vieira</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://simplesideias.com.br/?p=452</guid>
		<description><![CDATA[Acabei de fazer minha apresentação no Ceará on Rails, que foi um excelente evento!

Se você não pode comparacer, pode ver os slides



Gostaria de agradecer aos comentários positivos e, principalmente, aos organizadores. Keep on rockin&#8217;!]]></description>
			<content:encoded><![CDATA[<p>Acabei de fazer minha apresentação no <a href="http://cearaonrails.com.br">Ceará on Rails</a>, que foi um excelente evento!</p>

<p>Se você não pode comparacer, pode ver os <a href="http://www.slideshare.net/fnando/testando-rails-apps-com-rspec">slides</a></p>

<p><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=rspec-091107170547-phpapp02&amp;stripped_title=testando-rails-apps-com-rspec" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=rspec-091107170547-phpapp02&amp;stripped_title=testando-rails-apps-com-rspec" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></p>

<p>Gostaria de agradecer aos comentários positivos e, principalmente, aos organizadores. Keep on rockin&#8217;!</p><img src="http://feeds.feedburner.com/~r/simplesideias/~4/kJT1g420OuI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://simplesideias.com.br/ceara-on-rails-2009-testando-rails-apps-com-rspec/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://simplesideias.com.br/ceara-on-rails-2009-testando-rails-apps-com-rspec/</feedburner:origLink></item>
		<item>
		<title>Contrate o Nando Vieira</title>
		<link>http://feedproxy.google.com/~r/simplesideias/~3/8S7GHuYQTuY/</link>
		<comments>http://simplesideias.com.br/contrate-o-nando-vieira/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 12:40:48 +0000</pubDate>
		<dc:creator>Nando Vieira</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://simplesideias.com.br/?p=442</guid>
		<description><![CDATA[

Após um ano e meio de WebCo e, eventualmente, Abril Digital, chegou a hora de continuar meu caminho. Há alguns meses eu já não me divertia fazendo meu trabalho e acho que isso foi uma consequência. Fiz grandes amizades; algumas ainda estão lá, mas muitas outras já saíram. Espero poder trabalhar com essas pessoas novamente [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://m.simplesideias.com.br/for-hire.jpg" alt="For hire" class="align-right" /></p>

<p>Após um ano e meio de WebCo e, eventualmente, Abril Digital, chegou a hora de continuar meu caminho. Há alguns meses eu já não me divertia fazendo meu trabalho e acho que isso foi uma consequência. Fiz grandes amizades; algumas ainda estão lá, mas muitas outras já saíram. Espero poder trabalhar com essas pessoas novamente no futuro; sem dúvida, é disso que mais sentirei falta!</p>

<p>Como a vida continua, estou disponível para projetos em período integral. Se você tem algum projeto interessante e precisa de um profissional de alto nível em sua equipe, entre em contato através do e-mail/Google Talk <a href="&#109;a&#x69;&#108;&#x74;&#111;:&#x66;&#x6E;&#97;&#x6E;&#100;&#111;&#46;&#118;&#105;&#101;&#x69;&#114;&#x61;&#64;&#103;&#109;&#x61;&#x69;&#x6C;&#x2E;&#x63;&#111;&#x6D;">&#x66;&#x6E;&#97;&#x6E;&#100;&#111;&#46;&#118;&#105;&#101;&#x69;&#114;&#x61;&#64;&#103;&#109;&#x61;&#x69;&#x6C;&#x2E;&#x63;&#111;&#x6D;</a>. Aos que puderem encaminhar este post para pessoas que possam ter interesse em ter-me em suas equipes, um muito obrigado.</p><img src="http://feeds.feedburner.com/~r/simplesideias/~4/8S7GHuYQTuY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://simplesideias.com.br/contrate-o-nando-vieira/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://simplesideias.com.br/contrate-o-nando-vieira/</feedburner:origLink></item>
		<item>
		<title>Rails Summit: O que mudou no Ruby 1.9</title>
		<link>http://feedproxy.google.com/~r/simplesideias/~3/OTMXZswz1Yw/</link>
		<comments>http://simplesideias.com.br/rails-summit-o-que-mudou-no-ruby-1-9/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 22:02:34 +0000</pubDate>
		<dc:creator>Nando Vieira</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://simplesideias.com.br/?p=436</guid>
		<description><![CDATA[Hoje fiz minha palestra no Rails Summit 2009 e falei sobre o que mudou no Ruby 1.9. Foi bem legal e tinha bastante gente!

Em um dos slides eu disse que era possível ter algo como

def color&#40;type=:hex, *values&#41;
end

Obviamente, isso não funciona e eu falei besteira das grandes! Os valores que o splat irá agrupar, sempre excluirá [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje fiz minha palestra no <a href="http://railssummit.com.br" rel="external">Rails Summit 2009</a> e falei sobre o que mudou no Ruby 1.9. Foi bem legal e tinha bastante gente!</p>

<p>Em um dos slides eu disse que era possível ter algo como</p>

<pre class="ruby"><code><span class="kw1">def</span> color<span class="br0">&#40;</span>type=:hex, *values<span class="br0">&#41;</span>
<span class="kw1">end</span></code></pre>

<p>Obviamente, isso não funciona e eu falei besteira das grandes! Os valores que o splat irá agrupar, sempre excluirá o primeiro item definindo a variável <code>type</code>. Duhhhh&#8230; O que eu provavelmente queria ter dito era algo como isso</p>

<pre class="ruby"><code><span class="kw1">def</span> color<span class="br0">&#40;</span>type=:hex, value<span class="br0">&#41;</span>
<span class="kw1">end</span>
&nbsp;
color<span class="br0">&#40;</span><span class="re3">:rgb</span>, <span class="br0">&#91;</span><span class="nu0">255</span>, <span class="nu0">255</span>, <span class="nu0">255</span><span class="br0">&#93;</span><span class="br0">&#41;</span>
color<span class="br0">&#40;</span><span class="st0">&quot;#fff&quot;</span><span class="br0">&#41;</span></code></pre>

<p>De qualquer modo, definir valores-padrão em qualquer ordem é uma funcionalidade interessante, mas que deve ser utilizada com cuidado!</p>

<p>Se você não pode assistir minha palestra, pode pelo menos ver os <a href="http://www.slideshare.net/fnando/o-que-mudou-no-ruby-19">slides</a>! :)</p>

<object style="margin:0px" width="425" height="355">
	<param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=o-que-mudou-no-ruby-19-091014165013-phpapp02&amp;rel=0&amp;stripped_title=o-que-mudou-no-ruby-19" />
	<param name="allowFullScreen" value="true"/>
	<param name="allowScriptAccess" value="always"/>
	<embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=o-que-mudou-no-ruby-19-091014165013-phpapp02&amp;rel=0&amp;stripped_title=o-que-mudou-no-ruby-19" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed>
</object>

<p>O PDF <a href="http://howtocode.com.br/o-que-mudou-no-ruby-19" rel="external">O que mudou no Ruby 1.9</a> pode ser comprado por apenas <strong>R$7,00</strong>. Aproveite pois é por tempo limitado e volta ao preço normal à partir de 16/10/2009!</p>

<p>PS: Infelizmente, tive que sair correndo na hora do almoço porque minha esposa, que está grávida, não estava passando bem e tivemos que correr para o hospital. Ela já está se sentindo melhor!</p>
<img src="http://feeds.feedburner.com/~r/simplesideias/~4/OTMXZswz1Yw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://simplesideias.com.br/rails-summit-o-que-mudou-no-ruby-1-9/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://simplesideias.com.br/rails-summit-o-que-mudou-no-ruby-1-9/</feedburner:origLink></item>
		<item>
		<title>PDF - O que mudou no Ruby 1.9</title>
		<link>http://feedproxy.google.com/~r/simplesideias/~3/dcxdHONc_jY/</link>
		<comments>http://simplesideias.com.br/pdf-o-que-mudou-no-ruby-1-9/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 16:05:41 +0000</pubDate>
		<dc:creator>Nando Vieira</dc:creator>
				<category><![CDATA[HOWTO]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[ruby 1.9]]></category>

		<guid isPermaLink="false">http://simplesideias.com.br/?p=431</guid>
		<description><![CDATA[


	Acabei de publicar o próximo PDF da série HOWTO: O que mudou no Ruby 1.9.



	Este guia de 50 páginas mostra o que foi adicionado no Ruby 1.9 e o que deixou de funcionar. O conteúdo é direto e sem enrolações, com muitos exemplos. A revisão do conteúdo foi feita pelo Luiz Rocha.



	O PDF pode ser [...]]]></description>
			<content:encoded><![CDATA[<p class="align-right"><img src="http://m.simplesideias.com.br/howto-o-que-mudou-no-ruby-19.png" alt="" /></p>

<p>
	Acabei de publicar o próximo <span class="caps">PDF</span> da série <a href="http://howtocode.com.br"><span class="caps">HOWTO</span></a>: <a href="http://howtocode.com.br/o-que-mudou-no-ruby-1-9">O que mudou no Ruby 1.9</a>.
</p>

<p>
	Este guia de <strong>50 páginas</strong> mostra o que foi adicionado no Ruby 1.9 e o que deixou de funcionar. O conteúdo é direto e sem enrolações, com muitos exemplos. A revisão do conteúdo foi feita pelo <a href="http://lsdr.net" rel="external">Luiz Rocha</a>.
</p>

<p>
	O PDF pode ser comprado por apenas R$10,00 e o pagamento pode ser feito pelo <a href="https://pagseguro.uol.com.br/?ind=689659" rel="external">PagSeguro</a>. 
	Acesse <a href="http://howtocode.com.br/o-que-mudou-no-ruby-1-9">http://howtocode.com.br/o-que-mudou-no-ruby-1-9</a> 
	e veja mais informações.
</p>
<img src="http://feeds.feedburner.com/~r/simplesideias/~4/dcxdHONc_jY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://simplesideias.com.br/pdf-o-que-mudou-no-ruby-1-9/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://simplesideias.com.br/pdf-o-que-mudou-no-ruby-1-9/</feedburner:origLink></item>
		<item>
		<title>Benchmark entre RSpec e Shoulda</title>
		<link>http://feedproxy.google.com/~r/simplesideias/~3/WFo9Z6sNwLE/</link>
		<comments>http://simplesideias.com.br/benchmark-entre-rspec-e-shoulda/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 19:25:39 +0000</pubDate>
		<dc:creator>Nando Vieira</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Benchmark]]></category>
		<category><![CDATA[Factory Girl]]></category>
		<category><![CDATA[RSpec]]></category>
		<category><![CDATA[Shoulda]]></category>

		<guid isPermaLink="false">http://simplesideias.com.br/?p=413</guid>
		<description><![CDATA[Em um projeto que estou trabalhando atualmente, a suíte de testes (que utiliza Shoulda e Factory Girl) demora aproximadamente 26 minutos para ser executada. Esse tempo de execução é extremamente inaceitável, já que uma das premissas do Test-Driven Development é que sua suíte de testes seja executada o mais rápido possível!

Sem nenhum embasamento, sempre achei [...]]]></description>
			<content:encoded><![CDATA[<p>Em um projeto que estou trabalhando atualmente, a suíte de testes (que utiliza <a rel="external" href="http://github.com/thoughtbot/shoulda/tree/master">Shoulda</a> e <a rel="external" href="http://github.com/thoughtbot/factory_girl/tree/master">Factory Girl</a>) demora aproximadamente 26 minutos para ser executada. Esse tempo de execução é extremamente inaceitável, já que uma das premissas do Test-Driven Development é que sua suíte de testes seja executada o mais rápido possível!</p>

<p>Sem nenhum embasamento, sempre achei que o tempo excessivo se dava ao uso do Factory Girl, devido sua interação com o banco de dados. Hoje, decidi tirar a prova e fiquei surpreso com alguns números obtidos em um benchmark entre <a rel="external" href="http://github.com/dchelimsky/rspec/">RSpec</a> e Shoulda, como você pode conferir abaixo.</p>

<h3>Preparando o ambiente</h3>

<p>O primeiro passo, foi criar um aplicativo novo com apenas um único modelo chamado <code>Post</code>.</p>

<pre class="rails"><code><span class="kw1">class</span> CreatePosts &lt; <span class="re2">ActiveRecord::Migration</span>
  <span class="kw1">def</span> <span class="kw2">self</span>.<span class="me1">up</span>
    create_table <span class="re3">:posts</span> <span class="kw1">do</span> |t|
      t.<span class="me1">string</span> <span class="re3">:title</span>
      t.<span class="me1">text</span> <span class="re3">:content</span>
&nbsp;
      t.<span class="me1">timestamps</span>
    <span class="kw1">end</span>
  <span class="kw1">end</span>
&nbsp;
  <span class="kw1">def</span> <span class="kw2">self</span>.<span class="me1">down</span>
    drop_table <span class="re3">:posts</span>
  <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>

<p>Antes de realizar o benchmark, foram executados os comandos <code>rake db:migrate</code> e <code>rake db:test:prepare</code>.
Depois, foram criados branches específicos para cada um dos testes.</p>

<p>Foram realizados 4 tipos de teste:</p>

<ul>
	<li>Shoulda com Factory Girl</li>
	<li>Shoulda sem Factory Girl</li>
	<li>RSpec com Factory Girl</li>
	<li>RSpec sem Factory Girl</li>
</ul>

<p>Todos os testes acima foram executados no Ruby 1.8.7 (2009-06-08 patchlevel 173) e Ruby 1.9.1 ruby 1.9.1 (2009-07-16 p243 revision 24175) com Rails 2.3.3.
Os tempos foram obtidos utilizando o comando <code>time</code> ao executar a rake task padrão com o comando <code>time rake</code>.</p>

<p>Veja abaixo como foram os testes realizados.</p>

<h4>Shoulda com Factory Girl</h4>

<p>A primeira medição foi feita utilizando Shoulda com Factory Girl. Para criar o objeto, foi utilizada a factory abaixo.</p>

<pre class="rails"><code>Factory.<span class="me1">define</span> <span class="re3">:post</span> <span class="kw1">do</span> |f|
  f.<span class="me1">title</span> <span class="st0">&quot;Lorem ipsum dolor sit amet&quot;</span>
  f.<span class="me1">content</span> <span class="st0">&quot;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do 
            eiusmod tempor incididunt ut labore et dolore magna aliqua.&quot;</span>
<span class="kw1">end</span>
&nbsp;
<span class="kw1">class</span> PostTest &lt; <span class="re2">ActiveSupport::TestCase</span>
  context <span class="st0">&quot;Post with defaults&quot;</span> <span class="kw1">do</span>
    setup <span class="kw1">do</span>
      <span class="re1">@post</span> = Factory<span class="br0">&#40;</span><span class="re3">:post</span><span class="br0">&#41;</span>
    <span class="kw1">end</span>
&nbsp;
    10_000.<span class="me1">times</span> <span class="kw1">do</span> |i|
    should <span class="st0">&quot;do assertion #{i}&quot;</span> <span class="kw1">do</span>
        <span class="kw5">assert_equal</span> <span class="re1">@post</span>.<span class="me1">title</span>, <span class="st0">&quot;Lorem ipsum dolor sit amet&quot;</span>
      <span class="kw1">end</span>
    <span class="kw1">end</span>
  <span class="kw1">end</span>
&nbsp;
  context <span class="st0">&quot;Post with custom title&quot;</span> <span class="kw1">do</span>
    setup <span class="kw1">do</span>
      <span class="re1">@post</span> = Factory<span class="br0">&#40;</span><span class="re3">:post</span>, <span class="re3">:title</span> =&gt; <span class="st0">&quot;Lorem ipsum dolor sit amet FTW&quot;</span><span class="br0">&#41;</span>
    <span class="kw1">end</span>
&nbsp;
    10_000.<span class="me1">times</span> <span class="kw1">do</span> |i|
      should <span class="st0">&quot;do assertion #{i}&quot;</span> <span class="kw1">do</span>
        <span class="kw5">assert_equal</span> <span class="re1">@post</span>.<span class="me1">title</span>, <span class="st0">&quot;Lorem ipsum dolor sit amet FTW&quot;</span>
      <span class="kw1">end</span>
    <span class="kw1">end</span>
  <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>

<h4>Shoulda sem Factory Girl</h4>

<p>Os testes sem Factory Girl utilizaram a abordagem de se ter um método para criar o objeto.</p>

<pre class="rails"><code><span class="kw1">class</span> PostTest &lt; <span class="re2">ActiveSupport::TestCase</span>
  context <span class="st0">&quot;Post with defaults&quot;</span> <span class="kw1">do</span>
    setup <span class="kw1">do</span>
      <span class="re1">@post</span> = create_post
    <span class="kw1">end</span>
&nbsp;
    10_000.<span class="me1">times</span> <span class="kw1">do</span> |i|
      should <span class="st0">&quot;do assertion #{i}&quot;</span> <span class="kw1">do</span>
        <span class="kw5">assert_equal</span> <span class="re1">@post</span>.<span class="me1">title</span>, <span class="st0">&quot;Lorem ipsum dolor sit amet&quot;</span>
      <span class="kw1">end</span>
    <span class="kw1">end</span>
  <span class="kw1">end</span>
&nbsp;
  context <span class="st0">&quot;Post with custom title&quot;</span> <span class="kw1">do</span>
    setup <span class="kw1">do</span>
      <span class="re1">@post</span> = create_post<span class="br0">&#40;</span><span class="re3">:title</span> =&gt; <span class="st0">&quot;Lorem ipsum dolor sit amet FTW&quot;</span><span class="br0">&#41;</span>
    <span class="kw1">end</span>
&nbsp;
    10_000.<span class="me1">times</span> <span class="kw1">do</span> |i|
      should <span class="st0">&quot;do assertion #{i}&quot;</span> <span class="kw1">do</span>
        <span class="kw5">assert_equal</span> <span class="re1">@post</span>.<span class="me1">title</span>, <span class="st0">&quot;Lorem ipsum dolor sit amet FTW&quot;</span>
      <span class="kw1">end</span>
    <span class="kw1">end</span>
  <span class="kw1">end</span>
&nbsp;
  private
    <span class="kw1">def</span> create_post<span class="br0">&#40;</span>options=<span class="br0">&#123;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>
      Post.<span class="me1">create</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
        <span class="re3">:title</span> =&gt; <span class="st0">&quot;Lorem ipsum dolor sit amet&quot;</span>,
        <span class="re3">:content</span> =&gt; <span class="st0">&quot;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do 
                    eiusmod tempor incididunt ut labore et dolore magna aliqua.&quot;</span>
      <span class="br0">&#125;</span>.<span class="me1">merge</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>

<h4>RSpec com Factory Girl</h4>

<p>Para testar o RSpec com Factory Gir, foi utilizado o código abaixo.</p>

<pre class="rails"><code>describe Post <span class="kw1">do</span>
  describe <span class="st0">&quot;with defaults&quot;</span> <span class="kw1">do</span>
    before <span class="kw1">do</span>
      <span class="re1">@post</span> = Factory<span class="br0">&#40;</span><span class="re3">:post</span><span class="br0">&#41;</span>
    <span class="kw1">end</span>
&nbsp;
    10_000.<span class="me1">times</span> <span class="kw1">do</span> |i|
      it <span class="st0">&quot;should do assertion #{i}&quot;</span> <span class="kw1">do</span>
        <span class="re1">@post</span>.<span class="me1">title</span>.<span class="me1">should</span> == <span class="st0">&quot;Lorem ipsum dolor sit amet&quot;</span>
      <span class="kw1">end</span>
    <span class="kw1">end</span>
  <span class="kw1">end</span>
&nbsp;
  describe <span class="st0">&quot;with custom title&quot;</span> <span class="kw1">do</span>
    before <span class="kw1">do</span>
      <span class="re1">@post</span> = Factory<span class="br0">&#40;</span><span class="re3">:post</span>, <span class="re3">:title</span> =&gt; <span class="st0">&quot;Lorem ipsum dolor sit amet FTW&quot;</span><span class="br0">&#41;</span>
    <span class="kw1">end</span>
&nbsp;
    10_000.<span class="me1">times</span> <span class="kw1">do</span> |i|
      it <span class="st0">&quot;should do assertion #{i}&quot;</span> <span class="kw1">do</span>
        <span class="re1">@post</span>.<span class="me1">title</span>.<span class="me1">should</span> == <span class="st0">&quot;Lorem ipsum dolor sit amet FTW&quot;</span>
      <span class="kw1">end</span>
    <span class="kw1">end</span>
  <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>


<h4>RSpec sem Factory Girl</h4>

<p>E aqui vão os testes escritos para RSpec sem utilizar o Factory Girl.</p>

<pre class="rails"><code>describe Post <span class="kw1">do</span>
  describe <span class="st0">&quot;with defaults&quot;</span> <span class="kw1">do</span>
    before <span class="kw1">do</span>
      <span class="re1">@post</span> = create_post
    <span class="kw1">end</span>
&nbsp;
    10_000.<span class="me1">times</span> <span class="kw1">do</span> |i|
      it <span class="st0">&quot;should do assertion #{i}&quot;</span> <span class="kw1">do</span>
        <span class="re1">@post</span>.<span class="me1">title</span>.<span class="me1">should</span> == <span class="st0">&quot;Lorem ipsum dolor sit amet&quot;</span>
      <span class="kw1">end</span>
    <span class="kw1">end</span>
  <span class="kw1">end</span>
&nbsp;
  describe <span class="st0">&quot;with custom title&quot;</span> <span class="kw1">do</span>
    before <span class="kw1">do</span>
      <span class="re1">@post</span> = create_post<span class="br0">&#40;</span><span class="re3">:title</span> =&gt; <span class="st0">&quot;Lorem ipsum dolor sit amet FTW&quot;</span><span class="br0">&#41;</span>
    <span class="kw1">end</span>
&nbsp;
    10_000.<span class="me1">times</span> <span class="kw1">do</span> |i|
      it <span class="st0">&quot;should do assertion #{i}&quot;</span> <span class="kw1">do</span>
        <span class="re1">@post</span>.<span class="me1">title</span>.<span class="me1">should</span> == <span class="st0">&quot;Lorem ipsum dolor sit amet FTW&quot;</span>
      <span class="kw1">end</span>
    <span class="kw1">end</span>
  <span class="kw1">end</span>
&nbsp;
  private
    <span class="kw1">def</span> create_post<span class="br0">&#40;</span>options=<span class="br0">&#123;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>
      Post.<span class="me1">create</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
        <span class="re3">:title</span> =&gt; <span class="st0">&quot;Lorem ipsum dolor sit amet&quot;</span>,
        <span class="re3">:content</span> =&gt; <span class="st0">&quot;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do 
                    eiusmod tempor incididunt ut labore et dolore magna aliqua.&quot;</span>
      <span class="br0">&#125;</span>.<span class="me1">merge</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>

<h4>Test::Unit com Factory Girl</h4>

<pre class="rails"><code><span class="kw1">class</span> PostTest &lt; <span class="re2">ActiveSupport::TestCase</span>
  <span class="kw1">def</span> setup
    <span class="re1">@post</span> = Factory<span class="br0">&#40;</span><span class="re3">:post</span><span class="br0">&#41;</span>
  <span class="kw1">end</span>
&nbsp;
  10_000.<span class="me1">times</span> <span class="kw1">do</span> |i|
    <span class="kw2">self</span>.<span class="me1">class_eval</span> &lt;&lt;-TXT
      <span class="kw1">def</span> test_assertion_<span class="co1">#{i}</span>
        <span class="kw5">assert_equal</span> <span class="re1">@post</span>.<span class="me1">title</span>, <span class="st0">&quot;Lorem ipsum dolor sit amet&quot;</span>
      <span class="kw1">end</span>
    TXT
  <span class="kw1">end</span>
<span class="kw1">end</span>
&nbsp;
<span class="kw1">class</span> PostWithCustomTitleTest &lt; <span class="re2">ActiveSupport::TestCase</span>
  <span class="kw1">def</span> setup
    <span class="re1">@post</span> = Factory<span class="br0">&#40;</span><span class="re3">:post</span>, <span class="re3">:title</span> =&gt; <span class="st0">&quot;Lorem ipsum dolor sit amet FTW&quot;</span><span class="br0">&#41;</span>
  <span class="kw1">end</span>
&nbsp;
  10_000.<span class="me1">times</span> <span class="kw1">do</span> |i|
    <span class="kw2">self</span>.<span class="me1">class_eval</span> &lt;&lt;-TXT
      <span class="kw1">def</span> test_assertion_<span class="co1">#{i}</span>
        <span class="kw5">assert_equal</span> <span class="re1">@post</span>.<span class="me1">title</span>, <span class="st0">&quot;Lorem ipsum dolor sit amet FTW&quot;</span>
      <span class="kw1">end</span>
    TXT
  <span class="kw1">end</span>
en</code></pre>

<h4>Test::Unit sem Factory Girl</h4>

<pre class="rails"><code><span class="kw1">class</span> PostTest &lt; <span class="re2">ActiveSupport::TestCase</span>
  <span class="kw1">def</span> setup
    <span class="re1">@post</span> = create_post
  <span class="kw1">end</span>
&nbsp;
  10_000.<span class="me1">times</span> <span class="kw1">do</span> |i|
    <span class="kw2">self</span>.<span class="me1">class_eval</span> &lt;&lt;-TXT
      <span class="kw1">def</span> test_assertion_<span class="co1">#{i}</span>
        <span class="kw5">assert_equal</span> <span class="re1">@post</span>.<span class="me1">title</span>, <span class="st0">&quot;Lorem ipsum dolor sit amet&quot;</span>
      <span class="kw1">end</span>
    TXT
  <span class="kw1">end</span>
&nbsp;
  private
    <span class="kw1">def</span> create_post<span class="br0">&#40;</span>options=<span class="br0">&#123;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>
      Post.<span class="me1">create</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
        <span class="re3">:title</span> =&gt; <span class="st0">&quot;Lorem ipsum dolor sit amet&quot;</span>,
        <span class="re3">:content</span> =&gt; <span class="st0">&quot;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do 
                    eiusmod tempor incididunt ut labore et dolore magna aliqua.&quot;</span>
      <span class="br0">&#125;</span>.<span class="me1">merge</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="kw1">end</span>
<span class="kw1">end</span>
&nbsp;
<span class="kw1">class</span> PostWithCustomTitleTest &lt; <span class="re2">ActiveSupport::TestCase</span>
  <span class="kw1">def</span> setup
    <span class="re1">@post</span> = create_post<span class="br0">&#40;</span><span class="re3">:title</span> =&gt; <span class="st0">&quot;Lorem ipsum dolor sit amet FTW&quot;</span><span class="br0">&#41;</span>
  <span class="kw1">end</span>
&nbsp;
  10_000.<span class="me1">times</span> <span class="kw1">do</span> |i|
    <span class="kw2">self</span>.<span class="me1">class_eval</span> &lt;&lt;-TXT
      <span class="kw1">def</span> test_assertion_<span class="co1">#{i}</span>
        <span class="kw5">assert_equal</span> <span class="re1">@post</span>.<span class="me1">title</span>, <span class="st0">&quot;Lorem ipsum dolor sit amet FTW&quot;</span>
      <span class="kw1">end</span>
    TXT
  <span class="kw1">end</span>
&nbsp;
  private
    <span class="kw1">def</span> create_post<span class="br0">&#40;</span>options=<span class="br0">&#123;</span><span class="br0">&#125;</span><span class="br0">&#41;</span>
      Post.<span class="me1">create</span><span class="br0">&#40;</span><span class="br0">&#123;</span>
        <span class="re3">:title</span> =&gt; <span class="st0">&quot;Lorem ipsum dolor sit amet&quot;</span>,
        <span class="re3">:content</span> =&gt; <span class="st0">&quot;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do 
                    eiusmod tempor incididunt ut labore et dolore magna aliqua.&quot;</span>
      <span class="br0">&#125;</span>.<span class="me1">merge</span><span class="br0">&#40;</span>options<span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="kw1">end</span>
<span class="kw1">end</span></code></pre>

<h3>Resultados</h3>

<p>Antes de mostrar os resultados, quero dizer que fiquei extremamente impressionado com os resultados obtidos com Shoulda no Ruby 1.9.1; houve uma diminuição de pelo menos 5 minutos em relação ao mesmo teste executado no Ruby 1.8.7. No caso do RSpec, não houve diferença significativa.</p>

<p>O Test::Unit saiu em desvantagem nesse benchmark; para adicionar os testes, foi utilizado o método <code>class_eval</code>, que é uma operação bastante dispendiosa.</p>

<p>E se você não aguenta mais esperar pelos números, aqui vão eles:</p>

<table>
	<thead>
		<tr>
			<th></th>
			<th>Ruby 1.8.7</th>
			<th>Ruby 1.9.1</th>
		</tr>
	</thead>
	
	<tbody>
		<tr>
			<th>Rspec com Factory Girl</th>
			<td>1m35.028s</td>
			<td>1m10.277s</td>
		</tr>
		
		<tr>
			<th>Rspec sem Factory Girl</th>
			<td>1m36.353s</td>
			<td>1m11.002s</td>
		</tr>
		
		<tr>
			<th>Shoulda com Factory Girl</th>
			<td>8m20.456s</td>
			<td>3m33.408s</td>
		</tr>
		
		<tr>
			<th>Shoulda sem Factory Girl</th>
			<td>8m35.973s</td>
			<td>3m35.687s</td>
		</tr>
		
		<tr>
			<th>Test::Unit com Factory Girl</th>
			<td>1m38.559s</td>
			<td>1m39.538s</td>
		</tr>
		
		<tr>
			<th>Test::Unit sem Factory Girl</th>
			<td>1m38.944s</td>
			<td>1m40.026s</td>
		</tr>
	</tbody>
</table>

<p>Como eu jamais podia esperar, o Shoulda é o problema e não o Factory Girl! Embora eu acredite que a implementação do Shoulda seja infinitamente mais simples que a do RSpec, ela consegue ser muito mais lenta!</p>

<p>Pessoalmente, nunca usei o Shoulda em meus projetos pessoais. E, com certeza, não será agora que irei utilizá-lo!</p>

<p>Se quiser adicionar algum benchmark, veja o código utilizado nestes testes no Github: <a href="http://github.com/fnando/benchmark-rspec-shoulda/" rel="external">http://github.com/fnando/benchmark-rspec-shoulda/</a>.</p>

<p>
	<strong>Update:</strong> Adicionei os tempos para os testes usando Test::Unit.
</p><img src="http://feeds.feedburner.com/~r/simplesideias/~4/WFo9Z6sNwLE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://simplesideias.com.br/benchmark-entre-rspec-e-shoulda/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		<feedburner:origLink>http://simplesideias.com.br/benchmark-entre-rspec-e-shoulda/</feedburner:origLink></item>
		<item>
		<title>Tipos básicos no Ruby</title>
		<link>http://feedproxy.google.com/~r/simplesideias/~3/dkoUJlIo9v0/</link>
		<comments>http://simplesideias.com.br/tipos-basicos-no-ruby/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 14:06:43 +0000</pubDate>
		<dc:creator>Nando Vieira</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://simplesideias.com.br/?p=410</guid>
		<description><![CDATA[Alguns dos tipos básicos do Ruby possuem atalhos para definir valores como strings e arrays, por exemplo. Uma coisa muita gente não sabe, é a diferença entre os diversos tipos de atalhos, como você poderá conferir abaixo.

Strings
Existem cinco maneiras diferentes de se definir uma string no Ruby.

string = &#34;Ruby is awesome!&#34;
string = 'Ruby is awesome!'
string [...]]]></description>
			<content:encoded><![CDATA[<p>Alguns dos tipos básicos do Ruby possuem atalhos para definir valores como strings e arrays, por exemplo. Uma coisa muita gente não sabe, é a diferença entre os diversos tipos de atalhos, como você poderá conferir abaixo.</p>

<h3>Strings</h3>
<p>Existem cinco maneiras diferentes de se definir uma string no Ruby.</p>

<pre class="ruby"><code><span class="kw3">string</span> = <span class="st0">&quot;Ruby is awesome!&quot;</span>
<span class="kw3">string</span> = <span class="st0">'Ruby is awesome!'</span>
<span class="kw3">string</span> = %q<span class="br0">&#40;</span>Ruby is awesome!<span class="br0">&#41;</span>
<span class="kw3">string</span> = %Q<span class="br0">&#40;</span>Ruby is awesome!<span class="br0">&#41;</span>
<span class="kw3">string</span> = &lt;&lt;-TXT
Ruby is awesome!
TXT</code></pre>

<p>O que difere uma das outras é a capacidade de se interpolar código Ruby na string.</p>

<pre class="ruby"><code>lang = <span class="st0">&quot;Ruby&quot;</span>
&nbsp;
<span class="kw3">puts</span> <span class="st0">&quot;#{lang} is awesome!&quot;</span>
<span class="co1"># =&gt; Ruby is awesome!</span>
&nbsp;
<span class="kw3">puts</span> <span class="st0">'#{lang} is awesome!'</span>
<span class="co1"># =&gt; #{lang} is awesome!</span>
&nbsp;
<span class="kw3">puts</span> %Q<span class="br0">&#40;</span><span class="co1">#{lang} is awesome!)</span>
<span class="co1"># =&gt; Ruby is awesome!</span>
&nbsp;
<span class="kw3">puts</span> %q<span class="br0">&#40;</span><span class="co1">#{lang} is awesome!)</span>
<span class="co1"># =&gt; #{lang} is awesome!</span>
&nbsp;
<span class="kw3">puts</span> &lt;&lt;-TXT
<span class="co1">#{lang} is awesome!</span>
TXT
<span class="co1"># =&gt; Ruby is awesome!</span></code></pre>

<h3>Arrays</h3>
<p>O Array também possui formas diferentes de instanciação.</p>

<pre class="ruby"><code>items = <span class="br0">&#91;</span><span class="st0">&quot;Ruby&quot;</span>, <span class="st0">&quot;is&quot;</span>, <span class="st0">&quot;awesome!&quot;</span><span class="br0">&#93;</span>
items = %w<span class="br0">&#40;</span>Ruby is awesome!<span class="br0">&#41;</span>
items = %W<span class="br0">&#40;</span>Ruby is awesome!<span class="br0">&#41;</span></code></pre>

<p>E de forma similar, a diferença entre as duas últimas formas é a interpolação de código Ruby.</p>

<pre class="ruby"><code>lang = <span class="st0">&quot;Ruby&quot;</span>
&nbsp;
items = %w<span class="br0">&#40;</span><span class="co1">#{lang} is awesome!)</span>
<span class="co1"># =&gt; [&quot;\#{lang}&quot;, &quot;is&quot;, &quot;awesome!&quot;]</span>
&nbsp;
items = %W<span class="br0">&#40;</span><span class="co1">#{lang} is awesome!)</span>
<span class="co1"># =&gt; [&quot;Ruby&quot;, &quot;is&quot;, &quot;awesome!&quot;]</span></code></pre>

<h3>Expressões regulares</h3>
<p>Expressões regulares podem ser definidas de três formas diferentes.</p>

<pre class="ruby"><code>regex = /ruby/sim
regex = %r<span class="br0">&#40;</span>ruby<span class="br0">&#41;</span>sim
regex = <span class="kw4">Regexp</span>.<span class="me1">new</span><span class="br0">&#40;</span><span class="st0">&quot;ruby&quot;</span>, <span class="re2">Regexp::MULTILINE</span>|<span class="re2">Regexp::IGNORECASE</span>|<span class="re2">Regexp::EXTENDED</span><span class="br0">&#41;</span></code></pre>

<p>Não existem diferenças na execução das expressões regulares; na prática, se sua expressão possui muitas aspas, é interessante usar o atalho <code>%r()</code>.</p>

<h3>Comandos Shell</h3>
<p>A execução de comandos Shell pode ser feita de três maneiras diferentes.</p>

<pre class="ruby"><code><span class="st0">`pwd`</span>
%x<span class="br0">&#40;</span>pwd<span class="br0">&#41;</span>
<span class="kw3">system</span> <span class="st0">&quot;pwd&quot;</span></code></pre>

<p>A única diferença prática é que o método <code>system</code> irá enviar o resultado para <code>STDOUT</code>, enquanto <code>%x(pwd)</code> e <code>`pwd`</code> irão retornar a resposta da execução.</p>
<img src="http://feeds.feedburner.com/~r/simplesideias/~4/dkoUJlIo9v0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://simplesideias.com.br/tipos-basicos-no-ruby/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://simplesideias.com.br/tipos-basicos-no-ruby/</feedburner:origLink></item>
		<item>
		<title>Rails Application Templates - PDF Grátis!</title>
		<link>http://feedproxy.google.com/~r/simplesideias/~3/8QoOIimTw8g/</link>
		<comments>http://simplesideias.com.br/rails-application-templates-pdf-gratis/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 22:48:12 +0000</pubDate>
		<dc:creator>Nando Vieira</dc:creator>
				<category><![CDATA[HOWTO]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[PDF]]></category>

		<guid isPermaLink="false">http://simplesideias.com.br/?p=401</guid>
		<description><![CDATA[


Lembra aquela pesquisa que fiz há um tempo atrás? Este é o resultado! Acabei de publicar o primeiro PDF de uma série chamada HOWTO: Rails Application Templates.


Neste tutorial você aprenderá como criar templates para personalizar seu aplicativo e evitar todo aquele trabalho manual e chato de aplicativos criados do zero.


Como ainda estou estudando a melhor [...]]]></description>
			<content:encoded><![CDATA[<p class="align-right"><img src="http://m.simplesideias.com.br/howto-rails-application-templates.png" alt="" /></p>


<p>Lembra aquela <a href="http://simplesideias.com.br/pesquisa/">pesquisa</a> que fiz há um tempo atrás? Este é o resultado! Acabei de publicar o primeiro <span class="caps">PDF</span> de uma série chamada <a href="http://howto.simplesideias.com.br"><span class="caps">HOWTO</span></a>: <a href="http://howto.simplesideias.com.br/rails-application-templates">Rails Application Templates</a>.</p>


<p>Neste tutorial você aprenderá como criar templates para personalizar seu aplicativo e evitar todo aquele trabalho manual e chato de aplicativos criados do zero.</p>


<p>Como ainda estou estudando a melhor forma de gerar e gerenciar o conteúdo, iniciei com uma publicação mais simples e, o que é melhor, totalmente gratuita!</p>


<p>Para fazer o download, acesse <a href="http://howto.simplesideias.com.br/rails-application-templates">http://howto.simplesideias.com.br/rails-application-templates</a></p>
<img src="http://feeds.feedburner.com/~r/simplesideias/~4/8QoOIimTw8g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://simplesideias.com.br/rails-application-templates-pdf-gratis/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://simplesideias.com.br/rails-application-templates-pdf-gratis/</feedburner:origLink></item>
	</channel>
</rss>
