yummi 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/examples/list_files.rb +2 -3
- data/examples/monitor_table.rb +9 -8
- data/examples/table_cash_flow.rb +1 -2
- data/lib/yummi/table.rb +20 -28
- data/lib/yummi/version.rb +1 -1
- data/lib/yummi.rb +188 -47
- metadata +2 -2
data/examples/list_files.rb
CHANGED
@@ -34,13 +34,12 @@ opt = OptionParser::new
|
|
34
34
|
# sets the title
|
35
35
|
@table.title = 'Files in home folder'
|
36
36
|
# formats size for easily reading
|
37
|
-
@table.format :size, :using => Yummi::Formatter.
|
37
|
+
@table.format :size, :using => Yummi::Formatter.unit(:byte)
|
38
38
|
|
39
39
|
opt.on '--color TYPE', 'Specify the color type (zebra,file,none)' do |type|
|
40
40
|
case type
|
41
41
|
when 'zebra'
|
42
|
-
@table.row_colorizer Yummi::IndexedDataColorizer.
|
43
|
-
@table.row_colorizer Yummi::IndexedDataColorizer.even :with => :intense_white
|
42
|
+
@table.row_colorizer Yummi::IndexedDataColorizer.zebra :intense_gray, :intense_white
|
44
43
|
when 'file'
|
45
44
|
@table.row_colorizer do |i, data|
|
46
45
|
data[:directory] ? :intense_gray : :intense_white
|
data/examples/monitor_table.rb
CHANGED
@@ -31,18 +31,18 @@ opt = OptionParser::new
|
|
31
31
|
# sets the title
|
32
32
|
@table.title = 'Server Runtime Info'
|
33
33
|
# formats memory info for easily reading
|
34
|
-
@table.format :max_memory, :using => Yummi::Formatter.
|
35
|
-
@table.format :free_memory, :using => Yummi::Formatter.
|
34
|
+
@table.format :max_memory, :using => Yummi::Formatter.unit(:byte)
|
35
|
+
@table.format :free_memory, :using => Yummi::Formatter.unit(:byte)
|
36
36
|
|
37
37
|
# colorizer for memory
|
38
|
-
memory_colorizer = Yummi::Colorizer.
|
38
|
+
memory_colorizer = Yummi::Colorizer.by_data_eval do |free_memory, max_memory|
|
39
39
|
free_memory.to_f / max_memory
|
40
40
|
end
|
41
41
|
memory_colorizer.use(:red) { |value| value > 0.1 and value < 0.3 }
|
42
42
|
memory_colorizer.use(:intense_red) { |value| value <= 0.1 }
|
43
43
|
|
44
44
|
# colorizer for threads
|
45
|
-
thread_colorizer = Yummi::Colorizer.
|
45
|
+
thread_colorizer = Yummi::Colorizer.by_data_eval do |max_threads, in_use_threads|
|
46
46
|
in_use_threads.to_f / max_threads
|
47
47
|
end
|
48
48
|
thread_colorizer.use(:brown) { |value| value > 0.7 and value < 0.9 }
|
@@ -51,14 +51,15 @@ thread_colorizer.use(:intense_cyan) { |value| value >= 0.9 }
|
|
51
51
|
opt.on '--color TYPE', 'Specify the color type (zebra,row,cell,none)' do |type|
|
52
52
|
case type
|
53
53
|
when 'zebra'
|
54
|
-
@table.row_colorizer Yummi::
|
55
|
-
@table.row_colorizer Yummi::IndexedDataColorizer.even :with => :purple
|
54
|
+
@table.row_colorizer Yummi::Colorizer.by_index.zebra :brown, :purple
|
56
55
|
when 'row'
|
57
56
|
@table.row_colorizer memory_colorizer
|
58
57
|
@table.row_colorizer thread_colorizer
|
59
58
|
when 'cell'
|
60
|
-
@table.using_row
|
61
|
-
|
59
|
+
@table.using_row do
|
60
|
+
@table.colorize :free_memory, :using => memory_colorizer
|
61
|
+
@table.colorize :in_use_threads, :using => thread_colorizer
|
62
|
+
end
|
62
63
|
when 'none'
|
63
64
|
@table.no_colors
|
64
65
|
else
|
data/examples/table_cash_flow.rb
CHANGED
@@ -47,8 +47,7 @@ opt = OptionParser::new
|
|
47
47
|
opt.on '--color TYPE', 'Specify the color type (zebra,full,none)' do |type|
|
48
48
|
case type
|
49
49
|
when 'zebra'
|
50
|
-
@table.row_colorizer Yummi::
|
51
|
-
@table.row_colorizer Yummi::IndexedDataColorizer.even :with => :purple
|
50
|
+
@table.row_colorizer Yummi::Colorizer.by_index.zebra :brown, :purple
|
52
51
|
when 'full'
|
53
52
|
# colorize all values from the Description column to purple
|
54
53
|
@table.colorize :description, :with => :purple
|
data/lib/yummi/table.rb
CHANGED
@@ -82,8 +82,6 @@ module Yummi
|
|
82
82
|
@no_colors = true
|
83
83
|
end
|
84
84
|
|
85
|
-
#
|
86
|
-
# === Description
|
87
85
|
#
|
88
86
|
# Sets the table header. If no aliases are defined, they will be defined as the texts
|
89
87
|
# in lowercase with line breaks and spaces replaced by underscores.
|
@@ -118,8 +116,6 @@ module Yummi
|
|
118
116
|
@aliases = header.map { |n| n.downcase.gsub(' ', '_').gsub("\n", '_').to_sym } if @aliases.empty?
|
119
117
|
end
|
120
118
|
|
121
|
-
#
|
122
|
-
# === Description
|
123
119
|
#
|
124
120
|
# Sets the align for a column in the table. #Yummi#Aligner should respond to it.
|
125
121
|
#
|
@@ -140,8 +136,6 @@ module Yummi
|
|
140
136
|
@align[index] = type
|
141
137
|
end
|
142
138
|
|
143
|
-
#
|
144
|
-
# === Description
|
145
139
|
#
|
146
140
|
# Adds a component to colorize the entire row (overrides column color).
|
147
141
|
# The component must respond to +call+ with the index and the row as the arguments and
|
@@ -154,32 +148,27 @@ module Yummi
|
|
154
148
|
# table.row_colorizer { |i, row| :red if row[:value] < 0 }
|
155
149
|
#
|
156
150
|
def row_colorizer colorizer = nil, &block
|
157
|
-
@row_colorizer ||= Yummi::
|
151
|
+
@row_colorizer ||= Yummi::GroupedComponent::new
|
158
152
|
@row_colorizer << (colorizer or block)
|
159
153
|
end
|
160
154
|
|
161
|
-
#
|
162
|
-
# === Description
|
163
155
|
#
|
164
156
|
# Indicates that the column colorizer (#colorize) should receive the entire row as the
|
165
|
-
# argument instead of just the column value
|
166
|
-
#
|
167
|
-
# === Return
|
168
|
-
#
|
169
|
-
# +self+
|
157
|
+
# argument instead of just the column value for all definitions inside of the given
|
158
|
+
# block.
|
170
159
|
#
|
171
160
|
# === Example
|
172
161
|
#
|
173
|
-
# table.using_row
|
174
|
-
#
|
162
|
+
# table.using_row do
|
163
|
+
# table.colorize(:value) { |row| :red if row[:value] < row[:average] }
|
164
|
+
# end
|
175
165
|
#
|
176
166
|
def using_row
|
177
167
|
@using_row = true
|
178
|
-
|
168
|
+
yield
|
169
|
+
@using_row = false
|
179
170
|
end
|
180
171
|
|
181
|
-
#
|
182
|
-
# === Description
|
183
172
|
#
|
184
173
|
# Sets a component to colorize a column.
|
185
174
|
#
|
@@ -208,11 +197,8 @@ module Yummi
|
|
208
197
|
@colorizers[index] ||= []
|
209
198
|
obj = (params[:using] or block or (proc { |v| params[:with] }))
|
210
199
|
@colorizers[index] << {:use_row => @using_row, :component => obj}
|
211
|
-
@using_row = false
|
212
200
|
end
|
213
201
|
|
214
|
-
#
|
215
|
-
# === Description
|
216
202
|
#
|
217
203
|
# Sets a component to format a column.
|
218
204
|
#
|
@@ -255,16 +241,22 @@ module Yummi
|
|
255
241
|
header_color_map, header_output = build_header_output
|
256
242
|
data_color_map, data_output = build_data_output
|
257
243
|
|
258
|
-
color_map = header_color_map + data_color_map
|
259
|
-
output = header_output + data_output
|
260
|
-
|
261
244
|
string = ""
|
262
245
|
string << Color.colorize(@title, @colors[:title]) << $/ if @title
|
263
|
-
|
264
|
-
|
246
|
+
string << content(header_color_map + data_color_map,
|
247
|
+
header_output + data_output)
|
248
|
+
end
|
249
|
+
|
250
|
+
#
|
251
|
+
# Gets the content string for the given color map and content
|
252
|
+
#
|
253
|
+
def content color_map, data
|
254
|
+
string = ""
|
255
|
+
data.each_index do |i|
|
256
|
+
row = data[i]
|
265
257
|
row.each_index do |j|
|
266
258
|
column = row[j]
|
267
|
-
width = max_width
|
259
|
+
width = max_width data, j
|
268
260
|
align = (@align[j] or @default_align)
|
269
261
|
color = color_map[i][j]
|
270
262
|
value = Aligner.send align, column.to_s, width
|
data/lib/yummi/version.rb
CHANGED
data/lib/yummi.rb
CHANGED
@@ -109,46 +109,90 @@ module Yummi
|
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
112
|
+
#
|
113
|
+
# A module to handle blocks by dynamically resolving parameters
|
114
|
+
#
|
115
|
+
# see #DataEvalColorizer
|
116
|
+
#
|
117
|
+
module BlockHandler
|
118
|
+
|
119
|
+
#
|
120
|
+
# Calls the block resolving the parameters by getting the parameter name from the
|
121
|
+
# given context.
|
122
|
+
#
|
123
|
+
# === Example
|
124
|
+
#
|
125
|
+
# context = :max => 10, :curr => 5, ratio => 0.15
|
126
|
+
# percentage = BlockHandler.call_block(context) { |max,curr| curr.to_f / max }
|
127
|
+
#
|
128
|
+
def block_call context, &block
|
129
|
+
args = []
|
130
|
+
block.parameters.each do |parameter|
|
131
|
+
args << context[parameter[1]]
|
132
|
+
end
|
133
|
+
block.call *args
|
116
134
|
end
|
117
135
|
|
118
|
-
|
119
|
-
text.ljust(width)
|
120
|
-
end
|
136
|
+
module_function :block_call
|
121
137
|
|
122
138
|
end
|
123
139
|
|
124
|
-
module
|
140
|
+
# A module to align texts based on a reference width
|
141
|
+
module Aligner
|
125
142
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
end
|
143
|
+
# Aligns the text to the right
|
144
|
+
def self.right text, width
|
145
|
+
text.rjust(width)
|
130
146
|
end
|
131
147
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
end
|
148
|
+
# Aligns the text to the left
|
149
|
+
def self.left text, width
|
150
|
+
text.ljust(width)
|
136
151
|
end
|
137
152
|
|
138
153
|
end
|
139
154
|
|
155
|
+
# A module with useful colorizers
|
140
156
|
module Colorizer
|
141
157
|
|
158
|
+
# Joins the given colorizers to work as one
|
142
159
|
def self.join *colorizers
|
143
|
-
join = Yummi::
|
160
|
+
join = Yummi::GroupedComponent::new
|
144
161
|
colorizers.each { |c| join << c }
|
145
162
|
join
|
146
163
|
end
|
147
164
|
|
165
|
+
# Returns a new instance of #DataEvalColorizer
|
166
|
+
def self.by_data_eval &block
|
167
|
+
DataEvalColorizer::new &block
|
168
|
+
end
|
169
|
+
|
170
|
+
# Returns a new instance of #EvalColorizer
|
148
171
|
def self.by_eval &block
|
149
172
|
EvalColorizer::new &block
|
150
173
|
end
|
151
174
|
|
175
|
+
# Returns the #IndexedDataColorizer module
|
176
|
+
def self.by_index
|
177
|
+
IndexedDataColorizer
|
178
|
+
end
|
179
|
+
|
180
|
+
#
|
181
|
+
# A colorizer that evaluates a main block and returns a color based on other blocks.
|
182
|
+
#
|
183
|
+
# The main block must be compatible with the colorizing type (receiving a column
|
184
|
+
# value in case of a table column colorizer or the row index and row value in case
|
185
|
+
# of a table row colorizer).
|
186
|
+
#
|
187
|
+
# === Example
|
188
|
+
#
|
189
|
+
# # assuming that the table has :max and :current aliases
|
190
|
+
# colorizer = DataEvalColorizer::new { |index, data| data[:current] / data[:max] }
|
191
|
+
# # the result of the expression above will be passed to this block
|
192
|
+
# colorizer.use(:red) { |value| value >= 0.9 }
|
193
|
+
#
|
194
|
+
# table.using_row.colorize :current, :using => colorizer
|
195
|
+
#
|
152
196
|
class EvalColorizer
|
153
197
|
|
154
198
|
def initialize &block
|
@@ -157,13 +201,24 @@ module Yummi
|
|
157
201
|
@eval_blocks = []
|
158
202
|
end
|
159
203
|
|
160
|
-
|
204
|
+
#
|
205
|
+
# Uses the given color if the given block returns something when evaluated with the
|
206
|
+
# result of main block.
|
207
|
+
#
|
208
|
+
# An objtect that responds to :call may also be used.
|
209
|
+
#
|
210
|
+
def use color, component = nil, &eval_block
|
161
211
|
@colors << color
|
162
|
-
@eval_blocks << eval_block
|
212
|
+
@eval_blocks << (component or eval_block)
|
213
|
+
end
|
214
|
+
|
215
|
+
# Resolves the value using the main block and given arguments
|
216
|
+
def resolve_value *args
|
217
|
+
@block.call *args
|
163
218
|
end
|
164
219
|
|
165
220
|
def call *args
|
166
|
-
value =
|
221
|
+
value = resolve_value *args
|
167
222
|
@eval_blocks.each_index do |i|
|
168
223
|
return @colors[i] if @eval_blocks[i].call(value)
|
169
224
|
end
|
@@ -172,40 +227,117 @@ module Yummi
|
|
172
227
|
|
173
228
|
end
|
174
229
|
|
230
|
+
#
|
231
|
+
# A colorizer that evaluates a main block and returns a color based on other blocks.
|
232
|
+
#
|
233
|
+
# The main block can receive any parameters and the names must be aliases the current
|
234
|
+
# evaluated data.
|
235
|
+
#
|
236
|
+
# === Example
|
237
|
+
#
|
238
|
+
# # assuming that the table has :max and :current aliases
|
239
|
+
# colorizer = DataEvalColorizer::new { |max, current| current / max }
|
240
|
+
# # the result of the expression above will be passed to this block
|
241
|
+
# colorizer.use(:red) { |value| value >= 0.9 }
|
242
|
+
#
|
243
|
+
# table.using_row.colorize :current, :using => colorizer
|
244
|
+
#
|
245
|
+
class DataEvalColorizer < EvalColorizer
|
246
|
+
include Yummi::BlockHandler
|
247
|
+
|
248
|
+
def resolve_value *args
|
249
|
+
block_call args.last, &@block # by convention, the last arg is data
|
250
|
+
end
|
251
|
+
|
252
|
+
end
|
253
|
+
|
254
|
+
# A module with colorizers that uses indexes
|
255
|
+
module IndexedDataColorizer
|
256
|
+
|
257
|
+
# Returns a colorizer that uses the given color in odd indexes
|
258
|
+
def self.odd color
|
259
|
+
lambda do |index, data|
|
260
|
+
color if index.odd?
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
# Returns a colorizer that uses the given color in even indexes
|
265
|
+
def self.even color
|
266
|
+
lambda do |index, data|
|
267
|
+
color if index.even?
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
# Returns a colorizer that uses the first color for odd indexes and the second for
|
272
|
+
# even indexes.
|
273
|
+
def self.zebra first_color, second_color
|
274
|
+
Yummi::Colorizer.join odd(first_color), even(second_color)
|
275
|
+
end
|
276
|
+
|
277
|
+
end
|
278
|
+
|
175
279
|
end
|
176
280
|
|
281
|
+
# A module with useful formatters
|
177
282
|
module Formatter
|
178
283
|
|
284
|
+
# A module for formatting units in a way that makes the value easy to read
|
285
|
+
module Unit
|
286
|
+
# Holds the information about the units that are supported in #format
|
287
|
+
UNITS = {
|
288
|
+
:byte => {:range => %w{B KB MB GB TB}, :step => 1024}
|
289
|
+
}
|
290
|
+
|
291
|
+
#
|
292
|
+
# Formats the value using the given unit.
|
293
|
+
#
|
294
|
+
# === Args
|
295
|
+
#
|
296
|
+
# +unit+::
|
297
|
+
# A unit defined in #UNITS or a definition
|
298
|
+
# +value+::
|
299
|
+
# The value to format
|
300
|
+
# +params+::
|
301
|
+
# Additional parameters:
|
302
|
+
# * precision: the number of fractional digits to display (defaults to 1)
|
303
|
+
#
|
304
|
+
def self.format unit, value, params = {}
|
305
|
+
unit = UNITS[unit] if unit.is_a? Symbol
|
306
|
+
params[:precision] ||= 1
|
307
|
+
result = value
|
308
|
+
units = unit[:range]
|
309
|
+
units.each_index do |i|
|
310
|
+
minimun = (unit[:step] ** i)
|
311
|
+
result = "%.#{params[:precision]}f #{units[i]}" % (value.to_f / minimun) if value >= minimun
|
312
|
+
end
|
313
|
+
result
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
# Formats boolean values using 'Yes' or 'No'
|
179
318
|
def self.yes_or_no
|
180
319
|
lambda do |value|
|
181
320
|
value ? "Yes" : "No"
|
182
321
|
end
|
183
322
|
end
|
184
323
|
|
324
|
+
# Formats a float value by rounding to the given decinal digits
|
185
325
|
def self.round precision
|
186
326
|
lambda do |value|
|
187
327
|
"%.#{precision}f" % value
|
188
328
|
end
|
189
329
|
end
|
190
330
|
|
191
|
-
|
331
|
+
# see #Unit#format
|
332
|
+
def self.unit unit, params = {}
|
192
333
|
lambda do |value|
|
193
|
-
|
194
|
-
units = params[:range]
|
195
|
-
units.each_index do |i|
|
196
|
-
minimun = (params[:step] ** i)
|
197
|
-
result = "%.#{params[:precision]}f #{units[i]}" % (value.to_f / minimun) if value >= minimun
|
198
|
-
end
|
199
|
-
result
|
334
|
+
Unit.format unit, value, params
|
200
335
|
end
|
201
336
|
end
|
202
337
|
|
203
|
-
def self.bytes precision = 1
|
204
|
-
unit :range => %w{B KB MB GB TB}, :step => 1024, :precision => precision
|
205
|
-
end
|
206
|
-
|
207
338
|
end
|
208
339
|
|
340
|
+
# A class to expose indexed data by numeric indexes and aliases.
|
209
341
|
class IndexedData
|
210
342
|
|
211
343
|
def initialize aliases, data
|
@@ -223,36 +355,45 @@ module Yummi
|
|
223
355
|
|
224
356
|
end
|
225
357
|
|
226
|
-
class
|
227
|
-
|
358
|
+
# A class to group components and blocks
|
359
|
+
class GroupedComponent
|
360
|
+
|
361
|
+
#
|
362
|
+
# Creates a new GroupedComponent
|
363
|
+
#
|
364
|
+
# === Args
|
365
|
+
#
|
366
|
+
# +params+::
|
367
|
+
# Hash parameters:
|
368
|
+
# - call_all: indicates if all components must be called. For use if the return
|
369
|
+
# should be ignored
|
370
|
+
# - message: the message to send. Defaults to :call
|
371
|
+
#
|
228
372
|
def initialize params = {}
|
229
|
-
@
|
373
|
+
@components = []
|
230
374
|
@call_all = params[:call_all]
|
375
|
+
@message = (params[:message] or :call)
|
231
376
|
end
|
232
377
|
|
233
|
-
|
234
|
-
|
378
|
+
# Adds a new component
|
379
|
+
def << component = nil, &block
|
380
|
+
@components << (component or block)
|
235
381
|
end
|
236
382
|
|
383
|
+
#
|
384
|
+
# Calls the added components by sending the configured message and the given args.
|
385
|
+
#
|
237
386
|
def call *args
|
238
387
|
result = nil
|
239
|
-
@
|
388
|
+
@components.each do |component|
|
240
389
|
break if result and not @call_all
|
241
|
-
result =
|
390
|
+
result = component.send @message, *args
|
242
391
|
end
|
243
392
|
result
|
244
393
|
end
|
245
394
|
|
246
395
|
end
|
247
396
|
|
248
|
-
def self.call_block params, &block
|
249
|
-
args = []
|
250
|
-
block.parameters.each do |parameter|
|
251
|
-
args << params[parameter[1]]
|
252
|
-
end
|
253
|
-
block.call *args
|
254
|
-
end
|
255
|
-
|
256
397
|
end
|
257
398
|
|
258
399
|
require_relative 'yummi/no_colors' if RUBY_PLATFORM['mingw'] #Windows
|
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.0.
|
4
|
+
version: 0.0.3
|
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-04-
|
12
|
+
date: 2012-04-15 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description: A tool to colorize your console application.
|
15
15
|
email:
|