From 70ed2cfd68e71a98697b1c13c337499732a801dc Mon Sep 17 00:00:00 2001 From: markmcclain Date: Fri, 29 Mar 2019 04:13:06 -0400 Subject: [PATCH] make is_standard_module() properly classify extensions (#659) Extensions can be installed in either a platform independent or specific location[1]. The search is updated to include both paths. Previously, an extension in the platform specific location would be misclassified because only the independent location was considered and the platform specific location shared a prefix with the standard lib. [1] http://docs.python.org/3/distutils/apiref.html#distutils.sysconfig.get_python_lib Fixes Issue: #658 Co-authored-by: Matt Story --- astroid/modutils.py | 7 ++++--- astroid/tests/unittest_modutils.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/astroid/modutils.py b/astroid/modutils.py index df75a901e9..cc5fc56f49 100644 --- a/astroid/modutils.py +++ b/astroid/modutils.py @@ -116,7 +116,7 @@ def _posix_path(path): # https://github.com/PyCQA/pylint/issues/712#issuecomment-163178753 STD_LIB_DIRS.add(_posix_path("lib64")) -EXT_LIB_DIR = get_python_lib() +EXT_LIB_DIRS = {get_python_lib(), get_python_lib(True)} IS_JYTHON = platform.python_implementation() == "Jython" BUILTIN_MODULES = dict.fromkeys(sys.builtin_module_names, True) @@ -596,8 +596,9 @@ def is_standard_module(modname, std_path=None): # we assume there are no namespaces in stdlib return not util.is_namespace(modname) filename = _normalize_path(filename) - if filename.startswith(_cache_normalize_path(EXT_LIB_DIR)): - return False + for path in EXT_LIB_DIRS: + if filename.startswith(_cache_normalize_path(path)): + return False if std_path is None: std_path = STD_LIB_DIRS for path in std_path: diff --git a/astroid/tests/unittest_modutils.py b/astroid/tests/unittest_modutils.py index 6f1bae1454..b517422e80 100644 --- a/astroid/tests/unittest_modutils.py +++ b/astroid/tests/unittest_modutils.py @@ -278,7 +278,7 @@ def test_4(self): def test_custom_path(self): datadir = resources.find("") - if datadir.startswith(modutils.EXT_LIB_DIR): + if any(datadir.startswith(p) for p in modutils.EXT_LIB_DIRS): self.skipTest("known breakage of is_standard_module on installed package") self.assertTrue(modutils.is_standard_module("data.module", (datadir,)))