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,219 @@
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
+ class Rio
40
+ # Calls FileTest#blockdev?
41
+ # rio('afile').blockdev? => true or false
42
+ # Returns +true+ if the named file is a block device.
43
+ def blockdev?() target.blockdev?() end
44
+ # Calls FileTest#chardev?
45
+ # rio('afile').chardev? => true or false
46
+ # Returns +true+ if the named file is a character device.
47
+ def chardev?() target.chardev? end
48
+ # Calls FileTest#directory?
49
+ # rio('afile').directory? => true or false
50
+ # Returns +true+ if the named file is a directory, +false+ otherwise.
51
+ def directory?() target.directory? end
52
+ def dir?() target.dir? end
53
+ # Calls FileTest#exist?
54
+ # rio('afile').exist?() => true or false
55
+ # Returns +true+ if the named file exists.
56
+ def exist?() target.exist? end
57
+ # Calls FileTest#file?
58
+ # rio('afile').file? => true or false
59
+ # Returns +true+ if the named file exists and is a regular file.
60
+ def file?() target.file? end
61
+ # Calls FileTest#socket?
62
+ # rio('afile').socket? => true or false
63
+ # Returns +true+ if the named file is a socket.
64
+ def socket?() target.socket? end
65
+ # Calls FileTest#symlink?
66
+ # rio('afile').symlink? => true or false
67
+ # Returns +true+ if the named file is a symbolic link.
68
+ def symlink?() target.symlink? end
69
+
70
+ # Returns +true+ if a Rio is not closed?
71
+ def open?() target.open?() end
72
+
73
+ # Calls IO#closed?
74
+ # ario.closed? => true or false
75
+ # Returns +true+ if _ario_ is completely closed (for duplex streams,
76
+ # both reader and writer), +false+ otherwise.
77
+ def closed?() target.closed?() end
78
+
79
+ # Calls File#fnmatch?
80
+ #
81
+ # Returns true if path matches against pattern
82
+ def fnmatch?(*args) target.fnmatch?(*args) end
83
+
84
+ # Calls File#ftype
85
+ #
86
+ # Identifies the type of the named file; the return string is one of 'file�, 'directory�,
87
+ # 'characterSpecial�, 'blockSpecial�, 'fifo�, 'link�, 'socket�, or 'unknown�.
88
+ def ftype(*args) target.ftype(*args) end
89
+
90
+ # Calls File#stat
91
+ def stat(*args) target.stat(*args) end
92
+
93
+ # Calls File#lstat
94
+ def lstat(*args) target.lstat(*args) end
95
+
96
+ # Calls FileTest#pipe?
97
+ # rio('afile').pipe? => true or false
98
+ # Returns +true+ if the named file is a pipe.
99
+ def pipe?() target.pipe?() end
100
+
101
+
102
+ # Calls File#atime
103
+ #
104
+ # Returns the last access time (a Time object) for the file system object referenced
105
+ def atime(*args) target.atime(*args) end
106
+
107
+ # Calls File#ctime
108
+ #
109
+ # Returns the change time for Rios that reference file system object (that is,
110
+ # the time directory information about the file was changed, not the file itself).
111
+ def ctime(*args) target.ctime(*args) end
112
+
113
+ # Calls File#mtime
114
+ #
115
+ # Returns the modification time for Rio that reference file system objects
116
+ def mtime(*args) target.mtime(*args) end
117
+
118
+ # Calls File#executable?
119
+ #
120
+ # Returns true if the file is executable by the effective user id of this process.
121
+ def executable?(*args) target.executable?(*args) end
122
+
123
+ # Calls File#executable_real?
124
+ #
125
+ # Returns true if the file is executable by the real user id of this process.
126
+ def executable_real?(*args) target.executable_real?(*args) end
127
+
128
+ # Calls FileTest#readable?
129
+ # rio('afile').readable? => true or false
130
+ # Returns +true+ if the named file is readable by the effective user
131
+ # id of this process.
132
+ def readable?(*args) target.readable?(*args) end
133
+
134
+ # Calls FileTest#readable_real?
135
+ # rio('afile').readable_real? => true or false
136
+ # Returns +true+ if the named file is readable by the real user id of
137
+ # this process.
138
+ def readable_real?(*args) target.readable_real?(*args) end
139
+
140
+ # Calls FileTest#writable?
141
+ # rio('afile').writable? => true or false
142
+ # Returns +true+ if the named file is writable by the effective user
143
+ # id of this process.
144
+ def writable?(*args) target.writable?(*args) end
145
+
146
+ # Calls FileTest#writable_real?
147
+ # rio('afile').writable_real? => true or false
148
+ # Returns +true+ if the named file is writable by the real user id of
149
+ # this process.
150
+ def writable_real?(*args) target.writable_real?(*args) end
151
+
152
+ # Calls FileTest#sticky?
153
+ # rio('afile').sticky? => true or false
154
+ # Returns +true+ if the named file is a has the sticky bit set.
155
+ def sticky?(*args) target.sticky?(*args) end
156
+
157
+ # Calls FileTest#owned?
158
+ # rio('afile').owned? => true or false
159
+ # Returns +true+ if the named file exists and the effective used id
160
+ # of the calling process is the owner of the file.
161
+ def owned?(*args) target.owned?(*args) end
162
+
163
+ # Calls FileTest#grpowned?
164
+ # rio('afile').grpowned? => true or false
165
+ # Returns +true+ if the named file exists and the effective group id
166
+ # of the calling process is the owner of the file. Returns +false+ on
167
+ # Windows.
168
+ def grpowned?(*args) target.grpowned?(*args) end
169
+
170
+ # Calls FileTest#setgid?
171
+ # rio('afile').setgid? => true or false
172
+ # Returns +true+ if the named file is a has the setgid bit set.
173
+ def setgid?(*args) target.setgid?(*args) end
174
+
175
+ # Calls FileTest#setuid?
176
+ # rio('afile').setuid? => true or false
177
+ # Returns +true+ if the named file is a has the setuid bit set.
178
+ def setuid?(*args) target.setuid?(*args) end
179
+
180
+ # Calls FileTest#size
181
+ # rio('afile').size => integer
182
+ # Returns the size of _afile_.
183
+ # To get the length of the Rio's string representation use Rio#length
184
+ def size(*args) target.size(*args) end
185
+
186
+ # Calls FileTest#size?
187
+ # rio('afile').size? => integer or nil
188
+ # Returns +nil+ if _afile_ doesn't exist or has zero size, the
189
+ # size of the file otherwise.
190
+ def size?(*args) target.size?(*args) end
191
+
192
+ # Calls FileTest#zero?
193
+ # rio('afile').zero? => true or false
194
+ # Returns +true+ if the named file exists and has a zero size.
195
+ def zero?(*args) target.zero?(*args) end
196
+
197
+
198
+ # Returns true if the rio represents and absolute path or URI. Alias for Rio#absolute?
199
+ #
200
+ # rio('/tmp').abs? # >> true
201
+ # rio('.ssh').abs? # >> false
202
+ # rio('file:///tmp').abs? # >> true
203
+ # rio('http://www.ruby-doc.org/').abs? # >> true
204
+ #
205
+ def abs?() target.abs?() end
206
+
207
+
208
+ # Returns true if the Rio represents and absolute path or URI. Calls URI#absolute?
209
+ #
210
+ # rio('/tmp').absolute? # >> true
211
+ # rio('.ssh').absolute? # >> false
212
+ # rio('file:///tmp').absolute? # >> true
213
+ # rio('http://www.ruby-doc.org/').absolute? # >> true
214
+ #
215
+ def absolute?() target.absolute?() end
216
+
217
+
218
+ end
219
+ end
@@ -0,0 +1,82 @@
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 Impl #:nodoc: all
40
+ module U
41
+ def self.fnmatch?(s,globstr,*flags) ::File.fnmatch?(globstr,s,*flags) end
42
+ def self.expand_path(s,*args) ::File.expand_path(s,*args) end
43
+ def self.extname(s,*args) ::File.extname(s,*args) end
44
+
45
+ def self.basename(s,*args) ::File.basename(s,*args) end
46
+ def self.dirname(s,*args) ::File.dirname(s,*args) end
47
+
48
+ def self.ftype(s,*args) ::File.ftype(s,*args) end
49
+ def self.symlink(s,d) ::File.symlink(s.to_s,d.to_s) end
50
+
51
+ def self.stat(s,*args) ::File.stat(s,*args) end
52
+
53
+ def self.atime(s,*args) ::File.atime(s,*args) end
54
+ def self.ctime(s,*args) ::File.ctime(s,*args) end
55
+ def self.mtime(s,*args) ::File.mtime(s,*args) end
56
+
57
+ def self.blockdev?(s,*args) ::FileTest.blockdev?(s,*args) end
58
+ def self.chardev?(s,*args) ::FileTest.chardev?(s,*args) end
59
+ def self.directory?(s,*args) ::FileTest.directory?(s,*args) end
60
+ def self.dir?(s,*args) ::FileTest.directory?(s,*args) end
61
+ def self.executable?(s,*args) ::FileTest.executable?(s,*args) end
62
+ def self.executable_real?(s,*args) ::FileTest.executable_real?(s,*args) end
63
+ def self.exist?(s,*args) ::FileTest.exist?(s,*args) end
64
+ def self.file?(s,*args) ::FileTest.file?(s,*args) end
65
+ def self.grpowned?(s,*args) ::FileTest.grpowned?(s,*args) end
66
+ def self.owned?(s,*args) ::FileTest.owned?(s,*args) end
67
+ def self.pipe?(s,*args) ::FileTest.pipe?(s,*args) end
68
+ def self.readable?(s,*args) ::FileTest.readable?(s,*args) end
69
+ def self.readable_real?(s,*args) ::FileTest.readable_real?(s,*args) end
70
+ def self.setgid?(s,*args) ::FileTest.setgid?(s,*args) end
71
+ def self.setuid?(s,*args) ::FileTest.setuid?(s,*args) end
72
+ def self.size(s,*args) ::FileTest.size(s,*args) end
73
+ def self.size?(s,*args) ::FileTest.size?(s,*args) end
74
+ def self.socket?(s,*args) ::FileTest.socket?(s,*args) end
75
+ def self.sticky?(s,*args) ::FileTest.sticky?(s,*args) end
76
+ def self.symlink?(s,*args) ::FileTest.symlink?(s,*args) end
77
+ def self.writable?(s,*args) ::FileTest.writable?(s,*args) end
78
+ def self.writable_real?(s,*args) ::FileTest.writable_real?(s,*args) end
79
+ def self.zero?(s,*args) ::FileTest.zero?(s,*args) end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,137 @@
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 'fileutils'
39
+
40
+ module RIO
41
+ module IOH #:nodoc: all
42
+ class Base
43
+ attr :ios
44
+ def initialize(ios,*args)
45
+ @ios = ios
46
+ end
47
+ def initialize_copy(*args)
48
+ #p callstr('ioh:initialize_copy',*args)
49
+ super
50
+ @ios = @ios.clone unless @ios.nil?
51
+ end
52
+ def callstr(func,*args)
53
+ self.class.to_s+'['+self.to_s+']'+'.'+func.to_s+'('+args.join(',')+')'
54
+ end
55
+ def handle() @ios end
56
+ def open?() not closed? end
57
+ end
58
+ class Stream < Base
59
+ attr_reader :iostack
60
+ def initialize(iosp,*args)
61
+ super
62
+ @iostack = [@ios]
63
+ end
64
+ def initialize_copy(*args)
65
+ #p callstr('ioh_stream:initialize_copy',*args)
66
+ super
67
+ @iostack = @iostack.map { |io| io.nil? || io.equal?(@ios) ? io : io.clone }
68
+ end
69
+ def copy_blksize()
70
+ if @ios.respond_to? :stat
71
+ sz = @ios.stat.blksize
72
+ sz = nil if sz.nil? || sz == 0
73
+ end
74
+ sz || 512
75
+ end
76
+
77
+ def handle() @iostack[-1] end
78
+ def close() handle.close unless self.closed? end
79
+ def closed?() handle.nil? or handle.closed? end
80
+ def eof?() closed? or handle.eof? end
81
+ def copy_stream(dst)
82
+ #p callstr('copy_stream',dst)
83
+ blksize = _stream_blksize(handle,dst)
84
+ until handle.eof?
85
+ dst.print(handle.read(blksize))
86
+ end
87
+ self
88
+ end
89
+
90
+ extend Forwardable
91
+ def_instance_delegators(:handle,:binmode,:stat,:rewind,
92
+ :each,:each_byte,:each_line,:gets,:getc,
93
+ :read,:readlines,:readline,:sysread,
94
+ :<<,:print,:printf,:puts,:putc,:write,:syswrite,
95
+ :pos,:pos=,:lineno,
96
+ :fileno,
97
+ :close_read,:close_write,
98
+ :fsync,:sync,:sync=,:fcntl,:ioctl)
99
+ def method_missing(sym,*args,&block)
100
+ #p callstr('method_missing',sym,*args)
101
+ handle.__send__(sym,*args,&block)
102
+ end
103
+ DEFAULT_BLKSIZE = 1024
104
+ def _stream_blksize(*streams)
105
+ sizes = []
106
+ streams.each do |s|
107
+ next unless s.kind_of?(::IO)
108
+ next unless s.respond_to?(:stat)
109
+ size = _stat_blksize(s.stat)
110
+ sizes << size if size
111
+ end
112
+ sizes.min || DEFAULT_BLKSIZE
113
+ end
114
+ def _stat_blksize(st)
115
+ s = st.blksize
116
+ return nil unless s
117
+ return nil if s == 0
118
+ s
119
+ end
120
+ end
121
+ class Dir < Base
122
+ def close
123
+ #p "#{callstr('close')} ios=#{@ios}"
124
+ unless @ios.nil?
125
+ @ios.close
126
+ @ios = nil
127
+ end
128
+ end
129
+ def closed?() @ios.nil? end
130
+ extend Forwardable
131
+ def_instance_delegators(:handle,
132
+ :each,:read,
133
+ :pos,:pos=,:tell,:seek,:rewind)
134
+ end
135
+ end
136
+ end
137
+ __END__
@@ -0,0 +1,96 @@
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
+
39
+ require 'rio/abstract_method'
40
+
41
+ module RIO
42
+ module Mode #:nodoc: all
43
+ class Base
44
+ attr_reader :mode
45
+ protected :mode
46
+
47
+ def initialize(arg)
48
+ if arg.kind_of? self.class
49
+ copy(arg)
50
+ else
51
+ @mode = arg
52
+ end
53
+ end
54
+
55
+ def copy(other)
56
+ @mode = other.mode
57
+ end
58
+
59
+ def to_s() @mode.to_s end
60
+
61
+ abstract_method :primarily_read?, :primarily_write?, :allows_both?
62
+
63
+ def read_only?()
64
+ allows_read? and !allows_write?
65
+ end
66
+ def write_only?()
67
+ !allows_read? and allows_read?
68
+ end
69
+ def allows_read?()
70
+ primarily_read? or allows_both?
71
+ end
72
+ def allows_write?()
73
+ primarily_write? or allows_both?
74
+ end
75
+ extend Forwardable
76
+ def_instance_delegators(:@mode,:=~,:==,:===)
77
+ end
78
+ end
79
+ module Mode
80
+ module StrMethods
81
+ def primarily_read?() @mode[0,1] == 'r' end
82
+ def primarily_write?() @mode[0,1] == 'w' or primarily_append? end
83
+ def primarily_append?() @mode[0,1] == 'a' end
84
+ def allows_both?()
85
+ @mode[1,1] == '+'
86
+ end
87
+ end
88
+ class Str < Base
89
+ include StrMethods
90
+ end
91
+ end
92
+ module Mode
93
+ class Int < Base
94
+ end
95
+ end
96
+ end