yummi 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -36,13 +36,14 @@ opt = OptionParser::new
36
36
  @table.format :value, :using => lambda { |value| "%.2f" % value.abs }
37
37
  # shows totals rounded
38
38
  @table.format :total, :using => Yummi::Formatters.round(2)
39
+ @table.format_null :with => 'none'
39
40
  # table data
40
- @table.data = [['Initial', 0, 0, false],
41
+ @table.data = [['Initial', 0, 0, false, nil],
41
42
  ['Deposit', 100.58, 100.58, true, "QAWSEDRFTGH535"],
42
43
  ['Withdraw', -50.23, 50.35, true, "34ERDTF6GYU"],
43
44
  ['Withdraw', -100, -49.65, true, "2344EDRFT5"],
44
- ['Deposit', 50, 0.35, false],
45
- ['Deposit', 600, 600.35, false]]
45
+ ['Deposit', 50, 0.35, false, nil],
46
+ ['Deposit', 600, 600.35, false, nil]]
46
47
 
47
48
  opt.on '--color TYPE', 'Specify the color type (zebra,full,none)' do |type|
48
49
  case type
@@ -68,6 +69,7 @@ opt.on '--color TYPE', 'Specify the color type (zebra,full,none)' do |type|
68
69
  @table.row_colorizer do |data| # or |data, index| if you need the index
69
70
  :white if data[:value] > data[:total]
70
71
  end
72
+ @table.colorize_null :with => :red
71
73
  when 'none'
72
74
  @table.no_colors
73
75
  else
@@ -67,7 +67,7 @@ opt.on '--color TYPE', 'Specify the color type (zebra,row,cell,none)' do |type|
67
67
  end
68
68
  opt.on '--layout LAYOUT', 'Defines the table layout (horizontal or vertical)' do |layout|
69
69
  case layout
70
- when 'horizonta'
70
+ when 'horizontal'
71
71
  @table.layout = :horizontal
72
72
  when 'vertical'
73
73
  @table.layout = :vertical
data/lib/yummi.rb CHANGED
@@ -25,82 +25,82 @@ require_relative "yummi/version"
25
25
  module Yummi
26
26
  # Base for colorizing
27
27
  module Color
28
+
29
+ # The Color Schema Definition
30
+ module Schema
31
+ # Normal Linux Terminal Colors, used by default in normal, underscore, blink and
32
+ # highlight color types
33
+ NORMAL_COLORS = {
34
+ :colors => [:black, :red, :green, :brown, :blue, :purple, :cyan, :gray],
35
+ :default => :gray
36
+ }
37
+ # Intense Linux Terminal Colors, used by default in intense and strong color types
38
+ ALTERNATE_COLORS = {
39
+ :colors => [:gray, :red, :green, :yellow, :blue, :purple, :cyan, :white],
40
+ :default => :gray
41
+ }
42
+ end
43
+
28
44
  # Colors from default linux terminal scheme
