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,117 @@
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/fs/base'
37
+ require 'zip/zip'
38
+ require 'zip/zipfilesystem'
39
+ require 'rio/scheme/path'
40
+ require 'rio/ext/zipfile/fs'
41
+
42
+ module RIO
43
+ module ZipFile
44
+ class RootDir
45
+ include Enumerable
46
+
47
+ def initialize(zipfilepath)
48
+ @zipfilepath = zipfilepath
49
+ @zipfile = Zip::ZipFile.new(@zipfilepath)
50
+ #puts @zipfile.methods.sort
51
+ @topents = get_topents_
52
+ @entidx = 0
53
+ end
54
+ def get_topents_
55
+ topents = {}
56
+ @zipfile.entries.map{ |ent|
57
+ top = ent.to_s.match(%r|^(/?[^/]+(/)?)|)[1]
58
+ topents[top] = ent if top == ent.to_s
59
+ }
60
+ fs = RIO::ZipFile::FS::InFile.new(@zipfile)
61
+ topents.values.map{ |v| rio(RIO::Path::RL.new(v.to_s,{:fs => fs})) }
62
+ end
63
+ def commit
64
+ @zipfile.commit
65
+ @topents = get_topents_
66
+ end
67
+ def read
68
+ return nil if @entidx >= @topents.size
69
+ @entidx += 1
70
+ @topents[@entidx-1]
71
+ end
72
+ def rewind
73
+ @entidx = 0
74
+ end
75
+ def each(&block)
76
+ @topents.each { |ent|
77
+ yield ent
78
+ }
79
+ end
80
+ def close
81
+ end
82
+ def method_missing(sym,*args,&block)
83
+ @zipfile.__send__(sym,*args,&block)
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ __END__
90
+
91
+
92
+ class CentralDir < RIO::FS::Native
93
+ def initialize(zipfilepath)
94
+ @zipfilepath = zipfilepath
95
+ @zipfile = Zip::ZipFile.new(@zipfilepath)
96
+ super
97
+ end
98
+ def mkdir(path)
99
+ @zipfile.mkdir(path)
100
+ end
101
+ def rmdir(path)
102
+ @zipfile.remove(path)
103
+ end
104
+ def file()
105
+ self
106
+ end
107
+ def open(zipfilepath)
108
+ @zipfilepath = zipfilepath
109
+ @zipfile = Zip::ZipFile.new(@zipfilepath)
110
+ RIO::ZipFile::CentralDir.new(@zipfile)
111
+ end
112
+
113
+ end
114
+
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,161 @@
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/ops/path'
38
+ require 'rio/ops/dir'
39
+ require 'rio/filter/closeoneof'
40
+ require 'rio/ioh'
41
+ module RIO
42
+ module ZipFile
43
+ module State
44
+ class Reset < RIO::State::Base
45
+ def check?() true end
46
+ def when_missing(sym,*args)
47
+ if rl.to_s.empty?
48
+ become('Dir::Open')
49
+ else
50
+ become('Path::Reset')
51
+ end
52
+ #gofigure(sym,*args)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ __END__
59
+ class Base < State::Base
60
+ include Ops::Path::Str
61
+ def open?() !ioh.nil? end
62
+ end
63
+
64
+ class NonExisting < Base
65
+ include Ops::Dir::NonExisting
66
+ def check?() not self.exist? end
67
+ def when_missing(sym,*args) gofigure(sym,*args) end
68
+ end
69
+
70
+ class Existing < Base
71
+ include Ops::Dir::Existing
72
+
73
+ def check?() self.directory? end
74
+ def when_missing(sym,*args) dopen() end
75
+
76
+ protected
77
+
78
+ def stream_rl_
79
+ self.rl.dir_rl()
80
+ #RIO::Dir::RL.new(self.to_uri, {:fs => self.fs})
81
+ end
82
+
83
+ public
84
+
85
+ def dopen()
86
+ self.rl = self.stream_rl_
87
+ become 'Dir::Open'
88
+ end
89
+ end
90
+ class Open < Base
91
+ def check?() true end
92
+ def open(m=nil,*args) open_(*args) end
93
+ def open_(*args)
94
+ unless open?
95
+ self.ioh = self.rl.open()
96
+ end
97
+ self
98
+ end
99
+ def when_missing(sym,*args)
100
+ nobj = open_.dstream()
101
+ return nobj unless nobj.nil?
102
+ gofigure(sym,*args)
103
+ end
104
+
105
+ def dstream()
106
+ cl = 'Dir::Stream'
107
+ #p "LOOP: retry: #{cx['retrystate'].inspect} => #{cl}"
108
+ return nil if cx['retrystate'] == cl
109
+ cx['retrystate'] = cl
110
+
111
+ become(cl)
112
+ end
113
+ end
114
+ class Stream < Base
115
+ include Ops::Dir::Stream
116
+ def check?() open? end
117
+ def when_missing(sym,*args) retryreset() end
118
+ def base_state() 'Dir::Close' end
119
+ def reset() self.close.softreset() end
120
+ alias :copyclose :reset
121
+ end
122
+ class Close < Base
123
+ def reopen(*args) self.close_.softreset.open(*args) end
124
+
125
+ def close()
126
+ #p callstr('close')+" mode='#{mode?}' ioh=#{self.ioh} open?=#{open?}"
127
+ return self unless self.open?
128
+ self.close_
129
+ cx['retrystate'] = nil
130
+ self
131
+ end
132
+
133
+ def close_()
134
+ #p callstr('close_')+" ioh=#{self.ioh} open?=#{open?}"
135
+ return self unless self.open?
136
+ self.clear_selection
137
+ self.ioh.close
138
+ self.ioh = nil
139
+ self.rl.close
140
+ self
141
+ end
142
+ protected :close_
143
+
144
+ CX_ENTRY_SEL_KEYS = %w[nostreamenum entry_sel skip_args ss_skipped]
145
+ def clear_selection()
146
+ CX_ENTRY_SEL_KEYS.each { |k|
147
+ cx.delete(k)
148
+ }
149
+ self
150
+ end
151
+
152
+ def check?() true end
153
+ def when_missing(sym,*args)
154
+ # p callstr('when_missing',sym,*args)
155
+ self.close_.retryreset()
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end # module RIO
@@ -0,0 +1,204 @@
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 'zip/zip'
37
+ require 'zip/zipfilesystem'
38
+ require 'delegate'
39
+
40
+ module RIO
41
+ module ZipFile
42
+ module Wrap
43
+ module Stream
44
+ class Input < DelegateClass(::Zip::ZipInputStream)
45
+ def initialize(zipstream)
46
+ @closed = false
47
+ super
48
+ end
49
+ def close()
50
+ super
51
+ @closed = true
52
+ end
53
+ def closed?() @closed end
54
+ end
55
+ class Output < DelegateClass(::Zip::ZipOutputStream)
56
+ def initialize(zipstream)
57
+ @closed = false
58
+ @zipstream = zipstream
59
+ super
60
+ end
61
+ def close()
62
+ p "CLOSE: #{@zipstream.inspect}"
63
+ #p self.__getobj__.methods.sort
64
+ super
65
+ @closed = true
66
+ end
67
+ end
68
+ class Dir < DelegateClass(::Zip::ZipFileSystem::ZipFsDirIterator)
69
+ end
70
+ class Root
71
+ def initialize(zipfile)
72
+ @zipfile = zipfile
73
+ @infs = RIO::ZipFile::InFile::FS.new(@zipfile)
74
+ #puts @zipfile.methods.sort
75
+ @topents = get_topents_
76
+ @entidx = 0
77
+ end
78
+ def get_topents_
79
+ topents = {}
80
+ @zipfile.entries.map{ |ent|
81
+ top = ent.to_s.match(%r|^(/?[^/]+(/)?)|)[1]
82
+ topents[top] = 1 unless topents.has_key?(top)
83
+ }
84
+ topents.keys.map{ |v| rio(RIO::Path::RL.new(v.to_s,{:fs => @infs})) }
85
+ end
86
+ def read
87
+ return nil if @entidx >= @topents.size
88
+ @entidx += 1
89
+ @topents[@entidx-1]
90
+ end
91
+ def each(&block)
92
+ get_topents_.each { |ent|
93
+ yield ent
94
+ }
95
+ end
96
+ def close
97
+ p "JERE"
98
+ @zipfile.commit if @zipfile.commit_required?
99
+ end
100
+ end
101
+ end
102
+ class File < DelegateClass(::Zip::ZipFileSystem::ZipFsFile)
103
+ def open(filename, openMode, *args)
104
+ zipstream = super
105
+
106
+ case openMode
107
+ when 'r' then Stream::Input.new(super)
108
+ when 'w' then Stream::Output.new(super)
109
+ end
110
+ end
111
+ end
112
+ class Dir < DelegateClass(::Zip::ZipFileSystem::ZipFsDir)
113
+ def open(*args)
114
+ super
115
+ end
116
+ end
117
+ class RootDir < DelegateClass(::Zip::ZipFile)
118
+
119
+ end
120
+ end
121
+ end
122
+ end
123
+ __END__
124
+
125
+
126
+
127
+ class CentralDir
128
+ include Enumerable
129
+
130
+ def initialize(zipfilepath)
131
+ @zipfilepath = zipfilepath
132
+ @zipfile = Zip::ZipFile.new(@zipfilepath)
133
+ #puts @zipfile.methods.sort
134
+ topents = {}
135
+ @zipfile.entries.map{ |ent|
136
+ top = ent.to_s.match(%r|^(/?[^/]+(/)?)|)[1]
137
+ topents[top] = ent if top == ent.to_s
138
+ }
139
+ fs = RIO::ZipFile::FS::InFile.new(@zipfile)
140
+ @topents = topents.values.map{ |v| rio(RIO::Path::RL.new(v.to_s,{:fs => fs})) }
141
+ @entidx = 0
142
+ end
143
+ # def method_missing(sym,*args,&block)
144
+ # @zipfile.__send__(sym,*args,&block)
145
+ # end
146
+ def read
147
+ return nil if @entidx >= @topents.size
148
+ @entidx += 1
149
+ @topents[@entidx-1]
150
+ end
151
+ def rewind
152
+ @entidx = 0
153
+ end
154
+ def each(&block)
155
+ @topents.each { |ent|
156
+ yield ent
157
+ }
158
+ end
159
+ def close
160
+ end
161
+ end
162
+ module FS
163
+ class Base < RIO::FS::Base
164
+ end
165
+ class InFile < Base
166
+ attr_reader :file,:dir
167
+ def initialize(zipfile)
168
+ @zipfile = zipfile
169
+ @file = @zipfile.file
170
+ @dir = @zipfile.dir
171
+ @test = @zipfile.file
172
+ end
173
+ include RIO::FS::File
174
+ include RIO::FS::Dir
175
+ include RIO::FS::Test
176
+ include RIO::FS::Str
177
+ end
178
+
179
+ class CentralDir < RIO::FS::Native
180
+ def initialize(zipfilepath)
181
+ @zipfilepath = zipfilepath
182
+ @zipfile = Zip::ZipFile.new(@zipfilepath)
183
+ super
184
+ end
185
+ def mkdir(path)
186
+ @zipfile.mkdir(path)
187
+ end
188
+ def rmdir(path)
189
+ @zipfile.remove(path)
190
+ end
191
+ def file()
192
+ self
193
+ end
194
+ def open(zipfilepath)
195
+ @zipfilepath = zipfilepath
196
+ @zipfile = Zip::ZipFile.new(@zipfilepath)
197
+ RIO::ZipFile::CentralDir.new(@zipfile)
198
+ end
199
+
200
+ end
201
+
202
+ end
203
+ end
204
+ end