wishdev-rio 0.4.3.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/COPYING +341 -0
- data/README +81 -0
- data/Rakefile +281 -0
- data/build_doc.rb +94 -0
- data/doc/ANNOUNCE +159 -0
- data/doc/RELEASE_NOTES +308 -0
- data/doc/RIOIS +215 -0
- data/doc/generators/template/html/rio.css +428 -0
- data/doc/generators/template/html/rio.rb +523 -0
- data/doc/generators/template/html/ugly.rb +132 -0
- data/doc/pkg_def.rb +60 -0
- data/doc/rfc1738.txt +1403 -0
- data/doc/rfc959.txt +3933 -0
- data/ex/catcsv.rb +64 -0
- data/ex/colx.rb +8 -0
- data/ex/findinruby +15 -0
- data/ex/findruby +14 -0
- data/ex/passwd_report.rb +8 -0
- data/ex/prompt.rb +25 -0
- data/ex/rgb.txt.gz +0 -0
- data/ex/riocat +42 -0
- data/ex/riogunzip +31 -0
- data/ex/riogzip +24 -0
- data/ex/rioprompt.rb +10 -0
- data/ex/targz2zip +17 -0
- data/ex/tonl +10 -0
- data/lib/rio/abstract_method.rb +56 -0
- data/lib/rio/argv.rb +56 -0
- data/lib/rio/arycopy.rb +43 -0
- data/lib/rio/assert.rb +114 -0
- data/lib/rio/base.rb +56 -0
- data/lib/rio/callstr.rb +46 -0
- data/lib/rio/const.rb +51 -0
- data/lib/rio/construct.rb +50 -0
- data/lib/rio/constructor.rb +258 -0
- data/lib/rio/context/autoclose.rb +72 -0
- data/lib/rio/context/copying.rb +55 -0
- data/lib/rio/context/cxx.rb +66 -0
- data/lib/rio/context/dir.rb +120 -0
- data/lib/rio/context/gzip.rb +50 -0
- data/lib/rio/context/methods.rb +182 -0
- data/lib/rio/context/skip.rb +66 -0
- data/lib/rio/context/stream.rb +229 -0
- data/lib/rio/context.rb +117 -0
- data/lib/rio/cp.rb +370 -0
- data/lib/rio/def.rb +53 -0
- data/lib/rio/dir.rb +144 -0
- data/lib/rio/doc/EXAMPLES.rb +299 -0
- data/lib/rio/doc/HOWTO.rb +737 -0
- data/lib/rio/doc/INDEX.rb +311 -0
- data/lib/rio/doc/INTRO.rb +1068 -0
- data/lib/rio/doc/OPTIONAL.rb +130 -0
- data/lib/rio/doc/SYNOPSIS.rb +183 -0
- data/lib/rio/doc.rb +45 -0
- data/lib/rio/entrysel.rb +246 -0
- data/lib/rio/exception/copy.rb +97 -0
- data/lib/rio/exception/notimplemented.rb +57 -0
- data/lib/rio/exception/notsupported.rb +46 -0
- data/lib/rio/exception/open.rb +61 -0
- data/lib/rio/exception/state.rb +73 -0
- data/lib/rio/exception.rb +41 -0
- data/lib/rio/ext/csv.rb +351 -0
- data/lib/rio/ext/if.rb +45 -0
- data/lib/rio/ext/mp3info.rb +80 -0
- data/lib/rio/ext/splitlines.rb +253 -0
- data/lib/rio/ext/yaml/doc.rb +133 -0
- data/lib/rio/ext/yaml/tie.rb +149 -0
- data/lib/rio/ext/yaml.rb +164 -0
- data/lib/rio/ext/zipfile/fs.rb +116 -0
- data/lib/rio/ext/zipfile/rl.rb +251 -0
- data/lib/rio/ext/zipfile/rootdir.rb +117 -0
- data/lib/rio/ext/zipfile/state.rb +161 -0
- data/lib/rio/ext/zipfile/wrap.rb +204 -0
- data/lib/rio/ext/zipfile.rb +110 -0
- data/lib/rio/ext.rb +138 -0
- data/lib/rio/factory.rb +436 -0
- data/lib/rio/file.rb +118 -0
- data/lib/rio/filter/closeoneof.rb +103 -0
- data/lib/rio/filter/gzip.rb +70 -0
- data/lib/rio/filter.rb +94 -0
- data/lib/rio/fs/base.rb +41 -0
- data/lib/rio/fs/impl.rb +122 -0
- data/lib/rio/fs/native.rb +75 -0
- data/lib/rio/fs/stream.rb +61 -0
- data/lib/rio/fs/url.rb +63 -0
- data/lib/rio/ftp/conncache.rb +101 -0
- data/lib/rio/ftp/dir.rb +94 -0
- data/lib/rio/ftp/fs.rb +180 -0
- data/lib/rio/ftp/ftpfile.rb +20 -0
- data/lib/rio/grande.rb +97 -0
- data/lib/rio/handle.rb +100 -0
- data/lib/rio/if/basic.rb +64 -0
- data/lib/rio/if/csv.rb +76 -0
- data/lib/rio/if/dir.rb +157 -0
- data/lib/rio/if/file.rb +89 -0
- data/lib/rio/if/fileordir.rb +268 -0
- data/lib/rio/if/grande.rb +729 -0
- data/lib/rio/if/grande_entry.rb +379 -0
- data/lib/rio/if/grande_stream.rb +693 -0
- data/lib/rio/if/internal.rb +125 -0
- data/lib/rio/if/path.rb +462 -0
- data/lib/rio/if/rubyio.rb +681 -0
- data/lib/rio/if/string.rb +83 -0
- data/lib/rio/if/temp.rb +45 -0
- data/lib/rio/if/test.rb +282 -0
- data/lib/rio/if/yaml.rb +206 -0
- data/lib/rio/if.rb +64 -0
- data/lib/rio/ioh.rb +162 -0
- data/lib/rio/iomode.rb +109 -0
- data/lib/rio/ios/fail.rb +106 -0
- data/lib/rio/ios/generic.rb +119 -0
- data/lib/rio/ios/mode.rb +60 -0
- data/lib/rio/ios/null.rb +119 -0
- data/lib/rio/iowrap.rb +128 -0
- data/lib/rio/kernel.rb +54 -0
- data/lib/rio/local.rb +62 -0
- data/lib/rio/match.rb +53 -0
- data/lib/rio/matchrecord.rb +283 -0
- data/lib/rio/no_warn.rb +49 -0
- data/lib/rio/nullio.rb +159 -0
- data/lib/rio/open3.rb +68 -0
- data/lib/rio/ops/construct.rb +61 -0
- data/lib/rio/ops/create.rb +77 -0
- data/lib/rio/ops/dir.rb +346 -0
- data/lib/rio/ops/either.rb +134 -0
- data/lib/rio/ops/file.rb +102 -0
- data/lib/rio/ops/path.rb +296 -0
- data/lib/rio/ops/stream/input.rb +267 -0
- data/lib/rio/ops/stream/output.rb +100 -0
- data/lib/rio/ops/stream/read.rb +86 -0
- data/lib/rio/ops/stream/write.rb +57 -0
- data/lib/rio/ops/stream.rb +87 -0
- data/lib/rio/ops/symlink.rb +80 -0
- data/lib/rio/path/reset.rb +69 -0
- data/lib/rio/path.rb +129 -0
- data/lib/rio/piper/cp.rb +80 -0
- data/lib/rio/piper.rb +122 -0
- data/lib/rio/prompt.rb +66 -0
- data/lib/rio/rectype.rb +88 -0
- data/lib/rio/rl/base.rb +118 -0
- data/lib/rio/rl/builder.rb +117 -0
- data/lib/rio/rl/chmap.rb +66 -0
- data/lib/rio/rl/fs2url.rb +82 -0
- data/lib/rio/rl/ioi.rb +78 -0
- data/lib/rio/rl/path.rb +110 -0
- data/lib/rio/rl/pathmethods.rb +116 -0
- data/lib/rio/rl/uri.rb +200 -0
- data/lib/rio/rl/withpath.rb +296 -0
- data/lib/rio/scheme/aryio.rb +88 -0
- data/lib/rio/scheme/cmdio.rb +80 -0
- data/lib/rio/scheme/cmdpipe.rb +118 -0
- data/lib/rio/scheme/fd.rb +65 -0
- data/lib/rio/scheme/ftp.rb +141 -0
- data/lib/rio/scheme/http.rb +78 -0
- data/lib/rio/scheme/null.rb +55 -0
- data/lib/rio/scheme/path.rb +98 -0
- data/lib/rio/scheme/stderr.rb +55 -0
- data/lib/rio/scheme/stdio.rb +71 -0
- data/lib/rio/scheme/strio.rb +87 -0
- data/lib/rio/scheme/sysio.rb +63 -0
- data/lib/rio/scheme/tcp.rb +75 -0
- data/lib/rio/scheme/temp.rb +200 -0
- data/lib/rio/state/error.rb +72 -0
- data/lib/rio/state.rb +242 -0
- data/lib/rio/stream/base.rb +54 -0
- data/lib/rio/stream/duplex.rb +79 -0
- data/lib/rio/stream/open.rb +202 -0
- data/lib/rio/stream.rb +181 -0
- data/lib/rio/symantics.rb +45 -0
- data/lib/rio/tempdir.rb +132 -0
- data/lib/rio/to_rio/all.rb +39 -0
- data/lib/rio/to_rio/array.rb +39 -0
- data/lib/rio/to_rio/io.rb +40 -0
- data/lib/rio/to_rio/object.rb +42 -0
- data/lib/rio/to_rio/string.rb +40 -0
- data/lib/rio/to_rio.rb +67 -0
- data/lib/rio/uri/file.rb +198 -0
- data/lib/rio/util.rb +48 -0
- data/lib/rio/version.rb +51 -0
- data/lib/rio.rb +162 -0
- data/setup.rb +1360 -0
- data/test/bin/count_lines.rb +11 -0
- data/test/bin/find_lines.rb +13 -0
- data/test/bin/list_dir.rb +14 -0
- data/test/ftp/all.rb +9 -0
- data/test/ftp/anon_copy_data.rb +36 -0
- data/test/ftp/anon_misc.rb +124 -0
- data/test/ftp/anon_read.rb +105 -0
- data/test/ftp/anon_special.rb +68 -0
- data/test/ftp/anon_write.rb +70 -0
- data/test/ftp/ftp2ftp.rb +51 -0
- data/test/ftp/initftpfiles.rb +14 -0
- data/test/ftp/testdef.rb +55 -0
- data/test/gem_runtests.rb +15 -0
- data/test/http/all.rb +4 -0
- data/test/http/copy-from-http.rb +141 -0
- data/test/http/uri-meta.rb +72 -0
- data/test/lib/temp_server.rb +46 -0
- data/test/runalltests.rb +17 -0
- data/test/runftptests.rb +14 -0
- data/test/runhttp.rb +11 -0
- data/test/runhttptests.rb +14 -0
- data/test/runtests.rb +52 -0
- data/test/tc/abs.rb +355 -0
- data/test/tc/all.rb +80 -0
- data/test/tc/base.rb +31 -0
- data/test/tc/base2.rb +87 -0
- data/test/tc/cd1.rb +113 -0
- data/test/tc/clearsel.rb +68 -0
- data/test/tc/clone.rb +208 -0
- data/test/tc/closeoncopy.rb +102 -0
- data/test/tc/closeoneof.rb +194 -0
- data/test/tc/cmdpipe.rb +149 -0
- data/test/tc/copy-dir-samevar.rb +91 -0
- data/test/tc/copy-from.rb +129 -0
- data/test/tc/copy-to.rb +91 -0
- data/test/tc/copy.rb +74 -0
- data/test/tc/copyarray.rb +188 -0
- data/test/tc/copydest.rb +50 -0
- data/test/tc/copydir.rb +166 -0
- data/test/tc/copydirlines.rb +121 -0
- data/test/tc/copylines.rb +46 -0
- data/test/tc/copynonex.rb +118 -0
- data/test/tc/copysymlink.rb +39 -0
- data/test/tc/create.rb +114 -0
- data/test/tc/csv.rb +226 -0
- data/test/tc/csv2.rb +138 -0
- data/test/tc/csv_columns.rb +37 -0
- data/test/tc/csvutil.rb +56 -0
- data/test/tc/dir.rb +76 -0
- data/test/tc/dir_iter.rb +383 -0
- data/test/tc/dirautoclose.rb +67 -0
- data/test/tc/dirent.rb +178 -0
- data/test/tc/dirss.rb +81 -0
- data/test/tc/each.rb +111 -0
- data/test/tc/each_break.rb +243 -0
- data/test/tc/edf.rb +81 -0
- data/test/tc/empty.rb +51 -0
- data/test/tc/emptyriodir.rb +129 -0
- data/test/tc/entary.rb +227 -0
- data/test/tc/entsel.rb +110 -0
- data/test/tc/eq.rb +101 -0
- data/test/tc/expand_path.rb +69 -0
- data/test/tc/ext.rb +136 -0
- data/test/tc/fileno.rb +94 -0
- data/test/tc/files_select.rb +92 -0
- data/test/tc/get.rb +152 -0
- data/test/tc/getrec.rb +137 -0
- data/test/tc/gzip.rb +109 -0
- data/test/tc/io_each_byte.rb +60 -0
- data/test/tc/io_read.rb +80 -0
- data/test/tc/iometh.rb +149 -0
- data/test/tc/likeio.rb +116 -0
- data/test/tc/line_record_row.rb +51 -0
- data/test/tc/lineno.rb +196 -0
- data/test/tc/lines.rb +66 -0
- data/test/tc/misc.rb +432 -0
- data/test/tc/nolines.rb +204 -0
- data/test/tc/noqae.rb +879 -0
- data/test/tc/null.rb +45 -0
- data/test/tc/once.rb +6 -0
- data/test/tc/overload.rb +140 -0
- data/test/tc/pa.rb +158 -0
- data/test/tc/path_parts.rb +175 -0
- data/test/tc/pathop.rb +60 -0
- data/test/tc/paths.rb +145 -0
- data/test/tc/pid.rb +31 -0
- data/test/tc/piper.rb +143 -0
- data/test/tc/programs_util.rb +24 -0
- data/test/tc/qae.rb +493 -0
- data/test/tc/qae_riovar.rb +499 -0
- data/test/tc/readline.rb +30 -0
- data/test/tc/records.rb +68 -0
- data/test/tc/rename.rb +233 -0
- data/test/tc/rename_assign.rb +45 -0
- data/test/tc/riorl.rb +181 -0
- data/test/tc/route.rb +51 -0
- data/test/tc/selnosel.rb +33 -0
- data/test/tc/skip.rb +89 -0
- data/test/tc/skiplines.rb +71 -0
- data/test/tc/split.rb +28 -0
- data/test/tc/splitlines.rb +65 -0
- data/test/tc/splitpath.rb +83 -0
- data/test/tc/sub.rb +46 -0
- data/test/tc/symlink.rb +176 -0
- data/test/tc/symlink0.rb +348 -0
- data/test/tc/symlink1.rb +114 -0
- data/test/tc/synopsis.rb +75 -0
- data/test/tc/temp.rb +152 -0
- data/test/tc/tempdir.rb +60 -0
- data/test/tc/tempfile.rb +66 -0
- data/test/tc/testcase.rb +170 -0
- data/test/tc/tonl.rb +37 -0
- data/test/tc/truncate.rb +39 -0
- data/test/tc/yaml.rb +275 -0
- metadata +387 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# ===============================================================================
|
|
3
|
+
# Copyright (c) 2005,2006,2007 Christopher Kleckner
|
|
4
|
+
# All rights reserved
|
|
5
|
+
#
|
|
6
|
+
# This file is part of the Rio library for ruby.
|
|
7
|
+
#
|
|
8
|
+
# Rio is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
|
10
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
11
|
+
# (at your option) any later version.
|
|
12
|
+
#
|
|
13
|
+
# Rio is distributed in the hope that it will be useful,
|
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
# GNU General Public License for more details.
|
|
17
|
+
#
|
|
18
|
+
# You should have received a copy of the GNU General Public License
|
|
19
|
+
# along with Rio; if not, write to the Free Software
|
|
20
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
21
|
+
# ===============================================================================
|
|
22
|
+
#++
|
|
23
|
+
#
|
|
24
|
+
# To create the documentation for Rio run the command
|
|
25
|
+
# ruby build_doc.rb
|
|
26
|
+
# from the distribution directory.
|
|
27
|
+
#
|
|
28
|
+
# Suggested Reading
|
|
29
|
+
# * RIO::Doc::SYNOPSIS
|
|
30
|
+
# * RIO::Doc::INTRO
|
|
31
|
+
# * RIO::Doc::HOWTO
|
|
32
|
+
# * RIO::Doc::EXAMPLES
|
|
33
|
+
# * RIO::Rio
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
module RIO
|
|
38
|
+
module SysIO #:nodoc: all
|
|
39
|
+
require 'rio/rl/ioi'
|
|
40
|
+
RESET_STATE = RL::IOIBase::RESET_STATE
|
|
41
|
+
|
|
42
|
+
class RL < RL::SysIOBase
|
|
43
|
+
RIOSCHEME = 'sysio'
|
|
44
|
+
RIOPATH = RIO::RL::CHMAP.invert[RIOSCHEME].to_s.freeze
|
|
45
|
+
def opaque() sprintf('0x%08x',self.ios.object_id) end
|
|
46
|
+
def open(*args)
|
|
47
|
+
super(*args)
|
|
48
|
+
end
|
|
49
|
+
# must be able to process both
|
|
50
|
+
# parse('rio:sysio',ios)
|
|
51
|
+
# parse('rio:sysio:0xHEXIOS')
|
|
52
|
+
SPLIT_RE = %r|0x([0-9a-fA-F]+)$|
|
|
53
|
+
def self.splitrl(s)
|
|
54
|
+
sub,opq,whole = split_riorl(s)
|
|
55
|
+
if bm = SPLIT_RE.match(opq)
|
|
56
|
+
oid = bm[1].hex
|
|
57
|
+
ios = ObjectSpace._id2ref(oid)
|
|
58
|
+
[ios]
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# ===============================================================================
|
|
3
|
+
# Copyright (c) 2005,2006,2007 Christopher Kleckner
|
|
4
|
+
# All rights reserved
|
|
5
|
+
#
|
|
6
|
+
# This file is part of the Rio library for ruby.
|
|
7
|
+
#
|
|
8
|
+
# Rio is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
|
10
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
11
|
+
# (at your option) any later version.
|
|
12
|
+
#
|
|
13
|
+
# Rio is distributed in the hope that it will be useful,
|
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
# GNU General Public License for more details.
|
|
17
|
+
#
|
|
18
|
+
# You should have received a copy of the GNU General Public License
|
|
19
|
+
# along with Rio; if not, write to the Free Software
|
|
20
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
21
|
+
# ===============================================================================
|
|
22
|
+
#++
|
|
23
|
+
#
|
|
24
|
+
# To create the documentation for Rio run the command
|
|
25
|
+
# ruby build_doc.rb
|
|
26
|
+
# from the distribution directory.
|
|
27
|
+
#
|
|
28
|
+
# Suggested Reading
|
|
29
|
+
# * RIO::Doc::SYNOPSIS
|
|
30
|
+
# * RIO::Doc::INTRO
|
|
31
|
+
# * RIO::Doc::HOWTO
|
|
32
|
+
# * RIO::Doc::EXAMPLES
|
|
33
|
+
# * RIO::Rio
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
require 'rio/rl/base'
|
|
38
|
+
module RIO
|
|
39
|
+
module TCP #:nodoc: all
|
|
40
|
+
RESET_STATE = 'Stream::Duplex::Open'
|
|
41
|
+
require 'rio/rl/ioi'
|
|
42
|
+
class RL < RL::IOIBase
|
|
43
|
+
RIOSCHEME = 'tcp'.freeze
|
|
44
|
+
attr_reader :host
|
|
45
|
+
def initialize(host,port)
|
|
46
|
+
@host = host
|
|
47
|
+
@port = port
|
|
48
|
+
super
|
|
49
|
+
end
|
|
50
|
+
def opaque()
|
|
51
|
+
sprintf('//%s:%s',@host,@port)
|
|
52
|
+
end
|
|
53
|
+
require 'socket'
|
|
54
|
+
def open(*args)
|
|
55
|
+
# @host = 'localhost' if @host.nil? or @host.empty?
|
|
56
|
+
super(::TCPSocket.new(@host || 'localhost',@port))
|
|
57
|
+
end
|
|
58
|
+
def to_s() self.url end
|
|
59
|
+
|
|
60
|
+
# must be able to process
|
|
61
|
+
# parse('rio:tcp',host,port)
|
|
62
|
+
# parse('rio:tcp://host:port')
|
|
63
|
+
SPLIT_RE = %r|//([^/:]*):([0-9a-z]+)$|.freeze
|
|
64
|
+
def self.splitrl(s)
|
|
65
|
+
sub,opq,whole = split_riorl(s)
|
|
66
|
+
if bm = SPLIT_RE.match(opq)
|
|
67
|
+
host = bm[1]
|
|
68
|
+
port = bm[2]
|
|
69
|
+
host = nil if host.empty?
|
|
70
|
+
[host,port]
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# ===============================================================================
|
|
3
|
+
# Copyright (c) 2005,2006,2007 Christopher Kleckner
|
|
4
|
+
# All rights reserved
|
|
5
|
+
#
|
|
6
|
+
# This file is part of the Rio library for ruby.
|
|
7
|
+
#
|
|
8
|
+
# Rio is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
|
10
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
11
|
+
# (at your option) any later version.
|
|
12
|
+
#
|
|
13
|
+
# Rio is distributed in the hope that it will be useful,
|
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
# GNU General Public License for more details.
|
|
17
|
+
#
|
|
18
|
+
# You should have received a copy of the GNU General Public License
|
|
19
|
+
# along with Rio; if not, write to the Free Software
|
|
20
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
21
|
+
# ===============================================================================
|
|
22
|
+
#++
|
|
23
|
+
#
|
|
24
|
+
# To create the documentation for Rio run the command
|
|
25
|
+
# ruby build_doc.rb
|
|
26
|
+
# from the distribution directory.
|
|
27
|
+
#
|
|
28
|
+
# Suggested Reading
|
|
29
|
+
# * RIO::Doc::SYNOPSIS
|
|
30
|
+
# * RIO::Doc::INTRO
|
|
31
|
+
# * RIO::Doc::HOWTO
|
|
32
|
+
# * RIO::Doc::EXAMPLES
|
|
33
|
+
# * RIO::Rio
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
require 'tmpdir'
|
|
37
|
+
module RIO
|
|
38
|
+
module Temp #:nodoc: all
|
|
39
|
+
RESET_STATE = 'Temp::Reset'
|
|
40
|
+
|
|
41
|
+
require 'rio/rl/base'
|
|
42
|
+
class RL < RL::Base
|
|
43
|
+
RIOSCHEME = 'temp'
|
|
44
|
+
RIOPATH = RIO::RL::CHMAP.invert[RIOSCHEME].to_s.freeze
|
|
45
|
+
DFLT_PREFIX = 'rio'
|
|
46
|
+
DFLT_TMPDIR = ::Dir::tmpdir
|
|
47
|
+
attr_reader :prefix,:tmpdir
|
|
48
|
+
def initialize(file_prefix=DFLT_PREFIX,temp_dir=DFLT_TMPDIR)
|
|
49
|
+
#puts "initialize(#{file_prefix.inspect},#{temp_dir.inspect})"
|
|
50
|
+
@prefix = file_prefix || DFLT_PREFIX
|
|
51
|
+
@tmpdir = temp_dir || DFLT_TMPDIR
|
|
52
|
+
super
|
|
53
|
+
end
|
|
54
|
+
#def path() nil end
|
|
55
|
+
def scheme() self.class.const_get(:RIOSCHEME) end
|
|
56
|
+
def opaque()
|
|
57
|
+
td = self.escape(@tmpdir.to_s)
|
|
58
|
+
td += '/' unless td.nil? or td.empty? or (td != '/' and td[-1] == ?/)
|
|
59
|
+
td + self.escape(@prefix)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
SPLIT_RE = %r|(?:(.*)/)?([^/]*)$|.freeze
|
|
63
|
+
def self.splitrl(s)
|
|
64
|
+
sub,opq,whole = split_riorl(s)
|
|
65
|
+
if opq.nil? or opq.empty?
|
|
66
|
+
[]
|
|
67
|
+
elsif bm = SPLIT_RE.match(opq)
|
|
68
|
+
tdir = bm[1] unless bm[1].nil? or bm[1].empty?
|
|
69
|
+
tpfx = bm[2] unless bm[2].nil? or bm[2].empty?
|
|
70
|
+
[tpfx,tdir]
|
|
71
|
+
else
|
|
72
|
+
[]
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
module Dir
|
|
77
|
+
require 'rio/rl/path'
|
|
78
|
+
RESET_STATE = RIO::RL::PathBase::RESET_STATE
|
|
79
|
+
require 'tmpdir'
|
|
80
|
+
class RL < RIO::RL::PathBase
|
|
81
|
+
RIOSCHEME = 'tempdir'
|
|
82
|
+
DFLT_PREFIX = Temp::RL::DFLT_PREFIX
|
|
83
|
+
DFLT_TMPDIR = Temp::RL::DFLT_TMPDIR
|
|
84
|
+
attr_reader :prefix,:tmpdir,:tmprl
|
|
85
|
+
def initialize(file_prefix=DFLT_PREFIX,temp_dir=DFLT_TMPDIR)
|
|
86
|
+
#puts "initialize(#{file_prefix.inspect},#{temp_dir.inspect})"
|
|
87
|
+
@prefix = file_prefix || DFLT_PREFIX
|
|
88
|
+
@tmpdir = temp_dir || DFLT_TMPDIR
|
|
89
|
+
require 'rio/tempdir'
|
|
90
|
+
@td = ::Tempdir.new( @prefix.to_s, @tmpdir.to_s)
|
|
91
|
+
super(@td.to_s)
|
|
92
|
+
end
|
|
93
|
+
def dir_rl()
|
|
94
|
+
#p "temp:dir_rl: #{self.uri.inspect}"
|
|
95
|
+
RIO::Dir::RL.new(self.uri, {:fs => self.fs})
|
|
96
|
+
#self
|
|
97
|
+
end
|
|
98
|
+
SPLIT_RE = Temp::RL::SPLIT_RE
|
|
99
|
+
def self.splitrl(s)
|
|
100
|
+
Temp::RL.splitrl(s)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
module File
|
|
105
|
+
require 'rio/rl/path'
|
|
106
|
+
RESET_STATE = 'Temp::Stream::Open'
|
|
107
|
+
class RL < RIO::RL::PathBase
|
|
108
|
+
RIOSCHEME = 'tempfile'
|
|
109
|
+
DFLT_PREFIX = Temp::RL::DFLT_PREFIX
|
|
110
|
+
DFLT_TMPDIR = Temp::RL::DFLT_TMPDIR
|
|
111
|
+
attr_reader :prefix,:tmpdir,:tmprl
|
|
112
|
+
def initialize(file_prefix=DFLT_PREFIX,temp_dir=DFLT_TMPDIR)
|
|
113
|
+
#puts "initialize(#{file_prefix.inspect},#{temp_dir.inspect})"
|
|
114
|
+
@prefix = file_prefix || DFLT_PREFIX
|
|
115
|
+
@tmpdir = temp_dir || DFLT_TMPDIR
|
|
116
|
+
require 'tempfile'
|
|
117
|
+
@tf = ::Tempfile.new( @prefix.to_s, @tmpdir.to_s)
|
|
118
|
+
super(@tf.path)
|
|
119
|
+
end
|
|
120
|
+
def file_rl()
|
|
121
|
+
RIO::File::RL.new(self.uri,{:fs => self.fs})
|
|
122
|
+
#self
|
|
123
|
+
end
|
|
124
|
+
def open(mode='ignored')
|
|
125
|
+
#p callstr('open',mode)
|
|
126
|
+
@tf
|
|
127
|
+
end
|
|
128
|
+
def close
|
|
129
|
+
super
|
|
130
|
+
@tf = nil
|
|
131
|
+
end
|
|
132
|
+
SPLIT_RE = Temp::RL::SPLIT_RE
|
|
133
|
+
def self.splitrl(s)
|
|
134
|
+
Temp::RL.splitrl(s)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
require 'rio/state'
|
|
139
|
+
class Reset < State::Base
|
|
140
|
+
def initialize(*args)
|
|
141
|
+
super
|
|
142
|
+
#p args
|
|
143
|
+
@tempobj = nil
|
|
144
|
+
end
|
|
145
|
+
def self.default_cx
|
|
146
|
+
Cx::Vars.new( { 'closeoneof' => false, 'closeoncopy' => false } )
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def check?() true end
|
|
150
|
+
def mkdir(prefix=rl.prefix,tmpdir=rl.tmpdir)
|
|
151
|
+
self.rl = RIO::Temp::Dir::RL.new(prefix, tmpdir)
|
|
152
|
+
become 'Dir::Existing'
|
|
153
|
+
end
|
|
154
|
+
# def mkdir()
|
|
155
|
+
# dir()
|
|
156
|
+
# end
|
|
157
|
+
def chdir(&block)
|
|
158
|
+
self.mkdir.chdir(&block)
|
|
159
|
+
end
|
|
160
|
+
def file(prefix=rl.prefix,tmpdir=rl.tmpdir)
|
|
161
|
+
self.rl = RIO::Temp::File::RL.new(prefix, tmpdir)
|
|
162
|
+
become 'Temp::Stream::Open'
|
|
163
|
+
end
|
|
164
|
+
def scheme() rl.scheme() end
|
|
165
|
+
def host() rl.host() end
|
|
166
|
+
def opaque() rl.opaque() end
|
|
167
|
+
def to_s() rl.url() end
|
|
168
|
+
def exist?() false end
|
|
169
|
+
def file?() false end
|
|
170
|
+
def dir?() false end
|
|
171
|
+
def open?() false end
|
|
172
|
+
def closed?() true end
|
|
173
|
+
def when_missing(sym,*args)
|
|
174
|
+
#p @rl.scheme
|
|
175
|
+
if @tempobj.nil?
|
|
176
|
+
file()
|
|
177
|
+
else
|
|
178
|
+
gofigure(sym,*args)
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
require 'rio/stream/open'
|
|
183
|
+
module Stream
|
|
184
|
+
class Open < RIO::Stream::Open
|
|
185
|
+
def iostate(sym)
|
|
186
|
+
mode_('w+').open_.inout()
|
|
187
|
+
end
|
|
188
|
+
# def inout() stream_state('Temp::Stream::InOut') end
|
|
189
|
+
end
|
|
190
|
+
# require 'rio/stream'
|
|
191
|
+
# class InOut < RIO::Stream::InOut
|
|
192
|
+
# def base_state() 'Temp::Stream::Close' end
|
|
193
|
+
# end
|
|
194
|
+
# class Close < RIO::Stream::Close
|
|
195
|
+
# def base_state() 'Temp::Reset' end
|
|
196
|
+
# end
|
|
197
|
+
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# ===============================================================================
|
|
3
|
+
# Copyright (c) 2005,2006,2007 Christopher Kleckner
|
|
4
|
+
# All rights reserved
|
|
5
|
+
#
|
|
6
|
+
# This file is part of the Rio library for ruby.
|
|
7
|
+
#
|
|
8
|
+
# Rio is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
|
10
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
11
|
+
# (at your option) any later version.
|
|
12
|
+
#
|
|
13
|
+
# Rio is distributed in the hope that it will be useful,
|
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
# GNU General Public License for more details.
|
|
17
|
+
#
|
|
18
|
+
# You should have received a copy of the GNU General Public License
|
|
19
|
+
# along with Rio; if not, write to the Free Software
|
|
20
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
21
|
+
# ===============================================================================
|
|
22
|
+
#++
|
|
23
|
+
#
|
|
24
|
+
# To create the documentation for Rio run the command
|
|
25
|
+
# ruby build_doc.rb
|
|
26
|
+
# from the distribution directory.
|
|
27
|
+
#
|
|
28
|
+
# Suggested Reading
|
|
29
|
+
# * RIO::Doc::SYNOPSIS
|
|
30
|
+
# * RIO::Doc::INTRO
|
|
31
|
+
# * RIO::Doc::HOWTO
|
|
32
|
+
# * RIO::Doc::EXAMPLES
|
|
33
|
+
# * RIO::Rio
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
require 'rio/exception/state'
|
|
38
|
+
module RIO
|
|
39
|
+
|
|
40
|
+
module State
|
|
41
|
+
class Error < Base
|
|
42
|
+
attr_accessor :obj,:msg,:sym
|
|
43
|
+
def initialize
|
|
44
|
+
super
|
|
45
|
+
@obj = nil
|
|
46
|
+
@msg = nil
|
|
47
|
+
@sym = nil
|
|
48
|
+
# self.send(sym,*args) #unless obj == self
|
|
49
|
+
end
|
|
50
|
+
def check?() true end
|
|
51
|
+
def when_missing(sym,*args) self end
|
|
52
|
+
def method_missing(sym,*args,&block)
|
|
53
|
+
# emsg = sprintf("Can't Handle %s[%s].%s(%s)",@obj.class.to_s,@obj.to_s,sym.to_s,args.join(','))
|
|
54
|
+
# emsg += "\n "+@msg unless @msg.nil? or @msg.empty?
|
|
55
|
+
emsg = @msg
|
|
56
|
+
raise Exception::CantHandle.new(@obj,sym,*args),emsg
|
|
57
|
+
end
|
|
58
|
+
def self.error(emsg,obj,sym,*args)
|
|
59
|
+
require 'rio/exception'
|
|
60
|
+
state = new
|
|
61
|
+
state.obj = obj
|
|
62
|
+
state.sym = sym
|
|
63
|
+
msg = sprintf("%s[%s].%s(%s)",obj.class.to_s,obj.to_s,sym.to_s,args.join(','))
|
|
64
|
+
msg += "\n "+emsg unless emsg.nil? or emsg.empty?
|
|
65
|
+
state.msg = msg
|
|
66
|
+
state
|
|
67
|
+
# raise CantHandle.new(obj,sym,*args),emsg
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end # module RIO
|
data/lib/rio/state.rb
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# ===============================================================================
|
|
3
|
+
# Copyright (c) 2005,2006,2007 Christopher Kleckner
|
|
4
|
+
# All rights reserved
|
|
5
|
+
#
|
|
6
|
+
# This file is part of the Rio library for ruby.
|
|
7
|
+
#
|
|
8
|
+
# Rio is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
|
10
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
11
|
+
# (at your option) any later version.
|
|
12
|
+
#
|
|
13
|
+
# Rio is distributed in the hope that it will be useful,
|
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
# GNU General Public License for more details.
|
|
17
|
+
#
|
|
18
|
+
# You should have received a copy of the GNU General Public License
|
|
19
|
+
# along with Rio; if not, write to the Free Software
|
|
20
|
+
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
21
|
+
# ===============================================================================
|
|
22
|
+
#++
|
|
23
|
+
#
|
|
24
|
+
# To create the documentation for Rio run the command
|
|
25
|
+
# ruby build_doc.rb
|
|
26
|
+
# from the distribution directory.
|
|
27
|
+
#
|
|
28
|
+
# Suggested Reading
|
|
29
|
+
# * RIO::Doc::SYNOPSIS
|
|
30
|
+
# * RIO::Doc::INTRO
|
|
31
|
+
# * RIO::Doc::HOWTO
|
|
32
|
+
# * RIO::Doc::EXAMPLES
|
|
33
|
+
# * RIO::Rio
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
require 'rio/exception/state'
|
|
38
|
+
require 'rio/context'
|
|
39
|
+
require 'rio/context/methods'
|
|
40
|
+
require 'rio/ext'
|
|
41
|
+
require 'rio/symantics'
|
|
42
|
+
require 'rio/filter'
|
|
43
|
+
require 'rio/fs/native'
|
|
44
|
+
|
|
45
|
+
module RIO
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
module State #:nodoc: all
|
|
49
|
+
# = State
|
|
50
|
+
# the abstract state from which all are derived
|
|
51
|
+
# this level handles
|
|
52
|
+
# * some basic house keeping methods
|
|
53
|
+
# * the methods to communicate with the rio object
|
|
54
|
+
# * the state changing mechanism
|
|
55
|
+
# * and some basic error handling stubs
|
|
56
|
+
class Base
|
|
57
|
+
KIOSYMS = [:gets,:open,:readline,:readlines,:putc,:puts,:print,:printf,
|
|
58
|
+
:=~,:===,:==,:eql?,:load]
|
|
59
|
+
@@kernel_cleaned ||= KIOSYMS.each { |sym| undef_method(sym) }
|
|
60
|
+
undef_method(:rio)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
class Base
|
|
64
|
+
attr_accessor :try_state
|
|
65
|
+
#attr_accessor :handled_by
|
|
66
|
+
|
|
67
|
+
attr_accessor :rl
|
|
68
|
+
attr_accessor :ioh
|
|
69
|
+
|
|
70
|
+
attr_accessor :cx
|
|
71
|
+
|
|
72
|
+
# Context handling
|
|
73
|
+
include Cx::Methods
|
|
74
|
+
include RIO::Ext::Cx
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def initialize(rl=nil,cx=nil,ioh=nil)
|
|
78
|
+
cx ||= self.class.default_cx
|
|
79
|
+
_init(rl,cx,ioh)
|
|
80
|
+
# @handled_by = self.class.to_s
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def _init(riorl,cntx,iohandle=nil)
|
|
84
|
+
@rl = riorl
|
|
85
|
+
@cx = cntx
|
|
86
|
+
@ioh = iohandle
|
|
87
|
+
# raise Exception::FailedCheck.new(self) unless check?
|
|
88
|
+
self
|
|
89
|
+
end
|
|
90
|
+
private :_init
|
|
91
|
+
|
|
92
|
+
def initialize_copy(*args)
|
|
93
|
+
#p callstr('initialize_copy',args[0].inspect)
|
|
94
|
+
super
|
|
95
|
+
@rl = @rl.clone unless @rl.nil?
|
|
96
|
+
@cx = @cx.clone unless @cx.nil?
|
|
97
|
+
@ioh = @ioh.clone unless @ioh.nil?
|
|
98
|
+
# @fs = @fs
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def self.default_cx
|
|
102
|
+
Cx::Vars.new( { 'closeoneof' => true, 'closeoncopy' => true } )
|
|
103
|
+
end
|
|
104
|
+
def self.new_other(other)
|
|
105
|
+
new(other.rl,other.cx,other.ioh)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
alias :ior :ioh
|
|
109
|
+
alias :iow :ioh
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
# Section: State Switching
|
|
115
|
+
|
|
116
|
+
# the method for changing states
|
|
117
|
+
# it's job is create an instance of the next state
|
|
118
|
+
# and change the value in the handle that is shared with the rio object
|
|
119
|
+
def become(new_class,*args)
|
|
120
|
+
p "become : #{self.class.to_s} => #{new_class.to_s} (#{self.mode?})" if $trace_states
|
|
121
|
+
#p "BECOME #{new_class}: #{cx['ss_type']}"
|
|
122
|
+
return self if new_class == self.class
|
|
123
|
+
|
|
124
|
+
begin
|
|
125
|
+
new_state = try_state[new_class,*args]
|
|
126
|
+
rescue Exception::FailedCheck => ex
|
|
127
|
+
p "not a valid "+new_class.to_s+": "+ex.to_s+" '"+self.to_s+"'"
|
|
128
|
+
raise
|
|
129
|
+
end
|
|
130
|
+
became(new_state)
|
|
131
|
+
new_state
|
|
132
|
+
end
|
|
133
|
+
def became(obj)
|
|
134
|
+
#RIO::Ext.became(obj)
|
|
135
|
+
end
|
|
136
|
+
def method_missing_trace_str(sym,*args)
|
|
137
|
+
"missing: "+self.class.to_s+'['+self.to_url+" {#{self.rl.fs}}"+']'+'.'+sym.to_s+'('+args.join(',')+')'
|
|
138
|
+
#"missing: "+self.class.to_s+'['+self.to_url+""+']'+'.'+sym.to_s+'('+args.join(',')+')'
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def method_missing(sym,*args,&block)
|
|
142
|
+
p method_missing_trace_str(sym,*args) if $trace_states
|
|
143
|
+
|
|
144
|
+
obj = when_missing(sym,*args)
|
|
145
|
+
raise RuntimeError,"when_missing returns nil" if obj.nil?
|
|
146
|
+
obj.__send__(sym,*args,&block) #unless obj == self
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def when_missing(sym,*args) gofigure(sym,*args) end
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def base_state() Factory.instance.reset_state(@rl) end
|
|
153
|
+
|
|
154
|
+
def softreset
|
|
155
|
+
#p "softreset(#{self.class}) => #{self.base_state}"
|
|
156
|
+
cx['retrystate'] = nil
|
|
157
|
+
become(self.base_state)
|
|
158
|
+
end
|
|
159
|
+
def retryreset
|
|
160
|
+
#p "retryreset(#{self.class}) => #{self.base_state}"
|
|
161
|
+
become(self.base_state)
|
|
162
|
+
end
|
|
163
|
+
def reset
|
|
164
|
+
softreset()
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Section: Error Handling
|
|
168
|
+
def gofigure(sym,*args)
|
|
169
|
+
cs = "#{sym}("+args.map{|el| el.to_s}.join(',')+")"
|
|
170
|
+
msg = "Go Figure! rio('#{self.to_s}').#{cs} Failed"
|
|
171
|
+
error(msg,sym,*args)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def error(emsg,sym,*args)
|
|
175
|
+
require 'rio/state/error'
|
|
176
|
+
Error.error(emsg,self,sym,*args)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def to_rl() self.rl.rl end
|
|
180
|
+
def fs() self.rl.fs end
|
|
181
|
+
|
|
182
|
+
extend Forwardable
|
|
183
|
+
def_instance_delegators(:rl,:path,:to_s,:fspath,:urlpath,:length)
|
|
184
|
+
|
|
185
|
+
def ==(other) @rl == other end
|
|
186
|
+
def ===(other) self == other end
|
|
187
|
+
def =~(other) other =~ self.to_str end
|
|
188
|
+
def to_url() @rl.url end
|
|
189
|
+
def to_uri() @rl.uri end
|
|
190
|
+
alias to_str to_s
|
|
191
|
+
|
|
192
|
+
def hash() @rl.to_s.hash end
|
|
193
|
+
def eql?(other) @rl.to_s.eql?(other.to_s) end
|
|
194
|
+
|
|
195
|
+
def stream?() false end
|
|
196
|
+
|
|
197
|
+
# Section: Rio Interface
|
|
198
|
+
# gives states the ability to create new rio objects
|
|
199
|
+
# (should this be here???)
|
|
200
|
+
def new_rio(arg0,*args,&block)
|
|
201
|
+
Rio.rio(arg0,*args,&block)
|
|
202
|
+
end
|
|
203
|
+
def new_rio_cx(*args)
|
|
204
|
+
n = new_rio(*args)
|
|
205
|
+
n.cx = self.cx.bequeath(n.cx)
|
|
206
|
+
n
|
|
207
|
+
end
|
|
208
|
+
def clone_rio()
|
|
209
|
+
cp = Rio.new(self.rl)
|
|
210
|
+
cp.cx = self.cx.clone
|
|
211
|
+
cp.ioh = self.ioh.clone unless self.ioh.nil?
|
|
212
|
+
cp.rl = self.rl.clone
|
|
213
|
+
cp
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def ensure_rio(arg0)
|
|
217
|
+
case arg0
|
|
218
|
+
when RIO::Rio then arg0
|
|
219
|
+
when RIO::State::Base then arg0.clone_rio
|
|
220
|
+
else new_rio(arg0)
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
def ensure_cmd_rio(arg)
|
|
224
|
+
case arg
|
|
225
|
+
when ::String then new_rio(:cmdio,arg)
|
|
226
|
+
when ::Fixnum then new_rio(arg)
|
|
227
|
+
when Rio then arg.clone
|
|
228
|
+
else ensure_rio(arg)
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
include Symantics
|
|
233
|
+
|
|
234
|
+
def callstr(func,*args)
|
|
235
|
+
self.class.to_s+'['+self.to_url+']'+'.'+func.to_s+'('+args.join(',')+')'
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
end # module RIO
|