29
- COLORS = {
30
- :black => '0;30',
31
- :red => '0;31',
32
- :green => '0;32',
33
- :brown => '0;33',
34
- :blue => '0;34',
35
- :purple => '0;35',
36
- :cyan => '0;36',
37
- :gray => '0;37',
38
-
39
- :black_underscored => '4;30',
40
- :red_underscored => '4;31',
41
- :green_underscored => '4;32',
42
- :brown_underscored => '4;33',
43
- :blue_underscored => '4;34',
44
- :purple_underscored => '4;35',
45
- :cyan_underscored => '4;36',
46
- :gray_underscored => '4;37',
47
-
48
- :blink_black => '5;30',
49
- :blink_red => '5;31',
50
- :blink_green => '5;32',
51
- :blink_brown => '5;33',
52
- :blink_blue => '5;34',
53
- :blink_purple => '5;35',
54
- :blink_cyan => '5;36',
55
- :blink_gray => '5;37',
56
-
57
- :highlight_black => '7;30',
58
- :highlight_red => '7;31',
59
- :highlight_green => '7;32',
60
- :highlight_brown => '7;33',
61
- :highlight_blue => '7;34',
62
- :highlight_purple => '7;35',
63
- :highlight_cyan => '7;36',
64
- :highlight_gray => '7;37',
65
-
66
- :intense_gray => '1;30',
67
- :intense_red => '1;31',
68
- :intense_green => '1;32',
69
- :intense_yellow => '1;33',
70
- :yellow => '1;33',
71
- :intense_blue => '1;34',
72
- :intense_purple => '1;35',
73
- :intense_cyan => '1;36',
74
- :intense_white => '1;37',
75
- :white => '1;37'
76
- }
77
- # Types of color
78
- TYPES = {
79
- :normal => 0,
80
- :intense => 1,
81
- :underscored => 4,
82
- :blink => 5,
83
- :highlight => 7
84
- }
85
- # Parses the key
86
- def self.parse key
87
- keys = key.to_s.split '_'
88
- type = keys[0].to_sym
89
- color = keys[1].to_i
90
- "#{TYPES[type]};3#{color - 1}"
45
+ COLORS = {}
46
+
47
+ #
48
+ # Clears all color mappings and add this ones
49
+ #
50
+ # see #add_color_map
51
+ #
52
+ def self.load_color_map mappings
53
+ COLORS.clear
54
+ add_color_map mappings
55
+ end
56
+
57
+ #
58
+ # Adds the given color mappings, overriding the already defined.
59
+ #
60
+ # Colors are printed using a "[#{type_key_code}:3#{color_key_code}m" prefix.
61
+ #
62
+ # === Args
63
+ #
64
+ # The mappings is a Hash of Hashes, each parent hash must define a type key and the
65
+ # child hash must contain the following keys:
66
+ #
67
+ # +key_code+::
68
+ # The key code to map this type. If the type name is :default, the mapping will not
69
+ # use the name "default" (:normal_red will become only :red)
70
+ # +schema+::
71
+ # An array with the color names. Each name will be mapped and their positions
72
+ # (1 based) too. (:intense_red and :intense_2, for example)
73
+ #
74
+ def self.add_color_map mappings
75
+ mappings.each do |type, config|
76
+ schema = config[:schema]
77
+ schema[:colors].each_with_index do |color, key_code|
78
+ # maps the default color for a type
79
+ COLORS[type] = "#{config[:key_code]};3#{key_code}" if color == schema[:default]
80
+ # do not use prefix if schema is default
81
+ prefix = (type == :default ? '' : "#{type}_")
82
+ # maps the color using color name
83
+ key = "#{prefix}#{color}"
84
+ COLORS[key.to_sym] = "#{config[:key_code]};3#{key_code}"
85
+ # maps the color using color key code
86
+ key = "#{prefix}#{key_code + 1}"
87
+ COLORS[key.to_sym] = "#{config[:key_code]};3#{key_code}"
88
+ # maps the color using color name if default schema does not defines it
89
+ # example: yellow and white are present only in strong/intense schema
90
+ COLORS[color.to_sym] = "#{config[:key_code]};3#{key_code}" unless COLORS[color]
91
+ end
92
+ end
91
93
  end
92
94
 
93
95
  # Escape the given text with the given color code
94
96
  def self.escape key
95
- return key unless key
96
- color = (COLORS[key.to_sym] or key)
97
- color ||= parse(key)
98
- "\033[#{color}m"
97
+ return key unless key and COLORS[key.to_sym]
98
+ "\033[#{COLORS[key.to_sym]}m"
99
99
  end
100
100
 
101
101
  # Colorize the given text with the given color
102
102
  def self.colorize string, color
103
- color, end_color = [color, '0;0'].map { |key| Color.escape(key) }
103
+ color, end_color = [color, "\033[0;0m"].map { |key| Color.escape(key) }
104
104
  color ? "#{color}#{string}#{end_color}" : string
105
105
  end
106
106
 
@@ -132,7 +132,7 @@ module Yummi
132
132
  # context = :max => 10, :curr => 5, ratio => 0.15
