mercurial/demandimport.py
changeset 14977 1dbd42a02153
parent 14976 04a950b1c2ad
child 15096 868282fa29d8
equal deleted inserted replaced
14976:04a950b1c2ad 14977:1dbd42a02153
    25 '''
    25 '''
    26 
    26 
    27 import __builtin__
    27 import __builtin__
    28 _origimport = __import__
    28 _origimport = __import__
    29 
    29 
       
    30 nothing = object()
       
    31 
    30 class _demandmod(object):
    32 class _demandmod(object):
    31     """module demand-loader and proxy"""
    33     """module demand-loader and proxy"""
    32     def __init__(self, name, globals, locals):
    34     def __init__(self, name, globals, locals):
    33         if '.' in name:
    35         if '.' in name:
    34             head, rest = name.split('.', 1)
    36             head, rest = name.split('.', 1)
    48             # load submodules
    50             # load submodules
    49             def subload(mod, p):
    51             def subload(mod, p):
    50                 h, t = p, None
    52                 h, t = p, None
    51                 if '.' in p:
    53                 if '.' in p:
    52                     h, t = p.split('.', 1)
    54                     h, t = p.split('.', 1)
    53                 if not hasattr(mod, h):
    55                 if getattr(mod, h, nothing) is nothing:
    54                     setattr(mod, h, _demandmod(p, mod.__dict__, mod.__dict__))
    56                     setattr(mod, h, _demandmod(p, mod.__dict__, mod.__dict__))
    55                 elif t:
    57                 elif t:
    56                     subload(getattr(mod, h), t)
    58                     subload(getattr(mod, h), t)
    57 
    59 
    58             for x in after:
    60             for x in after:
   107             return _origimport(name, globals, locals, fromlist, level)
   109             return _origimport(name, globals, locals, fromlist, level)
   108         # from a import b,c,d
   110         # from a import b,c,d
   109         mod = _origimport(name, globals, locals)
   111         mod = _origimport(name, globals, locals)
   110         # recurse down the module chain
   112         # recurse down the module chain
   111         for comp in name.split('.')[1:]:
   113         for comp in name.split('.')[1:]:
   112             if not hasattr(mod, comp):
   114             if getattr(mod, comp, nothing) is nothing:
   113                 setattr(mod, comp, _demandmod(comp, mod.__dict__, mod.__dict__))
   115                 setattr(mod, comp, _demandmod(comp, mod.__dict__, mod.__dict__))
   114             mod = getattr(mod, comp)
   116             mod = getattr(mod, comp)
   115         for x in fromlist:
   117         for x in fromlist:
   116             # set requested submodules for demand load
   118             # set requested submodules for demand load
   117             if not hasattr(mod, x):
   119             if getattr(mod, x, nothing) is nothing:
   118                 setattr(mod, x, _demandmod(x, mod.__dict__, locals))
   120                 setattr(mod, x, _demandmod(x, mod.__dict__, locals))
   119         return mod
   121         return mod
   120 
   122 
   121 ignore = [
   123 ignore = [
   122     '_hashlib',
   124     '_hashlib',
   146     __builtin__.__import__ = _demandimport
   148     __builtin__.__import__ = _demandimport
   147 
   149 
   148 def disable():
   150 def disable():
   149     "disable global demand-loading of modules"
   151     "disable global demand-loading of modules"
   150     __builtin__.__import__ = _origimport
   152     __builtin__.__import__ = _origimport
   151