ruby_ex 0.4.6.2 → 0.5.5.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 (57) hide show
  1. data/NEWS +17 -0
  2. data/README +1 -0
  3. data/SPEC.gemspec +14 -0
  4. data/SPEC.yml +10 -6
  5. data/lib/abstract.rb +3 -4
  6. data/lib/d_logger.rb +3 -3
  7. data/lib/drb/observable_pool.rb +5 -2
  8. data/lib/drb_ex.rb +1 -6
  9. data/lib/exp_mod.rb +48 -0
  10. data/lib/file_type.rb +82 -97
  11. data/lib/kill_all.rb +3 -3
  12. data/lib/{module → module_extensions}/autoload_tree.rb +5 -10
  13. data/lib/{module → module_extensions}/hierarchy.rb +11 -5
  14. data/lib/{module → module_extensions}/instance_method_visibility.rb +7 -5
  15. data/lib/{ordered_hash.rb → o_hash.rb} +8 -13
  16. data/lib/probability_distributions/gaussian_distribution.rb +34 -0
  17. data/lib/probability_distributions/probability_distribution.rb +16 -0
  18. data/lib/probability_distributions/uniform_distribution.rb +12 -0
  19. data/lib/random_generators.rb +1 -3
  20. data/lib/ruby_ex.rb +4 -4
  21. data/lib/sendmail.rb +7 -4
  22. data/lib/sym_tbl_gsub.rb +48 -17
  23. data/lib/uri/file.rb +5 -10
  24. data/lib/uri/ftp_ex.rb +4 -4
  25. data/lib/uri/generic_ex.rb +11 -7
  26. data/lib/uri/http_ex.rb +4 -4
  27. data/lib/uri/mysql.rb +3 -5
  28. data/lib/uri/pgsql.rb +3 -5
  29. data/lib/uri/rsync.rb +2 -4
  30. data/lib/uri/ssh.rb +3 -6
  31. data/lib/uri/svn.rb +10 -12
  32. data/lib/{yaml → yaml_extensions}/chop_header.rb +3 -3
  33. data/lib/{yaml → yaml_extensions}/transform.rb +4 -4
  34. data/lib/{yaml → yaml_extensions}/yregexpath.rb +3 -3
  35. metadata +89 -105
  36. data/lib/commands.rb +0 -27
  37. data/lib/commands/command.rb +0 -545
  38. data/lib/commands/datas.rb +0 -11
  39. data/lib/commands/datas/composite.rb +0 -55
  40. data/lib/commands/datas/data.rb +0 -160
  41. data/lib/commands/datas/factory.rb +0 -74
  42. data/lib/commands/datas/pipe.rb +0 -52
  43. data/lib/commands/datas/temp.rb +0 -24
  44. data/lib/commands/factory.rb +0 -65
  45. data/lib/commands/helpers.rb +0 -76
  46. data/lib/commands/pipe.rb +0 -114
  47. data/lib/commands/runners.rb +0 -11
  48. data/lib/commands/runners/exec.rb +0 -46
  49. data/lib/commands/runners/fork.rb +0 -104
  50. data/lib/commands/runners/mockable.rb +0 -63
  51. data/lib/commands/runners/no_run.rb +0 -44
  52. data/lib/commands/runners/popen.rb +0 -49
  53. data/lib/commands/runners/runner.rb +0 -177
  54. data/lib/commands/runners/system.rb +0 -54
  55. data/lib/commands/seq.rb +0 -31
  56. data/lib/hookable.rb +0 -294
  57. data/lib/hooker.rb +0 -52