133
133
  # percentage = BlockHandler.call_block(context) { |max,curr| curr.to_f / max }
134
134
  #
135
- def block_call context, &block
135
+ def block_call (context, &block)
136
136
  args = []
137
137
  block.parameters.each do |parameter|
138
138
  args << context[parameter[1]]
@@ -219,7 +219,7 @@ module Yummi
219
219
  # convention, the first argument must be the object to colorize (to_s is called on it
220
220
  # for getting the text to colorize).
221
221
  #
222
- def colorize *args
222
+ def colorize (*args)
223
223
  color = call *args
224
224
  Yummi.colorize args.first.to_s, color
225
225
  end
@@ -268,7 +268,7 @@ module Yummi
268
268
  include Yummi::Colorizer
269
269
 
270
270
  # Creates a new colorizer using the given colors
271
- def initialize *colors
271
+ def initialize (*colors)
272
272
  @colors = colors
273
273
  @count = -1
274
274
  end
@@ -299,7 +299,7 @@ module Yummi
299
299
  class EvalColorizer
300
300
  include Yummi::Colorizer
301
301
 
302
- def initialize &block
302
+ def initialize (&block)
303
303
  @block = block
304
304
  @colors = []
305
305
  @eval_blocks = []
@@ -311,17 +311,17 @@ module Yummi
311
311
  #
312
312
  # An objtect that responds to :call may also be used.
313
313
  #
314
- def use color, component = nil, &eval_block
314
+ def use (color, component = nil, &eval_block)
315
315
  @colors << color
316
316
  @eval_blocks << (component or eval_block)
317
317
  end
318
318
 
319
319
  # Resolves the value using the main block and given arguments
320
- def resolve_value *args
320
+ def resolve_value (*args)
321
321
  @block.call *args
322
322
  end
323
323
 
324
- def call *args
324
+ def call (*args)
325
325
  value = resolve_value *args
326
326
  @eval_blocks.each_index do |i|
327
327
  return @colors[i] if @eval_blocks[i].call(value)
@@ -349,7 +349,7 @@ module Yummi
349
349
  class DataEvalColorizer < EvalColorizer
350
350
  include Yummi::BlockHandler, Yummi::Colorizer
351
351
 
352
- def resolve_value *args
352
+ def resolve_value (*args)
353
353
  block_call args.first, &@block # by convention, the first arg is data
354
354
  end
355
355
 
@@ -361,7 +361,7 @@ module Yummi
361
361
  module FormatterBlock
362
362
 
363
363
  # Calls the :call: method
364
- def format value
364
+ def format (value)
365
365
  call value
366
366
  end
367
367
 
@@ -434,12 +434,12 @@ module Yummi
434
434
  # A class to expose indexed data by numeric indexes and aliases.
435
435
  class IndexedData
436
436
 
437
- def initialize aliases, data
437
+ def initialize (aliases, data)
438
438
  @aliases = aliases
439
439
  @data = data
440
440
  end
441
441
 
442
- def [] value
442
+ def [](value)
443
443
  if value.is_a? Fixnum
444
444
  @data[value]
445
445
  else
@@ -463,21 +463,21 @@ module Yummi
463
463
  # should be ignored
464
464
  # - message: the message to send. Defaults to :call
465
465
  #
466
- def initialize params = {}
466
+ def initialize (params = {})
467
467
  @components = []
468
468
  @call_all = params[:call_all]
469
469
  @message = (params[:message] or :call)
470
470
  end
471
471
 
472
472
  # Adds a new component
473
- def << component = nil, &block
473
+ def << (component = nil, &block)
474
474
  @components << (component or block)
475
475
  end
476
476
 
477
477
  #
478
478
  # Calls the added components by sending the configured message and the given args.
479
479
  #
480
- def call *args
480
+ def call (*args)
481
481
  result = nil
482
482
  @components.each do |component|
483
483
  break if result and not @call_all
@@ -492,6 +492,7 @@ end
492
492
 
