| 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)
 | 
| +
 | 
| 
 |