rmtools 1.0.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 +4 -0
- data/License.txt +15 -0
- data/Manifest.txt +37 -0
- data/README.txt +10 -0
- data/Rakefile +39 -0
- data/ext/extconf.rb +12 -0
- data/ext/rmtools.cpp +529 -0
- data/ext/rmtools.h +161 -0
- data/lib/rmtools.rb +53 -0
- data/lib/rmtools/arguments.rb +24 -0
- data/lib/rmtools/array.rb +189 -0
- data/lib/rmtools/binding.rb +23 -0
- data/lib/rmtools/boolean.rb +57 -0
- data/lib/rmtools/coloring.rb +82 -0
- data/lib/rmtools/cyr-time.rb +49 -0
- data/lib/rmtools/cyrilic.rb +124 -0
- data/lib/rmtools/dumps.rb +192 -0
- data/lib/rmtools/enum.rb +90 -0
- data/lib/rmtools/hash.rb +40 -0
- data/lib/rmtools/io.rb +303 -0
- data/lib/rmtools/js.rb +25 -0
- data/lib/rmtools/limited_string.rb +17 -0
- data/lib/rmtools/logging.rb +158 -0
- data/lib/rmtools/module.rb +113 -0
- data/lib/rmtools/numeric.rb +82 -0
- data/lib/rmtools/object.rb +74 -0
- data/lib/rmtools/printing.rb +41 -0
- data/lib/rmtools/proc.rb +25 -0
- data/lib/rmtools/random.rb +195 -0
- data/lib/rmtools/range.rb +100 -0
- data/lib/rmtools/setup.rb +21 -0
- data/lib/rmtools/string.rb +276 -0
- data/lib/rmtools/string_to_proc.rb +113 -0
- data/lib/rmtools/stringscanner.rb +58 -0
- data/lib/rmtools/time.rb +32 -0
- data/lib/rmtools/traceback.rb +106 -0
- data/lib/rmtools/tree.rb +71 -0
- metadata +191 -0
@@ -0,0 +1,113 @@
|
|
1
|
+
# String#to_proc
|
2
|
+
#
|
3
|
+
# See http://weblog.raganwald.com/2007/10/stringtoproc.html ( Subscribe in a reader)
|
4
|
+
#
|
5
|
+
# Ported from the String Lambdas in Oliver Steele's Functional Javascript
|
6
|
+
# http://osteele.com/sources/javascript/functional/
|
7
|
+
#
|
8
|
+
# This work is licensed under the MIT License:
|
9
|
+
#
|
10
|
+
# (c) 2007 Reginald Braithwaite
|
11
|
+
# Portions Copyright (c) 2006 Oliver Steele
|
12
|
+
#
|
13
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
14
|
+
# a copy of this software and associated documentation files (the
|
15
|
+
# "Software"), to deal in the Software without restriction, including
|
16
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
17
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
18
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
19
|
+
# the following conditions:
|
20
|
+
#
|
21
|
+
# The above copyright notice and this permission notice shall be
|
22
|
+
# included in all copies or substantial portions of the Software.
|
23
|
+
#
|
24
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
25
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
26
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
27
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
28
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
29
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
30
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
31
|
+
|
32
|
+
|
33
|
+
class String
|
34
|
+
unless ''.respond_to?(:to_proc)
|
35
|
+
=begin original definition:
|
36
|
+
def to_proc &block
|
37
|
+
params = []
|
38
|
+
expr = self
|
39
|
+
sections = expr.split(/\s*->\s*/m)
|
40
|
+
if sections.length > 1 then
|
41
|
+
eval sections.reverse!.inject { |e, p| "(Proc.new { |#{p.split(/\s/).join(', ')}| #{e} })" }, block && block.binding
|
42
|
+
elsif expr.match(/\b_\b/)
|
43
|
+
eval "Proc.new { |_| #{expr} }", block && block.binding
|
44
|
+
else
|
45
|
+
leftSection = expr.match(/^\s*(?:[+*\/%&|\^\.=<>\[]|!=)/m)
|
46
|
+
rightSection = expr.match(/[+\-*\/%&|\^\.=<>!]\s*$/m)
|
47
|
+
if leftSection || rightSection then
|
48
|
+
if (leftSection) then
|
49
|
+
params.push('$left')
|
50
|
+
expr = '$left' + expr
|
51
|
+
end
|
52
|
+
if (rightSection) then
|
53
|
+
params.push('$right')
|
54
|
+
expr = expr + '$right'
|
55
|
+
end
|
56
|
+
else
|
57
|
+
self.gsub(
|
58
|
+
/(?:\b[A-Z]|\.[a-zA-Z_$])[a-zA-Z_$\d]*|[a-zA-Z_$][a-zA-Z_$\d]*:|self|arguments|'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"/, ''
|
59
|
+
).scan(
|
60
|
+
/([a-z_$][a-z_$\d]*)/i
|
61
|
+
) do |v|
|
62
|
+
params.push(v) unless params.include?(v)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
eval "Proc.new { |#{params.join(', ')}| #{expr} }", block && block.binding
|
66
|
+
end
|
67
|
+
end
|
68
|
+
=end
|
69
|
+
|
70
|
+
RMTools::String_to_proc_cache = {}
|
71
|
+
def to_proc &block
|
72
|
+
# improving performance
|
73
|
+
if !block and proc = RMTools::String_to_proc_cache[self]
|
74
|
+
return proc
|
75
|
+
end
|
76
|
+
params = []
|
77
|
+
expr = self
|
78
|
+
sections = expr.split(/\s*->\s*/m)
|
79
|
+
proc =
|
80
|
+
if sections.length > 1
|
81
|
+
str = sections.reverse!.inject { |e, p| "(Proc.new { |#{p.split(/\s/).join(', ')}| #{e} })" }
|
82
|
+
(proc = eval str, block && block.binding).string = str
|
83
|
+
proc
|
84
|
+
elsif expr.match(/\b_\b/)
|
85
|
+
Proc.eval "|_| #{expr}", block && block.binding
|
86
|
+
else
|
87
|
+
leftSection = expr.match(/^\s*(?:[+*\/%&|\^\.=<>\[]|!=)/m)
|
88
|
+
rightSection = expr.match(/[+\-*\/%&|\^\.=<>!]\s*$/m)
|
89
|
+
if leftSection || rightSection
|
90
|
+
if leftSection
|
91
|
+
params.push('__left')
|
92
|
+
expr = '__left' + expr
|
93
|
+
end
|
94
|
+
if rightSection
|
95
|
+
params.push('__right')
|
96
|
+
expr = expr + '__right'
|
97
|
+
end
|
98
|
+
else
|
99
|
+
params = gsub(/(?:\b[A-Z]|\.[a-zA-Z_$])[a-zA-Z_$\d]*|[a-zA-Z_$][a-zA-Z_$\d]*:|self|arguments|'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"/, ''
|
100
|
+
).scan(
|
101
|
+
/([a-z_$][a-z_$\d]*)/i
|
102
|
+
).uniq
|
103
|
+
end
|
104
|
+
Proc.eval "|#{params.join(', ')}| #{expr}", block && block.binding
|
105
|
+
end
|
106
|
+
RMTools::String_to_proc_cache[self] = proc if !block
|
107
|
+
proc
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
class StringScanner
|
4
|
+
attr_reader :last
|
5
|
+
|
6
|
+
def each(re, cbs=nil, &cb)
|
7
|
+
@last = 0
|
8
|
+
res = scan_until re
|
9
|
+
if cbs
|
10
|
+
if cbs[0].kinda Integer
|
11
|
+
while res
|
12
|
+
if cb = cbs[matched.ord]
|
13
|
+
cb[self]
|
14
|
+
@last = pos
|
15
|
+
res = !eos? && scan_until(re)
|
16
|
+
else break
|
17
|
+
end
|
18
|
+
end
|
19
|
+
else
|
20
|
+
while res
|
21
|
+
if cb = cbs.find {|pattern, proc| pattern.in matched}
|
22
|
+
# patterns must be as explicit as possible
|
23
|
+
cb[1][self]
|
24
|
+
@last = pos
|
25
|
+
res = !eos? && scan_until(re)
|
26
|
+
else break
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
else
|
31
|
+
while res
|
32
|
+
cb[self]
|
33
|
+
@last = pos
|
34
|
+
res = !eos? && scan_until(re)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
if (cb = cbs[nil]) and !eos?
|
38
|
+
cb[tail]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def head
|
43
|
+
string[@last...pos-matched.size]
|
44
|
+
end
|
45
|
+
|
46
|
+
def tail
|
47
|
+
string[pos..-1]
|
48
|
+
end
|
49
|
+
|
50
|
+
def hl_next(re)
|
51
|
+
(res = scan_until re) && RMTools.hl(string[pos-1000..pos+1000], res)
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.each string, *args, &b
|
55
|
+
new string, *args, &b
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
data/lib/rmtools/time.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module RMTools
|
3
|
+
|
4
|
+
def timer(ts=1, output=true)
|
5
|
+
timez = ts - 1
|
6
|
+
panic, verbose = $panic, $verbose
|
7
|
+
$panic = $verbose = false
|
8
|
+
t1 = Time.now
|
9
|
+
timez.times {yield}
|
10
|
+
res = yield
|
11
|
+
t2 = (Time.now.to_f*1000).round
|
12
|
+
t1 = (t1.to_f*1000).round
|
13
|
+
$panic, $verbose = panic, verbose
|
14
|
+
res = res.inspect
|
15
|
+
puts "#{output ? "res: #{res.size > 1000 ? res[0...1000]+"…" : res}\n" : "size of res string: #{res.to_s.size}, "}one: #{(t2-t1).to_f/ts}ms, total: #{(t2-t1).to_f}ms"
|
16
|
+
end
|
17
|
+
|
18
|
+
def puttime(ms=nil)
|
19
|
+
t = Time.now
|
20
|
+
if ms
|
21
|
+
t.strftime("%H:%M:%S")+sprintf(".%03d ", t.usec/1000)
|
22
|
+
else
|
23
|
+
t.strftime("%d.%m.%y %H:%M:%S ")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def putdate
|
28
|
+
Time.now.strftime("%d.%m.%y")
|
29
|
+
end
|
30
|
+
|
31
|
+
module_function :puttime, :putdate
|
32
|
+
end
|
@@ -0,0 +1,106 @@
|
|
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
|
data/lib/rmtools/tree.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
class Array
|
2
|
+
|
3
|
+
def to_tree(set_keys=false)
|
4
|
+
ary = Tree.new dup
|
5
|
+
ary.set_keys! if set_keys
|
6
|
+
ary
|
7
|
+
end
|
8
|
+
|
9
|
+
protected
|
10
|
+
def set_keys!(i=-1)
|
11
|
+
each {|e| Array === e && e.unshift(i+=1).set_keys!}
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
module RMTools
|
17
|
+
|
18
|
+
class Tree < Array
|
19
|
+
|
20
|
+
def self.from(*obj) new(*obj) end
|
21
|
+
|
22
|
+
def initialize(obj, to_ary_method=nil)
|
23
|
+
super(to_ary_method ? recurse_build(obj, to_ary_method) : obj.to_a)
|
24
|
+
end
|
25
|
+
|
26
|
+
def recurse_build(obj, to_ary_method)
|
27
|
+
to_ary_method = [to_ary_method] unless Array === to_ary_method
|
28
|
+
if to_ary_method = to_ary_method.find {|m| obj.respond_to?(m) && Array === (ary = obj.send m) && ary.size > 0}
|
29
|
+
obj.send(to_ary_method).map {|branch|
|
30
|
+
[branch, recurse_build(branch, to_ary_method)]
|
31
|
+
}
|
32
|
+
else
|
33
|
+
[self]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def trace_leaf(a, c, cont=[])
|
38
|
+
return unless Array === a
|
39
|
+
return (a[0] == c && cont) if a.size == 1
|
40
|
+
y = nil
|
41
|
+
a[1..-1].each_with_index.find {|_, i|
|
42
|
+
y = trace_leaf(_, c, cont+[[a[0], i]])
|
43
|
+
}; y
|
44
|
+
end
|
45
|
+
|
46
|
+
def trace_branch(a, c, cont=[])
|
47
|
+
return unless Array === a
|
48
|
+
return cont if a[0] == c
|
49
|
+
y = nil
|
50
|
+
a[1..-1].each_with_index.find {|_, i|
|
51
|
+
y = trace_branch(_, c, cont+[[a[0], i]])
|
52
|
+
}; y
|
53
|
+
end
|
54
|
+
|
55
|
+
def leaves
|
56
|
+
y=[]
|
57
|
+
each {|_| Array === node && (node.size>1 ? y.concat(node.leaves) : y.concat(node))}
|
58
|
+
y
|
59
|
+
end
|
60
|
+
|
61
|
+
def get_branch_by_key(a, key, value)
|
62
|
+
return unless Array === a
|
63
|
+
return a if a[0][key] == value
|
64
|
+
y = nil
|
65
|
+
a[1..-1].find {|record| y = get_branch_by_key(record, key, value)}
|
66
|
+
y
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
metadata
ADDED
@@ -0,0 +1,191 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rmtools
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 1.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Shinku Templar
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-12-10 00:00:00 +03:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rake
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 49
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 8
|
33
|
+
- 7
|
34
|
+
version: 0.8.7
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: activesupport
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 9
|
46
|
+
segments:
|
47
|
+
- 2
|
48
|
+
- 3
|
49
|
+
- 5
|
50
|
+
version: 2.3.5
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rubyforge
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 7
|
62
|
+
segments:
|
63
|
+
- 2
|
64
|
+
- 0
|
65
|
+
- 4
|
66
|
+
version: 2.0.4
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: gemcutter
|
71
|
+
prerelease: false
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 11
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
- 5
|
81
|
+
- 0
|
82
|
+
version: 0.5.0
|
83
|
+
type: :development
|
84
|
+
version_requirements: *id004
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: hoe
|
87
|
+
prerelease: false
|
88
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 27
|
94
|
+
segments:
|
95
|
+
- 2
|
96
|
+
- 5
|
97
|
+
- 0
|
98
|
+
version: 2.5.0
|
99
|
+
type: :development
|
100
|
+
version_requirements: *id005
|
101
|
+
description: "== RMTools\n\
|
102
|
+
Methods for basic classes addon collection.\n\n\
|
103
|
+
== CHANGES\n\
|
104
|
+
:include: History.txt\n"
|
105
|
+
email:
|
106
|
+
- tinbka@gmail.com
|
107
|
+
executables: []
|
108
|
+
|
109
|
+
extensions:
|
110
|
+
- ext/extconf.rb
|
111
|
+
extra_rdoc_files:
|
112
|
+
- ./Manifest.txt
|
113
|
+
- ./License.txt
|
114
|
+
- ./README.txt
|
115
|
+
- ./History.txt
|
116
|
+
files:
|
117
|
+
- ext/extconf.rb
|
118
|
+
- ext/rmtools.h
|
119
|
+
- ext/rmtools.cpp
|
120
|
+
- lib/rmtools.rb
|
121
|
+
- lib/rmtools/arguments.rb
|
122
|
+
- lib/rmtools/numeric.rb
|
123
|
+
- lib/rmtools/string.rb
|
124
|
+
- lib/rmtools/io.rb
|
125
|
+
- lib/rmtools/js.rb
|
126
|
+
- lib/rmtools/cyrilic.rb
|
127
|
+
- lib/rmtools/coloring.rb
|
128
|
+
- lib/rmtools/stringscanner.rb
|
129
|
+
- lib/rmtools/enum.rb
|
130
|
+
- lib/rmtools/string_to_proc.rb
|
131
|
+
- lib/rmtools/traceback.rb
|
132
|
+
- lib/rmtools/time.rb
|
133
|
+
- lib/rmtools/random.rb
|
134
|
+
- lib/rmtools/binding.rb
|
135
|
+
- lib/rmtools/printing.rb
|
136
|
+
- lib/rmtools/range.rb
|
137
|
+
- lib/rmtools/tree.rb
|
138
|
+
- lib/rmtools/boolean.rb
|
139
|
+
- lib/rmtools/hash.rb
|
140
|
+
- lib/rmtools/logging.rb
|
141
|
+
- lib/rmtools/limited_string.rb
|
142
|
+
- lib/rmtools/module.rb
|
143
|
+
- lib/rmtools/object.rb
|
144
|
+
- lib/rmtools/array.rb
|
145
|
+
- lib/rmtools/setup.rb
|
146
|
+
- lib/rmtools/cyr-time.rb
|
147
|
+
- lib/rmtools/dumps.rb
|
148
|
+
- lib/rmtools/proc.rb
|
149
|
+
- ./Rakefile
|
150
|
+
- ./Manifest.txt
|
151
|
+
- ./License.txt
|
152
|
+
- ./README.txt
|
153
|
+
- ./History.txt
|
154
|
+
has_rdoc: true
|
155
|
+
homepage: http://github.com/tinbka
|
156
|
+
licenses: []
|
157
|
+
|
158
|
+
post_install_message:
|
159
|
+
rdoc_options:
|
160
|
+
- --main
|
161
|
+
- README.txt
|
162
|
+
require_paths:
|
163
|
+
- lib
|
164
|
+
- ext
|
165
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
166
|
+
none: false
|
167
|
+
requirements:
|
168
|
+
- - ">="
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
hash: 3
|
171
|
+
segments:
|
172
|
+
- 0
|
173
|
+
version: "0"
|
174
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
|
+
none: false
|
176
|
+
requirements:
|
177
|
+
- - ">="
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
hash: 3
|
180
|
+
segments:
|
181
|
+
- 0
|
182
|
+
version: "0"
|
183
|
+
requirements: []
|
184
|
+
|
185
|
+
rubyforge_project: rmtools
|
186
|
+
rubygems_version: 1.3.7
|
187
|
+
signing_key:
|
188
|
+
specification_version: 3
|
189
|
+
summary: Yet another Ruby applied framework
|
190
|
+
test_files: []
|
191
|
+
|