Plugin de Typo para Github

Escrito por guillermo.cifuentes en March 09, 2009

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 de creación:

  1. Crear la estructura del plugin:
                    guillermo:typo$ script/generate plugin github_sidebar
                
  2. El plugin como Typo es una aplicación en rails, se va para /vendor/plugins/github_sidebar. Nos vamos hasta allá. Nuevo archivo, en este caso uso vim para editar:
                    guillermo:typo$ vim github_sidebar.rb
                

    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 Sidebar. Por cierto, si quieres ver como implementa otras barras laterales como las de tags, la barra de amazon, etc. están todos ellas en /vendor/plugins/.

    require 'net/http'
    require 'uri'
    
    class GithubSidebar < Sidebar
      display_name "Github" #el nombre que tendrá el plugin en el listado de Typo
      description "Muestra el listado de proyectos públicos para un usuario"
      # 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 => "Sidebar title"
      setting :user, 'githubuser', :label => "Github username"
      setting :refresh, '300', :label => "Time to purge the cache"
    
      USER_INFO_BASE = "http://github.com/api/v1/json/"
    
      def repositories
        data = retrieve_reposdata
        return [] if data.length < 2
        user = JSON.parse data
        user["user"]["repositories"]
      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) < 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
    

    En el método retrieve_reposdata se hace una petición a github (para más info del api), 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.

  3. Ahora falta la vista. Para “decirle” a Typo donde está la vista, debemos modificar el archivo init.rb. Y añadir:

    require 'github_sidebar'
    GithubSidebar.view_root = File.dirname(__FILE__) + "/views"
               

    La propia vista son cuatro líneas, lo único a tener en cuenta es que la instancia de nuestro “Sidebar” está en contexto como sidebar y que debemos llamar a nuestra vista content.rhtml. Así que creamos la carpeta views en nuestro plugin y editamos content.rhtml:

    <h3><%= sidebar.title %></h3>
    <ul id="github_repos">
    <%- sidebar.repositories.each do |repo| %>
    <li><a href="<%= repo["url"] %>" title="<%= repo["description"] %>"><%= repo["name"] %></a></li>
    <%- end %>
    </ul>
    

Toca reiniciar el servidor y listo. Si eres vag@ y solo quieres utilizar el plugin, desde la raíz del proyecto rails:

guillermo:typo$ script/plugin install git://github.com/guicifuentes/typo-github-sidebar.git
Trackbacks

Usar este enlace. to trackback from your own site.

Comentarios

Deja un comentario

Comentarios