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/string.rb
DELETED
@@ -1,276 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
class String
|
3
|
-
if !method_defined? :/
|
4
|
-
alias :/ :split
|
5
|
-
end
|
6
|
-
|
7
|
-
def inline
|
8
|
-
count("\n") == 0
|
9
|
-
end
|
10
|
-
|
11
|
-
def <<(str)
|
12
|
-
concat str.to_s
|
13
|
-
end
|
14
|
-
|
15
|
-
# %{blah blah
|
16
|
-
# wall of text in the interpreter
|
17
|
-
# oh shi~ may be we should
|
18
|
-
# save this into variable
|
19
|
-
# } >> (str='')
|
20
|
-
# ok, easily saved to variable
|
21
|
-
def >>(str)
|
22
|
-
str.replace(self + str)
|
23
|
-
end
|
24
|
-
|
25
|
-
def find_with_offsets text, offset
|
26
|
-
index = index(text)
|
27
|
-
start = [0, index - offset].max
|
28
|
-
_end = index + text.size
|
29
|
-
[self[start...index], text, self[_end, offset]]
|
30
|
-
end
|
31
|
-
|
32
|
-
def div(dvsr, includesplitter=1, reportheaders=nil)
|
33
|
-
return lendiv dvsr if dvsr.kinda Fixnum
|
34
|
-
a = split(dvsr)
|
35
|
-
return a if !includesplitter and !reportheaders
|
36
|
-
skan = nil
|
37
|
-
case dvsr
|
38
|
-
when String
|
39
|
-
a = (1...a.size).map {|i| dvsr+a[i]}.unshift a[0] if includesplitter
|
40
|
-
when Regexp
|
41
|
-
skan = scan(dvsr).unshift ''
|
42
|
-
a = (0...a.size).map {|i| skan[i].to_s+a[i]} if includesplitter
|
43
|
-
end
|
44
|
-
(reportheaders and skan) ? [a, skan] : a
|
45
|
-
end
|
46
|
-
|
47
|
-
def rdiv(dvsr, includesplitter=1, reportheaders=nil)
|
48
|
-
return lendiv dvsr if dvsr.kinda Fixnum
|
49
|
-
a = split(dvsr)
|
50
|
-
return a if !includesplitter and !reportheaders
|
51
|
-
skan = nil
|
52
|
-
case dvsr
|
53
|
-
when String
|
54
|
-
a = (0...a.size).map {|i| a[i]+dvsr} if includesplitter
|
55
|
-
when Regexp
|
56
|
-
skan = scan(dvsr)
|
57
|
-
a = (0...a.size).map {|i| a[i]+skan[i]} if includesplitter
|
58
|
-
end
|
59
|
-
(reportheaders and skan) ? [a, skan] : a
|
60
|
-
end
|
61
|
-
|
62
|
-
def lendiv(len)
|
63
|
-
return [self] if len <= 0
|
64
|
-
str = dup
|
65
|
-
arr = []
|
66
|
-
while str.b
|
67
|
-
arr << str.slice!(0, len)
|
68
|
-
end
|
69
|
-
arr
|
70
|
-
end
|
71
|
-
|
72
|
-
def split_to_lines(maxlen, charsize=nil, no_blanks=false, strips=true)
|
73
|
-
raise Exception, "Can't break text with maxlen = #{maxlen}" if maxlen < 1
|
74
|
-
a = split("\n")
|
75
|
-
charsize ||= a[0].cyr? ? 2 : 1
|
76
|
-
a.map {|string| string.strip.split_to_blocks(maxlen*charsize, nil, false, no_blanks, strips)}.flatten*"\n"
|
77
|
-
end
|
78
|
-
|
79
|
-
def split_to_blocks(maxlen, terminator=nil, strict_overhead=true, no_blanks=true, strips=false)
|
80
|
-
raise Exception, "Can't break text with maxlen = #{maxlen}" if maxlen < 1
|
81
|
-
blocks = []
|
82
|
-
term_re = /[^#{terminator}]+\z/ if terminator and terminator != :syntax
|
83
|
-
return [self] if size <= maxlen
|
84
|
-
words, buf = split(strips ? ' ' : / /), nil
|
85
|
-
while words.b or buf.b
|
86
|
-
if terminator and blocks.b and (buf_add = if terminator == :syntax
|
87
|
-
blocks[-1].split_by_syntax maxlen, buf.size
|
88
|
-
else blocks[-1][term_re]
|
89
|
-
end.b)
|
90
|
-
if buf_add == blocks[-1]
|
91
|
-
blocks.pop
|
92
|
-
else blocks[-1] = blocks[-1][0...-buf_add.size]
|
93
|
-
end
|
94
|
-
buf = buf_add + buf
|
95
|
-
end
|
96
|
-
blocks << ''
|
97
|
-
if buf
|
98
|
-
blocks[-1] << buf
|
99
|
-
buf = nil
|
100
|
-
end
|
101
|
-
while words.b
|
102
|
-
buf = words.shift + ' '
|
103
|
-
break if blocks[-1].size + buf.size - 1 > maxlen
|
104
|
-
blocks[-1] << buf
|
105
|
-
buf = nil
|
106
|
-
end
|
107
|
-
end
|
108
|
-
blocks.reject! &:empty? if no_blanks
|
109
|
-
blocks.strips! if strips
|
110
|
-
blocks.each {|b| raise Exception, "can't split string by #{terminator} to blocks with max length = #{maxlen}" if b.size > maxlen} if strict_overhead
|
111
|
-
blocks
|
112
|
-
end
|
113
|
-
|
114
|
-
RMTools::URL_RE = %r{^((?:([^:]+)://)#{ # ( protocol
|
115
|
-
}([^/:]*(?::(\d+))?))?#{ # root[:port] )
|
116
|
-
}((/[^?#]*?(?:\.(\w+))?)#{ # ( path[.fileext]
|
117
|
-
}(?:\?(.*?))?)?#{ # [?query params] )
|
118
|
-
}(?:#(.+))?#{ # [ #anchor ]
|
119
|
-
}$} unless defined? RMTools::URL_RE
|
120
|
-
def parseuri
|
121
|
-
m = match RMTools::URL_RE
|
122
|
-
!m || m[0].empty? ?
|
123
|
-
{ 'href' => self } :
|
124
|
-
{ 'href' => self,
|
125
|
-
'root' => m[1],
|
126
|
-
'protocol' => m[2],
|
127
|
-
'host' => m[3],
|
128
|
-
'port' => m[4] ? m[4].to_i : 80,
|
129
|
-
'fullpath' => m[5] || '/',
|
130
|
-
'pathname' => m[5] || '/',
|
131
|
-
'path' => m[6] || '',
|
132
|
-
'ext' => m[7],
|
133
|
-
'query' => m[8] && m[8].to_hash(false),
|
134
|
-
'anchor' => m[9] }
|
135
|
-
end
|
136
|
-
|
137
|
-
def utf(from_encoding)
|
138
|
-
Iconv.new('UTF-8', from_encoding).iconv(self)
|
139
|
-
end
|
140
|
-
|
141
|
-
def utf!(from_encoding)
|
142
|
-
replace utf from_encoding
|
143
|
-
end
|
144
|
-
|
145
|
-
def bytes
|
146
|
-
arr = []
|
147
|
-
each_byte {|b| arr << "\\x#{b.hex}"}
|
148
|
-
arr
|
149
|
-
end
|
150
|
-
|
151
|
-
def to_re(esc=false)
|
152
|
-
Regexp.new(esc ? Regexp.escape(self) : self)
|
153
|
-
end
|
154
|
-
|
155
|
-
def lchomp(match)
|
156
|
-
if index(match) == 0
|
157
|
-
self[match.size..-1]
|
158
|
-
else
|
159
|
-
self.dup
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
def lchomp!(match)
|
164
|
-
if index(match) == 0
|
165
|
-
self[0...match.size] = ''
|
166
|
-
self
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
def rsplit(splitter=$/, qty=0)
|
171
|
-
reverse.split(splitter, qty).reverse.reverses
|
172
|
-
end
|
173
|
-
|
174
|
-
def until(splitter=$/)
|
175
|
-
split(splitter, 2)[0]
|
176
|
-
end
|
177
|
-
alias :till :until
|
178
|
-
|
179
|
-
def after(splitter=$/)
|
180
|
-
split(splitter, 2)[1]
|
181
|
-
end
|
182
|
-
|
183
|
-
def bump_version(splt='.')
|
184
|
-
re = /(?:(\d*)#{Regexp.escape splt})?/
|
185
|
-
s = File.split self
|
186
|
-
s[0] == '.' ?
|
187
|
-
s[1].reverse.sub(re) {$1?"#{$1.to_i+1}#{splt}":"1#{splt}"}.reverse :
|
188
|
-
File.join(s[0], s[1].reverse.sub(re) {$1?"#{$1.to_i+1}#{splt}":"1#{splt}"}.reverse)
|
189
|
-
end
|
190
|
-
alias :next_version :bump_version
|
191
|
-
|
192
|
-
def bump!(splt='.')
|
193
|
-
replace bump_version splt
|
194
|
-
end
|
195
|
-
|
196
|
-
if RUBY_VERSION < "1.9"
|
197
|
-
def ord; self[0] end
|
198
|
-
else
|
199
|
-
# BUGFIX?
|
200
|
-
alias :sub19 :sub
|
201
|
-
alias :sub19! :sub!
|
202
|
-
alias :gsub19 :gsub
|
203
|
-
alias :gsub19! :gsub!
|
204
|
-
|
205
|
-
def sub! a,b=nil,&c
|
206
|
-
if b
|
207
|
-
if b=~/\\\d/
|
208
|
-
b = b.sub19!(/\\\d/) {|m| "\#{$#{m[1,1]}}"}
|
209
|
-
sub19!(a) {eval "\"#{b}\""}
|
210
|
-
else sub19!(a) {b} end
|
211
|
-
else sub19! a,&c end
|
212
|
-
end
|
213
|
-
|
214
|
-
def sub a,b=nil,&c
|
215
|
-
if b
|
216
|
-
if b=~/\\\d/
|
217
|
-
b = b.sub19(/\\\d/) {|m| "\#{$#{m[1,1]}}"}
|
218
|
-
sub19(a) {eval "\"#{b}\""}
|
219
|
-
else sub19(a) {b} end
|
220
|
-
else sub19 a,&c end
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
def to_limited len=100
|
225
|
-
LimitedString.new self, len
|
226
|
-
end
|
227
|
-
|
228
|
-
protected
|
229
|
-
def split_by_syntax(maxlen, buflen=0)
|
230
|
-
len, add = maxlen - buflen, nil
|
231
|
-
[/[^.?!]+\z/, /[^;]+\z/, /[^\n]+/, /\S+\z/, /[^。]+z/, /[^、]+z/].each {|t|
|
232
|
-
if !(add = self[t]) or add.size <= len
|
233
|
-
return add
|
234
|
-
end
|
235
|
-
}
|
236
|
-
add
|
237
|
-
end
|
238
|
-
|
239
|
-
end
|
240
|
-
|
241
|
-
class Indent < String
|
242
|
-
attr_reader :indent
|
243
|
-
|
244
|
-
def initialize(indent=' ')
|
245
|
-
@indent = indent
|
246
|
-
super ''
|
247
|
-
end
|
248
|
-
|
249
|
-
def +@
|
250
|
-
self << @indent
|
251
|
-
end
|
252
|
-
|
253
|
-
def -@
|
254
|
-
self.chomp! @indent
|
255
|
-
end
|
256
|
-
|
257
|
-
def i(&block)
|
258
|
-
+self
|
259
|
-
res = yield
|
260
|
-
-self
|
261
|
-
res
|
262
|
-
end
|
263
|
-
|
264
|
-
end
|
265
|
-
|
266
|
-
class Regexp
|
267
|
-
|
268
|
-
def | re
|
269
|
-
Regexp.new(source+'|'+re.source, options | re.options)
|
270
|
-
end
|
271
|
-
|
272
|
-
def in string
|
273
|
-
string =~ self
|
274
|
-
end
|
275
|
-
|
276
|
-
end
|
data/lib/rmtools/traceback.rb
DELETED
@@ -1,106 +0,0 @@
|
|
1
|
-
module RMTools
|
2
|
-
|
3
|
-
def format_trace a
|
4
|
-
bt, calls, i = [], [], 0
|
5
|
-
# $log.info 'a.size', binding
|
6
|
-
m = a[0].match(/^(.+):(\d+)(?::in `([^']+)')?$/)
|
7
|
-
while i < a.size
|
8
|
-
# $log.info i
|
9
|
-
m2 = a[i+1] && a[i+1].match(/^(.+):(\d+)(?::in `([^']+)')?$/)
|
10
|
-
# $log.info 'm', binding
|
11
|
-
# $log.info 'm2', binding
|
12
|
-
# $log.info 'm[3] m[1..2]==m2[1..2]', binding if m and m2
|
13
|
-
# $log.info 'm[1] m[2]', binding if m
|
14
|
-
# $log.info highlighted_line(*m[1..2]) if m
|
15
|
-
if m and m[3] and m2 and m[1..2] == m2[1..2]
|
16
|
-
calls.unshift " <- `#{m[3]}'"
|
17
|
-
elsif m and m[1] !~ /\.gemspec$/ and line = highlighted_line(*m[1..2])
|
18
|
-
bt << "#{a[i]}#{calls.join}\n#{line}"
|
19
|
-
calls = []
|
20
|
-
else bt << a[i]
|
21
|
-
end
|
22
|
-
i += 1
|
23
|
-
m = m2
|
24
|
-
end
|
25
|
-
# $log << Painter.r("FORMAT DONE! #{bt.size} lines formatted")
|
26
|
-
bt
|
27
|
-
end
|
28
|
-
|
29
|
-
def highlighted_line_html file, line
|
30
|
-
if File.file?(file)
|
31
|
-
" >> <a style=\"color:#0A0; text-decoration: none;\"#{
|
32
|
-
" href=\"http://#{
|
33
|
-
defined?(DEBUG_SERVER) ? DEBUG_SERVER : 'localhost:8888'
|
34
|
-
}/code/#{CGI.escape CGI.escape(file).gsub('.', '%2E')}/#{line}\""
|
35
|
-
}>#{read_lines(file, line.to_i).chop}</a>"
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def format_trace_html a
|
40
|
-
bt, calls, i = [], [], 0
|
41
|
-
m = a[0].match(/^(.+):(\d+)(?::in `([^']+)')?$/)
|
42
|
-
while i < a.size
|
43
|
-
m2 = a[i+1] && a[i+1].match(/^(.+):(\d+)(?::in `([^']+)')?$/)
|
44
|
-
if m and m[3] and m2 and m[1..2] == m2[1..2]
|
45
|
-
calls.unshift " <- `#{m[3]}'"
|
46
|
-
elsif m and m[1] !~ /\.gemspec$/ and line = highlighted_line_html(*m[1..2])
|
47
|
-
bt << "#{a[i]}#{calls.join}\n#{line}"
|
48
|
-
calls = []
|
49
|
-
else bt << a[i]
|
50
|
-
end
|
51
|
-
i += 1
|
52
|
-
m = m2
|
53
|
-
end
|
54
|
-
bt
|
55
|
-
end
|
56
|
-
|
57
|
-
module_function :format_trace, :format_trace_html, :highlighted_line_html
|
58
|
-
end
|
59
|
-
|
60
|
-
# 1.9 may hung up processing IO while generating traceback
|
61
|
-
if RUBY_VERSION < '1.9'
|
62
|
-
|
63
|
-
class Class
|
64
|
-
|
65
|
-
def trace_format method
|
66
|
-
if new.kinda Exception
|
67
|
-
if method; class_eval(%{
|
68
|
-
def set_backtrace src
|
69
|
-
src = #{method} src
|
70
|
-
set_bt src
|
71
|
-
end
|
72
|
-
})
|
73
|
-
else class_eval(%{
|
74
|
-
def set_backtrace src
|
75
|
-
set_bt src
|
76
|
-
end
|
77
|
-
})
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
class Exception
|
85
|
-
alias :set_bt :set_backtrace
|
86
|
-
|
87
|
-
# If you set (e.g. in irbrc file) IRB logging and Readline::TEMPLOG:
|
88
|
-
# module Readline
|
89
|
-
# TEMPLOG = "path/to/logs/#{Time.now.to_i}.rb"
|
90
|
-
# alias :orig_readline :readline
|
91
|
-
# def readline(*args)
|
92
|
-
# ln = orig_readline(*args)
|
93
|
-
# RMTools::write TEMPLOG, "#{ln}\n"
|
94
|
-
# return ln
|
95
|
-
# end
|
96
|
-
# end
|
97
|
-
# it will be possible to get the lines entered in IRB
|
98
|
-
# else it reads only ordinal require'd files
|
99
|
-
|
100
|
-
trace_format :format_trace
|
101
|
-
|
102
|
-
end
|
103
|
-
|
104
|
-
SystemStackError.trace_format false
|
105
|
-
|
106
|
-
end
|