diff options
author | Philipp Hörist <forenjunkie@chello.at> | 2017-01-03 23:24:13 +0300 |
---|---|---|
committer | Philipp Hörist <forenjunkie@chello.at> | 2017-01-03 23:24:13 +0300 |
commit | da4cf7e6fd5cfed9b209bf03699ac89fc8a62878 (patch) | |
tree | 4555bc52b2f72c6cd23d862804df626d0d8b70fd | |
parent | 2d0a0edd195cdc6a6d0b1fee9ecf1e92aa286b50 (diff) | |
parent | a8d01a3ed52de8559647eac65ac1197c48ca8cfe (diff) |
Merge branch 'no-demand' into 'gajim_0.16'
Dont use demandimport anymore
See merge request !9
-rw-r--r-- | src/common/demandimport.py | 145 | ||||
-rw-r--r-- | src/gajim.py | 8 |
2 files changed, 4 insertions, 149 deletions
diff --git a/src/common/demandimport.py b/src/common/demandimport.py index e4394876f..4662e412a 100644 --- a/src/common/demandimport.py +++ b/src/common/demandimport.py @@ -6,150 +6,13 @@ # GNU General Public License version 2 or any later version. ''' -demandimport - automatic demandloading of modules - -To enable this module, do: - - import demandimport; demandimport.enable() - -Imports of the following forms will be demand-loaded: - - import a, b.c - import a.b as c - from a import b,c # a will be loaded immediately - -These imports will not be delayed: - - from a import * - b = __import__(a) +dummy module for demandimport, use it until no plugin uses demandimport anymore ''' -import __builtin__ -_origimport = __import__ - -nothing = object() - -try: - _origimport(__builtin__.__name__, {}, {}, None, -1) -except TypeError: # no level argument - def _import(name, globals, locals, fromlist, level): - "call _origimport with no level argument" - return _origimport(name, globals, locals, fromlist) -else: - _import = _origimport - -class _demandmod(object): - """module demand-loader and proxy""" - def __init__(self, name, globals, locals): - if '.' in name: - head, rest = name.split('.', 1) - after = [rest] - else: - head = name - after = [] - object.__setattr__(self, "_data", (head, globals, locals, after)) - object.__setattr__(self, "_module", None) - def _extend(self, name): - """add to the list of submodules to load""" - self._data[3].append(name) - def _load(self): - if not self._module: - head, globals, locals, after = self._data - mod = _origimport(head, globals, locals) - # load submodules - def subload(mod, p): - h, t = p, None - if '.' in p: - h, t = p.split('.', 1) - if getattr(mod, h, nothing) is nothing: - setattr(mod, h, _demandmod(p, mod.__dict__, mod.__dict__)) - elif t: - subload(getattr(mod, h), t) - - for x in after: - subload(mod, x) - - # are we in the locals dictionary still? - if locals and locals.get(head) == self: - locals[head] = mod - object.__setattr__(self, "_module", mod) - - def __repr__(self): - if self._module: - return "<proxied module '%s'>" % self._data[0] - return "<unloaded module '%s'>" % self._data[0] - 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'): - return object.__getattribute__(self, attr) - self._load() - return getattr(self._module, attr) - def __setattr__(self, attr, val): - self._load() - setattr(self._module, attr, val) - -def _demandimport(name, globals=None, locals=None, fromlist=None, level=-1): - if not locals or name in ignore or fromlist == ('*',): - # these cases we can't really delay - return _import(name, globals, locals, fromlist, level) - elif not fromlist: - # import a [as b] - if '.' in name: # a.b - base, rest = name.split('.', 1) - # email.__init__ loading email.mime - if globals and globals.get('__name__', None) == base: - return _import(name, globals, locals, fromlist, level) - # if a is already demand-loaded, add b to its submodule list - if base in locals: - if isinstance(locals[base], _demandmod): - locals[base]._extend(rest) - return locals[base] - return _demandmod(name, globals, locals) - else: - if level != -1: - # from . import b,c,d or from .a import b,c,d - return _origimport(name, globals, locals, fromlist, level) - # from a import b,c,d - mod = _origimport(name, globals, locals) - # recurse down the module chain - for comp in name.split('.')[1:]: - if getattr(mod, comp, nothing) is nothing: - setattr(mod, comp, _demandmod(comp, mod.__dict__, mod.__dict__)) - mod = getattr(mod, comp) - for x in fromlist: - # set requested submodules for demand load - if getattr(mod, x, nothing) is nothing: - setattr(mod, x, _demandmod(x, mod.__dict__, locals)) - return mod - -ignore = [ - '_hashlib', - '_xmlplus', - 'fcntl', - 'win32com.gen_py', - '_winreg', # 2.7 mimetypes needs immediate ImportError - 'pythoncom', - # imported by tarfile, not available under Windows - 'pwd', - 'grp', - # imported by profile, itself imported by hotshot.stats, - # not available under Windows - 'resource', - # this trips up many extension authors - 'gtk', - # setuptools' pkg_resources.py expects "from __main__ import x" to - # raise ImportError if x not defined - '__main__', - '_ssl', # conditional imports in the stdlib, issue1964 - 'rfc822', - 'mimetools', - ] +ignore = [] def enable(): - "enable global demand-loading of modules" - __builtin__.__import__ = _demandimport + pass def disable(): - "disable global demand-loading of modules" - __builtin__.__import__ = _origimport + pass diff --git a/src/gajim.py b/src/gajim.py index 94f780e05..78bc8c50e 100644 --- a/src/gajim.py +++ b/src/gajim.py @@ -90,14 +90,6 @@ if not HAS_NBXMPP: print 'Gajim needs python-nbxmpp >= %s to run. Quiting...' % MIN_NBXMPP_VER sys.exit() -from common import demandimport -demandimport.enable() -demandimport.ignore += ['gobject._gobject', 'libasyncns', 'i18n', - 'logging.NullHandler', 'dbus.service', 'OpenSSL.SSL', 'OpenSSL.crypto', - 'common.sleepy', 'DLFCN', 'dl', 'xml.sax', 'xml.sax.handler', 'ic', - 'Crypto.PublicKey', 'IPython', 'contextlib', 'imp', 'gst.interfaces', - 'libxml2', 'libxml2mod', 'monotonic', 'gtkexcepthook', 'google.protobuf'] - if os.name == 'nt': import locale import gettext |