rio 0.3.3 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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