cubicweb/test/unittest_cubes.py
author Philippe Pepiot <philippe.pepiot@logilab.fr>
Thu, 05 Mar 2020 10:41:14 +0100
branch3.26
changeset 12905 fb6aecd654a3
parent 11955 f85ec84355db
permissions -rw-r--r--
[pkg] version 3.26.16
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11457
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
     1
# copyright 2016 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
     3
#
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
     4
# This file is part of CubicWeb.
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
     5
#
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
     9
# any later version.
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    10
#
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    14
# details.
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    15
#
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    17
# along with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    18
"""Unit tests for "cubes" importer."""
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    19
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    20
from contextlib import contextmanager
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    21
import os
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    22
from os import path
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    23
import sys
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    24
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    25
from six import PY2
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    26
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    27
from cubicweb import _CubesImporter
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    28
from cubicweb.cwconfig import CubicWebConfiguration
11955
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
    29
from cubicweb.devtools.testlib import TemporaryDirectory, TestCase
11457
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    30
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    31
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    32
@contextmanager
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    33
def temp_cube():
11912
c9e6df20e5a4 [test] use TemporaryDirectory context manager
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11457
diff changeset
    34
    with TemporaryDirectory() as tempdir:
c9e6df20e5a4 [test] use TemporaryDirectory context manager
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11457
diff changeset
    35
        try:
c9e6df20e5a4 [test] use TemporaryDirectory context manager
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11457
diff changeset
    36
            libdir = path.join(tempdir, 'libpython')
c9e6df20e5a4 [test] use TemporaryDirectory context manager
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11457
diff changeset
    37
            cubedir = path.join(libdir, 'cubicweb_foo')
c9e6df20e5a4 [test] use TemporaryDirectory context manager
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11457
diff changeset
    38
            os.makedirs(cubedir)
11955
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
    39
            check_code = ("import logging\n"
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
    40
                          "logging.getLogger('cubicweb_foo')"
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
    41
                          ".warn('imported %s', __name__)\n")
11912
c9e6df20e5a4 [test] use TemporaryDirectory context manager
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11457
diff changeset
    42
            with open(path.join(cubedir, '__init__.py'), 'w') as f:
11955
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
    43
                f.write("'cubicweb_foo application package'\n" + check_code)
11912
c9e6df20e5a4 [test] use TemporaryDirectory context manager
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11457
diff changeset
    44
            with open(path.join(cubedir, 'bar.py'), 'w') as f:
11955
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
    45
                f.write(check_code + 'baz = 1\n')
11912
c9e6df20e5a4 [test] use TemporaryDirectory context manager
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11457
diff changeset
    46
            sys.path.append(libdir)
c9e6df20e5a4 [test] use TemporaryDirectory context manager
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11457
diff changeset
    47
            yield cubedir
c9e6df20e5a4 [test] use TemporaryDirectory context manager
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11457
diff changeset
    48
        finally:
c9e6df20e5a4 [test] use TemporaryDirectory context manager
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11457
diff changeset
    49
            sys.path.remove(libdir)
11457
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    50
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    51
11955
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
    52
class CubesImporterTC(TestCase):
11457
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    53
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    54
    def setUp(self):
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    55
        # During discovery, CubicWebConfiguration.cls_adjust_sys_path may be
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    56
        # called (probably because of cubicweb.devtools's __init__.py), so
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    57
        # uninstall _CubesImporter.
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    58
        for x in sys.meta_path:
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    59
            if isinstance(x, _CubesImporter):
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    60
                sys.meta_path.remove(x)
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    61
        # Keep track of initial sys.path and sys.meta_path.
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    62
        self.orig_sys_path = sys.path[:]
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    63
        self.orig_sys_meta_path = sys.meta_path[:]
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    64
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    65
    def tearDown(self):
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    66
        # Cleanup any imported "cubes".
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    67
        for name in list(sys.modules):
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    68
            if name.startswith('cubes') or name.startswith('cubicweb_'):
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    69
                del sys.modules[name]
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    70
        # Restore sys.{meta_,}path
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    71
        sys.path[:] = self.orig_sys_path
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    72
        sys.meta_path[:] = self.orig_sys_meta_path
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    73
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    74
    def test_importer_install(self):
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    75
        _CubesImporter.install()
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    76
        self.assertIsInstance(sys.meta_path[-1], _CubesImporter)
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    77
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    78
    def test_config_installs_importer(self):
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    79
        CubicWebConfiguration.cls_adjust_sys_path()
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    80
        self.assertIsInstance(sys.meta_path[-1], _CubesImporter)
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    81
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    82
    def test_import_cube_as_package_legacy_name(self):
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    83
        """Check for import of an actual package-cube using legacy name"""
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    84
        with temp_cube() as cubedir:
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    85
            import cubicweb_foo  # noqa
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    86
            del sys.modules['cubicweb_foo']
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    87
            with self.assertRaises(ImportError):
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    88
                import cubes.foo
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    89
            CubicWebConfiguration.cls_adjust_sys_path()
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    90
            import cubes.foo  # noqa
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    91
            self.assertEqual(cubes.foo.__path__, [cubedir])
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    92
            self.assertEqual(cubes.foo.__doc__,
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    93
                             'cubicweb_foo application package')
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    94
            # Import a submodule.
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    95
            from cubes.foo import bar
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    96
            self.assertEqual(bar.baz, 1)
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
    97
11954
e0d708fb20e8 Make load_module() return existing module if present in sys.modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11912
diff changeset
    98
    def test_reload_cube(self):
e0d708fb20e8 Make load_module() return existing module if present in sys.modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11912
diff changeset
    99
        """reloading cubes twice should return the same module"""
e0d708fb20e8 Make load_module() return existing module if present in sys.modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11912
diff changeset
   100
        CubicWebConfiguration.cls_adjust_sys_path()
e0d708fb20e8 Make load_module() return existing module if present in sys.modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11912
diff changeset
   101
        import cubes
e0d708fb20e8 Make load_module() return existing module if present in sys.modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11912
diff changeset
   102
        if PY2:
e0d708fb20e8 Make load_module() return existing module if present in sys.modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11912
diff changeset
   103
            new = reload(cubes)
e0d708fb20e8 Make load_module() return existing module if present in sys.modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11912
diff changeset
   104
        else:
e0d708fb20e8 Make load_module() return existing module if present in sys.modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11912
diff changeset
   105
            import importlib
e0d708fb20e8 Make load_module() return existing module if present in sys.modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11912
diff changeset
   106
            new = importlib.reload(cubes)
e0d708fb20e8 Make load_module() return existing module if present in sys.modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11912
diff changeset
   107
        self.assertIs(new, cubes)
e0d708fb20e8 Make load_module() return existing module if present in sys.modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11912
diff changeset
   108
11955
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   109
    def test_no_double_import(self):
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   110
        """Check new and legacy import the same module once"""
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   111
        with temp_cube():
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   112
            CubicWebConfiguration.cls_adjust_sys_path()
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   113
            with self.assertLogs('cubicweb_foo', 'WARNING') as cm:
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   114
                from cubes.foo import bar
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   115
                from cubicweb_foo import bar as bar2
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   116
                self.assertIs(bar, bar2)
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   117
                self.assertIs(sys.modules['cubes.foo'],
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   118
                              sys.modules['cubicweb_foo'])
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   119
            self.assertEqual(cm.output, [
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   120
                'WARNING:cubicweb_foo:imported cubicweb_foo',
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   121
                # module __name__ for subpackage differ along python version
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   122
                # for PY2 it's based on how the module was imported "from
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   123
                # cubes.foo import bar" and for PY3 based on __name__ of parent
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   124
                # module "cubicweb_foo". Not sure if it's an issue, but PY3
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   125
                # behavior looks better.
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   126
                'WARNING:cubicweb_foo:imported ' + (
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   127
                    'cubes.foo.bar' if PY2 else 'cubicweb_foo.bar')
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   128
            ])
f85ec84355db Fix possible double import of cubes modules
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11954
diff changeset
   129
11457
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   130
    def test_import_legacy_cube(self):
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   131
        """Check that importing a legacy cube works when sys.path got adjusted.
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   132
        """
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   133
        CubicWebConfiguration.cls_adjust_sys_path()
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   134
        import cubes.card  # noqa
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   135
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   136
    def test_import_cube_as_package_after_legacy_cube(self):
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   137
        """Check import of a "cube as package" after a legacy cube."""
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   138
        CubicWebConfiguration.cls_adjust_sys_path()
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   139
        with temp_cube() as cubedir:
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   140
            import cubes.card
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   141
            import cubes.foo
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   142
        self.assertEqual(cubes.foo.__path__, [cubedir])
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   143
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   144
    def test_cube_inexistant(self):
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   145
        """Check for import of an inexistant cube"""
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   146
        CubicWebConfiguration.cls_adjust_sys_path()
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   147
        with self.assertRaises(ImportError) as cm:
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   148
            import cubes.doesnotexists  # noqa
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   149
        msg = "No module named " + ("doesnotexists" if PY2 else "'cubes.doesnotexists'")
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   150
        self.assertEqual(str(cm.exception), msg)
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   151
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   152
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   153
if __name__ == '__main__':
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   154
    import unittest
d404fd8499dd Add an import redirect hook from "cubes.<name>" to "cubicweb_<name>"
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
diff changeset
   155
    unittest.main()