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