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,79 @@
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 CxDir #:nodoc: all
40
+ private
41
+
42
+ def _ss_keys() Cx::SS::ENTRY_KEYS + Cx::SS::STREAM_KEYS end
43
+ CX_ALL_SKIP_KEYS = ['retrystate']
44
+ def _add_recurse_iter_cx(ario)
45
+ new_cx = ario.cx
46
+ cx.keys.reject { |k| CX_ALL_SKIP_KEYS.include?(k) }.each { |k|
47
+ new_cx.set_(k,cx[k])
48
+ }
49
+ ario.cx = new_cx
50
+ ario
51
+ end
52
+ def _add_cx(ario,keys)
53
+ new_cx = ario.cx
54
+ keys.each {|k|
55
+ next unless cx.has_key?(k)
56
+ new_cx.set_(k,cx[k])
57
+ }
58
+ ario.cx = new_cx
59
+ end
60
+ CX_DIR_ITER_KEYS = %w[sel nosel]
61
+ CX_STREAM_ITER_KEYS = %w[stream_rectype stream_itertype stream_sel stream_nosel]
62
+ def _add_iter_cx(ario)
63
+ if nostreamenum?
64
+ _add_cx(ario,CX_DIR_ITER_KEYS)
65
+ end
66
+ _add_stream_iter_cx(ario)
67
+ end
68
+ def _add_stream_iter_cx(ario)
69
+ _add_cx(ario,CX_STREAM_ITER_KEYS)
70
+ new_cx = ario.cx
71
+ if stream_iter?
72
+ new_cx.set_('ss_args',cx['ss_args']) if cx.has_key?('ss_args')
73
+ new_cx.set_('ss_type',cx['ss_type']) if cx.has_key?('ss_type')
74
+ end
75
+ ario.cx = new_cx
76
+ ario
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,145 @@
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
+ require 'rio/ops/path'
39
+ require 'rio/ops/dir'
40
+ require 'rio/filter/closeoneof'
41
+ require 'rio/ioh'
42
+ module RIO
43
+ module Dir #:nodoc: all
44
+ class Base < State::Base
45
+ include Ops::Path::Str
46
+ def self.copy_(src,dst)
47
+ Impl::U.cp_r(src,dst)
48
+ end
49
+ def open?() !ioh.nil? end
50
+ end
51
+
52
+ class NonExisting < Base
53
+ include Ops::Dir::NonExisting
54
+ def check?() not self.exist? end
55
+ def when_missing(sym,*args) gofigure(sym,*args) end
56
+ end # class EDir
57
+
58
+ class Existing < Base
59
+ include Ops::Dir::Existing
60
+
61
+ def check?() self.directory? end
62
+ def when_missing(sym,*args) dopen() end
63
+ def dopen()
64
+ self.rl = RIO::Dir::RL.new(self.to_uri)
65
+ become 'Dir::Open'
66
+ end
67
+ end # class EDir
68
+ class Open < Base
69
+ def check?() true end
70
+ def open(m=nil,*args)
71
+ open_(*args)
72
+ end
73
+ def open_()
74
+ unless open?
75
+ ios = self.rl.open()
76
+ self.ioh = IOH::Dir.new(ios)
77
+ # self.ioh = self.rl.open()
78
+ end
79
+ self
80
+ end
81
+ def when_missing(sym,*args)
82
+ nobj = open_.dstream()
83
+ return nobj unless nobj.nil?
84
+ gofigure(sym,*args)
85
+ end
86
+
87
+ def dstream()
88
+ cl = 'Dir::Stream'
89
+ #p "LOOP: retry: #{cx['retrystate'].inspect} => #{cl}"
90
+ return nil if cx['retrystate'] == cl
91
+ cx['retrystate'] = cl
92
+
93
+ become(cl)
94
+ end
95
+ end
96
+ class Stream < Base
97
+ include Ops::Dir::Stream
98
+ def check?() open? end
99
+ def when_missing(sym,*args)
100
+ #p callstr('when_missing',sym,*args)
101
+ retryreset()
102
+ end
103
+ def base_state() 'Dir::Close' end
104
+
105
+ def reset()
106
+ self.close.softreset()
107
+ end
108
+ alias :copyclose :reset
109
+ end
110
+ class Close < Base
111
+ def close()
112
+ #p callstr('close')+" mode='#{mode?}' ioh=#{self.ioh} open?=#{open?}"
113
+ return self unless self.open?
114
+ self.close_
115
+ cx['retrystate'] = nil
116
+ self
117
+ end
118
+
119
+ def close_()
120
+ #p callstr('close_')+" ioh=#{self.ioh} open?=#{open?}"
121
+ return self unless self.open?
122
+ self.clear_selection
123
+ self.ioh.close
124
+ self.ioh = nil
125
+ self.rl.close
126
+ self
127
+ end
128
+ protected :close_
129
+
130
+ def clear_selection()
131
+ cx.delete('sel')
132
+ cx.delete('nosel')
133
+ cx.delete('nostreamenum')
134
+ self
135
+ end
136
+
137
+ def check?() true end
138
+ def when_missing(sym,*args)
139
+ # p callstr('when_missing',sym,*args)
140
+ self.close_.retryreset()
141
+ end
142
+ end
143
+ end
144
+
145
+ end # module RIO
@@ -0,0 +1,45 @@
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
+ require 'rio'
39
+ module RIO
40
+ TITLE = "Rio"
41
+ SUMMARY = "Rio - Ruby I/O Comfort Class"
42
+ DESCRIPTION = "Rio is a convenience class wrapping much of the functionality of " +
43
+ "IO, File, Dir, Pathname, FileUtils, Tempfile, StringIO, OpenURI, Zlib, and CSV.
44
+ "
45
+ end
@@ -0,0 +1,691 @@
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 #: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, Tempfile, StringIO, OpenURI, Zlib, and CSV.
46
+
47
+ == HOWTO...
48
+
49
+ === Read a single file
50
+ ario = rio('afile')
51
+ string = ""
52
+ array = []
53
+
54
+ * Read a file into a string.
55
+ # method 1
56
+ string = ario.slurp
57
+ # method 2
58
+ ario > string
59
+
60
+ * Append a file onto a string.
61
+ # method 1
62
+ ario >> string
63
+ # method 2
64
+ string += ario.slurp
65
+
66
+ * Read lines of a file into an array
67
+ # method 1
68
+ array = ario[]
69
+ # method 2
70
+ ario > array
71
+ # method 3
72
+ array = ario.to_a
73
+ # method 4
74
+ array = ario.readlines
75
+
76
+ * Append lines of a file into an array
77
+ # method 1
78
+ ario >> array
79
+ # method 2
80
+ array += ario.lines[]
81
+
82
+ * Read the first 10 lines of a file into an array
83
+ # method 1
84
+ array = ario[0...10]
85
+ # method 2
86
+ array = ario.lines[0...10]
87
+ # method 3
88
+ ario.lines(0...10) > array
89
+
90
+ * Read lines of a file into an array, with each line chomped
91
+ # method 1
92
+ array = ario.chomp[]
93
+ # method 2
94
+ array = ario.chomp.lines[]
95
+ # method 3
96
+ ario.chomp > array
97
+
98
+ * Append the first 10 lines of a file into an array, with each line chomped
99
+ # method 1
100
+ array += ario.chomp.lines[0...10]
101
+ # method 2
102
+ ario.chomp.lines(0...10) >> array
103
+
104
+ * Read all lines starting with 'require' into an array, with each line chomped
105
+ # method 1
106
+ array = ario.chomp.lines(/^\s*require/)
107
+ # method 2
108
+ ario.chomp.lines(/^\s*require/) > array
109
+
110
+ * Read a gzipped file into a string
111
+ # method 1
112
+ rio('afile.gz').gzip > string
113
+ # method 2
114
+ string = rio('afile.gz').gzip.slurp
115
+
116
+ * Append a gzipped file into a string
117
+ # method 1
118
+ rio('afile.gz').gzip >> string
119
+ # method 2
120
+ string += rio('afile.gz').gzip.slurp
121
+
122
+ * Iterate through all the lines of a file
123
+ # method 1
124
+ rio('afile').lines { |line| ... }
125
+ # method 2
126
+ rio('afile').each { |line| ... }
127
+ # method 3
128
+ rio('afile').each_line { |line| ... }
129
+
130
+
131
+ * Iterate through the lines of a gzipped file
132
+ rio('afile.gz').gzip { |line| ... }
133
+
134
+ * Iterate through all non-empty lines of a gzipped file, with each line chomped
135
+ rio('afile.gz').gzip.chomp.nolines(:empty?) { |line| ... }
136
+
137
+ * Iterate through the first 100 lines of a file
138
+ # method 1
139
+ rio('afile').lines(0...100) { |line| ... }
140
+
141
+ * Iterate through the first line and all ruby comment lines in a gzipped file
142
+ rio('afile.rb.gz').gzip.lines(0,/^\s*#/) { |line| ... }
143
+
144
+ * Iterate through the lines of a ruby file that are neither empty nor comments, with all lines chomped
145
+ rio('afile.rb.gz').chomp.nolines(/^\s*#/,:empty?) { |line| ... }
146
+
147
+ * Read all the comment lines from a ruby file into an array with all lines chomped
148
+ # method 1
149
+ array = rio('afile.rb').chomp.lines[/^\s*#/]
150
+ # method 2
151
+ rio('afile.rb').chomp.lines(/^\s*#/) > array
152
+
153
+
154
+ * Read lines of a file into an array, with each line chomped, skipping any lines longer than 1024 chars
155
+ # method 1
156
+ ario.chomp.lines(proc{ |line| line.length <= 1024}) > array
157
+ # method 2
158
+ array = ario.chomp.nolines[proc{ |line| line.length > 1024}]
159
+ # method 3
160
+ array = ario.chomp.lines(proc{ |line| line.length <= 1024}).to_a
161
+
162
+ ---
163
+
164
+ === Write to a single file
165
+
166
+ ario = rio('afile')
167
+ string = "A String\n"
168
+ array = ["Line 0\n","Line 1\n"]
169
+
170
+ * Write a string to a file, leaving the Rio open
171
+ # method 1
172
+ ario.puts(string)
173
+ # method 2
174
+ ario.print(string)
175
+ # method 3
176
+ ario.noclose < string
177
+
178
+ * Write a string to a file and close the file
179
+ # method 1
180
+ rio('afile') < string
181
+ # method 2
182
+ ario.print!(string)
183
+ # method 3
184
+ ario.print(string).close
185
+
186
+ * Append a string to a file, leaving the Rio open
187
+ # method 1
188
+ ario.a.puts(string)
189
+ # method 2
190
+ ario.a.print(string)
191
+ # method 3
192
+ ario.noclose << string
193
+
194
+ * Append a string to a file and close the file
195
+ # method 1
196
+ rio('afile') << string
197
+ # method 2
198
+ rio('afile').a.print!(string)
199
+ # method 3
200
+ rio('afile').a.print(string).close
201
+
202
+ * Write an array to a file, leaving the Rio open
203
+ # method 1
204
+ ario = rio('afile').nocloseoncopy
205
+ ario << array
206
+ # method 2
207
+ ario.noclose < array
208
+
209
+ * Write an array to a file and close the file
210
+ # method 1
211
+ rio('afile') < array
212
+
213
+
214
+ ---
215
+
216
+ === Select records
217
+ ario = rio('afile')
218
+ string = ""
219
+ array = []
220
+
221
+ * Put lines one thru ten and line 100 into an array
222
+ # method 1
223
+ array = ario[0..9,99]
224
+ # method 2
225
+ array = ario[0...10,99..99]
226
+ # method 3
227
+ ario(0..9,99) > array
228
+
229
+ * Put lines one thru ten,line 100 and lines starting with 'zippy' into an array
230
+ # method 1
231
+ array = ario[0..9,99,/^zippy/]
232
+ # method 2
233
+ array = ario[0...10,99..99,/^zippy/]
234
+ # method 3
235
+ ario(0..9,99,/^zippy/) > array
236
+
237
+ * Put lines that are longer than 128 bytes into an array
238
+ # method 1
239
+ array = ario[proc{ |l| l.length > 128}]
240
+ # method 2
241
+ array = ario.lines[proc{ |l| l.length > 128}]
242
+ # method 3
243
+ array = ario.nolines[proc{ |l| l.length <= 128}]
244
+
245
+ * Copy all lines that do not start with 'zippy' into another file
246
+ # method 1
247
+ ario.nolines(/^zippy/) > rio('another_file')
248
+ # method 2
249
+ ario.lines.nolines(/^zippy/) > rio('another_file')
250
+ # method 3
251
+ rio('another_file') < ario.nolines(/^zippy/)
252
+
253
+ * Copy the first 10 lines and lines starting with 'zippy', but exclude any lines longer than 128 bytes
254
+ # method 1
255
+ ario.lines(0...10,/^zippy/).nolines(proc{ |l| l.length > 128}] > rio('another_file')
256
+ # method 2
257
+ rio('another_file') < ario.lines(0...10,/^zippy/).nolines(proc{ |l| l.length > 128})
258
+
259
+
260
+
261
+ ---
262
+
263
+ === Select directory entries
264
+ ario = rio('adir')
265
+ string = ""
266
+ array = []
267
+
268
+ * Put all entries with the extension '.txt' into an array
269
+ # method 1
270
+ array = ario['*.txt']
271
+ # method 2
272
+ array = ario[/\.txt/]
273
+ # method 3
274
+ array = ario.entries['*.txt']
275
+
276
+ * Put all files with the extension '.txt' into an array
277
+ # method 1
278
+ array = ario.files['*.txt']
279
+ # method 2
280
+ array = ario.files[/\.txt/]
281
+ # method 3
282
+ array = ario.files['*.txt']
283
+
284
+ * Put all entries with the extension '.txt' into an array, including those in subdirectories
285
+ # method 1
286
+ array = ario.all['*.txt']
287
+ # method 2
288
+ array = ario.all[/\.txt/]
289
+ # method 3
290
+ array = ario.all.entries['*.txt']
291
+
292
+ * Put all entries with the extension '.txt' into an array, including those in subdirectories, except those
293
+ in subdirectories name '.svn'
294
+ # method 1
295
+ array = ario.norecurse('.svn').all['*.txt']
296
+ # method 2
297
+ array = ario.norecurse(/^\.svn$/).all[/\.txt/]
298
+ # method 3
299
+ array = ario.norecurse('.svn').entries['*.txt']
300
+ # method 4
301
+ array = ario.entries('*.txt').norecurse('.svn').to_a
302
+ # method 5
303
+ array = ario.norecurse('.svn')['*.txt']
304
+
305
+ * Iterate through all ruby files in a directory structure except those in the '.svn' and 'pkg' directories
306
+ # method 1
307
+ ario.norecurse('.svn','pkg').files('*.rb',proc{ |f| f.executable? and f[0] =~ /^#!.+ruby/ }) { |f| ... }
308
+
309
+ * Put all files excluding those that are symlinks to files in an array
310
+ # method 1
311
+ array = ario.nofiles[:symlink?]
312
+ # method 2
313
+ array = ario.nofiles(:symlink?).files[]
314
+ # method 3
315
+ array = ario.nofiles(:symlink?).to_a
316
+ # method 4
317
+ array = ario.files.nofiles[:symlink?]
318
+
319
+ * Put all entries that are not files (or symlinks to files) into an array
320
+ # method 1
321
+ array = ario.nofiles[]
322
+ # method 2
323
+ array = ario.nofiles.to_a
324
+
325
+ * Put all entries that are symlinks to files into an array
326
+ # method 1
327
+ array = ario.files[proc{|f| f.file? and f.symlink?}]
328
+ # method 2
329
+ array = ario.files(proc{|f| f.file? and f.symlink?}).to_a
330
+
331
+ * Put all directories except those named '.svn' into an array
332
+ # method 1
333
+ array = ario.nodirs['.svn']
334
+ # method 2
335
+ array = ario.nodirs[/^\.svn/]
336
+ # method 3
337
+ array = ario.nodirs('.svn').to_a
338
+ # method 4
339
+ array = ario.nodirs('.svn').dirs[]
340
+ # method 5
341
+ array = ario.nodirs('.svn')[]
342
+
343
+
344
+ ---
345
+
346
+ === Read and writing files
347
+ ario = rio('afile')
348
+ string = ""
349
+ array = []
350
+
351
+ * Copy the contents of one file into another file
352
+ # method 1
353
+ rio('srcfile') > rio('dstfile')
354
+ # method 2
355
+ rio('dstfile') < rio('srcfile')
356
+ # method 3
357
+ rip('dstfile').print!(rio('srcfile').slurp)
358
+
359
+ * Append the contents of one file to another file
360
+ # method 1
361
+ rio('srcfile') >> rio('dstfile')
362
+ # method 2
363
+ rio('dstfile') << rio('srcfile')
364
+ # method 3
365
+ rip('dstfile').a.print!(rio('srcfile').slurp)
366
+
367
+ * Copy the first 10 lines of one file to another file
368
+ # method 1
369
+ rio('srcfile').lines(0...10) > rio('dstfile')
370
+ # method 2
371
+ rio('dstfile') < rio('srcfile').lines(0...10)
372
+ # method 3
373
+ rio('dstfile') < rio('srcfile').lines[0...10]
374
+
375
+ * Concatenate several files into one
376
+ # method 1
377
+ rio('dstfile') < [ rio('src1'), rio('src2'), rio('src3') ]
378
+ # method 2
379
+ rio('dstfile') < rio('src1') << rio('src2') << rio('src3')
380
+
381
+ * Copy a web page into a file
382
+ # method 1
383
+ rio('http://ruby-doc.org/') > rio('afile')
384
+ # method 2
385
+ rio('afile') < rio('http://ruby-doc.org/')
386
+ # method 3
387
+ rio('afile').print!(rio('http://ruby-doc.org/').slurp)
388
+
389
+ * Append the output of the daytime server running on the localhost to a file
390
+ # method 1
391
+ rio("tcp://localhost:daytime") >> rio('afile')
392
+ # method 2
393
+ rio("tcp:",'localhost','daytime') >> rio('afile')
394
+ # method 3
395
+ rio('afile') << rio("tcp://:daytime")
396
+ # method 4
397
+ rio('afile') << rio("tcp://:13")
398
+
399
+ * Copy the first line and all lines containing 'http:' to a file
400
+ # method 1
401
+ rio('srcfile').lines(0,/http:/) > rio('dstfile')
402
+ # method 2
403
+ rio('dstfile') < rio('srcfile').lines(0,/http:/)
404
+ # method 3
405
+ rio('dstfile') < rio('srcfile').lines[0,/http:/]
406
+ # method 4
407
+
408
+ * Create a gzipped copy of a file
409
+ # method 1
410
+ rio('afile') > rio('afile.gz').gzip
411
+ # method 2
412
+ rio('afile.gz').gzip < rio('afile')
413
+ # method 3
414
+ rio('afile.gz').gzip.print!( rio('afile').slurp )
415
+
416
+ * Create an ungzipped copy of a gzipped file
417
+ # method 1
418
+ rio('afile') < rio('afile.gz').gzip
419
+ # method 2
420
+ rio('afile.gz').gzip > rio('afile')
421
+ # method 3
422
+ rio('afile').print!( rio('afile.gz').gzip.slurp )
423
+
424
+ * Copy the first 100 lines of gzipped file on a webserver into a local file
425
+ # method 1
426
+ rio('http://aserver/afile.gz').gzip.lines(0...100) > rio('afile')
427
+
428
+
429
+ * Create a file composed of a header from another file, the output of the 'ps' command, some text and
430
+ its creation time pulled from the daytime server running on your localhost
431
+ # method 1
432
+ rio('out') < [ rio('header'), rio(?-,'ps'), "Created on ", rio('tcp://:daytime') ]
433
+ # method 2
434
+ rio('out') < rio('header') << rio(?-,'ps') << "Created on: " << rio("tcp://:daytime")
435
+
436
+
437
+ ---
438
+
439
+ === Reading multiple files
440
+ ario = rio('adir')
441
+ string = ""
442
+ array = []
443
+
444
+ * Count the lines of code in a directory tree of ruby source files
445
+ # method 1
446
+ cnt = ario.all.files('*.rb').chomp.nolines(/^\s*#/,/^\s*$/).inject(0) { |sum,l| sum += 1 }
447
+ # method 2
448
+ cnt = ario.all.files('*.rb').chomp.nolines[/^\s*#/,/^\s*$/].size
449
+
450
+ * Concatanate the contents of all .txt files in a directory into an array
451
+ # method 1
452
+ array = ario.lines.files['*.txt']
453
+ # method 2
454
+ array = ario.files('*.txt').lines[]
455
+ # method 3
456
+ ario.files('*.txt').lines > array
457
+
458
+ * Concatanate the first line of all .txt files in a directory into an array
459
+ # method 1
460
+ array = ario.lines(0).files['*.txt']
461
+ # method 2
462
+ array = ario.files('*.txt').lines[0]
463
+ # method 3
464
+ ario.files('*.txt').lines(0) > array
465
+
466
+ * Copy all .txt files (but only their first ten lines) in a directory into another directiory
467
+ # method 1
468
+ ario.files('*.txt').lines(0...10) > rio('another_dir')
469
+
470
+ ---
471
+
472
+ === Read and write using Standard IO
473
+ string = ""
474
+ array = []
475
+
476
+ * Prompt for input and return what was typed
477
+ # method 1
478
+ ans = rio(?-).chomp.print("Type Something: ").gets
479
+ # method 2
480
+ stdio = rio(?-).chomp
481
+ ans = stdio.print("Type Something: ").gets
482
+
483
+ * Create a Rio tied to stdin or stdout, depending on how it is used
484
+ stdio = rio(?-)
485
+
486
+ * Create a Rio tied to stderr
487
+ stderr = rio(?=)
488
+
489
+ * Write a string to stdout
490
+ # method 1
491
+ rio(?-).puts("Hello World")
492
+ # method 2
493
+ rio(?-) << "Hello World\n"
494
+ # method 3
495
+ rio(?-) < "Hello World\n"
496
+
497
+ * Read a string from stdin with the input chomped
498
+ # method 1
499
+ ans = rio(?-).chomp.gets
500
+ # method 2
501
+ stdio = rio(?-).chomp
502
+ ans = stdio.gets
503
+
504
+ * Read from stdin until end of file with the result going into a string
505
+ # method 1
506
+ rio(?-) >> string
507
+ # method 2
508
+ rio(?-) > string
509
+
510
+ * Read from stdin until end of file with the chomped lines going into an array
511
+ # method 1
512
+ rio(?-).chomp >> array
513
+ # method 2
514
+ rio(?-).chomp > array
515
+
516
+ * Read from stdin until end of file with the result going into a file
517
+ # method 1
518
+ rio(?-) > rio('afile')
519
+ # method 2
520
+ rio('afile') < rio(?-)
521
+
522
+ * Read from stdin until end of file with the result appended to a file
523
+ # method 1
524
+ rio(?-) >> rio('afile')
525
+ # method 2
526
+ rio('afile') << rio(?-)
527
+
528
+ * Write a message to stderr
529
+ # method 1
530
+ rio(?=).puts("Hello Error")
531
+ # method 2
532
+ rio(?=) << "Hello Error\n"
533
+ # method 3
534
+ rio(?=) < "Hello Error\n"
535
+
536
+ * Dump a file to stdout
537
+ # method 1
538
+ rio(?-) << rio('afile')
539
+ # method 2
540
+ rio('afile') >> rio(?-)
541
+ # method 3
542
+ rio('afile') > rio(?-)
543
+ # method 4
544
+ rio(?-) < rio('afile')
545
+ # method 5
546
+ rio(?-).print(rio('afile').slurp)
547
+
548
+ * Emulate a simplified unix 'head' command which reads from stdin and writes the first 10 lines to stdout
549
+ # method 1
550
+ rio(?-).lines(0..9) > rio(?-)
551
+
552
+ ---
553
+
554
+ === Reading and writing from processes as one might do with popen
555
+
556
+ * Read the output of the 'ps' command into an array without the header line or the line representing
557
+ the 'ps' command itself
558
+ ps = rio(?-,'ps -a').nolines[0,/ps$/]
559
+
560
+ * Run an external program, copying its input from one location and its output from another,
561
+ and make it look very much like a shell command.
562
+ # method 1
563
+ ans = ""
564
+ cat = rio(?-,'cat').w!
565
+ cat <"Hello Kitty\n" >ans
566
+
567
+ ---
568
+
569
+ === Renaming and moving files
570
+ string = ""
571
+ array = []
572
+
573
+ * Rename the file 'a' to 'b'
574
+ # method 1
575
+ rio('a').rename('b')
576
+ # method 2
577
+ rio('a').rename.filename = 'b'
578
+
579
+ * Rename a file and leave the Rio referencing the files old name
580
+ ario = rio('a')
581
+ # method 1
582
+ ario.rename('b')
583
+
584
+ * Rename a file and change the Rio to reference the new file name
585
+ ario = rio('a')
586
+ # method 1
587
+ ario.rename!('b')
588
+
589
+ * Rename the file 'index.htm' to 'index.html'
590
+ # method 1
591
+ rio('index.htm').rename('index.html')
592
+ # method 2
593
+ rio('index.htm').rename.extname = '.html'
594
+
595
+ * Rename the file 'index.html' to 'welcome.html'
596
+ # method 1
597
+ rio('index.html').rename('welecome.html')
598
+ # method 2
599
+ rio('index.htm').rename.basename = 'welcome'
600
+
601
+ * Move a file from directory 'src' to directory 'dst'
602
+ # method 1
603
+ rio('src/afile').rename('dst/afile')
604
+ # method 2
605
+ rio('src/afile').rename.dirname = 'dst'
606
+
607
+ * Change a file to have the extension '.html' leaving the rest of it as is
608
+ # method 1
609
+ ario.rename.extname = '.html'
610
+
611
+ * Change a files basename to 'zippy' without changing its extension
612
+ # method 1
613
+ ario.rename.basename = 'zippy'
614
+
615
+ * Change a file ending with '.tar.gz' to end with '.tgz'
616
+ # method 1
617
+ ario.rename.ext('.tar.gz').extname = '.tgz'
618
+
619
+ * Change the extension of all files with the extension '.htm' in a directory to have the
620
+ extension '.html'
621
+ # method 1
622
+ rio('adir').rename.files('*.htm') do |htmfile|
623
+ htmlfile.extname = '.html'
624
+ end
625
+ # method 2
626
+ rio('adir').files('*.htm') do |htmfile|
627
+ htmlfile.rename.extname = '.html'
628
+ end
629
+
630
+ * Change the extension of all files with the extension '.htm' in a directory and its
631
+ subdirectories to have the extension '.html'
632
+ # method 1
633
+ rio('adir').rename.all.files('*.htm') do |htmfile|
634
+ htmfile.extname = '.html'
635
+ end
636
+ # method 2
637
+ rio('adir').all.files('*.htm') do |htmfile|
638
+ htmfile.rename.extname = '.html'
639
+ end
640
+
641
+ ---
642
+
643
+ === Manipulate a Rio's path
644
+ string = ""
645
+ array = []
646
+
647
+ * Create a Rio with an additional subdirectory appended
648
+ ap = rio('adir')
649
+ # method 1
650
+ ap /= 'subdirectory'
651
+ # method 2
652
+ ap = ap.join('subdirectory')
653
+ # method 3
654
+ ap = rio(ap,'subdirectory')
655
+ # method 4
656
+
657
+ * Create a Rio from an array of subdirectories
658
+ dirs = ['adir','subdir1','subdir2']
659
+ # method 1
660
+ ario = rio(dirs)
661
+
662
+ * Create an array of subdirectories from a Rio
663
+ # method 1
664
+ anarray = rio('adir/subdir1/subdir2').split
665
+
666
+ * Append a string to a path
667
+ # method 1
668
+ ario = rio('apath') + astring
669
+ # method 2
670
+ ario = rio('apath')
671
+ ario += astring
672
+
673
+ * create a directory 'links' with a symlink pointing to each .rb file in directory 'lib' (including subdirectories)
674
+ lib = rio('lib')
675
+ links = rio('links').delete!.mkdir
676
+ lib.all.files("*.rb") do |f|
677
+ f.symlink( f.dirname.sub(/^#{lib}/,links).mkdir )
678
+ end
679
+
680
+ ----
681
+
682
+ Suggested Reading
683
+ * RIO::Doc::SYNOPSIS
684
+ * RIO::Doc::INTRO
685
+ * RIO::Rio
686
+
687
+ =end
688
+ module HOWTO
689
+ end
690
+ end
691
+ end