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.
Files changed (110) hide show
  1. data/History.txt +5 -0
  2. data/Manifest.txt +84 -26
  3. data/Rakefile +7 -4
  4. data/ext/extconf.rb +1 -1
  5. data/ext/rmtools.cpp +27 -12
  6. data/ext/rmtools.h +6 -5
  7. data/lib/rmtools/b.rb +18 -0
  8. data/lib/rmtools/console/coloring.rb +72 -0
  9. data/lib/rmtools/console/highlight.rb +13 -0
  10. data/lib/rmtools/{printing.rb → console/printing.rb} +17 -2
  11. data/lib/rmtools/console.rb +1 -0
  12. data/lib/rmtools/conversions/enum.rb +23 -0
  13. data/lib/rmtools/conversions/int.rb +47 -0
  14. data/lib/rmtools/conversions/string.rb +26 -0
  15. data/lib/rmtools/conversions.rb +1 -0
  16. data/lib/rmtools/core/arguments.rb +52 -0
  17. data/lib/rmtools/{boolean.rb → core/boolean.rb} +0 -13
  18. data/lib/rmtools/core/class.rb +41 -0
  19. data/lib/rmtools/core/js.rb +45 -0
  20. data/lib/rmtools/core/kernel.rb +28 -0
  21. data/lib/rmtools/{module.rb → core/module.rb} +0 -41
  22. data/lib/rmtools/core/numeric.rb +35 -0
  23. data/lib/rmtools/{object.rb → core/object.rb} +2 -23
  24. data/lib/rmtools/core/proc.rb +18 -0
  25. data/lib/rmtools/core/regexp.rb +11 -0
  26. data/lib/rmtools/core/string_compliance.rb +31 -0
  27. data/lib/rmtools/core.rb +1 -0
  28. data/lib/rmtools/db/active_record.rb +54 -0
  29. data/lib/rmtools/db.rb +7 -0
  30. data/lib/rmtools/debug/binding.rb +56 -0
  31. data/lib/rmtools/debug/highlight.rb +23 -0
  32. data/lib/rmtools/debug/logging.rb +176 -0
  33. data/lib/rmtools/debug/present.rb +38 -0
  34. data/lib/rmtools/debug/timer.rb +19 -0
  35. data/lib/rmtools/debug/traceback.rb +92 -0
  36. data/lib/rmtools/debug.rb +1 -0
  37. data/lib/rmtools/debug_notrace.rb +1 -0
  38. data/lib/rmtools/enumerable/array.rb +134 -0
  39. data/lib/rmtools/enumerable/array_iterators.rb +33 -0
  40. data/lib/rmtools/enumerable/common.rb +49 -0
  41. data/lib/rmtools/{hash.rb → enumerable/hash.rb} +8 -8
  42. data/lib/rmtools/enumerable/object_space.rb +19 -0
  43. data/lib/rmtools/enumerable/range.rb +201 -0
  44. data/lib/rmtools/enumerable.rb +1 -0
  45. data/lib/rmtools/experimental/blackhole.rb +12 -0
  46. data/lib/rmtools/experimental/deprecation.rb +36 -0
  47. data/lib/rmtools/experimental/dumps.rb +28 -0
  48. data/lib/rmtools/{numeric.rb → experimental/numeric.rb} +22 -51
  49. data/lib/rmtools/experimental/rails_backtrace.rb +29 -0
  50. data/lib/rmtools/experimental/string.rb +56 -0
  51. data/lib/rmtools/{tree.rb → experimental/tree.rb} +0 -0
  52. data/lib/rmtools/experimental.rb +1 -0
  53. data/lib/rmtools/fs/dir.rb +89 -0
  54. data/lib/rmtools/fs/file.rb +104 -0
  55. data/lib/rmtools/fs/io.rb +58 -0
  56. data/lib/rmtools/fs/tools.rb +49 -0
  57. data/lib/rmtools/fs.rb +1 -0
  58. data/lib/rmtools/functional/fold.rb +32 -0
  59. data/lib/rmtools/{string_to_proc.rb → functional/string_to_proc.rb} +2 -22
  60. data/lib/rmtools/functional/unfold.rb +16 -0
  61. data/lib/rmtools/functional.rb +1 -0
  62. data/lib/rmtools/ip/numeric.rb +35 -0
  63. data/lib/rmtools/ip/string.rb +45 -0
  64. data/lib/rmtools/ip.rb +1 -0
  65. data/lib/rmtools/lang/ansi.rb +17 -0
  66. data/lib/rmtools/lang/cyrillic.rb +106 -0
  67. data/lib/rmtools/lang/regexp.rb +8 -0
  68. data/lib/rmtools/lang/shortcuts.rb +20 -0
  69. data/lib/rmtools/lang.rb +1 -0
  70. data/lib/rmtools/rand/array.rb +39 -0
  71. data/lib/rmtools/rand/enum.rb +26 -0
  72. data/lib/rmtools/rand/range.rb +13 -0
  73. data/lib/rmtools/{random.rb → rand/string.rb} +13 -107
  74. data/lib/rmtools/rand.rb +1 -0
  75. data/lib/rmtools/require.rb +13 -0
  76. data/lib/rmtools/setup.rb +6 -5
  77. data/lib/rmtools/text/string_parse.rb +60 -0
  78. data/lib/rmtools/{stringscanner.rb → text/string_scanner.rb} +3 -2
  79. data/lib/rmtools/text/string_simple.rb +75 -0
  80. data/lib/rmtools/text/string_split.rb +148 -0
  81. data/lib/rmtools/text/textilize.rb +44 -0
  82. data/lib/rmtools/text.rb +1 -0
  83. data/lib/rmtools/time/global.rb +17 -0
  84. data/lib/rmtools/time/russian.rb +47 -0
  85. data/lib/rmtools/time.rb +1 -32
  86. data/lib/rmtools/xml/document.rb +28 -0
  87. data/lib/rmtools/xml/finders.rb +84 -0
  88. data/lib/rmtools/xml/libxml.rb +11 -0
  89. data/lib/rmtools/xml/node.rb +196 -0
  90. data/lib/rmtools/xml/string.rb +43 -0
  91. data/lib/rmtools/xml/xpath.rb +32 -0
  92. data/lib/rmtools/xml.rb +7 -0
  93. data/lib/rmtools.rb +8 -44
  94. metadata +97 -72
  95. data/lib/rmtools/arguments.rb +0 -24
  96. data/lib/rmtools/array.rb +0 -189
  97. data/lib/rmtools/binding.rb +0 -23
  98. data/lib/rmtools/coloring.rb +0 -82
  99. data/lib/rmtools/cyr-time.rb +0 -49
  100. data/lib/rmtools/cyrilic.rb +0 -124
  101. data/lib/rmtools/dumps.rb +0 -192
  102. data/lib/rmtools/enum.rb +0 -90
  103. data/lib/rmtools/io.rb +0 -303
  104. data/lib/rmtools/js.rb +0 -25
  105. data/lib/rmtools/limited_string.rb +0 -17
  106. data/lib/rmtools/logging.rb +0 -158
  107. data/lib/rmtools/proc.rb +0 -25
  108. data/lib/rmtools/range.rb +0 -100
  109. data/lib/rmtools/string.rb +0 -276
  110. data/lib/rmtools/traceback.rb +0 -106
