En tiempo de ejecución, ¿cómo verificar desde dónde se carga un módulo o una clase?

Tengo una aplicación de rieles heredada con muchos módulos y clases divertidos (para inútiles) en el espacio de nombres global. Quiero saber de qué archivos o gemas se les ha solicitado usar rails c.

Sé que existe por métodos: .source_location,__line__,__file__ y el objeto llamador, pero parece irrelevante determinar el origen de una clase o un módulo.

Algunas ideas ? ¡Gracias!

Usando :

  • Ruby 1.9.2
  • Palanca
  • Rails 3.1.1

preguntado el 08 de noviembre de 11 a las 16:11

2 Respuestas

más una solución alternativa que una solución real (solicitó un método), pero le aconsejaría utilizar el ri doc. Si el Rdoc / Ri Doc se ha generado correctamente, el documento menciona la gema de origen.

para enumerar todas las clases conocidas por ri:

ri -l

para obtener un documento en una clase o módulo específico:

ri ClassName

para obtener información sobre un método:

ri ClassName#instance_method_name
ri ClassName#class_method_name

Si quieres, hay una joya llamada ri_for que te permite inspeccionar el ri doc en tiempo de ejecución, que le ayudará en la consola. Ejemplo de la salida en una sesión irb:

>> require 'ri_for'
=> true
>> String.desc_class
begin RI
String < Object

------------------------------------------------------------------------------
Includes:
Diff::LCS (from gem diff-lcs-1.1.3)

(from gem diff-lcs-1.1.3)
------------------------------------------------------------------------------
Includes Diff::LCS into String.

------------------------------------------------------------------------------
(from gem rake-0.8.7)
------------------------------------------------------------------------------


User defined methods to be added to String.

------------------------------------------------------------------------------
Instance methods:

ext
pathmap
pathmap_explode
pathmap_partial
pathmap_replace

(from gem treetop-1.4.10)
------------------------------------------------------------------------------
Instance methods:

blank?
column_of
indent
line_of
tabto
treetop_camelize

end ri
String
non inherited methods:
%, *, +, <<, <=>, ==, ===, =~, [], []=, ascii_only?, blank?, bytes, bytesize, capitalize,    capitalize!, casecmp, center, chars, chomp, chomp!, chop, chop!, chr, clear, codepoints, column_of, concat, count, crypt, delete, delete!, downcase, downcase!, dump, each_byte, each_char, each_codepoint, each_line, empty?, encode, encode!, encoding, end_with?, eql?, force_encoding, getbyte, gsub, gsub!, hash, hex, include?, indent, index, insert, inspect, intern, length, line_of, lines, ljust, lstrip, lstrip!, match, next, next!, oct, ord, partition, replace, reverse, reverse!, rindex, rjust, rpartition, rstrip, rstrip!, scan, setbyte, size, slice, slice!, split, squeeze, squeeze!, start_with?, strip, strip!, sub, sub!, succ, succ!, sum, swapcase, swapcase!, tabto, to_c, to_f, to_i, to_r, to_s, to_str, to_sym, tr, tr!, tr_s, tr_s!, treetop_camelize, unpack, upcase, upcase!, upto, valid_encoding?
non inherited class methods:
try_convert
=> nil

respondido 08 nov., 11:23

ya está usando Pry, que tiene todas las funciones del ri_for gema, y ​​algo más. - caballo

No puede averiguar esto para las clases / módulos directamente, pero si observa los métodos definidos en la clase / módulo, puede averiguar dónde están definidos, que, por proxy, también es donde se define la clase / módulo .

In Palanca se puede ir:

[3] (pry) main: 0> stat Set#initialize
Method Information:
--
Name: initialize
Owner: Set
Visibility: private
Type: Unbound
Arity: -1
Method Signature: initialize(enum=?, &block)
Source Location: /Users/john/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/set.rb:67

Mira el último elemento de arriba.

respondido 09 nov., 11:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.