def test_relocate_venv_successfully(temp_base): with runez.CaptureOutput() as logged: original = "line 1: source\nline 2\n" runez.write("foo/bar/bin/baz", original, logger=logging.debug) runez.write("foo/bar/bin/empty", "", logger=logging.debug) runez.write("foo/bar/bin/python", "", logger=logging.debug) runez.make_executable("foo/bar/bin/baz") runez.make_executable("foo/bar/bin/empty") runez.make_executable("foo/bar/bin/python") assert "Created" in logged.pop() # Simulate already seen expected = ["line 1: source\n", "line 2\n"] assert system.relocate_venv("foo", "source", "dest", fatal=False, _seen={"foo"}) == 0 assert runez.get_lines("foo/bar/bin/baz") == expected assert not logged # Simulate failure to write with patch("runez.write", return_value=-1): assert system.relocate_venv("foo", "source", "dest", fatal=False) == -1 assert runez.get_lines("foo/bar/bin/baz") == expected assert not logged # Simulate effective relocation, by folder expected = ["line 1: dest\n", "line 2\n"] assert system.relocate_venv("foo", "source", "dest", fatal=False) == 1 assert runez.get_lines("foo/bar/bin/baz") == expected assert "Relocated " in logged # Second relocation is a no-op assert system.relocate_venv("foo", "source", "dest", fatal=False) == 0 # Test relocating a single file runez.write("foo/bar/bin/baz", original, logger=logging.debug) assert system.relocate_venv("foo/bar/bin/baz", "source", "dest", fatal=False) == 1 assert "Relocated " in logged
def expect_logged(self, *expected): assert self.logfile, "Logging to a file was not setup" remaining = set(expected) with open(runez.log.file_handler.baseFilename, "rt") as fh: for line in fh: found = [msg for msg in remaining if msg in line] remaining.difference_update(found) if remaining: LOG.info("File contents:") LOG.info("\n".join( runez.get_lines(runez.log.file_handler.baseFilename))) assert not remaining
def test_failed_read(*_): with runez.CaptureOutput() as logged: assert runez.get_lines("bar", fatal=False) is None assert "Can't read" in logged.pop() assert runez.write("bar", "some content", fatal=False) assert "Can't write" in logged.pop() assert runez.copy("some-file", "bar", fatal=False) == -1 assert "Can't delete" in logged assert "Can't copy" in logged.pop() assert runez.make_executable("some-file", fatal=False) == -1 assert "Can't chmod" in logged.pop()
def find_uninstaller(target): if not target or not os.path.exists(target): # Bogus path, or dangling symlink return runez.delete path = os.path.realpath(target) if path.startswith(os.path.realpath(system.SETTINGS.meta.path)): # Pickley symlink, can be simply deleted return runez.delete if os.path.isfile(target) and os.path.getsize(target) == 0: # Empty file return runez.delete content = runez.get_lines(target, fatal=None) if content and any(line.startswith(system.WRAPPER_MARK) for line in content): # pickley's own wrapper also fine to simply delete return runez.delete brew, name = find_brew_name(target) if brew and name: return brew_uninstall return None
def relocate_venv(path, source, destination, fatal=True, logger=LOG.debug, _seen=None): """ :param str path: Path of file or folder to relocate (change mentions of 'source' to 'destination') :param str source: Where venv used to be :param str destination: Where venv is moved to :param bool fatal: Abort execution on failure if True :param callable|None logger: Logger to use :return int: Number of relocated files (0 if no-op, -1 on failure) """ original_call = False if _seen is None: original_call = True _seen = set() if not path or path in _seen: return 0 _seen.add(path) if os.path.isdir(path): relocated = 0 if original_call: for bin_folder in find_venvs(path): for name in os.listdir(bin_folder): fpath = os.path.join(bin_folder, name) r = relocate_venv(fpath, source, destination, fatal=fatal, logger=logger, _seen=_seen) if r < 0: return r relocated += r if logger and relocated: logger("Relocated %s files in %s: %s -> %s", relocated, short(path), short(source), short(destination)) return relocated content = runez.get_lines(path, fatal=fatal) if not content: return 0 modified = False lines = [] for line in content: if source in line: line = line.replace(source, destination) modified = True lines.append(line) if not modified: return 0 r = runez.write(path, "".join(lines), fatal=fatal) if r > 0 and logger and original_call: logger("Relocated %s: %s -> %s", short(path), short(source), short(destination)) return r
def test_paths(temp_folder): assert runez.resolved_path(None) is None assert runez.resolved_path("some-file") == os.path.join(temp_folder, "some-file") assert runez.resolved_path("some-file", base="bar") == os.path.join(temp_folder, "bar", "some-file") assert runez.short(None) is None assert runez.short("") == "" assert runez.short(temp_folder) == temp_folder assert runez.short(temp_folder + "/some-file") == "some-file" assert runez.short(temp_folder + "/some-file") == "some-file" assert runez.parent_folder(None) is None assert runez.parent_folder(temp_folder + "/some-file") == temp_folder assert runez.represented_args(["ls", temp_folder + "/some-file bar", "-a"]) == 'ls "some-file bar" -a' # Don't crash for no-ops assert runez.ensure_folder(None) == 0 assert runez.ensure_folder("") == 0 assert runez.copy(None, None) == 0 assert runez.move(None, None) == 0 assert runez.symlink(None, None) == 0 assert runez.copy("some-file", "some-file") == 0 assert runez.move("some-file", "some-file") == 0 assert runez.symlink("some-file", "some-file") == 0 assert runez.ensure_folder("some-folder") == 0 # 'some-folder' would be in temp_folder, which already exists with runez.CaptureOutput(dryrun=True) as logged: assert runez.ensure_folder("some-folder", folder=True, fatal=False) == 1 assert "Would create" in logged.pop() assert runez.touch("some-file", logger=logging.debug) == 1 assert "Would touch some-file" in logged.pop() assert runez.copy("some-file", "bar") == 1 assert "Would copy some-file -> bar" in logged.pop() assert runez.move("some-file", "bar") == 1 assert "Would move some-file -> bar" in logged.pop() assert runez.symlink("some-file", "bar") == 1 assert "Would symlink some-file <- bar" in logged.pop() assert runez.delete(temp_folder) == 1 assert "Would delete" in logged.pop() assert runez.copy("some-folder/bar/baz", "some-folder", fatal=False) == -1 assert "source contained in destination" in logged.pop() assert runez.move("some-folder/bar/baz", "some-folder", fatal=False) == -1 assert "source contained in destination" in logged.pop() assert runez.symlink("some-folder/bar/baz", "some-folder", fatal=False) == -1 assert "source contained in destination" in logged.pop() with runez.CaptureOutput(): assert runez.touch("sample") == 1 assert "Can't create folder" in runez.verify_abort(runez.ensure_folder, "sample", folder=True) custom = runez.verify_abort(runez.ensure_folder, "sample", folder=True, fatal=SystemExit, expected_exception=SystemExit) assert "Can't create folder" in custom with pytest.raises(AssertionError): assert runez.verify_abort(runez.ensure_folder, None) assert runez.delete("sample") == 1 assert runez.ensure_folder("sample", folder=True) == 1 assert os.getcwd() == temp_folder with runez.CurrentFolder("sample", anchor=False): cwd = os.getcwd() sample = os.path.join(temp_folder, "sample") assert cwd == sample assert runez.short(os.path.join(cwd, "some-file")) == "sample/some-file" with runez.CurrentFolder("sample", anchor=True): cwd = os.getcwd() sample = os.path.join(temp_folder, "sample") assert cwd == sample assert runez.short(os.path.join(cwd, "some-file")) == "some-file" assert os.getcwd() == temp_folder assert runez.delete("sample") == 1 with runez.CaptureOutput() as logged: sample = os.path.join(os.path.dirname(__file__), "sample.txt") content = runez.get_lines(sample) assert runez.write("sample", "".join(content), fatal=False, logger=logging.debug) == 1 assert runez.get_lines("sample") == content assert "Writing 13 bytes" in logged.pop() assert runez.first_line("sample") == "Fred" assert runez.is_younger("sample", age=10) assert not runez.is_younger("sample", age=-1) assert runez.copy("bar", "baz", fatal=False) == -1 assert "does not exist" in logged.pop() assert runez.move("bar", "baz", fatal=False) == -1 assert "does not exist" in logged.pop() assert runez.symlink("bar", "baz", fatal=False) == -1 assert "does not exist" in logged.pop() # Creating dangling symlinks is possible assert runez.symlink("bar", "baz", fatal=False, must_exist=False) == 1 assert "Symlink bar <- baz" in logged.pop() assert os.path.islink("baz") assert not os.path.exists("baz") assert runez.copy("sample", "x/y/sample") == 1 assert runez.symlink("sample", "x/y/sample3", fatal=False) == 1 assert os.path.exists("sample") assert runez.move("sample", "x/y/sample2") == 1 assert not os.path.exists("sample") assert runez.copy("x/y", "x/z") == 1 assert os.path.exists("x/z/sample") assert os.path.exists("x/z/sample2") assert os.path.exists("x/z/sample3") assert os.path.islink("x/z/sample3") assert runez.touch(None) == 0 assert not runez.is_younger(None, 1) assert not runez.is_younger("/dev/null/not-there", 1) assert runez.first_line("/dev/null/not-there") is None assert runez.get_lines(None) is None