rio 0.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 (395) hide show
  1. data/COPYING +340 -0
  2. data/ChangeLog +755 -0
  3. data/README +65 -0
  4. data/RUNME.1st.rb +75 -0
  5. data/Rakefile +312 -0
  6. data/VERSION +1 -0
  7. data/doc/README_MSWIN32.txt +39 -0
  8. data/doc/RELEASE_NOTES +130 -0
  9. data/doc/generators/template/html/rio.rb +895 -0
  10. data/doc/rdoc/classes/Kernel.html +181 -0
  11. data/doc/rdoc/classes/Kernel.src/M000183.html +18 -0
  12. data/doc/rdoc/classes/RIO.html +508 -0
  13. data/doc/rdoc/classes/RIO.src/M000001.html +18 -0
  14. data/doc/rdoc/classes/RIO.src/M000002.html +18 -0
  15. data/doc/rdoc/classes/RIO.src/M000003.html +18 -0
  16. data/doc/rdoc/classes/RIO/Doc.html +138 -0
  17. data/doc/rdoc/classes/RIO/Doc/HOWTO.html +1031 -0
  18. data/doc/rdoc/classes/RIO/Doc/INTRO.html +1116 -0
  19. data/doc/rdoc/classes/RIO/Doc/MISC.html +443 -0
  20. data/doc/rdoc/classes/RIO/Doc/SYNOPSIS.html +325 -0
  21. data/doc/rdoc/classes/RIO/Rio.html +6333 -0
  22. data/doc/rdoc/classes/RIO/Rio.src/M000004.html +18 -0
  23. data/doc/rdoc/classes/RIO/Rio.src/M000005.html +20 -0
  24. data/doc/rdoc/classes/RIO/Rio.src/M000006.html +27 -0
  25. data/doc/rdoc/classes/RIO/Rio.src/M000007.html +27 -0
  26. data/doc/rdoc/classes/RIO/Rio.src/M000008.html +16 -0
  27. data/doc/rdoc/classes/RIO/Rio.src/M000009.html +18 -0
  28. data/doc/rdoc/classes/RIO/Rio.src/M000010.html +20 -0
  29. data/doc/rdoc/classes/RIO/Rio.src/M000011.html +16 -0
  30. data/doc/rdoc/classes/RIO/Rio.src/M000012.html +16 -0
  31. data/doc/rdoc/classes/RIO/Rio.src/M000013.html +16 -0
  32. data/doc/rdoc/classes/RIO/Rio.src/M000014.html +16 -0
  33. data/doc/rdoc/classes/RIO/Rio.src/M000015.html +16 -0
  34. data/doc/rdoc/classes/RIO/Rio.src/M000016.html +16 -0
  35. data/doc/rdoc/classes/RIO/Rio.src/M000017.html +16 -0
  36. data/doc/rdoc/classes/RIO/Rio.src/M000018.html +16 -0
  37. data/doc/rdoc/classes/RIO/Rio.src/M000019.html +16 -0
  38. data/doc/rdoc/classes/RIO/Rio.src/M000020.html +16 -0
  39. data/doc/rdoc/classes/RIO/Rio.src/M000021.html +16 -0
  40. data/doc/rdoc/classes/RIO/Rio.src/M000022.html +16 -0
  41. data/doc/rdoc/classes/RIO/Rio.src/M000023.html +16 -0
  42. data/doc/rdoc/classes/RIO/Rio.src/M000024.html +16 -0
  43. data/doc/rdoc/classes/RIO/Rio.src/M000025.html +16 -0
  44. data/doc/rdoc/classes/RIO/Rio.src/M000026.html +16 -0
  45. data/doc/rdoc/classes/RIO/Rio.src/M000027.html +16 -0
  46. data/doc/rdoc/classes/RIO/Rio.src/M000028.html +16 -0
  47. data/doc/rdoc/classes/RIO/Rio.src/M000029.html +16 -0
  48. data/doc/rdoc/classes/RIO/Rio.src/M000030.html +16 -0
  49. data/doc/rdoc/classes/RIO/Rio.src/M000031.html +16 -0
  50. data/doc/rdoc/classes/RIO/Rio.src/M000032.html +16 -0
  51. data/doc/rdoc/classes/RIO/Rio.src/M000033.html +16 -0
  52. data/doc/rdoc/classes/RIO/Rio.src/M000034.html +16 -0
  53. data/doc/rdoc/classes/RIO/Rio.src/M000035.html +16 -0
  54. data/doc/rdoc/classes/RIO/Rio.src/M000036.html +16 -0
  55. data/doc/rdoc/classes/RIO/Rio.src/M000037.html +16 -0
  56. data/doc/rdoc/classes/RIO/Rio.src/M000038.html +16 -0
  57. data/doc/rdoc/classes/RIO/Rio.src/M000039.html +16 -0
  58. data/doc/rdoc/classes/RIO/Rio.src/M000040.html +16 -0
  59. data/doc/rdoc/classes/RIO/Rio.src/M000041.html +16 -0
  60. data/doc/rdoc/classes/RIO/Rio.src/M000042.html +16 -0
  61. data/doc/rdoc/classes/RIO/Rio.src/M000043.html +16 -0
  62. data/doc/rdoc/classes/RIO/Rio.src/M000044.html +16 -0
  63. data/doc/rdoc/classes/RIO/Rio.src/M000045.html +16 -0
  64. data/doc/rdoc/classes/RIO/Rio.src/M000046.html +16 -0
  65. data/doc/rdoc/classes/RIO/Rio.src/M000047.html +16 -0
  66. data/doc/rdoc/classes/RIO/Rio.src/M000048.html +16 -0
  67. data/doc/rdoc/classes/RIO/Rio.src/M000049.html +16 -0
  68. data/doc/rdoc/classes/RIO/Rio.src/M000050.html +16 -0
  69. data/doc/rdoc/classes/RIO/Rio.src/M000051.html +16 -0
  70. data/doc/rdoc/classes/RIO/Rio.src/M000052.html +16 -0
  71. data/doc/rdoc/classes/RIO/Rio.src/M000053.html +16 -0
  72. data/doc/rdoc/classes/RIO/Rio.src/M000054.html +16 -0
  73. data/doc/rdoc/classes/RIO/Rio.src/M000055.html +16 -0
  74. data/doc/rdoc/classes/RIO/Rio.src/M000056.html +16 -0
  75. data/doc/rdoc/classes/RIO/Rio.src/M000057.html +16 -0
  76. data/doc/rdoc/classes/RIO/Rio.src/M000058.html +16 -0
  77. data/doc/rdoc/classes/RIO/Rio.src/M000059.html +16 -0
  78. data/doc/rdoc/classes/RIO/Rio.src/M000060.html +16 -0
  79. data/doc/rdoc/classes/RIO/Rio.src/M000061.html +16 -0
  80. data/doc/rdoc/classes/RIO/Rio.src/M000062.html +16 -0
  81. data/doc/rdoc/classes/RIO/Rio.src/M000063.html +16 -0
  82. data/doc/rdoc/classes/RIO/Rio.src/M000064.html +16 -0
  83. data/doc/rdoc/classes/RIO/Rio.src/M000065.html +16 -0
  84. data/doc/rdoc/classes/RIO/Rio.src/M000066.html +16 -0
  85. data/doc/rdoc/classes/RIO/Rio.src/M000067.html +16 -0
  86. data/doc/rdoc/classes/RIO/Rio.src/M000068.html +16 -0
  87. data/doc/rdoc/classes/RIO/Rio.src/M000069.html +16 -0
  88. data/doc/rdoc/classes/RIO/Rio.src/M000070.html +16 -0
  89. data/doc/rdoc/classes/RIO/Rio.src/M000071.html +16 -0
  90. data/doc/rdoc/classes/RIO/Rio.src/M000072.html +16 -0
  91. data/doc/rdoc/classes/RIO/Rio.src/M000073.html +16 -0
  92. data/doc/rdoc/classes/RIO/Rio.src/M000074.html +16 -0
  93. data/doc/rdoc/classes/RIO/Rio.src/M000075.html +16 -0
  94. data/doc/rdoc/classes/RIO/Rio.src/M000076.html +16 -0
  95. data/doc/rdoc/classes/RIO/Rio.src/M000077.html +16 -0
  96. data/doc/rdoc/classes/RIO/Rio.src/M000078.html +16 -0
  97. data/doc/rdoc/classes/RIO/Rio.src/M000079.html +16 -0
  98. data/doc/rdoc/classes/RIO/Rio.src/M000080.html +16 -0
  99. data/doc/rdoc/classes/RIO/Rio.src/M000081.html +16 -0
  100. data/doc/rdoc/classes/RIO/Rio.src/M000082.html +16 -0
  101. data/doc/rdoc/classes/RIO/Rio.src/M000083.html +16 -0
  102. data/doc/rdoc/classes/RIO/Rio.src/M000084.html +16 -0
  103. data/doc/rdoc/classes/RIO/Rio.src/M000085.html +16 -0
  104. data/doc/rdoc/classes/RIO/Rio.src/M000086.html +16 -0
  105. data/doc/rdoc/classes/RIO/Rio.src/M000087.html +16 -0
  106. data/doc/rdoc/classes/RIO/Rio.src/M000088.html +16 -0
  107. data/doc/rdoc/classes/RIO/Rio.src/M000089.html +16 -0
  108. data/doc/rdoc/classes/RIO/Rio.src/M000090.html +16 -0
  109. data/doc/rdoc/classes/RIO/Rio.src/M000091.html +16 -0
  110. data/doc/rdoc/classes/RIO/Rio.src/M000092.html +16 -0
  111. data/doc/rdoc/classes/RIO/Rio.src/M000093.html +16 -0
  112. data/doc/rdoc/classes/RIO/Rio.src/M000094.html +16 -0
  113. data/doc/rdoc/classes/RIO/Rio.src/M000095.html +16 -0
  114. data/doc/rdoc/classes/RIO/Rio.src/M000096.html +16 -0
  115. data/doc/rdoc/classes/RIO/Rio.src/M000097.html +16 -0
  116. data/doc/rdoc/classes/RIO/Rio.src/M000098.html +16 -0
  117. data/doc/rdoc/classes/RIO/Rio.src/M000099.html +16 -0
  118. data/doc/rdoc/classes/RIO/Rio.src/M000100.html +16 -0
  119. data/doc/rdoc/classes/RIO/Rio.src/M000101.html +16 -0
  120. data/doc/rdoc/classes/RIO/Rio.src/M000102.html +16 -0
  121. data/doc/rdoc/classes/RIO/Rio.src/M000103.html +16 -0
  122. data/doc/rdoc/classes/RIO/Rio.src/M000104.html +16 -0
  123. data/doc/rdoc/classes/RIO/Rio.src/M000105.html +16 -0
  124. data/doc/rdoc/classes/RIO/Rio.src/M000106.html +16 -0
  125. data/doc/rdoc/classes/RIO/Rio.src/M000107.html +16 -0
  126. data/doc/rdoc/classes/RIO/Rio.src/M000108.html +16 -0
  127. data/doc/rdoc/classes/RIO/Rio.src/M000109.html +16 -0
  128. data/doc/rdoc/classes/RIO/Rio.src/M000110.html +16 -0
  129. data/doc/rdoc/classes/RIO/Rio.src/M000111.html +16 -0
  130. data/doc/rdoc/classes/RIO/Rio.src/M000112.html +16 -0
  131. data/doc/rdoc/classes/RIO/Rio.src/M000113.html +16 -0
  132. data/doc/rdoc/classes/RIO/Rio.src/M000114.html +16 -0
  133. data/doc/rdoc/classes/RIO/Rio.src/M000115.html +16 -0
  134. data/doc/rdoc/classes/RIO/Rio.src/M000116.html +16 -0
  135. data/doc/rdoc/classes/RIO/Rio.src/M000117.html +16 -0
  136. data/doc/rdoc/classes/RIO/Rio.src/M000118.html +16 -0
  137. data/doc/rdoc/classes/RIO/Rio.src/M000119.html +16 -0
  138. data/doc/rdoc/classes/RIO/Rio.src/M000120.html +16 -0
  139. data/doc/rdoc/classes/RIO/Rio.src/M000121.html +16 -0
  140. data/doc/rdoc/classes/RIO/Rio.src/M000122.html +16 -0
  141. data/doc/rdoc/classes/RIO/Rio.src/M000123.html +16 -0
  142. data/doc/rdoc/classes/RIO/Rio.src/M000124.html +16 -0
  143. data/doc/rdoc/classes/RIO/Rio.src/M000125.html +16 -0
  144. data/doc/rdoc/classes/RIO/Rio.src/M000126.html +16 -0
  145. data/doc/rdoc/classes/RIO/Rio.src/M000127.html +16 -0
  146. data/doc/rdoc/classes/RIO/Rio.src/M000128.html +16 -0
  147. data/doc/rdoc/classes/RIO/Rio.src/M000129.html +16 -0
  148. data/doc/rdoc/classes/RIO/Rio.src/M000130.html +16 -0
  149. data/doc/rdoc/classes/RIO/Rio.src/M000131.html +16 -0
  150. data/doc/rdoc/classes/RIO/Rio.src/M000132.html +16 -0
  151. data/doc/rdoc/classes/RIO/Rio.src/M000133.html +16 -0
  152. data/doc/rdoc/classes/RIO/Rio.src/M000134.html +16 -0
  153. data/doc/rdoc/classes/RIO/Rio.src/M000135.html +16 -0
  154. data/doc/rdoc/classes/RIO/Rio.src/M000136.html +16 -0
  155. data/doc/rdoc/classes/RIO/Rio.src/M000137.html +16 -0
  156. data/doc/rdoc/classes/RIO/Rio.src/M000138.html +16 -0
  157. data/doc/rdoc/classes/RIO/Rio.src/M000139.html +16 -0
  158. data/doc/rdoc/classes/RIO/Rio.src/M000140.html +16 -0
  159. data/doc/rdoc/classes/RIO/Rio.src/M000141.html +16 -0
  160. data/doc/rdoc/classes/RIO/Rio.src/M000142.html +16 -0
  161. data/doc/rdoc/classes/RIO/Rio.src/M000143.html +16 -0
  162. data/doc/rdoc/classes/RIO/Rio.src/M000144.html +16 -0
  163. data/doc/rdoc/classes/RIO/Rio.src/M000145.html +16 -0
  164. data/doc/rdoc/classes/RIO/Rio.src/M000146.html +16 -0
  165. data/doc/rdoc/classes/RIO/Rio.src/M000147.html +16 -0
  166. data/doc/rdoc/classes/RIO/Rio.src/M000148.html +16 -0
  167. data/doc/rdoc/classes/RIO/Rio.src/M000149.html +16 -0
  168. data/doc/rdoc/classes/RIO/Rio.src/M000150.html +16 -0
  169. data/doc/rdoc/classes/RIO/Rio.src/M000151.html +16 -0
  170. data/doc/rdoc/classes/RIO/Rio.src/M000152.html +16 -0
  171. data/doc/rdoc/classes/RIO/Rio.src/M000153.html +16 -0
  172. data/doc/rdoc/classes/RIO/Rio.src/M000154.html +16 -0
  173. data/doc/rdoc/classes/RIO/Rio.src/M000155.html +16 -0
  174. data/doc/rdoc/classes/RIO/Rio.src/M000156.html +16 -0
  175. data/doc/rdoc/classes/RIO/Rio.src/M000157.html +16 -0
  176. data/doc/rdoc/classes/RIO/Rio.src/M000158.html +16 -0
  177. data/doc/rdoc/classes/RIO/Rio.src/M000159.html +16 -0
  178. data/doc/rdoc/classes/RIO/Rio.src/M000160.html +16 -0
  179. data/doc/rdoc/classes/RIO/Rio.src/M000161.html +16 -0
  180. data/doc/rdoc/classes/RIO/Rio.src/M000162.html +16 -0
  181. data/doc/rdoc/classes/RIO/Rio.src/M000163.html +16 -0
  182. data/doc/rdoc/classes/RIO/Rio.src/M000164.html +16 -0
  183. data/doc/rdoc/classes/RIO/Rio.src/M000165.html +16 -0
  184. data/doc/rdoc/classes/RIO/Rio.src/M000166.html +16 -0
  185. data/doc/rdoc/classes/RIO/Rio.src/M000167.html +16 -0
  186. data/doc/rdoc/classes/RIO/Rio.src/M000168.html +16 -0
  187. data/doc/rdoc/classes/RIO/Rio.src/M000169.html +16 -0
  188. data/doc/rdoc/classes/RIO/Rio.src/M000170.html +16 -0
  189. data/doc/rdoc/classes/RIO/Rio.src/M000171.html +16 -0
  190. data/doc/rdoc/classes/RIO/Rio.src/M000172.html +16 -0
  191. data/doc/rdoc/classes/RIO/Rio.src/M000173.html +16 -0
  192. data/doc/rdoc/classes/RIO/Rio.src/M000174.html +16 -0
  193. data/doc/rdoc/classes/RIO/Rio.src/M000175.html +16 -0
  194. data/doc/rdoc/classes/RIO/Rio.src/M000176.html +16 -0
  195. data/doc/rdoc/classes/RIO/Rio.src/M000177.html +16 -0
  196. data/doc/rdoc/classes/RIO/Rio.src/M000178.html +16 -0
  197. data/doc/rdoc/classes/RIO/Rio.src/M000179.html +16 -0
  198. data/doc/rdoc/classes/RIO/Rio.src/M000180.html +16 -0
  199. data/doc/rdoc/classes/RIO/Rio.src/M000181.html +16 -0
  200. data/doc/rdoc/classes/RIO/Rio.src/M000182.html +16 -0
  201. data/doc/rdoc/created.rid +1 -0
  202. data/doc/rdoc/files/README.html +215 -0
  203. data/doc/rdoc/files/lib/rio/constructor_rb.html +142 -0
  204. data/doc/rdoc/files/lib/rio/doc/HOWTO_rb.html +135 -0
  205. data/doc/rdoc/files/lib/rio/doc/INTRO_rb.html +135 -0
  206. data/doc/rdoc/files/lib/rio/doc/MISC_rb.html +135 -0
  207. data/doc/rdoc/files/lib/rio/doc/SYNOPSIS_rb.html +135 -0
  208. data/doc/rdoc/files/lib/rio/if/basic_rb.html +135 -0
  209. data/doc/rdoc/files/lib/rio/if/dir_rb.html +135 -0
  210. data/doc/rdoc/files/lib/rio/if/file_rb.html +135 -0
  211. data/doc/rdoc/files/lib/rio/if/fileordir_rb.html +135 -0
  212. data/doc/rdoc/files/lib/rio/if/grande_rb.html +135 -0
  213. data/doc/rdoc/files/lib/rio/if/internal_rb.html +135 -0
  214. data/doc/rdoc/files/lib/rio/if/methods_rb.html +135 -0
  215. data/doc/rdoc/files/lib/rio/if/path_rb.html +135 -0
  216. data/doc/rdoc/files/lib/rio/if/stream_rb.html +135 -0
  217. data/doc/rdoc/files/lib/rio/if/test_rb.html +135 -0
  218. data/doc/rdoc/files/lib/rio/kernel_rb.html +142 -0
  219. data/doc/rdoc/files/lib/rio_rb.html +153 -0
  220. data/doc/rdoc/fr_class_index.html +34 -0
  221. data/doc/rdoc/fr_file_index.html +44 -0
  222. data/doc/rdoc/fr_method_index.html +210 -0
  223. data/doc/rdoc/index.html +24 -0
  224. data/doc/rdoc/rdoc-style.css +384 -0
  225. data/doc/rfc1738.txt +1403 -0
  226. data/doc/rfc959.txt +3933 -0
  227. data/ex/colx.rb +6 -0
  228. data/ex/findinruby +19 -0
  229. data/ex/findruby +11 -0
  230. data/ex/prompt.rb +25 -0
  231. data/ex/rgb.txt.gz +0 -0
  232. data/ex/riocat +35 -0
  233. data/ex/riogunzip +31 -0
  234. data/ex/riogzip +24 -0
  235. data/ex/tolf +11 -0
  236. data/lib/rio.rb +163 -0
  237. data/lib/rio/abstract_method.rb +57 -0
  238. data/lib/rio/argv.rb +57 -0
  239. data/lib/rio/arrayio.rb +199 -0
  240. data/lib/rio/arycopy.rb +44 -0
  241. data/lib/rio/assert.rb +115 -0
  242. data/lib/rio/base.rb +59 -0
  243. data/lib/rio/constructor.rb +183 -0
  244. data/lib/rio/context.rb +117 -0
  245. data/lib/rio/context/chomp.rb +53 -0
  246. data/lib/rio/context/closeoneof.rb +50 -0
  247. data/lib/rio/context/cxx.rb +67 -0
  248. data/lib/rio/context/dir.rb +92 -0
  249. data/lib/rio/context/gzip.rb +51 -0
  250. data/lib/rio/context/methods.rb +196 -0
  251. data/lib/rio/context/stream.rb +170 -0
  252. data/lib/rio/cp.rb +305 -0
  253. data/lib/rio/cxdir.rb +79 -0
  254. data/lib/rio/dir.rb +145 -0
  255. data/lib/rio/doc.rb +45 -0
  256. data/lib/rio/doc/HOWTO.rb +691 -0
  257. data/lib/rio/doc/INTRO.rb +579 -0
  258. data/lib/rio/doc/MISC.rb +257 -0
  259. data/lib/rio/doc/SYNOPSIS.rb +170 -0
  260. data/lib/rio/entrysel.rb +162 -0
  261. data/lib/rio/exception.rb +42 -0
  262. data/lib/rio/exception/copy.rb +98 -0
  263. data/lib/rio/exception/open.rb +62 -0
  264. data/lib/rio/exception/state.rb +74 -0
  265. data/lib/rio/ext.rb +62 -0
  266. data/lib/rio/ext/csv.rb +261 -0
  267. data/lib/rio/factory.rb +236 -0
  268. data/lib/rio/file.rb +77 -0
  269. data/lib/rio/filter/chomp.rb +61 -0
  270. data/lib/rio/filter/closeoneof.rb +103 -0
  271. data/lib/rio/filter/gzip.rb +58 -0
  272. data/lib/rio/ftp.rb +275 -0
  273. data/lib/rio/ftp/conn.rb +167 -0
  274. data/lib/rio/ftp/ioh.rb +88 -0
  275. data/lib/rio/grande.rb +126 -0
  276. data/lib/rio/handle.rb +101 -0
  277. data/lib/rio/if.rb +53 -0
  278. data/lib/rio/if/basic.rb +64 -0
  279. data/lib/rio/if/dir.rb +362 -0
  280. data/lib/rio/if/file.rb +57 -0
  281. data/lib/rio/if/fileordir.rb +247 -0
  282. data/lib/rio/if/grande.rb +510 -0
  283. data/lib/rio/if/internal.rb +53 -0
  284. data/lib/rio/if/methods.rb +612 -0
  285. data/lib/rio/if/path.rb +413 -0
  286. data/lib/rio/if/stream.rb +599 -0
  287. data/lib/rio/if/test.rb +219 -0
  288. data/lib/rio/impl/path.rb +82 -0
  289. data/lib/rio/ioh.rb +137 -0
  290. data/lib/rio/iomode.rb +96 -0
  291. data/lib/rio/kernel.rb +47 -0
  292. data/lib/rio/local.rb +63 -0
  293. data/lib/rio/match.rb +51 -0
  294. data/lib/rio/matchrecord.rb +254 -0
  295. data/lib/rio/open3.rb +69 -0
  296. data/lib/rio/ops/create.rb +78 -0
  297. data/lib/rio/ops/dir.rb +302 -0
  298. data/lib/rio/ops/either.rb +117 -0
  299. data/lib/rio/ops/file.rb +94 -0
  300. data/lib/rio/ops/path.rb +292 -0
  301. data/lib/rio/ops/stream.rb +84 -0
  302. data/lib/rio/ops/stream/input.rb +237 -0
  303. data/lib/rio/ops/stream/output.rb +96 -0
  304. data/lib/rio/ops/stream/read.rb +84 -0
  305. data/lib/rio/ops/stream/write.rb +58 -0
  306. data/lib/rio/ops/symlink.rb +70 -0
  307. data/lib/rio/path.rb +117 -0
  308. data/lib/rio/path/reset.rb +70 -0
  309. data/lib/rio/record.rb +59 -0
  310. data/lib/rio/rectype.rb +86 -0
  311. data/lib/rio/rl/base.rb +147 -0
  312. data/lib/rio/rl/builder.rb +166 -0
  313. data/lib/rio/rl/ioi.rb +66 -0
  314. data/lib/rio/rl/path.rb +141 -0
  315. data/lib/rio/rl/uri.rb +118 -0
  316. data/lib/rio/scheme/aryio.rb +89 -0
  317. data/lib/rio/scheme/cmdio.rb +74 -0
  318. data/lib/rio/scheme/fd.rb +65 -0
  319. data/lib/rio/scheme/ftp.rb +73 -0
  320. data/lib/rio/scheme/http.rb +81 -0
  321. data/lib/rio/scheme/path.rb +100 -0
  322. data/lib/rio/scheme/stderr.rb +56 -0
  323. data/lib/rio/scheme/stdio.rb +71 -0
  324. data/lib/rio/scheme/strio.rb +82 -0
  325. data/lib/rio/scheme/sysio.rb +61 -0
  326. data/lib/rio/scheme/tcp.rb +74 -0
  327. data/lib/rio/scheme/tempfile.rb +104 -0
  328. data/lib/rio/state.rb +209 -0
  329. data/lib/rio/state/error.rb +73 -0
  330. data/lib/rio/stream.rb +181 -0
  331. data/lib/rio/stream/base.rb +50 -0
  332. data/lib/rio/stream/duplex.rb +76 -0
  333. data/lib/rio/stream/open.rb +203 -0
  334. data/lib/rio/symantics.rb +46 -0
  335. data/lib/rio/to_rio.rb +57 -0
  336. data/lib/rio/uri/file.rb +145 -0
  337. data/lib/rio/version.rb +52 -0
  338. data/setup.rb +1331 -0
  339. data/test/1.rb +14 -0
  340. data/test/mswin32.rb +28 -0
  341. data/test/once.rb +7 -0
  342. data/test/runtests.rb +12 -0
  343. data/test/runtests_gem.rb +15 -0
  344. data/test/tc/abs.rb +349 -0
  345. data/test/tc/all.rb +42 -0
  346. data/test/tc/cd1.rb +116 -0
  347. data/test/tc/clearsel.rb +69 -0
  348. data/test/tc/closeoncopy.rb +91 -0
  349. data/test/tc/closeoneof.rb +194 -0
  350. data/test/tc/copy-from.rb +183 -0
  351. data/test/tc/copy-to.rb +94 -0
  352. data/test/tc/copy.rb +72 -0
  353. data/test/tc/copyarray.rb +191 -0
  354. data/test/tc/copydest.rb +50 -0
  355. data/test/tc/copydir.rb +192 -0
  356. data/test/tc/copydirlines.rb +124 -0
  357. data/test/tc/copylines.rb +40 -0
  358. data/test/tc/copynonex.rb +121 -0
  359. data/test/tc/create.rb +104 -0
  360. data/test/tc/csv.rb +229 -0
  361. data/test/tc/dir.rb +79 -0
  362. data/test/tc/dirautoclose.rb +70 -0
  363. data/test/tc/dirent.rb +180 -0
  364. data/test/tc/dirss.rb +84 -0
  365. data/test/tc/each.rb +111 -0
  366. data/test/tc/each_break.rb +241 -0
  367. data/test/tc/edf.rb +82 -0
  368. data/test/tc/entary.rb +230 -0
  369. data/test/tc/eq.rb +101 -0
  370. data/test/tc/expand_path.rb +94 -0
  371. data/test/tc/ext.rb +115 -0
  372. data/test/tc/fileno.rb +95 -0
  373. data/test/tc/getrec.rb +140 -0
  374. data/test/tc/lineno.rb +197 -0
  375. data/test/tc/lines.rb +66 -0
  376. data/test/tc/methods.rb +185 -0
  377. data/test/tc/misc.rb +473 -0
  378. data/test/tc/nolines.rb +205 -0
  379. data/test/tc/noqae.rb +873 -0
  380. data/test/tc/once.rb +6 -0
  381. data/test/tc/overload.rb +137 -0
  382. data/test/tc/pa.rb +159 -0
  383. data/test/tc/pathop.rb +63 -0
  384. data/test/tc/paths.rb +147 -0
  385. data/test/tc/qae.rb +494 -0
  386. data/test/tc/qae_riovar.rb +500 -0
  387. data/test/tc/records.rb +69 -0
  388. data/test/tc/rename.rb +224 -0
  389. data/test/tc/rename_assign.rb +48 -0
  390. data/test/tc/sub.rb +49 -0
  391. data/test/tc/symlink.rb +177 -0
  392. data/test/tc/symlink0.rb +298 -0
  393. data/test/tc/symlink1.rb +115 -0
  394. data/test/tc/testcase.rb +152 -0
  395. metadata +461 -0
