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,63 @@
1
+ #--
2
+ # ===============================================================================
3
+ # Copyright (c) 2005,2006,2007 Christopher Kleckner
4
+ # All rights reserved
5
+ #
6
+ # This file is part of the Rio library for ruby.
7
+ #
8
+ # Rio is free software; you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation; either version 2 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # Rio is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with Rio; if not, write to the Free Software
20
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ # ===============================================================================
22
+ #++
23
+ #
24
+ # To create the documentation for Rio run the command
25
+ # ruby build_doc.rb
26
+ # from the distribution directory.
27
+ #
28
+ # Suggested Reading
29
+ # * RIO::Doc::SYNOPSIS
30
+ # * RIO::Doc::INTRO
31
+ # * RIO::Doc::HOWTO
32
+ # * RIO::Doc::EXAMPLES
33
+ # * RIO::Rio
34
+ #
35
+
36
+
37
+ module RIO
38
+ module SysIO #:nodoc: all
39
+ require 'rio/rl/ioi'
40
+ RESET_STATE = RL::IOIBase::RESET_STATE
41
+
42
+ class RL < RL::SysIOBase
43
+ RIOSCHEME = 'sysio'
44
+ RIOPATH = RIO::RL::CHMAP.invert[RIOSCHEME].to_s.freeze
45
+ def opaque() sprintf('0x%08x',self.ios.object_id) end
46
+ def open(*args)
47
+ super(*args)
48
+ end
49
+ # must be able to process both
50
+ # parse('rio:sysio',ios)
51
+ # parse('rio:sysio:0xHEXIOS')
52
+ SPLIT_RE = %r|0x([0-9a-fA-F]+)$|
53
+ def self.splitrl(s)
54
+ sub,opq,whole = split_riorl(s)
55
+ if bm = SPLIT_RE.match(opq)
56
+ oid = bm[1].hex
57
+ ios = ObjectSpace._id2ref(oid)
58
+ [ios]
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,75 @@
1
+ #--
2
+ # ===============================================================================
3
+ # Copyright (c) 2005,2006,2007 Christopher Kleckner
4
+ # All rights reserved
5
+ #
6
+ # This file is part of the Rio library for ruby.
7
+ #
8
+ # Rio is free software; you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation; either version 2 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # Rio is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with Rio; if not, write to the Free Software
20
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ # ===============================================================================
22
+ #++
23
+ #
24
+ # To create the documentation for Rio run the command
25
+ # ruby build_doc.rb
26
+ # from the distribution directory.
27
+ #
28
+ # Suggested Reading
29
+ # * RIO::Doc::SYNOPSIS
30
+ # * RIO::Doc::INTRO
31
+ # * RIO::Doc::HOWTO
32
+ # * RIO::Doc::EXAMPLES
33
+ # * RIO::Rio
34
+ #
35
+
36
+
37
+ require 'rio/rl/base'
38
+ module RIO
39
+ module TCP #:nodoc: all
40
+ RESET_STATE = 'Stream::Duplex::Open'
41
+ require 'rio/rl/ioi'
42
+ class RL < RL::IOIBase
43
+ RIOSCHEME = 'tcp'.freeze
44
+ attr_reader :host
45
+ def initialize(host,port)
46
+ @host = host
47
+ @port = port
48
+ super
49
+ end
50
+ def opaque()
51
+ sprintf('//%s:%s',@host,@port)
52
+ end
53
+ require 'socket'
54
+ def open(*args)
55
+ # @host = 'localhost' if @host.nil? or @host.empty?
56
+ super(::TCPSocket.new(@host || 'localhost',@port))
57
+ end
58
+ def to_s() self.url end
59
+
60
+ # must be able to process
61
+ # parse('rio:tcp',host,port)
62
+ # parse('rio:tcp://host:port')
63
+ SPLIT_RE = %r|//([^/:]*):([0-9a-z]+)$|.freeze
64
+ def self.splitrl(s)
65
+ sub,opq,whole = split_riorl(s)
66
+ if bm = SPLIT_RE.match(opq)
67
+ host = bm[1]
68
+ port = bm[2]
69
+ host = nil if host.empty?
70
+ [host,port]
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,200 @@
1
+ #--
2
+ # ===============================================================================
3
+ # Copyright (c) 2005,2006,2007 Christopher Kleckner
4
+ # All rights reserved
5
+ #
6
+ # This file is part of the Rio library for ruby.
7
+ #
8
+ # Rio is free software; you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation; either version 2 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # Rio is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with Rio; if not, write to the Free Software
20
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ # ===============================================================================
22
+ #++
23
+ #
24
+ # To create the documentation for Rio run the command
25
+ # ruby build_doc.rb
26
+ # from the distribution directory.
27
+ #
28
+ # Suggested Reading
29
+ # * RIO::Doc::SYNOPSIS
30
+ # * RIO::Doc::INTRO
31
+ # * RIO::Doc::HOWTO
32
+ # * RIO::Doc::EXAMPLES
33
+ # * RIO::Rio
34
+ #
35
+
36
+ require 'tmpdir'
37
+ module RIO
38
+ module Temp #:nodoc: all
39
+ RESET_STATE = 'Temp::Reset'
40
+
41
+ require 'rio/rl/base'
42
+ class RL < RL::Base
43
+ RIOSCHEME = 'temp'
44
+ RIOPATH = RIO::RL::CHMAP.invert[RIOSCHEME].to_s.freeze
45
+ DFLT_PREFIX = 'rio'
46
+ DFLT_TMPDIR = ::Dir::tmpdir
47
+ attr_reader :prefix,:tmpdir
48
+ def initialize(file_prefix=DFLT_PREFIX,temp_dir=DFLT_TMPDIR)
49
+ #puts "initialize(#{file_prefix.inspect},#{temp_dir.inspect})"
50
+ @prefix = file_prefix || DFLT_PREFIX
51
+ @tmpdir = temp_dir || DFLT_TMPDIR
52
+ super
53
+ end
54
+ #def path() nil end
55
+ def scheme() self.class.const_get(:RIOSCHEME) end
56
+ def opaque()
57
+ td = self.escape(@tmpdir.to_s)
58
+ td += '/' unless td.nil? or td.empty? or (td != '/' and td[-1] == ?/)
59
+ td + self.escape(@prefix)
60
+ end
61
+
62
+ SPLIT_RE = %r|(?:(.*)/)?([^/]*)$|.freeze
63
+ def self.splitrl(s)
64
+ sub,opq,whole = split_riorl(s)
65
+ if opq.nil? or opq.empty?
66
+ []
67
+ elsif bm = SPLIT_RE.match(opq)
68
+ tdir = bm[1] unless bm[1].nil? or bm[1].empty?
69
+ tpfx = bm[2] unless bm[2].nil? or bm[2].empty?
70
+ [tpfx,tdir]
71
+ else
72
+ []
73
+ end
74
+ end
75
+ end
76
+ module Dir
77
+ require 'rio/rl/path'
78
+ RESET_STATE = RIO::RL::PathBase::RESET_STATE
79
+ require 'tmpdir'
80
+ class RL < RIO::RL::PathBase
81
+ RIOSCHEME = 'tempdir'
82
+ DFLT_PREFIX = Temp::RL::DFLT_PREFIX
83
+ DFLT_TMPDIR = Temp::RL::DFLT_TMPDIR
84
+ attr_reader :prefix,:tmpdir,:tmprl
85
+ def initialize(file_prefix=DFLT_PREFIX,temp_dir=DFLT_TMPDIR)
86
+ #puts "initialize(#{file_prefix.inspect},#{temp_dir.inspect})"
87
+ @prefix = file_prefix || DFLT_PREFIX
88
+ @tmpdir = temp_dir || DFLT_TMPDIR
89
+ require 'rio/tempdir'
90
+ @td = ::Tempdir.new( @prefix.to_s, @tmpdir.to_s)
91
+ super(@td.to_s)
92
+ end
93
+ def dir_rl()
94
+ #p "temp:dir_rl: #{self.uri.inspect}"
95
+ RIO::Dir::RL.new(self.uri, {:fs => self.fs})
96
+ #self
97
+ end
98
+ SPLIT_RE = Temp::RL::SPLIT_RE
99
+ def self.splitrl(s)
100
+ Temp::RL.splitrl(s)
101
+ end
102
+ end
103
+ end
104
+ module File
105
+ require 'rio/rl/path'
106
+ RESET_STATE = 'Temp::Stream::Open'
107
+ class RL < RIO::RL::PathBase
108
+ RIOSCHEME = 'tempfile'
109
+ DFLT_PREFIX = Temp::RL::DFLT_PREFIX
110
+ DFLT_TMPDIR = Temp::RL::DFLT_TMPDIR
111
+ attr_reader :prefix,:tmpdir,:tmprl
112
+ def initialize(file_prefix=DFLT_PREFIX,temp_dir=DFLT_TMPDIR)
113
+ #puts "initialize(#{file_prefix.inspect},#{temp_dir.inspect})"
114
+ @prefix = file_prefix || DFLT_PREFIX
115
+ @tmpdir = temp_dir || DFLT_TMPDIR
116
+ require 'tempfile'
117
+ @tf = ::Tempfile.new( @prefix.to_s, @tmpdir.to_s)
118
+ super(@tf.path)
119
+ end
120
+ def file_rl()
121
+ RIO::File::RL.new(self.uri,{:fs => self.fs})
122
+ #self
123
+ end
124
+ def open(mode='ignored')
125
+ #p callstr('open',mode)
126
+ @tf
127
+ end
128
+ def close
129
+ super
130
+ @tf = nil
131
+ end
132
+ SPLIT_RE = Temp::RL::SPLIT_RE
133
+ def self.splitrl(s)
134
+ Temp::RL.splitrl(s)
135
+ end
136
+ end
137
+ end
138
+ require 'rio/state'
139
+ class Reset < State::Base
140
+ def initialize(*args)
141
+ super
142
+ #p args
143
+ @tempobj = nil
144
+ end
145
+ def self.default_cx
146
+ Cx::Vars.new( { 'closeoneof' => false, 'closeoncopy' => false } )
147
+ end
148
+
149
+ def check?() true end
150
+ def mkdir(prefix=rl.prefix,tmpdir=rl.tmpdir)
151
+ self.rl = RIO::Temp::Dir::RL.new(prefix, tmpdir)
152
+ become 'Dir::Existing'
153
+ end
154
+ # def mkdir()
155
+ # dir()
156
+ # end
157
+ def chdir(&block)
158
+ self.mkdir.chdir(&block)
159
+ end
160
+ def file(prefix=rl.prefix,tmpdir=rl.tmpdir)
161
+ self.rl = RIO::Temp::File::RL.new(prefix, tmpdir)
162
+ become 'Temp::Stream::Open'
163
+ end
164
+ def scheme() rl.scheme() end
165
+ def host() rl.host() end
166
+ def opaque() rl.opaque() end
167
+ def to_s() rl.url() end
168
+ def exist?() false end
169
+ def file?() false end
170
+ def dir?() false end
171
+ def open?() false end
172
+ def closed?() true end
173
+ def when_missing(sym,*args)
174
+ #p @rl.scheme
175
+ if @tempobj.nil?
176
+ file()
177
+ else
178
+ gofigure(sym,*args)
179
+ end
180
+ end
181
+ end
182
+ require 'rio/stream/open'
183
+ module Stream
184
+ class Open < RIO::Stream::Open
185
+ def iostate(sym)
186
+ mode_('w+').open_.inout()
187
+ end
188
+ # def inout() stream_state('Temp::Stream::InOut') end
189
+ end
190
+ # require 'rio/stream'
191
+ # class InOut < RIO::Stream::InOut
192
+ # def base_state() 'Temp::Stream::Close' end
193
+ # end
194
+ # class Close < RIO::Stream::Close
195
+ # def base_state() 'Temp::Reset' end
196
+ # end
197
+
198
+ end
199
+ end
200
+ end
@@ -0,0 +1,72 @@
1
+ #--
2
+ # ===============================================================================
3
+ # Copyright (c) 2005,2006,2007 Christopher Kleckner
4
+ # All rights reserved
5
+ #
6
+ # This file is part of the Rio library for ruby.
7
+ #
8
+ # Rio is free software; you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation; either version 2 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # Rio is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with Rio; if not, write to the Free Software
20
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ # ===============================================================================
22
+ #++
23
+ #
24
+ # To create the documentation for Rio run the command
25
+ # ruby build_doc.rb
26
+ # from the distribution directory.
27
+ #
28
+ # Suggested Reading
29
+ # * RIO::Doc::SYNOPSIS
30
+ # * RIO::Doc::INTRO
31
+ # * RIO::Doc::HOWTO
32
+ # * RIO::Doc::EXAMPLES
33
+ # * RIO::Rio
34
+ #
35
+
36
+
37
+ require 'rio/exception/state'
38
+ module RIO
39
+
40
+ module State
41
+ class Error < Base
42
+ attr_accessor :obj,:msg,:sym
43
+ def initialize
44
+ super
45
+ @obj = nil
46
+ @msg = nil
47
+ @sym = nil
48
+ # self.send(sym,*args) #unless obj == self
49
+ end
50
+ def check?() true end
51
+ def when_missing(sym,*args) self end
52
+ def method_missing(sym,*args,&block)
53
+ # emsg = sprintf("Can't Handle %s[%s].%s(%s)",@obj.class.to_s,@obj.to_s,sym.to_s,args.join(','))
54
+ # emsg += "\n "+@msg unless @msg.nil? or @msg.empty?
55
+ emsg = @msg
56
+ raise Exception::CantHandle.new(@obj,sym,*args),emsg
57
+ end
58
+ def self.error(emsg,obj,sym,*args)
59
+ require 'rio/exception'
60
+ state = new
61
+ state.obj = obj
62
+ state.sym = sym
63
+ msg = sprintf("%s[%s].%s(%s)",obj.class.to_s,obj.to_s,sym.to_s,args.join(','))
64
+ msg += "\n "+emsg unless emsg.nil? or emsg.empty?
65
+ state.msg = msg
66
+ state
67
+ # raise CantHandle.new(obj,sym,*args),emsg
68
+ end
69
+ end
70
+ end
71
+
72
+ end # module RIO
data/lib/rio/state.rb ADDED
@@ -0,0 +1,242 @@
1
+ #--
2
+ # ===============================================================================
3
+ # Copyright (c) 2005,2006,2007 Christopher Kleckner
4
+ # All rights reserved
5
+ #
6
+ # This file is part of the Rio library for ruby.
7
+ #
8
+ # Rio is free software; you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation; either version 2 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # Rio is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with Rio; if not, write to the Free Software
20
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ # ===============================================================================
22
+ #++
23
+ #
24
+ # To create the documentation for Rio run the command
25
+ # ruby build_doc.rb
26
+ # from the distribution directory.
27
+ #
28
+ # Suggested Reading
29
+ # * RIO::Doc::SYNOPSIS
30
+ # * RIO::Doc::INTRO
31
+ # * RIO::Doc::HOWTO
32
+ # * RIO::Doc::EXAMPLES
33
+ # * RIO::Rio
34
+ #
35
+
36
+
37
+ require 'rio/exception/state'
38
+ require 'rio/context'
39
+ require 'rio/context/methods'
40
+ require 'rio/ext'
41
+ require 'rio/symantics'
42
+ require 'rio/filter'
43
+ require 'rio/fs/native'
44
+
45
+ module RIO
46
+
47
+
48
+ module State #:nodoc: all
49
+ # = State
50
+ # the abstract state from which all are derived
51
+ # this level handles
52
+ # * some basic house keeping methods
53
+ # * the methods to communicate with the rio object
54
+ # * the state changing mechanism
55
+ # * and some basic error handling stubs
56
+ class Base
57
+ KIOSYMS = [:gets,:open,:readline,:readlines,:putc,:puts,:print,:printf,
58
+ :=~,:===,:==,:eql?,:load]
59
+ @@kernel_cleaned ||= KIOSYMS.each { |sym| undef_method(sym) }
60
+ undef_method(:rio)
61
+ end
62
+
63
+ class Base
64
+ attr_accessor :try_state
65
+ #attr_accessor :handled_by
66
+
67
+ attr_accessor :rl
68
+ attr_accessor :ioh
69
+
70
+ attr_accessor :cx
71
+
72
+ # Context handling
73
+ include Cx::Methods
74
+ include RIO::Ext::Cx
75
+
76
+
77
+ def initialize(rl=nil,cx=nil,ioh=nil)
78
+ cx ||= self.class.default_cx
79
+ _init(rl,cx,ioh)
80
+ # @handled_by = self.class.to_s
81
+ end
82
+
83
+ def _init(riorl,cntx,iohandle=nil)
84
+ @rl = riorl
85
+ @cx = cntx
86
+ @ioh = iohandle
87
+ # raise Exception::FailedCheck.new(self) unless check?
88
+ self
89
+ end
90
+ private :_init
91
+
92
+ def initialize_copy(*args)
93
+ #p callstr('initialize_copy',args[0].inspect)
94
+ super
95
+ @rl = @rl.clone unless @rl.nil?
96
+ @cx = @cx.clone unless @cx.nil?
97
+ @ioh = @ioh.clone unless @ioh.nil?
98
+ # @fs = @fs
99
+ end
100
+
101
+ def self.default_cx
102
+ Cx::Vars.new( { 'closeoneof' => true, 'closeoncopy' => true } )
103
+ end
104
+ def self.new_other(other)
105
+ new(other.rl,other.cx,other.ioh)
106
+ end
107
+
108
+ alias :ior :ioh
109
+ alias :iow :ioh
110
+
111
+
112
+
113
+
114
+ # Section: State Switching
115
+
116
+ # the method for changing states
117
+ # it's job is create an instance of the next state
118
+ # and change the value in the handle that is shared with the rio object
119
+ def become(new_class,*args)
120
+ p "become : #{self.class.to_s} => #{new_class.to_s} (#{self.mode?})" if $trace_states
121
+ #p "BECOME #{new_class}: #{cx['ss_type']}"
122
+ return self if new_class == self.class
123
+
124
+ begin
125
+ new_state = try_state[new_class,*args]
126
+ rescue Exception::FailedCheck => ex
127
+ p "not a valid "+new_class.to_s+": "+ex.to_s+" '"+self.to_s+"'"
128
+ raise
129
+ end
130
+ became(new_state)
131
+ new_state
132
+ end
133
+ def became(obj)
134
+ #RIO::Ext.became(obj)
135
+ end
136
+ def method_missing_trace_str(sym,*args)
137
+ "missing: "+self.class.to_s+'['+self.to_url+" {#{self.rl.fs}}"+']'+'.'+sym.to_s+'('+args.join(',')+')'
138
+ #"missing: "+self.class.to_s+'['+self.to_url+""+']'+'.'+sym.to_s+'('+args.join(',')+')'
139
+ end
140
+
141
+ def method_missing(sym,*args,&block)
142
+ p method_missing_trace_str(sym,*args) if $trace_states
143
+
144
+ obj = when_missing(sym,*args)
145
+ raise RuntimeError,"when_missing returns nil" if obj.nil?
146
+ obj.__send__(sym,*args,&block) #unless obj == self
147
+ end
148
+
149
+ def when_missing(sym,*args) gofigure(sym,*args) end
150
+
151
+
152
+ def base_state() Factory.instance.reset_state(@rl) end
153
+
154
+ def softreset
155
+ #p "softreset(#{self.class}) => #{self.base_state}"
156
+ cx['retrystate'] = nil
157
+ become(self.base_state)
158
+ end
159
+ def retryreset
160
+ #p "retryreset(#{self.class}) => #{self.base_state}"
161
+ become(self.base_state)
162
+ end
163
+ def reset
164
+ softreset()
165
+ end
166
+
167
+ # Section: Error Handling
168
+ def gofigure(sym,*args)
169
+ cs = "#{sym}("+args.map{|el| el.to_s}.join(',')+")"
170
+ msg = "Go Figure! rio('#{self.to_s}').#{cs} Failed"
171
+ error(msg,sym,*args)
172
+ end
173
+
174
+ def error(emsg,sym,*args)
175
+ require 'rio/state/error'
176
+ Error.error(emsg,self,sym,*args)
177
+ end
178
+
179
+ def to_rl() self.rl.rl end
180
+ def fs() self.rl.fs end
181
+
182
+ extend Forwardable
183
+ def_instance_delegators(:rl,:path,:to_s,:fspath,:urlpath,:length)
184
+
185
+ def ==(other) @rl == other end
186
+ def ===(other) self == other end
187
+ def =~(other) other =~ self.to_str end
188
+ def to_url() @rl.url end
189
+ def to_uri() @rl.uri end
190
+ alias to_str to_s
191
+
192
+ def hash() @rl.to_s.hash end
193
+ def eql?(other) @rl.to_s.eql?(other.to_s) end
194
+
195
+ def stream?() false end
196
+
197
+ # Section: Rio Interface
198
+ # gives states the ability to create new rio objects
199
+ # (should this be here???)
200
+ def new_rio(arg0,*args,&block)
201
+ Rio.rio(arg0,*args,&block)
202
+ end
203
+ def new_rio_cx(*args)
204
+ n = new_rio(*args)
205
+ n.cx = self.cx.bequeath(n.cx)
206
+ n
207
+ end
208
+ def clone_rio()
209
+ cp = Rio.new(self.rl)
210
+ cp.cx = self.cx.clone
211
+ cp.ioh = self.ioh.clone unless self.ioh.nil?
212
+ cp.rl = self.rl.clone
213
+ cp
214
+ end
215
+
216
+ def ensure_rio(arg0)
217
+ case arg0
218
+ when RIO::Rio then arg0
219
+ when RIO::State::Base then arg0.clone_rio
220
+ else new_rio(arg0)
221
+ end
222
+ end
223
+ def ensure_cmd_rio(arg)
224
+ case arg
225
+ when ::String then new_rio(:cmdio,arg)
226
+ when ::Fixnum then new_rio(arg)
227
+ when Rio then arg.clone
228
+ else ensure_rio(arg)
229
+ end
230
+ end
231
+
232
+ include Symantics
233
+
234
+ def callstr(func,*args)
235
+ self.class.to_s+'['+self.to_url+']'+'.'+func.to_s+'('+args.join(',')+')'
236
+ end
237
+
238
+ end
239
+
240
+ end
241
+
242
+ end # module RIO