rio 0.3.8 → 0.3.9

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