from typing import Optional, Protocol, runtime_checkable
-def _explode_path(path):
+def _explode_path(path, split):
"""
Split the path into a 2-tuple (anchor, parts), where *anchor* is the
uppermost parent of the path (equivalent to path.parents[-1]), and
*parts* is a reversed list of parts following the anchor.
"""
- split = path.parser.split
- path = str(path)
parent, name = split(path)
names = []
while path != parent:
@property
def anchor(self):
"""The concatenation of the drive and root, or ''."""
- return _explode_path(self)[0]
+ return _explode_path(str(self), self.parser.split)[0]
@property
def name(self):
def parts(self):
"""An object providing sequence-like access to the
components in the filesystem path."""
- anchor, parts = _explode_path(self)
+ anchor, parts = _explode_path(str(self), self.parser.split)
if anchor:
parts.append(anchor)
return tuple(reversed(parts))
Return True if this path matches the given glob-style pattern. The
pattern is matched against the entire path.
"""
- if not hasattr(pattern, 'with_segments'):
- pattern = self.with_segments(pattern)
case_sensitive = self.parser.normcase('Aa') == 'Aa'
- globber = _PathGlobber(pattern.parser.sep, case_sensitive, recursive=True)
- match = globber.compile(str(pattern), altsep=pattern.parser.altsep)
+ globber = _PathGlobber(self.parser.sep, case_sensitive, recursive=True)
+ match = globber.compile(pattern, altsep=self.parser.altsep)
return match(str(self)) is not None
"""Iterate over this subtree and yield all existing files (of any
kind, including directories) matching the given relative pattern.
"""
- if not hasattr(pattern, 'with_segments'):
- pattern = self.with_segments(pattern)
- anchor, parts = _explode_path(pattern)
+ anchor, parts = _explode_path(pattern, self.parser.split)
if anchor:
raise NotImplementedError("Non-relative patterns are unsupported")
elif not parts:
"""
Recursively copy this file or directory tree to the given destination.
"""
- if not hasattr(target, 'with_segments'):
- target = self.with_segments(target)
ensure_distinct_paths(self, target)
- try:
- copy_to_target = target._copy_from
- except AttributeError:
- raise TypeError(f"Target path is not writable: {target!r}") from None
- copy_to_target(self, **kwargs)
+ target._copy_from(self, **kwargs)
return target.joinpath() # Empty join to ensure fresh metadata.
def copy_into(self, target_dir, **kwargs):
name = self.name
if not name:
raise ValueError(f"{self!r} has an empty name")
- elif hasattr(target_dir, 'with_segments'):
- target = target_dir / name
- else:
- target = self.with_segments(target_dir, name)
- return self.copy(target, **kwargs)
+ return self.copy(target_dir / name, **kwargs)
class _WritablePath(_JoinablePath):