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

<channel>
	<title>Ruby Vault &#187; Projects</title>
	<atom:link href="http://www.tbueno.com/blog/category/projects/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tbueno.com/blog</link>
	<description>Explorando o maravilhoso mundo de Ruby</description>
	<lastBuildDate>Tue, 24 Aug 2010 03:02:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Leitor de RSS Feito Com Ruby e Sinatra</title>
		<link>http://www.tbueno.com/blog/ruby/2009/04/leitor-de-rss-feito-com-ruby-e-sinatra/</link>
		<comments>http://www.tbueno.com/blog/ruby/2009/04/leitor-de-rss-feito-com-ruby-e-sinatra/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 02:51:32 +0000</pubDate>
		<dc:creator>bueno</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>
		<category><![CDATA[Haml]]></category>
		<category><![CDATA[Rss]]></category>

		<guid isPermaLink="false">http://www.tbueno.com/blog/?p=140</guid>
		<description><![CDATA[Após o meu primeiro post/tutorial que descreveu como criar uma párgina de perfil usando Sinatra, Haml e Sass, vou me aprofundar mais no tema criando uma outra aplicação de exemplo que explora melhor os conceitos por trás do Sinatra. O exemplo anterior se resumia a simples GETs Http, mas nós sabemos que aplicações web são [...]]]></description>
			<content:encoded><![CDATA[<p>Após o meu primeiro post/tutorial que descreveu como criar uma párgina de perfil usando Sinatra, Haml e Sass, vou me aprofundar mais no tema criando uma outra aplicação de exemplo que explora melhor os conceitos por trás do Sinatra.</p>
<p>O exemplo anterior se resumia a simples GETs Http, mas nós sabemos que aplicações web são muito mais que isso, não é?</p>
<p>Então vamos ao que interessa.</p>
<p>Pré-Requisitos e Preparativos</p>
<p>Será necessário a instalação do sqlite3 em seu computador. Os passos para fazer isso fogem do escopo deste tutorial, mas você não encontrará dificuldades para esse procedimento(usuários de mac não precisam). Após a instalação, crie via linha de comando uma database, como no exemplo abaixo:</p>
<p><em>sqlite3 blue_eyes</em></p>
<p>SQLite version 3.4.0<br />
Enter &#8220;.help&#8221; for instructions<br />
sqlite> .quit</p>
<p>Usaremos algumas gems para nao reinventarmos a roda:</p>
<p>- <a href="http://www.sinatrarb.com">sinatra</a> &#8211; Nosso tão amado e querido micro-framework<br />
- <a href="http://github.com/pauldix/feedzirra/tree/master">feedzirra</a> &#8211; Parsing de RSS<br />
- <a href="http://sequel.rubyforge.org/">sequel</a> &#8211; Para gerenciamento simples do sqlite com ruby &#8211; http://sequel.rubyforge.org<br />
- <a href="http://haml.hamptoncatlin.com/">Haml</a> &#8211; Linguagem de marcação para nossos templates</p>
<p>Após instalarmos cada uma das gems necessárias, começaremos o desenvolvimento da aplicação.</p>
<h2>Leitor de RSS Feito Totalmente em Ruby! </h2>
<p>O idéia é criar um leitor de RSS básico, com as features mínimas necessárias para o seu funcionamento. Melhorias futuras serão tratadas em outros posts. Para que possamos gerenciar nossos feeds, criaremos um Model simples, representando objetos &#8220;feed&#8221;. Percebam que, assim como os conhecidos exemplos do ActiveRecord usado no Rails, aqui a gente também extende uma classe model do nosso framework de acesso ao BD, o Sequel. É possível notar também a semelhança com um Migration na definição do schema da tabela.</p>
<p><strong>./feed.rb</strong></p>
<pre class="brush: ruby">
class Feed < Sequel::Model
  unless table_exists?
      set_schema do
        primary_key :id
        text :url
        text :name
      end
      create_table
    end
end
</pre>
<p>Pronto. Nosso Model já está pronto, agora vamos para o Controller. Como essa é uma implementação bem simples, usaremos apenas a raiz do site para apresentar o conteúdo. Isso pode ser comprovado nos GETS que esperam apenas um parâmetro, no caso o "id" do feed no nosso banco.</p>
<p><strong>./blue_eyes.rb</strong></p>
<pre class="brush: ruby">
require 'sinatra'
require 'feedzirra'
require 'sequel'

configure do
  Sequel.sqlite('blue_eyes.db')
end
require 'feed'

get '/style.css' do
   content_type 'text/css', :charset => 'utf-8'
   sass :style
end

get '/' do
   @feeds = Feed.all
     @feed = Feedzirra::Feed.fetch_and_parse("http://www.tbueno.com/blog/feed/")
   haml :index
end

get '/:id' do
    @feeds = Feed.all
    @model = Feed.find(:id => params[:id])
    @feed = Feedzirra::Feed.fetch_and_parse(@model.url)
    haml :index
end

post '/add_feed' do
  f = Feedzirra::Feed.fetch_and_parse(params[:feed_url])
  feed = Feed.new(:url => f.feed_url, :name => f.title)
  feed.save
  redirect '/'
end
</pre>
<p>Outra novidade em relação ao tutorial anterior é o uso do "configure", que é uma espécie de "initializer" do Rails e é executado, como o nome diz, apenas uma vez no início. Usaremos ele para conectarmos ao nosso banco.</p>
<p><span id="more-140"></span></p>
<p>O uso de POST Http foi adicionado para que possamos adicionar feed usando um form simples que recebe a url do feed a ser adicionado.</p>
<h2>Camada de Apresentação com Haml e Sass</h2>
<p>Como no tutorial anterior, usaremos o Haml e o Sass para geração de HTML e CSS respectivamente. Como esta é uma aplicação pequena, acho que fica interessante usarmos estas ferramentas para demonstrar como fica limpa a parte de apresentação usando elas.</p>
<p><strong>./views/index.haml</strong></p>
<pre>
%html
  %head
    %title Blue Eyes
    %meta{"http-equiv" => "Content-Type", :content=>"text/html; charset=UTF-8"}
    %link{:rel => 'stylesheet', :type =>'text/css', :href => 'style.css' }
  %body
    #menu
      %form{:action => 'add_feed', :method => 'post', :name => 'add_feed'}
        %input{:type =>'text', :name => 'feed_url', :id => 'feed_url' }
        %input{:type => 'submit', :value => 'Add Feed'}
      %ul
        - @feeds.each do |f|
          %li
            %a{:href => "/#{f.id}"}
              = f.name
    #content
      .feed
        %h1
          %a{:href => @feed.url}
            = @feed.title
        - @feed.entries.each do |entry|
          .entry
            %h2
              %a{:href => entry.url}
                = entry.title
            = entry.content
</pre>
<p>Sempre é bom lembrar que a identação é FUNDAMENTAL no Haml, portanto, preservem-na caso vocês forem copiar e colar estes códigos.</p>
<p><strong>./views/style.sass</strong></p>
<pre>
body
  :background-color #f0f0f0

a
  :color #B84300
  :text-decoration none

h2
  :font normal 1.2em/1.3em arial
  :margin 0
  :padding 0

.entry
  :border 1px solid #888
  :background #f9f9f9
  :padding 10px
  :width 90%
  :margin-bottom 1em

#content
  :float left
  :width 70%
  :margin 0px 0px 50px 0px
  :overflow auto

#menu
  :float left
  :width 25%
  :overflow auto
  :border 1px solid #888
  :margin-right 10px
</pre>
<p>Screenshot:<br />
<center><a href="http://www.tbueno.com/blog/wp-content/uploads/2009/04/blue_eyes.jpg"><img src="http://www.tbueno.com/blog/wp-content/uploads/2009/04/blue_eyes-300x225.jpg" alt="blue_eyes" title="blue_eyes" width="300" height="225" class="alignnone size-medium wp-image-151" /></a></center></p>
<h2>Trabalhos Futuros</h2>
<p>Obviamente, este exemplo não é uma aplicação completamente funcional. Ele serve mais como um exemplo de como explorar os recursos do Sinatra, mas como eu me diverti fazendo ele, logo tive a idéia de criar um projeto no Github para continuar o desenvolvimento. Sintam-se a vontade para clonar o projeto e sugerir melhorias. Existe uma lista de coisas que precisam ser melhoradas que incluem gerenciamento otimizado de feeds, caches, controle de datas para que os feeds não precisem ser buscados externamente a cada refresh, etc...<br />
<center><a href="http://github.com/tbueno/blue-eyes/tree/master"><img src="http://www.tbueno.com/blog/wp-content/uploads/2009/04/blue_eyes.gif" alt="blue_eyes" title="blue_eyes" width="237" height="144" class="alignnone size-full wp-image-148" /></a></center><br />
Provavelmente eu farei posts futuros descrevendo o desenvolvimento de novas features. Enquanto isso, confiram a página do<a href="http://github.com/tbueno/blue-eyes/tree/master"> RSS Reader BLUE EYES</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tbueno.com/blog/ruby/2009/04/leitor-de-rss-feito-com-ruby-e-sinatra/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