493
493
  require_relative 'yummi/no_colors' if RUBY_PLATFORM['mingw'] #Windows
494
494
 
495
+ require_relative 'yummi/color_mapping'
495
496
  require_relative 'yummi/table'
496
497
  require_relative 'yummi/text_box'
497
498
  require_relative 'yummi/logger'
@@ -0,0 +1,60 @@
1
+ # The MIT License
2
+ #
3
+ # Copyright (c) 2012 Marcelo Guimarães <ataxexe@gmail.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+
23
+ Yummi::Color::load_color_map(
24
+ :default => {
25
+ :key_code => 0,
26
+ :schema => Yummi::Color::Schema::NORMAL_COLORS
27
+ },
28
+ :intense => {
29
+ :key_code => 1,
30
+ :schema => Yummi::Color::Schema::ALTERNATE_COLORS
31
+ },
32
+ :strong => {
33
+ :key_code => 1,
34
+ :schema => Yummi::Color::Schema::ALTERNATE_COLORS
35
+ },
36
+ :underscore => {
37
+ :key_code => 4,
38
+ :schema => Yummi::Color::Schema::NORMAL_COLORS
39
+ },
40
+ :underscored => {
41
+ :key_code => 4,
42
+ :schema => Yummi::Color::Schema::NORMAL_COLORS
43
+ },
44
+ :blink => {
45
+ :key_code => 5,
46
+ :schema => Yummi::Color::Schema::NORMAL_COLORS
47
+ },
48
+ :blinking => {
49
+ :key_code => 5,
50
+ :schema => Yummi::Color::Schema::NORMAL_COLORS
51
+ },
52
+ :highlight => {
53
+ :key_code => 7,
54
+ :schema => Yummi::Color::Schema::NORMAL_COLORS
55
+ },
56
+ :highlighted => {
57
+ :key_code => 7,
58
+ :schema => Yummi::Color::Schema::NORMAL_COLORS
59
+ }
60
+ )
data/lib/yummi/table.rb CHANGED
@@ -43,7 +43,7 @@ module Yummi
43
43
  # The colors must be supported by #Yummi#Color#parse or defined in #Yummi#Color#COLORS
44
44
  attr_accessor :colors
45
45
  # The table layout (horizontal or vertical)
46
- attr_accessor :layout
46
+ attr_reader :layout
47
47
 
48
48
  # Creates a new table with the default attributes:
49
49
  #
@@ -64,6 +64,7 @@ module Yummi
64
64
 
65
65
  @colspan = 2
66
66
  @layout = :horizontal
67
+ @default_align = :right
67
68
  @aliases = []
68
69
 
69
70
  @align = [:left]
@@ -71,7 +72,8 @@ module Yummi
71
72
  @colorizers = []
72
73
  @row_colorizer = nil
73
74
 
74
- @default_align = :right
75
+ @predicated_formatters = nil
76
+ @predicated_colorizers = nil
75
77
  end
76
78
 
77
79
  # Indicates that the table should not use colors.
@@ -84,6 +86,18 @@ module Yummi
84
86
  @no_colors = true
85
87
  end
86
88
 
89
+ def layout=(layout)
90
+ @layout = layout
91
+ case layout
92
+ when :horizontal
93
+ @default_align = :right
94
+ when :vertical
95
+ @default_align = :left
96
+ else
97
+ raise 'Unsupported layout'
98
+ end
99
+ end
100
+
87
101
  #
88
102
  # Sets the table header. If no aliases are defined, they will be defined as the texts
89
103
  # in lowercase with line breaks and spaces replaced by underscores.
@@ -102,20 +116,9 @@ module Yummi
102
116
  #
103
117
  # This will create the following aliases: :name, :email, :work_phone and :home_phone
104
118
  #
105
- def header= header
119
+ def header= (header)
106
120
  header = [header] unless header.respond_to? :each
