summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémi Cardona <remi.cardona@logilab.fr>2015-06-29 19:16:21 +0200
committerRémi Cardona <remi.cardona@logilab.fr>2015-06-29 19:16:21 +0200
commitdabff316576806fcd84c2dcff34b7c9e3aa3d4bc (patch)
treed268afc204792f5770a37d7103d2642ffdd56ac0
parent8caa4d6ad334e64ca78ab24b709b7763eb54e8d8 (diff)
downloadlogilab-common-dabff316576806fcd84c2dcff34b7c9e3aa3d4bc.tar.gz
[test] Fix modutils tests when running inside a python 3 virtualenv (closes #294756)
Virtualenv symlinks a bunch of stdlib modules which confuse modutils.is_standard_module. The better way would obviously be to fix modutils to properly detect virtualenvs, but life is too short. As for why virtualenv actually needs to symlink a good chunk of the stdlib, anyone's guess is as good as mine. Here's the upstream commit that added hashlib.py to the list of needed symlinks: https://github.com/pypa/virtualenv/commit/10ba3f3cc0d7a254dd72e2bb9557006da2f85e00#diff-7e83770aa980bd4327db90f4eafeffdfR126 And for the record, 'venv' (the virtualenv-lookalike shipped since python 3.3) does not do _any_ symlink to stdlib modules.
-rw-r--r--logilab/common/modutils.py3
-rw-r--r--test/unittest_modutils.py7
2 files changed, 8 insertions, 2 deletions
diff --git a/logilab/common/modutils.py b/logilab/common/modutils.py
index b587e8c..dd725d2 100644
--- a/logilab/common/modutils.py
+++ b/logilab/common/modutils.py
@@ -495,6 +495,9 @@ def is_standard_module(modname, std_path=(STD_LIB_DIR,)):
true if the module:
- is located on the path listed in one of the directory in `std_path`
- is a built-in module
+
+ Note: this function is known to return wrong values when inside virtualenv.
+ See https://www.logilab.org/ticket/294756.
"""
modname = modname.split('.')[0]
try:
diff --git a/test/unittest_modutils.py b/test/unittest_modutils.py
index 76741c8..dfed2ff 100644
--- a/test/unittest_modutils.py
+++ b/test/unittest_modutils.py
@@ -206,11 +206,14 @@ class is_standard_module_tc(ModutilsTestCase):
def test_4(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'), True)
self.assertEqual(modutils.is_standard_module('StringIO'), sys.version_info < (3, 0))
+ venv_py3 = sys.version_info[0] >= 3 and hasattr(sys, 'real_prefix')
+ if not venv_py3:
+ # those modules are symlinked by virtualenv (but not by python's venv)
+ self.assertEqual(modutils.is_standard_module('hashlib'), True)
+ self.assertEqual(modutils.is_standard_module('io'), True)
def test_custom_path(self):
self.assertEqual(modutils.is_standard_module('data.module', (DATADIR,)), True)