ruby_ex 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/AUTHORS +51 -0
  2. data/ChangeLog +1763 -0
  3. data/NEWS +3 -0
  4. data/README +1 -0
  5. data/Rakefile +8 -0
  6. data/SPEC.dyn.yml +10 -0
  7. data/SPEC.gem.yml +269 -0
  8. data/SPEC.yml +36 -0
  9. data/src/abstract.rb +253 -0
  10. data/src/abstract_node.rb +85 -0
  11. data/src/algorithms.rb +12 -0
  12. data/src/algorithms/simulated_annealing.rb +142 -0
  13. data/src/ask.rb +100 -0
  14. data/src/attributed_class.rb +303 -0
  15. data/src/cache.rb +350 -0
  16. data/src/checkout.rb +12 -0
  17. data/src/choose.rb +271 -0
  18. data/src/commands.rb +20 -0
  19. data/src/commands/command.rb +492 -0
  20. data/src/commands/datas.rb +16 -0
  21. data/src/commands/datas/composite.rb +31 -0
  22. data/src/commands/datas/data.rb +65 -0
  23. data/src/commands/datas/factory.rb +69 -0
  24. data/src/commands/datas/temp.rb +26 -0
  25. data/src/commands/factory.rb +67 -0
  26. data/src/commands/helpers.rb +81 -0
  27. data/src/commands/pipe.rb +66 -0
  28. data/src/commands/runners.rb +16 -0
  29. data/src/commands/runners/exec.rb +50 -0
  30. data/src/commands/runners/fork.rb +130 -0
  31. data/src/commands/runners/runner.rb +140 -0
  32. data/src/commands/runners/system.rb +57 -0
  33. data/src/commands/seq.rb +32 -0
  34. data/src/config_file.rb +95 -0
  35. data/src/const_regexp.rb +57 -0
  36. data/src/daemon.rb +135 -0
  37. data/src/diff.rb +665 -0
  38. data/src/dlogger.rb +62 -0
  39. data/src/drb/drb_observable.rb +95 -0
  40. data/src/drb/drb_observable_pool.rb +27 -0
  41. data/src/drb/drb_service.rb +44 -0
  42. data/src/drb/drb_undumped_attributes.rb +56 -0
  43. data/src/drb/drb_undumped_indexed_object.rb +55 -0
  44. data/src/drb/insecure_protected_methods.rb +101 -0
  45. data/src/drb_ex.rb +12 -0
  46. data/src/dumpable_proc.rb +57 -0
  47. data/src/filetype.rb +229 -0
  48. data/src/generate_id.rb +44 -0
  49. data/src/histogram.rb +222 -0
  50. data/src/hookable.rb +283 -0
  51. data/src/hooker.rb +54 -0
  52. data/src/indexed_node.rb +65 -0
  53. data/src/io_marshal.rb +99 -0
  54. data/src/ioo.rb +193 -0
  55. data/src/labeled_node.rb +62 -0
  56. data/src/logger_observer.rb +24 -0
  57. data/src/md5sum.rb +70 -0
  58. data/src/module/autoload_tree.rb +65 -0
  59. data/src/module/hierarchy.rb +334 -0
  60. data/src/module/instance_method_visibility.rb +71 -0
  61. data/src/node.rb +81 -0
  62. data/src/object_monitor.rb +143 -0
  63. data/src/object_monitor_activity.rb +34 -0
  64. data/src/observable.rb +138 -0
  65. data/src/observable_pool.rb +291 -0
  66. data/src/orderedhash.rb +252 -0
  67. data/src/pp_hierarchy.rb +30 -0
  68. data/src/random_generators.rb +29 -0
  69. data/src/random_generators/random_generator.rb +33 -0
  70. data/src/random_generators/ruby.rb +25 -0
  71. data/src/ruby_ex.rb +124 -0
  72. data/src/safe_eval.rb +346 -0
  73. data/src/sendmail.rb +214 -0
  74. data/src/service_manager.rb +122 -0
  75. data/src/shuffle.rb +30 -0
  76. data/src/spring.rb +134 -0
  77. data/src/spring_set.rb +134 -0
  78. data/src/symtbl.rb +108 -0
  79. data/src/synflow.rb +474 -0
  80. data/src/thread_mutex.rb +11 -0
  81. data/src/timeout_ex.rb +79 -0
  82. data/src/trace.rb +26 -0
  83. data/src/uri/druby.rb +78 -0
  84. data/src/uri/file.rb +63 -0
  85. data/src/uri/ftp_ex.rb +36 -0
  86. data/src/uri/http_ex.rb +41 -0
  87. data/src/uri/pgsql.rb +136 -0
  88. data/src/uri/ssh.rb +87 -0
  89. data/src/uri/svn.rb +113 -0
  90. data/src/uri_ex.rb +71 -0
  91. data/src/verbose_object.rb +70 -0
  92. data/src/yaml/basenode_ext.rb +63 -0
  93. data/src/yaml/chop_header.rb +24 -0
  94. data/src/yaml/transform.rb +450 -0
  95. data/src/yaml/yregexpath.rb +76 -0
  96. data/test/algorithms/simulated_annealing_test.rb +102 -0
  97. data/test/check-pkg-ruby_ex.yml +15 -0
  98. data/test/check-ruby_ex.yml +12 -0
  99. data/test/resources/autoload_tree/A.rb +11 -0
  100. data/test/resources/autoload_tree/B.rb +10 -0
  101. data/test/resources/autoload_tree/foo/C.rb +18 -0
  102. data/test/resources/foo.txt +6 -0
  103. data/test/sanity-suite.yml +12 -0
  104. data/test/sanity/multiple-requires.yml +20 -0
  105. data/test/sanity/single-requires.yml +24 -0
  106. data/test/test-unit-setup.rb +6 -0
  107. data/test/unit-suite.yml +14 -0
  108. metadata +269 -0
