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/drb_ex.rb ADDED
@@ -0,0 +1,12 @@
1
+ # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
2
+ # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
3
+ # License:: Gnu General Public License.
4
+ # Revision:: $Id: drb_ex.rb 258 2005-06-01 00:22:51Z ertai $
5
+
6
+ require 'module/autoload_tree'
7
+
8
+ module DRb
9
+
10
+ autoloaded_module(__FILE__.sub(/drb_ex\.rb/, 'drb.rb'))
11
+
12
+ end # module Drb
@@ -0,0 +1,57 @@
1
+ # Copyright: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
2
+ # Author: Nicolas Pouillard <ertai@lrde.epita.fr>.
3
+ # License: Gnu General Public License.
4
+
5
+ # $LastChangedBy: ertai $
6
+ # $Id: dumpable_proc.rb 266 2005-06-01 14:27:18Z ertai $
7
+
8
+ require 'ruby_ex'
9
+ require 'delegate'
10
+
11
+ class DumpableProc < DelegateClass(Proc)
12
+
13
+ def initialize ( str )
14
+ @str = str.freeze
15
+ super(eval("proc { #@str }"))
16
+ end
17
+
18
+ def _dump ( depth )
19
+ Marshal.dump([self.class, @str])
20
+ end
21
+
22
+ def self._load ( data )
23
+ klass, str = Marshal.load(data)
24
+ klass.new(str)
25
+ end
26
+
27
+ def to_yaml ( opts={} )
28
+ "#{to_yaml_type} #@str"
29
+ end
30
+
31
+ def to_s
32
+ @str
33
+ end
34
+
35
+ def to_yaml_type
36
+ '!proc'
37
+ end
38
+
39
+ end
40
+
41
+ test_section __FILE__ do
42
+
43
+ class DumpableProcTest < Test::Unit::TestCase
44
+
45
+ def test_simple
46
+ p = DumpableProc.new('|x| 3 + x')
47
+ assert_equal(7, p[4])
48
+ str = nil
49
+ assert_nothing_raised { str = Marshal.dump(p) }
50
+ p2 = nil
51
+ assert_nothing_raised { p2 = Marshal.load(str) }
52
+ assert_equal(9, p2[6])
53
+ end
54
+
55
+ end
56
+
57
+ end
data/src/filetype.rb ADDED
@@ -0,0 +1,229 @@
1
+ require 'ruby_ex'
2
+ require 'abstract'
3
+
4
+ module FileType
5
+
6
+ @@subclasses = []
7
+
8
+ def self.register ( klass )
9
+ @@subclasses << klass
10
+ end
11
+
12
+ class Generic
13
+ include Abstract
14
+
15
+ attr_reader :path, :base, :ext
16
+
17
+ def initialize ( path )
18
+ @path = Pathname.new(path)
19
+ re = self.class.extension
20
+ raise ArgumentError, "bad class #{self.class}" if re.nil?
21
+ unless @path.to_s =~ re
22
+ raise ArgumentError, "#{@path} do not match /#{re.source}/"
23
+ end
24
+ @base, @ext = $`, $&
25
+ if @ext.empty?
26
+ @base = self
27
+ else
28
+ @base = FileType.guess(@base)
29
+ end
30
+ end
31
+
32
+ def extsplit
33
+ [@base, @ext]
34
+ end
35
+
36
+ def self.inherited ( klass )
37
+ FileType.register(klass)
38
+ end
39
+
40
+ def to_s
41
+ @path.to_s
42
+ end
43
+
44
+ def self.extension
45
+ const_get(:EXTENSION)
46
+ end
47
+
48
+ def self.match_type ( path, max, best )
49
+ ext_re = self.extension
50
+ if path.to_s =~ ext_re and $&.size > max
51
+ return [$&.size, self]
52
+ end
53
+ return [max, best]
54
+ end
55
+
56
+ def + ( arg )
57
+ @path + arg.to_s
58
+ end
59
+
60
+ end # class Generic
61
+
62
+ class Unknown < Generic
63
+ include Concrete
64
+ EXTENSION = /(\.[^.\/]+)?$/
65
+ end # class Unknown
66
+
67
+ class ExtractError < Exception
68
+ end
69
+
70
+ module Extractable
71
+
72
+ def self.included ( aClass )
73
+
74
+ aClass.module_eval do
75
+
76
+ def mk_cmd
77
+ base, ext = @base.extsplit
78
+ @tmp = TempPath.new(base.path.basename, ext)
79
+ cmd = self.class.const_get(:EXTRACT_COMMAND).gsub(/%I/, @path.to_s)
80
+ cmd.gsub!(/%O/, @tmp.to_s)
81
+ cmd
82
+ end
83
+
84
+ def extract
85
+ cmd = mk_cmd
86
+ unless system(cmd)
87
+ @tmp.rmtree if @tmp.exist?
88
+ err = "
89
+ |Cannot extract a file:
90
+ | path: #{to_s}
91
+ | type: #{self.class}
92
+ | command: #{cmd}
93
+ | exit status: #{$? >> 8}
94
+ "
95
+ raise ExtractError, err.gsub(/^\s*|/, '')
96
+ end
97
+ FileType.guess(@tmp)
98
+ end
99
+
100
+ alias :default :extract
101
+
102
+ end
103
+
104
+ end
105
+
106
+ end # module Extractable
107
+
108
+ # FIXME Use the zlib if gzip not available.
109
+ class Gz < Generic
110
+ include Extractable
111
+ include Concrete
112
+ EXTENSION = /(\.(gz|z|Z)|-gz|-z|_z)$/
113
+ EXTRACT_COMMAND = 'gzip -d -c "%I" > "%O"'
114
+ end # class Gz
115
+
116
+ class Bz2 < Generic
117
+ include Extractable
118
+ include Concrete
119
+ EXTENSION = /\.(bz2|bz)$/
120
+ EXTRACT_COMMAND = 'bzip2 -d -c "%I" > "%O"'
121
+ end # class Bz2
122
+
123
+ class Zip < Generic
124
+ include Extractable
125
+ include Concrete
126
+ EXTENSION = /\.zip$/
127
+ EXTRACT_COMMAND = 'unzip -p "%I" > "%O"'
128
+ end # class Zip
129
+
130
+ module ExtractableDir
131
+
132
+ def self.included ( aClass )
133
+
134
+ aClass.module_eval do
135
+
136
+ include Extractable
137
+
138
+ alias :mk_cmd_extractable :mk_cmd
139
+
140
+ def mk_cmd
141
+ cmd = mk_cmd_extractable
142
+ @tmp.mkpath
143
+ @log = TempPath.new
144
+ cmd.gsub!(/%L/, @log.to_s)
145
+ end
146
+
147
+ alias :extract_extractable :extract
148
+
149
+ def extract
150
+ dir = extract_extractable
151
+ # We want the longest common path
152
+ longest = nil
153
+ @log.each_line do |line|
154
+ path = line.split(/\//)
155
+ longest = path if longest.nil?
156
+ longest &= path
157
+ raise CorruptedTarball, self if longest.empty?
158
+ end
159
+ dir.path + longest.join('/')
160
+ end
161
+
162
+ end
163
+
164
+ end
165
+
166
+ end # module ExtractableDir
167
+
168
+ class Tar < Generic
169
+ include ExtractableDir
170
+ include Concrete
171
+ EXTENSION = /\.tar$/
172
+ EXTRACT_COMMAND = 'tar xvf "%I" -C "%O" > "%L"'
173
+ end # class Tar
174
+
175
+ class TarGz < Generic
176
+ include ExtractableDir
177
+ include Concrete
178
+ EXTENSION = /\.(tar\.gz|tgz)$/
179
+ EXTRACT_COMMAND = 'tar xvzf "%I" -C "%O" > %L'
180
+ end # class TarGz
181
+
182
+ class TarBz2 < Generic
183
+ include ExtractableDir
184
+ include Concrete
185
+ EXTENSION = /\.(tar\.bz2|tbz2|tbz)$/
186
+ EXTRACT_COMMAND = 'bzip2 -c -d %I | tar xvf - -C "%O" > "%L"'
187
+ end # class TarBz2
188
+
189
+ class Directory < Generic
190
+ include Concrete
191
+
192
+ EXTENSION = /()$/
193
+
194
+ def self.match_type ( path, max, best )
195
+ if File.directory? path
196
+ return [path.to_s.size, self]
197
+ end
198
+ return [max, best]
199
+ end
200
+
201
+ end # class Directory
202
+
203
+ def self.guess_class ( path )
204
+ lazy_init
205
+ max = -1
206
+ best = Unknown
207
+ @@subclasses.each do |klass|
208
+ max, best = klass.match_type(path, max, best)
209
+ end
210
+ return best
211
+ end
212
+
213
+ def self.guess ( path )
214
+ guess_class(path).new(path)
215
+ end
216
+
217
+ def self.lazy_init
218
+ return if defined? @@init
219
+ @@init = true
220
+ @@subclasses.delete_if do |klass|
221
+ klass.abstract? or not (klass.is_a? Class) # and constants.include? klass)
222
+ end
223
+ @@subclasses.each do |klass|
224
+ ext = klass.extension
225
+ raise ArgumentError, "Bad extension #{ext}" unless ext.is_a? Regexp
226
+ end
227
+ end
228
+
229
+ end # module FileType
@@ -0,0 +1,44 @@
1
+ # Copyright:: Copyright (c) 2004 Nicolas Despres. All rights reserved.
2
+ # Author:: Nicolas Despres <polrop@lrde.epita.fr>.
3
+ # License:: Gnu General Public License.
4
+ # Revision:: $Id: generate_id.rb 266 2005-06-01 14:27:18Z ertai $
5
+
6
+
7
+ require 'ruby_ex'
8
+ require 'md5'
9
+
10
+ module Kernel
11
+
12
+ def generate_id(&already_exist)
13
+ md5 = Digest::MD5::new
14
+ id = ''
15
+ begin
16
+ md5.update(id)
17
+ md5.update(Time.now.to_s)
18
+ md5.update(rand.to_s)
19
+ md5.update($$.to_s)
20
+ md5.update($0)
21
+ id = md5.hexdigest[0,16]
22
+ end while block_given? and already_exist[id]
23
+ id
24
+ end
25
+
26
+ end # module Kernel
27
+
28
+
29
+
30
+ test_section __FILE__ do
31
+ class GenerateIdTest < Test::Unit::TestCase
32
+ def test_simple
33
+ tab = []
34
+ 100.times { tab << generate_id }
35
+ assert_equal(tab.size, tab.uniq.size)
36
+ end
37
+ def test_simple
38
+ tab = []
39
+ bool = true
40
+ 100.times { tab << generate_id { bool = !bool ; bool } }
41
+ assert_equal(tab.size, tab.uniq.size)
42
+ end
43
+ end
44
+ end
data/src/histogram.rb ADDED
@@ -0,0 +1,222 @@
1
+ # Copyright:: Copyright (c) 2005 Nicolas Pouillard. All rights reserved.
2
+ # Author:: Nicolas Pouillard <ertai@lrde.epita.fr>.
3
+ # License:: Gnu General Public License.
4
+ # Revision:: $Id: histogram.rb 266 2005-06-01 14:27:18Z ertai $
5
+
6
+ require 'ruby_ex'
7
+
8
+ class Histogram
9
+
10
+ class EquivalenceClass
11
+
12
+ attr_reader :values, :id
13
+
14
+ def initialize ( id, *values )
15
+ @id = id
16
+ @values = values.flatten
17
+ end
18
+
19
+
20
+ def include? ( anObject )
21
+ if @values.empty?
22
+ raise "You cannot call #{self.class}#include? with an empty class"
23
+ end
24
+ anObject == @values.first
25
+ end
26
+
27
+
28
+ def each ( &block )
29
+ @values.each(&block)
30
+ end
31
+
32
+
33
+ def << ( anObject )
34
+ @values << anObject
35
+ end
36
+
37
+
38
+ def size
39
+ @values.size
40
+ end
41
+
42
+
43
+ alias :count :size
44
+
45
+ end # class EquivalenceClass
46
+
47
+
48
+
49
+ # Here the enumearation is something which respond to each.
50
+ def initialize ( enum=nil )
51
+ @hist = []
52
+ enum.each { |x| self << x } unless enum.nil?
53
+ end
54
+
55
+
56
+ # Returns an array with size of each equivalence class.
57
+ def support
58
+ @hist.map { |equivalence_class| equivalence_class.size }
59
+ end
60
+
61
+
62
+ # Returns apparation frequences as an array which is the @support@
63
+ # divided by the amount of samples.
64
+ def frequences
65
+ sup = support
66
+ total = sup.sum
67
+ sup.map { |x| x.to_f / total }
68
+ end
69
+
70
+
71
+ def total
72
+ support.sum
73
+ end
74
+
75
+
76
+ def equivalence_class_of ( anObject )
77
+ @hist.each do |anEquivalenceClass|
78
+ return anEquivalenceClass if anEquivalenceClass.include? anObject
79
+ end
80
+ return nil
81
+ end
82
+
83
+
84
+ def equivalence_class_by_index ( anInteger )
85
+ @hist[anInteger]
86
+ end
87
+
88
+
89
+ def << ( anObject )
90
+ anEquivalenceClass = equivalence_class_of anObject
91
+ if anEquivalenceClass.nil?
92
+ @hist << EquivalenceClass.new(@hist.size, anObject)
93
+ else
94
+ anEquivalenceClass << anObject
95
+ end
96
+ self
97
+ end
98
+
99
+
100
+ def [] ( anObject )
101
+ anEquivalenceClass = equivalence_class_of(anObject)
102
+ (anEquivalenceClass)? anEquivalenceClass.size : 0
103
+ end
104
+
105
+
106
+ def each ( &block )
107
+ @hist.each(&block)
108
+ end
109
+
110
+
111
+ def size
112
+ @hist.size
113
+ end
114
+
115
+
116
+ def to_a
117
+ @hist.dup
118
+ end
119
+
120
+ end # class Histogram
121
+
122
+
123
+
124
+ test_section __FILE__ do
125
+ require 'delegate'
126
+ require 'generator'
127
+
128
+ class HistogramTest < Test::Unit::TestCase
129
+
130
+ class Z_10Z_Integer < DelegateClass(Integer)
131
+ def == ( rhs )
132
+ to_i % 10 == rhs % 10
133
+ end
134
+ def succ
135
+ self.class.new(super)
136
+ end
137
+ end
138
+
139
+ def setup
140
+ @_1, @_42 = Z_10Z_Integer.new(1), Z_10Z_Integer.new(42)
141
+ @r = @_1 .. @_42
142
+ mk_hist(@r)
143
+ @support = [5, 5, 4, 4, 4, 4, 4, 4, 4, 4]
144
+ end
145
+
146
+ def mk_hist ( enum=nil, &block )
147
+ assert_nothing_raised { @h = Histogram.new(enum, &block) }
148
+ @h
149
+ end
150
+
151
+ def test_init_via_enum
152
+ assert_equal(1, mk_hist([0] * 10).size)
153
+ assert_equal(10, @h[0])
154
+ assert_equal(0, @h[1])
155
+ end
156
+
157
+ def test_uniform_range
158
+ assert_equal(11, mk_hist(0 .. 10).size)
159
+ (0 .. 10).each { |i| assert_equal(1, @h[i]) }
160
+ assert_equal(0, @h[11])
161
+ end
162
+
163
+ def test_a_large_uniform_range
164
+ enum = (0 .. 10).to_a * 10
165
+ mk_hist(enum)
166
+ assert_equal(0, @h[11])
167
+ enum.each { |i| assert_equal(10, @h[i]) }
168
+ assert_equal(0, @h[11])
169
+ end
170
+
171
+ def test_push # <<
172
+ assert_nothing_raised { @h << 12 }
173
+ assert_equal(5, @h[11])
174
+ assert_equal(6, @h[12])
175
+ @h << 11 << 12 << 22
176
+ assert_equal(4, @h[10])
177
+ assert_equal(6, @h[11])
178
+ assert_equal(8, @h[12])
179
+ end
180
+
181
+ def test_hooks # []
182
+ @h << 42
183
+ assert_kind_of(Integer, @h[42])
184
+ assert_equal(6, @h[42])
185
+ end
186
+
187
+ def test_each
188
+ g1 = Generator.new([5, 5, 4, 4, 4, 4, 4, 4, 4, 4])
189
+ g2 = Generator.new(@r)
190
+ @h.each do |equivalence_class|
191
+ assert_equal(x = g1.next, equivalence_class.size)
192
+ assert_equal(x, equivalence_class.values.size)
193
+ assert_equal(g2.next, equivalence_class.values.first)
194
+ end
195
+ end
196
+
197
+ def test_equivalence_class_of
198
+ assert_kind_of(Histogram::EquivalenceClass, @h.equivalence_class_of(42))
199
+ assert_equal([10, 20, 30, 40], @h.equivalence_class_of(0).values)
200
+ assert_equal([2, 12, 22, 32, 42], @h.equivalence_class_of(12).values)
201
+ assert_equal(5, @h[42])
202
+ end
203
+
204
+ def test_size
205
+ assert_equal(10, @h.size)
206
+ end
207
+
208
+ def test_support
209
+ assert_equal(@support, @h.support)
210
+ end
211
+
212
+ def test_total
213
+ assert_equal(42, @h.total)
214
+ end
215
+
216
+ def test_frequences
217
+ assert_equal(@support, @h.frequences.map { |x| x * 42 })
218
+ end
219
+
220
+ end # class HistogramTest
221
+
222
+ end