107
- max = 0
108
- header.each_index do |i|
109
- max = [max, header[i].split("\n").size].max
110
- end
111
- @header = []
112
- max.times { @header << [] }
113
- header.each_index do |i|
114
- names = header[i].split("\n")
115
- names.each_index do |j|
116
- @header[j][i] = names[j]
117
- end
118
- end
121
+ @header = normalize(header)
119
122
  @aliases = header.map { |n| n.downcase.gsub(' ', '_').gsub("\n", '_').to_sym } if @aliases.empty?
120
123
  end
121
124
 
@@ -134,7 +137,7 @@ module Yummi
134
137
  # table.align :description, :left
135
138
  # table.align :value, :right
136
139
  #
137
- def align index, type
140
+ def align (index, type)
138
141
  index = parse_index(index)
139
142
  @align[index] = type
140
143
  end
@@ -150,7 +153,7 @@ module Yummi
150
153
  #
151
154
  # table.row_colorizer { |i, row| :red if row[:value] < 0 }
152
155
  #
153
- def row_colorizer colorizer = nil, &block
156
+ def row_colorizer (colorizer = nil, &block)
154
157
  @row_colorizer ||= Yummi::GroupedComponent::new
155
158
  @row_colorizer << (colorizer or block)
156
159
  end
@@ -195,13 +198,30 @@ module Yummi
195
198
  # table.colorize :description, :with => :purple
196
199
  # table.colorize(:value) { |value| :red if value < 0 }
197
200
  #
198
- def colorize index, params = {}, &block
201
+ def colorize (index, params = {}, &block)
199
202
  index = parse_index(index)
200
203
  @colorizers[index] ||= []
201
204
  obj = (params[:using] or block or (proc { |v| params[:with] }))
202
205
  @colorizers[index] << {:use_row => @using_row, :component => obj}
203
206
  end
204
207
 
208
+ #
209
+ # Defines a colorizer to null values.
210
+ #
211
+ # === Args
212
+ #
213
+ # +params+::
214
+ # A hash with params in case a block is not given:
215
+ # - :using defines the component to use
216
+ # - :with defines the format to use
217
+ #
218
+ def colorize_null (params = {}, &block)
219
+ @null_colorizer = (params[:using] or block)
220
+ @null_colorizer ||= proc do |value|
221
+ params[:with]
222
+ end
223
+ end
224
+
205
225
  #
206
226
  # Sets a component to format a column.
207
227
  #
@@ -222,7 +242,7 @@ module Yummi
222
242
  #
223
243
  # table.format :value, :with => '%.2f'
224
244
  #
225
- def format index, params = {}, &block
245
+ def format (index, params = {}, &block)
226
246
  index = parse_index(index)
227
247
  @formatters[index] = (params[:using] or block)
228
248
  @formatters[index] ||= proc do |value|
@@ -230,10 +250,27 @@ module Yummi
230
250
  end
231
251
  end
232
252
 
253
+ #
254
+ # Defines a formatter to null values.
255
+ #
256
+ # === Args
257
+ #
258
+ # +params+::
259
+ # A hash with params in case a block is not given:
260
+ # - :using defines the component to use
261
+ # - :with defines the format to use
262
+ #
263
+ def format_null (params = {}, &block)
264
+ @null_formatter = (params[:using] or block)
265
+ @null_formatter ||= proc do |value|
266
+ params[:with] % value
267
+ end
268
+ end
269
+
233
270
  #
234
271
  # Prints the #to_s into the given object.
235
272
  #
236
- def print to = $stdout
273
+ def print (to = $stdout)
237
274
  to.print to_s
238
275
  end
239
276
 
@@ -241,35 +278,33 @@ module Yummi
241
278
  # Return a colorized and formatted table.
242
279
  #
243
280
  def to_s
244
- header_color_map, header_output = build_header_output
245
- data_color_map, data_output = build_data_output
281
+ header_output = build_header_output
282
+ data_output = build_data_output
246
283
 
247
284
  string = ""
248
285
  string << Color.colorize(@title, @colors[:title]) << $/ if @title
249
- color_map = header_color_map + data_color_map
250
286
  table_data = header_output + data_output