data/src/commands.rb ADDED
@@ -0,0 +1,20 @@
1
+ # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
2
+ # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
3
+ # License:: GNU General Public License (GPL).
4
+ # Revision:: $Id: commands.rb 266 2005-06-01 14:27:18Z ertai $
5
+
6
+ require 'ruby_ex'
7
+ require 'module/autoload_tree'
8
+ require 'abstract'
9
+ require 'hookable'
10
+ require 'hooker'
11
+ require 'commands/helpers'
12
+ require 'commands/datas'
13
+ require 'commands/runners'
14
+
15
+
16
+ module Commands
17
+
18
+ autoloaded_module(__FILE__, false)
19
+
20
+ end # module Commands
@@ -0,0 +1,492 @@
1
+ # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
2
+ # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
3
+ # License:: GNU General Public License (GPL).
4
+ # Revision:: $Id: command.rb 255 2005-06-01 00:08:46Z ertai $
5
+
6
+ require 'commands'
7
+
8
+ module Commands
9
+
10
+ class Command
11
+
12
+ attr_accessor :command
13
+ attr_accessor :dir
14
+ attr_accessor :input
15
+ attr_accessor :output
16
+ attr_accessor :error
17
+ attr_accessor :args
18
+
19
+ #
20
+ # Construction methods.
21
+ #
22
+
23
+ def initialize ( command_name, *args )
24
+ @command = command_name
25
+ @args = args.dup
26
+ end
27
+
28
+ #
29
+ # Command['wc -l'].sh
30
+ #
31
+ def self.[] ( *args )
32
+ new(*args)
33
+ end
34
+
35
+
36
+
37
+ #
38
+ # Running methods.
39
+ #
40
+
41
+ # Simulate Kernel#system() to run the command (No shell expansion).
42
+ def system
43
+ unless defined? @@system_runner
44
+ @@system_runner = Runners::System.new
45
+ end
46
+ run(@@system_runner)
47
+ end
48
+
49
+
50
+ # Use the ExecRunner.
51
+ def exec
52
+ unless defined? @@exec_runner
53
+ @@exec_runner = Runners::Exec.new
54
+ end
55
+ run(@@exec_runner)
56
+ end
57
+
58
+
59
+ # FIXME test me
60
+ def sys
61
+ unless defined? @@sys_runner
62
+ @@sys_runner = Runners::System.new.make_verbose.raise_on_failures
63
+ end
64
+ run(@@sys_runner)
65
+ end
66
+
67
+
68
+ # Use Kernel#system() but with a string to have the shell expansion.
69
+ def sh
70
+ Kernel.system(to_sh)
71
+ end
72
+
73
+
74
+ # Use Kernel#exec() but with a string to have the shell expansion.
75
+ def sh!
76
+ Kernel.exec(to_sh)
77
+ end
78
+
79
+
80
+ # Use Kernel#` and return the resulting string.
81
+ def expand
82
+ `#{to_sh}`
83
+ end
84
+
85
+
86
+ def popen
87
+ unless defined? @@fork_runner
88
+ @@fork_runner = Runners::Fork.new
89
+ end
90
+ run(@@fork_runner)
91
+ end
92
+ alias :fork :popen
93
+
94
+
95
+ # FIXME design me!
96
+ def ruby
97
+ end
98
+
99
+
100
+ # Use a Commands::Runners::Runner and return a Commands::Datas::Data.
101
+ def run ( runner=@runner )
102
+ runner.run(self)
103
+ end
104
+
105
+
106
+
107
+ #
108
+ # Operators.
109
+ #
110
+
111
+
112
+ # Pipe two commands.
113
+ def | ( rhs )
114
+ Pipe.new(self, rhs)
115
+ end
116
+
117
+
118
+ # Supply return a new commands with these arguments added.
119
+ def [] ( *args )
120
+ cmd = dup
121
+ cmd.args += args.flatten
122
+ cmd
123
+ end
124
+
125
+
126
+ # Chain two commands (like a `;' in shell), and return a new one.
127
+ def + ( rhs )
128
+ case rhs
129
+ when Command
130
+ Seq.new(self, rhs)
131
+ else
132
+ self[rhs]
133
+ end
134
+ end
135
+
136
+
137
+ # Return a new command with the given command input.
138
+ def < ( arg )
139
+ cmd = dup
140
+ cmd.input = arg
141
+ cmd
142
+ end
143
+
144
+
145
+ def add_outputs ( out, err, mode )
146
+ cmd = dup
147
+ cmd.output = out.dup
148
+ cmd.output.open_mode = mode if cmd.output.is_a? Pathname
149
+ if err
150
+ cmd.error = err.dup
151
+ cmd.error.open_mode = mode if cmd.error.is_a? Pathname
152
+ end
153
+ cmd
154
+ end
155
+ protected :add_outputs
156
+
157
+
158
+ # Return a new command with the given command output.
159
+ def > ( arg )
160
+ out, err = (arg.is_a?(Array))? arg : [arg, nil]
161
+ add_outputs(out, err, 'w')
162
+ end
163
+
164
+
165
+ # Like > but open the output in append mode.
166
+ def >> ( arg )
167
+ out, err = (arg.is_a?(Array))? arg : [arg, nil]
168
+ add_outputs(out, err, 'a')
169
+ end
170
+
171
+
172
+ # Add an argument to a command.
173
+ # cmd = Command.new('ls')
174
+ # cmd << '-la'
175
+ # cmd.sh
176
+ def << ( arg )
177
+ @args << arg
178
+ self
179
+ end
180
+
181
+
182
+
183
+ #
184
+ # Misc
185
+ #
186
+
187
+ def arg_string
188
+ @args.map { |arg| arg.to_s.dump }.join(' ')
189
+ end
190
+
191
+ def whereis ( path=ENV['PATH'] )
192
+ # FIXME
193
+ end
194
+
195
+
196
+ #
197
+ # Conversion methods
198
+ #
199
+
200
+ def to_s
201
+ str = @command.dump
202
+ arg_str = arg_string
203
+ str += ' ' + arg_str unless arg_str.empty?
204
+ str
205
+ end
206
+
207
+
208
+ def to_sh
209
+ "#{to_s}#{sh_args}"
210
+ end
211
+
212
+
213
+ def sh_args
214
+ args = ''
215
+ args += " < #{@input.to_s.dump}" if @input
216
+ args += " > #{@output.to_s.dump}" if @output
217
+ args += " 2> #{@error.to_s.dump}" if @error
218
+ args
219
+ end
220
+
221
+
222
+ def to_a
223
+ [@command.dup, *@args.map { |arg| arg.to_s }]
224
+ end
225
+
226
+ def to_cmd
227
+ self
228
+ end
229
+
230
+ end # class Command
231
+
232
+ test_section __FILE__ do
233
+
234
+ class CommandTest < Test::Unit::TestCase
235
+
236
+ def setup
237
+ @file = TempPath.new
238
+ @tmp = TempPath.new
239
+ @tmp2 = TempPath.new
240
+ @file.open('w') { |f| f.puts "bla bla\n foo bar"}
241
+ ENV['TEST_FILE'] = @file.to_s
242
+ @touch = Command.new('touch')
243
+ @cp = Command.new('cp')
244
+ @cat = Command.new('cat')
245
+ @wc = Command.new('wc')
246
+ @sleep = Command.new('sleep')
247
+ @dne = Command.new('ThisCommandDoesNotExist')
248
+ @dev_null = Pathname.new('/dev/null')
249
+ end
250
+
251
+ def tear_down
252
+ [@file, @tmp, @tmp2].each { |t| t.clean }
253
+ end
254
+
255
+ def test_0_initialize
256
+ end
257
+
258
+ def test_self_hook # test_self.[]
259
+ @cat << 'foo' << 'bar'
260
+ assert_equal(@cat.to_a, Command[*%w[cat foo bar]].to_a)
261
+ end
262
+
263
+ def test_system_dne
264
+ @dne.system
265
+ end
266
+
267
+ def test_system
268
+ @touch << @tmp.to_s
269
+ @touch.system
270
+ assert_equal(0, $?)
271
+ assert(@tmp.exist?)
272
+ end
273
+
274
+ def test_sh_and_pipe
275
+ ((@cat | @wc) < @file > @tmp).sh
276
+ assert_equal(0, $?)
277
+ assert(@tmp.exist?)
278
+ assert_match(/\s*2\s*4\s*17\s+/, @tmp.read)
279
+ end
280
+
281
+ def test_system_and_pipe
282
+ ((@cat | @wc) < @file.open('r+') > @tmp).system
283
+ assert_equal(0, $?)
284
+ assert(@tmp.exist?)
285
+ assert_match(/\s*2\s*4\s*17\s+/, @tmp.read)
286
+ end
287
+
288
+ def test_system_is_not_sh
289
+ @cat << '$TEST_FILE'
290
+ @cat.error = @dev_null
291
+ (@cat > @tmp).system
292
+ assert_not_equal(0, $?)
293
+ assert(!@tmp.exist? || @tmp.zero?)
294
+ end
295
+
296
+ def test_exec
297
+ @cp << @file << @tmp
298
+ pid = fork do
299
+ @cp.exec
300
+ end
301
+ Process.waitpid pid
302
+ assert_equal(0, $?)
303
+ assert(@tmp.exist?)
304
+ assert_equal(@file.read, @tmp.read)
305
+ end
306
+
307
+ def test_exec_not_sh!
308
+ @cat << '$TEST_FILE'
309
+ @cat.error = @dev_null
310
+ pid = fork do
311
+ (@cat > @tmp).exec
312
+ end
313
+ Process.waitpid pid
314
+ assert_not_equal(0, $?)
315
+ assert(!@tmp.exist? || @tmp.size.zero?)
316
+ end
317
+
318
+ def test_sh
319
+ @cat << '$TEST_FILE'
320
+ (@cat > @tmp).sh
321
+ assert_equal(0, $?)
322
+ assert(@tmp.exist?)
323
+ assert_equal(@file.read, @tmp.read)
324
+ end
325
+
326
+ def test_sh2
327
+ ((@cat | @wc) < @file > @tmp).sh
328
+ assert_equal(0, $?)
329
+ assert(@tmp.exist?)
330
+ assert_match(/\s*2\s*4\s*17\s+/, @tmp.read)
331
+ end
332
+
333
+ def test_sh!
334
+ @cat << '$TEST_FILE'
335
+ pid = fork do
336
+ (@cat > @tmp).sh!
337
+ end
338
+ Process.waitpid pid
339
+ assert_equal(0, $?)
340
+ assert(@tmp.exist?)
341
+ assert_equal(@file.read, @tmp.read)
342
+ end
343
+
344
+ def test_expand
345
+ @cat << '$TEST_FILE'
346
+ str = (@cat).expand
347
+ assert_equal(0, $?)
348
+ assert_equal(@file.read, str)
349
+
350
+ str = ((@cat | @wc) < @file).expand
351
+ assert_equal(0, $?)
352
+ assert_match(/\s*2\s*4\s*17\s+/, str)
353
+ end
354
+
355
+ def test_popen
356
+ cmd = (@touch + @tmp) + (@sleep + 1)
357
+ diff = DTime.diff { @data = cmd.popen }
358
+ assert(@tmp.exist?)
359
+ @data.waitpid
360
+ assert(@tmp.exist?)
361
+ assert(diff.to_f < 1)
362
+ end
363
+
364
+ def test_fork
365
+ cmd = (@touch + @tmp) + (@sleep + 1)
366
+ diff = DTime.diff { @data = cmd.fork }
367
+ assert(@tmp.exist?)
368
+ @data.waitpid
369
+ assert(@tmp.exist?)
370
+ assert(diff.to_f < 1)
371
+ end
372
+
373
+ def test_ruby
374
+ # FIXME
375
+ end
376
+
377
+ def test_pipe # test_|
378
+ assert_kind_of(Pipe, (@cat | @wc) < @file)
379
+ end
380
+
381
+ def test_subscript # test_[]
382
+ assert_equal(['a', 'b'], @cat['a', 'b'].args)
383
+ assert_equal(['a'], @cat['a'].args)
384
+ assert_equal([], @cat[].args)
385
+ assert_equal(['a', 'b', 'c'], @cat[[['a'], 'b', ['c']]].args)
386
+ end
387
+
388
+ def test_chain # test_+
389
+ assert_kind_of(Seq, (@cat + @wc) < @file)
390
+ cmd = @cat + @file.to_s
391
+ assert_kind_of(Command, cmd)
392
+ assert_equal([@file.to_s], cmd.args)
393
+ cmd += ['a', 'b']
394
+ assert_equal([@file.to_s, 'a', 'b'], cmd.args)
395
+ cmd += @file.to_s
396
+ assert_equal([@file.to_s, 'a', 'b', @file.to_s], cmd.args)
397
+ end
398
+
399
+ def test_chain_complex
400
+ ((@cat < @file > @tmp) + (@wc + [@tmp] > @tmp2)).sh
401
+ assert_equal(0, $?)
402
+ assert(@tmp.exist?)
403
+ assert(@tmp2.exist?)
404
+ assert_equal(@file.read, @tmp.read)
405
+ assert_match(/\s*2\s*4\s*17\s*#{@tmp}\s+/, @tmp2.read)
406
+ end
407
+
408
+ def test_add_input # test_<
409
+ @cat.input = 'foo'
410
+ assert_equal('foo', @cat.input)
411
+ cmd = @cat < 'bar'
412
+ assert_equal('bar', cmd.input)
413
+ assert_not_equal(cmd.object_id, @bar.object_id)
414
+ end
415
+
416
+ def test_add_output # test_>
417
+ @cat.output = 'foo'
418
+ assert_equal('foo', @cat.output)
419
+ cmd = @cat > 'bar'
420
+ assert_equal('bar', cmd.output)
421
+ cmd = @cat > @file
422
+ assert_equal(@file, cmd.output)
423
+ assert_equal('w', cmd.output.open_mode)
424
+ assert_not_equal(cmd.object_id, @bar.object_id)
425
+ cmd = @cat > [ 'outbar', 'errbar' ]
426
+ assert_equal('outbar', cmd.output)
427
+ assert_equal('errbar', cmd.error)
428
+ cmd = @cat > [ @file, @file ]
429
+ assert_equal('w', cmd.output.open_mode)
430
+ assert_equal('w', cmd.error.open_mode)
431
+ end
432
+
433
+ def test_append_output # test_>>
434
+ @cat.output = 'foo'
435
+ assert_equal('foo', @cat.output)
436
+ cmd = @cat >> 'bar'
437
+ assert_equal('bar', cmd.output)
438
+ assert_not_equal(cmd.object_id, @bar.object_id)
439
+ cmd = @cat >> @file
440
+ assert_equal(@file, cmd.output)
441
+ assert_equal('a', cmd.output.open_mode)
442
+ cmd = @cat >> [ 'outbar', 'errbar' ]
443
+ assert_equal('outbar', cmd.output)
444
+ assert_equal('errbar', cmd.error)
445
+ cmd = @cat >> [ @file, @file ]
446
+ assert_equal('a', cmd.output.open_mode)
447
+ assert_equal('a', cmd.error.open_mode)
448
+ end
449
+
450
+ def test_args
451
+ assert_equal([], @cp.args)
452
+ @cat << 'foo bar' << 'baz'
453
+ assert_equal(['foo bar', 'baz'], @cat.args)
454
+ end
455
+
456
+ def test_arg_string
457
+ assert_equal('', @cp.arg_string)
458
+ @cat << 'foo bar' << 'baz'
459
+ assert_equal('"foo bar" "baz"', @cat.arg_string)
460
+ end
461
+
462
+ def test_to_s
463
+ assert_equal('"cp"', @cp.to_s)
464
+ @cat << 'foo bar' << 'baz'
465
+ assert_equal('"cat" "foo bar" "baz"', @cat.to_s)
466
+ end
467
+
468
+ def test_to_sh
469
+ assert_equal('"cp" > "ya"', (@cp > 'ya').to_sh)
470
+ @cat << 'foo > bar' << '< baz'
471
+ assert_equal(
472
+ '(("cat" "foo > bar" "< baz" < "yay") | ("cp" > "yoy"))',
473
+ ((@cat | @cp) < 'yay' > 'yoy').to_sh)
474
+ @wc.error = 'foo'
475
+ assert_equal('"wc" 2> "foo"', @wc.to_sh)
476
+ end
477
+
478
+ def test_complex
479
+ ls = 'ls'.to_cmd
480
+ wc = 'wc'.to_cmd
481
+ (ls | wc) < @file > @tmp
482
+ end
483
+
484
+ def test_where
485
+ # FIXME
486
+ end
487
+
488
+ end # class CommandTest
489
+
490
+ end
491
+
492
+ end # module Commands