tabularize 0.2.5 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +11 -0
- data/Gemfile.lock +1 -1
- data/README.md +17 -10
- data/lib/tabularize.rb +73 -41
- data/lib/tabularize/version.rb +1 -1
- data/test/readme.rb +3 -2
- data/test/test_tabularize.rb +29 -2
- metadata +2 -2
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/Gemfile.lock
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -46,9 +46,11 @@ puts table | |
| 46 46 | 
             
             * `:pad_left` Size of left padding
         | 
| 47 47 | 
             
             * `:pad_right` Size of right padding
         | 
| 48 48 | 
             
            * Border
         | 
| 49 | 
            +
             * `:border_style` Predefined border styles. `:ascii` (default) and `:unicode`
         | 
| 50 | 
            +
             * `:border_color` ANSI color code for borders
         | 
| 49 51 | 
             
             * `:hborder` Character for horizontal border
         | 
| 50 52 | 
             
             * `:vborder` Character for vertical border
         | 
| 51 | 
            -
             * `:iborder`  | 
| 53 | 
            +
             * `:iborder` Array of 9 characters for intersection points. e.g. `%w[┌ ┬ ┐ ├ ┼ ┤ └ ┴ ┘]`
         | 
| 52 54 | 
             
            * Alignment
         | 
| 53 55 | 
             
             * `:align` Horizontal alignment. `:left`, `:center`, `:right`, or Array of the three options
         | 
| 54 56 | 
             
             * `:valign` Vertical alignment. `:top`, `:middle`, `:bottom`, or Array of the three options
         | 
| @@ -57,7 +59,11 @@ puts table | |
| 57 59 | 
             
             * `:ellipsis` Ellipsis string when cells are cut off. Default: `>`
         | 
| 58 60 |  | 
| 59 61 | 
             
            ```ruby
         | 
| 62 | 
            +
            require 'ansi'
         | 
| 63 | 
            +
             | 
| 60 64 | 
             
            table = Tabularize.new :pad     => '.', :pad_left => 2,  :pad_right => 0,
         | 
| 65 | 
            +
                                   :border_style => :unicode,
         | 
| 66 | 
            +
                                   :border_color => ANSI::Code.red,
         | 
| 61 67 | 
             
                                   :hborder => '~', :vborder => 'I', :iborder => '#',
         | 
| 62 68 | 
             
                                   :align   => [:left, :center, :right],
         | 
| 63 69 | 
             
                                   :valign  => [:top, :bottom, :middle, :middle],
         | 
| @@ -71,15 +77,15 @@ puts table | |
| 71 77 | 
             
            ```
         | 
| 72 78 |  | 
| 73 79 | 
             
            ```
         | 
| 74 | 
            -
             | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 80 | 
            +
            ┌─────────────┬─────────────┬─────────────────────────────┬──────────~
         | 
| 81 | 
            +
            │..Name.......│.....Dept....│.....................Location│.....Phone~
         | 
| 82 | 
            +
            ├─────────────┼─────────────┼─────────────────────────────┼──────────~
         | 
| 83 | 
            +
            │..John Doe...│....Finance..│.........Los Angeles CA 90089│..555-1555~
         | 
| 84 | 
            +
            │..Average Joe│..Engineering│...Somewhere over the rainbow│.......N/A~
         | 
| 85 | 
            +
            │..홍길동.....│.............│..서울역 3번 출구 김씨 옆자리│..........~
         | 
| 86 | 
            +
            │.............│.............│.............................│.......N/A~
         | 
| 87 | 
            +
            │.............│...탁상 3부..│.....................맞습니다│..........~
         | 
| 88 | 
            +
            └─────────────┴─────────────┴─────────────────────────────┴──────────~
         | 
| 83 89 | 
             
            ```
         | 
| 84 90 |  | 
| 85 91 | 
             
            Tabularize.it
         | 
