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
@@ -0,0 +1,71 @@
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
+
5
+ # $LastChangedBy: polrop $
6
+ # $Id: instance_method_visibility.rb 266 2005-06-01 14:27:18Z ertai $
7
+
8
+ require 'ruby_ex'
9
+
10
+ class Module
11
+
12
+ def instance_method_visibility(name)
13
+ if private_method_defined?(name)
14
+ :private
15
+ elsif protected_method_defined?(name)
16
+ :protected
17
+ elsif public_method_defined?(name)
18
+ :public
19
+ else
20
+ raise(NoMethodError,
21
+ "`#{name}' - not an instance method of `#{self.name}'")
22
+ end
23
+ end
24
+
25
+ end # class Module
26
+
27
+
28
+ test_section __FILE__ do
29
+
30
+
31
+
32
+ class InstanceMethodVisibilityTest < Test::Unit::TestCase
33
+
34
+ class A
35
+
36
+ def pub; end
37
+ def pri; end
38
+ def pro; end
39
+
40
+ public :pub
41
+ private :pri
42
+ protected :pro
43
+
44
+ end # class A
45
+
46
+ def test_simple
47
+ assert_equal(:public, A.instance_method_visibility('pub'))
48
+ assert_equal(:private, A.instance_method_visibility('pri'))
49
+ assert_equal(:protected, A.instance_method_visibility('pro'))
50
+ assert_raises(NoMethodError) { A.instance_method_visibility('new') }
51
+ end
52
+
53
+ class AA
54
+ def f; end
55
+ end
56
+ class BB < AA
57
+ private :f
58
+ end
59
+
60
+ def test_inheritance
61
+ assert_equal(:public, AA.instance_method_visibility('f'))
62
+ assert(! BB.public_method_defined?('f'))
63
+ assert_equal(:private, BB.instance_method_visibility('f'))
64
+ end
65
+
66
+ end # class InstanceMethodVisibilityTest
67
+
68
+
69
+ end
70
+
71
+
data/src/node.rb ADDED
@@ -0,0 +1,81 @@
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
+
5
+ # $LastChangedBy: polrop $
6
+ # $Id: node.rb 171 2005-03-29 09:12:47Z polrop $
7
+
8
+ require 'ruby_ex'
9
+
10
+ class Node
11
+
12
+ def initialize(data=nil, *sub_nodes)
13
+ @data = data
14
+ sub_nodes.each { |sub_node| check_sub_node_type(sub_node) }
15
+ @sub_nodes = sub_nodes
16
+ end
17
+
18
+ attr_reader :data, :sub_nodes
19
+
20
+ def [](sub_node_index)
21
+ @sub_nodes[sub_node_index]
22
+ end
23
+
24
+ def []=(sub_node_index, sub_node)
25
+ check_sub_node_type(sub_node)
26
+ @sub_nodes[sub_node_index] = sub_node
27
+ end
28
+
29
+ def <<(sub_node)
30
+ check_sub_node_type(sub_node)
31
+ @sub_nodes << sub_node
32
+ end
33
+
34
+ def each_pair(&block)
35
+ @sub_nodes.each_with_index { |sub_node, i| block[i, sub_node] }
36
+ end
37
+
38
+ def each_node(&block)
39
+ @sub_nodes.each_with_index { |sub_node, index| block[sub_node] }
40
+ end
41
+
42
+ alias :each :each_node
43
+
44
+ def each_index(&block)
45
+ @sub_nodes.each_with_index { |sub_node, index| block[index] }
46
+ end
47
+
48
+ def delete(sub_node)
49
+ @sub_nodes.delete(sub_node)
50
+ end
51
+
52
+ def nb_sub_nodes
53
+ @sub_nodes.size
54
+ end
55
+
56
+ alias size nb_sub_nodes
57
+ alias length nb_sub_nodes
58
+
59
+ def leaf?
60
+ @sub_nodes.empty?
61
+ end
62
+
63
+ def pre_depth_first(&block)
64
+ block[self]
65
+ @sub_nodes.each { |sub_node| sub_node.pre_depth_first(&block) }
66
+ nil
67
+ end
68
+
69
+ # FIXME: implement me
70
+ # def breadth_first(&block)
71
+ # end
72
+
73
+ protected
74
+ def check_sub_node_type(sub_node)
75
+ unless sub_node.is_a?(self.class)
76
+ raise(TypeError, "`#{sub_node}' - must be a #{self.class}")
77
+ end
78
+ end
79
+
80
+ end # class Node
81
+
@@ -0,0 +1,143 @@
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
+
5
+ # $LastChangedBy: ertai $
6
+ # $Id: object_monitor.rb 266 2005-06-01 14:27:18Z ertai $
7
+
8
+
9
+ require 'ruby_ex'
10
+ require 'observable'
11
+
12
+
13
+ class ObjectMonitor
14
+ include Observable
15
+
16
+ attr_reader :nb_method
17
+
18
+ def initialize(object, *observers)
19
+ @object = object
20
+ add_observers(*observers)
21
+ @nb_method = 0
22
+ end
23
+
24
+ def method_missing(meth, *args, &block)
25
+ info = init_method_info(meth, *args, &block)
26
+ start_method(info)
27
+ result = nil
28
+ begin
29
+ result = @object.send(meth, *args, &block)
30
+ rescue Exception => exc
31
+ info[:stop_time] = Time.now
32
+ info[:error] = exc
33
+ stop_method(info)
34
+ raise exc
35
+ ensure
36
+ @nb_method += 1
37
+ end
38
+ info[:stop_time] = Time.now
39
+ info[:result] = result
40
+ stop_method(info)
41
+ result
42
+ end
43
+
44
+ protected
45
+ def init_method_info(meth, *args, &block)
46
+ {
47
+ :num => @nb_method,
48
+ :receiver => @object,
49
+ :method => meth,
50
+ :args => args,
51
+ :block => block,
52
+ :start_time => Time.now,
53
+ :stop_time => nil,
54
+ :thread => Thread.current,
55
+ :error => nil,
56
+ :result => nil,
57
+ }
58
+ end
59
+
60
+ protected
61
+ def start_method(info)
62
+ changed
63
+ notify_observers(:start_method, info)
64
+ end
65
+
66
+ protected
67
+ def stop_method(info)
68
+ changed
69
+ notify_observers(:stop_method, info)
70
+ end
71
+
72
+ end # class ObjectMonitor
73
+
74
+
75
+ test_section __FILE__ do
76
+
77
+
78
+ class ObjectMonitorTest < Test::Unit::TestCase
79
+
80
+ class Foo
81
+
82
+ def hello
83
+ 'hello'
84
+ end
85
+
86
+ def failed
87
+ raise 'failed msg'
88
+ end
89
+
90
+ end
91
+
92
+ class Obsv
93
+
94
+ attr_reader :last_msg
95
+
96
+ def initialize
97
+ @last_msg = []
98
+ end
99
+
100
+ def update(*args)
101
+ @last_msg << args
102
+ end
103
+
104
+ end
105
+
106
+ def test_normal
107
+ f = Foo.new
108
+ obsv = Obsv.new
109
+ fm = ObjectMonitor.new(f, obsv)
110
+ assert_equal(0, fm.nb_method)
111
+ assert_equal([], obsv.last_msg)
112
+ assert_equal('hello', fm.hello)
113
+ assert_equal(1, fm.nb_method)
114
+ assert_equal(:start_method, obsv.last_msg[0][0])
115
+ assert_equal(2, obsv.last_msg[0].size)
116
+ assert_equal(:stop_method, obsv.last_msg[1][0])
117
+ assert_equal(2, obsv.last_msg[0].size)
118
+ end
119
+
120
+ def test_exception
121
+ f = Foo.new
122
+ obsv = Obsv.new
123
+ fm = ObjectMonitor.new(f, obsv)
124
+ assert_equal(0, fm.nb_method)
125
+ assert_equal([], obsv.last_msg)
126
+ assert_raises(RuntimeError) { fm.failed }
127
+ assert_equal(1, fm.nb_method)
128
+ assert_equal(:start_method, obsv.last_msg[0][0])
129
+ assert_equal(2, obsv.last_msg[0].size)
130
+ assert_equal(:stop_method, obsv.last_msg[1][0])
131
+ assert_equal(2, obsv.last_msg[0].size)
132
+ assert_equal('hello', fm.hello)
133
+ assert_equal(2, fm.nb_method)
134
+ end
135
+
136
+ def test_accessor
137
+ assert_respond_to(ObjectMonitor.new(nil), :list_observers)
138
+ end
139
+
140
+ end # class ObjectMonitorTest
141
+
142
+
143
+ end
@@ -0,0 +1,34 @@
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
+
5
+ # $LastChangedBy: ertai $
6
+ # $Id: object_monitor_activity.rb 266 2005-06-01 14:27:18Z ertai $
7
+
8
+
9
+ require 'ruby_ex'
10
+ require 'observable'
11
+
12
+
13
+ class ObjectMonitorActivity
14
+ include Observable
15
+
16
+ def initialize
17
+ @mutex = Mutex.new
18
+ @activity = {}
19
+ end
20
+
21
+ def update(msg, info)
22
+ case msg
23
+ when :start_method: @mutex.synchronize { @activity[info[:num]] = info }
24
+ when :stop_method: @mutex.synchronize { @activity.delete(info[:num]) }
25
+ else raise 'unknown message'
26
+ end
27
+ end
28
+
29
+ def snapshot
30
+ @mutex.synchronize { @activity.dup }
31
+ end
32
+
33
+ end # class ObjectMonitorActivity
34
+
data/src/observable.rb ADDED
@@ -0,0 +1,138 @@
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
+
5
+ # $LastChangedBy: ertai $
6
+ # $Id: observable.rb 266 2005-06-01 14:27:18Z ertai $
7
+
8
+
9
+ require 'ruby_ex'
10
+ require 'observer'
11
+
12
+
13
+ module Observable
14
+
15
+ def add_observers(*observers)
16
+ observers.each { |observer| add_observer(observer) }
17
+ end
18
+
19
+ def observer?(observer)
20
+ if defined? @observer_peers
21
+ @observer_peers.include?(observer)
22
+ else
23
+ false
24
+ end
25
+ end
26
+
27
+ def list_observers
28
+ if defined? @observer_peers
29
+ @observer_peers.dup
30
+ else
31
+ []
32
+ end
33
+ end
34
+
35
+ def notify_observer(observer, *arg, &block)
36
+ if defined? @observer_state and @observer_state
37
+ if defined? @observer_peers
38
+ if @observer_peers.include?(observer)
39
+ observer.update(*arg, &block)
40
+ end
41
+ end
42
+ @observer_state = false
43
+ end
44
+ end
45
+
46
+ def self.included(klass)
47
+ klass.module_eval do
48
+ class << self
49
+ unless method_defined?(:notifier_methods_visibility)
50
+ def notifier_methods_visibility(visibility)
51
+ send(visibility, *instance_methods)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+
58
+ end # module Observable
59
+
60
+
61
+ test_section __FILE__ do
62
+
63
+
64
+ class ObservableTest < Test::Unit::TestCase
65
+
66
+ class Notify
67
+ include Observable
68
+
69
+ def initialize(*obsv)
70
+ obsv.each { |o| add_observer(o) }
71
+ end
72
+
73
+ end # class Notify
74
+
75
+ class Obsv
76
+
77
+ attr_reader :last_msg
78
+
79
+ def initialize
80
+ @last_msg = nil
81
+ end
82
+
83
+ def update(arg)
84
+ @last_msg = arg
85
+ end
86
+
87
+ end # class Obsv
88
+
89
+ #
90
+ # Tests
91
+ #
92
+ def test_simple
93
+ o1 = Obsv.new
94
+ o2 = Obsv.new
95
+ n = Notify.new(o1, o2)
96
+ assert_equal(2, n.count_observers, 'bad number of observers')
97
+ assert(n.observer?(o1))
98
+ n.changed
99
+ n.notify_observers('all')
100
+ assert_equal('all', o1.last_msg, 'bad msg o1 1')
101
+ assert_equal('all', o2.last_msg, 'bad msg o2 1')
102
+ l = n.list_observers
103
+ assert_equal(o1, l[0], 'o1 is not at the right place in the list')
104
+ assert_equal(o2, l[1], 'o2 is not at the right place in the list')
105
+ n.changed
106
+ n.notify_observer(o1, 'o1')
107
+ assert_equal('o1', o1.last_msg, 'bad msg o1 2')
108
+ assert_equal('all', o2.last_msg, 'bad msg o2 2')
109
+ n.changed
110
+ n.notify_observer(o2, 'o2')
111
+ assert_equal('o1', o1.last_msg, 'bad msg o1 3')
112
+ assert_equal('o2', o2.last_msg, 'bad msg o2 3')
113
+ n.changed
114
+ n.notify_observer(o1, 'new_all')
115
+ n.changed
116
+ n.notify_observer(o2, 'new_all')
117
+ assert_equal('new_all', o1.last_msg, 'bad msg o1 4')
118
+ assert_equal('new_all', o2.last_msg, 'bad msg o2 4')
119
+ end
120
+
121
+ class ObservableMethodsVisibilityFoo
122
+ include Observable
123
+
124
+ notifier_methods_visibility(:protected)
125
+ end
126
+
127
+ def test_notifier_methods_visibility
128
+ fm = ObservableMethodsVisibilityFoo.new
129
+ assert_raises(NoMethodError) { fm.add_observer(Object.new) }
130
+ assert_raises(NoMethodError) { fm.notify_observer(Object.new) }
131
+ assert_raises(NoMethodError) { fm.list_observer }
132
+ assert_raises(NoMethodError) { fm.changed? }
133
+ end
134
+
135
+ end # class ObservableTest
136
+
137
+
138
+ end