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,97 @@
|
|
|
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'
|
|
38
|
+
module RIO
|
|
39
|
+
module Exception
|
|
40
|
+
class Copy < Base
|
|
41
|
+
attr :syserr
|
|
42
|
+
attr :src
|
|
43
|
+
attr :dst
|
|
44
|
+
def initialize(s,d,rerror)
|
|
45
|
+
@src = ::RIO::Rio.new(s)
|
|
46
|
+
@dst = ::RIO::Rio.new(d)
|
|
47
|
+
@syserr = rerror
|
|
48
|
+
end
|
|
49
|
+
def submsg(s)
|
|
50
|
+
"\n\t" + s
|
|
51
|
+
end
|
|
52
|
+
def file_info(f)
|
|
53
|
+
return unless f.file?
|
|
54
|
+
"is a file"
|
|
55
|
+
end
|
|
56
|
+
def symlink_info(f)
|
|
57
|
+
return unless f.symlink?
|
|
58
|
+
t = f.readlink
|
|
59
|
+
s = "is a symlink refering to #{t}"
|
|
60
|
+
f.dirname.chdir {
|
|
61
|
+
s += submsg(" : '#{t}' " + finfo(t))
|
|
62
|
+
}
|
|
63
|
+
return s
|
|
64
|
+
end
|
|
65
|
+
def dir_info(f)
|
|
66
|
+
return unless f.dir?
|
|
67
|
+
return "is a directory"
|
|
68
|
+
end
|
|
69
|
+
def finfo(f)
|
|
70
|
+
case
|
|
71
|
+
when (not f.exist?)
|
|
72
|
+
return "does not exist"
|
|
73
|
+
when f.symlink?
|
|
74
|
+
return symlink_info(f)
|
|
75
|
+
when f.dir?
|
|
76
|
+
return dir_info(f)
|
|
77
|
+
when f.file?
|
|
78
|
+
return file_info(f)
|
|
79
|
+
end
|
|
80
|
+
return ""
|
|
81
|
+
end
|
|
82
|
+
def explain()
|
|
83
|
+
s = "#{self.class}: failed copying '#{@src}' => #{@dst}"
|
|
84
|
+
s += submsg("Err: #{@syserr}") if @syserr
|
|
85
|
+
s += submsg("Src: '#{@src}' " + finfo(@src))
|
|
86
|
+
s += submsg("Dst: '#{@dst}' " + finfo(@dst))
|
|
87
|
+
target = ::RIO::rio(@dst,@src.filename) if @dst.dir?
|
|
88
|
+
p target
|
|
89
|
+
if target.exist?
|
|
90
|
+
s += submsg("Tgt: '#{target} " + finfo(target))
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
s += "\n"
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
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'
|
|
38
|
+
module RIO
|
|
39
|
+
module Exception
|
|
40
|
+
class MethodNotImplemented < ::NotImplementedError #:nodoc: all
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
module RIO
|
|
46
|
+
module Error #:nodoc: all
|
|
47
|
+
module NotImplemented
|
|
48
|
+
def nodef(*args)
|
|
49
|
+
method_name = Kernel.caller[0].match(/(?:.+):in \`(.+)\'$/)[1]
|
|
50
|
+
class_name = self.class.to_s
|
|
51
|
+
call_str = "#{class_name}.#{method_name}(#{args.join(',')})"
|
|
52
|
+
raise(RIO::Exception::MethodNotImplemented, "\n#{call_str} is not implemented\n")
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
@@ -0,0 +1,46 @@
|
|
|
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'
|
|
38
|
+
module RIO
|
|
39
|
+
module Exception
|
|
40
|
+
class NotSupported < Base #:nodoc: all
|
|
41
|
+
def self.emsg(fname,obj)
|
|
42
|
+
"#{fname}() is not supported for #{obj.class} objects"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
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'
|
|
38
|
+
module RIO
|
|
39
|
+
module Exception
|
|
40
|
+
class Open < Base
|
|
41
|
+
attr :obj
|
|
42
|
+
def initialize(obj,syse ,*args)
|
|
43
|
+
@obj = obj
|
|
44
|
+
@syserr = syse
|
|
45
|
+
end
|
|
46
|
+
def explain()
|
|
47
|
+
# s = "#{self.class}: failed copying '#{@src}' => #{@dst}"
|
|
48
|
+
# s += submsg("Err: #{@syserr}") if @syserr
|
|
49
|
+
# s += submsg("Src: '#{@src}' " + finfo(@src))
|
|
50
|
+
# s += submsg("Dst: '#{@dst}' " + finfo(@dst))
|
|
51
|
+
# target = ::RIO::rio(@dst,@src.filename) if @dst.dir?
|
|
52
|
+
# p target
|
|
53
|
+
# if target.exist?
|
|
54
|
+
# s += submsg("Tgt: '#{target} " + finfo(target))
|
|
55
|
+
# end
|
|
56
|
+
|
|
57
|
+
# s += "\n"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
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'
|
|
38
|
+
module RIO
|
|
39
|
+
module Exception
|
|
40
|
+
class State < Base; end
|
|
41
|
+
class FailedCheck < State
|
|
42
|
+
attr :obj
|
|
43
|
+
def initialize(obj)
|
|
44
|
+
super
|
|
45
|
+
@obj = obj
|
|
46
|
+
end
|
|
47
|
+
def to_s() @obj.to_s end
|
|
48
|
+
end
|
|
49
|
+
class CantHandle < State
|
|
50
|
+
attr :obj
|
|
51
|
+
attr :sym
|
|
52
|
+
attr :args
|
|
53
|
+
def initialize(obj,sym,*args)
|
|
54
|
+
super(obj)
|
|
55
|
+
@obj = obj
|
|
56
|
+
@sym = sym
|
|
57
|
+
@args = args
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
class Looping < State
|
|
61
|
+
attr :obj
|
|
62
|
+
attr :sym
|
|
63
|
+
attr :args
|
|
64
|
+
def initialize(obj,sym,*args)
|
|
65
|
+
super(obj)
|
|
66
|
+
@obj = obj
|
|
67
|
+
@sym = sym
|
|
68
|
+
@args = args
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
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 Exception #:nodoc: all
|
|
39
|
+
class Base < StandardError; end
|
|
40
|
+
end
|
|
41
|
+
end
|
data/lib/rio/ext/csv.rb
ADDED
|
@@ -0,0 +1,351 @@
|
|
|
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
|
+
# begin
|
|
38
|
+
# require 'faster_csv' # first choice--for speed
|
|
39
|
+
|
|
40
|
+
# # A CSV compatible interface for FasterCSV.
|
|
41
|
+
# module CSV # :nodoc:
|
|
42
|
+
# def self.parse_line( line, field_sep=nil, row_sep=nil )
|
|
43
|
+
# FasterCSV.parse_line( line, :col_sep => field_sep || ",",
|
|
44
|
+
# :row_sep => row_sep || :auto )
|
|
45
|
+
# end
|
|
46
|
+
|
|
47
|
+
# def self.generate_line( array, field_sep=nil, row_sep=nil )
|
|
48
|
+
# FasterCSV.generate_line( array, :col_sep => field_sep || ",",
|
|
49
|
+
# :row_sep => row_sep || "" )
|
|
50
|
+
# end
|
|
51
|
+
# end
|
|
52
|
+
# rescue LoadError
|
|
53
|
+
# require 'csv' # second choice--slower but standard
|
|
54
|
+
# end
|
|
55
|
+
|
|
56
|
+
require 'csv'
|
|
57
|
+
|
|
58
|
+
$EXTEND_CSV_RESULTS = false
|
|
59
|
+
module RIO
|
|
60
|
+
module Ext
|
|
61
|
+
module CSV
|
|
62
|
+
module Cx
|
|
63
|
+
def csv(fs=',',rs=nil,&block)
|
|
64
|
+
cx['csv_fs'] = fs
|
|
65
|
+
cx['csv_rs'] = rs
|
|
66
|
+
cxx('csv',true,&block)
|
|
67
|
+
end
|
|
68
|
+
def csv?() cxx?('csv') end
|
|
69
|
+
def csv_(fs=',',rs=nil)
|
|
70
|
+
cx['csv_fs'] = fs
|
|
71
|
+
cx['csv_rs'] = rs
|
|
72
|
+
cxx_('csv',true)
|
|
73
|
+
end
|
|
74
|
+
protected :csv_
|
|
75
|
+
def columns(*ranges,&block)
|
|
76
|
+
if skipping?
|
|
77
|
+
cx['skipping'] = false
|
|
78
|
+
skipcolumns(*args,&block)
|
|
79
|
+
else
|
|
80
|
+
@cnames = nil
|
|
81
|
+
cx['col_args'] = ranges.flatten
|
|
82
|
+
cxx('columns',true,&block)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
def skipcolumns(*ranges,&block)
|
|
86
|
+
@cnames = nil
|
|
87
|
+
cx['nocol_args'] = ranges.flatten
|
|
88
|
+
cxx('columns',true,&block)
|
|
89
|
+
end
|
|
90
|
+
def columns?()
|
|
91
|
+
cxx?('columns')
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
module RIO
|
|
98
|
+
module Ext
|
|
99
|
+
module CSV
|
|
100
|
+
module Ary
|
|
101
|
+
attr_accessor :csv_rec_to_s
|
|
102
|
+
def to_s()
|
|
103
|
+
@csv_rec_to_s.call(self)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
module Str
|
|
107
|
+
attr_accessor :csv_s_to_rec
|
|
108
|
+
def to_a()
|
|
109
|
+
@csv_s_to_rec.call(self)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
module RIO
|
|
118
|
+
module Ext
|
|
119
|
+
module CSV
|
|
120
|
+
module Input
|
|
121
|
+
|
|
122
|
+
protected
|
|
123
|
+
# def ior()
|
|
124
|
+
# p cx['stream_itertype']
|
|
125
|
+
# case cx['stream_itertype']
|
|
126
|
+
# when 'lines',nil
|
|
127
|
+
# self.ioh.iostack[-2]
|
|
128
|
+
# else
|
|
129
|
+
# self.ioh
|
|
130
|
+
# end
|
|
131
|
+
# end
|
|
132
|
+
# def each_rec_(&block)
|
|
133
|
+
# self.ior.each { |line|
|
|
134
|
+
# yield line
|
|
135
|
+
# }
|
|
136
|
+
# self
|
|
137
|
+
# end
|
|
138
|
+
|
|
139
|
+
def to_rec_(raw_rec)
|
|
140
|
+
#_init_cols_from_line(raw_rec) if @recno == 0
|
|
141
|
+
#p "#{callstr('to_rec_',raw_rec.inspect,@recno)} ; itertype=#{cx['stream_itertype']}"
|
|
142
|
+
case cx['stream_itertype']
|
|
143
|
+
when 'lines'
|
|
144
|
+
if $EXTEND_CSV_RESULTS
|
|
145
|
+
unless copying_from?
|
|
146
|
+
raw_rec.extend(RIO::Ext::CSV::Str)
|
|
147
|
+
raw_rec.csv_s_to_rec = _s_to_rec_proc(cx['csv_fs'],cx['csv_rs'])
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
raw_rec
|
|
151
|
+
when 'records'
|
|
152
|
+
_l2record(raw_rec,cx['csv_fs'],cx['csv_rs'])
|
|
153
|
+
when 'rows'
|
|
154
|
+
_l2row(raw_rec,cx['csv_fs'],cx['csv_rs'])
|
|
155
|
+
else
|
|
156
|
+
_l2record(raw_rec,cx['csv_fs'],cx['csv_rs'])
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
private
|
|
161
|
+
|
|
162
|
+
def trim(fields)
|
|
163
|
+
ycols = cx['col_args']
|
|
164
|
+
ncols = cx['nocol_args']
|
|
165
|
+
return [] if ncols and ncols.empty?
|
|
166
|
+
if ycols.nil? and ncols.nil?
|
|
167
|
+
return fields
|
|
168
|
+
end
|
|
169
|
+
ncols = [] if ncols.nil?
|
|
170
|
+
ycols = [(0...fields.size)] if ycols.nil? or ycols.empty?
|
|
171
|
+
cols = []
|
|
172
|
+
fields.each_index { |i|
|
|
173
|
+
yes = nil
|
|
174
|
+
no = nil
|
|
175
|
+
ycols.each { |yc|
|
|
176
|
+
if yc === i
|
|
177
|
+
yes = true
|
|
178
|
+
break
|
|
179
|
+
end
|
|
180
|
+
}
|
|
181
|
+
ncols.each { |nc|
|
|
182
|
+
if nc === i
|
|
183
|
+
no = true
|
|
184
|
+
break
|
|
185
|
+
end
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
cols << i if yes and !no
|
|
189
|
+
}
|
|
190
|
+
tfields = []
|
|
191
|
+
cols.each do |i|
|
|
192
|
+
tfields << fields[i]
|
|
193
|
+
end
|
|
194
|
+
tfields
|
|
195
|
+
end
|
|
196
|
+
def parse_line_(line,fs,rs)
|
|
197
|
+
::CSV.parse_line(line,fs,rs)
|
|
198
|
+
end
|
|
199
|
+
def _l2a(line,fs,rs)
|
|
200
|
+
parse_line_(line,fs,rs)
|
|
201
|
+
end
|
|
202
|
+
def _l2record(line,fs,rs)
|
|
203
|
+
#p callstr('_l2record',line,fs,rs,cols)
|
|
204
|
+
fields = trim(parse_line_(line,fs,rs))
|
|
205
|
+
if $EXTEND_CSV_RESULTS
|
|
206
|
+
unless copying_from?
|
|
207
|
+
fields.extend(RIO::Ext::CSV::Ary)
|
|
208
|
+
fields.csv_rec_to_s = _rec_to_s_proc(fs,rs)
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
# p "csv#fields: #{fields}"
|
|
212
|
+
# fields.each do |f|
|
|
213
|
+
# p f
|
|
214
|
+
# end
|
|
215
|
+
fields.map{ |f| f.to_s }
|
|
216
|
+
end
|
|
217
|
+
def cnames(num)
|
|
218
|
+
@cnames ||= trim((0...num).map { |n| "Col#{n}" })
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def _l2row(line,fs,rs)
|
|
222
|
+
dat = _l2a(line,fs,rs)
|
|
223
|
+
names = cnames(dat.length)
|
|
224
|
+
dat = trim(dat)
|
|
225
|
+
rw = {}
|
|
226
|
+
(0...names.length).each { |i|
|
|
227
|
+
rw[names[i]] = dat[i]
|
|
228
|
+
}
|
|
229
|
+
rw
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def _rec_to_s_proc(fs,rs)
|
|
233
|
+
proc { |a|
|
|
234
|
+
::CSV.generate_line(a,fs,rs)
|
|
235
|
+
}
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def _s_to_rec_proc(fs,rs)
|
|
239
|
+
proc { |s|
|
|
240
|
+
::CSV.parse_line(s,fs,rs)
|
|
241
|
+
}
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
def _init_cols_from_line(line)
|
|
245
|
+
ary = _l2record(line,cx['csv_fs'],cx['csv_rs'])
|
|
246
|
+
_init_cols_from_ary(ary)
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def _init_cols_from_num(num)
|
|
250
|
+
fake_rec = (0...num).map { |n| "Column#{num}" }
|
|
251
|
+
_init_cols_from_ary(fake_rec)
|
|
252
|
+
end
|
|
253
|
+
def _init_cols_from_hash(hash)
|
|
254
|
+
_init_cols_from_ary(hash.keys)
|
|
255
|
+
end
|
|
256
|
+
def _init_cols_from_ary(ary)
|
|
257
|
+
#p callstr('_init_cols_from_ary',ary)
|
|
258
|
+
if columns?
|
|
259
|
+
cx['col_names'] = []
|
|
260
|
+
cx['col_nums'] = []
|
|
261
|
+
|
|
262
|
+
ary.each_with_index do |cname,idx|
|
|
263
|
+
cx['col_args'].each do |arg|
|
|
264
|
+
if arg === ( arg.kind_of?(::Regexp) || arg.kind_of?(::String) ? cname : idx )
|
|
265
|
+
cx['col_names'] << cname
|
|
266
|
+
cx['col_nums'] << idx
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
else
|
|
271
|
+
cx['col_names'] = ary
|
|
272
|
+
end
|
|
273
|
+
cx.values_at('col_nums','col_names')
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
module CSV
|
|
280
|
+
module Output
|
|
281
|
+
|
|
282
|
+
public
|
|
283
|
+
|
|
284
|
+
def putrow(*argv)
|
|
285
|
+
require 'csv'
|
|
286
|
+
row = ( argv.length == 1 && argv[0].kind_of?(::Array) ? argv[0] : argv )
|
|
287
|
+
self.puts(::CSV.generate_line(row,self.cx['csv_fs'],self.cx['csv_rs']))
|
|
288
|
+
end
|
|
289
|
+
def putrow!(*argv)
|
|
290
|
+
putrow(*argv)
|
|
291
|
+
close
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
protected
|
|
295
|
+
|
|
296
|
+
def put_(arg,fs=cx['csv_fs'],rs=cx['csv_rs'])
|
|
297
|
+
#p callstr('put_',arg.inspect,fs,rs)
|
|
298
|
+
@header_line ||= _to_header_line(arg,fs,rs)
|
|
299
|
+
puts(_to_line(arg,fs,rs))
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
def cpfrom_array_(ary)
|
|
303
|
+
#p callstr('copy_from_array',ary.inspect)
|
|
304
|
+
if ary.empty?
|
|
305
|
+
super
|
|
306
|
+
else
|
|
307
|
+
if ary[0].kind_of? ::Array
|
|
308
|
+
super
|
|
309
|
+
else
|
|
310
|
+
put_(ary)
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
private
|
|
316
|
+
|
|
317
|
+
def _to_header_line(arg,fs=cx['csv_fs'],rs=nil)
|
|
318
|
+
case arg
|
|
319
|
+
when ::String
|
|
320
|
+
arg
|
|
321
|
+
when ::Array
|
|
322
|
+
_ary_to_line(arg,fs,rs)
|
|
323
|
+
when ::Hash
|
|
324
|
+
_ary_to_line(arg.keys,fs,rs)
|
|
325
|
+
else
|
|
326
|
+
arg.to_s
|
|
327
|
+
end
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
def _to_line(arg,fs=cx['csv_fs'],rs=cx['csv_rs'])
|
|
331
|
+
#p callstr('_to_line',arg.inspect,fs,rs)
|
|
332
|
+
case arg
|
|
333
|
+
when ::Array
|
|
334
|
+
_ary_to_line(arg,fs,rs)
|
|
335
|
+
when ::Hash
|
|
336
|
+
_ary_to_line(arg.values,fs,rs)
|
|
337
|
+
else
|
|
338
|
+
arg
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
def _ary_to_line(ary,fs,rs)
|
|
343
|
+
rs ||= $/
|
|
344
|
+
::CSV.generate_line(ary,fs,rs)
|
|
345
|
+
end
|
|
346
|
+
public
|
|
347
|
+
end
|
|
348
|
+
end
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
__END__
|