@@ -0,0 +1,579 @@
1
+ #--
2
+ # ===============================================================================
3
+ # Copyright (c) 2005, 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
+ # rake rdoc
26
+ # from the distribution directory. Then point your browser at the 'doc/rdoc' directory.
27
+ #
28
+ # Suggested Reading
29
+ # * RIO::Doc::SYNOPSIS
30
+ # * RIO::Doc::INTRO
31
+ # * RIO::Doc::HOWTO
32
+ # * RIO::Rio
33
+ #
34
+ # <b>Rio is pre-alpha software.
35
+ # The documented interface and behavior is subject to change without notice.</b>
36
+
37
+
38
+ module RIO
39
+ module Doc
40
+ =begin rdoc
41
+
42
+ = Rio - Ruby I/O Comfort Class
43
+
44
+ Rio is a convenience class wrapping much of the functionality of
45
+ IO, File, Dir, Pathname, FileUtils,
46
+ Tempfile, StringIO, and OpenURI and uses Zlib, and CSV
47
+ to extend that functionality using a simple consistent interface.
48
+ Most of the instance methods of IO, File and Dir are simply forwarded to the appropriate handle
49
+ to provide identical functionality. Rio also provides a "grande" interface that
50
+ allows many application level IO tasks to be accomplished in line or two of code.
51
+
52
+ Rio functionality can be broadly broken into three categories
53
+ * path manipulation
54
+ * file system access
55
+ * stream manipulation
56
+
57
+ Which methods are available to a given Rio, depends on the underlying object.
58
+
59
+ A Rio generally does not need to be opened or have its mode specified.
60
+ Most of Rio's methods simply configure it.
61
+ When an actual IO operation is specified, Rio determines how to open it based
62
+ on the object it is opening, the operation it is performing, and the options specified.
63
+
64
+ Rio configuration methods return the Rio for easy chaining and regard the presence of a block
65
+ as an implied +each+.
66
+
67
+ == Using a Rio
68
+
69
+ Using a Rio can be described as having 3 steps:
70
+ * Creating a Rio (using the constructor or as the result of one of path manipulation methods)
71
+ * Configuring a Rio
72
+ * Rio I/O
73
+
74
+ === Creating a Rio
75
+
76
+ Rio extends Kernel with one function +rio+, its constructor. This function is overloaded to
77
+ create any type of Rio. +rio+ looks at the class and sometimes the value of its first argument
78
+ to create an internal representation of the resource specified, additional arguments are used
79
+ as needed by the resource type. The rio constructor does not initiate any io, it does not check
80
+ for a resources existance or type. It neither knows nor cares what can be done with this Rio.
81
+ Using methods like +respond_to?+ are meaningless at best and usually misleading.
82
+
83
+ For purposes of discussion, we divide Rios into two catagories, those that have a path
84
+ and those that don't.
85
+
86
+ ==== Creating a Rio that has a path
87
+
88
+ To create a Rio that has a path the arguments to +rio+ may be:
89
+
90
+ * a string representing the entire path. The separator used for Rios is as specified in RFC1738 ('/').
91
+ rio('adir/afile')
92
+ * a string representing a fully qualified +file+ URI as per RFC1738
93
+ rio('file:///atopleveldir/adir/afile')
94
+ * a +URI+ object representing a +file+ or generic +URI+
95
+ rio(URI('adir/afile'))
96
+ * the components of a path as separate arguments
97
+ rio('adir','afile')
98
+ * the components of a path as an array
99
+ rio(%w/adir afile/)
100
+ * another Rio
101
+ another_rio = rio('adir/afile')
102
+ rio(another_rio)
103
+ * any object whose +to_s+ method returns one of the above
104
+ rio(Pathname.new('apath'))
105
+ * any combination of the above either as separate arguments or as elements of an array,
106
+ another_rio = rio('dir1/dir2')
107
+ auri = URI('dir4/dir5)
108
+ rio(another_rio,'dir3',auri,'dir6/dir7')
109
+
110
+ ===== Creating a Rio that refers to a web page
111
+
112
+ To create a Rio that refers to a web page the arguments to +rio+ may be:
113
+
114
+ * a string representing a fully qualified +http+ URI
115
+ rio('http://ruby-doc.org/index.html')
116
+ * a +URI+ object representing a +http+ +URI+
117
+ rio(URI('http://ruby-doc.org/index.html'))
118
+ * either of the above with additional path elements
119
+ rio('http://www.ruby-doc.org/','core','classes/Object.html')
120
+
121
+ ===== Creating a Rio that refers to a file or directory on a FTP server
122
+
123
+ To create a Rio that refers to a file on a FTP server the arguments to +rio+ may be:
124
+
125
+ * a string representing a fully qualified +ftp+ URI
126
+ rio('ftp://user:password@ftp.example.com/afile.tar.gz')
127
+ * a +URI+ object representing a +ftp+ +URI+
128
+ rio(URI('ftp://ftp.example.com/afile.tar.gz'))
129
+ * either of the above with additional path elements
130
+ rio('ftp://ftp.gnu.org/pub/gnu','emacs','windows','README')
131
+
132
+ ==== Creating Rios that do not have a path
133
+
134
+ To create a Rio without a path, the first argument to +rio+ is usually a single
135
+ character.
136
+
137
+ ===== Creating a Rio that refers to a clone of your programs stdin or stdout.
138
+
139
+ <tt>rio(?-)</tt> (mnemonic: '-' is used by some Unix programs to specify stdin or stdout in place of a file)
140
+
141
+ Just as a Rio that refers to a file, does not know whether that file will be opened for reading or
142
+ writing until an io operation is specified, a +stdio:+ Rio does not know whether it will connect
143
+ to stdin or stdout until an io operation is specified.
144
+
145
+ ===== Creating a Rio that refers to a clone of your programs stderr.
146
+
147
+ <tt>rio(?=)</tt> (mnemonic: '-' refers to fileno 1, so '=' refers to fileno 2)
148
+
149
+ ===== Creating a Rio that refers to an arbitrary IO object.
150
+
151
+ an_io = ::File.new('afile')
152
+ rio(an_io)
153
+
154
+ ===== Creating a Rio that refers to a file descriptor
155
+
156
+ <tt>rio(?#,fd)</tt> (mnemonic: a file descriptor is a number '#' )
157
+
158
+ an_io = ::File.new('afile')
159
+ rio(an_io)
160
+
161
+ ===== Creating a Rio that refers to a StringIO object
162
+
163
+ <tt>rio(?")</tt> (mnemonic: '"' surrounds strings)
164
+ * create a Rio that refers to its own string
165
+ rio(?")
166
+ * create a Rio that refers to a string of your choosing
167
+ astring = ""
168
+ rio(?","")
169
+
170
+ ===== Creating a Rio that refers to a Tempfile object
171
+
172
+ <tt>rio(??)</tt> (mnemonic: '?' you don't know its name)
173
+ rio(??)
174
+ rio(??,basename='rio',tmpdir=Dir::tmpdir)
175
+
176
+ ===== Creating a Rio that refers to an arbitrary TCPSocket
177
+
178
+ rio('tcp:',hostname,port)
179
+ or
180
+ rio('tcp://hostname:port')
181
+
182
+ ===== Creating a Rio that runs an external program and connects to its stdin and stdout
183
+
184
+ <tt>rio(?-,cmd)</tt> (mnemonic: '-' is used by some Unix programs to specify stdin or stdout in place of a file)
185
+
186
+ or
187
+
188
+ <tt>rio(?`,cmd)</tt> (mnemonic: '`' (backtick) runs an external program in ruby)
189
+
190
+ This is Rio's interface to IO#popen
191
+
192
+ === Path Manipulation
193
+
194
+ Rio's path manipulation methods are for the most part simply forwarded to the File or URI classes with
195
+ the return values converted to a Rio.
196
+
197
+ ==== Creating a Rio from a Rio's component parts.
198
+
199
+ The Rio methods for creating a Rio from a Rio's component parts are Rio#dirname,
200
+ Rio#filename, Rio#basename,
201
+ and Rio#extname.
202
+ The behavior of Rio#basename depends on the setting of the +ext+ configuration variable
203
+ and is different from its counterpart in the File class. The default value of the +ext+ configuration variable
204
+ is the string returned File#extname. The +ext+ configuration variable can be changed using Rio#ext and Rio#noext
205
+ and can be queried using Rio#ext?. This value is used by calls to Rio#basename.
206
+
207
+ Rio#filename returns the last component of a path, and is basically the same as +basename+ without consideration
208
+ of an extension. So
209
+
210
+ rio('afile.txt').basename #=> rio('afile')
211
+ rio('afile.txt').filename #=> rio('afile.txt')
212
+
213
+ ario = rio('afile.tar.gz')
214
+ ario.basename #=> rio('afile.tar')
215
+ ario.ext? #=> ".gz"
216
+ ario.ext('.tar.gz').basename #=> rio('afile')
217
+ ario.ext? #=> ".tar.gz"
218
+
219
+ ==== Changing a path's component parts.
220
+
221
+ Rio also provides methods for changing the component parts of its path.
222
+ They are Rio#dirname=, Rio#filename=, Rio#basename=, and Rio#extname=. These
223
+ methods replace the part extracted as described above with their argument.
224
+
225
+ ario = rio('dirA/dirB/afile.rb')
226
+ ario.dirname = 'dirC' # rio('dirC/afile.rb')
227
+ ario.basename = 'bfile' # rio('dirC/bfile.rb')
228
+ ario.extname = '.txt' # rio('dirC/bfile.txt')
229
+ ario.filename = 'cfile.rb' # rio('dirC/cfile.rb')
230
+
231
+ Rio also has a +rename+ mode which causes each of these to rename the actual file system
232
+ object as well as changing the Rio. This is discussed in the section on
233
+ Renaming and Moving.
234
+
235
+
236
+ ==== Splitting a Rio
237
+
238
+ Rio#split returns an array of Rios, one for each path element. (Note that this behavior differs
239
+ from File#split.)
240
+
241
+ rio('a/b/c').split #=> [rio('a'),rio('b'),rio('c')]
242
+
243
+ The array returned is extended with a +to_rio+ method, which will put the parts back together again.
244
+
245
+ ary = rio('a/b/c').split #=> [rio('a'),rio('b'),rio('c')]
246
+ ary.to_rio #=> rio('a/b/c')
247
+
248
+ ==== Creating a Rio by specifying the individual parts of its path
249
+
250
+ The first way to create a Rio by specifying its parts is to use the Rio constructor Rio#rio. Since
251
+ a Rio is among the arguments the constructor will take, the constructor can be used.
252
+ ario = rio('adir')
253
+ rio(ario,'b') #=> rio('adir/b')
254
+
255
+ Rio#join and Rio#/ do the same thing, but the operator version <tt>/</tt> can take only one argument.
256
+
257
+ a = rio('a')
258
+ b = rio('b')
259
+ c = a.join(b) #=> rio('a/b')
260
+ c = a/b #=> rio('a/b')
261
+
262
+ The arguments to +join+ and <tt>/</tt> do not need to be Rios, of course
263
+ ario = rio('adir')
264
+ ario/'afile.rb' #=> rio('ario/afile.rb')
265
+ ario.join('b','c','d') #=> rio('ario/b/c/d')
266
+ ario/'b'/'c'/'d' #=> rio('ario/b/c/d')
267
+ ario /= 'e' #=> rio('ario/b/c/d/e')
268
+
269
+ ==== Manipulating a Rio path by treating it as a string.
270
+
271
+ The Rio methods which treat a Rio as a string are Rio#sub, Rio#gsub and Rio#+.
272
+ These methods create a new Rio using the string created by forwarding the method
273
+ to the String returned by Rio#to_s.
274
+
275
+ ario = rio('dirA/dirB/afile') + '-1.1.1' # rio('dirA/dirB/afile-1.1.1')
276
+ brio = ario.sub(/^dirA/, 'dirC') # rio('dirC/dirB/afile-1.1.1')
277
+
278
+
279
+ ==== Creating a Rio based on its relationship to another
280
+
281
+ Rio#abs creates a new rio whose path is the absolute path of a Rio.
282
+ If provided with an argument, it uses that as the base path, otherwise
283
+ it uses an internal base path (usually the current working directory when
284
+ it was created).
285
+
286
+ rio('/tmp').chdir do
287
+ rio('a').abs #=> rio('/tmp/a')
288
+ rio('a').abs('/usr') #=> rio('/usr/a')
289
+ end
290
+
291
+ Rio#rel creates a new rio with a path relative to a Rio.
292
+
293
+ rio('/tmp').chdir do
294
+ rio('/tmp/a').rel #=> rio('a')
295
+ end
296
+ rio('/tmp/b').rel('/tmp') #=> rio('b')
297
+
298
+ Rio#route_to and Rio#route_from creates a new rio with a path representing
299
+ the route to get to/from a Rio. They are based on the methods of the
300
+ same names in the URI class
301
+
302
+ === Configuring a Rio
303
+
304
+ The second step in using a rio is configuring it. Note that many times no configuration is necessary
305
+ and that this is not a comprehensive list of all of Rio's configuration methods.
306
+
307
+ Rio's configuration mehods fall into three categories.
308
+
309
+ [IO manipulators]
310
+ An IO manipulator alters the behavior of a Rio's underlying IO object. These affect the behaviour
311
+ of I/O methods which are forwarded directly to the underlying object as well as the grande I/O methods.
312
+
313
+ [Grande configuration methods]
314
+ The grande configuration methods affect the behaviour of Rio's grande I/O methods
315
+
316
+ [Grande selection methods]
317
+ The grande selection methods select what data is returned by Rio's grande I/O methods
318
+
319
+ All of Rio's configuration and selection methods can be passed a block, which will cause the Rio to behave as if
320
+ +each+ had been called with the block after the method.
321
+
322
+ ==== IO manipulators
323
+
324
+ * +gzip+ a file on output, and ungzip it on input
325
+ rio('afile.gz').gzip
326
+ This causes the rio to read through a Zlib::GzipReader and to write Zlib::GzipWriter.
327
+
328
+ * +chomp+ lines as they are read
329
+ rio('afile').chomp
330
+ This causes a Rio to call String#chomp on the the String returned by all line oriented read operations.
331
+
332
+ ==== Grande configuration methods
333
+
334
+ * +all+, +recurse+, +norecurse+
335
+ rio('adir').all
336
+ rio('adir').norecurse('CVS')
337
+ These methods instruct the Rio to also include entries in subdirectories when iterating through directories
338
+ and control which subdirectories are included or excluded.
339
+
340
+ * +bytes+
341
+ rio('afile').bytes(1024)
342
+ This causes a Rio to read the specified number of bytes at a time as a file is iterated through.
343
+
344
+ ==== Grande selection methods
345
+
346
+ * +lines+, +nolines+
347
+ rio('afile').lines(0..9)
348
+ rio('afile').nolines(/^\s*#/)
349
+ Strictly speaking these are both configuration and selection methods. They configure the Rio to
350
+ iterate through an input stream as lines. The arguments select which lines are actually returned.
351
+ Lines are included (+lines+) or excluded (+nolines+) if they match *any* of the arguments as follows.
352
+
353
+ If the argument is a:
354
+ +RegExp+:: the line is matched against it
355
+ +Range+:: the lineno is matched against it
356
+ +Integer+:: the lineno is matched against it as if it were a one element range
357
+ +Symbol+:: the symbol is +sent+ to the string; the line is included unless it returns false
358
+ +Proc+:: the proc is called with the line as an argument; the line is included unless it returns false
359
+
360
+ * +entries+, +files+, +dirs+, +noentries+, +nofiles+, +nodirs+
361
+
362
+ rio('adir').files('*.txt')
363
+ rio('adir').nofiles(/^\./)
364
+
365
+ These methods select which entries will be returned when iterating throug directories.
366
+ Entries are included (+entries+,+files+,+dirs+) or excluded(+noentries+,+nofiles+,+nodirs+) if they
367
+ match *any* of the arguments as follows.
368
+
369
+ If the argument is a:
370
+ +String+:: the arg is treated as a glob; the filname is matched against it
371
+ +RegExp+:: the filname is matched against it
372
+ +Symbol+:: the symbol is +sent+ to the entry (a Rio); the entry is included unless it returns false
373
+ +Proc+:: the proc is called with the entry (a Rio) as an argument; the entry is included unless it returns false
374
+
375
+ * +records+, +rows+, +norecords+, +norows+
376
+ rio('afile').bytes(1024).records(0...10)
377
+ These select items from an input stream just as +lines+, but without specifying lines as the input
378
+ record type. They can be used to select different record types in extension modules. The only
379
+ such module at this writing is the CSV extension. In that case +records+ causes each line of
380
+ a CSV file to be parsed into an array while +lines+ causes each line of the file to be returned normally.
381
+
382
+ === Rio I/O
383
+
384
+ As stated above the the three steps to using a Rio are:
385
+ * Creating a Rio
386
+ * Configuring a Rio
387
+ * Doing I/O
388
+
389
+ This section describes that final step.
390
+
391
+ After creating and configuring a Rio, the file-system has not been accessed, no socket has been opened,
392
+ not so much as a test for a files existance has been done. When an I/O method is called on a Rio, the
393
+ sequence of events required to complete that operation on the underlying object takes place. Rio takes
394
+ care of creating the apropriate object (eg IO,Dir), opening the object with the apropriate mode,
395
+ performing the operation, closing the object if required, and returning the results of the operation.
396
+
397
+ Rio's I/O operations can be divide into two catagories:
398
+ * Proxy operations
399
+ * Grande operations
400
+
401
+ ==== Proxy operations
402
+
403
+ These are calls which are forwarded to the underlying object (eg IO,Dir,Net::FTP), after apropriately
404
+ creating and configuring that object. The result produced by the method is returned, and
405
+ the object is closed.
406
+
407
+ In some cases the result is modified before being returned, as when a Rio is configured with +chomp+.
408
+
409
+ In all cases, if the result returned by the underlying object, could itself be used for further I/O
410
+ operations it is returned as a Rio. For example: where File#dirname returns a string, Rio#dirname
411
+ returns a Rio; where Dir#read returns a string representing a directory entry, Rio#read
412
+ returns a Rio.
413
+
414
+ With some noteable exceptions, most of the operations available if one were using the underlying
415
+ Ruby I/O class are available to the Rio and will behave identically.
416
+
417
+ For things that exist on a file system:
418
+ * All the methods in FileTest are available as Rio instance methods. For example
419
+ FileTest.file?('afile')
420
+ becomes
421
+ rio('afile').file?
422
+ * All the instance methods of +File+ except +path+ are available to a rio without change
423
+ * Most of the class methods of +File+ are available.
424
+ * For those that take a filename as their only argument the calls are mapped to
425
+ Rio instance methods as described above for FileTest.
426
+ * +dirname+, and +readlink+ return Rios instead of strings
427
+ * Rio has its own Rio#basename, Rio#join and Rio#symlink, which provide similar functionality.
428
+ * The class methods which take multiple filenames (+chmod+,+chown+,+lchmod+,+lchown+) are available
429
+ as Rio instance methods. For example
430
+ File.chmod(0666,'afile')
431
+ becomes
432
+ rio('afile').chmod(06660)
433
+
434
+ For I/O Streams
435
+
436
+ Most of the instance methods of IO are available, and most do the same thing, with some interface changes.
437
+ <b>The big exception to this is the '<<' operator.</b> This is one of Rio's grande operators. While the symantics
438
+ one would use to write to an IO object would actually accomplish the same thing with a Rio, It is a
439
+ very different operator. Read the section on grande operators. The other differences between IO
440
+ instance methods and the Rio equivelence can be summarized as follows.
441
+ * The simple instance methods (eg +fcntl+, <tt>eof?</tt>, <tt>tty?</tt> etc.)
442
+ are forwarded and the result returned as is
443
+ * Anywhere IO returns an IO, Rio returns a Rio
444
+ * +close+ and its cousins return the Rio.
445
+ * +each_byte+ and +each_line+ are forwarded as is.
446
+ * All methods which read (read*,get*,each*) will cause the file to closed when the end of file is reached.
447
+ This behavior is configurable, but the default is to close on eof
448
+ * The methods which write (put*,print*) are forwarded as is; put* and print* return the Rio; write returns
449
+ the value returned by IO#write; as mentioned above '<<' is a grande operator in Rio.
450
+
451
+ For directories:
452
+
453
+ * all the instance methods of Dir are available except +each+ which is a grande method.
454
+ * the class methods +mkdir+, +delete+, +rmdir+ are provided as instance methods.
455
+ * +chdir+ is provided as an instance method. Rio#chdir returns a Rio and passes a Rio to a block if one is provided.
456
+ * +glob+ is provided as an instance method, but returns an array of Rios
457
+ * +foreach+ is not supported
458
+ * +each+ and <tt>[]</tt> have similar functionality provided by Rio
459
+
460
+
461
+ For other Rios, instance methods are generally forwarded where appropriate. For example
462
+
463
+ * Rios that refer to StringIO objects forward 'string' and 'string='
464
+ * Rios that refer to http URIs support all the Meta methods provided by open-uri
465
+
466
+
467
+ ==== Grande operators
468
+
469
+ The primary grande operator is Rio#each. +each+ is used to iterate through Rios. When applied
470
+ to a file it iterates through records in the file. When applied to a directory it iterates through
471
+ the entries in the directory. Its behavior is modified by configuring the Rio prior to calling it using
472
+ the configuration methods discussed above. Since iterating through things is ubiquitous in ruby, it is implied
473
+ by the presence of a block after any of the grande configuration methods and many times does not need to be
474
+ call explicitly. For example:
475
+
476
+ rio('afile.rb').chomp.lines(/^\s*#/) { |line| ... } # iterate through chomped ruby comment lines
477
+ rio('adir').all.files('*.rb') { |f| ... } # iterate through all .rb files in 'adir' and its subdirectories
478
+
479
+ Because a Rio is an Enumerable, it supports +to_a+, which is the basis for the grande subscript operator.
480
+ Rio#[] with no arguments simply calls to_a. With arguments it behaves as if those arguments had been
481
+ passed to the most recently called of the grande selection methods listed above, and then calls to_a. For example
482
+ to get the first ten lines of a file into an array with lines chomped
483
+ rio('afile').chomp.lines(0...10).to_a
484
+ can be written as
485
+ rio('afile.gz').chomp.lines[0...10]
486
+ or, to create an array of all the .c files in a directory, one could write
487
+ rio('adir').files['*.c']
488
+
489
+ The other grande operators are its copy operators. They are:
490
+ * <tt><</tt> (copy-from)
491
+ * <tt><<</tt> (append-from)
492
+ * <tt>></tt> (copy-to)
493
+ * <tt>>></tt> (append-to)
494
+ The only difference between the 'copy' and 'append' versions is how they deal with an unopened resource.
495
+ In the former the open it with mode 'w' and in the latter, mode 'a'.
496
+ Beyond that, their behavior can be summarized as:
497
+ source.each do |entry|
498
+ destination << entry
499
+ end
500
+ Since they are based on the +each+ operator, all of the selection and configuration options are available.
501
+ And the right-hand-side argument of the operators are not restricted to Rios -- Strings and Arrays are also supported.
502
+
503
+ For example:
504
+ rio('afile') > astring # copy a file into a string
505
+
506
+ rio('afile').chomp > anarray # copy the chomped lines of afile into an array
507
+
508
+ rio('afile.gz').gzip.lines(0...100) > rio('bfile') # copy 100 lines from a gzipped file into another file
509
+
510
+ rio(?-) < rio('http://rubydoc.org/') # copy a web page to stdout
511
+
512
+ rio('bdir') < rio('adir') # copy an entire directory structure
513
+
514
+ rio('adir').dirs.files('README') > rio('bdir') # same thing, but only README files
515
+
516
+ rio(?-,'ps -a').nolines(0,/ps$/) > anarray # copy the output of th ps command into an array, skippying
517
+ # the header line and the ps command entry
518
+
519
+ === Renaming and Moving
520
+
521
+ Rio provides two methods for directly renaming objects on the filesystem:
522
+ Rio#rename and Rio#rename!. Both of these use File#rename. The difference
523
+ between them is the returned Rio. Rio#rename leaves the path of the Rio unchanged,
524
+ while Rio#rename! changes the path of the Rio to refer to the renamed path.
525
+ ario = rio('a')
526
+ ario.rename('b') # file 'a' has been renamed to 'b' but 'ario' => rio('a')
527
+ ario.rename!('b') # file 'a' has been renamed to 'b' and 'ario' => rio('b')
528
+
529
+ Rio also has a +rename+ mode, which causes the path manipulation methods Rio#dirname=,
530
+ Rio#filename=, Rio#basename= and Rio#extname= to rename an object on the filesystem
531
+ when they are used to change a Rio's path. A Rio is put in +rename+ mode by
532
+ calling Rio#rename with no arguments.
533
+
534
+ rio('adir/afile.txt').rename.filename = 'bfile.rb' # adir/afile.txt => adir/bfile.rb
535
+ rio('adir/afile.txt').rename.basename = 'bfile' # adir/afile.txt => adir/bfile.txt
536
+ rio('adir/afile.txt').rename.extname = '.rb' # adir/afile.txt => adir/afile.rb
537
+ rio('adir/afile.txt').rename.dirname = 'b/c' # adir/afile.txt => b/c/afile.txt
538
+
539
+ When +rename+ mode is set for a directory Rio, it is automatically set in the Rios created
540
+ when iterating through that directory.
541
+
542
+ rio('adir').rename.files('*.htm') do |frio|
543
+ frio.extname = '.html' #=> changes the rio and renames the file
544
+ end
545
+
546
+ === Deleting
547
+
548
+ The Rio methods for deleting filesystem objects are Rio#rm, Rio#rmdir, Rio#rmtree, Rio#delete,
549
+ and Rio#delete!. +rm+, +rmdir+ and +rmtree+ are passed the like named methods in the FileUtils
550
+ module. Rio#delete calls +rmdir+ for directories and +rm+ for anything else, while Rio#delete!
551
+ calls Rio#rmtree for directories.
552
+
553
+ * To delete something only if it is not a directory use Rio#rm
554
+ * To delete an empty directory use Rio#rmdir
555
+ * To delete an entire directory tree use Rio#rmtree
556
+ * To delete anything except a populated directory use Rio#delete
557
+ * To delete anything use Rio#delete!
558
+
559
+ It is not an error to call any of the deleting methods on something that does not exist. Rio provides
560
+ Rio#exist? and Rio#symlink? to check if something exists (<tt>exist?</tt> returns false for
561
+ symlinks to non-existant object even though the symlink itself exists).
562
+ The deleting methods' purpose is to make things not exist, so
563
+ calling one of them on something that already does not exist is considered a success.
564
+
565
+ To create a clean copy of a directory whether or not anything with that name exists you might do this
566
+ rio('adir').delete!.mkpath.chdir do
567
+ # do something in adir
568
+ end
569
+
570
+ See also:
571
+ * RIO::Doc::SYNOPSIS
572
+ * RIO::Doc::HOWTO
573
+ * RIO::Rio
574
+
575
+ =end
576
+ module INTRO
577
+ end
578
+ end
579
+ end