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,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
@@ -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__