rio 0.3.8 → 0.3.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (223) hide show
  1. data/README +18 -12
  2. data/Rakefile +57 -87
  3. data/build_doc.rb +19 -17
  4. data/doc/ANNOUNCE +3 -32
  5. data/doc/RELEASE_NOTES +4 -5
  6. data/doc/RIOIS +215 -0
  7. data/doc/generators/template/html/rio.css +428 -0
  8. data/doc/generators/template/html/rio.rb +18 -389
  9. data/doc/generators/template/html/ugly.rb +130 -0
  10. data/doc/pkg_def.rb +66 -0
  11. data/ex/catcsv.rb +64 -0
  12. data/ex/colx.rb +8 -0
  13. data/ex/findinruby +15 -0
  14. data/ex/findruby +14 -0
  15. data/ex/passwd_report.rb +8 -0
  16. data/ex/prompt.rb +25 -0
  17. data/ex/rgb.txt.gz +0 -0
  18. data/ex/riocat +42 -0
  19. data/ex/riogunzip +31 -0
  20. data/ex/riogzip +24 -0
  21. data/ex/rioprompt.rb +10 -0
  22. data/ex/targz2zip +17 -0
  23. data/ex/tonl +10 -0
  24. data/lib/rio.rb +16 -10
  25. data/lib/rio/abstract_method.rb +3 -4
  26. data/lib/rio/argv.rb +3 -4
  27. data/lib/rio/arycopy.rb +3 -4
  28. data/lib/rio/assert.rb +3 -4
  29. data/lib/rio/base.rb +3 -4
  30. data/lib/rio/callstr.rb +3 -4
  31. data/lib/rio/const.rb +3 -4
  32. data/lib/rio/construct.rb +3 -4
  33. data/lib/rio/constructor.rb +12 -8
  34. data/lib/rio/context.rb +15 -30
  35. data/lib/rio/context/autoclose.rb +3 -4
  36. data/lib/rio/context/copying.rb +3 -4
  37. data/lib/rio/context/cxx.rb +3 -4
  38. data/lib/rio/context/dir.rb +3 -4
  39. data/lib/rio/context/gzip.rb +3 -4
  40. data/lib/rio/context/methods.rb +16 -5
  41. data/lib/rio/context/skip.rb +3 -4
  42. data/lib/rio/context/stream.rb +42 -5
  43. data/lib/rio/cp.rb +7 -7
  44. data/lib/rio/def.rb +3 -4
  45. data/lib/rio/dir.rb +3 -4
  46. data/lib/rio/doc.rb +4 -5
  47. data/lib/rio/doc/EXAMPLES.rb +299 -0
  48. data/lib/rio/doc/HOWTO.rb +3 -4
  49. data/lib/rio/doc/INTRO.rb +86 -105
  50. data/lib/rio/doc/OPTIONAL.rb +4 -5
  51. data/lib/rio/doc/SYNOPSIS.rb +7 -6
  52. data/lib/rio/entrysel.rb +21 -23
  53. data/lib/rio/exception.rb +3 -4
  54. data/lib/rio/exception/copy.rb +3 -4
  55. data/lib/rio/exception/notimplemented.rb +57 -0
  56. data/lib/rio/exception/notsupported.rb +3 -4
  57. data/lib/rio/exception/open.rb +3 -4
  58. data/lib/rio/exception/state.rb +3 -4
  59. data/lib/rio/ext.rb +47 -13
  60. data/lib/rio/ext/csv.rb +4 -5
  61. data/lib/rio/ext/if.rb +45 -0
  62. data/lib/rio/ext/mp3info.rb +80 -0
  63. data/lib/rio/ext/splitlines.rb +253 -0
  64. data/lib/rio/ext/yaml.rb +9 -5
  65. data/lib/rio/ext/yaml/doc.rb +133 -0
  66. data/lib/rio/ext/yaml/tie.rb +149 -0
  67. data/lib/rio/ext/zipfile.rb +23 -4
  68. data/lib/rio/ext/zipfile/fs.rb +116 -0
  69. data/lib/rio/ext/zipfile/rl.rb +251 -0
  70. data/lib/rio/ext/zipfile/rootdir.rb +117 -0
  71. data/lib/rio/ext/zipfile/state.rb +161 -0
  72. data/lib/rio/ext/zipfile/wrap.rb +204 -0
  73. data/lib/rio/factory.rb +235 -27
  74. data/lib/rio/file.rb +4 -4
  75. data/lib/rio/filter.rb +3 -4
  76. data/lib/rio/filter/closeoneof.rb +3 -4
  77. data/lib/rio/filter/gzip.rb +9 -4
  78. data/lib/rio/fs/base.rb +3 -4
  79. data/lib/rio/fs/impl.rb +4 -5
  80. data/lib/rio/fs/native.rb +3 -4
  81. data/lib/rio/fs/stream.rb +3 -4
  82. data/lib/rio/fs/url.rb +3 -4
  83. data/lib/rio/ftp/conncache.rb +19 -5
  84. data/lib/rio/ftp/dir.rb +3 -4
  85. data/lib/rio/ftp/fs.rb +30 -24
  86. data/lib/rio/grande.rb +27 -7
  87. data/lib/rio/handle.rb +3 -4
  88. data/lib/rio/if.rb +19 -15
  89. data/lib/rio/if/basic.rb +7 -7
  90. data/lib/rio/if/csv.rb +5 -6
  91. data/lib/rio/if/dir.rb +120 -114
  92. data/lib/rio/if/file.rb +52 -44
  93. data/lib/rio/if/fileordir.rb +217 -211
  94. data/lib/rio/if/grande.rb +674 -644
  95. data/lib/rio/if/grande_entry.rb +321 -313
  96. data/lib/rio/if/grande_stream.rb +653 -553
  97. data/lib/rio/if/internal.rb +3 -4
  98. data/lib/rio/if/path.rb +425 -426
  99. data/lib/rio/if/rubyio.rb +681 -0
  100. data/lib/rio/if/string.rb +42 -5
  101. data/lib/rio/if/temp.rb +3 -4
  102. data/lib/rio/if/test.rb +245 -238
  103. data/lib/rio/if/yaml.rb +15 -41
  104. data/lib/rio/ioh.rb +7 -5
  105. data/lib/rio/iomode.rb +19 -7
  106. data/lib/rio/ios/fail.rb +4 -5
  107. data/lib/rio/ios/generic.rb +4 -5
  108. data/lib/rio/ios/mode.rb +4 -5
  109. data/lib/rio/ios/null.rb +6 -7
  110. data/lib/rio/iowrap.rb +3 -4
  111. data/lib/rio/kernel.rb +3 -5
  112. data/lib/rio/local.rb +3 -4
  113. data/lib/rio/match.rb +3 -4
  114. data/lib/rio/matchrecord.rb +3 -4
  115. data/lib/rio/no_warn.rb +3 -4
  116. data/lib/rio/nullio.rb +3 -4
  117. data/lib/rio/open3.rb +4 -5
  118. data/lib/rio/ops/construct.rb +3 -4
  119. data/lib/rio/ops/create.rb +11 -6
  120. data/lib/rio/ops/dir.rb +19 -8
  121. data/lib/rio/ops/either.rb +6 -5
  122. data/lib/rio/ops/file.rb +3 -4
  123. data/lib/rio/ops/path.rb +14 -35
  124. data/lib/rio/ops/stream.rb +3 -4
  125. data/lib/rio/ops/stream/input.rb +4 -7
  126. data/lib/rio/ops/stream/output.rb +3 -4
  127. data/lib/rio/ops/stream/read.rb +6 -5
  128. data/lib/rio/ops/stream/write.rb +3 -4
  129. data/lib/rio/ops/symlink.rb +3 -4
  130. data/lib/rio/path.rb +22 -18
  131. data/lib/rio/path/reset.rb +4 -5
  132. data/lib/rio/piper.rb +3 -4
  133. data/lib/rio/piper/cp.rb +3 -4
  134. data/lib/rio/prompt.rb +10 -5
  135. data/lib/rio/rectype.rb +5 -5
  136. data/lib/rio/rl/base.rb +17 -71
  137. data/lib/rio/rl/builder.rb +14 -38
  138. data/lib/rio/rl/chmap.rb +66 -0
  139. data/lib/rio/rl/fs2url.rb +82 -0
  140. data/lib/rio/rl/ioi.rb +4 -4
  141. data/lib/rio/rl/path.rb +44 -122
  142. data/lib/rio/rl/pathmethods.rb +19 -8
  143. data/lib/rio/rl/uri.rb +137 -60
  144. data/lib/rio/rl/withpath.rb +295 -0
  145. data/lib/rio/scheme/aryio.rb +3 -4
  146. data/lib/rio/scheme/cmdio.rb +3 -4
  147. data/lib/rio/scheme/cmdpipe.rb +4 -4
  148. data/lib/rio/scheme/fd.rb +3 -4
  149. data/lib/rio/scheme/ftp.rb +7 -7
  150. data/lib/rio/scheme/http.rb +4 -5
  151. data/lib/rio/scheme/null.rb +3 -4
  152. data/lib/rio/scheme/path.rb +3 -4
  153. data/lib/rio/scheme/stderr.rb +3 -4
  154. data/lib/rio/scheme/stdio.rb +3 -4
  155. data/lib/rio/scheme/strio.rb +3 -4
  156. data/lib/rio/scheme/sysio.rb +3 -4
  157. data/lib/rio/scheme/tcp.rb +3 -4
  158. data/lib/rio/scheme/temp.rb +6 -6
  159. data/lib/rio/state.rb +18 -46
  160. data/lib/rio/state/error.rb +3 -4
  161. data/lib/rio/stream.rb +4 -4
  162. data/lib/rio/stream/base.rb +3 -4
  163. data/lib/rio/stream/duplex.rb +3 -4
  164. data/lib/rio/stream/open.rb +3 -8
  165. data/lib/rio/symantics.rb +3 -4
  166. data/lib/rio/tempdir.rb +2 -2
  167. data/lib/rio/to_rio.rb +3 -4
  168. data/lib/rio/to_rio/all.rb +3 -4
  169. data/lib/rio/to_rio/array.rb +4 -5
  170. data/lib/rio/to_rio/io.rb +4 -5
  171. data/lib/rio/to_rio/object.rb +4 -5
  172. data/lib/rio/to_rio/string.rb +4 -5
  173. data/lib/rio/uri/file.rb +41 -5
  174. data/lib/rio/util.rb +3 -4
  175. data/lib/rio/version.rb +4 -5
  176. data/setup.rb +368 -339
  177. data/test/bin/list_dir.rb +1 -1
  178. data/test/ftp/anon_misc.rb +13 -1
  179. data/test/ftp/anon_special.rb +6 -6
  180. data/test/ftp/anon_write.rb +10 -3
  181. data/test/ftp/ftp2ftp.rb +2 -2
  182. data/test/ftp/testdef.rb +9 -6
  183. data/test/http/all.rb +3 -0
  184. data/test/http/copy-from-http.rb +140 -0
  185. data/test/lib/temp_server.rb +44 -0
  186. data/test/runalltests.rb +3 -1
  187. data/test/runhttp.rb +12 -0
  188. data/test/runhttptests.rb +1 -1
  189. data/test/runtests.rb +41 -3
  190. data/test/tc/abs.rb +9 -5
  191. data/test/tc/all.rb +9 -4
  192. data/test/tc/base.rb +1 -1
  193. data/test/tc/base2.rb +87 -0
  194. data/test/tc/{methods.rb → clone.rb} +72 -50
  195. data/test/tc/closeoncopy.rb +13 -2
  196. data/test/tc/copy-dir-samevar.rb +91 -0
  197. data/test/tc/dir_iter.rb +0 -1
  198. data/test/tc/empty.rb +6 -2
  199. data/test/tc/expand_path.rb +36 -54
  200. data/test/tc/ext.rb +42 -18
  201. data/test/tc/gzip.rb +30 -3
  202. data/test/tc/likeio.rb +5 -1
  203. data/test/tc/line_record_row.rb +51 -0
  204. data/test/tc/noqae.rb +71 -70
  205. data/test/tc/path_parts.rb +175 -0
  206. data/test/tc/programs_util.rb +3 -3
  207. data/test/tc/rename.rb +4 -5
  208. data/test/tc/riorl.rb +9 -7
  209. data/test/tc/skip.rb +35 -6
  210. data/test/tc/skiplines.rb +34 -5
  211. data/test/tc/split.rb +8 -50
  212. data/test/tc/splitlines.rb +65 -0
  213. data/test/tc/splitpath.rb +83 -0
  214. data/test/tc/testcase.rb +1 -1
  215. data/test/tc/truncate.rb +39 -0
  216. data/test/tc/yaml.rb +9 -8
  217. metadata +261 -207
  218. data/ChangeLog +0 -1418
  219. data/VERSION +0 -1
  220. data/lib/rio/doc/MISC.rb +0 -259
  221. data/lib/rio/if/stream.rb +0 -680
  222. data/lib/rio/impl/path.rb +0 -87
  223. data/test/tc/copy-from-http.rb +0 -89
