diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2017-07-12 08:45:23 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2017-07-12 08:45:27 +0900 |
commit | ee6939d73fd96606a92eee870014c58eafee5e63 (patch) | |
tree | 6a3526fab8e841879fbcab05749fcb4a91a4f580 /gi/__init__.py | |
parent | 0df45a72dc2a72275a5c49c38b87f73341987192 (diff) | |
download | pygobject2-ee6939d73fd96606a92eee870014c58eafee5e63.tar.gz pygobject2-ee6939d73fd96606a92eee870014c58eafee5e63.tar.bz2 pygobject2-ee6939d73fd96606a92eee870014c58eafee5e63.zip |
Imported Upstream version 3.20.0
Change-Id: I8106882e9a0d7a8fb554f9549e7c2cde111c104b
Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
Diffstat (limited to 'gi/__init__.py')
-rw-r--r-- | gi/__init__.py | 95 |
1 files changed, 88 insertions, 7 deletions
diff --git a/gi/__init__.py b/gi/__init__.py index e6bc06e..caad569 100644 --- a/gi/__init__.py +++ b/gi/__init__.py @@ -20,27 +20,81 @@ from __future__ import absolute_import -from ._gi import _API, Repository +# support overrides in different directories than our gi module +from pkgutil import extend_path +__path__ = extend_path(__path__, __name__) -# Force loading the GObject typelib so we have available the wrappers for -# base classes such as GInitiallyUnowned -import gi._gobject +import sys import os +import importlib +import types + +_static_binding_error = ('When using gi.repository you must not import static ' + 'modules like "gobject". Please change all occurrences ' + 'of "import gobject" to "from gi.repository import GObject". ' + 'See: https://bugzilla.gnome.org/show_bug.cgi?id=709183') + +# we can't have pygobject 2 loaded at the same time we load the internal _gobject +if 'gobject' in sys.modules: + raise ImportError(_static_binding_error) + + +from . import _gi +from ._gi import _gobject +from ._gi import _API +from ._gi import Repository +from ._gi import PyGIDeprecationWarning +from ._gi import PyGIWarning + +_API = _API # pyflakes +PyGIDeprecationWarning = PyGIDeprecationWarning +PyGIWarning = PyGIWarning _versions = {} _overridesdir = os.path.join(os.path.dirname(__file__), 'overrides') +version_info = _gobject.pygobject_version[:] +__version__ = "{0}.{1}.{2}".format(*version_info) + + +class _DummyStaticModule(types.ModuleType): + __path__ = None + + def __getattr__(self, name): + raise AttributeError(_static_binding_error) + + +sys.modules['glib'] = _DummyStaticModule('glib', _static_binding_error) +sys.modules['gobject'] = _DummyStaticModule('gobject', _static_binding_error) +sys.modules['gio'] = _DummyStaticModule('gio', _static_binding_error) +sys.modules['gtk'] = _DummyStaticModule('gtk', _static_binding_error) +sys.modules['gtk.gdk'] = _DummyStaticModule('gtk.gdk', _static_binding_error) + + +def check_version(version): + if isinstance(version, str): + version_list = tuple(map(int, version.split("."))) + else: + version_list = version + + if version_list > version_info: + raise ValueError(( + "pygobject's version %s required, and available version " + "%s is not recent enough") % (version, __version__) + ) + + def require_version(namespace, version): repository = Repository.get_default() if namespace in repository.get_loaded_namespaces(): loaded_version = repository.get_version(namespace) if loaded_version != version: - raise ValueError('Namespace %s is already loaded with version %s' % \ + raise ValueError('Namespace %s is already loaded with version %s' % (namespace, loaded_version)) if namespace in _versions and _versions[namespace] != version: - raise ValueError('Namespace %s already requires version %s' % \ + raise ValueError('Namespace %s already requires version %s' % (namespace, _versions[namespace])) available_versions = repository.enumerate_versions(namespace) @@ -48,10 +102,37 @@ def require_version(namespace, version): raise ValueError('Namespace %s not available' % namespace) if version not in available_versions: - raise ValueError('Namespace %s not available for version %s' % \ + raise ValueError('Namespace %s not available for version %s' % (namespace, version)) _versions[namespace] = version + def get_required_version(namespace): return _versions.get(namespace, None) + + +def require_foreign(namespace, symbol=None): + """Ensure the given foreign marshaling module is available and loaded. + + :param str namespace: + Introspection namespace of the foreign module (e.g. "cairo") + :param symbol: + Optional symbol typename to ensure a converter exists. + :type symbol: str or None + :raises: ImportError + + :Example: + + .. code-block:: python + + import gi + import cairo + gi.require_foreign('cairo') + + """ + try: + _gi.require_foreign(namespace, symbol) + except Exception as e: + raise ImportError(str(e)) + importlib.import_module('gi.repository', namespace) |