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