@@ -1,6 +1,6 @@
1
1
  #--
2
2
  # ===============================================================================
3
- # Copyright (c) 2005, 2006 Christopher Kleckner
3
+ # Copyright (c) 2005,2006,2007 Christopher Kleckner
4
4
  # All rights reserved
5
5
  #
6
6
  # This file is part of the Rio library for ruby.
@@ -23,240 +23,246 @@
23
23
  #
24
24
  # To create the documentation for Rio run the command
25
25
  # ruby build_doc.rb
26
- # from the distribution directory. Then point your browser at the 'doc/rdoc' directory.
26
+ # from the distribution directory.
27
27
  #
28
28
  # Suggested Reading
29
29
  # * RIO::Doc::SYNOPSIS
30
30
  # * RIO::Doc::INTRO
31
31
  # * RIO::Doc::HOWTO
32
+ # * RIO::Doc::EXAMPLES
32
33
  # * RIO::Rio
33
34
  #
34
- # <b>Rio is pre-alpha software.
35
- # The documented interface and behavior is subject to change without notice.</b>
36
35
 
37
36
 
38
37
  module RIO
39
- class Rio
38
+ module IF
39
+ module FileOrDir
40
40
 
41
- # undocumented
42
- def open(m,*args,&block) target.open(m,*args,&block); self end
41
+ # undocumented
42
+ def open(m,*args,&block) target.open(m,*args,&block); self end
43
43
 
