pathname2 1.4.2 → 1.4.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +3 -0
- data/lib/pathname2.rb +40 -30
- data/test/tc_pathname.rb +8 -1
- data/test/tc_pathname_win.rb +6 -0
- metadata +2 -2
data/CHANGES
CHANGED
data/lib/pathname2.rb
CHANGED
@@ -6,8 +6,8 @@
|
|
6
6
|
# All functionality from File, FileTest, and Dir is included, using a facade
|
7
7
|
# pattern.
|
8
8
|
#
|
9
|
-
# This class works on both Unix and
|
10
|
-
# that forward slashes are converted to backslashes on
|
9
|
+
# This class works on both Unix and Windows, including UNC path names. Note
|
10
|
+
# that forward slashes are converted to backslashes on Windows systems.
|
11
11
|
#
|
12
12
|
# == Usage
|
13
13
|
#
|
@@ -20,7 +20,7 @@
|
|
20
20
|
# path1 + path2 # "/foo/bar/zap"
|
21
21
|
# path1.dirname # "/foo/bar"
|
22
22
|
#
|
23
|
-
# #
|
23
|
+
# # Windows
|
24
24
|
# path1 = Pathname.new("C:\\foo\\bar\\baz")
|
25
25
|
# path2 = Pathname.new("..\\zap")
|
26
26
|
#
|
@@ -34,7 +34,7 @@
|
|
34
34
|
# imperator on IRC (irc.freenode.net)
|
35
35
|
#
|
36
36
|
# == Copyright
|
37
|
-
# Copyright (c) 2005 Daniel J. Berger.
|
37
|
+
# Copyright (c) 2005-2006 Daniel J. Berger.
|
38
38
|
# Licensed under the same terms as Ruby itself.
|
39
39
|
#
|
40
40
|
require "facade"
|
@@ -48,41 +48,41 @@ class Pathname < String
|
|
48
48
|
|
49
49
|
alias :_plus_ :+ # Used to prevent infinite loops in some cases
|
50
50
|
|
51
|
-
if
|
52
|
-
require
|
53
|
-
@@PathStripToRoot = Win32API.new(
|
54
|
-
@@PathIsUNC = Win32API.new(
|
55
|
-
@@PathIsURL = Win32API.new(
|
56
|
-
@@PathCanonicalize = Win32API.new(
|
57
|
-
@@PathAppend = Win32API.new(
|
58
|
-
@@PathIsRoot = Win32API.new(
|
59
|
-
@@PathIsDirectory = Win32API.new(
|
60
|
-
@@PathIsRelative = Win32API.new(
|
61
|
-
@@PathFileExists = Win32API.new(
|
62
|
-
@@PathUndecorate = Win32API.new(
|
51
|
+
if RUBY_PLATFORM.match('mswin')
|
52
|
+
require 'Win32API'
|
53
|
+
@@PathStripToRoot = Win32API.new('shlwapi', 'PathStripToRoot', 'P', 'L')
|
54
|
+
@@PathIsUNC = Win32API.new('shlwapi', 'PathIsUNC', 'P', 'L')
|
55
|
+
@@PathIsURL = Win32API.new('shlwapi', 'PathIsURL', 'P', 'L')
|
56
|
+
@@PathCanonicalize = Win32API.new('shlwapi', 'PathCanonicalize','PP','L')
|
57
|
+
@@PathAppend = Win32API.new('shlwapi', 'PathAppend', 'PP', 'L')
|
58
|
+
@@PathIsRoot = Win32API.new('shlwapi', 'PathIsRoot', 'P', 'L')
|
59
|
+
@@PathIsDirectory = Win32API.new('shlwapi', 'PathIsDirectory', 'P', 'L')
|
60
|
+
@@PathIsRelative = Win32API.new('shlwapi', 'PathIsRelative', 'P', 'L')
|
61
|
+
@@PathFileExists = Win32API.new('shlwapi', 'PathFileExists', 'P', 'L')
|
62
|
+
@@PathUndecorate = Win32API.new('shlwapi', 'PathUndecorate', 'P', 'L')
|
63
63
|
|
64
64
|
@@GetShortPathName =
|
65
|
-
Win32API.new(
|
65
|
+
Win32API.new('kernel32', 'GetShortPathName', 'PPL', 'L')
|
66
66
|
|
67
67
|
@@GetLongPathName =
|
68
|
-
Win32API.new(
|
68
|
+
Win32API.new('kernel32', 'GetLongPathName', 'PPL', 'L')
|
69
69
|
|
70
70
|
@@PathGetDriveNumber =
|
71
|
-
Win32API.new(
|
71
|
+
Win32API.new('shlwapi', 'PathGetDriveNumber', 'P', 'L')
|
72
72
|
|
73
73
|
@@PathCreateFromUrl =
|
74
|
-
Win32API.new(
|
74
|
+
Win32API.new('shlwapi', 'PathCreateFromUrl', 'PPPL', 'L')
|
75
75
|
|
76
76
|
@@PathRemoveBackslash =
|
77
|
-
Win32API.new(
|
77
|
+
Win32API.new('shlwapi', 'PathRemoveBackslash', 'P', 'P')
|
78
78
|
end
|
79
79
|
|
80
|
-
VERSION =
|
80
|
+
VERSION = '1.4.3'
|
81
81
|
MAX_PATH = 260
|
82
82
|
|
83
83
|
# Creates and returns a new Pathname object.
|
84
84
|
#
|
85
|
-
# On
|
85
|
+
# On Windows systems, all forward slashes are replaced with backslashes.
|
86
86
|
def initialize(path)
|
87
87
|
if path.length > MAX_PATH
|
88
88
|
msg = "string too long. maximum string length is " + MAX_PATH.to_s
|
@@ -90,7 +90,7 @@ class Pathname < String
|
|
90
90
|
end
|
91
91
|
|
92
92
|
@sep = File::ALT_SEPARATOR || File::SEPARATOR
|
93
|
-
@win =
|
93
|
+
@win = RUBY_PLATFORM.match('mswin')
|
94
94
|
|
95
95
|
# Handle File URL's for Windows
|
96
96
|
if @win
|
@@ -109,6 +109,16 @@ class Pathname < String
|
|
109
109
|
path = path.tr("/", @sep) if @win
|
110
110
|
super(path)
|
111
111
|
end
|
112
|
+
|
113
|
+
# Returns a real (absolute) pathname of +self+ in the actual filesystem.
|
114
|
+
#
|
115
|
+
# Unlike most Pathname methods, this one assumes that the path actually
|
116
|
+
# exists on your filesystem. If it doesn't, an error is raised.
|
117
|
+
def realpath
|
118
|
+
pwd = Pathname.new(Dir.pwd)
|
119
|
+
File.stat(self) # Check to ensure that the path exists
|
120
|
+
pwd + self
|
121
|
+
end
|
112
122
|
|
113
123
|
# Returns the children of the directory, files and subdirectories, as an
|
114
124
|
# array of Pathname objects. If you set +with_directory+ to +false+, then
|
@@ -132,7 +142,7 @@ class Pathname < String
|
|
132
142
|
result
|
133
143
|
end
|
134
144
|
|
135
|
-
#
|
145
|
+
# Windows only
|
136
146
|
#
|
137
147
|
# Removes the decoration from a path string. For example,
|
138
148
|
# C:\Path\File[5].txt would become C:\Path\File.txt. Non-destructive.
|
@@ -146,7 +156,7 @@ class Pathname < String
|
|
146
156
|
Pathname.new(buf.split(0.chr).first)
|
147
157
|
end
|
148
158
|
|
149
|
-
#
|
159
|
+
# Windows only
|
150
160
|
#
|
151
161
|
# Performs the substitution of Pathname#undecorate in place.
|
152
162
|
def undecorate!
|
@@ -160,7 +170,7 @@ class Pathname < String
|
|
160
170
|
self
|
161
171
|
end
|
162
172
|
|
163
|
-
#
|
173
|
+
# Windows only
|
164
174
|
#
|
165
175
|
# Returns the short path for a long path name. For example,
|
166
176
|
# C:\Program Files\Java would return C:\Progra~1\Java.
|
@@ -174,7 +184,7 @@ class Pathname < String
|
|
174
184
|
Pathname.new(buf.split(0.chr).first)
|
175
185
|
end
|
176
186
|
|
177
|
-
#
|
187
|
+
# Windows only
|
178
188
|
#
|
179
189
|
# Returns the long path for a long path name. For example,
|
180
190
|
# C:\Progra~1\Java would return C:\Program Files\Java.
|
@@ -333,7 +343,7 @@ class Pathname < String
|
|
333
343
|
end
|
334
344
|
end
|
335
345
|
|
336
|
-
#
|
346
|
+
# Windows only
|
337
347
|
#
|
338
348
|
# Determines if the string is a valid Universal Naming Convention (UNC)
|
339
349
|
# for a server and share path.
|
@@ -345,7 +355,7 @@ class Pathname < String
|
|
345
355
|
@@PathIsUNC.call(self) > 0
|
346
356
|
end
|
347
357
|
|
348
|
-
#
|
358
|
+
# Windows only
|
349
359
|
#
|
350
360
|
# Returns the drive number that corresponds to the root, or nil if not
|
351
361
|
# applicable.
|
data/test/tc_pathname.rb
CHANGED
@@ -24,6 +24,7 @@ require "test/unit"
|
|
24
24
|
|
25
25
|
class TC_Pathname < Test::Unit::TestCase
|
26
26
|
def setup
|
27
|
+
@pwd = Dir.pwd
|
27
28
|
@abs_path = Pathname.new("/usr/local/bin")
|
28
29
|
@rel_path = Pathname.new("usr/local/bin")
|
29
30
|
@trl_path = Pathname.new("/usr/local/bin/")
|
@@ -71,7 +72,13 @@ class TC_Pathname < Test::Unit::TestCase
|
|
71
72
|
end
|
72
73
|
|
73
74
|
def test_version
|
74
|
-
assert_equal("1.4.
|
75
|
+
assert_equal("1.4.3", Pathname::VERSION)
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_realpath
|
79
|
+
assert_respond_to(@abs_path, :realpath)
|
80
|
+
assert_equal(@pwd, Pathname.new('.').realpath)
|
81
|
+
assert_raises(Errno::ENOENT){ Pathname.new('../bogus').realpath }
|
75
82
|
end
|
76
83
|
|
77
84
|
# These tests taken directly from Tanaka's pathname.rb. The one failure
|
data/test/tc_pathname_win.rb
CHANGED
@@ -80,6 +80,12 @@ class TC_Pathname_MSWin < Test::Unit::TestCase
|
|
80
80
|
Pathname.new(to).relative_path_from(from)
|
81
81
|
}
|
82
82
|
end
|
83
|
+
|
84
|
+
def test_realpath
|
85
|
+
assert_respond_to(@abs_path, :realpath)
|
86
|
+
assert_equal(@cur_path, Pathname.new('.').realpath)
|
87
|
+
assert_raises(Errno::ENOENT){ Pathname.new('../bogus').realpath }
|
88
|
+
end
|
83
89
|
|
84
90
|
def test_relative_path_from
|
85
91
|
assert_relpath("..\\a", "a", "b")
|
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.4.
|
7
|
-
date: 2006-
|
6
|
+
version: 1.4.3
|
7
|
+
date: 2006-03-03 00:00:00 -07:00
|
8
8
|
summary: An alternate implementation of the Pathname class
|
9
9
|
require_paths:
|
10
10
|
- lib
|