| @@ -206,6 +212,7 @@ There are a few things, however, [tabularize](https://github.com/junegunn/tabula | |
| 206 212 | 
             
            - It correctly formats cells containing CJK wide characters.
         | 
| 207 213 | 
             
            - Vertical alignment for multi-line cells
         | 
| 208 214 | 
             
            - Cutting off trailing cells when the width of the output string exceeds specified screen width
         | 
| 215 | 
            +
            - Customizable border style
         | 
| 209 216 |  | 
| 210 217 | 
             
            Copyright
         | 
| 211 218 | 
             
            ---------
         | 
    
        data/lib/tabularize.rb
    CHANGED
    
    | @@ -1,21 +1,22 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            require "tabularize/version"
         | 
| 2 4 | 
             
            require 'stringio'
         | 
| 3 5 | 
             
            require 'unicode/display_width'
         | 
| 4 6 |  | 
| 5 7 | 
             
            class Tabularize
         | 
| 6 8 | 
             
              DEFAULT_OPTIONS = {
         | 
| 7 | 
            -
                :align | 
| 8 | 
            -
                :valign | 
| 9 | 
            -
                :pad | 
| 10 | 
            -
                :pad_left | 
| 11 | 
            -
                :pad_right | 
| 9 | 
            +
                :align        => :left,
         | 
| 10 | 
            +
                :valign       => :top,
         | 
| 11 | 
            +
                :pad          => ' ',
         | 
| 12 | 
            +
                :pad_left     => 0,
         | 
| 13 | 
            +
                :pad_right    => 0,
         | 
| 12 14 |  | 
| 13 | 
            -
                : | 
| 14 | 
            -
                : | 
| 15 | 
            -
                :iborder   => '+',
         | 
| 15 | 
            +
                :border_style => :ascii,
         | 
| 16 | 
            +
                :border_color => nil,
         | 
| 16 17 |  | 
| 17 | 
            -
                :unicode | 
| 18 | 
            -
                :ansi | 
| 18 | 
            +
                :unicode      => true,
         | 
| 19 | 
            +
                :ansi         => true,
         | 
| 19 20 |  | 
| 20 21 | 
             
                :ellipsis     => '>',
         | 
| 21 22 | 
             
                :screen_width => nil,
         | 
| @@ -26,6 +27,19 @@ class Tabularize | |
| 26 27 | 
             
                :pad_right => 1,
         | 
| 27 28 | 
             
              }
         | 
| 28 29 |  | 
| 30 | 
            +
              BORDER_STYLE = {
         | 
| 31 | 
            +
                :ascii => {
         | 
| 32 | 
            +
                  :hborder      => '-',
         | 
| 33 | 
            +
                  :vborder      => '|',
         | 
| 34 | 
            +
                  :iborder      => %w[+ + + + + + + + +],
         | 
| 35 | 
            +
                },
         | 
| 36 | 
            +
                :unicode => {
         | 
| 37 | 
            +
                  :hborder      => '─',
         | 
| 38 | 
            +
                  :vborder      => '│',
         | 
| 39 | 
            +
                  :iborder      => %w[┌ ┬ ┐ ├ ┼ ┤ └ ┴ ┘],
         | 
| 40 | 
            +
                }
         | 
| 41 | 
            +
              }
         | 
| 42 | 
            +
             | 
| 29 43 | 
             
              # @since 0.2.0
         | 
| 30 44 | 
             
              def initialize options = {}
         | 
| 31 45 | 
             
                @rows    = []
         | 
| @@ -33,6 +47,14 @@ class Tabularize | |
| 33 47 | 
             
                @options = DEFAULT_OPTIONS.
         | 
| 34 48 | 
             
                           merge(DEFAULT_OPTIONS_GENERATOR).
         | 
| 35 49 | 
             
                           merge(options)
         | 
| 50 | 
            +
                if @options[:border_style]
         | 
| 51 | 
            +
                  @options = BORDER_STYLE[@options[:border_style]].merge(@options)
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  # Backward-compatibility
         | 
| 54 | 
            +
                  unless @options[:iborder].is_a?(Array)
         | 
| 55 | 
            +
                    @options[:iborder] = [@options[:iborder]] * 9
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
                end
         | 
| 36 58 | 
             
                @cache   = {}
         | 
| 37 59 | 
             
              end
         | 
| 38 60 |  | 
| @@ -66,12 +88,12 @@ class Tabularize | |
| 66 88 | 
             
                    num_cached_rows = 0
         | 
| 67 89 | 
             
                  else
         | 
| 68 90 | 
             
                    [@seps[@rows.length] - @cache[:last_seps], 0].max.times do
         | 
| 69 | 
            -
                      @cache[:string_io].puts @cache[: | 
| 91 | 
            +
                      @cache[:string_io].puts @cache[:separators][1]
         | 
| 70 92 | 
             
                    end
         | 
| 71 93 | 
             
                    @cache[:last_seps] = @seps[@rows.length]
         | 
| 72 94 |  | 
| 73 95 | 
             
                    if num_cached_rows == @rows.length
         | 
| 74 | 
            -
                      return @cache[:string_io].string + @cache[: | 
| 96 | 
            +
                      return @cache[:string_io].string + @cache[:separators].last
         | 
| 75 97 | 
             
                    end
         | 
| 76 98 | 
             
                  end
         | 
| 77 99 | 
             
                end
         | 
| @@ -80,63 +102,73 @@ class Tabularize | |
| 80 102 |  | 
| 81 103 | 
             
                h  = @options[:hborder]
         | 
| 82 104 | 
             
                v  = @options[:vborder]
         | 
| 83 | 
            -
                i  = @options[:iborder]
         | 
| 84 105 | 
             
                vl = @options[:vborder]
         | 
| 85 | 
            -
                 | 
| 106 | 
            +
                i9 = @options[:iborder]
         | 
| 107 | 
            +
                e  = @options[:ellipsis]
         | 
| 108 | 
            +
                c  = @options[:border_color] || ''
         | 
| 109 | 
            +
                r  = c.empty? ? '' : "\e[0m"
         | 
| 86 110 | 
             
                u  = @options[:unicode]
         | 
| 87 111 | 
             
                a  = @options[:ansi]
         | 
| 88 112 | 
             
                sw = @options[:screen_width]
         | 
| 89 | 
            -
                el = Tabularize.cell_width( | 
| 113 | 
            +
                el = Tabularize.cell_width(e, u, a)
         | 
| 90 114 |  | 
| 91 | 
            -
                 | 
| 115 | 
            +
                separators = @cache[:separators]
         | 
| 92 116 | 
             
                col_count = @cache[:col_count]
         | 
| 93 | 
            -
                 | 
| 94 | 
            -
                   | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 99 | 
            -
             | 
| 100 | 
            -
             | 
| 117 | 
            +
                separators ||= 
         | 
| 118 | 
            +
                  Array.new(3) {''}.zip(i9.each_slice(3).to_a).map { |separator, i3|
         | 
| 119 | 
            +
                    rows[0].each_with_index do |ch, idx|
         | 
| 120 | 
            +
                      new_sep = separator + i3[idx == 0 ? 0 : 1] + h * Tabularize.cell_width(ch, u, a)
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                      if sw && Tabularize.cell_width(new_sep, u, a) > sw - el
         | 
| 123 | 
            +
                        col_count = idx
         | 
| 124 | 
            +
                        break
         | 
| 125 | 
            +
                      else
         | 
| 126 | 
            +
                        separator = new_sep
         | 
| 127 | 
            +
                      end
         | 
| 128 | 
            +
                    end
         | 
| 129 | 
            +
                    separator += col_count ? e : i3.last
         | 
| 130 | 
            +
                    if c
         | 
| 131 | 
            +
                      c + separator + r
         | 
| 101 132 | 
             
                    else
         | 
| 102 | 
            -
                      separator | 
| 133 | 
            +
                      separator
         | 
| 103 134 | 
             
                    end
         | 
| 104 | 
            -
                   | 
| 105 | 
            -
                  separator += il
         | 
| 106 | 
            -
                end
         | 
| 135 | 
            +
                  }
         | 
| 107 136 |  | 
| 108 | 
            -
                output = @cache[:string_io] || StringIO.new.tap { |io|  | 
| 137 | 
            +
                output = @cache[:string_io] || StringIO.new.tap { |io| 
         | 
| 138 | 
            +
                  io.set_encoding 'UTF-8' if io.respond_to? :set_encoding
         | 
| 139 | 
            +
                  io.puts separators.first
         | 
| 140 | 
            +
                }
         | 
| 109 141 | 
             
                if col_count
         | 
| 110 142 | 
             
                  rows = rows.map { |line| line[0, col_count] }
         | 
| 111 | 
            -
                  vl =  | 
| 143 | 
            +
                  vl = e
         | 
| 112 144 | 
             
                end
         | 
| 113 145 | 
             
                rows.each_with_index do |row, idx|
         | 
| 114 146 | 
             
                  row = row.map { |val| val.lines.to_a.map(&:chomp) }
         | 
| 115 147 | 
             
                  height = row[0] ? row[0].count : 1
         | 
| 116 148 | 
             
                  @seps[idx + num_cached_rows].times do
         | 
| 117 | 
            -
                    output.puts  | 
| 149 | 
            +
                    output.puts separators[1]
         | 
| 118 150 | 
             
                  end
         | 
| 119 151 | 
             
                  (0...height).each do |line|
         | 
| 120 | 
            -
                    output.print v unless row.empty?
         | 
| 152 | 
            +
                    output.print c + v + r unless row.empty?
         | 
| 121 153 | 
             
                    output.puts row.map { |lines|
         | 
| 122 154 | 
             
                      lines[line] || @options[:pad] * Tabularize.cell_width(lines[0], u, a)
         | 
| 123 | 
            -
                    }.join(v) + vl
         | 
| 155 | 
            +
                    }.join(c + v + r) + c + vl + r
         | 
| 124 156 | 
             
                  end
         | 
| 125 157 | 
             
                end
         | 
| 126 158 |  | 
| 127 159 | 
             
                @seps[rows.length + num_cached_rows].times do
         | 
| 128 | 
            -
                  output.puts  | 
| 160 | 
            +
                  output.puts separators[1]
         | 
| 129 161 | 
             
                end
         | 
| 130 162 |  | 
| 131 163 | 
             
                @cache = {
         | 
| 132 | 
            -
                  :analysis | 
| 133 | 
            -
                  : | 
| 134 | 
            -
                  :col_count | 
| 135 | 
            -
                  :num_rows | 
| 136 | 
            -
                  :string_io | 
| 137 | 
            -
                  :last_seps | 
| 164 | 
            +
                  :analysis   => analysis,
         | 
| 165 | 
            +
                  :separators => separators,
         | 
| 166 | 
            +
                  :col_count  => col_count,
         | 
| 167 | 
            +
                  :num_rows   => @rows.length,
         | 
| 168 | 
            +
                  :string_io  => output,
         | 
| 169 | 
            +
                  :last_seps  => @seps[rows.length]
         | 
| 138 170 | 
             
                }
         | 
| 139 | 
            -
                output.string +  | 
| 171 | 
            +
                output.string + separators.last
         | 
| 140 172 | 
             
              rescue Exception
         | 
| 141 173 | 
             
                @cache = {}
         | 
| 142 174 | 
             
                raise
         | 
    
        data/lib/tabularize/version.rb
    CHANGED
    
    
    
        data/test/readme.rb
    CHANGED
    
    | @@ -9,10 +9,11 @@ require 'tabularize' | |
| 9 9 |  | 
| 10 10 | 
             
            table = Tabularize.new
         | 
| 11 11 | 
             
            table = Tabularize.new :pad     => '.', :pad_left => 2,  :pad_right => 0,
         | 
| 12 | 
            -
                                   : | 
| 12 | 
            +
                                   :border_style => :unicode,
         | 
| 13 | 
            +
                                   :border_color => ANSI::Code.red,
         | 
| 13 14 | 
             
                                   :align   => [:left, :center, :right],
         | 
| 14 15 | 
             
                                   :valign  => [:top, :bottom, :middle, :middle],
         | 
| 15 | 
            -
                                   :screen_width => 75, :ellipsis => ' | 
| 16 | 
            +
                                   :screen_width => 75, :ellipsis => '~'
         | 
| 16 17 | 
             
            table << %w[Name Dept Location Phone Description]
         | 
| 17 18 | 
             
            table.separator!
         | 
| 18 19 | 
             
            table << ['John Doe', 'Finance', 'Los Angeles CA 90089', '555-1555', 'Just a guy']
         | 
    
        data/test/test_tabularize.rb
    CHANGED
    
    | @@ -118,6 +118,8 @@ class TestTabularize < Test::Unit::TestCase | |
| 118 118 |  | 
| 119 119 | 
             
              # TODO: Need assertion
         | 
| 120 120 | 
             
              def test_tabularize_csv
         | 
| 121 | 
            +
                return if RUBY_VERSION =~ /^1\.8\./
         | 
| 122 | 
            +
             | 
| 121 123 | 
             
                sio = StringIO.new
         | 
| 122 124 |  | 
| 123 125 | 
             
                {
         | 
| @@ -141,7 +143,7 @@ class TestTabularize < Test::Unit::TestCase | |
| 141 143 |  | 
| 142 144 | 
             
              def test_invalid_arguments
         | 
| 143 145 | 
             
                assert_raise(ArgumentError) { Tabularize.it(5) }
         | 
| 144 | 
            -
                assert_raise(ArgumentError) { Tabularize.it("hello") }
         | 
| 146 | 
            +
                assert_raise(ArgumentError) { Tabularize.it("hello") } unless RUBY_VERSION =~ /^1\.8\./
         | 
| 145 147 | 
             
                assert_raise(ArgumentError) { Tabularize.it([1, 2, 3], :align => :noidea) }
         | 
| 146 148 | 
             
                assert_raise(ArgumentError) { Tabularize.it([1, 2, 3], :valign => :noidea) }
         | 
| 147 149 | 
             
                assert_raise(ArgumentError) { Tabularize.it([1, 2, 3], :align => [:center, :top]) }
         | 
| @@ -263,7 +265,32 @@ I..This should change everything doh!I.............I............................ | |
| 263 265 | 
             
                  t << %w[12345]
         | 
| 264 266 | 
             
                  puts t.to_s
         | 
| 265 267 | 
             
                  assert t.to_s.lines.all? { |line| line.chomp.length <= w }
         | 
| 266 | 
            -
                  assert t.to_s.lines.all? { |line|  | 
| 268 | 
            +
                  assert t.to_s.lines.all? { |line| line.chomp.reverse[0, 1] == '>' }
         | 
| 267 269 | 
             
                end
         | 
| 268 270 | 
             
              end
         | 
| 271 | 
            +
             | 
| 272 | 
            +
              def test_readme
         | 
| 273 | 
            +
                table = Tabularize.new
         | 
| 274 | 
            +
                table = Tabularize.new :pad     => '.', :pad_left => 2,  :pad_right => 0,
         | 
| 275 | 
            +
                                       :border_style => :unicode,
         | 
| 276 | 
            +
                                       :align   => [:left, :center, :right],
         | 
| 277 | 
            +
                                       :valign  => [:top, :bottom, :middle, :middle],
         | 
| 278 | 
            +
                                       :screen_width => 75, :ellipsis => '~'
         | 
| 279 | 
            +
                table << %w[Name Dept Location Phone Description]
         | 
| 280 | 
            +
                table.separator!
         | 
| 281 | 
            +
                table << ['John Doe', 'Finance', 'Los Angeles CA 90089', '555-1555', 'Just a guy']
         | 
| 282 | 
            +
                table << ['Average Joe', 'Engineering', 'Somewhere over the rainbow', 'N/A', 'Unknown']
         | 
| 283 | 
            +
                table << ['홍길동', '탁상 3부', "서울역 3번 출구 김씨 옆자리\n\n맞습니다", 'N/A', 'No description']
         | 
| 284 | 
            +
                assert_equal "
         | 
| 285 | 
            +
            ┌─────────────┬─────────────┬─────────────────────────────┬──────────~
         | 
| 286 | 
            +
            │..Name.......│.....Dept....│.....................Location│.....Phone~
         | 
| 287 | 
            +
            ├─────────────┼─────────────┼─────────────────────────────┼──────────~
         | 
| 288 | 
            +
            │..John Doe...│....Finance..│.........Los Angeles CA 90089│..555-1555~
         | 
| 289 | 
            +
            │..Average Joe│..Engineering│...Somewhere over the rainbow│.......N/A~
         | 
| 290 | 
            +
            │..홍길동.....│.............│..서울역 3번 출구 김씨 옆자리│..........~
         | 
| 291 | 
            +
            │.............│.............│.............................│.......N/A~
         | 
| 292 | 
            +
            │.............│...탁상 3부..│.....................맞습니다│..........~
         | 
| 293 | 
            +
            └─────────────┴─────────────┴─────────────────────────────┴──────────~
         | 
| 294 | 
            +
            ".strip, table.to_s
         | 
| 295 | 
            +
              end
         | 
| 269 296 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: tabularize
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.2. | 
| 4 | 
            +
              version: 0.2.7
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2012- | 
| 12 | 
            +
            date: 2012-08-01 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: awesome_print
         |