data/lib/commands.rb DELETED
@@ -1,27 +0,0 @@
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: /w/fey/ruby_ex/trunk/lib/commands.rb 8049 2005-12-31T16:01:12.162089Z ertai $
5
-
6
- # Provides an object oriented way to manage, combine and run your commands.
7
- #
8
- # Example:
9
- # require 'rubygems' ; require_gem 'ruby_ex' ; require 'ruby_ex'
10
- # Commands.import!
11
- # ls, wc, out = 'ls'.to_cmd, 'wc'.to_cmd, 'out'.to_path
12
- #
13
- # data = ls.system # other runners exist (exec, fork, sh...)
14
- #
15
- # p data.status
16
- # puts data.output.read
17
- #
18
- # (ls > STDOUT).system
19
- #
20
- # cmd = ls['*.rb'] | wc['-l'] > out
21
- # cmd.system
22
- #
23
- # puts out.read
24
- module Commands
25
- end # module Commands
26
-
27
- Commands::Helpers.import!
@@ -1,545 +0,0 @@
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: /w/fey/ruby_ex/trunk/lib/commands/command.rb 8052 2006-01-01T16:29:27.129829Z ertai $
5
-
6
- module Commands
7
-
8
- class Command
9
-
10
- attr_accessor :command
11
- attr_accessor :dir
12
- attr_accessor :input
13
- attr_accessor :output
14
- attr_accessor :error
15
- attr_accessor :args
16
- attr_accessor :open_mode
17
-
18
- #
19
- # Construction methods.
20
- #
21
-
22
- def initialize ( command_name, *args )
23
- @command = command_name
24
- @args = args.dup
25
- @open_mode = :w
26
- @input, @output, @error = nil, nil, nil
27
- end
28
-
29
- #
30
- # Command['wc -l'].sh
31
- #
32
- def self.[] ( *args )
33
- new(*args)
34
- end
35
-
36
-
37
-
38
- #
39
- # Running methods.
40
- #
41
-
42
- @@default_runners = {}
43
- @@running_options =
44
- {
45
- :verbose => :make_verbose,
46
- :v => :make_verbose,
47
- :raise => :raise_on_failures,
48
- :r => :raise_on_failures,
49
- :debug => :make_debug,
50
- :d => :make_debug,
51
- :mock => :make_mock,
52
- :m => :make_mock,
53
- }
54
- def run_with_options ( runner_class, options )
55
- if options.empty?
56
- runner = @@default_runners[runner_class] ||= runner_class.new
57
- else
58
- runner = runner_class.new
59
- options.each do |k|
60
- runner.send(@@running_options[k])
61
- end
62
- end
63
- run(runner)
64
- end
65
-
66
-
67
- # Simulate Kernel#system() to run the command (No shell expansion).
68
- def system ( *options )
69
- run_with_options(Runners::System, options.flatten)
70
- end
71
-
72
-
73
- # Use the ExecRunner.
74
- def exec ( *options )
75
- run_with_options(Runners::Exec, options.flatten)
76
- end
77
-
78
-
79
- # FIXME test me
80
- def sys ( *options )
81
- run_with_options(Runners::System, [:v, :r] + options.flatten)
82
- end
83
-
84
-
85
- # Use Kernel#system() but with a string to have the shell expansion.
86
- # FIXME make me a runner
87
- def sh
88
- Kernel.system(to_sh)
89
- end
90
-
91
-
92
- # Use Kernel#exec() but with a string to have the shell expansion.
93
- # FIXME make me a runner
94
- def sh!
95
- Kernel.exec(to_sh)
96
- end
97
-
98
-
99
- # Use Kernel#` and return the resulting string.
100
- # FIXME make me a runner
101
- def expand
102
- `#{to_sh}`
103
- end
104
-
105
-
106
- def popen ( *options )
107
- run_with_options(Runners::Popen, options.flatten)
108
- end
109
-
110
-
111
- def fork ( *options )
112
- run_with_options(Runners::Fork, options.flatten)
113
- end
114
-
115
-
116
- # FIXME design me!
117
- # FIXME make me a runner
118
- def ruby
119
- end
120
-
121
-
122
- # Use a Commands::Runners::Runner and return a Commands::Datas::Data.
123
- def run ( runner=@runner )
124
- unless runner.respond_to? :run
125
- raise ArgumentError, "need a runner not: #{runner.inspect}"
126
- end
127
- runner.run(self)
128
- end
129
-
130
-
131
-
132
- #
133
- # Operators.
134
- #
135
-
136
-
137
- # Pipe two commands.
138
- def | ( rhs )
139
- Commands::Pipe.new(self, rhs)
140
- end
141
-
142
-
143
- # Supply return a new commands with these arguments added.
144
- def [] ( *args )
145
- cmd = dup
146
- cmd.args += args.flatten
147
- cmd
148
- end
149
-
150
-
151
- # Chain two commands (like a `;' in shell), and return a new one.
152
- def + ( rhs )
153
- case rhs
154
- when Command
155
- Seq.new(self, rhs)
156
- else
157
- self[rhs]
158
- end
159
- end
160
-
161
-
162
- # Return a new command with the given command input.
163
- def < ( arg )
164
- cmd = dup
165
- cmd.input = arg
166
- cmd
167
- end
168
-
169
-
170
- def add_outputs ( out, err )
171
- cmd = dup
172
- cmd.output = out.dup if out
173
- cmd.error = err.dup if err
174
- cmd
175
- end
176
- protected :add_outputs
177
-
178
-
179
- # Return a new command with the given command output.
180
- def > ( arg )
181
- out, err = (arg.is_a?(Array))? arg : [arg, nil]
182
- add_outputs(out, err)
183
- end
184
-
185
-
186
- # Like > but open the output in append mode.
187
- def >> ( arg )
188
- out, err = (arg.is_a?(Array))? arg : [arg, nil]
189
- @open_mode = :a
190
- add_outputs(out, err)
191
- end
192
-
193
-
194
- # Add an argument to a command.
195
- # cmd = Command.new('ls')
196
- # cmd << '-la'
197
- # cmd.sh
198
- def << ( arg )
199
- @args << arg
200
- self
201
- end
202
-
203
-
204
-
205
- #
206
- # Misc
207
- #
208
-
209
- def arg_string
210
- @args.map { |arg| arg.to_s.dump }.join(' ')
211
- end
212
-
213
- def whereis ( path=ENV['PATH'] )
214
- # FIXME
215
- end
216
-
217
-
218
- #
219
- # Conversion methods
220
- #
221
-
222
- def to_s
223
- str = @command.dump
224
- arg_str = arg_string
225
- str += ' ' + arg_str unless arg_str.empty?
226
- str
227
- end
228
-
229
-
230
- def to_sh
231
- cmd = instanciate_args
232
- "#{cmd.to_s}#{cmd.sh_args}"
233
- end
234
-
235
- def instanciate_args!
236
- if defined? @input and @input and @args.include? '%i'
237
- @args.map! { |a| (a == '%i')? @input : a }
238
- @input = nil
239
- end
240
- if defined? @output and @output and @args.include? '%o'
241
- @args.map! { |a| (a == '%o')? @output : a }
242
- @output = nil
243
- end
244
- if defined? @error and @error and @args.include? '%e'
245
- @args.map! { |a| (a == '%e')? @error : a }
246
- @error = nil
247
- end
248
- end
249
-
250
- def instanciate_args
251
- copy = dup
252
- copy.instanciate_args!
253
- copy
254
- end
255
-
256
- def sh_args
257
- args = ''
258
- [ ['<', input], ['>', output], ['2>', error] ].each do |str, io|
259
- args += " #{str} #{io.to_s.dump}" if io and not (io.respond_to? :pipe? and io.pipe?)
260
- end
261
- args
262
- end
263
-
264
-
265
- def to_a
266
- [@command.dup, *@args.map { |arg| arg.to_s }]
267
- end
268
-
269
- def to_cmd
270
- self
271
- end
272
-
273
- end # class Command
274
-
275
- Commands::Helpers.import!
276
-
277
- test_section __FILE__ do
278
-
279
- class CommandTest < Test::Unit::TestCase
280
-
281
- def setup
282
- @file = TempPath.new
283
- @tmp = TempPath.new
284
- @tmp2 = TempPath.new
285
- @file.open('w') { |f| f.puts "bla bla\n foo bar"}
286
- ENV['TEST_FILE'] = @file.to_s
287
- @touch = Command.new('touch')
288
- @cp = Command.new('cp')
289
- @cat = Command.new('cat')
290
- @wc = Command.new('wc')
291
- @sleep = Command.new('sleep')
292
- @dne = Command.new('ThisCommandDoesNotExist')
293
- @dev_null = Pathname.new('/dev/null')
294
- end
295
-
296
- def tear_down
297
- [@file, @tmp, @tmp2].each { |t| t.clean }
298
- end
299
-
300
- def test_0_initialize
301
- end
302
-
303
- def test_self_hook # test_self.[]
304
- @cat << 'foo' << 'bar'
305
- assert_equal(@cat.to_a, Command[*%w[cat foo bar]].to_a)
306
- end
307
-
308
- def test_system_dne
309
- @dne.system
310
- assert_equal(127, $?.exitstatus)
311
- end
312
-
313
- def test_system
314
- @touch << @tmp.to_s
315
- @touch.system
316
- assert_equal(0, $?)
317
- assert(@tmp.exist?)
318
- end
319
-
320
- def test_system_raise_on_failures
321
- assert_raise(Runners::Runner::FailureHooker::Error) do
322
- 'false'.to_cmd.system(:r)
323
- end
324
- assert_not_equal(0, $?)
325
- end
326
-
327
- def test_sh_and_pipe
328
- ((@cat | @wc) < @file > @tmp).sh
329
- assert_equal(0, $?)
330
- assert(@tmp.exist?)
331
- assert_match(/\s*2\s*4\s*17\s+/, @tmp.read)
332
- end
333
-
334
- def test_system_and_pipe
335
- ((@cat | @wc) < @file.open('r+') > @tmp).system
336
- assert_equal(0, $?)
337
- assert(@tmp.exist?)
338
- assert_match(/\s*2\s*4\s*17\s+/, @tmp.read)
339
- end
340
-
341
- def test_system_is_not_sh
342
- @cat << '$TEST_FILE'
343
- @cat.error = @dev_null
344
- (@cat > @tmp).system
345
- assert_not_equal(0, $?)
346
- assert(!@tmp.exist? || @tmp.zero?)
347
- end
348
-
349
- def test_exec
350
- @cp << @file << @tmp
351
- pid = fork do
352
- @cp.exec
353
- end
354
- Process.waitpid pid
355
- assert_equal(0, $?)
356
- assert(@tmp.exist?)
357
- assert_equal(@file.read, @tmp.read)
358
- end
359
-
360
- def test_exec_not_sh!
361
- @cat << '$TEST_FILE'
362
- @cat.error = @dev_null
363
- pid = fork do
364
- (@cat > @tmp).exec
365
- end
366
- Process.waitpid pid
367
- assert_not_equal(0, $?)
368
- assert(!@tmp.exist? || @tmp.size.zero?)
369
- end
370
-
371
- def test_sh
372
- @cat << '$TEST_FILE'
373
- (@cat > @tmp).sh
374
- assert_equal(0, $?)
375
- assert(@tmp.exist?)
376
- assert_equal(@file.read, @tmp.read)
377
- end
378
-
379
- def test_sh2
380
- ((@cat | @wc) < @file > @tmp).sh
381
- assert_equal(0, $?)
382
- assert(@tmp.exist?)
383
- assert_match(/\s*2\s*4\s*17\s+/, @tmp.read)
384
- end
385
-
386
- def test_sh!
387
- @cat << '$TEST_FILE'
388
- pid = fork do
389
- (@cat > @tmp).sh!
390
- end
391
- Process.waitpid pid
392
- assert_equal(0, $?)
393
- assert(@tmp.exist?)
394
- assert_equal(@file.read, @tmp.read)
395
- end
396
-
397
- def test_expand
398
- @cat << '$TEST_FILE'
399
- str = (@cat).expand
400
- assert_equal(0, $?)
401
- assert_equal(@file.read, str)
402
-
403
- str = ((@cat | @wc) < @file).expand
404
- assert_equal(0, $?)
405
- assert_match(/\s*2\s*4\s*17\s+/, str)
406
- end
407
-
408
- # FIXME
409
- def test_popen
410
- cmd = (@touch + @tmp) + (@sleep + 1)
411
- diff = DTime.diff { @data = cmd.popen }
412
- assert(@tmp.exist?)
413
- @data.waitpid
414
- assert(@tmp.exist?)
415
- assert(diff.to_f < 1)
416
- end
417
-
418
- def test_fork
419
- sleep_arg = 2
420
- cmd = (@touch + @tmp) + (@sleep + sleep_arg)
421
- diff = DTime.diff { @data = cmd.fork }
422
- assert(@tmp.exist?)
423
- @data.waitpid
424
- assert(@tmp.exist?)
425
- assert(diff.to_f < sleep_arg, "#{diff} should be < #{sleep_arg}")
426
- end
427
-
428
- def test_ruby
429
- # FIXME
430
- end
431
-
432
- def test_pipe # test_|
433
- assert_kind_of(Pipe, (@cat | @wc) < @file)
434
- end
435
-
436
- def test_subscript # test_[]
437
- assert_equal(['a', 'b'], @cat['a', 'b'].args)
438
- assert_equal(['a'], @cat['a'].args)
439
- assert_equal([], @cat[].args)
440
- assert_equal(['a', 'b', 'c'], @cat[[['a'], 'b', ['c']]].args)
441
- end
442
-
443
- def test_chain # test_+
444
- assert_kind_of(Seq, (@cat + @wc) < @file)
445
- cmd = @cat + @file.to_s
446
- assert_kind_of(Command, cmd)
447
- assert_equal([@file.to_s], cmd.args)
448
- cmd += ['a', 'b']
449
- assert_equal([@file.to_s, 'a', 'b'], cmd.args)
450
- cmd += @file.to_s
451
- assert_equal([@file.to_s, 'a', 'b', @file.to_s], cmd.args)
452
- end
453
-
454
- def test_chain_complex
455
- ((@cat < @file > @tmp) + (@wc + [@tmp] > @tmp2)).sh
456
- assert_equal(0, $?)
457
- assert(@tmp.exist?)
458
- assert(@tmp2.exist?)
459
- assert_equal(@file.read, @tmp.read)
460
- assert_match(/\s*2\s*4\s*17\s*#{@tmp}\s+/, @tmp2.read)
461
- end
462
-
463
- def test_add_input # test_<
464
- @cat.input = 'foo'
465
- assert_equal('foo', @cat.input)
466
- cmd = @cat < 'bar'
467
- assert_equal('bar', cmd.input)
468
- assert_not_equal(cmd.object_id, @cat.object_id)
469
- end
470
-
471
- def test_add_output # test_>
472
- @cat.output = 'foo'
473
- assert_equal('foo', @cat.output)
474
- cmd = @cat > 'bar'
475
- assert_equal('bar', cmd.output)
476
- cmd = @cat > @file
477
- assert_equal(@file, cmd.output)
478
- assert_equal(:w, cmd.open_mode)
479
- assert_not_equal(cmd.object_id, @cat.object_id)
480
- cmd = @cat > [ 'outbar', 'errbar' ]
481
- assert_equal('outbar', cmd.output)
482
- assert_equal('errbar', cmd.error)
483
- cmd = @cat > [ @file, @file ]
484
- assert_equal(:w, cmd.open_mode)
485
- end
486
-
487
- def test_append_output # test_>>
488
- @cat.output = 'foo'
489
- assert_equal('foo', @cat.output)
490
- cmd = @cat >> 'bar'
491
- assert_equal('bar', cmd.output)
492
- assert_not_equal(cmd.object_id, @cat.object_id)
493
- cmd = @cat >> @file
494
- assert_equal(@file, cmd.output)
495
- assert_equal(:a, cmd.open_mode)
496
- cmd = @cat >> [ 'outbar', 'errbar' ]
497
- assert_equal('outbar', cmd.output)
498
- assert_equal('errbar', cmd.error)
499
- cmd = @cat >> [ @file, @file ]
500
- assert_equal(:a, cmd.open_mode)
501
- end
502
-
503
- def test_args
504
- assert_equal([], @cp.args)
505
- @cat << 'foo bar' << 'baz'
506
- assert_equal(['foo bar', 'baz'], @cat.args)
507
- end
508
-
509
- def test_arg_string
510
- assert_equal('', @cp.arg_string)
511
- @cat << 'foo bar' << 'baz'
512
- assert_equal('"foo bar" "baz"', @cat.arg_string)
513
- end
514
-
515
- def test_to_s
516
- assert_equal('"cp"', @cp.to_s)
517
- @cat << 'foo bar' << 'baz'
518
- assert_equal('"cat" "foo bar" "baz"', @cat.to_s)
519
- end
520
-
521
- def test_to_sh
522
- assert_equal('"cp" > "ya"', (@cp > 'ya').to_sh)
523
- @cat << 'foo > bar' << '< baz'
524
- assert_equal(
525
- '("cat" "foo > bar" "< baz" < "yay") | ("cp" > "yoy")',
526
- ((@cat | @cp) < 'yay' > 'yoy').to_sh)
527
- @wc.error = 'foo'
528
- assert_equal('"wc" 2> "foo"', @wc.to_sh)
529
- end
530
-
531
- def test_complex
532
- ls = 'ls'.to_cmd
533
- wc = 'wc'.to_cmd
534
- (ls | wc) < @file > @tmp
535
- end
536
-
537
- def test_where
538
- # FIXME
539
- end
540
-
541
- end # class CommandTest
542
-
543
- end
544
-
545
- end # module Commands