summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2024-05-22 00:29:34 (GMT)
committerGitHub <noreply@github.com>2024-05-22 00:29:34 (GMT)
commitf15fbe9991b9cb93d0b4c08e9931ac0770c4e40a (patch)
treeef94a830f296172cfcf69e179b1996d372c39193 /Lib
parentf371565169438c3b93763f298d5171985607ab5d (diff)
downloadcpython-f15fbe9991b9cb93d0b4c08e9931ac0770c4e40a.zip
cpython-f15fbe9991b9cb93d0b4c08e9931ac0770c4e40a.tar.gz
cpython-f15fbe9991b9cb93d0b4c08e9931ac0770c4e40a.tar.bz2
gh-118507 : Refactor `nt._path_is*` to improve applicability for other cases (GH-118755)
(cherry picked from commit b64182550f73e556344bd754d32e3be5d22a74e1) Co-authored-by: Nice Zombies <nineteendo19d0@gmail.com>
Diffstat (limited to 'Lib')
-rw-r--r--Lib/ntpath.py21
-rw-r--r--Lib/test/test_genericpath.py16
-rw-r--r--Lib/test/test_ntpath.py25
3 files changed, 38 insertions, 24 deletions
diff --git a/Lib/ntpath.py b/Lib/ntpath.py
index b833e0b..8d972cd 100644
--- a/Lib/ntpath.py
+++ b/Lib/ntpath.py
@@ -288,21 +288,6 @@ def dirname(p):
return split(p)[0]
-# Is a path a junction?
-
-if hasattr(os.stat_result, 'st_reparse_tag'):
- def isjunction(path):
- """Test whether a path is a junction"""
- try:
- st = os.lstat(path)
- except (OSError, ValueError, AttributeError):
- return False
- return st.st_reparse_tag == stat.IO_REPARSE_TAG_MOUNT_POINT
-else:
- # Use genericpath.isjunction as imported above
- pass
-
-
# Is a path a mount point?
# Any drive letter root (eg c:\)
# Any share UNC (eg \\server\share)
@@ -911,13 +896,15 @@ def commonpath(paths):
try:
- # The isdir(), isfile(), islink() and exists() implementations in
- # genericpath use os.stat(). This is overkill on Windows. Use simpler
+ # The isdir(), isfile(), islink(), exists() and lexists() implementations
+ # in genericpath use os.stat(). This is overkill on Windows. Use simpler
# builtin functions if they are available.
from nt import _path_isdir as isdir
from nt import _path_isfile as isfile
from nt import _path_islink as islink
+ from nt import _path_isjunction as isjunction
from nt import _path_exists as exists
+ from nt import _path_lexists as lexists
except ImportError:
# Use genericpath.* as imported above
pass
diff --git a/Lib/test/test_genericpath.py b/Lib/test/test_genericpath.py
index f407ee3..bf04b3f 100644
--- a/Lib/test/test_genericpath.py
+++ b/Lib/test/test_genericpath.py
@@ -135,6 +135,9 @@ class GenericTest:
self.assertIs(self.pathmodule.exists(filename), False)
self.assertIs(self.pathmodule.exists(bfilename), False)
+ self.assertIs(self.pathmodule.lexists(filename), False)
+ self.assertIs(self.pathmodule.lexists(bfilename), False)
+
create_file(filename)
self.assertIs(self.pathmodule.exists(filename), True)
@@ -145,14 +148,13 @@ class GenericTest:
self.assertIs(self.pathmodule.exists(filename + '\x00'), False)
self.assertIs(self.pathmodule.exists(bfilename + b'\x00'), False)
- if self.pathmodule is not genericpath:
- self.assertIs(self.pathmodule.lexists(filename), True)
- self.assertIs(self.pathmodule.lexists(bfilename), True)
+ self.assertIs(self.pathmodule.lexists(filename), True)
+ self.assertIs(self.pathmodule.lexists(bfilename), True)
- self.assertIs(self.pathmodule.lexists(filename + '\udfff'), False)
- self.assertIs(self.pathmodule.lexists(bfilename + b'\xff'), False)
- self.assertIs(self.pathmodule.lexists(filename + '\x00'), False)
- self.assertIs(self.pathmodule.lexists(bfilename + b'\x00'), False)
+ self.assertIs(self.pathmodule.lexists(filename + '\udfff'), False)
+ self.assertIs(self.pathmodule.lexists(bfilename + b'\xff'), False)
+ self.assertIs(self.pathmodule.lexists(filename + '\x00'), False)
+ self.assertIs(self.pathmodule.lexists(bfilename + b'\x00'), False)
@unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()")
@unittest.skipIf(is_emscripten, "Emscripten pipe fds have no stat")
diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py
index 7f91bf1..9aa1166 100644
--- a/Lib/test/test_ntpath.py
+++ b/Lib/test/test_ntpath.py
@@ -1095,6 +1095,27 @@ class TestNtpath(NtpathTestCase):
raise unittest.SkipTest('SystemDrive is not defined or malformed')
self.assertFalse(os.path.isfile('\\\\.\\' + drive))
+ @unittest.skipUnless(hasattr(os, 'pipe'), "need os.pipe()")
+ def test_isfile_anonymous_pipe(self):
+ pr, pw = os.pipe()
+ try:
+ self.assertFalse(ntpath.isfile(pr))
+ finally:
+ os.close(pr)
+ os.close(pw)
+
+ @unittest.skipIf(sys.platform != 'win32', "windows only")
+ def test_isfile_named_pipe(self):
+ import _winapi
+ named_pipe = f'//./PIPE/python_isfile_test_{os.getpid()}'
+ h = _winapi.CreateNamedPipe(named_pipe,
+ _winapi.PIPE_ACCESS_INBOUND,
+ 0, 1, 0, 0, 0, 0)
+ try:
+ self.assertFalse(ntpath.isfile(named_pipe))
+ finally:
+ _winapi.CloseHandle(h)
+
@unittest.skipIf(sys.platform != 'win32', "windows only")
def test_con_device(self):
self.assertFalse(os.path.isfile(r"\\.\CON"))
@@ -1114,8 +1135,12 @@ class TestNtpath(NtpathTestCase):
self.assertFalse(inspect.isfunction(os.path.isfile))
self.assertTrue(os.path.islink is nt._path_islink)
self.assertFalse(inspect.isfunction(os.path.islink))
+ self.assertTrue(os.path.isjunction is nt._path_isjunction)
+ self.assertFalse(inspect.isfunction(os.path.isjunction))
self.assertTrue(os.path.exists is nt._path_exists)
self.assertFalse(inspect.isfunction(os.path.exists))
+ self.assertTrue(os.path.lexists is nt._path_lexists)
+ self.assertFalse(inspect.isfunction(os.path.lexists))
@unittest.skipIf(os.name != 'nt', "Dev Drives only exist on Win32")
def test_isdevdrive(self):