52 lines
1.2 KiB
Python
52 lines
1.2 KiB
Python
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)
|