From 8de55d67a197400f85bffc2b0c5e92e0981e9c11 Mon Sep 17 00:00:00 2001 From: Andrew Vant Date: Tue, 20 Nov 2018 18:40:02 -0500 Subject: [PATCH 1/2] Add --debug output for mapping lookups This makes it easier to identify cases when a name should have a mapping but doesn't. --- pipreqs/pipreqs.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/pipreqs/pipreqs.py b/pipreqs/pipreqs.py index 4e7b39f..2557c31 100755 --- a/pipreqs/pipreqs.py +++ b/pipreqs/pipreqs.py @@ -259,16 +259,26 @@ def get_pkg_names(pkgs): List[str]: The corresponding PyPI package names. """ - result = set() + mapfile = join("mapping") + logging.debug("Looking up mappings in %s", mapfile) with open(join("mapping"), "r") as f: - data = dict(x.strip().split(":") for x in f) - for pkg in pkgs: - # Look up the mapped requirement. If a mapping isn't found, - # simply use the package name. - result.add(data.get(pkg, pkg)) - # Return a sorted list for backward compatibility. - return sorted(result, key=lambda s: s.lower()) + mappings = dict(x.strip().split(":") for x in f) + # Look up the mapped requirement. If a mapping isn't found, + # simply use the package name. + names = {pkg: mappings.get(pkg, pkg) + for pkg in pkgs} + + # Print mappings to debug logger + pkgalign = max(len(s) for s in names.keys()) + reqalign = max(len(s) for s in names.values()) + fmt = "[%-{}s] : %-{}s (%s)".format(pkgalign, reqalign) + for pkg, name in names.items(): + note = "mapped" if pkg != name else "default" + logging.debug(fmt, pkg, name, note) + + # Return a sorted list for backward compatibility. + return sorted(set(names.values()), key=lambda s: s.lower()) def get_name_without_alias(name): if "import " in name: From 2971861bacb3f2212ed5e85eba4b526051eefb03 Mon Sep 17 00:00:00 2001 From: Andrew Vant Date: Tue, 20 Nov 2018 16:06:21 -0500 Subject: [PATCH 2/2] Warn when pypi queries fail Currently, pipreqs silently ignores missing packages or network errors unless --debug is supplied. requirements.txt still gets built, but is likely to be wrong. This prints appropriate warnings when something goes wrong querying pypi. For nonexistent packages, it suggests a missing mapping as a possible culprit. --- pipreqs/pipreqs.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pipreqs/pipreqs.py b/pipreqs/pipreqs.py index 2557c31..2759ff1 100755 --- a/pipreqs/pipreqs.py +++ b/pipreqs/pipreqs.py @@ -193,9 +193,15 @@ def get_imports_info( elif response.status_code >= 300: raise HTTPError(status_code=response.status_code, reason=response.reason) - except HTTPError: - logging.debug( - 'Package %s does not exist or network problems', item) + except HTTPError as err: + if err.errno == 404: + msg = "Package `%s` isn't on pypi, skipping" + logging.warning(msg, item) + msg = "(possible missing mapping for import name `%s`?)" + logging.warning(msg, item) + else: + msg = "HTTP error %s querying package %s, skipping" + logging.warning(msg, err.errno, item) continue result.append({'name': item, 'version': data.latest_release_id}) return result