| Index: third_party/logilab/astroid/brain/py2gi.py
|
| diff --git a/third_party/logilab/astroid/brain/py2gi.py b/third_party/logilab/astroid/brain/py2gi.py
|
| index dd9868db31902ff69491c4e13e182493d554bec5..6747898de5b8172e87f06edb4e62a82d7ac58a01 100644
|
| --- a/third_party/logilab/astroid/brain/py2gi.py
|
| +++ b/third_party/logilab/astroid/brain/py2gi.py
|
| @@ -4,6 +4,7 @@ Helps with understanding everything imported from 'gi.repository'
|
| """
|
|
|
| import inspect
|
| +import itertools
|
| import sys
|
| import re
|
|
|
| @@ -111,40 +112,33 @@ def _gi_build_stub(parent):
|
|
|
| return ret
|
|
|
| -# Overwrite Module.module_import to _actually_ import the introspected module if
|
| -# it's a gi module, then build stub code by examining its info and get an astng
|
| -# from that
|
| -
|
| -from astroid.scoped_nodes import Module
|
| -_orig_import_module = Module.import_module
|
| -
|
| -def _new_import_module(self, modname, relative_only=False, level=None):
|
| - # Could be a static piece of gi.repository or whatever unrelated module,
|
| - # let that fall through
|
| - try:
|
| - return _orig_import_module(self, modname, relative_only, level)
|
| - except AstroidBuildingException:
|
| - # we only consider gi.repository submodules
|
| - if not modname.startswith('gi.repository.'):
|
| - if relative_only and level is None:
|
| - level = 0
|
| - modname = self.relative_to_absolute_name(modname, level)
|
| - if not modname.startswith('gi.repository.'):
|
| - raise
|
| +def _import_gi_module(modname):
|
| + # we only consider gi.repository submodules
|
| + if not modname.startswith('gi.repository.'):
|
| + raise AstroidBuildingException()
|
| # build astroid representation unless we already tried so
|
| if modname not in _inspected_modules:
|
| modnames = [modname]
|
| - # GLib and GObject have some special case handling
|
| - # in pygobject that we need to cope with
|
| + optional_modnames = []
|
| +
|
| + # GLib and GObject may have some special case handling
|
| + # in pygobject that we need to cope with. However at
|
| + # least as of pygobject3-3.13.91 the _glib module doesn't
|
| + # exist anymore, so if treat these modules as optional.
|
| if modname == 'gi.repository.GLib':
|
| - modnames.append('gi._glib')
|
| + optional_modnames.append('gi._glib')
|
| elif modname == 'gi.repository.GObject':
|
| - modnames.append('gi._gobject')
|
| + optional_modnames.append('gi._gobject')
|
| +
|
| try:
|
| modcode = ''
|
| - for m in modnames:
|
| - __import__(m)
|
| - modcode += _gi_build_stub(sys.modules[m])
|
| + for m in itertools.chain(modnames, optional_modnames):
|
| + try:
|
| + __import__(m)
|
| + modcode += _gi_build_stub(sys.modules[m])
|
| + except ImportError:
|
| + if m not in optional_modnames:
|
| + raise
|
| except ImportError:
|
| astng = _inspected_modules[modname] = None
|
| else:
|
| @@ -156,4 +150,6 @@ def _new_import_module(self, modname, relative_only=False, level=None):
|
| raise AstroidBuildingException('Failed to import module %r' % modname)
|
| return astng
|
|
|
| -Module.import_module = _new_import_module
|
| +
|
| +MANAGER.register_failed_import_hook(_import_gi_module)
|
| +
|
|
|