rio 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/ChangeLog +225 -0
  2. data/README +12 -0
  3. data/Rakefile +1 -1
  4. data/VERSION +1 -1
  5. data/doc/ANNOUNCE +160 -71
  6. data/doc/RELEASE_NOTES +71 -2
  7. data/ex/colx.rb +1 -1
  8. data/ex/passwd_report.rb +4 -8
  9. data/ex/riocat +5 -5
  10. data/ex/riogunzip +1 -1
  11. data/ex/riogzip +6 -6
  12. data/ex/rioprompt.rb +6 -0
  13. data/lib/rio.rb +3 -13
  14. data/lib/rio/arycopy.rb +1 -1
  15. data/lib/rio/base.rb +1 -5
  16. data/lib/rio/construct.rb +75 -0
  17. data/lib/rio/constructor.rb +42 -11
  18. data/lib/rio/context.rb +1 -1
  19. data/lib/rio/context/dir.rb +50 -23
  20. data/lib/rio/context/methods.rb +5 -3
  21. data/lib/rio/{cxdir.rb → context/skip.rb} +24 -36
  22. data/lib/rio/context/stream.rb +38 -16
  23. data/lib/rio/cp.rb +24 -5
  24. data/lib/rio/dir.rb +8 -7
  25. data/lib/rio/doc/HOWTO.rb +33 -33
  26. data/lib/rio/doc/INTRO.rb +416 -256
  27. data/lib/rio/doc/MISC.rb +3 -1
  28. data/lib/rio/doc/SYNOPSIS.rb +28 -33
  29. data/lib/rio/entrysel.rb +76 -9
  30. data/lib/rio/file.rb +2 -1
  31. data/lib/rio/filter.rb +95 -0
  32. data/lib/rio/filter/closeoneof.rb +1 -1
  33. data/lib/rio/grande.rb +0 -74
  34. data/lib/rio/if.rb +2 -1
  35. data/lib/rio/if/basic.rb +1 -1
  36. data/lib/rio/if/csv.rb +1 -1
  37. data/lib/rio/if/dir.rb +1 -220
  38. data/lib/rio/if/fileordir.rb +26 -12
  39. data/lib/rio/if/grande.rb +55 -6
  40. data/lib/rio/if/grande_entry.rb +355 -0
  41. data/lib/rio/if/{methods.rb → grande_stream.rb} +69 -88
  42. data/lib/rio/if/path.rb +25 -3
  43. data/lib/rio/if/stream.rb +62 -37
  44. data/lib/rio/if/temp.rb +2 -2
  45. data/lib/rio/if/test.rb +23 -0
  46. data/lib/rio/impl/path.rb +5 -0
  47. data/lib/rio/match.rb +6 -3
  48. data/lib/rio/matchrecord.rb +50 -46
  49. data/lib/rio/{filter/chomp.rb → ops/construct.rb} +12 -20
  50. data/lib/rio/ops/create.rb +3 -0
  51. data/lib/rio/ops/dir.rb +12 -6
  52. data/lib/rio/ops/either.rb +17 -3
  53. data/lib/rio/ops/path.rb +4 -1
  54. data/lib/rio/ops/stream/input.rb +6 -1
  55. data/lib/rio/ops/stream/read.rb +1 -3
  56. data/lib/rio/{context/chomp.rb → prompt.rb} +17 -13
  57. data/lib/rio/rl/base.rb +1 -1
  58. data/lib/rio/rl/builder.rb +3 -1
  59. data/lib/rio/state.rb +7 -13
  60. data/lib/rio/stream.rb +8 -5
  61. data/lib/rio/stream/open.rb +1 -1
  62. data/lib/rio/version.rb +1 -1
  63. data/test/mswin32.rb +1 -1
  64. data/test/runtests_gem.rb +1 -1
  65. data/test/tc/all.rb +3 -0
  66. data/test/tc/copy-from.rb +13 -13
  67. data/test/tc/copy-to.rb +1 -1
  68. data/test/tc/copy.rb +1 -1
  69. data/test/tc/copydir.rb +0 -24
  70. data/test/tc/copysymlink.rb +39 -0
  71. data/test/tc/csv.rb +2 -2
  72. data/test/tc/csv2.rb +4 -4
  73. data/test/tc/misc.rb +16 -16
  74. data/test/tc/nolines.rb +26 -26
  75. data/test/tc/noqae.rb +74 -74
  76. data/test/tc/overload.rb +28 -28
  77. data/test/tc/riorl.rb +36 -0
  78. data/test/tc/selnosel.rb +36 -0
  79. data/test/tc/skip.rb +58 -0
  80. data/test/tc/skiplines.rb +42 -0
  81. data/test/tc/symlink.rb +1 -1
  82. data/test/tc/symlink0.rb +1 -1
  83. data/test/tc/temp.rb +1 -1
  84. data/test/tc/tempdir.rb +1 -1
  85. data/test/tc/testcase.rb +7 -1
  86. metadata +14 -8
  87. data/lib/rio/matchcolumns.rb +0 -266
  88. data/lib/rio/rangemath.rb +0 -44
