In Files

  • pp.rb

PP::PPMethods

Constants

InspectKey

Public Instance Methods

comma_breakable() click to toggle source

A convenience method which is same as follows:

text ','
breakable
 
               # File pp.rb, line 163
def comma_breakable
  text ','
  breakable
end
            
guard_inspect_key() click to toggle source
 
               # File pp.rb, line 110
def guard_inspect_key
  if Thread.current[InspectKey] == nil
    Thread.current[InspectKey] = []
  end

  save = Thread.current[InspectKey]

  begin
    Thread.current[InspectKey] = []
    yield
  ensure
    Thread.current[InspectKey] = save
  end
end
            
object_address_group(obj, &block) click to toggle source
 
               # File pp.rb, line 153
def object_address_group(obj, &block)
  id = "%x" % (obj.__id__ * 2)
  id.sub!(/\Af(?=[[:xdigit:]]{2}+\z)/, '') if id.sub!(/\A\.\./, '')
  group(1, "\#<#{obj.class}:0x#{id}", '>', &block)
end
            
object_group(obj) click to toggle source

A convenience method which is same as follows:

group(1, '#<' + obj.class.name, '>') { ... }
 
               # File pp.rb, line 149
def object_group(obj, &block) # :yield:
  group(1, '#<' + obj.class.name, '>', &block)
end
            
pp(obj) click to toggle source

Adds obj to the pretty printing buffer using Object#pretty_print or Object#pretty_print_cycle.

Object#pretty_print_cycle is used when obj is already printed, a.k.a the object reference chain has a cycle.

 
               # File pp.rb, line 130
def pp(obj)
  id = obj.__id__

  if Thread.current[InspectKey].include? id
    group {obj.pretty_print_cycle self}
    return
  end

  begin
    Thread.current[InspectKey] << id
    group {obj.pretty_print self}
  ensure
    Thread.current[InspectKey].pop unless PP.sharing_detection
  end
end
            
pp_hash(obj) click to toggle source
 
               # File pp.rb, line 220
def pp_hash(obj)
  group(1, '{', '}') {
    seplist(obj, nil, :each_pair) {|k, v|
      group {
        pp k
        text '=>'
        group(1) {
          breakable ''
          pp v
        }
      }
    }
  }
end
            
pp_object(obj) click to toggle source
 
               # File pp.rb, line 205
def pp_object(obj)
  object_address_group(obj) {
    seplist(obj.pretty_print_instance_variables, lambda { text ',' }) {|v|
      breakable
      v = v.to_s if Symbol === v
      text v
      text '='
      group(1) {
        breakable ''
        pp(obj.instance_eval(v))
      }
    }
  }
end
            
seplist(list, sep=nil, iter_method=:each) click to toggle source

Adds a separated list. The list is separated by comma with breakable space, by default.

seplist iterates the list using iter_method. It yields each object to the block given for seplist. The procedure separator_proc is called between each yields.

If the iteration is zero times, separator_proc is not called at all.

If separator_proc is nil or not given, +lambda { #comma_breakable }+ is used. If iter_method is not given, :each is used.

For example, following 3 code fragments has similar effect.

q.seplist([1,2,3]) {|v| xxx v }

q.seplist([1,2,3], lambda { comma_breakable }, :each) {|v| xxx v }

xxx 1
q.comma_breakable
xxx 2
q.comma_breakable
xxx 3
 
               # File pp.rb, line 192
def seplist(list, sep=nil, iter_method=:each) # :yield: element
  sep ||= lambda { comma_breakable }
  first = true
  list.__send__(iter_method) {|*v|
    if first
      first = false
    else
      sep.call
    end
    yield(*v)
  }
end