ruby_ex 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +51 -0
- data/ChangeLog +1763 -0
- data/NEWS +3 -0
- data/README +1 -0
- data/Rakefile +8 -0
- data/SPEC.dyn.yml +10 -0
- data/SPEC.gem.yml +269 -0
- data/SPEC.yml +36 -0
- data/src/abstract.rb +253 -0
- data/src/abstract_node.rb +85 -0
- data/src/algorithms.rb +12 -0
- data/src/algorithms/simulated_annealing.rb +142 -0
- data/src/ask.rb +100 -0
- data/src/attributed_class.rb +303 -0
- data/src/cache.rb +350 -0
- data/src/checkout.rb +12 -0
- data/src/choose.rb +271 -0
- data/src/commands.rb +20 -0
- data/src/commands/command.rb +492 -0
- data/src/commands/datas.rb +16 -0
- data/src/commands/datas/composite.rb +31 -0
- data/src/commands/datas/data.rb +65 -0
- data/src/commands/datas/factory.rb +69 -0
- data/src/commands/datas/temp.rb +26 -0
- data/src/commands/factory.rb +67 -0
- data/src/commands/helpers.rb +81 -0
- data/src/commands/pipe.rb +66 -0
- data/src/commands/runners.rb +16 -0
- data/src/commands/runners/exec.rb +50 -0
- data/src/commands/runners/fork.rb +130 -0
- data/src/commands/runners/runner.rb +140 -0
- data/src/commands/runners/system.rb +57 -0
- data/src/commands/seq.rb +32 -0
- data/src/config_file.rb +95 -0
- data/src/const_regexp.rb +57 -0
- data/src/daemon.rb +135 -0
- data/src/diff.rb +665 -0
- data/src/dlogger.rb +62 -0
- data/src/drb/drb_observable.rb +95 -0
- data/src/drb/drb_observable_pool.rb +27 -0
- data/src/drb/drb_service.rb +44 -0
- data/src/drb/drb_undumped_attributes.rb +56 -0
- data/src/drb/drb_undumped_indexed_object.rb +55 -0
- data/src/drb/insecure_protected_methods.rb +101 -0
- data/src/drb_ex.rb +12 -0
- data/src/dumpable_proc.rb +57 -0
- data/src/filetype.rb +229 -0
- data/src/generate_id.rb +44 -0
- data/src/histogram.rb +222 -0
- data/src/hookable.rb +283 -0
- data/src/hooker.rb +54 -0
- data/src/indexed_node.rb +65 -0
- data/src/io_marshal.rb +99 -0
- data/src/ioo.rb +193 -0
- data/src/labeled_node.rb +62 -0
- data/src/logger_observer.rb +24 -0
- data/src/md5sum.rb +70 -0
- data/src/module/autoload_tree.rb +65 -0
- data/src/module/hierarchy.rb +334 -0
- data/src/module/instance_method_visibility.rb +71 -0
- data/src/node.rb +81 -0
- data/src/object_monitor.rb +143 -0
- data/src/object_monitor_activity.rb +34 -0
- data/src/observable.rb +138 -0
- data/src/observable_pool.rb +291 -0
- data/src/orderedhash.rb +252 -0
- data/src/pp_hierarchy.rb +30 -0
- data/src/random_generators.rb +29 -0
- data/src/random_generators/random_generator.rb +33 -0
- data/src/random_generators/ruby.rb +25 -0
- data/src/ruby_ex.rb +124 -0
- data/src/safe_eval.rb +346 -0
- data/src/sendmail.rb +214 -0
- data/src/service_manager.rb +122 -0
- data/src/shuffle.rb +30 -0
- data/src/spring.rb +134 -0
- data/src/spring_set.rb +134 -0
- data/src/symtbl.rb +108 -0
- data/src/synflow.rb +474 -0
- data/src/thread_mutex.rb +11 -0
- data/src/timeout_ex.rb +79 -0
- data/src/trace.rb +26 -0
- data/src/uri/druby.rb +78 -0
- data/src/uri/file.rb +63 -0
- data/src/uri/ftp_ex.rb +36 -0
- data/src/uri/http_ex.rb +41 -0
- data/src/uri/pgsql.rb +136 -0
- data/src/uri/ssh.rb +87 -0
- data/src/uri/svn.rb +113 -0
- data/src/uri_ex.rb +71 -0
- data/src/verbose_object.rb +70 -0
- data/src/yaml/basenode_ext.rb +63 -0
- data/src/yaml/chop_header.rb +24 -0
- data/src/yaml/transform.rb +450 -0
- data/src/yaml/yregexpath.rb +76 -0
- data/test/algorithms/simulated_annealing_test.rb +102 -0
- data/test/check-pkg-ruby_ex.yml +15 -0
- data/test/check-ruby_ex.yml +12 -0
- data/test/resources/autoload_tree/A.rb +11 -0
- data/test/resources/autoload_tree/B.rb +10 -0
- data/test/resources/autoload_tree/foo/C.rb +18 -0
- data/test/resources/foo.txt +6 -0
- data/test/sanity-suite.yml +12 -0
- data/test/sanity/multiple-requires.yml +20 -0
- data/test/sanity/single-requires.yml +24 -0
- data/test/test-unit-setup.rb +6 -0
- data/test/unit-suite.yml +14 -0
- 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
|