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
|
@@ -0,0 +1,137 @@
|
|
|
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: inactive_timeout.rb 92 2005-01-10 12:23:55Z polrop $
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
require 'thread'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
module InactiveTimeout
|
|
13
|
+
|
|
14
|
+
def inactive_timeout_initialize(inactive_timeout=0)
|
|
15
|
+
@inactive_timeout = inactive_timeout
|
|
16
|
+
@inactive_timeout_update_time = Time.now
|
|
17
|
+
@inactive_timeout_mutex = Mutex.new
|
|
18
|
+
if @inactive_timeout > 0
|
|
19
|
+
@inactive_timeout_thread = inactive_timeout_start_thread
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def inactive_timeout=(inactive_timeout)
|
|
24
|
+
@inactive_timeout_mutex.synchronize do
|
|
25
|
+
@inactive_timeout = inactive_timeout
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def inactive_timeout
|
|
30
|
+
@inactive_timeout_mutex.synchronize { @inactive_timeout }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def inactive_timeout_update_time
|
|
34
|
+
@inactive_timeout_mutex.synchronize do
|
|
35
|
+
@inactive_timeout_update_time
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
protected
|
|
40
|
+
def inactive_timeout_update(time=Time.now)
|
|
41
|
+
@inactive_timeout_mutex.synchronize do
|
|
42
|
+
@inactive_timeout_update_time = time
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Every @inactive_timeout seconds, this method is called if the enlapsed
|
|
47
|
+
# time since @inactive_timeout_update_time is greater than @inactive_timeout.
|
|
48
|
+
# Return true to stop the timeout thread.
|
|
49
|
+
protected
|
|
50
|
+
def inactive_timeout_callback
|
|
51
|
+
true
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
protected
|
|
55
|
+
def inactive_timeout_start_thread
|
|
56
|
+
Thread.new do
|
|
57
|
+
begin
|
|
58
|
+
time = @inactive_timeout_mutex.synchronize { @inactive_timeout }
|
|
59
|
+
while time > 0
|
|
60
|
+
sleep(time)
|
|
61
|
+
time = @inactive_timeout_mutex.synchronize do
|
|
62
|
+
@inactive_timeout - (Time.now - @inactive_timeout_update_time)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end until inactive_timeout_callback
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end # module InactiveTimeout
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
if defined? TEST_MODE or __FILE__ == $0
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
require 'test/unit/ui/yaml/testrunner'
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class InactiveTimeoutTest < Test::Unit::TestCase
|
|
79
|
+
|
|
80
|
+
class Foo
|
|
81
|
+
include InactiveTimeout
|
|
82
|
+
|
|
83
|
+
attr_reader :obj
|
|
84
|
+
|
|
85
|
+
def initialize(obj, inactive_timeout=0)
|
|
86
|
+
inactive_timeout_initialize(inactive_timeout)
|
|
87
|
+
@obj = obj
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def method_missing(meth, *args, &block)
|
|
91
|
+
inactive_timeout_update
|
|
92
|
+
@obj.send(meth, *args, &block)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
protected
|
|
96
|
+
def inactive_timeout_callback
|
|
97
|
+
@obj = nil
|
|
98
|
+
super
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
class Bar
|
|
104
|
+
|
|
105
|
+
def hello
|
|
106
|
+
'hello bar'
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def test_accessors
|
|
112
|
+
f = Foo.new(Bar.new)
|
|
113
|
+
assert_equal(0, f.inactive_timeout)
|
|
114
|
+
t0 = f.inactive_timeout_update_time
|
|
115
|
+
assert_equal(t0, f.inactive_timeout_update_time)
|
|
116
|
+
assert_equal('hello bar', f.hello)
|
|
117
|
+
assert(t0 < f.inactive_timeout_update_time)
|
|
118
|
+
assert_not_nil(f.obj)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def test_simple
|
|
122
|
+
f = Foo.new(Bar.new, 0.2)
|
|
123
|
+
assert_not_nil(f.obj)
|
|
124
|
+
assert_equal(0.2, f.inactive_timeout)
|
|
125
|
+
3.times do
|
|
126
|
+
sleep(0.1)
|
|
127
|
+
assert_equal('hello bar', f.hello)
|
|
128
|
+
end
|
|
129
|
+
assert_not_nil(f.obj)
|
|
130
|
+
sleep(0.5)
|
|
131
|
+
assert_nil(f.obj)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
end # class InactiveTimeoutTest
|
|
135
|
+
|
|
136
|
+
end
|
|
137
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
|
|
9
|
+
require 'abstract_node'
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class IndexedNode < AbstractNode
|
|
13
|
+
include Concrete
|
|
14
|
+
|
|
15
|
+
def initialize(data=nil, *sub_nodes)
|
|
16
|
+
@sub_nodes = sub_nodes
|
|
17
|
+
super
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def <<(sub_node)
|
|
21
|
+
check_sub_node_type(sub_node)
|
|
22
|
+
@sub_nodes << sub_node
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end # class IndexedNode
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
if defined? TEST_MODE or __FILE__ == $0
|
|
29
|
+
|
|
30
|
+
require 'test/unit'
|
|
31
|
+
|
|
32
|
+
class IndexedNodeTest < Test::Unit::TestCase
|
|
33
|
+
|
|
34
|
+
def test_simple
|
|
35
|
+
s11 = IndexedNode.new(11)
|
|
36
|
+
s12 = IndexedNode.new(12)
|
|
37
|
+
s = IndexedNode.new(1, s11, s12)
|
|
38
|
+
assert_equal(1, s.data)
|
|
39
|
+
assert_equal(s11, s.sub_nodes[0])
|
|
40
|
+
assert_equal(s12, s.sub_nodes[1])
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def test_crochet_equal
|
|
44
|
+
s = IndexedNode.new(1)
|
|
45
|
+
assert_nothing_raised { s[0] = IndexedNode.new(10) }
|
|
46
|
+
assert_raises(TypeError) { s[1] = nil }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def test_merge
|
|
50
|
+
s = IndexedNode.new(1)
|
|
51
|
+
s11 = IndexedNode.new(11)
|
|
52
|
+
s12 = IndexedNode.new(12)
|
|
53
|
+
s.merge!({ 0 => s11, 1 => s12 })
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test_chevron
|
|
57
|
+
s = IndexedNode.new(1)
|
|
58
|
+
assert_equal(0, s.size)
|
|
59
|
+
s << IndexedNode.new(2)
|
|
60
|
+
assert_equal(1, s.size)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end # class IndexedNodeTest
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
|
|
@@ -0,0 +1,100 @@
|
|
|
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: io_marshal.rb 63 2004-12-06 13:09:14Z polrop $
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class IO
|
|
10
|
+
|
|
11
|
+
def dump(*objs)
|
|
12
|
+
objs.each do |obj|
|
|
13
|
+
data = Marshal.dump(obj)
|
|
14
|
+
write(data.size.to_s)
|
|
15
|
+
write("\0")
|
|
16
|
+
write(data)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def load(num_objs=nil, non_block=false)
|
|
21
|
+
objs = []
|
|
22
|
+
n = num_objs
|
|
23
|
+
begin
|
|
24
|
+
return nil if eof? and non_block
|
|
25
|
+
objs << load_one_object(non_block)
|
|
26
|
+
unless n.nil?
|
|
27
|
+
n -= 1
|
|
28
|
+
break if n <= 0
|
|
29
|
+
end
|
|
30
|
+
end until eof?
|
|
31
|
+
objs
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def load_one_object(non_block=false)
|
|
35
|
+
size = ''
|
|
36
|
+
while (c = read(1)) != "\0" do
|
|
37
|
+
if c.nil?
|
|
38
|
+
if non_block
|
|
39
|
+
return nil
|
|
40
|
+
else
|
|
41
|
+
sleep(0.1)
|
|
42
|
+
redo
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
size += c
|
|
46
|
+
end
|
|
47
|
+
size = size.to_i
|
|
48
|
+
data = read(size)
|
|
49
|
+
Marshal.load(data)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end # class IO
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
#
|
|
56
|
+
# Unit test suite
|
|
57
|
+
#
|
|
58
|
+
if defined? TEST_MODE or $0 == __FILE__
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
require 'test/unit/ui/yaml/testrunner'
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class IOMarshalTest < Test::Unit::TestCase
|
|
65
|
+
|
|
66
|
+
#
|
|
67
|
+
# Tests
|
|
68
|
+
#
|
|
69
|
+
def test_simple
|
|
70
|
+
obj1 = 12
|
|
71
|
+
obj2 = 'hello'
|
|
72
|
+
obj3 = { 'a' => 12, 'b' => 42 }
|
|
73
|
+
rd, wr = IO.pipe
|
|
74
|
+
if pid = fork # father
|
|
75
|
+
wr.close
|
|
76
|
+
o1, o2 = rd.load(2)
|
|
77
|
+
assert_equal(obj1, o1)
|
|
78
|
+
assert_equal(obj2, o2)
|
|
79
|
+
o3 = rd.load
|
|
80
|
+
assert_equal([obj3], o3)
|
|
81
|
+
assert_equal(nil, rd.load(4, true))
|
|
82
|
+
assert_equal(nil, rd.load_one_object(true))
|
|
83
|
+
Process.waitpid(pid)
|
|
84
|
+
rd.close
|
|
85
|
+
else # son
|
|
86
|
+
rd.close
|
|
87
|
+
sleep(0.5)
|
|
88
|
+
wr.dump(obj1)
|
|
89
|
+
wr.dump(obj2, obj3)
|
|
90
|
+
wr.close
|
|
91
|
+
exit
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
end # class IOMarshalTest
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
end
|
|
100
|
+
|
data/ruby_ex/ioo.rb
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
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: ertai $
|
|
6
|
+
# $Id: ioo.rb 186 2005-04-03 00:07:45Z ertai $
|
|
7
|
+
|
|
8
|
+
require 'delegate'
|
|
9
|
+
|
|
10
|
+
# With this class you can easily overwrite only write or read methods
|
|
11
|
+
# to change the whole IO.
|
|
12
|
+
#
|
|
13
|
+
# This is very usefull to produce a crypted IO for example.
|
|
14
|
+
module ImplIOO
|
|
15
|
+
|
|
16
|
+
def << ( obj )
|
|
17
|
+
write obj
|
|
18
|
+
self
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def each ( sep_string=$/, &block )
|
|
22
|
+
begin
|
|
23
|
+
loop { block[readline(sep_string)] }
|
|
24
|
+
rescue EOFError
|
|
25
|
+
return self
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
alias :each_line :each
|
|
29
|
+
|
|
30
|
+
def each_byte ( &block )
|
|
31
|
+
begin
|
|
32
|
+
loop { block[readchar] }
|
|
33
|
+
rescue EOFError
|
|
34
|
+
return nil
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def getc
|
|
39
|
+
begin
|
|
40
|
+
readchar
|
|
41
|
+
rescue EOFError
|
|
42
|
+
nil
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def gets ( sep_string=$/ )
|
|
47
|
+
begin
|
|
48
|
+
readline(sep_string)
|
|
49
|
+
rescue EOFError
|
|
50
|
+
nil
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def print ( *args )
|
|
55
|
+
if args.empty?
|
|
56
|
+
write $_
|
|
57
|
+
else
|
|
58
|
+
args.each { |x| write x }
|
|
59
|
+
end
|
|
60
|
+
nil
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def printf ( fmt, *args )
|
|
64
|
+
write Kernel.sprintf(fmt, *args)
|
|
65
|
+
nil
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def putc ( c )
|
|
69
|
+
case c
|
|
70
|
+
when Numeric then write c.chr
|
|
71
|
+
when String
|
|
72
|
+
if c.size == 1
|
|
73
|
+
write c
|
|
74
|
+
else
|
|
75
|
+
c = c[0].chr
|
|
76
|
+
write c
|
|
77
|
+
end
|
|
78
|
+
else
|
|
79
|
+
c = c.to_s[0].chr
|
|
80
|
+
write c
|
|
81
|
+
end
|
|
82
|
+
c
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def puts ( *args )
|
|
86
|
+
if args.size == 0
|
|
87
|
+
write "\n"
|
|
88
|
+
else
|
|
89
|
+
args.each do |x|
|
|
90
|
+
x = x.to_s
|
|
91
|
+
write x
|
|
92
|
+
write "\n" unless x[-1] == ?\n
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
nil
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def readchar
|
|
99
|
+
raise EOFError if eof?
|
|
100
|
+
read(1)[0]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def readline ( sep_string=$/ )
|
|
104
|
+
raise EOFError if eof?
|
|
105
|
+
buf = ''
|
|
106
|
+
begin
|
|
107
|
+
while (char = readchar) != ?\n
|
|
108
|
+
buf += char.chr
|
|
109
|
+
end
|
|
110
|
+
return buf + char.chr
|
|
111
|
+
rescue EOFError
|
|
112
|
+
return buf
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def readlines ( sep_string=$/ )
|
|
117
|
+
res = []
|
|
118
|
+
each_line(sep_string) { |line| res << line }
|
|
119
|
+
res
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end # module ImplIOO
|
|
123
|
+
|
|
124
|
+
class IOO < DelegateClass(IO)
|
|
125
|
+
include ImplIOO
|
|
126
|
+
end # class IOO
|
|
127
|
+
|
|
128
|
+
require 'socket'
|
|
129
|
+
class TCPSocket
|
|
130
|
+
alias :real_send :send
|
|
131
|
+
alias :real_recv :recv
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
class IOOTCPSocket < DelegateClass(TCPSocket)
|
|
135
|
+
include ImplIOO
|
|
136
|
+
|
|
137
|
+
def recv ( integer, flags=nil )
|
|
138
|
+
read(integer)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def read ( integer=nil, buffer='' )
|
|
142
|
+
raise ArgumentError unless buffer.is_a? String
|
|
143
|
+
raise NotImplementedError if integer.nil?
|
|
144
|
+
raise ArgumentError unless integer.is_a? Numeric
|
|
145
|
+
buffer += real_recv(integer, 0)
|
|
146
|
+
return buffer
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def send ( obj, flags=nil )
|
|
150
|
+
write(obj)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def write ( obj )
|
|
154
|
+
real_send(obj.to_s, 0)
|
|
155
|
+
nil
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
end # class IOOTCPSocket
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
if defined? TEST_MODE or $0 == __FILE__
|
|
162
|
+
|
|
163
|
+
require 'mktemp'
|
|
164
|
+
require 'test/unit'
|
|
165
|
+
class TestIOO < Test::Unit::TestCase
|
|
166
|
+
|
|
167
|
+
def setup
|
|
168
|
+
@tmp = Tempfile.mktemp('ioo')
|
|
169
|
+
@tmp.open('w') do |tmp|
|
|
170
|
+
tmp.puts 'foo'
|
|
171
|
+
tmp.puts
|
|
172
|
+
tmp.puts 'bar'
|
|
173
|
+
end
|
|
174
|
+
@readlines = @tmp.readlines
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def teardown
|
|
178
|
+
@tmp.clean
|
|
179
|
+
@tmp = nil
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def test_readlines
|
|
183
|
+
@tmp.open do |tmp|
|
|
184
|
+
assert_not_nil(tmp)
|
|
185
|
+
f = nil
|
|
186
|
+
assert_nothing_raised { f = IOO.new(tmp) }
|
|
187
|
+
assert_not_nil(f)
|
|
188
|
+
assert_equal(@readlines, f.readlines)
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
end # class TestIOO
|
|
193
|
+
|
|
194
|
+
end
|