pathname2 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,3 +1,7 @@
1
+ == 1.2.1 - 1-Sep-2005
2
+ * Bug fix for the ascend and descend methods wrt Windows and UNC paths.
3
+ * More tests added for ascend and descend methods.
4
+
1
5
  == 1.2.0 - 29-Aug-2005
2
6
  * Added the 'ascend' and 'descend' methods.
3
7
  * Added corresponding test suite additions.
data/MANIFEST CHANGED
@@ -1,10 +1,10 @@
1
- CHANGES
2
- MANIFEST
3
- README
4
- install.rb
5
- pathname2.gempsec
6
-
7
- lib/pathname2.rb
8
-
9
- test/tc_pathname.rb
10
- test/tc_pathname_win.rb
1
+ CHANGES
2
+ MANIFEST
3
+ README
4
+ install.rb
5
+ pathname2.gempsec
6
+
7
+ lib/pathname2.rb
8
+
9
+ test/tc_pathname.rb
10
+ test/tc_pathname_win.rb
data/lib/pathname2.rb CHANGED
@@ -46,7 +46,7 @@ class Pathname < String
46
46
  facade File
47
47
  facade Dir
48
48
 
49
- if PLATFORM.match("mswin32")
49
+ if PLATFORM.match("mswin")
50
50
  require "Win32API"
51
51
  @@PathStripToRoot = Win32API.new("shlwapi","PathStripToRoot","P","L")
52
52
  @@PathIsUNC = Win32API.new("shlwapi","PathIsUNC","P","L")
@@ -69,7 +69,7 @@ class Pathname < String
69
69
  Win32API.new("shlwapi", "PathRemoveBackslash", "P", "P")
70
70
  end
71
71
 
72
- VERSION = "1.2.0"
72
+ VERSION = "1.2.1"
73
73
  MAX_PATH = 260
74
74
 
75
75
  # Creates and returns a new Pathname object.
@@ -81,11 +81,11 @@ class Pathname < String
81
81
  raise PathnameError, msg
82
82
  end
83
83
 
84
- @sep = File::ALT_SEPARATOR || File::SEPARATOR
85
- @win32 = PLATFORM.match("mswin32")
84
+ @sep = File::ALT_SEPARATOR || File::SEPARATOR
85
+ @win = PLATFORM.match("mswin")
86
86
 
87
87
  # Handle File URL's for Windows
88
- if @win32
88
+ if @win
89
89
  if @@PathIsURL.call(path) > 0
90
90
  buf = 0.chr * MAX_PATH
91
91
  len = [buf.length].pack("l")
@@ -98,7 +98,7 @@ class Pathname < String
98
98
  end
99
99
 
100
100
  # Convert forward slashes to backslashes on Win32
101
- path = path.tr("/", @sep) if @win32
101
+ path = path.tr("/", @sep) if @win
102
102
  super(path)
103
103
  end
104
104
 
@@ -107,7 +107,7 @@ class Pathname < String
107
107
  # Removes the decoration from a path string. For example,
108
108
  # C:\Path\File[5].txt would become C:\Path\File.txt.
109
109
  def undecorate
110
- unless @win32
110
+ unless @win
111
111
  raise NotImplementedError, "not supported on this platform"
112
112
  end
113
113
  buf = 0.chr * MAX_PATH
@@ -118,7 +118,7 @@ class Pathname < String
118
118
 
119
119
  # Removes trailing slash, if present.
120
120
  def pstrip
121
- if @win32
121
+ if @win
122
122
  @@PathRemoveBackslash.call(self)
123
123
  self.strip!
124
124
  else
@@ -150,18 +150,26 @@ class Pathname < String
150
150
  # on the first iteration, "/foo" on the second, "/foo/bar on the third and
151
151
  # finally "/foo/bar/baz".
152
152
  def descend
153
- if PLATFORM.match("mswin")
154
- path = ""
153
+ if root?
154
+ yield root
155
+ return
156
+ end
157
+
158
+ if @win
159
+ path = unc? ? "#{root}\\" : ""
155
160
  else
