rdoba 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +7 -7
  2. data/.gitignore +4 -0
  3. data/.travis.yml +28 -0
  4. data/CHANGES.md +6 -0
  5. data/Gemfile +5 -0
  6. data/README.md +75 -90
  7. data/Rakefile +61 -55
  8. data/TODO +6 -0
  9. data/features/log.feature +100 -29
  10. data/features/mixin.feature +85 -0
  11. data/features/step_definitions/log_steps.rb +58 -22
  12. data/features/step_definitions/mixin_steps.rb +266 -0
  13. data/features/support/env.rb +48 -24
  14. data/features/support/fulltest_as_log.rb.in +143 -0
  15. data/features/support/fulltest_as_self.rb.in +144 -0
  16. data/features/support/mixin_support.rb +13 -0
  17. data/html/.keep +0 -0
  18. data/html/created.rid +28 -0
  19. data/html/css/fonts.css +167 -0
  20. data/html/css/rdoc.css +590 -0
  21. data/html/fonts/Lato-Light.ttf +0 -0
  22. data/html/fonts/Lato-LightItalic.ttf +0 -0
  23. data/html/fonts/Lato-Regular.ttf +0 -0
  24. data/html/fonts/Lato-RegularItalic.ttf +0 -0
  25. data/html/fonts/SourceCodePro-Bold.ttf +0 -0
  26. data/html/fonts/SourceCodePro-Regular.ttf +0 -0
  27. data/html/images/add.png +0 -0
  28. data/html/images/arrow_up.png +0 -0
  29. data/html/images/brick.png +0 -0
  30. data/html/images/brick_link.png +0 -0
  31. data/html/images/bug.png +0 -0
  32. data/html/images/bullet_black.png +0 -0
  33. data/html/images/bullet_toggle_minus.png +0 -0
  34. data/html/images/bullet_toggle_plus.png +0 -0
  35. data/html/images/date.png +0 -0
  36. data/html/images/delete.png +0 -0
  37. data/html/images/find.png +0 -0
  38. data/html/images/loadingAnimation.gif +0 -0
  39. data/html/images/macFFBgHack.png +0 -0
  40. data/html/images/package.png +0 -0
  41. data/html/images/page_green.png +0 -0
  42. data/html/images/page_white_text.png +0 -0
  43. data/html/images/page_white_width.png +0 -0
  44. data/html/images/plugin.png +0 -0
  45. data/html/images/ruby.png +0 -0
  46. data/html/images/tag_blue.png +0 -0
  47. data/html/images/tag_green.png +0 -0
  48. data/html/images/transparent.png +0 -0
  49. data/html/images/wrench.png +0 -0
  50. data/html/images/wrench_orange.png +0 -0
  51. data/html/images/zoom.png +0 -0
  52. data/html/js/darkfish.js +161 -0
  53. data/html/js/jquery.js +4 -0
  54. data/html/js/navigation.js +142 -0
  55. data/html/js/navigation.js.gz +0 -0
  56. data/html/js/search.js +109 -0
  57. data/html/js/search_index.js +1 -0
  58. data/html/js/search_index.js.gz +0 -0
  59. data/html/js/searcher.js +228 -0
  60. data/html/js/searcher.js.gz +0 -0
  61. data/lib/rdoba/_version_.rb +1 -1
  62. data/lib/rdoba/common.rb +0 -15
  63. data/lib/rdoba/debug.rb +5 -1
  64. data/lib/rdoba/log.rb +360 -189
  65. data/lib/rdoba/merge.rb +21 -0
  66. data/lib/rdoba/mixin/time.rb +11 -0
  67. data/lib/rdoba/mixin/try.rb +6 -0
  68. data/lib/rdoba/mixin/try_1_9_0.rb +4 -0
  69. data/lib/rdoba/mixin/wait_if.rb +21 -0
  70. data/lib/rdoba/mixin.rb +270 -6
  71. data/lib/rdoba/strings.rb +4 -141
  72. data/lib/rdoba.rb +13 -19
  73. data/rdoba.gemspec +30 -24
  74. data/tddium.yml +11 -0
  75. metadata +260 -65
  76. data/features/bcd.feature +0 -29
  77. data/features/step_definitions/bcd_steps.rb +0 -69
  78. data/test/helper.rb +0 -18
  79. data/test/rdoba_test.rb.stub +0 -59
  80. data/test/test_rdoba.rb +0 -7