44
- # Creates a symbolic link _dest_ which points to the Rio's Rio#fspath.
45
- # Raises a NotImplementedError exception on platforms that do not support symbolic links.
46
- # _dest_ may be a Rio, a String, or anything that will create an appropriate Rio
47
- # when passed to Rio#new .
48
- # If _dest_ already exists and is a directory, creates a symbolic link in the _dest_ directory,
49
- # named with the name returned by Rio#filename.
50
- # If _dest_ already exists and it is not a directory, raises Errno::EEXIST.
51
- #
52
- # Returns the Rio (not the symlink).
53
- #
54
- # Rio#symlink differs from File#symlink when the Rio or the _dest_ path has directory information.
55
- # In this case Rio#symlink creates a symlink that actually refers to the Rio's location
56
- # from the perspective of the link's location.
57
- #
58
- # For example: Given an existing file 'adir/afile' and a _dest_ of 'adir/alink'
59
- # ::File.symlink('adir/afile','adir/alink1') # creates 'adir/alink1 -> adir/afile'
60
- # ::File.exist?('adir/alink1') # false
61
- # rio('adir/afile').symlink('adir/alink2') # creates 'adir/alink2 -> afile'
62
- # ::File.exist?('adir/alink2') # true
63
- #
64
- # To replace an existing symlink use the following Rio idiom
65
- # rio('afile').symlink( rio('link_name').delete ) # delete 'link_name' and recreate linked to 'afile'
66
- #
67
- # Examples
68
- # rio('afile').symlink('alink') # create the symbolic link 'alink' which references 'afile'
69
- # rio('afile').symlink('adir/alink') # create a symlink 'adir/alink' -> '../afile'
70
- # rio('adir/afile').symlink('alink') # create a symlink 'alink' -> 'adir/afile'
71
- # rio('adir/afile').symlink('adir/alink') # create a symlink 'adir/alink' -> 'afile'
72
- # rio('adir/afile').symlink('adir/alink') # create a symlink 'adir/alink' -> 'afile'
73
- # rio('adir1/afile').symlink('adir2/alink') # create a symlink 'adir2/alink' -> '../adir1/afile'
74
- # rio('/tmp/afile').symlink('alink') # create a symlink 'adir/alink' -> '/tmp/afile'
75
- def symlink(dest) target.symlink(dest); self end
44
+ # Creates a symbolic link _dest_ which points to the Rio's IF::Path#fspath.
45
+ # Raises a NotImplementedError exception on platforms that do not support symbolic links.
46
+ # _dest_ may be a Rio, a String, or anything that will create an appropriate Rio
47
+ # when passed to Rio#new .
48
+ # If _dest_ already exists and is a directory, creates a symbolic link in the _dest_ directory,
49
+ # named with the name returned by IF::Path#filename.
50
+ # If _dest_ already exists and it is not a directory, raises Errno::EEXIST.
51
+ #
52
+ # Returns the Rio (not the symlink).
53
+ #
54
+ # IF::FileOrDir#symlink differs from File#symlink when the Rio or the _dest_ path has directory information.
55
+ # In this case IF::FileOrDir#symlink creates a symlink that actually refers to the Rio's location
56
+ # from the perspective of the link's location.
57
+ #
58
+ # For example: Given an existing file 'adir/afile' and a _dest_ of 'adir/alink'
59
+ # ::File.symlink('adir/afile','adir/alink1') # creates 'adir/alink1 -> adir/afile'
60
+ # ::File.exist?('adir/alink1') # false
61
+ # rio('adir/afile').symlink('adir/alink2') # creates 'adir/alink2 -> afile'
62
+ # ::File.exist?('adir/alink2') # true
63
+ #
64
+ # To replace an existing symlink use the following Rio idiom
65
+ # rio('afile').symlink( rio('link_name').delete ) # delete 'link_name' and recreate linked to 'afile'
66
+ #
67
+ # Examples
68
+ # rio('afile').symlink('alink') # create the symbolic link 'alink' which references 'afile'
69
+ # rio('afile').symlink('adir/alink') # create a symlink 'adir/alink' -> '../afile'
70
+ # rio('adir/afile').symlink('alink') # create a symlink 'alink' -> 'adir/afile'
71
+ # rio('adir/afile').symlink('adir/alink') # create a symlink 'adir/alink' -> 'afile'
72
+ # rio('adir/afile').symlink('adir/alink') # create a symlink 'adir/alink' -> 'afile'
73
+ # rio('adir1/afile').symlink('adir2/alink') # create a symlink 'adir2/alink' -> '../adir1/afile'
74
+ # rio('/tmp/afile').symlink('alink') # create a symlink 'adir/alink' -> '/tmp/afile'
75
+ def symlink(dest) target.symlink(dest); self end
76
76
 