156
161
  path = absolute? ? root : ""
157
162
  end
158
163
 
159
164
  # Yield the root directory if an absolute path (and not Windows)
160
- unless PLATFORM.match("mswin")
165
+ unless @win && !unc?
161
166
  yield root if absolute?
162
167
  end
163
168
 
164
169
  self.each{ |element|
170
+ if @win && unc?
171
+ next if root.to_a.include?(element)
172
+ end
165
173
  path << element << @sep
166
174
  yield Pathname.new(path.chop)
167
175
  }
@@ -172,21 +180,38 @@ class Pathname < String
172
180
  #
173
181
  # For example, if the path is "/foo/bar/baz", then "/foo/bar/baz" would
174
182
  # be yielded on the first iteration, "/foo/bar" on the second, "/foo" on
175
- # the third, and finall "/".
183
+ # the third, and finally "/".
176
184
  def ascend
185
+ if root?
186
+ yield root
187
+ return
188
+ end
189
+
177
190
  n = self.to_a.length
178
191
 
179
192
  while n > 0
180
193
  path = self.to_a[0..n-1].join(@sep)
181
194
  if self.absolute?
182
- path = root << path unless PLATFORM.match("mswin")
195
+ if @win && unc?
196
+ path = "\\\\" << path
197
+ end
198
+ unless @win
199
+ path = root << path
200
+ end
201
+ end
202
+
203
+ path = Pathname.new(path)
204
+ yield path
205
+
206
+ if @win && unc?
207
+ break if path.root?
183
208
  end
184
- yield Pathname.new(path)
209
+
185
210
  n -= 1
186
211
  end
187
212
 
188
213
  # Yield the root directory if an absolute path (and not Windows)
189
- unless PLATFORM.match("mswin")
214
+ unless @win
190
215
  yield root if absolute?
191
216
  end
192
217
  end
@@ -199,7 +224,7 @@ class Pathname < String
199
224
  # is a UNC path.
200
225
  def root
201
226
  dir = "."
202
- if @win32
227
+ if @win
203
228
  buf = 0.chr * MAX_PATH
204
229
  buf[0..self.length-1] = self
205
230
 
@@ -218,7 +243,7 @@ class Pathname < String
218
243
 
219
244
  # Returns whether or not the path consists only of a root directory.
220
245
  def root?
221
- if @win32
246
+ if @win
222
247
  @@PathIsRoot.call(self) > 0
223
248
  else
224
249
  self == root
@@ -230,7 +255,7 @@ class Pathname < String
230
255
  # Determines if the string is a valid Universal Naming Convention (UNC)
231
256
  # for a server and share path.
232
257
  def unc?
233
- unless @win32
258
+ unless @win
234
259
  raise NotImplementedError, "not supported on this platform"
235
260
  end
236
261
 
@@ -244,7 +269,7 @@ class Pathname < String
244
269
  #
245
270
  # For example, Pathname.new("C:\\foo").drive_number would return 2.
246
271
  def drive_number
247
- unless @win32
272
+ unless @win
248
273
  raise NotImplementedError, "not supported on this platform"
249
274
  end
250
275
 
@@ -277,7 +302,7 @@ class Pathname < String
277
302
  return self if string == "."
278
303
 
279
304
  # Use the builtin PathAppend method if on Windows - much easier
280
- if @win32
305
+ if @win
281
306
  buf = 0.chr * MAX_PATH
282
307
  buf[0..self.length-1] = self
283
308
  @@PathAppend.call(buf, string << 0.chr)
@@ -291,7 +316,7 @@ class Pathname < String
291
316
  array = self.to_a + string.to_a
292
317
  new_string = array.join(@sep)
293
318
 
294
- unless self.relative? || @win32
319
+ unless self.relative? || @win
295
320
  new_string = @sep + new_string # Add root path back if needed
296
321
  end
297
322
 
@@ -305,7 +330,7 @@ class Pathname < String
305
330
 
306
331
  # Returns whether or not the path is a relative path.
