pathname2 1.2.1 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +19 -13
- data/lib/pathname2.rb +50 -20
- data/test/tc_pathname.rb +6 -1
- data/test/tc_pathname_win.rb +31 -6
- metadata +2 -2
data/CHANGES
CHANGED
@@ -1,13 +1,19 @@
|
|
1
|
-
== 1.
|
2
|
-
*
|
3
|
-
*
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
*
|
1
|
+
== 1.3.0 - 28-Oct-2005
|
2
|
+
* Added the short_path and long_path methods for MS Windows.
|
3
|
+
* Optimization for the '+' method on Unix.
|
4
|
+
* Added some examples under the 'examples' directory.
|
5
|
+
* More tests added and some minor changes to the test suite in general.
|
6
|
+
|
7
|
+
== 1.2.1 - 1-Sep-2005
|
8
|
+
* Bug fix for the ascend and descend methods wrt Windows and UNC paths.
|
9
|
+
* More tests added for ascend and descend methods.
|
10
|
+
|
11
|
+
== 1.2.0 - 29-Aug-2005
|
12
|
+
* Added the 'ascend' and 'descend' methods.
|
13
|
+
* Added corresponding test suite additions.
|
14
|
+
|
15
|
+
== 1.1.0 - 13-Jul-2005
|
16
|
+
* Added the 'find' facade.
|
17
|
+
|
18
|
+
== 1.0.0 - 11-Jun-2005
|
19
|
+
* Initial release
|
data/lib/pathname2.rb
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
#
|
12
12
|
# == Usage
|
13
13
|
#
|
14
|
-
# require "
|
14
|
+
# require "pathname2"
|
15
15
|
#
|
16
16
|
# # Unix
|
17
17
|
# path1 = Pathname.new("/foo/bar/baz")
|
@@ -58,6 +58,12 @@ class Pathname < String
|
|
58
58
|
@@PathIsRelative = Win32API.new("shlwapi","PathIsRelative","P","L")
|
59
59
|
@@PathFileExists = Win32API.new("shlwapi","PathFileExists","P","L")
|
60
60
|
@@PathUndecorate = Win32API.new("shlwapi","PathUndecorate","P","L")
|
61
|
+
|
62
|
+
@@GetShortPathName =
|
63
|
+
Win32API.new("kernel32","GetShortPathName","PPL","L")
|
64
|
+
|
65
|
+
@@GetLongPathName =
|
66
|
+
Win32API.new("kernel32","GetLongPathName","PPL","L")
|
61
67
|
|
62
68
|
@@PathGetDriveNumber =
|
63
69
|
Win32API.new("shlwapi","PathGetDriveNumber","P","L")
|
@@ -69,7 +75,7 @@ class Pathname < String
|
|
69
75
|
Win32API.new("shlwapi", "PathRemoveBackslash", "P", "P")
|
70
76
|
end
|
71
77
|
|
72
|
-
VERSION = "1.
|
78
|
+
VERSION = "1.3.0"
|
73
79
|
MAX_PATH = 260
|
74
80
|
|
75
81
|
# Creates and returns a new Pathname object.
|
@@ -115,16 +121,44 @@ class Pathname < String
|
|
115
121
|
@@PathUndecorate.call(buf)
|
116
122
|
Pathname.new(buf.split(0.chr).first)
|
117
123
|
end
|
118
|
-
|
124
|
+
|
125
|
+
# Win32 only
|
126
|
+
#
|
127
|
+
# Returns the short path for a long path name. For example,
|
128
|
+
# C:\Program Files\Java would return C:\Progra~1\Java.
|
129
|
+
def short_path
|
130
|
+
unless @win
|
131
|
+
raise NotImplementedError, "not supported on this platform"
|
132
|
+
end
|
133
|
+
buf = 0.chr * MAX_PATH
|
134
|
+
buf[0..self.length-1] = self
|
135
|
+
@@GetShortPathName.call(self, buf, buf.length)
|
136
|
+
Pathname.new(buf.split(0.chr).first)
|
137
|
+
end
|
138
|
+
|
139
|
+
# Win32 only
|
140
|
+
#
|
141
|
+
# Returns the long path for a long path name. For example,
|
142
|
+
# C:\Progra~1\Java would return C:\Program Files\Java.
|
143
|
+
def long_path
|
144
|
+
unless @win
|
145
|
+
raise NotImplementedError, "not supported on this platform"
|
146
|
+
end
|
147
|
+
buf = 0.chr * MAX_PATH
|
148
|
+
buf[0..self.length-1] = self
|
149
|
+
@@GetLongPathName.call(self, buf, buf.length)
|
150
|
+
Pathname.new(buf.split(0.chr).first)
|
151
|
+
end
|
152
|
+
|
119
153
|
# Removes trailing slash, if present.
|
120
154
|
def pstrip
|
121
155
|
if @win
|
122
156
|
@@PathRemoveBackslash.call(self)
|
123
|
-
|
157
|
+
strip!
|
124
158
|
else
|
125
159
|
if self[-1] == @sep
|
126
|
-
|
127
|
-
|
160
|
+
strip!
|
161
|
+
chop!
|
128
162
|
end
|
129
163
|
end
|
130
164
|
self
|
@@ -140,7 +174,7 @@ class Pathname < String
|
|
140
174
|
|
141
175
|
# Yields each component of the path name to a block.
|
142
176
|
def each
|
143
|
-
|
177
|
+
to_a.each{ |element| yield element }
|
144
178
|
end
|
145
179
|
|
146
180
|
# Yields each component of the path, concatenating the next component on
|
@@ -166,7 +200,7 @@ class Pathname < String
|
|
166
200
|
yield root if absolute?
|
167
201
|
end
|
168
202
|
|
169
|
-
|
203
|
+
each{ |element|
|
170
204
|
if @win && unc?
|
171
205
|
next if root.to_a.include?(element)
|
172
206
|
end
|
@@ -187,11 +221,11 @@ class Pathname < String
|
|
187
221
|
return
|
188
222
|
end
|
189
223
|
|
190
|
-
n =
|
224
|
+
n = to_a.length
|
191
225
|
|
192
226
|
while n > 0
|
193
|
-
path =
|
194
|
-
if
|
227
|
+
path = to_a[0..n-1].join(@sep)
|
228
|
+
if absolute?
|
195
229
|
if @win && unc?
|
196
230
|
path = "\\\\" << path
|
197
231
|
end
|
@@ -232,12 +266,8 @@ class Pathname < String
|
|
232
266
|
dir = Pathname.new(buf.split(0.chr).first)
|
233
267
|
end
|
234
268
|
else
|
235
|
-
dir =
|
236
|
-
while dir != "/" && dir != "."
|
237
|
-
dir = File.dirname(dir)
|
238
|
-
end
|
269
|
+
dir = "/" if self =~ /^\//
|
239
270
|
end
|
240
|
-
dir = "." if dir.empty?
|
241
271
|
dir
|
242
272
|
end
|
243
273
|
|
@@ -313,11 +343,11 @@ class Pathname < String
|
|
313
343
|
# If the string is an absolute directory, return it
|
314
344
|
return string if string.absolute?
|
315
345
|
|
316
|
-
array =
|
346
|
+
array = to_a + string.to_a
|
317
347
|
new_string = array.join(@sep)
|
318
348
|
|
319
|
-
unless
|
320
|
-
new_string = @sep + new_string
|
349
|
+
unless relative? || @win
|
350
|
+
new_string = @sep + new_string # Add root path back if needed
|
321
351
|
end
|
322
352
|
|
323
353
|
Pathname.new(new_string).clean
|
@@ -351,7 +381,7 @@ class Pathname < String
|
|
351
381
|
end
|
352
382
|
|
353
383
|
final = []
|
354
|
-
|
384
|
+
to_a.each{ |element|
|
355
385
|
next if element == "."
|
356
386
|
final.push(element)
|
357
387
|
if element == ".." && self != ".."
|
data/test/tc_pathname.rb
CHANGED
@@ -7,6 +7,11 @@ Dir.chdir ".." if File.basename(Dir.pwd) == "test"
|
|
7
7
|
$LOAD_PATH.unshift Dir.pwd
|
8
8
|
$LOAD_PATH.unshift Dir.pwd + "/lib"
|
9
9
|
|
10
|
+
if PLATFORM.match("mswin")
|
11
|
+
STDERR.puts("Please run 'tc_pathname_win.rb' instead.")
|
12
|
+
exit
|
13
|
+
end
|
14
|
+
|
10
15
|
require "pathname2"
|
11
16
|
require "test/unit"
|
12
17
|
|
@@ -36,7 +41,7 @@ class TC_Pathname < Test::Unit::TestCase
|
|
36
41
|
end
|
37
42
|
|
38
43
|
def test_version
|
39
|
-
assert_equal("1.
|
44
|
+
assert_equal("1.3.0", Pathname::VERSION)
|
40
45
|
end
|
41
46
|
|
42
47
|
def test_ascend
|
data/test/tc_pathname_win.rb
CHANGED
@@ -1,19 +1,25 @@
|
|
1
|
-
|
2
|
-
#
|
1
|
+
######################################################
|
2
|
+
# tc_pathname_win.rb
|
3
3
|
#
|
4
|
-
#
|
5
|
-
|
4
|
+
# MS Windows test suite for the Pathname class.
|
5
|
+
######################################################
|
6
6
|
Dir.chdir ".." if File.basename(Dir.pwd) == "test"
|
7
7
|
$LOAD_PATH.unshift Dir.pwd
|
8
8
|
$LOAD_PATH.unshift Dir.pwd + "/lib"
|
9
9
|
|
10
|
+
unless PLATFORM.match("mswin")
|
11
|
+
STDERR.puts("Please run 'tc_pathname.rb' instead.")
|
12
|
+
exit
|
13
|
+
end
|
14
|
+
|
10
15
|
require "pathname2"
|
11
16
|
require "test/unit"
|
12
17
|
|
13
|
-
class
|
18
|
+
class TC_Pathname_MSWin < Test::Unit::TestCase
|
14
19
|
def setup
|
15
20
|
@fpath = Pathname.new("C:/Program Files/Windows NT/Accessories")
|
16
21
|
@bpath = Pathname.new("C:\\Program Files\\Windows NT\\Accessories")
|
22
|
+
@spath = Pathname.new("C:\\PROGRA~1\\WINDOW~1\\ACCESS~1")
|
17
23
|
@upath = Pathname.new("\\\\foo\\bar\\baz")
|
18
24
|
@npath = Pathname.new("foo\\bar\\baz")
|
19
25
|
@rpath = Pathname.new("Z:\\")
|
@@ -28,7 +34,7 @@ class TC_Pathname < Test::Unit::TestCase
|
|
28
34
|
end
|
29
35
|
|
30
36
|
def test_version
|
31
|
-
assert_equal("1.
|
37
|
+
assert_equal("1.3.0", Pathname::VERSION)
|
32
38
|
end
|
33
39
|
|
34
40
|
# Convenience method for test_plus
|
@@ -47,6 +53,24 @@ class TC_Pathname < Test::Unit::TestCase
|
|
47
53
|
assert_equal(int, result)
|
48
54
|
end
|
49
55
|
|
56
|
+
def test_short_path
|
57
|
+
assert_respond_to(@bpath, :short_path)
|
58
|
+
assert_nothing_raised{ @bpath.short_path }
|
59
|
+
assert_kind_of(Pathname, @bpath.short_path)
|
60
|
+
assert_equal("C:\\PROGRA~1\\WINDOW~1\\ACCESS~1", @bpath.short_path)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_long_path
|
64
|
+
assert_respond_to(@spath, :long_path)
|
65
|
+
assert_nothing_raised{ @spath.long_path }
|
66
|
+
assert_kind_of(Pathname, @spath.long_path)
|
67
|
+
|
68
|
+
assert_equal(
|
69
|
+
"C:\\Program Files\\Windows NT\\Accessories",
|
70
|
+
@spath.long_path
|
71
|
+
)
|
72
|
+
end
|
73
|
+
|
50
74
|
def test_each
|
51
75
|
assert_respond_to(@fpath, :each)
|
52
76
|
assert_nothing_raised{ @fpath.each{ |e| } }
|
@@ -275,6 +299,7 @@ class TC_Pathname < Test::Unit::TestCase
|
|
275
299
|
def teardown
|
276
300
|
@fpath = nil
|
277
301
|
@bpath = nil
|
302
|
+
@spath = nil
|
278
303
|
@upath = nil
|
279
304
|
@npath = nil
|
280
305
|
@rpath = nil
|
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.
|
7
|
-
date: 2005-
|
6
|
+
version: 1.3.0
|
7
|
+
date: 2005-10-26 00:00:00 -06:00
|
8
8
|
summary: An alternate implementation of the Pathname class
|
9
9
|
require_paths:
|
10
10
|
- lib
|