# {ANN\] Rio 0.4.0

**URL:** <https://www.ruby-forum.com/t/ann-rio-0-4-0/90937>\
**Category:** Ruby\
**Created:** [April 3, 2007, 5:12am UTC](https://www.ruby-forum.com/t/ann-rio-0-4-0/90937 "2007-04-03T05:12:13Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![rio4ruby](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/82dd89/32.png) [@rio4ruby](https://www.ruby-forum.com/u/rio4ruby)\
**Post date:** [April 3, 2007, 5:12am UTC](https://www.ruby-forum.com/t/ann-rio-0-4-0/90937/1 "2007-04-03T05:12:13Z")

</div>

Rio 0.4.0

= Rio - Ruby I/O Facilitator

fa-cil-i-tate: To make easy or easier [http://  
[Facilitate - definition of facilitate by The Free Dictionary](http://www.thefreedictionary.com/facilitate)]

== Overview

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.

== SYNOPSIS

For the following assume:  
astring = “”  
anarray = []

Iterate over the .rb files in a directory.  
rio(‘adir’).files(‘\*.rb’) { |entrio| … }

Return an array of the .rb files in a directory.  
rio(‘adir’).files[‘\*.rb’]

Copy the .rb files in a directory.to another directory.  
rio(‘adir’).files(‘\*.rb’) \> rio(‘another\_directory’)

Iterate over the .rb files in a directory and its subdirectories.  
rio(‘adir’).all.files(‘\*.rb’) { |entrio| … }

Return an array of the .rb files in a directory and its  
subdirectories.  
rio(‘adir’).all.files[‘\*.rb’]

Copy or append a file to a string  
rio(‘afile’) \> astring # copy  
rio(‘afile’) \>\> astring # append

Copy or append a string to a file  
rio(‘afile’) \< astring # copy  
rio(‘afile’) \<\< astring # append

Copy or append the lines of a file to an array  
rio(‘afile’) \> anarray  
rio(‘afile’) \>\> anarray

Copy or append a file to another file  
rio(‘afile’) \> rio(‘another\_file’)  
rio(‘afile’) \>\> rio(‘another\_file’)

Copy a file to a directory  
rio(‘adir’) \<\< rio(‘afile’)

Copy a directory to another directory  
rio(‘adir’) \>\> rio(‘another\_directory’)

Copy a web-page to a file  
rio(‘[http://rubydoc.org/](http://rubydoc.org/)’) \> rio(‘afile’)

Read a web-page into a string  
astring = rio(‘[http://rubydoc.org/](http://rubydoc.org/)’).read

Ways to get the chomped lines of a file into an array  
anarray = rio(‘afile’).chomp[] # subscript operator  
rio(‘afile’).chomp \> anarray # copy-to operator  
anarray = rio(‘afile’).chomp.to\_a # to\_a  
anarray = rio(‘afile’).chomp.readlines # IO#readlines

Iterate over selected lines of a file  
rio(‘adir’).lines(0…3) { |aline| … } # a range of lines  
rio(‘adir’).lines(/re/) { |aline| … } # by regular expression  
rio(‘adir’).lines(0…3,/re/) { |aline| … } # or both

Return selected lines of a file as an array  
rio(‘adir’).lines[0…3] # a range of lines  
rio(‘adir’).lines[/re/] # by regular expression  
rio(‘adir’).lines[0…3,/re/] # or both

Iterate over selected chomped lines of a file  
rio(‘adir’).chomp.lines(0…3) { |aline| … } # a range of  
lines  
rio(‘adir’).chomp.lines(/re/) { |aline| … } # by regular  
expression

Return selected chomped lines of a file as an array  
rio(‘adir’).chomp[0…3] # a range of lines  
rio(‘adir’).chomp[/re/] # by regular expression

Copy a gzipped file un-gzipping it  
rio(‘afile.gz’).gzip \> rio(‘afile’)

Copy a plain file, gzipping it  
rio(‘afile.gz’).gzip \< rio(‘afile’)

Copy a file from a ftp server into a local file un-gzipping it  
rio(‘ftp://host/afile.gz’).gzip \> rio(‘afile’)

Return an array of .rb files excluding symlinks to .rb files  
rio(‘adir’).files(‘\*.rb’).skip[:symlink?]

Put the first 10 chomped lines of a gzipped file into an array  
anarray = rio(‘afile.gz’).chomp.gzip[0…10]

Copy lines 0 and 3 thru 5 of a gzipped file on an ftp server to stdout  
rio(‘ftp://host/afile.gz’).gzip.lines(0,3…5) \> ?-

Return an array of files in a directory and its subdirectories,  
without descending into .svn directories.  
rio(‘adir’).norecurse(/^.svn$/).files[]

Iterate over the non-empty, non-comment chomped lines of a file  
rio(‘afile’).chomp.skip(:empty?,/^\s\*#/) { |line| … }

Copy the output of th ps command into an array, skipping the header  
line and the ps command entry  
rio(?-,‘ps -a’).skiplines(0,/ps$/) \> anarray

Prompt for input and return what was typed  
ans = rio(?-).print("Type Something: ").chomp.gets

Change the extension of all .htm files in a directory and its  
subdirectories to .html  
rio(‘adir’).rename.all.files(‘\*.htm’) do |htmfile|  
htmfile.extname = ‘.html’  
end

Copy a CSV file, changing the separator to a semicolon  
rio(‘comma.csv’).csv \> rio(‘semicolon.csv’).csv(‘;’)

Iterate through a CSVfile with each line parsed into an array  
rio(‘afile.csv’).csv { |array\_of\_fields| …}

Create a tab separated file of accounts in a UNIX passwd file,  
listing only the username, uid, and realname fields  
rio(‘/etc/passwd’).csv(‘:’).columns(0,2,4) \> rio(‘rpt’).csv(“\t”)

Pipe multiple commands  
rio(‘afile’) | rio(?-,‘acmd’) | ‘another\_cmd’ | ?-

== Contact

Project:: [http://rubyforge.org/projects/rio/](http://rubyforge.org/projects/rio/)  
Documentation:: [http://rio.rubyforge.org/](http://rio.rubyforge.org/)  
Bugs:: [http://rubyforge.org/tracker/?group\_id=821](http://rubyforge.org/tracker/?group_id=821)  
Email:: removed\_email\_address@domain.invalid

== Copyright  
Copyright (c) 2005,2006,2007 Christopher Kleckner. All rights reserved

== License  
Rio is released under the GNU General Public License  
([The GNU General Public License v3.0 - GNU Project - Free Software Foundation](http://www.gnu.org/licenses/gpl.html))

-Christopher Kleckner

---

<div class="post-metadata">

**Author:** ![rio4ruby](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/82dd89/32.png) [@rio4ruby](https://www.ruby-forum.com/u/rio4ruby)\
**Post date:** [April 3, 2007, 10:22am UTC](https://www.ruby-forum.com/t/ann-rio-0-4-0/90937/2 "2007-04-03T10:22:42Z")

</div>

Wow, thanks! I will surely make good use of this!

Leslie

---

<div class="post-metadata">

**Author:** ![rio4ruby](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/82dd89/32.png) [@rio4ruby](https://www.ruby-forum.com/u/rio4ruby)\
**Post date:** [April 3, 2007, 2:05pm UTC](https://www.ruby-forum.com/t/ann-rio-0-4-0/90937/3 "2007-04-03T14:05:20Z")

</div>

hi christopher!

rio4ruby [03/04/07 05:10]:

> Rio 0.4.0
> 
> = Rio - Ruby I/O Facilitator
> 
> fa-cil-i-tate: To make easy or easier [http://  
> [Facilitate - definition of facilitate by The Free Dictionary](http://www.thefreedictionary.com/facilitate)]  
> awesome! just went through the code and docs. awesome library,  
> awesome docs! …what can i say more? 😉

one suggestion though: what about adding a content\_type method to  
RIO::IF::File? this would allow to treat local and remote files  
alike, just call content\_type on the respective rio.

rio(‘[http://example.com/image.png](http://example.com/image.png)’).content\_type #=\> “image/png”  
rio(‘some/local/image.png’).content\_type #=\> “image/png”

the former via open-uri, the latter via mime-types (which, however,  
is not part of the standard library). please see attached diff for a  
simple implementation.

cheers  
jens
