# Internals
#
-# Maximum number of symlinks to follow in PathBase.resolve()
-_MAX_SYMLINKS = 40
-
# Reference for Windows paths can be found at
# https://learn.microsoft.com/en-gb/windows/win32/fileio/naming-a-file .
_WIN_RESERVED_NAMES = frozenset(
"""
__slots__ = ()
+ # Maximum number of symlinks to follow in resolve()
+ _max_symlinks = 40
+
@classmethod
def _unsupported(cls, method_name):
msg = f"{cls.__name__}.{method_name}() is unsupported"
# Like Linux and macOS, raise OSError(errno.ELOOP) if too many symlinks are
# encountered during resolution.
link_count += 1
- if link_count >= _MAX_SYMLINKS:
+ if link_count >= self._max_symlinks:
raise OSError(ELOOP, "Too many symbolic links in path", str(self))
target, target_parts = next_path.readlink()._split_stack()
# If the symlink target is absolute (like '/etc/hosts'), set the current
-import collections.abc
+import collections
import io
import os
import errno
class DummyPurePath(PurePathBase):
+ __slots__ = ()
+
def __eq__(self, other):
if not isinstance(other, DummyPurePath):
return NotImplemented
super().close()
+DummyPathStatResult = collections.namedtuple(
+ 'DummyPathStatResult',
+ 'st_mode st_ino st_dev st_nlink st_uid st_gid st_size st_atime st_mtime st_ctime')
+
+
class DummyPath(PathBase):
"""
Simple implementation of PathBase that keeps files and directories in
memory.
"""
+ __slots__ = ()
+
_files = {}
_directories = {}
_symlinks = {}
st_mode = stat.S_IFLNK
else:
raise FileNotFoundError(errno.ENOENT, "Not found", str(self))
- return os.stat_result((st_mode, hash(str(self)), 0, 0, 0, 0, 0, 0, 0, 0))
+ return DummyPathStatResult(st_mode, hash(str(self)), 0, 0, 0, 0, 0, 0, 0, 0)
def open(self, mode='r', buffering=-1, encoding=None,
errors=None, newline=None):
class DummyPathWithSymlinks(DummyPath):
+ __slots__ = ()
+
+ # Reduce symlink traversal limit to make tests run faster.
+ _max_symlinks = 20
+
def readlink(self):
path = str(self.parent.resolve() / self.name)
if path in self._symlinks: