Formatting Ruby's prettyprint
Asked Answered
N

2

49

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?

Northwards answered 21/1, 2010 at 19:1 Comment(0)
A
63
#!/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

Altheta answered 21/1, 2010 at 19:18 Comment(0)
U
9

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:

Undertint answered 21/1, 2010 at 19:2 Comment(1)
This is interesting additional information. It's not, however, really an answer to the question as asked -- to wit, "fourty", "two" should be on one line, according to what the OP is looking for. Also, I think for anyone worth considering which to use, it's worth noting that the ap output shown here couldn't be read back in by a ruby eval (specifically because of the array indices being displayed that way), the way pp output frequently could be (it only changes whitespace for basic object types -- though the time object clearly shows an exception to that). Just food for thought.Salters

© 2022 - 2024 — McMap. All rights reserved.