81 lines
1.8 KiB
Python
81 lines
1.8 KiB
Python
import argparse
|
|
from importlib.metadata import requires
|
|
|
|
|
|
def fetch(target):
|
|
print(f"fetch {target}...")
|
|
|
|
|
|
def is_url(src):
|
|
if not (src.startswith("http") and src.startswith("https")):
|
|
return False
|
|
return True
|
|
|
|
|
|
def download(url_or_package):
|
|
if not is_url(url_or_package):
|
|
fetch(url_or_package)
|
|
return
|
|
|
|
|
|
def _install(package=None, requirements=None):
|
|
if not package and requirements:
|
|
for _package in requirements:
|
|
download(_package)
|
|
elif package and not requirements:
|
|
download(package)
|
|
else:
|
|
raise ValueError(
|
|
"`package` parameter is required "
|
|
"if there isn't `requirements` parameter."
|
|
)
|
|
|
|
|
|
class PipCommand:
|
|
def __init__(self) -> None:
|
|
pass
|
|
|
|
def install(self, *args, **kwargs):
|
|
_install(*args, **kwargs)
|
|
|
|
|
|
def _tidy_requirements(requirements):
|
|
filtered = filter(lambda r: not r.startswith("#") and r.strip() != "", requirements)
|
|
keep = list(map(lambda r: r.strip(), filtered))
|
|
return keep
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
description="the fake pip usage example",
|
|
)
|
|
subparsers = parser.add_subparsers(
|
|
description="the sub-command for fake pip tools",
|
|
)
|
|
|
|
parser_install = subparsers.add_parser("install")
|
|
parser_install.add_argument(
|
|
"package",
|
|
type=str,
|
|
nargs="?",
|
|
help="the name of package",
|
|
)
|
|
parser_install.add_argument(
|
|
"-r",
|
|
"--requirements",
|
|
dest="requirements",
|
|
help="the requirements file",
|
|
type=argparse.FileType("r", encoding="utf-8"),
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
deps = (
|
|
_tidy_requirements(args.requirements.readlines()) if args.requirements else None
|
|
)
|
|
pip = PipCommand()
|
|
pip.install(args.package, deps)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|