mirror of
https://github.com/python/cpython.git
synced 2025-07-23 03:05:38 +00:00
GH-73991: Add pathlib.Path.move()
(#122073)
Add a `Path.move()` method that moves a file or directory tree, and returns a new `Path` instance pointing to the target. This method is similar to `shutil.move()`, except that it doesn't accept a *copy_function* argument, and it doesn't check whether the destination is an existing directory.
This commit is contained in:
parent
aa905925e1
commit
625d0705b9
6 changed files with 225 additions and 4 deletions
|
@ -2072,6 +2072,125 @@ class DummyPathTest(DummyPurePathTest):
|
|||
self.assertTrue(target2.joinpath('link').is_symlink())
|
||||
self.assertEqual(target2.joinpath('link').readlink(), self.cls('nonexistent'))
|
||||
|
||||
def test_move_file(self):
|
||||
base = self.cls(self.base)
|
||||
source = base / 'fileA'
|
||||
source_text = source.read_text()
|
||||
target = base / 'fileA_moved'
|
||||
result = source.move(target)
|
||||
self.assertEqual(result, target)
|
||||
self.assertFalse(source.exists())
|
||||
self.assertTrue(target.exists())
|
||||
self.assertEqual(source_text, target.read_text())
|
||||
|
||||
def test_move_file_to_file(self):
|
||||
base = self.cls(self.base)
|
||||
source = base / 'fileA'
|
||||
source_text = source.read_text()
|
||||
target = base / 'dirB' / 'fileB'
|
||||
result = source.move(target)
|
||||
self.assertEqual(result, target)
|
||||
self.assertFalse(source.exists())
|
||||
self.assertTrue(target.exists())
|
||||
self.assertEqual(source_text, target.read_text())
|
||||
|
||||
def test_move_file_to_dir(self):
|
||||
base = self.cls(self.base)
|
||||
source = base / 'fileA'
|
||||
target = base / 'dirB'
|
||||
self.assertRaises(OSError, source.move, target)
|
||||
|
||||
def test_move_file_to_itself(self):
|
||||
base = self.cls(self.base)
|
||||
source = base / 'fileA'
|
||||
self.assertRaises(OSError, source.move, source)
|
||||
|
||||
def test_move_dir(self):
|
||||
base = self.cls(self.base)
|
||||
source = base / 'dirC'
|
||||
target = base / 'dirC_moved'
|
||||
result = source.move(target)
|
||||
self.assertEqual(result, target)
|
||||
self.assertFalse(source.exists())
|
||||
self.assertTrue(target.is_dir())
|
||||
self.assertTrue(target.joinpath('dirD').is_dir())
|
||||
self.assertTrue(target.joinpath('dirD', 'fileD').is_file())
|
||||
self.assertEqual(target.joinpath('dirD', 'fileD').read_text(),
|
||||
"this is file D\n")
|
||||
self.assertTrue(target.joinpath('fileC').is_file())
|
||||
self.assertTrue(target.joinpath('fileC').read_text(),
|
||||
"this is file C\n")
|
||||
|
||||
def test_move_dir_to_dir(self):
|
||||
base = self.cls(self.base)
|
||||
source = base / 'dirC'
|
||||
target = base / 'dirB'
|
||||
self.assertRaises(OSError, source.move, target)
|
||||
self.assertTrue(source.exists())
|
||||
self.assertTrue(target.exists())
|
||||
|
||||
def test_move_dir_to_itself(self):
|
||||
base = self.cls(self.base)
|
||||
source = base / 'dirC'
|
||||
self.assertRaises(OSError, source.move, source)
|
||||
self.assertTrue(source.exists())
|
||||
|
||||
def test_move_dir_into_itself(self):
|
||||
base = self.cls(self.base)
|
||||
source = base / 'dirC'
|
||||
target = base / 'dirC' / 'bar'
|
||||
self.assertRaises(OSError, source.move, target)
|
||||
self.assertTrue(source.exists())
|
||||
self.assertFalse(target.exists())
|
||||
|
||||
@needs_symlinks
|
||||
def test_move_file_symlink(self):
|
||||
base = self.cls(self.base)
|
||||
source = base / 'linkA'
|
||||
source_readlink = source.readlink()
|
||||
target = base / 'linkA_moved'
|
||||
result = source.move(target)
|
||||
self.assertEqual(result, target)
|
||||
self.assertFalse(source.exists())
|
||||
self.assertTrue(target.is_symlink())
|
||||
self.assertEqual(source_readlink, target.readlink())
|
||||
|
||||
@needs_symlinks
|
||||
def test_move_file_symlink_to_itself(self):
|
||||
base = self.cls(self.base)
|
||||
source = base / 'linkA'
|
||||
self.assertRaises(OSError, source.move, source)
|
||||
|
||||
@needs_symlinks
|
||||
def test_move_dir_symlink(self):
|
||||
base = self.cls(self.base)
|
||||
source = base / 'linkB'
|
||||
source_readlink = source.readlink()
|
||||
target = base / 'linkB_moved'
|
||||
result = source.move(target)
|
||||
self.assertEqual(result, target)
|
||||
self.assertFalse(source.exists())
|
||||
self.assertTrue(target.is_symlink())
|
||||
self.assertEqual(source_readlink, target.readlink())
|
||||
|
||||
@needs_symlinks
|
||||
def test_move_dir_symlink_to_itself(self):
|
||||
base = self.cls(self.base)
|
||||
source = base / 'linkB'
|
||||
self.assertRaises(OSError, source.move, source)
|
||||
|
||||
@needs_symlinks
|
||||
def test_move_dangling_symlink(self):
|
||||
base = self.cls(self.base)
|
||||
source = base / 'brokenLink'
|
||||
source_readlink = source.readlink()
|
||||
target = base / 'brokenLink_moved'
|
||||
result = source.move(target)
|
||||
self.assertEqual(result, target)
|
||||
self.assertFalse(source.exists())
|
||||
self.assertTrue(target.is_symlink())
|
||||
self.assertEqual(source_readlink, target.readlink())
|
||||
|
||||
def test_iterdir(self):
|
||||
P = self.cls
|
||||
p = P(self.base)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue