def update_metadata(self, key: str, msg: MaildirMessage) -> None: """Uses :func:`os.rename` to atomically update the message filename based on :meth:`~mailbox.MaildirMessage.get_info`. """ subpath = self._lookup(key) subdir, name = os.path.split(subpath) new_subdir = msg.get_subdir() new_name = key + self.colon + msg.get_info() if subdir != new_subdir: raise ValueError('Message subdir may not be updated') elif name != new_name: new_subpath = os.path.join(msg.get_subdir(), new_name) old_path = os.path.join(self._path, subpath) new_path = os.path.join(self._path, new_subpath) os.rename(old_path, new_path) self._toc[key] = new_subpath