@@ -42,8 +42,9 @@ end
42
42
 
43
43
  require 'rio/if/internal'
44
44
  require 'rio/if/basic'
45
- require 'rio/if/methods'
46
45
  require 'rio/if/grande'
46
+ require 'rio/if/grande_entry'
47
+ require 'rio/if/grande_stream'
47
48
 
48
49
  require 'rio/if/test'
49
50
  require 'rio/if/path'
@@ -57,7 +57,7 @@ module RIO
57
57
  # Returns true if their String representations are eql?
58
58
  def eql?(other) target.eql?(other) end
59
59
 
60
- # Match - invokes other.=~, passing the value returned by Rio#to_s
60
+ # Match - invokes other.=~, passing the value returned by Rio#to_str
61
61
  def =~(other) target =~ other end
62
62
 
63
63
  end
@@ -60,7 +60,7 @@ module RIO
60
60
  # rio("afile.csv").csv.nocolumns(2,3..5) { |array_of_fields| ... }
61
61
  #
62
62
  # # an array containg all but the first line returning columns 5,6 and 7
63
- # rio("afile.csv").csv.columns(5..7).nolines[0]
63
+ # rio("afile.csv").csv.columns(5..7).skiplines[0]
64
64
  #
65
65
  # See RIO::Doc::INTRO for complete documentation on csv mode.
66
66
  def csv(field_separator=',',record_separator=nil,&block)
@@ -59,225 +59,6 @@ module RIO
59
59
 
60
60
 
61
61
 
