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,16 +23,15 @@
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
  require 'uri'
@@ -43,7 +42,9 @@ require 'stringio'
43
42
  module RIO
44
43
  module RL
45
44
  class Builder
46
-
45
+ def self.build_path_rl(rl)
46
+ return rl
47
+ end
47
48
  def self.build(*a)
48
49
  #puts "build: #{a.inspect}"
49
50
  a.flatten!
@@ -64,13 +65,15 @@ module RIO
64
65
  return Factory.instance.riorl_class('path').new(*a)
65
66
  end
66
67
  when RIO::Rio
67
- a[0] = a[0].to_rl
68
+ a[0] = a[0].rl
69
+ return build(*a)
68
70
  when RL::Base
71
+ #p "HERE a=#{a.inspect}"
69
72
  a0 = a.shift.clone
70
- return (a.empty? ? a0 : a0.join(*a))
71
- #p 'THERE',a0,a0.clone
72
- #return a0.clone.join(*a)
73
- #return a0.class.new(a0.clone,*a)
73
+ cl = Factory.instance.riorl_class(a0.scheme)
74
+ o = cl.new(a0,*a) unless cl.nil?
75
+ return o
76
+ # return (a.empty? ? a0 : a0.join(*a))
74
77
  when ::URI
75
78
  a0 = a.shift
76
79
  cl = Factory.instance.riorl_class(a0.scheme)
@@ -88,7 +91,7 @@ module RIO
88
91
  end
89
92
  when ::NilClass
90
93
  a[0] = 'rio:null:'
91
- when ?? , ?= , ?_ , ?", ?[, ?#, ?`, ?|
94
+ when ?? , ?= , ?_ , ?", ?[, ?#, ?`, ?|, ?z
92
95
  a[0] = 'rio:'+CHMAP[a[0]]+':'
93
96
  when ?-
94
97
  a[0] = ( a.size == 1 ? 'rio:'+CHMAP[a[0]]+':' : 'rio:cmdio:' )
@@ -109,33 +112,6 @@ module RIO
109
112
 
110
113
  end
111
114
 
112
-
113
- def self.build0(*args)
114
- #p "build(#{args.inspect})"
115
-
116
- # aryio is a special case -- must not flatten
117
- if args[0] == 'rio:aryio'
118
- args.shift
119
- ary = args[0] unless args.empty?
120
- require 'rio/scheme/aryio'
121
- return RIO::AryIO::RL.new(ary)
122
- end
123
-
124
- args = canon(args.flatten)
125
- a0 = args.shift
126
- case a0
127
- when RL::Base
128
- a0.class.new(a0.uri.dup,*args)
129
- when ::URI
130
- cl = Factory.instance.riorl_class(a0.scheme)
131
- cl.new(a0,*args) unless cl.nil?
132
- else
133
- sch = Base.subscheme(a0)
134
- cl = Factory.instance.riorl_class(sch)
135
- cl.parse(a0,*args) unless cl.nil?
136
- end
137
- end
138
-
139
115
  end
140
116
  end
141
117
  end
