File size: 1,674 Bytes
3b3b2bd | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | """Package a separate minimal Docker Space; no publication or private data."""
from pathlib import Path
import argparse,hashlib,json,shutil,zipfile
ROOT=Path(__file__).resolve().parents[1]
def main():
p=argparse.ArgumentParser();p.add_argument('--wheel',type=Path,required=True);p.add_argument('--directory',type=Path,required=True);p.add_argument('--output',type=Path,required=True);a=p.parse_args()
if a.directory.exists() and any(a.directory.iterdir()):raise ValueError('use an empty new Space directory')
a.directory.mkdir(parents=True,exist_ok=True)
for name in ('README.md','Dockerfile','app.py','index.html','hero.png'):shutil.copyfile(ROOT/'space'/name,a.directory/name)
shutil.copyfile(a.wheel,a.directory/a.wheel.name)
shutil.copyfile(ROOT/'LICENSE',a.directory/'LICENSE')
files=sorted(p for p in a.directory.iterdir() if p.is_file())
manifest={'schema':'phillnet.release.v1','name':'PhillNet Recall Demo','version':'1.2.0',
'intended_repository':'ayjays132/PhillNet-Recall-Demo','publication_performed':False,
'files':[{'path':f.name,'bytes':f.stat().st_size,'sha256':hashlib.sha256(f.read_bytes()).hexdigest()} for f in files]}
(a.directory/'release_manifest.json').write_text(json.dumps(manifest,indent=2)+'\n');files.append(a.directory/'release_manifest.json')
with zipfile.ZipFile(a.output,'w',zipfile.ZIP_DEFLATED,compresslevel=9) as z:
for f in files:z.write(f,'PhillNet-Recall-Space/'+f.name)
print(json.dumps({'archive':str(a.output),'files':len(files),'bytes':a.output.stat().st_size,'sha256':hashlib.sha256(a.output.read_bytes()).hexdigest()},indent=2))
if __name__=='__main__':main()
|