62
- # Grande Directory Selection Method
63
- #
64
- # Sets the rio to return directories. _args_ can be used to select which directories are returned.
65
- # ario.files(*args) do |f|
66
- # f.directory? #=> true
67
- # end
68
- # No aguments selects all directories.
69
- # if _args_ are:
70
- # Regexp:: selects matching directories
71
- # glob:: selects matching directories
72
- # Proc:: called for each directory. the directory is processed unless the proc returns false
73
- # Symbol:: sent to each directory. Each directory is processed unless the symbol returns false
74
- #
75
- # If a block is given, behaves like <tt>ario.dirs(*args).each(&block)</tt>
76
- #
77
- # See also Rio#files, Rio#entries, Rio#nodirs
78
- #
79
- # rio('adir').dirs { |frio| ... } # process all directories in 'adir'
80
- # rio('adir').all.dirs { |frio| ... } # same thing recursively
81
- # rio('adir').dirs(/^\./) { |frio| ...} # process dot directories
82
- # rio('adir').dirs[/^\./] # return an array of dot directories
83
- # rio('adir').dirs[:symlink?] # an array of symlinks to directories
84
- #
85
- def dirs(*args,&block) target.dirs(*args,&block); self end
86
-
87
- # Grande Directory Exclude Method
88
- #
89
- # If no args are provided selects anything but directories.
90
- # ario.nodirs do |el|
91
- # el.directory? #=> false
92
- # end
93
- # If args are provided, sets the rio to select directories as with Rio#dirs, but the arguments are
94
- # used to determine which directories will *not* be processed
95
- #
96
- # If a block is given behaves like
97
- # ario.nodirs(*args).each(&block)
98
- #
99
- # See Rio#dirs
100
- #
101
- # rio('adir').nodirs { |ent| ... } # iterate through everything except directories
102
- # rio('adir').nodirs(/^\./) { |drio| ... } # iterate through directories, skipping dot directories
103
- #
104
- #
105
- def nodirs(*args,&block) target.nodirs(*args,&block); self end
106
-
107
-
108
- # Grande Directory Entry Selection Method
109
- #
110
- # No aguments selects all entries.
111
- #
112
- # if +args+ are:
113
- # Regexp:: selects matching entries
114
- # glob:: selects matching entries
115
- # Proc:: called for each entry. the entry is processed unless the proc returns false
116
- # Symbol:: sent to each entry. Each entry is processed unless the symbol returns false
117
- #
118
- # If a block is given, behaves like <tt>ario.etries(*args).each(&block)</tt>
119
- #
120
- # See also Rio#files, Rio#dirs, Rio#noentries
121
- #
122
- # rio('adir').entries { |frio| ... } # process all entries in 'adir'
123
- # rio('adir').all.entries { |frio| ... } # same thing recursively
124
- # rio('adir').entries(/^\./) { |frio| ...} # process entries starting with a dot
125
- # rio('adir').entries[/^\./] # return an array of all entries starting with a dot
126
- # rio('adir').entries[:symlink?] # an array of symlinks in 'adir'
127
- #
128
- def entries(*args,&block) target.entries(*args,&block); self end
129
-
130
- # Grande Directory Entry Rejection Method
131
- #
132
- # No aguments rejects all entries.
133
- #
134
- # Behaves like Rio#entries, except that matching entries are excluded.
135
- #
136
- def noentries(*args,&block) target.noentries(*args,&block); self end
137
-
138
-
139
- # Grande File Selection Method
140
- #
141
- # Sets the rio to return files. +args+ can be used to select which files are returned.
142
- # ario.files(*args) do |f|
143
- # f.file? #=> true
144
- # end
145
- # No aguments selects all files.
146
- #
147
- # +args+ may be one or more of the following:
148
- # Regexp:: selects matching files
149
- # String:: treated as a glob, and selects matching files
150
- # Proc:: called for each file. the file is processed unless the proc returns false
151
- # Symbol:: sent to each file. Each file is processed unless the symbol returns false
152
- #
153
- # If a block is given, behaves like <tt>ario.files(*args).each</tt>
154
- #
155
- # See also Rio#dirs, Rio#entries, Rio#nofiles
156
- #
157
- # rio('adir').files { |frio| ... } # process all files in 'adir'
158
- # rio('adir').all.files { |frio| ... } # same thing recursively
159
- # rio('adir').files('*.rb') { |frio| ...} # process .rb files
160
- # rio('adir').files['*.rb'] # return an array of .rb files
161
- # rio('adir').files[/\.rb$/] # same thing using a regular expression
162
- # rio('adir').files[:symlink?] # an array of symlinks to files
163
- #
164
- # For Rios that refer to files, <tt>files(*args)</tt> causes the file to be processed only if
165
- # it meets the criteria specified by the args.
166
- #
167
- # rio('afile.z').files['*.z'] #=> [rio('afile.z')]
168
- # rio('afile.q').files['*.z'] #=> []
169
- #
170
- # Example
171
- #
172
- # Problem:
173
- #
174
- # Need an array of all ruby programs in a directory and its subdirectories, skipping those in _subversion_ (.svn)
175
- # directories. For the purposes of this problem, a Ruby program is defined as a file ending with .rb or a file
176
- # that is executable and whose shebang line contains 'ruby'
177
- #
178
- # rio(path).norecurse('.svn').files['*.rb',proc{ |f| f.executable? and f.gets =~ /^#!.+ruby/ }]
179
- #
180
- # Explanation:
181
- #
182
- # Create a Rio for a directory
183
- # rio(path)
184
- # Specify that '.svn' directories should not be included in recursion.
185
- # rio(path).norecurse('.svn')
186
- # Select files
187
- # rio(path).norecurse('.svn').files
188
- # Limit to files ending with '.rb'
189
- # rio(path).norecurse('.svn').files('*.rb')
190
- # Also allow files that are both executable and whose first line is a shebang-ruby line
191
- # rio(path).norecurse('.svn').files('*.rb',proc{ |f| f.executable? and f.gets =~ /^#!.+ruby/ })
192
- # Return an array rather than iterating thru them
193
- # rio(path).norecurse('.svn').files['*.rb',proc{ |f| f.executable? and f.gets =~ /^#!.+ruby/ }]
194
- #
195
- def files(*args,&block) target.files(*args,&block); self end
196
-
197
- # Grande File Exclude Method
198
- #
199
- # If no args are provided selects anything but files.
200
- # ario.nofiles do |el|
201
- # el.file? #=> false
202
- # end
203
- # If args are provided, sets the rio to select files as with Rio#files, but the arguments are
204
- # used to determine which files will *not* be processed
205
- #
206
- # If a block is given behaves like <tt>ario.nofiles(*args).each(&block)</tt>
207
- #
208
- # See Rio#files
209
- #
210
- # rio('adir').nofiles { |ent| ... } # iterate through everything except files
211
- # rio('adir').nofiles(*~) { |frio| ... } # iterate through files, skipping those ending with a tilde
212
- #
213
- #
214
- def nofiles(*args,&block) target.nofiles(*args,&block); self end
215
-
216
-
217
- # Returns +true+ if the rio is in +all+ (recursive) mode. See Rio#all
218
- #
219
- # adir = rio('adir').all.dirs
220
- # adir.all? # true
221
- # adir.each do |subdir|
222
- # subdir.all? # true
223
- # end
224
- #
225
- # rio('adir').all? # false
226
- #
227
- def all?() target.all?() end
228
-
229
-
230
- # Grande Directory Recursion Method
231
- #
232
- # Sets the Rio to all mode (recursive)
233
- #
234
- # When called with a block, behaves as if all.each(&block) had been called
235
- #
236
- # +all+ causes subsequent calls to +files+ or +dirs+ to be applied recursively
237
- # to subdirectories
238
- #
239
- # rio('adir').all.files('*.[ch]').each { |file| ... } # process all c language source files in adir
240
- # # and all subdirectories of adir
241
- # rio('adir').all.files(/\.[ch]$/) { |file| ... } # same as above
242
- # rio('adir').files("*.[ch]").all { |file| ... } # once again
243
- # rio('adir').all.files["*.[ch]"] # same, but return an array instead of iterating
244
- #
245
- def all(arg=true,&block) target.all(arg,&block); self end
246
-
247
-
248
- # Grande Directory Recursion Selection Method
249
- #
250
- # Sets the Rio to recurse into directories like Rio#all. If no args are provided behaves like Rio#all.
251
- # If args are provided, they are processed like Rio#dirs, to select which subdirectories should
252
- # be recursed into. Rio#recurse always implies Rio#all.
253
- #
254
- # +args+ may be one or more of:
255
- # Regexp:: recurse into matching subdirectories
256
- # glob:: recurse into matching subdirectories
257
- # Proc:: called for each directory. The directory is recursed into unless the proc returns false
258
- # Symbol:: sent to each directory. Each directory is recursed into unless the symbol returns false
259
- #
260
- # If a block is given, behaves like <tt>ario.recurse(*args).each(&block)</tt>
261
- #
262
- # See also Rio#norecurse, Rio#all, Rio#dirs
263
- #
264
- # rio('adir').all.recurse('test*') { |drio| ... } # process all entries and all entries in subdirectories
265
- # # starting with 'test' -- recursively
266
- #
267
- def recurse(*args,&block) target.recurse(*args,&block); self end
268
-
269
-
270
- # Grande Directory Recursion Exclude Method
271
- #
272
- # Sets the Rio to recurse into directories like Rio#all. If no args are provided, no
273
- # directories will be recursed into. If args are provided, behaves like Rio#recurse, except
274
- # that mathcing will *not* be recursed into
275
- #
276
- # rio('adir').norecurse('.svn') { |drio| ... } # recurse, skipping subversion directories
277
- #
278
- def norecurse(*args,&block) target.norecurse(*args,&block); self end
279
-
280
-
281
62
  # Calls Find#find