77
77
 
78
- # Calls File#readlink
79
- #
80
- # Returns a Rio referencing the file referenced by the given link. Not available on all platforms.
81
- #
82
- def readlink(*args) target.readlink(*args) end
78
+ # Calls File#readlink
79
+ #
80
+ # Returns a Rio referencing the file referenced by the given link. Not available on all platforms.
81
+ #
82
+ def readlink(*args) target.readlink(*args) end
83
83
 
84
- # If called with an argument calls FileUtils#rename.
85
- # If called without an argument puts the Rio in "rename mode".
86
- # Proxy for FileUtils#rename
87
- # ario = rio('afile.cpp')
88
- # ario.rename('afile.cxx') # renamed the file, but ario still references
89
- # # the old path
90
- # Rename Mode
91
- #
92
- # In rename mode changes to a Rio's path with Rio#dirname=, Rio#filename=,
93
- # Rio#basename=, and Rio#extname= also cause the object on the filesystem
94
- # to be renamed.
95
- #
96
- # Change the extension of all'.cpp' files in 'adir' to '.cxx'
97
- # rio('adir').rename.files('*.cpp') do |file|
98
- # file.ext = '.cxx' # 'file' references the new path and the actual file is renamed
99
- # end
100
- #
101
- # Recursively change all '.tar.gz' files to '.tgz' files
102
- # rio('adir').rename.all.files('*.tar.gz') do |gzfile|
103
- # gzfile.ext('.tar.gz').ext = '.tgz'
104
- # end
105
- #
106
- # See Rio#dirname=, Rio#filename=, Rio#basename=, and Rio#extname=
107
- #
108
- def rename(*args,&block) target.rename(*args,&block); self end
109
-
84
+ # If called with an argument calls FileUtils#rename.
85
+ # If called without an argument puts the Rio in "rename mode".
86
+ #
87
+ # Proxy for FileUtils#rename
88
+ # ario = rio('afile.cpp')
89
+ # ario.rename('afile.cxx') # renamed the file, but ario still references
90
+ # # the old path
91
+ # ===== Rename Mode
92
+ #
93
+ # In rename mode, changes to a Rio's path using IF::Path#dirname=, IF::Path#filename=,
94
+ # IF::Path#basename=, and IF::Path#extname= also cause the object on the filesystem
95
+ # to be renamed.
96
+ #
97
+ # Change the extension of all'.cpp' files in 'adir' to '.cxx'
98
+ # rio('adir').rename.files('*.cpp') do |file|
99
+ # file.ext = '.cxx' # 'file' references the new path and the actual file is renamed
100
+ # end
101
+ #
102
+ # Recursively change all '.tar.gz' files to '.tgz' files
103
+ # rio('adir').rename.all.files('*.tar.gz') do |gzfile|
104
+ # gzfile.ext('.tar.gz').ext = '.tgz'
105
+ # end
106
+ #
107
+ # See IF::Path#dirname=, IF::Path#filename=, IF::Path#basename=, and IF::Path#extname=
108
+ #
109
+ def rename(*args,&block) target.rename(*args,&block); self end
110
+
110
111
 
