diff --git a/hgdemandimport/demandimportpy2.py b/hgdemandimport/demandimportpy2.py --- a/hgdemandimport/demandimportpy2.py +++ b/hgdemandimport/demandimportpy2.py @@ -153,9 +153,7 @@ class _demandmod(object): def __call__(self, *args, **kwargs): raise TypeError("%s object is not callable" % repr(self)) - def __getattribute__(self, attr): - if attr in ('_data', '_extend', '_load', '_module', '_addref'): - return object.__getattribute__(self, attr) + def __getattr__(self, attr): self._load() return getattr(self._module, attr) @@ -163,6 +161,16 @@ class _demandmod(object): self._load() setattr(self._module, attr, val) + @property + def __dict__(self): + self._load() + return self._module.__dict__ + + @property + def __doc__(self): + self._load() + return self._module.__doc__ + _pypy = '__pypy__' in sys.builtin_module_names def _demandimport(name, globals=None, locals=None, fromlist=None, level=level): diff --git a/tests/test-demandimport.py b/tests/test-demandimport.py --- a/tests/test-demandimport.py +++ b/tests/test-demandimport.py @@ -69,6 +69,17 @@ print("re =", f(re)) print("re.stderr =", f(re.stderr)) print("re =", f(re)) +# Test access to special attributes through demandmod proxy +from mercurial import pvec as pvecproxy +print("pvecproxy =", f(pvecproxy)) +print("pvecproxy.__doc__ = %r" + % (' '.join(pvecproxy.__doc__.split()[:3]) + ' ...')) +print("pvecproxy.__name__ = %r" % pvecproxy.__name__) +# __name__ must be accessible via __dict__ so the relative imports can be +# resolved +print("pvecproxy.__dict__['__name__'] = %r" % pvecproxy.__dict__['__name__']) +print("pvecproxy =", f(pvecproxy)) + import contextlib print("contextlib =", f(contextlib)) try: diff --git a/tests/test-demandimport.py.out b/tests/test-demandimport.py.out --- a/tests/test-demandimport.py.out +++ b/tests/test-demandimport.py.out @@ -18,6 +18,11 @@ remod = re = re.stderr = ', mode 'w' at 0x?> re = +pvecproxy = +pvecproxy.__doc__ = 'A "pvec" is ...' +pvecproxy.__name__ = 'mercurial.pvec' +pvecproxy.__dict__['__name__'] = 'mercurial.pvec' +pvecproxy = contextlib = contextlib.unknownattr = ImportError: cannot import name unknownattr __import__('contextlib', ..., ['unknownattr']) =