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,257 @@
1
+ #--
2
+ # ===============================================================================
3
+ # Copyright (c) 2005, Christopher Kleckner
4
+ # All rights reserved
5
+ #
6
+ # This file is part of the Rio library for ruby.
7
+ #
8
+ # Rio is free software; you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation; either version 2 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # Rio is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with Rio; if not, write to the Free Software
20
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ # ===============================================================================
22
+ #++
23
+ #
24
+ # To create the documentation for Rio run the command
25
+ # rake rdoc
26
+ # from the distribution directory. Then point your browser at the 'doc/rdoc' directory.
27
+ #
28
+ # Suggested Reading
29
+ # * RIO::Doc::SYNOPSIS
30
+ # * RIO::Doc::INTRO
31
+ # * RIO::Doc::HOWTO
32
+ # * RIO::Rio
33
+ #
34
+ # <b>Rio is pre-alpha software.
35
+ # The documented interface and behavior is subject to change without notice.</b>
36
+
37
+
38
+ module RIO
39
+ module Doc
40
+ =begin rdoc
41
+
42
+
43
+
44
+ The following example are provided without comment
45
+
46
+ array = rio('afile').readlines
47
+
48
+ rio('afile') > rio('acopy')
49
+
50
+ ary = rio('afile').chomp.lines[0...10]
51
+
52
+ rio('adir').rename.all.files('*.htm') do |file|
53
+ file.ext = '.html'
54
+ end
55
+
56
+ A basic familiarity with ruby and shell operations should allow a casual reader to guess what
57
+ these examples will do. How they are being performed may not be what a casual reader might expect.
58
+ I will explain these example to illustrate the Rio basics.
59
+
60
+ For many more examples please read the HOWTO document and the rdoc documentation.
61
+
62
+ == Example 1.
63
+
64
+ array = rio('afile').readlines
65
+
66
+ This uses IO#readlines to read the lines of 'afile' into an array.
67
+
68
+ === Creating a Rio
69
+
70
+ Rio extends the module Kernel by adding one function _rio_, which acts as a constructor returning a Rio. This
71
+ constructor builds a description of the resource the Rio will access (usually a path). It does not open the
72
+ resource, check for its existance, or do anything except remember its specifcation. _rio_ returns the Rio
73
+ which can be chained to a Rio method as in this example or stored in a variable. This coud have been written
74
+
75
+ ario = rio('afile')
76
+ array = ario.readlines
77
+
78
+ ario = rio('afile')
79
+ In this case the resource specified is a relative path. After the first line
80
+ the Rio does know or care whether it
81
+ is a path to a file nor whether it exists. Rio provides many methods that only deal with a resource
82
+ at this level, much as the standard library classes Pathname and URI. It should be noted at this
83
+ point that Rio paths stored internally as a URL as specified in RFC 1738 and therefore use slashes as
84
+ separators. A resource can also be specified without separators, because _rio_ interprets multiple arguments
85
+ as parts of a path to be joined, and an array as an array of parts to be joined. So the following
86
+ all specify the same resource.
87
+
88
+ rio('adir/afile')
89
+ rio('adir','afile')
90
+ rio(%w/adir afile/)
91
+
92
+ The rio constructor can be used to specify non-file-system resources, but for this example we will restrict
93
+ our discussion to paths to entities on file-systems.
94
+
95
+ array = ario.readlines
96
+ Now that we have a Rio, we can call one of its methods; in this case _readlines_. This is an example of using
97
+ a Rio as a proxy for the builtin IO#readlines. Given the method _readlines_, the Rio opens 'afile' for reading,
98
+ calls readlines on the resulting IO object, closes the IO object, and returns the lines read.
99
+
100
+ == Example 2
101
+
102
+ rio('afile') > rio('acopy')
103
+
104
+ This copies the file 'afile' into the file 'acopy'.
105
+
106
+ The first things that happen here are the creation of the Rios. As described in Example 1, when created
107
+ a Rio simply remembers the specifcation of its resource. In this case, a relative path 'afile' on the
108
+ left and a relative path 'acopy' on the right.
109
+
110
+ Next the Rio#> (copy-to) method is called on the 'afile' Rio with the 'acopy' Rio as its argument. If that
111
+ looks like a greater-than operator to you, think Unix shell, with Rios '>' is the copy-to operator.
112
+
113
+ Upon seeing the copy-to operator, the Rio has all the information it needs to proceed. It determines that
114
+ it must be opened for reading, that its argument must be opened for writing, and that it's contents must
115
+ be copied to the resource referenced by it' argument -- and that is what it does. Then it closes itself and
116
+ its argument.
117
+
118
+ Consider if we had written this example this way.
119
+
120
+ afile = rio('afile')
121
+ acopy = rio('acopy')
122
+ afile > acopy
123
+
124
+ In this case we would still have variables referencing the Rios, and perhaps we would like do things a little
125
+ differently than described above. Be assured that the selection of mode and automatic closing of files are the
126
+ default behaviour and can be changed. Say we wanted 'afile' to remain open so that we could rewind it and make
127
+ a second copy, we might do something like this:
128
+
129
+ afile = rio('afile').nocloseoneof
130
+ afile > rio('acopy1')
131
+ afile.rewind > rio('acopy2')
132
+ afile.close
133
+
134
+ Actually the 'thinking-process' of the Rio when it sees a copy-to operator is much more complex that described above.
135
+ If its argument had been a rio referencing a directory, it would not have opened itself for reading,
136
+ but instead used FileUtils#cp to copy itself; if its argument had been a string, its contents would have ended up
137
+ in the string; If its argument had been an array, its lines would been elements of that array; if its argument had
138
+ been a socket, the its contents would have been copied to the socket. See the documentation for details.
139
+
140
+ == Example 3.
141
+
142
+ array = rio('afile').chomp.lines[0...10]
143
+
144
+ This fills +array+ with the first ten lines of 'afile', with each line chomped
145
+
146
+ The casual observer mentioned above might think that +lines+ returns an array of lines and that this
147
+ is a simple rewording of <tt>array = rio('afile').readlines[0...10]</tt> or even of
148
+ <tt>array = File.new('afile').readlines[0...10]</tt>. They would be wrong.
149
+
150
+ +chomp+ is a configuration method which turns on chomp-mode and returns the Rio. Chomp-mode causes all
151
+ line oriented read operations to perform a String#chomp on each line
152
+
153
+ === Reading files
154
+
155
+ Rio provides four methods to select which part of the file is read and how the file is divided. They are +lines+,
156
+ +records+, +rows+ and +bytes+. Briefly, +lines+ specifies that the file should be read line by line and +bytes(n)+
157
+ specifies that the file should be read in _n_ byte chunks. All four take arguments which can be used to
158
+ filter lines or chunks in or out. For simple Rios +records+ and +rows+ only specify the filter arguments and
159
+ are provided for use be extensions. For example, the CSV extension returns an array of the columns in a line
160
+ when +records+ is used. In the absence of an extension +records+ and +rows+ behave like +lines+.
161
+
162
+ First lets rewrite our example as:
163
+
164
+ array = rio('afile').chomp.lines(0...10).to_a
165
+
166
+ The arguments to lines specify which records are to be read.
167
+ Arguments are interpreted based on their class as follows:
168
+ * Range - interpreted as a range of record numbers to be read
169
+ * Integer - interpreted as a one-element range
170
+ * RegExp - only matching records are processed
171
+ * Symbol - sent to each record, which is processed unless the result is false or nil
172
+ * Proc - called for each record, the record is processed unless the return value is false or nil
173
+ See the documentation for details and examples.
174
+
175
+ In our example we have specified the Range (0...10). The +lines+ method is just configuring the Rio, it does
176
+ not trigger
177
+ any IO operation. The fact that it was called and the arguments it was called with are stored away and the Rio
178
+ is returned for further configuration or an actual IO operation. When an IO operation is called the Range will be
179
+ used to limit processing to the first ten records. For example:
180
+ rio('afile').lines(0...10).each { |line| ... } # block will be called for the first 10 records
181
+ rio('afile').lines(0...10).to_a # the first 10 records will be returned in an array
182
+ rio('afile').lines(0...10) > rio('acopy') # the first 10 records will be copied to 'acopy'
183
+
184
+ "But wait", you say, "In our original example the range was an argument to the subscript operator, not to +lines+".
185
+ This works because the subscript operator processes its arguments as if they had been arguments to the
186
+ most-recently-called selection method and then calls +to_a+ on the rio. So our rewrite of the example
187
+ does precisely the same thing as the original
188
+
189
+ The big difference between the original example and the casual-observer's solution is that hers
190
+ creates an array of the entire contents and only returns the first 10 while the original only puts
191
+ 10 records into the array.
192
+
193
+ As a sidenote, Rios also have an optimization that can really help in certain situations. If records are only
194
+ selected using Ranges, it stops iterating when it is beyond the point where it could possibly ever match. This
195
+ can make a dramatic difference when one is only interested in the first few lines of very large files.
196
+
197
+ == Example 4.
198
+
199
+ rio('adir').rename.all.files('*.htm') do |file|
200
+ file.ext = '.html'
201
+ end
202
+
203
+ This changes the extension of all .htm files below 'adir' to '.html'
204
+
205
+ First we create the rio as always.
206
+
207
+ Next we process the +rename+ method. When used as it is here -- without arguments -- it just turns on rename-mode
208
+ and returns the Rio.
209
+
210
+ +all+ is another configuration method, which causes directories to be processed recursively
211
+
212
+ +files+ is another configuration method. In example 3 we used +lines+ to select what to process when
213
+ iterating through a file. +files+ is used to select what to process when iterating through
214
+ directories. The arguments to +files+ can be the same as those for +lines+ except that Ranges can not
215
+ be used and globs can.
216
+
217
+ In our example, the argument to +files+ is a string which is treated as a glob. As with +lines+, +files+
218
+ does not trigger any IO, it just configures the Rio.
219
+
220
+ === There's no action
221
+
222
+ The previous examples had something that triggered IO: +readlines+, +to_a+, +each+, <tt>> (copy-to)</tt>. This example
223
+ does not. This example illustrates Rio's 'implied each'. All the configuration methods will call each for you
224
+ if a block is given. So, because a block follows the files method, it calls +each+ and passes it the block.
225
+
226
+ Let's recap. At this point we have a Rio with a resource specified. We have configured with a couple of modes,
227
+ 'rename', and 'all', and we have limited the elements we want to process to entries that are files and
228
+ match the glob '*.htm'. +each+ causes the Rio to open the directory and call the block for each entry that is
229
+ both a file and matches the glob. It was also configured with +all+,so it descends into subdirectories to
230
+ find further matches and calles the block for each of them. The argument passed to the block is a Rio
231
+ referencing the entry on the file-system.
232
+
233
+ The _rename_mode_ we set has had no effect on our iteration at all, so why is it there? In general,
234
+ configuration options that are not applicable to a Rio are silently ignored, however, for directories
235
+ some of them are passed on to the Rios for each entry when iterating. Since +rename+ is one such option,
236
+ The example could have been written:
237
+
238
+ rio('adir').all.files('*.htm') do |file|
239
+ file.rename.ext = '.html'
240
+ end
241
+
242
+ The rename-with-no-args method affects the behaviour of the <tt>ext=</tt> option. In this case,
243
+ setting it for the directory, rather than for each file in the block seems to make the intent
244
+ of the code more clear, but that is a matter of personal taste. See the documentation for more
245
+ information on the rename-with-no-args method
246
+
247
+ == Suggested Reading
248
+ * RIO::Doc::SYNOPSIS
249
+ * RIO::Doc::INTRO
250
+ * RIO::Doc::HOWTO
251
+ * RIO::Rio
252
+
253
+ =end
254
+ module MISC
255
+ end
256
+ end
257
+ end
@@ -0,0 +1,170 @@
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
+ :title: Rio
39
+
40
+ module RIO
41
+ # Copyright (c) 2005, Christopher Kleckner.
42
+ # All rights reserved
43
+ #
44
+ # This file is part of the Rio library for ruby.
45
+ # Rio is free software; you can redistribute it and/or modify it under the terms of
46
+ # the {GNU General Public License}[http://www.gnu.org/licenses/gpl.html] as published by
47
+ # the Free Software Foundation; either version 2 of the License, or
48
+ # (at your option) any later version.
49
+ #
50
+ module Doc #:doc:
51
+ =begin rdoc
52
+
53
+ = Rio - Ruby I/O Comfort Class
54
+
55
+ Rio is a convenience class wrapping much of the functionality of
56
+ IO, File, Dir, Pathname, FileUtils, Tempfile, StringIO, OpenURI, Zlib, and CSV.
57
+
58
+ == SYNOPSIS
59
+ For the following assume:
60
+ astring = ""
61
+ anarray = []
62
+
63
+ Copy a file into a string
64
+ rio('afile') > astring
65
+
66
+ Copy the chomped lines of a file into an array
67
+ rio('afile').chomp > anarray
68
+
69
+ Copy a file into another file
70
+ rio('afile') > rio('another_file')
71
+
72
+ Copy a file into a directory
73
+ rio('afile') > rio('adir')
74
+
75
+ Copy an entire directory structure into another directory
76
+ rio('adir') > rio('another_directory')
77
+
78
+ Copy a web page into a file
79
+ rio('http://rubydoc.org/') > rio('afile')
80
+
81
+ Copy a file from a ftp server into a file
82
+ rio('ftp://host/afile.gz') > rio('afile.gz')
83
+
84
+ Copy a gzipped file un-gzipping it
85
+ rio('afile.gz').gzip > rio('afile')
86
+
87
+ Copy a file from a ftp server into a local file un-gzipping it
88
+ rio('ftp://host/afile.gz').gzip > rio('afile')
89
+
90
+ Copy a plain file, gzipping it
91
+ rio('afile.gz').gzip < rio('afile')
92
+
93
+ Iterate over the entries in a directory
94
+ rio('adir').entries { |entrio| ... }
95
+
96
+ Iterate over only the files in a directory
97
+ rio('adir').files { |entrio| ... }
98
+
99
+ Iterate over only the .rb files in a directory
100
+ rio('adir').files('*.rb') { |entrio| ... }
101
+
102
+ Create an array of the .rb entries in a directory
103
+ anarray = rio('adir')['*.rb']
104
+
105
+ Iterate over the .rb files in a directory and its subdirectories
106
+ rio('adir').all.files('*.rb') { |entrio| ... }
107
+
108
+ Create an array of the .rb entries in a directory and its subdirectories
109
+ anarray = rio('adir').all['*.rb']
110
+
111
+ Create an array of the .rb files in a directory and its subdirectories
112
+ anarray = rio('adir').all.files['*.rb']
113
+
114
+ Copy an entire directory structure but only the .rb files from a directory and its subdirectories
115
+ into another directory
116
+ rio('adir').dirs.files('*.rb') > rio('another_directory')
117
+
118
+ Iterate over the chomped lines of a file
119
+ rio('afile').chomp.lines { |line| ... }
120
+
121
+ Put the chomped lines of a file into an array
122
+ anarray = rio('afile').chomp.lines[]
123
+
124
+ Iterate over the first 10 chomped lines of a file
125
+ rio('afile').chomp.lines(0..9) { |line| ... }
126
+
127
+ Put the first 10 chomped lines of a file into an array
128
+ anarray = rio('afile').chomp.lines[0..9]
129
+
130
+ Copy the first 10 lines of a file into another file
131
+ rio('afile').lines(0..9) > rio('another_file')
132
+
133
+ Copy the first 10 lines of a file to stdout
134
+ rio('afile').lines(0..9) > rio(?-)
135
+
136
+ Copy the first 10 lines of a gzipped file to stdout
137
+ rio('afile.gz').gzip.lines(0..9) > rio(?-)
138
+
139
+ Copy the first 10 lines of a gzipped file on an ftp server to stdout
140
+ rio('ftp://host/afile.gz').gzip.lines(0..9) > rio(?-)
141
+
142
+ Put the first 100 chomped lines of a gzipped file into an array
143
+ anarray = rio('afile.gz').gzip[0...100]
144
+
145
+ Copy the output of th ps command into an array, skipping the header line and the ps command entry
146
+ rio(?-,'ps -a').nolines(0,/ps$/) > anarray
147
+
148
+ Prompt for input and return what was typed
149
+ ans = rio(?-).print("Type Something: ").chomp.gets
150
+
151
+ Change the extension of all files with the extension '.htm' in a directory and its
152
+ subdirectories to have the extension '.html'
153
+ rio('adir').rename.all.files('*.htm') do |htmfile|
154
+ htmfile.extname = '.html'
155
+ end
156
+
157
+ Create a symbolic link 'asymlink' in 'adir' which refers to 'adir/afile'
158
+ rio('adir/afile').symlinke('adir/asymlink')
159
+
160
+ === SUGGESTED READING
161
+
162
+ * RIO::Doc::INTRO
163
+ * RIO::Doc::HOWTO
164
+ * RIO::Rio
165
+
166
+ =end
167
+ module SYNOPSIS #:doc:
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,162 @@
1
+ #--
2
+ # ===============================================================================
3
+ # Copyright (c) 2005, Christopher Kleckner
4
+ # All rights reserved
5
+ #
6
+ # This file is part of the Rio library for ruby.
7
+ #
8
+ # Rio is free software; you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation; either version 2 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # Rio is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with Rio; if not, write to the Free Software
20
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ # ===============================================================================
22
+ #++
23
+ #
24
+ # To create the documentation for Rio run the command
25
+ # rake rdoc
26
+ # from the distribution directory. Then point your browser at the 'doc/rdoc' directory.
27
+ #
28
+ # Suggested Reading
29
+ # * RIO::Doc::SYNOPSIS
30
+ # * RIO::Doc::INTRO
31
+ # * RIO::Doc::HOWTO
32
+ # * RIO::Rio
33
+ #
34
+ # <b>Rio is pre-alpha software.
35
+ # The documented interface and behavior is subject to change without notice.</b>
36
+
37
+
38
+ require 'rio/abstract_method'
39
+ class ::Object #:nodoc: all
40
+ def true?() true end
41
+ def false?() false end
42
+ end
43
+ # 2314
44
+ module RIO
45
+ module Match #:nodoc: all
46
+ module Entry
47
+ class Base
48
+ attr_reader :match_to
49
+ def initialize(match_to)
50
+ @match_to = match_to
51
+ end
52
+ def inspect()
53
+ @match_to.to_s
54
+ end
55
+ def ===(el) self =~ el end
56
+ abstract_method :=~
57
+
58
+ end
59
+ class Any < Base
60
+ def =~(entry) true end
61
+ end
62
+ class None < Base
63
+ def =~(entry) false end
64
+ end
65
+ class Glob < Base
66
+ def =~(entry) Impl::U.fnmatch?(entry.filename.to_s,@match_to) end
67
+ end
68
+ class Regexp < Base
69
+ def =~(entry) @match_to =~ entry.filename.to_s end
70
+ end
71
+ class Proc < Base
72
+ def =~(entry) @match_to[entry] end
73
+ end
74
+ class Symbol < Base
75
+ def =~(entry) entry.__send__(@match_to) end
76
+ end
77
+ def create(arg)
78
+ case arg
79
+ when ::String then Glob.new(arg)
80
+ when ::Regexp then Regexp.new(arg)
81
+ when ::Proc then Proc.new(arg)
82
+ when ::Symbol then Symbol.new(arg)
83
+ when ::TrueClass then Any.new(arg)
84
+ when ::FalseClass then None.new(arg)
85
+ else raise ArgumentError,"a String,Regexp,Proc or Symbol is required (#{arg})"
86
+ end
87
+ end
88
+ module_function :create
89
+ end
90
+ end
91
+ end
92
+ module RIO
93
+ module Match
94
+ module Entry
95
+ class List
96
+ def callstr(func,*args)
97
+ self.class.to_s+'['+self.to_s+']'+'.'+func.to_s+'('+args.join(',')+')'
98
+ end
99
+ attr_reader :sym
100
+ attr_accessor :list
101
+ def initialize(sym,*args)
102
+ @sym = sym
103
+ @list = args.map { |arg| Match::Entry.create(arg) }
104
+ end
105
+ def inspect()
106
+ @sym.to_s+"("+@list.inspect+")"
107
+ end
108
+ def <<(el)
109
+ @list << el
110
+ end
111
+ def ===(me_list)
112
+ @sym == me_list.sym
113
+ end
114
+ def =~(el)
115
+ el.__send__(@sym) and (@list.empty? or @list.detect { |sel| sel =~ el })
116
+ end
117
+ extend Forwardable
118
+ def_instance_delegators(:@list,:each)
119
+ end
120
+ class Sels < Array
121
+ def <<(entry_list)
122
+ same_sym = self.grep(entry_list)
123
+ if same_sym.empty?
124
+ super
125
+ else
126
+ same_sym[0].list = entry_list.list
127
+ end
128
+ end
129
+ end
130
+ class Selector
131
+ def initialize(sel,nosel)
132
+ @sel = sel
133
+ @nosel = nosel
134
+ end
135
+ def inspect()
136
+ str = sprintf('#<Selector:0x%08x',self.object_id)
137
+ str += " @sel=#{@sel.inspect}"
138
+ str += " @nosel=#{@nosel.inspect}"
139
+ str += ">"
140
+ str
141
+ end
142
+
143
+ private
144
+
145
+ def yes?(el)
146
+ @sel.nil? or @sel.detect { |match_entry| match_entry =~ el }
147
+ # @sel.nil? or @sel.grep(el)
148
+ end
149
+ def no?(el)
150
+ @nosel.detect { |match_entry| match_entry =~ el } unless @nosel.nil?
151
+ end
152
+
153
+ public
154
+
155
+ def match?(el)
156
+ yes?(el) and not no?(el)
157
+ end
158
+ end
159
+ end
160
+
161
+ end
162
+ end