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.
Files changed (296) hide show
  1. data/COPYING +341 -0
  2. data/README +81 -0
  3. data/Rakefile +281 -0
  4. data/build_doc.rb +94 -0
  5. data/doc/ANNOUNCE +159 -0
  6. data/doc/RELEASE_NOTES +308 -0
  7. data/doc/RIOIS +215 -0
  8. data/doc/generators/template/html/rio.css +428 -0
  9. data/doc/generators/template/html/rio.rb +523 -0
  10. data/doc/generators/template/html/ugly.rb +132 -0
  11. data/doc/pkg_def.rb +60 -0
  12. data/doc/rfc1738.txt +1403 -0
  13. data/doc/rfc959.txt +3933 -0
  14. data/ex/catcsv.rb +64 -0
  15. data/ex/colx.rb +8 -0
  16. data/ex/findinruby +15 -0
  17. data/ex/findruby +14 -0
  18. data/ex/passwd_report.rb +8 -0
  19. data/ex/prompt.rb +25 -0
  20. data/ex/rgb.txt.gz +0 -0
  21. data/ex/riocat +42 -0
  22. data/ex/riogunzip +31 -0
  23. data/ex/riogzip +24 -0
  24. data/ex/rioprompt.rb +10 -0
  25. data/ex/targz2zip +17 -0
  26. data/ex/tonl +10 -0
  27. data/lib/rio/abstract_method.rb +56 -0
  28. data/lib/rio/argv.rb +56 -0
  29. data/lib/rio/arycopy.rb +43 -0
  30. data/lib/rio/assert.rb +114 -0
  31. data/lib/rio/base.rb +56 -0
  32. data/lib/rio/callstr.rb +46 -0
  33. data/lib/rio/const.rb +51 -0
  34. data/lib/rio/construct.rb +50 -0
  35. data/lib/rio/constructor.rb +258 -0
  36. data/lib/rio/context/autoclose.rb +72 -0
  37. data/lib/rio/context/copying.rb +55 -0
  38. data/lib/rio/context/cxx.rb +66 -0
  39. data/lib/rio/context/dir.rb +120 -0
  40. data/lib/rio/context/gzip.rb +50 -0
  41. data/lib/rio/context/methods.rb +182 -0
  42. data/lib/rio/context/skip.rb +66 -0
  43. data/lib/rio/context/stream.rb +229 -0
  44. data/lib/rio/context.rb +117 -0
  45. data/lib/rio/cp.rb +370 -0
  46. data/lib/rio/def.rb +53 -0
  47. data/lib/rio/dir.rb +144 -0
  48. data/lib/rio/doc/EXAMPLES.rb +299 -0
  49. data/lib/rio/doc/HOWTO.rb +737 -0
  50. data/lib/rio/doc/INDEX.rb +311 -0
  51. data/lib/rio/doc/INTRO.rb +1068 -0
  52. data/lib/rio/doc/OPTIONAL.rb +130 -0
  53. data/lib/rio/doc/SYNOPSIS.rb +183 -0
  54. data/lib/rio/doc.rb +45 -0
  55. data/lib/rio/entrysel.rb +246 -0
  56. data/lib/rio/exception/copy.rb +97 -0
  57. data/lib/rio/exception/notimplemented.rb +57 -0
  58. data/lib/rio/exception/notsupported.rb +46 -0
  59. data/lib/rio/exception/open.rb +61 -0
  60. data/lib/rio/exception/state.rb +73 -0
  61. data/lib/rio/exception.rb +41 -0
  62. data/lib/rio/ext/csv.rb +351 -0
  63. data/lib/rio/ext/if.rb +45 -0
  64. data/lib/rio/ext/mp3info.rb +80 -0
  65. data/lib/rio/ext/splitlines.rb +253 -0
  66. data/lib/rio/ext/yaml/doc.rb +133 -0
  67. data/lib/rio/ext/yaml/tie.rb +149 -0
  68. data/lib/rio/ext/yaml.rb +164 -0
  69. data/lib/rio/ext/zipfile/fs.rb +116 -0
  70. data/lib/rio/ext/zipfile/rl.rb +251 -0
  71. data/lib/rio/ext/zipfile/rootdir.rb +117 -0
  72. data/lib/rio/ext/zipfile/state.rb +161 -0
  73. data/lib/rio/ext/zipfile/wrap.rb +204 -0
  74. data/lib/rio/ext/zipfile.rb +110 -0
  75. data/lib/rio/ext.rb +138 -0
  76. data/lib/rio/factory.rb +436 -0
  77. data/lib/rio/file.rb +118 -0
  78. data/lib/rio/filter/closeoneof.rb +103 -0
  79. data/lib/rio/filter/gzip.rb +70 -0
  80. data/lib/rio/filter.rb +94 -0
  81. data/lib/rio/fs/base.rb +41 -0
  82. data/lib/rio/fs/impl.rb +122 -0
  83. data/lib/rio/fs/native.rb +75 -0
  84. data/lib/rio/fs/stream.rb +61 -0
  85. data/lib/rio/fs/url.rb +63 -0
  86. data/lib/rio/ftp/conncache.rb +101 -0
  87. data/lib/rio/ftp/dir.rb +94 -0
  88. data/lib/rio/ftp/fs.rb +180 -0
  89. data/lib/rio/ftp/ftpfile.rb +20 -0
  90. data/lib/rio/grande.rb +97 -0
  91. data/lib/rio/handle.rb +100 -0
  92. data/lib/rio/if/basic.rb +64 -0
  93. data/lib/rio/if/csv.rb +76 -0
  94. data/lib/rio/if/dir.rb +157 -0
  95. data/lib/rio/if/file.rb +89 -0
  96. data/lib/rio/if/fileordir.rb +268 -0
  97. data/lib/rio/if/grande.rb +729 -0
  98. data/lib/rio/if/grande_entry.rb +379 -0
  99. data/lib/rio/if/grande_stream.rb +693 -0
  100. data/lib/rio/if/internal.rb +125 -0
  101. data/lib/rio/if/path.rb +462 -0
  102. data/lib/rio/if/rubyio.rb +681 -0
  103. data/lib/rio/if/string.rb +83 -0
  104. data/lib/rio/if/temp.rb +45 -0
  105. data/lib/rio/if/test.rb +282 -0
  106. data/lib/rio/if/yaml.rb +206 -0
  107. data/lib/rio/if.rb +64 -0
  108. data/lib/rio/ioh.rb +162 -0
  109. data/lib/rio/iomode.rb +109 -0
  110. data/lib/rio/ios/fail.rb +106 -0
  111. data/lib/rio/ios/generic.rb +119 -0
  112. data/lib/rio/ios/mode.rb +60 -0
  113. data/lib/rio/ios/null.rb +119 -0
  114. data/lib/rio/iowrap.rb +128 -0
  115. data/lib/rio/kernel.rb +54 -0
  116. data/lib/rio/local.rb +62 -0
  117. data/lib/rio/match.rb +53 -0
  118. data/lib/rio/matchrecord.rb +283 -0
  119. data/lib/rio/no_warn.rb +49 -0
  120. data/lib/rio/nullio.rb +159 -0
  121. data/lib/rio/open3.rb +68 -0
  122. data/lib/rio/ops/construct.rb +61 -0
  123. data/lib/rio/ops/create.rb +77 -0
  124. data/lib/rio/ops/dir.rb +346 -0
  125. data/lib/rio/ops/either.rb +134 -0
  126. data/lib/rio/ops/file.rb +102 -0
  127. data/lib/rio/ops/path.rb +296 -0
  128. data/lib/rio/ops/stream/input.rb +267 -0
  129. data/lib/rio/ops/stream/output.rb +100 -0
  130. data/lib/rio/ops/stream/read.rb +86 -0
  131. data/lib/rio/ops/stream/write.rb +57 -0
  132. data/lib/rio/ops/stream.rb +87 -0
  133. data/lib/rio/ops/symlink.rb +80 -0
  134. data/lib/rio/path/reset.rb +69 -0
  135. data/lib/rio/path.rb +129 -0
  136. data/lib/rio/piper/cp.rb +80 -0
  137. data/lib/rio/piper.rb +122 -0
  138. data/lib/rio/prompt.rb +66 -0
  139. data/lib/rio/rectype.rb +88 -0
  140. data/lib/rio/rl/base.rb +118 -0
  141. data/lib/rio/rl/builder.rb +117 -0
  142. data/lib/rio/rl/chmap.rb +66 -0
  143. data/lib/rio/rl/fs2url.rb +82 -0
  144. data/lib/rio/rl/ioi.rb +78 -0
  145. data/lib/rio/rl/path.rb +110 -0
  146. data/lib/rio/rl/pathmethods.rb +116 -0
  147. data/lib/rio/rl/uri.rb +200 -0
  148. data/lib/rio/rl/withpath.rb +296 -0
  149. data/lib/rio/scheme/aryio.rb +88 -0
  150. data/lib/rio/scheme/cmdio.rb +80 -0
  151. data/lib/rio/scheme/cmdpipe.rb +118 -0
  152. data/lib/rio/scheme/fd.rb +65 -0
  153. data/lib/rio/scheme/ftp.rb +141 -0
  154. data/lib/rio/scheme/http.rb +78 -0
  155. data/lib/rio/scheme/null.rb +55 -0
  156. data/lib/rio/scheme/path.rb +98 -0
  157. data/lib/rio/scheme/stderr.rb +55 -0
  158. data/lib/rio/scheme/stdio.rb +71 -0
  159. data/lib/rio/scheme/strio.rb +87 -0
  160. data/lib/rio/scheme/sysio.rb +63 -0
  161. data/lib/rio/scheme/tcp.rb +75 -0
  162. data/lib/rio/scheme/temp.rb +200 -0
  163. data/lib/rio/state/error.rb +72 -0
  164. data/lib/rio/state.rb +242 -0
  165. data/lib/rio/stream/base.rb +54 -0
  166. data/lib/rio/stream/duplex.rb +79 -0
  167. data/lib/rio/stream/open.rb +202 -0
  168. data/lib/rio/stream.rb +181 -0
  169. data/lib/rio/symantics.rb +45 -0
  170. data/lib/rio/tempdir.rb +132 -0
  171. data/lib/rio/to_rio/all.rb +39 -0
  172. data/lib/rio/to_rio/array.rb +39 -0
  173. data/lib/rio/to_rio/io.rb +40 -0
  174. data/lib/rio/to_rio/object.rb +42 -0
  175. data/lib/rio/to_rio/string.rb +40 -0
  176. data/lib/rio/to_rio.rb +67 -0
  177. data/lib/rio/uri/file.rb +198 -0
  178. data/lib/rio/util.rb +48 -0
  179. data/lib/rio/version.rb +51 -0
  180. data/lib/rio.rb +162 -0
  181. data/setup.rb +1360 -0
  182. data/test/bin/count_lines.rb +11 -0
  183. data/test/bin/find_lines.rb +13 -0
  184. data/test/bin/list_dir.rb +14 -0
  185. data/test/ftp/all.rb +9 -0
  186. data/test/ftp/anon_copy_data.rb +36 -0
  187. data/test/ftp/anon_misc.rb +124 -0
  188. data/test/ftp/anon_read.rb +105 -0
  189. data/test/ftp/anon_special.rb +68 -0
  190. data/test/ftp/anon_write.rb +70 -0
  191. data/test/ftp/ftp2ftp.rb +51 -0
  192. data/test/ftp/initftpfiles.rb +14 -0
  193. data/test/ftp/testdef.rb +55 -0
  194. data/test/gem_runtests.rb +15 -0
  195. data/test/http/all.rb +4 -0
  196. data/test/http/copy-from-http.rb +141 -0
  197. data/test/http/uri-meta.rb +72 -0
  198. data/test/lib/temp_server.rb +46 -0
  199. data/test/runalltests.rb +17 -0
  200. data/test/runftptests.rb +14 -0
  201. data/test/runhttp.rb +11 -0
  202. data/test/runhttptests.rb +14 -0
  203. data/test/runtests.rb +52 -0
  204. data/test/tc/abs.rb +355 -0
  205. data/test/tc/all.rb +80 -0
  206. data/test/tc/base.rb +31 -0
  207. data/test/tc/base2.rb +87 -0
  208. data/test/tc/cd1.rb +113 -0
  209. data/test/tc/clearsel.rb +68 -0
  210. data/test/tc/clone.rb +208 -0
  211. data/test/tc/closeoncopy.rb +102 -0
  212. data/test/tc/closeoneof.rb +194 -0
  213. data/test/tc/cmdpipe.rb +149 -0
  214. data/test/tc/copy-dir-samevar.rb +91 -0
  215. data/test/tc/copy-from.rb +129 -0
  216. data/test/tc/copy-to.rb +91 -0
  217. data/test/tc/copy.rb +74 -0
  218. data/test/tc/copyarray.rb +188 -0
  219. data/test/tc/copydest.rb +50 -0
  220. data/test/tc/copydir.rb +166 -0
  221. data/test/tc/copydirlines.rb +121 -0
  222. data/test/tc/copylines.rb +46 -0
  223. data/test/tc/copynonex.rb +118 -0
  224. data/test/tc/copysymlink.rb +39 -0
  225. data/test/tc/create.rb +114 -0
  226. data/test/tc/csv.rb +226 -0
  227. data/test/tc/csv2.rb +138 -0
  228. data/test/tc/csv_columns.rb +37 -0
  229. data/test/tc/csvutil.rb +56 -0
  230. data/test/tc/dir.rb +76 -0
  231. data/test/tc/dir_iter.rb +383 -0
  232. data/test/tc/dirautoclose.rb +67 -0
  233. data/test/tc/dirent.rb +178 -0
  234. data/test/tc/dirss.rb +81 -0
  235. data/test/tc/each.rb +111 -0
  236. data/test/tc/each_break.rb +243 -0
  237. data/test/tc/edf.rb +81 -0
  238. data/test/tc/empty.rb +51 -0
  239. data/test/tc/emptyriodir.rb +129 -0
  240. data/test/tc/entary.rb +227 -0
  241. data/test/tc/entsel.rb +110 -0
  242. data/test/tc/eq.rb +101 -0
  243. data/test/tc/expand_path.rb +69 -0
  244. data/test/tc/ext.rb +136 -0
  245. data/test/tc/fileno.rb +94 -0
  246. data/test/tc/files_select.rb +92 -0
  247. data/test/tc/get.rb +152 -0
  248. data/test/tc/getrec.rb +137 -0
  249. data/test/tc/gzip.rb +109 -0
  250. data/test/tc/io_each_byte.rb +60 -0
  251. data/test/tc/io_read.rb +80 -0
  252. data/test/tc/iometh.rb +149 -0
  253. data/test/tc/likeio.rb +116 -0
  254. data/test/tc/line_record_row.rb +51 -0
  255. data/test/tc/lineno.rb +196 -0
  256. data/test/tc/lines.rb +66 -0
  257. data/test/tc/misc.rb +432 -0
  258. data/test/tc/nolines.rb +204 -0
  259. data/test/tc/noqae.rb +879 -0
  260. data/test/tc/null.rb +45 -0
  261. data/test/tc/once.rb +6 -0
  262. data/test/tc/overload.rb +140 -0
  263. data/test/tc/pa.rb +158 -0
  264. data/test/tc/path_parts.rb +175 -0
  265. data/test/tc/pathop.rb +60 -0
  266. data/test/tc/paths.rb +145 -0
  267. data/test/tc/pid.rb +31 -0
  268. data/test/tc/piper.rb +143 -0
  269. data/test/tc/programs_util.rb +24 -0
  270. data/test/tc/qae.rb +493 -0
  271. data/test/tc/qae_riovar.rb +499 -0
  272. data/test/tc/readline.rb +30 -0
  273. data/test/tc/records.rb +68 -0
  274. data/test/tc/rename.rb +233 -0
  275. data/test/tc/rename_assign.rb +45 -0
  276. data/test/tc/riorl.rb +181 -0
  277. data/test/tc/route.rb +51 -0
  278. data/test/tc/selnosel.rb +33 -0
  279. data/test/tc/skip.rb +89 -0
  280. data/test/tc/skiplines.rb +71 -0
  281. data/test/tc/split.rb +28 -0
  282. data/test/tc/splitlines.rb +65 -0
  283. data/test/tc/splitpath.rb +83 -0
  284. data/test/tc/sub.rb +46 -0
  285. data/test/tc/symlink.rb +176 -0
  286. data/test/tc/symlink0.rb +348 -0
  287. data/test/tc/symlink1.rb +114 -0
  288. data/test/tc/synopsis.rb +75 -0
  289. data/test/tc/temp.rb +152 -0
  290. data/test/tc/tempdir.rb +60 -0
  291. data/test/tc/tempfile.rb +66 -0
  292. data/test/tc/testcase.rb +170 -0
  293. data/test/tc/tonl.rb +37 -0
  294. data/test/tc/truncate.rb +39 -0
  295. data/test/tc/yaml.rb +275 -0
  296. 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
+
@@ -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
+