111
- # Behaves like Rio#rename, but also changes the calling Rio to
112
- # refer to the renamed path
113
- def rename!(*args,&block) target.rename!(*args,&block); self end
114
-
112
+ # Behaves like IF::GrandeStream#rename, but also changes the calling Rio to
113
+ # refer to the renamed path
114
+ def rename!(*args,&block) target.rename!(*args,&block); self end
115
+
115
116
 
116
- # For directories calls Dir#read, otherwise calls IO#read
117
- #
118
- # For streams calls IO#read
119
- # ario.read([integer [, buffer]]) => string, buffer, or nil
120
- # Reads at most _integer_ bytes from the I/O stream, or to the end of
121
- # file if _integer_ is omitted or is +nil+. If the optional _buffer_
122
- # argument is present, it must reference a String, which will receive
123
- # the data. Returns +nil+ if called at end of file.
124
- #
125
- # f = rio("testfile")
126
- # f.read(16) #=> "This is line one"
127
- #
128
- # rio("testfile").read(16) #=> "This is line one"
129
- #
130
- # For directories calls Dir#read
131
- # dir.read => ario or nil
132
- #------------------------------------------------------------------------
133
- # Reads the next entry from _dir_ and returns it as a Rio. Returns
134
- # +nil+ at the end of the stream.
135
- # d = rio("testdir")
136
- # d.read #=> rio(".")
137
- # d.read #=> rio("..")
138
- # d.read #=> rio("config.h")
139
- #
140
- def read(*args) target.read(*args)end
141
-
142
- # For directories proxies Dir#rewind, otherwise proxies IO#rewind
143
- #
144
- # Proxy for IO#rewind
145
- # ario.rewind => ario
146
- # Positions _ario_ to the beginning of input, resetting lineno to zero.
147
- #
148
- # Returns the Rio
149
- #
150
- # f = rio("testfile")
151
- # f.readline #=> "This is line one\n"
152
- # f.rewind #=> f
153
- # f.lineno #=> 0
154
- # f.readline #=> "This is line one\n"
155
- #
156
- # f.rewind.readline #=> "This is line one\n"
157
- #
158
- # Proxy for Dir#rewind
159
- # ario.rewind => ario
160
- #------------------------------------------------------------------------
161
- # Repositions _ario_ to the first entry.
162
- #
163
- # d = rio("testdir")
164
- # d.read #=> rio(".")
165
- # d.rewind.read #=> rio(".")
166
- def rewind(&block) target.rewind(&block); self end
117
+ # For directories calls Dir#read, otherwise calls IO#read
118
+ #
119
+ # For streams calls IO#read
120
+ # ario.read([integer [, buffer]]) => string, buffer, or nil
121
+ # Reads at most _integer_ bytes from the I/O stream, or to the end of
122
+ # file if _integer_ is omitted or is +nil+. If the optional _buffer_
123
+ # argument is present, it must reference a String, which will receive
124
+ # the data. Returns +nil+ if called at end of file.
125
+ #
126
+ # f = rio("testfile")
127
+ # f.read(16) #=> "This is line one"
128
+ #
129
+ # rio("testfile").read(16) #=> "This is line one"
130
+ #
131
+ # For directories calls Dir#read
132
+ # dir.read => ario or nil
133
+ #------------------------------------------------------------------------
134
+ # Reads the next entry from _dir_ and returns it as a Rio. Returns
135
+ # +nil+ at the end of the stream.
136
+ # d = rio("testdir")
137
+ # d.read #=> rio(".")
138
+ # d.read #=> rio("..")
139
+ # d.read #=> rio("config.h")
140
+ #
141
+ def read(*args) target.read(*args)end
142
+
143
+ # For directories proxies Dir#rewind, otherwise proxies IO#rewind
144
+ #
145
+ # Proxy for IO#rewind
146
+ # ario.rewind => ario
147
+ # Positions _ario_ to the beginning of input, resetting lineno to zero.
148
+ #
149
+ # Returns the Rio
150
+ #
151
+ # f = rio("testfile")
152
+ # f.readline #=> "This is line one\n"
153
+ # f.rewind #=> f
154
+ # f.lineno #=> 0
155
+ # f.readline #=> "This is line one\n"
156
+ #
157
+ # f.rewind.readline #=> "This is line one\n"
158
+ #
159
+ # Proxy for Dir#rewind
160
+ # ario.rewind => ario
161
+ #------------------------------------------------------------------------
162
+ # Repositions _ario_ to the first entry.
163
+ #
164
+ # d = rio("testdir")
165
+ # d.read #=> rio(".")
166
+ # d.rewind.read #=> rio(".")
167
+ def rewind(&block) target.rewind(&block); self end
167
168
 
