Spaces:
Sleeping
Sleeping
import argparse | |
import glob | |
import os | |
from pathlib import Path | |
from zipfile import ZipFile | |
# Exclude some standard library modules to: | |
# 1. Slim down the final zipped file size | |
# 2. Remove functionality we don't want to support. | |
DENY_LIST = [ | |
# Interface to unix databases | |
"dbm", | |
# ncurses bindings (terminal interfaces) | |
"curses", | |
# Tcl/Tk GUI | |
"tkinter", | |
"tkinter", | |
# Tests for the standard library | |
"test", | |
"tests", | |
"idle_test", | |
"__phello__.foo.py", | |
# importlib frozen modules. These are already baked into CPython. | |
"_bootstrap.py", | |
"_bootstrap_external.py", | |
] | |
strip_file_dir = "" | |
def remove_prefix(text, prefix): | |
if text.startswith(prefix): | |
return text[len(prefix) :] | |
return text | |
def write_to_zip(file_path, strip_file_path, zf, prepend_str=""): | |
stripped_file_path = prepend_str + remove_prefix(file_path, strip_file_dir + "/") | |
path = Path(stripped_file_path) | |
if path.name in DENY_LIST: | |
return | |
zf.write(file_path, stripped_file_path) | |
def main() -> None: | |
global strip_file_dir | |
parser = argparse.ArgumentParser(description="Zip py source") | |
parser.add_argument("paths", nargs="*", help="Paths to zip.") | |
parser.add_argument( | |
"--install-dir", "--install_dir", help="Root directory for all output files" | |
) | |
parser.add_argument( | |
"--strip-dir", | |
"--strip_dir", | |
help="The absolute directory we want to remove from zip", | |
) | |
parser.add_argument( | |
"--prepend-str", | |
"--prepend_str", | |
help="A string to prepend onto all paths of a file in the zip", | |
default="", | |
) | |
parser.add_argument("--zip-name", "--zip_name", help="Output zip name") | |
args = parser.parse_args() | |
zip_file_name = args.install_dir + "/" + args.zip_name | |
strip_file_dir = args.strip_dir | |
prepend_str = args.prepend_str | |
zf = ZipFile(zip_file_name, mode="w") | |
for p in sorted(args.paths): | |
if os.path.isdir(p): | |
files = glob.glob(p + "/**/*.py", recursive=True) | |
for file_path in sorted(files): | |
# strip the absolute path | |
write_to_zip( | |
file_path, strip_file_dir + "/", zf, prepend_str=prepend_str | |
) | |
else: | |
write_to_zip(p, strip_file_dir + "/", zf, prepend_str=prepend_str) | |
if __name__ == "__main__": | |
main() # pragma: no cover | |