Files
sspai-100-hours-series-python/projects/click-cli/basic/fake_pip_cli.py

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()