ruby - patentes - registro de marca en linea
Consulta la disponibilidad de Ruby Gem. (6)
Desde Gem.available? está en desuso (¡argh!), tienes que rescatar de nuevo (doble aaargh). Sí, find_by_name lanza una excepción si no se encuentra la gema. Así que para ser compatible con versiones anteriores de rubygems antiguos, la solución común parece ser:
def gem_available?(name)
Gem::Specification.find_by_name(name)
rescue Gem::LoadError
false
rescue
Gem.available?(name)
end
Tenga en cuenta que el nuevo método le permite pasar una versión específica para ver si está cargada:
Gem::Specification.find_by_name(''rails'', ''3.0.4'')
¿Hay alguna forma de verificar si alguna gema está instalada actualmente, a través del módulo Gem? Desde el código ruby, no ejecutando ''lista de gemas'' ...
Para aclarar - no quiero cargar la biblioteca. Solo quiero comprobar si está disponible, por lo que todas las soluciones de rescue LoadError
no me ayudan. Tampoco me importa si la gema funcionará o no, solo si está instalada.
En mi humilde opinión, la mejor manera es intentar cargar / requerir el GEM y rescatar la Excepción, como Ray ya ha mostrado. Es seguro rescatar la excepción LoadError porque no la genera el propio GEM, pero es el comportamiento estándar del comando require.
También puedes usar el comando gema en su lugar.
begin
gem "somegem"
# with requirements
gem "somegem", ">=2.0"
rescue Gem::LoadError
# not installed
end
El comando gem tiene el mismo comportamiento que el comando require, con algunas diferencias leves. AFAIK, todavía intenta cargar automáticamente el archivo GEM principal.
Cavando en el archivo rubygems.rb (línea 310) encontré la siguiente ejecución
matches = Gem.source_index.find_name(gem.name, gem.version_requirements)
report_activate_error(gem) if matches.empty?
Puede proporcionarle algunos consejos sobre cómo realizar una comprobación sucia sin tener que cargar la biblioteca.
Mirando la documentación de la API de Gem, el uso de Gem::Specification::find_all_by_name para probar la disponibilidad de gemas parece razonable.
if Gem::Specification::find_all_by_name(''gemname'').any?
do stuff
end
find_all_by_name
siempre devuelve una matriz (de objetos de Especificación), a diferencia de find_by_name
que genera una excepción si no se encuentra ninguna coincidencia.
Tú podrías:
begin
require "somegem"
rescue LoadError
# not installed
end
Sin embargo, esto no le diría si el módulo se instaló a través de gemas o por algún otro medio.
También hay:
Gem.available?(''somegem'')
Puedes usar expresiones regex también. Práctico si quiero permitir ''rcov'' y variantes de GitHub como ''relevance-rcov'':
Gem.available?(/-?rcov$/)
Yo uso este código y funciona sin problemas.
def gem_available?(gem_name, version = nil)
version.nil? gem(gem_name) : gem(gem_name, version)
rescue Gem::LoadError
false
end
Ejemplos para usar
Supongamos que tiene el bastidor 1.9.1 instalado.
puts gem_available?(''rack'') # => true
puts gem_available?(''rack'', ''>=2'') => # false