Source code for pycharmers.cli.requirements
#coding: utf-8
import os
import re
import sys
import argparse
from pathlib import Path
import distutils.sysconfig as sysconfig
from ..utils._colorings import toBLUE, toGREEN
from ..utils.generic_utils import flatten_dual
from ..utils.inspect_utils import get_imported_members
from ..utils.subprocess_utils import run_and_capture
from ..utils.print_utils import pretty_3quote
from ..utils._colorings import toBLUE, toGREEN, toRED
STANDARD_LIBRARIES = [fn.split(".")[0] for fn in os.listdir(sysconfig.get_python_lib(standard_lib=True))]
[docs]def requirements_create(argv=sys.argv[1:]):
"""Create a ``requirements.text``
Args:
path (str) : Path to a package (module).
Note:
When you run from the command line, execute as follows::
$ requirements-create ~/path/to/pycharmers
"""
parser = argparse.ArgumentParser(prog="render-template", description="Create a requirements.text", add_help=True)
parser.add_argument("path", type=str, help="Path to a package (module).")
parser.add_argument("--all", action="store_true", help="Whethere print all libraries or only non-standard ones.")
args = parser.parse_args(argv)
only_std = not args.all
if not only_std:
print(*pretty_3quote(f"""
* Standard Library : {toGREEN('GREEN')}
* Third-Party Library : {toBLUE('BLUE')}
* ERROR : {toRED('RED')}
{"="*30}
"""))
p = Path(args.path)
libraries = []
for fn in p.glob("**/*.py"):
imported_members = get_imported_members(fn)
imported_libraries = list(imported_members.keys()) + imported_members.get("", [])
libraries.extend([e.split(".")[0] for e in imported_libraries])
for lib in set(libraries):
is_std = lib in STANDARD_LIBRARIES
if only_std:
if is_std:
continue
else:
color = lambda x:str(x)
else:
color = toGREEN if is_std else toBLUE
if len(lib)==0:
continue
try:
print(color(re.sub(pattern=r"Version:\s(.*)", repl=rf"{lib}==\1", string=run_and_capture(f"pip3 show --version {lib} | grep Version"))))
except Exception as e:
print(toRED(e))