##// END OF EJS Templates
demandimport: store level argument on _demandmod instances...
Dan Villiom Podlaski Christiansen -
r11942:50a4e55a default
parent child Browse files
Show More
@@ -29,29 +29,35 b' import __builtin__'
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):
32 def __init__(self, name, globals, locals, level):
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))
39 object.__setattr__(self, "_data", (head, globals, locals, after, level))
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 = self._data
46 head, globals, locals, after, level = self._data
47 mod = _origimport(head, globals, locals)
47 if level is not None:
48 mod = _origimport(head, globals, locals, level)
49 else:
50 mod = _origimport(head, globals, locals)
48 # load submodules
51 # load submodules
49 def subload(mod, p):
52 def subload(mod, p):
50 h, t = p, None
53 h, t = p, None
51 if '.' in p:
54 if '.' in p:
52 h, t = p.split('.', 1)
55 h, t = p.split('.', 1)
53 if not hasattr(mod, h):
56 if not hasattr(mod, h):
54 setattr(mod, h, _demandmod(p, mod.__dict__, mod.__dict__))
57 # TODO: should we adjust the level here?
58 submod = _demandmod(p, mod.__dict__, mod.__dict__,
59 level=level)
60 setattr(mod, h, submod)
55 elif t:
61 elif t:
56 subload(getattr(mod, h), t)
62 subload(getattr(mod, h), t)
57
63
@@ -91,28 +97,36 b' def _demandimport(name, globals=None, lo'
91 base, rest = name.split('.', 1)
97 base, rest = name.split('.', 1)
92 # email.__init__ loading email.mime
98 # email.__init__ loading email.mime
93 if globals and globals.get('__name__', None) == base:
99 if globals and globals.get('__name__', None) == base:
94 return _origimport(name, globals, locals, fromlist)
100 if level is not None:
101 return _origimport(name, globals, locals, fromlist, level)
102 else:
103 return _origimport(name, globals, locals, fromlist)
95 # if a is already demand-loaded, add b to its submodule list
104 # if a is already demand-loaded, add b to its submodule list
96 if base in locals:
105 if base in locals:
97 if isinstance(locals[base], _demandmod):
106 if isinstance(locals[base], _demandmod):
98 locals[base]._extend(rest)
107 locals[base]._extend(rest)
99 return locals[base]
108 return locals[base]
100 return _demandmod(name, globals, locals)
109 return _demandmod(name, globals, locals, level=level)
101 else:
110 else:
111 # from a import b,c,d
102 if level is not None:
112 if level is not None:
103 # from . import b,c,d or from .a import b,c,d
113 mod = _origimport(name, globals, locals, level=level)
104 return _origimport(name, globals, locals, fromlist, level)
114 else:
105 # from a import b,c,d
115 mod = _origimport(name, globals, locals)
106 mod = _origimport(name, globals, locals)
107 # recurse down the module chain
116 # recurse down the module chain
108 for comp in name.split('.')[1:]:
117 for comp in name.split('.')[1:]:
109 if not hasattr(mod, comp):
118 if not hasattr(mod, comp):
110 setattr(mod, comp, _demandmod(comp, mod.__dict__, mod.__dict__))
119 # TODO: should we adjust the level here?
120 submod = _demandmod(comp, mod.__dict__, mod.__dict__,
121 level=level)
122 setattr(mod, comp, submod)
111 mod = getattr(mod, comp)
123 mod = getattr(mod, comp)
112 for x in fromlist:
124 for x in fromlist:
113 # set requested submodules for demand load
125 # set requested submodules for demand load
114 if not(hasattr(mod, x)):
126 if not(hasattr(mod, x)):
115 setattr(mod, x, _demandmod(x, mod.__dict__, locals))
127 # TODO: should we adjust the level here?
128 submod = _demandmod(x, mod.__dict__, locals, level=level)
129 setattr(mod, x, submod)
116 return mod
130 return mod
117
131
118 ignore = [
132 ignore = [
General Comments 0
You need to be logged in to leave comments. Login now