yummi 0.4.3 → 0.5.0
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/README.md +40 -2
- data/bin/colorize +46 -16
- data/examples/cash_flow_table.rb +5 -60
- data/examples/cash_flow_table.yaml +36 -0
- data/examples/cash_flow_table_data.csv +6 -0
- data/examples/cash_flow_table_data.yaml +30 -0
- data/examples/cash_flow_table_extensions.rb +9 -0
- data/examples/license_box.rb +1 -1
- data/examples/monitor_table.rb +9 -15
- data/lib/yummi.rb +25 -76
- data/lib/yummi/colorizers.rb +108 -4
- data/lib/yummi/formatters.rb +149 -0
- data/lib/yummi/table.rb +24 -25
- data/lib/yummi/table_builder.rb +150 -0
- data/lib/yummi/version.rb +1 -1
- data/yummi.ipr +4 -0
- metadata +8 -2
data/README.md
CHANGED
@@ -16,9 +16,47 @@ Or install it yourself as:
|
|
16
16
|
|
17
17
|
$ gem install yummi
|
18
18
|
|
19
|
-
##
|
19
|
+
## Ruby Tools
|
20
20
|
|
21
|
-
|
21
|
+
Yummi module provides a set of tools to colorize inputs. Check docs for more information
|
22
|
+
about how to build tables, text boxes, colored log formatters and more. You can also check
|
23
|
+
the examples dir to see how to use Yummi features.
|
24
|
+
|
25
|
+
## Command Line Tools
|
26
|
+
|
27
|
+
Yummi exposes a 'colorize' program that you can use to colorize texts and apply
|
28
|
+
patterns to colorize lines (usefull to tail logs).
|
29
|
+
|
30
|
+
Examples:
|
31
|
+
|
32
|
+
colorize -c intense_red -m "some text"
|
33
|
+
echo "some text" | colorize -c intense_red
|
34
|
+
tail -f $JBOSS_HOME/standalone/log/server.log | colorize -p path-to-your-jboss7-mapping.yaml
|
35
|
+
|
36
|
+
Line patterns are configured with an yaml file containing:
|
37
|
+
|
38
|
+
* prefix (optional): prefix for pattern
|
39
|
+
* suffix (optional): suffix for pattern
|
40
|
+
* patterns: a pattern => color map
|
41
|
+
|
42
|
+
Example:
|
43
|
+
|
44
|
+
prefix: '\d{2}:\d{2}:\d{2},\d{3}\s'
|
45
|
+
patterns:
|
46
|
+
TRACE : cyan
|
47
|
+
DEBUG : blue
|
48
|
+
INFO : gray
|
49
|
+
WARN : yellow
|
50
|
+
ERROR : red
|
51
|
+
FATAL : intense_red
|
52
|
+
|
53
|
+
Yummi provides a set of mappings that you, check yummi/mappings dir.
|
54
|
+
|
55
|
+
Mappings provided by yummi can be passed with the file name, example:
|
56
|
+
|
57
|
+
tail -f $JBOSS_HOME/standalone/log/server.log | colorize -p jboss7
|
58
|
+
|
59
|
+
Mappings in ~/.yummi dir may also used only with the file name.
|
22
60
|
|
23
61
|
## Contributing
|
24
62
|
|
data/bin/colorize
CHANGED
@@ -34,35 +34,65 @@ end
|
|
34
34
|
opt.on '-p PATTERN', '--pattern=PATTERN', 'Sets a pattern to colorize each line' do |pattern|
|
35
35
|
@colorizer = Yummi::Colorizers.line pattern
|
36
36
|
end
|
37
|
-
opt.on '-
|
38
|
-
@
|
37
|
+
opt.on '-m message', '--message=MESSAGE', 'Colorize the given message' do |message|
|
38
|
+
@message = message
|
39
|
+
end
|
40
|
+
opt.on '-t file', '--table=FILE', 'Defines the file mapping the table to print' do |file|
|
41
|
+
@table_builder = Yummi::TableBuilder::new(file).defaults
|
42
|
+
end
|
43
|
+
opt.on '-d data', '--data=FILE', 'Defines the file containing the data to print' do |data|
|
44
|
+
@data = File.expand_path(data)
|
45
|
+
end
|
46
|
+
opt.on '--data-type', 'Defines the data type to parse the values' do |data_type|
|
47
|
+
@data_type = data_type
|
48
|
+
end
|
49
|
+
opt.on '-e FILES', '--eval=FILES', Array, 'Sets a file to eval for extending components' do |files|
|
50
|
+
files.each do |file|
|
51
|
+
load File.expand_path(file)
|
52
|
+
end
|
39
53
|
end
|
40
54
|
opt.on '-h', '--help', 'Display this help message' do
|
41
55
|
puts opt
|
42
56
|
exit 0
|
43
57
|
end
|
58
|
+
|
59
|
+
if ARGV.empty?
|
60
|
+
puts opt
|
61
|
+
exit 0
|
62
|
+
end
|
63
|
+
|
44
64
|
opt.parse! ARGV
|
45
65
|
|
46
|
-
def print_out
|
66
|
+
def print_out message
|
47
67
|
if @color
|
48
|
-
puts Yummi::colorize
|
68
|
+
puts Yummi::colorize message, @color
|
49
69
|
elsif @colorizer
|
50
|
-
puts @colorizer.colorize
|
70
|
+
puts @colorizer.colorize message
|
51
71
|
end
|
52
72
|
end
|
53
73
|
|
54
|
-
if @
|
55
|
-
|
56
|
-
|
74
|
+
if @message
|
75
|
+
print_out @message
|
76
|
+
elsif @table_builder
|
77
|
+
abort "Please give the data to print" unless @data
|
78
|
+
table = @table_builder.build_table
|
79
|
+
extension = File::extname(@data)[1..-1]
|
80
|
+
table.data = case (@data_type or extension)
|
81
|
+
when "yaml"
|
82
|
+
YAML::load_file(@data)
|
83
|
+
when "csv"
|
84
|
+
require 'csv'
|
85
|
+
CSV::parse(File.read(@data), :converters => :all)
|
57
86
|
else
|
58
|
-
|
59
|
-
ARGF.each_line do |line|
|
60
|
-
print_out line.chomp
|
61
|
-
end
|
62
|
-
rescue Interrupt
|
63
|
-
#Do nothing
|
64
|
-
end
|
87
|
+
abort "Unsupported extension #{extension}"
|
65
88
|
end
|
89
|
+
puts table
|
66
90
|
else
|
67
|
-
|
91
|
+
begin
|
92
|
+
ARGF.each_line do |line|
|
93
|
+
print_out line.chomp
|
94
|
+
end
|
95
|
+
rescue Interrupt
|
96
|
+
#Do nothing
|
97
|
+
end
|
68
98
|
end
|
data/examples/cash_flow_table.rb
CHANGED
@@ -22,23 +22,14 @@
|
|
22
22
|
|
23
23
|
require 'optparse'
|
24
24
|
require_relative '../lib/yummi'
|
25
|
+
require_relative 'cash_flow_table_extensions.rb'
|
25
26
|
|
26
27
|
opt = OptionParser::new
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
@table
|
31
|
-
|
32
|
-
@table.title = 'Cash Flow'
|
33
|
-
@table.description = 'How you spend your money'
|
34
|
-
# formats booleans using Yes or No
|
35
|
-
@table.format :eletronic, :using => Yummi::Formatters.yes_or_no
|
36
|
-
# shows values without minus signal and rounded
|
37
|
-
@table.format :value, :using => lambda { |value| "%.2f" % value.abs }
|
38
|
-
# shows totals rounded
|
39
|
-
@table.format :total, :using => Yummi::Formatters.round(2)
|
40
|
-
@table.format_null :with => 'none'
|
41
|
-
# table data
|
29
|
+
tablebuilder = Yummi::TableBuilder::new('cash_flow_table.yaml')
|
30
|
+
|
31
|
+
@table = tablebuilder.defaults.build_table
|
32
|
+
|
42
33
|
@table.data = [['Initial', 0, 0, false, nil],
|
43
34
|
['Deposit', 100.58, 100.58, true, "QAWSEDRFTGH535"],
|
44
35
|
['Withdraw', -50.23, 50.35, true, "34ERDTF6GYU"],
|
@@ -46,50 +37,6 @@ opt = OptionParser::new
|
|
46
37
|
['Deposit', 50, 0.35, false, nil],
|
47
38
|
['Deposit', 600, 600.35, false, nil]]
|
48
39
|
|
49
|
-
def full_colors
|
50
|
-
@table.colorize :description, :with => :purple
|
51
|
-
# Authentication Code will be highlighted
|
52
|
-
@table.colorize :authentication_code, :with => :highlight_gray
|
53
|
-
# colorize booleans based on their values
|
54
|
-
@table.colorize :eletronic do |b|
|
55
|
-
b ? :blue : :cyan
|
56
|
-
end
|
57
|
-
# colorize the values based on comparison
|
58
|
-
red_to_negative = lambda { |value| :red if value < 0 }
|
59
|
-
green_to_positive = lambda { |value| :green if value > 0 }
|
60
|
-
brown_to_zero = lambda { |value| :yellow if value == 0 }
|
61
|
-
@table.colorize [:value, :total], :using => Yummi::Colorizers.join(
|
62
|
-
red_to_negative, green_to_positive, brown_to_zero
|
63
|
-
)
|
64
|
-
# colorize rows that Value is greater than Total
|
65
|
-
@table.row_colorizer do |data| # or |data, index| if you need the index
|
66
|
-
:white if data[:value] > data[:total]
|
67
|
-
end
|
68
|
-
@table.colorize_null :with => :red
|
69
|
-
end
|
70
|
-
|
71
|
-
def zebra_colors
|
72
|
-
@table.row_colorizer Yummi::Colorizers.stripe :yellow, :purple
|
73
|
-
end
|
74
|
-
|
75
|
-
def no_colors
|
76
|
-
@table.no_colors
|
77
|
-
end
|
78
|
-
|
79
|
-
opt.on '--color TYPE', 'Specify the color type (zebra,full,none)' do |type|
|
80
|
-
case type
|
81
|
-
when 'zebra'
|
82
|
-
zebra_colors
|
83
|
-
when 'full'
|
84
|
-
# colorize all values from the Description column to purple
|
85
|
-
full_colors
|
86
|
-
when 'none'
|
87
|
-
no_colors
|
88
|
-
else
|
89
|
-
end
|
90
|
-
@colors = type
|
91
|
-
end
|
92
|
-
|
93
40
|
opt.on '--layout LAYOUT', 'Defines the table layout (horizontal or vertical)' do |layout|
|
94
41
|
@table.layout = layout.to_sym
|
95
42
|
end
|
@@ -104,8 +51,6 @@ end
|
|
104
51
|
|
105
52
|
opt.parse ARGV
|
106
53
|
|
107
|
-
full_colors unless @colors
|
108
|
-
|
109
54
|
if @box
|
110
55
|
@box << @table
|
111
56
|
@box.print
|
@@ -0,0 +1,36 @@
|
|
1
|
+
title: Cash Flow
|
2
|
+
description: How you spend your money
|
3
|
+
layout: horizontal
|
4
|
+
header:
|
5
|
+
- Description
|
6
|
+
- Value
|
7
|
+
- Total
|
8
|
+
- Eletronic
|
9
|
+
- "Authentication\nCode"
|
10
|
+
format:
|
11
|
+
eletronic: boolean
|
12
|
+
value,total:
|
13
|
+
numeric:
|
14
|
+
positive: "%.2f"
|
15
|
+
zero: "%.2f"
|
16
|
+
negative: "%.2f"
|
17
|
+
undefined:
|
18
|
+
with: none
|
19
|
+
color:
|
20
|
+
description:
|
21
|
+
with: purple
|
22
|
+
authentication_code:
|
23
|
+
with: highlight_gray
|
24
|
+
eletronic:
|
25
|
+
boolean:
|
26
|
+
if_true: blue
|
27
|
+
if_false: cyan
|
28
|
+
value,total:
|
29
|
+
numeric:
|
30
|
+
positive: green
|
31
|
+
zero: gray
|
32
|
+
negative: red
|
33
|
+
undefined:
|
34
|
+
with: red
|
35
|
+
row_color:
|
36
|
+
blessed_income: white
|
@@ -0,0 +1,30 @@
|
|
1
|
+
- - Initial
|
2
|
+
- 0
|
3
|
+
- 0
|
4
|
+
- false
|
5
|
+
-
|
6
|
+
- - Deposit
|
7
|
+
- 100.58
|
8
|
+
- 100.58
|
9
|
+
- true
|
10
|
+
- QAWSEDRFTGH535
|
11
|
+
- - Withdraw
|
12
|
+
- -50.23
|
13
|
+
- 50.35
|
14
|
+
- true
|
15
|
+
- 34ERDTF6GYU
|
16
|
+
- - Withdraw
|
17
|
+
- -100
|
18
|
+
- -49.65
|
19
|
+
- true
|
20
|
+
- 2344EDRFT5
|
21
|
+
- - Deposit
|
22
|
+
- 50
|
23
|
+
- 0.35
|
24
|
+
- false
|
25
|
+
-
|
26
|
+
- - Deposit
|
27
|
+
- 600
|
28
|
+
- 600.35
|
29
|
+
- false
|
30
|
+
-
|
data/examples/license_box.rb
CHANGED
data/examples/monitor_table.rb
CHANGED
@@ -35,26 +35,20 @@ opt = OptionParser::new
|
|
35
35
|
@table.format :free_memory, :using => Yummi::Formatters.byte
|
36
36
|
|
37
37
|
# colorizer for memory
|
38
|
-
memory_colorizer = Yummi::Colorizers.
|
39
|
-
free_memory.to_f / max_memory
|
40
|
-
end
|
41
|
-
memory_colorizer.use(:red) { |value| value > 0.1 and value < 0.3 }
|
42
|
-
memory_colorizer.use(:intense_red) { |value| value <= 0.1 }
|
38
|
+
memory_colorizer = Yummi::Colorizers.percentage :max => :max_memory, :free => :free_memory
|
43
39
|
|
44
40
|
# colorizer for threads
|
45
|
-
thread_colorizer = Yummi::Colorizers.
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
41
|
+
thread_colorizer = Yummi::Colorizers.percentage :max => :max_threads,
|
42
|
+
:using => :in_use_threads,
|
43
|
+
:threshold => {
|
44
|
+
:warn => 0.9,
|
45
|
+
:bad => 0.7
|
46
|
+
}
|
50
47
|
|
51
|
-
opt.on '--color TYPE', 'Specify the color type (zebra,
|
48
|
+
opt.on '--color TYPE', 'Specify the color type (zebra,cell,none)' do |type|
|
52
49
|
case type
|
53
50
|
when 'zebra'
|
54
|
-
@table.row_colorizer Yummi::Colorizers.stripe :
|
55
|
-
when 'row'
|
56
|
-
@table.row_colorizer memory_colorizer
|
57
|
-
@table.row_colorizer thread_colorizer
|
51
|
+
@table.row_colorizer Yummi::Colorizers.stripe :yellow, :purple
|
58
52
|
when 'cell'
|
59
53
|
@table.using_row do
|
60
54
|
@table.colorize :free_memory, :using => memory_colorizer
|
data/lib/yummi.rb
CHANGED
@@ -202,85 +202,11 @@ module Yummi
|
|
202
202
|
|
203
203
|
end
|
204
204
|
|
205
|
-
# A module used to create an alias method in a formatter block
|
206
|
-
module FormatterBlock
|
207
|
-
|
208
|
-
# Calls the :call: method
|
209
|
-
def format (value)
|
210
|
-
call value
|
211
|
-
end
|
212
|
-
|
213
|
-
end
|
214
|
-
|
215
|
-
# Extends the given block with #FormatterBlock
|
216
|
-
def self.to_format &block
|
217
|
-
block.extend FormatterBlock
|
218
|
-
end
|
219
|
-
|
220
|
-
# A module with useful formatters
|
221
|
-
module Formatters
|
222
|
-
|
223
|
-
# A formatter for boolean values that uses 'Yes' or 'No'
|
224
|
-
def self.yes_or_no
|
225
|
-
Yummi::to_format do |value|
|
226
|
-
value ? "Yes" : "No"
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
|
-
# A formatter to float values that uses the precision to round the value
|
231
|
-
def self.round precision
|
232
|
-
Yummi::to_format do |value|
|
233
|
-
"%.#{precision}f" % value
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
# Defines the modes to format a byte value
|
238
|
-
BYTE_MODES = {
|
239
|
-
:iec => {
|
240
|
-
:range => %w{B KiB MiB GiB TiB PiB EiB ZiB YiB},
|
241
|
-
:step => 1024
|
242
|
-
},
|
243
|
-
:si => {
|
244
|
-
:range => %w{B KB MB GB TB PB EB ZB YB},
|
245
|
-
:step => 1000
|
246
|
-
}
|
247
|
-
}
|
248
|
-
|
249
|
-
#
|
250
|
-
# Formats a byte value to ensure easily reading
|
251
|
-
#
|
252
|
-
# === Hash Args
|
253
|
-
#
|
254
|
-
# +precision+::
|
255
|
-
# How many decimal digits should be displayed. (Defaults to 1)
|
256
|
-
# +mode+::
|
257
|
-
# Which mode should be used to display unit symbols. (Defaults to :iec)
|
258
|
-
#
|
259
|
-
# See #BYTE_MODES
|
260
|
-
#
|
261
|
-
def self.byte params = {}
|
262
|
-
Yummi::to_format do |value|
|
263
|
-
value = value.to_i if value.is_a? String
|
264
|
-
mode = (params[:mode] or :iec)
|
265
|
-
range = BYTE_MODES[mode][:range]
|
266
|
-
step = BYTE_MODES[mode][:step]
|
267
|
-
params[:precision] ||= 1
|
268
|
-
result = value
|
269
|
-
range.each_index do |i|
|
270
|
-
minimun = (step ** i)
|
271
|
-
result = "%.#{params[:precision]}f #{range[i]}" % (value.to_f / minimun) if value >= minimun
|
272
|
-
end
|
273
|
-
result
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
end
|
278
|
-
|
279
205
|
# A class to expose indexed data by numeric indexes and aliases.
|
280
206
|
class IndexedData
|
281
207
|
|
282
208
|
def initialize (aliases, data)
|
283
|
-
@aliases = aliases
|
209
|
+
@aliases = aliases.collect {|a| a.to_s}
|
284
210
|
@data = data
|
285
211
|
end
|
286
212
|
|
@@ -288,7 +214,9 @@ module Yummi
|
|
288
214
|
if value.is_a? Fixnum
|
289
215
|
@data[value]
|
290
216
|
else
|
291
|
-
@
|
217
|
+
index = @aliases.index(value.to_s)
|
218
|
+
raise Exception::new("Unknow alias #{value}: \nAliases: #{@aliases}") unless index
|
219
|
+
@data[index]
|
292
220
|
end
|
293
221
|
end
|
294
222
|
|
@@ -333,13 +261,34 @@ module Yummi
|
|
333
261
|
|
334
262
|
end
|
335
263
|
|
264
|
+
module Helpers
|
265
|
+
|
266
|
+
def self.symbolize_keys hash
|
267
|
+
hash.replace(hash.inject({}) do |h, (k, v)|
|
268
|
+
v = symbolize_keys(v) if v.is_a? Hash
|
269
|
+
if v.is_a? Array
|
270
|
+
v.each do |e|
|
271
|
+
if e.is_a? Hash
|
272
|
+
symbolize_keys(e)
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
276
|
+
k = k.to_sym if k.respond_to? :to_sym
|
277
|
+
h[k] = v
|
278
|
+
h
|
279
|
+
end)
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
336
283
|
end
|
337
284
|
|
338
285
|
require_relative 'yummi/no_colors' if RUBY_PLATFORM['mingw'] #Windows
|
339
286
|
|
340
287
|
require_relative "yummi/colorizers"
|
288
|
+
require_relative "yummi/formatters"
|
341
289
|
require_relative 'yummi/color_mapping'
|
342
290
|
require_relative 'yummi/table'
|
291
|
+
require_relative 'yummi/table_builder'
|
343
292
|
require_relative 'yummi/text_box'
|
344
293
|
require_relative 'yummi/logger'
|
345
294
|
|
data/lib/yummi/colorizers.rb
CHANGED
@@ -53,7 +53,7 @@ module Yummi
|
|
53
53
|
# convention, the first argument must be the object to colorize (to_s is called on it
|
54
54
|
# for getting the text to colorize).#
|
55
55
|
def color_for (*args)
|
56
|
-
call
|
56
|
+
call(*args)
|
57
57
|
end
|
58
58
|
|
59
59
|
end
|
@@ -100,6 +100,110 @@ module Yummi
|
|
100
100
|
LineColorizer::new mappings
|
101
101
|
end
|
102
102
|
|
103
|
+
#
|
104
|
+
# A colorizer that uses the given color.
|
105
|
+
#
|
106
|
+
def self.with color
|
107
|
+
Yummi::to_colorize do |value|
|
108
|
+
color
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.when params
|
113
|
+
Yummi::to_colorize do |value|
|
114
|
+
color = params[value]
|
115
|
+
return color if color
|
116
|
+
if value.respond_to? :to_sym
|
117
|
+
color = params[value.to_sym]
|
118
|
+
end
|
119
|
+
unless color
|
120
|
+
params.each do |k, v|
|
121
|
+
return v if k.to_s == value.to_s
|
122
|
+
end
|
123
|
+
end
|
124
|
+
color
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
#
|
129
|
+
# A colorizer for boolean values.
|
130
|
+
#
|
131
|
+
# Parameters:
|
132
|
+
# - if_true: color used if the value is true (defaults to green)
|
133
|
+
# - if_false: color used if the value is false (defaults to yellow)
|
134
|
+
#
|
135
|
+
def self.boolean params = {}
|
136
|
+
Yummi::to_colorize do |value|
|
137
|
+
if value.to_s.downcase == "true"
|
138
|
+
(params[:if_true] or :green)
|
139
|
+
else
|
140
|
+
(params[:if_false] or :yellow)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
#
|
146
|
+
# A colorizer that uses a set of minimun values to use a color.
|
147
|
+
#
|
148
|
+
# Parameters:
|
149
|
+
# - MINIMUN_VALUE: COLOR_TO_USE
|
150
|
+
#
|
151
|
+
def self.threshold params
|
152
|
+
colorizer = lambda do |value|
|
153
|
+
params.sort.reverse_each do |limit, color|
|
154
|
+
return color if value > limit
|
155
|
+
end
|
156
|
+
end
|
157
|
+
Yummi::to_colorize(&colorizer)
|
158
|
+
end
|
159
|
+
|
160
|
+
def self.percentage params
|
161
|
+
PercentageColorizer::new params
|
162
|
+
end
|
163
|
+
|
164
|
+
def self.numeric params
|
165
|
+
Yummi::to_format do |value|
|
166
|
+
if params[:negative] and value < 0
|
167
|
+
params[:negative]
|
168
|
+
elsif params[:positive] and value > 0
|
169
|
+
params[:positive]
|
170
|
+
elsif params[:zero] and value == 0
|
171
|
+
params[:zero]
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
class PercentageColorizer
|
177
|
+
include Yummi::Colorizer
|
178
|
+
|
179
|
+
def initialize(params)
|
180
|
+
@max = params[:max]
|
181
|
+
@free = params[:free]
|
182
|
+
@using = params[:using]
|
183
|
+
@color = params[:color] || {
|
184
|
+
:bad => :red,
|
185
|
+
:warn => :yellow,
|
186
|
+
:good => :green
|
187
|
+
}
|
188
|
+
@threshold = params[:threshold] || {
|
189
|
+
:warn => 0.30,
|
190
|
+
:bad => 0.15
|
191
|
+
}
|
192
|
+
end
|
193
|
+
|
194
|
+
def call(data)
|
195
|
+
max = data[@max.to_sym].to_f
|
196
|
+
free = @using ? max - data[@using.to_sym].to_f : data[@free.to_sym].to_f
|
197
|
+
|
198
|
+
percentage = free / max
|
199
|
+
|
200
|
+
return @color[:bad] if percentage <= @threshold[:bad]
|
201
|
+
return @color[:warn] if percentage <= @threshold[:warn]
|
202
|
+
@color[:good]
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
206
|
+
|
103
207
|
#
|
104
208
|
# A colorizer for lines that follows a pattern. This colorizer is usefull
|
105
209
|
# for log files.
|
@@ -169,7 +273,7 @@ module Yummi
|
|
169
273
|
|
170
274
|
# Creates a new colorizer using the given colors
|
171
275
|
def initialize (*colors)
|
172
|
-
@colors = colors
|
276
|
+
@colors = colors.flatten
|
173
277
|
@count = -1
|
174
278
|
end
|
175
279
|
|
@@ -218,11 +322,11 @@ module Yummi
|
|
218
322
|
|
219
323
|
# Resolves the value using the main block and given arguments
|
220
324
|
def resolve_value (*args)
|
221
|
-
@block.call
|
325
|
+
@block.call(*args)
|
222
326
|
end
|
223
327
|
|
224
328
|
def call (*args)
|
225
|
-
value = resolve_value
|
329
|
+
value = resolve_value(*args)
|
226
330
|
@eval_blocks.each_index do |i|
|
227
331
|
return @colors[i] if @eval_blocks[i].call(value)
|
228
332
|
end
|
@@ -0,0 +1,149 @@
|
|
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
|
+
module Yummi
|
24
|
+
|
25
|
+
# A module used to create an alias method in a formatter block
|
26
|
+
module FormatterBlock
|
27
|
+
|
28
|
+
# Calls the :call: method
|
29
|
+
def format (value)
|
30
|
+
call value
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
# Extends the given block with #FormatterBlock
|
36
|
+
def self.to_format &block
|
37
|
+
block.extend FormatterBlock
|
38
|
+
end
|
39
|
+
|
40
|
+
# A module with useful formatters
|
41
|
+
module Formatters
|
42
|
+
|
43
|
+
#
|
44
|
+
# A formatter for boolean values that uses 'Yes' or 'No' by default
|
45
|
+
#
|
46
|
+
# === Hash Args
|
47
|
+
#
|
48
|
+
# :if_true => String to use when value is true
|
49
|
+
# :if_false => String to use when value is false
|
50
|
+
#
|
51
|
+
def self.boolean params = {}
|
52
|
+
Yummi::to_format do |value|
|
53
|
+
if value.to_s.downcase == "true"
|
54
|
+
(params[:if_true] or "Yes")
|
55
|
+
else
|
56
|
+
(params[:if_false] or "No")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# A formatter to round float values
|
62
|
+
def self.round precision
|
63
|
+
Yummi::to_format do |value|
|
64
|
+
"%.#{precision}f" % value
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# A formatter that uses the given format
|
69
|
+
def self.with format
|
70
|
+
Yummi::to_format do |value|
|
71
|
+
format % value
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
#
|
76
|
+
# A formatter for numeric values
|
77
|
+
#
|
78
|
+
# === Hash Args
|
79
|
+
#
|
80
|
+
# :negative => format to use when value is negative
|
81
|
+
# :zero => format to use when value is zero
|
82
|
+
# :positive => format to use when value is positive
|
83
|
+
#
|
84
|
+
def self.numeric params
|
85
|
+
Yummi::to_format do |value|
|
86
|
+
if params[:negative] and value < 0
|
87
|
+
params[:negative] % value.abs
|
88
|
+
elsif params[:positive] and value > 0
|
89
|
+
params[:positive] % value
|
90
|
+
elsif params[:zero] and value == 0
|
91
|
+
params[:zero] % value
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
#
|
97
|
+
# A formatter for percentual values.
|
98
|
+
#
|
99
|
+
# Paramters:
|
100
|
+
# The precision to use (defaults to 3)
|
101
|
+
#
|
102
|
+
def self.percentage precision = 3
|
103
|
+
Yummi::to_format do |value|
|
104
|
+
"%.#{precision}f%%" % (value * 100)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# Defines the modes to format a byte value
|
109
|
+
BYTE_MODES = {
|
110
|
+
:iec => {
|
111
|
+
:range => %w{B KiB MiB GiB TiB PiB EiB ZiB YiB},
|
112
|
+
:step => 1024
|
113
|
+
},
|
114
|
+
:si => {
|
115
|
+
:range => %w{B KB MB GB TB PB EB ZB YB},
|
116
|
+
:step => 1000
|
117
|
+
}
|
118
|
+
}
|
119
|
+
|
120
|
+
#
|
121
|
+
# Formats a byte value to ensure easily reading
|
122
|
+
#
|
123
|
+
# === Hash Args
|
124
|
+
#
|
125
|
+
# +precision+::
|
126
|
+
# How many decimal digits should be displayed. (Defaults to 1)
|
127
|
+
# +mode+::
|
128
|
+
# Which mode should be used to display unit symbols. (Defaults to :iec)
|
129
|
+
#
|
130
|
+
# See #BYTE_MODES
|
131
|
+
#
|
132
|
+
def self.byte params = {}
|
133
|
+
Yummi::to_format do |value|
|
134
|
+
value = value.to_i if value.is_a? String
|
135
|
+
mode = (params[:mode] or :iec)
|
136
|
+
range = BYTE_MODES[mode][:range]
|
137
|
+
step = BYTE_MODES[mode][:step]
|
138
|
+
params[:precision] ||= 1
|
139
|
+
result = value
|
140
|
+
range.each_index do |i|
|
141
|
+
minimun = (step ** i)
|
142
|
+
result = "%.#{params[:precision]}f #{range[i]}" % (value.to_f / minimun) if value >= minimun
|
143
|
+
end
|
144
|
+
result
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
end
|
data/lib/yummi/table.rb
CHANGED
@@ -46,6 +46,8 @@ module Yummi
|
|
46
46
|
attr_accessor :colors
|
47
47
|
# The table layout (horizontal or vertical)
|
48
48
|
attr_reader :layout
|
49
|
+
# The table header
|
50
|
+
attr_reader :header
|
49
51
|
|
50
52
|
# Creates a new table with the default attributes:
|
51
53
|
#
|
@@ -144,6 +146,7 @@ module Yummi
|
|
144
146
|
def align (indexes, type)
|
145
147
|
[*indexes].each do |index|
|
146
148
|
index = parse_index(index)
|
149
|
+
raise Exception::new "Undefined column #{index}" unless index
|
147
150
|
@align[index] = type
|
148
151
|
end
|
149
152
|
end
|
@@ -153,15 +156,12 @@ module Yummi
|
|
153
156
|
# The component must respond to +call+ with the index and the row as the arguments and
|
154
157
|
# return a color or +nil+ if default color should be used. A block can also be used.
|
155
158
|
#
|
156
|
-
# You can add as much colorizers as you want. The first color returned will be used.
|
157
|
-
#
|
158
159
|
# === Example
|
159
160
|
#
|
160
161
|
# table.row_colorizer { |i, row| :red if row[:value] < 0 }
|
161
162
|
#
|
162
163
|
def row_colorizer (colorizer = nil, &block)
|
163
|
-
@row_colorizer
|
164
|
-
@row_colorizer << (colorizer or block)
|
164
|
+
@row_colorizer = (colorizer or block)
|
165
165
|
end
|
166
166
|
|
167
167
|
#
|
@@ -205,7 +205,6 @@ module Yummi
|
|
205
205
|
# #using_row) as the arguments and return a color or +nil+ if default color should be
|
206
206
|
# used. A block can also be used.
|
207
207
|
#
|
208
|
-
# You can add as much colorizers as you want. The first color returned will be used.
|
209
208
|
#
|
210
209
|
# === Args
|
211
210
|
#
|
@@ -224,9 +223,12 @@ module Yummi
|
|
224
223
|
def colorize (indexes, params = {}, &block)
|
225
224
|
[*indexes].each do |index|
|
226
225
|
index = parse_index(index)
|
227
|
-
|
228
|
-
|
229
|
-
|
226
|
+
if index
|
227
|
+
obj = (params[:using] or block or (proc { |v| params[:with] }))
|
228
|
+
@colorizers[index] = {:use_row => @using_row, :component => obj}
|
229
|
+
else
|
230
|
+
colorize_null params, &block
|
231
|
+
end
|
230
232
|
end
|
231
233
|
end
|
232
234
|
|
@@ -271,9 +273,13 @@ module Yummi
|
|
271
273
|
def format (indexes, params = {}, &block)
|
272
274
|
[*indexes].each do |index|
|
273
275
|
index = parse_index(index)
|
274
|
-
|
275
|
-
|
276
|
-
|
276
|
+
if index
|
277
|
+
@formatters[index] = (params[:using] or block)
|
278
|
+
@formatters[index] ||= proc do |value|
|
279
|
+
params[:with] % value
|
280
|
+
end
|
281
|
+
else
|
282
|
+
format_null params, &block
|
277
283
|
end
|
278
284
|
end
|
279
285
|
end
|
@@ -377,18 +383,12 @@ module Yummi
|
|
377
383
|
color = nil
|
378
384
|
value = nil
|
379
385
|
column = row[col_index]
|
380
|
-
|
386
|
+
colorizer = @colorizers[col_index]
|
381
387
|
if @null_colorizer and column.nil?
|
382
388
|
color = @null_colorizer.call(column)
|
383
|
-
elsif
|
384
|
-
|
385
|
-
|
386
|
-
c = colorizer[:component].call(arg)
|
387
|
-
if c
|
388
|
-
color = c
|
389
|
-
break
|
390
|
-
end
|
391
|
-
end
|
389
|
+
elsif colorizer
|
390
|
+
arg = colorizer[:use_row] ? IndexedData::new(@aliases, row) : column
|
391
|
+
color = colorizer[:component].call(arg)
|
392
392
|
else
|
393
393
|
color = @colors[:value]
|
394
394
|
end
|
@@ -410,8 +410,7 @@ module Yummi
|
|
410
410
|
end,
|
411
411
|
:new => proc do |value, data|
|
412
412
|
{:value => value, :color => data[:color]}
|
413
|
-
end
|
414
|
-
)
|
413
|
+
end)
|
415
414
|
_row_data.each do |_row|
|
416
415
|
output << _row
|
417
416
|
end
|
@@ -444,8 +443,8 @@ module Yummi
|
|
444
443
|
end
|
445
444
|
|
446
445
|
def parse_index(value)
|
447
|
-
return
|
448
|
-
value
|
446
|
+
return value if value.is_a? Fixnum
|
447
|
+
(@aliases.index(value) or @aliases.index(value.to_sym))
|
449
448
|
end
|
450
449
|
|
451
450
|
def max_width(data, column)
|
@@ -0,0 +1,150 @@
|
|
1
|
+
# The MIT License
|
2
|
+
#
|
3
|
+
# Copyright (c) 2011-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
|
+
module Yummi
|
24
|
+
class TableBuilder
|
25
|
+
|
26
|
+
attr_accessor :config, :repositories
|
27
|
+
|
28
|
+
def initialize config = {}
|
29
|
+
if config.is_a? String
|
30
|
+
config = Yummi::Helpers::symbolize_keys(YAML::load_file(config))
|
31
|
+
end
|
32
|
+
@config = config
|
33
|
+
@repositories = {}
|
34
|
+
|
35
|
+
@repositories[:formatters] = [Yummi::Formatters]
|
36
|
+
@repositories[:colorizers] = [Yummi::Colorizers]
|
37
|
+
@repositories[:row_based_colorizers] = [Yummi::Colorizers]
|
38
|
+
@repositories[:using_row_colorizers] = [Yummi::Colorizers]
|
39
|
+
end
|
40
|
+
|
41
|
+
def defaults
|
42
|
+
component [:color, :colorize], :repository => :colorizers,
|
43
|
+
:invoke => :colorize
|
44
|
+
|
45
|
+
component :format, :repository => :formatters,
|
46
|
+
:invoke => :format
|
47
|
+
|
48
|
+
component [:row_color, :colorize_row], :repository => :row_based_colorizers,
|
49
|
+
:invoke => :row_colorizer,
|
50
|
+
:row_based => true
|
51
|
+
|
52
|
+
component [:state, :health], :repository => :using_row_colorizers,
|
53
|
+
:invoke => :colorize,
|
54
|
+
:using_row => true
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
def components
|
59
|
+
@components ||= {}
|
60
|
+
@components
|
61
|
+
end
|
62
|
+
|
63
|
+
def component keys, params
|
64
|
+
[*keys].each do |key|
|
65
|
+
components[key] = params
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def build_table
|
70
|
+
table = Yummi::Table::new
|
71
|
+
table.title = config[:title]
|
72
|
+
table.description= config[:description]
|
73
|
+
table.aliases = config[:aliases] if config[:aliases]
|
74
|
+
table.header = config[:header] if config[:header]
|
75
|
+
table.layout = config[:layout].to_sym if config[:layout]
|
76
|
+
|
77
|
+
components.each do |key, component_config|
|
78
|
+
block = lambda do |params|
|
79
|
+
if component_config[:using_row]
|
80
|
+
table.using_row do
|
81
|
+
table.send component_config[:invoke], *params
|
82
|
+
end
|
83
|
+
else
|
84
|
+
table.send component_config[:invoke], *params
|
85
|
+
end
|
86
|
+
end
|
87
|
+
if component_config[:row_based]
|
88
|
+
parse_row_based_component config[key], component_config, &block
|
89
|
+
else
|
90
|
+
parse_component config[key], component_config, &block
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
table
|
95
|
+
end
|
96
|
+
|
97
|
+
def parse_component(definitions, config)
|
98
|
+
if definitions
|
99
|
+
definitions.each do |column, component_config|
|
100
|
+
callback = []
|
101
|
+
column = column.to_s.split(/,/)
|
102
|
+
callback << column
|
103
|
+
component = create_component(component_config, config)
|
104
|
+
callback << {:using => component}
|
105
|
+
yield(callback)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def parse_row_based_component(definitions, config)
|
111
|
+
if definitions
|
112
|
+
if definitions.is_a? Hash
|
113
|
+
definitions.each do |component_name, params|
|
114
|
+
yield(create_component({component_name => params}, config))
|
115
|
+
end
|
116
|
+
else
|
117
|
+
puts definitions
|
118
|
+
component = create_component(definitions, config)
|
119
|
+
puts component
|
120
|
+
yield(component)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def create_component(component_config, config)
|
126
|
+
repositories = @repositories[config[:repository]].reverse
|
127
|
+
if component_config.is_a? Hash
|
128
|
+
component_config = Yummi::Helpers::symbolize_keys(component_config)
|
129
|
+
component = Yummi::GroupedComponent::new
|
130
|
+
component_config.each do |component_name, params|
|
131
|
+
repositories.each do |repository|
|
132
|
+
if repository.respond_to? component_name
|
133
|
+
component << repository.send(component_name, params)
|
134
|
+
break
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
return component
|
139
|
+
else
|
140
|
+
repositories.each do |repository|
|
141
|
+
if repository.respond_to? component_config
|
142
|
+
return repository.send(component_config)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
data/lib/yummi/version.rb
CHANGED
data/yummi.ipr
CHANGED
@@ -21,6 +21,7 @@
|
|
21
21
|
<entry name="?*.dtd" />
|
22
22
|
<entry name="?*.tld" />
|
23
23
|
<entry name="?*.ftl" />
|
24
|
+
<entry name="trace.info" />
|
24
25
|
</wildcardResourcePatterns>
|
25
26
|
<annotationProcessing enabled="false" useClasspath="true" />
|
26
27
|
</component>
|
@@ -41,6 +42,9 @@
|
|
41
42
|
<option name="SKIP_IMPORT_STATEMENTS" value="false" />
|
42
43
|
</component>
|
43
44
|
<component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
|
45
|
+
<component name="GradleSettings">
|
46
|
+
<option name="gradleHome" value="$USER_HOME$/build/gradle" />
|
47
|
+
</component>
|
44
48
|
<component name="GradleUISettings2">
|
45
49
|
<setting name="root" />
|
46
50
|
</component>
|
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.
|
4
|
+
version: 0.5.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-
|
12
|
+
date: 2012-10-13 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A tool to colorize your console application.
|
15
15
|
email:
|
@@ -27,6 +27,10 @@ files:
|
|
27
27
|
- Rakefile
|
28
28
|
- bin/colorize
|
29
29
|
- examples/cash_flow_table.rb
|
30
|
+
- examples/cash_flow_table.yaml
|
31
|
+
- examples/cash_flow_table_data.csv
|
32
|
+
- examples/cash_flow_table_data.yaml
|
33
|
+
- examples/cash_flow_table_extensions.rb
|
30
34
|
- examples/license_box.rb
|
31
35
|
- examples/list_files.rb
|
32
36
|
- examples/logcat_colorizer.rb
|
@@ -35,12 +39,14 @@ files:
|
|
35
39
|
- lib/yummi.rb
|
36
40
|
- lib/yummi/color_mapping.rb
|
37
41
|
- lib/yummi/colorizers.rb
|
42
|
+
- lib/yummi/formatters.rb
|
38
43
|
- lib/yummi/logger.rb
|
39
44
|
- lib/yummi/mappings/jboss5.yaml
|
40
45
|
- lib/yummi/mappings/jboss7.yaml
|
41
46
|
- lib/yummi/mappings/weblogic11g.yaml
|
42
47
|
- lib/yummi/no_colors.rb
|
43
48
|
- lib/yummi/table.rb
|
49
|
+
- lib/yummi/table_builder.rb
|
44
50
|
- lib/yummi/text_box.rb
|
45
51
|
- lib/yummi/version.rb
|
46
52
|
- yummi.gemspec
|