data/lib/rdoba/log.rb CHANGED
@@ -1,167 +1,368 @@
1
1
  # encoding: utf-8
2
2
 
3
- module Rdoba
4
- def self.log options = {}
5
- # options: {
6
- # :as - name of method to apply the log functions, default: self
7
- # :in - name of class or namespace to implement to the log, default: Kernel
8
- # :functions = [
9
- # :basic
10
- # :warn
11
- # :info
12
- # :enter
13
- # :leave
14
- # :extended
15
- # :compat - enable old style log strings dbgXX
16
- # ]
17
- # :prefix = [
18
- # :timestamp
19
- # :pid
20
- # :function_name
21
- # :function_line
22
- # ]
23
- # :io - An IO object to send log output to, default is $stdout
24
- # }
25
- # if empty the default value (enter, leave) is applied
26
- # format of log message is the following:
27
- # [<timestamp>]{pid}(<function name>)<log type> <debug text>"
28
- # TODO add enum of options hash to convert values to symbols
29
- # TODO make common format, and format for each of methods >, >>, +, -, %, *
30
- # TODO add syntax redefinition ability for the methods >, >>, +, -, %, *
31
- # TODO add multiple output (to more than only the IO)
32
-
33
- # options[ :io ] = File.new('txt.log','w+')
34
- # STDERR.puts options.inspect
35
- # STDERR.puts options[ :io ].method( :puts ).inspect
36
- # options.map
37
- funcname = ( options[ :as ] || :self ).to_s.to_sym
38
- pfx = ';if true;(Rdoba::Log::log @@rdoba_log_io_method,"' #TODO remove if
39
- io = options[ :io ] || $stdout
40
- io_m = io.method :puts
41
- if prefix = ( options[ :prefix ].is_a?( Array ) && options[ :prefix ] ||
42
- [ options[ :prefix ] ] )
43
- if prefix.include?( :timestamp )
44
- pfx << '[#{Time.now.strftime( "%H:%M:%S.%N" )}]'; end
45
- if prefix.include?( :pid )
46
- pfx << '{#{Process.pid}}'; end
47
- if prefix.include?( :function_name )
48
- if prefix.include?( :function_line )
49
- pfx << '(#{m,f,l=get_stack_function_data_at_level(2);f+":"+l})'
50
- else
51
- pfx << '(#{get_stack_function_data_at_level(2)[1]})'; end ; end ; end
52
-
53
- target = options[ :in ] || Kernel
54
- # STDERR.puts "self: #{self.to_s}"
55
- # STDERR.puts "funcname: #{funcname.inspect}"
56
- # STDERR.puts "target: #{target.inspect}"
57
-
58
- initfunc = Proc.new do
59
- self.class_variable_set :@@rdoba_log_prefix, pfx
60
- self.class_variable_set :@@rdoba_log_io_method, io_m
61
- extend Rdoba::Log::ClassFunctions
62
- include Rdoba::Log::Functions
63
- self <= options[ :functions ] ; end
64
-
65
- if funcname == :self
66
- if target.to_s != 'main'
67
- # CASE: class Cls; def method; self > end; end
68
- target.instance_eval &initfunc ; end
69
- # CASE: main { self > }
70
- # CASE: class Cls; self > end
71
- target.class.instance_eval &initfunc
72
- else
73
- host = ( target.to_s == 'main' && Kernel || target ) ## TODO check and remove
74
- if target.to_s != 'main'
75
- # CASE: class Cls; log > end
76
- target.class.class_eval "class RdobaDebug;end"
77
- target.class.send :class_eval, "def #{funcname};@#{funcname}||=RdobaDebug.new;end"
78
- target.class::RdobaDebug.class_eval &initfunc ; end
79
- # CASE: main { log > }
80
- # CASE: class Cls; def method; log > end; end
81
- host.class_eval "class RdobaDebug;end"
82
- host.send :class_eval, "def #{funcname};@#{funcname}||=RdobaDebug.new;end"
83
- host::RdobaDebug.class_eval &initfunc ; end
84
-
85
- # STDERR.puts 2
86
- # STDERR.puts target.inspect
87
- # STDERR.puts target.class.methods.sort.inspect
88
- =begin
89
- target.class.instance_eval do # main { self > }
90
- # target.class_eval do # main { log > }
91
- self.class_variable_set( :@@log_prefix, pfx )
92
- self.class_variable_set( :@@log_io_method, io_m )
93
- extend Rdoba::Log::ClassFunctions
94
- include Rdoba::Log::Functions
95
- STDERR.puts pfx
96
- STDERR.puts io_m.inspect
97
- self <= functions; end;
98
- =end
99
- end; end
3
+ # Author:: Malo Skrylevo <majioa@yandex.ru>
4
+ # License:: MIT
5
+ #
6
+ # TODO add enum of options hash to convert values to symbols
7
+ # TODO make common format, and format for each of methods >, >>, +, -, %, *
8
+ # TODO add syntax redefinition ability for the methods >, >>, +, -, %, *
9
+ # TODO add multiple output (to more than only the IO)
100
10
 