168
- # For directories calls Dir#seek, otherwise calls IO#seek
169
- #
170
- # For streams calls IO#seek
171
- # ario.seek(amount, whence=SEEK_SET) -> ario
172
- # Seeks to a given offset _amount_ in the stream according to the
173
- # value of _whence_:
174
- #
175
- # IO::SEEK_CUR | Seeks to 'amount' plus current position
176
- # --------------+----------------------------------------------------
177
- # IO::SEEK_END | Seeks to 'amount' plus end of stream (you probably
178
- # | want a negative value for 'amount')
179
- # --------------+----------------------------------------------------
180
- # IO::SEEK_SET | Seeks to the absolute location given by 'amount'
181
- #
182
- # Example:
183
- #
184
- # f = rio("testfile")
185
- # f.seek(-28, IO::SEEK_END).readline #=> "happily ever after. The End\n"
186
- #
187
- # For directories calls Dir#seek
188
- # ario.seek( integer ) => ario
189
- # Seeks to a particular location in _ario_. _integer_ must be a value
190
- # returned by Rio#tell.
191
- #
192
- # d = rio("testdir") #=> #<RIO::Rio:0x401b3c40>
193
- # d.read #=> rio(".")
194
- # i = d.tell #=> 12
195
- # d.read #=> rio("..")
196
- # d.seek(i) #=> #<RIO::Rio:0x401b3c40>
197
- # d.read #=> rio("..")
198
- def seek(*args) target.seek(*args); self end
199
- #def seek(amount,whence=IO::SEEK_SET) target.seek(amount,whence) end
169
+ # For directories calls Dir#seek, otherwise calls IO#seek
170
+ #
171
+ # For streams calls IO#seek
172
+ # ario.seek(amount, whence=SEEK_SET) -> ario
173
+ # Seeks to a given offset _amount_ in the stream according to the
174
+ # value of _whence_:
175
+ #
176
+ # IO::SEEK_CUR | Seeks to 'amount' plus current position
177
+ # --------------+----------------------------------------------------
178
+ # IO::SEEK_END | Seeks to 'amount' plus end of stream (you probably
179
+ # | want a negative value for 'amount')
180
+ # --------------+----------------------------------------------------
181
+ # IO::SEEK_SET | Seeks to the absolute location given by 'amount'
182
+ #
183
+ # Example:
184
+ #
185
+ # f = rio("testfile")
186
+ # f.seek(-28, IO::SEEK_END).readline #=> "happily ever after. The End\n"
187
+ #
188
+ # For directories calls Dir#seek
189
+ # ario.seek( integer ) => ario
190
+ # Seeks to a particular location in _ario_. _integer_ must be a value
191
+ # returned by IF::FileOrDir#tell.
192
+ #
193
+ # d = rio("testdir") #=> #<RIO::Rio:0x401b3c40>
194
+ # d.read #=> rio(".")
195
+ # i = d.tell #=> 12
196
+ # d.read #=> rio("..")
197
+ # d.seek(i) #=> #<RIO::Rio:0x401b3c40>
198
+ # d.read #=> rio("..")
199
+ def seek(*args) target.seek(*args); self end
200
+ #def seek(amount,whence=IO::SEEK_SET) target.seek(amount,whence) end
200
201
 
