From 0ebd6a1b43a96bffa78da89dc8629edac0a74d35 Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Tue, 24 May 2016 16:45:39 +0200 Subject: [PATCH] python: Move the base wrapper class. * python/lang/pyme/util.py (GpgmeWrapper): Move... * python/lang/pyme/core.py: ... here. Signed-off-by: Justus Winter --- lang/python/pyme/core.py | 78 +++++++++++++++++++++++++++++++++++++++- lang/python/pyme/util.py | 78 ---------------------------------------- 2 files changed, 77 insertions(+), 79 deletions(-) diff --git a/lang/python/pyme/core.py b/lang/python/pyme/core.py index f15444be..aca5ec2d 100644 --- a/lang/python/pyme/core.py +++ b/lang/python/pyme/core.py @@ -22,7 +22,83 @@ from . import pygpgme from .errors import errorcheck, GPGMEError from . import errors -from .util import GpgmeWrapper + +class GpgmeWrapper(object): + """Base class all Pyme wrappers for GPGME functionality. Not to be + instantiated directly.""" + + def __init__(self, wrapped): + self._callback_excinfo = None + self.wrapped = wrapped + + def __repr__(self): + return '' % \ + (__name__, self.__class__.__name__, + self.wrapped) + + def __str__(self): + return repr(self) + + def __hash__(self): + return hash(repr(self.wrapped)) + + def __eq__(self, other): + if other == None: + return False + else: + return repr(self.wrapped) == repr(other.wrapped) + + def _getctype(self): + """Must be implemented by child classes. + + Must return the name of the c type.""" + raise NotImplementedError() + + def _getnameprepend(self): + """Must be implemented by child classes. + + Must return the prefix of all c functions mapped to methods of + this class.""" + raise NotImplementedError() + + def _errorcheck(self, name): + """Must be implemented by child classes. + + This function must return a trueish value for all c functions + returning gpgme_error_t.""" + raise NotImplementedError() + + def __getattr__(self, key): + """On-the-fly function generation.""" + if key[0] == '_' or self._getnameprepend() == None: + return None + name = self._getnameprepend() + key + func = getattr(pygpgme, name) + + if self._errorcheck(name): + def _funcwrap(slf, *args, **kwargs): + result = func(slf.wrapped, *args, **kwargs) + if slf._callback_excinfo: + pygpgme.pygpgme_raise_callback_exception(slf) + return errorcheck(result, "Invocation of " + name) + else: + def _funcwrap(slf, *args, **kwargs): + result = func(slf.wrapped, *args, **kwargs) + if slf._callback_excinfo: + pygpgme.pygpgme_raise_callback_exception(slf) + return result + + _funcwrap.__doc__ = getattr(func, "__doc__") + + # Monkey-patch the class. + setattr(self.__class__, key, _funcwrap) + + # Bind the method to 'self'. + def wrapper(*args, **kwargs): + return _funcwrap(self, *args, **kwargs) + _funcwrap.__doc__ = getattr(func, "__doc__") + + return wrapper class Context(GpgmeWrapper): """From the GPGME C documentation: diff --git a/lang/python/pyme/util.py b/lang/python/pyme/util.py index b54cd4dc..d52cd1f9 100644 --- a/lang/python/pyme/util.py +++ b/lang/python/pyme/util.py @@ -17,7 +17,6 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from . import pygpgme -from .errors import errorcheck def process_constants(starttext, dict): """Called by the constant libraries to load up the appropriate constants @@ -28,80 +27,3 @@ def process_constants(starttext, dict): continue name = identifier[index:] dict[name] = getattr(pygpgme, identifier) - -class GpgmeWrapper(object): - """Base class all Pyme wrappers for GPGME functionality. Not to be - instantiated directly.""" - - def __init__(self, wrapped): - self._callback_excinfo = None - self.wrapped = wrapped - - def __repr__(self): - return '' % \ - (__name__, self.__class__.__name__, - self.wrapped) - - def __str__(self): - return repr(self) - - def __hash__(self): - return hash(repr(self.wrapped)) - - def __eq__(self, other): - if other == None: - return False - else: - return repr(self.wrapped) == repr(other.wrapped) - - def _getctype(self): - """Must be implemented by child classes. - - Must return the name of the c type.""" - raise NotImplementedError() - - def _getnameprepend(self): - """Must be implemented by child classes. - - Must return the prefix of all c functions mapped to methods of - this class.""" - raise NotImplementedError() - - def _errorcheck(self, name): - """Must be implemented by child classes. - - This function must return a trueish value for all c functions - returning gpgme_error_t.""" - raise NotImplementedError() - - def __getattr__(self, key): - """On-the-fly function generation.""" - if key[0] == '_' or self._getnameprepend() == None: - return None - name = self._getnameprepend() + key - func = getattr(pygpgme, name) - - if self._errorcheck(name): - def _funcwrap(slf, *args, **kwargs): - result = func(slf.wrapped, *args, **kwargs) - if slf._callback_excinfo: - pygpgme.pygpgme_raise_callback_exception(slf) - return errorcheck(result, "Invocation of " + name) - else: - def _funcwrap(slf, *args, **kwargs): - result = func(slf.wrapped, *args, **kwargs) - if slf._callback_excinfo: - pygpgme.pygpgme_raise_callback_exception(slf) - return result - - _funcwrap.__doc__ = getattr(func, "__doc__") - - # Monkey-patch the class. - setattr(self.__class__, key, _funcwrap) - - # Bind the method to 'self'. - def wrapper(*args, **kwargs): - return _funcwrap(self, *args, **kwargs) - _funcwrap.__doc__ = getattr(func, "__doc__") - - return wrapper