rmtools 1.0.0 → 1.1.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/History.txt +5 -0
- data/Manifest.txt +84 -26
- data/Rakefile +7 -4
- data/ext/extconf.rb +1 -1
- data/ext/rmtools.cpp +27 -12
- data/ext/rmtools.h +6 -5
- data/lib/rmtools/b.rb +18 -0
- data/lib/rmtools/console/coloring.rb +72 -0
- data/lib/rmtools/console/highlight.rb +13 -0
- data/lib/rmtools/{printing.rb → console/printing.rb} +17 -2
- data/lib/rmtools/console.rb +1 -0
- data/lib/rmtools/conversions/enum.rb +23 -0
- data/lib/rmtools/conversions/int.rb +47 -0
- data/lib/rmtools/conversions/string.rb +26 -0
- data/lib/rmtools/conversions.rb +1 -0
- data/lib/rmtools/core/arguments.rb +52 -0
- data/lib/rmtools/{boolean.rb → core/boolean.rb} +0 -13
- data/lib/rmtools/core/class.rb +41 -0
- data/lib/rmtools/core/js.rb +45 -0
- data/lib/rmtools/core/kernel.rb +28 -0
- data/lib/rmtools/{module.rb → core/module.rb} +0 -41
- data/lib/rmtools/core/numeric.rb +35 -0
- data/lib/rmtools/{object.rb → core/object.rb} +2 -23
- data/lib/rmtools/core/proc.rb +18 -0
- data/lib/rmtools/core/regexp.rb +11 -0
- data/lib/rmtools/core/string_compliance.rb +31 -0
- data/lib/rmtools/core.rb +1 -0
- data/lib/rmtools/db/active_record.rb +54 -0
- data/lib/rmtools/db.rb +7 -0
- data/lib/rmtools/debug/binding.rb +56 -0
- data/lib/rmtools/debug/highlight.rb +23 -0
- data/lib/rmtools/debug/logging.rb +176 -0
- data/lib/rmtools/debug/present.rb +38 -0
- data/lib/rmtools/debug/timer.rb +19 -0
- data/lib/rmtools/debug/traceback.rb +92 -0
- data/lib/rmtools/debug.rb +1 -0
- data/lib/rmtools/debug_notrace.rb +1 -0
- data/lib/rmtools/enumerable/array.rb +134 -0
- data/lib/rmtools/enumerable/array_iterators.rb +33 -0
- data/lib/rmtools/enumerable/common.rb +49 -0
- data/lib/rmtools/{hash.rb → enumerable/hash.rb} +8 -8
- data/lib/rmtools/enumerable/object_space.rb +19 -0
- data/lib/rmtools/enumerable/range.rb +201 -0
- data/lib/rmtools/enumerable.rb +1 -0
- data/lib/rmtools/experimental/blackhole.rb +12 -0
- data/lib/rmtools/experimental/deprecation.rb +36 -0
- data/lib/rmtools/experimental/dumps.rb +28 -0
- data/lib/rmtools/{numeric.rb → experimental/numeric.rb} +22 -51
- data/lib/rmtools/experimental/rails_backtrace.rb +29 -0
- data/lib/rmtools/experimental/string.rb +56 -0
- data/lib/rmtools/{tree.rb → experimental/tree.rb} +0 -0
- data/lib/rmtools/experimental.rb +1 -0
- data/lib/rmtools/fs/dir.rb +89 -0
- data/lib/rmtools/fs/file.rb +104 -0
- data/lib/rmtools/fs/io.rb +58 -0
- data/lib/rmtools/fs/tools.rb +49 -0
- data/lib/rmtools/fs.rb +1 -0
- data/lib/rmtools/functional/fold.rb +32 -0
- data/lib/rmtools/{string_to_proc.rb → functional/string_to_proc.rb} +2 -22
- data/lib/rmtools/functional/unfold.rb +16 -0
- data/lib/rmtools/functional.rb +1 -0
- data/lib/rmtools/ip/numeric.rb +35 -0
- data/lib/rmtools/ip/string.rb +45 -0
- data/lib/rmtools/ip.rb +1 -0
- data/lib/rmtools/lang/ansi.rb +17 -0
- data/lib/rmtools/lang/cyrillic.rb +106 -0
- data/lib/rmtools/lang/regexp.rb +8 -0
- data/lib/rmtools/lang/shortcuts.rb +20 -0
- data/lib/rmtools/lang.rb +1 -0
- data/lib/rmtools/rand/array.rb +39 -0
- data/lib/rmtools/rand/enum.rb +26 -0
- data/lib/rmtools/rand/range.rb +13 -0
- data/lib/rmtools/{random.rb → rand/string.rb} +13 -107
- data/lib/rmtools/rand.rb +1 -0
- data/lib/rmtools/require.rb +13 -0
- data/lib/rmtools/setup.rb +6 -5
- data/lib/rmtools/text/string_parse.rb +60 -0
- data/lib/rmtools/{stringscanner.rb → text/string_scanner.rb} +3 -2
- data/lib/rmtools/text/string_simple.rb +75 -0
- data/lib/rmtools/text/string_split.rb +148 -0
- data/lib/rmtools/text/textilize.rb +44 -0
- data/lib/rmtools/text.rb +1 -0
- data/lib/rmtools/time/global.rb +17 -0
- data/lib/rmtools/time/russian.rb +47 -0
- data/lib/rmtools/time.rb +1 -32
- data/lib/rmtools/xml/document.rb +28 -0
- data/lib/rmtools/xml/finders.rb +84 -0
- data/lib/rmtools/xml/libxml.rb +11 -0
- data/lib/rmtools/xml/node.rb +196 -0
- data/lib/rmtools/xml/string.rb +43 -0
- data/lib/rmtools/xml/xpath.rb +32 -0
- data/lib/rmtools/xml.rb +7 -0
- data/lib/rmtools.rb +8 -44
- metadata +97 -72
- data/lib/rmtools/arguments.rb +0 -24
- data/lib/rmtools/array.rb +0 -189
- data/lib/rmtools/binding.rb +0 -23
- data/lib/rmtools/coloring.rb +0 -82
- data/lib/rmtools/cyr-time.rb +0 -49
- data/lib/rmtools/cyrilic.rb +0 -124
- data/lib/rmtools/dumps.rb +0 -192
- data/lib/rmtools/enum.rb +0 -90
- data/lib/rmtools/io.rb +0 -303
- data/lib/rmtools/js.rb +0 -25
- data/lib/rmtools/limited_string.rb +0 -17
- data/lib/rmtools/logging.rb +0 -158
- data/lib/rmtools/proc.rb +0 -25
- data/lib/rmtools/range.rb +0 -100
- data/lib/rmtools/string.rb +0 -276
- data/lib/rmtools/traceback.rb +0 -106
data/lib/rmtools/io.rb
DELETED
|
@@ -1,303 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
class Dir
|
|
3
|
-
|
|
4
|
-
def include?(name)
|
|
5
|
-
#content.map {|f| File.split(f)[1]}.include? name
|
|
6
|
-
entries.include? name
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def recursive_content(flat=true)
|
|
10
|
-
list = []
|
|
11
|
-
cont = content.map {|f|
|
|
12
|
-
if File.directory?(f)
|
|
13
|
-
rc = Dir.new(f).recursive_content.map {|f| f.sub(/^\.\//, '')}
|
|
14
|
-
flat ? list.concat(rc) : rc
|
|
15
|
-
else flat ? (list << f) : f
|
|
16
|
-
end
|
|
17
|
-
}
|
|
18
|
-
(flat ? list : cont)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def content
|
|
22
|
-
Dir["#{path}/**"].b || to_a[2..-1].sort.map {|c| File.join path, c}
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def parent
|
|
26
|
-
newpath = File.dirname(path)
|
|
27
|
-
Dir.new(newpath) if newpath != path
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def child(idx)
|
|
31
|
-
df = content[idx]
|
|
32
|
-
if File.file?(df)
|
|
33
|
-
File.new(df)
|
|
34
|
-
elsif File.directory?(df)
|
|
35
|
-
Dir.new(df)
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def children
|
|
40
|
-
content.map {|df|
|
|
41
|
-
if File.file?(df)
|
|
42
|
-
File.new(df)
|
|
43
|
-
elsif File.directory?(df)
|
|
44
|
-
Dir.new(df)
|
|
45
|
-
end
|
|
46
|
-
}
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def refresh
|
|
50
|
-
return if !File.directory?(path)
|
|
51
|
-
Dir.new(path)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def inspect
|
|
55
|
-
displaypath = case path
|
|
56
|
-
when /^(\/|\w:)/ then path
|
|
57
|
-
when /^\./ then File.join(Dir.pwd, path[1..-1])
|
|
58
|
-
else File.join(Dir.pwd, path)
|
|
59
|
-
end
|
|
60
|
-
"<#Dir \"#{displaypath}\" #{to_a.size - 2} elements>"
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def name
|
|
64
|
-
File.basename(path)
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
# Fixing windoze path problems
|
|
68
|
-
# requires amatch gem for better performance
|
|
69
|
-
def real_name
|
|
70
|
-
n, p, count = name, parent, []
|
|
71
|
-
return n if !p
|
|
72
|
-
pp, pc, sc = parent.path, parent.to_a[2..-1], to_a
|
|
73
|
-
if defined? Amatch
|
|
74
|
-
ms = pc.sizes.max
|
|
75
|
-
count = [:hamming_similar, :levenshtein_similar, :jaro_similar].sum {|m| pc.group_by {|_| _.upcase.ljust(ms).send(m, n)}.max[1]}.count.to_a
|
|
76
|
-
max = count.lasts.max
|
|
77
|
-
res = count.find {|c|
|
|
78
|
-
c[1] == max and File.directory?(df=File.join(pp, c[0])) and Dir.new(df).to_a == sc
|
|
79
|
-
}
|
|
80
|
-
return res[0] if res
|
|
81
|
-
end
|
|
82
|
-
(pc - count).find {|c|
|
|
83
|
-
File.directory?(df=File.join(pp, c)) and Dir.new(df).to_a == sc
|
|
84
|
-
}
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
class File
|
|
90
|
-
|
|
91
|
-
def inspect
|
|
92
|
-
"<#File \"#{path}\" #{closed? ? 'closed' : stat.size.bytes}>"
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def self.include?(name, str)
|
|
96
|
-
f = new name, 'r'
|
|
97
|
-
incl = f.include? str
|
|
98
|
-
f.close
|
|
99
|
-
incl
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
def include?(str)
|
|
103
|
-
while s = gets do return true if s.include? str end
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def parent
|
|
107
|
-
newpath = File.dirname(path)
|
|
108
|
-
Dir.new(newpath) if newpath != path
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
def name
|
|
112
|
-
File.basename(path)
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
def ext
|
|
116
|
-
name[/[^.]+$/]
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
def refresh
|
|
120
|
-
return if !File.file?(path)
|
|
121
|
-
close
|
|
122
|
-
File.new(path,'r')
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
def self.modify(file, bak=true)
|
|
126
|
-
orig_text = read file
|
|
127
|
-
text = yield orig_text
|
|
128
|
-
rename file, file+'.bak' if bak
|
|
129
|
-
RMTools.rw(file, text.is(String) ? text : orig_text)
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
def cp(df)
|
|
133
|
-
dir = File.dirname df
|
|
134
|
-
FileUtils.mkpath dir unless File.directory? dir
|
|
135
|
-
FileUtils.cp path, df
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
def mv(df)
|
|
139
|
-
dir = File.dirname df
|
|
140
|
-
FileUtils.mkpath dir unless File.directory? dir
|
|
141
|
-
rename df
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
# Fixing windoze path problems
|
|
145
|
-
# requires amatch gem for better performance
|
|
146
|
-
def real_name
|
|
147
|
-
n, p, count = name, parent, []
|
|
148
|
-
pp, pc, ss = parent.path, parent.to_a[2..-1], stat
|
|
149
|
-
ms = pc.sizes.max
|
|
150
|
-
n, ext = n.rsplit('.', 2)
|
|
151
|
-
if ext
|
|
152
|
-
re = /\.#{ext}$/i
|
|
153
|
-
pc.reject! {|f| !f[re]}
|
|
154
|
-
end
|
|
155
|
-
if defined? Amatch
|
|
156
|
-
count = [:hamming_similar, :levenshtein_similar, :jaro_similar].sum {|m| pc.group_by {|f| (ext ? f[0..-(ext.size+2)] : f).upcase.ljust(ms).send(m, n)}.max[1]}.count.to_a
|
|
157
|
-
max = count.lasts.max
|
|
158
|
-
res = count.find {|c|
|
|
159
|
-
c[1] == max and File.file?(df=File.join(pp, c[0])) and File.stat(df) == ss
|
|
160
|
-
}
|
|
161
|
-
return res[0] if res
|
|
162
|
-
end
|
|
163
|
-
(pc - count).find {|c|
|
|
164
|
-
File.file?(df=File.join(pp, c)) and File.stat(df) == ss
|
|
165
|
-
}
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
PathMemo = {} if !defined? PathMemo
|
|
169
|
-
def self.real_path path, memo=1
|
|
170
|
-
a = expand_path(path).split(/[\/\\]/)
|
|
171
|
-
a.each_index {|i|
|
|
172
|
-
if a[j=-(i+1)]['~']
|
|
173
|
-
n = i+2>a.size ? a[j] : join(a[0..-(i+2)], a[j])
|
|
174
|
-
a[j] = PathMemo[n] || real_name(n)
|
|
175
|
-
PathMemo[n] = a[j] if memo
|
|
176
|
-
else break
|
|
177
|
-
end
|
|
178
|
-
}
|
|
179
|
-
a*'/'
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
def self.real_name(df)
|
|
183
|
-
if file?(df)
|
|
184
|
-
new(df).real_name
|
|
185
|
-
elsif directory?(df)
|
|
186
|
-
Dir.new(df).real_name
|
|
187
|
-
end
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
class IO
|
|
193
|
-
|
|
194
|
-
def gets2
|
|
195
|
-
str = ''
|
|
196
|
-
str << (c = read 1) until c and "\r\n\b".include? c or eof?
|
|
197
|
-
str
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
module RMTools
|
|
203
|
-
|
|
204
|
-
def tick!
|
|
205
|
-
print %W{|\b /\b -\b \\\b +\b X\b}.rand
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
def executing? file
|
|
209
|
-
caller(0)[0] =~ /^#{file}:/
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
def rw(df, value=nil)
|
|
213
|
-
return false if value.nil?
|
|
214
|
-
df.gsub!('\\', '/')
|
|
215
|
-
path = File.dirname(df)
|
|
216
|
-
FileUtils.mkpath(path) if !File.directory?(path)
|
|
217
|
-
mode = RUBY_VERSION > '1.9' ? :wb : 'wb'
|
|
218
|
-
File.open(df, mode) {|f| f << value}
|
|
219
|
-
value.size
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
def write(df, value='', pos=0)
|
|
223
|
-
return false if value.nil?
|
|
224
|
-
df.gsub!('\\', '/')
|
|
225
|
-
path = File.dirname(df)
|
|
226
|
-
FileUtils.mkpath(path) if !File.directory?(path)
|
|
227
|
-
if pos == 0
|
|
228
|
-
mode = RUBY_VERSION > '1.9' ? :ab : 'ab'
|
|
229
|
-
File.open(df, mode) {|f| f << value}
|
|
230
|
-
else
|
|
231
|
-
if pos < 0
|
|
232
|
-
raise IndexError, "file #{df} does not exist, can't write from position #{pos}" if !File.file?(df)
|
|
233
|
-
raise IndexError, "file #{df} is shorter than #{(-pos).bytes}, can't write from position #{pos}" if (size = File.size(df)) < -pos
|
|
234
|
-
pos = size + pos
|
|
235
|
-
end
|
|
236
|
-
File.open(df, 'r+') {|f| f.pos = pos; f << value}
|
|
237
|
-
end
|
|
238
|
-
value.size
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
def read(df, mode='rb')
|
|
242
|
-
df.gsub!('\\', '/')
|
|
243
|
-
if !File.file?(df)
|
|
244
|
-
$log.debug "#{df} is missed!"
|
|
245
|
-
else
|
|
246
|
-
File.open(df, mode) {|f| f.read}
|
|
247
|
-
end
|
|
248
|
-
end
|
|
249
|
-
|
|
250
|
-
def read_lines(df, *lines)
|
|
251
|
-
return if !lines or lines.empty?
|
|
252
|
-
str = ""
|
|
253
|
-
last = lines.max
|
|
254
|
-
if !File.file?(df)
|
|
255
|
-
puts "#{df} is missed!"
|
|
256
|
-
else
|
|
257
|
-
File.open(df, 'r') {|f|
|
|
258
|
-
f.each {|line|
|
|
259
|
-
no = f.lineno
|
|
260
|
-
str << line if no.in lines
|
|
261
|
-
break if no == last
|
|
262
|
-
}}
|
|
263
|
-
str
|
|
264
|
-
end
|
|
265
|
-
end
|
|
266
|
-
|
|
267
|
-
def highlighted_line(file, line)
|
|
268
|
-
if defined? SCRIPT_LINES__
|
|
269
|
-
" >> #{Painter.green SCRIPT_LINES__[file][line.to_i - 1].chop}" if SCRIPT_LINES__[file]
|
|
270
|
-
else
|
|
271
|
-
file = Readline::TEMPLOG if file == '(irb)' and defined? Readline::TEMPLOG
|
|
272
|
-
" >> #{Painter.green read_lines(file, line.to_i).chop}" if File.file? file
|
|
273
|
-
end
|
|
274
|
-
end
|
|
275
|
-
|
|
276
|
-
def tail(file, bytes=1000)
|
|
277
|
-
if !File.file?(file)
|
|
278
|
-
puts "#{file} is missed!"
|
|
279
|
-
else
|
|
280
|
-
IO.read(file, bytes, File.size(file)-bytes)
|
|
281
|
-
end
|
|
282
|
-
end
|
|
283
|
-
|
|
284
|
-
def tail_n(file, qty=10)
|
|
285
|
-
if !File.file?(file)
|
|
286
|
-
return puts "#{file} is missed!"
|
|
287
|
-
end
|
|
288
|
-
size = File.size(file)
|
|
289
|
-
lines = []
|
|
290
|
-
strlen = 0
|
|
291
|
-
step = qty*100
|
|
292
|
-
while qty > 0 and (offset = size-strlen-step) >= 0 and (str = IO.read(file, step, offset)).b
|
|
293
|
-
i = str.index("\n") || str.size
|
|
294
|
-
strlen += step - i
|
|
295
|
-
new_lines = str[i+1..-1]/"\n"
|
|
296
|
-
qty -= new_lines.size
|
|
297
|
-
lines = new_lines.concat(lines)
|
|
298
|
-
end
|
|
299
|
-
lines[-qty..-1]
|
|
300
|
-
end
|
|
301
|
-
|
|
302
|
-
module_function :tick!, :executing?, :rw, :write, :read, :read_lines, :highlighted_line, :tail, :tail_n
|
|
303
|
-
end
|
data/lib/rmtools/js.rb
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
class Hash
|
|
3
|
-
|
|
4
|
-
def method_missing(met, *args)
|
|
5
|
-
str = met.id2name
|
|
6
|
-
if str[/=$/]
|
|
7
|
-
self[str[0..-2]] = args[0]
|
|
8
|
-
else
|
|
9
|
-
raise NoMethodError, "undefined method `#{str}' for #{self}:#{(self.class)}" if !args.empty?
|
|
10
|
-
a = self[str]
|
|
11
|
-
(a == default) ? self[met] : a
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
class String
|
|
18
|
-
if !method_defined? :plus
|
|
19
|
-
alias :plus :+ end
|
|
20
|
-
|
|
21
|
-
def +(str)
|
|
22
|
-
plus str.to_s
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
end
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
class LimitedString < String
|
|
3
|
-
attr_reader :len
|
|
4
|
-
__init__
|
|
5
|
-
|
|
6
|
-
def initialize str="", len=100
|
|
7
|
-
@len = len
|
|
8
|
-
super str
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def inspect
|
|
12
|
-
@len ||= 100
|
|
13
|
-
size > @len ? String.new(self[0...@len]+"…").inspect : super
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
end
|
|
17
|
-
|
data/lib/rmtools/logging.rb
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
module RMTools
|
|
3
|
-
|
|
4
|
-
class RMLogger
|
|
5
|
-
__init__
|
|
6
|
-
attr_accessor :mute_info, :mute_warn, :mute_log, :mute_debug
|
|
7
|
-
|
|
8
|
-
RE = /^\(?(.*?([^\/\\]+?))\)?:(\d+)(?::in `([^']+)')?$/
|
|
9
|
-
Modes = %w{debug log info warn}.to_syms
|
|
10
|
-
NOPRINT = 4
|
|
11
|
-
NOLOG = 2
|
|
12
|
-
INLINE = 1
|
|
13
|
-
|
|
14
|
-
def initialize format={}
|
|
15
|
-
@clr = Coloring.new
|
|
16
|
-
@highlight = {
|
|
17
|
-
:warn => @clr.red_bold("WARN"),
|
|
18
|
-
:log => @clr.cyan("INFO"),
|
|
19
|
-
:info => @clr.cyan_bold("INFO"),
|
|
20
|
-
:debug => @clr.gray_bold("DEBUG")
|
|
21
|
-
}
|
|
22
|
-
@file_formats = Hash.new(@default_format = {})
|
|
23
|
-
set_format format, :global
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def _set_format file, format
|
|
27
|
-
file.print = !format.q
|
|
28
|
-
file.out = format.out
|
|
29
|
-
|
|
30
|
-
file.path_format = '%'.in file.out if file.out
|
|
31
|
-
file.tf = (format.time || ["%H:%M:%S", "%03d"]).to_a
|
|
32
|
-
file.cf0 = format.caller || "#{@clr.gray('%f:%l')} #{@clr.red_bold(':%m')}"
|
|
33
|
-
file.cf = file.cf0.sub('%F'){'\1'}.sub('%f'){'\2'}.sub('%l'){'\3'}.sub('%m'){'\4'}
|
|
34
|
-
file.fmt = format.format || "%time %mode [%caller]: %text"
|
|
35
|
-
file._time, file._caller = '%time'.in(file.fmt), '%caller'.in(file.fmt)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def set_format format={}, global=nil
|
|
39
|
-
if global
|
|
40
|
-
_set_format @default_format, format
|
|
41
|
-
else
|
|
42
|
-
_set_format(file_format={}, format)
|
|
43
|
-
@file_formats[File.expand_path(caller[0].till ':')] = file_format
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def get_format file=nil
|
|
48
|
-
cfg = @file_formats[file && File.expand_path(file)]
|
|
49
|
-
modes = Modes.reject {|m| send :"mute_#{m}"}
|
|
50
|
-
%{<Logger #{cfg.fmt.sub('%time', "%time(#{cfg.tf*'.'})").sub('%caller', "%caller(#{cfg.cf0})")}#{' -> '+cfg.out if cfg.out} #{modes.b ? modes.inspect : 'muted'}>}
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def _print mode, text, opts, caler, bind, cfg
|
|
54
|
-
log_ = opts&NOLOG==0
|
|
55
|
-
print_ = opts&NOPRINT==0
|
|
56
|
-
str = cfg.fmt.dup
|
|
57
|
-
str.sub! "%mode", @highlight[mode]
|
|
58
|
-
if bind
|
|
59
|
-
text = text.reports bind
|
|
60
|
-
elsif !text.is(String)
|
|
61
|
-
text = text.inspect
|
|
62
|
-
end
|
|
63
|
-
str.sub! "%text", text
|
|
64
|
-
str << "\n" if opts&INLINE==0
|
|
65
|
-
out = cfg.out
|
|
66
|
-
if cfg._time or cfg.path_format
|
|
67
|
-
now = Time.now
|
|
68
|
-
if cfg._time
|
|
69
|
-
time = now.strftime cfg.tf[0]
|
|
70
|
-
time << ".#{cfg.tf[1]%[now.usec/1000]}" if cfg.tf[1]
|
|
71
|
-
str.sub! "%time", time
|
|
72
|
-
end
|
|
73
|
-
out = now.strftime cfg.out if cfg.path_format
|
|
74
|
-
end
|
|
75
|
-
str.sub! "%caller", caler.sub(RE, cfg.cf) if caler
|
|
76
|
-
log_str = @clr.clean str
|
|
77
|
-
RMTools.write out, log_str if log_
|
|
78
|
-
Kernel.print str if print_
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def check_binding a
|
|
82
|
-
a[0].is(Binding) ? [a[0], a[1] || 0] : [nil, a[0] || 0]
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def get_config!
|
|
86
|
-
@file_formats.empty? ? @default_format : @file_formats[File.expand_path(caller[1].till ':')]
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
# controllers:
|
|
90
|
-
# - $panic: print debug messages
|
|
91
|
-
# - $verbose: print log messages
|
|
92
|
-
# - $quiet: print only warn messages regardless of other globals
|
|
93
|
-
# - @mute_warn, @mute_info, @mute_log: do not print
|
|
94
|
-
# this messages regardless of any globals
|
|
95
|
-
# - @out_all: write to file any messages
|
|
96
|
-
|
|
97
|
-
def warn text=nil, *a
|
|
98
|
-
cfg = get_config!
|
|
99
|
-
if (cfg.out or cfg.print) && !@mute_warn
|
|
100
|
-
bind, opts = check_binding a
|
|
101
|
-
opts |= NOLOG if !cfg.out
|
|
102
|
-
opts |= NOPRINT if !cfg.print
|
|
103
|
-
text ||= yield if block_given?
|
|
104
|
-
_print(:warn, text, opts, cfg._caller && caller[0], bind, cfg)
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
def log text=nil, *a
|
|
109
|
-
cfg = get_config!
|
|
110
|
-
if (cfg.out or cfg.print && !$quiet && $verbose) && !@mute_log
|
|
111
|
-
bind, opts = check_binding a
|
|
112
|
-
opts |= NOLOG if !cfg.out
|
|
113
|
-
opts |= NOPRINT if !(cfg.print && !$quiet && $verbose)
|
|
114
|
-
text ||= yield if block_given?
|
|
115
|
-
_print(:log, text, opts, cfg._caller && caller[0], bind, cfg)
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
def info text=nil, *a
|
|
120
|
-
cfg = get_config!
|
|
121
|
-
if (cfg.print && !$quiet or cfg.out && cfg.out_all) && !@mute_info
|
|
122
|
-
bind, opts = check_binding a
|
|
123
|
-
opts |= NOLOG if !(cfg.out && cfg.out_all)
|
|
124
|
-
opts |= NOPRINT if !(cfg.print && !$quiet)
|
|
125
|
-
text ||= yield if block_given?
|
|
126
|
-
_print(:info, text, opts, cfg._caller && caller[0], bind, cfg)
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
def debug text=nil, *a
|
|
131
|
-
cfg = get_config!
|
|
132
|
-
if (cfg.print && $panic && !$quiet or cfg.out && cfg.out_all) && !@mute_debug
|
|
133
|
-
bind, opts = check_binding a
|
|
134
|
-
opts |= NOLOG if !(cfg.out && cfg.out_all)
|
|
135
|
-
opts |= NOPRINT if !(cfg.print && $panic && !$quiet)
|
|
136
|
-
text ||= yield if block_given?
|
|
137
|
-
_print(:debug, text, opts, cfg._caller && caller[0], bind, cfg)
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
alias << info
|
|
142
|
-
alias < warn
|
|
143
|
-
|
|
144
|
-
Modes.each {|m| define_method("#{m}=") {|b| send :"mute_#{m}=", !b}}
|
|
145
|
-
|
|
146
|
-
def outall=(x) @default_format.out_all = x end
|
|
147
|
-
def print=(x) @default_format.print = x end
|
|
148
|
-
def out=(x) @default_format.out = x end
|
|
149
|
-
|
|
150
|
-
def out_all() @default_format.out_all end
|
|
151
|
-
def print() @default_format.print end
|
|
152
|
-
def out() @default_format.out end
|
|
153
|
-
|
|
154
|
-
def inspect() get_format end
|
|
155
|
-
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
end
|
data/lib/rmtools/proc.rb
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
class Proc
|
|
3
|
-
include RMTools
|
|
4
|
-
NULL = lambda {} unless defined? Proc::NULL
|
|
5
|
-
attr_accessor :string
|
|
6
|
-
|
|
7
|
-
def inspect
|
|
8
|
-
"#{str=to_s}: #{@string ? Painter.green(@string) : "\n"+highlighted_line(*str.match(/([^@]+):(\d+)>$/)[1..2])}"
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def self.when condition
|
|
12
|
-
if condition.is String
|
|
13
|
-
sleep 0.001 until eval condition
|
|
14
|
-
else
|
|
15
|
-
sleep 0.001 until condition.call
|
|
16
|
-
end
|
|
17
|
-
yield
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def self.eval string, binding=nil
|
|
21
|
-
(proc = (binding || Kernel).eval "lambda {#{string}}").string = string
|
|
22
|
-
proc
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
end
|
data/lib/rmtools/range.rb
DELETED
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
class Range
|
|
3
|
-
|
|
4
|
-
def &(range)
|
|
5
|
-
return range&self if range.is XRange
|
|
6
|
-
beg = [self.begin, range.begin].max
|
|
7
|
-
end_ = [self.include_end.end, range.include_end.end].min
|
|
8
|
-
beg > end_ ? nil : beg..end_
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def |(range)
|
|
12
|
-
return range|self if range.is XRange
|
|
13
|
-
range = range.include_end
|
|
14
|
-
self_ = self.include_end
|
|
15
|
-
return XRange.new self, range if !x?(range)
|
|
16
|
-
[self.begin, range.begin].min..[self_.end, range.end].max
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def x?(range)
|
|
20
|
-
range_end = range.include_end.end
|
|
21
|
-
self_end = self.include_end.end
|
|
22
|
-
if self_end < range_end
|
|
23
|
-
self_end >= range.begin - (self_end.kinda Integer and range.begin.kinda Integer).to_i
|
|
24
|
-
else
|
|
25
|
-
range_end >= self.begin - (self.begin.kinda Integer and range_end.kinda Integer).to_i
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def <=>(range) (self.begin <=> range.begin).b || self.include_end.end <=> range.include_end.end end
|
|
30
|
-
|
|
31
|
-
def include_end() exclude_end? ? self.begin..(self.end - 1) : self end
|
|
32
|
-
|
|
33
|
-
def center() (first + last + (!exclude_end?).to_i)/2 end
|
|
34
|
-
|
|
35
|
-
def part(i, j) first+(i-1)*size/j...first+i*size/j unless i < 1 or j < 1 or j < i end
|
|
36
|
-
|
|
37
|
-
def size() last - first + (!exclude_end?).to_i end
|
|
38
|
-
|
|
39
|
-
def /(i) first...size/i end
|
|
40
|
-
|
|
41
|
-
def from(ary) ary[self] end
|
|
42
|
-
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
class XRange
|
|
46
|
-
attr_accessor :ranges
|
|
47
|
-
__init__
|
|
48
|
-
|
|
49
|
-
def initialize *args
|
|
50
|
-
if (str = args[0]).is String
|
|
51
|
-
str.scan(/([&|])?((-?\d+)\.\.(\.)?(-?\d+))/).each {|s|
|
|
52
|
-
s[2], s[4] = s[2].to_i, s[4].to_i
|
|
53
|
-
r = s[3] ? s[2]...s[4] : s[2]..s[4]
|
|
54
|
-
@ranges = case s[0]
|
|
55
|
-
when '&', '^'; intersect r
|
|
56
|
-
when '|', 'v'; union r
|
|
57
|
-
else [r]
|
|
58
|
-
end
|
|
59
|
-
}
|
|
60
|
-
@ranges.sort!
|
|
61
|
-
else
|
|
62
|
-
0.upto(args.sort!.size-2) {|i| args[i,2] = [nil, args[i]|args[i+1]] if args[i].x? args[i+1]}
|
|
63
|
-
@ranges = args.compact
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def &(range)
|
|
68
|
-
if range.is Range
|
|
69
|
-
XRange.new *intersect(range)
|
|
70
|
-
else
|
|
71
|
-
@ranges.map {|r| range & r}.foldl(:|)
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def |(range)
|
|
76
|
-
if range.is Range
|
|
77
|
-
XRange.new *union(range)
|
|
78
|
-
else
|
|
79
|
-
@ranges.each {|r| range |= r}
|
|
80
|
-
range
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def intersect(range)
|
|
85
|
-
@ranges.map {|r| r&range}.compact
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def union(range)
|
|
89
|
-
changed = (rs = @ranges.map {|r| (r.x?range) ? r|range : r}) != @ranges
|
|
90
|
-
changed ? rs : rs << range
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
include Enumerable
|
|
94
|
-
|
|
95
|
-
def each(&b) @ranges.each {|r| r.each &b} end
|
|
96
|
-
|
|
97
|
-
def from(ary) @ranges.foldl(:+) {|r| ary[r]} end
|
|
98
|
-
|
|
99
|
-
end
|
|
100
|
-
|