1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* lib/prettyprint.rb, lib/pp.rb: convenience methods added.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2602 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
akr 2002-06-27 12:01:07 +00:00
parent 48fbacb11c
commit 571ff1d6b9
3 changed files with 297 additions and 258 deletions

166
lib/pp.rb
View file

@ -88,9 +88,21 @@ PP#pp to print the object.
Object#pretty_print_cycled is used when ((|obj|)) is already
printed, a.k.a the object reference chain has a cycle.
--- object_group(obj) { ... }
is a convenience method which is same as follows:
group(1, '#<' + obj.class.name, '>') { ... }
--- comma_breakable
is a convenience method which is same as follows:
text ','
breakable
= Object
--- pretty_print(pp)
is a default pretty printing method for general objects.
It calls (({pretty_print_instance_variables})) to list instance variables.
If (({self})) has a customized (redefined) (({inspect})) method,
the result of (({self.inspect})) is used but it obviously has no
@ -102,6 +114,13 @@ PP#pp to print the object.
--- pretty_print_cycled(pp)
is a default pretty printing method for general objects that are
detected as part of a cycle.
--- pretty_print_instance_variables
is a method to list instance variables used by the default implementation
of (({pretty_print})).
This method should return an array of names of instance variables as symbols or strings as:
(({[:@a, :@b]})).
=end
require 'prettyprint'
@ -172,60 +191,45 @@ class PP < PrettyPrint
end
end
def object_group(obj, &block)
group(1, '#<' + obj.class.name, '>', &block)
end
def comma_breakable
text ','
breakable
end
def pp_object(obj)
group {
text '#<'
nest(1) {
text obj.class.name
text ':'
text sprintf('0x%x', obj.__id__)
first = true
obj.instance_variables.sort.each {|v|
if first
first = false
else
text ','
end
breakable
group {
text v
text '='
nest(1) {
breakable ''
pp(obj.instance_eval v)
}
}
object_group(obj) {
text sprintf(':0x%x', obj.__id__)
obj.pretty_print_instance_variables.each {|v|
v = v.to_s if Symbol === v
text ',' unless first?
breakable
text v
text '='
group(1) {
breakable ''
pp(obj.instance_eval v)
}
}
text '>'
}
end
def pp_hash(obj)
group {
text '{'
nest(1) {
first = true
obj.each {|k, v|
if first
first = false
else
text ","
breakable
end
group {
pp k
text '=>'
nest(1) {
group {
breakable ''
pp v
}
}
group(1, '{', '}') {
obj.each {|k, v|
comma_breakable unless first?
group {
pp k
text '=>'
group(1) {
breakable ''
pp v
}
}
}
text '}'
}
end
@ -271,6 +275,10 @@ class PP < PrettyPrint
pp.breakable
pp.text sprintf("...>")
end
def pretty_print_instance_variables
instance_variables.sort
end
end
end
@ -284,20 +292,12 @@ end
class Array
def pretty_print(pp)
pp.text "["
pp.nest(1) {
first = true
pp.group(1, '[', ']') {
self.each {|v|
if first
first = false
else
pp.text ","
pp.breakable
end
pp.comma_breakable unless pp.first?
pp.pp v
}
}
pp.text "]"
end
def pretty_print_cycled(pp)
@ -323,27 +323,18 @@ end
class Struct
def pretty_print(pp)
pp.text sprintf("#<%s", self.class.name)
pp.nest(1) {
first = true
pp.object_group(self) {
self.members.each {|member|
if first
first = false
else
pp.text ","
end
pp.text "," unless pp.first?
pp.breakable
pp.group {
pp.text member.to_s
pp.text '='
pp.nest(1) {
pp.breakable ''
pp.pp self[member]
}
pp.text member.to_s
pp.text '='
pp.group(1) {
pp.breakable ''
pp.pp self[member]
}
}
}
pp.text ">"
end
def pretty_print_cycled(pp)
@ -365,12 +356,10 @@ class File
class Stat
def pretty_print(pp)
require 'etc.so'
pp.nest(1) {
pp.text "#<"
pp.text self.class.name
pp.breakable; pp.text sprintf("dev=0x%x", self.dev); pp.text ','
pp.breakable; pp.text "ino="; pp.pp self.ino; pp.text ','
pp.object_group(self) {
pp.breakable
pp.text sprintf("dev=0x%x", self.dev); pp.comma_breakable
pp.text "ino="; pp.pp self.ino; pp.comma_breakable
pp.group {
m = self.mode
pp.text sprintf("mode=0%o", m)
@ -389,10 +378,9 @@ class File
(m & 0002 == 0 ? ?- : ?w),
(m & 0001 == 0 ? (m & 01000 == 0 ? ?- : ?T) :
(m & 01000 == 0 ? ?x : ?t)))
pp.text ','
}
pp.breakable; pp.text "nlink="; pp.pp self.nlink; pp.text ','
pp.breakable
pp.comma_breakable
pp.text "nlink="; pp.pp self.nlink; pp.comma_breakable
pp.group {
pp.text "uid="; pp.pp self.uid
begin
@ -400,9 +388,8 @@ class File
pp.breakable; pp.text "(#{name})"
rescue ArgumentError
end
pp.text ','
}
pp.breakable
pp.comma_breakable
pp.group {
pp.text "gid="; pp.pp self.gid
begin
@ -410,39 +397,34 @@ class File
pp.breakable; pp.text "(#{name})"
rescue ArgumentError
end
pp.text ','
}
pp.breakable
pp.comma_breakable
pp.group {
pp.text sprintf("rdev=0x%x", self.rdev)
pp.breakable
pp.text sprintf('(%d, %d)', self.rdev_major, self.rdev_minor)
pp.text ','
}
pp.breakable; pp.text "size="; pp.pp self.size; pp.text ','
pp.breakable; pp.text "blksize="; pp.pp self.blksize; pp.text ','
pp.breakable; pp.text "blocks="; pp.pp self.blocks; pp.text ','
pp.breakable
pp.comma_breakable
pp.text "size="; pp.pp self.size; pp.comma_breakable
pp.text "blksize="; pp.pp self.blksize; pp.comma_breakable
pp.text "blocks="; pp.pp self.blocks; pp.comma_breakable
pp.group {
t = self.atime
pp.text "atime="; pp.pp t
pp.breakable; pp.text "(#{t.tv_sec})"
pp.text ','
}
pp.breakable
pp.comma_breakable
pp.group {
t = self.mtime
pp.text "mtime="; pp.pp t
pp.breakable; pp.text "(#{t.tv_sec})"
pp.text ','
}
pp.breakable
pp.comma_breakable
pp.group {
t = self.ctime
pp.text "ctime="; pp.pp t
pp.breakable; pp.text "(#{t.tv_sec})"
}
pp.text ">"
}
end
end