@@ -0,0 +1,134 @@
1
+ # encoding: utf-8
2
+ require 'active_support/core_ext/array'
3
+ require_with_path 'functional/fold'
4
+
5
+ class Array
6
+
7
+ # arithmetics
8
+ def avg
9
+ sum.to_f/size
10
+ end
11
+
12
+ # for use with iterators
13
+ def avg_by(&b)
14
+ sum(&b).to_f/size
15
+ end
16
+
17
+ def scale(top)
18
+ case top
19
+ when Numeric; ratio = max.to_f/top
20
+ when Array; ratio = zip(top).map {|a,b| b ? a.to_f/b : 0}.max
21
+ else raise TypeError, "number or array of numbers expceted, #{top.class} given"
22
+ end
23
+ map {|e| e/ratio}
24
+ end
25
+
26
+
27
+ # setters/getters
28
+ def set_where(value, &block)
29
+ return unless e = find(&block)
30
+ self[index(e)] = value
31
+ end
32
+
33
+ def set_all_where(value, &block)
34
+ select(&block).each {|e| self[index(e)] = value}
35
+ end
36
+
37
+ def indice_where(&block)
38
+ return unless e = find(&block)
39
+ index(e)
40
+ end
41
+ alias :pos :indice_where
42
+
43
+ def indices_where(&block)
44
+ i = nil
45
+ find_all(&block).map {|e|
46
+ i = i ?
47
+ self[i+1..-1].index(e) + i + 1 :
48
+ index(e)
49
+ }
50
+ end
51
+
52
+
53
+ # splitters
54
+ def div(int, to_int_parts=nil)
55
+ len = int.to_i
56
+ return [self] if len <= 0
57
+ arr = dup
58
+ newarr = []
59
+ while arr.size > 0
60
+ newarr << arr.slice!(0, len)
61
+ end
62
+ newarr
63
+ end
64
+
65
+ def div!(int, to_int_parts=nil)
66
+ replace(div(int, to_int_parts))
67
+ end
68
+
69
+
70
+ # selectors
71
+ def sorted_uniq_by(&block)
72
+ uniq_by(&block).sort_by(&block)
73
+ end
74
+
75
+ def odds
76
+ values_at(*(0...size).odds)
77
+ end
78
+
79
+ def evens
80
+ values_at(*(0...size).evens)
81
+ end
82
+
83
+ # conditional
84
+ def uniq?
85
+ uniq == self
86
+ end
87
+
88
+ def every?
89
+ !find {|e| !yield(e)}
90
+ end
91
+
92
+ # concatenation
93
+ # analogue to String#>>
94
+ def >>(ary)
95
+ ary.replace(self + ary)
96
+ end
97
+
98
+
99
+
100
+ alias :casecmp :===
101
+ # making multiple pattern matching possible:
102
+ # a, b = '3', '10'
103
+ # case [a, b]
104
+ # when [Integer, Integer]; a+b
105
+ # when [/\d/, '10']; '%*d'%[a, b]
106
+ # ...
107
+ # end
108
+ def ===(obj)
109
+ return true if casecmp(obj)
110
+ !!(obj.kinda(Array) and obj.size == size and
111
+ each_with_index {|e, i| e == :_ or e === obj[i] or return false})
112
+ end
113
+
114
+
115
+
116
+
117
+ def map_hash(&b)
118
+ Hash[map(&b)]
119
+ end
120
+
121
+ def map_with_index(&block)
122
+ each_with_index.map(&block)
123
+ end
124
+
125
+
126
+
127
+
128
+ # mapreduce
129
+ def sum(identity=0, &b) foldl(:+, &b) || identity end
130
+
131
+ # fastering activesupport's method
132
+ def group_by(&b) count(:group, &b) end
133
+
134
+ end
@@ -0,0 +1,33 @@
1
+ require_with_path 'enumerable/array'
2
+
3
+ unless defined? RMTools::Iterators
4
+
5
+ # [1, 2, 3].to_ss # => ['1', '2', '3']
6
+ # [[1,2,3], [4,5,6], [7,8,9]].to_sss
7
+ # => [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"]]
8
+ # [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"]].subss!(/\d+/) {|m| (m.to_i % 3).to_s}
9
+ # => [["1", "2", "0"], ["1", "2", "0"], ["1", "2", "0"]]
10
+ # [[1, 2, 0], [1, 2, 0], [1, 2, 0]].sum_zeros?
11
+ # => [false, false, true, false, false, true, false, false, true]
12
+ # [[1, 2, 3], [3, 4, 6], [3, 8, 0]].uniq_by_odds?
13
+ # => [[1, 2, 3], [3, 4, 6]]
14
+ class Array
15
+ alias :throw_no :method_missing
16
+ RMTools::Iterators = %r{(#{(%w{select reject partition find_all find sum foldr min max}+instance_methods.grep(/_by$/))*'|'})_([\w\d\_]+[!?]?)}
17
+
18
+ def method_missing(method, *args, &block)
19
+ if match = (meth = method.to_s).match(RMTools::Iterators)
20
+ iterator, meth = match[1..2]
21
+ meth = meth.to_sym
22
+ return send(iterator) {|i| i.__send__ meth, *args, &block}
23
+ elsif meth.sub!(/sses([!?]?)$/, 'ss\1') or meth.sub!(/ies([!?]?)$/, 'y\1') or meth.sub!(/s([!?]?)$/, '\1')
24
+ return map {|i| i.__send__ meth.to_sym, *args, &block}
25
+ else
26
+ throw_no method
27
+ end
28
+ rescue NoMethodError
29
+ throw_no method
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,49 @@
1
+ require 'set'
2
+
3
+ module Enumerable
4
+
5
+ def import(arr, index)
6
+ self[index] = arr[index]
7
+ end
8
+
9
+ def export(arr, index)
10
+ arr[index] = self[index]
11
+ end
12
+
13
+ def xprod(obj, inverse=false)
14
+ obj = obj.to_a if obj.is_a? Set
15
+ obj = [obj] unless obj.is_a? Array
16
+ inverse ? obj.to_a.product(self) : product(obj)
17
+ end
18
+
19
+ def recursive_find(&b)
20
+ res = nil
21
+ to_a.each {|e|
22
+ return e if b[e]
23
+ if e.resto :recursive_find and res = e.recursive_find(&b)
24
+ return res
25
+ end
26
+ }
27
+ res
28
+ end
29
+
30
+ def recursive_find_all(&b)
31
+ res = []
32
+ to_a.each {|e|
33
+ res << e if b[e]
34
+ if e.resto :recursive_find
35
+ res.concat e.recursive_find_all(&b)
36
+ end
37
+ }
38
+ res.uniq
39
+ end
40
+
41
+ def present
42
+ to_a.present
43
+ end
44
+
45
+ def +(array)
46
+ to_a + array.to_a
47
+ end
48
+
49
+ end
@@ -1,15 +1,11 @@
1
- # encoding: utf-8
2
1
  class Hash
2
+ alias :>> :reverse_merge!
3
3
 
4
4
  def +(other_hash)
5
5
  merge(other_hash || {})
6
6
  end
7
7
 
8
- def concat(other_hash)
9
- merge!(other_hash || {})
10
- end
11
-
12
- def unify_strs
8
+ def unify_keys
13
9
  each {|k, v|
14
10
  if k.is String
15
11
  sk = k.to_sym
@@ -21,9 +17,13 @@ class Hash
21
17
  }
22
18
  end
23
19
 
24
- def max; [(m = keys.max), self[m]] end
20
+ def max_by_key; [(m = keys.max), self[m]] end
21
+
22
+ def min_by_key; [(m = keys.min), self[m]] end
23
+
24
+ def max_by_value; [(m = values.max), self[m]] end
25
25
 
26
- def min; [(m = keys.min), self[m]] end
26
+ def min_by_value; [(m = values.min), self[m]] end
27
27
 
28
28
  # should be overriden by extension maps
29
29
  def map2
@@ -0,0 +1,19 @@
1
+ require_with_path 'enumerable/common'
2
+
3
+ module ObjectSpace
4
+ extend Enumerable
5
+
6
+ def self.each(&b) each_object(&b) end
7
+
8
+ def self.size; each_object {} end
9
+
10
+ def self.find(id=nil)
11
+ if id
12
+ find {|obj| obj.object_id == id}
13
+ else
14
+ each_object {|obj| return obj if yield obj}
15
+ nil
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,201 @@
1
+ # encoding: utf-8
2
+ unless defined? Inf
3
+ Inf = 1.0/0
4
+ end
5
+
6
+ class Range
7
+
8
+ def &(range)
9
+ return range&self if range.is XRange
10
+ beg = [self.begin, range.begin].max
11
+ end_ = [self.include_end.end, range.include_end.end].min
12
+ beg > end_ ? nil : beg..end_
13
+ end
14
+
15
+ def |(range)
16
+ return range|self if range.is XRange
17
+ range = range.include_end
18
+ self_ = self.include_end
19
+ return XRange.new self, range if !x?(range)
20
+ [self.begin, range.begin].min..[self_.end, range.end].max
21
+ end
22
+
23
+ def -@
24
+ XRange(-Inf..self.begin-1, include_end.end+1..Inf)
25
+ end
26
+
27
+ def -(range)
28
+ self & -range
29
+ end
30
+
31
+ def x?(range)
32
+ range_end = range.include_end.end
33
+ self_end = self.include_end.end
34
+ if self_end < range_end
35
+ self_end >= range.begin - (self_end.kinda Integer and range.begin.kinda Integer).to_i
36
+ else
37
+ range_end >= self.begin - (self.begin.kinda Integer and range_end.kinda Integer).to_i
38
+ end
39
+ end
40
+
41
+ def <=>(range)
42
+ (self.begin <=> range.begin).b || self.include_end.end <=> range.include_end.end
43
+ end
44
+
45
+ def include_end()
46
+ exclude_end? ? self.begin..(self.end - 1) : self
47
+ end
48
+
49
+ def center()
50
+ (first + last + (!exclude_end?).to_i)/2
51
+ end
52
+
53
+ def part(i, j)
54
+ first + (i-1)*size/j .. first - 1 + i*size/j unless i < 1 or j < 1 or j < i
55
+ end
56
+
57
+ def size()
58
+ last - first + (!exclude_end?).to_i
59
+ end
60
+
61
+ def div(n)
62
+ unless n < 1
63
+ rarray = []
64
+ j = self.begin
65
+ iend = include_end.end
66
+ rarray << (j..(j+=n)-1) until j+n > iend
67
+ rarray << (j..iend)
68
+ end
69
+ end
70
+
71
+ def /(i)
72
+ part 1, i
73
+ end
74
+
75
+ def >>(i)
76
+ self.begin + i .. include_end.end + i
77
+ end
78
+
79
+ def <<(i)
80
+ self.begin - i .. include_end.end - i
81
+ end
82
+
83
+ def of(ary)
84
+ ary[self]
85
+ end
86
+
87
+ def odds
88
+ select {|i| i%2 != 0}
89
+ end
90
+
91
+ def evens
92
+ select {|i| i%2 == 0}
93
+ end
94
+
95
+ end
96
+
97
+ class XRange
98
+ attr_accessor :ranges
99
+ __init__
100
+
101
+ def initialize *args
102
+ if (str = args[0]).is String
103
+ str.scan(/([&|v\^])?((-?\d+)\.\.(\.)?(-?\d+))/).each {|s|
104
+ s[2], s[4] = s[2].to_i, s[4].to_i
105
+ r = s[3] ? s[2]..s[4]-1 : s[2]..s[4]
106
+ @ranges = case s[0]
107
+ when '&', '^'; intersect r
108
+ when '|', 'v'; union r
109
+ else [r]
110
+ end
111
+ }
112
+ @ranges.sort!
113
+ else
114
+ 0.upto(args.sort!.size-2) {|i| args[i,2] = [nil, args[i]|args[i+1]] if args[i].x? args[i+1]}
115
+ @ranges = args.compact.include_ends
116
+ end
117
+ end
118
+
119
+ def &(range)
120
+ if range.is Range
121
+ XRange.new *intersect(range)
122
+ else
123
+ @ranges.map {|r| range & r}.foldl(:|)
124
+ end
125
+ end
126
+
127
+ def |(range)
128
+ if range.is Range
129
+ XRange.new *union(range)
130
+ else
131
+ @ranges.each {|r| range |= r}
132
+ range
133
+ end
134
+ end
135
+
136
+ def -@
137
+ @ranges.map {|r| -r}.foldl(:&)
138
+ end
139
+
140
+ def -(range)
141
+ self & -range
142
+ end
143
+
144
+ private
145
+
146
+ def intersect(range)
147
+ @ranges.map {|r| r&range}.compact
148
+ end
149
+
150
+ def union(range)
151
+ changed = (rs = @ranges.map {|r| (r.x?range) ? r|range : r}) != @ranges
152
+ changed ? rs : rs << range
153
+ end
154
+
155
+ include Enumerable
156
+
157
+ public
158
+ def each(&b)
159
+ @ranges.each {|r| r.each &b}
160
+ end
161
+
162
+ def of(ary)
163
+ @ranges.foldl(:+) {|r| ary[r]}
164
+ end
165
+
166
+ def empty?
167
+ @range.empty?
168
+ end
169
+
170
+ def include?(number_or_range)
171
+ @ranges.find_include?(number_or_range)
172
+ end
173
+
174
+ def size
175
+ @ranges.sum_size
176
+ end
177
+
178
+ def div(n)
179
+ unless n < 1
180
+ i = 0
181
+ rarray = []
182
+ j = @ranges[0].begin
183
+ while range = @ranges[i]
184
+ if j+n > range.end
185
+ rarray << (j..range.end)
186
+ i += 1
187
+ j = @ranges[i].begin if @ranges[i]
188
+ else
189
+ rarray << (j..(j+=n)-1)
190
+ end
191
+ end
192
+ rarray
193
+ end
194
+ end
195
+
196
+ def inspect
197
+ "XRange(#{@ranges.join(', ').gsub('Infinity', '∞')})"
198
+ end
199
+
200
+ end
201
+
@@ -0,0 +1 @@
1
+ require_with_path __FILE__, '*'
@@ -0,0 +1,12 @@
1
+ class BlackHole
2
+
3
+ # abc = BlackHole.new
4
+ # (abc.first.get {|_| !_}.something << 'blah blah')[123].raise!
5
+ # => #<BlackHole:0xb66367b0>
6
+ #
7
+ # Think twice before use it. It may devour your code!
8
+ def method_missing *args
9
+ BlackHole.new
10
+ end
11
+
12
+ end
@@ -0,0 +1,36 @@
1
+ require_with_path 'console/coloring'
2
+
3
+ class Object
4
+ # class Klass
5
+ # def old_method *argv
6
+ # deprecation :new_method, *argv
7
+ # end
8
+ # end
9
+ # Klass.new.old_method
10
+ # gives:
11
+ # DEPRECATION from /path/to/libs/lib.rb: Klass#old_method is deprecated. Use #new_method instead.
12
+ # => <new_method(*argv) result>
13
+ #
14
+ # Same shit:
15
+ # class Klass
16
+ # deprecate :old_method, :new_method
17
+ # end
18
+ def deprecation message="", *argv
19
+ caler = caller[0].parse(:caller)
20
+ sym = nil
21
+ if message.is Symbol
22
+ sym, message = message, "Use ##{message} instead."
23
+ end
24
+ STDERR.puts "#{RMTools::Painter.red 'DEPRECATION'} from #{RMTools::Painter.gray caler.path}: #{self.class}##{caler.func} is deprecated. #{message.capitalize}" if caler
25
+ __send__ sym, *argv if sym
26
+ end
27
+
28
+ end
29
+
30
+ class Class
31
+
32
+ def deprecate old_method, new_method
33
+ define_method(new_method) {|*argv| deprecation old_method, *argv}
34
+ end
35
+
36
+ end
@@ -0,0 +1,28 @@
1
+ class Array
2
+
3
+ def dump(depth=5)
4
+ res = "[ "
5
+ res << map_with_index {|j, i|
6
+ j = 'nil' if j.nil?
7
+ "%0*d: %s、"%[i, (size-1).to_s.size, dump_recurse(j,0,depth)]
8
+ }*"\n "
9
+ res << "]\n"
10
+ end
11
+
12
+ end
13
+
14
+ class Hash
15
+
16
+ def dump(depth=5)
17
+ res = "{ "
18
+ res << map {|i, j|
19
+ i = 'nil' if i.nil?
20
+ j = 'nil' if j.nil?
21
+ "%0*s => %s、\n"%[i, keys.to_ss.max, dump_recurse(j,0,depth)]
22
+ }*"\n "
23
+ res << "}\n"
24
+ end
25
+
26
+ end
27
+
28
+
@@ -1,4 +1,18 @@
1
- # encoding: utf-8
1
+ class Float
2
+
3
+ def partial(range=100)
4
+ return to_i.to_s if to_i == self
5
+ a = abs
6
+ (2..range-1).each {|i| (1..range).each {|j|
7
+ n = j.to_f/i
8
+ break if n > a
9
+ return "#{'-' if self != a}#{j}/#{i}" if n == a
10
+ } }
11
+ self
12
+ end
13
+
14
+ end
15
+
2
16
  class Integer
3
17
 
4
18
  def digits
@@ -10,22 +24,10 @@ class Integer
10
24
  nums
11
25
  end
12
26
 
13
- def mult_of(subj) # allready implemented in ActiveSupport though
14
- self%subj == 0
15
- end
16
-
17
27
  def each_bit # descending order
18
28
  to_s(2).each_byte {|b| yield(b == 49)}
19
29
  end
20
30
 
21
- def blur_bm
22
- to_s(2).gsub(/.?1.?/) {|m| m.size==3?'111':'11'}.to_i(2)
23
- end
24
-
25
- def hex
26
- sprintf "%x", self
27
- end
28
-
29
31
  def to_array(base=10)
30
32
  int = self
31
33
  ary = []
@@ -36,47 +38,16 @@ class Integer
36
38
  end while int != 0
37
39
  ary.reverse!
38
40
  end
39
-
41
+
40
42
  end
41
43
 
42
- class Numeric
43
-
44
- def ceil_to(i)
45
- self + i - self%i
46
- end
44
+ class Array
47
45
 
48
- def floor_to(i)
49
- self - self%i
46
+ def compile_int(base=10)
47
+ int = 0
48
+ pos = size
49
+ each {|i| int += base**(pos -= 1) * i}
50
+ int
50
51
  end
51
52
 
52
- def round_to(i)
53
- [ceil_to(i), floor_to(i)].max
54
- end
55
-
56
- def between(min, max)
57
- min < self and self < max
58
- end
59
-
60
- end
61
-
62
- class Float
63
-
64
- def partial(range=100)
65
- return to_i.to_s if to_i == self
66
- a = abs
67
- (2..range-1).each {|i| (1..range).each {|j|
68
- n = j.to_f/i
69
- break if n > a
70
- return "#{'-' if self != a}#{j}/#{i}" if n == a
71
- } }
72
- self
73
- end
74
-
75
- end
76
-
77
- module Math
78
-
79
- def logb(b, x) log(x)/log(b) end
80
-
81
53
  end
82
-
@@ -0,0 +1,29 @@
1
+ module RMTools
2
+ def highlighted_line_html file, line
3
+ if File.file?(file)
4
+ " >> <a style=\"color:#0A0; text-decoration: none;\"#{
5
+ " href=\"http://#{
6
+ defined?(DEBUG_SERVER) ? DEBUG_SERVER : 'localhost:8888'
7
+ }/code/#{CGI.escape CGI.escape(file).gsub('.', '%2E')}/#{line}\""
8
+ }>#{read_lines(file, line.to_i).chop}</a>"
9
+ end
10
+ end
11
+
12
+ def format_trace_html a
13
+ bt, calls, i = [], [], 0
14
+ m = a[0].match(/^(.+):(\d+)(?::in `([^']+)')?$/)
15
+ while i < a.size
16
+ m2 = a[i+1] && a[i+1].match(/^(.+):(\d+)(?::in `([^']+)')?$/)
17
+ if m and m[3] and m2 and m[1..2] == m2[1..2]
18
+ calls.unshift " <- `#{m[3]}'"
19
+ elsif m and m[1] !~ /\.gemspec$/ and line = highlighted_line_html(*m[1..2])
20
+ bt << "#{a[i]}#{calls.join}\n#{line}"
21
+ calls = []
22
+ else bt << a[i]
23
+ end
24
+ i += 1
25
+ m = m2
26
+ end
27
+ bt
28
+ end
29
+ end