From 8139f6b6856ed634b7fb3a8a866ddeca1d0c99b1 Mon Sep 17 00:00:00 2001 From: Sylvain Th?nault Date: Tue, 17 Jul 2012 15:38:15 +0200 Subject: Generalise usage of disutils.sysconfig.get_python_version so eg. is_standard_module works for other python impl. like Jython, IronPython (and should works for pypy). Closes #99493 Also add more test for this function. --- ChangeLog | 3 +++ modutils.py | 26 +++++++++++++++----------- test/unittest_modutils.py | 27 ++++++++++++--------------- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index e3ab3b1..b27c304 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,9 @@ ChangeLog for logilab.common ============================ + -- +* modutils: be more python implementation independant (closes #99493) + 2012-04-12 -- 0.58.0 * new `registry` module containing a backport of CubicWeb selectable objects registry (closes #84654) diff --git a/modutils.py b/modutils.py index 95c400a..8b75415 100644 --- a/modutils.py +++ b/modutils.py @@ -34,6 +34,7 @@ import os from os.path import splitext, join, abspath, isdir, dirname, exists, basename from imp import find_module, load_module, C_BUILTIN, PY_COMPILED, PKG_DIRECTORY from distutils.sysconfig import get_config_var, get_python_lib, get_python_version +from distutils.errors import DistutilsPlatformError try: import zipimport @@ -53,12 +54,18 @@ from logilab.common import STD_BLACKLIST, _handle_blacklist if sys.platform.startswith('win'): PY_SOURCE_EXTS = ('py', 'pyw') PY_COMPILED_EXTS = ('dll', 'pyd') - STD_LIB_DIR = get_python_lib(standard_lib=1) else: PY_SOURCE_EXTS = ('py',) PY_COMPILED_EXTS = ('so',) - # extend lib dir with some arch-dependant paths - STD_LIB_DIR = join(get_config_var("LIBDIR"), "python%s" % get_python_version()) + +try: + STD_LIB_DIR = get_python_lib(standard_lib=1) +# get_python_lib(standard_lib=1) is not available on pypy, set STD_LIB_DIR to +# non-valid path, see https://bugs.pypy.org/issue1164 +except DistutilsPlatformError: + STD_LIB_DIR = '//' + +EXT_LIB_DIR = get_python_lib() BUILTIN_MODULES = dict(zip(sys.builtin_module_names, [1]*len(sys.builtin_module_names))) @@ -231,8 +238,7 @@ def modpath_from_file(filename, extrapath=None): for path in sys.path: path = abspath(path) if path and base[:len(path)] == path: - if filename.find('site-packages') != -1 and \ - path.find('site-packages') == -1: + if path.startswith(EXT_LIB_DIR): continue modpath = [pkg for pkg in base[len(path):].split(os.sep) if pkg] if _check_init(path, modpath[:-1]): @@ -493,13 +499,11 @@ def is_standard_module(modname, std_path=(STD_LIB_DIR,)): if filename is None: return 1 filename = abspath(filename) + if filename.startswith(EXT_LIB_DIR): + return 0 for path in std_path: - path = abspath(path) - if filename.startswith(path): - pfx_len = len(path) - if filename[pfx_len+1:pfx_len+14] != 'site-packages': - return 1 - return 0 + if filename.startswith(abspath(path)): + return 1 return False diff --git a/test/unittest_modutils.py b/test/unittest_modutils.py index 4fe2baf..4b12bc1 100644 --- a/test/unittest_modutils.py +++ b/test/unittest_modutils.py @@ -175,7 +175,7 @@ class is_standard_module_tc(ModutilsTestCase): library """ - def test_knownValues_is_standard_module_0(self): + def test_knownValues_is_standard_module_builtins(self): if sys.version_info < (3, 0): self.assertEqual(modutils.is_standard_module('__builtin__'), True) self.assertEqual(modutils.is_standard_module('builtins'), False) @@ -183,30 +183,27 @@ class is_standard_module_tc(ModutilsTestCase): self.assertEqual(modutils.is_standard_module('__builtin__'), False) self.assertEqual(modutils.is_standard_module('builtins'), True) - def test_knownValues_is_standard_module_1(self): + def test_knownValues_is_standard_module_builtin(self): self.assertEqual(modutils.is_standard_module('sys'), True) - def test_knownValues_is_standard_module_2(self): + def test_knownValues_is_standard_module_nonstandard(self): self.assertEqual(modutils.is_standard_module('logilab'), False) - def test_knownValues_is_standard_module_3(self): + def test_knownValues_is_standard_module_unknown(self): self.assertEqual(modutils.is_standard_module('unknown'), False) def test_knownValues_is_standard_module_4(self): - if sys.version_info < (3, 0): - self.assertEqual(modutils.is_standard_module('StringIO'), True) - else: - self.assertEqual(modutils.is_standard_module('StringIO'), False) - if sys.version_info < (2, 6): - self.assertEqual(modutils.is_standard_module('io'), False) - else: - self.assertEqual(modutils.is_standard_module('io'), True) - - def test_knownValues_is_standard_module_5(self): + self.assertEqual(modutils.is_standard_module('marshal'), True) + self.assertEqual(modutils.is_standard_module('hashlib'), True) + self.assertEqual(modutils.is_standard_module('pickle'), True) + self.assertEqual(modutils.is_standard_module('email'), True) + self.assertEqual(modutils.is_standard_module('io'), sys.version_info >= (2, 6)) + self.assertEqual(modutils.is_standard_module('StringIO'), sys.version_info < (3, 0)) + + def test_knownValues_is_standard_module_custom_path(self): self.assertEqual(modutils.is_standard_module('data.module', (DATADIR,)), True) self.assertEqual(modutils.is_standard_module('data.module', (path.abspath(DATADIR),)), True) - class is_relative_tc(ModutilsTestCase): -- cgit v1.2.1