import re import subprocess import sys import toml REGEX_PKG = re.compile("^([\w\.\[\],_-]+)") REGEX_SINGLE = re.compile("([\w\._-]+)") def get_pip_freeze_list(): freeze_text = subprocess.check_output( [sys.executable, '-m', 'pip', 'list', '-l', '--format=freeze'] ) freeze_text = freeze_text.decode("utf-8") return freeze_text.strip().splitlines() def get_raw_packages_from_pyproject_file(filename="pyproject.toml"): pyproject = toml.load(filename) _flit = pyproject["tool"]["flit"]["metadata"] pyproject_pkgs = _flit["requires"] pyproject_pkgs += _flit["requires-extra"]["test"] pyproject_pkgs += _flit["requires-extra"]["dev"] return pyproject_pkgs def _parse_package_names(toml_pkgs): for pkg in toml_pkgs: group = REGEX_PKG.match(pkg)[0] yield from REGEX_SINGLE.finditer(group) def get_package_names(filename="pyproject.toml"): toml_pkgs = get_raw_packages_from_pyproject_file(filename) as_string = (m.group() for m in _parse_package_names(toml_pkgs)) lowercased = (item.lower() for item in as_string) return {item.replace("_", "-") for item in lowercased} def filter_toml_pkgs_from_freeze_list(freeze_list, toml_pkgs): for line in freeze_list: freeze_pkg, _ = line.split("=", 1) if freeze_pkg.lower() in toml_pkgs: yield line def main(toml_file="pyproject.toml"): freeze_list = get_pip_freeze_list() toml_pkgs = get_package_names(toml_file) return filter_toml_pkgs_from_freeze_list(freeze_list, toml_pkgs) if __name__ == "__main__": print("\n".join(sorted(main(), key=lambda x: x.lower())))