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