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,110 @@
|
|
|
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 'rio/ext/zipfile/rl'
|
|
37
|
+
module RIO
|
|
38
|
+
module ZipFile
|
|
39
|
+
module Cx
|
|
40
|
+
def zipfile(arg=true,&block)
|
|
41
|
+
rootdir = new_rio_cx(:zipfile,self.to_s)
|
|
42
|
+
return rootdir.each(&block) if block_given?
|
|
43
|
+
rootdir
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
module RIO
|
|
49
|
+
module State
|
|
50
|
+
class Base
|
|
51
|
+
include RIO::ZipFile::Cx
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
__END__
|
|
56
|
+
module RIO
|
|
57
|
+
module_function
|
|
58
|
+
def load_lib(lib)
|
|
59
|
+
begin
|
|
60
|
+
require lib
|
|
61
|
+
rescue LoadError => ex
|
|
62
|
+
begin
|
|
63
|
+
p "using Gem for #{lib}" if $DEBUG
|
|
64
|
+
require 'rubygems'
|
|
65
|
+
require_gem lib
|
|
66
|
+
rescue
|
|
67
|
+
raise ex
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
begin
|
|
74
|
+
RIO.load_lib('zip/zip')
|
|
75
|
+
require 'zip/zipfilesystem'
|
|
76
|
+
require 'rio/ext/zipfile/opt'
|
|
77
|
+
RIO::Ext::ZipFile.load_extension
|
|
78
|
+
rescue LoadError
|
|
79
|
+
p "No zipfile support" if $DEBUG
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
# module RIO
|
|
84
|
+
# module Ext
|
|
85
|
+
# module ZipFile
|
|
86
|
+
# module Cx
|
|
87
|
+
# def zipfile(&block)
|
|
88
|
+
# #require 'rio/ext/zipfile/state'
|
|
89
|
+
# cxx('zipfile',true,&block)
|
|
90
|
+
# #self.extend(ZipFile::State).fstream
|
|
91
|
+
# end
|
|
92
|
+
# def zipfile?() cxx?('zipfile') end
|
|
93
|
+
# def zipfile_()
|
|
94
|
+
# cxx_('zipfile',true)
|
|
95
|
+
# end
|
|
96
|
+
# protected :zipfile_
|
|
97
|
+
|
|
98
|
+
# def zipent(&block)
|
|
99
|
+
# cxx('zipent',true,&block)
|
|
100
|
+
# end
|
|
101
|
+
# def zipent?() cxx?('zipent') end
|
|
102
|
+
# def zipent_()
|
|
103
|
+
# cxx_('zipent',true)
|
|
104
|
+
# end
|
|
105
|
+
# protected :zipent_
|
|
106
|
+
# end
|
|
107
|
+
# end
|
|
108
|
+
# end
|
|
109
|
+
# end
|
|
110
|
+
__END__
|
data/lib/rio/ext.rb
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
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/ext/csv'
|
|
38
|
+
require 'rio/ext/splitlines'
|
|
39
|
+
require 'rio/ext/yaml'
|
|
40
|
+
#require 'rio/ext/zipfile'
|
|
41
|
+
|
|
42
|
+
require 'rio/util'
|
|
43
|
+
module RIO
|
|
44
|
+
module Ext #:nodoc: all
|
|
45
|
+
@@extensions = {}
|
|
46
|
+
|
|
47
|
+
module_function
|
|
48
|
+
def add(cl,meth)
|
|
49
|
+
@@extensions[cl] ||= []
|
|
50
|
+
@@extensions[cl].push(meth)
|
|
51
|
+
end
|
|
52
|
+
def extend_state(state_class,ext_module)
|
|
53
|
+
ext_proc = proc{ |obj| obj.extend(ext_module) }
|
|
54
|
+
RIO::Ext.add(state_class,ext_proc)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def became(obj)
|
|
58
|
+
if @@extensions[obj.class]
|
|
59
|
+
@@extensions[obj.class].each { |meth|
|
|
60
|
+
meth[obj]
|
|
61
|
+
}
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
module RIO
|
|
68
|
+
module Ext #:nodoc: all
|
|
69
|
+
class Extension
|
|
70
|
+
def initialize(etest,mod)
|
|
71
|
+
@inc = {
|
|
72
|
+
'cx' => mod+'::Cx',
|
|
73
|
+
'input' => mod+'::Input',
|
|
74
|
+
'output' => mod+'::Output',
|
|
75
|
+
}
|
|
76
|
+
end
|
|
77
|
+
def add(obj,state)
|
|
78
|
+
case state
|
|
79
|
+
when 'Stream::Input' then obj.extend(@inc['input'])
|
|
80
|
+
when 'Stream::Output' then obj.extend(@inc['output'])
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
module RIO
|
|
88
|
+
module Ext #:nodoc: all
|
|
89
|
+
class Extensions
|
|
90
|
+
def initialize()
|
|
91
|
+
#@ext
|
|
92
|
+
@inc = {
|
|
93
|
+
'cx' => mod+'::Cx',
|
|
94
|
+
'input' => mod+'::Input',
|
|
95
|
+
'output' => mod+'::Output',
|
|
96
|
+
}
|
|
97
|
+
end
|
|
98
|
+
def add(obj)
|
|
99
|
+
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
module RIO
|
|
107
|
+
module Ext #:nodoc: all
|
|
108
|
+
OUTPUT_SYMS = Util::build_sym_hash(CSV::Output.instance_methods + YAML::Output.instance_methods)
|
|
109
|
+
|
|
110
|
+
module Cx
|
|
111
|
+
include CSV::Cx
|
|
112
|
+
include SplitLines::Cx
|
|
113
|
+
include YAML::Cx
|
|
114
|
+
#include ZipFile::Cx
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
module Ext
|
|
118
|
+
module Input
|
|
119
|
+
def add_extensions(obj)
|
|
120
|
+
obj.extend(CSV::Input) if obj.csv?
|
|
121
|
+
obj.extend(SplitLines::Input) if obj.splitlines?
|
|
122
|
+
obj.extend(YAML::Input) if obj.yaml?
|
|
123
|
+
obj
|
|
124
|
+
end
|
|
125
|
+
module_function :add_extensions
|
|
126
|
+
end
|
|
127
|
+
module Output
|
|
128
|
+
def add_extensions(obj)
|
|
129
|
+
obj.extend(CSV::Output) if obj.csv?
|
|
130
|
+
obj.extend(SplitLines::Output) if obj.splitlines?
|
|
131
|
+
obj.extend(YAML::Output) if obj.yaml?
|
|
132
|
+
obj
|
|
133
|
+
end
|
|
134
|
+
module_function :add_extensions
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
data/lib/rio/factory.rb
ADDED
|
@@ -0,0 +1,436 @@
|
|
|
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
|
+
# class String
|
|
38
|
+
# def to_fs
|
|
39
|
+
# require 'rio/resource'
|
|
40
|
+
# RIO::Resource::Pathname.new(self)
|
|
41
|
+
# end
|
|
42
|
+
# end
|
|
43
|
+
require 'singleton'
|
|
44
|
+
require 'rio/handle'
|
|
45
|
+
require 'rio/rl/builder'
|
|
46
|
+
#require 'rio/state/machine'
|
|
47
|
+
|
|
48
|
+
module RIO
|
|
49
|
+
# class StateDesc
|
|
50
|
+
# attr_accessor :class_name,:class_file
|
|
51
|
+
# def initialize(class_name,class_file)
|
|
52
|
+
# @class_name = class_name
|
|
53
|
+
# @class_file = class_file
|
|
54
|
+
# end
|
|
55
|
+
# end
|
|
56
|
+
# module StateMap
|
|
57
|
+
# class Base
|
|
58
|
+
# STATE_FILE = {
|
|
59
|
+
# 'Path::Reset' => 'rio/path/reset',
|
|
60
|
+
# 'Path::Empty' => 'rio/path',
|
|
61
|
+
# 'Path::Str' => 'rio/path',
|
|
62
|
+
# 'Path::NonExisting' => 'rio/path',
|
|
63
|
+
|
|
64
|
+
# 'File::Existing' => 'rio/file',
|
|
65
|
+
# 'File::NonExisting' => 'rio/file',
|
|
66
|
+
|
|
67
|
+
# 'Dir::Existing' => 'rio/dir',
|
|
68
|
+
# 'Dir::Open' => 'rio/dir',
|
|
69
|
+
# 'Dir::Close' => 'rio/dir',
|
|
70
|
+
# 'Dir::Stream' => 'rio/dir',
|
|
71
|
+
# 'Dir::NonExisting' => 'rio/dir',
|
|
72
|
+
|
|
73
|
+
# 'Stream::Reset' => 'rio/stream',
|
|
74
|
+
# 'Stream::Open' => 'rio/stream/open',
|
|
75
|
+
# 'Stream::Input' => 'rio/stream',
|
|
76
|
+
# 'Stream::Output' => 'rio/stream',
|
|
77
|
+
# 'Stream::InOut' => 'rio/stream',
|
|
78
|
+
# 'Stream::Close' => 'rio/stream/open',
|
|
79
|
+
# }
|
|
80
|
+
# def class_name(state_name)
|
|
81
|
+
# 'State::' + state_name
|
|
82
|
+
# end
|
|
83
|
+
# def file_name(state_name)
|
|
84
|
+
# STATE_FILE[state_name]
|
|
85
|
+
# end
|
|
86
|
+
# def path_reset() 'Path::Reset' end
|
|
87
|
+
# def path_empty() 'Path::Empty' end
|
|
88
|
+
# def path_str() 'Path::Str' end
|
|
89
|
+
# def path_nonexisting() 'Path::NonExisting' end
|
|
90
|
+
# def file_existing() 'File::Existing' end
|
|
91
|
+
# def file_nonexisting() 'File::NonExisting' end
|
|
92
|
+
# def dir_existing() 'Dir::Existing' end
|
|
93
|
+
# def dir_open() 'Dir::Open' end
|
|
94
|
+
# def dir_close() 'Dir::Close' end
|
|
95
|
+
# def dir_stream() 'Dir::Stream' end
|
|
96
|
+
# def dir_nonexisting() 'Dir::NonExisting' end
|
|
97
|
+
# def stream_reset() 'Stream::Reset' end
|
|
98
|
+
# def stream_open() 'Stream::Open' end
|
|
99
|
+
# def stream_input() 'Stream::Input' end
|
|
100
|
+
# def stream_output() 'Stream::Output' end
|
|
101
|
+
# def stream_inout() 'Stream::InOut' end
|
|
102
|
+
# def stream_close() 'Stream::Close' end
|
|
103
|
+
# end
|
|
104
|
+
# end
|
|
105
|
+
# module Path
|
|
106
|
+
# class StateMap < RIO::StateMap::Base
|
|
107
|
+
# def stream_open() 'Path::Stream::Open' end
|
|
108
|
+
# end
|
|
109
|
+
# end
|
|
110
|
+
# module Path
|
|
111
|
+
# class StateMap < RIO::StateMap::Base
|
|
112
|
+
# STATE_FILE = { 'Stream::Open' => 'rio/scheme/path' }
|
|
113
|
+
# def stream_open() 'Path::Stream::Open' end
|
|
114
|
+
# end
|
|
115
|
+
# end
|
|
116
|
+
# module CmdPipe
|
|
117
|
+
# class StateMap < RIO::StateMap::Base
|
|
118
|
+
# def stream_reset() 'CmdPipe::Stream::reset' end
|
|
119
|
+
# end
|
|
120
|
+
# end
|
|
121
|
+
|
|
122
|
+
# module States
|
|
123
|
+
# class Base
|
|
124
|
+
# end
|
|
125
|
+
# end
|
|
126
|
+
|
|
127
|
+
# class StateMapper
|
|
128
|
+
# include Singleton
|
|
129
|
+
|
|
130
|
+
# STD_STATE_FILES = {
|
|
131
|
+
# 'Path::Reset' => 'rio/path/reset',
|
|
132
|
+
# 'Path::Empty' => 'rio/path',
|
|
133
|
+
# 'Path::Str' => 'rio/path',
|
|
134
|
+
# 'Path::NonExisting' => 'rio/path',
|
|
135
|
+
|
|
136
|
+
# 'File::Existing' => 'rio/file',
|
|
137
|
+
# 'File::NonExisting' => 'rio/file',
|
|
138
|
+
|
|
139
|
+
# 'Dir::Existing' => 'rio/dir',
|
|
140
|
+
# 'Dir::Open' => 'rio/dir',
|
|
141
|
+
# 'Dir::Close' => 'rio/dir',
|
|
142
|
+
# 'Dir::Stream' => 'rio/dir',
|
|
143
|
+
# 'Dir::NonExisting' => 'rio/dir',
|
|
144
|
+
|
|
145
|
+
# 'Stream::Reset' => 'rio/stream',
|
|
146
|
+
# 'Stream::Open' => 'rio/stream/open',
|
|
147
|
+
# 'Stream::Input' => 'rio/stream',
|
|
148
|
+
# 'Stream::Output' => 'rio/stream',
|
|
149
|
+
# 'Stream::InOut' => 'rio/stream',
|
|
150
|
+
# 'Stream::Close' => 'rio/stream/open',
|
|
151
|
+
# }
|
|
152
|
+
# SCHEME_STATE_FILES = {
|
|
153
|
+
# 'Stream::Duplex::Open' => 'rio/stream/duplex',
|
|
154
|
+
|
|
155
|
+
# #'Path::Stream::Open' => 'rio/scheme/path',
|
|
156
|
+
|
|
157
|
+
# #'StrIO::Stream::Open' => 'rio/scheme/strio',
|
|
158
|
+
|
|
159
|
+
# #'Null::Stream::Open' => 'rio/scheme/null',
|
|
160
|
+
|
|
161
|
+
# #'CmdPipe::Stream::Reset' => 'rio/scheme/cmdpipe',
|
|
162
|
+
|
|
163
|
+
# #'HTTP::Stream::Input' => 'rio/scheme/http',
|
|
164
|
+
# #'HTTP::Stream::Open' => 'rio/scheme/http',
|
|
165
|
+
|
|
166
|
+
# 'Temp::Reset' => 'rio/scheme/temp',
|
|
167
|
+
# 'Temp::Stream::Open' => 'rio/scheme/temp',
|
|
168
|
+
|
|
169
|
+
# 'Ext::YAML::Doc::Existing' => 'rio/ext/yaml/doc',
|
|
170
|
+
# 'Ext::YAML::Doc::Open' => 'rio/ext/yaml/doc',
|
|
171
|
+
# 'Ext::YAML::Doc::Stream' => 'rio/ext/yaml/doc',
|
|
172
|
+
# 'Ext::YAML::Doc::Close' => 'rio/ext/yaml/doc',
|
|
173
|
+
# }
|
|
174
|
+
# def initialize()
|
|
175
|
+
# @state_cache = {}
|
|
176
|
+
# end
|
|
177
|
+
# def scheme_states()
|
|
178
|
+
# {
|
|
179
|
+
# 'path' => { 'Stream::Open' => 'Path::Stream::Open' },
|
|
180
|
+
# 'file' => { 'Stream::Open' => 'Path::Stream::Open' },
|
|
181
|
+
# 'strio' => { 'Stream::Open' => 'StrIO::Stream::Open' },
|
|
182
|
+
# 'cmdpipe' => { 'Stream::Reset' => 'CmdPipe::Stream::Reset' },
|
|
183
|
+
# 'http' => {'Stream::Input' => 'HTTP::Stream::Input',
|
|
184
|
+
# 'Stream::Open' => 'HTTP::Stream::Open' },
|
|
185
|
+
# }
|
|
186
|
+
# end
|
|
187
|
+
# def known?(state_name)
|
|
188
|
+
# STD_STATE_FILES.has_key?(state_name) or SCHEME_STATE_FILES.has_key?(state_name)
|
|
189
|
+
# end
|
|
190
|
+
# def std_state_name(state_name)
|
|
191
|
+
# case
|
|
192
|
+
# when STD_STATE_FILES.has_key?(state_name) then 'State::'+state_name
|
|
193
|
+
# when SCHEME_STATE_FILES.has_key?(state_name) then state_name
|
|
194
|
+
# else raise ArgumentError,"Unknown State Name (#{state_name})"
|
|
195
|
+
# end
|
|
196
|
+
# end
|
|
197
|
+
# def mode_mixins()
|
|
198
|
+
# {
|
|
199
|
+
# 'Stream::Input' => { 'splitlines' => 'Ext::SplitLines::Stream::Input', },
|
|
200
|
+
# 'Stream::Output' => { 'splitlines' => 'Ext::SplitLines::Stream::Output', },
|
|
201
|
+
# }
|
|
202
|
+
# end
|
|
203
|
+
# def mode_state_name(state_name,cx)
|
|
204
|
+
# mixins = mode_mixins()
|
|
205
|
+
# return state_name unless mixins.has_key?(state_name)
|
|
206
|
+
# modes = mstates[state_name]
|
|
207
|
+
# for mode in modes.keys
|
|
208
|
+
# next unless cx[mode]
|
|
209
|
+
# return modes[mode]
|
|
210
|
+
# end
|
|
211
|
+
# end
|
|
212
|
+
|
|
213
|
+
# def scheme_state_name(state_name,scheme)
|
|
214
|
+
# schemes = scheme_states()
|
|
215
|
+
# if schemes.has_key?(scheme)
|
|
216
|
+
# states = schemes[scheme]
|
|
217
|
+
# if states.has_key?(state_name)
|
|
218
|
+
# return scheme_states[scheme][state_name]
|
|
219
|
+
# end
|
|
220
|
+
# end
|
|
221
|
+
# return std_state_name(state_name)
|
|
222
|
+
# end
|
|
223
|
+
# def state_file(state_name,rio_handle)
|
|
224
|
+
# case
|
|
225
|
+
# when STD_STATE_FILES.has_key?(state_name) then STD_STATE_FILES[state_name]
|
|
226
|
+
# when SCHEME_STATE_FILES.has_key?(state_name) then SCHEME_STATE_FILES[state_name]
|
|
227
|
+
# else raise ArgumentError,"Unknown State Name (#{state_name})"
|
|
228
|
+
# end
|
|
229
|
+
# end
|
|
230
|
+
# def state2class(state_name,rio_handle=nil)
|
|
231
|
+
# scheme = rio_handle.rl.scheme unless rio_handle.nil?
|
|
232
|
+
# state = nil
|
|
233
|
+
# if scheme_cache = @state_cache[scheme]
|
|
234
|
+
# return state if state = scheme_cache[state_name]
|
|
235
|
+
# end
|
|
236
|
+
# mapped_name = rio_handle.nil? ? std_state_name(state_name) : scheme_state_name(state_name,rio_handle.rl.scheme)
|
|
237
|
+
# if self.known?(state_name)
|
|
238
|
+
# require self.state_file(state_name,rio_handle)
|
|
239
|
+
# @state_cache[scheme] ||= {}
|
|
240
|
+
# @state_cache[scheme][state_name] = RIO.module_eval(mapped_name)
|
|
241
|
+
# return @state_cache[scheme][state_name]
|
|
242
|
+
# else
|
|
243
|
+
# raise ArgumentError,"Unknown State Name (#{state_name})"
|
|
244
|
+
# end
|
|
245
|
+
# end
|
|
246
|
+
|
|
247
|
+
# end
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
class Factory #:nodoc: all
|
|
251
|
+
include Singleton
|
|
252
|
+
def initialize()
|
|
253
|
+
@ss_module = {}
|
|
254
|
+
@reset_class = {}
|
|
255
|
+
@state_class = {}
|
|
256
|
+
@ss_class = {}
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def subscheme_module(sch)
|
|
260
|
+
#p "subscheme_module(#{sch})"
|
|
261
|
+
@ss_module[sch] ||= case sch
|
|
262
|
+
when 'file','path'
|
|
263
|
+
require 'rio/scheme/path'
|
|
264
|
+
Path
|
|
265
|
+
when 'zipfile'
|
|
266
|
+
require 'rio/ext/zipfile/rl'
|
|
267
|
+
ZipFile::RootDir
|
|
268
|
+
when 'stdio','stdin','stdout'
|
|
269
|
+
require 'rio/scheme/stdio'
|
|
270
|
+
StdIO
|
|
271
|
+
when 'stderr'
|
|
272
|
+
require 'rio/scheme/stderr'
|
|
273
|
+
StdErr
|
|
274
|
+
when 'null'
|
|
275
|
+
require 'rio/scheme/null'
|
|
276
|
+
Null
|
|
277
|
+
when 'tempfile'
|
|
278
|
+
require 'rio/scheme/temp'
|
|
279
|
+
Temp::File
|
|
280
|
+
when 'temp'
|
|
281
|
+
require 'rio/scheme/temp'
|
|
282
|
+
Temp
|
|
283
|
+
when 'tempdir'
|
|
284
|
+
require 'rio/scheme/temp'
|
|
285
|
+
Temp::Dir
|
|
286
|
+
when 'strio','stringio','string'
|
|
287
|
+
require 'rio/scheme/strio'
|
|
288
|
+
StrIO
|
|
289
|
+
when 'cmdpipe'
|
|
290
|
+
require 'rio/scheme/cmdpipe'
|
|
291
|
+
CmdPipe
|
|
292
|
+
when 'aryio'
|
|
293
|
+
require 'rio/scheme/aryio'
|
|
294
|
+
AryIO
|
|
295
|
+
when 'http','https'
|
|
296
|
+
require 'rio/scheme/http'
|
|
297
|
+
HTTP
|
|
298
|
+
when 'ftp'
|
|
299
|
+
require 'rio/scheme/ftp'
|
|
300
|
+
FTP
|
|
301
|
+
when 'tcp'
|
|
302
|
+
require 'rio/scheme/tcp'
|
|
303
|
+
TCP
|
|
304
|
+
when 'sysio'
|
|
305
|
+
require 'rio/scheme/sysio'
|
|
306
|
+
SysIO
|
|
307
|
+
when 'fd'
|
|
308
|
+
require 'rio/scheme/fd'
|
|
309
|
+
FD
|
|
310
|
+
when 'cmdio'
|
|
311
|
+
require 'rio/scheme/cmdio'
|
|
312
|
+
CmdIO
|
|
313
|
+
else
|
|
314
|
+
require 'rio/scheme/path'
|
|
315
|
+
Path
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
STATE2FILE = {
|
|
320
|
+
'Path::Reset' => 'rio/path/reset',
|
|
321
|
+
'Path::Empty' => 'rio/path',
|
|
322
|
+
'Path::Str' => 'rio/path',
|
|
323
|
+
'Path::NonExisting' => 'rio/path',
|
|
324
|
+
|
|
325
|
+
'File::Existing' => 'rio/file',
|
|
326
|
+
'File::NonExisting' => 'rio/file',
|
|
327
|
+
|
|
328
|
+
'Dir::Existing' => 'rio/dir',
|
|
329
|
+
'Dir::Open' => 'rio/dir',
|
|
330
|
+
'Dir::Close' => 'rio/dir',
|
|
331
|
+
'Dir::Stream' => 'rio/dir',
|
|
332
|
+
'Dir::NonExisting' => 'rio/dir',
|
|
333
|
+
|
|
334
|
+
'Stream::Close' => 'rio/stream/open',
|
|
335
|
+
'Stream::Reset' => 'rio/stream',
|
|
336
|
+
'Stream::Open' => 'rio/stream/open',
|
|
337
|
+
'Stream::Input' => 'rio/stream',
|
|
338
|
+
'Stream::Output' => 'rio/stream',
|
|
339
|
+
'Stream::InOut' => 'rio/stream',
|
|
340
|
+
|
|
341
|
+
'Stream::Duplex::Open' => 'rio/stream/duplex',
|
|
342
|
+
|
|
343
|
+
'Path::Stream::Open' => 'rio/scheme/path',
|
|
344
|
+
|
|
345
|
+
'StrIO::Stream::Open' => 'rio/scheme/strio',
|
|
346
|
+
|
|
347
|
+
'Null::Stream::Open' => 'rio/scheme/null',
|
|
348
|
+
|
|
349
|
+
'CmdPipe::Stream::Reset' => 'rio/scheme/cmdpipe',
|
|
350
|
+
|
|
351
|
+
'HTTP::Stream::Input' => 'rio/scheme/http',
|
|
352
|
+
'HTTP::Stream::Open' => 'rio/scheme/http',
|
|
353
|
+
|
|
354
|
+
'Temp::Reset' => 'rio/scheme/temp',
|
|
355
|
+
'Temp::Stream::Open' => 'rio/scheme/temp',
|
|
356
|
+
|
|
357
|
+
'Ext::YAML::Doc::Existing' => 'rio/ext/yaml/doc',
|
|
358
|
+
'Ext::YAML::Doc::Open' => 'rio/ext/yaml/doc',
|
|
359
|
+
'Ext::YAML::Doc::Stream' => 'rio/ext/yaml/doc',
|
|
360
|
+
'Ext::YAML::Doc::Close' => 'rio/ext/yaml/doc',
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
}
|
|
364
|
+
def riorl_class(sch)
|
|
365
|
+
subscheme_module(sch).const_get(:RL)
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
def reset_state(rl)
|
|
369
|
+
mod = subscheme_module(rl.scheme)
|
|
370
|
+
mod.const_get(:RESET_STATE) unless mod.nil?
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
def state2class(state_name)
|
|
374
|
+
return @state_class[state_name] if @state_class.has_key?(state_name)
|
|
375
|
+
if STATE2FILE.has_key?(state_name)
|
|
376
|
+
require STATE2FILE[state_name]
|
|
377
|
+
return @state_class[state_name] = RIO.module_eval(state_name)
|
|
378
|
+
else
|
|
379
|
+
raise ArgumentError,"Unknown State Name (#{state_name})"
|
|
380
|
+
end
|
|
381
|
+
end
|
|
382
|
+
def try_state_proc1(current_state,rio_handle)
|
|
383
|
+
#p "try_state_proc cur=#{current_state}[#{current_state.class}] han=#{rio_handle}[#{rio_handle.class}]"
|
|
384
|
+
proc { |new_state_name|
|
|
385
|
+
# new_state_class = state2class(new_state_name)
|
|
386
|
+
_change_state(state2class(new_state_name,rio_handle),current_state,rio_handle)
|
|
387
|
+
}
|
|
388
|
+
end
|
|
389
|
+
def try_state_proc(current_state,rio_handle)
|
|
390
|
+
proc { |new_state_name|
|
|
391
|
+
# new_state_class = state2class(new_state_name)
|
|
392
|
+
_change_state(state2class(new_state_name),current_state,rio_handle)
|
|
393
|
+
}
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
def _change_state(new_state_class,current_state,rio_handle)
|
|
397
|
+
# wipe out the reference to this proc so GC can get rid of rsc
|
|
398
|
+
current_state.try_state = proc { p "try_state for "+current_state.to_s+" used already??" }
|
|
399
|
+
new_state = new_state_class.new_other(current_state)
|
|
400
|
+
new_state.try_state = try_state_proc(new_state,rio_handle)
|
|
401
|
+
|
|
402
|
+
rio_handle.target = new_state
|
|
403
|
+
return rio_handle.target
|
|
404
|
+
end
|
|
405
|
+
private :_change_state
|
|
406
|
+
|
|
407
|
+
# factory creates a state from args
|
|
408
|
+
def create_state1(*args)
|
|
409
|
+
riorl = RIO::RL::Builder.build(*args)
|
|
410
|
+
create_handle(state2class(reset_state(riorl)).new(riorl))
|
|
411
|
+
end
|
|
412
|
+
def create_state(*args)
|
|
413
|
+
riorl = RIO::RL::Builder.build(*args)
|
|
414
|
+
create_handle(state2class(reset_state(riorl)).new(riorl))
|
|
415
|
+
end
|
|
416
|
+
def clone_state(state)
|
|
417
|
+
create_handle(state.target.clone)
|
|
418
|
+
end
|
|
419
|
+
def create_handle(new_state)
|
|
420
|
+
hndl = Handle.new(new_state)
|
|
421
|
+
new_state.try_state = try_state_proc(new_state,hndl)
|
|
422
|
+
hndl
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
end
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
if $0 == __FILE__
|
|
430
|
+
eval DATA.read, nil, $0, __LINE__+4
|
|
431
|
+
end
|
|
432
|
+
|
|
433
|
+
__END__
|
|
434
|
+
|
|
435
|
+
require 'test/unit'
|
|
436
|
+
|