tridimensionales registro patentes niza marcas marca linea inpi impi fonetica clases busqueda avanzad ruby rubygems packages gem

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