mercurial/demandimport.py
changeset 3903 f9136599700f
parent 3898 316cd5b0c940
child 3921 6d0d025e125a
equal deleted inserted replaced
3902:0d27502a804c 3903:f9136599700f
    57             object.__setattr__(self, "_module", mod)
    57             object.__setattr__(self, "_module", mod)
    58     def __repr__(self):
    58     def __repr__(self):
    59         return "<unloaded module '%s'>" % self._data[0]
    59         return "<unloaded module '%s'>" % self._data[0]
    60     def __call__(self, *args, **kwargs):
    60     def __call__(self, *args, **kwargs):
    61         raise TypeError("'unloaded module' object is not callable")
    61         raise TypeError("'unloaded module' object is not callable")
    62     def __getattr__(self, attr):
    62     def __getattribute__(self, attr):
       
    63         if attr in ('_data', '_extend', '_load', '_module'):
       
    64             return object.__getattribute__(self, attr)
    63         self._load()
    65         self._load()
    64         return getattr(self._module, attr)
    66         return getattr(self._module, attr)
    65     def __setattr__(self, attr, val):
    67     def __setattr__(self, attr, val):
    66         self._load()
    68         self._load()
    67         setattr(self._module, attr, val)
    69         setattr(self._module, attr, val)
    72         return _origimport(name, globals, locals, fromlist)
    74         return _origimport(name, globals, locals, fromlist)
    73     elif not fromlist:
    75     elif not fromlist:
    74         # import a [as b]
    76         # import a [as b]
    75         if '.' in name: # a.b
    77         if '.' in name: # a.b
    76             base, rest = name.split('.', 1)
    78             base, rest = name.split('.', 1)
       
    79             # email.__init__ loading email.mime
       
    80             if globals and globals.get('__name__', None) == base:
       
    81                 return _origimport(name, globals, locals, fromlist)
    77             # if a is already demand-loaded, add b to its submodule list
    82             # if a is already demand-loaded, add b to its submodule list
    78             if base in locals:
    83             if base in locals:
    79                 if isinstance(locals[base], _demandmod):
    84                 if isinstance(locals[base], _demandmod):
    80                     locals[base]._extend(rest)
    85                     locals[base]._extend(rest)
    81                 return locals[base]
    86                 return locals[base]
    90             # set requested submodules for demand load
    95             # set requested submodules for demand load
    91             if not(hasattr(mod, x)):
    96             if not(hasattr(mod, x)):
    92                 setattr(mod, x, _demandmod(x, mod.__dict__, mod.__dict__))
    97                 setattr(mod, x, _demandmod(x, mod.__dict__, mod.__dict__))
    93         return mod
    98         return mod
    94 
    99 
    95 ignore = ['_hashlib', 'email.mime']
   100 ignore = []
    96 
   101 
    97 def enable():
   102 def enable():
    98     "enable global demand-loading of modules"
   103     "enable global demand-loading of modules"
    99     __builtins__["__import__"] = _demandimport
   104     __builtins__["__import__"] = _demandimport
   100 
   105