riel 1.1.2 → 1.1.6
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/lib/riel/ansicolor.rb +4 -6
- data/lib/riel/array.rb +1 -0
- data/lib/riel/asciitable/cell.rb +82 -0
- data/lib/riel/asciitable/column.rb +26 -0
- data/lib/riel/asciitable/row.rb +106 -0
- data/lib/riel/asciitable/table.rb +295 -0
- data/lib/riel/fdprocessor.rb +68 -0
- data/lib/riel/integer.rb +23 -0
- data/lib/riel/io.rb +22 -17
- data/lib/riel/log/log.rb +251 -0
- data/lib/riel/log/loggable.rb +103 -0
- data/lib/riel/log/logger.rb +297 -0
- data/lib/riel/log/severity.rb +22 -0
- data/lib/riel/log.rb +9 -473
- data/lib/riel/pathname.rb +5 -1
- data/lib/riel/rcfile.rb +1 -1
- data/lib/riel/string.rb +8 -8
- data/lib/riel/text.rb +57 -53
- data/lib/riel.rb +8 -4
- data/test/riel/integer_test.rb +44 -0
- data/test/riel/io_test.rb +2 -5
- data/test/riel/log_test.rb +30 -32
- metadata +68 -56
data/lib/riel/ansicolor.rb
CHANGED
@@ -9,7 +9,6 @@
|
|
9
9
|
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
|
10
10
|
|
11
11
|
module ANSIColor
|
12
|
-
|
13
12
|
ATTRIBUTES = Hash[
|
14
13
|
'none' => '0',
|
15
14
|
'reset' => '0',
|
@@ -58,24 +57,24 @@ module ANSIColor
|
|
58
57
|
# underscore bold magenta on cyan
|
59
58
|
# underscore red on bold cyan
|
60
59
|
|
61
|
-
def ANSIColor.code
|
60
|
+
def ANSIColor.code str
|
62
61
|
fg, bg = str.split(/\s*\bon_?\s*/)
|
63
62
|
(fg ? foreground(fg) : "") + (bg ? background(bg) : "")
|
64
63
|
end
|
65
64
|
|
66
65
|
# returns the code for the given background color(s)
|
67
|
-
def ANSIColor.background
|
66
|
+
def ANSIColor.background bgcolor
|
68
67
|
make_code("on_" + bgcolor)
|
69
68
|
end
|
70
69
|
|
71
70
|
# returns the code for the given foreground color(s)
|
72
|
-
def ANSIColor.foreground
|
71
|
+
def ANSIColor.foreground fgcolor
|
73
72
|
make_code(fgcolor)
|
74
73
|
end
|
75
74
|
|
76
75
|
protected
|
77
76
|
|
78
|
-
def ANSIColor.make_code
|
77
|
+
def ANSIColor.make_code str
|
79
78
|
if str
|
80
79
|
str.split.collect do |s|
|
81
80
|
if attr = ATTRIBUTES[s]
|
@@ -89,5 +88,4 @@ module ANSIColor
|
|
89
88
|
""
|
90
89
|
end
|
91
90
|
end
|
92
|
-
|
93
91
|
end
|
data/lib/riel/array.rb
CHANGED
@@ -0,0 +1,82 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'riel/log'
|
5
|
+
|
6
|
+
module RIEL
|
7
|
+
class Cell
|
8
|
+
include Loggable
|
9
|
+
|
10
|
+
attr_reader :column
|
11
|
+
attr_reader :row
|
12
|
+
|
13
|
+
attr_accessor :value
|
14
|
+
attr_accessor :colors
|
15
|
+
attr_accessor :span
|
16
|
+
|
17
|
+
def initialize column, row, value = nil, colors = Array.new
|
18
|
+
@column = column
|
19
|
+
@row = row
|
20
|
+
@value = value
|
21
|
+
@colors = colors
|
22
|
+
@span = span
|
23
|
+
end
|
24
|
+
|
25
|
+
def _value width
|
26
|
+
value.nil? ? "" : value.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def inspect
|
30
|
+
"(#{@column}, #{@row}) => #{@value}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_s
|
34
|
+
"(#{@column}, #{@row}) => #{@value}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def formatted_value width, align
|
38
|
+
strval = _value width
|
39
|
+
|
40
|
+
if @span
|
41
|
+
ncolumns = @span - @column
|
42
|
+
width = width * (1 + ncolumns) + (3 * ncolumns)
|
43
|
+
end
|
44
|
+
|
45
|
+
diff = width - strval.length
|
46
|
+
|
47
|
+
lhs, rhs = case align
|
48
|
+
when :left
|
49
|
+
[ 0, diff ]
|
50
|
+
when :right
|
51
|
+
[ diff, 0 ]
|
52
|
+
when :center
|
53
|
+
l = diff / 2
|
54
|
+
r = diff - l
|
55
|
+
[ l, r ]
|
56
|
+
else
|
57
|
+
$stderr.puts "oh my!: #{align}"
|
58
|
+
end
|
59
|
+
|
60
|
+
str = (" " * lhs) + strval + (" " * rhs)
|
61
|
+
|
62
|
+
if colors
|
63
|
+
colors.each do |cl|
|
64
|
+
str = str.send cl
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
str
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
class BannerCell < Cell
|
73
|
+
def initialize char, col, row
|
74
|
+
@char = char
|
75
|
+
super(col, row)
|
76
|
+
end
|
77
|
+
|
78
|
+
def _value width
|
79
|
+
@char * width
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'riel/log'
|
5
|
+
|
6
|
+
module RIEL
|
7
|
+
module ASCIITable
|
8
|
+
class Column
|
9
|
+
attr_accessor :width
|
10
|
+
attr_accessor :num
|
11
|
+
attr_accessor :align
|
12
|
+
attr_accessor :table
|
13
|
+
|
14
|
+
def initialize table, num, width = nil, align = nil
|
15
|
+
@table = table
|
16
|
+
@num = num
|
17
|
+
@width = width
|
18
|
+
@align = align
|
19
|
+
end
|
20
|
+
|
21
|
+
def total fromrow, torow
|
22
|
+
@table.cells_in_column(@num).inject(0) { |sum, cell| sum + (cell.row >= fromrow && cell.row <= torow ? cell.value.to_i : 0) }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'riel/log'
|
5
|
+
|
6
|
+
module RIEL
|
7
|
+
module ASCIITable
|
8
|
+
class Row
|
9
|
+
include Loggable
|
10
|
+
|
11
|
+
attr_accessor :table
|
12
|
+
attr_accessor :num
|
13
|
+
|
14
|
+
def initialize table, num
|
15
|
+
@table = table
|
16
|
+
@num = num
|
17
|
+
end
|
18
|
+
|
19
|
+
def print columns, align = nil
|
20
|
+
tocol = @table.last_column
|
21
|
+
col = 0
|
22
|
+
fmtdvalues = Array.new
|
23
|
+
while col <= tocol
|
24
|
+
aln = align || @table.column_align(col)
|
25
|
+
cell = @table.cell(col, @num)
|
26
|
+
width = @table.column_width col
|
27
|
+
fmtdvalues << cell.formatted_value(width, aln)
|
28
|
+
if cell.span
|
29
|
+
col += (cell.span - col)
|
30
|
+
end
|
31
|
+
col += 1
|
32
|
+
end
|
33
|
+
print_cells fmtdvalues
|
34
|
+
end
|
35
|
+
|
36
|
+
def print_cells values
|
37
|
+
$stdout.puts "| " + values.join(" | ") + " |"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class BannerRow < Row
|
42
|
+
def initialize table, char
|
43
|
+
@char = char
|
44
|
+
super(table, nil)
|
45
|
+
end
|
46
|
+
|
47
|
+
def print
|
48
|
+
banner = (0 .. @table.last_column).collect { |col| bc = BannerCell.new(@char, col, 1) }
|
49
|
+
bannervalues = banner.collect_with_index do |bc, col|
|
50
|
+
width = @table.column_width col
|
51
|
+
bc.formatted_value width, :center
|
52
|
+
end
|
53
|
+
print_cells bannervalues
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class StatRow < Row
|
58
|
+
def initialize table
|
59
|
+
firstdatarow = table.data_rows.first
|
60
|
+
lastdatarow = table.data_rows.last
|
61
|
+
statrownum = table.last_row + 1
|
62
|
+
|
63
|
+
nrows = lastdatarow + 1 - firstdatarow
|
64
|
+
|
65
|
+
super table, statrownum
|
66
|
+
|
67
|
+
ncolumns = @table.last_column
|
68
|
+
|
69
|
+
@table.set 0, statrownum, name
|
70
|
+
|
71
|
+
1.upto(ncolumns - 1) do |col|
|
72
|
+
val = calculate col, firstdatarow, lastdatarow
|
73
|
+
@table.set col, statrownum, val
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def name
|
78
|
+
end
|
79
|
+
|
80
|
+
def calculate col, firstdatarow, lastdatarow
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
class TotalRow < StatRow
|
85
|
+
def name
|
86
|
+
"total"
|
87
|
+
end
|
88
|
+
|
89
|
+
def calculate col, fromrow, torow
|
90
|
+
@table.column(col).total fromrow, torow
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
class AverageRow < StatRow
|
95
|
+
def name
|
96
|
+
"average"
|
97
|
+
end
|
98
|
+
|
99
|
+
def calculate col, fromrow, torow
|
100
|
+
nrows = torow + 1 - fromrow
|
101
|
+
total = @table.column(col).total fromrow, torow
|
102
|
+
avg = total / nrows
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,295 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
require 'riel/log'
|
5
|
+
require 'riel/asciitable/cell'
|
6
|
+
require 'riel/asciitable/column'
|
7
|
+
require 'riel/asciitable/row'
|
8
|
+
|
9
|
+
module RIEL
|
10
|
+
module ASCIITable
|
11
|
+
class TableData
|
12
|
+
def keys
|
13
|
+
end
|
14
|
+
|
15
|
+
def fields
|
16
|
+
end
|
17
|
+
|
18
|
+
def value key, field
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class Table
|
23
|
+
include Loggable
|
24
|
+
|
25
|
+
def initialize args
|
26
|
+
@cells = Array.new
|
27
|
+
@cellwidth = args[:cellwidth] || 12
|
28
|
+
@align = args[:align] || :left
|
29
|
+
@columns = Array.new
|
30
|
+
@separator_rows = Hash.new
|
31
|
+
@default_value = args[:default_value] || ""
|
32
|
+
|
33
|
+
set_headings
|
34
|
+
set_cells
|
35
|
+
|
36
|
+
if sepival = args[:separators]
|
37
|
+
add_separators sepival
|
38
|
+
end
|
39
|
+
|
40
|
+
totrow = args[:has_total_row]
|
41
|
+
avgrow = args[:has_average_row]
|
42
|
+
|
43
|
+
if totrow || avgrow
|
44
|
+
add_separator_row '='
|
45
|
+
if totrow
|
46
|
+
TotalRow.new(self)
|
47
|
+
end
|
48
|
+
|
49
|
+
if avgrow
|
50
|
+
AverageRow.new(self)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
if args[:has_total_columns]
|
55
|
+
add_total_columns
|
56
|
+
end
|
57
|
+
|
58
|
+
if args[:highlight_max_cells]
|
59
|
+
highlight_max_cells
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# sets a separator for the row preceding +rownum+. Does not change the
|
64
|
+
# coordinates for any other cells.
|
65
|
+
def set_separator_row rownum, char = '-'
|
66
|
+
@separator_rows[rownum] = char
|
67
|
+
end
|
68
|
+
|
69
|
+
def add_separator_row char = '-'
|
70
|
+
@separator_rows[last_row + 1] = char
|
71
|
+
end
|
72
|
+
|
73
|
+
def add_separators nbetween
|
74
|
+
# banner every N rows
|
75
|
+
drows = data_rows
|
76
|
+
|
77
|
+
drows.first.upto((drows.last - 1) / nbetween) do |num|
|
78
|
+
set_separator_row 1 + num * nbetween, '-'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def last_column
|
83
|
+
@cells.collect { |cell| cell.column }.max
|
84
|
+
end
|
85
|
+
|
86
|
+
def last_row
|
87
|
+
@cells.collect { |cell| cell.row }.max
|
88
|
+
end
|
89
|
+
|
90
|
+
def cells_in_column col
|
91
|
+
@cells.select { |cell| cell.column == col }
|
92
|
+
end
|
93
|
+
|
94
|
+
def cells_in_row row
|
95
|
+
@cells.select { |cell| cell.row == row }
|
96
|
+
end
|
97
|
+
|
98
|
+
def cell col, row
|
99
|
+
cl = @cells.detect { |c| c.row == row && c.column == col }
|
100
|
+
unless cl
|
101
|
+
cl = Cell.new(col, row, @default_value)
|
102
|
+
@cells << cl
|
103
|
+
end
|
104
|
+
cl
|
105
|
+
end
|
106
|
+
|
107
|
+
def set_column_align col, align
|
108
|
+
column(col).align = align
|
109
|
+
end
|
110
|
+
|
111
|
+
def set_column_width col, width
|
112
|
+
column(col).width = width
|
113
|
+
end
|
114
|
+
|
115
|
+
def column_width col
|
116
|
+
((c = @columns[col]) && c.width) || @cellwidth
|
117
|
+
end
|
118
|
+
|
119
|
+
def column_align col
|
120
|
+
((c = @columns[col]) && c.align) || @align
|
121
|
+
end
|
122
|
+
|
123
|
+
def column col
|
124
|
+
@columns[col] ||= Column.new(self, col, @cellwidth, @align)
|
125
|
+
end
|
126
|
+
|
127
|
+
def set_cellspan fromcol, tocol, row
|
128
|
+
cell(fromcol, row).span = tocol
|
129
|
+
end
|
130
|
+
|
131
|
+
def set col, row, val
|
132
|
+
cell(col, row).value = val
|
133
|
+
end
|
134
|
+
|
135
|
+
def set_color col, row, *colors
|
136
|
+
cell(col, row).colors = colors
|
137
|
+
end
|
138
|
+
|
139
|
+
def print_row row, align = nil
|
140
|
+
Row.new(self, row).print @columns, align
|
141
|
+
end
|
142
|
+
|
143
|
+
def print_banner char = '-'
|
144
|
+
BannerRow.new(self, char).print
|
145
|
+
end
|
146
|
+
|
147
|
+
def print_header
|
148
|
+
# cells in the header are always centered
|
149
|
+
print_row 0, :center
|
150
|
+
print_banner
|
151
|
+
end
|
152
|
+
|
153
|
+
def print
|
154
|
+
print_header
|
155
|
+
|
156
|
+
(1 .. last_row).each do |row|
|
157
|
+
if char = @separator_rows[row]
|
158
|
+
print_banner char
|
159
|
+
end
|
160
|
+
print_row row
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
# returns the values in cells, sorted and unique
|
165
|
+
def sort_values cells
|
166
|
+
cells.collect { |cell| cell.value }.uniq.sort.reverse
|
167
|
+
end
|
168
|
+
|
169
|
+
def data_cells_for_row row, offset
|
170
|
+
cells_for_row row, offset, fields.length * data_cell_span
|
171
|
+
end
|
172
|
+
|
173
|
+
def get_highlight_colors
|
174
|
+
Array.new
|
175
|
+
end
|
176
|
+
|
177
|
+
def highlight_cells_in_row row, offset
|
178
|
+
cells = data_cells_for_row row, offset
|
179
|
+
highlight_cells cells
|
180
|
+
end
|
181
|
+
|
182
|
+
def highlight_cells cells
|
183
|
+
vals = sort_values cells
|
184
|
+
|
185
|
+
colors = get_highlight_colors
|
186
|
+
|
187
|
+
cells.each do |cell|
|
188
|
+
idx = vals.index cell.value
|
189
|
+
if cols = colors[idx]
|
190
|
+
cell.colors = cols
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
def highlight_cells_in_column col
|
196
|
+
cells = cells_in_column(col)[data_rows.first .. data_rows.last]
|
197
|
+
highlight_cells cells
|
198
|
+
end
|
199
|
+
|
200
|
+
def highlight_max_cells
|
201
|
+
(1 .. last_row).each do |row|
|
202
|
+
(0 .. (data_cell_span - 1)).each do |offset|
|
203
|
+
highlight_cells_in_row row, offset
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
0.upto(1) do |n|
|
208
|
+
highlight_cells_in_column data_columns.last + n
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
def data_cell_span
|
213
|
+
1
|
214
|
+
end
|
215
|
+
|
216
|
+
def set_headings
|
217
|
+
cellspan = data_cell_span
|
218
|
+
|
219
|
+
colidx = 0
|
220
|
+
set colidx, 0, headings[0]
|
221
|
+
|
222
|
+
colidx += 1
|
223
|
+
|
224
|
+
(1 ... headings.length).each do |hi|
|
225
|
+
set colidx, 0, headings[hi]
|
226
|
+
if cellspan > 1
|
227
|
+
set_cellspan colidx, colidx - 1 + cellspan, 0
|
228
|
+
end
|
229
|
+
colidx += cellspan
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
def add_total_columns
|
234
|
+
last_data_col = data_columns.last
|
235
|
+
totcol = last_data_col + 1
|
236
|
+
|
237
|
+
(1 .. last_row).each do |row|
|
238
|
+
(0 .. (data_cell_span - 1)).each do |offset|
|
239
|
+
rowcells = cells_for_row row, offset, last_data_col
|
240
|
+
total = rowcells.collect { |cell| cell.value }.inject(0) { |sum, num| sum + num }
|
241
|
+
set totcol + offset, row, total
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
# returns the cells up to the given column
|
247
|
+
def cells_for_row row, offset, maxcol
|
248
|
+
cells = cells_in_row row
|
249
|
+
cells = cells[1 .. maxcol]
|
250
|
+
cells.select_with_index { |cell, cidx| (cidx % data_cell_span) == offset }
|
251
|
+
end
|
252
|
+
|
253
|
+
def set_cells
|
254
|
+
rownum = 1
|
255
|
+
keys.each_with_index do |name, nidx|
|
256
|
+
set 0, rownum, name
|
257
|
+
|
258
|
+
colidx = 1
|
259
|
+
fields.each do |field|
|
260
|
+
(0 .. (data_cell_span - 1)).each do |didx|
|
261
|
+
val = value name, field, didx
|
262
|
+
set colidx, rownum, val
|
263
|
+
colidx += 1
|
264
|
+
end
|
265
|
+
end
|
266
|
+
rownum += 1
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
def data
|
271
|
+
nil
|
272
|
+
end
|
273
|
+
|
274
|
+
def keys
|
275
|
+
data.keys
|
276
|
+
end
|
277
|
+
|
278
|
+
def fields
|
279
|
+
data.fields
|
280
|
+
end
|
281
|
+
|
282
|
+
def value key, field, index
|
283
|
+
data.value key, field, index
|
284
|
+
end
|
285
|
+
|
286
|
+
def data_rows
|
287
|
+
(1 .. keys.length)
|
288
|
+
end
|
289
|
+
|
290
|
+
def data_columns
|
291
|
+
(1 .. fields.length * data_cell_span)
|
292
|
+
end
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
module RIEL
|
5
|
+
# File and directory processor, with filtering.
|
6
|
+
|
7
|
+
class FileDirFilter
|
8
|
+
def initialize args
|
9
|
+
@dirsonly = args[:dirsonly]
|
10
|
+
@filesonly = args[:filesonly]
|
11
|
+
@basename = args[:basename]
|
12
|
+
@dirname = args[:dirname]
|
13
|
+
@extname = args[:extname]
|
14
|
+
end
|
15
|
+
|
16
|
+
def match? fd
|
17
|
+
if @dirsonly && !fd.directory?
|
18
|
+
false
|
19
|
+
elsif @filesonly && !fd.file?
|
20
|
+
false
|
21
|
+
elsif @basename && @basename != fd.basename.to_s
|
22
|
+
false
|
23
|
+
elsif @dirname && @dirname != fd.parent.to_s
|
24
|
+
false
|
25
|
+
elsif @extname && @extname != fd.extname
|
26
|
+
false
|
27
|
+
else
|
28
|
+
true
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class FileDirProcessor
|
34
|
+
def initialize args, filters = Array.new
|
35
|
+
@filters = filters
|
36
|
+
args.each do |arg|
|
37
|
+
process Pathname.new arg
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def process_file file
|
42
|
+
end
|
43
|
+
|
44
|
+
def process_directory dir
|
45
|
+
dir.children.sort.each do |fd|
|
46
|
+
next if @filter && @filter.include?(fd.basename.to_s)
|
47
|
+
process fd
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def process fd
|
52
|
+
@filters.each do |filter|
|
53
|
+
return nil unless filter.match? fd
|
54
|
+
end
|
55
|
+
|
56
|
+
if fd.directory?
|
57
|
+
process_directory fd
|
58
|
+
elsif fd.file?
|
59
|
+
process_file fd
|
60
|
+
else
|
61
|
+
process_unknown_type fd
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def process_unknown_type fd
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/riel/integer.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# -*- ruby -*-
|
3
|
+
|
4
|
+
class Integer
|
5
|
+
POS_NEG_NUMERIC_RE = Regexp.new('^([\-\+])?(\d+)$')
|
6
|
+
|
7
|
+
class << self
|
8
|
+
# returns the value as an integer, if it is not negative
|
9
|
+
def negative? val
|
10
|
+
negnumre = Regexp.new '^(\-\d+)$'
|
11
|
+
|
12
|
+
if val.nil?
|
13
|
+
nil
|
14
|
+
elsif val.kind_of? Integer
|
15
|
+
val < 0 && val
|
16
|
+
elsif md = negnumre.match(val.to_s)
|
17
|
+
md[1].to_i
|
18
|
+
else
|
19
|
+
nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/riel/io.rb
CHANGED
@@ -3,31 +3,36 @@
|
|
3
3
|
|
4
4
|
require 'riel/file'
|
5
5
|
|
6
|
-
|
7
6
|
class IO
|
8
|
-
|
9
|
-
$-w = false
|
10
|
-
|
11
7
|
# Reads the stream into an array. It works even when $/ == nil, which
|
12
8
|
# works around a problem in Ruby 1.8.1.
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
9
|
+
if VERSION == "1.8.1"
|
10
|
+
$-w = false
|
11
|
+
|
12
|
+
def readlines
|
13
|
+
contents = []
|
14
|
+
while ((line = gets) && line.length > 0)
|
15
|
+
contents << line
|
16
|
+
end
|
17
|
+
contents
|
17
18
|
end
|
18
|
-
|
19
|
+
|
20
|
+
$-w = true
|
19
21
|
end
|
20
22
|
|
21
|
-
|
23
|
+
class << self
|
24
|
+
def writelines name, lines
|
25
|
+
fpn = File._to_pathname name
|
26
|
+
|
27
|
+
fpn.open(File::WRONLY | File::TRUNC | File::CREAT) do |f|
|
28
|
+
f.puts lines
|
29
|
+
end
|
22
30
|
|
23
|
-
|
24
|
-
|
31
|
+
fpn
|
32
|
+
end
|
25
33
|
|
26
|
-
|
27
|
-
|
34
|
+
def numlines io
|
35
|
+
io.readlines.size
|
28
36
|
end
|
29
|
-
|
30
|
-
fpn
|
31
37
|
end
|
32
|
-
|
33
38
|
end
|