rio 0.3.4 → 0.3.6

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 (349) hide show
  1. data/ChangeLog +287 -0
  2. data/Rakefile +7 -9
  3. data/VERSION +1 -1
  4. data/doc/ANNOUNCE +20 -1
  5. data/doc/RELEASE_NOTES +41 -0
  6. data/doc/rdoc/classes/Kernel.html +181 -0
  7. data/doc/rdoc/classes/Kernel.src/M000214.html +18 -0
  8. data/doc/rdoc/classes/RIO.html +621 -0
  9. data/doc/rdoc/classes/RIO.src/M000001.html +18 -0
  10. data/doc/rdoc/classes/RIO.src/M000002.html +18 -0
  11. data/doc/rdoc/classes/RIO.src/M000003.html +18 -0
  12. data/doc/rdoc/classes/RIO/Doc.html +138 -0
  13. data/doc/rdoc/classes/RIO/Doc/HOWTO.html +1040 -0
  14. data/doc/rdoc/classes/RIO/Doc/INTRO.html +1613 -0
  15. data/doc/rdoc/classes/RIO/Doc/MISC.html +443 -0
  16. data/doc/rdoc/classes/RIO/Doc/SYNOPSIS.html +338 -0
  17. data/doc/rdoc/classes/RIO/IF.html +114 -0
  18. data/doc/rdoc/classes/RIO/IF/CSV.html +202 -0
  19. data/doc/rdoc/classes/RIO/IF/CSV.src/M000004.html +19 -0
  20. data/doc/rdoc/classes/RIO/IF/CSV.src/M000005.html +16 -0
  21. data/doc/rdoc/classes/RIO/IF/CSV.src/M000006.html +16 -0
  22. data/doc/rdoc/classes/RIO/IF/YAML.html +499 -0
  23. data/doc/rdoc/classes/RIO/IF/YAML.src/M000007.html +19 -0
  24. data/doc/rdoc/classes/RIO/IF/YAML.src/M000008.html +16 -0
  25. data/doc/rdoc/classes/RIO/IF/YAML.src/M000009.html +16 -0
  26. data/doc/rdoc/classes/RIO/IF/YAML.src/M000010.html +16 -0
  27. data/doc/rdoc/classes/RIO/IF/YAML.src/M000011.html +16 -0
  28. data/doc/rdoc/classes/RIO/IF/YAML.src/M000012.html +16 -0
  29. data/doc/rdoc/classes/RIO/IF/YAML.src/M000013.html +16 -0
  30. data/doc/rdoc/classes/RIO/IF/YAML.src/M000014.html +16 -0
  31. data/doc/rdoc/classes/RIO/IF/YAML.src/M000015.html +16 -0
  32. data/doc/rdoc/classes/RIO/IF/YAML.src/M000016.html +16 -0
  33. data/doc/rdoc/classes/RIO/IF/YAML.src/M000017.html +16 -0
  34. data/doc/rdoc/classes/RIO/Rio.html +7121 -0
  35. data/doc/rdoc/classes/RIO/Rio.src/M000018.html +18 -0
  36. data/doc/rdoc/classes/RIO/Rio.src/M000019.html +20 -0
  37. data/doc/rdoc/classes/RIO/Rio.src/M000020.html +27 -0
  38. data/doc/rdoc/classes/RIO/Rio.src/M000021.html +16 -0
  39. data/doc/rdoc/classes/RIO/Rio.src/M000023.html +19 -0
  40. data/doc/rdoc/classes/RIO/Rio.src/M000024.html +20 -0
  41. data/doc/rdoc/classes/RIO/Rio.src/M000025.html +16 -0
  42. data/doc/rdoc/classes/RIO/Rio.src/M000026.html +16 -0
  43. data/doc/rdoc/classes/RIO/Rio.src/M000027.html +16 -0
  44. data/doc/rdoc/classes/RIO/Rio.src/M000028.html +16 -0
  45. data/doc/rdoc/classes/RIO/Rio.src/M000029.html +16 -0
  46. data/doc/rdoc/classes/RIO/Rio.src/M000030.html +16 -0
  47. data/doc/rdoc/classes/RIO/Rio.src/M000031.html +16 -0
  48. data/doc/rdoc/classes/RIO/Rio.src/M000032.html +16 -0
  49. data/doc/rdoc/classes/RIO/Rio.src/M000033.html +16 -0
  50. data/doc/rdoc/classes/RIO/Rio.src/M000034.html +16 -0
  51. data/doc/rdoc/classes/RIO/Rio.src/M000035.html +16 -0
  52. data/doc/rdoc/classes/RIO/Rio.src/M000036.html +16 -0
  53. data/doc/rdoc/classes/RIO/Rio.src/M000037.html +16 -0
  54. data/doc/rdoc/classes/RIO/Rio.src/M000038.html +16 -0
  55. data/doc/rdoc/classes/RIO/Rio.src/M000039.html +16 -0
  56. data/doc/rdoc/classes/RIO/Rio.src/M000040.html +16 -0
  57. data/doc/rdoc/classes/RIO/Rio.src/M000041.html +16 -0
  58. data/doc/rdoc/classes/RIO/Rio.src/M000042.html +16 -0
  59. data/doc/rdoc/classes/RIO/Rio.src/M000043.html +16 -0
  60. data/doc/rdoc/classes/RIO/Rio.src/M000044.html +16 -0
  61. data/doc/rdoc/classes/RIO/Rio.src/M000045.html +16 -0
  62. data/doc/rdoc/classes/RIO/Rio.src/M000046.html +16 -0
  63. data/doc/rdoc/classes/RIO/Rio.src/M000047.html +16 -0
  64. data/doc/rdoc/classes/RIO/Rio.src/M000048.html +16 -0
  65. data/doc/rdoc/classes/RIO/Rio.src/M000049.html +16 -0
  66. data/doc/rdoc/classes/RIO/Rio.src/M000050.html +16 -0
  67. data/doc/rdoc/classes/RIO/Rio.src/M000051.html +16 -0
  68. data/doc/rdoc/classes/RIO/Rio.src/M000052.html +16 -0
  69. data/doc/rdoc/classes/RIO/Rio.src/M000053.html +16 -0
  70. data/doc/rdoc/classes/RIO/Rio.src/M000054.html +16 -0
  71. data/doc/rdoc/classes/RIO/Rio.src/M000055.html +16 -0
  72. data/doc/rdoc/classes/RIO/Rio.src/M000056.html +16 -0
  73. data/doc/rdoc/classes/RIO/Rio.src/M000057.html +16 -0
  74. data/doc/rdoc/classes/RIO/Rio.src/M000058.html +16 -0
  75. data/doc/rdoc/classes/RIO/Rio.src/M000059.html +16 -0
  76. data/doc/rdoc/classes/RIO/Rio.src/M000060.html +16 -0
  77. data/doc/rdoc/classes/RIO/Rio.src/M000061.html +16 -0
  78. data/doc/rdoc/classes/RIO/Rio.src/M000062.html +16 -0
  79. data/doc/rdoc/classes/RIO/Rio.src/M000063.html +16 -0
  80. data/doc/rdoc/classes/RIO/Rio.src/M000064.html +16 -0
  81. data/doc/rdoc/classes/RIO/Rio.src/M000065.html +16 -0
  82. data/doc/rdoc/classes/RIO/Rio.src/M000066.html +16 -0
  83. data/doc/rdoc/classes/RIO/Rio.src/M000067.html +16 -0
  84. data/doc/rdoc/classes/RIO/Rio.src/M000068.html +16 -0
  85. data/doc/rdoc/classes/RIO/Rio.src/M000069.html +16 -0
  86. data/doc/rdoc/classes/RIO/Rio.src/M000070.html +16 -0
  87. data/doc/rdoc/classes/RIO/Rio.src/M000071.html +16 -0
  88. data/doc/rdoc/classes/RIO/Rio.src/M000072.html +16 -0
  89. data/doc/rdoc/classes/RIO/Rio.src/M000073.html +16 -0
  90. data/doc/rdoc/classes/RIO/Rio.src/M000074.html +16 -0
  91. data/doc/rdoc/classes/RIO/Rio.src/M000075.html +16 -0
  92. data/doc/rdoc/classes/RIO/Rio.src/M000076.html +16 -0
  93. data/doc/rdoc/classes/RIO/Rio.src/M000077.html +16 -0
  94. data/doc/rdoc/classes/RIO/Rio.src/M000078.html +16 -0
  95. data/doc/rdoc/classes/RIO/Rio.src/M000079.html +16 -0
  96. data/doc/rdoc/classes/RIO/Rio.src/M000080.html +16 -0
  97. data/doc/rdoc/classes/RIO/Rio.src/M000081.html +16 -0
  98. data/doc/rdoc/classes/RIO/Rio.src/M000082.html +16 -0
  99. data/doc/rdoc/classes/RIO/Rio.src/M000083.html +16 -0
  100. data/doc/rdoc/classes/RIO/Rio.src/M000084.html +16 -0
  101. data/doc/rdoc/classes/RIO/Rio.src/M000085.html +16 -0
  102. data/doc/rdoc/classes/RIO/Rio.src/M000086.html +16 -0
  103. data/doc/rdoc/classes/RIO/Rio.src/M000087.html +16 -0
  104. data/doc/rdoc/classes/RIO/Rio.src/M000088.html +16 -0
  105. data/doc/rdoc/classes/RIO/Rio.src/M000089.html +16 -0
  106. data/doc/rdoc/classes/RIO/Rio.src/M000090.html +16 -0
  107. data/doc/rdoc/classes/RIO/Rio.src/M000091.html +16 -0
  108. data/doc/rdoc/classes/RIO/Rio.src/M000092.html +16 -0
  109. data/doc/rdoc/classes/RIO/Rio.src/M000093.html +16 -0
  110. data/doc/rdoc/classes/RIO/Rio.src/M000094.html +16 -0
  111. data/doc/rdoc/classes/RIO/Rio.src/M000095.html +16 -0
  112. data/doc/rdoc/classes/RIO/Rio.src/M000096.html +16 -0
  113. data/doc/rdoc/classes/RIO/Rio.src/M000097.html +16 -0
  114. data/doc/rdoc/classes/RIO/Rio.src/M000098.html +16 -0
  115. data/doc/rdoc/classes/RIO/Rio.src/M000099.html +16 -0
  116. data/doc/rdoc/classes/RIO/Rio.src/M000100.html +16 -0
  117. data/doc/rdoc/classes/RIO/Rio.src/M000101.html +16 -0
  118. data/doc/rdoc/classes/RIO/Rio.src/M000102.html +16 -0
  119. data/doc/rdoc/classes/RIO/Rio.src/M000103.html +16 -0
  120. data/doc/rdoc/classes/RIO/Rio.src/M000104.html +16 -0
  121. data/doc/rdoc/classes/RIO/Rio.src/M000105.html +16 -0
  122. data/doc/rdoc/classes/RIO/Rio.src/M000106.html +16 -0
  123. data/doc/rdoc/classes/RIO/Rio.src/M000107.html +16 -0
  124. data/doc/rdoc/classes/RIO/Rio.src/M000108.html +16 -0
  125. data/doc/rdoc/classes/RIO/Rio.src/M000109.html +16 -0
  126. data/doc/rdoc/classes/RIO/Rio.src/M000110.html +16 -0
  127. data/doc/rdoc/classes/RIO/Rio.src/M000111.html +16 -0
  128. data/doc/rdoc/classes/RIO/Rio.src/M000112.html +16 -0
  129. data/doc/rdoc/classes/RIO/Rio.src/M000113.html +16 -0
  130. data/doc/rdoc/classes/RIO/Rio.src/M000114.html +16 -0
  131. data/doc/rdoc/classes/RIO/Rio.src/M000115.html +16 -0
  132. data/doc/rdoc/classes/RIO/Rio.src/M000116.html +16 -0
  133. data/doc/rdoc/classes/RIO/Rio.src/M000117.html +16 -0
  134. data/doc/rdoc/classes/RIO/Rio.src/M000118.html +16 -0
  135. data/doc/rdoc/classes/RIO/Rio.src/M000119.html +16 -0
  136. data/doc/rdoc/classes/RIO/Rio.src/M000120.html +16 -0
  137. data/doc/rdoc/classes/RIO/Rio.src/M000121.html +16 -0
  138. data/doc/rdoc/classes/RIO/Rio.src/M000122.html +16 -0
  139. data/doc/rdoc/classes/RIO/Rio.src/M000123.html +16 -0
  140. data/doc/rdoc/classes/RIO/Rio.src/M000124.html +16 -0
  141. data/doc/rdoc/classes/RIO/Rio.src/M000125.html +16 -0
  142. data/doc/rdoc/classes/RIO/Rio.src/M000126.html +16 -0
  143. data/doc/rdoc/classes/RIO/Rio.src/M000127.html +16 -0
  144. data/doc/rdoc/classes/RIO/Rio.src/M000128.html +16 -0
  145. data/doc/rdoc/classes/RIO/Rio.src/M000129.html +16 -0
  146. data/doc/rdoc/classes/RIO/Rio.src/M000130.html +16 -0
  147. data/doc/rdoc/classes/RIO/Rio.src/M000131.html +16 -0
  148. data/doc/rdoc/classes/RIO/Rio.src/M000132.html +16 -0
  149. data/doc/rdoc/classes/RIO/Rio.src/M000133.html +16 -0
  150. data/doc/rdoc/classes/RIO/Rio.src/M000134.html +16 -0
  151. data/doc/rdoc/classes/RIO/Rio.src/M000135.html +16 -0
  152. data/doc/rdoc/classes/RIO/Rio.src/M000136.html +16 -0
  153. data/doc/rdoc/classes/RIO/Rio.src/M000137.html +16 -0
  154. data/doc/rdoc/classes/RIO/Rio.src/M000138.html +16 -0
  155. data/doc/rdoc/classes/RIO/Rio.src/M000139.html +16 -0
  156. data/doc/rdoc/classes/RIO/Rio.src/M000140.html +16 -0
  157. data/doc/rdoc/classes/RIO/Rio.src/M000141.html +16 -0
  158. data/doc/rdoc/classes/RIO/Rio.src/M000142.html +16 -0
  159. data/doc/rdoc/classes/RIO/Rio.src/M000143.html +16 -0
  160. data/doc/rdoc/classes/RIO/Rio.src/M000144.html +16 -0
  161. data/doc/rdoc/classes/RIO/Rio.src/M000145.html +16 -0
  162. data/doc/rdoc/classes/RIO/Rio.src/M000146.html +16 -0
  163. data/doc/rdoc/classes/RIO/Rio.src/M000147.html +16 -0
  164. data/doc/rdoc/classes/RIO/Rio.src/M000148.html +16 -0
  165. data/doc/rdoc/classes/RIO/Rio.src/M000149.html +16 -0
  166. data/doc/rdoc/classes/RIO/Rio.src/M000150.html +16 -0
  167. data/doc/rdoc/classes/RIO/Rio.src/M000151.html +16 -0
  168. data/doc/rdoc/classes/RIO/Rio.src/M000152.html +16 -0
  169. data/doc/rdoc/classes/RIO/Rio.src/M000153.html +16 -0
  170. data/doc/rdoc/classes/RIO/Rio.src/M000154.html +16 -0
  171. data/doc/rdoc/classes/RIO/Rio.src/M000155.html +16 -0
  172. data/doc/rdoc/classes/RIO/Rio.src/M000156.html +16 -0
  173. data/doc/rdoc/classes/RIO/Rio.src/M000157.html +16 -0
  174. data/doc/rdoc/classes/RIO/Rio.src/M000158.html +16 -0
  175. data/doc/rdoc/classes/RIO/Rio.src/M000159.html +16 -0
  176. data/doc/rdoc/classes/RIO/Rio.src/M000160.html +16 -0
  177. data/doc/rdoc/classes/RIO/Rio.src/M000161.html +16 -0
  178. data/doc/rdoc/classes/RIO/Rio.src/M000162.html +16 -0
  179. data/doc/rdoc/classes/RIO/Rio.src/M000163.html +16 -0
  180. data/doc/rdoc/classes/RIO/Rio.src/M000164.html +16 -0
  181. data/doc/rdoc/classes/RIO/Rio.src/M000165.html +16 -0
  182. data/doc/rdoc/classes/RIO/Rio.src/M000166.html +16 -0
  183. data/doc/rdoc/classes/RIO/Rio.src/M000167.html +16 -0
  184. data/doc/rdoc/classes/RIO/Rio.src/M000168.html +16 -0
  185. data/doc/rdoc/classes/RIO/Rio.src/M000169.html +16 -0
  186. data/doc/rdoc/classes/RIO/Rio.src/M000170.html +16 -0
  187. data/doc/rdoc/classes/RIO/Rio.src/M000171.html +16 -0
  188. data/doc/rdoc/classes/RIO/Rio.src/M000172.html +16 -0
  189. data/doc/rdoc/classes/RIO/Rio.src/M000173.html +16 -0
  190. data/doc/rdoc/classes/RIO/Rio.src/M000174.html +16 -0
  191. data/doc/rdoc/classes/RIO/Rio.src/M000175.html +16 -0
  192. data/doc/rdoc/classes/RIO/Rio.src/M000176.html +16 -0
  193. data/doc/rdoc/classes/RIO/Rio.src/M000177.html +16 -0
  194. data/doc/rdoc/classes/RIO/Rio.src/M000178.html +16 -0
  195. data/doc/rdoc/classes/RIO/Rio.src/M000179.html +16 -0
  196. data/doc/rdoc/classes/RIO/Rio.src/M000180.html +16 -0
  197. data/doc/rdoc/classes/RIO/Rio.src/M000181.html +16 -0
  198. data/doc/rdoc/classes/RIO/Rio.src/M000182.html +16 -0
  199. data/doc/rdoc/classes/RIO/Rio.src/M000183.html +16 -0
  200. data/doc/rdoc/classes/RIO/Rio.src/M000184.html +16 -0
  201. data/doc/rdoc/classes/RIO/Rio.src/M000185.html +16 -0
  202. data/doc/rdoc/classes/RIO/Rio.src/M000186.html +16 -0
  203. data/doc/rdoc/classes/RIO/Rio.src/M000187.html +16 -0
  204. data/doc/rdoc/classes/RIO/Rio.src/M000188.html +16 -0
  205. data/doc/rdoc/classes/RIO/Rio.src/M000189.html +16 -0
  206. data/doc/rdoc/classes/RIO/Rio.src/M000190.html +16 -0
  207. data/doc/rdoc/classes/RIO/Rio.src/M000191.html +16 -0
  208. data/doc/rdoc/classes/RIO/Rio.src/M000192.html +16 -0
  209. data/doc/rdoc/classes/RIO/Rio.src/M000193.html +16 -0
  210. data/doc/rdoc/classes/RIO/Rio.src/M000194.html +16 -0
  211. data/doc/rdoc/classes/RIO/Rio.src/M000195.html +16 -0
  212. data/doc/rdoc/classes/RIO/Rio.src/M000196.html +16 -0
  213. data/doc/rdoc/classes/RIO/Rio.src/M000197.html +16 -0
  214. data/doc/rdoc/classes/RIO/Rio.src/M000198.html +16 -0
  215. data/doc/rdoc/classes/RIO/Rio.src/M000199.html +16 -0
  216. data/doc/rdoc/classes/RIO/Rio.src/M000200.html +16 -0
  217. data/doc/rdoc/classes/RIO/Rio.src/M000201.html +16 -0
  218. data/doc/rdoc/classes/RIO/Rio.src/M000202.html +16 -0
  219. data/doc/rdoc/classes/RIO/Rio.src/M000203.html +16 -0
  220. data/doc/rdoc/classes/RIO/Rio.src/M000204.html +16 -0
  221. data/doc/rdoc/classes/RIO/Rio.src/M000205.html +16 -0
  222. data/doc/rdoc/classes/RIO/Rio.src/M000206.html +16 -0
  223. data/doc/rdoc/classes/RIO/Rio.src/M000207.html +16 -0
  224. data/doc/rdoc/classes/RIO/Rio.src/M000208.html +16 -0
  225. data/doc/rdoc/classes/RIO/Rio.src/M000209.html +16 -0
  226. data/doc/rdoc/classes/RIO/Rio.src/M000210.html +16 -0
  227. data/doc/rdoc/classes/RIO/Rio.src/M000211.html +16 -0
  228. data/doc/rdoc/classes/RIO/Rio.src/M000212.html +16 -0
  229. data/doc/rdoc/classes/RIO/Rio.src/M000213.html +16 -0
  230. data/doc/rdoc/created.rid +1 -0
  231. data/doc/rdoc/files/README.html +243 -0
  232. data/doc/rdoc/files/lib/rio/constructor_rb.html +142 -0
  233. data/doc/rdoc/files/lib/rio/doc/HOWTO_rb.html +135 -0
  234. data/doc/rdoc/files/lib/rio/doc/INTRO_rb.html +135 -0
  235. data/doc/rdoc/files/lib/rio/doc/MISC_rb.html +135 -0
  236. data/doc/rdoc/files/lib/rio/doc/SYNOPSIS_rb.html +135 -0
  237. data/doc/rdoc/files/lib/rio/if/basic_rb.html +135 -0
  238. data/doc/rdoc/files/lib/rio/if/csv_rb.html +135 -0
  239. data/doc/rdoc/files/lib/rio/if/dir_rb.html +135 -0
  240. data/doc/rdoc/files/lib/rio/if/file_rb.html +135 -0
  241. data/doc/rdoc/files/lib/rio/if/fileordir_rb.html +135 -0
  242. data/doc/rdoc/files/lib/rio/if/grande_entry_rb.html +135 -0
  243. data/doc/rdoc/files/lib/rio/if/grande_rb.html +135 -0
  244. data/doc/rdoc/files/lib/rio/if/grande_stream_rb.html +135 -0
  245. data/doc/rdoc/files/lib/rio/if/internal_rb.html +135 -0
  246. data/doc/rdoc/files/lib/rio/if/path_rb.html +135 -0
  247. data/doc/rdoc/files/lib/rio/if/stream_rb.html +135 -0
  248. data/doc/rdoc/files/lib/rio/if/string_rb.html +135 -0
  249. data/doc/rdoc/files/lib/rio/if/temp_rb.html +135 -0
  250. data/doc/rdoc/files/lib/rio/if/test_rb.html +135 -0
  251. data/doc/rdoc/files/lib/rio/if/yaml_rb.html +135 -0
  252. data/doc/rdoc/files/lib/rio/kernel_rb.html +142 -0
  253. data/doc/rdoc/files/lib/rio_rb.html +154 -0
  254. data/doc/rdoc/fr_class_index.html +37 -0
  255. data/doc/rdoc/fr_file_index.html +49 -0
  256. data/doc/rdoc/fr_method_index.html +241 -0
  257. data/doc/rdoc/index.html +24 -0
  258. data/doc/rdoc/rdoc-style.css +384 -0
  259. data/lib/rio.rb +21 -5
  260. data/lib/rio/constructor.rb +13 -0
  261. data/lib/rio/context/copying.rb +56 -0
  262. data/lib/rio/context/methods.rb +1 -0
  263. data/lib/rio/cp.rb +53 -34
  264. data/lib/rio/doc/HOWTO.rb +9 -3
  265. data/lib/rio/doc/INTRO.rb +113 -3
  266. data/lib/rio/ext.rb +7 -1
  267. data/lib/rio/ext/csv.rb +17 -8
  268. data/lib/rio/ext/yaml.rb +182 -0
  269. data/lib/rio/factory.rb +11 -14
  270. data/lib/rio/filter/closeoneof.rb +12 -31
  271. data/lib/rio/filter/gzip.rb +7 -0
  272. data/lib/rio/if.rb +4 -1
  273. data/lib/rio/if/csv.rb +36 -35
  274. data/lib/rio/if/grande.rb +74 -5
  275. data/lib/rio/if/grande_stream.rb +11 -3
  276. data/lib/rio/if/path.rb +9 -8
  277. data/lib/rio/if/yaml.rb +218 -0
  278. data/lib/rio/ioh.rb +5 -3
  279. data/lib/rio/matchrecord.rb +9 -2
  280. data/lib/rio/ops/dir.rb +2 -1
  281. data/lib/rio/ops/either.rb +9 -9
  282. data/lib/rio/ops/file.rb +4 -1
  283. data/lib/rio/ops/path.rb +26 -20
  284. data/lib/rio/ops/stream.rb +1 -1
  285. data/lib/rio/ops/stream/input.rb +31 -9
  286. data/lib/rio/ops/stream/output.rb +7 -2
  287. data/lib/rio/ops/stream/read.rb +10 -10
  288. data/lib/rio/ops/stream/write.rb +10 -10
  289. data/lib/rio/path.rb +2 -2
  290. data/lib/rio/path/reset.rb +1 -1
  291. data/lib/rio/piper.rb +123 -0
  292. data/lib/rio/piper/cp.rb +81 -0
  293. data/lib/rio/rectype.rb +2 -2
  294. data/lib/rio/rl/base.rb +40 -17
  295. data/lib/rio/rl/builder.rb +8 -47
  296. data/lib/rio/rl/ioi.rb +3 -2
  297. data/lib/rio/rl/path.rb +101 -78
  298. data/lib/rio/rl/pathmethods.rb +95 -0
  299. data/lib/rio/rl/uri.rb +41 -51
  300. data/lib/rio/scheme/cmdio.rb +7 -1
  301. data/lib/rio/scheme/cmdpipe.rb +150 -0
  302. data/lib/rio/scheme/ftp.rb +0 -4
  303. data/lib/rio/scheme/http.rb +0 -2
  304. data/lib/rio/scheme/strio.rb +16 -0
  305. data/lib/rio/scheme/temp.rb +7 -7
  306. data/lib/rio/state.rb +23 -5
  307. data/lib/rio/stream.rb +4 -0
  308. data/lib/rio/stream/duplex.rb +1 -0
  309. data/lib/rio/stream/open.rb +8 -2
  310. data/lib/rio/version.rb +1 -1
  311. data/test/{runtests_gem.rb → gem_runtests.rb} +0 -0
  312. data/test/methods/path.rb +12 -0
  313. data/test/runtests.rb +2 -0
  314. data/test/tc/abs.rb +29 -27
  315. data/test/tc/all.rb +9 -3
  316. data/test/tc/base.rb +31 -0
  317. data/test/tc/cmdpipe.rb +146 -0
  318. data/test/tc/copydir.rb +2 -1
  319. data/test/tc/create.rb +10 -0
  320. data/test/tc/csv.rb +12 -12
  321. data/test/tc/csv2.rb +2 -2
  322. data/test/tc/csv_columns.rb +3 -3
  323. data/test/tc/each_break.rb +21 -8
  324. data/test/tc/expand_path.rb +21 -27
  325. data/test/tc/misc.rb +0 -1
  326. data/test/tc/noqae.rb +29 -21
  327. data/test/tc/overload.rb +14 -11
  328. data/test/tc/piper.rb +146 -0
  329. data/test/tc/riorl.rb +26 -17
  330. data/test/tc/route.rb +51 -0
  331. data/test/tc/skip.rb +8 -6
  332. data/test/tc/split.rb +70 -0
  333. data/test/tc/temp.rb +5 -5
  334. data/test/tc/testcase.rb +1 -0
  335. data/test/tc/yaml.rb +118 -0
  336. metadata +481 -229
  337. data/doc/README_MSWIN32.txt +0 -39
  338. data/ex/colx.rb +0 -8
  339. data/ex/findinruby +0 -23
  340. data/ex/findruby +0 -15
  341. data/ex/passwd_report.rb +0 -8
  342. data/ex/prompt.rb +0 -25
  343. data/ex/rgb.txt.gz +0 -0
  344. data/ex/riocat +0 -35
  345. data/ex/riogunzip +0 -31
  346. data/ex/riogzip +0 -24
  347. data/ex/rioprompt.rb +0 -6
  348. data/ex/tolf +0 -11
  349. data/test/mswin32.rb +0 -28
