rmtools 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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/History.txt
CHANGED
data/Manifest.txt
CHANGED
@@ -2,34 +2,92 @@ ext/extconf.rb
|
|
2
2
|
ext/rmtools.h
|
3
3
|
ext/rmtools.cpp
|
4
4
|
lib/rmtools.rb
|
5
|
-
lib/rmtools/
|
6
|
-
lib/rmtools/
|
7
|
-
lib/rmtools/
|
8
|
-
lib/rmtools/
|
9
|
-
lib/rmtools/
|
10
|
-
lib/rmtools/
|
11
|
-
lib/rmtools/
|
12
|
-
lib/rmtools/
|
13
|
-
lib/rmtools/
|
14
|
-
lib/rmtools/
|
15
|
-
lib/rmtools/
|
5
|
+
lib/rmtools/db/active_record.rb
|
6
|
+
lib/rmtools/fs/io.rb
|
7
|
+
lib/rmtools/fs/file.rb
|
8
|
+
lib/rmtools/fs/dir.rb
|
9
|
+
lib/rmtools/fs/tools.rb
|
10
|
+
lib/rmtools/ip/numeric.rb
|
11
|
+
lib/rmtools/ip/string.rb
|
12
|
+
lib/rmtools/xml/xpath.rb
|
13
|
+
lib/rmtools/xml/string.rb
|
14
|
+
lib/rmtools/xml/libxml.rb
|
15
|
+
lib/rmtools/xml/finders.rb
|
16
|
+
lib/rmtools/xml/node.rb
|
17
|
+
lib/rmtools/xml/document.rb
|
18
|
+
lib/rmtools/b.rb
|
19
|
+
lib/rmtools/core/arguments.rb
|
20
|
+
lib/rmtools/core/numeric.rb
|
21
|
+
lib/rmtools/core/js.rb
|
22
|
+
lib/rmtools/core/string_compliance.rb
|
23
|
+
lib/rmtools/core/kernel.rb
|
24
|
+
lib/rmtools/core/boolean.rb
|
25
|
+
lib/rmtools/core/module.rb
|
26
|
+
lib/rmtools/core/object.rb
|
27
|
+
lib/rmtools/core/regexp.rb
|
28
|
+
lib/rmtools/core/class.rb
|
29
|
+
lib/rmtools/core/proc.rb
|
30
|
+
lib/rmtools/lang/shortcuts.rb
|
31
|
+
lib/rmtools/lang/ansi.rb
|
32
|
+
lib/rmtools/lang/regexp.rb
|
33
|
+
lib/rmtools/lang/cyrillic.rb
|
34
|
+
lib/rmtools/rand/string.rb
|
35
|
+
lib/rmtools/rand/enum.rb
|
36
|
+
lib/rmtools/rand/range.rb
|
37
|
+
lib/rmtools/rand/array.rb
|
38
|
+
lib/rmtools/text/string_simple.rb
|
39
|
+
lib/rmtools/text/string_scanner.rb
|
40
|
+
lib/rmtools/text/textilize.rb
|
41
|
+
lib/rmtools/text/string_split.rb
|
42
|
+
lib/rmtools/text/string_parse.rb
|
43
|
+
lib/rmtools/time/russian.rb
|
44
|
+
lib/rmtools/time/global.rb
|
45
|
+
lib/rmtools/rand.rb
|
46
|
+
lib/rmtools/console/coloring.rb
|
47
|
+
lib/rmtools/console/printing.rb
|
48
|
+
lib/rmtools/console/highlight.rb
|
49
|
+
lib/rmtools/core.rb
|
50
|
+
lib/rmtools/db.rb
|
51
|
+
lib/rmtools/debug/present.rb
|
52
|
+
lib/rmtools/debug/traceback.rb
|
53
|
+
lib/rmtools/debug/binding.rb
|
54
|
+
lib/rmtools/debug/logging.rb
|
55
|
+
lib/rmtools/debug/highlight.rb
|
56
|
+
lib/rmtools/debug/timer.rb
|
57
|
+
lib/rmtools/fs.rb
|
58
|
+
lib/rmtools/ip.rb
|
59
|
+
lib/rmtools/lang.rb
|
60
|
+
lib/rmtools/functional.rb
|
61
|
+
lib/rmtools/experimental.rb
|
62
|
+
lib/rmtools/functional/string_to_proc.rb
|
63
|
+
lib/rmtools/functional/fold.rb
|
64
|
+
lib/rmtools/functional/unfold.rb
|
65
|
+
lib/rmtools/text.rb
|
66
|
+
lib/rmtools/console.rb
|
16
67
|
lib/rmtools/time.rb
|
17
|
-
lib/rmtools/
|
18
|
-
lib/rmtools/
|
19
|
-
lib/rmtools/
|
20
|
-
lib/rmtools/range.rb
|
21
|
-
lib/rmtools/
|
22
|
-
lib/rmtools/
|
23
|
-
lib/rmtools/
|
24
|
-
lib/rmtools/
|
25
|
-
lib/rmtools/
|
26
|
-
lib/rmtools/
|
27
|
-
lib/rmtools/
|
28
|
-
lib/rmtools/
|
68
|
+
lib/rmtools/debug_notrace.rb
|
69
|
+
lib/rmtools/debug.rb
|
70
|
+
lib/rmtools/enumerable/common.rb
|
71
|
+
lib/rmtools/enumerable/range.rb
|
72
|
+
lib/rmtools/enumerable/hash.rb
|
73
|
+
lib/rmtools/enumerable/array.rb
|
74
|
+
lib/rmtools/enumerable/object_space.rb
|
75
|
+
lib/rmtools/enumerable/array_iterators.rb
|
76
|
+
lib/rmtools/require.rb
|
77
|
+
lib/rmtools/experimental/numeric.rb
|
78
|
+
lib/rmtools/experimental/string.rb
|
79
|
+
lib/rmtools/experimental/blackhole.rb
|
80
|
+
lib/rmtools/experimental/tree.rb
|
81
|
+
lib/rmtools/experimental/deprecation.rb
|
82
|
+
lib/rmtools/experimental/dumps.rb
|
83
|
+
lib/rmtools/experimental/rails_backtrace.rb
|
84
|
+
lib/rmtools/xml.rb
|
85
|
+
lib/rmtools/conversions.rb
|
29
86
|
lib/rmtools/setup.rb
|
30
|
-
lib/rmtools/
|
31
|
-
lib/rmtools/
|
32
|
-
lib/rmtools/
|
87
|
+
lib/rmtools/conversions/string.rb
|
88
|
+
lib/rmtools/conversions/enum.rb
|
89
|
+
lib/rmtools/conversions/int.rb
|
90
|
+
lib/rmtools/enumerable.rb
|
33
91
|
./Rakefile
|
34
92
|
./Manifest.txt
|
35
93
|
./License.txt
|
data/Rakefile
CHANGED
@@ -4,7 +4,7 @@ compile_manifest
|
|
4
4
|
|
5
5
|
begin
|
6
6
|
require 'hoe'
|
7
|
-
config = Hoe.new('rmtools', '1.
|
7
|
+
config = Hoe.new('rmtools', '1.1.0') do |h|
|
8
8
|
h.developer("Shinku Templar", "tinbka@gmail.com")
|
9
9
|
|
10
10
|
h.summary = 'Yet another Ruby applied framework'
|
@@ -13,7 +13,7 @@ begin
|
|
13
13
|
h.url = 'http://github.com/tinbka'
|
14
14
|
|
15
15
|
h.extra_deps << ['rake','>= 0.8.7']
|
16
|
-
h.extra_deps << ['activesupport','>= 2.3.
|
16
|
+
h.extra_deps << ['activesupport','>= 2.3.8']
|
17
17
|
end
|
18
18
|
config.spec.extensions << 'ext/extconf.rb'
|
19
19
|
rescue LoadError
|
@@ -23,6 +23,8 @@ rescue Exception => e
|
|
23
23
|
STDERR.puts "error message is: #{e.message}"
|
24
24
|
end
|
25
25
|
|
26
|
+
puts "Installing RMTools..."
|
27
|
+
|
26
28
|
ruby = RbConfig::CONFIG['RUBY_INSTALL_NAME']
|
27
29
|
windoze = PLATFORM =~ /mswin32/
|
28
30
|
make = windoze ? 'nmake' : 'make'
|
@@ -35,5 +37,6 @@ Dir.chdir "ext" do
|
|
35
37
|
if File.file? 'Makefile'
|
36
38
|
system "#{make} clean" and FileUtils.rm_f "Makefile"
|
37
39
|
end
|
38
|
-
end unless ext_files_not_modified
|
39
|
-
|
40
|
+
end unless ext_files_not_modified 'rmtools', '1.1.0'
|
41
|
+
|
42
|
+
puts "RMTools installed!"
|
data/ext/extconf.rb
CHANGED
data/ext/rmtools.cpp
CHANGED
@@ -225,19 +225,24 @@ static VALUE rb_ary_uniq_by(VALUE ary)
|
|
225
225
|
/*
|
226
226
|
* Make hash with unique items of +self+ or (when block given)
|
227
227
|
* unique results of items yield for keys and
|
228
|
-
* count of them in +self,
|
229
|
-
* or (with option :
|
228
|
+
* count of them in +self,
|
229
|
+
* or (with option :fill) arrays of yield results,
|
230
|
+
* or (with option :indexes) arrays of indexes of them,
|
231
|
+
* or (with option :group) arrays of themselves for values
|
230
232
|
*
|
231
|
-
* [1, 2, 2,
|
232
|
-
* => {1=>1, 2=>
|
233
|
-
* [1, 2, 2,
|
234
|
-
* => {
|
235
|
-
* [1, 2, 2,
|
236
|
-
* => {1=>[
|
237
|
-
* [1, 2, 2,
|
238
|
-
* => {0=>[1, 2],
|
239
|
-
* [1, 2, 2,
|
240
|
-
* => {0=>2, 1=>4}
|
233
|
+
* [1, 2, 2, 2, 3, 3].count
|
234
|
+
* => {1=>1, 2=>3, 3=>2}
|
235
|
+
* [1, 2, 2, 2, 3, 3].count {|i| i%2}
|
236
|
+
* => {0=>3, 1=>3}
|
237
|
+
* [1, 2, 2, 2, 3, 3].count :fill
|
238
|
+
* => {1=>[1], 2=>[2, 2, 2], 3=>[3, 3]}
|
239
|
+
* [1, 2, 2, 2, 3, 3].count :indexes
|
240
|
+
* => {1=>[0], 2=>[1, 2, 3], 3=>[4, 5]}
|
241
|
+
* [1, 2, 2, 2, 3, 3].count(:indexes) {|i| i%2}
|
242
|
+
* => {0=>[1, 2, 3], 1=>[0, 4, 5]}
|
243
|
+
* :group is analogue to rails' group_by but twice faster
|
244
|
+
* [1, 2, 2, 2, 3, 3].count(:group) {|i| i%2}
|
245
|
+
* => {0=>[2, 2, 2], 1=>[1, 3, 3]}
|
241
246
|
*/
|
242
247
|
static VALUE rb_ary_count_items(int argc, VALUE *argv, VALUE ary)
|
243
248
|
{
|
@@ -276,6 +281,16 @@ static VALUE rb_ary_count_items(int argc, VALUE *argv, VALUE ary)
|
|
276
281
|
return hash;
|
277
282
|
}
|
278
283
|
|
284
|
+
/*
|
285
|
+
* call-seq:
|
286
|
+
* ary.partition {| obj | block } => [ true_array, false_array ]
|
287
|
+
*
|
288
|
+
* Same as Enumerable#partition, but twice faster
|
289
|
+
*
|
290
|
+
* [5, 6, 1, 2, 4, 3].partition {|i| (i&1).zero?} #=> [[2, 4, 6], [1, 3, 5]]
|
291
|
+
*
|
292
|
+
*/
|
293
|
+
|
279
294
|
static VALUE rb_ary_partition(VALUE ary)
|
280
295
|
{
|
281
296
|
VALUE select, reject;
|
data/ext/rmtools.h
CHANGED
@@ -94,12 +94,13 @@ static const size_t SLOT_SIZE = sizeof(RVALUE);
|
|
94
94
|
#include <re.h>
|
95
95
|
|
96
96
|
# define STR_SET_LEN(x, i) (RSTRING(x)->len = (i))
|
97
|
-
|
97
|
+
|
98
|
+
#ifndef RFLOAT_VALUE
|
98
99
|
# define RFLOAT_VALUE(f) (RFLOAT(f)->value)
|
99
|
-
|
100
100
|
# define RBIGNUM_DIGITS(f) (RBIGNUM(f)->digits)
|
101
101
|
# define RBIGNUM_LEN(f) (RBIGNUM(f)->len)
|
102
|
-
|
102
|
+
#endif
|
103
|
+
|
103
104
|
# define ARY_SET_LEN(x, i) (RARRAY(x)->len = (i))
|
104
105
|
|
105
106
|
# define BDIGITS(x) ((BDIGIT*)RBIGNUM(x)->digits)
|
@@ -141,11 +142,11 @@ static const size_t SLOT_SIZE = sizeof(RVALUE);
|
|
141
142
|
|
142
143
|
|
143
144
|
// shortcuts for debug r_r
|
144
|
-
extern void
|
145
|
+
extern void rb_log(const char* str)
|
145
146
|
{
|
146
147
|
rb_funcall(rb_gv_get("$log"), rb_intern("debug"), 1, rb_str_new2(str));
|
147
148
|
}
|
148
|
-
extern void
|
149
|
+
extern void rb_log_obj(VALUE obj)
|
149
150
|
{
|
150
151
|
rb_funcall(rb_gv_get("$log"), rb_intern("debug"), 1, obj);
|
151
152
|
}
|
data/lib/rmtools/b.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# {obj.b -> self or false} with python logic
|
2
|
+
# Since 2.3.8 active_support has analogue: #presence
|
3
|
+
|
4
|
+
class Object
|
5
|
+
def b; self end
|
6
|
+
end
|
7
|
+
class Numeric
|
8
|
+
def b; !zero? && self end
|
9
|
+
end
|
10
|
+
class String
|
11
|
+
def b; !empty? && self end
|
12
|
+
end
|
13
|
+
class Proc
|
14
|
+
def b; (self != NULL) && self end
|
15
|
+
end
|
16
|
+
module Enumerable
|
17
|
+
def b; !empty? && self end
|
18
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module RMTools
|
3
|
+
|
4
|
+
class Coloring
|
5
|
+
__init__
|
6
|
+
method_defined? :b and undef_method :b
|
7
|
+
method_defined? :p and undef_method :p
|
8
|
+
|
9
|
+
if !defined? ::BOLD
|
10
|
+
BOLD = 1
|
11
|
+
UNDERLINE = 4
|
12
|
+
GRAYBG = 5
|
13
|
+
BOLDBG = 7
|
14
|
+
|
15
|
+
KEY = BLACK = 30
|
16
|
+
RED = 31
|
17
|
+
GREEN = 32
|
18
|
+
YELLOW = 33
|
19
|
+
BLUE = 34
|
20
|
+
PURPLE = 35
|
21
|
+
CYAN = 36
|
22
|
+
GRAY = 37
|
23
|
+
|
24
|
+
Colors = {:black => 30, :red => 31, :green => 32, :yellow => 33, :blue => 34, :purple => 35, :cyan => 36, :gray => 37,
|
25
|
+
:k => 30, :r => 31, :g => 32, :y => 33, :b => 34, :p => 35, :c => 36
|
26
|
+
}.unify_keys
|
27
|
+
Effects = {:bold => 1, :underline => 4, :graybg => 5, :boldbg => 7,
|
28
|
+
:b => 1, :u => 4, :gbg => 5, :bbg => 7
|
29
|
+
}.unify_keys
|
30
|
+
end
|
31
|
+
|
32
|
+
def paint(str, num=nil, effect=nil)
|
33
|
+
# default cmd.exe cannot into ANSI
|
34
|
+
return str if ENV['ComSpec'] =~ /cmd(.exe)?$/
|
35
|
+
num = Colors[num] if num.is String
|
36
|
+
effect = Effects[effect] if effect.is String
|
37
|
+
if num and effect
|
38
|
+
"\e[#{effect};#{num}m#{str}\e[m"
|
39
|
+
elsif effect
|
40
|
+
"\e[#{effect}m#{str}\e[m"
|
41
|
+
elsif num
|
42
|
+
"\e[#{num}m#{str}\e[m"
|
43
|
+
else str
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def method_missing(m, str)
|
48
|
+
paint str, *(m.to_s/"_")
|
49
|
+
end
|
50
|
+
|
51
|
+
def clean str
|
52
|
+
str.gsub(/\e\[.*?m/, '')
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
Painter = Coloring.new
|
58
|
+
['sub', 'gsub', 'sub!', 'gsub!'].each {|m|
|
59
|
+
Coloring.module_eval "
|
60
|
+
def #{m.sub 'sub', 'hl'} str, pattern, color=:red_bold
|
61
|
+
str.#{m}(pattern) {|word| send color, word}
|
62
|
+
end
|
63
|
+
"
|
64
|
+
module_eval "
|
65
|
+
def #{m.sub 'sub', 'hl'} str, pattern, color=:red_bold
|
66
|
+
str.#{m}(pattern) {|word| Painter.send color, word}
|
67
|
+
end
|
68
|
+
"
|
69
|
+
# module_function m.to_sym
|
70
|
+
}
|
71
|
+
|
72
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require_with_path 'console/coloring'
|
2
|
+
|
3
|
+
class String
|
4
|
+
|
5
|
+
def find_hl(pat, range=1000) idx = case pat
|
6
|
+
when String; index pat
|
7
|
+
when Regexp; self =~ pat
|
8
|
+
else raise TypeError, "pattern must be string or regexp"
|
9
|
+
end
|
10
|
+
puts RMTools.ghl(self[[idx-range, 0].max, 2*range], pat)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -1,16 +1,23 @@
|
|
1
1
|
module RMTools
|
2
2
|
|
3
|
+
# transparent print: print text (or object details) and erase it
|
3
4
|
class TempPrinter
|
4
5
|
__init__
|
5
6
|
|
6
7
|
def initialize object=nil, format=nil
|
7
8
|
if @object = object
|
8
9
|
@format = '"' + format.gsub(/:([a-z_]\w*)/, '#{@\1.inspect}') + '"'
|
10
|
+
else
|
11
|
+
@format = format
|
9
12
|
end
|
10
13
|
end
|
11
14
|
|
12
|
-
def format_str
|
13
|
-
|
15
|
+
def format_str params_hash=nil
|
16
|
+
if params_hash
|
17
|
+
params_hash.each {|k, v| @format.sub! ":#{k}", v.inspect}
|
18
|
+
else
|
19
|
+
@object.instance_eval @format
|
20
|
+
end
|
14
21
|
end
|
15
22
|
|
16
23
|
def p(str=format_str)
|
@@ -38,4 +45,12 @@ module RMTools
|
|
38
45
|
|
39
46
|
end
|
40
47
|
|
48
|
+
end
|
49
|
+
|
50
|
+
module RMTools
|
51
|
+
|
52
|
+
def tick!
|
53
|
+
print %W{|\b /\b -\b \\\b +\b X\b}.rand
|
54
|
+
end
|
55
|
+
|
41
56
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require_with_path __FILE__, '*'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
3
|
+
module Enumerable
|
4
|
+
|
5
|
+
# Simple http stringifying. Also stringifies multi-value hashes
|
6
|
+
# {'a'=>'10&20&30'}.urlencode
|
7
|
+
# => "a=10&a=20&a=30"
|
8
|
+
def urlencode
|
9
|
+
map {|k, v| next if !v
|
10
|
+
k, v = k.to_s, v.to_s
|
11
|
+
if v =~ /&/
|
12
|
+
v = v/'&'
|
13
|
+
v.map {|val| "#{CGI.escape(k)}=#{CGI.escape(val)}"} * '&'
|
14
|
+
elsif k =~ /&/
|
15
|
+
k = k/'&'
|
16
|
+
k.map {|key| "#{CGI.escape(key)}=#{CGI.escape(v)}"} * '&'
|
17
|
+
else
|
18
|
+
"#{CGI.escape(k)}=#{CGI.escape(v)}"
|
19
|
+
end
|
20
|
+
} * '&'
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class Integer
|
2
|
+
|
3
|
+
def kb; self*1024 end
|
4
|
+
def mb; self*1048576 end
|
5
|
+
def gb; self*1073741824 end
|
6
|
+
|
7
|
+
def to_timestr(t=nil)
|
8
|
+
if t
|
9
|
+
if t.in [:minutes, :min, :m]
|
10
|
+
"#{self/60} minutes"
|
11
|
+
elsif t.in [:hours, :h]
|
12
|
+
"#{self/3600} hours"
|
13
|
+
elsif t.in [:days, :d]
|
14
|
+
"#{self/86400} days"
|
15
|
+
end
|
16
|
+
elsif self < 60
|
17
|
+
"#{self} seconds"
|
18
|
+
elsif self < 3600
|
19
|
+
"#{self/60} minutes"
|
20
|
+
elsif self < 86400
|
21
|
+
"#{self/3600} hours"
|
22
|
+
else
|
23
|
+
"#{self/86400} days"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def bytes(t=nil)
|
28
|
+
if t
|
29
|
+
if :kb == t
|
30
|
+
"%.2fKB"%[to_f/1024]
|
31
|
+
elsif :mb == t
|
32
|
+
"%.2fMB"%[to_f/1048576]
|
33
|
+
elsif :gb == t
|
34
|
+
"%.2fGB"%[to_f/1073741824]
|
35
|
+
end
|
36
|
+
elsif self < 1024
|
37
|
+
"#{self}B"
|
38
|
+
elsif self < 1048576
|
39
|
+
"%.2fKB"%[to_f/1024]
|
40
|
+
elsif self < 1073741824
|
41
|
+
"%.2fMB"%[to_f/1048576]
|
42
|
+
else
|
43
|
+
"%.2fGB"%[to_f/1073741824]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
3
|
+
class String
|
4
|
+
|
5
|
+
# with default delimiters - inversion of #urlencode
|
6
|
+
def to_hash(unscp=true, params_delim='&', k_v_delim='=')
|
7
|
+
params = split(params_delim)
|
8
|
+
h = {}
|
9
|
+
params.each {|par|
|
10
|
+
str = par.split(k_v_delim, 2)
|
11
|
+
if unscp
|
12
|
+
h[CGI.unescape(str[0]) || ''] = CGI.unescape(str[1] || '')
|
13
|
+
else
|
14
|
+
h[str[0]] = str[1]
|
15
|
+
end
|
16
|
+
}
|
17
|
+
h
|
18
|
+
end
|
19
|
+
|
20
|
+
# inversion of #to_json
|
21
|
+
# active support activesupport
|
22
|
+
def from_json
|
23
|
+
ActiveSupport::JSON.decode self
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require_with_path __FILE__, '*'
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'active_support/core_ext/hash'
|
2
|
+
|
3
|
+
class Array
|
4
|
+
|
5
|
+
# a, b, opts = [<hash1>].fetch_opts([<hash2>, <object1>]) may work unintuitive:
|
6
|
+
# you'll get <hash1> as `a' and not as `opts'
|
7
|
+
# So if function is not implying that some argument other than `opts' definetly
|
8
|
+
# must be a hash, don't make hash default.
|
9
|
+
# Better put hashie argument into opts like
|
10
|
+
# b, opts = [<hash1>].fetch([<object1>], :a => <hash2>)
|
11
|
+
# and get `a' from `'opts' hash
|
12
|
+
def fetch_opts(defaults=[], opts={})
|
13
|
+
if Hash === defaults
|
14
|
+
opts = defaults
|
15
|
+
defaults = []
|
16
|
+
$log.warn "fetch_opts(<hash>) now changed"
|
17
|
+
end
|
18
|
+
opts &&= if self[-1].kind_of?(Hash) and !defaults[size-1].kind_of?(Hash)
|
19
|
+
opts.merge pop
|
20
|
+
else
|
21
|
+
opts.dup
|
22
|
+
end
|
23
|
+
if defaults == :flags
|
24
|
+
defauls = [:flags]
|
25
|
+
end
|
26
|
+
if defaults.last == :flags
|
27
|
+
defaults.pop
|
28
|
+
flags = defaults.size..-1
|
29
|
+
if defaults.size < size
|
30
|
+
self[flags].each {|flag| opts[flag] = true}
|
31
|
+
self[flags] = []
|
32
|
+
end
|
33
|
+
end
|
34
|
+
each_index {|i| import(defaults, i) if self[i] == :def}
|
35
|
+
defaults.slice! 0, size
|
36
|
+
concat defaults << opts
|
37
|
+
end
|
38
|
+
alias :fetch_options :fetch_opts
|
39
|
+
alias :get_opts :fetch_opts
|
40
|
+
|
41
|
+
def valid_types(pattern_ary)
|
42
|
+
each_with_index.find {|var, i|
|
43
|
+
pattern = pattern_ary[i]
|
44
|
+
if pattern.is Array
|
45
|
+
pattern.find {|j| !(pattern[j] === var[i])}
|
46
|
+
else !(pattern === var[i])
|
47
|
+
end
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
@@ -1,17 +1,4 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
class Numeric
|
3
|
-
def b; (self != 0) && self end
|
4
|
-
end
|
5
|
-
class String
|
6
|
-
def b; !empty? && self end
|
7
|
-
end
|
8
|
-
class Proc
|
9
|
-
def b; (self != NULL) && self end
|
10
|
-
end
|
11
|
-
module Enumerable
|
12
|
-
def b; !empty? && self end
|
13
|
-
end
|
14
|
-
|
15
2
|
class TrueClass
|
16
3
|
def to_i; 1; end
|
17
4
|
def <=>(obj)
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class Class
|
2
|
+
|
3
|
+
# define python-style initializer
|
4
|
+
def __init__
|
5
|
+
modname, classname = name.match(/^(?:(.+)::)?([^:]+)$/)[1..2]
|
6
|
+
classname ||= modname
|
7
|
+
mod = '::'.in(name) ? eval(modname) : RMTools
|
8
|
+
mod.module_eval "def #{classname} *args; #{name}.new *args end
|
9
|
+
module_function :#{classname}"
|
10
|
+
if mod != RMTools
|
11
|
+
mod.each_child {|c| c.class_eval "include #{mod}; extend #{mod}" if !c.in c.children}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def method_proxy *vars
|
16
|
+
buffered_missing = instance_methods.grep(/method_missing/).sort.last || 'method_missing'
|
17
|
+
# next arg overrides previous
|
18
|
+
vars.each {|v|
|
19
|
+
class_eval "
|
20
|
+
alias #{buffered_missing.bump! '_'} method_missing
|
21
|
+
def method_missing *args, &block
|
22
|
+
#{v}.send *args, &block
|
23
|
+
rescue NoMethodError
|
24
|
+
#{buffered_missing} *args, &block
|
25
|
+
end"
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def personal_methods filter=//
|
30
|
+
(self.singleton_methods - self.superclass.singleton_methods).sort!.grep(filter)
|
31
|
+
end
|
32
|
+
|
33
|
+
def my_instance_methods filter=//
|
34
|
+
(self.public_instance_methods - Object.public_instance_methods).sort!.grep(filter)
|
35
|
+
end
|
36
|
+
|
37
|
+
def personal_instance_methods filter=//
|
38
|
+
(self.public_instance_methods - self.superclass.public_instance_methods).sort!.grep(filter)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# js hash getter/setter and string concat logic
|
3
|
+
class Hash
|
4
|
+
|
5
|
+
# hash = {}
|
6
|
+
# hash.abc = 123
|
7
|
+
# hash # => {"abc"=>123}
|
8
|
+
# hash.abc # => 123
|
9
|
+
# hash.unknown_function(321) # => raise NoMethodError
|
10
|
+
# hash.unknown_function # => nil
|
11
|
+
# hash[:def] = 456
|
12
|
+
# hash.def # => 456
|
13
|
+
def method_missing(met, *args)
|
14
|
+
str = met.id2name
|
15
|
+
if str[/=$/]
|
16
|
+
self[str[0..-2]] = args[0]
|
17
|
+
else
|
18
|
+
raise NoMethodError, "undefined method `#{str}' for #{self}:#{(self.class)}" if !args.empty?
|
19
|
+
a = self[str]
|
20
|
+
(a == default) ? self[met] : a
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
class String
|
27
|
+
if !method_defined? :plus
|
28
|
+
alias :plus :+
|
29
|
+
end
|
30
|
+
|
31
|
+
# immutable:
|
32
|
+
# '123' + 95 # => '12395'
|
33
|
+
# '123'.plus 95 # => raise TypeError
|
34
|
+
# mutable:
|
35
|
+
# '123' << 95 # => '12395'
|
36
|
+
# '123'.concat 95 # => '123_'
|
37
|
+
def +(str)
|
38
|
+
plus str.to_s
|
39
|
+
end
|
40
|
+
|
41
|
+
def <<(str)
|
42
|
+
concat str.to_s
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|