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,130 @@
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 Doc #:doc:
39
+ =begin rdoc
40
+
41
+ = Rio - Ruby I/O Facilitator
42
+
43
+ Rio is a facade for most of the standard ruby classes that deal with I/O;
44
+ providing a simple, intuitive, succinct interface to the functionality
45
+ provided by IO, File, Dir, Pathname, FileUtils, Tempfile, StringIO, OpenURI
46
+ and others. Rio also provides an application level interface which allows many
47
+ common I/O idioms to be expressed succinctly.
48
+
49
+ Please read the following first:
50
+ * RIO::Doc::INTRO
51
+ * RIO::Doc::SYNOPSIS
52
+ * RIO::Doc::HOWTO
53
+ * RIO::Rio
54
+
55
+ = Rio Optional Components
56
+
57
+ This document describes various optional Rio components, that must be
58
+ explicitly 'required' to be available. These are not included in
59
+ rio.rb either because they change classes that should not be changed
60
+ without the developers explicit permission, or because they are not of
61
+ general enough interest.
62
+
63
+ == to_rio
64
+
65
+ This option comprises 4 options
66
+ * Object#to_rio
67
+
68
+ require 'rio/to_rio/object'
69
+ ario = any_object.to_rio
70
+
71
+ This option adds a to_rio method to the Object class which calls the
72
+ object's #to_s method and passes it to the Rio constructor. Like:
73
+
74
+ ario = rio(any_object.to_s)
75
+
76
+ * String#to_rio and String#/
77
+
78
+ require 'rio/to_rio/string'
79
+ ario = "a/file/represented/as/a/string".to_rio
80
+ ario = 'strings'/'used'/'with'/'subdirectory'/'operator'
81
+
82
+ This option adds a to_rio method and the subdirectory operator '/'
83
+ to the String class. Note that due to operator precedance one must
84
+ use parenthesis when calling a method directly on a Rio created
85
+ using the subdirectory operator with Strings
86
+
87
+ array_of_first_ten_lines = ('adir'/'asubdir'/'afile').lines[0...10]
88
+
89
+ * Array#to_rio
90
+
91
+ require 'rio/to_rio/array'
92
+ ario = %w[an array of path components].to_rio #=> rio('an/array/of/path/components')
93
+
94
+ This option adds a to_rio method to the Array class. This behaves as
95
+ if
96
+ rio(%w[an array of path components]) had been called.
97
+
98
+ * require 'rio/to_rio/all' will make all of the above available.
99
+
100
+ == RIO.ARGV
101
+
102
+ require 'rio/argv'
103
+ arguments_as_rios = RIO.ARGV
104
+
105
+ This option provides a function which converts each element of ruby's
106
+ ARGV into a Rio. Useful when writing a program which takes a list of
107
+ files as its arguments
108
+
109
+ == RIO.popen3
110
+
111
+ require 'rio/open3'
112
+ input,output,errput = RIO.popen3
113
+ RIO.popen3 { |input,output,errput| ... }
114
+
115
+ This options provides a wrapper around the Open3#popen3 call with the
116
+ IO objects converted to Rios
117
+
118
+ == RIO.prompt
119
+
120
+ require 'rio/prompt'
121
+ the_anwser = RIO.prompt('What is the answer? ')
122
+
123
+ This option provides a module function to prompt for input.
124
+
125
+
126
+ =end
127
+ module OPTIONAL
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,183 @@
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
+ # :title: Rio
38
+
39
+ module RIO
40
+ # Copyright (c) 2005,2006,2007 Christopher Kleckner.
41
+ # All rights reserved
42
+ #
43
+ # This file is part of the Rio library for ruby.
44
+ # Rio is free software; you can redistribute it and/or modify it under the terms of
45
+ # the {GNU General Public License}[http://www.gnu.org/licenses/gpl.html] as published by
46
+ # the Free Software Foundation; either version 2 of the License, or
47
+ # (at your option) any later version.
48
+ #
49
+ module Doc #:doc:
50
+ =begin rdoc
51
+
52
+ = Rio - Ruby I/O Facilitator
53
+
54
+ fa-cil-i-tate: To make easy or easier.
55
+
56
+ Rio is a facade for most of the standard ruby classes that deal with I/O;
57
+ providing a simple, intuitive, succinct interface to the functionality
58
+ provided by IO, File, Dir, Pathname, FileUtils, Tempfile, StringIO, OpenURI
59
+ and others. Rio also provides an application level interface which allows many
60
+ common I/O idioms to be expressed succinctly.
61
+
62
+
63
+ == SYNOPSIS
64
+
65
+ For the following assume:
66
+ astring = ""
67
+ anarray = []
68
+
69
+ Iterate over the .rb files in a directory.
70
+ rio('adir').files('*.rb') { |entrio| ... }
71
+
72
+ Return an array of the .rb files in a directory.
73
+ rio('adir').files['*.rb']
74
+
75
+ Copy the .rb files in a directory.to another directory.
76
+ rio('adir').files('*.rb') > rio('another_directory')
77
+
78
+ Iterate over the .rb files in a directory and its subdirectories.
79
+ rio('adir').all.files('*.rb') { |entrio| ... }
80
+
81
+ Return an array of the .rb files in a directory and its subdirectories.
82
+ rio('adir').all.files['*.rb']
83
+
84
+ Copy or append a file to a string
85
+ rio('afile') > astring # copy
86
+ rio('afile') >> astring # append
87
+
88
+ Copy or append a string to a file
89
+ rio('afile') < astring # copy
90
+ rio('afile') << astring # append
91
+
92
+ Copy or append the lines of a file to an array
93
+ rio('afile') > anarray
94
+ rio('afile') >> anarray
95
+
96
+ Copy or append a file to another file
97
+ rio('afile') > rio('another_file')
98
+ rio('afile') >> rio('another_file')
99
+
100
+ Copy a file to a directory
101
+ rio('adir') << rio('afile')
102
+
103
+ Copy a directory to another directory
104
+ rio('adir') >> rio('another_directory')
105
+
106
+ Copy a web-page to a file
107
+ rio('http://rubydoc.org/') > rio('afile')
108
+
109
+ Read a web-page into a string
110
+ astring = rio('http://rubydoc.org/').read
111
+
112
+ Ways to get the chomped lines of a file into an array
113
+ anarray = rio('afile').chomp[] # subscript operator
114
+ rio('afile').chomp > anarray # copy-to operator
115
+ anarray = rio('afile').chomp.to_a # to_a
116
+ anarray = rio('afile').chomp.readlines # IO#readlines
117
+
118
+ Iterate over selected lines of a file
119
+ rio('adir').lines(0..3) { |aline| ... } # a range of lines
120
+ rio('adir').lines(/re/) { |aline| ... } # by regular expression
121
+ rio('adir').lines(0..3,/re/) { |aline| ... } # or both
122
+
123
+ Return selected lines of a file as an array
124
+ rio('adir').lines[0..3] # a range of lines
125
+ rio('adir').lines[/re/] # by regular expression
126
+ rio('adir').lines[0..3,/re/] # or both
127
+
128
+ Iterate over selected chomped lines of a file
129
+ rio('adir').chomp.lines(0..3) { |aline| ... } # a range of lines
130
+ rio('adir').chomp.lines(/re/) { |aline| ... } # by regular expression
131
+
132
+ Return selected chomped lines of a file as an array
133
+ rio('adir').chomp[0..3] # a range of lines
134
+ rio('adir').chomp[/re/] # by regular expression
135
+
136
+ Copy a gzipped file un-gzipping it
137
+ rio('afile.gz').gzip > rio('afile')
138
+
139
+ Copy a plain file, gzipping it
140
+ rio('afile.gz').gzip < rio('afile')
141
+
142
+ Copy a file from a ftp server into a local file un-gzipping it
143
+ rio('ftp://host/afile.gz').gzip > rio('afile')
144
+
145
+ Return an array of .rb files excluding symlinks to .rb files
146
+ rio('adir').files('*.rb').skip[:symlink?]
147
+
148
+ Put the first 10 chomped lines of a gzipped file into an array
149
+ anarray = rio('afile.gz').chomp.gzip[0...10]
150
+
151
+ Copy lines 0 and 3 thru 5 of a gzipped file on an ftp server to stdout
152
+ rio('ftp://host/afile.gz').gzip.lines(0,3..5) > ?-
153
+
154
+ Return an array of files in a directory and its subdirectories, without descending into .svn directories.
155
+ rio('adir').norecurse(/^\.svn$/).files[]
156
+
157
+ Iterate over the non-empty, non-comment chomped lines of a file
158
+ rio('afile').chomp.skip(:empty?,/^\s*#/) { |line| ... }
159
+
160
+ Copy the output of th ps command into an array, skipping the header line and the ps command entry
161
+ rio(?-,'ps -a').skiplines(0,/ps$/) > anarray
162
+
163
+ Prompt for input and return what was typed
164
+ ans = rio(?-).print("Type Something: ").chomp.gets
165
+
166
+ Change the extension of all .htm files in a directory and its subdirectories to .html
167
+ rio('adir').rename.all.files('*.htm') do |htmfile|
168
+ htmfile.extname = '.html'
169
+ end
170
+
171
+ === SUGGESTED READING
172
+
173
+ * RIO::Doc::INTRO
174
+ * RIO::Doc::HOWTO
175
+ * RIO::Rio
176
+ * RIO::Doc::EXAMPLES
177
+ * RIO::Doc::OPTIONAL
178
+
179
+ =end
180
+ module SYNOPSIS #:doc:
181
+ end
182
+ end
183
+ end
data/lib/rio/doc.rb ADDED
@@ -0,0 +1,45 @@
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'
38
+ module RIO
39
+ TITLE = "Rio"
40
+ SUMMARY = "Rio - Ruby I/O Facilitator"
41
+ DESCRIPTION = "Rio is a Ruby class wrapping much of the functionality of " +
42
+ "IO, File, Dir, Pathname, FileUtils, Tempfile, StringIO, " +
43
+ "OpenURI, Zlib, and CSV."
44
+
45
+ end
@@ -0,0 +1,246 @@
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/abstract_method'
38
+ class ::Object #:nodoc: all
39
+ def true?() true end
40
+ def false?() false end
41
+ end
42
+ # 2314
43
+ module RIO
44
+ module Match #:nodoc: all
45
+ module Entry
46
+ class Base
47
+ attr_reader :match_to
48
+ def initialize(match_to)
49
+ @match_to = match_to
50
+ end
51
+ def inspect()
52
+ @match_to.to_s
53
+ end
54
+ def ===(el) self =~ el end
55
+ abstract_method :=~
56
+
57
+ end
58
+ class Depth < Base
59
+ def =~(entry)
60
+ @match_to === entry.rl.pathdepth
61
+ end
62
+ end
63
+ class Any < Base
64
+ def =~(entry) true end
65
+ end
66
+ class None < Base
67
+ def =~(entry) false end
68
+ end
69
+ class Glob < Base
70
+ def =~(entry)
71
+ ::File.fnmatch?(@match_to,entry.filename.to_s)
72
+ end
73
+ end
74
+ class Regexp < Base
75
+ def =~(entry)
76
+ @match_to =~ entry.filename.to_s
77
+ end
78
+ end
79
+ class PathGlob < Base
80
+ def =~(entry)
81
+ ::File.fnmatch?(@match_to,entry.to_s)
82
+ end
83
+ end
84
+ class PathRegexp < Base
85
+ def =~(entry)
86
+ @match_to =~ entry.to_s
87
+ end
88
+ end
89
+ class Proc < Base
90
+ def =~(entry) @match_to[entry.clone] end
91
+ end
92
+ class Symbol < Base
93
+ def =~(entry) entry.__send__(@match_to) end
94
+ end
95
+ class And < Base
96
+ def initialize(matches)
97
+ super(matches.flatten.map { |arg| Match::Entry.create(arg) })
98
+ end
99
+ def =~(el)
100
+ (@match_to.empty? or @match_to.all? { |sel| sel =~ el })
101
+ end
102
+ end
103
+ def create(arg)
104
+ case arg
105
+ when ::Fixnum then Depth.new(arg)
106
+ when ::Range then Depth.new(arg)
107
+ when ::String then Glob.new(arg)
108
+ when ::Regexp then Regexp.new(arg)
109
+ when ::Proc then Proc.new(arg)
110
+ when ::Symbol then Symbol.new(arg)
111
+ when ::TrueClass then Any.new(arg)
112
+ when ::FalseClass then None.new(arg)
113
+ when ::Array then And.new(arg)
114
+ else raise ArgumentError,"a String,Regexp,Proc or Symbol is required (#{arg})"
115
+ end
116
+ end
117
+ module_function :create
118
+ end
119
+ end
120
+ end
121
+ module RIO
122
+ module Match
123
+ module Entry
124
+ class List
125
+ attr_reader :sym
126
+ attr_accessor :list
127
+ def initialize(sym,*args)
128
+ @sym = sym
129
+ @list = args.map { |arg| Match::Entry.create(arg) }
130
+ end
131
+ def inspect()
132
+ @sym.to_s+"("+@list.inspect+")"
133
+ end
134
+ def <<(el)
135
+ @list << el
136
+ end
137
+ def ===(me_list)
138
+ @sym == me_list.sym
139
+ end
140
+ def =~(el)
141
+ el.__send__(@sym) and (@list.empty? or @list.detect { |sel| sel =~ el })
142
+ end
143
+ extend Forwardable
144
+ def_instance_delegators(:@list,:each)
145
+ def callstr(func,*args)
146
+ self.class.to_s+'['+self.to_s+']'+'.'+func.to_s+'('+args.join(',')+')'
147
+ end
148
+ end
149
+ class Sels < Array
150
+ def <<(entry_list)
151
+ same_sym = self.grep(entry_list)
152
+ if same_sym.empty?
153
+ super
154
+ else
155
+ same_sym[0].list = entry_list.list
156
+ end
157
+ end
158
+ def callstr(func,*args)
159
+ self.class.to_s+'['+self.to_s+']'+'.'+func.to_s+'('+args.join(',')+')'
160
+ end
161
+ end
162
+ class Selector
163
+ attr_reader :sel,:nosel
164
+ def initialize(entry_sel)
165
+ @entry_sel = entry_sel
166
+ @sel = @nosel = nil
167
+ process_entry_sel() if @entry_sel
168
+ end
169
+ def entry_sel_args()
170
+ @entry_sel['args']
171
+ end
172
+ def something_selected?
173
+ %w[entries files dirs].any? { |k| entry_sel_args.has_key?(k) }
174
+ end
175
+ def something_skipped?
176
+ %w[skipentries skipfiles skipdirs].any? { |k| entry_sel_args.has_key?(k) }
177
+ end
178
+ def skip_type(skip_args)
179
+
180
+ end
181
+ def process_entry_sel()
182
+ sel_args = self.entry_sel_args
183
+ raise RuntimeError, "Internal error: entry_sel_args not set" unless sel_args
184
+ if something_selected?
185
+ @sel = Match::Entry::Sels.new
186
+ @sel << Match::Entry::List.new(:true?,*sel_args['entries']) if sel_args.has_key?('entries')
187
+ @sel << Match::Entry::List.new(:file?,*sel_args['files']) if sel_args.has_key?('files')
188
+ @sel << Match::Entry::List.new(:dir?,*sel_args['dirs']) if sel_args.has_key?('dirs')
189
+ end
190
+ if something_skipped?
191
+ @nosel = Match::Entry::Sels.new
192
+ if sel_args.has_key?('skipentries')
193
+ @nosel << Match::Entry::List.new(:true?,*sel_args['skipentries'])
194
+ end
195
+ if sel_args.has_key?('skipfiles')
196
+ @nosel << Match::Entry::List.new(:file?,*sel_args['skipfiles'])
197
+ unless sel_args['skipfiles'].empty? or sel_args.has_key?('files')
198
+ @sel ||= Match::Entry::Sels.new
199
+ @sel << Match::Entry::List.new(:file?)
200
+ end
201
+ end
202
+ if sel_args.has_key?('skipdirs')
203
+ @nosel << Match::Entry::List.new(:dir?,*sel_args['skipdirs'])
204
+ unless sel_args['skipdirs'].empty? or sel_args.has_key?('dirs')
205
+ @sel ||= Match::Entry::Sels.new
206
+ @sel << Match::Entry::List.new(:dir?)
207
+ end
208
+ end
209
+ end
210
+ end
211
+ def inspect()
212
+ str = sprintf('#<Selector:0x%08x',self.object_id)
213
+ str += " @sel=#{@sel.inspect}"
214
+ str += " @nosel=#{@nosel.inspect}"
215
+ str += ">"
216
+ str
217
+ end
218
+
219
+ private
220
+
221
+ def yes?(el)
222
+ @sel.nil? or @sel.detect { |match_entry| match_entry =~ el }
223
+ # @sel.nil? or @sel.grep(el)
224
+ end
225
+ def no?(el)
226
+ @nosel.detect { |match_entry| match_entry =~ el } unless @nosel.nil?
227
+ end
228
+
229
+ public
230
+
231
+ def match?(el)
232
+ yes?(el) and not no?(el)
233
+ end
234
+ def callstr(func,*args)
235
+ self.class.to_s+'['+self.to_s+']'+'.'+func.to_s+'('+args.join(',')+')'
236
+ end
237
+ end
238
+ class SelectorClassic < Selector
239
+ def initialize(sel,nosel)
240
+ @sel = sel
241
+ @nosel = nosel
242
+ end
243
+ end
244
+ end
245
+ end
246
+ end