Formatting Ruby's prettyprint
Is it possible to change the width that prettyprint (require 'pp'
) uses when formatting output? For example:
"mooth"=>["booth", "month", "mooch", "morth", "mouth", "mowth", "sooth", "tooth"]
"morth"=>["forth",
"mirth",
"month",
"mooth",
"morph",
"mouth",
"mowth",
"north",
"worth"]
The first array is printed inline because it fits within the column width prettyprint allows (79 characters)... the second is split onto multiple lines, because it does not. But I can find no method for changing the column that this behavior starts on.
pp
depends on PrettyPrint
(which has ways to allow different widths for the buffer). Is there any way to change the default column width for pp
, without rewriting it from scratch (accessing PrettyPrint
directly)?
Alternately, is there a similar ruby gem that provides this functionality?
#!/usr/bin/ruby1.8
require 'pp'
mooth = [
"booth", "month", "mooch", "morth",
"mouth", "mowth", "sooth", "tooth"
]
PP.pp(mooth, $>, 40)
# => ["booth",
# => "month",
# => "mooch",
# => "morth",
# => "mouth",
# => "mowth",
# => "sooth",
# => "tooth"]
PP.pp(mooth, $>, 79)
# => ["booth", "month", "mooch", "morth", "mouth", "mowth", "sooth", "tooth"]
To change the default with a monkey patch:
#!/usr/bin/ruby1.8
require 'pp'
class PP
class << self
alias_method :old_pp, :pp
def pp(obj, out = $>, width = 40)
old_pp(obj, out, width)
end
end
end
mooth = ["booth", "month", "mooch", "morth", "mouth", "mowth", "sooth", "tooth"]
pp(mooth)
# => ["booth",
# => "month",
# => "mooch",
# => "morth",
# => "mouth",
# => "mowth",
# => "sooth",
# => "tooth"]
These methods also work in MRI 1.9.3
Found "ap" aka "Awesome_Print" useful as well from git-repo
Code used to test pp and ap:
require 'pp'
require "awesome_print" #requires gem install awesome_print
data = [false, 42, %w{fourty two}, {:now => Time.now, :class => Time.now.class, :distance => 42e42}]
puts "Data displayed using pp command"
pp data
puts "Data displayed using ap command"
ap data
O/P from pp vs ap:
Data displayed using pp command
[false,
42,
["fourty", "two"],
{:now=>2015-09-29 22:39:13 +0800, :class=>Time, :distance=>4.2e+43}]
Data displayed using ap command
[
[0] false,
[1] 42,
[2] [
[0] "fourty",
[1] "two"
],
[3] {
:now => 2015-09-29 22:39:13 +0800,
:class => Time < Object,
:distance => 4.2e+43
}
]
Reference:
- Stackoverflow posting
- Web citing