M
MonkeeSage
People often want to look at an object's attributes when debugging.
[1] Python has a handy dir() function that lists the attributes of an
object. And I use it tons. I often use obj.methods.sort in ruby for
the same purpose. But that doesn't show me class variables. There are
a handful of reflection functions to show different types of metadata
about an object.
So...this is my attempt to create a "Super dir() with extra-strength,
industrial, ruby power". I probably failed, and it's probably buggy as
I just hacked it together in about 15 minutes. In other words, I've
not tested it very extensively, YMMV (in fact your hair may
spontaneously catch on fire and you may start chanting backwards in
Latin...don't blame me; I've warned you!).
class DirObject
def initialize(attrs=[])
@attributes = attrs
end
def push(metadata)
@attributes << metadata
end
def include?(test)
@attributes.each { | key, value |
return true if value.include?(test)
}
false
end
def show
puts @attributes.map { | key, value |
#key + ":\n " + value.join("\n ")
key + ":\n " + value.inspect
}.join("\n\n")
self
end
end
class Object
private
def _get_metadata(meta)
begin
send(meta)
rescue NameError
[]
end
end
def _format_meta(meta)
unless (idx = meta.index("_")).nil?
meta[0] = meta[0].chr.upcase
meta[idx+1] = meta[idx+1].chr.upcase
meta = meta[0..idx-1] + " " + meta[idx+1..-1]
else
meta[0] = meta[0].chr.upcase
meta
end
end
def _do_metadata(meta, dirobj)
data = _get_metadata(meta)
unless data.empty?
meta = _format_meta(meta)
dirobj.push([meta, data.sort])
end
dirobj
end
public
def dir(verbose=false)
dirobj = DirObject.new
_do_metadata("class_variables", dirobj)
_do_metadata("instance_variables", dirobj)
_do_metadata("methods", dirobj)
_do_metadata("instance_methods", dirobj)
if verbose
_do_metadata("private_methods", dirobj)
_do_metadata("private_instance_methods", dirobj)
_do_metadata("protected_methods", dirobj)
_do_metadata("protected_instance_methods", dirobj)
_do_metadata("public_methods", dirobj)
_do_metadata("public_instance_methods", dirobj)
_do_metadata("singleton_methods", dirobj)
end
dirobj
end
def ls(verbose=false)
dir(verbose).show
end
end
Comments, corrections and criticisms welcome!
Ps. Object#dir actually prints the metadata (like python's dir()), and
#ls just gives you a DirObject which is really only useful to do an
includes? on (which searches for a value through the entire metadata).
http://monkeesage.prohosts.org/ruby/dir.rb [right-click save-as]
Regards,
Jordan
[1]
http://groups.google.com/group/comp...4?lnk=gst&q=python+dir()#msg_77d85f05e1ae8e66
[1] Python has a handy dir() function that lists the attributes of an
object. And I use it tons. I often use obj.methods.sort in ruby for
the same purpose. But that doesn't show me class variables. There are
a handful of reflection functions to show different types of metadata
about an object.
So...this is my attempt to create a "Super dir() with extra-strength,
industrial, ruby power". I probably failed, and it's probably buggy as
I just hacked it together in about 15 minutes. In other words, I've
not tested it very extensively, YMMV (in fact your hair may
spontaneously catch on fire and you may start chanting backwards in
Latin...don't blame me; I've warned you!).
class DirObject
def initialize(attrs=[])
@attributes = attrs
end
def push(metadata)
@attributes << metadata
end
def include?(test)
@attributes.each { | key, value |
return true if value.include?(test)
}
false
end
def show
puts @attributes.map { | key, value |
#key + ":\n " + value.join("\n ")
key + ":\n " + value.inspect
}.join("\n\n")
self
end
end
class Object
private
def _get_metadata(meta)
begin
send(meta)
rescue NameError
[]
end
end
def _format_meta(meta)
unless (idx = meta.index("_")).nil?
meta[0] = meta[0].chr.upcase
meta[idx+1] = meta[idx+1].chr.upcase
meta = meta[0..idx-1] + " " + meta[idx+1..-1]
else
meta[0] = meta[0].chr.upcase
meta
end
end
def _do_metadata(meta, dirobj)
data = _get_metadata(meta)
unless data.empty?
meta = _format_meta(meta)
dirobj.push([meta, data.sort])
end
dirobj
end
public
def dir(verbose=false)
dirobj = DirObject.new
_do_metadata("class_variables", dirobj)
_do_metadata("instance_variables", dirobj)
_do_metadata("methods", dirobj)
_do_metadata("instance_methods", dirobj)
if verbose
_do_metadata("private_methods", dirobj)
_do_metadata("private_instance_methods", dirobj)
_do_metadata("protected_methods", dirobj)
_do_metadata("protected_instance_methods", dirobj)
_do_metadata("public_methods", dirobj)
_do_metadata("public_instance_methods", dirobj)
_do_metadata("singleton_methods", dirobj)
end
dirobj
end
def ls(verbose=false)
dir(verbose).show
end
end
Comments, corrections and criticisms welcome!
Ps. Object#dir actually prints the metadata (like python's dir()), and
#ls just gives you a DirObject which is really only useful to do an
includes? on (which searches for a value through the entire metadata).
http://monkeesage.prohosts.org/ruby/dir.rb [right-click save-as]
Regards,
Jordan
[1]
http://groups.google.com/group/comp...4?lnk=gst&q=python+dir()#msg_77d85f05e1ae8e66