4Trabes Historias de una empresa en 100 metros cuadrados

El blog de Trabe Soluciones

Requerir gemas de GitHub con estilo: config.gem.github

| | Comentarios

Llevaba tiempo pensando en simplificar la definición de dependencias de gemas de GitHub en el environment.rb de nuestras aplicaciones, pero no encontraba el momento. El domingo estuve leyendo un post de Bruce Williams en su blog CodeFluency: A GitHubby config.gem hack, donde propone una solución para pasar de esto:

1
2
config.gem 'yfactorial-utility_scopes', :version => '0.2.2',
  :lib => 'utility_scopes', :source => 'http://gems.github.com'

…a esto:

1
config.gem 'yfactorial-utility_scopes', :version => '0.2.2', :github => true

Había dos cosas en su solución que no me gustaban: 1) el uso de un flag y 2) que la implementación sobreescribe el método gem. Así que me he animado y acabo de montar una versión que intenta paliar esos dos problemas. El código no tiene nada de especial. Podéis cogerlo de este pastie. Sólo hay que tirarlo en lib y requerirlo en environment.rb. Y con esto ya podemos escribir bloques de dependencias con estilo:

1
2
3
4
5
6
7
config.gem 'authlogic', :version => '1.3.8'
config.gem 'faker', :version => '0.3.1'
config.gem 'spreadsheet', :version => '0.6.2.1'

config.gem.github 'yfactorial-utility_scopes', :version => '0.2.2'
config.gem.github 'mislav-will_paginate', :version => '2.3.6'
config.gem.github 'rubyist-aasm', :version => '2.0.5'

Actualización

Esta versión del código depende de ActiveSupport. En este post podéis encontrar una versión actualizada del código que no depende de AS.

Lo sentimos, pero los comentarios están cerrados

Muy buenas David (Asis, Marcos, lo mismo)

Ya hacía que no comentaba en vuestro blog, pero bueno, sigo por aquí dando el coñazo.

Coincide que estos días estoy utilizando la nueva funcionalidad de plantillas que viene con Rails2.3 y tenía en la cabeza hacer algo parecido a esto para mantener las llamadas a config.gem que utilicen github lo más parecidas a las llamadas que no lo utilicen, por si en algún momento quiero cambiar de distribuición de la gem (por ejemplo no utilizo la gem Rspec de github sino la global).

La solución que propones no está mal, personalmente me gusta más la de CodeFluency, pero para reducir aún más la diferencia entre las llamadas a config.gem con o sin github propongo el siguiente pastie (que es una modificación del de CodeFluency), en el que básicamente la única diferencia entre una llamada con o sin github es que se indica el autor del la gema.

Por lo tanto si tengo, por ejemplo RSpec, definido así

config.gem ‘rspec’

Y quiero utilizar el de David Chelimsky en github solo tengo que hacer

config.gem ‘rspec’, :github => ‘dchelimsky’

Tal cual está hoy en día el tema de gemas, que casi todas están en github, no creo que tarden mucho en añadir una de estas soluciones al core.

Saludos.

Hola Marcos,
me parece interesante tu opción, lo que ya no veo es por qué sigues soportando el formato :github => true. ¿Compatibilidad quizás?

La verdad lo dejé como opción por defecto, para que se pudiese dekar simplemente true o especificar un texto, es más o menos lo mismo que pasa con la opción :counter_cache de las asociaciones de ActiveRecord. Pero sí, la verdad mucha utilidad no tiene, ya que poner el nombre del usuario github antes del nombre de la gem es obligatorio.

Saludos.