[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

[ANN] Rio 0.3.7

rio4ruby

1/5/2006 4:14:00 AM

Announcing Rio 0.3.7

== Overview

Rio is a Ruby I/O convenience class wrapping much of the functionality
of IO, File and Dir. Rio also uses FileUtils, Tempfile, StringIO,
OpenURI, Zlib, and CSV to provide similar functionality using a simple
consistent interface. In addition to forwarding the interfaces
provided by IO, File, and Dir to an appropriate object, Rio provides a
"grande" interface that allows many common application-level I/O and
file-system tasks to be expressed succinctly.

== New

Support for Pipe operator
# Pipe multiple commands
rio('afile') | rio(?-,'acmd') | 'another_cmd' | ?-

# run the same series of commands, with different input and/or output
cmdpipe = rio(?-,'acmd') | rio(?-,'another_cmd')
rio('infile1') | cmdpipe | rio('outfile1')
rio('infile2') | cmdpipe | rio('outfile2')

cmdpipe2 = rio(?|,'cmd1','cmd2',rio('outfile')) # a cmdpipe Rio
rio('infile1') | cmdpipe2 # run with input coming from a file
rio(?-) | cmdpipe2 # same commands with input from stdin

Improved support for MS Windows paths containing drives and UNC paths.
rio('D:/adir/afile')
rio('//ahost/adir/afile')

== SYNOPSIS

For the following assume:
astring = ""
anarray = []

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 structure to another directory
rio('adir') >> rio('another_directory')

Copy a web-page to a file
rio('http://rubydoc...) > rio('afile')

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

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')

Iterate over the entries in a directory
rio('adir').entries { |entrio| ... }

Iterate over only the files in a directory
rio('adir').files { |entrio| ... }

Iterate over only the .rb files in a directory
rio('adir').files('*.rb') { |entrio| ... }

Iterate over .rb files but not symlinks to .rb files
rio('adir').files('*.rb').skip(:symlink?) { |entrio| ... }

Iterate over only the _dot_ files in a directory
rio('adir').files(/^\./) { |entrio| ... }

Iterate over the files in a directory and its subdirectories, skipping
'.svn' and 'CVS' directories

rio('adir').norecurse(/^\.svn$/,'CVS').files { |entrio| ... }

Create an array of the .rb entries in a directory
anarray = rio('adir')['*.rb']

Create an array of the .rb entries in a directory and its
subdirectories.
anarray = rio('adir').all['*.rb']

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

Iterate over the non-empty, non-comment chomped lines of a file
rio('afile').chomp.skip.lines(: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').skip.lines(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

Create a symbolic link 'asymlink' in 'adir' which refers to
'adir/afile'
rio('adir/afile').symlink('adir/asymlink')

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")

== Contact

Project:: http://rubyforge.org/pro...
Documentation:: http://rio.ruby...
Bugs:: http://rubyforge.org/tracker/?gr...
Email:: rio4ruby@rubyforge.org

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

== License
Rio is released under the GNU General Public License
(http://www.gnu.org/license...)

-Christopher Kleckner

8 Answers

Wybo Dekker

1/5/2006 10:59:00 AM

0

dave

1/5/2006 2:17:00 PM

0


Very nice!

Another step that Ruby makes to dominate the world!

--
>here are more things in heaven and earth,
horatio, than are dreamt of in your philosophy.


--
Email.it, the professional e-mail, gratis per te: http://www....

Sponsor:
Personalizza il tuo cellulare con le immagini più divertenti o con le foto di chi ami
*
Clicca qui: http://adv.email.it/cgi-bin/foclick.cgi?mid=3117...


esmeralda

1/5/2006 4:33:00 PM

0

rio4ruby wrote:

> Announcing Rio 0.3.7
>
> == Overview
>
> Rio is a Ruby I/O convenience class wrapping much of the functionality
> of IO, File and Dir. Rio also uses FileUtils, Tempfile, StringIO,
> OpenURI, Zlib, and CSV to provide similar functionality using a simple
> consistent interface. In addition to forwarding the interfaces
> provided by IO, File, and Dir to an appropriate object, Rio provides a
> "grande" interface that allows many common application-level I/O and
> file-system tasks to be expressed succinctly.

Bravo !

.... Because :
.. It is very useful.
.. It is well documented.

I just had a quick look at the doc, I'm a newbie and I didn't understand
everything, things will be clearer when I'll use Rio.

Thanks !

> == Contact

> Project:: http://rubyforge.org/pro...
> Documentation:: http://rio.ruby...
> Bugs:: http://rubyforge.org/tracker/?gr...
> Email:: rio4ruby@rubyforge.org

Duane Johnson

1/5/2006 4:39:00 PM

0

Hi Christopher! This is my first time looking at Rio, and I'm very
impressed! I have a few interface questions for you--things that
jumped out at me on my initial viewing of the examples. Again, this
is coming from a white page here, so take it either as "how a new guy
sees the library" or with a grain of salt :)

On Jan 4, 2006, at 9:17 PM, rio4ruby wrote:

> Announcing Rio 0.3.7
>
<snip>
> Copy a gzipped file un-gzipping it
> rio('afile.gz').gzip > rio('afile')
>
Why does 'gzip' unzip? How would one zip something up?

<snip>
> Iterate over .rb files but not symlinks to .rb files
> rio('adir').files('*.rb').skip(:symlink?) { |entrio| ... }
>
> Iterate over only the _dot_ files in a directory
> rio('adir').files(/^\./) { |entrio| ... }
>
<snip>
> Create an array of the .rb entries in a directory and its
> subdirectories.
> anarray = rio('adir').all['*.rb']
>
Curious... why does +all+ take square brackets when +files+ uses
parens? Seems inconsistent upon first viewing.

Super work! I look forward to using this in the future.

Duane Johnson
(canadaduane)
http://blog.inquir...




rio4ruby

1/9/2006 11:33:00 PM

0

Duane Johnson wrote:
> > Copy a gzipped file un-gzipping it
> > rio('afile.gz').gzip > rio('afile')
> >
> Why does 'gzip' unzip? How would one zip something up?

Rio#gzip puts a Rio in gzip mode, so the referenced
file will be read from and written to properly. We could
rewrite the example:

a_rio_referencing_a_gzipped_file = rio('afile.gz).gzip
a_rio_referencing_a_file = rio('afile')
a_rio_referencing_a_gzipped_file > a_rio_referencing_a_file

> How would one zip something up?

Turn the arrow around:
rio('afile.gz').gzip < rio('afile')

> Curious... why does +all+ take square brackets when +files+ uses
> parens? Seems inconsistent upon first viewing.

Both +files+ and +all+ are configuration methods.

The usage:

anarray = rio('adir').all['*.rb']

is syntactic sugar for

anarray = rio('adir').all.entries('*.rb').to_a

The abbreviated usage works because:
1. Rio#entries is the default selection method when iterating
over directories.
2. The subscript operator passes its arguments to the most
recently called selection method (in this case +entries+,
even though it was never *explicitly* called) before it
calls +to_a+.
3. Rio#all returns the Rio which called it. (All configuration
methods do this, to support the readable shortened syntax)

Since Rio#files is also a configuration method, it can be used
similarly:

rio('adir').files('*.rb') { |f| ... } # iterate over .rb files
rio('adir').files['*.rb'] # returns an array of .rb files
rio('adir').files('*.rb') > 'bdir' # copies .rb files to 'bdir'

Hope this helps.
-Christopher

Duane Johnson

1/10/2006 2:13:00 AM

0


On Jan 9, 2006, at 4:38 PM, rio4ruby wrote:

> Duane Johnson wrote:
>>> Copy a gzipped file un-gzipping it
>>> rio('afile.gz').gzip > rio('afile')
>>>
>> Why does 'gzip' unzip? How would one zip something up?
>
> Rio#gzip puts a Rio in gzip mode, so the referenced
> file will be read from and written to properly. We could
> rewrite the example:
>
> a_rio_referencing_a_gzipped_file = rio('afile.gz).gzip
> a_rio_referencing_a_file = rio('afile')
> a_rio_referencing_a_gzipped_file > a_rio_referencing_a_file
>
>> How would one zip something up?
>
> Turn the arrow around:
> rio('afile.gz').gzip < rio('afile')
>
>> Curious... why does +all+ take square brackets when +files+ uses
>> parens? Seems inconsistent upon first viewing.
>
> Both +files+ and +all+ are configuration methods.
>
> The usage:
>
> anarray = rio('adir').all['*.rb']
>
> is syntactic sugar for
>
> anarray = rio('adir').all.entries('*.rb').to_a
>
> The abbreviated usage works because:
> 1. Rio#entries is the default selection method when iterating
> over directories.
> 2. The subscript operator passes its arguments to the most
> recently called selection method (in this case +entries+,
> even though it was never *explicitly* called) before it
> calls +to_a+.
> 3. Rio#all returns the Rio which called it. (All configuration
> methods do this, to support the readable shortened syntax)
>
> Since Rio#files is also a configuration method, it can be used
> similarly:
>
> rio('adir').files('*.rb') { |f| ... } # iterate over .rb files
> rio('adir').files['*.rb'] # returns an array of .rb
> files
> rio('adir').files('*.rb') > 'bdir' # copies .rb files to 'bdir'
>
> Hope this helps.
> -Christopher
>

Fantastic! Thanks again. I'm loving Rio more and more :)

Duane Johnson
(canadaduane)
http://blog.inquir...




dale.quigg

1/12/2006 6:54:00 PM

0

Thanks Christopher,

I just started using Rio and it's very handy.

I'm trying to get Rio to work with file names that have a space in
them. E.g "Foo Bar".

Works
-----
rio('foobar') << "testing" # no space in file name

Does not work
-------------
rio("\"foo bar\"") << "testing"
rio('foo\ bar') << "testing"
rio("foo bar") << "testing"
rio('foo\sbar') << "testing"
rio("foo\sbar") << "testing"

I'm running on WinXP and installed Ruby with the one click installer.
I installed Rio with
> gem install rio
but that got me 0.3.4

I've not been able to figure out how to specify a particular version
for gem to use.
>gem install rio --source http://rubyforge.org/frs/download.php/7291/rio...

>"c:\ruby\bin\ruby.exe" "c:\ruby\bin\gem" install rio --source http://rubyforge.org/frs/download.php/7291/rio...
Attempting local installation of 'rio'
Local gem file not found: rio*.gem
Attempting remote installation of 'rio'
Updating Gem source index for:
http://rubyforge.org/frs/download.php/....
3.7.gem
ERROR: While executing gem ... (ArgumentError)
parse error on line 0, col 11: `data.tar.gz'

did not work for me

Any help appeciated.

Thanks,
Dale

Gavin Sinclair

1/18/2006 12:47:00 AM

0


dale.quigg@aspentech.com wrote:
>
> I'm running on WinXP and installed Ruby with the one click installer.
> I installed Rio with
> > gem install rio
> but that got me 0.3.4
>
> I've not been able to figure out how to specify a particular version
> for gem to use.

"gem install rio" will install the latest version available. I guess
0.3.7 ain't available as a gem yet. And I'd be right! (See below.)

$ gem list -r rio

*** REMOTE GEMS ***
Updating Gem source index for: http://gems.rub...

rio (0.3.4, 0.3.3, 0.3.2, 0.3.1)
Rio - Ruby I/O Comfort Class


Cheers,
Gavin