def test_get_tempname(mocker, dir, prefix): fd = mock.Mock() tmp_file_name = mock.Mock() mock_mkstemp = mocker.patch( "tempfile.mkstemp", return_value=(fd, tmp_file_name)) os_close_mock = mocker.patch("os.close") assert tmp_file_name == tempfile.get_tempname(dir, prefix) if prefix: mock_mkstemp.assert_called_once_with(dir=dir, prefix=prefix) else: mock_mkstemp.assert_called_once_with(dir=dir) os_close_mock.assert_called_once_with(fd)
def update_file(filename): old = open(filename, 'r') dirname = os.path.dirname(filename) prefix = ".{0}.".format(os.path.basename(filename)) temp_filename = tempfile.get_tempname(dir=dirname, prefix=prefix) new = open(temp_filename, 'w') with contextlib.nested(old, new): try: yield old, new except DontUpdateException: os.unlink(temp_filename) return except Exception: os.unlink(temp_filename) raise stat = os.stat(filename) os.chmod(temp_filename, stat.st_mode) os.chown(temp_filename, stat.st_uid, stat.st_gid) bak_filename = filename + '.bak' os.rename(filename, bak_filename) os.rename(temp_filename, filename) os.unlink(bak_filename)