예제 #1
0
def two_temp_modules(temp_module_factory):
    module1 = temp_module_factory()
    module2 = temp_module_factory()

    assert not module_imported(module1)
    assert not module_imported(module2)
    return module1, module2
예제 #2
0
def test_extension_loader__force(ext_loader, two_temp_modules):
    module1, module2 = two_temp_modules
    ext_loader.builtin_extensions[module1] = Extension(module1, [module2],
                                                       force=True)

    ext_loader.load_all()

    assert module_imported(module1)
    assert module_imported(module2)
예제 #3
0
def test_extension_loader__force(ext_loader):
    with unload_load('stat'), unload_load('pprint'):
        assert not module_imported('stat')
        assert not module_imported('pprint')

        ext_loader.builtin_extensions['stat'] = Extension('stat', ['pprint'], force=True)

        ext_loader.load_all()

        assert module_imported('stat')
        assert module_imported('pprint')
예제 #4
0
def test_extension_loader__lazy(ext_loader, two_temp_modules):
    module1, module2 = two_temp_modules

    ext_loader.builtin_extensions[module1] = Extension(module1, [module2],
                                                       force=False)

    ext_loader.load_all()

    assert not module_imported(module1)
    assert not module_imported(module2)

    import_module(module2)  # noqa

    assert module_imported(module1)
    assert module_imported(module2)
예제 #5
0
def test_extension_loader__lazy_defered(ext_loader, two_temp_modules,
                                        temp_module_factory):
    module1, module2 = two_temp_modules

    ext_loader.builtin_extensions[module1] = Extension(module1, [module2],
                                                       force=False)

    ext_loader.load_all()

    assert not module_imported(module1)
    assert not module_imported(module2)

    module3 = temp_module_factory(f'import {module2}')
    import_module(module3)  # noqa

    assert module_imported(module1)
    assert module_imported(module2)
예제 #6
0
 def inner(text=''):
     module = 'sys'
     while module_imported(module):
         name = f'temp_module_{random.randint(0, 10 ** 6)}'
         module_path = fs.current_module_path(name) + '.py'
         with open(module_path, 'w') as f:
             f.write(text)
         modules.append(module_path)
         module = f'tests.ext.{name}'
     return module
예제 #7
0
    def load(cls, extension: Union[str, Extension]):
        """
        Load single extension

        :param extension: str of :class:`Extension` instance to load
        """
        if isinstance(extension, str):
            extension = Extension(extension, [], force=True)
        if extension not in cls._loaded_extensions and not module_imported(extension.module):
            logger.debug('Importing extension module %s', extension.module)
            cls._loaded_extensions[extension] = import_module(extension.module)
예제 #8
0
def unload_load(module_name):
    if module_imported(module_name):
        mod = sys.modules.pop(module_name)
        try:
            yield
        finally:
            sys.modules[module_name] = mod
    else:
        try:
            yield
        finally:
            sys.modules.pop(module_name, None)
예제 #9
0
    def load_module(self, fullname):
        # change this hook to registering hook
        reg = _ImportLoadExtRegisterer()
        sys.meta_path = [reg] + [x for x in sys.meta_path if x is not self]
        try:
            # fallback to ordinary importing
            module = importlib.import_module(fullname)
        finally:
            # put this hook back
            sys.meta_path = [self] + [x for x in sys.meta_path if x is not reg]

        # check all that was imported and import all extensions that are ready
        for imported in reg.imported:
            if not module_imported(imported):
                continue
            extension = self.module_to_extension.get(imported)
            if extension is None:
                continue

            if all(module_imported(m) for m in extension.reqs):
                ExtensionLoader.load(extension)

        return module
예제 #10
0
    def load_module(self, fullname):
        sys.meta_path = [x for x in sys.meta_path if x is not self]
        try:
            module = importlib.import_module(fullname)
        finally:
            sys.meta_path = [self] + sys.meta_path
        extension = self.module_to_extension.get(fullname)
        if extension is None:
            return module

        if all(module_imported(m) for m in extension.reqs):
            ExtensionLoader.load(extension)

        return module
예제 #11
0
    def load_all(cls, try_lazy=True):
        """
        Load all (builtin and additional) extensions

        :param try_lazy: if `False`, use force load for all builtin extensions
        """
        for_hook = []
        for ext in cls.builtin_extensions.values():
            if not try_lazy or hasattr(sys, 'frozen') or ext.force:
                if all(module_importable(r) for r in ext.reqs):
                    cls.load(ext)
            else:
                if all(module_imported(r) for r in ext.reqs):
                    cls.load(ext)
                else:
                    for_hook.append(ext)

        cls._setup_import_hook(for_hook)

        for mod in Core.ADDITIONAL_EXTENSIONS:
            cls.load(mod)
예제 #12
0
def test_extension_loader__lazy(ext_loader):
    with unload_load('marshal'), unload_load('dbm'):
        assert not module_imported('marshal')
        assert not module_imported('dbm')

        ext_loader.builtin_extensions['marshal'] = Extension('marshal', ['dbm'], force=False)

        ext_loader.load_all()

        assert not module_imported('marshal')
        assert not module_imported('dbm')

        import dbm  # noqa

        assert module_imported('marshal')
        assert module_imported('dbm')