282
63
  #
283
64
  # Uses Find#find to find all entries recursively for a Rio that
@@ -329,7 +110,7 @@ module RIO
329
110
  # Removes a directory Rio recursively. Returns the Rio.
330
111
  # If the directory does not exist, simply returns the Rio
331
112
  #
332
- # If called with a block, behaves as if rmtree.each(&block) had been called
113
+ # If called with a block, behaves as if <tt>rmtree.each(&block)</tt> had been called
333
114
  #
334
115
  # See also Rio#delete!
335
116
  #
@@ -38,15 +38,28 @@
38
38
  module RIO
39
39
  class Rio
40
40
 
41
+ # undocumented
42
+ def open(m,*args,&block) target.open(m,*args,&block); self end
43
+ # if block_given?
44
+ # old_closeoncopy,old_closeoneof = closeoncopy?,closeoneof?
45
+ # begin
46
+ # return yield(nocloseoncopy.nocloseoneof)
47
+ # ensure
48
+ # reset.closeoncopy(old_closeoncopy).closeoneof(old_closeoneof)
49
+ # end
50
+ # end
51
+ # self
52
+ # end
53
+
41
54
  # Creates a symbolic link _dest_ which points to the Rio's Rio#fspath.
42
55
  # Raises a NotImplementedError exception on platforms that do not support symbolic links.
