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:
- Crear la estructura del plugin:
guillermo:typo$ script/generate plugin github_sidebar - 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.rbUna 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 endEn 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.
-
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