251
287
  if @layout == :vertical
252
288
  # don't use array transpose because the data may differ in each line size
253
- color_map = rotate color_map
254
289
  table_data = rotate table_data
255
290
  end
256
- string << content(color_map, table_data)
291
+ string << content(table_data)
257
292
  end
258
293
 
259
294
  #
260
295
  # Gets the content string for the given color map and content
261
296
  #
262
- def content color_map, data
297
+ def content (data)
263
298
  string = ""
264
299
  data.each_index do |i|
265
300
  row = data[i]
266
301
  row.each_index do |j|
267
302
  column = row[j]
303
+ column ||= {:value => nil, :color => nil}
268
304
  width = max_width data, j
269
305
  alignment = (@align[j] or @default_align)
270
- color = color_map[i][j]
271
- value = Aligner.align alignment, column.to_s, width
272
- value = Color.colorize value, color unless @no_colors
306
+ value = Aligner.align alignment, column[:value].to_s, width
307
+ value = Color.colorize value, column[:color] unless @no_colors
273
308
  string << value
274
309
  string << (' ' * @colspan)
275
310
  end
@@ -284,20 +319,16 @@ module Yummi
284
319
  # Returns the color map and the header.
285
320
  #
286
321
  def build_header_output
287
- color_map = []
288
322
  output = []
289
323
 
290
324
  @header.each do |line|
291
- _colors = []
292
325
  _data = []
293
326
  line.each do |h|
294
- _colors << @colors[:header]
295
- _data << h
327
+ _data << {:value => h, :color => @colors[:header]}
296
328
  end
297
- color_map << _colors
298
329
  output << _data
299
330
  end
300
- [color_map, output]
331
+ output
301
332
  end
302
333
 
303
334
  #
@@ -306,61 +337,99 @@ module Yummi
306
337
  # Returns the color map and the formatted data.
307
338
  #
308
339
  def build_data_output
309
- color_map = []
310
340
  output = []
311
341
 
312
342
  @data.each_index do |row_index|
313
343
  row = @data[row_index]
314
- _colors = []
315
- _data = []
344
+ _row_data = []
316
345
  row = row.to_a if row.is_a? Range
317
346
  row.each_index do |col_index|
318
347
  next if not @header.empty? and @header[0].size < col_index + 1
348
+ color = nil
349
+ value = nil
319
350
  column = row[col_index]
320
351
  colorizers = @colorizers[col_index]
321
- if colorizers
352
+ if @null_colorizer and column.nil?
353
+ color = @null_colorizer.call(column)
354
+ elsif colorizers
322
355
  colorizers.each do |colorizer|
323
356
  arg = colorizer[:use_row] ? IndexedData::new(@aliases, row) : column
324
357
  c = colorizer[:component].call(arg)
325
358
  if c
326
- _colors << c
359
+ color = c
327
360
  break
328
361
  end
329
362
  end
330
363
  else
331
- _colors << @colors[:value]
364
+ color = @colors[:value]
332
365
  end
333
366
  formatter = @formatters[col_index]
334
- _data << (formatter ? formatter.call(column) : column)
367
+ formatter = @null_formatter if column.nil? and @null_formatter
368
+ value = (formatter ? formatter.call(column) : column)
369
+
370
+ _row_data << {:value => value, :color => color}
335
371
  end
336
372
  if @row_colorizer
337
373
  row_data = IndexedData::new @aliases, row
338
374
  row_color = @row_colorizer.call row_data, row_index
339
- _colors.collect! { row_color } if row_color
375
+ _row_data.collect! { |data| data[:color] = row_color; data } if row_color
340
376
  end
341
- color_map << _colors
342
- output << _data
343
- end
344
377
 
345
- [color_map, output]
378
+ _row_data = normalize(_row_data,
379
+ :extract => proc do |data|
380
+ data[:value].to_s
381
+ end,
382
+ :new => proc do |value, data|
383
+ {:value => value, :color => data[:color]}
384
+ end
385
+ )
386
+ _row_data.each do |_row|
387
+ output << _row
388
+ end
389
+ end
390
+ output
346
391
  end
