rio 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
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