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
data/lib/rio/open3.rb ADDED
@@ -0,0 +1,68 @@
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
+ #
38
+ # = open3.rb
39
+ #
40
+ # = Rio
41
+ #
42
+ # Copyright (c) 2005,2006,2007 Christopher Kleckner
43
+ #
44
+ #
45
+
46
+
47
+ require 'rio'
48
+ require 'open3'
49
+
50
+ module RIO
51
+ def popen3(*args,&block)
52
+ if block_given?
53
+ i,o,e = nil,nil,nil
54
+ begin
55
+ Open3.popen3(*args) do |si,so,se|
56
+ yield(i=Rio.new(si),o=Rio.new(so),e=Rio.new(se))
57
+ end
58
+ ensure
59
+ [i,o,e].each { |el| el.reset if el }
60
+ end
61
+ else
62
+ si,so,se = Open3.popen3(*args)
63
+ [Rio.new(si),Rio.new(so),Rio.new(se)]
64
+ end
65
+ end
66
+ module_function :popen3
67
+ end
68
+ __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
+ module RIO
37
+ CONSTRUCTOR_SYMS = [
38
+ :strio,
39
+ :stdio,
40
+ :stderr,
41
+ :temp,
42
+ :tempfile,
43
+ :tempdir,
44
+ :tcp,
45
+ :cmdio,
46
+ :cmdpipe,
47
+ :sysio,
48
+ :fd,
49
+ :ftp,
50
+ ]
51
+ end
52
+
53
+ module RIO
54
+ module Ops
55
+ module Construct
56
+ RIO::CONSTRUCTOR_SYMS.each { |sym|
57
+ module_eval "def #{sym}(*args,&block) Rio.rio(:#{sym},*args,&block) end"
58
+ }
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,77 @@
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 Ops
39
+ module Path
40
+ module Create
41
+ def join(*args)
42
+ before = self.rl.to_s
43
+ arl = self.rl
44
+ nrio = new_rio(arl,*args)
45
+ after = self.rl.to_s
46
+ #p "b=#{before} a=#{after}"
47
+ nrio
48
+ end
49
+ #alias :catpath :join
50
+ def join!(*args)
51
+ rl.join(*args)
52
+ softreset
53
+ end
54
+ #alias :catpath! :join!
55
+ def /(arg)
56
+ ans = join(arg)
57
+ return ans
58
+ end
59
+
60
+ def getwd(*args,&block)
61
+ new_rio(fs.getwd,*args,&block)
62
+ end
63
+ def cwd(*args,&block)
64
+ new_rio(fs.cwd,*args,&block)
65
+ end
66
+
67
+ def rootpath(*args,&block)
68
+ new_rio(fs.root(),*args,&block)
69
+ end
70
+ alias :root :rootpath
71
+ def cleanpath(*args)
72
+ new_rio(fs.cleanpath(fspath,*args))
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,346 @@
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/grande'
38
+ require 'rio/cp'
39
+ require 'rio/ops/either'
40
+
41
+ module RIO
42
+ # module Impl
43
+ # module U
44
+ # def self.rmdir(s) ::Dir.rmdir(s.to_s) end
45
+ # def self.mkdir(s,*args) ::Dir.mkdir(s.to_s,*args) end
46
+ # def self.chdir(s,&block) ::Dir.chdir(s.to_s,&block) end
47
+ # def self.foreach(s,&block) ::Dir.foreach(s.to_s,&block) end
48
+ # def self.entries(s) ::Dir.entries(s.to_s) end
49
+ # def self.cp_r(s,d)
50
+ # require 'fileutils'
51
+ # ::FileUtils.cp_r(s.to_s,d.to_s)
52
+ # end
53
+ # def self.find(s,&block)
54
+ # require 'find'
55
+ # Find.find(s.to_s) do |f|
56
+ # yield f
57
+ # end
58
+ # end
59
+ # def self.glob(gstr,*args,&block)
60
+ # ::Dir.glob(gstr,*args,&block)
61
+ # end
62
+ # def self.rmtree(s)
63
+ # require 'fileutils'
64
+ # ::FileUtils.rmtree(s.to_s)
65
+ # end
66
+ # def self.mkpath(s)
67
+ # require 'fileutils'
68
+ # ::FileUtils.mkpath(s.to_s)
69
+ # end
70
+ # end
71
+ # end
72
+
73
+ module Ops
74
+ module Dir
75
+ module ExistOrNot
76
+ include RIO::Ops::FileOrDir::ExistOrNot
77
+ end
78
+ end
79
+ end
80
+ module Ops
81
+ module Dir
82
+ module NonExisting
83
+ include ExistOrNot
84
+ include ::RIO::Ops::FileOrDir::NonExisting
85
+ def mkdir(*args)
86
+ fs.mkdir(self.to_s,*args);
87
+ softreset()
88
+ end
89
+ def mkpath(*args)
90
+ # p callstr('mkpath',*args)
91
+ fs.mkpath(self.to_s,*args);
92
+ #fs.mkpath(self,*args);
93
+ softreset()
94
+ end
95
+ def rmdir(*args) self end
96
+ def rmtree(*args) self end
97
+ alias :delete :rmdir
98
+ alias :unlink :rmdir
99
+ alias :delete! :rmtree
100
+ end
101
+ end
102
+ end
103
+ end
104
+ module RIO
105
+ module Ops
106
+ module Dir
107
+ module Existing
108
+ include ExistOrNot
109
+ include FileOrDir::Existing
110
+ include Cp::Dir::Input
111
+ include Cp::Dir::Output
112
+ end
113
+ end
114
+ end
115
+ end
116
+
117
+
118
+
119
+ module RIO
120
+ module Ops
121
+ module Dir
122
+ module Existing
123
+ def selective?
124
+ %w[entry_sel stream_sel stream_nosel].any? { |k| cx.has_key?(k) }
125
+ end
126
+ def empty?() self.to_a.empty? end
127
+ def mkdir(*args) self end
128
+ def mkpath(*args) self end
129
+ def rmdir(*args)
130
+ fs.rmdir(self.to_s,*args);
131
+ softreset()
132
+ end
133
+ def rmtree(*args) fs.rmtree(self.to_s,*args); softreset() end
134
+ def rm(*args) fs.rm(self.to_s,*args); softreset() end
135
+
136
+ alias :delete :rmdir
137
+ alias :unlink :delete
138
+ alias :delete! :rmtree
139
+
140
+ def chdir(*args,&block)
141
+ if block_given?
142
+ fs.chdir(self.to_s,*args) { |dir|
143
+ yield new_rio('.')
144
+ }
145
+ else
146
+ fs.chdir(self.path,*args)
147
+ return new_rio('.')
148
+ end
149
+ self
150
+ end
151
+
152
+ def ensure_rio_cx(arg0)
153
+ return arg0 if arg0.kind_of?(::RIO::Rio)
154
+ new_rio_cx(arg0)
155
+ end
156
+
157
+ def glob(*args,&block)
158
+ chdir do
159
+ if block_given?
160
+ fs.glob(*args) do |ent|
161
+ yield new_rio_cx(self,ent)
162
+ end
163
+ else
164
+ return fs.glob(*args).map { |ent| new_rio_cx(self,ent) }
165
+ end
166
+ end
167
+ end
168
+
169
+ end
170
+ end
171
+ end
172
+ module Ops
173
+ module Dir
174
+ module Stream
175
+ include FileOrDir::Existing
176
+ include Enumerable
177
+ include Grande
178
+ include Cp::Dir::Input
179
+ include Cp::Dir::Output
180
+ public
181
+
182
+ def entries(*args,&block) _set_select('entries',*args,&block) end
183
+
184
+ def each(*args,&block)
185
+ each_(*args,&block)
186
+ end
187
+
188
+
189
+ def read()
190
+ read_()
191
+ end
192
+
193
+ def get()
194
+ self.each_ent_ { |d|
195
+ return d
196
+ }
197
+ return nil
198
+ end
199
+
200
+ def rewind() ioh.rewind(); self end
201
+ def seek(integer) ioh.seek(integer); self end
202
+
203
+ extend Forwardable
204
+ def_instance_delegators(:ioh,:tell,:pos,:pos=)
205
+
206
+ protected
207
+ require 'rio/entrysel'
208
+ end
209
+ end
210
+ end
211
+ end
212
+ module RIO
213
+ module Ops
214
+ module Dir
215
+ module Stream
216
+
217
+ protected
218
+
219
+ def read_()
220
+ if ent = ioh.read()
221
+ new_rio_cx(ent)
222
+ else
223
+ self.close if closeoneof?
224
+ nil
225
+ end
226
+ end
227
+ def handle_skipped
228
+ #return unless cx.has_key?('skip_args') or cx['skipping']
229
+ return self unless cx.has_key?('skip_args')
230
+ args = cx['skip_args'] || []
231
+ self.skipentries(*args)
232
+ end
233
+ def ent_to_rio_(ent,indir)
234
+ #p "ent_to_rio: ent=#{ent.inspect} indir=#{indir}"
235
+ if ent.kind_of?(RIO::Rio)
236
+ oldpath = ent.to_s
237
+ ent.rl.urlpath = indir.to_s
238
+ ent.join!(oldpath)
239
+ ent.cx = self.cx.bequeath(ent.cx)
240
+ ent
241
+ else
242
+ # KIT: should this be RL.fs2url(ent) ???
243
+ if indir
244
+ new_rio_cx(indir.rl,ent)
245
+ else
246
+ new_rio_cx(ent)
247
+ end
248
+ end
249
+ end
250
+ def handle_ent_(ent,indir,sel,&block)
251
+ begin
252
+ erio = ent_to_rio_(ent,indir)
253
+ #p "handle_ent_1: #{erio.cx.inspect}"
254
+ if stream_iter?
255
+ # case for iterating files in a directory (e.g. rio('adir').lines)
256
+ _add_stream_iter_cx(erio).each(&block) if erio.file? and sel.match?(erio)
257
+ else
258
+ yield _add_iter_cx(erio) if sel.match?(erio)
259
+ end
260
+ #p "handle_ent_2: #{erio.cx.inspect}"
261
+
262
+ if cx.has_key?('all') and erio.directory?
263
+ rsel = Match::Entry::SelectorClassic.new(cx['r_sel'],cx['r_nosel'])
264
+ _add_recurse_iter_cx(erio).each(&block) if rsel.match?(erio)
265
+ end
266
+
267
+ rescue ::Errno::ENOENT, ::URI::InvalidURIError => ex
268
+ $stderr.puts(ex.message+". Skipping.")
269
+ end
270
+ end
271
+ def each_(*args,&block)
272
+ #p "#{callstr('each_',*args)} sel=#{cx['entry_sel'].inspect}"
273
+ handle_skipped()
274
+ sel = Match::Entry::Selector.new(cx['entry_sel'])
275
+ indir = (self.to_s == '.' ? nil : self)
276
+ self.ioh.each do |ent|
277
+ #next if
278
+ handle_ent_(ent,indir,sel,&block) unless ent =~ /^\.(\.)?$/
279
+ end
280
+ closeoneof? ? self.close : self
281
+ end
282
+ def each_ent_(*args,&block)
283
+ #p "#{callstr('each_',*args)} sel=#{cx['sel'].inspect} nosel=#{cx['nosel'].inspect}"
284
+ handle_skipped()
285
+ sel = Match::Entry::Selector.new(cx['entry_sel'])
286
+ indir = (self.to_s == '.' ? nil : self)
287
+ while ent = self.ioh.read
288
+ handle_ent_(ent,indir,sel,&block) unless ent =~ /^\.(\.)?$/
289
+ end
290
+ closeoneof? ? self.close : self
291
+ end
292
+
293
+ end
294
+ end
295
+ end
296
+ end
297
+
298
+ module RIO
299
+ module Ops
300
+ module Dir
301
+ module Stream
302
+
303
+ private
304
+
305
+ def _ss_keys() Cx::SS::ENTRY_KEYS + Cx::SS::STREAM_KEYS end
306
+ CX_ALL_SKIP_KEYS = ['retrystate']
307
+ def _add_recurse_iter_cx(ario)
308
+ new_cx = ario.cx
309
+ cx.keys.reject { |k|
310
+ CX_ALL_SKIP_KEYS.include?(k)
311
+ }.each { |k|
312
+ new_cx.set_(k,cx[k])
313
+ }
314
+ ario.cx = new_cx
315
+ ario
316
+ end
317
+ def _add_cx(ario,keys)
318
+ new_cx = ario.cx
319
+ keys.each {|k|
320
+ next unless cx.has_key?(k)
321
+ new_cx.set_(k,cx[k])
322
+ }
323
+ ario.cx = new_cx
324
+ end
325
+ CX_DIR_ITER_KEYS = %w[entry_sel]
326
+ CX_STREAM_ITER_KEYS = %w[stream_rectype stream_itertype stream_sel stream_nosel]
327
+ def _add_iter_cx(ario)
328
+ if nostreamenum?
329
+ _add_cx(ario,CX_DIR_ITER_KEYS)
330
+ end
331
+ _add_stream_iter_cx(ario)
332
+ end
333
+ def _add_stream_iter_cx(ario)
334
+ _add_cx(ario,CX_STREAM_ITER_KEYS)
335
+ new_cx = ario.cx
336
+ if stream_iter?
337
+ new_cx.set_('ss_args',cx['ss_args']) if cx.has_key?('ss_args')
338
+ new_cx.set_('ss_type',cx['ss_type']) if cx.has_key?('ss_type')
339
+ end
340
+ ario.cx = new_cx
341
+ ario
342
+ end
343
+ end
344
+ end
345
+ end
346
+ end