Mercurial > hg
comparison mercurial/demandimport.py @ 12894:bc91a79fa3d0 stable
demandimport: back out 50a4e55aa278 (issue2467)
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Sat, 30 Oct 2010 11:32:04 -0500 |
parents | cddea24aafed |
children | 34034e55424f |
comparison
equal
deleted
inserted
replaced
12893:15ca4bfecfe3 | 12894:bc91a79fa3d0 |
---|---|
27 import __builtin__ | 27 import __builtin__ |
28 _origimport = __import__ | 28 _origimport = __import__ |
29 | 29 |
30 class _demandmod(object): | 30 class _demandmod(object): |
31 """module demand-loader and proxy""" | 31 """module demand-loader and proxy""" |
32 def __init__(self, name, globals, locals, level): | 32 def __init__(self, name, globals, locals): |
33 if '.' in name: | 33 if '.' in name: |
34 head, rest = name.split('.', 1) | 34 head, rest = name.split('.', 1) |
35 after = [rest] | 35 after = [rest] |
36 else: | 36 else: |
37 head = name | 37 head = name |
38 after = [] | 38 after = [] |
39 object.__setattr__(self, "_data", (head, globals, locals, after, level)) | 39 object.__setattr__(self, "_data", (head, globals, locals, after)) |
40 object.__setattr__(self, "_module", None) | 40 object.__setattr__(self, "_module", None) |
41 def _extend(self, name): | 41 def _extend(self, name): |
42 """add to the list of submodules to load""" | 42 """add to the list of submodules to load""" |
43 self._data[3].append(name) | 43 self._data[3].append(name) |
44 def _load(self): | 44 def _load(self): |
45 if not self._module: | 45 if not self._module: |
46 head, globals, locals, after, level = self._data | 46 head, globals, locals, after = self._data |
47 if level is not None: | 47 mod = _origimport(head, globals, locals) |
48 mod = _origimport(head, globals, locals, level) | |
49 else: | |
50 mod = _origimport(head, globals, locals) | |
51 # load submodules | 48 # load submodules |
52 def subload(mod, p): | 49 def subload(mod, p): |
53 h, t = p, None | 50 h, t = p, None |
54 if '.' in p: | 51 if '.' in p: |
55 h, t = p.split('.', 1) | 52 h, t = p.split('.', 1) |
56 if not hasattr(mod, h): | 53 if not hasattr(mod, h): |
57 # TODO: should we adjust the level here? | 54 setattr(mod, h, _demandmod(p, mod.__dict__, mod.__dict__)) |
58 submod = _demandmod(p, mod.__dict__, mod.__dict__, | |
59 level=level) | |
60 setattr(mod, h, submod) | |
61 elif t: | 55 elif t: |
62 subload(getattr(mod, h), t) | 56 subload(getattr(mod, h), t) |
63 | 57 |
64 for x in after: | 58 for x in after: |
65 subload(mod, x) | 59 subload(mod, x) |
95 # import a [as b] | 89 # import a [as b] |
96 if '.' in name: # a.b | 90 if '.' in name: # a.b |
97 base, rest = name.split('.', 1) | 91 base, rest = name.split('.', 1) |
98 # email.__init__ loading email.mime | 92 # email.__init__ loading email.mime |
99 if globals and globals.get('__name__', None) == base: | 93 if globals and globals.get('__name__', None) == base: |
100 if level is not None: | 94 return _origimport(name, globals, locals, fromlist) |
101 return _origimport(name, globals, locals, fromlist, level) | |
102 else: | |
103 return _origimport(name, globals, locals, fromlist) | |
104 # if a is already demand-loaded, add b to its submodule list | 95 # if a is already demand-loaded, add b to its submodule list |
105 if base in locals: | 96 if base in locals: |
106 if isinstance(locals[base], _demandmod): | 97 if isinstance(locals[base], _demandmod): |
107 locals[base]._extend(rest) | 98 locals[base]._extend(rest) |
108 return locals[base] | 99 return locals[base] |
109 return _demandmod(name, globals, locals, level=level) | 100 return _demandmod(name, globals, locals) |
110 else: | 101 else: |
102 if level is not None: | |
103 # from . import b,c,d or from .a import b,c,d | |
104 return _origimport(name, globals, locals, fromlist, level) | |
111 # from a import b,c,d | 105 # from a import b,c,d |
112 if level is not None: | 106 mod = _origimport(name, globals, locals) |
113 mod = _origimport(name, globals, locals, level=level) | |
114 else: | |
115 mod = _origimport(name, globals, locals) | |
116 # recurse down the module chain | 107 # recurse down the module chain |
117 for comp in name.split('.')[1:]: | 108 for comp in name.split('.')[1:]: |
118 if not hasattr(mod, comp): | 109 if not hasattr(mod, comp): |
119 # TODO: should we adjust the level here? | 110 setattr(mod, comp, _demandmod(comp, mod.__dict__, mod.__dict__)) |
120 submod = _demandmod(comp, mod.__dict__, mod.__dict__, | |
121 level=level) | |
122 setattr(mod, comp, submod) | |
123 mod = getattr(mod, comp) | 111 mod = getattr(mod, comp) |
124 for x in fromlist: | 112 for x in fromlist: |
125 # set requested submodules for demand load | 113 # set requested submodules for demand load |
126 if not(hasattr(mod, x)): | 114 if not(hasattr(mod, x)): |
127 # TODO: should we adjust the level here? | 115 setattr(mod, x, _demandmod(x, mod.__dict__, locals)) |
128 submod = _demandmod(x, mod.__dict__, locals, level=level) | |
129 setattr(mod, x, submod) | |
130 return mod | 116 return mod |
131 | 117 |
132 ignore = [ | 118 ignore = [ |
133 '_hashlib', | 119 '_hashlib', |
134 '_xmlplus', | 120 '_xmlplus', |