mirror of
				https://github.com/pry/pry.git
				synced 2022-11-09 12:35:05 -05:00 
			
		
		
		
	ls columns improvement
Now is like /bin/ls, sorting downward, shrink-wrapping columns, and minimizing row usage as best as I know how.
This commit is contained in:
		
							parent
							
								
									e1f6580708
								
							
						
					
					
						commit
						f9b9598c11
					
				
					 3 changed files with 134 additions and 25 deletions
				
			
		| 
						 | 
				
			
			@ -12,9 +12,11 @@ module ::Guard
 | 
			
		|||
      paths.delete('some_lib')
 | 
			
		||||
      puts "Running: #{paths.join ' '}"
 | 
			
		||||
      if paths.size.zero?
 | 
			
		||||
          warn 'Running all tests'
 | 
			
		||||
        system 'rake recspec'
 | 
			
		||||
      else
 | 
			
		||||
        paths.each do |path|
 | 
			
		||||
          warn "Running #{path}"
 | 
			
		||||
          system "rake spec run=#{path}" or return
 | 
			
		||||
          warn "\e[32;1mNice!!\e[0m  Now running all specs, just to be sure."
 | 
			
		||||
          run_all
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,19 +1,91 @@
 | 
			
		|||
class Pry
 | 
			
		||||
 module Helpers
 | 
			
		||||
    module Formatting
 | 
			
		||||
      def self.tablify(things, screen_width)
 | 
			
		||||
        maximum_width = things.map{|t| Pry::Helpers::Text.strip_color(t).length}.max + Pry.config.ls.separator.length
 | 
			
		||||
        maximum_width = screen_width if maximum_width > screen_width
 | 
			
		||||
        columns = screen_width / maximum_width
 | 
			
		||||
 | 
			
		||||
        things.each_slice(columns).map do |slice|
 | 
			
		||||
          slice.map do |s|
 | 
			
		||||
            padding_width = maximum_width - Pry::Helpers::Text.strip_color(s).length
 | 
			
		||||
            padding = Pry.config.ls.separator.ljust(padding_width, Pry.config.ls.separator)
 | 
			
		||||
            s + padding
 | 
			
		||||
          end.join("")
 | 
			
		||||
        end.join("\n")
 | 
			
		||||
      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.to_s
 | 
			
		||||
      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
 | 
			
		||||
 
 | 
			
		||||
| 
						 | 
				
			
			@ -21,10 +93,6 @@ class Pry
 | 
			
		|||
    match 'ls'
 | 
			
		||||
    group 'Context'
 | 
			
		||||
    description 'Show the list of vars and methods in the current scope.'
 | 
			
		||||
 | 
			
		||||
  Pry::Commands.create_command "ls" do
 | 
			
		||||
    group "Context"
 | 
			
		||||
    description "Show the list of vars and methods in the current scope."
 | 
			
		||||
    command_options :shellwords => false, :interpolate => false
 | 
			
		||||
 | 
			
		||||
    def options(opt)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,24 +28,56 @@ describe "ls" do
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe 'Formatting Table' do
 | 
			
		||||
    it 'knows about colorized fitting' do
 | 
			
		||||
      t = Pry::Helpers::Formatting::Table.new %w(hihi), :column_count => 1
 | 
			
		||||
      t.fits_on_line?(4).should == true
 | 
			
		||||
      t.items = []
 | 
			
		||||
      t.fits_on_line?(4).should == true
 | 
			
		||||
 | 
			
		||||
      t.items = %w(hi hi)
 | 
			
		||||
      t.fits_on_line?(4).should == true
 | 
			
		||||
      t.column_count = 2
 | 
			
		||||
      t.fits_on_line?(4).should == false
 | 
			
		||||
 | 
			
		||||
      t.items = %w(
 | 
			
		||||
        a   ccc
 | 
			
		||||
        bb  dddd
 | 
			
		||||
      ).sort
 | 
			
		||||
      t.fits_on_line?(8).should == true
 | 
			
		||||
      t.fits_on_line?(7).should == false
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe 'formatting - should order downward and wrap to columns' do
 | 
			
		||||
    FAKE_COLUMNS = 62
 | 
			
		||||
    def try_round_trip(text)
 | 
			
		||||
      text.strip!
 | 
			
		||||
      things = text.split(/\s+/)
 | 
			
		||||
      actual = Pry::Helpers::Formatting.tablify(things, FAKE_COLUMNS)
 | 
			
		||||
      if actual != text
 | 
			
		||||
        actual.strip.should == text
 | 
			
		||||
        puts text, 'vs.', actual
 | 
			
		||||
    def try_round_trip(expected)
 | 
			
		||||
      things = expected.split(/\s+/).sort
 | 
			
		||||
      actual = Pry::Helpers::Formatting.tablify(things, FAKE_COLUMNS).strip
 | 
			
		||||
      [expected, actual].each{|e| e.gsub! /\s+$/, ''}
 | 
			
		||||
      if actual != expected
 | 
			
		||||
        bar = '-'*25
 | 
			
		||||
        puts \
 | 
			
		||||
          bar+'expected'+bar,
 | 
			
		||||
          expected,
 | 
			
		||||
          bar+'actual'+bar,
 | 
			
		||||
          actual
 | 
			
		||||
      end
 | 
			
		||||
      actual.should == expected
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'should handle a tiny case' do
 | 
			
		||||
      try_round_trip(<<-eot)
 | 
			
		||||
asdf  asfddd  fdass
 | 
			
		||||
      eot
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'should handle the basic case' do
 | 
			
		||||
      try_round_trip(<<-EOT)
 | 
			
		||||
      try_round_trip(<<-eot)
 | 
			
		||||
aadd            ddasffssdad  sdsaadaasd      ssfasaafssd
 | 
			
		||||
adassdfffaasds  f            sdsfasddasfds   ssssdaa
 | 
			
		||||
assfsafsfsds    fsasa        ssdsssafsdasdf
 | 
			
		||||
      EOT
 | 
			
		||||
      eot
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'should handle... another basic case' do
 | 
			
		||||
| 
						 | 
				
			
			@ -61,6 +93,13 @@ asfadsssaaad    fasfaafdssd     s
 | 
			
		|||
      EOT
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'should handle colors' do
 | 
			
		||||
      try_round_trip(<<-EOT)
 | 
			
		||||
\e[31maaaaaaaaaa\e[0m                      \e[31mccccccccccccccccccccccccccccc\e[0m
 | 
			
		||||
\e[31mbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\e[0m  \e[31mddddddddddddd\e[0m
 | 
			
		||||
      EOT
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'should handle empty input' do
 | 
			
		||||
      try_round_trip('')
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue