summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_pathlib/test_pathlib.py
diff options
context:
space:
mode:
authorBarney Gale <barney.gale@gmail.com>2024-06-23 21:01:12 (GMT)
committerGitHub <noreply@github.com>2024-06-23 21:01:12 (GMT)
commit35e998f5608b04cdd331e67dd80d4829df71a5fd (patch)
tree44099e8e9ae00cad3684e3adb024fadcc7770050 /Lib/test/test_pathlib/test_pathlib.py
parentbc37ac7b440b5e816f0b3915b830404290522603 (diff)
downloadcpython-35e998f5608b04cdd331e67dd80d4829df71a5fd.zip
cpython-35e998f5608b04cdd331e67dd80d4829df71a5fd.tar.gz
cpython-35e998f5608b04cdd331e67dd80d4829df71a5fd.tar.bz2
GH-73991: Add `pathlib.Path.copytree()` (#120718)
Add `pathlib.Path.copytree()` method, which recursively copies one directory to another. This differs from `shutil.copytree()` in the following respects: 1. Our method has a *follow_symlinks* argument, whereas shutil's has a *symlinks* argument with an inverted meaning. 2. Our method lacks something like a *copy_function* argument. It always uses `Path.copy()` to copy files. 3. Our method lacks something like a *ignore_dangling_symlinks* argument. Instead, users can filter out danging symlinks with *ignore*, or ignore exceptions with *on_error* 4. Our *ignore* argument is a callable that accepts a single path object, whereas shutil's accepts a path and a list of child filenames. 5. We add an *on_error* argument, which is a callable that accepts an `OSError` instance. (`Path.walk()` also accepts such a callable). Co-authored-by: Nice Zombies <nineteendo19d0@gmail.com>
Diffstat (limited to 'Lib/test/test_pathlib/test_pathlib.py')
-rw-r--r--Lib/test/test_pathlib/test_pathlib.py13
1 files changed, 13 insertions, 0 deletions
diff --git a/Lib/test/test_pathlib/test_pathlib.py b/Lib/test/test_pathlib/test_pathlib.py
index 89af1f7..6b5e90f 100644
--- a/Lib/test/test_pathlib/test_pathlib.py
+++ b/Lib/test/test_pathlib/test_pathlib.py
@@ -653,6 +653,19 @@ class PathTest(test_pathlib_abc.DummyPathTest, PurePathTest):
self.assertIsInstance(f, io.RawIOBase)
self.assertEqual(f.read().strip(), b"this is file A")
+ @unittest.skipIf(sys.platform == "win32" or sys.platform == "wasi", "directories are always readable on Windows and WASI")
+ def test_copytree_no_read_permission(self):
+ base = self.cls(self.base)
+ source = base / 'dirE'
+ target = base / 'copyE'
+ self.assertRaises(PermissionError, source.copytree, target)
+ self.assertFalse(target.exists())
+ errors = []
+ source.copytree(target, on_error=errors.append)
+ self.assertEqual(len(errors), 1)
+ self.assertIsInstance(errors[0], PermissionError)
+ self.assertFalse(target.exists())
+
def test_resolve_nonexist_relative_issue38671(self):
p = self.cls('non', 'exist')