pytester: add & use our own copytree instead of py.path's
Fixes the TODO note.
This commit is contained in:
		
							parent
							
								
									ccdadb64ea
								
							
						
					
					
						commit
						202dd9f423
					
				| 
						 | 
					@ -583,7 +583,7 @@ def resolve_package_path(path: Path) -> Optional[Path]:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def visit(
 | 
					def visit(
 | 
				
			||||||
    path: str, recurse: Callable[["os.DirEntry[str]"], bool]
 | 
					    path: Union[str, "os.PathLike[str]"], recurse: Callable[["os.DirEntry[str]"], bool]
 | 
				
			||||||
) -> Iterator["os.DirEntry[str]"]:
 | 
					) -> Iterator["os.DirEntry[str]"]:
 | 
				
			||||||
    """Walk a directory recursively, in breadth-first order.
 | 
					    """Walk a directory recursively, in breadth-first order.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -657,3 +657,21 @@ def bestrelpath(directory: Path, dest: Path) -> str:
 | 
				
			||||||
        # Forward from base to dest.
 | 
					        # Forward from base to dest.
 | 
				
			||||||
        *reldest.parts,
 | 
					        *reldest.parts,
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Originates from py. path.local.copy(), with siginficant trims and adjustments.
 | 
				
			||||||
 | 
					# TODO(py38): Replace with shutil.copytree(..., symlinks=True, dirs_exist_ok=True)
 | 
				
			||||||
 | 
					def copytree(source: Path, target: Path) -> None:
 | 
				
			||||||
 | 
					    """Recursively copy a source directory to target."""
 | 
				
			||||||
 | 
					    assert source.is_dir()
 | 
				
			||||||
 | 
					    for entry in visit(source, recurse=lambda entry: not entry.is_symlink()):
 | 
				
			||||||
 | 
					        x = Path(entry)
 | 
				
			||||||
 | 
					        relpath = x.relative_to(source)
 | 
				
			||||||
 | 
					        newx = target / relpath
 | 
				
			||||||
 | 
					        newx.parent.mkdir(exist_ok=True)
 | 
				
			||||||
 | 
					        if x.is_symlink():
 | 
				
			||||||
 | 
					            newx.symlink_to(os.readlink(x))
 | 
				
			||||||
 | 
					        elif x.is_file():
 | 
				
			||||||
 | 
					            shutil.copyfile(x, newx)
 | 
				
			||||||
 | 
					        elif x.is_dir():
 | 
				
			||||||
 | 
					            newx.mkdir(exist_ok=True)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,6 +63,7 @@ from _pytest.outcomes import fail
 | 
				
			||||||
from _pytest.outcomes import importorskip
 | 
					from _pytest.outcomes import importorskip
 | 
				
			||||||
from _pytest.outcomes import skip
 | 
					from _pytest.outcomes import skip
 | 
				
			||||||
from _pytest.pathlib import bestrelpath
 | 
					from _pytest.pathlib import bestrelpath
 | 
				
			||||||
 | 
					from _pytest.pathlib import copytree
 | 
				
			||||||
from _pytest.pathlib import make_numbered_dir
 | 
					from _pytest.pathlib import make_numbered_dir
 | 
				
			||||||
from _pytest.reports import CollectReport
 | 
					from _pytest.reports import CollectReport
 | 
				
			||||||
from _pytest.reports import TestReport
 | 
					from _pytest.reports import TestReport
 | 
				
			||||||
| 
						 | 
					@ -935,10 +936,7 @@ class Pytester:
 | 
				
			||||||
            example_path = example_dir.joinpath(name)
 | 
					            example_path = example_dir.joinpath(name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if example_path.is_dir() and not example_path.joinpath("__init__.py").is_file():
 | 
					        if example_path.is_dir() and not example_path.joinpath("__init__.py").is_file():
 | 
				
			||||||
            # TODO: legacy_path.copy can copy files to existing directories,
 | 
					            copytree(example_path, self.path)
 | 
				
			||||||
            # while with shutil.copytree the destination directory cannot exist,
 | 
					 | 
				
			||||||
            # we will need to roll our own in order to drop legacy_path completely
 | 
					 | 
				
			||||||
            legacy_path(example_path).copy(legacy_path(self.path))
 | 
					 | 
				
			||||||
            return self.path
 | 
					            return self.path
 | 
				
			||||||
        elif example_path.is_file():
 | 
					        elif example_path.is_file():
 | 
				
			||||||
            result = self.path.joinpath(example_path.name)
 | 
					            result = self.path.joinpath(example_path.name)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue