rio 0.3.7 → 0.3.8
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 +1273 -1482
- data/README +2 -2
- data/Rakefile +5 -5
- data/VERSION +1 -1
- data/{RUNME.1st.rb → build_doc.rb} +4 -10
- data/doc/ANNOUNCE +33 -80
- data/doc/RELEASE_NOTES +31 -1
- data/doc/generators/template/html/rio.rb +3 -3
- data/lib/rio/abstract_method.rb +2 -2
- data/lib/rio/argv.rb +2 -2
- data/lib/rio/arycopy.rb +2 -2
- data/lib/rio/assert.rb +2 -2
- data/lib/rio/base.rb +2 -2
- data/lib/rio/callstr.rb +47 -0
- data/lib/rio/const.rb +52 -0
- data/lib/rio/construct.rb +6 -24
- data/lib/rio/constructor.rb +12 -2
- data/lib/rio/context/autoclose.rb +73 -0
- data/lib/rio/context/copying.rb +2 -2
- data/lib/rio/context/cxx.rb +2 -2
- data/lib/rio/context/dir.rb +2 -2
- data/lib/rio/context/gzip.rb +2 -2
- data/lib/rio/context/methods.rb +6 -34
- data/lib/rio/context/skip.rb +2 -2
- data/lib/rio/context/stream.rb +2 -2
- data/lib/rio/context.rb +17 -2
- data/lib/rio/cp.rb +35 -9
- data/lib/rio/def.rb +54 -0
- data/lib/rio/dir.rb +19 -20
- data/lib/rio/doc/HOWTO.rb +23 -7
- data/lib/rio/doc/INTRO.rb +57 -23
- data/lib/rio/doc/MISC.rb +2 -2
- data/lib/rio/doc/OPTIONAL.rb +134 -0
- data/lib/rio/doc/SYNOPSIS.rb +11 -4
- data/lib/rio/doc.rb +2 -2
- data/lib/rio/entrysel.rb +25 -6
- data/lib/rio/exception/copy.rb +2 -2
- data/lib/rio/exception/notsupported.rb +47 -0
- data/lib/rio/exception/open.rb +2 -2
- data/lib/rio/exception/state.rb +2 -2
- data/lib/rio/exception.rb +2 -2
- data/lib/rio/ext/csv.rb +56 -11
- data/lib/rio/ext/yaml.rb +2 -2
- data/lib/rio/ext/zipfile.rb +91 -0
- data/lib/rio/ext.rb +38 -3
- data/lib/rio/factory.rb +17 -34
- data/lib/rio/file.rb +48 -8
- data/lib/rio/filter/closeoneof.rb +36 -16
- data/lib/rio/filter/gzip.rb +2 -2
- data/lib/rio/filter.rb +2 -2
- data/lib/rio/fs/base.rb +42 -0
- data/lib/rio/fs/impl.rb +123 -0
- data/lib/rio/fs/native.rb +76 -0
- data/lib/rio/{record.rb → fs/stream.rb} +21 -18
- data/lib/rio/fs/url.rb +64 -0
- data/lib/rio/ftp/{ioh.rb → conncache.rb} +38 -39
- data/lib/rio/ftp/dir.rb +95 -0
- data/lib/rio/ftp/fs.rb +173 -0
- data/lib/rio/ftp/ftpfile.rb +20 -0
- data/lib/rio/grande.rb +2 -2
- data/lib/rio/handle.rb +2 -2
- data/lib/rio/if/basic.rb +2 -2
- data/lib/rio/if/csv.rb +2 -2
- data/lib/rio/if/dir.rb +2 -2
- data/lib/rio/if/file.rb +26 -2
- data/lib/rio/if/fileordir.rb +44 -49
- data/lib/rio/if/grande.rb +32 -10
- data/lib/rio/if/grande_entry.rb +12 -2
- data/lib/rio/if/grande_stream.rb +17 -28
- data/lib/rio/if/internal.rb +2 -2
- data/lib/rio/if/path.rb +7 -6
- data/lib/rio/if/stream.rb +85 -29
- data/lib/rio/if/string.rb +2 -2
- data/lib/rio/if/temp.rb +2 -2
- data/lib/rio/if/test.rb +37 -4
- data/lib/rio/if/yaml.rb +2 -2
- data/lib/rio/if.rb +2 -2
- data/lib/rio/impl/path.rb +2 -2
- data/lib/rio/ioh.rb +17 -6
- data/lib/rio/iomode.rb +4 -3
- data/lib/rio/ios/fail.rb +107 -0
- data/lib/rio/ios/generic.rb +120 -0
- data/lib/rio/ios/mode.rb +61 -0
- data/lib/rio/ios/null.rb +120 -0
- data/lib/rio/iowrap.rb +129 -0
- data/lib/rio/kernel.rb +12 -3
- data/lib/rio/local.rb +2 -2
- data/lib/rio/match.rb +3 -3
- data/lib/rio/matchrecord.rb +2 -2
- data/lib/rio/no_warn.rb +50 -0
- data/lib/rio/{arrayio.rb → nullio.rb} +47 -86
- data/lib/rio/open3.rb +2 -2
- data/lib/rio/ops/construct.rb +20 -13
- data/lib/rio/ops/create.rb +10 -19
- data/lib/rio/ops/dir.rb +60 -54
- data/lib/rio/ops/either.rb +11 -9
- data/lib/rio/ops/file.rb +28 -24
- data/lib/rio/ops/path.rb +45 -43
- data/lib/rio/ops/stream/input.rb +12 -8
- data/lib/rio/ops/stream/output.rb +2 -2
- data/lib/rio/ops/stream/read.rb +35 -32
- data/lib/rio/ops/stream/write.rb +5 -5
- data/lib/rio/ops/stream.rb +7 -3
- data/lib/rio/ops/symlink.rb +12 -10
- data/lib/rio/path/reset.rb +5 -5
- data/lib/rio/path.rb +32 -24
- data/lib/rio/piper/cp.rb +2 -2
- data/lib/rio/piper.rb +2 -2
- data/lib/rio/prompt.rb +2 -2
- data/lib/rio/rectype.rb +9 -7
- data/lib/rio/rl/base.rb +5 -4
- data/lib/rio/rl/builder.rb +17 -5
- data/lib/rio/rl/ioi.rb +14 -4
- data/lib/rio/rl/path.rb +23 -15
- data/lib/rio/rl/pathmethods.rb +12 -2
- data/lib/rio/rl/uri.rb +13 -6
- data/lib/rio/scheme/aryio.rb +3 -3
- data/lib/rio/scheme/cmdio.rb +4 -3
- data/lib/rio/scheme/cmdpipe.rb +3 -35
- data/lib/rio/scheme/fd.rb +4 -3
- data/lib/rio/scheme/ftp.rb +36 -7
- data/lib/rio/scheme/http.rb +2 -2
- data/lib/rio/{context/closeoneof.rb → scheme/null.rb} +17 -11
- data/lib/rio/scheme/path.rb +28 -30
- data/lib/rio/scheme/stderr.rb +4 -4
- data/lib/rio/scheme/stdio.rb +6 -5
- data/lib/rio/scheme/strio.rb +10 -20
- data/lib/rio/scheme/sysio.rb +5 -2
- data/lib/rio/scheme/tcp.rb +4 -3
- data/lib/rio/scheme/temp.rb +14 -1
- data/lib/rio/state/error.rb +2 -2
- data/lib/rio/state.rb +80 -34
- data/lib/rio/stream/base.rb +7 -2
- data/lib/rio/stream/duplex.rb +13 -10
- data/lib/rio/stream/open.rb +74 -79
- data/lib/rio/stream.rb +15 -23
- data/lib/rio/symantics.rb +2 -2
- data/lib/rio/tempdir.rb +132 -132
- data/lib/rio/to_rio/all.rb +40 -0
- data/lib/rio/to_rio/array.rb +40 -0
- data/lib/rio/to_rio/io.rb +41 -0
- data/lib/rio/to_rio/object.rb +43 -0
- data/lib/rio/to_rio/string.rb +41 -0
- data/lib/rio/to_rio.rb +13 -2
- data/lib/rio/uri/file.rb +2 -2
- data/lib/rio/util.rb +2 -2
- data/lib/rio/version.rb +3 -3
- data/lib/rio.rb +16 -25
- data/test/bin/count_lines.rb +11 -0
- data/test/bin/find_lines.rb +13 -0
- data/test/bin/list_dir.rb +14 -0
- data/test/ftp/all.rb +9 -0
- data/test/ftp/anon_misc.rb +112 -0
- data/test/ftp/anon_read.rb +105 -0
- data/test/ftp/anon_special.rb +68 -0
- data/test/ftp/anon_write.rb +63 -0
- data/test/ftp/ftp2ftp.rb +51 -0
- data/test/ftp/initftpfiles.rb +14 -0
- data/test/ftp/testdef.rb +51 -0
- data/test/gem_runtests.rb +15 -15
- data/test/runalltests.rb +15 -0
- data/test/runftptests.rb +14 -0
- data/test/{1.rb → runhttptests.rb} +14 -14
- data/test/runtests.rb +14 -14
- data/test/tc/all.rb +36 -21
- data/test/tc/cmdpipe.rb +18 -15
- data/test/tc/copy-from-http.rb +89 -0
- data/test/tc/copy-from.rb +1 -52
- data/test/tc/copy.rb +19 -17
- data/test/tc/csv2.rb +6 -3
- data/test/tc/empty.rb +47 -0
- data/test/tc/emptyriodir.rb +129 -0
- data/test/tc/entsel.rb +110 -0
- data/test/tc/files_select.rb +92 -0
- data/test/tc/get.rb +7 -6
- data/test/tc/getrec.rb +2 -5
- data/test/tc/gzip.rb +82 -0
- data/test/tc/io_each_byte.rb +60 -0
- data/test/tc/io_read.rb +80 -0
- data/test/tc/iometh.rb +149 -0
- data/test/tc/likeio.rb +112 -0
- data/test/tc/methods.rb +10 -9
- data/test/tc/misc.rb +1 -37
- data/test/tc/null.rb +45 -0
- data/test/tc/pid.rb +31 -0
- data/test/tc/piper.rb +34 -37
- data/test/tc/programs_util.rb +24 -0
- data/test/tc/readline.rb +30 -0
- data/test/tc/rename.rb +12 -0
- data/test/tc/tempfile.rb +14 -0
- data/test/tc/testcase.rb +6 -0
- data/test/tc/tonl.rb +37 -0
- metadata +181 -144
- data/ex/colx.rb +0 -8
- data/ex/findinruby +0 -16
- data/ex/findruby +0 -15
- data/ex/passwd_report.rb +0 -8
- data/ex/prompt.rb +0 -25
- data/ex/rgb.txt.gz +0 -0
- data/ex/riocat +0 -35
- data/ex/riogunzip +0 -31
- data/ex/riogzip +0 -24
- data/ex/rioprompt.rb +0 -6
- data/ex/targz2zip +0 -17
- data/ex/tolf +0 -11
- data/lib/rio/ftp/conn.rb +0 -167
- data/lib/rio/ftp.rb +0 -275
- data/test/once.rb +0 -7
data/lib/rio/stream.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#--
|
|
2
2
|
# ===============================================================================
|
|
3
|
-
# Copyright (c) 2005, Christopher Kleckner
|
|
3
|
+
# Copyright (c) 2005, 2006 Christopher Kleckner
|
|
4
4
|
# All rights reserved
|
|
5
5
|
#
|
|
6
6
|
# This file is part of the Rio library for ruby.
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
#++
|
|
23
23
|
#
|
|
24
24
|
# To create the documentation for Rio run the command
|
|
25
|
-
#
|
|
25
|
+
# ruby build_doc.rb
|
|
26
26
|
# from the distribution directory. Then point your browser at the 'doc/rdoc' directory.
|
|
27
27
|
#
|
|
28
28
|
# Suggested Reading
|
|
@@ -66,9 +66,6 @@ module RIO
|
|
|
66
66
|
include Ops::Stream::Status
|
|
67
67
|
include Ops::Stream::Manip
|
|
68
68
|
|
|
69
|
-
# def open(*args)
|
|
70
|
-
# softreset.open(*args)
|
|
71
|
-
# end
|
|
72
69
|
def check?() open? end
|
|
73
70
|
def when_missing(sym,*args)
|
|
74
71
|
#p callstr('when_missing',sym,*args)
|
|
@@ -87,6 +84,9 @@ module RIO
|
|
|
87
84
|
ioh.extend(mod)
|
|
88
85
|
end
|
|
89
86
|
end
|
|
87
|
+
# def open_(*args)
|
|
88
|
+
# self
|
|
89
|
+
# end
|
|
90
90
|
def rectype_mod
|
|
91
91
|
case cx['stream_rectype']
|
|
92
92
|
when 'lines' then RIO::RecType::Lines
|
|
@@ -110,11 +110,6 @@ module RIO
|
|
|
110
110
|
include Ops::Stream::Input
|
|
111
111
|
include Ini
|
|
112
112
|
include Filters
|
|
113
|
-
def initialize_copy(*args)
|
|
114
|
-
#p callstr('enter Input:initialize_copy',*args)
|
|
115
|
-
super
|
|
116
|
-
self.ioh.oncloseproc = proc { self.on_closeoneof } if closeoneof?
|
|
117
|
-
end
|
|
118
113
|
|
|
119
114
|
def add_extensions()
|
|
120
115
|
#p callstr('add_extensions')
|
|
@@ -124,10 +119,11 @@ module RIO
|
|
|
124
119
|
add_filter(Filter::GZipRead) if gzip?
|
|
125
120
|
#add_filter(Filter::YAML) if yaml?
|
|
126
121
|
add_line_filters()
|
|
127
|
-
if
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
122
|
+
# add_filter(Filter::FasterCSV) if csv?
|
|
123
|
+
# if closeoneof?
|
|
124
|
+
# add_filter(Filter::CloseOnEOF)
|
|
125
|
+
# ioh.oncloseproc = proc { self.on_closeoneof }
|
|
126
|
+
# end
|
|
131
127
|
self
|
|
132
128
|
end
|
|
133
129
|
def add_rec_methods()
|
|
@@ -146,6 +142,7 @@ module RIO
|
|
|
146
142
|
end
|
|
147
143
|
def add_filters
|
|
148
144
|
add_filter(Filter::GZipWrite) if gzip?
|
|
145
|
+
#add_filter(Filter::FasterCSV) if csv?
|
|
149
146
|
#add_filter(Filter::YAML) if yaml?
|
|
150
147
|
self
|
|
151
148
|
end
|
|
@@ -158,11 +155,6 @@ module RIO
|
|
|
158
155
|
include Ini
|
|
159
156
|
include Filters
|
|
160
157
|
|
|
161
|
-
def initialize_copy(*args)
|
|
162
|
-
super
|
|
163
|
-
self.ioh.oncloseproc = proc { self.on_closeoneof } if closeoneof?
|
|
164
|
-
end
|
|
165
|
-
|
|
166
158
|
def add_rec_methods()
|
|
167
159
|
self.extend(rectype_mod.module_eval('Input'))
|
|
168
160
|
self.extend(rectype_mod.module_eval('Output'))
|
|
@@ -175,10 +167,10 @@ module RIO
|
|
|
175
167
|
def add_filters
|
|
176
168
|
add_line_filters()
|
|
177
169
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
170
|
+
# if closeoneof?
|
|
171
|
+
# add_filter(Filter::CloseOnEOF)
|
|
172
|
+
# ioh.oncloseproc = proc { self.on_closeoneof }
|
|
173
|
+
# end
|
|
182
174
|
self
|
|
183
175
|
end
|
|
184
176
|
|
data/lib/rio/symantics.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#--
|
|
2
2
|
# ===============================================================================
|
|
3
|
-
# Copyright (c) 2005, Christopher Kleckner
|
|
3
|
+
# Copyright (c) 2005, 2006 Christopher Kleckner
|
|
4
4
|
# All rights reserved
|
|
5
5
|
#
|
|
6
6
|
# This file is part of the Rio library for ruby.
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
#++
|
|
23
23
|
#
|
|
24
24
|
# To create the documentation for Rio run the command
|
|
25
|
-
#
|
|
25
|
+
# ruby build_doc.rb
|
|
26
26
|
# from the distribution directory. Then point your browser at the 'doc/rdoc' directory.
|
|
27
27
|
#
|
|
28
28
|
# Suggested Reading
|
data/lib/rio/tempdir.rb
CHANGED
|
@@ -1,132 +1,132 @@
|
|
|
1
|
-
=begin rdoc
|
|
2
|
-
|
|
3
|
-
== tempdir.rb - provides class Tempdir
|
|
4
|
-
|
|
5
|
-
=== Synopsis
|
|
6
|
-
In order to
|
|
7
|
-
|
|
8
|
-
1. create a temporary directory with a name starting with "hoge",
|
|
9
|
-
2. show the name of that directory, and
|
|
10
|
-
3. show its properties with the system "ls -dl" command:
|
|
11
|
-
|
|
12
|
-
require 'tempdir'
|
|
13
|
-
|
|
14
|
-
d = Tempdir.new("hoge")
|
|
15
|
-
p d.to_s
|
|
16
|
-
system("ls", "-dl", d.to_s)
|
|
17
|
-
|
|
18
|
-
After the run, the directory will appear to be removed. That is: if you
|
|
19
|
-
are not running inside it, which may provide you a means to create a
|
|
20
|
-
directory with a unique name that will be available after the run.
|
|
21
|
-
|
|
22
|
-
=== Description
|
|
23
|
-
<i>tempdir.rb</i> provides the Tempdir class, which is analogous to the
|
|
24
|
-
Tempfile class, but manipulates temporary directories. Derived from a
|
|
25
|
-
proposal of nobu.nokada@softhome.net. He added the class to
|
|
26
|
-
tempfile.rb, but since it does not seem to appear in cvs, I'll keep
|
|
27
|
-
it apart in tempdir.rb.
|
|
28
|
-
|
|
29
|
-
=end
|
|
30
|
-
|
|
31
|
-
require 'tmpdir'
|
|
32
|
-
|
|
33
|
-
module AutoRemoval
|
|
34
|
-
MAX_TRY = 10
|
|
35
|
-
@@cleanlist = []
|
|
36
|
-
|
|
37
|
-
private
|
|
38
|
-
|
|
39
|
-
def make_tmpname(basename, n)
|
|
40
|
-
sprintf('%s%d.%d', basename, $$, n)
|
|
41
|
-
end
|
|
42
|
-
private :make_tmpname
|
|
43
|
-
|
|
44
|
-
def createtmp(basename, tmpdir=Dir::tmpdir) # :nodoc:
|
|
45
|
-
if $SAFE > 0 and tmpdir.tainted?
|
|
46
|
-
tmpdir = '/tmp'
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
lock = nil
|
|
50
|
-
n = failure = 0
|
|
51
|
-
|
|
52
|
-
begin
|
|
53
|
-
Thread.critical = true
|
|
54
|
-
begin
|
|
55
|
-
tmpname = File.join(tmpdir, make_tmpname(basename, n))
|
|
56
|
-
n += 1
|
|
57
|
-
end until !@@cleanlist.include?(tmpname) and yield(tmpname)
|
|
58
|
-
rescue
|
|
59
|
-
p $!
|
|
60
|
-
failure += 1
|
|
61
|
-
retry if failure < MAX_TRY
|
|
62
|
-
raise "cannot generate tempfile `%s'" % tmpname
|
|
63
|
-
ensure
|
|
64
|
-
Thread.critical = false
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
tmpname
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def self.callback(path, clear) # :nodoc:
|
|
71
|
-
@@cleanlist << path
|
|
72
|
-
data = [path]
|
|
73
|
-
pid = $$
|
|
74
|
-
return Proc.new {
|
|
75
|
-
if pid == $$
|
|
76
|
-
path, tmpfile = *data
|
|
77
|
-
|
|
78
|
-
print "removing ", path, "..." if $DEBUG
|
|
79
|
-
|
|
80
|
-
tmpfile.close if tmpfile
|
|
81
|
-
|
|
82
|
-
# keep this order for thread safeness
|
|
83
|
-
if File.exist?(path)
|
|
84
|
-
clear.call(path)
|
|
85
|
-
end
|
|
86
|
-
@@cleanlist.delete(path)
|
|
87
|
-
|
|
88
|
-
print "done\n" if $DEBUG
|
|
89
|
-
end
|
|
90
|
-
}, data
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def self.unregister(path)
|
|
94
|
-
@@cleanlist.delete(path)
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
require 'pathname'
|
|
99
|
-
class Tempdir < Pathname
|
|
100
|
-
include AutoRemoval
|
|
101
|
-
|
|
102
|
-
def initialize(*args)
|
|
103
|
-
require 'fileutils'
|
|
104
|
-
|
|
105
|
-
tmpname = createtmp(*args) do |tmpname|
|
|
106
|
-
unless File.exist?(tmpname)
|
|
107
|
-
Dir.mkdir(tmpname, 0700)
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
super(tmpname)
|
|
112
|
-
@clean_proc, = AutoRemoval.callback(tmpname, FileUtils.method(:rm_rf))
|
|
113
|
-
ObjectSpace.define_finalizer(self, @clean_proc) end
|
|
114
|
-
|
|
115
|
-
def open(basename, *modes, &block)
|
|
116
|
-
File.open(self+basename, *modes, &block)
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
def clear
|
|
120
|
-
FileUtils.rm_rf(@tmpname)
|
|
121
|
-
@clean_proc.call
|
|
122
|
-
ObjectSpace.undefine_finalizer(self)
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
if __FILE__ == $0
|
|
127
|
-
# $DEBUG = true
|
|
128
|
-
d = Tempdir.new("hoge")
|
|
129
|
-
p d.to_s
|
|
130
|
-
system("ls", "-dl", d.to_s)
|
|
131
|
-
p d
|
|
132
|
-
end
|
|
1
|
+
=begin rdoc
|
|
2
|
+
|
|
3
|
+
== tempdir.rb - provides class Tempdir
|
|
4
|
+
|
|
5
|
+
=== Synopsis
|
|
6
|
+
In order to
|
|
7
|
+
|
|
8
|
+
1. create a temporary directory with a name starting with "hoge",
|
|
9
|
+
2. show the name of that directory, and
|
|
10
|
+
3. show its properties with the system "ls -dl" command:
|
|
11
|
+
|
|
12
|
+
require 'tempdir'
|
|
13
|
+
|
|
14
|
+
d = Tempdir.new("hoge")
|
|
15
|
+
p d.to_s
|
|
16
|
+
system("ls", "-dl", d.to_s)
|
|
17
|
+
|
|
18
|
+
After the run, the directory will appear to be removed. That is: if you
|
|
19
|
+
are not running inside it, which may provide you a means to create a
|
|
20
|
+
directory with a unique name that will be available after the run.
|
|
21
|
+
|
|
22
|
+
=== Description
|
|
23
|
+
<i>tempdir.rb</i> provides the Tempdir class, which is analogous to the
|
|
24
|
+
Tempfile class, but manipulates temporary directories. Derived from a
|
|
25
|
+
proposal of nobu.nokada@softhome.net. He added the class to
|
|
26
|
+
tempfile.rb, but since it does not seem to appear in cvs, I'll keep
|
|
27
|
+
it apart in tempdir.rb.
|
|
28
|
+
|
|
29
|
+
=end
|
|
30
|
+
|
|
31
|
+
require 'tmpdir'
|
|
32
|
+
|
|
33
|
+
module AutoRemoval
|
|
34
|
+
MAX_TRY = 10
|
|
35
|
+
@@cleanlist = []
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
def make_tmpname(basename, n)
|
|
40
|
+
sprintf('%s%d.%d', basename, $$, n)
|
|
41
|
+
end
|
|
42
|
+
private :make_tmpname
|
|
43
|
+
|
|
44
|
+
def createtmp(basename, tmpdir=Dir::tmpdir) # :nodoc:
|
|
45
|
+
if $SAFE > 0 and tmpdir.tainted?
|
|
46
|
+
tmpdir = '/tmp'
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
lock = nil
|
|
50
|
+
n = failure = 0
|
|
51
|
+
|
|
52
|
+
begin
|
|
53
|
+
Thread.critical = true
|
|
54
|
+
begin
|
|
55
|
+
tmpname = File.join(tmpdir, make_tmpname(basename, n))
|
|
56
|
+
n += 1
|
|
57
|
+
end until !@@cleanlist.include?(tmpname) and yield(tmpname)
|
|
58
|
+
rescue
|
|
59
|
+
p $!
|
|
60
|
+
failure += 1
|
|
61
|
+
retry if failure < MAX_TRY
|
|
62
|
+
raise "cannot generate tempfile `%s'" % tmpname
|
|
63
|
+
ensure
|
|
64
|
+
Thread.critical = false
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
tmpname
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def self.callback(path, clear) # :nodoc:
|
|
71
|
+
@@cleanlist << path
|
|
72
|
+
data = [path]
|
|
73
|
+
pid = $$
|
|
74
|
+
return Proc.new {
|
|
75
|
+
if pid == $$
|
|
76
|
+
path, tmpfile = *data
|
|
77
|
+
|
|
78
|
+
print "removing ", path, "..." if $DEBUG
|
|
79
|
+
|
|
80
|
+
tmpfile.close if tmpfile
|
|
81
|
+
|
|
82
|
+
# keep this order for thread safeness
|
|
83
|
+
if File.exist?(path)
|
|
84
|
+
clear.call(path)
|
|
85
|
+
end
|
|
86
|
+
@@cleanlist.delete(path)
|
|
87
|
+
|
|
88
|
+
print "done\n" if $DEBUG
|
|
89
|
+
end
|
|
90
|
+
}, data
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def self.unregister(path)
|
|
94
|
+
@@cleanlist.delete(path)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
require 'pathname'
|
|
99
|
+
class Tempdir < Pathname
|
|
100
|
+
include AutoRemoval
|
|
101
|
+
|
|
102
|
+
def initialize(*args)
|
|
103
|
+
require 'fileutils'
|
|
104
|
+
|
|
105
|
+
tmpname = createtmp(*args) do |tmpname|
|
|
106
|
+
unless File.exist?(tmpname)
|
|
107
|
+
Dir.mkdir(tmpname, 0700)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
super(tmpname)
|
|
112
|
+
@clean_proc, = AutoRemoval.callback(tmpname, FileUtils.method(:rm_rf))
|
|
113
|
+
ObjectSpace.define_finalizer(self, @clean_proc) end
|
|
114
|
+
|
|
115
|
+
def open(basename, *modes, &block)
|
|
116
|
+
File.open(self+basename, *modes, &block)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def clear
|
|
120
|
+
FileUtils.rm_rf(@tmpname)
|
|
121
|
+
@clean_proc.call
|
|
122
|
+
ObjectSpace.undefine_finalizer(self)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
if __FILE__ == $0
|
|
127
|
+
# $DEBUG = true
|
|
128
|
+
d = Tempdir.new("hoge")
|
|
129
|
+
p d.to_s
|
|
130
|
+
system("ls", "-dl", d.to_s)
|
|
131
|
+
p d
|
|
132
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
require 'rio/to_rio/object'
|
|
38
|
+
require 'rio/to_rio/string'
|
|
39
|
+
require 'rio/to_rio/array'
|
|
40
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
require 'rio/to_rio'
|
|
38
|
+
class Array
|
|
39
|
+
include RIO::ToRio::Array
|
|
40
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
+
require 'rio/to_rio'
|
|
38
|
+
|
|
39
|
+
class IO
|
|
40
|
+
include RIO::ToRio::IO
|
|
41
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
+
require 'rio/to_rio'
|
|
38
|
+
|
|
39
|
+
class Object
|
|
40
|
+
include RIO::ToRio::Object
|
|
41
|
+
end
|
|
42
|
+
require 'rio/to_rio/io'
|
|
43
|
+
require 'rio/to_rio/array'
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
+
require 'rio/to_rio'
|
|
38
|
+
|
|
39
|
+
class String
|
|
40
|
+
include RIO::ToRio::String
|
|
41
|
+
end
|
data/lib/rio/to_rio.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#--
|
|
2
2
|
# ===============================================================================
|
|
3
|
-
# Copyright (c) 2005, Christopher Kleckner
|
|
3
|
+
# Copyright (c) 2005, 2006 Christopher Kleckner
|
|
4
4
|
# All rights reserved
|
|
5
5
|
#
|
|
6
6
|
# This file is part of the Rio library for ruby.
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
#++
|
|
23
23
|
#
|
|
24
24
|
# To create the documentation for Rio run the command
|
|
25
|
-
#
|
|
25
|
+
# ruby build_doc.rb
|
|
26
26
|
# from the distribution directory. Then point your browser at the 'doc/rdoc' directory.
|
|
27
27
|
#
|
|
28
28
|
# Suggested Reading
|
|
@@ -37,6 +37,11 @@
|
|
|
37
37
|
|
|
38
38
|
module RIO
|
|
39
39
|
module ToRio #:nodoc: all
|
|
40
|
+
module IO
|
|
41
|
+
def to_rio()
|
|
42
|
+
rio(self)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
40
45
|
module Object
|
|
41
46
|
def to_rio()
|
|
42
47
|
rio(self.to_s)
|
|
@@ -49,9 +54,15 @@ module RIO
|
|
|
49
54
|
end
|
|
50
55
|
end
|
|
51
56
|
module Array
|
|
57
|
+
def /(arg)
|
|
58
|
+
rio(self) / arg
|
|
59
|
+
end
|
|
52
60
|
def to_rio()
|
|
53
61
|
rio(self)
|
|
54
62
|
end
|
|
63
|
+
def to_rios()
|
|
64
|
+
self.map { |path| rio(path) }
|
|
65
|
+
end
|
|
55
66
|
end
|
|
56
67
|
end
|
|
57
68
|
end
|
data/lib/rio/uri/file.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#--
|
|
2
2
|
# ===============================================================================
|
|
3
|
-
# Copyright (c) 2005, Christopher Kleckner
|
|
3
|
+
# Copyright (c) 2005, 2006 Christopher Kleckner
|
|
4
4
|
# All rights reserved
|
|
5
5
|
#
|
|
6
6
|
# This file is part of the Rio library for ruby.
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
#++
|
|
23
23
|
#
|
|
24
24
|
# To create the documentation for Rio run the command
|
|
25
|
-
#
|
|
25
|
+
# ruby build_doc.rb
|
|
26
26
|
# from the distribution directory. Then point your browser at the 'doc/rdoc' directory.
|
|
27
27
|
#
|
|
28
28
|
# Suggested Reading
|
data/lib/rio/util.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#--
|
|
2
2
|
# ===============================================================================
|
|
3
|
-
# Copyright (c) 2005, Christopher Kleckner
|
|
3
|
+
# Copyright (c) 2005, 2006 Christopher Kleckner
|
|
4
4
|
# All rights reserved
|
|
5
5
|
#
|
|
6
6
|
# This file is part of the Rio library for ruby.
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
#++
|
|
23
23
|
#
|
|
24
24
|
# To create the documentation for Rio run the command
|
|
25
|
-
#
|
|
25
|
+
# ruby build_doc.rb
|
|
26
26
|
# from the distribution directory. Then point your browser at the 'doc/rdoc' directory.
|
|
27
27
|
#
|
|
28
28
|
# Suggested Reading
|