307
332
  def relative?
308
- if @win32
333
+ if @win
309
334
  @@PathIsRelative.call(self) > 0
310
335
  else
311
336
  root == "."
@@ -316,7 +341,7 @@ class Pathname < String
316
341
  def clean
317
342
  return self if self.empty?
318
343
 
319
- if @win32
344
+ if @win
320
345
  path = 0.chr * MAX_PATH
321
346
  if @@PathCanonicalize.call(path, self) > 0
322
347
  return Pathname.new(path.split(0.chr).first)
data/test/tc_pathname.rb CHANGED
@@ -14,6 +14,9 @@ class TC_Pathname < Test::Unit::TestCase
14
14
  def setup
15
15
  @abs_path = Pathname.new("/usr/local/bin")
16
16
  @rel_path = Pathname.new("usr/local/bin")
17
+
18
+ @abs_array = []
19
+ @rel_array = []
17
20
  end
18
21
 
19
22
  # Convenience method for test_plus
@@ -33,45 +36,45 @@ class TC_Pathname < Test::Unit::TestCase
33
36
  end
34
37
 
35
38
  def test_version
36
- assert_equal("1.2.0", Pathname::VERSION)
39
+ assert_equal("1.2.1", Pathname::VERSION)
37
40
  end
38
41
 
39
42
  def test_ascend
40
43
  assert_respond_to(@abs_path, :ascend)
41
44
  assert_nothing_raised{ @abs_path.ascend{} }
42
45
 
43
- abs_array = []
44
- rel_array = []
45
- @abs_path.ascend{ |path| abs_array.push(path) }
46
- @rel_path.ascend{ |path| rel_array.push(path) }
46
+ @abs_path.ascend{ |path| @abs_array.push(path) }
47
+ @rel_path.ascend{ |path| @rel_array.push(path) }
47
48
 
48
- assert_equal("/usr/local/bin", abs_array[0])
49
- assert_equal("/usr/local", abs_array[1])
50
- assert_equal("/usr", abs_array[2])
51
- assert_equal("/", abs_array[3])
49
+ assert_equal("/usr/local/bin", @abs_array[0])
50
+ assert_equal("/usr/local", @abs_array[1])
51
+ assert_equal("/usr", @abs_array[2])
52
+ assert_equal("/", @abs_array[3])
53
+ assert_equal(4, @abs_array.length)
52
54
 
53
- assert_equal("usr/local/bin", rel_array[0])
54
- assert_equal("usr/local", rel_array[1])
55
- assert_equal("usr", rel_array[2])
55
+ assert_equal("usr/local/bin", @rel_array[0])
56
+ assert_equal("usr/local", @rel_array[1])
57
+ assert_equal("usr", @rel_array[2])
58
+ assert_equal(3, @rel_array.length)
56
59
  end
57
60
 
58
61
  def test_descend
59
62
  assert_respond_to(@abs_path, :descend)
60
63
  assert_nothing_raised{ @abs_path.descend{} }
61
64
 
62
- abs_array = []
63
- rel_array = []
64
- @abs_path.descend{ |path| abs_array.push(path) }
65
- @rel_path.descend{ |path| rel_array.push(path) }
65
+ @abs_path.descend{ |path| @abs_array.push(path) }
66
+ @rel_path.descend{ |path| @rel_array.push(path) }
66
67
 
67
- assert_equal("/", abs_array[0])
68
- assert_equal("/usr", abs_array[1])
69
- assert_equal("/usr/local", abs_array[2])
70
- assert_equal("/usr/local/bin", abs_array[3])
68
+ assert_equal("/", @abs_array[0])
69
+ assert_equal("/usr", @abs_array[1])
70
+ assert_equal("/usr/local", @abs_array[2])
71
+ assert_equal("/usr/local/bin", @abs_array[3])
72
+ assert_equal(4, @abs_array.length)
71
73
 
