<?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>Blog &#187; ruby</title>
	<atom:link href="http://guillermocifuentes.com/tag/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://guillermocifuentes.com</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sat, 04 Jul 2009 17:30:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Plugin de Typo para Github</title>
		<link>http://guillermocifuentes.com/2009/03/09/plugin-typo-github/</link>
		<comments>http://guillermocifuentes.com/2009/03/09/plugin-typo-github/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 19:15:49 +0000</pubDate>
		<dc:creator>guillermo.cifuentes</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[typo]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Para inaugurar este blog, a falta de botella de cava que romper; cuelgo este plugin. Poniendo en marcha este blog echaba en falta un plugin que funcionase en el lado del servidor (es decir, que no fuese necesario javascript en el cliente) para mostrar los repositorios públicos que tengas en Github. Comencemos con el proceso [...]]]></description>
			<content:encoded><![CDATA[<p>Para inaugurar este blog, a falta de botella de cava que romper; cuelgo este plugin. Poniendo en marcha este blog echaba en falta un plugin que funcionase en el lado del servidor (es decir, que no fuese necesario javascript en el cliente) para mostrar los repositorios públicos que tengas en Github.</p>
<p>Comencemos con el proceso de creación:</p>
<ol>
<li>Crear la estructura del plugin:
<pre class="brush: bash; light: true;">
                guillermo:typo$ script/generate plugin github_sidebar
            </pre>
</li>
<li>El plugin como Typo es una aplicación en rails, se va para <raizproyecto>/vendor/plugins/github_sidebar. Nos vamos hasta allá. Nuevo archivo, en este caso uso vim para editar:
<pre class="brush: bash; light: true;">
                guillermo:typo$ vim github_sidebar.rb
            </pre>
<p>Una vez dentro empezamos con el código, Typo tiene una clase muy apañada para hacer barras laterales que heredaremos y que hace muy fácil la tarea, la clase <strong>Sidebar</strong>. Por cierto, si quieres ver como implementa otras barras laterales como las de tags, la barra de amazon, etc. están todos ellas en <raizproyecto>/vendor/plugins/.</p>
<pre class="brush: ruby;">
require 'net/http'
require 'uri'

class GithubSidebar &lt; Sidebar
  display_name &quot;Github&quot; #el nombre que tendrá el plugin en el listado de Typo
  description &quot;Muestra el listado de proyectos públicos para un usuario&quot;
  # lo siguiente son las preferencias, se quedan guardadas en la base de datos,
  # el primer símbolo creará un attr_accessor con ese nombre, el segundo parámetro
  # es el valor predeterminado, y el :label es el texto de la etiqueta en preferencias
  setting :title, 'Github projects', :label =&gt; &quot;Sidebar title&quot;
  setting :user, 'githubuser', :label =&gt; &quot;Github username&quot;
  setting :refresh, '300', :label =&gt; &quot;Time to purge the cache&quot;

  USER_INFO_BASE = &quot;http://github.com/api/v1/json/&quot;

  def repositories
    data = retrieve_reposdata
    return [] if data.length &lt; 2
    user = JSON.parse data
    user[&quot;user&quot;][&quot;repositories&quot;]
  end

  private

  def retrieve_reposdata
    now = Time.now.to_i
    timestamp = Rails.cache.read('GithubSidebar_repos_stamp').to_i || refresh.to_i
    data = Rails.cache.read('GithubSidebar_repos')

    unless data and (now - timestamp) &lt; refresh.to_i
      final_url = USER_INFO_BASE + user
      response = Net::HTTP.get_response(URI.parse(final_url))
      data = response.body

      Rails.cache.write 'GithubSidebar_repos', data
      Rails.cache.write 'GithubSidebar_repos_stamp', now.to_s
    end
    data
  end
end
</pre>
<p>En el método <em>retrieve_reposdata</em> se hace una petición a github (<a href="http://github.com/guides/the-github-api">para más info del api</a>), en lugar de guardar el objeto ya parseado, se guarda como cadena ya que excepto el backend en memoria, en el resto solo puedes guardar cadenas de texto; el timestamp lo guardo aparte ya que no pude encontrar como ponerle un timeout a la llave.
        </li>
<li>
            Ahora falta la vista. Para &#8220;decirle&#8221; a Typo donde está la vista, debemos modificar el archivo <em>init.rb</em>. Y añadir:</p>
<pre class="brush: ruby;">
require 'github_sidebar'
GithubSidebar.view_root = File.dirname(__FILE__) + &quot;/views&quot;
           </pre>
<p>La propia vista son cuatro líneas, lo único a tener en cuenta es que la instancia de nuestro <em>&#8220;Sidebar&#8221;</em> está en contexto como <strong>sidebar</strong> y que debemos llamar a nuestra vista <em>content.rhtml</em>. Así que creamos la carpeta <em>views</em> en nuestro plugin y editamos <em>content.rhtml</em>:</p>
<pre class="brush: ruby; html-script: true;">
&lt;h3&gt;&lt;%= sidebar.title %&gt;&lt;/h3&gt;
&lt;ul id=&quot;github_repos&quot;&gt;
&lt;%- sidebar.repositories.each do |repo| %&gt;
&lt;li&gt;&lt;a href=&quot;&lt;%= repo[&quot;url&quot;] %&gt;&quot; title=&quot;&lt;%= repo[&quot;description&quot;] %&gt;&quot;&gt;&lt;%= repo[&quot;name&quot;] %&gt;&lt;/a&gt;&lt;/li&gt;
&lt;%- end %&gt;
&lt;/ul&gt;
</pre>
</li>
</ol>
<p>Toca reiniciar el servidor y listo. Si eres vag@ y solo quieres utilizar el plugin, desde la raíz del proyecto rails:</p>
<pre class="brush: bash; light: true;">
guillermo:typo$ script/plugin install git://github.com/guicifuentes/typo-github-sidebar.git
</pre>
]]></content:encoded>
			<wfw:commentRss>http://guillermocifuentes.com/2009/03/09/plugin-typo-github/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