43
56
  # _dest_ may be a Rio, a String, or anything that will create an appropriate Rio
44
- # when passed to Rio#new
57
+ # when passed to Rio#new .
45
58
  # If _dest_ already exists and is a directory, creates a symbolic link in the _dest_ directory,
46
- # named with the name returned by Rio#filename
59
+ # named with the name returned by Rio#filename.
47
60
  # If _dest_ already exists and it is not a directory, raises Errno::EEXIST.
48
61
  #
49
- # Returns the Rio (not the symlink)
62
+ # Returns the Rio (not the symlink).
50
63
  #
51
64
  # Rio#symlink differs from File#symlink when the Rio or the _dest_ path has directory information.
52
65
  # In this case Rio#symlink creates a symlink that actually refers to the Rio's location
@@ -78,17 +91,18 @@ module RIO
78
91
  #
79
92
  def readlink(*args) target.readlink(*args) end
80
93
 
81
- # If called with an argument calls FileUtils#rename
82
- # If called without an argument puts the Rio in a rename mode in
83
- # which changes to the Rio's path affect a rename of the file
84
- # on the file system.
85
- #
94
+ # If called with an argument calls FileUtils#rename.
95
+ # If called without an argument puts the Rio in "rename mode".
86
96
  # Proxy for FileUtils#rename
87
97
  # ario = rio('afile.cpp')
88
98
  # ario.rename('afile.cxx') # renamed the file, but ario still references
89
99
  # # the old path
