cubicweb/test/unittest_cubes.py
author Sylvain Thénault <sylvain.thenault@logilab.fr>
Fri, 03 Mar 2017 14:06:27 +0100
changeset 12063 4bcb58aa103a
parent 11955 f85ec84355db
permissions -rw-r--r--
[rset] Use RQL cache in syntax_tree method This avoid several unnecessary parsings per HTTP request, since in most case rset's rql is in the rql cache (since it has just been executed), while yapps based parsing is known to be slow.
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()