101
11
  module Rdoba
102
- module Log
103
- class Error < StandardError
104
- def initialize options = {}
105
- case options
106
- when :compat
107
- "Debug compatibility mode can't be enabled for " +
108
- "the specified object"
109
- when :main
110
- "An :as option can't be default or set to 'self' value for " +
111
- "a main application. Please set up it correctly"; end; end; end
112
-
113
- module Functions
114
- def <= functions = []
115
- self.class <= functions; end
116
-
117
- def >= functions = []
118
- self.class >= functions; end
119
-
120
- def e *args
121
- io = case args.last
122
- when IO
12
+
13
+ ##
14
+ # Adds a Log instance to the specified object as a variable or directly into
15
+ # the object itself. It returns the rdoba logger object.
16
+ #
17
+ # The argument accepted are only +options+ as a Hash of keys and values.
18
+ #
19
+ # The options keys are accepted the following: +as+, +in+, +functions+,
20
+ # +prefix+, and +io+.
21
+ #
22
+ # Option +functions+ defines the function list that can be used in it.
23
+ # Undeclared in the list functions just do nothing. It should be provided
24
+ # as an Array of function descriptions of String or Symbol class. The
25
+ # function list is the following: +info+, +warn+, +basic+, +extended+,
26
+ # +leave+, +enter+, +compat+. If omitted it is defaulting to +enter+, and
27
+ # +leave+ functions.
28
+ #
29
+ # The function +info+ provides just info along the code, of course it just
30
+ # can be shewn by +puts+, but it also can be disabled by settings. The call
31
+ # method is :*. Example:
32
+ #
33
+ # class A
34
+ # rdoba :log => { :functions => [ :info ] }
35
+ # def a
36
+ # log * "Some Info"
37
+ # end
38
+ # end
39
+ #
40
+ # The function +warn+ provide justs warn message along the code, of course
41
+ # it just can be shewn by +puts+, or +p+, but it also can be disabled by
42
+ # settings. The call method is :%. Example:
43
+ #
44
+ # class A
45
+ # rdoba :log => { :functions => [ :warn ] }
46
+ # def a
47
+ # log % "Some Info"
48
+ # end
49
+ # end
50
+ #
51
+ # The function +basic+ provides just basic debug message, it also can be
52
+ # disabled by settings. The call method is :>. Example:
53
+ #
54
+ # class A
55
+ # rdoba :log => { :functions => [ :basic ] }
56
+ # def a
57
+ # v = 123434
58
+ # log > { :v => v }
59
+ # end
60
+ # end
61
+ #
62
+ # The function +extended+ provides extended debug message, class inspect
63
+ # dumps can be used for messages of this function, it also can be
64
+ # disabled by settings. The call method is :>>. Example:
65
+ #
66
+ # class A
67
+ # rdoba :log => { :functions => [ :extended ] }
68
+ # def a
69
+ # v = ObjectSpace.new
70
+ # vv = Object.new
71
+ # log >> { :v => v, :vv => vv }
72
+ # end
73
+ # end
74
+ #
75
+ # The function +enter+ provides just debug message on function entry, it
76
+ # also can be disabled by settings. The call method is :+. Example:
77
+ #
78
+ # class A
79
+ # rdoba :log => { :functions => [ :enter ] }
80
+ # def a *args
81
+ # log + { :args => args }
82
+ # end
83
+ # end
84
+ #
85
+ # The function +leave+ provides just debug message on function leave, it
86
+ # also can be disabled by settings. It accepts the just a argument, also
87
+ # returns the provided argument, so it can be used in chain. The call
88
+ # method is :-. Example:
89
+ #
90
+ # class A
91
+ # rdoba :log => { :functions => [ :leave ] }
92
+ # def a
93
+ # log - 1
94
+ # end
95
+ # end
96
+ #
97
+ # A.new.a # >> 1
98
+ #
99
+ # The function +compat+ provides old style log strings dbgXX just for
100
+ # compatibility, and will be removed.
101
+ #
102
+ # Option +prefix+ defines the prefix that will be shewn before the message
103
+ # text. The following prefix features are available: +timestamp+, +pid+,
104
+ # +function_name+, +function_line+, +function+. The full format is the
105
+ # following:
106
+ #
107
+ # [<timestamp>]{pid}(<function module>:<function name>.<function line>)
108
+ # <log type> <text>
109
+ #
110
+ # Here is the function module, function name, function line represents
111
+ # +function+ at whole.
112
+ #
113
+ # The log types are of the functions previously described, and can be:
114
+ # >, >>, ***, %%%, +++, ---.
115
+ #
116
+ # Option +io+ defines the IO to output the debug message to. It must
117
+ # contain all IO methods required. It is defaulting to $stdout. Also
118
+ # StringIO object is allowed.
119
+ #
120
+ # class A
121
+ # rdoba :log => { :io => $stderr }
122
+ # def a
123
+ # log - 1
124
+ # end
125
+ # end
126
+ #
127
+ # Option +as+ defines the name of a method to apply the log functions to.
128
+ # It is defaulting to :log, but when you've specified :self the log functions
129
+ # is being embedded into the caller class instance directly.
130
+ # It should be provided as a Symbol or String. Example:
131
+ #
132
+ # class A
133
+ # rdoba :log => { :as => :self, :functions => [ :basic ] }
134
+ # def a
135
+ # self > "Debug"
136
+ # end
137
+ # end
138
+ #
139
+ # Option +in+ defines the name of a target class or a namespace to log
140
+ # implement to. For toplevel it is defaulting to Kernel namespace, for
141
+ # in-class is defaulting to the self class. It should be provided as a
142
+ # constant of the class/module. Example:
143
+ #
144
+ # class A
145
+ # def a
146
+ # self > "Debug"
147
+ # end
148
+ # end
149
+ #
150
+ # rdoba :log => { :in => A, :functions => [ :basic ] }
151
+ #
152
+ # To compeletly disable the debug messages for the specific class
153
+ # you can use either the RDOBA_LOG environment variable:
154
+ #
155
+ # $ RDOBA_LOG=0
156
+ #
157
+ # or redeclare the function list for the specific class to empty.
158
+ #
159
+ # rdoba :log => { :in => MyClass, :functions => [] }
160
+ #
161
+ def self.log options = {}
162
+ Rdoba::Log.class_variable_set :@@options, options
163
+
164
+ functions = [ options[ :functions ] ].flatten
165
+ funcname = ( options[ :as ] ||= :log ).to_s.to_sym
166
+ target = options[ :in ] || options[ :self ]
167
+
168
+ if target.class == Object
169
+ Rdoba::Log.log_instance_setup( TOPLEVEL_BINDING.eval 'self' )
170
+ else
171
+ Rdoba::Log.log_class_setup target ; end
172
+
173
+ if funcname == :self
174
+ Rdoba::Log.define_methods( target,
175
+ [ :+, :-, :>, :>>, :*, :%, :>=, :<= ] )
176
+
177
+ Rdoba::Log.try_define_compat( functions, target )
178
+ target.__rdoba_log__
179
+ else
180
+ if target.class == Object
181
+ Rdoba::Log.log_link_for :instance, target, funcname
182
+ else
183
+ Rdoba::Log.log_link_for :class, target, funcname ; end ; end ; end
184
+
185
+ module Log
186
+ @@enabled = !( ENV[ "RDOBA_LOG" ].to_s !~ /^(true|1|)$/ )
187
+
188
+ def self.enabled?
189
+ @@enabled ; end
190
+
191
+ class Error < StandardError
192
+ def initialize options = {}
193
+ case options
194
+ when :compat
195
+ "Debug compatibility mode can't be enabled for " +
196
+ "the specified object"
197
+ when :main
198
+ "An :as option can't be default or set to 'self' value for " +
199
+ "a main application. Please set up it correctly" ; end ; end ; end
200
+
201
+ module DebugCompat # TODO compat
202
+ def dbgl
203
+ @dbgl; end
204
+
205
+ def dbgl= level
206
+ @dbgl = level; end
207
+
208
+ def dbc level
209
+ level = level.to_i
210
+ if level > 0
211
+ clevel = @dbgl || begin
212
+ eval "$dbgl_#{self.class}"
213
+ rescue
214
+ nil; end
215
+ clevel || ( clevel.to_i & level ) == level
216
+ else
217
+ false; end; end
218
+
219
+ def dbp level, text
220
+ if dbc level
221
+ Kernel.puts text; end; end
222
+
223
+ def dbg level, code, vars = {}
224
+ if dbc level
225
+ if vars
226
+ vars.each_pair do |var, value|
227
+ instance_variable_set( var, value ); end; end
228
+ eval code; end; end; end
229
+
230
+ module Functions
231
+ include Rdoba::Log::DebugCompat
232
+
233
+ def <= functions = []
234
+ self.class <= functions; end
235
+
236
+ def >= functions = []
237
+ self.class >= functions; end
238
+
239
+ def e *args
240
+ io =
241
+ case args.last
242
+ when IO
123
243
  args.pop