90
100
  # Rename Mode
91
101
  #
102
+ # In rename mode changes to a Rio's path with Rio#dirname=, Rio#filename=,
103
+ # Rio#basename=, and Rio#extname= also cause the object on the filesystem
104
+ # to be renamed.
105
+ #
92
106
  # Change the extension of all'.cpp' files in 'adir' to '.cxx'
93
107
  # rio('adir').rename.files('*.cpp') do |file|
94
108
  # file.ext = '.cxx' # 'file' references the new path and the actual file is renamed
@@ -168,12 +182,12 @@ module RIO
168
182
  # Seeks to a given offset _amount_ in the stream according to the
169
183
  # value of _whence_:
170
184
  #
171
- # IO::SEEK_CUR | Seeks to <em>amount</em> plus current position
185
+ # IO::SEEK_CUR | Seeks to 'amount' plus current position
172
186
  # --------------+----------------------------------------------------
173
- # IO::SEEK_END | Seeks to <em>amount</em> plus end of stream (you probably
174
- # | want a negative value for <em>amount</em>)
187
+ # IO::SEEK_END | Seeks to 'amount' plus end of stream (you probably
188
+ # | want a negative value for 'amount')
175
189
  # --------------+----------------------------------------------------
176
- # IO::SEEK_SET | Seeks to the absolute location given by <em>amount</em>
190
+ # IO::SEEK_SET | Seeks to the absolute location given by 'amount'
177
191
  #
178
192
  # Example:
179
193
  #
@@ -77,8 +77,8 @@ module RIO
77
77
  # What constitutes an array element is determined by Rio#lines, Rio#bytes,
78
78
  # or by an extension such as Rio#csv. Rio#lines is the default.
79
79
  #
80
- # Arguments may consist of zero or more integers, ranges, regular expressions, symbols
81
- # and procs.
80
+ # Arguments may consist of zero or more integers, ranges, regular expressions, symbols,
81
+ # procs, and arrays
82
82
  # An empty argument list selects all records
83
83
  #
84
84
  # Records are selected as follows.
@@ -87,6 +87,8 @@ module RIO
87
87
  # integer:: treated like a one element range
88
88
  # symbol:: the symbol is sent to the string. record is selected unless false is returned
89
89
  # proc:: the proc is called with the string as an argument. record is selected unless false is returned
90
+ # array:: the array may contain any of the other selector types. record is selected
91
+ # unless any of the selectors returns false. (a logical and)
90
92
  #
91
93
  # A record matching *any* of the selectors will be included in the array. (acts like an _or_)
92
94
  #
@@ -186,7 +188,7 @@ module RIO
186
188
  # rio('adir').files['*.txt'] # array of all .txt files
187
189
  #
188
190
  # rio('adir').dirs['CSV'] # array of all CSV directories
189
- # rio('adir').nodirs['CSV'] # array of all non-CSV directories
191
+ # rio('adir').skipdirs['CSV'] # array of all non-CSV directories
190
192
  #
191
193
  def [](*selectors) target[*selectors] end
192
194
 
@@ -377,7 +379,7 @@ module RIO
377
379
  # rio('afile').chomp.lines(0..9) > ary # same thing with lines chomped
378
380
  # rio('afile').gzip.chomp.lines(0..9) > ary # same thing from a gzipped file
379
381
  #
380
- # rio('afile').nolines(0..9) > ary # ary will contain all but the first ten lines of the file
382
+ # rio('afile').skiplines(0..9) > ary # ary will contain all but the first ten lines of the file
381
383
  #
382
384
  # rio('adir') > ary # ary will contain a Rio for each entry in the directory
383
385
  # rio('adir').files > ary # same, but only files
@@ -385,7 +387,7 @@ module RIO
385
387
  #
386
388
  # Copying to a string
387
389
  # rio('afile') > astring # slurp the entire contents of the file into astring