347
392
 
348
393
  private
349
394
 
395
+ def normalize(row, params = {})
396
+ params[:extract] ||= proc do |value|
397
+ value.to_s
398
+ end
399
+ params[:new] ||= proc do |extracted, value|
400
+ extracted
401
+ end
402
+ max = 0
403
+ row.each_index do |i|
404
+ max = [max, params[:extract].call(row[i]).split("\n").size].max
405
+ end
406
+ result = []
407
+ max.times { result << [] }
408
+ row.each_index do |i|
409
+ names = params[:extract].call(row[i]).split("\n")
410
+ names.each_index do |j|
411
+ result[j][i] = params[:new].call(names[j], row[i])
412
+ end
413
+ end
414
+ result
415
+ end
416
+
350
417
  def parse_index(value)
351
418
  return @aliases.index(value) unless value.is_a? Fixnum
352
419
  value
353
420
  end
354
421
 
355
- def max_width data, column
422
+ def max_width(data, column)
356
423
  max = 0
357
424
  data.each do |row|
358
- max = [row[column].to_s.length, max].max
425
+ var = row[column]
426
+ var ||= {}
427
+ max = [var[:value].to_s.length, max].max
359
428
  end
360
429
  max
361
430
  end
362
431
 
363
- def rotate data
432
+ def rotate(data)
364
433
  new_data = []
365
434
  data.each_index do |i|
366
435
  data[i].each_index do |j|
@@ -58,7 +58,7 @@ module Yummi
58
58
  # If the #width is set, this will override the box width for this lines.
59
59
  # align: the text alignment (see #Yummi#Aligner)
60
60
  #
61
- def add text, params = {}
61
+ def add (text, params = {})
62
62
  params = {
63
63
  :width => @width,
64
64
  :align => @default_align
@@ -87,7 +87,7 @@ module Yummi
87
87
  end
88
88
 
89
89
  # Adds the given object as it
90
- def << object
90
+ def << (object)
91
91
  text = object.to_s
92
92
  text.each_line do |line|
93
93
  add line
@@ -107,7 +107,7 @@ module Yummi
107
107
  # width: the separator width (#self#width will be used if unset)
108
108
  # align: the separator alignment (see #Yummi#Aligner)
109
109
  #
110
- def separator pattern = @default_separator[:pattern], params = {}
110
+ def separator (pattern = @default_separator[:pattern], params = {})
111
111
  unless pattern.is_a? String
112
112
  params = pattern
113
113
  pattern = @default_separator[:pattern]
@@ -127,7 +127,7 @@ module Yummi
127
127
  end
128
128
 
129
129
  # Prints the #to_s into the given object.
130
- def print to = $stdout
130
+ def print (to = $stdout)
131
131
  to.print to_s
132
132
  end
133
133
 
@@ -155,7 +155,7 @@ module Yummi
155
155
 
156
156
  private
157
157
 
158
- def _add_ text, params
158
+ def _add_ (text, params)
159
159
  if params[:align] and params[:width]
160
160
  text = Yummi::Aligner.align params[:align], text, params[:width]
161
161
  end
data/lib/yummi/version.rb CHANGED
@@ -21,5 +21,5 @@
21
21
  # THE SOFTWARE.
22
22
 
23
23
  module Yummi
24
- VERSION = "0.3.2"
24
+ VERSION = "0.4.0"
25
25
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yummi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
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-07-07 00:00:00.000000000 Z
12
+ date: 2012-07-13 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: A tool to colorize your console application.
15
15
  email:
@@ -32,6 +32,7 @@ files:
32
32
  - examples/logger.rb
33
33
  - examples/monitor_table.rb
34
34
  - lib/yummi.rb
35
+ - lib/yummi/color_mapping.rb
35
36
  - lib/yummi/logger.rb
36
37
  - lib/yummi/no_colors.rb
37
38
  - lib/yummi/table.rb