vcs 0.1 → 0.2.148
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/Rakefile +17 -3
- data/bin/vcs +57 -34
- data/doc/jamis.rb +564 -0
- data/ruby_ex/abstract.rb +254 -0
- data/ruby_ex/abstract_node.rb +85 -0
- data/ruby_ex/algorithms/simulated_annealing.rb +140 -0
- data/ruby_ex/array_each_pair.rb +18 -0
- data/ruby_ex/ask.rb +101 -0
- data/ruby_ex/attributed_class.rb +302 -0
- data/ruby_ex/cache.rb +373 -0
- data/ruby_ex/checkout.rb +12 -0
- data/ruby_ex/choose.rb +271 -0
- data/ruby_ex/commands.rb +18 -0
- data/ruby_ex/commands/command.rb +401 -0
- data/ruby_ex/commands/datas.rb +16 -0
- data/ruby_ex/commands/datas/data.rb +33 -0
- data/ruby_ex/commands/datas/factory.rb +66 -0
- data/ruby_ex/commands/factory.rb +66 -0
- data/ruby_ex/commands/helpers.rb +67 -0
- data/ruby_ex/commands/pipe.rb +64 -0
- data/ruby_ex/commands/runners.rb +17 -0
- data/ruby_ex/commands/runners/exec.rb +49 -0
- data/ruby_ex/commands/runners/fork.rb +97 -0
- data/ruby_ex/commands/runners/runner.rb +107 -0
- data/ruby_ex/commands/seq.rb +27 -0
- data/ruby_ex/config_file.rb +96 -0
- data/ruby_ex/const_regexp.rb +59 -0
- data/ruby_ex/daemon.rb +134 -0
- data/ruby_ex/diff.rb +667 -0
- data/ruby_ex/dlogger.rb +62 -0
- data/ruby_ex/drb/dispatcher.rb +252 -0
- data/ruby_ex/drb/dispatcher_server_test.rb +29 -0
- data/ruby_ex/drb/drb_observable.rb +97 -0
- data/ruby_ex/drb/drb_observable_pool.rb +27 -0
- data/ruby_ex/drb/drb_service.rb +43 -0
- data/ruby_ex/drb/drb_undumped_attributes.rb +55 -0
- data/ruby_ex/drb/drb_undumped_indexed_object.rb +54 -0
- data/ruby_ex/drb/insecure_protected_methods.rb +103 -0
- data/ruby_ex/drb/session_client_test.rb +40 -0
- data/ruby_ex/drb/session_manager.rb +246 -0
- data/ruby_ex/drb/session_server.rb +53 -0
- data/ruby_ex/dtime.rb +143 -0
- data/ruby_ex/dumpable_proc.rb +63 -0
- data/ruby_ex/exception.rb +32 -0
- data/ruby_ex/filetype.rb +229 -0
- data/ruby_ex/fileutils_ex.rb +44 -0
- data/ruby_ex/fold.rb +58 -0
- data/ruby_ex/generate_id.rb +44 -0
- data/ruby_ex/hookable.rb +262 -0
- data/ruby_ex/hooker.rb +54 -0
- data/ruby_ex/inactive_timeout.rb +137 -0
- data/ruby_ex/indexed_node.rb +66 -0
- data/ruby_ex/io_marshal.rb +100 -0
- data/ruby_ex/ioo.rb +194 -0
- data/ruby_ex/labeled_node.rb +63 -0
- data/ruby_ex/logger_observer.rb +23 -0
- data/ruby_ex/md5sum.rb +66 -0
- data/ruby_ex/mktemp.rb +208 -0
- data/ruby_ex/module/attr_once.rb +36 -0
- data/ruby_ex/module/autoload_tree.rb +75 -0
- data/ruby_ex/module/hierarchy.rb +335 -0
- data/ruby_ex/module/instance_method_visibility.rb +73 -0
- data/ruby_ex/module_ex.rb +11 -0
- data/ruby_ex/node.rb +80 -0
- data/ruby_ex/object_monitor.rb +145 -0
- data/ruby_ex/object_monitor_activity.rb +33 -0
- data/ruby_ex/observable.rb +140 -0
- data/ruby_ex/observable_pool.rb +293 -0
- data/ruby_ex/orderedhash.rb +252 -0
- data/ruby_ex/pathname_ex.rb +152 -0
- data/ruby_ex/pp_hierarchy.rb +29 -0
- data/ruby_ex/pseudo_cache.rb +190 -0
- data/ruby_ex/queue.rb +56 -0
- data/ruby_ex/random_generators.rb +25 -0
- data/ruby_ex/random_generators/random_generator.rb +31 -0
- data/ruby_ex/random_generators/ruby.rb +23 -0
- data/ruby_ex/safe_eval.rb +348 -0
- data/ruby_ex/sendmail.rb +215 -0
- data/ruby_ex/service_manager.rb +121 -0
- data/ruby_ex/session/administrable.rb +120 -0
- data/ruby_ex/session/client.rb +153 -0
- data/ruby_ex/session/const.rb +18 -0
- data/ruby_ex/session/dispatcher.rb +184 -0
- data/ruby_ex/session/error.rb +21 -0
- data/ruby_ex/session/fetchable.rb +57 -0
- data/ruby_ex/session/fetcher.rb +62 -0
- data/ruby_ex/session/hookable.rb +26 -0
- data/ruby_ex/session/profile.rb +110 -0
- data/ruby_ex/session/server.rb +582 -0
- data/ruby_ex/session/test/administrable_test.rb +337 -0
- data/ruby_ex/session/test/basic_test.rb +523 -0
- data/ruby_ex/session/test/dispatcher_test.rb +409 -0
- data/ruby_ex/session/test/fetchable_test.rb +119 -0
- data/ruby_ex/session/test/sub_server_test.rb +188 -0
- data/ruby_ex/shuffle.rb +30 -0
- data/ruby_ex/spring.rb +136 -0
- data/ruby_ex/spring_set.rb +137 -0
- data/ruby_ex/string_ex.rb +28 -0
- data/ruby_ex/symtbl.rb +106 -0
- data/ruby_ex/synflow.rb +474 -0
- data/ruby_ex/test/unit/ui/yaml/testrunner.rb +164 -0
- data/ruby_ex/thread_mutex.rb +10 -0
- data/ruby_ex/timeout_ex.rb +81 -0
- data/ruby_ex/top_down.rb +73 -0
- data/ruby_ex/trace.rb +26 -0
- data/ruby_ex/uri/druby.rb +81 -0
- data/ruby_ex/uri/file.rb +65 -0
- data/ruby_ex/uri/ftp_ex.rb +37 -0
- data/ruby_ex/uri/http_ex.rb +43 -0
- data/ruby_ex/uri/ssh.rb +92 -0
- data/ruby_ex/uri/svn.rb +118 -0
- data/ruby_ex/uri_ex.rb +45 -0
- data/ruby_ex/verbose_object.rb +30 -0
- data/ruby_ex/version.rb +66 -0
- data/ruby_ex/yaml/basenode_ext.rb +63 -0
- data/ruby_ex/yaml/chop_header.rb +23 -0
- data/ruby_ex/yaml/transform.rb +449 -0
- data/ruby_ex/yaml/yregexpath.rb +76 -0
- data/src/changelog.rb +28 -18
- data/src/conflict.rb +20 -0
- data/src/diff.rb +18 -0
- data/src/diffstat.rb +9 -3
- data/src/last_changed_date.rb +18 -0
- data/src/mail.rb +33 -65
- data/src/message.rb +15 -9
- data/src/mycommit.rb +29 -14
- data/src/news.rb +24 -3
- data/src/status.rb +17 -0
- data/src/svn.rb +2 -2
- data/src/vcs.rb +24 -3
- metadata +124 -5
- data/lrdetools.rb +0 -12
data/ruby_ex/dlogger.rb
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Copyright: Copyright (c) 2004 Nicolas Pouillard. All rights reserved.
|
|
2
|
+
# Author: Nicolas Pouillard <ertai@lrde.epita.fr>.
|
|
3
|
+
# License: Gnu General Public License.
|
|
4
|
+
|
|
5
|
+
# $LastChangedBy: polrop $
|
|
6
|
+
# $Id: dlogger.rb 99 2005-01-13 19:14:44Z polrop $
|
|
7
|
+
|
|
8
|
+
require 'logger'
|
|
9
|
+
|
|
10
|
+
# This Logger subclass permit to use more debug levels
|
|
11
|
+
#
|
|
12
|
+
# log = DLogger.new(STDERR)
|
|
13
|
+
# log.level = -1
|
|
14
|
+
# log.debug1 "You see me"
|
|
15
|
+
# log.debug2 "You see me"
|
|
16
|
+
# log.debug3 "You don't see me"
|
|
17
|
+
#
|
|
18
|
+
class DLogger < Logger
|
|
19
|
+
|
|
20
|
+
def format_severity ( severity )
|
|
21
|
+
return super if severity >= 0
|
|
22
|
+
return "DEBUG#{severity.abs + 1}"
|
|
23
|
+
end
|
|
24
|
+
private :format_severity
|
|
25
|
+
|
|
26
|
+
def method_missing ( meth, progname=nil, *args, &block )
|
|
27
|
+
return super unless meth.to_s =~ /^debug(\d+)$/ or !args.empty
|
|
28
|
+
add(-$1.to_i + 1, nil, progname, &block)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
Format = "%s, [%s#%d] %6s -- %s: %s\n"
|
|
32
|
+
def format_message(severity, timestamp, msg, progname)
|
|
33
|
+
Format % [severity[0..0], timestamp, $$, severity, progname, msg]
|
|
34
|
+
end
|
|
35
|
+
private :format_message
|
|
36
|
+
|
|
37
|
+
end # class DLogger
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
if defined? TEST_MODE or $0 == __FILE__
|
|
41
|
+
|
|
42
|
+
require 'stringio'
|
|
43
|
+
require 'test/unit'
|
|
44
|
+
|
|
45
|
+
class DLoggerTest < Test::Unit::TestCase
|
|
46
|
+
|
|
47
|
+
def test1
|
|
48
|
+
cout = StringIO.new
|
|
49
|
+
log = DLogger.new(cout)
|
|
50
|
+
log.level = -1
|
|
51
|
+
log.debug1 'You see me'
|
|
52
|
+
log.debug3 'You don\'t see me'
|
|
53
|
+
log.debug2 'You see me'
|
|
54
|
+
cout.rewind
|
|
55
|
+
ref = /D, \[\d+-\d+-\d+.\d+:\d+:\d+\.\d+ #\d+\] DEBUG -- : You see me
|
|
56
|
+
D, \[\d+-\d+-\d+.\d+:\d+:\d+\.\d+ #\d+\] DEBUG2 -- : You see me/
|
|
57
|
+
assert_match(ref, cout.readlines.join)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end # class DLoggerTest
|
|
61
|
+
|
|
62
|
+
end
|
|
@@ -0,0 +1,252 @@
|
|
|
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: dispatcher.rb 186 2005-04-03 00:07:45Z ertai $
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
require 'drb/drb'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
module DRb
|
|
13
|
+
|
|
14
|
+
class Dispatcher
|
|
15
|
+
|
|
16
|
+
URIS = []
|
|
17
|
+
MAX_JOB = 5
|
|
18
|
+
MAX_JOB_LIMIT = 100
|
|
19
|
+
DRB_OBJECT_CLASS = DRbObject
|
|
20
|
+
|
|
21
|
+
attr_reader :max_job
|
|
22
|
+
|
|
23
|
+
def initialize(uris=URIS,
|
|
24
|
+
max_job=MAX_JOB,
|
|
25
|
+
drb_object_class=DRB_OBJECT_CLASS,
|
|
26
|
+
*args,
|
|
27
|
+
&block)
|
|
28
|
+
unless 1 <= max_job && max_job <= MAX_JOB_LIMIT
|
|
29
|
+
raise(ArgumentError,
|
|
30
|
+
"`#{max_job}' - too big max job (must be <= #{MAX_JOB_LIMIT})")
|
|
31
|
+
end
|
|
32
|
+
@max_job = max_job
|
|
33
|
+
@uris = {}
|
|
34
|
+
uris.each { |uri| add(uri, drb_object_class, *args, &block) }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def [](uri)
|
|
38
|
+
@uris[uri]
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def add(uri, drb_object_class, *args, &block)
|
|
42
|
+
@uris[uri] = drb_object_class.new(nil, uri, *args, &block)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def del(uri)
|
|
46
|
+
@uris.delete(uri)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def each
|
|
50
|
+
@uris.each { |uri, ro| yield(uri, ro) }
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def dispatch(ros, meth, *args, &block)
|
|
54
|
+
result = {}
|
|
55
|
+
nb_threads = [ ros.size, @max_job].min
|
|
56
|
+
if nb_threads == 1
|
|
57
|
+
res = request(ros[0], meth, *args, &block)
|
|
58
|
+
result.update(res)
|
|
59
|
+
else
|
|
60
|
+
mutex = Mutex.new
|
|
61
|
+
threads = []
|
|
62
|
+
ros_q = ros.dup
|
|
63
|
+
nb_threads.times do
|
|
64
|
+
threads << Thread.new do
|
|
65
|
+
loop do
|
|
66
|
+
ro = mutex.synchronize { ros_q.shift }
|
|
67
|
+
break if ro.nil?
|
|
68
|
+
res = request(ro, meth, *args, &block)
|
|
69
|
+
mutex.synchronize { result.update(res) }
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
threads.each { |thread| thread.join }
|
|
74
|
+
end
|
|
75
|
+
result
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
alias update dispatch
|
|
79
|
+
|
|
80
|
+
def select(&comp)
|
|
81
|
+
ros = []
|
|
82
|
+
each { |uri, ro| ros << ro if comp[ro] }
|
|
83
|
+
ros
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def select_all
|
|
87
|
+
select { |ro| true }
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def select_by(result, meth, *args, &block)
|
|
91
|
+
select { |ro| test_ro_attribut(ro, result, meth, *args, &block) }
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def multi_select_by(hash, init_val=true, &bool_fun)
|
|
95
|
+
select do |ro|
|
|
96
|
+
ret = init_val
|
|
97
|
+
hash.each do |k, v|
|
|
98
|
+
ret = bool_fun[ret, test_ro_attribut(ro, v, k)]
|
|
99
|
+
end
|
|
100
|
+
ret
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def and_multi_select_by(hash)
|
|
105
|
+
select do |ro|
|
|
106
|
+
ret = true
|
|
107
|
+
hash.each do |k, v|
|
|
108
|
+
ret = (ret and test_ro_attribut(ro, v, k))
|
|
109
|
+
end
|
|
110
|
+
ret
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def or_multi_select_by(hash)
|
|
115
|
+
select do |ro|
|
|
116
|
+
ret = false
|
|
117
|
+
hash.each { |k, v| ret = (ret or test_ro_attribut(ro, v, k)) }
|
|
118
|
+
ret
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def dispatch_all(meth, *args, &block)
|
|
123
|
+
dispatch(select_all, meth, *args, &block)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def method_missing(meth, *args, &block)
|
|
127
|
+
dispatch_all(meth, *args, &block)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def request(ro, meth, *args, &block)
|
|
131
|
+
res = nil
|
|
132
|
+
begin
|
|
133
|
+
res = ro.send(meth, *args, &block)
|
|
134
|
+
rescue Exception => err
|
|
135
|
+
res = err
|
|
136
|
+
end
|
|
137
|
+
{ ro.__drburi => res }
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
protected
|
|
141
|
+
def test_ro_attribut(ro, result, meth, *args, &block)
|
|
142
|
+
res = request(ro, meth, *args, &block)
|
|
143
|
+
if result.is_a? Regexp
|
|
144
|
+
res[ro.__drburi].to_s =~ result
|
|
145
|
+
else
|
|
146
|
+
res[ro.__drburi] == result
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
end # class Dispatcher
|
|
151
|
+
|
|
152
|
+
end # module DRb
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
if defined? TEST_MODE or $0 == __FILE__
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
require 'test/unit/ui/yaml/testrunner'
|
|
159
|
+
require 'rbconfig'
|
|
160
|
+
require 'drb/session_manager'
|
|
161
|
+
|
|
162
|
+
module DRb
|
|
163
|
+
|
|
164
|
+
class DispatcherTest < ::Test::Unit::TestCase
|
|
165
|
+
|
|
166
|
+
class MyDRbObject < DRbObject
|
|
167
|
+
|
|
168
|
+
attr_reader :uri, :hostname, :port, :protocol
|
|
169
|
+
|
|
170
|
+
def initialize(obj, uri=nil)
|
|
171
|
+
super
|
|
172
|
+
if uri =~ /(^.*?):\/\/(.*?):(\d*)$/
|
|
173
|
+
@protocol = $1
|
|
174
|
+
@hostname = $2
|
|
175
|
+
@port = $3.to_i
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
#
|
|
182
|
+
# Tests
|
|
183
|
+
#
|
|
184
|
+
def test_multi_select_by
|
|
185
|
+
n = 5
|
|
186
|
+
uris = []
|
|
187
|
+
for i in 0...n do
|
|
188
|
+
uris << "druby://localhost:#{42000 + i * 100}"
|
|
189
|
+
end
|
|
190
|
+
d = nil
|
|
191
|
+
assert_nothing_raised { d = Dispatcher.new(uris, 1, MyDRbObject) }
|
|
192
|
+
assert_not_nil(d)
|
|
193
|
+
|
|
194
|
+
h1 = { :port => 42000, :hostname => 'localhost' }
|
|
195
|
+
r1 = d.and_multi_select_by(h1)
|
|
196
|
+
assert_equal(1, r1.size)
|
|
197
|
+
assert_equal(d['druby://localhost:42000'], r1[0])
|
|
198
|
+
r2 = d.multi_select_by(h1) { |a, b| (a and b) }
|
|
199
|
+
assert_equal(1, r2.size)
|
|
200
|
+
assert_equal(r1, r2)
|
|
201
|
+
r1 = d.or_multi_select_by(h1)
|
|
202
|
+
r2 = d.multi_select_by(h1, false) { |a, b| (a or b) }
|
|
203
|
+
assert_equal(r1, r2)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def test_dispatch
|
|
207
|
+
name, ruby_bin, chdir = add_command
|
|
208
|
+
drb_session_manager = SessionManager.new
|
|
209
|
+
server = DRb.start_service('druby://localhost:0', drb_session_manager)
|
|
210
|
+
services = []
|
|
211
|
+
uris = []
|
|
212
|
+
nb_srv = 10
|
|
213
|
+
nb_srv.times do |i|
|
|
214
|
+
service = drb_session_manager.service(name)
|
|
215
|
+
uris << service.server.uri
|
|
216
|
+
services << service
|
|
217
|
+
end
|
|
218
|
+
until (n = drb_session_manager.nb_sessions) == nb_srv
|
|
219
|
+
STDERR.puts "wait for #{n} sessions started" if $VERBOSE
|
|
220
|
+
sleep(2)
|
|
221
|
+
end
|
|
222
|
+
d = Dispatcher.new(uris, 5, MyDRbObject)
|
|
223
|
+
ref = {}
|
|
224
|
+
uris.each { |uri| ref[uri] = "hello from #{uri}" }
|
|
225
|
+
assert(ref, d.hello)
|
|
226
|
+
services.each do |service|
|
|
227
|
+
service.stop_service
|
|
228
|
+
end
|
|
229
|
+
while (n = drb_session_manager.nb_sessions) > 0
|
|
230
|
+
STDERR.puts "wait for #{n} sessions stoped" if $VERBOSE
|
|
231
|
+
sleep(2)
|
|
232
|
+
end
|
|
233
|
+
server.stop_service
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
protected
|
|
237
|
+
def add_command
|
|
238
|
+
ruby_bin = Config::CONFIG["RUBY_INSTALL_NAME"]
|
|
239
|
+
ruby_bin += ' -w' if $VERBOSE
|
|
240
|
+
name = "dispatcher_server_test"
|
|
241
|
+
chdir = (defined? TEST_MODE) ? "cd src;" : ''
|
|
242
|
+
cmd = chdir + "#{ruby_bin} drb/#{name}.rb"
|
|
243
|
+
DRb::SessionManager.command[name] = cmd
|
|
244
|
+
[ name, ruby_bin, chdir ]
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
end # DispatcherTest
|
|
248
|
+
|
|
249
|
+
end # module DRb
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
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: dispatcher_server_test.rb 94 2005-01-10 14:52:36Z polrop $
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
require 'drb/session_server'
|
|
10
|
+
|
|
11
|
+
if __FILE__ == $0
|
|
12
|
+
|
|
13
|
+
class Foo
|
|
14
|
+
|
|
15
|
+
def hello
|
|
16
|
+
"hello from #{DRb.uri}"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
raise "usage: #{$0} <uri> <name>" unless ARGV.size == 2
|
|
22
|
+
uri = ARGV.shift
|
|
23
|
+
name = ARGV.shift
|
|
24
|
+
|
|
25
|
+
server = DRb::DRbServer.new("druby://localhost:0", Foo.new, {})
|
|
26
|
+
ext_srv = DRb::SessionServer.new(uri, name, server)
|
|
27
|
+
server.thread.join
|
|
28
|
+
|
|
29
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
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: drb_observable.rb 100 2005-01-15 07:45:14Z polrop $
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
require 'drb/observer'
|
|
10
|
+
|
|
11
|
+
require 'observable'
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
module DRb
|
|
15
|
+
|
|
16
|
+
module DRbObservable
|
|
17
|
+
include Observable
|
|
18
|
+
|
|
19
|
+
undef notify_observers
|
|
20
|
+
def notify_observers(*args, &block)
|
|
21
|
+
if defined? @observer_state and @observer_state
|
|
22
|
+
if defined? @observer_peers
|
|
23
|
+
for i in @observer_peers.dup
|
|
24
|
+
begin
|
|
25
|
+
i.update(*args, &block)
|
|
26
|
+
rescue
|
|
27
|
+
delete_observer(i)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
@observer_state = false
|
|
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
|
+
begin
|
|
40
|
+
observer.update(*arg, &block)
|
|
41
|
+
rescue
|
|
42
|
+
delete_observer(observer)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
@observer_state = false
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end # module DRbObservable
|
|
51
|
+
|
|
52
|
+
end # module DRb
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
if defined? TEST_MODE or __FILE__ == $0
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
require 'test/unit/ui/yaml/testrunner'
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
module DRb
|
|
62
|
+
|
|
63
|
+
class ObservablePoolTest < ::Test::Unit::TestCase
|
|
64
|
+
|
|
65
|
+
class Obsv
|
|
66
|
+
include DRbObservable
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
class Foo
|
|
71
|
+
|
|
72
|
+
def update(*args, &block)
|
|
73
|
+
raise 'toto'
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def test_simple
|
|
79
|
+
o = Obsv.new
|
|
80
|
+
assert_respond_to(o, :list_observers)
|
|
81
|
+
o.add_observer(Foo.new)
|
|
82
|
+
assert_equal(1, o.count_observers)
|
|
83
|
+
o.changed
|
|
84
|
+
o.notify_observers('msg')
|
|
85
|
+
assert_equal(0, o.count_observers)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
end # class ObservablePoolTest
|
|
90
|
+
|
|
91
|
+
end # module DRb
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
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: drb_observable_pool.rb 97 2005-01-13 18:20:49Z polrop $
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
require 'observable_pool'
|
|
10
|
+
|
|
11
|
+
require 'drb/drb_observable'
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
module DRb
|
|
15
|
+
|
|
16
|
+
class DRbObservablePool
|
|
17
|
+
|
|
18
|
+
class SyncObserver
|
|
19
|
+
include DRbObservable
|
|
20
|
+
|
|
21
|
+
end # class SyncObserver
|
|
22
|
+
|
|
23
|
+
end # class DRbObservable
|
|
24
|
+
|
|
25
|
+
end # module DRb
|
|
26
|
+
|
|
27
|
+
|