win32-file 0.7.0 → 0.7.1
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.
- checksums.yaml +4 -4
- data/CHANGES +6 -0
- data/README +2 -6
- data/lib/win32/file.rb +45 -24
- data/test/test_win32_file_misc.rb +16 -16
- data/test/test_win32_file_path.rb +20 -1
- data/win32-file.gemspec +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 047468a1a793c4485f3e336084cbdab03ec973ee
|
4
|
+
data.tar.gz: f2cab49afe63c66b94995e83c0dcf7374ba52efa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eae986e7739d2fc6307f2ded1c1349ae1e0590248f01c98456f368215f93ba4499c358bc80986f3f80e2e83f0e62693f81565e795af1b9f71880ae965c751218
|
7
|
+
data.tar.gz: 04634af88ef4466e08e8506e3c661d3afabb7fe31cf42c34f22b7ef121b9d3b07c565ba1964e079448300f5c6fecc0231de5649a5500b362c75709b8bfd76e42
|
data/CHANGES
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
== 0.7.1 - 28-Apr-2014
|
2
|
+
* Modified all custom singleton methods to accept arguments that define either
|
3
|
+
to_str or to_path to be in line with MRI's behavior.
|
4
|
+
* Some internal changes for the long_path and short_path methods.
|
5
|
+
* Added some path tests.
|
6
|
+
|
1
7
|
== 0.7.0 - 16-Dec-2013
|
2
8
|
* Now requires Ruby 1.9 or later.
|
3
9
|
* Converted to use FFI instead of win32-api. Now works with JRuby, too.
|
data/README
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
* File.short_path
|
23
23
|
|
24
24
|
== Singleton Methods Redefined
|
25
|
-
* File.basename # UNC path issues
|
25
|
+
* File.basename # UNC path issues, root path differences.
|
26
26
|
* File.blksize # Not implemented in MRI
|
27
27
|
* File.blockdev? # Not implemented in MRI
|
28
28
|
* File.chardev? # Not implemented in MRI
|
@@ -55,15 +55,11 @@
|
|
55
55
|
|
56
56
|
https://github.com/djberg96/win32-file/issues
|
57
57
|
|
58
|
-
Or the Win32Utils project page at:
|
59
|
-
|
60
|
-
http://www.rubyforge.org/projects/win32utils.
|
61
|
-
|
62
58
|
== License
|
63
59
|
Artistic 2.0
|
64
60
|
|
65
61
|
== Copyright
|
66
|
-
(C) 2003-
|
62
|
+
(C) 2003-2014, Daniel J. Berger, All Rights Reserved
|
67
63
|
|
68
64
|
== Warranty
|
69
65
|
This package is provided "as is" and without any express or
|
data/lib/win32/file.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
require_relative 'file/constants'
|
2
|
+
require_relative 'file/structs'
|
3
|
+
require_relative 'file/functions'
|
4
4
|
require 'win32/file/stat'
|
5
5
|
|
6
6
|
class File
|
@@ -9,7 +9,7 @@ class File
|
|
9
9
|
extend Windows::File::Functions
|
10
10
|
|
11
11
|
# The version of the win32-file library
|
12
|
-
WIN32_FILE_VERSION = '0.7.
|
12
|
+
WIN32_FILE_VERSION = '0.7.1'
|
13
13
|
|
14
14
|
class << self
|
15
15
|
alias_method :join_orig, :join
|
@@ -36,7 +36,8 @@ class File
|
|
36
36
|
#
|
37
37
|
# This was reimplemented because the current version does not handle UNC
|
38
38
|
# paths properly, i.e. it should not return anything less than the root.
|
39
|
-
# In most other respects it is identical to the current implementation
|
39
|
+
# In most other respects it is identical to the current implementation,
|
40
|
+
# except that it does not strip the drive letter on a root path.
|
40
41
|
#
|
41
42
|
# Unlike MRI, this version will convert all forward slashes to
|
42
43
|
# backslashes automatically.
|
@@ -48,8 +49,8 @@ class File
|
|
48
49
|
# File.basename("\\\\foo\\bar") -> "\\\\foo\\bar"
|
49
50
|
#
|
50
51
|
def self.basename(file, suffix = nil)
|
51
|
-
|
52
|
-
|
52
|
+
file = string_check(file)
|
53
|
+
suffix = string_check(suffix) if suffix
|
53
54
|
|
54
55
|
return file if file.empty? # Return an empty path as-is.
|
55
56
|
|
@@ -99,7 +100,7 @@ class File
|
|
99
100
|
# File.dirname("\\\\foo\\bar") -> "\\\\foo\\bar"
|
100
101
|
#
|
101
102
|
def self.dirname(file)
|
102
|
-
|
103
|
+
file = string_check(file)
|
103
104
|
|
104
105
|
# Short circuit for empty paths
|
105
106
|
return '.' if file.empty?
|
@@ -160,6 +161,7 @@ class File
|
|
160
161
|
# the current version does not handle UNC paths properly.
|
161
162
|
#
|
162
163
|
def self.split(file)
|
164
|
+
file = string_check(file)
|
163
165
|
array = []
|
164
166
|
|
165
167
|
if file.empty? || PathIsRootW(file.wincode)
|
@@ -180,28 +182,32 @@ class File
|
|
180
182
|
# name in 8.3 format.
|
181
183
|
#
|
182
184
|
def self.long_path(file)
|
183
|
-
buffer =
|
184
|
-
wfile = file.wincode
|
185
|
+
buffer = FFI::Buffer.new(:wint_t, 1024, true)
|
186
|
+
wfile = string_check(file).wincode
|
185
187
|
|
186
|
-
|
188
|
+
length = GetLongPathNameW(wfile, buffer, buffer.size)
|
189
|
+
|
190
|
+
if length == 0 || length > buffer.size / 2
|
187
191
|
raise SystemCallError.new('GetLongPathName', FFI.errno)
|
188
192
|
end
|
189
193
|
|
190
|
-
buffer.wstrip
|
194
|
+
buffer.read_bytes(length * 2).wstrip
|
191
195
|
end
|
192
196
|
|
193
197
|
# Returns +path+ in 8.3 format. For example, 'c:\documentation.doc'
|
194
198
|
# would be returned as 'c:\docume~1.doc'.
|
195
199
|
#
|
196
200
|
def self.short_path(file)
|
197
|
-
buffer =
|
198
|
-
wfile = file.wincode
|
201
|
+
buffer = FFI::Buffer.new(:wint_t, 1024, true)
|
202
|
+
wfile = string_check(file).wincode
|
203
|
+
|
204
|
+
length = GetShortPathNameW(wfile, buffer, buffer.size)
|
199
205
|
|
200
|
-
if
|
206
|
+
if length == 0 || length > buffer.size / 2
|
201
207
|
raise SystemCallError.new('GetShortPathName', FFI.errno)
|
202
208
|
end
|
203
209
|
|
204
|
-
buffer.wstrip
|
210
|
+
buffer.read_bytes(length * 2).wstrip
|
205
211
|
end
|
206
212
|
|
207
213
|
# Creates a symbolic link called +new_name+ for the file or directory
|
@@ -211,8 +217,8 @@ class File
|
|
211
217
|
# returns nil as per MRI.
|
212
218
|
#
|
213
219
|
def self.symlink(target, link)
|
214
|
-
|
215
|
-
|
220
|
+
target = string_check(target)
|
221
|
+
link = string_check(link)
|
216
222
|
|
217
223
|
flags = File.directory?(target) ? 1 : 0
|
218
224
|
|
@@ -230,8 +236,9 @@ class File
|
|
230
236
|
#
|
231
237
|
def self.symlink?(file)
|
232
238
|
return false unless File.exists?(file)
|
239
|
+
|
233
240
|
bool = false
|
234
|
-
wfile = file.wincode
|
241
|
+
wfile = string_check(file).wincode
|
235
242
|
|
236
243
|
attrib = GetFileAttributesW(wfile)
|
237
244
|
|
@@ -269,6 +276,8 @@ class File
|
|
269
276
|
# On Windows we only modify the realpath method if the file is a symlink.
|
270
277
|
#
|
271
278
|
def self.realdirpath(file, relative_to = nil)
|
279
|
+
file = string_check(file)
|
280
|
+
|
272
281
|
if symlink?(file)
|
273
282
|
if relative_to
|
274
283
|
File.join(relative_to, File.basename(readlink(file)))
|
@@ -287,6 +296,9 @@ class File
|
|
287
296
|
# On Windows we only modify the realpath method if the file is a symlink.
|
288
297
|
#
|
289
298
|
def self.realpath(file, relative_to = nil)
|
299
|
+
file = string_check(file)
|
300
|
+
relative_to = string_check(relative_to) if relative_to
|
301
|
+
|
290
302
|
if symlink?(file)
|
291
303
|
if relative_to
|
292
304
|
result = File.join(relative_to, File.basename(readlink(file)))
|
@@ -306,6 +318,8 @@ class File
|
|
306
318
|
# Returns the path of the of the symbolic link referred to by +file+.
|
307
319
|
#
|
308
320
|
def self.readlink(file)
|
321
|
+
file = string_check(file)
|
322
|
+
|
309
323
|
if exists?(file) && !symlink?(file)
|
310
324
|
raise SystemCallError.new(22) # EINVAL, match the spec
|
311
325
|
end
|
@@ -480,10 +494,17 @@ class File
|
|
480
494
|
def stat
|
481
495
|
File::Stat.new(self.path)
|
482
496
|
end
|
483
|
-
end
|
484
497
|
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
498
|
+
# Private singleton methods
|
499
|
+
class << self
|
500
|
+
private
|
501
|
+
|
502
|
+
# Simulate Ruby's string checking
|
503
|
+
def string_check(arg)
|
504
|
+
return arg if arg.is_a?(String)
|
505
|
+
return arg.send(:to_str) if arg.respond_to?(:to_str, true) # MRI allows private to_str
|
506
|
+
return arg.to_path if arg.respond_to?(:to_path)
|
507
|
+
raise TypeError
|
508
|
+
end
|
509
|
+
end
|
489
510
|
end
|
@@ -1,16 +1,16 @@
|
|
1
|
-
########################################################################
|
2
|
-
# Miscellaneous tests for win32-file that didn't fit anywhere else.
|
3
|
-
########################################################################
|
4
|
-
require 'win32/file'
|
5
|
-
require 'test-unit'
|
6
|
-
|
7
|
-
class TC_Win32_File_Misc < Test::Unit::TestCase
|
8
|
-
test "version constant is set to expected value" do
|
9
|
-
assert_equal('0.7.
|
10
|
-
end
|
11
|
-
|
12
|
-
test "ffi functions are private" do
|
13
|
-
assert_not_respond_to(File, :CloseHandle)
|
14
|
-
assert_not_respond_to(File, :CreateFileW)
|
15
|
-
end
|
16
|
-
end
|
1
|
+
########################################################################
|
2
|
+
# Miscellaneous tests for win32-file that didn't fit anywhere else.
|
3
|
+
########################################################################
|
4
|
+
require 'win32/file'
|
5
|
+
require 'test-unit'
|
6
|
+
|
7
|
+
class TC_Win32_File_Misc < Test::Unit::TestCase
|
8
|
+
test "version constant is set to expected value" do
|
9
|
+
assert_equal('0.7.1', File::WIN32_FILE_VERSION)
|
10
|
+
end
|
11
|
+
|
12
|
+
test "ffi functions are private" do
|
13
|
+
assert_not_respond_to(File, :CloseHandle)
|
14
|
+
assert_not_respond_to(File, :CreateFileW)
|
15
|
+
end
|
16
|
+
end
|
@@ -6,6 +6,7 @@
|
|
6
6
|
#############################################################################
|
7
7
|
require 'test-unit'
|
8
8
|
require 'win32/file'
|
9
|
+
require 'pathname'
|
9
10
|
|
10
11
|
class TC_Win32_File_Path < Test::Unit::TestCase
|
11
12
|
def self.startup
|
@@ -97,6 +98,11 @@ class TC_Win32_File_Path < Test::Unit::TestCase
|
|
97
98
|
assert_equal("foo.txt", File.basename("foo.txt\\\\\\"))
|
98
99
|
end
|
99
100
|
|
101
|
+
test "basename method handles arguments that honor to_str or to_path" do
|
102
|
+
assert_equal("foo.txt", File.basename(Pathname.new("C:/blah/blah/foo.txt")))
|
103
|
+
assert_equal("foo", File.basename(Pathname.new("C:/blah/blah/foo.txt"), Pathname.new(".*")))
|
104
|
+
end
|
105
|
+
|
100
106
|
test "dirname basic functionality" do
|
101
107
|
assert_respond_to(File, :dirname)
|
102
108
|
assert_nothing_raised{ File.dirname("C:\\foo") }
|
@@ -158,11 +164,15 @@ class TC_Win32_File_Path < Test::Unit::TestCase
|
|
158
164
|
assert_equal("\\\\foo\\bar", File.dirname("\\\\foo\\bar\\baz\\"))
|
159
165
|
end
|
160
166
|
|
161
|
-
test "argument to dirname must be a
|
167
|
+
test "argument to dirname must be a stringy object" do
|
162
168
|
assert_raises(TypeError){ File.dirname(nil) }
|
163
169
|
assert_raises(TypeError){ File.dirname(['foo', 'bar']) }
|
164
170
|
end
|
165
171
|
|
172
|
+
test "dirname method handles arguments that honor to_str or to_path" do
|
173
|
+
assert_equal("C:\\blah\\blah", File.dirname(Pathname.new("C:/blah/blah/foo.txt")))
|
174
|
+
end
|
175
|
+
|
166
176
|
test "split method basic functionality" do
|
167
177
|
assert_respond_to(File, :split)
|
168
178
|
assert_nothing_raised{ File.split("C:\\foo\\bar") }
|
@@ -203,6 +213,15 @@ class TC_Win32_File_Path < Test::Unit::TestCase
|
|
203
213
|
assert_equal("C:\\foo\\bar", path)
|
204
214
|
end
|
205
215
|
|
216
|
+
test "split method accepts stringy arguments" do
|
217
|
+
assert_equal(["C:\\foo", "bar"], File.split(Pathname.new("C:/foo/bar")))
|
218
|
+
end
|
219
|
+
|
220
|
+
test "split requires a stringy argument or a TypeError is raised" do
|
221
|
+
assert_raise(TypeError){ File.split(nil) }
|
222
|
+
assert_raise(TypeError){ File.split([]) }
|
223
|
+
end
|
224
|
+
|
206
225
|
test "File.long_path basic functionality" do
|
207
226
|
assert_respond_to(File, :long_path)
|
208
227
|
assert_nothing_raised{ File.long_path(@short_file) }
|
data/win32-file.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: win32-file
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel J. Berger
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-04-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi
|
@@ -96,13 +96,13 @@ extra_rdoc_files:
|
|
96
96
|
- MANIFEST
|
97
97
|
files:
|
98
98
|
- CHANGES
|
99
|
+
- MANIFEST
|
100
|
+
- README
|
101
|
+
- Rakefile
|
102
|
+
- lib/win32/file.rb
|
99
103
|
- lib/win32/file/constants.rb
|
100
104
|
- lib/win32/file/functions.rb
|
101
105
|
- lib/win32/file/structs.rb
|
102
|
-
- lib/win32/file.rb
|
103
|
-
- MANIFEST
|
104
|
-
- Rakefile
|
105
|
-
- README
|
106
106
|
- test/test_win32_file_link.rb
|
107
107
|
- test/test_win32_file_misc.rb
|
108
108
|
- test/test_win32_file_path.rb
|
@@ -128,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
128
|
version: '0'
|
129
129
|
requirements: []
|
130
130
|
rubyforge_project: win32utils
|
131
|
-
rubygems_version: 2.
|
131
|
+
rubygems_version: 2.2.2
|
132
132
|
signing_key:
|
133
133
|
specification_version: 4
|
134
134
|
summary: Extra or redefined methods for the File class on Windows.
|