rio 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +340 -0
- data/ChangeLog +755 -0
- data/README +65 -0
- data/RUNME.1st.rb +75 -0
- data/Rakefile +312 -0
- data/VERSION +1 -0
- data/doc/README_MSWIN32.txt +39 -0
- data/doc/RELEASE_NOTES +130 -0
- data/doc/generators/template/html/rio.rb +895 -0
- data/doc/rdoc/classes/Kernel.html +181 -0
- data/doc/rdoc/classes/Kernel.src/M000183.html +18 -0
- data/doc/rdoc/classes/RIO.html +508 -0
- data/doc/rdoc/classes/RIO.src/M000001.html +18 -0
- data/doc/rdoc/classes/RIO.src/M000002.html +18 -0
- data/doc/rdoc/classes/RIO.src/M000003.html +18 -0
- data/doc/rdoc/classes/RIO/Doc.html +138 -0
- data/doc/rdoc/classes/RIO/Doc/HOWTO.html +1031 -0
- data/doc/rdoc/classes/RIO/Doc/INTRO.html +1116 -0
- data/doc/rdoc/classes/RIO/Doc/MISC.html +443 -0
- data/doc/rdoc/classes/RIO/Doc/SYNOPSIS.html +325 -0
- data/doc/rdoc/classes/RIO/Rio.html +6333 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000004.html +18 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000005.html +20 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000006.html +27 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000007.html +27 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000008.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000009.html +18 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000010.html +20 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000011.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000012.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000013.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000014.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000015.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000016.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000017.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000018.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000019.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000020.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000021.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000022.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000023.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000024.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000025.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000026.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000027.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000028.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000029.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000030.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000031.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000032.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000033.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000034.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000035.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000036.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000037.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000038.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000039.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000040.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000041.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000042.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000043.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000044.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000045.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000046.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000047.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000048.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000049.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000050.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000051.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000052.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000053.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000054.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000055.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000056.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000057.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000058.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000059.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000060.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000061.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000062.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000063.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000064.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000065.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000066.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000067.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000068.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000069.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000070.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000071.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000072.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000073.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000074.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000075.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000076.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000077.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000078.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000079.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000080.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000081.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000082.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000083.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000084.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000085.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000086.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000087.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000088.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000089.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000090.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000091.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000092.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000093.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000094.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000095.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000096.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000097.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000098.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000099.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000100.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000101.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000102.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000103.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000104.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000105.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000106.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000107.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000108.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000109.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000110.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000111.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000112.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000113.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000114.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000115.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000116.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000117.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000118.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000119.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000120.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000121.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000122.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000123.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000124.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000125.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000126.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000127.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000128.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000129.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000130.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000131.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000132.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000133.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000134.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000135.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000136.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000137.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000138.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000139.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000140.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000141.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000142.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000143.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000144.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000145.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000146.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000147.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000148.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000149.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000150.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000151.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000152.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000153.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000154.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000155.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000156.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000157.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000158.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000159.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000160.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000161.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000162.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000163.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000164.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000165.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000166.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000167.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000168.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000169.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000170.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000171.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000172.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000173.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000174.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000175.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000176.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000177.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000178.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000179.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000180.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000181.html +16 -0
- data/doc/rdoc/classes/RIO/Rio.src/M000182.html +16 -0
- data/doc/rdoc/created.rid +1 -0
- data/doc/rdoc/files/README.html +215 -0
- data/doc/rdoc/files/lib/rio/constructor_rb.html +142 -0
- data/doc/rdoc/files/lib/rio/doc/HOWTO_rb.html +135 -0
- data/doc/rdoc/files/lib/rio/doc/INTRO_rb.html +135 -0
- data/doc/rdoc/files/lib/rio/doc/MISC_rb.html +135 -0
- data/doc/rdoc/files/lib/rio/doc/SYNOPSIS_rb.html +135 -0
- data/doc/rdoc/files/lib/rio/if/basic_rb.html +135 -0
- data/doc/rdoc/files/lib/rio/if/dir_rb.html +135 -0
- data/doc/rdoc/files/lib/rio/if/file_rb.html +135 -0
- data/doc/rdoc/files/lib/rio/if/fileordir_rb.html +135 -0
- data/doc/rdoc/files/lib/rio/if/grande_rb.html +135 -0
- data/doc/rdoc/files/lib/rio/if/internal_rb.html +135 -0
- data/doc/rdoc/files/lib/rio/if/methods_rb.html +135 -0
- data/doc/rdoc/files/lib/rio/if/path_rb.html +135 -0
- data/doc/rdoc/files/lib/rio/if/stream_rb.html +135 -0
- data/doc/rdoc/files/lib/rio/if/test_rb.html +135 -0
- data/doc/rdoc/files/lib/rio/kernel_rb.html +142 -0
- data/doc/rdoc/files/lib/rio_rb.html +153 -0
- data/doc/rdoc/fr_class_index.html +34 -0
- data/doc/rdoc/fr_file_index.html +44 -0
- data/doc/rdoc/fr_method_index.html +210 -0
- data/doc/rdoc/index.html +24 -0
- data/doc/rdoc/rdoc-style.css +384 -0
- data/doc/rfc1738.txt +1403 -0
- data/doc/rfc959.txt +3933 -0
- data/ex/colx.rb +6 -0
- data/ex/findinruby +19 -0
- data/ex/findruby +11 -0
- data/ex/prompt.rb +25 -0
- data/ex/rgb.txt.gz +0 -0
- data/ex/riocat +35 -0
- data/ex/riogunzip +31 -0
- data/ex/riogzip +24 -0
- data/ex/tolf +11 -0
- data/lib/rio.rb +163 -0
- data/lib/rio/abstract_method.rb +57 -0
- data/lib/rio/argv.rb +57 -0
- data/lib/rio/arrayio.rb +199 -0
- data/lib/rio/arycopy.rb +44 -0
- data/lib/rio/assert.rb +115 -0
- data/lib/rio/base.rb +59 -0
- data/lib/rio/constructor.rb +183 -0
- data/lib/rio/context.rb +117 -0
- data/lib/rio/context/chomp.rb +53 -0
- data/lib/rio/context/closeoneof.rb +50 -0
- data/lib/rio/context/cxx.rb +67 -0
- data/lib/rio/context/dir.rb +92 -0
- data/lib/rio/context/gzip.rb +51 -0
- data/lib/rio/context/methods.rb +196 -0
- data/lib/rio/context/stream.rb +170 -0
- data/lib/rio/cp.rb +305 -0
- data/lib/rio/cxdir.rb +79 -0
- data/lib/rio/dir.rb +145 -0
- data/lib/rio/doc.rb +45 -0
- data/lib/rio/doc/HOWTO.rb +691 -0
- data/lib/rio/doc/INTRO.rb +579 -0
- data/lib/rio/doc/MISC.rb +257 -0
- data/lib/rio/doc/SYNOPSIS.rb +170 -0
- data/lib/rio/entrysel.rb +162 -0
- data/lib/rio/exception.rb +42 -0
- data/lib/rio/exception/copy.rb +98 -0
- data/lib/rio/exception/open.rb +62 -0
- data/lib/rio/exception/state.rb +74 -0
- data/lib/rio/ext.rb +62 -0
- data/lib/rio/ext/csv.rb +261 -0
- data/lib/rio/factory.rb +236 -0
- data/lib/rio/file.rb +77 -0
- data/lib/rio/filter/chomp.rb +61 -0
- data/lib/rio/filter/closeoneof.rb +103 -0
- data/lib/rio/filter/gzip.rb +58 -0
- data/lib/rio/ftp.rb +275 -0
- data/lib/rio/ftp/conn.rb +167 -0
- data/lib/rio/ftp/ioh.rb +88 -0
- data/lib/rio/grande.rb +126 -0
- data/lib/rio/handle.rb +101 -0
- data/lib/rio/if.rb +53 -0
- data/lib/rio/if/basic.rb +64 -0
- data/lib/rio/if/dir.rb +362 -0
- data/lib/rio/if/file.rb +57 -0
- data/lib/rio/if/fileordir.rb +247 -0
- data/lib/rio/if/grande.rb +510 -0
- data/lib/rio/if/internal.rb +53 -0
- data/lib/rio/if/methods.rb +612 -0
- data/lib/rio/if/path.rb +413 -0
- data/lib/rio/if/stream.rb +599 -0
- data/lib/rio/if/test.rb +219 -0
- data/lib/rio/impl/path.rb +82 -0
- data/lib/rio/ioh.rb +137 -0
- data/lib/rio/iomode.rb +96 -0
- data/lib/rio/kernel.rb +47 -0
- data/lib/rio/local.rb +63 -0
- data/lib/rio/match.rb +51 -0
- data/lib/rio/matchrecord.rb +254 -0
- data/lib/rio/open3.rb +69 -0
- data/lib/rio/ops/create.rb +78 -0
- data/lib/rio/ops/dir.rb +302 -0
- data/lib/rio/ops/either.rb +117 -0
- data/lib/rio/ops/file.rb +94 -0
- data/lib/rio/ops/path.rb +292 -0
- data/lib/rio/ops/stream.rb +84 -0
- data/lib/rio/ops/stream/input.rb +237 -0
- data/lib/rio/ops/stream/output.rb +96 -0
- data/lib/rio/ops/stream/read.rb +84 -0
- data/lib/rio/ops/stream/write.rb +58 -0
- data/lib/rio/ops/symlink.rb +70 -0
- data/lib/rio/path.rb +117 -0
- data/lib/rio/path/reset.rb +70 -0
- data/lib/rio/record.rb +59 -0
- data/lib/rio/rectype.rb +86 -0
- data/lib/rio/rl/base.rb +147 -0
- data/lib/rio/rl/builder.rb +166 -0
- data/lib/rio/rl/ioi.rb +66 -0
- data/lib/rio/rl/path.rb +141 -0
- data/lib/rio/rl/uri.rb +118 -0
- data/lib/rio/scheme/aryio.rb +89 -0
- data/lib/rio/scheme/cmdio.rb +74 -0
- data/lib/rio/scheme/fd.rb +65 -0
- data/lib/rio/scheme/ftp.rb +73 -0
- data/lib/rio/scheme/http.rb +81 -0
- data/lib/rio/scheme/path.rb +100 -0
- data/lib/rio/scheme/stderr.rb +56 -0
- data/lib/rio/scheme/stdio.rb +71 -0
- data/lib/rio/scheme/strio.rb +82 -0
- data/lib/rio/scheme/sysio.rb +61 -0
- data/lib/rio/scheme/tcp.rb +74 -0
- data/lib/rio/scheme/tempfile.rb +104 -0
- data/lib/rio/state.rb +209 -0
- data/lib/rio/state/error.rb +73 -0
- data/lib/rio/stream.rb +181 -0
- data/lib/rio/stream/base.rb +50 -0
- data/lib/rio/stream/duplex.rb +76 -0
- data/lib/rio/stream/open.rb +203 -0
- data/lib/rio/symantics.rb +46 -0
- data/lib/rio/to_rio.rb +57 -0
- data/lib/rio/uri/file.rb +145 -0
- data/lib/rio/version.rb +52 -0
- data/setup.rb +1331 -0
- data/test/1.rb +14 -0
- data/test/mswin32.rb +28 -0
- data/test/once.rb +7 -0
- data/test/runtests.rb +12 -0
- data/test/runtests_gem.rb +15 -0
- data/test/tc/abs.rb +349 -0
- data/test/tc/all.rb +42 -0
- data/test/tc/cd1.rb +116 -0
- data/test/tc/clearsel.rb +69 -0
- data/test/tc/closeoncopy.rb +91 -0
- data/test/tc/closeoneof.rb +194 -0
- data/test/tc/copy-from.rb +183 -0
- data/test/tc/copy-to.rb +94 -0
- data/test/tc/copy.rb +72 -0
- data/test/tc/copyarray.rb +191 -0
- data/test/tc/copydest.rb +50 -0
- data/test/tc/copydir.rb +192 -0
- data/test/tc/copydirlines.rb +124 -0
- data/test/tc/copylines.rb +40 -0
- data/test/tc/copynonex.rb +121 -0
- data/test/tc/create.rb +104 -0
- data/test/tc/csv.rb +229 -0
- data/test/tc/dir.rb +79 -0
- data/test/tc/dirautoclose.rb +70 -0
- data/test/tc/dirent.rb +180 -0
- data/test/tc/dirss.rb +84 -0
- data/test/tc/each.rb +111 -0
- data/test/tc/each_break.rb +241 -0
- data/test/tc/edf.rb +82 -0
- data/test/tc/entary.rb +230 -0
- data/test/tc/eq.rb +101 -0
- data/test/tc/expand_path.rb +94 -0
- data/test/tc/ext.rb +115 -0
- data/test/tc/fileno.rb +95 -0
- data/test/tc/getrec.rb +140 -0
- data/test/tc/lineno.rb +197 -0
- data/test/tc/lines.rb +66 -0
- data/test/tc/methods.rb +185 -0
- data/test/tc/misc.rb +473 -0
- data/test/tc/nolines.rb +205 -0
- data/test/tc/noqae.rb +873 -0
- data/test/tc/once.rb +6 -0
- data/test/tc/overload.rb +137 -0
- data/test/tc/pa.rb +159 -0
- data/test/tc/pathop.rb +63 -0
- data/test/tc/paths.rb +147 -0
- data/test/tc/qae.rb +494 -0
- data/test/tc/qae_riovar.rb +500 -0
- data/test/tc/records.rb +69 -0
- data/test/tc/rename.rb +224 -0
- data/test/tc/rename_assign.rb +48 -0
- data/test/tc/sub.rb +49 -0
- data/test/tc/symlink.rb +177 -0
- data/test/tc/symlink0.rb +298 -0
- data/test/tc/symlink1.rb +115 -0
- data/test/tc/testcase.rb +152 -0
- metadata +461 -0
data/lib/rio/doc/MISC.rb
ADDED
@@ -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
|
data/lib/rio/entrysel.rb
ADDED
@@ -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
|