201
202
 
202
203
 
203
- # For directories calls Dir#pos, otherwise calls IO#pos
204
- #
205
- # For streams calls IO#pos
206
- # ario.pos => integer
207
- # ario.tell => integer
208
- # Returns the current offset (in bytes) of _ario_.
209
- #
210
- # f = rio("testfile")
211
- # f.pos #=> 0
212
- # f.gets #=> "This is line one\n"
213
- # f.pos #=> 17
214
- #
215
- #
216
- # For directories calls Dir#pos
217
- # ario.pos => integer
218
- # ario.tell => integer
219
- # Returns the current position in _dir_. See also +Rio#seek+.
220
- #
221
- # d = rio("testdir")
222
- # d.pos #=> 0
223
- # d.read #=> rio(".")
224
- # d.pos #=> 12
225
- #
226
- def pos() target.pos end
204
+ # For directories calls Dir#pos, otherwise calls IO#pos
205
+ #
206
+ # For streams calls IO#pos
207
+ # ario.pos => integer
208
+ # ario.tell => integer
209
+ # Returns the current offset (in bytes) of _ario_.
210
+ #
211
+ # f = rio("testfile")
212
+ # f.pos #=> 0
213
+ # f.gets #=> "This is line one\n"
214
+ # f.pos #=> 17
215
+ #
216
+ #
217
+ # For directories calls Dir#pos
218
+ # ario.pos => integer
219
+ # ario.tell => integer
220
+ # Returns the current position in _dir_. See also IF::FileOrDir#seek.
221
+ #
222
+ # d = rio("testdir")
223
+ # d.pos #=> 0
224
+ # d.read #=> rio(".")
225
+ # d.pos #=> 12
226
+ #
227
+ def pos() target.pos end
227
228
 