@@ -0,0 +1,66 @@
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 'uri'
38
+ require 'rio/local'
39
+ require 'rio/uri/file'
40
+
41
+ module RIO
42
+ module RL
43
+ CHMAP = {
44
+ '_' => 'sysio',
45
+ '-' => 'stdio',
46
+ '=' => 'stderr',
47
+ '"' => 'strio',
48
+ '?' => 'temp',
49
+ '[' => 'aryio',
50
+ '`' => 'cmdio',
51
+ '|' => 'cmdpipe',
52
+ '#' => 'fd',
53
+
54
+ ?_ => 'sysio',
55
+ ?- => 'stdio',
56
+ ?= => 'stderr',
57
+ ?" => 'strio',
58
+ ?? => 'temp',
59
+ ?[ => 'aryio',
60
+ ?` => 'cmdio',
61
+ ?| => 'cmdpipe',
62
+ ?# => 'fd',
63
+ ?z => 'zipfile',
64
+ }.freeze
65
+ end
66
+ end
@@ -0,0 +1,82 @@
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 'uri'
38
+ require 'rio/local'
39
+ require 'rio/uri/file'
40
+ require 'rio/rl/chmap'
41
+
42
+ module RIO
43
+ module RL #:nodoc: all
44
+ PESCAPE = Regexp.new("[^-_.!~*'()a-zA-Z0-9;?:@&=+$,]",false, 'N').freeze
45
+ ESCAPE = Regexp.new("[^-_.!~*'()a-zA-Z0-9;\/?:@&=+$,]",false, 'N').freeze
46
+ def escape(pth,esc=ESCAPE)
47
+ ::URI.escape(pth,esc)
48
+ end
49
+ def unescape(pth)
50
+ ::URI.unescape(pth)
51
+ end
52
+ def fs2urls(*args)
53
+ args.map{ |pth| fs2url(pth) }
54
+ end
55
+ def fs2url(pth)
56
+ #pth.sub!(/^[a-zA-Z]:/,'')
57
+ pth = URI.escape(pth,ESCAPE)
58
+ pth = '/' + pth if pth =~ /^[a-zA-Z]:/
59
+ pth
60
+ # (Local::SEPARATOR == '/' ? pth : pth.gsub(Local::SEPARATOR,%r|/|))
61
+ end
62
+
63
+ def url2fs(pth)
64
+ # pth = pth.chop if pth.length > 1 and pth[-1] == ?/ cwd = RIO::RL.fs2url(::Dir.getwd)
65
+
66
+ #pth = pth.chop if pth != '/' and pth[-1] == ?/
67
+ pth = ::URI.unescape(pth)
68
+ if pth =~ %r#^/[a-zA-Z]:#
69
+ pth = pth[1..-1]
70
+ end
71
+ pth
72
+ # (Local::SEPARATOR == '/' ? pth : pth.gsub(%r|/|,Local::SEPARATOR))
73
+ end
74
+
75
+ def getwd()
76
+ #::URI::FILE.build({:path => fs2url(::Dir.getwd)+'/'})
77
+ ::URI::FILE.build({:path => fs2url(::Dir.getwd)})
78
+ end
79
+
80
+ module_function :url2fs,:fs2url,:fs2urls,:getwd,:escape,:unescape
81
+ end
82
+ end
@@ -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,16 +23,15 @@
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
  require 'rio/rl/base'
@@ -66,6 +65,7 @@ module RIO
66
65
  super
67
66
  end
68
67
  def initialize_copy(cp)
68
+ super
69
69
  @ios = cp.ios.clone unless cp.ios.nil?
70
70
  end
71
71
  def open(ios=nil)
@@ -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,165 +23,87 @@
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
  require 'rio/rl/uri'
38
+ require 'rio/rl/withpath'
39
39
  require 'rio/rl/pathmethods'
40
40
 
41
41
  module RIO
42
42
  module RL
43
- class PathBase < Base
43
+ class PathBase < URIBase
44
44
  RESET_STATE = 'Path::Reset'
45
45
 
46
- RIOSCHEME = 'path'
47
- HOST = URI::REGEXP::PATTERN::HOST
48
- SCHEME = URI::REGEXP::PATTERN::SCHEME
49
-
50
- #attr :fs
51
- def initialize(pth,*args)
52
-
53
- @host = nil # host or nil
54
- @fspath = nil
55
- case pth
56
- when ::Hash
57
- @host = pth[:host]
58
- @fspath = RL.url2fs(pth[:path])
59
- @base = pth[:base]
60
- when RL::Base
61
- @host = pth.host
62
- @fspath = RL.url2fs(pth.path)
63
- @base = pth.base
64
- when ::URI
65
- u = pth.dup
66
- u.path = '/' if pth.absolute? and pth.path == ''
67
- @fspath = RL.url2fs(u.path)
68
- @host = u.host
69
- when %r|^file://(#{HOST})?(/.*)?$|
70
- @host = $1 || ''
71
- @fspath = $2 ? RL.url2fs($2) : '/'
46
+ def arg0_info_(arg0,*args)
47
+ #p "arg0_info_(#{arg0.inspect},#{args.inspect})"
48
+ #p callstr('init_from_args_',arg0.inspect,args)
49
+ vuri,vbase,vfs = nil,nil,nil
50
+ case arg0
51
+ when RIO::Rio, URIBase, ::URI
52
+ return super
53
+ when ::String
54
+ vuri = uri_from_string_(RL.fs2url(arg0)) || ::URI.parse(RL.fs2url(arg0))
72
55
  else
73
- self.fspath = pth
56
+ raise(ArgumentError,"'#{arg0}'[#{arg0.class}] can not be used to create a Rio")
74
57
  end
75
- args = _get_opts_from_args(args)
76
- self.join(*args) unless args.empty?
77
- unless self.absolute? or @base
78
- @base = RL.fs2url(::Dir.getwd)+'/'
79
- end
80
- @fspath.sub!(%r|/\.$|,'/')
81
- #@fs = openfs_
82
- super
58
+ [vuri,vbase,vfs]
83
59
  end
84
- def openfs_
85
- RIO::FS::Native.create()
60
+ def build_arg0_(path_str)
61
+ RL.url2fs(path_str)
86
62
  end
87
- def pathroot()
88
- return nil unless absolute?
89
- rrl = self.clone
90
- if self.urlpath =~ %r%^(/[a-zA-Z]):%
91
- $1+':/'
92
- else
93
- '/'
94
- end
63
+ def scheme()
64
+ uri.scheme || 'path'
95
65
  end
96
- include PathMethods
97
-
98
- def _get_opts_from_args(args)
99
- @base = nil
100
- if !args.empty? and args[-1].kind_of?(::Hash)
101
- opts = args.pop
102
- if b = opts[:base]
103
- @base = case b
104
- when %r%^file://(#{HOST})?(/.*)?$% then b
105
- when %r%^/% then b
106
- else RL.fs2url(::Dir.getwd)+'/'+b
107
- end
108
- @base.squeeze('/')
109
- end
110
- if fs = opts[:fs]
111
- @fs = fs
112
- end
113
- end
114
- args
66
+ def url
67
+ str = uri.to_s
68
+ str = scheme + ':' +str unless uri.scheme
69
+ str
115
70
  end
116
- def base(arg=nil)
117
- self.base = arg unless arg.nil?
118
- if absolute?
119
- #p self.dirname
120
- urlpath
121
- else
122
- @base
123
- end
124
- end
125
- def base=(arg) @base = arg end
126
-
127
- # def urlpath() @pth end
128
- # def urlpath=(arg) @pth = arg end
129
- def urlpath() RL.fs2url(@fspath) end
130
- def urlpath=(arg) @fspath = RL.url2fs(arg) end
131
-
132
- def path() self.fspath() end
133
- def path=(arg) self.fspath = arg end
134
- def path_no_slash() self.path.sub(/\/$/,'') end
135
71
  def use_host?
136
- !(@host.nil? || @host.empty? || @host == 'localhost')
72
+ hst = uri.host
73
+ !(hst.nil? || hst.empty? || hst == 'localhost')
137
74
  end
138
75
 
76
+ def join(*args)
77
+ return self if args.empty?
78
+ join_(args.map{ |arg| RL.fs2url(arg.to_s)})
79
+ end
139
80
  def fspath()
140
81
  if use_host?
141
- '//' + @host + @fspath
82
+ '//' + uri.host + RL.url2fs(self.urlpath)
142
83
  else
143
- @fspath
84
+ RL.url2fs(self.urlpath)
144
85
  end
145
86
  end
146
- def fspath=(pt)
147
- if pt =~ %r|^//(#{HOST})(/.*)?$|
148
- @host = $1
149
- @fspath = $2 || '/'
150
- else
151
- @fspath = pt
152
- end
153
- end
154
-
155
- def opaque() (absolute? ? "//#{@host}#{self.urlpath}" : self.urlpath) end
156
-
157
- def scheme() (absolute? ? 'file' : 'path') end
158
- def host() @host end
159
- def host=(arg) @host = arg end
160
-
161
- def absolute?()
162
- (@fspath =~ %r%^([a-zA-Z]:)?/% ? true : false)
87
+ # def fspath=(pt)
88
+ # if pt =~ %r|^//(#{HOST})(/.*)?$|
89
+ # @host = $1
90
+ # @fspath = $2 || '/'
91
+ # else
92
+ # @fspath = pt
93
+ # end
94
+ # end
95
+ def to_s()
96
+ self.fspath
163
97
  end
164
- alias abs? absolute?
165
-
166
- def abs()
167
- return self if absolute?
168
- self.class.new(@base, @fspath)
169
- end
170
-
171
- def uri()
172
- (absolute? ?
173
- ::URI::FILE.new('file',nil,@host,nil,nil,RL.fs2url(@fspath),nil,nil,nil) : ::URI.parse(RL.fs2url(@fspath)))
174
- end
175
-
176
98
  def self.splitrl(s)
177
99
  sch,opq,whole = split_riorl(s)
100
+ #p sch,opq,whole
178
101
  case sch
179
102
  when 'file' then [whole]
180
103
  else [opq]
181
104
  end
182
105
  end
183
-
184
-
185
106
  end
186
107
  end
187
108
  end
109
+ __END__