1
0
Fork 0
mirror of https://gitlab.alpinelinux.org/alpine/aports.git synced 2025-07-24 19:55:26 +03:00
aports/testing/flit/install-wheel-scripts.py
Leo 984525fdbe testing/flit: new aport
https://flit.readthedocs.io
Simple packaging tool for siple Python packages
2020-03-16 08:43:17 -03:00

64 lines
1.6 KiB
Python
Executable file

#!/usr/bin/env python3
import argparse
from pathlib import Path
from configparser import ConfigParser
from zipfile import ZipFile
parser = argparse.ArgumentParser(description="Install wheel scripts.")
parser.add_argument("wheel", type=Path, help="Wheel file")
parser.add_argument(
"--prefix",
type=Path,
default=Path("/usr/local/"),
help="Installation prefix (/usr/, ~/.local, …)",
)
def get_console_scripts(whl):
with ZipFile(whl) as archive:
n = next(
iter(
n
for n in archive.namelist()
if n.endswith(".dist-info/entry_points.txt")
),
None,
)
if n is None:
return {}
ini = archive.read(n).decode("utf-8")
parser = ConfigParser()
parser.optionxform = str # case sensitive
parser.read_string(ini)
return dict(parser["console_scripts"]) if "console_scripts" in parser else {}
def main():
args = parser.parse_args()
scripts = get_console_scripts(args.wheel)
for name, defn in scripts.items():
defn, *_ = defn.split(";") # extra condition
mod, fun = defn.split(":")
if mod.endswith(".__main__"):
mod = mod[: -len(".__main__")]
code = f"""\
#!/bin/sh
exec /usr/bin/python3 -m {mod} "$@"
"""
else:
code = f"""\
#!/usr/bin/python3
from {mod} import {fun}
{fun}()
"""
bin_path = args.prefix / "bin" / name
bin_path.parent.mkdir(parents=True, exist_ok=True)
bin_path.write_text(code)
bin_path.chmod(0o755)
if __name__ == "__main__":
main()