wishdev-rio 0.4.3.1
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/COPYING +341 -0
- data/README +81 -0
- data/Rakefile +281 -0
- data/build_doc.rb +94 -0
- data/doc/ANNOUNCE +159 -0
- data/doc/RELEASE_NOTES +308 -0
- data/doc/RIOIS +215 -0
- data/doc/generators/template/html/rio.css +428 -0
- data/doc/generators/template/html/rio.rb +523 -0
- data/doc/generators/template/html/ugly.rb +132 -0
- data/doc/pkg_def.rb +60 -0
- data/doc/rfc1738.txt +1403 -0
- data/doc/rfc959.txt +3933 -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/abstract_method.rb +56 -0
- data/lib/rio/argv.rb +56 -0
- data/lib/rio/arycopy.rb +43 -0
- data/lib/rio/assert.rb +114 -0
- data/lib/rio/base.rb +56 -0
- data/lib/rio/callstr.rb +46 -0
- data/lib/rio/const.rb +51 -0
- data/lib/rio/construct.rb +50 -0
- data/lib/rio/constructor.rb +258 -0
- data/lib/rio/context/autoclose.rb +72 -0
- data/lib/rio/context/copying.rb +55 -0
- data/lib/rio/context/cxx.rb +66 -0
- data/lib/rio/context/dir.rb +120 -0
- data/lib/rio/context/gzip.rb +50 -0
- data/lib/rio/context/methods.rb +182 -0
- data/lib/rio/context/skip.rb +66 -0
- data/lib/rio/context/stream.rb +229 -0
- data/lib/rio/context.rb +117 -0
- data/lib/rio/cp.rb +370 -0
- data/lib/rio/def.rb +53 -0
- data/lib/rio/dir.rb +144 -0
- data/lib/rio/doc/EXAMPLES.rb +299 -0
- data/lib/rio/doc/HOWTO.rb +737 -0
- data/lib/rio/doc/INDEX.rb +311 -0
- data/lib/rio/doc/INTRO.rb +1068 -0
- data/lib/rio/doc/OPTIONAL.rb +130 -0
- data/lib/rio/doc/SYNOPSIS.rb +183 -0
- data/lib/rio/doc.rb +45 -0
- data/lib/rio/entrysel.rb +246 -0
- data/lib/rio/exception/copy.rb +97 -0
- data/lib/rio/exception/notimplemented.rb +57 -0
- data/lib/rio/exception/notsupported.rb +46 -0
- data/lib/rio/exception/open.rb +61 -0
- data/lib/rio/exception/state.rb +73 -0
- data/lib/rio/exception.rb +41 -0
- data/lib/rio/ext/csv.rb +351 -0
- 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/doc.rb +133 -0
- data/lib/rio/ext/yaml/tie.rb +149 -0
- data/lib/rio/ext/yaml.rb +164 -0
- 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/ext/zipfile.rb +110 -0
- data/lib/rio/ext.rb +138 -0
- data/lib/rio/factory.rb +436 -0
- data/lib/rio/file.rb +118 -0
- data/lib/rio/filter/closeoneof.rb +103 -0
- data/lib/rio/filter/gzip.rb +70 -0
- data/lib/rio/filter.rb +94 -0
- data/lib/rio/fs/base.rb +41 -0
- data/lib/rio/fs/impl.rb +122 -0
- data/lib/rio/fs/native.rb +75 -0
- data/lib/rio/fs/stream.rb +61 -0
- data/lib/rio/fs/url.rb +63 -0
- data/lib/rio/ftp/conncache.rb +101 -0
- data/lib/rio/ftp/dir.rb +94 -0
- data/lib/rio/ftp/fs.rb +180 -0
- data/lib/rio/ftp/ftpfile.rb +20 -0
- data/lib/rio/grande.rb +97 -0
- data/lib/rio/handle.rb +100 -0
- data/lib/rio/if/basic.rb +64 -0
- data/lib/rio/if/csv.rb +76 -0
- data/lib/rio/if/dir.rb +157 -0
- data/lib/rio/if/file.rb +89 -0
- data/lib/rio/if/fileordir.rb +268 -0
- data/lib/rio/if/grande.rb +729 -0
- data/lib/rio/if/grande_entry.rb +379 -0
- data/lib/rio/if/grande_stream.rb +693 -0
- data/lib/rio/if/internal.rb +125 -0
- data/lib/rio/if/path.rb +462 -0
- data/lib/rio/if/rubyio.rb +681 -0
- data/lib/rio/if/string.rb +83 -0
- data/lib/rio/if/temp.rb +45 -0
- data/lib/rio/if/test.rb +282 -0
- data/lib/rio/if/yaml.rb +206 -0
- data/lib/rio/if.rb +64 -0
- data/lib/rio/ioh.rb +162 -0
- data/lib/rio/iomode.rb +109 -0
- data/lib/rio/ios/fail.rb +106 -0
- data/lib/rio/ios/generic.rb +119 -0
- data/lib/rio/ios/mode.rb +60 -0
- data/lib/rio/ios/null.rb +119 -0
- data/lib/rio/iowrap.rb +128 -0
- data/lib/rio/kernel.rb +54 -0
- data/lib/rio/local.rb +62 -0
- data/lib/rio/match.rb +53 -0
- data/lib/rio/matchrecord.rb +283 -0
- data/lib/rio/no_warn.rb +49 -0
- data/lib/rio/nullio.rb +159 -0
- data/lib/rio/open3.rb +68 -0
- data/lib/rio/ops/construct.rb +61 -0
- data/lib/rio/ops/create.rb +77 -0
- data/lib/rio/ops/dir.rb +346 -0
- data/lib/rio/ops/either.rb +134 -0
- data/lib/rio/ops/file.rb +102 -0
- data/lib/rio/ops/path.rb +296 -0
- data/lib/rio/ops/stream/input.rb +267 -0
- data/lib/rio/ops/stream/output.rb +100 -0
- data/lib/rio/ops/stream/read.rb +86 -0
- data/lib/rio/ops/stream/write.rb +57 -0
- data/lib/rio/ops/stream.rb +87 -0
- data/lib/rio/ops/symlink.rb +80 -0
- data/lib/rio/path/reset.rb +69 -0
- data/lib/rio/path.rb +129 -0
- data/lib/rio/piper/cp.rb +80 -0
- data/lib/rio/piper.rb +122 -0
- data/lib/rio/prompt.rb +66 -0
- data/lib/rio/rectype.rb +88 -0
- data/lib/rio/rl/base.rb +118 -0
- data/lib/rio/rl/builder.rb +117 -0
- data/lib/rio/rl/chmap.rb +66 -0
- data/lib/rio/rl/fs2url.rb +82 -0
- data/lib/rio/rl/ioi.rb +78 -0
- data/lib/rio/rl/path.rb +110 -0
- data/lib/rio/rl/pathmethods.rb +116 -0
- data/lib/rio/rl/uri.rb +200 -0
- data/lib/rio/rl/withpath.rb +296 -0
- data/lib/rio/scheme/aryio.rb +88 -0
- data/lib/rio/scheme/cmdio.rb +80 -0
- data/lib/rio/scheme/cmdpipe.rb +118 -0
- data/lib/rio/scheme/fd.rb +65 -0
- data/lib/rio/scheme/ftp.rb +141 -0
- data/lib/rio/scheme/http.rb +78 -0
- data/lib/rio/scheme/null.rb +55 -0
- data/lib/rio/scheme/path.rb +98 -0
- data/lib/rio/scheme/stderr.rb +55 -0
- data/lib/rio/scheme/stdio.rb +71 -0
- data/lib/rio/scheme/strio.rb +87 -0
- data/lib/rio/scheme/sysio.rb +63 -0
- data/lib/rio/scheme/tcp.rb +75 -0
- data/lib/rio/scheme/temp.rb +200 -0
- data/lib/rio/state/error.rb +72 -0
- data/lib/rio/state.rb +242 -0
- data/lib/rio/stream/base.rb +54 -0
- data/lib/rio/stream/duplex.rb +79 -0
- data/lib/rio/stream/open.rb +202 -0
- data/lib/rio/stream.rb +181 -0
- data/lib/rio/symantics.rb +45 -0
- data/lib/rio/tempdir.rb +132 -0
- data/lib/rio/to_rio/all.rb +39 -0
- data/lib/rio/to_rio/array.rb +39 -0
- data/lib/rio/to_rio/io.rb +40 -0
- data/lib/rio/to_rio/object.rb +42 -0
- data/lib/rio/to_rio/string.rb +40 -0
- data/lib/rio/to_rio.rb +67 -0
- data/lib/rio/uri/file.rb +198 -0
- data/lib/rio/util.rb +48 -0
- data/lib/rio/version.rb +51 -0
- data/lib/rio.rb +162 -0
- data/setup.rb +1360 -0
- 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_copy_data.rb +36 -0
- data/test/ftp/anon_misc.rb +124 -0
- data/test/ftp/anon_read.rb +105 -0
- data/test/ftp/anon_special.rb +68 -0
- data/test/ftp/anon_write.rb +70 -0
- data/test/ftp/ftp2ftp.rb +51 -0
- data/test/ftp/initftpfiles.rb +14 -0
- data/test/ftp/testdef.rb +55 -0
- data/test/gem_runtests.rb +15 -0
- data/test/http/all.rb +4 -0
- data/test/http/copy-from-http.rb +141 -0
- data/test/http/uri-meta.rb +72 -0
- data/test/lib/temp_server.rb +46 -0
- data/test/runalltests.rb +17 -0
- data/test/runftptests.rb +14 -0
- data/test/runhttp.rb +11 -0
- data/test/runhttptests.rb +14 -0
- data/test/runtests.rb +52 -0
- data/test/tc/abs.rb +355 -0
- data/test/tc/all.rb +80 -0
- data/test/tc/base.rb +31 -0
- data/test/tc/base2.rb +87 -0
- data/test/tc/cd1.rb +113 -0
- data/test/tc/clearsel.rb +68 -0
- data/test/tc/clone.rb +208 -0
- data/test/tc/closeoncopy.rb +102 -0
- data/test/tc/closeoneof.rb +194 -0
- data/test/tc/cmdpipe.rb +149 -0
- data/test/tc/copy-dir-samevar.rb +91 -0
- data/test/tc/copy-from.rb +129 -0
- data/test/tc/copy-to.rb +91 -0
- data/test/tc/copy.rb +74 -0
- data/test/tc/copyarray.rb +188 -0
- data/test/tc/copydest.rb +50 -0
- data/test/tc/copydir.rb +166 -0
- data/test/tc/copydirlines.rb +121 -0
- data/test/tc/copylines.rb +46 -0
- data/test/tc/copynonex.rb +118 -0
- data/test/tc/copysymlink.rb +39 -0
- data/test/tc/create.rb +114 -0
- data/test/tc/csv.rb +226 -0
- data/test/tc/csv2.rb +138 -0
- data/test/tc/csv_columns.rb +37 -0
- data/test/tc/csvutil.rb +56 -0
- data/test/tc/dir.rb +76 -0
- data/test/tc/dir_iter.rb +383 -0
- data/test/tc/dirautoclose.rb +67 -0
- data/test/tc/dirent.rb +178 -0
- data/test/tc/dirss.rb +81 -0
- data/test/tc/each.rb +111 -0
- data/test/tc/each_break.rb +243 -0
- data/test/tc/edf.rb +81 -0
- data/test/tc/empty.rb +51 -0
- data/test/tc/emptyriodir.rb +129 -0
- data/test/tc/entary.rb +227 -0
- data/test/tc/entsel.rb +110 -0
- data/test/tc/eq.rb +101 -0
- data/test/tc/expand_path.rb +69 -0
- data/test/tc/ext.rb +136 -0
- data/test/tc/fileno.rb +94 -0
- data/test/tc/files_select.rb +92 -0
- data/test/tc/get.rb +152 -0
- data/test/tc/getrec.rb +137 -0
- data/test/tc/gzip.rb +109 -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 +116 -0
- data/test/tc/line_record_row.rb +51 -0
- data/test/tc/lineno.rb +196 -0
- data/test/tc/lines.rb +66 -0
- data/test/tc/misc.rb +432 -0
- data/test/tc/nolines.rb +204 -0
- data/test/tc/noqae.rb +879 -0
- data/test/tc/null.rb +45 -0
- data/test/tc/once.rb +6 -0
- data/test/tc/overload.rb +140 -0
- data/test/tc/pa.rb +158 -0
- data/test/tc/path_parts.rb +175 -0
- data/test/tc/pathop.rb +60 -0
- data/test/tc/paths.rb +145 -0
- data/test/tc/pid.rb +31 -0
- data/test/tc/piper.rb +143 -0
- data/test/tc/programs_util.rb +24 -0
- data/test/tc/qae.rb +493 -0
- data/test/tc/qae_riovar.rb +499 -0
- data/test/tc/readline.rb +30 -0
- data/test/tc/records.rb +68 -0
- data/test/tc/rename.rb +233 -0
- data/test/tc/rename_assign.rb +45 -0
- data/test/tc/riorl.rb +181 -0
- data/test/tc/route.rb +51 -0
- data/test/tc/selnosel.rb +33 -0
- data/test/tc/skip.rb +89 -0
- data/test/tc/skiplines.rb +71 -0
- data/test/tc/split.rb +28 -0
- data/test/tc/splitlines.rb +65 -0
- data/test/tc/splitpath.rb +83 -0
- data/test/tc/sub.rb +46 -0
- data/test/tc/symlink.rb +176 -0
- data/test/tc/symlink0.rb +348 -0
- data/test/tc/symlink1.rb +114 -0
- data/test/tc/synopsis.rb +75 -0
- data/test/tc/temp.rb +152 -0
- data/test/tc/tempdir.rb +60 -0
- data/test/tc/tempfile.rb +66 -0
- data/test/tc/testcase.rb +170 -0
- data/test/tc/tonl.rb +37 -0
- data/test/tc/truncate.rb +39 -0
- data/test/tc/yaml.rb +275 -0
- metadata +387 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# ===============================================================================
|
|
3
|
+
# Copyright (c) 2005,2006,2007 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.
|
|
27
|
+
#
|
|
28
|
+
# Suggested Reading
|
|
29
|
+
# * RIO::Doc::SYNOPSIS
|
|
30
|
+
# * RIO::Doc::INTRO
|
|
31
|
+
# * RIO::Doc::HOWTO
|
|
32
|
+
# * RIO::Doc::EXAMPLES
|
|
33
|
+
# * RIO::Rio
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
module RIO
|
|
38
|
+
module Doc #:doc:
|
|
39
|
+
=begin rdoc
|
|
40
|
+
|
|
41
|
+
= Rio - Ruby I/O Facilitator
|
|
42
|
+
|
|
43
|
+
Rio is a facade for most of the standard ruby classes that deal with I/O;
|
|
44
|
+
providing a simple, intuitive, succinct interface to the functionality
|
|
45
|
+
provided by IO, File, Dir, Pathname, FileUtils, Tempfile, StringIO, OpenURI
|
|
46
|
+
and others. Rio also provides an application level interface which allows many
|
|
47
|
+
common I/O idioms to be expressed succinctly.
|
|
48
|
+
|
|
49
|
+
Please read the following first:
|
|
50
|
+
* RIO::Doc::INTRO
|
|
51
|
+
* RIO::Doc::SYNOPSIS
|
|
52
|
+
* RIO::Doc::HOWTO
|
|
53
|
+
* RIO::Rio
|
|
54
|
+
|
|
55
|
+
= Rio Optional Components
|
|
56
|
+
|
|
57
|
+
This document describes various optional Rio components, that must be
|
|
58
|
+
explicitly 'required' to be available. These are not included in
|
|
59
|
+
rio.rb either because they change classes that should not be changed
|
|
60
|
+
without the developers explicit permission, or because they are not of
|
|
61
|
+
general enough interest.
|
|
62
|
+
|
|
63
|
+
== to_rio
|
|
64
|
+
|
|
65
|
+
This option comprises 4 options
|
|
66
|
+
* Object#to_rio
|
|
67
|
+
|
|
68
|
+
require 'rio/to_rio/object'
|
|
69
|
+
ario = any_object.to_rio
|
|
70
|
+
|
|
71
|
+
This option adds a to_rio method to the Object class which calls the
|
|
72
|
+
object's #to_s method and passes it to the Rio constructor. Like:
|
|
73
|
+
|
|
74
|
+
ario = rio(any_object.to_s)
|
|
75
|
+
|
|
76
|
+
* String#to_rio and String#/
|
|
77
|
+
|
|
78
|
+
require 'rio/to_rio/string'
|
|
79
|
+
ario = "a/file/represented/as/a/string".to_rio
|
|
80
|
+
ario = 'strings'/'used'/'with'/'subdirectory'/'operator'
|
|
81
|
+
|
|
82
|
+
This option adds a to_rio method and the subdirectory operator '/'
|
|
83
|
+
to the String class. Note that due to operator precedance one must
|
|
84
|
+
use parenthesis when calling a method directly on a Rio created
|
|
85
|
+
using the subdirectory operator with Strings
|
|
86
|
+
|
|
87
|
+
array_of_first_ten_lines = ('adir'/'asubdir'/'afile').lines[0...10]
|
|
88
|
+
|
|
89
|
+
* Array#to_rio
|
|
90
|
+
|
|
91
|
+
require 'rio/to_rio/array'
|
|
92
|
+
ario = %w[an array of path components].to_rio #=> rio('an/array/of/path/components')
|
|
93
|
+
|
|
94
|
+
This option adds a to_rio method to the Array class. This behaves as
|
|
95
|
+
if
|
|
96
|
+
rio(%w[an array of path components]) had been called.
|
|
97
|
+
|
|
98
|
+
* require 'rio/to_rio/all' will make all of the above available.
|
|
99
|
+
|
|
100
|
+
== RIO.ARGV
|
|
101
|
+
|
|
102
|
+
require 'rio/argv'
|
|
103
|
+
arguments_as_rios = RIO.ARGV
|
|
104
|
+
|
|
105
|
+
This option provides a function which converts each element of ruby's
|
|
106
|
+
ARGV into a Rio. Useful when writing a program which takes a list of
|
|
107
|
+
files as its arguments
|
|
108
|
+
|
|
109
|
+
== RIO.popen3
|
|
110
|
+
|
|
111
|
+
require 'rio/open3'
|
|
112
|
+
input,output,errput = RIO.popen3
|
|
113
|
+
RIO.popen3 { |input,output,errput| ... }
|
|
114
|
+
|
|
115
|
+
This options provides a wrapper around the Open3#popen3 call with the
|
|
116
|
+
IO objects converted to Rios
|
|
117
|
+
|
|
118
|
+
== RIO.prompt
|
|
119
|
+
|
|
120
|
+
require 'rio/prompt'
|
|
121
|
+
the_anwser = RIO.prompt('What is the answer? ')
|
|
122
|
+
|
|
123
|
+
This option provides a module function to prompt for input.
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
=end
|
|
127
|
+
module OPTIONAL
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# ===============================================================================
|
|
3
|
+
# Copyright (c) 2005,2006,2007 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.
|
|
27
|
+
#
|
|
28
|
+
# Suggested Reading
|
|
29
|
+
# * RIO::Doc::SYNOPSIS
|
|
30
|
+
# * RIO::Doc::INTRO
|
|
31
|
+
# * RIO::Doc::HOWTO
|
|
32
|
+
# * RIO::Doc::EXAMPLES
|
|
33
|
+
# * RIO::Rio
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# :title: Rio
|
|
38
|
+
|
|
39
|
+
module RIO
|
|
40
|
+
# Copyright (c) 2005,2006,2007 Christopher Kleckner.
|
|
41
|
+
# All rights reserved
|
|
42
|
+
#
|
|
43
|
+
# This file is part of the Rio library for ruby.
|
|
44
|
+
# Rio is free software; you can redistribute it and/or modify it under the terms of
|
|
45
|
+
# the {GNU General Public License}[http://www.gnu.org/licenses/gpl.html] as published by
|
|
46
|
+
# the Free Software Foundation; either version 2 of the License, or
|
|
47
|
+
# (at your option) any later version.
|
|
48
|
+
#
|
|
49
|
+
module Doc #:doc:
|
|
50
|
+
=begin rdoc
|
|
51
|
+
|
|
52
|
+
= Rio - Ruby I/O Facilitator
|
|
53
|
+
|
|
54
|
+
fa-cil-i-tate: To make easy or easier.
|
|
55
|
+
|
|
56
|
+
Rio is a facade for most of the standard ruby classes that deal with I/O;
|
|
57
|
+
providing a simple, intuitive, succinct interface to the functionality
|
|
58
|
+
provided by IO, File, Dir, Pathname, FileUtils, Tempfile, StringIO, OpenURI
|
|
59
|
+
and others. Rio also provides an application level interface which allows many
|
|
60
|
+
common I/O idioms to be expressed succinctly.
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
== SYNOPSIS
|
|
64
|
+
|
|
65
|
+
For the following assume:
|
|
66
|
+
astring = ""
|
|
67
|
+
anarray = []
|
|
68
|
+
|
|
69
|
+
Iterate over the .rb files in a directory.
|
|
70
|
+
rio('adir').files('*.rb') { |entrio| ... }
|
|
71
|
+
|
|
72
|
+
Return an array of the .rb files in a directory.
|
|
73
|
+
rio('adir').files['*.rb']
|
|
74
|
+
|
|
75
|
+
Copy the .rb files in a directory.to another directory.
|
|
76
|
+
rio('adir').files('*.rb') > rio('another_directory')
|
|
77
|
+
|
|
78
|
+
Iterate over the .rb files in a directory and its subdirectories.
|
|
79
|
+
rio('adir').all.files('*.rb') { |entrio| ... }
|
|
80
|
+
|
|
81
|
+
Return an array of the .rb files in a directory and its subdirectories.
|
|
82
|
+
rio('adir').all.files['*.rb']
|
|
83
|
+
|
|
84
|
+
Copy or append a file to a string
|
|
85
|
+
rio('afile') > astring # copy
|
|
86
|
+
rio('afile') >> astring # append
|
|
87
|
+
|
|
88
|
+
Copy or append a string to a file
|
|
89
|
+
rio('afile') < astring # copy
|
|
90
|
+
rio('afile') << astring # append
|
|
91
|
+
|
|
92
|
+
Copy or append the lines of a file to an array
|
|
93
|
+
rio('afile') > anarray
|
|
94
|
+
rio('afile') >> anarray
|
|
95
|
+
|
|
96
|
+
Copy or append a file to another file
|
|
97
|
+
rio('afile') > rio('another_file')
|
|
98
|
+
rio('afile') >> rio('another_file')
|
|
99
|
+
|
|
100
|
+
Copy a file to a directory
|
|
101
|
+
rio('adir') << rio('afile')
|
|
102
|
+
|
|
103
|
+
Copy a directory to another directory
|
|
104
|
+
rio('adir') >> rio('another_directory')
|
|
105
|
+
|
|
106
|
+
Copy a web-page to a file
|
|
107
|
+
rio('http://rubydoc.org/') > rio('afile')
|
|
108
|
+
|
|
109
|
+
Read a web-page into a string
|
|
110
|
+
astring = rio('http://rubydoc.org/').read
|
|
111
|
+
|
|
112
|
+
Ways to get the chomped lines of a file into an array
|
|
113
|
+
anarray = rio('afile').chomp[] # subscript operator
|
|
114
|
+
rio('afile').chomp > anarray # copy-to operator
|
|
115
|
+
anarray = rio('afile').chomp.to_a # to_a
|
|
116
|
+
anarray = rio('afile').chomp.readlines # IO#readlines
|
|
117
|
+
|
|
118
|
+
Iterate over selected lines of a file
|
|
119
|
+
rio('adir').lines(0..3) { |aline| ... } # a range of lines
|
|
120
|
+
rio('adir').lines(/re/) { |aline| ... } # by regular expression
|
|
121
|
+
rio('adir').lines(0..3,/re/) { |aline| ... } # or both
|
|
122
|
+
|
|
123
|
+
Return selected lines of a file as an array
|
|
124
|
+
rio('adir').lines[0..3] # a range of lines
|
|
125
|
+
rio('adir').lines[/re/] # by regular expression
|
|
126
|
+
rio('adir').lines[0..3,/re/] # or both
|
|
127
|
+
|
|
128
|
+
Iterate over selected chomped lines of a file
|
|
129
|
+
rio('adir').chomp.lines(0..3) { |aline| ... } # a range of lines
|
|
130
|
+
rio('adir').chomp.lines(/re/) { |aline| ... } # by regular expression
|
|
131
|
+
|
|
132
|
+
Return selected chomped lines of a file as an array
|
|
133
|
+
rio('adir').chomp[0..3] # a range of lines
|
|
134
|
+
rio('adir').chomp[/re/] # by regular expression
|
|
135
|
+
|
|
136
|
+
Copy a gzipped file un-gzipping it
|
|
137
|
+
rio('afile.gz').gzip > rio('afile')
|
|
138
|
+
|
|
139
|
+
Copy a plain file, gzipping it
|
|
140
|
+
rio('afile.gz').gzip < rio('afile')
|
|
141
|
+
|
|
142
|
+
Copy a file from a ftp server into a local file un-gzipping it
|
|
143
|
+
rio('ftp://host/afile.gz').gzip > rio('afile')
|
|
144
|
+
|
|
145
|
+
Return an array of .rb files excluding symlinks to .rb files
|
|
146
|
+
rio('adir').files('*.rb').skip[:symlink?]
|
|
147
|
+
|
|
148
|
+
Put the first 10 chomped lines of a gzipped file into an array
|
|
149
|
+
anarray = rio('afile.gz').chomp.gzip[0...10]
|
|
150
|
+
|
|
151
|
+
Copy lines 0 and 3 thru 5 of a gzipped file on an ftp server to stdout
|
|
152
|
+
rio('ftp://host/afile.gz').gzip.lines(0,3..5) > ?-
|
|
153
|
+
|
|
154
|
+
Return an array of files in a directory and its subdirectories, without descending into .svn directories.
|
|
155
|
+
rio('adir').norecurse(/^\.svn$/).files[]
|
|
156
|
+
|
|
157
|
+
Iterate over the non-empty, non-comment chomped lines of a file
|
|
158
|
+
rio('afile').chomp.skip(:empty?,/^\s*#/) { |line| ... }
|
|
159
|
+
|
|
160
|
+
Copy the output of th ps command into an array, skipping the header line and the ps command entry
|
|
161
|
+
rio(?-,'ps -a').skiplines(0,/ps$/) > anarray
|
|
162
|
+
|
|
163
|
+
Prompt for input and return what was typed
|
|
164
|
+
ans = rio(?-).print("Type Something: ").chomp.gets
|
|
165
|
+
|
|
166
|
+
Change the extension of all .htm files in a directory and its subdirectories to .html
|
|
167
|
+
rio('adir').rename.all.files('*.htm') do |htmfile|
|
|
168
|
+
htmfile.extname = '.html'
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
=== SUGGESTED READING
|
|
172
|
+
|
|
173
|
+
* RIO::Doc::INTRO
|
|
174
|
+
* RIO::Doc::HOWTO
|
|
175
|
+
* RIO::Rio
|
|
176
|
+
* RIO::Doc::EXAMPLES
|
|
177
|
+
* RIO::Doc::OPTIONAL
|
|
178
|
+
|
|
179
|
+
=end
|
|
180
|
+
module SYNOPSIS #:doc:
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
end
|
data/lib/rio/doc.rb
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# ===============================================================================
|
|
3
|
+
# Copyright (c) 2005,2006,2007 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.
|
|
27
|
+
#
|
|
28
|
+
# Suggested Reading
|
|
29
|
+
# * RIO::Doc::SYNOPSIS
|
|
30
|
+
# * RIO::Doc::INTRO
|
|
31
|
+
# * RIO::Doc::HOWTO
|
|
32
|
+
# * RIO::Doc::EXAMPLES
|
|
33
|
+
# * RIO::Rio
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
require 'rio'
|
|
38
|
+
module RIO
|
|
39
|
+
TITLE = "Rio"
|
|
40
|
+
SUMMARY = "Rio - Ruby I/O Facilitator"
|
|
41
|
+
DESCRIPTION = "Rio is a Ruby class wrapping much of the functionality of " +
|
|
42
|
+
"IO, File, Dir, Pathname, FileUtils, Tempfile, StringIO, " +
|
|
43
|
+
"OpenURI, Zlib, and CSV."
|
|
44
|
+
|
|
45
|
+
end
|
data/lib/rio/entrysel.rb
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# ===============================================================================
|
|
3
|
+
# Copyright (c) 2005,2006,2007 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.
|
|
27
|
+
#
|
|
28
|
+
# Suggested Reading
|
|
29
|
+
# * RIO::Doc::SYNOPSIS
|
|
30
|
+
# * RIO::Doc::INTRO
|
|
31
|
+
# * RIO::Doc::HOWTO
|
|
32
|
+
# * RIO::Doc::EXAMPLES
|
|
33
|
+
# * RIO::Rio
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
require 'rio/abstract_method'
|
|
38
|
+
class ::Object #:nodoc: all
|
|
39
|
+
def true?() true end
|
|
40
|
+
def false?() false end
|
|
41
|
+
end
|
|
42
|
+
# 2314
|
|
43
|
+
module RIO
|
|
44
|
+
module Match #:nodoc: all
|
|
45
|
+
module Entry
|
|
46
|
+
class Base
|
|
47
|
+
attr_reader :match_to
|
|
48
|
+
def initialize(match_to)
|
|
49
|
+
@match_to = match_to
|
|
50
|
+
end
|
|
51
|
+
def inspect()
|
|
52
|
+
@match_to.to_s
|
|
53
|
+
end
|
|
54
|
+
def ===(el) self =~ el end
|
|
55
|
+
abstract_method :=~
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
class Depth < Base
|
|
59
|
+
def =~(entry)
|
|
60
|
+
@match_to === entry.rl.pathdepth
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
class Any < Base
|
|
64
|
+
def =~(entry) true end
|
|
65
|
+
end
|
|
66
|
+
class None < Base
|
|
67
|
+
def =~(entry) false end
|
|
68
|
+
end
|
|
69
|
+
class Glob < Base
|
|
70
|
+
def =~(entry)
|
|
71
|
+
::File.fnmatch?(@match_to,entry.filename.to_s)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
class Regexp < Base
|
|
75
|
+
def =~(entry)
|
|
76
|
+
@match_to =~ entry.filename.to_s
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
class PathGlob < Base
|
|
80
|
+
def =~(entry)
|
|
81
|
+
::File.fnmatch?(@match_to,entry.to_s)
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
class PathRegexp < Base
|
|
85
|
+
def =~(entry)
|
|
86
|
+
@match_to =~ entry.to_s
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
class Proc < Base
|
|
90
|
+
def =~(entry) @match_to[entry.clone] end
|
|
91
|
+
end
|
|
92
|
+
class Symbol < Base
|
|
93
|
+
def =~(entry) entry.__send__(@match_to) end
|
|
94
|
+
end
|
|
95
|
+
class And < Base
|
|
96
|
+
def initialize(matches)
|
|
97
|
+
super(matches.flatten.map { |arg| Match::Entry.create(arg) })
|
|
98
|
+
end
|
|
99
|
+
def =~(el)
|
|
100
|
+
(@match_to.empty? or @match_to.all? { |sel| sel =~ el })
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
def create(arg)
|
|
104
|
+
case arg
|
|
105
|
+
when ::Fixnum then Depth.new(arg)
|
|
106
|
+
when ::Range then Depth.new(arg)
|
|
107
|
+
when ::String then Glob.new(arg)
|
|
108
|
+
when ::Regexp then Regexp.new(arg)
|
|
109
|
+
when ::Proc then Proc.new(arg)
|
|
110
|
+
when ::Symbol then Symbol.new(arg)
|
|
111
|
+
when ::TrueClass then Any.new(arg)
|
|
112
|
+
when ::FalseClass then None.new(arg)
|
|
113
|
+
when ::Array then And.new(arg)
|
|
114
|
+
else raise ArgumentError,"a String,Regexp,Proc or Symbol is required (#{arg})"
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
module_function :create
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
module RIO
|
|
122
|
+
module Match
|
|
123
|
+
module Entry
|
|
124
|
+
class List
|
|
125
|
+
attr_reader :sym
|
|
126
|
+
attr_accessor :list
|
|
127
|
+
def initialize(sym,*args)
|
|
128
|
+
@sym = sym
|
|
129
|
+
@list = args.map { |arg| Match::Entry.create(arg) }
|
|
130
|
+
end
|
|
131
|
+
def inspect()
|
|
132
|
+
@sym.to_s+"("+@list.inspect+")"
|
|
133
|
+
end
|
|
134
|
+
def <<(el)
|
|
135
|
+
@list << el
|
|
136
|
+
end
|
|
137
|
+
def ===(me_list)
|
|
138
|
+
@sym == me_list.sym
|
|
139
|
+
end
|
|
140
|
+
def =~(el)
|
|
141
|
+
el.__send__(@sym) and (@list.empty? or @list.detect { |sel| sel =~ el })
|
|
142
|
+
end
|
|
143
|
+
extend Forwardable
|
|
144
|
+
def_instance_delegators(:@list,:each)
|
|
145
|
+
def callstr(func,*args)
|
|
146
|
+
self.class.to_s+'['+self.to_s+']'+'.'+func.to_s+'('+args.join(',')+')'
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
class Sels < Array
|
|
150
|
+
def <<(entry_list)
|
|
151
|
+
same_sym = self.grep(entry_list)
|
|
152
|
+
if same_sym.empty?
|
|
153
|
+
super
|
|
154
|
+
else
|
|
155
|
+
same_sym[0].list = entry_list.list
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
def callstr(func,*args)
|
|
159
|
+
self.class.to_s+'['+self.to_s+']'+'.'+func.to_s+'('+args.join(',')+')'
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
class Selector
|
|
163
|
+
attr_reader :sel,:nosel
|
|
164
|
+
def initialize(entry_sel)
|
|
165
|
+
@entry_sel = entry_sel
|
|
166
|
+
@sel = @nosel = nil
|
|
167
|
+
process_entry_sel() if @entry_sel
|
|
168
|
+
end
|
|
169
|
+
def entry_sel_args()
|
|
170
|
+
@entry_sel['args']
|
|
171
|
+
end
|
|
172
|
+
def something_selected?
|
|
173
|
+
%w[entries files dirs].any? { |k| entry_sel_args.has_key?(k) }
|
|
174
|
+
end
|
|
175
|
+
def something_skipped?
|
|
176
|
+
%w[skipentries skipfiles skipdirs].any? { |k| entry_sel_args.has_key?(k) }
|
|
177
|
+
end
|
|
178
|
+
def skip_type(skip_args)
|
|
179
|
+
|
|
180
|
+
end
|
|
181
|
+
def process_entry_sel()
|
|
182
|
+
sel_args = self.entry_sel_args
|
|
183
|
+
raise RuntimeError, "Internal error: entry_sel_args not set" unless sel_args
|
|
184
|
+
if something_selected?
|
|
185
|
+
@sel = Match::Entry::Sels.new
|
|
186
|
+
@sel << Match::Entry::List.new(:true?,*sel_args['entries']) if sel_args.has_key?('entries')
|
|
187
|
+
@sel << Match::Entry::List.new(:file?,*sel_args['files']) if sel_args.has_key?('files')
|
|
188
|
+
@sel << Match::Entry::List.new(:dir?,*sel_args['dirs']) if sel_args.has_key?('dirs')
|
|
189
|
+
end
|
|
190
|
+
if something_skipped?
|
|
191
|
+
@nosel = Match::Entry::Sels.new
|
|
192
|
+
if sel_args.has_key?('skipentries')
|
|
193
|
+
@nosel << Match::Entry::List.new(:true?,*sel_args['skipentries'])
|
|
194
|
+
end
|
|
195
|
+
if sel_args.has_key?('skipfiles')
|
|
196
|
+
@nosel << Match::Entry::List.new(:file?,*sel_args['skipfiles'])
|
|
197
|
+
unless sel_args['skipfiles'].empty? or sel_args.has_key?('files')
|
|
198
|
+
@sel ||= Match::Entry::Sels.new
|
|
199
|
+
@sel << Match::Entry::List.new(:file?)
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
if sel_args.has_key?('skipdirs')
|
|
203
|
+
@nosel << Match::Entry::List.new(:dir?,*sel_args['skipdirs'])
|
|
204
|
+
unless sel_args['skipdirs'].empty? or sel_args.has_key?('dirs')
|
|
205
|
+
@sel ||= Match::Entry::Sels.new
|
|
206
|
+
@sel << Match::Entry::List.new(:dir?)
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
def inspect()
|
|
212
|
+
str = sprintf('#<Selector:0x%08x',self.object_id)
|
|
213
|
+
str += " @sel=#{@sel.inspect}"
|
|
214
|
+
str += " @nosel=#{@nosel.inspect}"
|
|
215
|
+
str += ">"
|
|
216
|
+
str
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
private
|
|
220
|
+
|
|
221
|
+
def yes?(el)
|
|
222
|
+
@sel.nil? or @sel.detect { |match_entry| match_entry =~ el }
|
|
223
|
+
# @sel.nil? or @sel.grep(el)
|
|
224
|
+
end
|
|
225
|
+
def no?(el)
|
|
226
|
+
@nosel.detect { |match_entry| match_entry =~ el } unless @nosel.nil?
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
public
|
|
230
|
+
|
|
231
|
+
def match?(el)
|
|
232
|
+
yes?(el) and not no?(el)
|
|
233
|
+
end
|
|
234
|
+
def callstr(func,*args)
|
|
235
|
+
self.class.to_s+'['+self.to_s+']'+'.'+func.to_s+'('+args.join(',')+')'
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
class SelectorClassic < Selector
|
|
239
|
+
def initialize(sel,nosel)
|
|
240
|
+
@sel = sel
|
|
241
|
+
@nosel = nosel
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
end
|