diff options
author | Rémi Cardona <remi.cardona@logilab.fr> | 2015-06-29 19:16:21 +0200 |
---|---|---|
committer | Rémi Cardona <remi.cardona@logilab.fr> | 2015-06-29 19:16:21 +0200 |
commit | dabff316576806fcd84c2dcff34b7c9e3aa3d4bc (patch) | |
tree | d268afc204792f5770a37d7103d2642ffdd56ac0 | |
parent | 8caa4d6ad334e64ca78ab24b709b7763eb54e8d8 (diff) | |
download | logilab-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.py | 3 | ||||
-rw-r--r-- | test/unittest_modutils.py | 7 |
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) |