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,54 @@
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/state'
38
+ module RIO
39
+ module Stream
40
+
41
+ class Base < State::Base
42
+ def iostate(*args) self end
43
+ def stream?() true end
44
+ def recno() nil end
45
+
46
+ # The copy code requires a directory test
47
+ # Streams are never directories
48
+ def dir?() false end
49
+
50
+ end
51
+
52
+ end
53
+ end
54
+
@@ -0,0 +1,79 @@
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/stream'
38
+ require 'rio/stream/open'
39
+
40
+ module RIO
41
+ module Stream
42
+ module Duplex
43
+ module Ops
44
+ module Output
45
+ def wclose()
46
+ #p "wclose #{self}"
47
+ ioh.close_write
48
+ return self.close.softreset if ioh.closed?
49
+ self
50
+ end
51
+ end
52
+ end
53
+ class Open < RIO::Stream::Open
54
+ def output() super.extend(Ops::Output) end
55
+ def inout() super.extend(Ops::Output) end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ __END__
61
+ module RIO
62
+ module Stream
63
+ module Duplex
64
+
65
+ class Input < RIO::Stream::Input
66
+ include Ops::Input
67
+ end
68
+
69
+ class Output < RIO::Stream::Output
70
+ include Ops::Output
71
+ end
72
+
73
+ class InOut < RIO::Stream::InOut
74
+ include Ops::Output
75
+ include Ops::Input
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,202 @@
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/ioh'
38
+ require 'rio/stream/base'
39
+ require 'rio/ops/stream'
40
+ require 'rio/ops/path'
41
+ require 'rio/cp'
42
+ require 'rio/piper/cp'
43
+ require 'rio/util'
44
+
45
+
46
+ module RIO
47
+ module Stream
48
+ class Open < Base
49
+ include Ops::Stream::Status
50
+ include Ops::Path::URI
51
+ include Cp::Open::Output
52
+ include Cp::Open::Input
53
+ include Piper::Cp::Input
54
+
55
+ def check?() true end
56
+
57
+ def open(m=nil,*args)
58
+ #p callstr('open',m,*args)
59
+ case
60
+ when open? then open_(*args)
61
+ when m.nil? then open_(*args)
62
+ else mode(m).open_(*args)
63
+ end
64
+ end
65
+
66
+ protected
67
+
68
+ def open_(*args)
69
+ #p callstr('open_',args.inspect)+" mode='#{mode?}' (#{mode?.class}) ioh=#{self.ioh} open?=#{open?}"
70
+ self.ioh = self.rl.open(mode?,*args) unless open?
71
+ self
72
+ end
73
+
74
+
75
+ end
76
+ end
77
+ end
78
+
79
+
80
+ module RIO
81
+ module Stream
82
+ class Open < Base
83
+
84
+ public
85
+
86
+ #def size() self.contents.size end
87
+ #def empty?() self.eof? end
88
+
89
+ def iostate(sym)
90
+ if mode? && mode?.allows_both?
91
+ open_.inout()
92
+ else
93
+ implicit_state(sym)
94
+ end
95
+ end
96
+
97
+ protected
98
+
99
+ OUTPUT_SYMS = Util::build_sym_hash([:print,:printf,:puts,:putc,:write,
100
+ :print!,:printf!,:puts!,:putc!,:write!,
101
+ :put_,:putrec,:putrec!,:<,:<< ])
102
+
103
+ def when_missing(sym,*args)
104
+ #p callstr('when_missing',sym,*args)+" mode?(#{mode?.class})=#{mode?}"
105
+ nobj = iostate(sym)
106
+ return nobj unless nobj.nil?
107
+ gofigure(sym,*args)
108
+ end
109
+
110
+ def stream_state(cl)
111
+ #p callstr('stream_state',cl)
112
+ #p "LOOP: retry:#{cx['retrystate']} => #{cl}"
113
+ return nil if cx['retrystate'] == cl
114
+ cx['retrystate'] = cl
115
+
116
+ become(cl).add_rec_methods.add_extensions.add_filters.setup
117
+ end
118
+ def output() stream_state('Stream::Output') end
119
+ def input() stream_state('Stream::Input') end
120
+ def inout() stream_state('Stream::InOut') end
121
+
122
+ private
123
+
124
+ def sym_state(sym,im,om)
125
+ if OUTPUT_SYMS[sym.to_s] or RIO::Ext::OUTPUT_SYMS[sym.to_s]
126
+ om ||= (sym.to_s == '<<' ? 'a' : 'w')
127
+ mode_(om).open_.output()
128
+ else
129
+ im ||= 'r'
130
+ mode_(im).open_.input()
131
+ end
132
+ end
133
+
134
+ def implicit_state(sym,*args)
135
+ #p callstr('implicit_state',sym,*args) + " mode='#{mode?}' im='#{inputmode?}' om='#{outputmode?}'"
136
+ case
137
+ when (inputmode?.nil? and outputmode?.nil?)
138
+ sym_state(sym,nil,nil)
139
+ when outputmode?.nil?
140
+ im = inputmode?
141
+ if im.allows_both?
142
+ mode_(im).open_.inout()
143
+ else
144
+ sym_state(sym,im,nil)
145
+ end
146
+ when inputmode?.nil?
147
+ om = outputmode?
148
+ if om.allows_both?
149
+ mode_(om).open_.inout()
150
+ else
151
+ sym_state(sym,nil,om)
152
+ end
153
+ else
154
+ sym_state(sym,inputmode?,outputmode?)
155
+ end
156
+ end
157
+
158
+
159
+ end
160
+
161
+ class Close < State::Base
162
+ include Ops::Stream::Status
163
+
164
+ def check?() true end
165
+ def close()
166
+ #p callstr('close')+" mode='#{mode?}' ioh=#{self.ioh} open?=#{open?}"
167
+ return self unless self.open?
168
+ self.close_
169
+ cx['retrystate'] = nil
170
+ self
171
+ end
172
+
173
+ def reopen(*args) self.close.softreset.open(*args) end
174
+
175
+ protected
176
+
177
+ def base_state() 'Stream::Reset' end
178
+ def when_missing(sym,*args)
179
+ self.close_.retryreset()
180
+ end
181
+
182
+ def close_()
183
+ #p callstr('close_')+" mode='#{mode?}' ioh=#{self.ioh} open?=#{open?}"
184
+ return self unless self.open?
185
+ #clear_selection
186
+ self.ioh.close
187
+ self.ioh = nil
188
+ self.rl.close
189
+ self
190
+ end
191
+
192
+ private
193
+
194
+ def clear_selection()
195
+ cx.delete('stream_sel')
196
+ cx.delete('stream_nosel')
197
+ self
198
+ end
199
+
200
+ end
201
+ end
202
+ end
data/lib/rio/stream.rb ADDED
@@ -0,0 +1,181 @@
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/stream/base'
38
+ require 'rio/ops/path'
39
+ require 'rio/ops/stream'
40
+ require 'rio/ops/stream/input'
41
+ require 'rio/ops/stream/output'
42
+ require 'rio/ext'
43
+
44
+ require 'rio/filter/gzip'
45
+ #require 'rio/filter/yaml'
46
+ #require 'rio/filter/chomp'
47
+ #require 'rio/filter/strip'
48
+ require 'rio/filter/closeoneof'
49
+
50
+ module RIO
51
+
52
+ module Stream #:nodoc: all
53
+ class Reset < Base
54
+ # Mixin the appropriate ops
55
+ #include Ops::Path::Str
56
+ include Ops::Stream::Reset
57
+
58
+ def check?() true end
59
+ def when_missing(sym,*args) retryreset() end
60
+ end
61
+
62
+ class IOBase < Base
63
+ # Mixin the appropriate ops
64
+ include Ops::Path::Str
65
+ include Ops::Stream::Status
66
+ include Ops::Stream::Manip
67
+
68
+ def check?() open? end
69
+ def when_missing(sym,*args)
70
+ #p callstr('when_missing',sym,*args)
71
+ retryreset()
72
+ end
73
+ def base_state() 'Stream::Close' end
74
+ def reset()
75
+ self.close.softreset()
76
+ end
77
+ def setup
78
+ ioh.sync = sync? if cx.has_key?('sync')
79
+ self
80
+ end
81
+ def add_filter(mod)
82
+ unless ioh.kind_of?(mod)
83
+ ioh.extend(mod)
84
+ end
85
+ end
86
+ # def open_(*args)
87
+ # self
88
+ # end
89
+ def rectype_mod
90
+ case cx['stream_rectype']
91
+ when 'lines' then RIO::RecType::Lines
92
+ when 'bytes' then RIO::RecType::Bytes
93
+ else RIO::RecType::Lines
94
+ end
95
+ end
96
+ def self.copier(src,dst)
97
+ RIO::Copy::Strategy::Stream.instance.copier(src,dst)
98
+ end
99
+ end
100
+ module Ini
101
+ def setup
102
+ super
103
+ @recno = -1
104
+ @get_selrej,@get_rangetops = create_selrej()
105
+ self
106
+ end
107
+ end
108
+ class Input < IOBase
109
+ include Ops::Stream::Input
110
+ include Ini
111
+ include Filters
112
+
113
+
114
+ def add_extensions()
115
+ #p callstr('add_extensions')
116
+ Ext::Input.add_extensions(self)
117
+ end
118
+ def add_filters
119
+ #p "IN stream#add_filters"
120
+ add_filter(Filter::GZipRead) if gzip?
121
+ #add_filter(Filter::YAML) if yaml?
122
+ add_line_filters()
123
+ # add_filter(Filter::FasterCSV) if csv?
124
+ # if closeoneof?
125
+ # add_filter(Filter::CloseOnEOF)
126
+ # ioh.oncloseproc = proc { self.on_closeoneof }
127
+ # end
128
+ self
129
+ end
130
+ def add_rec_methods()
131
+ self.extend(rectype_mod.module_eval('Input'))
132
+ end
133
+ end
134
+
135
+ class Output < IOBase
136
+ include Ops::Stream::Output
137
+
138
+ def add_rec_methods()
139
+ self.extend(rectype_mod.module_eval('Output'))
140
+ end
141
+ def add_extensions()
142
+ Ext::Output.add_extensions(self)
143
+ end
144
+ def add_filters
145
+ add_filter(Filter::GZipWrite) if gzip?
146
+ #add_filter(Filter::FasterCSV) if csv?
147
+ #add_filter(Filter::YAML) if yaml?
148
+ self
149
+ end
150
+
151
+ end
152
+
153
+ class InOut < IOBase
154
+ include Ops::Stream::Input
155
+ include Ops::Stream::Output
156
+ include Ini
157
+ include Filters
158
+
159
+ def add_rec_methods()
160
+ self.extend(rectype_mod.module_eval('Input'))
161
+ self.extend(rectype_mod.module_eval('Output'))
162
+ end
163
+ def add_extensions()
164
+ Ext::Input.add_extensions(self)
165
+ Ext::Output.add_extensions(self)
166
+ end
167
+
168
+ def add_filters
169
+ add_line_filters()
170
+
171
+ # if closeoneof?
172
+ # add_filter(Filter::CloseOnEOF)
173
+ # ioh.oncloseproc = proc { self.on_closeoneof }
174
+ # end
175
+ self
176
+ end
177
+
178
+ end
179
+ end
180
+
181
+ end # module RIO