@@ -0,0 +1,1613 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Module: RIO::Doc::INTRO</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td class="class-mod"><strong>Module</strong></td>
53
+ <td class="class-name-in-header">RIO::Doc::INTRO</td>
54
+ <td rowspan="2" class="class-header-space-col"></td>
55
+ <td rowspan="2">
56
+ <a class="in-url" href="../../../files/lib/rio/doc/INTRO_rb.html">
57
+ lib/rio/doc/INTRO.rb
58
+ </a>
59
+ &nbsp;&nbsp;
60
+ </td>
61
+ </tr>
62
+
63
+ </table>
64
+ </div>
65
+ <!-- banner header -->
66
+
67
+ <div id="bodyContent">
68
+
69
+
70
+
71
+ <div id="contextContent">
72
+
73
+ <div id="description">
74
+ <h1><a href="../Rio.html">Rio</a> - Ruby I/O Comfort Class</h1>
75
+ <p>
76
+ <a href="../Rio.html">Rio</a> is a convenience class wrapping much of the
77
+ functionality of IO, File, Dir, Pathname, FileUtils, Tempfile, StringIO,
78
+ and OpenURI and uses Zlib, and CSV to extend that functionality using a
79
+ simple consistent interface. Most of the instance methods of IO, File and
80
+ Dir are simply forwarded to the appropriate handle to provide identical
81
+ functionality. <a href="../Rio.html">Rio</a> also provides a
82
+ &quot;grande&quot; interface that allows many application level IO tasks to
83
+ be accomplished in line or two of code.
84
+ </p>
85
+ <p>
86
+ <a href="../Rio.html">Rio</a> functionality can be broadly broken into
87
+ three categories
88
+ </p>
89
+ <ul>
90
+ <li>path manipulation
91
+
92
+ </li>
93
+ <li>file system access
94
+
95
+ </li>
96
+ <li>stream manipulation
97
+
98
+ </li>
99
+ </ul>
100
+ <p>
101
+ Which methods are available to a given <a href="../Rio.html">Rio</a>,
102
+ depends on the underlying object.
103
+ </p>
104
+ <p>
105
+ A <a href="../Rio.html">Rio</a> generally does not need to be opened or
106
+ have its mode specified. Most of <a href="../Rio.html">Rio</a>&#8217;s
107
+ methods simply configure it. When an actual IO operation is specified, <a
108
+ href="../Rio.html">Rio</a> determines how to open it based on the object it
109
+ is opening, the operation it is performing, and the options specified.
110
+ </p>
111
+ <p>
112
+ <a href="../Rio.html">Rio</a> configuration methods return the <a
113
+ href="../Rio.html">Rio</a> for easy chaining and regard the presence of a
114
+ block as an implied <tt>each</tt>.
115
+ </p>
116
+ <h2>Using a <a href="../Rio.html">Rio</a></h2>
117
+ <p>
118
+ Using a <a href="../Rio.html">Rio</a> can be described as having 3 steps:
119
+ </p>
120
+ <ul>
121
+ <li>Creating a <a href="../Rio.html">Rio</a> (using the constructor or as the
122
+ result of one of the path manipulation methods)
123
+
124
+ </li>
125
+ <li>Configuring a <a href="../Rio.html">Rio</a>
126
+
127
+ </li>
128
+ <li><a href="../Rio.html">Rio</a> I/O
129
+
130
+ </li>
131
+ </ul>
132
+ <h3>Creating a <a href="../Rio.html">Rio</a></h3>
133
+ <p>
134
+ <a href="../Rio.html">Rio</a> extends <a
135
+ href="../../Kernel.html">Kernel</a> with one function <tt>rio</tt>, its
136
+ constructor. This function is overloaded to create any type of <a
137
+ href="../Rio.html">Rio</a>. <tt>rio</tt> looks at the class and sometimes
138
+ the value of its first argument to create an internal representation of the
139
+ resource specified, additional arguments are used as needed by the resource
140
+ type. The rio constructor does not initiate any io, it does not check for a
141
+ resources existance or type. It neither knows nor cares what can be done
142
+ with this <a href="../Rio.html">Rio</a>. Using methods like
143
+ <tt>respond_to?</tt> are meaningless at best and usually misleading.
144
+ </p>
145
+ <p>
146
+ For purposes of discussion, we divide Rios into two catagories, those that
147
+ have a path and those that don&#8217;t.
148
+ </p>
149
+ <h4>Creating a <a href="../Rio.html">Rio</a> that has a path</h4>
150
+ <p>
151
+ To create a <a href="../Rio.html">Rio</a> that has a path the arguments to
152
+ <tt>rio</tt> may be:
153
+ </p>
154
+ <ul>
155
+ <li>a string representing the entire path. The separator used for Rios is as
156
+ specified in RFC1738 (&#8217;/&#8217;).
157
+
158
+ <pre>
159
+ rio('adir/afile')
160
+ </pre>
161
+ </li>
162
+ <li>a string representing a fully qualified <tt>file</tt> URI as per RFC1738
163
+
164
+ <pre>
165
+ rio('file:///atopleveldir/adir/afile')
166
+ </pre>
167
+ </li>
168
+ <li>a <tt>URI</tt> object representing a <tt>file</tt> or generic <tt>URI</tt>
169
+
170
+ <pre>
171
+ rio(URI('adir/afile'))
172
+ </pre>
173
+ </li>
174
+ <li>the components of a path as separate arguments
175
+
176
+ <pre>
177
+ rio('adir','afile')
178
+ </pre>
179
+ </li>
180
+ <li>the components of a path as an array
181
+
182
+ <pre>
183
+ rio(%w/adir afile/)
184
+ </pre>
185
+ </li>
186
+ <li>another <a href="../Rio.html">Rio</a>
187
+
188
+ <pre>
189
+ another_rio = rio('adir/afile')
190
+ rio(another_rio)
191
+ </pre>
192
+ </li>
193
+ <li>any object whose <tt>to_s</tt> method returns one of the above
194
+
195
+ <pre>
196
+ rio(Pathname.new('apath'))
197
+ </pre>
198
+ </li>
199
+ <li>any combination of the above either as separate arguments or as elements of
200
+ an array,
201
+
202
+ <pre>
203
+ another_rio = rio('dir1/dir2')
204
+ auri = URI('dir4/dir5)
205
+ rio(another_rio,'dir3',auri,'dir6/dir7')
206
+ </pre>
207
+ </li>
208
+ </ul>
209
+ <h5>Creating a <a href="../Rio.html">Rio</a> that refers to a web page</h5>
210
+ <p>
211
+ To create a <a href="../Rio.html">Rio</a> that refers to a web page the
212
+ arguments to <tt>rio</tt> may be:
213
+ </p>
214
+ <ul>
215
+ <li>a string representing a fully qualified <tt>http</tt> URI
216
+
217
+ <pre>
218
+ rio('http://ruby-doc.org/index.html')
219
+ </pre>
220
+ </li>
221
+ <li>a <tt>URI</tt> object representing a <tt>http</tt> <tt>URI</tt>
222
+
223
+ <pre>
224
+ rio(URI('http://ruby-doc.org/index.html'))
225
+ </pre>
226
+ </li>
227
+ <li>either of the above with additional path elements
228
+
229
+ <pre>
230
+ rio('http://www.ruby-doc.org/','core','classes/Object.html')
231
+ </pre>
232
+ </li>
233
+ </ul>
234
+ <h5>Creating a <a href="../Rio.html">Rio</a> that refers to a file or directory on a FTP server</h5>
235
+ <p>
236
+ To create a <a href="../Rio.html">Rio</a> that refers to a file on a FTP
237
+ server the arguments to <tt>rio</tt> may be:
238
+ </p>
239
+ <ul>
240
+ <li>a string representing a fully qualified <tt>ftp</tt> URI
241
+
242
+ <pre>
243
+ rio('ftp://user:password@ftp.example.com/afile.tar.gz')
244
+ </pre>
245
+ </li>
246
+ <li>a <tt>URI</tt> object representing a <tt>ftp</tt> <tt>URI</tt>
247
+
248
+ <pre>
249
+ rio(URI('ftp://ftp.example.com/afile.tar.gz'))
250
+ </pre>
251
+ </li>
252
+ <li>either of the above with additional path elements
253
+
254
+ <pre>
255
+ rio('ftp://ftp.gnu.org/pub/gnu','emacs','windows','README')
256
+ </pre>
257
+ </li>
258
+ </ul>
259
+ <h4>Creating Rios that do not have a path</h4>
260
+ <p>
261
+ To create a <a href="../Rio.html">Rio</a> without a path, the first
262
+ argument to <tt>rio</tt> is usually a single character.
263
+ </p>
264
+ <h5>Creating a <a href="../Rio.html">Rio</a> that refers to a clone of your programs stdin or stdout.</h5>
265
+ <p>
266
+ <tt>rio(?-)</tt> (mnemonic: &#8217;-&#8217; is used by some Unix programs
267
+ to specify stdin or stdout in place of a file)
268
+ </p>
269
+ <p>
270
+ Just as a <a href="../Rio.html">Rio</a> that refers to a file, does not
271
+ know whether that file will be opened for reading or writing until an io
272
+ operation is specified, a <tt>stdio:</tt> <a href="../Rio.html">Rio</a>
273
+ does not know whether it will connect to stdin or stdout until an I/O
274
+ operation is specified.
275
+ </p>
276
+ <h5>Creating a <a href="../Rio.html">Rio</a> that refers to a clone of your programs stderr.</h5>
277
+ <p>
278
+ <tt>rio(?=)</tt> (mnemonic: &#8217;-&#8217; refers to fileno 1, so
279
+ &#8217;=&#8217; refers to fileno 2)
280
+ </p>
281
+ <h5>Creating a <a href="../Rio.html">Rio</a> that refers to an arbitrary IO object.</h5>
282
+ <pre>
283
+ an_io = ::File.new('afile')
284
+ rio(an_io)
285
+ </pre>
286
+ <h5>Creating a <a href="../Rio.html">Rio</a> that refers to a file descriptor</h5>
287
+ <p>
288
+ <tt>rio(?#,fd)</tt> (mnemonic: a file descriptor is a number
289
+ &#8217;#&#8217; )
290
+ </p>
291
+ <pre>
292
+ an_io = ::File.new('afile')
293
+ rio(an_io)
294
+ </pre>
295
+ <h5>Creating a <a href="../Rio.html">Rio</a> that refers to a StringIO object</h5>
296
+ <p>
297
+ <tt>rio(?&quot;)</tt> (mnemonic: &#8217;&quot;&#8217; surrounds strings)
298
+ </p>
299
+ <ul>
300
+ <li>create a <a href="../Rio.html">Rio</a> that refers to its own string
301
+
302
+ </li>
303
+ </ul>
304
+ <pre>
305
+ rio(?&quot;)
306
+ </pre>
307
+ <ul>
308
+ <li>create a <a href="../Rio.html">Rio</a> that refers to a string of your
309
+ choosing
310
+
311
+ </li>
312
+ </ul>
313
+ <pre>
314
+ astring = &quot;&quot;
315
+ rio(?&quot;,&quot;&quot;)
316
+ </pre>
317
+ <h5>Creating a <a href="../Rio.html">Rio</a> that refers to a Temporary object</h5>
318
+ <p>
319
+ <tt>rio(??)</tt> (mnemonic: &#8217;?&#8217; you don&#8217;t know its name)
320
+ </p>
321
+ <p>
322
+ To create a temporary object that will become a file or a directory,
323
+ depending on how you use it:
324
+ </p>
325
+ <pre>
326
+ rio(??)
327
+ rio(??,basename='rio',tmpdir=Dir::tmpdir)
328
+ </pre>
329
+ <p>
330
+ To force it to become a file
331
+ </p>
332
+ <pre>
333
+ rio(??).file
334
+ </pre>
335
+ <p>
336
+ or just write to it.
337
+ </p>
338
+ <p>
339
+ To force it to become a directory:
340
+ </p>
341
+ <pre>
342
+ rio(??).dir
343
+ </pre>
344
+ <p>
345
+ or
346
+ </p>
347
+ <pre>
348
+ rio(??).mkdir
349
+ </pre>
350
+ <p>
351
+ or
352
+ </p>
353
+ <pre>
354
+ rio(??).chdir
355
+ </pre>
356
+ <h5>Creating a <a href="../Rio.html">Rio</a> that refers to an arbitrary TCPSocket</h5>
357
+ <pre>
358
+ rio('tcp:',hostname,port)
359
+ </pre>
360
+ <p>
361
+ or
362
+ </p>
363
+ <pre>
364
+ rio('tcp://hostname:port')
365
+ </pre>
366
+ <h5>Creating a <a href="../Rio.html">Rio</a> that runs an external program and connects to its</h5>
367
+ <pre>
368
+ stdin and stdout
369
+ </pre>
370
+ <p>
371
+ <tt>rio(?-,cmd)</tt> (mnemonic: &#8217;-&#8217; is used by some Unix
372
+ programs to specify stdin or stdout in place of a file)
373
+ </p>
374
+ <p>
375
+ or
376
+ </p>
377
+ <p>
378
+ <tt>rio(?`,cmd)</tt> (mnemonic: &#8217;`&#8217; (backtick) runs an external
379
+ program in ruby)
380
+ </p>
381
+ <p>
382
+ This is <a href="../Rio.html">Rio</a>&#8217;s interface to IO#popen
383
+ </p>
384
+ <h3>Path Manipulation</h3>
385
+ <p>
386
+ <a href="../Rio.html">Rio</a>&#8217;s path manipulation methods are for the
387
+ most part simply forwarded to the File or URI classes with the return
388
+ values converted to a <a href="../Rio.html">Rio</a>.
389
+ </p>
390
+ <h4>Creating a <a href="../Rio.html">Rio</a> from a <a href="../Rio.html">Rio</a>&#8217;s component parts.</h4>
391
+ <p>
392
+ The <a href="../Rio.html">Rio</a> methods for creating a <a
393
+ href="../Rio.html">Rio</a> from a <a href="../Rio.html">Rio</a>&#8217;s
394
+ component parts are <a href="../Rio.html#M000119">Rio#dirname</a>, <a
395
+ href="../Rio.html#M000121">Rio#filename</a>, <a
396
+ href="../Rio.html#M000118">Rio#basename</a>, and <a
397
+ href="../Rio.html#M000120">Rio#extname</a>. The behavior of <a
398
+ href="../Rio.html#M000118">Rio#basename</a> depends on the setting of the
399
+ <tt>ext</tt> configuration variable and is different from its counterpart
400
+ in the File class. The default value of the <tt>ext</tt> configuration
401
+ variable is the string returned File#extname. The <tt>ext</tt>
402
+ configuration variable can be changed using <a
403
+ href="../Rio.html#M000115">Rio#ext</a> and <a
404
+ href="../Rio.html#M000116">Rio#noext</a> and can be queried using <a
405
+ href="../Rio.html#M000115">Rio#ext</a>?. This value is used by calls to <a
406
+ href="../Rio.html#M000118">Rio#basename</a>.
407
+ </p>
408
+ <p>
409
+ <a href="../Rio.html#M000121">Rio#filename</a> returns the last component
410
+ of a path, and is basically the same as <tt>basename</tt> without
411
+ consideration of an extension.
412
+ </p>
413
+ <pre>
414
+ rio('afile.txt').basename #=&gt; rio('afile')
415
+ rio('afile.txt').filename #=&gt; rio('afile.txt')
416
+
417
+ ario = rio('afile.tar.gz')
418
+ ario.basename #=&gt; rio('afile.tar')
419
+ ario.ext? #=&gt; &quot;.gz&quot;
420
+ ario.ext('.tar.gz').basename #=&gt; rio('afile')
421
+ ario.ext? #=&gt; &quot;.tar.gz&quot;
422
+ </pre>
423
+ <h4>Changing a path&#8217;s component parts.</h4>
424
+ <p>
425
+ <a href="../Rio.html">Rio</a> also provides methods for changing the
426
+ component parts of its path. They are <a
427
+ href="../Rio.html#M000119">Rio#dirname</a>=, <a
428
+ href="../Rio.html#M000121">Rio#filename</a>=, <a
429
+ href="../Rio.html#M000118">Rio#basename</a>=, and <a
430
+ href="../Rio.html#M000120">Rio#extname</a>=. These methods replace the part
431
+ extracted as described above with their argument.
432
+ </p>
433
+ <pre>
434
+ ario = rio('dirA/dirB/afile.rb')
435
+ ario.dirname = 'dirC' # rio('dirC/afile.rb')
436
+ ario.basename = 'bfile' # rio('dirC/bfile.rb')
437
+ ario.extname = '.txt' # rio('dirC/bfile.txt')
438
+ ario.filename = 'cfile.rb' # rio('dirC/cfile.rb')
439
+ </pre>
440
+ <p>
441
+ <a href="../Rio.html">Rio</a> also has a <tt>rename</tt> mode which causes
442
+ each of these to rename the actual file system object as well as changing
443
+ the <a href="../Rio.html">Rio</a>. This is discussed in the section on
444
+ Renaming and Moving.
445
+ </p>
446
+ <h4>Splitting a <a href="../Rio.html">Rio</a></h4>
447
+ <p>
448
+ <a href="../Rio.html#M000127">Rio#split</a> returns an array of Rios, one
449
+ for each path element. (Note that this behavior differs from File#split.)
450
+ </p>
451
+ <pre>
452
+ rio('a/b/c').split #=&gt; [rio('a'),rio('b'),rio('c')]
453
+ </pre>
454
+ <p>
455
+ The array returned is extended wwith a <tt>to_rio</tt> method, which will
456
+ put the parts back together again.
457
+ </p>
458
+ <pre>
459
+ ary = rio('a/b/c').split #=&gt; [rio('a'),rio('b'),rio('c')]
460
+ ary.to_rio #=&gt; rio('a/b/c')
461
+ </pre>
462
+ <h4>Creating a <a href="../Rio.html">Rio</a> by specifying the individual parts of its path</h4>
463
+ <p>
464
+ The first way to create a <a href="../Rio.html">Rio</a> by specifying its
465
+ parts is to use the <a href="../Rio.html">Rio</a> constructor <a
466
+ href="../Rio.html#M000020">Rio#rio</a>. Since a <a
467
+ href="../Rio.html">Rio</a> is among the arguments the constructor will
468
+ take, the constructor can be used.
469
+ </p>
470
+ <pre>
471
+ ario = rio('adir')
472
+ rio(ario,'b') #=&gt; rio('adir/b')
473
+ </pre>
474
+ <p>
475
+ <a href="../Rio.html#M000126">Rio#join</a> and <a
476
+ href="../Rio.html">Rio</a>#/ do the same thing, but the operator version
477
+ <tt>/</tt> can take only one argument.
478
+ </p>
479
+ <pre>
480
+ a = rio('a')
481
+ b = rio('b')
482
+ c = a.join(b) #=&gt; rio('a/b')
483
+ c = a/b #=&gt; rio('a/b')
484
+ </pre>
485
+ <p>
486
+ The arguments to <tt>join</tt> and <tt>/</tt> do not need to be Rios, of
487
+ course
488
+ </p>
489
+ <pre>
490
+ ario = rio('adir')
491
+ ario/'afile.rb' #=&gt; rio('ario/afile.rb')
492
+ ario.join('b','c','d') #=&gt; rio('ario/b/c/d')
493
+ ario/'b'/'c'/'d' #=&gt; rio('ario/b/c/d')
494
+ ario /= 'e' #=&gt; rio('ario/b/c/d/e')
495
+ </pre>
496
+ <h4>Manipulating a <a href="../Rio.html">Rio</a> path by treating it as a string.</h4>
497
+ <p>
498
+ The <a href="../Rio.html">Rio</a> methods which treat a <a
499
+ href="../Rio.html">Rio</a> as a string are <a
500
+ href="../Rio.html#M000130">Rio#sub</a>, <a
501
+ href="../Rio.html#M000131">Rio#gsub</a> and <a
502
+ href="../Rio.html">Rio</a>#+. These methods create a new <a
503
+ href="../Rio.html">Rio</a> using the string created by forwarding the
504
+ method to the String returned by <a
505
+ href="../Rio.html#M000021">Rio#to_s</a>.
506
+ </p>
507
+ <pre>
508
+ ario = rio('dirA/dirB/afile') + '-1.1.1' # rio('dirA/dirB/afile-1.1.1')
509
+ brio = ario.sub(/^dirA/, 'dirC') # rio('dirC/dirB/afile-1.1.1')
510
+ </pre>
511
+ <h4>Creating a <a href="../Rio.html">Rio</a> based on its relationship to another</h4>
512
+ <p>
513
+ <a href="../Rio.html#M000112">Rio#abs</a> creates a new rio whose path is
514
+ the absolute path of a <a href="../Rio.html">Rio</a>. If provided with an
515
+ argument, it uses that as the base path, otherwise it uses an internal base
516
+ path (usually the current working directory when it was created).
517
+ </p>
518
+ <pre>
519
+ rio('/tmp').chdir do
520
+ rio('a').abs #=&gt; rio('/tmp/a')
521
+ rio('a').abs('/usr') #=&gt; rio('/usr/a')
522
+ end
523
+ </pre>
524
+ <p>
525
+ <a href="../Rio.html#M000113">Rio#rel</a> creates a new rio with a path
526
+ relative to a <a href="../Rio.html">Rio</a>.
527
+ </p>
528
+ <pre>
529
+ rio('/tmp').chdir do
530
+ rio('/tmp/a').rel #=&gt; rio('a')
531
+ end
532
+ rio('/tmp/b').rel('/tmp') #=&gt; rio('b')
533
+ </pre>
534
+ <p>
535
+ <a href="../Rio.html#M000138">Rio#route_to</a> and <a
536
+ href="../Rio.html#M000137">Rio#route_from</a> creates a new rio with a path
537
+ representing the route to get to/from a <a href="../Rio.html">Rio</a>. They
538
+ are based on the methods of the same names in the URI class
539
+ </p>
540
+ <h3>Configuring a <a href="../Rio.html">Rio</a></h3>
541
+ <p>
542
+ The second step in using a rio is configuring it. Note that many times no
543
+ configuration is necessary and that this is not a comprehensive list of all
544
+ of <a href="../Rio.html">Rio</a>&#8217;s configuration methods.
545
+ </p>
546
+ <p>
547
+ <a href="../Rio.html">Rio</a>&#8217;s configuration mehods fall into three
548
+ categories.
549
+ </p>
550
+ <p>
551
+ [IO manipulators]
552
+ </p>
553
+ <pre>
554
+ An IO manipulator alters the behavior of a Rio's underlying IO
555
+ object. These affect the behaviour of I/O methods which are
556
+ forwarded directly to the underlying object as well as the grande
557
+ I/O methods.
558
+ </pre>
559
+ <p>
560
+ [Grande configuration methods]
561
+ </p>
562
+ <pre>
563
+ The grande configuration methods affect the behaviour of Rio's
564
+ grande I/O methods
565
+ </pre>
566
+ <p>
567
+ [Grande selection methods]
568
+ </p>
569
+ <pre>
570
+ The grande selection methods select what data is returned by Rio's
571
+ grande I/O methods
572
+ </pre>
573
+ <p>
574
+ All of <a href="../Rio.html">Rio</a>&#8217;s configuration and selection
575
+ methods can be passed a block, which will cause the <a
576
+ href="../Rio.html">Rio</a> to behave as if <tt>each</tt> had been called
577
+ with the block after the method.
578
+ </p>
579
+ <h4>IO manipulators</h4>
580
+ <ul>
581
+ <li><tt>gzip</tt> a file on output, and ungzip it on input
582
+
583
+ <pre>
584
+ rio('afile.gz').gzip
585
+ </pre>
586
+ <p>
587
+ This causes the rio to read through a Zlib::GzipReader and to write
588
+ Zlib::GzipWriter.
589
+ </p>
590
+ </li>
591
+ <li><tt>chomp</tt> lines as they are read
592
+
593
+ <pre>
594
+ rio('afile').chomp
595
+ </pre>
596
+ <p>
597
+ This causes a <a href="../Rio.html">Rio</a> to call String#chomp on the the
598
+ String returned by all line oriented read operations.
599
+ </p>
600
+ </li>
601
+ </ul>
602
+ <h4>Grande configuration methods</h4>
603
+ <ul>
604
+ <li><tt>all</tt>, <tt>recurse</tt>, <tt>norecurse</tt>
605
+
606
+ <pre>
607
+ rio('adir').all
608
+ rio('adir').norecurse('CVS')
609
+ </pre>
610
+ <p>
611
+ These methods instruct the <a href="../Rio.html">Rio</a> to also include
612
+ entries in subdirectories when iterating through directories and control
613
+ which subdirectories are included or excluded.
614
+ </p>
615
+ </li>
616
+ <li><tt>bytes</tt>
617
+
618
+ <pre>
619
+ rio('afile').bytes(1024)
620
+ </pre>
621
+ <p>
622
+ This causes a <a href="../Rio.html">Rio</a> to read the specified number of
623
+ bytes at a time as a file is iterated through.
624
+ </p>
625
+ </li>
626
+ </ul>
627
+ <h4>Grande selection methods</h4>
628
+ <ul>
629
+ <li><tt>lines</tt>, <tt>skiplines</tt>
630
+
631
+ <pre>
632
+ rio('afile').lines(0..9)
633
+ rio('afile').skiplines(/^\s*#/)
634
+ </pre>
635
+ <p>
636
+ Strictly speaking these are both configuration and selection methods. They
637
+ configure the <a href="../Rio.html">Rio</a> to iterate through an input
638
+ stream as lines. The arguments select which lines are actually returned.
639
+ Lines are included (<tt>lines</tt>) or excluded (<tt>skiplines</tt>) if
640
+ they match <b>any</b> of the arguments as follows.
641
+ </p>
642
+ <p>
643
+ If the argument is a:
644
+ </p>
645
+ <table>
646
+ <tr><td valign="top"><tt>RegExp</tt>:</td><td>the line is matched against it
647
+
648
+ </td></tr>
649
+ <tr><td valign="top"><tt>Range</tt>:</td><td>the lineno is matched against it
650
+
651
+ </td></tr>
652
+ <tr><td valign="top"><tt>Integer</tt>:</td><td>the lineno is matched against it as if it were a one element range
653
+
654
+ </td></tr>
655
+ <tr><td valign="top"><tt>Symbol</tt>:</td><td>the symbol is <tt>sent</tt> to the string; the line is included unless it
656
+ returns false
657
+
658
+ </td></tr>
659
+ <tr><td valign="top"><tt>Proc</tt>:</td><td>the proc is called with the line as an argument; the line is included
660
+ unless it returns false
661
+
662
+ </td></tr>
663
+ <tr><td valign="top"><tt>Array</tt>:</td><td>an array containing any of the above, all of which must match for the line
664
+ to be included
665
+
666
+ </td></tr>
667
+ </table>
668
+ </li>
669
+ <li><tt>entries</tt>, <tt>files</tt>, <tt>dirs</tt>, <tt>skipentries</tt>,
670
+ <tt>skipfiles</tt>, <tt>skipdirs</tt>
671
+
672
+ <pre>
673
+ rio('adir').files('*.txt')
674
+ rio('adir').skipfiles(/^\./)
675
+ </pre>
676
+ <p>
677
+ These methods select which entries will be returned when iterating throug
678
+ directories. Entries are included
679
+ (<tt>entries</tt>,<tt>files</tt>,<tt>dirs</tt>) or
680
+ excluded(<tt>skipentries</tt>,<tt>skipfiles</tt>,<tt>skipdirs</tt>) if they
681
+ match <b>any</b> of the arguments as follows.
682
+ </p>
683
+ <p>
684
+ If the argument is a:
685
+ </p>
686
+ <table>
687
+ <tr><td valign="top"><tt>String</tt>:</td><td>the arg is treated as a glob; the filname is matched against it
688
+
689
+ </td></tr>
690
+ <tr><td valign="top"><tt>RegExp</tt>:</td><td>the filname is matched against it
691
+
692
+ </td></tr>
693
+ <tr><td valign="top"><tt>Symbol</tt>:</td><td>the symbol is <tt>sent</tt> to the entry (a <a href="../Rio.html">Rio</a>);
694
+ the entry is included unless it returns false
695
+
696
+ </td></tr>
697
+ <tr><td valign="top"><tt>Proc</tt>:</td><td>the proc is called with the entry (a <a href="../Rio.html">Rio</a>) as an
698
+ argument; the entry is included unless it returns false
699
+
700
+ </td></tr>
701
+ <tr><td valign="top"><tt>Array</tt>:</td><td>an array containing any of the above, all of which must match for the line
702
+ to be included
703
+
704
+ </td></tr>
705
+ </table>
706
+ </li>
707
+ <li><tt>records</tt>, <tt>rows</tt>, <tt>skiprecords</tt>, <tt>skiprows</tt>
708
+
709
+ <pre>
710
+ rio('afile').bytes(1024).records(0...10)
711
+ </pre>
712
+ <p>
713
+ These select items from an input stream just as <tt>lines</tt>, but without
714
+ specifying lines as the input record type. They can be used to select
715
+ different record types in extension modules. The only such module at this
716
+ writing is the CSV extension. In that case <tt>records</tt> causes each
717
+ line of a CSV file to be parsed into an array while <tt>lines</tt> causes
718
+ each line of the file to be returned normally.
719
+ </p>
720
+ </li>
721
+ </ul>
722
+ <h3><a href="../Rio.html">Rio</a> I/O</h3>
723
+ <p>
724
+ As stated above the the three steps to using a <a
725
+ href="../Rio.html">Rio</a> are:
726
+ </p>
727
+ <ul>
728
+ <li>Creating a <a href="../Rio.html">Rio</a>
729
+
730
+ </li>
731
+ <li>Configuring a <a href="../Rio.html">Rio</a>
732
+
733
+ </li>
734
+ <li>Doing I/O
735
+
736
+ </li>
737
+ </ul>
738
+ <p>
739
+ This section describes that final step.
740
+ </p>
741
+ <p>
742
+ After creating and configuring a <a href="../Rio.html">Rio</a>, the
743
+ file-system has not been accessed, no socket has been opened, not so much
744
+ as a test for a files existance has been done. When an I/O method is called
745
+ on a <a href="../Rio.html">Rio</a>, the sequence of events required to
746
+ complete that operation on the underlying object takes place. <a
747
+ href="../Rio.html">Rio</a> takes care of creating the apropriate object (eg
748
+ IO,Dir), opening the object with the apropriate mode, performing the
749
+ operation, closing the object if required, and returning the results of the
750
+ operation.
751
+ </p>
752
+ <p>
753
+ <a href="../Rio.html">Rio</a>&#8217;s I/O operations can be divide into two
754
+ catagories:
755
+ </p>
756
+ <ul>
757
+ <li>Proxy operations
758
+
759
+ </li>
760
+ <li>Grande operations
761
+
762
+ </li>
763
+ </ul>
764
+ <h4>Proxy operations</h4>
765
+ <p>
766
+ These are calls which are forwarded to the underlying object (eg
767
+ IO,Dir,Net::FTP), after apropriately creating and configuring that object.
768
+ The result produced by the method is returned, and the object is closed.
769
+ </p>
770
+ <p>
771
+ In some cases the result is modified before being returned, as when a <a
772
+ href="../Rio.html">Rio</a> is configured with <tt>chomp</tt>.
773
+ </p>
774
+ <p>
775
+ In all cases, if the result returned by the underlying object, could itself
776
+ be used for further I/O operations it is returned as a <a
777
+ href="../Rio.html">Rio</a>. For example: where File#dirname returns a
778
+ string, <a href="../Rio.html#M000119">Rio#dirname</a> returns a <a
779
+ href="../Rio.html">Rio</a>; where Dir#read returns a string representing a
780
+ directory entry, <a href="../Rio.html#M000045">Rio#read</a> returns a <a
781
+ href="../Rio.html">Rio</a>.
782
+ </p>
783
+ <p>
784
+ With some noteable exceptions, most of the operations available if one were
785
+ using the underlying Ruby I/O class are available to the <a
786
+ href="../Rio.html">Rio</a> and will behave identically.
787
+ </p>
788
+ <p>
789
+ For things that exist on a file system:
790
+ </p>
791
+ <ul>
792
+ <li>All the methods in FileTest are available as <a href="../Rio.html">Rio</a>
793
+ instance methods. For example
794
+
795
+ <pre>
796
+ FileTest.file?('afile')
797
+ </pre>
798
+ <p>
799
+ becomes
800
+ </p>
801
+ <pre>
802
+ rio('afile').file?
803
+ </pre>
804
+ </li>
805
+ <li>All the instance methods of <tt>File</tt> except <tt>path</tt> are
806
+ available to a rio without change
807
+
808
+ </li>
809
+ <li>Most of the class methods of <tt>File</tt> are available.
810
+
811
+ <ul>
812
+ <li>For those that take a filename as their only argument the calls are mapped
813
+ to <a href="../Rio.html">Rio</a> instance methods as described above for
814
+ FileTest.
815
+
816
+ </li>
817
+ <li><tt>dirname</tt>, and <tt>readlink</tt> return Rios instead of strings
818
+
819
+ </li>
820
+ <li><a href="../Rio.html">Rio</a> has its own <a
821
+ href="../Rio.html#M000118">Rio#basename</a>, <a
822
+ href="../Rio.html#M000126">Rio#join</a> and <a
823
+ href="../Rio.html#M000041">Rio#symlink</a>, which provide similar
824
+ functionality.
825
+
826
+ </li>
827
+ <li>The class methods which take multiple filenames
828
+ (<tt>chmod</tt>,<tt>chown</tt>,<tt>lchmod</tt>,<tt>lchown</tt>) are
829
+ available as <a href="../Rio.html">Rio</a> instance methods. For example
830
+
831
+ <pre>
832
+ File.chmod(0666,'afile')
833
+ </pre>
834
+ <p>
835
+ becomes
836
+ </p>
837
+ <pre>
838
+ rio('afile').chmod(06660)
839
+ </pre>
840
+ </li>
841
+ </ul>
842
+ </li>
843
+ </ul>
844
+ <p>
845
+ For I/O Streams
846
+ </p>
847
+ <p>
848
+ Most of the instance methods of IO are available, and most do the same
849
+ thing, with some interface changes. <b>The big exception to this is the
850
+ &#8217;&lt;&lt;&#8217; operator.</b> This is one of <a
851
+ href="../Rio.html">Rio</a>&#8217;s grande operators. While the symantics
852
+ one would use to write to an IO object would actually accomplish the same
853
+ thing with a <a href="../Rio.html">Rio</a>, It is a very different
854
+ operator. Read the section on grande operators. The other differences
855
+ between IO instance methods and the <a href="../Rio.html">Rio</a>
856
+ equivelence can be summarized as follows.
857
+ </p>
858
+ <ul>
859
+ <li>The simple instance methods (eg <tt>fcntl</tt>, <tt>eof?</tt>,
860
+ <tt>tty?</tt> etc.) are forwarded and the result returned as is
861
+
862
+ </li>
863
+ <li>Anywhere IO returns an IO, <a href="../Rio.html">Rio</a> returns a <a
864
+ href="../Rio.html">Rio</a>
865
+
866
+ </li>
867
+ <li><tt>close</tt> and its cousins return the <a href="../Rio.html">Rio</a>.
868
+
869
+ </li>
870
+ <li><tt>each_byte</tt> and <tt>each_line</tt> are forwarded as is.
871
+
872
+ </li>
873
+ <li>All methods which read (read*,get*,each*) will cause the file to closed
874
+ when the end of file is reached. This behavior is configurable, but the
875
+ default is to close on eof
876
+
877
+ </li>
878
+ <li>The methods which write (put*,print*) are forwarded as is; put* and print*
879
+ return the <a href="../Rio.html">Rio</a>; write returns the value returned
880
+ by IO#write; as mentioned above &#8217;&lt;&lt;&#8217; is a grande operator
881
+ in <a href="../Rio.html">Rio</a>.
882
+
883
+ </li>
884
+ </ul>
885
+ <p>
886
+ For directories:
887
+ </p>
888
+ <ul>
889
+ <li>all the instance methods of Dir are available except <tt>each</tt> which is
890
+ a grande method.
891
+
892
+ </li>
893
+ <li>the class methods <tt>mkdir</tt>, <tt>delete</tt>, <tt>rmdir</tt> are
894
+ provided as instance methods.
895
+
896
+ </li>
897
+ <li><tt>chdir</tt> is provided as an instance method. <a
898
+ href="../Rio.html#M000031">Rio#chdir</a> returns a <a
899
+ href="../Rio.html">Rio</a> and passes a <a href="../Rio.html">Rio</a> to a
900
+ block if one is provided.
901
+
902
+ </li>
903
+ <li><tt>glob</tt> is provided as an instance method, but returns an array of
904
+ Rios
905
+
906
+ </li>
907
+ <li><tt>foreach</tt> is not supported
908
+
909
+ </li>
910
+ <li><tt>each</tt> and <tt>[]</tt> have similar functionality provided by <a
911
+ href="../Rio.html">Rio</a>
912
+
913
+ </li>
914
+ </ul>
915
+ <p>
916
+ For other Rios, instance methods are generally forwarded where appropriate.
917
+ For example
918
+ </p>
919
+ <ul>
920
+ <li>Rios that refer to StringIO objects forward &#8216;string&#8217; and
921
+ &#8216;string=&#8217;
922
+
923
+ </li>
924
+ <li>Rios that refer to http URIs support all the Meta methods provided by
925
+ open-uri
926
+
927
+ </li>
928
+ </ul>
929
+ <h4>Grande operators</h4>
930
+ <p>
931
+ The primary grande operator is <a href="../Rio.html#M000052">Rio#each</a>.
932
+ <tt>each</tt> is used to iterate through Rios. When applied to a file it
933
+ iterates through records in the file. When applied to a directory it
934
+ iterates through the entries in the directory. Its behavior is modified by
935
+ configuring the <a href="../Rio.html">Rio</a> prior to calling it using the
936
+ configuration methods discussed above. Since iterating through things is
937
+ ubiquitous in ruby, it is implied by the presence of a block after any of
938
+ the grande configuration methods and many times does not need to be call
939
+ explicitly. For example:
940
+ </p>
941
+ <pre>
942
+ # iterate through chomped ruby comment lines
943
+ rio('afile.rb').chomp.lines(/^\s*#/) { |line| ... }
944
+
945
+ # iterate through all .rb files in 'adir' and its subdirectories
946
+ rio('adir').all.files('*.rb') { |f| ... }
947
+ </pre>
948
+ <p>
949
+ Because a <a href="../Rio.html">Rio</a> is an Enumerable, it supports
950
+ <tt>to_a</tt>, which is the basis for the grande subscript operator. <a
951
+ href="../Rio.html">Rio</a>#[] with no arguments simply calls to_a. With
952
+ arguments it behaves as if those arguments had been passed to the most
953
+ recently called of the grande selection methods listed above, and then
954
+ calls to_a. For example to get the first ten lines of a file into an array
955
+ with lines chomped
956
+ </p>
957
+ <pre>
958
+ rio('afile').chomp.lines(0...10).to_a
959
+ </pre>
960
+ <p>
961
+ can be written as
962
+ </p>
963
+ <pre>
964
+ rio('afile.gz').chomp.lines[0...10]
965
+ </pre>
966
+ <p>
967
+ or, to create an array of all the .c files in a directory, one could write
968
+ </p>
969
+ <pre>
970
+ rio('adir').files['*.c']
971
+ </pre>
972
+ <p>
973
+ The other grande operators are its copy operators. They are:
974
+ </p>
975
+ <ul>
976
+ <li><tt>&lt;</tt> (copy-from)
977
+
978
+ </li>
979
+ <li><tt>&lt;&lt;</tt> (append-from)
980
+
981
+ </li>
982
+ <li><tt>&gt;</tt> (copy-to)
983
+
984
+ </li>
985
+ <li><tt>&gt;&gt;</tt> (append-to)
986
+
987
+ </li>
988
+ </ul>
989
+ <p>
990
+ The only difference between the &#8216;copy&#8217; and &#8216;append&#8217;
991
+ versions is how they deal with an unopened resource. In the former the open
992
+ it with mode &#8216;w&#8217; and in the latter, mode &#8216;a&#8217;.
993
+ Beyond that, their behavior can be summarized as:
994
+ </p>
995
+ <pre>
996
+ source.each do |entry|
997
+ destination &lt;&lt; entry
998
+ end
999
+ </pre>
1000
+ <p>
1001
+ Since they are based on the <tt>each</tt> operator, all of the selection
1002
+ and configuration options are available. And the right-hand-side argument
1003
+ of the operators are not restricted to Rios &#8212; Strings and Arrays are
1004
+ also supported.
1005
+ </p>
1006
+ <p>
1007
+ For example:
1008
+ </p>
1009
+ <pre>
1010
+ rio('afile') &gt; astring # copy a file into a string
1011
+
1012
+ rio('afile').chomp &gt; anarray # copy the chomped lines of afile into an array
1013
+
1014
+ rio('afile.gz').gzip.lines(0...100) &gt; rio('bfile') # copy 100 lines from a gzipped file into another file
1015
+
1016
+ rio(?-) &lt; rio('http://rubydoc.org/') # copy a web page to stdout
1017
+
1018
+ rio('bdir') &lt; rio('adir') # copy an entire directory structure
1019
+
1020
+ rio('adir').dirs.files('README') &gt; rio('bdir') # same thing, but only README files
1021
+
1022
+ rio(?-,'ps -a').skiplines(0,/ps$/) &gt; anarray # copy the output of th ps command into an array, skippying
1023
+ # the header line and the ps command entry
1024
+ </pre>
1025
+ <h3>Renaming and Moving</h3>
1026
+ <p>
1027
+ <a href="../Rio.html">Rio</a> provides two methods for directly renaming
1028
+ objects on the filesystem: <a href="../Rio.html#M000043">Rio#rename</a> and
1029
+ <a href="../Rio.html#M000043">Rio#rename</a>!. Both of these use
1030
+ File#rename. The difference between them is the returned <a
1031
+ href="../Rio.html">Rio</a>. <a href="../Rio.html#M000043">Rio#rename</a>
1032
+ leaves the path of the <a href="../Rio.html">Rio</a> unchanged, while <a
1033
+ href="../Rio.html#M000043">Rio#rename</a>! changes the path of the <a
1034
+ href="../Rio.html">Rio</a> to refer to the renamed path.
1035
+ </p>
1036
+ <pre>
1037
+ ario = rio('a')
1038
+ ario.rename('b') # file 'a' has been renamed to 'b' but 'ario' =&gt; rio('a')
1039
+ ario.rename!('b') # file 'a' has been renamed to 'b' and 'ario' =&gt; rio('b')
1040
+ </pre>
1041
+ <p>
1042
+ <a href="../Rio.html">Rio</a> also has a <tt>rename</tt> mode, which causes
1043
+ the path manipulation methods <a
1044
+ href="../Rio.html#M000119">Rio#dirname</a>=, <a
1045
+ href="../Rio.html#M000121">Rio#filename</a>=, <a
1046
+ href="../Rio.html#M000118">Rio#basename</a>= and <a
1047
+ href="../Rio.html#M000120">Rio#extname</a>= to rename an object on the
1048
+ filesystem when they are used to change a <a
1049
+ href="../Rio.html">Rio</a>&#8217;s path. A <a href="../Rio.html">Rio</a> is
1050
+ put in <tt>rename</tt> mode by calling <a
1051
+ href="../Rio.html#M000043">Rio#rename</a> with no arguments.
1052
+ </p>
1053
+ <pre>
1054
+ rio('adir/afile.txt').rename.filename = 'bfile.rb' # adir/afile.txt =&gt; adir/bfile.rb
1055
+ rio('adir/afile.txt').rename.basename = 'bfile' # adir/afile.txt =&gt; adir/bfile.txt
1056
+ rio('adir/afile.txt').rename.extname = '.rb' # adir/afile.txt =&gt; adir/afile.rb
1057
+ rio('adir/afile.txt').rename.dirname = 'b/c' # adir/afile.txt =&gt; b/c/afile.txt
1058
+ </pre>
1059
+ <p>
1060
+ When <tt>rename</tt> mode is set for a directory <a
1061
+ href="../Rio.html">Rio</a>, it is automatically set in the Rios created
1062
+ when iterating through that directory.
1063
+ </p>
1064
+ <pre>
1065
+ rio('adir').rename.files('*.htm') do |frio|
1066
+ frio.extname = '.html' #=&gt; changes the rio and renames the file
1067
+ end
1068
+ </pre>
1069
+ <h3>Deleting</h3>
1070
+ <p>
1071
+ The <a href="../Rio.html">Rio</a> methods for deleting filesystem objects
1072
+ are <a href="../Rio.html#M000038">Rio#rm</a>, <a
1073
+ href="../Rio.html#M000034">Rio#rmdir</a>, <a
1074
+ href="../Rio.html#M000035">Rio#rmtree</a>, <a
1075
+ href="../Rio.html#M000053">Rio#delete</a>, and <a
1076
+ href="../Rio.html#M000053">Rio#delete</a>!. <tt>rm</tt>, <tt>rmdir</tt> and
1077
+ <tt>rmtree</tt> are passed the like named methods in the FileUtils module.
1078
+ <a href="../Rio.html#M000053">Rio#delete</a> calls <tt>rmdir</tt> for
1079
+ directories and <tt>rm</tt> for anything else, while <a
1080
+ href="../Rio.html#M000053">Rio#delete</a>! calls <a
1081
+ href="../Rio.html#M000035">Rio#rmtree</a> for directories.
1082
+ </p>
1083
+ <ul>
1084
+ <li>To delete something only if it is not a directory use <a
1085
+ href="../Rio.html#M000038">Rio#rm</a>
1086
+
1087
+ </li>
1088
+ <li>To delete an empty directory use <a
1089
+ href="../Rio.html#M000034">Rio#rmdir</a>
1090
+
1091
+ </li>
1092
+ <li>To delete an entire directory tree use <a
1093
+ href="../Rio.html#M000035">Rio#rmtree</a>
1094
+
1095
+ </li>
1096
+ <li>To delete anything except a populated directory use <a
1097
+ href="../Rio.html#M000053">Rio#delete</a>
1098
+
1099
+ </li>
1100
+ <li>To delete anything use <a href="../Rio.html#M000053">Rio#delete</a>!
1101
+
1102
+ </li>
1103
+ </ul>
1104
+ <p>
1105
+ It is not an error to call any of the deleting methods on something that
1106
+ does not exist. <a href="../Rio.html">Rio</a> provides Rio#exist? and <a
1107
+ href="../Rio.html#M000041">Rio#symlink</a>? to check if something exists
1108
+ (<tt>exist?</tt> returns false for symlinks to non-existant object even
1109
+ though the symlink itself exists). The deleting methods&#8217; purpose is
1110
+ to make things not exist, so calling one of them on something that already
1111
+ does not exist is considered a success.
1112
+ </p>
1113
+ <p>
1114
+ To create a clean copy of a directory whether or not anything with that
1115
+ name exists one might do this
1116
+ </p>
1117
+ <pre>
1118
+ rio('adir').delete!.mkpath.chdir do
1119
+ # do something in adir
1120
+ end
1121
+ </pre>
1122
+ <hr size="1"></hr><h2>Miscellany</h2>
1123
+ <h4>Using Symbolic Links</h4>
1124
+ <p>
1125
+ To create a symbolic link (symlink) to the file-system entry refered to by
1126
+ a <a href="../Rio.html">Rio</a>, use <a
1127
+ href="../Rio.html#M000041">Rio#symlink</a>. <a
1128
+ href="../Rio.html#M000041">Rio#symlink</a> differs from File#symlink in
1129
+ that it calculates the path from the symlink location to the <a
1130
+ href="../Rio.html">Rio</a>&#8217;s position.
1131
+ </p>
1132
+ <pre>
1133
+ File#symlink('adir/afile','adir/alink')
1134
+ </pre>
1135
+ <p>
1136
+ creates a symlink in the directory &#8216;adir&#8217; named
1137
+ &#8216;alink&#8217; which references &#8216;adir/afile&#8217;. From the
1138
+ perspective of &#8216;alink&#8217;, &#8216;adir/afile&#8217; does not
1139
+ exist. While:
1140
+ </p>
1141
+ <pre>
1142
+ rio('adir/afile').symlink('adir/alink')
1143
+ </pre>
1144
+ <p>
1145
+ creates a symlink in the directory &#8216;adir&#8217; named
1146
+ &#8216;alink&#8217; which references &#8216;afile&#8217;. This is the route
1147
+ to &#8216;adir/afile&#8217; from the perspective of
1148
+ &#8216;adir/alink&#8217;.
1149
+ </p>
1150
+ <p>
1151
+ Note that the return value from <tt>symlink</tt> is the calling <a
1152
+ href="../Rio.html">Rio</a> and not a <a href="../Rio.html">Rio</a> refering
1153
+ to the symlink. This is done for consistency with the rest of <a
1154
+ href="../Rio.html">Rio</a>.
1155
+ </p>
1156
+ <p>
1157
+ <a href="../Rio.html#M000041">Rio#symlink</a>? can be used to test if a
1158
+ file-system object is a symlink. A <a href="../Rio.html">Rio</a> is
1159
+ extended with <a href="../Rio.html#M000042">Rio#readlink</a>, and <a
1160
+ href="../Rio.html#M000191">Rio#lstat</a> only if <a
1161
+ href="../Rio.html#M000041">Rio#symlink</a>? returns true. So for
1162
+ non-symlinks, these will raise a NoMethodError. These are both passed to
1163
+ their counterparts in File. <a href="../Rio.html#M000042">Rio#readlink</a>
1164
+ returns a <a href="../Rio.html">Rio</a> refering to the result of
1165
+ File#readlink.
1166
+ </p>
1167
+ <h4>Using A <a href="../Rio.html">Rio</a> as an IO (or File or Dir)</h4>
1168
+ <p>
1169
+ <a href="../Rio.html">Rio</a> supports so much of IO&#8217;s interface that
1170
+ one might be tempted to pass it to a method that expects an IO. While <a
1171
+ href="../Rio.html">Rio</a> is not and is not intended to be a stand in for
1172
+ IO, this can work. It requires knowledge of every IO method that will be
1173
+ called, under any circumstances.
1174
+ </p>
1175
+ <p>
1176
+ Even in cases where <a href="../Rio.html">Rio</a> supports the required IO
1177
+ interface, A <a href="../Rio.html">Rio</a> feature that seems to cause the
1178
+ most incompatibility, is its automatic closing of files. To turn off all of
1179
+ <a href="../Rio.html">Rio</a>&#8217;s automatic closing use
1180
+ Rio#noautoclose.
1181
+ </p>
1182
+ <p>
1183
+ For example:
1184
+ </p>
1185
+ <pre>
1186
+ require 'yaml'
1187
+ yrio = rio('ran.yaml').delete!.noautoclose
1188
+ YAML.dump( ['badger', 'elephant', 'tiger'], yrio )
1189
+ obj = YAML::load( yrio ) #=&gt; [&quot;badger&quot;, &quot;tiger&quot;, &quot;elephant&quot;]
1190
+ </pre>
1191
+ <h4>Automatically Closing Files</h4>
1192
+ <p>
1193
+ <a href="../Rio.html">Rio</a> closes files automatically in three
1194
+ instances.
1195
+ </p>
1196
+ <p>
1197
+ When reading from an IO it is closed when the end of file is reached. While
1198
+ this is a reasonable thing to do in many cases, sometimes this is not
1199
+ desired. To turn <a href="../Rio.html">Rio</a>&#8217;s automatic closing on
1200
+ end of file use <a href="../Rio.html#M000094">Rio#nocloseoneof</a> (it can
1201
+ be turned back on via <a href="../Rio.html#M000093">Rio#closeoneof</a>)
1202
+ </p>
1203
+ <pre>
1204
+ ario = rio('afile').nocloseoneof
1205
+ lines = ario[]
1206
+ ario.closed? #=&gt; false
1207
+ </pre>
1208
+ <p>
1209
+ Closing on end-of-file is necessary for many of <a
1210
+ href="../Rio.html">Rio</a>&#8217;s one-liners, but has an implication that
1211
+ may be surprising at first. A <a href="../Rio.html">Rio</a> starts life as
1212
+ a path, not much more than a string. When one of its read methods is called
1213
+ it becomes an input stream. When the stream is closed, it becomes a path
1214
+ again. This means that when reading from a <a href="../Rio.html">Rio</a>,
1215
+ the end-of-file condition is seen only once before it becomes a path again,
1216
+ and will be reopened if another read operation is attempted.
1217
+ </p>
1218
+ <p>
1219
+ Another time a <a href="../Rio.html">Rio</a> will be closed atomatically is
1220
+ when writing to it with one of the copy operators (<tt>&lt;, &lt;&lt;,
1221
+ &gt;, &gt;&gt;</tt>). This behavior can be turned off with <a
1222
+ href="../Rio.html#M000097">Rio#nocloseoncopy</a>.
1223
+ </p>
1224
+ <p>
1225
+ To turn off both of thes types of automatic closing use Rio#noautoclose.
1226
+ </p>
1227
+ <p>
1228
+ The third instance when <a href="../Rio.html">Rio</a> will close a file
1229
+ automatically is when a file opened for one type of access receives a
1230
+ method which that access mode does not support. So, the code
1231
+ rio(&#8216;afile&#8217;).puts(&quot;Hello World&quot;).gets will open the
1232
+ file for write access when the <tt>puts</tt> method is received. When
1233
+ <tt>gets</tt> is called the file is closed and reopened with read access.
1234
+ </p>
1235
+ <h4>Explicitly Closing Files</h4>
1236
+ <p>
1237
+ <a href="../Rio.html">Rio</a> can not determine when the client is finished
1238
+ writing to it, as it does using <tt>eof</tt> on read. It is the
1239
+ author&#8217;s understanding that Ruby does not support a mechanism to have
1240
+ code run when there are no more references to it &#8212; that finalizers
1241
+ are not necessarily run immediatly upon an object&#8217;s reference count
1242
+ reaching 0. If this understanding is incorrect, some of <a
1243
+ href="../Rio.html">Rio</a>&#8217;s extranious ways of closing a file may be
1244
+ rethought.
1245
+ </p>
1246
+ <p>
1247
+ That being said, <a href="../Rio.html">Rio</a> support several ways to
1248
+ explicitly close a file. <a href="../Rio.html#M000167">Rio#close</a> will
1249
+ close any open <a href="../Rio.html">Rio</a>. The output methods <a
1250
+ href="../Rio.html#M000158">Rio#puts</a>!, <a
1251
+ href="../Rio.html#M000157">Rio#putc</a>!, <a
1252
+ href="../Rio.html#M000155">Rio#printf</a>!, <a
1253
+ href="../Rio.html#M000152">Rio#print</a>!, and <a
1254
+ href="../Rio.html#M000161">Rio#write</a>! behave as if their counterparts
1255
+ without the exclamation point had been called and then call <a
1256
+ href="../Rio.html#M000167">Rio#close</a> or Rio#close_write if the
1257
+ underlying IO object is opened for duplex access.
1258
+ </p>
1259
+ <h4>Open mode selection</h4>
1260
+ <p>
1261
+ A <a href="../Rio.html">Rio</a> is typically not explicitly opened. It
1262
+ opens a file automatically when an input or output methed is called. For
1263
+ output methods <a href="../Rio.html">Rio</a> opens a file with mode
1264
+ &#8216;w&#8217;, and otherwise opens a file with mode &#8216;r&#8217;. This
1265
+ behavior can be modified using the tersely named methods <a
1266
+ href="../Rio.html#M000087">Rio#a</a>, <a
1267
+ href="../Rio.html#M000087">Rio#a</a>!, <a
1268
+ href="../Rio.html#M000089">Rio#r</a>, <a
1269
+ href="../Rio.html#M000089">Rio#r</a>!, <a
1270
+ href="../Rio.html#M000091">Rio#w</a>, and <a
1271
+ href="../Rio.html#M000091">Rio#w</a>!, which cause the <a
1272
+ href="../Rio.html">Rio</a> to use modes
1273
+ &#8216;a&#8217;,&#8217;a+&#8217;,&#8217;r&#8217;,&#8217;r+&#8217;,&#8217;w&#8217;,and
1274
+ &#8216;w+&#8217; respectively.
1275
+ </p>
1276
+ <p>
1277
+ One way to append a string to a file and close it in one line is
1278
+ </p>
1279
+ <pre>
1280
+ rio('afile').a.puts!(&quot;Hello World&quot;)
1281
+ </pre>
1282
+ <p>
1283
+ Run a cmd that must be opened for read and write
1284
+ </p>
1285
+ <pre>
1286
+ ans = rio(?-,'cat').w!.puts!(&quot;Hello Kitty&quot;).readlines
1287
+ </pre>
1288
+ <p>
1289
+ The automatic selection of mode can be bypassed entirely using <a
1290
+ href="../Rio.html#M000165">Rio#mode</a> and <a
1291
+ href="../Rio.html#M000040">Rio#open</a>.
1292
+ </p>
1293
+ <p>
1294
+ If a mode is specified using <tt>mode</tt>, the file will still be opened
1295
+ automatically, but the mode specified in the <tt>mode</tt> method will be
1296
+ used regardless of whether it makes sense.
1297
+ </p>
1298
+ <p>
1299
+ A <a href="../Rio.html">Rio</a> can also be opened explicitly using <a
1300
+ href="../Rio.html#M000040">Rio#open</a>. <tt>open</tt> takes one parameter,
1301
+ a mode. This also will override all of <a
1302
+ href="../Rio.html">Rio</a>&#8217;s automatic mode selection.
1303
+ </p>
1304
+ <h4>CSV mode</h4>
1305
+ <p>
1306
+ <a href="../Rio.html">Rio</a> uses the CSV class from the Ruby standard
1307
+ library to provide support for reading and writing comma-separated-value
1308
+ files. Normally using <tt>(no)records</tt> is identical to
1309
+ <tt>(no)lines</tt> because while <tt>records</tt> only selects and does not
1310
+ specify the record-type, <tt>lines</tt> is the default.
1311
+ </p>
1312
+ <pre>
1313
+ rio('afile').records(1..2)
1314
+ </pre>
1315
+ <p>
1316
+ effectively means
1317
+ </p>
1318
+ <pre>
1319
+ rio('afile').lines.records(1..2)
1320
+ </pre>
1321
+ <p>
1322
+ The CSV extension distingishes between items selected using <a
1323
+ href="../Rio.html#M000082">Rio#records</a> and those selected using <a
1324
+ href="../Rio.html#M000080">Rio#lines</a>. <a href="../Rio.html">Rio</a>
1325
+ returns records parsed into Arrays by the CSV library when <tt>records</tt>
1326
+ is used, and returns Strings as normal when <tt>lines</tt> is used.
1327
+ <tt>records</tt> is the default.
1328
+ </p>
1329
+ <pre>
1330
+ rio('f.csv').puts!([&quot;h0,h1&quot;,&quot;f0,f1&quot;])
1331
+
1332
+ rio('f.csv').csv.records[] #==&gt;[[&quot;h0&quot;, &quot;h1&quot;], [&quot;f0&quot;, &quot;f1&quot;]]
1333
+ rio('f.csv').csv[] #==&gt; same thing
1334
+ rio('f.csv').csv.lines[] #==&gt;[&quot;h0,h1\n&quot;, &quot;f0,f1\n&quot;]
1335
+ rio('f.csv').csv.records[0] #==&gt;[[&quot;h0&quot;, &quot;h1&quot;]]
1336
+ rio('f.csv').csv[0] #==&gt; same thing
1337
+ rio('f.csv').csv.lines[0] #==&gt;[&quot;h0,h1\n&quot;]
1338
+ rio('f.csv').csv.skiprecords[0] #==&gt;[[&quot;f0&quot;, &quot;f1&quot;]]
1339
+ rio('f.csv').csv.skiplines[0] #==&gt;[&quot;f0,f1\n&quot;]
1340
+ </pre>
1341
+ <p>
1342
+ This distinction, of course, applies equally when using the copy operators
1343
+ and <tt>each</tt>
1344
+ </p>
1345
+ <pre>
1346
+ rio('f.csv').csv[0] &gt; rio('out').csv # out contains &quot;f0,f1\n&quot;
1347
+
1348
+ rio('f.csv').csv { |array_of_fields| ... }
1349
+ </pre>
1350
+ <p>
1351
+ Notice that <tt>csv</tt> mode is called on both the input and output Rios.
1352
+ The <tt>csv</tt> on the &#8216;out&#8217; <a href="../Rio.html">Rio</a>
1353
+ causes it to treat an array written to it as an array of records which is
1354
+ converted into CSV format before writing. Without the <tt>csv</tt>, the
1355
+ output would be written as if Array#to_s on
1356
+ [[&quot;f0&quot;,&quot;f1&quot;]] had been called
1357
+ </p>
1358
+ <pre>
1359
+ rio('f.csv').csv[0] &gt; rio('out') # out contains &quot;f0f1&quot;
1360
+ </pre>
1361
+ <p>
1362
+ The String representing a record that is returned when using <tt>lines</tt>
1363
+ is extended with a <tt>to_a</tt> method which will parse it into an array
1364
+ of fields. Likewise the Array returned when a record is returned using
1365
+ <tt>records</tt> is extended with a modified <tt>to_s</tt> which treats it
1366
+ as an array CSV fields, rather than just an array of strings.
1367
+ </p>
1368
+ <pre>
1369
+ array_of_lines = rio('f.csv').csv.lines[1] #==&gt;[&quot;f0,f1\n&quot;]
1370
+ array_of_records = rio('f.csv').csv.records[1] #==&gt;[[&quot;f0&quot;, &quot;f1&quot;]]
1371
+
1372
+ array_of_lines[0].to_a #==&gt;[&quot;f0&quot;, &quot;f1&quot;]
1373
+ array_of_records[0].to_s #==&gt;&quot;f0,f1&quot;
1374
+ </pre>
1375
+ <p>
1376
+ Rio#csv takes two optional parameters, which are passed on to the CSV
1377
+ library. They are the <tt>field_separator</tt> and the
1378
+ <tt>record_separator</tt>.
1379
+ </p>
1380
+ <pre>
1381
+ rio('semisep').puts!([&quot;h0;h1&quot;,&quot;f0;f1&quot;])
1382
+
1383
+ rio('semisep').csv(';').to_a #==&gt;[[&quot;h0&quot;, &quot;h1&quot;], [&quot;f0&quot;, &quot;f1&quot;]]
1384
+ </pre>
1385
+ <p>
1386
+ These are specified independently on the source and destination when using
1387
+ the copy operators.
1388
+ </p>
1389
+ <pre>
1390
+ rio('semisep').csv(';') &gt; rio('colonsep').csv(':')
1391
+ rio('colonsep').contents #==&gt;&quot;h0:h1\nf0:f1\n&quot;
1392
+ </pre>
1393
+ <p>
1394
+ <a href="../Rio.html">Rio</a> provides two methods for selecting fields
1395
+ from CSV records in a manner similar to that provided for selecting lines
1396
+ &#8212; Rio#columns and Rio#skipcolumns.
1397
+ </p>
1398
+ <pre>
1399
+ rio('f.csv').puts!([&quot;h0,h1,h2,h3&quot;,&quot;f0,f1,f2,f3&quot;])
1400
+
1401
+ rio('f.csv').csv.columns(0).to_a #==&gt;[[&quot;h0&quot;], [&quot;f0&quot;]]
1402
+ rio('f.csv').csv.skipcolumns(0).to_a #==&gt;[[&quot;h1&quot;, &quot;h2&quot;, &quot;h3&quot;], [&quot;f1&quot;, &quot;f2&quot;, &quot;f3&quot;]]
1403
+ rio('f.csv').csv.columns(1..2).to_a #==&gt;[[&quot;h1&quot;, &quot;h2&quot;], [&quot;f1&quot;, &quot;f2&quot;]]
1404
+ rio('f.csv').csv.skipcolumns(1..2).to_a #==&gt;[[&quot;h0&quot;, &quot;h3&quot;], [&quot;f0&quot;, &quot;f3&quot;]]
1405
+ </pre>
1406
+ <p>
1407
+ Rio#columns can, of course be used with the <tt>each</tt> and the copy
1408
+ operators:
1409
+ </p>
1410
+ <pre>
1411
+ rio('f.csv').csv.columns(0..1) &gt; rio('out').csv
1412
+ rio('out').contents #==&gt;&quot;h0,h1\nf0,f1\n&quot;
1413
+ </pre>
1414
+ <h4>YAML mode</h4>
1415
+ <p>
1416
+ <a href="../Rio.html">Rio</a> uses the YAML class from the Ruby standard
1417
+ library to provide support for reading and writing YAML files. Normally
1418
+ using <tt>(skip)records</tt> is identical to <tt>(skip)lines</tt> because
1419
+ while <tt>records</tt> only selects and does not specify the record-type,
1420
+ <tt>lines</tt> is the default.
1421
+ </p>
1422
+ <p>
1423
+ The YAML extension distingishes between items selected using <a
1424
+ href="../Rio.html#M000082">Rio#records</a>, <a
1425
+ href="../Rio.html#M000085">Rio#rows</a> and <a
1426
+ href="../Rio.html#M000080">Rio#lines</a>. <a href="../Rio.html">Rio</a>
1427
+ returns objects loaded via YAML#load when <tt>records</tt> is used; returns
1428
+ the YAML text as a String when <tt>rows</tt> is used; and returns lines as
1429
+ Strings as normal when <tt>lines</tt> is used. <tt>records</tt> is the
1430
+ default. In yaml-mode, <tt>(skip)records</tt> can be called as
1431
+ <tt>(skip)objects</tt> and <tt>(skip)rows</tt> can be called as
1432
+ <tt>(skip)documents</tt>
1433
+ </p>
1434
+ <p>
1435
+ To read a single YAML document, <a href="../Rio.html">Rio</a> provides
1436
+ getobj and load For example, consider the following partial
1437
+ &#8216;database.yml&#8217; from the rails distribution:
1438
+ </p>
1439
+ <pre>
1440
+ development:
1441
+ adapter: mysql
1442
+ database: rails_development
1443
+
1444
+ test:
1445
+ adapter: mysql
1446
+ database: rails_test
1447
+ </pre>
1448
+ <p>
1449
+ To get the object represented in the yaml file:
1450
+ </p>
1451
+ <pre>
1452
+ rio('database.yml').yaml.load
1453
+ ==&gt;{&quot;development&quot;=&gt;{&quot;adapter&quot;=&gt;&quot;mysql&quot;, &quot;database&quot;=&gt;&quot;rails_development&quot;},
1454
+ &quot;test&quot;=&gt;{&quot;adapter&quot;=&gt;&quot;mysql&quot;, &quot;database&quot;=&gt;&quot;rails_test&quot;}}
1455
+ </pre>
1456
+ <p>
1457
+ Or one could read parts of the file like so:
1458
+ </p>
1459
+ <pre>
1460
+ rio('database.yml').yaml.getobj['development']['database']
1461
+ ==&gt;&quot;rails_development&quot;
1462
+ </pre>
1463
+ <p>
1464
+ Single objects can be written using putobj and putobj! which is aliased to
1465
+ dump
1466
+ </p>
1467
+ <pre>
1468
+ anobject = {
1469
+ 'production' =&gt; {
1470
+ 'adapter' =&gt; 'mysql',
1471
+ 'database' =&gt; 'rails_production',
1472
+ }
1473
+ }
1474
+ rio('afile.yaml').yaml.dump(anobject)
1475
+ </pre>
1476
+ <p>
1477
+ The YAML extension changes the way the grande copy operators interpret
1478
+ their argument. <a href="../Rio.html">Rio</a>#&lt; (copy-from) and <a
1479
+ href="../Rio.html">Rio</a>#&lt;&lt; (append-from) treat an array as an
1480
+ array of objects which are converted using their to_yaml method before
1481
+ writing.
1482
+ </p>
1483
+ <pre>
1484
+ rio('afile.yaml').yaml &lt; [obj1, obj2, obj3]
1485
+ </pre>
1486
+ <p>
1487
+ Because of this, copying an ::Array must be done like this:
1488
+ </p>
1489
+ <pre>
1490
+ rio('afile.yaml').yaml &lt; [anarray]
1491
+ </pre>
1492
+ <p>
1493
+ If their argument is a <a href="../Rio.html">Rio</a> or ::IO it is iterate
1494
+ through as normal, with each record converted using its to_yaml method.
1495
+ </p>
1496
+ <p>
1497
+ For all other objects, the result of their <tt>to_yaml</tt> operator is
1498
+ simply written.
1499
+ </p>
1500
+ <pre>
1501
+ rio('afile.yaml').yaml &lt; anobject
1502
+ </pre>
1503
+ <p>
1504
+ <a href="../Rio.html">Rio</a>#&gt; (copy-to) and <a
1505
+ href="../Rio.html">Rio</a>#&gt;&gt; (append-to) will fill an array with
1506
+ with all selected YAML documents in the <a href="../Rio.html">Rio</a>. For
1507
+ non-arrays, the yaml text is copied. (This may change if a useful
1508
+ reasonable alternative can be found)
1509
+ </p>
1510
+ <pre>
1511
+ rio('afile.yaml').yaml &gt; anarray # load all YAML documents from 'afile.yaml'
1512
+ </pre>
1513
+ <p>
1514
+ Single objects can be written using <a
1515
+ href="../Rio.html#M000068">Rio#putrec</a> (aliased to Rio#putobj and
1516
+ Rio#dump)
1517
+ </p>
1518
+ <pre>
1519
+ rio('afile.yaml').yaml.putobj(anobject)
1520
+ </pre>
1521
+ <p>
1522
+ Single objects can be loaded using <a
1523
+ href="../Rio.html#M000064">Rio#getrec</a> (aliase to Rio#getobj and
1524
+ Rio#load)
1525
+ </p>
1526
+ <pre>
1527
+ anobject = rio('afile.yaml').yaml.getobj
1528
+ </pre>
1529
+ <p>
1530
+ Note that other than this redefinition of what a record is and how the copy
1531
+ operators interpret their argument, a <a href="../Rio.html">Rio</a> in
1532
+ yaml-mode is just like any other <a href="../Rio.html">Rio</a>. And all the
1533
+ things you can do with any <a href="../Rio.html">Rio</a> come for free.
1534
+ They can be iterated over using each and read into an array using #[] just
1535
+ like any other <a href="../Rio.html">Rio</a>. All the selection criteria
1536
+ are identical also.
1537
+ </p>
1538
+ <p>
1539
+ Get the first three objects into an array:
1540
+ </p>
1541
+ <pre>
1542
+ array_of_objects = rio('afile.yaml').yaml[0..2]
1543
+ </pre>
1544
+ <p>
1545
+ Iterate over only YAML documents that are a kind_of ::Hash use:
1546
+ </p>
1547
+ <pre>
1548
+ rio('afile.yaml').yaml(::Hash) {|ahash| ...}
1549
+ </pre>
1550
+ <p>
1551
+ This takes advantage of the fact that the default for matching records is
1552
+ <tt>===</tt>
1553
+ </p>
1554
+ <p>
1555
+ Selecting records using a Proc can be used as normal:
1556
+ </p>
1557
+ <pre>
1558
+ anarray = rio('afile.yaml').yaml(proc{|anobject| ...}).to_a
1559
+ </pre>
1560
+ <p>
1561
+ One could even use the copy operator to convert a CSV file to a YAML
1562
+ representation of the same data:
1563
+ </p>
1564
+ <pre>
1565
+ rio('afile.yaml').yaml &lt; rio('afile.csv').csv
1566
+ </pre>
1567
+ <hr size="1"></hr><p>
1568
+ See also:
1569
+ </p>
1570
+ <ul>
1571
+ <li><a href="SYNOPSIS.html">RIO::Doc::SYNOPSIS</a>
1572
+
1573
+ </li>
1574
+ <li><a href="HOWTO.html">RIO::Doc::HOWTO</a>
1575
+
1576
+ </li>
1577
+ <li><a href="../Rio.html">RIO::Rio</a>
1578
+
1579
+ </li>
1580
+ </ul>
1581
+
1582
+ </div>
1583
+
1584
+
1585
+ </div>
1586
+
1587
+
1588
+ </div>
1589
+
1590
+
1591
+ <!-- if includes -->
1592
+
1593
+ <div id="section">
1594
+
1595
+
1596
+
1597
+
1598
+
1599
+
1600
+
1601
+
1602
+ <!-- if method_list -->
1603
+
1604
+
1605
+ </div>
1606
+
1607
+
1608
+ <div id="validator-badges">
1609
+ <p><small>Copyright &copy; 2005 Christopher Kleckner. <a href="http://www.gnu.org/licenses/gpl.html">All rights reserved</a>.</small></p>
1610
+ </div>
1611
+
1612
+ </body>
1613
+ </html>