from .abc import FileWrap, DirWrap import os import functools if hasattr(functools, "cache"): cache_fn = functools.cache else: cache_fn = functools.lru_cache @cache_fn def parse_directory(dirp): structure = {} os.chdir(dirp) for d in os.listdir(): if os.path.isdir(d): structure[d] = parse_directory(d) elif os.path.isfile(d): structure[d] = open(d, "rb").read() os.chdir("..") return structure @cache_fn def wrap_directory(dirp, level=0): structure = parse_directory(dirp) data = [] for k, v in structure.items(): if isinstance(v, dict): data.append(wrap_directory(k, level + 1)) else: data.append(FileWrap(k, v)) if level == 0: os.chdir(os.path.join("..", "..")) return DirWrap(dirp, *data) @cache_fn def unpack(dirw: DirWrap): import shutil for k, v in dirw.contains.items(): if isinstance(v, DirWrap): if os.path.isdir(k): shutil.rmtree(k) os.mkdir(v.name) os.chdir(v.name) unpack(v) os.chdir("..") else: open(k, "wb+").write(v.data)