rdoba 0.9.1 → 0.9.2

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 (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