rio 0.3.8 → 0.3.9
Sign up to get free protection for your applications and to get access to all the features.
- data/README +18 -12
- data/Rakefile +57 -87
- data/build_doc.rb +19 -17
- data/doc/ANNOUNCE +3 -32
- data/doc/RELEASE_NOTES +4 -5
- data/doc/RIOIS +215 -0
- data/doc/generators/template/html/rio.css +428 -0
- data/doc/generators/template/html/rio.rb +18 -389
- data/doc/generators/template/html/ugly.rb +130 -0
- data/doc/pkg_def.rb +66 -0
- data/ex/catcsv.rb +64 -0
- data/ex/colx.rb +8 -0
- data/ex/findinruby +15 -0
- data/ex/findruby +14 -0
- data/ex/passwd_report.rb +8 -0
- data/ex/prompt.rb +25 -0
- data/ex/rgb.txt.gz +0 -0
- data/ex/riocat +42 -0
- data/ex/riogunzip +31 -0
- data/ex/riogzip +24 -0
- data/ex/rioprompt.rb +10 -0
- data/ex/targz2zip +17 -0
- data/ex/tonl +10 -0
- data/lib/rio.rb +16 -10
- data/lib/rio/abstract_method.rb +3 -4
- data/lib/rio/argv.rb +3 -4
- data/lib/rio/arycopy.rb +3 -4
- data/lib/rio/assert.rb +3 -4
- data/lib/rio/base.rb +3 -4
- data/lib/rio/callstr.rb +3 -4
- data/lib/rio/const.rb +3 -4
- data/lib/rio/construct.rb +3 -4
- data/lib/rio/constructor.rb +12 -8
- data/lib/rio/context.rb +15 -30
- data/lib/rio/context/autoclose.rb +3 -4
- data/lib/rio/context/copying.rb +3 -4
- data/lib/rio/context/cxx.rb +3 -4
- data/lib/rio/context/dir.rb +3 -4
- data/lib/rio/context/gzip.rb +3 -4
- data/lib/rio/context/methods.rb +16 -5
- data/lib/rio/context/skip.rb +3 -4
- data/lib/rio/context/stream.rb +42 -5
- data/lib/rio/cp.rb +7 -7
- data/lib/rio/def.rb +3 -4
- data/lib/rio/dir.rb +3 -4
- data/lib/rio/doc.rb +4 -5
- data/lib/rio/doc/EXAMPLES.rb +299 -0
- data/lib/rio/doc/HOWTO.rb +3 -4
- data/lib/rio/doc/INTRO.rb +86 -105
- data/lib/rio/doc/OPTIONAL.rb +4 -5
- data/lib/rio/doc/SYNOPSIS.rb +7 -6
- data/lib/rio/entrysel.rb +21 -23
- data/lib/rio/exception.rb +3 -4
- data/lib/rio/exception/copy.rb +3 -4
- data/lib/rio/exception/notimplemented.rb +57 -0
- data/lib/rio/exception/notsupported.rb +3 -4
- data/lib/rio/exception/open.rb +3 -4
- data/lib/rio/exception/state.rb +3 -4
- data/lib/rio/ext.rb +47 -13
- data/lib/rio/ext/csv.rb +4 -5
- data/lib/rio/ext/if.rb +45 -0
- data/lib/rio/ext/mp3info.rb +80 -0
- data/lib/rio/ext/splitlines.rb +253 -0
- data/lib/rio/ext/yaml.rb +9 -5
- data/lib/rio/ext/yaml/doc.rb +133 -0
- data/lib/rio/ext/yaml/tie.rb +149 -0
- data/lib/rio/ext/zipfile.rb +23 -4
- data/lib/rio/ext/zipfile/fs.rb +116 -0
- data/lib/rio/ext/zipfile/rl.rb +251 -0
- data/lib/rio/ext/zipfile/rootdir.rb +117 -0
- data/lib/rio/ext/zipfile/state.rb +161 -0
- data/lib/rio/ext/zipfile/wrap.rb +204 -0
- data/lib/rio/factory.rb +235 -27
- data/lib/rio/file.rb +4 -4
- data/lib/rio/filter.rb +3 -4
- data/lib/rio/filter/closeoneof.rb +3 -4
- data/lib/rio/filter/gzip.rb +9 -4
- data/lib/rio/fs/base.rb +3 -4
- data/lib/rio/fs/impl.rb +4 -5
- data/lib/rio/fs/native.rb +3 -4
- data/lib/rio/fs/stream.rb +3 -4
- data/lib/rio/fs/url.rb +3 -4
- data/lib/rio/ftp/conncache.rb +19 -5
- data/lib/rio/ftp/dir.rb +3 -4
- data/lib/rio/ftp/fs.rb +30 -24
- data/lib/rio/grande.rb +27 -7
- data/lib/rio/handle.rb +3 -4
- data/lib/rio/if.rb +19 -15
- data/lib/rio/if/basic.rb +7 -7
- data/lib/rio/if/csv.rb +5 -6
- data/lib/rio/if/dir.rb +120 -114
- data/lib/rio/if/file.rb +52 -44
- data/lib/rio/if/fileordir.rb +217 -211
- data/lib/rio/if/grande.rb +674 -644
- data/lib/rio/if/grande_entry.rb +321 -313
- data/lib/rio/if/grande_stream.rb +653 -553
- data/lib/rio/if/internal.rb +3 -4
- data/lib/rio/if/path.rb +425 -426
- data/lib/rio/if/rubyio.rb +681 -0
- data/lib/rio/if/string.rb +42 -5
- data/lib/rio/if/temp.rb +3 -4
- data/lib/rio/if/test.rb +245 -238
- data/lib/rio/if/yaml.rb +15 -41
- data/lib/rio/ioh.rb +7 -5
- data/lib/rio/iomode.rb +19 -7
- data/lib/rio/ios/fail.rb +4 -5
- data/lib/rio/ios/generic.rb +4 -5
- data/lib/rio/ios/mode.rb +4 -5
- data/lib/rio/ios/null.rb +6 -7
- data/lib/rio/iowrap.rb +3 -4
- data/lib/rio/kernel.rb +3 -5
- data/lib/rio/local.rb +3 -4
- data/lib/rio/match.rb +3 -4
- data/lib/rio/matchrecord.rb +3 -4
- data/lib/rio/no_warn.rb +3 -4
- data/lib/rio/nullio.rb +3 -4
- data/lib/rio/open3.rb +4 -5
- data/lib/rio/ops/construct.rb +3 -4
- data/lib/rio/ops/create.rb +11 -6
- data/lib/rio/ops/dir.rb +19 -8
- data/lib/rio/ops/either.rb +6 -5
- data/lib/rio/ops/file.rb +3 -4
- data/lib/rio/ops/path.rb +14 -35
- data/lib/rio/ops/stream.rb +3 -4
- data/lib/rio/ops/stream/input.rb +4 -7
- data/lib/rio/ops/stream/output.rb +3 -4
- data/lib/rio/ops/stream/read.rb +6 -5
- data/lib/rio/ops/stream/write.rb +3 -4
- data/lib/rio/ops/symlink.rb +3 -4
- data/lib/rio/path.rb +22 -18
- data/lib/rio/path/reset.rb +4 -5
- data/lib/rio/piper.rb +3 -4
- data/lib/rio/piper/cp.rb +3 -4
- data/lib/rio/prompt.rb +10 -5
- data/lib/rio/rectype.rb +5 -5
- data/lib/rio/rl/base.rb +17 -71
- data/lib/rio/rl/builder.rb +14 -38
- data/lib/rio/rl/chmap.rb +66 -0
- data/lib/rio/rl/fs2url.rb +82 -0
- data/lib/rio/rl/ioi.rb +4 -4
- data/lib/rio/rl/path.rb +44 -122
- data/lib/rio/rl/pathmethods.rb +19 -8
- data/lib/rio/rl/uri.rb +137 -60
- data/lib/rio/rl/withpath.rb +295 -0
- data/lib/rio/scheme/aryio.rb +3 -4
- data/lib/rio/scheme/cmdio.rb +3 -4
- data/lib/rio/scheme/cmdpipe.rb +4 -4
- data/lib/rio/scheme/fd.rb +3 -4
- data/lib/rio/scheme/ftp.rb +7 -7
- data/lib/rio/scheme/http.rb +4 -5
- data/lib/rio/scheme/null.rb +3 -4
- data/lib/rio/scheme/path.rb +3 -4
- data/lib/rio/scheme/stderr.rb +3 -4
- data/lib/rio/scheme/stdio.rb +3 -4
- data/lib/rio/scheme/strio.rb +3 -4
- data/lib/rio/scheme/sysio.rb +3 -4
- data/lib/rio/scheme/tcp.rb +3 -4
- data/lib/rio/scheme/temp.rb +6 -6
- data/lib/rio/state.rb +18 -46
- data/lib/rio/state/error.rb +3 -4
- data/lib/rio/stream.rb +4 -4
- data/lib/rio/stream/base.rb +3 -4
- data/lib/rio/stream/duplex.rb +3 -4
- data/lib/rio/stream/open.rb +3 -8
- data/lib/rio/symantics.rb +3 -4
- data/lib/rio/tempdir.rb +2 -2
- data/lib/rio/to_rio.rb +3 -4
- data/lib/rio/to_rio/all.rb +3 -4
- data/lib/rio/to_rio/array.rb +4 -5
- data/lib/rio/to_rio/io.rb +4 -5
- data/lib/rio/to_rio/object.rb +4 -5
- data/lib/rio/to_rio/string.rb +4 -5
- data/lib/rio/uri/file.rb +41 -5
- data/lib/rio/util.rb +3 -4
- data/lib/rio/version.rb +4 -5
- data/setup.rb +368 -339
- data/test/bin/list_dir.rb +1 -1
- data/test/ftp/anon_misc.rb +13 -1
- data/test/ftp/anon_special.rb +6 -6
- data/test/ftp/anon_write.rb +10 -3
- data/test/ftp/ftp2ftp.rb +2 -2
- data/test/ftp/testdef.rb +9 -6
- data/test/http/all.rb +3 -0
- data/test/http/copy-from-http.rb +140 -0
- data/test/lib/temp_server.rb +44 -0
- data/test/runalltests.rb +3 -1
- data/test/runhttp.rb +12 -0
- data/test/runhttptests.rb +1 -1
- data/test/runtests.rb +41 -3
- data/test/tc/abs.rb +9 -5
- data/test/tc/all.rb +9 -4
- data/test/tc/base.rb +1 -1
- data/test/tc/base2.rb +87 -0
- data/test/tc/{methods.rb → clone.rb} +72 -50
- data/test/tc/closeoncopy.rb +13 -2
- data/test/tc/copy-dir-samevar.rb +91 -0
- data/test/tc/dir_iter.rb +0 -1
- data/test/tc/empty.rb +6 -2
- data/test/tc/expand_path.rb +36 -54
- data/test/tc/ext.rb +42 -18
- data/test/tc/gzip.rb +30 -3
- data/test/tc/likeio.rb +5 -1
- data/test/tc/line_record_row.rb +51 -0
- data/test/tc/noqae.rb +71 -70
- data/test/tc/path_parts.rb +175 -0
- data/test/tc/programs_util.rb +3 -3
- data/test/tc/rename.rb +4 -5
- data/test/tc/riorl.rb +9 -7
- data/test/tc/skip.rb +35 -6
- data/test/tc/skiplines.rb +34 -5
- data/test/tc/split.rb +8 -50
- data/test/tc/splitlines.rb +65 -0
- data/test/tc/splitpath.rb +83 -0
- data/test/tc/testcase.rb +1 -1
- data/test/tc/truncate.rb +39 -0
- data/test/tc/yaml.rb +9 -8
- metadata +261 -207
- data/ChangeLog +0 -1418
- data/VERSION +0 -1
- data/lib/rio/doc/MISC.rb +0 -259
- data/lib/rio/if/stream.rb +0 -680
- data/lib/rio/impl/path.rb +0 -87
- data/test/tc/copy-from-http.rb +0 -89
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.3.8
|
data/lib/rio/doc/MISC.rb
DELETED
@@ -1,259 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# ===============================================================================
|
3
|
-
# Copyright (c) 2005, 2006 Christopher Kleckner
|
4
|
-
# All rights reserved
|
5
|
-
#
|
6
|
-
# This file is part of the Rio library for ruby.
|
7
|
-
#
|
8
|
-
# Rio is free software; you can redistribute it and/or modify
|
9
|
-
# it under the terms of the GNU General Public License as published by
|
10
|
-
# the Free Software Foundation; either version 2 of the License, or
|
11
|
-
# (at your option) any later version.
|
12
|
-
#
|
13
|
-
# Rio is distributed in the hope that it will be useful,
|
14
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
-
# GNU General Public License for more details.
|
17
|
-
#
|
18
|
-
# You should have received a copy of the GNU General Public License
|
19
|
-
# along with Rio; if not, write to the Free Software
|
20
|
-
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
21
|
-
# ===============================================================================
|
22
|
-
#++
|
23
|
-
#
|
24
|
-
# To create the documentation for Rio run the command
|
25
|
-
# ruby build_doc.rb
|
26
|
-
# from the distribution directory. Then point your browser at the 'doc/rdoc' directory.
|
27
|
-
#
|
28
|
-
# Suggested Reading
|
29
|
-
# * RIO::Doc::SYNOPSIS
|
30
|
-
# * RIO::Doc::INTRO
|
31
|
-
# * RIO::Doc::HOWTO
|
32
|
-
# * RIO::Rio
|
33
|
-
#
|
34
|
-
# <b>Rio is pre-alpha software.
|
35
|
-
# The documented interface and behavior is subject to change without notice.</b>
|
36
|
-
|
37
|
-
|
38
|
-
module RIO
|
39
|
-
module Doc
|
40
|
-
=begin rdoc
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
The following example are provided without comment
|
45
|
-
|
46
|
-
array = rio('afile').readlines
|
47
|
-
|
48
|
-
rio('afile') > rio('acopy')
|
49
|
-
|
50
|
-
ary = rio('afile').chomp.lines[0...10]
|
51
|
-
|
52
|
-
rio('adir').rename.all.files('*.htm') do |file|
|
53
|
-
file.ext = '.html'
|
54
|
-
end
|
55
|
-
|
56
|
-
A basic familiarity with ruby and shell operations should allow a casual reader to guess what
|
57
|
-
these examples will do. How they are being performed may not be what a casual reader might expect.
|
58
|
-
I will explain these example to illustrate the Rio basics.
|
59
|
-
|
60
|
-
For many more examples please read the HOWTO document and the rdoc documentation.
|
61
|
-
|
62
|
-
== Example 1.
|
63
|
-
|
64
|
-
array = rio('afile').readlines
|
65
|
-
|
66
|
-
This uses IO#readlines to read the lines of 'afile' into an array.
|
67
|
-
|
68
|
-
=== Creating a Rio
|
69
|
-
|
70
|
-
Rio extends the module Kernel by adding one function _rio_, which acts as a constructor returning a Rio. This
|
71
|
-
constructor builds a description of the resource the Rio will access (usually a path). It does not open the
|
72
|
-
resource, check for its existance, or do anything except remember its specifcation. _rio_ returns the Rio
|
73
|
-
which can be chained to a Rio method as in this example or stored in a variable. This coud have been written
|
74
|
-
|
75
|
-
ario = rio('afile')
|
76
|
-
array = ario.readlines
|
77
|
-
|
78
|
-
ario = rio('afile')
|
79
|
-
|
80
|
-
In this case the resource specified is a relative path. After the first line
|
81
|
-
the Rio does know or care whether it
|
82
|
-
is a path to a file nor whether it exists. Rio provides many methods that only deal with a resource
|
83
|
-
at this level, much as the standard library classes Pathname and URI. It should be noted at this
|
84
|
-
point that Rio paths stored internally as a URL as specified in RFC 1738 and therefore use slashes as
|
85
|
-
separators. A resource can also be specified without separators, because _rio_ interprets multiple arguments
|
86
|
-
as parts of a path to be joined, and an array as an array of parts to be joined. So the following
|
87
|
-
all specify the same resource.
|
88
|
-
|
89
|
-
rio('adir/afile')
|
90
|
-
rio('adir','afile')
|
91
|
-
rio(%w/adir afile/)
|
92
|
-
|
93
|
-
The rio constructor can be used to specify non-file-system resources, but for this example we will restrict
|
94
|
-
our discussion to paths to entities on file-systems.
|
95
|
-
|
96
|
-
array = ario.readlines
|
97
|
-
|
98
|
-
Now that we have a Rio, we can call one of its methods; in this case _readlines_. This is an example of using
|
99
|
-
a Rio as a proxy for the builtin IO#readlines. Given the method _readlines_, the Rio opens 'afile' for reading,
|
100
|
-
calls readlines on the resulting IO object, closes the IO object, and returns the lines read.
|
101
|
-
|
102
|
-
== Example 2
|
103
|
-
|
104
|
-
rio('afile') > rio('acopy')
|
105
|
-
|
106
|
-
This copies the file 'afile' into the file 'acopy'.
|
107
|
-
|
108
|
-
The first things that happen here are the creation of the Rios. As described in Example 1, when created
|
109
|
-
a Rio simply remembers the specifcation of its resource. In this case, a relative path 'afile' on the
|
110
|
-
left and a relative path 'acopy' on the right.
|
111
|
-
|
112
|
-
Next the Rio#> (copy-to) method is called on the 'afile' Rio with the 'acopy' Rio as its argument. If that
|
113
|
-
looks like a greater-than operator to you, think Unix shell, with Rios '>' is the copy-to operator.
|
114
|
-
|
115
|
-
Upon seeing the copy-to operator, the Rio has all the information it needs to proceed. It determines that
|
116
|
-
it must be opened for reading, that its argument must be opened for writing, and that it's contents must
|
117
|
-
be copied to the resource referenced by it' argument -- and that is what it does. Then it closes itself and
|
118
|
-
its argument.
|
119
|
-
|
120
|
-
Consider if we had written this example this way.
|
121
|
-
|
122
|
-
afile = rio('afile')
|
123
|
-
acopy = rio('acopy')
|
124
|
-
afile > acopy
|
125
|
-
|
126
|
-
In this case we would still have variables referencing the Rios, and perhaps we would like do things a little
|
127
|
-
differently than described above. Be assured that the selection of mode and automatic closing of files are the
|
128
|
-
default behaviour and can be changed. Say we wanted 'afile' to remain open so that we could rewind it and make
|
129
|
-
a second copy, we might do something like this:
|
130
|
-
|
131
|
-
afile = rio('afile').nocloseoneof
|
132
|
-
afile > rio('acopy1')
|
133
|
-
afile.rewind > rio('acopy2')
|
134
|
-
afile.close
|
135
|
-
|
136
|
-
Actually the 'thinking process' of the Rio when it sees a copy-to operator is much more complex that described above.
|
137
|
-
If its argument had been a rio referencing a directory, it would not have opened itself for reading,
|
138
|
-
but instead used FileUtils#cp to copy itself; if its argument had been a string, its contents would have ended up
|
139
|
-
in the string; If its argument had been an array, its lines would been elements of that array; if its argument had
|
140
|
-
been a socket, the its contents would have been copied to the socket. See the documentation for details.
|
141
|
-
|
142
|
-
== Example 3.
|
143
|
-
|
144
|
-
array = rio('afile').chomp.lines[0...10]
|
145
|
-
|
146
|
-
This fills +array+ with the first ten lines of 'afile', with each line chomped
|
147
|
-
|
148
|
-
The casual observer mentioned above might think that +lines+ returns an array of lines and that this
|
149
|
-
is a simple rewording of <tt>array = rio('afile').readlines[0...10]</tt> or even of
|
150
|
-
<tt>array = File.new('afile').readlines[0...10]</tt>. They would be wrong.
|
151
|
-
|
152
|
-
+chomp+ is a configuration method which turns on chomp-mode and returns the Rio. Chomp-mode causes all
|
153
|
-
line oriented read operations to perform a String#chomp on each line
|
154
|
-
|
155
|
-
=== Reading files
|
156
|
-
|
157
|
-
Rio provides four methods to select which part of the file is read and how the file is divided. They are +lines+,
|
158
|
-
+records+, +rows+ and +bytes+. Briefly, +lines+ specifies that the file should be read line by line and +bytes(n)+
|
159
|
-
specifies that the file should be read in _n_ byte chunks. All four take arguments which can be used to
|
160
|
-
filter lines or chunks in or out. For simple Rios +records+ and +rows+ only specify the filter arguments and
|
161
|
-
are provided for use be extensions. For example, the CSV extension returns an array of the columns in a line
|
162
|
-
when +records+ is used. In the absence of an extension +records+ and +rows+ behave like +lines+.
|
163
|
-
|
164
|
-
First lets rewrite our example as:
|
165
|
-
|
166
|
-
array = rio('afile').chomp.lines(0...10).to_a
|
167
|
-
|
168
|
-
The arguments to lines specify which records are to be read.
|
169
|
-
Arguments are interpreted based on their class as follows:
|
170
|
-
* Range - interpreted as a range of record numbers to be read
|
171
|
-
* Integer - interpreted as a one-element range
|
172
|
-
* RegExp - only matching records are processed
|
173
|
-
* Symbol - sent to each record, which is processed unless the result is false or nil
|
174
|
-
* Proc - called for each record, the record is processed unless the return value is false or nil
|
175
|
-
See the documentation for details and examples.
|
176
|
-
|
177
|
-
In our example we have specified the Range (0...10). The +lines+ method is just configuring the Rio, it does
|
178
|
-
not trigger
|
179
|
-
any IO operation. The fact that it was called and the arguments it was called with are stored away and the Rio
|
180
|
-
is returned for further configuration or an actual IO operation. When an IO operation is called the Range will be
|
181
|
-
used to limit processing to the first ten records. For example:
|
182
|
-
rio('afile').lines(0...10).each { |line| ... } # block will be called for the first 10 records
|
183
|
-
rio('afile').lines(0...10).to_a # the first 10 records will be returned in an array
|
184
|
-
rio('afile').lines(0...10) > rio('acopy') # the first 10 records will be copied to 'acopy'
|
185
|
-
|
186
|
-
"But wait", you say, "In our original example the range was an argument to the subscript operator, not to +lines+".
|
187
|
-
This works because the subscript operator processes its arguments as if they had been arguments to the
|
188
|
-
most-recently-called selection method and then calls +to_a+ on the rio. So our rewrite of the example
|
189
|
-
does precisely the same thing as the original
|
190
|
-
|
191
|
-
The big difference between the original example and the casual-observer's solution is that hers
|
192
|
-
creates an array of the entire contents and only returns the first 10 while the original only puts
|
193
|
-
10 records into the array.
|
194
|
-
|
195
|
-
As a sidenote, Rios also have an optimization that can really help in certain situations. If records are only
|
196
|
-
selected using Ranges, it stops iterating when it is beyond the point where it could possibly ever match. This
|
197
|
-
can make a dramatic difference when one is only interested in the first few lines of very large files.
|
198
|
-
|
199
|
-
== Example 4.
|
200
|
-
|
201
|
-
rio('adir').rename.all.files('*.htm') do |file|
|
202
|
-
file.ext = '.html'
|
203
|
-
end
|
204
|
-
|
205
|
-
This changes the extension of all .htm files below 'adir' to '.html'
|
206
|
-
|
207
|
-
First we create the rio as always.
|
208
|
-
|
209
|
-
Next we process the +rename+ method. When used as it is here -- without arguments -- it just turns on rename-mode
|
210
|
-
and returns the Rio.
|
211
|
-
|
212
|
-
+all+ is another configuration method, which causes directories to be processed recursively
|
213
|
-
|
214
|
-
+files+ is another configuration method. In example 3 we used +lines+ to select what to process when
|
215
|
-
iterating through a file. +files+ is used to select what to process when iterating through
|
216
|
-
directories. The arguments to +files+ can be the same as those for +lines+ except that Ranges can not
|
217
|
-
be used and globs can.
|
218
|
-
|
219
|
-
In our example, the argument to +files+ is a string which is treated as a glob. As with +lines+, +files+
|
220
|
-
does not trigger any IO, it just configures the Rio.
|
221
|
-
|
222
|
-
=== There's no action
|
223
|
-
|
224
|
-
The previous examples had something that triggered IO: +readlines+, +to_a+, +each+, <tt>> (copy-to)</tt>. This example
|
225
|
-
does not. This example illustrates Rio's 'implied each'. All the configuration methods will call each for you
|
226
|
-
if a block is given. So, because a block follows the files method, it calls +each+ and passes it the block.
|
227
|
-
|
228
|
-
Let's recap. At this point we have a Rio with a resource specified. We have configured with a couple of modes,
|
229
|
-
'rename', and 'all', and we have limited the elements we want to process to entries that are files and
|
230
|
-
match the glob '*.htm'. +each+ causes the Rio to open the directory and call the block for each entry that is
|
231
|
-
both a file and matches the glob. It was also configured with +all+,so it descends into subdirectories to
|
232
|
-
find further matches and calles the block for each of them. The argument passed to the block is a Rio
|
233
|
-
referencing the entry on the file-system.
|
234
|
-
|
235
|
-
The _rename_mode_ we set has had no effect on our iteration at all, so why is it there? In general,
|
236
|
-
configuration options that are not applicable to a Rio are silently ignored, however, for directories
|
237
|
-
some of them are passed on to the Rios for each entry when iterating. Since +rename+ is one such option,
|
238
|
-
The example could have been written:
|
239
|
-
|
240
|
-
rio('adir').all.files('*.htm') do |file|
|
241
|
-
file.rename.ext = '.html'
|
242
|
-
end
|
243
|
-
|
244
|
-
The rename-with-no-args method affects the behaviour of the <tt>ext=</tt> option. In this case,
|
245
|
-
setting it for the directory, rather than for each file in the block seems to make the intent
|
246
|
-
of the code more clear, but that is a matter of personal taste. See the documentation for more
|
247
|
-
information on the rename-with-no-args method
|
248
|
-
|
249
|
-
== Suggested Reading
|
250
|
-
* RIO::Doc::SYNOPSIS
|
251
|
-
* RIO::Doc::INTRO
|
252
|
-
* RIO::Doc::HOWTO
|
253
|
-
* RIO::Rio
|
254
|
-
|
255
|
-
=end
|
256
|
-
module MISC
|
257
|
-
end
|
258
|
-
end
|
259
|
-
end
|
data/lib/rio/if/stream.rb
DELETED
@@ -1,680 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# ===============================================================================
|
3
|
-
# Copyright (c) 2005, 2006 Christopher Kleckner
|
4
|
-
# All rights reserved
|
5
|
-
#
|
6
|
-
# This file is part of the Rio library for ruby.
|
7
|
-
#
|
8
|
-
# Rio is free software; you can redistribute it and/or modify
|
9
|
-
# it under the terms of the GNU General Public License as published by
|
10
|
-
# the Free Software Foundation; either version 2 of the License, or
|
11
|
-
# (at your option) any later version.
|
12
|
-
#
|
13
|
-
# Rio is distributed in the hope that it will be useful,
|
14
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
16
|
-
# GNU General Public License for more details.
|
17
|
-
#
|
18
|
-
# You should have received a copy of the GNU General Public License
|
19
|
-
# along with Rio; if not, write to the Free Software
|
20
|
-
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
21
|
-
# ===============================================================================
|
22
|
-
#++
|
23
|
-
#
|
24
|
-
# To create the documentation for Rio run the command
|
25
|
-
# ruby build_doc.rb
|
26
|
-
# from the distribution directory. Then point your browser at the 'doc/rdoc' directory.
|
27
|
-
#
|
28
|
-
# Suggested Reading
|
29
|
-
# * RIO::Doc::SYNOPSIS
|
30
|
-
# * RIO::Doc::INTRO
|
31
|
-
# * RIO::Doc::HOWTO
|
32
|
-
# * RIO::Rio
|
33
|
-
#
|
34
|
-
# <b>Rio is pre-alpha software.
|
35
|
-
# The documented interface and behavior is subject to change without notice.</b>
|
36
|
-
|
37
|
-
|
38
|
-
module RIO
|
39
|
-
class Rio
|
40
|
-
# Calls IO#gets
|
41
|
-
#
|
42
|
-
# Reads the next line from the Rio; lines are separated by sep_string.
|
43
|
-
# A separator of nil reads the entire contents, and a zero-length separator reads
|
44
|
-
# the input a paragraph at a time (two successive newlines in the input separate paragraphs).
|
45
|
-
#
|
46
|
-
# Returns nil if called at end of file.
|
47
|
-
#
|
48
|
-
# astring = rio('afile.txt').gets # read the first line of afile.txt into astring
|
49
|
-
#
|
50
|
-
def gets(sep_string=$/) target.gets(sep_string) end
|
51
|
-
|
52
|
-
# Slurps the contents of the rio into a string.
|
53
|
-
#
|
54
|
-
# astring = rio('afile.txt').contents # slurp the entire contents of afile.txt into astring
|
55
|
-
#
|
56
|
-
def contents() target.contents() end
|
57
|
-
|
58
|
-
|
59
|
-
# Rio#each_record
|
60
|
-
#
|
61
|
-
#
|
62
|
-
#def each_record(&block) target.each_record(&block); self end
|
63
|
-
|
64
|
-
|
65
|
-
# Rio#each_row
|
66
|
-
#
|
67
|
-
#
|
68
|
-
#def each_row(&block) target.each_row(&block); self end
|
69
|
-
|
70
|
-
|
71
|
-
# Calls IO#lineno
|
72
|
-
#
|
73
|
-
# Returns the current line number of a Rio.
|
74
|
-
#
|
75
|
-
# The Rio will be opened for reading if not already.
|
76
|
-
# lineno counts the number of times gets is called, rather than the number of newlines encountered --
|
77
|
-
# so lineno will only be accurate if the file is read exclusively with line-oriented methods
|
78
|
-
# (Rio#readline, Rio#each_line, Rio#gets etc.)
|
79
|
-
#
|
80
|
-
# See also the $. variable and Rio#recno
|
81
|
-
# f = rio("testfile")
|
82
|
-
# f.lineno #=> 0
|
83
|
-
# f.gets #=> "This is line one\n"
|
84
|
-
# f.lineno #=> 1
|
85
|
-
# f.gets #=> "This is line two\n"
|
86
|
-
# f.lineno #=> 2
|
87
|
-
def lineno() target.lineno() end
|
88
|
-
|
89
|
-
# Calls IO#lineno=
|
90
|
-
# ario.lineno = integer => integer
|
91
|
-
# Manually sets the current line number to the given value. <tt>$.</tt> is
|
92
|
-
# updated only on the next read.
|
93
|
-
#
|
94
|
-
# f = rio("testfile")
|
95
|
-
# f.gets #=> "This is line one\n"
|
96
|
-
# $. #=> 1
|
97
|
-
# f.lineno = 1000
|
98
|
-
# f.lineno #=> 1000
|
99
|
-
# $. # lineno of last read #=> 1
|
100
|
-
# f.gets #=> "This is line two\n"
|
101
|
-
# $. # lineno of last read #=> 1001
|
102
|
-
#
|
103
|
-
#
|
104
|
-
def lineno=(integer) target.lineno = integer end
|
105
|
-
|
106
|
-
# Returns the current record number of a Rio. The +recno+ is the index
|
107
|
-
# used by the grande selection methods. It represents the zero-based index of the
|
108
|
-
# last record read. Returns nil until a record has been read.
|
109
|
-
#
|
110
|
-
# see Rio#lines Rio#bytes and Rio#records
|
111
|
-
#
|
112
|
-
# To illustrate: Given a file containing three lines "L0\n","L1\n","L2\n"
|
113
|
-
# and a Range (0..1)
|
114
|
-
# Each of the following would fill anarray with ["L0\n", "L1\n"]
|
115
|
-
#
|
116
|
-
# Given:
|
117
|
-
# anarray = []
|
118
|
-
# range = (0..1)
|
119
|
-
#
|
120
|
-
# all_lines = rio('afile').readlines
|
121
|
-
# all_lines.each_with_index do |line,i|
|
122
|
-
# anarray << line if range === i
|
123
|
-
# end
|
124
|
-
# # anarray == ["L0\n", "L1\n"]
|
125
|
-
#
|
126
|
-
# anarray = rio('afile').lines[0..1] # anarray == ["L0\n", "L1\n"]
|
127
|
-
#
|
128
|
-
# +recno+ counts the number of times Rio#getrec or Rio#each is used to get a record.
|
129
|
-
# so +recno+ will only concern parts of the file read with grande methods
|
130
|
-
# Rio#each, Rio#[], Rio#getrec
|
131
|
-
#
|
132
|
-
# See also Rio#lineno
|
133
|
-
def recno() target.recno() end
|
134
|
-
|
135
|
-
|
136
|
-
# Calls IO#binmode
|
137
|
-
#
|
138
|
-
# Puts rio into binary mode. This is useful only in MS-DOS/Windows environments.
|
139
|
-
# Once a stream is in binary mode, it cannot be reset to nonbinary mode.
|
140
|
-
#
|
141
|
-
# Returns the Rio.
|
142
|
-
#
|
143
|
-
# rio('afile.exe').binmode.bytes(512).to_a # read a file in 512 byte blocks
|
144
|
-
#
|
145
|
-
def binmode() target.binmode(); self end
|
146
|
-
|
147
|
-
|
148
|
-
# Calls IO#flush
|
149
|
-
# ario.flush => ario
|
150
|
-
# Flushes any buffered data within _ario_ to the underlying operating
|
151
|
-
# system (note that this is Ruby internal buffering only; the OS may
|
152
|
-
# buffer the data as well).
|
153
|
-
#
|
154
|
-
def flush() target.flush(); self end
|
155
|
-
|
156
|
-
|
157
|
-
# Calls IO#each_byte
|
158
|
-
# ario.each_byte {|byte| block } => ario
|
159
|
-
# Calls the given block once for each byte (0..255) in _ario_, passing
|
160
|
-
# the byte as an argument.
|
161
|
-
#
|
162
|
-
def each_byte(*args,&block) target.each_byte(*args,&block); self end
|
163
|
-
|
164
|
-
|
165
|
-
# Rio#each_bytes
|
166
|
-
#
|
167
|
-
#
|
168
|
-
#def each_bytes(nb,*args,&block) target.each_bytes(nb,*args,&block); self end
|
169
|
-
|
170
|
-
|
171
|
-
# Calls IO#each_line
|
172
|
-
# ario.each_line(sep_string=$/) {|line| block } => ario
|
173
|
-
# Executes the block for every line in _ario_, where lines are
|
174
|
-
# separated by _sep_string_.
|
175
|
-
#
|
176
|
-
def each_line(*args,&block) target.each_line(*args,&block); self end
|
177
|
-
|
178
|
-
|
179
|
-
# Calls IO#readlines
|
180
|
-
#
|
181
|
-
# Reads all of the lines in a Rio, and returns them in anArray.
|
182
|
-
# Lines are separated by the optional aSepString.
|
183
|
-
# The stream must be opened for reading or an IOerror will be raised.
|
184
|
-
#
|
185
|
-
# an_array = rio('afile.txt').readlines # read afile.txt into an array
|
186
|
-
# an_array = rio('afile.txt').chomp.readlines # read afile.txt into an array with each line chomped
|
187
|
-
#
|
188
|
-
def readlines(*args,&block) target.readlines(*args,&block) end
|
189
|
-
|
190
|
-
# Calls IO#readline
|
191
|
-
# ario.readline(sep_string=$/) => string
|
192
|
-
# Reads a line as with +IO#gets+, but raises an +EOFError+ on end of
|
193
|
-
# file.
|
194
|
-
#
|
195
|
-
def readline(*args) target.readline(*args) end
|
196
|
-
|
197
|
-
|
198
|
-
# Calls IO#readpartial
|
199
|
-
#
|
200
|
-
# Reads at most maxlen bytes from the I/O stream but it blocks
|
201
|
-
# only if ios has no data immediately available. If the optional
|
202
|
-
# outbuf argument is present, it must reference a String, which
|
203
|
-
# will receive the data. It raises EOFError on end of file.
|
204
|
-
#
|
205
|
-
# readpartial is designed for streams such as pipe, socket, tty, etc. It
|
206
|
-
# blocks only when no data immediately available. This means that it
|
207
|
-
# blocks only when following all conditions hold.
|
208
|
-
#
|
209
|
-
# * the buffer in the IO object is empty.
|
210
|
-
# * the content of the stream is empty.
|
211
|
-
# * the stream is not reached to EOF.
|
212
|
-
#
|
213
|
-
# When readpartial blocks, it waits data or EOF on the stream. If some
|
214
|
-
# data is reached, readpartial returns with the data. If EOF is reached,
|
215
|
-
# readpartial raises EOFError.
|
216
|
-
#
|
217
|
-
# When readpartial doesn�t blocks, it returns or raises immediately. If
|
218
|
-
# the buffer is not empty, it returns the data in the buffer. Otherwise
|
219
|
-
# if the stream has some content, it returns the data in the
|
220
|
-
# stream. Otherwise if the stream is reached to EOF, it raises EOFError.
|
221
|
-
#
|
222
|
-
# r, w = IO.pipe # buffer pipe content
|
223
|
-
# w << "abc" # "" "abc".
|
224
|
-
# r.readpartial(4096) #=> "abc" "" ""
|
225
|
-
# r.readpartial(4096) # blocks because buffer and pipe is empty.
|
226
|
-
#
|
227
|
-
# r, w = IO.pipe # buffer pipe content
|
228
|
-
# w << "abc" # "" "abc"
|
229
|
-
# w.close # "" "abc" EOF
|
230
|
-
# r.readpartial(4096) #=> "abc" "" EOF
|
231
|
-
# r.readpartial(4096) # raises EOFError
|
232
|
-
#
|
233
|
-
# r, w = IO.pipe # buffer pipe content
|
234
|
-
# w << "abc\ndef\n" # "" "abc\ndef\n"
|
235
|
-
# r.gets #=> "abc\n" "def\n" ""
|
236
|
-
# w << "ghi\n" # "def\n" "ghi\n"
|
237
|
-
# r.readpartial(4096) #=> "def\n" "" "ghi\n"
|
238
|
-
# r.readpartial(4096) #=> "ghi\n" "" ""
|
239
|
-
#
|
240
|
-
# Note that readpartial is nonblocking-flag insensitive. It blocks even
|
241
|
-
# if the nonblocking-flag is set.
|
242
|
-
#
|
243
|
-
# Also note that readpartial behaves similar to sysread in blocking
|
244
|
-
# mode. The behavior is identical when the buffer is empty.
|
245
|
-
# ios.reopen(other_IO) => ios ios.reopen(path, mode_str) => ios
|
246
|
-
#
|
247
|
-
# Reassociates ios with the I/O stream given in other_IO or to a new
|
248
|
-
# stream opened on path. This may dynamically change the actual class of
|
249
|
-
# this stream.
|
250
|
-
#
|
251
|
-
# f1 = File.new("testfile")
|
252
|
-
# f2 = File.new("testfile")
|
253
|
-
# f2.readlines[0] #=> "This is line one\n"
|
254
|
-
# f2.reopen(f1) #=> #<File:testfile>
|
255
|
-
# f2.readlines[0] #=> "This is line one\n"
|
256
|
-
#
|
257
|
-
def readpartial(*args) target.readpartial(*args) end
|
258
|
-
|
259
|
-
|
260
|
-
# Calls IO::print
|
261
|
-
#
|
262
|
-
# Writes the given object(s) to the Rio. If the output record separator ($\) is not nil,
|
263
|
-
# it will be appended to the output. If no arguments are given, prints $_.
|
264
|
-
# Objects that aren't strings will be converted by calling their to_s method.
|
265
|
-
# Returns the Rio.
|
266
|
-
#
|
267
|
-
# rio('f.txt').print("Hello Rio\n") # print the string to f.txt
|
268
|
-
# rio(?-).print("Hello Rio\n") # print the string to stdout
|
269
|
-
#
|
270
|
-
def print(*args,&block) target.print(*args,&block); self end
|
271
|
-
|
272
|
-
# Writes the given objects to the rio as with Rio#print and then closes the Rio.
|
273
|
-
# Returns the Rio.
|
274
|
-
#
|
275
|
-
# Equivalent to rio.print(*args).close
|
276
|
-
#
|
277
|
-
# rio('f.txt').print!("Hello Rio\n") # print the string to f.txt then close it
|
278
|
-
#
|
279
|
-
def print!(*args,&block) target.print!(*args,&block); self end
|
280
|
-
|
281
|
-
|
282
|
-
# Writes the given objects to the rio as with Rio#printf and then closes the rio.
|
283
|
-
# Returns the rio.
|
284
|
-
#
|
285
|
-
# Equivalent to rio.printf(*args).close
|
286
|
-
#
|
287
|
-
def printf!(*argv) target.printf!(*argv); self end
|
288
|
-
|
289
|
-
|
290
|
-
# Calls IO#printf
|
291
|
-
# ario.printf(format_string [, obj, ...] ) => ario
|
292
|
-
# Formats and writes to _ario_, converting parameters under control of
|
293
|
-
# the format string. See +Kernel#sprintf+ for details.
|
294
|
-
#
|
295
|
-
def printf(*argv) target.printf(*argv); self end
|
296
|
-
|
297
|
-
|
298
|
-
# Writes the given objects to the rio as with Rio#putc and then closes the rio.
|
299
|
-
# Returns the rio.
|
300
|
-
#
|
301
|
-
# Equivalent to rio.putc(*args).close
|
302
|
-
#
|
303
|
-
def putc!(*argv) target.putc!(*argv); self end
|
304
|
-
|
305
|
-
|
306
|
-
# Calls IO#putc
|
307
|
-
# ario.putc(obj) => ario
|
308
|
-
# If _obj_ is +Numeric+, write the character whose code is _obj_,
|
309
|
-
# otherwise write the first character of the string representation of
|
310
|
-
# _obj_ to _ario_.
|
311
|
-
#
|
312
|
-
# stdout = rio(?-)
|
313
|
-
# stdout.putc "A"
|
314
|
-
# stdout.putc 65
|
315
|
-
#
|
316
|
-
# _produces:_
|
317
|
-
#
|
318
|
-
# AA
|
319
|
-
#
|
320
|
-
def putc(*argv) target.putc(*argv); self end
|
321
|
-
|
322
|
-
|
323
|
-
# Calls IO#puts
|
324
|
-
#
|
325
|
-
# Writes the given objects to the rio as with Rio#print.
|
326
|
-
# Writes a record separator (typically a newline) after any that do not already end with a newline sequence.
|
327
|
-
# If called with an array argument, writes each element on a new line.
|
328
|
-
# If called without arguments, outputs a single record separator.
|
329
|
-
# Returns the rio.
|
330
|
-
def puts(*args) target.puts(*args); self end
|
331
|
-
|
332
|
-
# Writes the given objects to the rio as with Rio#puts and then closes the rio.
|
333
|
-
# Returns the rio.
|
334
|
-
#
|
335
|
-
# Equivalent to rio.puts(*args).close
|
336
|
-
#
|
337
|
-
# rio('f.txt').puts!('Hello Rio') # print the string to f.txt then close it
|
338
|
-
#
|
339
|
-
def puts!(*args) target.puts!(*args); self end
|
340
|
-
|
341
|
-
|
342
|
-
# Writes the given objects to the rio as with Rio#write and then closes the rio.
|
343
|
-
#
|
344
|
-
# Equivalent to
|
345
|
-
# ario.write(*args)
|
346
|
-
# ario.close
|
347
|
-
#
|
348
|
-
def write!(*argv) target.write!(*argv) end
|
349
|
-
|
350
|
-
|
351
|
-
# Calls IO#write
|
352
|
-
# ario.write(string) => integer
|
353
|
-
# Writes the given string to _ario_. If the argument is not a string,
|
354
|
-
# it will be converted to a
|
355
|
-
# string using +to_s+. Returns the number of bytes written.
|
356
|
-
#
|
357
|
-
def write(*argv) target.write(*argv) end
|
358
|
-
|
359
|
-
|
360
|
-
# Calls IO#eof?
|
361
|
-
# ario.eof => true or false
|
362
|
-
# Returns true if _ario_ is at end of file. The stream must be opened
|
363
|
-
# for reading or an +IOError+ will be raised.
|
364
|
-
#
|
365
|
-
def eof?() target.eof? end
|
366
|
-
|
367
|
-
# Provides direct access to the IO handle (as would be returned by ::IO#new) *with* filtering.
|
368
|
-
# Reading from and writing to this handle will be affected
|
369
|
-
# by such things as Rio#gzip and Rio#chomp if they were specified for the Rio.
|
370
|
-
#
|
371
|
-
# Compare this with Rio#ios
|
372
|
-
#
|
373
|
-
def ioh(*args) target.ioh() end
|
374
|
-
|
375
|
-
# Provides direct access to the IO handle (as would be returned by ::IO#new)
|
376
|
-
# Reading from and writing to this handle
|
377
|
-
# is *not* affected by such things as Rio#gzip and Rio#chomp.
|
378
|
-
#
|
379
|
-
# Compare this with Rio#ioh
|
380
|
-
#
|
381
|
-
def ios(*args) target.ios() end
|
382
|
-
|
383
|
-
#def open(m,*args) target.open(m,*args); self end
|
384
|
-
|
385
|
-
# Explicitly set the mode with which a Rio will be opened.
|
386
|
-
# ario.mode('r+') => ario
|
387
|
-
# Normally one needs never open a Rio or specify its mode -- the mode is determined by the
|
388
|
-
# operation the Rio is asked to perform. (i.e. Rio#print requires write access, Rio#readlines requires
|
389
|
-
# read access). However there are times when one wishes to be specific about the mode with which a Rio
|
390
|
-
# will be opened. Note that explicitly setting the mode overrides all of Rio's internal mode
|
391
|
-
# logic. If a mode is specified via Rio#mode or Rio#open that mode will be used. Period.
|
392
|
-
#
|
393
|
-
# Returns the Rio.
|
394
|
-
#
|
395
|
-
# See also Rio#mode?
|
396
|
-
#
|
397
|
-
# If the mode is given as a String, it must be one of the values listed in the following table.
|
398
|
-
#
|
399
|
-
# Mode | Meaning
|
400
|
-
# -----+--------------------------------------------------------
|
401
|
-
# "r" | Read-only, starts at beginning of file (default mode).
|
402
|
-
# -----+--------------------------------------------------------
|
403
|
-
# "r+" | Read-write, starts at beginning of file.
|
404
|
-
# -----+--------------------------------------------------------
|
405
|
-
# "w" | Write-only, truncates existing file
|
406
|
-
# | to zero length or creates a new file for writing.
|
407
|
-
# -----+--------------------------------------------------------
|
408
|
-
# "w+" | Read-write, truncates existing file to zero length
|
409
|
-
# | or creates a new file for reading and writing.
|
410
|
-
# -----+--------------------------------------------------------
|
411
|
-
# "a" | Write-only, starts at end of file if file exists,
|
412
|
-
# | otherwise creates a new file for writing.
|
413
|
-
# -----+--------------------------------------------------------
|
414
|
-
# "a+" | Read-write, starts at end of file if file exists,
|
415
|
-
# | otherwise creates a new file for reading and
|
416
|
-
# | writing.
|
417
|
-
# -----+--------------------------------------------------------
|
418
|
-
# "b" | (DOS/Windows only) Binary file mode (may appear with
|
419
|
-
# | any of the key letters listed above).
|
420
|
-
#
|
421
|
-
# ario = rio('afile').mode('r+').nocloseoneof # file will be opened in r+ mode
|
422
|
-
# # don't want the file closed at eof
|
423
|
-
# ario.seek(apos).gets # read the string at apos in afile
|
424
|
-
# ario.rewind.gets # read the string at the beginning of the file
|
425
|
-
# ario.close
|
426
|
-
#
|
427
|
-
# TODO:
|
428
|
-
# * Add support for integer modes
|
429
|
-
#
|
430
|
-
def mode(m,*args) target.mode(m,*args); self end
|
431
|
-
|
432
|
-
# Query a Rio's mode
|
433
|
-
# ario.mode? #=> a mode string
|
434
|
-
#
|
435
|
-
# See Rio#mode
|
436
|
-
#
|
437
|
-
# ario = rio('afile')
|
438
|
-
# ario.puts("Hello World")
|
439
|
-
# ario.mode? #=> 'w' Rio#puts requires write access
|
440
|
-
#
|
441
|
-
# ario = rio('afile')
|
442
|
-
# ario.gets
|
443
|
-
# ario.mode? #=> 'r' Rio#gets requires read access
|
444
|
-
#
|
445
|
-
# ario = rio('afile').mode('w+').nocloseoneof
|
446
|
-
# ario.gets
|
447
|
-
# ario.mode? #=> 'w+' Set explictly
|
448
|
-
#
|
449
|
-
def mode?() target.mode?() end
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
# Calls IO#close
|
454
|
-
# ario.close => nil
|
455
|
-
# Closes _ario_ and flushes any pending writes to the operating
|
456
|
-
# system. The stream is unavailable for any further data operations;
|
457
|
-
# an +IOError+ is raised if such an attempt is made. I/O streams are
|
458
|
-
# automatically closed when they are claimed by the garbage
|
459
|
-
# collector.
|
460
|
-
#
|
461
|
-
def close() target.close(); self end
|
462
|
-
|
463
|
-
# Calls IO#fcntl
|
464
|
-
# ario.fcntl(integer_cmd, arg) => integer
|
465
|
-
# Provides a mechanism for issuing low-level commands to control or
|
466
|
-
# query file-oriented I/O streams. Arguments and results are platform
|
467
|
-
# dependent. If _arg_ is a number, its value is passed directly. If
|
468
|
-
# it is a string, it is interpreted as a binary sequence of bytes
|
469
|
-
# (<tt>Array#pack</tt> might be a useful way to build this string). On Unix
|
470
|
-
# platforms, see <tt>fcntl(2)</tt> for details. Not implemented on all
|
471
|
-
# platforms.
|
472
|
-
#
|
473
|
-
#
|
474
|
-
def fcntl(integer_cmd,arg) target.fcntl(integer_cmd,arg) end
|
475
|
-
|
476
|
-
# Calls IO#ioctl
|
477
|
-
# ario.ioctl(integer_cmd, arg) => integer
|
478
|
-
# Provides a mechanism for issuing low-level commands to control or
|
479
|
-
# query I/O devices. Arguments and results are platform dependent. If
|
480
|
-
# _arg_ is a number, its value is passed directly. If it is a string,
|
481
|
-
# it is interpreted as a binary sequence of bytes. On Unix platforms,
|
482
|
-
# see +ioctl(2)+ for details. Not implemented on all platforms.
|
483
|
-
#
|
484
|
-
#
|
485
|
-
def ioctl(integer_cmd,arg) target.ioctl(integer_cmd,arg) end
|
486
|
-
|
487
|
-
# Calls IO#fileno
|
488
|
-
# ario.fileno => fixnum
|
489
|
-
# ario.to_i => fixnum
|
490
|
-
# Returns an integer representing the numeric file descriptor for
|
491
|
-
# _ario_.
|
492
|
-
#
|
493
|
-
def fileno() target.fileno() end
|
494
|
-
|
495
|
-
|
496
|
-
# Calls IO#fsync
|
497
|
-
# ario.fsync => ario
|
498
|
-
# Immediately writes all buffered data in _ario_ to disk and
|
499
|
-
# return _ario_.
|
500
|
-
# Does nothing if the underlying operating system does not support
|
501
|
-
# _fsync(2)_. Note that +fsync+ differs from using Rio#sync. The
|
502
|
-
# latter ensures that data is flushed from Ruby's buffers, but
|
503
|
-
# doesn't not guarantee that the underlying operating system actually
|
504
|
-
# writes it to disk.
|
505
|
-
#
|
506
|
-
def fsync() target.fsync end
|
507
|
-
|
508
|
-
# Calls IO#pid
|
509
|
-
# ario.pid => fixnum
|
510
|
-
# Returns the process ID of a child process associated with _ario_.
|
511
|
-
# This will be set by <tt>IO::popen</tt>.
|
512
|
-
#
|
513
|
-
# pipe = IO.popen("-")
|
514
|
-
# if pipe
|
515
|
-
# $stderr.puts "In parent, child pid is #{pipe.pid}"
|
516
|
-
# else
|
517
|
-
# $stderr.puts "In child, pid is #{$$}"
|
518
|
-
# end
|
519
|
-
#
|
520
|
-
# produces:
|
521
|
-
#
|
522
|
-
# In child, pid is 26209
|
523
|
-
# In parent, child pid is 26209
|
524
|
-
#
|
525
|
-
#
|
526
|
-
def pid() target.pid end
|
527
|
-
|
528
|
-
|
529
|
-
# Calls IO#putc
|
530
|
-
# ario.putc(obj) => obj
|
531
|
-
# If _obj_ is +Numeric+, write the character whose code is _obj_,
|
532
|
-
# otherwise write the first character of the string representation of
|
533
|
-
# _obj_ to _ario_.
|
534
|
-
#
|
535
|
-
# $stdout.putc "A"
|
536
|
-
# $stdout.putc 65
|
537
|
-
#
|
538
|
-
# _produces:_
|
539
|
-
#
|
540
|
-
# AA
|
541
|
-
#
|
542
|
-
#
|
543
|
-
|
544
|
-
|
545
|
-
# Calls IO#getc
|
546
|
-
# ario.getc => fixnum or nil
|
547
|
-
# Gets the next 8-bit byte (0..255) from _ario_. Returns +nil+ if
|
548
|
-
# called at end of file.
|
549
|
-
#
|
550
|
-
# f = File.new("testfile")
|
551
|
-
# f.getc #=> 84
|
552
|
-
# f.getc #=> 104
|
553
|
-
#
|
554
|
-
#
|
555
|
-
def getc() target.getc() end
|
556
|
-
|
557
|
-
# Calls IO#readchar
|
558
|
-
# ario.readchar => fixnum
|
559
|
-
# Reads a character as with +IO#getc+, but raises an +EOFError+ on
|
560
|
-
# end of file.
|
561
|
-
#
|
562
|
-
#
|
563
|
-
|
564
|
-
# Calls IO#reopen
|
565
|
-
# ario.reopen(other_IO) => ios
|
566
|
-
# ario.reopen(path, mode_str) => ios
|
567
|
-
# Reassociates _ario_ with the I/O stream given in _other_IO_ or to a
|
568
|
-
# new stream opened on _path_. This may dynamically change the actual
|
569
|
-
# class of this stream.
|
570
|
-
#
|
571
|
-
# f1 = File.new("testfile")
|
572
|
-
# f2 = File.new("testfile")
|
573
|
-
# f2.readlines[0] #=> "This is line one\n"
|
574
|
-
# f2.reopen(f1) #=> #<File:testfile>
|
575
|
-
# f2.readlines[0] #=> "This is line one\n"
|
576
|
-
#
|
577
|
-
#
|
578
|
-
#def reopen(m) target.reopen(m) end
|
579
|
-
|
580
|
-
|
581
|
-
# Calls IO#stat
|
582
|
-
# ario.stat => stat
|
583
|
-
# Returns status information for _ario_ as an object of type
|
584
|
-
# +File::Stat+.
|
585
|
-
#
|
586
|
-
# f = File.new("testfile")
|
587
|
-
# s = f.stat
|
588
|
-
# "%o" % s.mode #=> "100644"
|
589
|
-
# s.blksize #=> 4096
|
590
|
-
# s.atime #=> Wed Apr 09 08:53:54 CDT 2003
|
591
|
-
#
|
592
|
-
#
|
593
|
-
|
594
|
-
# Calls IO#to_i
|
595
|
-
# to_i()
|
596
|
-
# Alias for #fileno
|
597
|
-
#
|
598
|
-
#
|
599
|
-
def to_i() target.to_i() end
|
600
|
-
|
601
|
-
# Calls IO#to_io
|
602
|
-
# ario.to_io -> ios
|
603
|
-
# Returns _ario_.
|
604
|
-
#
|
605
|
-
#
|
606
|
-
def to_io() target.to_io() end
|
607
|
-
|
608
|
-
# Calls IO#tty?
|
609
|
-
# ario.tty? => true or false
|
610
|
-
# Returns +true+ if _ario_ is associated with a terminal device (tty),
|
611
|
-
# +false+ otherwise.
|
612
|
-
#
|
613
|
-
# rio("testfile").tty? #=> false
|
614
|
-
# rio("/dev/tty").tty? #=> true
|
615
|
-
#
|
616
|
-
#
|
617
|
-
def tty?() target.tty?() end
|
618
|
-
|
619
|
-
# Calls IO#ungetc
|
620
|
-
# ario.ungetc(integer) => ario
|
621
|
-
# Pushes back one character (passed as a parameter) onto _ario_, such
|
622
|
-
# that a subsequent buffered read will return it. Only one character
|
623
|
-
# may be pushed back before a subsequent read operation (that is, you
|
624
|
-
# will be able to read only the last of several characters that have
|
625
|
-
# been pushed back).
|
626
|
-
#
|
627
|
-
# f = rio("testfile") #=> #<Rio:testfile>
|
628
|
-
# c = f.getc #=> 84
|
629
|
-
# f.ungetc(c).getc #=> 84
|
630
|
-
#
|
631
|
-
def ungetc(*args) target.ungetc(*args); self end
|
632
|
-
|
633
|
-
# Sets the 'sync-mode' of the underlying IO using IO#sync=
|
634
|
-
# ario.sync(boolean=true,&block) => ario
|
635
|
-
# Sets the Rio so that its 'sync mode' will be set to +true+ or +false+ when opened, or set
|
636
|
-
# it immediately if already open. When sync mode is
|
637
|
-
# true, all output is immediately flushed to the underlying operating
|
638
|
-
# system and is not buffered internally. Returns the rio. See
|
639
|
-
# also Rio#fsync, Rio#nosync, Rio#sync?.
|
640
|
-
#
|
641
|
-
# If a block is given behaves like <tt>ario.sync(arg).each(&block)</tt>
|
642
|
-
#
|
643
|
-
# f = rio("testfile").sync.puts("Hello World")
|
644
|
-
# f.sync? # => true
|
645
|
-
#
|
646
|
-
def sync(arg=true,&block) target.sync(arg,&block); self end
|
647
|
-
|
648
|
-
# Similar to IO#sync= false
|
649
|
-
# ario.nosync(&block) => ario
|
650
|
-
# Sets the Rio so that its 'sync mode' will be set to +false+ when opened, or set
|
651
|
-
# it immediately if already open. When sync mode is
|
652
|
-
# true, all output is immediately flushed to the underlying operating
|
653
|
-
# system and is not buffered internally. Returns the rio. See
|
654
|
-
# also Rio#fsync, Rio#sync, Rio#sync?.
|
655
|
-
#
|
656
|
-
# If a block is given behaves like <tt>ario.nosync.each(&block)</tt>
|
657
|
-
#
|
658
|
-
# f = rio("testfile").sync.puts("Hello World")
|
659
|
-
# f.sync? # => true
|
660
|
-
# f.nosync
|
661
|
-
# f.sync? # => false
|
662
|
-
#
|
663
|
-
def nosync(arg=false,&block) target.nosync(arg,&block); self end
|
664
|
-
|
665
|
-
# Query the current "sync mode" with IO#sync
|
666
|
-
# ario.sync? => true or false
|
667
|
-
# Returns the current "sync mode" of _ario_. When sync mode is true,
|
668
|
-
# all output is immediately flushed to the underlying operating
|
669
|
-
# system and is not buffered by Ruby internally. See also Rio#fsync,
|
670
|
-
# Rio#sync, Rio#nosync
|
671
|
-
#
|
672
|
-
# f = rio("testfile")
|
673
|
-
# f.sync? #=> false
|
674
|
-
#
|
675
|
-
def sync?() target.sync?() end
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
end
|
680
|
-
end
|