72
- assert_equal("usr", rel_array[0])
73
- assert_equal("usr/local", rel_array[1])
74
- assert_equal("usr/local/bin", rel_array[2])
74
+ assert_equal("usr", @rel_array[0])
75
+ assert_equal("usr/local", @rel_array[1])
76
+ assert_equal("usr/local/bin", @rel_array[2])
77
+ assert_equal(3, @rel_array.length)
75
78
  end
76
79
 
77
80
  def test_unc
@@ -227,5 +230,9 @@ class TC_Pathname < Test::Unit::TestCase
227
230
 
228
231
  def teardown
229
232
  @abs_path = nil
233
+ @rel_path = nil
234
+
235
+ @abs_array.clear
236
+ @rel_array.clear
230
237
  end
231
238
  end
@@ -24,10 +24,11 @@ class TC_Pathname < Test::Unit::TestCase
24
24
 
25
25
  @abs_array = []
26
26
  @rel_array = []
27
+ @unc_array = []
27
28
  end
28
29
 
29
30
  def test_version
30
- assert_equal("1.2.0", Pathname::VERSION)
31
+ assert_equal("1.2.1", Pathname::VERSION)
31
32
  end
32
33
 
33
34
  # Convenience method for test_plus
@@ -57,6 +58,7 @@ class TC_Pathname < Test::Unit::TestCase
57
58
 
58
59
  @bpath.descend{ |path| @abs_array.push(path) }
59
60
  @npath.descend{ |path| @rel_array.push(path) }
61
+ @upath.descend{ |path| @unc_array.push(path) }
60
62
 
61
63
  assert_equal("C:", @abs_array[0])
62
64
  assert_equal("C:\\Program Files", @abs_array[1])
@@ -66,6 +68,9 @@ class TC_Pathname < Test::Unit::TestCase
66
68
  assert_equal("foo", @rel_array[0])
67
69
  assert_equal("foo\\bar", @rel_array[1])
68
70
  assert_equal("foo\\bar\\baz", @rel_array[2])
71
+
72
+ assert_equal("\\\\foo\\bar", @unc_array[0])
73
+ assert_equal("\\\\foo\\bar\\baz", @unc_array[1])
69
74
  end
70
75
 
71
76
  def test_ascend
@@ -74,15 +79,22 @@ class TC_Pathname < Test::Unit::TestCase
74
79
 
75
80
  @bpath.ascend{ |path| @abs_array.push(path) }
76
81
  @npath.ascend{ |path| @rel_array.push(path) }
82
+ @upath.ascend{ |path| @unc_array.push(path) }
77
83
 
78
84
  assert_equal("C:\\Program Files\\Windows NT\\Accessories", @abs_array[0])
79
85
  assert_equal("C:\\Program Files\\Windows NT", @abs_array[1])
80
86
  assert_equal("C:\\Program Files", @abs_array[2])
81
87
  assert_equal("C:", @abs_array[3])
88
+ assert_equal(4, @abs_array.length)
82
89
 
83
90
  assert_equal("foo\\bar\\baz", @rel_array[0])
84
91
  assert_equal("foo\\bar", @rel_array[1])
85
- assert_equal("foo", @rel_array[2])
92
+ assert_equal("foo", @rel_array[2])
93
+ assert_equal(3, @rel_array.length)
94
+
95
+ assert_equal("\\\\foo\\bar\\baz", @unc_array[0])
96
+ assert_equal("\\\\foo\\bar", @unc_array[1])
97
+ assert_equal(2, @unc_array.length)
86
98
  end
87
99
 
88
100
  # Fails due to PathIsURL for some reason
@@ -273,5 +285,6 @@ class TC_Pathname < Test::Unit::TestCase
273
285
 
274
286
  @abs_array.clear
275
287
  @rel_array.clear
288
+ @unc_array.clear
276
289
  end
277
290
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: pathname2
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.2.0
7
- date: 2005-08-30 00:00:00 -06:00
6
+ version: 1.2.1
7
+ date: 2005-09-01 00:00:00 -06:00
8
8
  summary: An alternate implementation of the Pathname class
9
9
  require_paths:
10
10
  - lib