228
- # See Rio#pos
229
- def tell() target.tell end
229
+ # See IF::FileOrDir#pos
230
+ def tell() target.tell end
230
231
 
231
- # For directories calls Dir#pos=, otherwise calls IO#pos=
232
- #
233
- # For streams calls IO#pos=
234
- # ario.pos = integer => 0
235
- # Seeks to the given position (in bytes) in _ario_.
236
- #
237
- # f = rio("testfile")
238
- # f.pos = 17
239
- # f.gets #=> "This is line two\n"
240
- #
241
- # For directories calls Dir#pos=
242
- # ario.pos = integer => integer
243
- #------------------------------------------------------------------------
244
- # Synonym for +Rio#seek+, but returns the position parameter.
245
- #
246
- # d = rio("testdir") #=> d
247
- # d.read #=> rio(".")
248
- # i = d.pos #=> 12
249
- # d.read #=> rio("..")
250
- # d.pos = i #=> 12
251
- # d.read #=> rio("..")
252
- #
253
- def pos=(integer) target.pos = integer end
232
+ # For directories calls Dir#pos=, otherwise calls IO#pos=
233
+ #
234
+ # For streams calls IO#pos=
235
+ # ario.pos = integer => 0
236
+ # Seeks to the given position (in bytes) in _ario_.
237
+ #
238
+ # f = rio("testfile")
239
+ # f.pos = 17
240
+ # f.gets #=> "This is line two\n"
241
+ #
242
+ # For directories calls Dir#pos=
243
+ # ario.pos = integer => integer
244
+ #------------------------------------------------------------------------
245
+ # Synonym for +IF::FileOrDir#seek+, but returns the position parameter.
246
+ #
247
+ # d = rio("testdir") #=> d
248
+ # d.read #=> rio(".")
249
+ # i = d.pos #=> 12
250
+ # d.read #=> rio("..")
251
+ # d.pos = i #=> 12
252
+ # d.read #=> rio("..")
253
+ #
254
+ def pos=(integer) target.pos = integer end
254
255
 
255
- # For Streams calls IO#reopen, otherwise closes and re-opens
256
- # the Rio.
257
- #
258
- def reopen(mode=nil) target.reopen(mode); self end
256
+ # For Streams calls IO#reopen, otherwise closes and re-opens
257
+ # the Rio.
258
+ #
259
+ def reopen(mode=nil) target.reopen(mode); self end
260
+ end
259
261
  end
260
262
  end
261
263
 
262
-
264
+ module RIO
265
+ class Rio
266
+ include RIO::IF::FileOrDir
267
+ end
268
+ end