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.
- data/ChangeLog +225 -0
- data/README +12 -0
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/doc/ANNOUNCE +160 -71
- data/doc/RELEASE_NOTES +71 -2
- data/ex/colx.rb +1 -1
- data/ex/passwd_report.rb +4 -8
- data/ex/riocat +5 -5
- data/ex/riogunzip +1 -1
- data/ex/riogzip +6 -6
- data/ex/rioprompt.rb +6 -0
- data/lib/rio.rb +3 -13
- data/lib/rio/arycopy.rb +1 -1
- data/lib/rio/base.rb +1 -5
- data/lib/rio/construct.rb +75 -0
- data/lib/rio/constructor.rb +42 -11
- data/lib/rio/context.rb +1 -1
- data/lib/rio/context/dir.rb +50 -23
- data/lib/rio/context/methods.rb +5 -3
- data/lib/rio/{cxdir.rb → context/skip.rb} +24 -36
- data/lib/rio/context/stream.rb +38 -16
- data/lib/rio/cp.rb +24 -5
- data/lib/rio/dir.rb +8 -7
- data/lib/rio/doc/HOWTO.rb +33 -33
- data/lib/rio/doc/INTRO.rb +416 -256
- data/lib/rio/doc/MISC.rb +3 -1
- data/lib/rio/doc/SYNOPSIS.rb +28 -33
- data/lib/rio/entrysel.rb +76 -9
- data/lib/rio/file.rb +2 -1
- data/lib/rio/filter.rb +95 -0
- data/lib/rio/filter/closeoneof.rb +1 -1
- data/lib/rio/grande.rb +0 -74
- data/lib/rio/if.rb +2 -1
- data/lib/rio/if/basic.rb +1 -1
- data/lib/rio/if/csv.rb +1 -1
- data/lib/rio/if/dir.rb +1 -220
- data/lib/rio/if/fileordir.rb +26 -12
- data/lib/rio/if/grande.rb +55 -6
- data/lib/rio/if/grande_entry.rb +355 -0
- data/lib/rio/if/{methods.rb → grande_stream.rb} +69 -88
- data/lib/rio/if/path.rb +25 -3
- data/lib/rio/if/stream.rb +62 -37
- data/lib/rio/if/temp.rb +2 -2
- data/lib/rio/if/test.rb +23 -0
- data/lib/rio/impl/path.rb +5 -0
- data/lib/rio/match.rb +6 -3
- data/lib/rio/matchrecord.rb +50 -46
- data/lib/rio/{filter/chomp.rb → ops/construct.rb} +12 -20
- data/lib/rio/ops/create.rb +3 -0
- data/lib/rio/ops/dir.rb +12 -6
- data/lib/rio/ops/either.rb +17 -3
- data/lib/rio/ops/path.rb +4 -1
- data/lib/rio/ops/stream/input.rb +6 -1
- data/lib/rio/ops/stream/read.rb +1 -3
- data/lib/rio/{context/chomp.rb → prompt.rb} +17 -13
- data/lib/rio/rl/base.rb +1 -1
- data/lib/rio/rl/builder.rb +3 -1
- data/lib/rio/state.rb +7 -13
- data/lib/rio/stream.rb +8 -5
- data/lib/rio/stream/open.rb +1 -1
- data/lib/rio/version.rb +1 -1
- data/test/mswin32.rb +1 -1
- data/test/runtests_gem.rb +1 -1
- data/test/tc/all.rb +3 -0
- data/test/tc/copy-from.rb +13 -13
- data/test/tc/copy-to.rb +1 -1
- data/test/tc/copy.rb +1 -1
- data/test/tc/copydir.rb +0 -24
- data/test/tc/copysymlink.rb +39 -0
- data/test/tc/csv.rb +2 -2
- data/test/tc/csv2.rb +4 -4
- data/test/tc/misc.rb +16 -16
- data/test/tc/nolines.rb +26 -26
- data/test/tc/noqae.rb +74 -74
- data/test/tc/overload.rb +28 -28
- data/test/tc/riorl.rb +36 -0
- data/test/tc/selnosel.rb +36 -0
- data/test/tc/skip.rb +58 -0
- data/test/tc/skiplines.rb +42 -0
- data/test/tc/symlink.rb +1 -1
- data/test/tc/symlink0.rb +1 -1
- data/test/tc/temp.rb +1 -1
- data/test/tc/tempdir.rb +1 -1
- data/test/tc/testcase.rb +7 -1
- metadata +14 -8
- data/lib/rio/matchcolumns.rb +0 -266
- data/lib/rio/rangemath.rb +0 -44
data/lib/rio/matchcolumns.rb
DELETED
@@ -1,266 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# ===============================================================================
|
3
|
-
# Copyright (c) 2005, 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
|
-
# rake rdoc
|
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 Match #:nodoc: all
|
40
|
-
module Column
|
41
|
-
|
42
|
-
class Base
|
43
|
-
def initialize(arg)
|
44
|
-
@select_arg = arg
|
45
|
-
end
|
46
|
-
def inspect
|
47
|
-
@select_arg.inspect
|
48
|
-
end
|
49
|
-
def val()
|
50
|
-
@select_arg
|
51
|
-
end
|
52
|
-
def match_all?() false end
|
53
|
-
def match_none?() false end
|
54
|
-
end
|
55
|
-
class All < Base
|
56
|
-
def match?(colno) true end
|
57
|
-
def match_all?() true end
|
58
|
-
def =~(colno) true end
|
59
|
-
end
|
60
|
-
class None < Base
|
61
|
-
def match?(colno) false end
|
62
|
-
def match_none?() true end
|
63
|
-
def =~(colno) false end
|
64
|
-
end
|
65
|
-
|
66
|
-
class Range < Base
|
67
|
-
def match?(colno)
|
68
|
-
#p "match?(#{val},#{recno}) select_arg=#{@select_arg}"
|
69
|
-
@select_arg === colno
|
70
|
-
end
|
71
|
-
def =~(colno)
|
72
|
-
#p "=~(#{record},#{record.recno}) select_arg=#{@select_arg}"
|
73
|
-
@select_arg === colno
|
74
|
-
end
|
75
|
-
end
|
76
|
-
class Fixnum < Base
|
77
|
-
def match?(val,recno)
|
78
|
-
#p "match?(#{val},#{recno}) select_arg=#{@select_arg}"
|
79
|
-
@select_arg === recno
|
80
|
-
end
|
81
|
-
def =~(record)
|
82
|
-
#p "=~(#{record},#{record.recno}) select_arg=#{@select_arg}"
|
83
|
-
@select_arg === record.recno
|
84
|
-
end
|
85
|
-
end
|
86
|
-
class Proc < Base
|
87
|
-
def initialize(arg,therio)
|
88
|
-
super(arg)
|
89
|
-
@therio = therio
|
90
|
-
end
|
91
|
-
def match?(val,recno)
|
92
|
-
#p "match?(#{val},#{recno}) select_arg=#{@select_arg}"
|
93
|
-
@select_arg.call(val,recno,@therio)
|
94
|
-
end
|
95
|
-
def =~(record)
|
96
|
-
@select_arg.call(record,record.recno,@therio)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
class Symbol < Base
|
100
|
-
def match?(val,recno)
|
101
|
-
#p "match?(#{val},#{recno}) select_arg=#{@select_arg}"
|
102
|
-
val.__send__(@select_arg)
|
103
|
-
end
|
104
|
-
def =~(record)
|
105
|
-
record.__send__(@select_arg)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
module Match
|
112
|
-
module Record
|
113
|
-
# for a sellist
|
114
|
-
# nil indicates no call was made, so nothing selected
|
115
|
-
# empty indicates a call was made, so all selected
|
116
|
-
# contents should be checked for matches
|
117
|
-
# if contents are removed the list should become nil, not empty
|
118
|
-
class SelList
|
119
|
-
def initialize(therio,args)
|
120
|
-
if args.nil?
|
121
|
-
@list = nil
|
122
|
-
else
|
123
|
-
@list = []
|
124
|
-
args.each do |arg|
|
125
|
-
@list << create_sel(therio,arg)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
#p "SelList(#{args.inspect},#{@list.inspect})"
|
129
|
-
end
|
130
|
-
def inspect
|
131
|
-
@list.inspect
|
132
|
-
end
|
133
|
-
def size() @list.size unless @list.nil? end
|
134
|
-
def only_one_fixnum?()
|
135
|
-
@list && @list.size == 1 && @list[0].kind_of?(Match::Record::Fixnum)
|
136
|
-
end
|
137
|
-
def delete_at(index)
|
138
|
-
@list.delete_at(index)
|
139
|
-
@list = nil if @list.empty?
|
140
|
-
end
|
141
|
-
def self.create(therio,args)
|
142
|
-
new(therio,args) unless args.nil?
|
143
|
-
end
|
144
|
-
def ranges()
|
145
|
-
@list.nil? ? [] : @list.select { |sel| sel.kind_of?(Record::Range) }
|
146
|
-
end
|
147
|
-
def remove_passed_ranges(n)
|
148
|
-
return nil if @list.nil?
|
149
|
-
return self if @list.empty?
|
150
|
-
newlist = []
|
151
|
-
@list.each do |sel|
|
152
|
-
newlist << sel unless sel.kind_of?(Match::Record::Range) and sel.val.max < n
|
153
|
-
end
|
154
|
-
@list = (newlist.empty? ? nil : newlist) if newlist.length != @list.length
|
155
|
-
@list.nil? ? nil : self
|
156
|
-
end
|
157
|
-
def create_sel(therio,arg)
|
158
|
-
case arg
|
159
|
-
when ::Regexp
|
160
|
-
Match::Record::RegExp.new(arg)
|
161
|
-
when ::Range
|
162
|
-
Match::Record::Range.new(arg)
|
163
|
-
when ::Proc
|
164
|
-
Match::Record::Proc.new(arg,therio)
|
165
|
-
when ::Symbol
|
166
|
-
Match::Record::Symbol.new(arg)
|
167
|
-
when ::Fixnum
|
168
|
-
Match::Record::Fixnum.new(arg)
|
169
|
-
else
|
170
|
-
raise ArgumentError,"Argument must be a Regexp,Range,Fixnum,Proc, or Symbol"
|
171
|
-
end
|
172
|
-
end
|
173
|
-
def match?(val,recno)
|
174
|
-
# !@list.nil? && (@list.empty? || @list.detect { |sel| sel.match?(val,recno) } || false) && true
|
175
|
-
return false if @list.nil?
|
176
|
-
return true if @list.empty?
|
177
|
-
as = nil
|
178
|
-
al = @list.detect { |sel| as = sel.match?(val,recno)
|
179
|
-
#p "1: #{$1} as[match?]: #{as.inspect}"
|
180
|
-
as
|
181
|
-
}
|
182
|
-
#p "[SelList.match?] as:#{as.inspect} al:#{al.inspect}"
|
183
|
-
return as if al
|
184
|
-
return false
|
185
|
-
end
|
186
|
-
def =~(el)
|
187
|
-
!@list.nil? && (@list.empty? || @list.detect { |sel| sel =~ el } || false) && true
|
188
|
-
end
|
189
|
-
def always?() !@list.nil? && @list.empty? end
|
190
|
-
def never?() @list.nil? end
|
191
|
-
end
|
192
|
-
|
193
|
-
|
194
|
-
class SelRej
|
195
|
-
def initialize(therio,sel_args,rej_args)
|
196
|
-
@sel = SelList.create(therio,sel_args)
|
197
|
-
@rej = SelList.create(therio,rej_args)
|
198
|
-
@always = init_always()
|
199
|
-
end
|
200
|
-
def only_one_fixnum?()
|
201
|
-
@rej.nil? && @sel && @sel.only_one_fixnum?
|
202
|
-
end
|
203
|
-
def init_always(reset=false)
|
204
|
-
if @sel.nil? and @rej.nil?
|
205
|
-
!reset
|
206
|
-
elsif @rej.nil? and @sel.always?
|
207
|
-
true
|
208
|
-
elsif @sel.nil?
|
209
|
-
false
|
210
|
-
elsif !@rej.nil? and @rej.always?
|
211
|
-
false
|
212
|
-
else
|
213
|
-
nil
|
214
|
-
end
|
215
|
-
end
|
216
|
-
def remove_passed_ranges(n)
|
217
|
-
@sel = @sel.remove_passed_ranges(n) unless @sel.nil?
|
218
|
-
@rej = @rej.remove_passed_ranges(n) unless @rej.nil?
|
219
|
-
@always = init_always(true)
|
220
|
-
self
|
221
|
-
end
|
222
|
-
def rangetops()
|
223
|
-
rtops = ranges.map { |r| r.val.max }.sort.uniq
|
224
|
-
rtops.empty? ? nil : rtops
|
225
|
-
end
|
226
|
-
def ranges()
|
227
|
-
(@sel.nil? ? [] : @sel.ranges) + (@rej.nil? ? [] : @rej.ranges)
|
228
|
-
end
|
229
|
-
def class_tail
|
230
|
-
self.class.to_s.sub(/^.+::/,'')
|
231
|
-
end
|
232
|
-
def inspect
|
233
|
-
sprintf("#<%s:0x%08x @always=%s @sel=%s @rej=%s>",self.class_tail,self.object_id,@always.inspect,
|
234
|
-
@sel.inspect,@rej.inspect)
|
235
|
-
end
|
236
|
-
def always?()
|
237
|
-
@always == true
|
238
|
-
end
|
239
|
-
def never?()
|
240
|
-
@always == false
|
241
|
-
end
|
242
|
-
def match?(val,recno)
|
243
|
-
#p "match?(#{val},#{recno}) #{self.inspect}"
|
244
|
-
return @always unless @always.nil?
|
245
|
-
as = nil
|
246
|
-
ok = ((!@sel.nil? && (as = @sel.match?(val,recno))) && !(!@rej.nil? && @rej.match?(val,recno)))
|
247
|
-
return (ok ? as : ok)
|
248
|
-
end
|
249
|
-
def =~(el)
|
250
|
-
return @always unless @always.nil?
|
251
|
-
(!@sel.nil? && (@sel =~ el)) && !(!@rej.nil? && (@rej =~ el))
|
252
|
-
|
253
|
-
#yes = (!@sel.nil? && (@sel =~ el))
|
254
|
-
#no = (!@rej.nil? && (@rej =~ el))
|
255
|
-
#p "yes=#{yes} no=#{no} el=#{el}"
|
256
|
-
#return yes && !no
|
257
|
-
#(@sel =~ el) && !(@rej =~ el)
|
258
|
-
end
|
259
|
-
end
|
260
|
-
end
|
261
|
-
end
|
262
|
-
end
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
data/lib/rio/rangemath.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
module RIO
|
2
|
-
class Ranges
|
3
|
-
def initialize(*args)
|
4
|
-
@ranges = []
|
5
|
-
args.each { |arg|
|
6
|
-
case arg
|
7
|
-
when ::Range then @ranges << arg
|
8
|
-
else @ranges << Range.new(arg,arg)
|
9
|
-
end
|
10
|
-
}
|
11
|
-
end
|
12
|
-
def merge()
|
13
|
-
return [] if @ranges.empty
|
14
|
-
@ranges.sort_by { |r| r.first }
|
15
|
-
st = @ranges[0].start
|
16
|
-
en = @ranges[0].end
|
17
|
-
@ranges.each { |r|
|
18
|
-
break if r.start > en
|
19
|
-
en = [en,r.end].max
|
20
|
-
}
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
24
|
-
module RangeMath
|
25
|
-
def ceil
|
26
|
-
return last - 1 if exclude_end?
|
27
|
-
last
|
28
|
-
end
|
29
|
-
def -(other)
|
30
|
-
if include?(other.first) and !include?(other.ceil)
|
31
|
-
[Range.new(first,other.first,true)]
|
32
|
-
elsif include?(other.ceil) and !include?(other.first)
|
33
|
-
[Range.new(other.ceil+1,last,exclude_end?)]
|
34
|
-
elsif include?(other.ceil) and include?(other.first)
|
35
|
-
[Range.new(first,other.first,true),Range.new(other.ceil+1,last,exclude_end?)]
|
36
|
-
else
|
37
|
-
[self]
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
class Range
|
43
|
-
include RIO::RangeMath
|
44
|
-
end
|