124
- else
244
+ else
125
245
  $stderr ; end
126
- e = $! || args.shift
127
- dump = ( [ $@ || args.shift ] + args ).flatten.compact
128
- io.send :puts, "#{e.class}:%> #{e}\n\t#{dump.join("\n\t")}"; end
129
-
130
- def get_stack_function_data_at_level( level )
131
- raise Exception
132
- rescue Exception
133
- #TODO check match a method containing '`'
134
- $@[ level ] =~ /([^\/]+):(\d+):in `(.*?)'$/
135
- [ $1, $3, $2 ]; end; end
136
-
137
- module ClassFunctions
138
- def <= functions
139
- functions = Rdoba::Log::update_functions functions, self, :+
140
- pfx = self.class_variable_get :@@rdoba_log_prefix
141
- code = Rdoba::Log::make_code functions, pfx, self
142
- self.class_eval code; end
143
-
144
- def >= functions # TODO make check for instance log, not only for class
145
- functions = Rdoba::Log::update_functions functions, self, :-
146
- pfx = self.class_variable_get :@@rdoba_log_prefix
147
- code = Rdoba::Log::make_code functions, pfx, self
148
- self.class_eval code; end; end
149
-
150
- def self.update_functions functions, obj, method
151
- if functions.is_a?( Array ) && functions.include?( :* )
152
- functions = [ :basic, :enter, :leave, :warn, :info, :extended, :compat ]
153
- end
154
- cf = begin
155
- obj.class_variable_get :@@rdoba_log_functions
156
- rescue NameError
157
- [] ; end
158
- functions = cf.send( method, functions.is_a?( Array ) && functions ||
159
- functions.is_a?( NilClass) && [] || [ functions.to_s.to_sym ] )
160
- obj.class_variable_set :@@rdoba_log_functions, functions
161
- functions
162
- end
163
-
164
- def self.make_code functions, pfx, obj
246
+ e = $! || args.shift
247
+ dump = ( [ $@ || args.shift ] + args ).flatten.compact
248
+ io.send :puts, "#{e.class}:%> #{e}\n\t#{dump.join("\n\t")}"; end
249
+
250
+ def get_stack_function_data_at_level( level )
251
+ raise Exception
252
+ rescue Exception
253
+ #TODO check match a method containing '`'
254
+ $@[ level ] =~ /([^\/]+):(\d+):in `(.*?)'$/
255
+ [ $1, $3, $2 ]; end; end
256
+
257
+ module ClassFunctions
258
+ def <= functions
259
+ Rdoba::Log::update_functions functions, self, :+ ; end
260
+
261
+ def >= functions
262
+ Rdoba::Log::update_functions functions, self, :- ; end; end
263
+
264
+ Initfunc = proc do
265
+ self.class_variable_set :@@rdoba_log_prefix,
266
+ Rdoba::Log.log_init_prefix( self )
267
+ self.class_variable_set :@@rdoba_log_io_method,
268
+ Rdoba::Log.log_init_io_m
269
+ extend Rdoba::Log::ClassFunctions
270
+ include Rdoba::Log::Functions
271
+ self <= Rdoba::Log.class_variable_get( :@@options )[ :functions ]; end
272
+
273
+ def self.log_init_prefix obj, is_self = false
274
+ options = Rdoba::Log.class_variable_get :@@options
275
+ pfx = ';if Rdoba::Log.enabled?;(Rdoba::Log::log @@rdoba_log_io_method,"'
276
+ if prefix = ( options[ :prefix ].is_a?( Array ) && options[ :prefix ] ||
277
+ [ options[ :prefix ] ] )
278
+ if prefix.include?( :timestamp )
279
+ pfx << '[#{Time.now.strftime( "%H:%M:%S.%N" )}]'; end
280
+ if prefix.include?( :pid )
281
+ pfx << '{#{Process.pid}}'; end
282
+ if prefix.include?( :function )
283
+ pfx << '(#{m,f,l=get_stack_function_data_at_level(2);m}:#{f}.#{l})'
284
+ elsif prefix.include?( :function_name )
285
+ if prefix.include?( :function_line )
286
+ pfx << '(#{_,f,l=get_stack_function_data_at_level(2);f}.#{l})'
287
+ else
288
+ pfx << '(#{get_stack_function_data_at_level(2)[1]})'
289
+ end ; end ; end
290
+ pfx ; end
291
+
292
+ def self.log_init_io_m options = {}
293
+ options = Rdoba::Log.class_variable_get :@@options
294
+ io = options[ :io ] || $stdout
295
+ # TODO puts costomize
296
+ io_m = io.method :puts ; end
297
+
298
+ def self.log_class_setup obj
299
+ obj.class_eval "class RdobaLog;end"
300
+ obj.class_eval "def __rdoba_log__;@__rdoba_log__||=RdobaLog.new;end"
301
+ obj.class_eval "class << self; def self.__rdoba_log__;
302
+ @__rdoba_log__||=RdobaLog.new;end;end"
303
+ obj.class_eval "def self.__rdoba_log__;
304
+ @__rdoba_log__||=#{obj}::RdobaLog.new;end"
305
+ obj::RdobaLog.class_eval &Initfunc ; end
306
+
307
+ def self.log_instance_setup obj
308
+ obj.instance_eval "class ::RdobaLog;end"
309
+ obj.instance_eval "def __rdoba_log__;$__rdoba_log__||=::RdobaLog.new;end"
310
+ obj.instance_eval "class << self; def self.__rdoba_log__;
311
+ $__rdoba_log__||=::RdobaLog.new;end;end"
312
+ obj.instance_eval "def self.__rdoba_log__;
313
+ $__rdoba_log__||=::RdobaLog.new;end"
314
+ ::RdobaLog.class_eval &Initfunc ; end
315
+
316
+ def self.log_link_for target, obj, funcname
317
+ obj.send( "#{target}_eval", "def #{funcname};__rdoba_log__;end" )
318
+ obj.send( "#{target}_eval", "def self.#{funcname};__rdoba_log__;end" )
319
+ obj.send( "#{target}_eval", "class << self; def self.#{funcname};
320
+ __rdoba_log__;end;end" ) ; end
321
+
322
+ def self.define_methods obj, list
323
+ list.each do| f |
324
+ evas = "def #{f} *args;__rdoba_log__.#{f} *args;end"
325
+ if obj.class != Object
326
+ obj.class_eval( evas ) ; end
327
+ obj.instance_eval( evas ) ; end ; end
328
+
329
+ def self.try_define_compat functions, target
330
+ if functions.include?( :compat )
331
+ list = [ :dbgl= ]
332
+ (1..0xF).each do |x|
333
+ (1..0xF).each do |y|
334
+ idx = sprintf( "%x%x", x, y )
335
+ list << "dbp#{idx}".to_sym << "dbg#{idx}".to_sym ; end; end
336
+ Rdoba::Log.define_methods( target, list ) ; end ; end
337
+
338
+ def self.log_functions_set obj, functions
339
+ obj.class_variable_set :@@rdoba_log_functions, functions ; end
340
+
341
+ def self.log_functions_get obj
342
+ obj.class_variable_get :@@rdoba_log_functions
343
+ rescue
344
+ [] ; end
345
+
346
+ def self.log_prefix_get obj
347
+ obj.class_variable_get :@@rdoba_log_prefix
348
+ rescue
349
+ ';if true;(File.join "' ; end
350
+
351
+ def self.update_functions functions, obj, method
352
+ if functions.is_a?( Array ) && functions.include?( :* )
353
+ functions = [ :basic, :enter, :leave, :warn, :info, :extended,
354
+ :compat ] ; end # TODO compat
355
+ cf = self.log_functions_get obj
356
+ functions = cf.send( method, functions.is_a?( Array ) && functions ||
357
+ functions.is_a?( NilClass) && [] ||
358
+ [ functions.to_s.to_sym ] )
359
+ self.log_functions_set obj, functions
360
+
361
+ pfx = self.log_prefix_get obj
362
+ code = Rdoba::Log::make_code functions, pfx
363
+ obj.class_eval code ; end
364
+
365
+ def self.make_code functions, pfx
165
366
  code = ''
166
367
  psfx = ' ",params);end;end;'
167
368
  if functions.include?( :enter )
@@ -189,7 +390,6 @@ module Rdoba
189
390
  else
190
391
  code << 'def * *params;end;'; end
191
392
  if functions.include?( :compat )
192
- obj.send :include, Rdoba::Log::DebugCompat
193
393
  code << "$dbgl_#{self.class}=0;"
194
394
  (1..0xF).each do |x|
195
395
  (1..0xF).each do |y|
@@ -216,33 +416,4 @@ module Rdoba
216
416
  end.join(', ')
217
417
  # NOTE: the shell over text id requires to proper output
218
418
  # in multiprocess environment
219
- io_m.call "#{text}\n"; end
220
-
221
- module DebugCompat
222
- def dbgl
223
- @dbgl; end
224
-
225
- def dbgl= level
226
- @dbgl = level; end
227
-
228
- def dbc level
229
- level = level.to_i
230
- if level > 0
231
- clevel = @dbgl || begin
232
- eval "$dbgl_#{self.class}"
233
- rescue
234
- nil; end
235
- clevel || ( clevel.to_i & level ) == level
236
- else
237
- false; end; end
238
-
239
- def dbp level, text
240
- if dbc level
241
- Kernel.puts text; end; end
242
-
243
- def dbg level, code, vars = {}
244
- if dbc level
245
- if vars
246
- vars.each_pair do |var, value|
247
- instance_variable_set( var, value ); end; end
248
- eval code; end; end; end ;end; end
419
+ io_m.call "#{text}\n"; end ; end ; end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ module Rdoba::Merge
4
+ TARGET = :Hash
5
+
6
+ def deep_merge source, dest
7
+ dup = dest.dup
8
+ source.each do |key, value|
9
+ newvalue = dup.delete key
10
+ case newvalue
11
+ when Hash
12
+ value.deep_merge newvalue
13
+ when Array
14
+ value |= newvalue
15
+ when NilClass
16
+ else
17
+ raise
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ module Rdoba::Mixin::Time
2
+ require 'ffi/stat'
3
+
4
+ def mtime file
5
+ FFI::Stat.stat( file )[:st_mtimespec].to_time ; end
6
+
7
+ def atime file
8
+ FFI::Stat.stat( file )[:st_atimespec].to_time ; end
9
+
10
+ def ctime file
11
+ FFI::Stat.stat( file )[:st_ctimespec].to_time ; end ; end
@@ -0,0 +1,6 @@
1
+ module Rdoba::Mixin::TryObject
2
+ def try method, *args, default: nil
3
+ if self.respond_to?( method )
4
+ self.send( method, *args )
5
+ else
6
+ default ; end ; end ; end
@@ -0,0 +1,4 @@
1
+ module Rdoba::Mixin::TryObject
2
+ def try method, *args
3
+ if self.respond_to?( method )
4
+ self.send( method, *args ) ; end ; end ; end
@@ -0,0 +1,21 @@
1
+ require 'timeout'
2
+
3
+ module Rdoba::Mixin::Wait_ifKernel
4
+
5
+ ##
6
+ # +wait_if+ waits for +timeout+ second to the condition passed via block,
7
+ # and in case if it failed, returns false, otherwise true. +timeout+ can
8
+ # be a float or integer number of seconds, but if passed 0 or nil it waits
9
+ # forever. Default value is 6 seconds. Example:
10
+ #
11
+ # wait_if(5) { sleep 2; true } # => true
12
+ # wait_if(5) { sleep 10; true } # => false
13
+ #
14
+ def wait_if timeout = 6
15
+ begin
16
+ Timeout.timeout( timeout ) do
17
+ while yield() do
18
+ sleep( 0.1 ) ; end ; end
19
+ true
20
+ rescue Timeout::Error
21
+ false ; end ; end ; end