wishdev-rio 0.4.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/COPYING +341 -0
- data/README +81 -0
- data/Rakefile +281 -0
- data/build_doc.rb +94 -0
- data/doc/ANNOUNCE +159 -0
- data/doc/RELEASE_NOTES +308 -0
- data/doc/RIOIS +215 -0
- data/doc/generators/template/html/rio.css +428 -0
- data/doc/generators/template/html/rio.rb +523 -0
- data/doc/generators/template/html/ugly.rb +132 -0
- data/doc/pkg_def.rb +60 -0
- data/doc/rfc1738.txt +1403 -0
- data/doc/rfc959.txt +3933 -0
- data/ex/catcsv.rb +64 -0
- data/ex/colx.rb +8 -0
- data/ex/findinruby +15 -0
- data/ex/findruby +14 -0
- data/ex/passwd_report.rb +8 -0
- data/ex/prompt.rb +25 -0
- data/ex/rgb.txt.gz +0 -0
- data/ex/riocat +42 -0
- data/ex/riogunzip +31 -0
- data/ex/riogzip +24 -0
- data/ex/rioprompt.rb +10 -0
- data/ex/targz2zip +17 -0
- data/ex/tonl +10 -0
- data/lib/rio/abstract_method.rb +56 -0
- data/lib/rio/argv.rb +56 -0
- data/lib/rio/arycopy.rb +43 -0
- data/lib/rio/assert.rb +114 -0
- data/lib/rio/base.rb +56 -0
- data/lib/rio/callstr.rb +46 -0
- data/lib/rio/const.rb +51 -0
- data/lib/rio/construct.rb +50 -0
- data/lib/rio/constructor.rb +258 -0
- data/lib/rio/context/autoclose.rb +72 -0
- data/lib/rio/context/copying.rb +55 -0
- data/lib/rio/context/cxx.rb +66 -0
- data/lib/rio/context/dir.rb +120 -0
- data/lib/rio/context/gzip.rb +50 -0
- data/lib/rio/context/methods.rb +182 -0
- data/lib/rio/context/skip.rb +66 -0
- data/lib/rio/context/stream.rb +229 -0
- data/lib/rio/context.rb +117 -0
- data/lib/rio/cp.rb +370 -0
- data/lib/rio/def.rb +53 -0
- data/lib/rio/dir.rb +144 -0
- data/lib/rio/doc/EXAMPLES.rb +299 -0
- data/lib/rio/doc/HOWTO.rb +737 -0
- data/lib/rio/doc/INDEX.rb +311 -0
- data/lib/rio/doc/INTRO.rb +1068 -0
- data/lib/rio/doc/OPTIONAL.rb +130 -0
- data/lib/rio/doc/SYNOPSIS.rb +183 -0
- data/lib/rio/doc.rb +45 -0
- data/lib/rio/entrysel.rb +246 -0
- data/lib/rio/exception/copy.rb +97 -0
- data/lib/rio/exception/notimplemented.rb +57 -0
- data/lib/rio/exception/notsupported.rb +46 -0
- data/lib/rio/exception/open.rb +61 -0
- data/lib/rio/exception/state.rb +73 -0
- data/lib/rio/exception.rb +41 -0
- data/lib/rio/ext/csv.rb +351 -0
- data/lib/rio/ext/if.rb +45 -0
- data/lib/rio/ext/mp3info.rb +80 -0
- data/lib/rio/ext/splitlines.rb +253 -0
- data/lib/rio/ext/yaml/doc.rb +133 -0
- data/lib/rio/ext/yaml/tie.rb +149 -0
- data/lib/rio/ext/yaml.rb +164 -0
- data/lib/rio/ext/zipfile/fs.rb +116 -0
- data/lib/rio/ext/zipfile/rl.rb +251 -0
- data/lib/rio/ext/zipfile/rootdir.rb +117 -0
- data/lib/rio/ext/zipfile/state.rb +161 -0
- data/lib/rio/ext/zipfile/wrap.rb +204 -0
- data/lib/rio/ext/zipfile.rb +110 -0
- data/lib/rio/ext.rb +138 -0
- data/lib/rio/factory.rb +436 -0
- data/lib/rio/file.rb +118 -0
- data/lib/rio/filter/closeoneof.rb +103 -0
- data/lib/rio/filter/gzip.rb +70 -0
- data/lib/rio/filter.rb +94 -0
- data/lib/rio/fs/base.rb +41 -0
- data/lib/rio/fs/impl.rb +122 -0
- data/lib/rio/fs/native.rb +75 -0
- data/lib/rio/fs/stream.rb +61 -0
- data/lib/rio/fs/url.rb +63 -0
- data/lib/rio/ftp/conncache.rb +101 -0
- data/lib/rio/ftp/dir.rb +94 -0
- data/lib/rio/ftp/fs.rb +180 -0
- data/lib/rio/ftp/ftpfile.rb +20 -0
- data/lib/rio/grande.rb +97 -0
- data/lib/rio/handle.rb +100 -0
- data/lib/rio/if/basic.rb +64 -0
- data/lib/rio/if/csv.rb +76 -0
- data/lib/rio/if/dir.rb +157 -0
- data/lib/rio/if/file.rb +89 -0
- data/lib/rio/if/fileordir.rb +268 -0
- data/lib/rio/if/grande.rb +729 -0
- data/lib/rio/if/grande_entry.rb +379 -0
- data/lib/rio/if/grande_stream.rb +693 -0
- data/lib/rio/if/internal.rb +125 -0
- data/lib/rio/if/path.rb +462 -0
- data/lib/rio/if/rubyio.rb +681 -0
- data/lib/rio/if/string.rb +83 -0
- data/lib/rio/if/temp.rb +45 -0
- data/lib/rio/if/test.rb +282 -0
- data/lib/rio/if/yaml.rb +206 -0
- data/lib/rio/if.rb +64 -0
- data/lib/rio/ioh.rb +162 -0
- data/lib/rio/iomode.rb +109 -0
- data/lib/rio/ios/fail.rb +106 -0
- data/lib/rio/ios/generic.rb +119 -0
- data/lib/rio/ios/mode.rb +60 -0
- data/lib/rio/ios/null.rb +119 -0
- data/lib/rio/iowrap.rb +128 -0
- data/lib/rio/kernel.rb +54 -0
- data/lib/rio/local.rb +62 -0
- data/lib/rio/match.rb +53 -0
- data/lib/rio/matchrecord.rb +283 -0
- data/lib/rio/no_warn.rb +49 -0
- data/lib/rio/nullio.rb +159 -0
- data/lib/rio/open3.rb +68 -0
- data/lib/rio/ops/construct.rb +61 -0
- data/lib/rio/ops/create.rb +77 -0
- data/lib/rio/ops/dir.rb +346 -0
- data/lib/rio/ops/either.rb +134 -0
- data/lib/rio/ops/file.rb +102 -0
- data/lib/rio/ops/path.rb +296 -0
- data/lib/rio/ops/stream/input.rb +267 -0
- data/lib/rio/ops/stream/output.rb +100 -0
- data/lib/rio/ops/stream/read.rb +86 -0
- data/lib/rio/ops/stream/write.rb +57 -0
- data/lib/rio/ops/stream.rb +87 -0
- data/lib/rio/ops/symlink.rb +80 -0
- data/lib/rio/path/reset.rb +69 -0
- data/lib/rio/path.rb +129 -0
- data/lib/rio/piper/cp.rb +80 -0
- data/lib/rio/piper.rb +122 -0
- data/lib/rio/prompt.rb +66 -0
- data/lib/rio/rectype.rb +88 -0
- data/lib/rio/rl/base.rb +118 -0
- data/lib/rio/rl/builder.rb +117 -0
- data/lib/rio/rl/chmap.rb +66 -0
- data/lib/rio/rl/fs2url.rb +82 -0
- data/lib/rio/rl/ioi.rb +78 -0
- data/lib/rio/rl/path.rb +110 -0
- data/lib/rio/rl/pathmethods.rb +116 -0
- data/lib/rio/rl/uri.rb +200 -0
- data/lib/rio/rl/withpath.rb +296 -0
- data/lib/rio/scheme/aryio.rb +88 -0
- data/lib/rio/scheme/cmdio.rb +80 -0
- data/lib/rio/scheme/cmdpipe.rb +118 -0
- data/lib/rio/scheme/fd.rb +65 -0
- data/lib/rio/scheme/ftp.rb +141 -0
- data/lib/rio/scheme/http.rb +78 -0
- data/lib/rio/scheme/null.rb +55 -0
- data/lib/rio/scheme/path.rb +98 -0
- data/lib/rio/scheme/stderr.rb +55 -0
- data/lib/rio/scheme/stdio.rb +71 -0
- data/lib/rio/scheme/strio.rb +87 -0
- data/lib/rio/scheme/sysio.rb +63 -0
- data/lib/rio/scheme/tcp.rb +75 -0
- data/lib/rio/scheme/temp.rb +200 -0
- data/lib/rio/state/error.rb +72 -0
- data/lib/rio/state.rb +242 -0
- data/lib/rio/stream/base.rb +54 -0
- data/lib/rio/stream/duplex.rb +79 -0
- data/lib/rio/stream/open.rb +202 -0
- data/lib/rio/stream.rb +181 -0
- data/lib/rio/symantics.rb +45 -0
- data/lib/rio/tempdir.rb +132 -0
- data/lib/rio/to_rio/all.rb +39 -0
- data/lib/rio/to_rio/array.rb +39 -0
- data/lib/rio/to_rio/io.rb +40 -0
- data/lib/rio/to_rio/object.rb +42 -0
- data/lib/rio/to_rio/string.rb +40 -0
- data/lib/rio/to_rio.rb +67 -0
- data/lib/rio/uri/file.rb +198 -0
- data/lib/rio/util.rb +48 -0
- data/lib/rio/version.rb +51 -0
- data/lib/rio.rb +162 -0
- data/setup.rb +1360 -0
- data/test/bin/count_lines.rb +11 -0
- data/test/bin/find_lines.rb +13 -0
- data/test/bin/list_dir.rb +14 -0
- data/test/ftp/all.rb +9 -0
- data/test/ftp/anon_copy_data.rb +36 -0
- data/test/ftp/anon_misc.rb +124 -0
- data/test/ftp/anon_read.rb +105 -0
- data/test/ftp/anon_special.rb +68 -0
- data/test/ftp/anon_write.rb +70 -0
- data/test/ftp/ftp2ftp.rb +51 -0
- data/test/ftp/initftpfiles.rb +14 -0
- data/test/ftp/testdef.rb +55 -0
- data/test/gem_runtests.rb +15 -0
- data/test/http/all.rb +4 -0
- data/test/http/copy-from-http.rb +141 -0
- data/test/http/uri-meta.rb +72 -0
- data/test/lib/temp_server.rb +46 -0
- data/test/runalltests.rb +17 -0
- data/test/runftptests.rb +14 -0
- data/test/runhttp.rb +11 -0
- data/test/runhttptests.rb +14 -0
- data/test/runtests.rb +52 -0
- data/test/tc/abs.rb +355 -0
- data/test/tc/all.rb +80 -0
- data/test/tc/base.rb +31 -0
- data/test/tc/base2.rb +87 -0
- data/test/tc/cd1.rb +113 -0
- data/test/tc/clearsel.rb +68 -0
- data/test/tc/clone.rb +208 -0
- data/test/tc/closeoncopy.rb +102 -0
- data/test/tc/closeoneof.rb +194 -0
- data/test/tc/cmdpipe.rb +149 -0
- data/test/tc/copy-dir-samevar.rb +91 -0
- data/test/tc/copy-from.rb +129 -0
- data/test/tc/copy-to.rb +91 -0
- data/test/tc/copy.rb +74 -0
- data/test/tc/copyarray.rb +188 -0
- data/test/tc/copydest.rb +50 -0
- data/test/tc/copydir.rb +166 -0
- data/test/tc/copydirlines.rb +121 -0
- data/test/tc/copylines.rb +46 -0
- data/test/tc/copynonex.rb +118 -0
- data/test/tc/copysymlink.rb +39 -0
- data/test/tc/create.rb +114 -0
- data/test/tc/csv.rb +226 -0
- data/test/tc/csv2.rb +138 -0
- data/test/tc/csv_columns.rb +37 -0
- data/test/tc/csvutil.rb +56 -0
- data/test/tc/dir.rb +76 -0
- data/test/tc/dir_iter.rb +383 -0
- data/test/tc/dirautoclose.rb +67 -0
- data/test/tc/dirent.rb +178 -0
- data/test/tc/dirss.rb +81 -0
- data/test/tc/each.rb +111 -0
- data/test/tc/each_break.rb +243 -0
- data/test/tc/edf.rb +81 -0
- data/test/tc/empty.rb +51 -0
- data/test/tc/emptyriodir.rb +129 -0
- data/test/tc/entary.rb +227 -0
- data/test/tc/entsel.rb +110 -0
- data/test/tc/eq.rb +101 -0
- data/test/tc/expand_path.rb +69 -0
- data/test/tc/ext.rb +136 -0
- data/test/tc/fileno.rb +94 -0
- data/test/tc/files_select.rb +92 -0
- data/test/tc/get.rb +152 -0
- data/test/tc/getrec.rb +137 -0
- data/test/tc/gzip.rb +109 -0
- data/test/tc/io_each_byte.rb +60 -0
- data/test/tc/io_read.rb +80 -0
- data/test/tc/iometh.rb +149 -0
- data/test/tc/likeio.rb +116 -0
- data/test/tc/line_record_row.rb +51 -0
- data/test/tc/lineno.rb +196 -0
- data/test/tc/lines.rb +66 -0
- data/test/tc/misc.rb +432 -0
- data/test/tc/nolines.rb +204 -0
- data/test/tc/noqae.rb +879 -0
- data/test/tc/null.rb +45 -0
- data/test/tc/once.rb +6 -0
- data/test/tc/overload.rb +140 -0
- data/test/tc/pa.rb +158 -0
- data/test/tc/path_parts.rb +175 -0
- data/test/tc/pathop.rb +60 -0
- data/test/tc/paths.rb +145 -0
- data/test/tc/pid.rb +31 -0
- data/test/tc/piper.rb +143 -0
- data/test/tc/programs_util.rb +24 -0
- data/test/tc/qae.rb +493 -0
- data/test/tc/qae_riovar.rb +499 -0
- data/test/tc/readline.rb +30 -0
- data/test/tc/records.rb +68 -0
- data/test/tc/rename.rb +233 -0
- data/test/tc/rename_assign.rb +45 -0
- data/test/tc/riorl.rb +181 -0
- data/test/tc/route.rb +51 -0
- data/test/tc/selnosel.rb +33 -0
- data/test/tc/skip.rb +89 -0
- data/test/tc/skiplines.rb +71 -0
- data/test/tc/split.rb +28 -0
- data/test/tc/splitlines.rb +65 -0
- data/test/tc/splitpath.rb +83 -0
- data/test/tc/sub.rb +46 -0
- data/test/tc/symlink.rb +176 -0
- data/test/tc/symlink0.rb +348 -0
- data/test/tc/symlink1.rb +114 -0
- data/test/tc/synopsis.rb +75 -0
- data/test/tc/temp.rb +152 -0
- data/test/tc/tempdir.rb +60 -0
- data/test/tc/tempfile.rb +66 -0
- data/test/tc/testcase.rb +170 -0
- data/test/tc/tonl.rb +37 -0
- data/test/tc/truncate.rb +39 -0
- data/test/tc/yaml.rb +275 -0
- metadata +387 -0
|
@@ -0,0 +1,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
|