lib/rio/doc/HOWTO.rb in rio-0.4.2 vs lib/rio/doc/HOWTO.rb in rio-0.5.1
- old
+ new
@@ -1,8 +1,8 @@
#--
-# ===============================================================================
-# Copyright (c) 2005,2006,2007,2008 Christopher Kleckner
+# ===========================================================================
+# Copyright (c) 2005-2012 Christopher Kleckner
# All rights reserved
#
# This file is part of the Rio library for ruby.
#
# Rio is free software; you can redistribute it and/or modify
@@ -16,722 +16,700 @@
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Rio; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-# ===============================================================================
+# ===========================================================================
#++
#
-# To create the documentation for Rio run the command
-# ruby build_doc.rb
-# from the distribution directory.
+module RIO
+module Doc #:doc:
+
+##
+# == HOWTO...
#
+# === Read a single file
+# ario = rio('afile')
+# string = ""
+# array = []
+#
+# * Read a file into a string.
+# # method 1
+# string = ario.contents
+# # method 2
+# ario > string
+#
+# * Append a file onto a string.
+# # method 1
+# ario >> string
+# # method 2
+# string += ario.contents
+#
+# * Read lines of a file into an array
+# # method 1
+# array = ario[]
+# # method 2
+# ario > array
+# # method 3
+# array = ario.to_a
+# # method 4
+# array = ario.readlines
+#
+# * Append lines of a file into an array
+# # method 1
+# ario >> array
+# # method 2
+# array += ario.lines[]
+#
+# * Read the first 10 lines of a file into an array
+# # method 1
+# array = ario[0...10]
+# # method 2
+# array = ario.lines[0...10]
+# # method 3
+# ario.lines(0...10) > array
+#
+# * Read lines of a file into an array, with each line chomped
+# # method 1
+# array = ario.chomp[]
+# # method 2
+# array = ario.chomp.lines[]
+# # method 3
+# ario.chomp > array
+#
+# * Append the first 10 lines of a file into an array, with each line chomped
+# # method 1
+# array += ario.chomp[0...10]
+# # method 2
+# array += ario.chomp.lines[0...10]
+# # method 3
+# ario.chomp.lines(0...10) >> array
+#
+# * Read all lines starting with 'require' into an array, with each line chomped
+# # method 1
+# array = ario.chomp[/^\s*require/]
+# # method 2
+# array = ario.chomp.lines[/^\s*require/]
+# # method 3
+# ario.chomp.lines(/^\s*require/) > array
+#
+# * Read a gzipped file into a string
+# # method 1
+# rio('afile.gz').gzip > string
+# # method 2
+# string = rio('afile.gz').gzip.contents
+#
+# * Append a gzipped file into a string
+# # method 1
+# rio('afile.gz').gzip >> string
+# # method 2
+# string += rio('afile.gz').gzip.contents
+#
+# * Iterate through all the lines of a file
+# # method 1
+# rio('afile').lines { |line| ... }
+# # method 2
+# rio('afile').each { |line| ... }
+# # method 3
+# rio('afile').each_line { |line| ... }
+#
+#
+# * Iterate through the lines of a gzipped file
+# rio('afile.gz').gzip { |line| ... }
+#
+# * Iterate through all non-empty lines of a gzipped file, with each line chomped
+# rio('afile.gz').gzip.chomp.skiplines(:empty?) { |line| ... }
+#
+# * Iterate through the first 100 lines of a file
+# # method 1
+# rio('afile').lines(0...100) { |line| ... }
+#
+# * Iterate through the first line and all ruby comment lines in a gzipped file
+# rio('afile.rb.gz').gzip.lines(0,/^\s*#/) { |line| ... }
+#
+# * Iterate through the lines of a ruby file that are neither empty nor comments, with all lines chomped
+# rio('afile.rb').chomp.skiplines(/^\s*#/,:empty?) { |line| ... }
+#
+# * Read all the comment lines from a ruby file into an array with all lines chomped
+# # method 1
+# array = rio('afile.rb').chomp[/^\s*#/]
+# # method 2
+# array = rio('afile.rb').chomp.lines[/^\s*#/]
+# # method 3
+# rio('afile.rb').chomp.lines(/^\s*#/) > array
+#
+#
+# * Read lines of a file into an array, with each line chomped, skipping any lines longer than 1024 chars
+# # method 1
+# array = ario.chomp[proc{ |line| line.length <= 1024}]
+# # method 2
+# ario.chomp.lines(proc{ |line| line.length <= 1024}) > array
+# # method 3
+# array = ario.chomp.skiplines[proc{ |line| line.length > 1024}]
+# # method 4
+# array = ario.chomp.lines(proc{ |line| line.length <= 1024}).to_a
+#
+# ---
+#
+# === Write to a single file
+#
+# ario = rio('afile')
+# string = "A String\n"
+# array = ["Line 0\n","Line 1\n"]
+#
+# * Write a string to a file, leaving the Rio open
+# # method 1
+# ario.puts(string)
+# # method 2
+# ario.print(string)
+# # method 3
+# ario.noautoclose < string
+#
+# * Write a string to a file and close the file
+# # method 1
+# rio('afile') < string
+# # method 2
+# ario.print!(string)
+# # method 3
+# ario.print(string).close
+#
+# * Append a string to a file, leaving the Rio open
+# # method 1
+# ario.a.puts(string)
+# # method 2
+# ario.a.print(string)
+# # method 3
+# ario.noautoclose << string
+#
+# * Append a string to a file and close the file
+# # method 1
+# rio('afile') << string
+# # method 2
+# rio('afile').a.print!(string)
+# # method 3
+# rio('afile').a.print(string).close
+#
+# * Write an array to a file, leaving the Rio open
+# # method 1
+# ario = rio('afile').nocloseoncopy
+# ario << array
+# # method 2
+# ario.noautoclose < array
+#
+# * Write an array to a file and close the file
+# # method 1
+# rio('afile') < array
+#
+#
+# ---
+#
+# === Select records
+# ario = rio('afile')
+# string = ""
+# array = []
+#
+# * Put lines one thru ten and line 100 into an array
+# # method 1
+# array = ario[0..9,99]
+# # method 2
+# array = ario.lines[0..9,99]
+# # method 3
+# ario.lines(0..9,99) > array
+#
+# * Put lines one thru ten,line 100 and lines starting with 'rio4ruby' into an array
+# # method 1
+# array = ario[0..9,99,/^rio4ruby/]
+# # method 2
+# array = ario.lines[0..9,99,/^rio4ruby/]
+# # method 3
+# ario.lines(0..9,99,/^rio4ruby/) > array
+#
+# * Put lines that are longer than 128 bytes into an array
+# # method 1
+# array = ario[proc{ |l| l.length > 128}]
+# # method 2
+# array = ario.lines[proc{ |l| l.length > 128}]
+# # method 3
+# array = ario.skiplines[proc{ |l| l.length <= 128}]
+# # method 4
+# array = ario.skip.lines[proc{ |l| l.length <= 128}]
+#
+# * Copy all lines that do not start with 'rio4ruby' into another file
+# # method 1
+# ario.skiplines(/^rio4ruby/) > rio('another_file')
+# # method 2
+# ario.lines.skiplines(/^rio4ruby/) > rio('another_file')
+# # method 3
+# rio('another_file') < ario.skiplines(/^rio4ruby/)
+#
+# * Copy the first 10 lines and lines starting with 'rio4ruby', but exclude any lines longer than 128 bytes
+# # method 1
+# ario.lines(0...10,/^rio4ruby/).skiplines(proc{ |l| l.length > 128}] > rio('another_file')
+# # method 2
+# rio('another_file') < ario.lines(0...10,/^rio4ruby/).skiplines(proc{ |l| l.length > 128})
+#
+#
+#
+# ---
+#
+# === Select directory entries
+# ario = rio('adir')
+# string = ""
+# array = []
+#
+# * Put all entries with the extension '.txt' into an array
+# # method 1
+# array = ario['*.txt']
+# # method 2
+# array = ario[/\.txt$/]
+# # method 3
+# array = ario.entries['*.txt']
+#
+# * Put all files with the extension '.txt' into an array
+# # method 1
+# array = ario.files['*.txt']
+# # method 2
+# array = ario.files[/\.txt$/]
+# # method 3
+# array = ario.files['*.txt']
+#
+# * Put all entries with the extension '.txt' into an array, including those in subdirectories
+# # method 1
+# array = ario.all['*.txt']
+# # method 2
+# array = ario.all[/\.txt$/]
+# # method 3
+# array = ario.all.entries['*.txt']
+#
+# * Put all entries with the extension '.txt' into an array, including those in subdirectories, except those
+# in subdirectories name '.svn'
+# # method 1
+# array = ario.norecurse('.svn').all['*.txt']
+# # method 2
+# array = ario.norecurse(/^\.svn$/).all[/\.txt$/]
+# # method 3
+# array = ario.norecurse('.svn').entries['*.txt']
+# # method 4
+# array = ario.entries('*.txt').norecurse('.svn').to_a
+# # method 5
+# array = ario.norecurse('.svn')['*.txt']
+#
+# * Put all directories into an array
+# # method 1
+# array = ario.dirs[]
+# # method 2
+# array = ario.dirs.to_a
+#
+# * Put all directories (recursively) into an array
+# # method 1
+# array = ario.all.dirs[]
+# # method 2
+# array = ario.all.dirs.to_a
+#
+# * Put all entries (recursively) into an array, but limit the depth of recursion to 2
+# # method 1
+# array = ario.norecurse(3).to_a
+#
+#
+# * Iterate through ruby files in a directory and subdirectories skipping
+# those in the '.svn', and 'pkg' directories
+# # method 1
+# is_ruby_exe = proc{ |f| f.executable? and f[0][0] =~ /^#!.+ruby/ }
+# ario.norecurse('.svn','pkg').files('*.rb',is_ruby_exe) { |f| ... }
+# # method 2
+# is_ruby_exe = proc{ |f| f.executable? and f.gets =~ /^#!.+ruby/ }
+# ario.norecurse('.svn','pkg').files('*.rb',is_ruby_exe) { |f| ... }
+#
+# * Put all files excluding those that are symlinks to files in an array
+# # method 1
+# array = ario.skipfiles[:symlink?]
+# # method 2
+# array = ario.skipfiles(:symlink?).files[]
+# # method 3
+# array = ario.skipfiles(:symlink?).to_a
+# # method 4
+# array = ario.files.skipfiles[:symlink?]
+#
+# * Put all entries that are not files (or symlinks to files) into an array
+# # method 1
+# array = ario.skipfiles[]
+# # method 2
+# array = ario.skipfiles.to_a
+#
+# * Put all entries that are symlinks to files into an array
+# # method 1
+# array = ario.files[proc{|f| f.file? and f.symlink?}]
+# # method 2
+# array = ario.files(proc{|f| f.file? and f.symlink?}).to_a
+#
+# * Put all directories except those named '.svn' into an array
+# # method 1
+# array = ario.skipdirs['.svn']
+# # method 2
+# array = ario.skipdirs[/^\.svn$/]
+# # method 3
+# array = ario.skipdirs('.svn').to_a
+# # method 4
+# array = ario.skipdirs('.svn').dirs[]
+# # method 5
+# array = ario.skipdirs('.svn')[]
+#
+#
+# ---
+#
+# === Read and writing files
+# ario = rio('afile')
+# string = ""
+# array = []
+#
+# * Copy the contents of one file into another file
+# # method 1
+# rio('srcfile') > rio('dstfile')
+# # method 2
+# rio('dstfile') < rio('srcfile')
+# # method 3
+# rip('dstfile').print!(rio('srcfile').contents)
+#
+# * Append the contents of one file to another file
+# # method 1
+# rio('srcfile') >> rio('dstfile')
+# # method 2
+# rio('dstfile') << rio('srcfile')
+# # method 3
+# rip('dstfile').a.print!(rio('srcfile').contents)
+#
+# * Copy the first 10 lines of one file to another file
+# # method 1
+# rio('srcfile').lines(0...10) > rio('dstfile')
+# # method 2
+# rio('dstfile') < rio('srcfile').lines(0...10)
+# # method 3
+# rio('dstfile') < rio('srcfile').lines[0...10]
+#
+# * Concatenate several files into one
+# # method 1
+# rio('dstfile') < [ rio('src1'), rio('src2'), rio('src3') ]
+# # method 2
+# rio('dstfile') < rio('src1') << rio('src2') << rio('src3')
+#
+# * Copy a web page into a file
+# # method 1
+# rio('http://ruby-doc.org/') > rio('afile')
+# # method 2
+# rio('afile') < rio('http://ruby-doc.org/')
+# # method 3
+# rio('afile').print!(rio('http://ruby-doc.org/').contents)
+#
+# * Append the output of the daytime server running on the localhost to a file
+# # method 1
+# rio("tcp://localhost:daytime") >> rio('afile')
+# # method 2
+# rio("tcp:",'localhost','daytime') >> rio('afile')
+# # method 3
+# rio('afile') << rio("tcp://:daytime")
+# # method 4
+# rio('afile') << rio("tcp://:13")
+#
+# * Copy the first line and all lines containing 'http:' to a file
+# # method 1
+# rio('srcfile').lines(0,/http:/) > rio('dstfile')
+# # method 2
+# rio('dstfile') < rio('srcfile').lines(0,/http:/)
+# # method 3
+# rio('dstfile') < rio('srcfile').lines[0,/http:/]
+# # method 4
+#
+# * Create a gzipped copy of a file
+# # method 1
+# rio('afile') > rio('afile.gz').gzip
+# # method 2
+# rio('afile.gz').gzip < rio('afile')
+# # method 3
+# rio('afile.gz').gzip.print!( rio('afile').contents )
+#
+# * Create an ungzipped copy of a gzipped file
+# # method 1
+# rio('afile') < rio('afile.gz').gzip
+# # method 2
+# rio('afile.gz').gzip > rio('afile')
+# # method 3
+# rio('afile').print!( rio('afile.gz').gzip.contents )
+#
+# * Copy the first 100 lines of gzipped file on a webserver into a local file
+# # method 1
+# rio('http://aserver/afile.gz').gzip.lines(0...100) > rio('afile')
+#
+#
+# * Create a file composed of a header from another file, the output of the 'ps' command, some text and
+# its creation time pulled from the daytime server running on your localhost
+# # method 1
+# rio('out') < [ rio('header'), rio(?-,'ps'), "Created on ", rio('tcp://:daytime') ]
+# # method 2
+# rio('out') < rio('header') << rio(?-,'ps') << "Created on: " << rio("tcp://:daytime")
+#
+#
+# ---
+#
+# === Reading multiple files
+# ario = rio('adir')
+# string = ""
+# array = []
+#
+# * Count the lines of code in a directory tree of ruby source files
+# # method 1
+# cnt = ario.all.files('*.rb').skiplines[/^\s*#/,/^\s*$/].size
+# # method 2
+# cnt = ario.all.files('*.rb').skiplines(/^\s*#/,/^\s*$/).inject(0) { |sum,l| sum += 1 }
+#
+# * Concatanate the contents of all .txt files in a directory into an array
+# # method 1
+# array = ario.lines.files['*.txt']
+# # method 2
+# array = ario.files('*.txt').lines[]
+# # method 3
+# ario.files('*.txt').lines > array
+#
+# * Concatanate the first line of all .txt files in a directory into an array
+# # method 1
+# array = ario.lines(0).files['*.txt']
+# # method 2
+# array = ario.files('*.txt').lines[0]
+# # method 3
+# ario.files('*.txt').lines(0) > array
+#
+# * Copy all .txt files (but only their first ten lines) in a directory into another directiory
+# # method 1
+# ario.files('*.txt').lines(0...10) > rio('another_dir')
+#
+# ---
+#
+# === Read and write using Standard IO
+# string = ""
+# array = []
+#
+# * Prompt for input and return what was typed
+# # method 1
+# ans = rio(?-).chomp.print("Type Something: ").gets
+# # method 2
+# stdio = rio(?-).chomp
+# ans = stdio.print("Type Something: ").gets
+#
+# * Create a Rio tied to stdin or stdout, depending on how it is used
+# stdio = rio(?-)
+#
+# * Create a Rio tied to stderr
+# stderr = rio(?=)
+#
+# * Write a string to stdout
+# # method 1
+# rio(?-).puts("Hello World")
+# # method 2
+# rio(?-) << "Hello World\n"
+# # method 3
+# rio(?-) < "Hello World\n"
+#
+# * Read a string from stdin with the input chomped
+# # method 1
+# ans = rio(?-).chomp.gets
+# # method 2
+# stdio = rio(?-).chomp
+# ans = stdio.gets
+#
+# * Read from stdin until end of file with the result going into a string
+# # method 1
+# rio(?-) >> string
+# # method 2
+# rio(?-) > string
+#
+# * Read from stdin until end of file with the chomped lines going into an array
+# # method 1
+# rio(?-).chomp >> array
+# # method 2
+# rio(?-).chomp > array
+#
+# * Read from stdin until end of file with the result going into a file
+# # method 1
+# rio(?-) > rio('afile')
+# # method 2
+# rio('afile') < rio(?-)
+#
+# * Read from stdin until end of file with the result appended to a file
+# # method 1
+# rio(?-) >> rio('afile')
+# # method 2
+# rio('afile') << rio(?-)
+#
+# * Write a message to stderr
+# # method 1
+# rio(?=).puts("Hello Error")
+# # method 2
+# rio(?=) << "Hello Error\n"
+# # method 3
+# rio(?=) < "Hello Error\n"
+#
+# * Dump a file to stdout
+# # method 1
+# rio('afile') > ?-
+# # method 2
+# rio('afile') > rio(?-)
+# # method 3
+# rio(?-) << rio('afile')
+# # method 4
+# rio('afile') >> ?-
+# # method 5
+# rio(?-) < rio('afile')
+# # method 6
+# rio(?-).print(rio('afile').contents)
+#
+# * Emulate a simplified unix 'head' command which reads from stdin and writes the first 10 lines to stdout
+# # method 1
+# rio(?-).lines(0..9) > ?-
+#
+# ---
+#
+# === Reading and writing from processes as one might do with popen
+#
+# * Read the output of the 'ps' command into an array without the header line or the line representing
+# the 'ps' command itself
+# ps = rio(?-,'ps -a').skiplines[0,/ps$/]
+#
+# * Run an external program, copying its input from one location and its output to another,
+# and make it look very much like a shell command.
+#
+# infile = rio(?","Hello Kitty\n")
+# outfile = rio('out.txt')
+#
+# # method 1
+# cat = rio(?-,'cat').w!
+# cat <infile >outfile
+#
+# # method 2
+# infile | 'cat' | outfile
+#
+# ---
+#
+# === Renaming and moving files
+# string = ""
+# array = []
+#
+# * Rename the file 'a' to 'b'
+# # method 1
+# rio('a').rename('b')
+# # method 2
+# rio('a').rename.filename = 'b'
+#
+# * Rename a file and leave the Rio referencing the files old name
+# ario = rio('a')
+# # method 1
+# ario.rename('b')
+#
+# * Rename a file and change the Rio to reference the new file name
+# ario = rio('a')
+# # method 1
+# ario.rename!('b')
+#
+# * Rename the file 'index.htm' to 'index.html'
+# # method 1
+# rio('index.htm').rename('index.html')
+# # method 2
+# rio('index.htm').rename.extname = '.html'
+#
+# * Rename the file 'index.html' to 'welcome.html'
+# # method 1
+# rio('index.html').rename('welecome.html')
+# # method 2
+# rio('index.htm').rename.basename = 'welcome'
+#
+# * Move a file from directory 'src' to directory 'dst'
+# # method 1
+# rio('src/afile').rename('dst/afile')
+# # method 2
+# rio('src/afile').rename.dirname = 'dst'
+#
+# * Change a file to have the extension '.html' leaving the rest of it as is
+# # method 1
+# ario.rename.extname = '.html'
+#
+# * Change a files basename to 'rio4ruby' without changing its extension
+# # method 1
+# ario.rename.basename = 'rio4ruby'
+#
+# * Change a file ending with '.tar.gz' to end with '.tgz'
+# # method 1
+# ario.rename.ext('.tar.gz').extname = '.tgz'
+#
+# * Change the extension of all files with the extension '.htm' in a directory to have the
+# extension '.html'
+# # method 1
+# rio('adir').rename.files('*.htm') do |htmfile|
+# htmlfile.extname = '.html'
+# end
+# # method 2
+# rio('adir').files('*.htm') do |htmfile|
+# htmlfile.rename.extname = '.html'
+# end
+#
+# * Change the extension of all files with the extension '.htm' in a directory and its
+# subdirectories to have the extension '.html'
+# # method 1
+# rio('adir').rename.all.files('*.htm') do |htmfile|
+# htmfile.extname = '.html'
+# end
+# # method 2
+# rio('adir').all.files('*.htm') do |htmfile|
+# htmfile.rename.extname = '.html'
+# end
+#
+# * Move a file in an arbitrary directory into the current working directory.
+# # method 1
+# rio('arb/i/trary/di/rec/tory/afile').rename.dirname = '.'
+#
+#
+# ---
+#
+# === Manipulate a Rio's path
+# string = ""
+# array = []
+#
+# * Create a Rio with an additional subdirectory appended
+# ap = rio('adir')
+# # method 1
+# ap /= 'subdirectory'
+# # method 2
+# ap = ap.join('subdirectory')
+# # method 3
+# ap = rio(ap,'subdirectory')
+#
+# * Create a Rio from an array of subdirectories
+# dirs = ['adir','subdir1','subdir2']
+# # method 1
+# ario = rio(dirs)
+#
+# * Create an array of subdirectories from a Rio
+# # method 1
+# anarray = rio('adir/subdir1/subdir2').split
+#
+# * Append a string to a path
+# # method 1
+# ario = rio('apath') + astring
+# # method 2
+# ario = rio('apath')
+# ario += astring
+#
+# * create a directory 'links' with a symlink pointing to each .rb file in directory 'lib' (including subdirectories)
+# lib = rio('lib')
+# links = rio('links').delete!.mkdir
+# lib.all.files("*.rb") do |f|
+# f.symlink( f.dirname.sub(/^#{lib}/,links).mkdir )
+# end
+#
+# ----
+#
# Suggested Reading
# * RIO::Doc::SYNOPSIS
# * RIO::Doc::INTRO
-# * RIO::Doc::HOWTO
-# * RIO::Doc::EXAMPLES
# * RIO::Rio
-#
-
-module RIO
-module Doc #:doc:
-=begin rdoc
-
-= Rio - Ruby I/O Facilitator
-
-Rio is a facade for most of the standard ruby classes that deal with I/O;
-providing a simple, intuitive, succinct interface to the functionality
-provided by IO, File, Dir, Pathname, FileUtils, Tempfile, StringIO, OpenURI
-and others. Rio also provides an application level interface which allows many
-common I/O idioms to be expressed succinctly.
-
-== HOWTO...
-
-=== Read a single file
- ario = rio('afile')
- string = ""
- array = []
-
-* Read a file into a string.
- # method 1
- string = ario.contents
- # method 2
- ario > string
-
-* Append a file onto a string.
- # method 1
- ario >> string
- # method 2
- string += ario.contents
-
-* Read lines of a file into an array
- # method 1
- array = ario[]
- # method 2
- ario > array
- # method 3
- array = ario.to_a
- # method 4
- array = ario.readlines
-
-* Append lines of a file into an array
- # method 1
- ario >> array
- # method 2
- array += ario.lines[]
-
-* Read the first 10 lines of a file into an array
- # method 1
- array = ario[0...10]
- # method 2
- array = ario.lines[0...10]
- # method 3
- ario.lines(0...10) > array
-
-* Read lines of a file into an array, with each line chomped
- # method 1
- array = ario.chomp[]
- # method 2
- array = ario.chomp.lines[]
- # method 3
- ario.chomp > array
-
-* Append the first 10 lines of a file into an array, with each line chomped
- # method 1
- array += ario.chomp[0...10]
- # method 2
- array += ario.chomp.lines[0...10]
- # method 3
- ario.chomp.lines(0...10) >> array
-
-* Read all lines starting with 'require' into an array, with each line chomped
- # method 1
- array = ario.chomp[/^\s*require/]
- # method 2
- array = ario.chomp.lines[/^\s*require/]
- # method 3
- ario.chomp.lines(/^\s*require/) > array
-
-* Read a gzipped file into a string
- # method 1
- rio('afile.gz').gzip > string
- # method 2
- string = rio('afile.gz').gzip.contents
-
-* Append a gzipped file into a string
- # method 1
- rio('afile.gz').gzip >> string
- # method 2
- string += rio('afile.gz').gzip.contents
-
-* Iterate through all the lines of a file
- # method 1
- rio('afile').lines { |line| ... }
- # method 2
- rio('afile').each { |line| ... }
- # method 3
- rio('afile').each_line { |line| ... }
-
-
-* Iterate through the lines of a gzipped file
- rio('afile.gz').gzip { |line| ... }
-
-* Iterate through all non-empty lines of a gzipped file, with each line chomped
- rio('afile.gz').gzip.chomp.skiplines(:empty?) { |line| ... }
-
-* Iterate through the first 100 lines of a file
- # method 1
- rio('afile').lines(0...100) { |line| ... }
-
-* Iterate through the first line and all ruby comment lines in a gzipped file
- rio('afile.rb.gz').gzip.lines(0,/^\s*#/) { |line| ... }
-
-* Iterate through the lines of a ruby file that are neither empty nor comments, with all lines chomped
- rio('afile.rb').chomp.skiplines(/^\s*#/,:empty?) { |line| ... }
-
-* Read all the comment lines from a ruby file into an array with all lines chomped
- # method 1
- array = rio('afile.rb').chomp[/^\s*#/]
- # method 2
- array = rio('afile.rb').chomp.lines[/^\s*#/]
- # method 3
- rio('afile.rb').chomp.lines(/^\s*#/) > array
-
-
-* Read lines of a file into an array, with each line chomped, skipping any lines longer than 1024 chars
- # method 1
- array = ario.chomp[proc{ |line| line.length <= 1024}]
- # method 2
- ario.chomp.lines(proc{ |line| line.length <= 1024}) > array
- # method 3
- array = ario.chomp.skiplines[proc{ |line| line.length > 1024}]
- # method 4
- array = ario.chomp.lines(proc{ |line| line.length <= 1024}).to_a
-
----
-
-=== Write to a single file
-
- ario = rio('afile')
- string = "A String\n"
- array = ["Line 0\n","Line 1\n"]
-
-* Write a string to a file, leaving the Rio open
- # method 1
- ario.puts(string)
- # method 2
- ario.print(string)
- # method 3
- ario.noautoclose < string
-
-* Write a string to a file and close the file
- # method 1
- rio('afile') < string
- # method 2
- ario.print!(string)
- # method 3
- ario.print(string).close
-
-* Append a string to a file, leaving the Rio open
- # method 1
- ario.a.puts(string)
- # method 2
- ario.a.print(string)
- # method 3
- ario.noautoclose << string
-
-* Append a string to a file and close the file
- # method 1
- rio('afile') << string
- # method 2
- rio('afile').a.print!(string)
- # method 3
- rio('afile').a.print(string).close
-
-* Write an array to a file, leaving the Rio open
- # method 1
- ario = rio('afile').nocloseoncopy
- ario << array
- # method 2
- ario.noautoclose < array
-
-* Write an array to a file and close the file
- # method 1
- rio('afile') < array
-
-
----
-
-=== Select records
- ario = rio('afile')
- string = ""
- array = []
-
-* Put lines one thru ten and line 100 into an array
- # method 1
- array = ario[0..9,99]
- # method 2
- array = ario.lines[0..9,99]
- # method 3
- ario.lines(0..9,99) > array
-
-* Put lines one thru ten,line 100 and lines starting with 'rio4ruby' into an array
- # method 1
- array = ario[0..9,99,/^rio4ruby/]
- # method 2
- array = ario.lines[0..9,99,/^rio4ruby/]
- # method 3
- ario.lines(0..9,99,/^rio4ruby/) > array
-
-* Put lines that are longer than 128 bytes into an array
- # method 1
- array = ario[proc{ |l| l.length > 128}]
- # method 2
- array = ario.lines[proc{ |l| l.length > 128}]
- # method 3
- array = ario.skiplines[proc{ |l| l.length <= 128}]
- # method 4
- array = ario.skip.lines[proc{ |l| l.length <= 128}]
-
-* Copy all lines that do not start with 'rio4ruby' into another file
- # method 1
- ario.skiplines(/^rio4ruby/) > rio('another_file')
- # method 2
- ario.lines.skiplines(/^rio4ruby/) > rio('another_file')
- # method 3
- rio('another_file') < ario.skiplines(/^rio4ruby/)
-
-* Copy the first 10 lines and lines starting with 'rio4ruby', but exclude any lines longer than 128 bytes
- # method 1
- ario.lines(0...10,/^rio4ruby/).skiplines(proc{ |l| l.length > 128}] > rio('another_file')
- # method 2
- rio('another_file') < ario.lines(0...10,/^rio4ruby/).skiplines(proc{ |l| l.length > 128})
-
-
-
----
-
-=== Select directory entries
- ario = rio('adir')
- string = ""
- array = []
-
-* Put all entries with the extension '.txt' into an array
- # method 1
- array = ario['*.txt']
- # method 2
- array = ario[/\.txt$/]
- # method 3
- array = ario.entries['*.txt']
-
-* Put all files with the extension '.txt' into an array
- # method 1
- array = ario.files['*.txt']
- # method 2
- array = ario.files[/\.txt$/]
- # method 3
- array = ario.files['*.txt']
-
-* Put all entries with the extension '.txt' into an array, including those in subdirectories
- # method 1
- array = ario.all['*.txt']
- # method 2
- array = ario.all[/\.txt$/]
- # method 3
- array = ario.all.entries['*.txt']
-
-* Put all entries with the extension '.txt' into an array, including those in subdirectories, except those
- in subdirectories name '.svn'
- # method 1
- array = ario.norecurse('.svn').all['*.txt']
- # method 2
- array = ario.norecurse(/^\.svn$/).all[/\.txt$/]
- # method 3
- array = ario.norecurse('.svn').entries['*.txt']
- # method 4
- array = ario.entries('*.txt').norecurse('.svn').to_a
- # method 5
- array = ario.norecurse('.svn')['*.txt']
-
-* Put all directories into an array
- # method 1
- array = ario.dirs[]
- # method 2
- array = ario.dirs.to_a
-
-* Put all directories (recursively) into an array
- # method 1
- array = ario.all.dirs[]
- # method 2
- array = ario.all.dirs.to_a
-
-* Put all entries (recursively) into an array, but limit the depth of recursion to 2
- # method 1
- array = ario.norecurse(3).to_a
-
-
-* Iterate through ruby files in a directory and subdirectories skipping
- those in the '.svn', and 'pkg' directories
- # method 1
- is_ruby_exe = proc{ |f| f.executable? and f[0][0] =~ /^#!.+ruby/ }
- ario.norecurse('.svn','pkg').files('*.rb',is_ruby_exe) { |f| ... }
- # method 2
- is_ruby_exe = proc{ |f| f.executable? and f.gets =~ /^#!.+ruby/ }
- ario.norecurse('.svn','pkg').files('*.rb',is_ruby_exe) { |f| ... }
-
-* Put all files excluding those that are symlinks to files in an array
- # method 1
- array = ario.skipfiles[:symlink?]
- # method 2
- array = ario.skipfiles(:symlink?).files[]
- # method 3
- array = ario.skipfiles(:symlink?).to_a
- # method 4
- array = ario.files.skipfiles[:symlink?]
-
-* Put all entries that are not files (or symlinks to files) into an array
- # method 1
- array = ario.skipfiles[]
- # method 2
- array = ario.skipfiles.to_a
-
-* Put all entries that are symlinks to files into an array
- # method 1
- array = ario.files[proc{|f| f.file? and f.symlink?}]
- # method 2
- array = ario.files(proc{|f| f.file? and f.symlink?}).to_a
-
-* Put all directories except those named '.svn' into an array
- # method 1
- array = ario.skipdirs['.svn']
- # method 2
- array = ario.skipdirs[/^\.svn$/]
- # method 3
- array = ario.skipdirs('.svn').to_a
- # method 4
- array = ario.skipdirs('.svn').dirs[]
- # method 5
- array = ario.skipdirs('.svn')[]
-
-
----
-
-=== Read and writing files
- ario = rio('afile')
- string = ""
- array = []
-
-* Copy the contents of one file into another file
- # method 1
- rio('srcfile') > rio('dstfile')
- # method 2
- rio('dstfile') < rio('srcfile')
- # method 3
- rip('dstfile').print!(rio('srcfile').contents)
-
-* Append the contents of one file to another file
- # method 1
- rio('srcfile') >> rio('dstfile')
- # method 2
- rio('dstfile') << rio('srcfile')
- # method 3
- rip('dstfile').a.print!(rio('srcfile').contents)
-
-* Copy the first 10 lines of one file to another file
- # method 1
- rio('srcfile').lines(0...10) > rio('dstfile')
- # method 2
- rio('dstfile') < rio('srcfile').lines(0...10)
- # method 3
- rio('dstfile') < rio('srcfile').lines[0...10]
-
-* Concatenate several files into one
- # method 1
- rio('dstfile') < [ rio('src1'), rio('src2'), rio('src3') ]
- # method 2
- rio('dstfile') < rio('src1') << rio('src2') << rio('src3')
-
-* Copy a web page into a file
- # method 1
- rio('http://ruby-doc.org/') > rio('afile')
- # method 2
- rio('afile') < rio('http://ruby-doc.org/')
- # method 3
- rio('afile').print!(rio('http://ruby-doc.org/').contents)
-
-* Append the output of the daytime server running on the localhost to a file
- # method 1
- rio("tcp://localhost:daytime") >> rio('afile')
- # method 2
- rio("tcp:",'localhost','daytime') >> rio('afile')
- # method 3
- rio('afile') << rio("tcp://:daytime")
- # method 4
- rio('afile') << rio("tcp://:13")
-
-* Copy the first line and all lines containing 'http:' to a file
- # method 1
- rio('srcfile').lines(0,/http:/) > rio('dstfile')
- # method 2
- rio('dstfile') < rio('srcfile').lines(0,/http:/)
- # method 3
- rio('dstfile') < rio('srcfile').lines[0,/http:/]
- # method 4
-
-* Create a gzipped copy of a file
- # method 1
- rio('afile') > rio('afile.gz').gzip
- # method 2
- rio('afile.gz').gzip < rio('afile')
- # method 3
- rio('afile.gz').gzip.print!( rio('afile').contents )
-
-* Create an ungzipped copy of a gzipped file
- # method 1
- rio('afile') < rio('afile.gz').gzip
- # method 2
- rio('afile.gz').gzip > rio('afile')
- # method 3
- rio('afile').print!( rio('afile.gz').gzip.contents )
-
-* Copy the first 100 lines of gzipped file on a webserver into a local file
- # method 1
- rio('http://aserver/afile.gz').gzip.lines(0...100) > rio('afile')
-
-
-* Create a file composed of a header from another file, the output of the 'ps' command, some text and
- its creation time pulled from the daytime server running on your localhost
- # method 1
- rio('out') < [ rio('header'), rio(?-,'ps'), "Created on ", rio('tcp://:daytime') ]
- # method 2
- rio('out') < rio('header') << rio(?-,'ps') << "Created on: " << rio("tcp://:daytime")
-
-
----
-
-=== Reading multiple files
- ario = rio('adir')
- string = ""
- array = []
-
-* Count the lines of code in a directory tree of ruby source files
- # method 1
- cnt = ario.all.files('*.rb').skiplines[/^\s*#/,/^\s*$/].size
- # method 2
- cnt = ario.all.files('*.rb').skiplines(/^\s*#/,/^\s*$/).inject(0) { |sum,l| sum += 1 }
-
-* Concatanate the contents of all .txt files in a directory into an array
- # method 1
- array = ario.lines.files['*.txt']
- # method 2
- array = ario.files('*.txt').lines[]
- # method 3
- ario.files('*.txt').lines > array
-
-* Concatanate the first line of all .txt files in a directory into an array
- # method 1
- array = ario.lines(0).files['*.txt']
- # method 2
- array = ario.files('*.txt').lines[0]
- # method 3
- ario.files('*.txt').lines(0) > array
-
-* Copy all .txt files (but only their first ten lines) in a directory into another directiory
- # method 1
- ario.files('*.txt').lines(0...10) > rio('another_dir')
-
----
-
-=== Read and write using Standard IO
- string = ""
- array = []
-
-* Prompt for input and return what was typed
- # method 1
- ans = rio(?-).chomp.print("Type Something: ").gets
- # method 2
- stdio = rio(?-).chomp
- ans = stdio.print("Type Something: ").gets
-
-* Create a Rio tied to stdin or stdout, depending on how it is used
- stdio = rio(?-)
-
-* Create a Rio tied to stderr
- stderr = rio(?=)
-
-* Write a string to stdout
- # method 1
- rio(?-).puts("Hello World")
- # method 2
- rio(?-) << "Hello World\n"
- # method 3
- rio(?-) < "Hello World\n"
-
-* Read a string from stdin with the input chomped
- # method 1
- ans = rio(?-).chomp.gets
- # method 2
- stdio = rio(?-).chomp
- ans = stdio.gets
-
-* Read from stdin until end of file with the result going into a string
- # method 1
- rio(?-) >> string
- # method 2
- rio(?-) > string
-
-* Read from stdin until end of file with the chomped lines going into an array
- # method 1
- rio(?-).chomp >> array
- # method 2
- rio(?-).chomp > array
-
-* Read from stdin until end of file with the result going into a file
- # method 1
- rio(?-) > rio('afile')
- # method 2
- rio('afile') < rio(?-)
-
-* Read from stdin until end of file with the result appended to a file
- # method 1
- rio(?-) >> rio('afile')
- # method 2
- rio('afile') << rio(?-)
-
-* Write a message to stderr
- # method 1
- rio(?=).puts("Hello Error")
- # method 2
- rio(?=) << "Hello Error\n"
- # method 3
- rio(?=) < "Hello Error\n"
-
-* Dump a file to stdout
- # method 1
- rio('afile') > ?-
- # method 2
- rio('afile') > rio(?-)
- # method 3
- rio(?-) << rio('afile')
- # method 4
- rio('afile') >> ?-
- # method 5
- rio(?-) < rio('afile')
- # method 6
- rio(?-).print(rio('afile').contents)
-
-* Emulate a simplified unix 'head' command which reads from stdin and writes the first 10 lines to stdout
- # method 1
- rio(?-).lines(0..9) > ?-
-
----
-
-=== Reading and writing from processes as one might do with popen
-
-* Read the output of the 'ps' command into an array without the header line or the line representing
- the 'ps' command itself
- ps = rio(?-,'ps -a').skiplines[0,/ps$/]
-
-* Run an external program, copying its input from one location and its output to another,
- and make it look very much like a shell command.
-
- infile = rio(?","Hello Kitty\n")
- outfile = rio('out.txt')
-
- # method 1
- cat = rio(?-,'cat').w!
- cat <infile >outfile
-
- # method 2
- infile | 'cat' | outfile
-
----
-
-=== Renaming and moving files
- string = ""
- array = []
-
-* Rename the file 'a' to 'b'
- # method 1
- rio('a').rename('b')
- # method 2
- rio('a').rename.filename = 'b'
-
-* Rename a file and leave the Rio referencing the files old name
- ario = rio('a')
- # method 1
- ario.rename('b')
-
-* Rename a file and change the Rio to reference the new file name
- ario = rio('a')
- # method 1
- ario.rename!('b')
-
-* Rename the file 'index.htm' to 'index.html'
- # method 1
- rio('index.htm').rename('index.html')
- # method 2
- rio('index.htm').rename.extname = '.html'
-
-* Rename the file 'index.html' to 'welcome.html'
- # method 1
- rio('index.html').rename('welecome.html')
- # method 2
- rio('index.htm').rename.basename = 'welcome'
-
-* Move a file from directory 'src' to directory 'dst'
- # method 1
- rio('src/afile').rename('dst/afile')
- # method 2
- rio('src/afile').rename.dirname = 'dst'
-
-* Change a file to have the extension '.html' leaving the rest of it as is
- # method 1
- ario.rename.extname = '.html'
-
-* Change a files basename to 'rio4ruby' without changing its extension
- # method 1
- ario.rename.basename = 'rio4ruby'
-
-* Change a file ending with '.tar.gz' to end with '.tgz'
- # method 1
- ario.rename.ext('.tar.gz').extname = '.tgz'
-
-* Change the extension of all files with the extension '.htm' in a directory to have the
- extension '.html'
- # method 1
- rio('adir').rename.files('*.htm') do |htmfile|
- htmlfile.extname = '.html'
- end
- # method 2
- rio('adir').files('*.htm') do |htmfile|
- htmlfile.rename.extname = '.html'
- end
-
-* Change the extension of all files with the extension '.htm' in a directory and its
- subdirectories to have the extension '.html'
- # method 1
- rio('adir').rename.all.files('*.htm') do |htmfile|
- htmfile.extname = '.html'
- end
- # method 2
- rio('adir').all.files('*.htm') do |htmfile|
- htmfile.rename.extname = '.html'
- end
-
-* Move a file in an arbitrary directory into the current working directory.
- # method 1
- rio('arb/i/trary/di/rec/tory/afile').rename.dirname = '.'
-
-
----
-
-=== Manipulate a Rio's path
- string = ""
- array = []
-
-* Create a Rio with an additional subdirectory appended
- ap = rio('adir')
- # method 1
- ap /= 'subdirectory'
- # method 2
- ap = ap.join('subdirectory')
- # method 3
- ap = rio(ap,'subdirectory')
-
-* Create a Rio from an array of subdirectories
- dirs = ['adir','subdir1','subdir2']
- # method 1
- ario = rio(dirs)
-
-* Create an array of subdirectories from a Rio
- # method 1
- anarray = rio('adir/subdir1/subdir2').split
-
-* Append a string to a path
- # method 1
- ario = rio('apath') + astring
- # method 2
- ario = rio('apath')
- ario += astring
-
-* create a directory 'links' with a symlink pointing to each .rb file in directory 'lib' (including subdirectories)
- lib = rio('lib')
- links = rio('links').delete!.mkdir
- lib.all.files("*.rb") do |f|
- f.symlink( f.dirname.sub(/^#{lib}/,links).mkdir )
- end
-
-----
-
-Suggested Reading
-* RIO::Doc::SYNOPSIS
-* RIO::Doc::INTRO
-* RIO::Rio
-
-=end
module HOWTO
end
end
end