mirror of
https://github.com/pry/pry.git
synced 2022-11-09 12:35:05 -05:00
14283aa51f
The previous table output was geared mostly for `ls _pry_`, which isn't a common of hierarchy. After feedback from users such as @envygeeks, we found a few tweaks that would help the really-small layers such as those found in Rails or in small classes, namely: - Rolling it up onto one line, if possible - Highlighting the heading in the colors familiar to users of GNU ls for "directory" style Additionally, I took the opportunity for toning down the private/protected method colors, because before they were green and yellow, now they're both "muted terminal blue" Without the ability to really get in and really distinguish colors (e.g. using 256 colors), giving "protected" such a loud color seems wrong. Before recoloring: https://github.com/pry/pry/issues/813#issuecomment-12355179 After: https://github.com/pry/pry/issues/813#issuecomment-12355941
109 lines
2.8 KiB
Ruby
109 lines
2.8 KiB
Ruby
class Pry
|
|
module Helpers
|
|
def self.tablify_or_one_line(heading, things)
|
|
plain_heading = Pry::Helpers::Text.strip_color(heading)
|
|
attempt = Table.new(things, :column_count => things.size)
|
|
if attempt.fits_on_line?(TerminalInfo.width! - plain_heading.size - 2)
|
|
"#{heading}: #{attempt}\n"
|
|
else
|
|
"#{heading}: \n#{tablify_to_screen_width(things, :indent => ' ')}\n"
|
|
end
|
|
end
|
|
|
|
def self.tablify_to_screen_width(things, options = {})
|
|
things = things.compact
|
|
if indent = options[:indent]
|
|
usable_width = TerminalInfo.width! - indent.size
|
|
tablify(things, usable_width).to_s.gsub(/^/, indent)
|
|
else
|
|
tablify(things, TerminalInfo.width!).to_s
|
|
end
|
|
end
|
|
|
|
def self.tablify(things, line_length)
|
|
table = Table.new(things, :column_count => things.size)
|
|
table.column_count -= 1 until 0 == table.column_count or
|
|
table.fits_on_line?(line_length)
|
|
table
|
|
end
|
|
|
|
class Table
|
|
attr_reader :items, :column_count
|
|
def initialize items, args = {}
|
|
@column_count = args[:column_count]
|
|
self.items = items
|
|
end
|
|
|
|
def to_s
|
|
rows_to_s.join("\n")
|
|
end
|
|
|
|
def rows_to_s style = :color_on
|
|
widths = columns.map{|e| _max_width(e)}
|
|
@rows_without_colors.map do |r|
|
|
padded = []
|
|
r.each_with_index do |e,i|
|
|
next unless e
|
|
item = e.ljust(widths[i])
|
|
item.sub! e, _recall_color_for(e) if :color_on == style
|
|
padded << item
|
|
end
|
|
padded.join(Pry.config.ls.separator)
|
|
end
|
|
end
|
|
|
|
def items= items
|
|
@items = items
|
|
_rebuild_colorless_cache
|
|
_recolumn
|
|
items
|
|
end
|
|
|
|
def column_count= n
|
|
@column_count = n
|
|
_recolumn
|
|
end
|
|
|
|
def fits_on_line? line_length
|
|
_max_width(rows_to_s :no_color) <= line_length
|
|
end
|
|
|
|
def columns
|
|
@rows_without_colors.transpose
|
|
end
|
|
|
|
def ==(other); items == other.to_a end
|
|
def to_a; items.to_a end
|
|
|
|
private
|
|
def _max_width(things)
|
|
things.compact.map(&:size).max || 0
|
|
end
|
|
|
|
def _rebuild_colorless_cache
|
|
@colorless_cache = {}
|
|
@plain_items = []
|
|
items.map do |e|
|
|
plain = Pry::Helpers::Text.strip_color(e)
|
|
@colorless_cache[plain] = e
|
|
@plain_items << plain
|
|
end
|
|
end
|
|
|
|
def _recolumn
|
|
@rows_without_colors = []
|
|
return if items.size.zero?
|
|
row_count = (items.size.to_f/column_count).ceil
|
|
row_count.times do |i|
|
|
row_indices = (0...column_count).map{|e| row_count*e+i}
|
|
@rows_without_colors << row_indices.map{|e| @plain_items[e]}
|
|
end
|
|
end
|
|
|
|
def _recall_color_for thing
|
|
@colorless_cache[thing]
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|