388
- # astring = rio('afile').slurp # same effect
390
+ # astring = rio('afile').contents # same effect
389
391
  #
390
392
  # Copy the first line *and* every line containing the word Rio into a gzipped file
391
393
  # rio('src').lines(1,/Rio/) > rio('dst.gz').gzip
@@ -400,7 +402,7 @@ module RIO
400
402
  def >(destination) target > destination; self end
401
403
 
402
404
  # Alias for Rio#> (copy-to grande operator)
403
- def copy(destination) target.copy(destination); self end
405
+ def copy_to(destination) target.copy_to(destination); self end
404
406
 
405
407
  # Grande Append-To Operator
406
408
  #
@@ -424,6 +426,10 @@ module RIO
424
426
  def >>(destination) target >> destination; self end
425
427
 
426
428
 
429
+ # Alias for Rio#>> (append-to grande operator)
430
+ def append_to(destination) target.append_to(destination); self end
431
+
432
+
427
433
  # Grande Append-From Operator
428
434
  #
429
435
  # The append-from grande-operator copies a Rio from another Rio or another ruby object. This
@@ -438,6 +444,11 @@ module RIO
438
444
  # See Rio#< (copy-from)
439
445
  def <<(source) target << source; self end
440
446
 
447
+
448
+ # Alias for Rio#<< (append-from grande operator)
449
+ def append_from(source) target.append_from(source); self end
450
+
451
+
441
452
  # Grande Copy-From Operator
442
453
  #
443
454
  # The copy-from grande-operator copies a Rio from another Rio or another ruby object.
@@ -521,6 +532,10 @@ module RIO
521
532
  #
522
533
  def <(source) target < source; self end
523
534
 
535
+ # Alias for Rio#< (copy-from grande operator)
536
+ def copy_from(source) target.copy_from(source); self end
537
+
538
+
524
539
  # Reads and returns the next record from a Rio, honoring the grande selection methods.
525
540
  #
526
541
  # Returns nil on end of file.
@@ -534,5 +549,39 @@ module RIO
534
549
  # a_nil = ario.getrec
535
550
  def getrec() target.getrec() end
536
551
 
552
+ # Grande Exclude method
553
+ #
554
+ # +skip+ can be used in two ways.
555
+ #
556
+ # If called with no arguments it reverses the polarity of the
557
+ # next non-skip grande selection method that is called. That is,
558
+ # it turns +lines+, +records+, +rows+, +files+, +dirs+ and +entries+
559
+ # into +skiplines+, +skiprecords+, +skiprows+, +skipfiles+,
560
+ # +skipdirs+, and +skipentries+, respectively.
561
+ #
562
+ # rio('afile').skip.lines(0..5) # same as rio('afile').skiplines(0..5)
563
+ # rio('adir').skip.files('*~') # same as rio('adir').skipfiles('*~')
564
+ #
565
+ # Note that it only affects the next selection method seen -- and may be
566
+ # used more than once. If no grande selection method is seen, +skip+ is
567
+ # ignored.
568
+ #
569
+ # When called with arguments it acts like Rio#skipentries for directory
570
+ # Rios and like Rio#skiprecords for stream Rios.
571
+ #
572
+ # rio('afile').lines(/Rio/).skip[0..4] # lines containg 'Rio' excluding the
573
+ # # first five lines
574
+ #
575
+ # rio('adir').files('*.rb').skip[:symlink?] # .rb files, but not symlinks to
576
+ # # .rb files
577
+ #
578
+ # If a block is given, behaves as if <tt>skip(*args).each(&block)</tt> had been called.
579
+ #
580
+ # Returns the Rio.
581
+ #
582
+ # See Rio#skiplines, Rio#skiprecords, Rio#skiprows, Rio#skipfiles,
583
+ # Rio#skipdirs, and Rio#skipentries.
584
+ #
585
+ def skip(*args,&block) target.skip(*args,&block); self end
537
586
  end
538
587
  end