ruby_ex 0.1.1

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