From f4ba16b31ea282d0787a40be3f37b951584143a1 Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Tue, 10 May 2016 13:19:26 +0200 Subject: python: Rename bindings. -- Signed-off-by: Justus Winter --- lang/python/pyme/util.py | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 lang/python/pyme/util.py (limited to 'lang/python/pyme/util.py') diff --git a/lang/python/pyme/util.py b/lang/python/pyme/util.py new file mode 100644 index 00000000..c5f02a96 --- /dev/null +++ b/lang/python/pyme/util.py @@ -0,0 +1,72 @@ +# $Id$ +# Copyright (C) 2004,2008 Igor Belyi +# Copyright (C) 2002 John Goerzen +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# 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 + from the C library.""" + index = len(starttext) + for identifier in dir(pygpgme): + if not identifier.startswith(starttext): + 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 __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): + raise NotImplementedException + + def __getattr__(self, name): + """On-the-fly function generation.""" + if name[0] == '_' or self._getnameprepend() == None: + return None + name = self._getnameprepend() + name + if self._errorcheck(name): + def _funcwrap(*args, **kwargs): + args = [self.wrapped] + list(args) + return errorcheck(getattr(pygpgme, name)(*args, **kwargs), + "Invocation of " + name) + else: + def _funcwrap(*args, **kwargs): + args = [self.wrapped] + list(args) + return getattr(pygpgme, name)(*args, **kwargs) + + _funcwrap.__doc__ = getattr(getattr(pygpgme, name), "__doc__") + return _funcwrap + -- cgit From aade53a12b9716997684b872bc2ac87229f73fb3 Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Tue, 10 May 2016 13:30:30 +0200 Subject: python: Delete trailing whitespace. -- Signed-off-by: Justus Winter --- lang/python/README.rst | 2 +- lang/python/docs/old-commits.log | 84 +++++++++++++++++----------------- lang/python/examples/encrypt-to-all.py | 2 +- lang/python/examples/signverify.py | 2 +- lang/python/examples/t-edit.py | 2 +- lang/python/examples/testCMSgetkey.py | 4 +- lang/python/examples/verifydetails.py | 2 - lang/python/gpgme.i | 4 +- lang/python/helpers.c | 6 +-- lang/python/pyme/callbacks.py | 2 +- lang/python/pyme/core.py | 26 +++++------ lang/python/pyme/errors.py | 4 +- lang/python/pyme/util.py | 4 +- lang/python/setup.py | 8 ++-- 14 files changed, 74 insertions(+), 78 deletions(-) (limited to 'lang/python/pyme/util.py') diff --git a/lang/python/README.rst b/lang/python/README.rst index 4cad03a0..57df1f29 100644 --- a/lang/python/README.rst +++ b/lang/python/README.rst @@ -22,7 +22,7 @@ Authors * Martin Albrecht, `PyME 0.9+ `_, 2014 to present. * Ben McGinnes, `PyME Python 3 Port `_, 2015 to present. - + ------------ Mailing List ------------ diff --git a/lang/python/docs/old-commits.log b/lang/python/docs/old-commits.log index 4d2bfe09..0db59a08 100644 --- a/lang/python/docs/old-commits.log +++ b/lang/python/docs/old-commits.log @@ -4,7 +4,7 @@ Author: Ben McGinnes Date: Wed May 6 03:04:19 2015 +1000 Merge pull request #4 from Hasimir/master - + history commit 2036f1a0a670a0561993e195c458059220b36114 @@ -19,7 +19,7 @@ Author: Ben McGinnes Date: Wed May 6 02:52:23 2015 +1000 Added a short history - + * A (very) brief summary of the project's history since 2002. * Deals with why the commit log in the GPGME repo does not include the history of PyME. @@ -36,7 +36,7 @@ Author: Ben McGinnes Date: Wed May 6 02:21:34 2015 +1000 Merge pull request #3 from Hasimir/master - + Version release preparation commit 7c37a27a6845c58222d4d947c2efbe38e955b612 @@ -51,7 +51,7 @@ Author: Ben McGinnes Date: Wed May 6 02:09:44 2015 +1000 TODO update - + * Removed reference to GitHub, replaced with impending new home at gnupg.org. docs/TODO.rst | 4 ++-- @@ -62,7 +62,7 @@ Author: Ben McGinnes Date: Wed May 6 02:00:44 2015 +1000 Version bump - + * Bumped version number to 0.9.1 to keep it somewhat in line with the existing PyME project, even though there will be some divergence at some point (or even re-merging, depending on how many of the Python 3 @@ -80,7 +80,7 @@ Author: Ben McGinnes Date: Wed May 6 01:48:01 2015 +1000 README preparation. - + * Changes in preparation for impending move of code to the GnuPG git server as a part of GPGME. @@ -92,7 +92,7 @@ Author: Ben McGinnes Date: Wed May 6 01:43:53 2015 +1000 TODO moved to docs - + * As it says. TODO.rst | 25 ------------------------- @@ -114,7 +114,7 @@ Author: Ben McGinnes Date: Sun May 3 14:59:44 2015 +1000 Merge pull request #2 from Hasimir/master - + Minor editing. commit 44837f6e50fc539c86aef1f75a6a3538b02029ea @@ -122,7 +122,7 @@ Author: Ben McGinnes Date: Sun May 3 14:56:55 2015 +1000 Minor editing. - + * Fixed another URL. * Changed Py3 version's version number to v0.9.1-beta0. @@ -135,7 +135,7 @@ Author: Ben McGinnes Date: Sun May 3 14:26:11 2015 +1000 Merge pull request #1 from Hasimir/master - + Links commit 48eb1856cb0739cc9f0b9084da9d965e1fc7fddd @@ -143,7 +143,7 @@ Author: Ben McGinnes Date: Sun May 3 14:22:30 2015 +1000 Links - + * Fixed URLs for authors. * Updated my entry to point to github location. ** I strongly suspect the result of this work will be concurrent @@ -157,9 +157,9 @@ Author: Ben McGinnes Date: Sun May 3 11:29:00 2015 +1000 Explicit over Implicit ... - + ... isn't just for code. - + * Removed the 2to3 working directory and its contents. * Made the README.rst file a little more clear that this branch is for Python 3 (set Python 3.2 as a fairly arbitrary requirement for the @@ -176,7 +176,7 @@ Author: Ben McGinnes Date: Sun May 3 11:19:41 2015 +1000 Added authors. - + * In alphabetical order. * Mine will need updating once Martin and I have decided what to do regarding the two main branches. @@ -189,7 +189,7 @@ Author: Ben McGinnes Date: Sun May 3 10:23:00 2015 +1000 Docs and other things. - + * Now able to import pyme.core without error, indicates port process is successful. * Code is *not* compatible with the Python 2 version. @@ -227,7 +227,7 @@ Author: Ben McGinnes Date: Sun May 3 10:08:22 2015 +1000 Bytes vs. Unicode - + * Trying PyBytes instead of PyUnicode. gpgme.i | 14 +++++++------- @@ -239,7 +239,7 @@ Author: Ben McGinnes Date: Sun May 3 09:22:58 2015 +1000 String to Unicode - + * Replaced all instances of PyString with PyUnicode (and hoping there's no byte data in there). @@ -252,7 +252,7 @@ Author: Ben McGinnes Date: Sun May 3 09:17:06 2015 +1000 PyInt_AsLong - + * Replaced all instances of PyInt with PyLong, as per C API docs. gpgme.i | 4 ++-- @@ -264,7 +264,7 @@ Author: Ben McGinnes Date: Sun May 3 05:59:36 2015 +1000 Import correction - + * Once pygpgme.py is generated and moved, it will be in the right directory for the explicit "from . import pygpgme" to be correct. @@ -303,10 +303,10 @@ Author: Ben McGinnes Date: Sun May 3 04:53:21 2015 +1000 Pet Peeve - + def pet_peeve(self): peeve = print("people who don't press return after a colon!") - + FFS! pyme/core.py | 5 +++-- @@ -371,7 +371,7 @@ Author: Ben McGinnes Date: Sun May 3 03:51:48 2015 +1000 Linking swig to py3 - + * Changed the swig invocations to run with the -python -py3 flags explicitly. Makefile | 4 ++-- @@ -383,7 +383,7 @@ Author: Ben McGinnes Date: Sat May 2 11:12:00 2015 +1000 String fun - + * streamlined confdata details, including decoding strom binary to string. setup.py | 4 +--- @@ -394,7 +394,7 @@ Author: Ben McGinnes Date: Sat May 2 10:46:59 2015 +1000 Open File - + * Removed deprecated file() and replaced with open(). examples/PyGtkGpgKeys.py | 2 +- @@ -407,7 +407,7 @@ Author: Ben McGinnes Date: Sat May 2 10:36:15 2015 +1000 print() fix - + * Makefile includes a python print, changed from statement to function. Makefile | 2 +- @@ -418,7 +418,7 @@ Author: Ben McGinnes Date: Sat May 2 10:28:42 2015 +1000 Updated Makefile - + * set make to use python3 instead. * This will mean a successful port may need to be maintained seperately from the original python2 code instead of merged, but ought to be able @@ -434,7 +434,7 @@ Author: Ben McGinnes Date: Sat May 2 10:15:20 2015 +1000 Env and a little license issue - + * Updated all the /usr/bin/env paths to point to python3. * Also fixed the hard coded /usr/bin/python paths. * Updated part of setup.py which gave the impression this package was @@ -463,7 +463,7 @@ Author: Ben McGinnes Date: Sat May 2 08:50:54 2015 +1000 Removed extraneous files. - + * The two .bak files. pyme/errors.py.bak | 46 --------------------- @@ -475,7 +475,7 @@ Author: Ben McGinnes Date: Sat May 2 08:19:37 2015 +1000 Added TODO.org - + * TODO list in Emacs org-mode. * Will eventually be removed along with this entire directory when the porting process is complete. @@ -488,7 +488,7 @@ Author: Ben McGinnes Date: Sat May 2 07:58:40 2015 +1000 2to3 conversion of remaining files - + * Ran the extended version against all the unmodified python files. * Only pyme/errors.py required additional work. @@ -502,7 +502,7 @@ Author: Ben McGinnes Date: Sat May 2 07:50:39 2015 +1000 2to3 conversion of setup.py - + * Ran extended 2to3 command to produce python 3 code for setup.py. * Effectively testing for what to run against the other originally unmodified py2 files. @@ -517,7 +517,7 @@ Author: Ben McGinnes Date: Fri May 1 21:50:07 2015 +1000 Removing 2to3 generated .bak files. - + * Not really needed with a real VCS, but couldn't hurt to have them for a couple of revisions. ;) @@ -548,7 +548,7 @@ Author: Ben McGinnes Date: Fri May 1 21:45:50 2015 +1000 2to3 conversion log - + * The output of the command to convert the code from Python 2 to 3. * Note: this contains the list of files which were not modified and which will or may need to be modified. @@ -561,7 +561,7 @@ Author: Ben McGinnes Date: Fri May 1 21:36:58 2015 +1000 2to3 conversion of pyme master - + * Branch from commit 459f3eca659b4949e394c4a032d9ce2053e6c721 * Ran this: or x in `find . | egrep .py$` ; do 2to3 -w $x; done ; * Multiple files not modified, will record elsewhere (see next commit). @@ -614,7 +614,7 @@ Author: Martin Albrecht Date: Wed Jul 9 10:48:33 2014 +0100 Merged in jerrykan/pyme/fix_setup_26 (pull request #1) - + Provide support for using setup.py with Python v2.6 commit dae7f14a54e6c2bde0ad4da7308cc7fc0d0c0469 @@ -622,7 +622,7 @@ Author: John Kristensen Date: Wed Jul 9 15:54:39 2014 +1000 Provide support for using setup.py with Python v2.6 - + The setup.py script uses subprocess.check_output() which was introduced in Python v2.7. The equivalent functionality can be achieved without adding much extra code and provide support for Python v2.6. @@ -701,7 +701,7 @@ Author: Martin Albrecht Date: Sat May 10 15:41:02 2014 +0100 Merge branch 'master' of bitbucket.org:malb/pyme - + Conflicts: setup.py @@ -1018,10 +1018,10 @@ Author: Martin Albrecht Date: Mon Jan 6 17:44:20 2014 +0100 fixing op_export_keys() - + the conversion of gpgme_key_t [] was restricted to gpgme_key_t [] with the name recv, i.e. only the use-cases of encryption were covered. - + see: http://sourceforge.net/mailarchive/forum.php?forum_name=pyme-help&max_rows=25&style=nested&viewmonth=201309 pyme/gpgme.i | 6 +++--- @@ -1618,9 +1618,9 @@ Date: Fri Jun 10 03:01:22 2005 +0000 Update 'docs' rule in Makefile to build packages first to ensure that documentation is build for the current version of pyme and not for the installed one. - + Added 'callbacks' into the list of visible pyme modules (__all__ var.) - + Slightly updated INSTALL file. pyme/INSTALL | 11 ++++++++--- @@ -2100,7 +2100,7 @@ Author: belyi Date: Fri Mar 18 19:09:33 2005 +0000 Added package building for python2.4 - + Updated copyright notes to include myslef and avoid confusion who's the maintainer. In John's own words: "I'd prefer to just step out of the picture". Jonh's copyright notice left intact. diff --git a/lang/python/examples/encrypt-to-all.py b/lang/python/examples/encrypt-to-all.py index 8f9d2500..c890df4f 100755 --- a/lang/python/examples/encrypt-to-all.py +++ b/lang/python/examples/encrypt-to-all.py @@ -54,7 +54,7 @@ for key in c.op_keylist_all(None, 0): (keyid, can_encrypt and "enabled" or "disabled")) except UnicodeEncodeError as e: print(e) - + if valid: names.append(key) else: diff --git a/lang/python/examples/signverify.py b/lang/python/examples/signverify.py index f8804ca9..7194157b 100755 --- a/lang/python/examples/signverify.py +++ b/lang/python/examples/signverify.py @@ -43,7 +43,7 @@ if not c.signers_enum(0): passlist = { b"": b"Crypt0R0cks" } - + # callback will return password based on the e-mail listed in the hint. c.set_passphrase_cb(lambda x,y,z: passlist[x[x.rindex("<"):]]) diff --git a/lang/python/examples/t-edit.py b/lang/python/examples/t-edit.py index 6c533429..5553190c 100644 --- a/lang/python/examples/t-edit.py +++ b/lang/python/examples/t-edit.py @@ -32,7 +32,7 @@ class KeyEditor: out.seek(0,0) print(out.read(), end=' ') print("[-- Code: %d, %s --]" % (status, args)) - + if args == "keyedit.prompt": result = self.steps[self.step] self.step += 1 diff --git a/lang/python/examples/testCMSgetkey.py b/lang/python/examples/testCMSgetkey.py index 53fdef77..7c953012 100644 --- a/lang/python/examples/testCMSgetkey.py +++ b/lang/python/examples/testCMSgetkey.py @@ -22,7 +22,7 @@ from pyme.constants import protocol def printgetkeyresults(keyfpr): """Run gpgme_get_key().""" - # gpgme_check_version() necessary for initialisation according to + # gpgme_check_version() necessary for initialisation according to # gogme 1.1.6 and this is not done automatically in pyme-0.7.0 print("gpgme version:", core.check_version(None)) c = core.Context() @@ -45,5 +45,3 @@ def main(): if __name__ == "__main__": main() - - diff --git a/lang/python/examples/verifydetails.py b/lang/python/examples/verifydetails.py index 0d47ba54..a8d840e7 100755 --- a/lang/python/examples/verifydetails.py +++ b/lang/python/examples/verifydetails.py @@ -96,5 +96,3 @@ def main(): if __name__ == "__main__": main() - - diff --git a/lang/python/gpgme.i b/lang/python/gpgme.i index 0115caf3..87efce73 100644 --- a/lang/python/gpgme.i +++ b/lang/python/gpgme.i @@ -241,14 +241,14 @@ gpgme_error_t pyEditCb(void *opaque, gpgme_status_code_t status, func = pyopaque; pyargs = PyTuple_New(2); } - + PyTuple_SetItem(pyargs, 0, PyLong_FromLong((long) status)); PyTuple_SetItem(pyargs, 1, PyBytes_FromString(args)); if (dataarg) { Py_INCREF(dataarg); /* Because GetItem doesn't give a ref but SetItem taketh away */ PyTuple_SetItem(pyargs, 2, dataarg); } - + retval = PyObject_CallObject(func, pyargs); Py_DECREF(pyargs); if (PyErr_Occurred()) { diff --git a/lang/python/helpers.c b/lang/python/helpers.c index b53dbdd8..96c844fb 100644 --- a/lang/python/helpers.c +++ b/lang/python/helpers.c @@ -66,7 +66,7 @@ static gpgme_error_t pyPassphraseCb(void *hook, PyObject *args = NULL; PyObject *retval = NULL; PyObject *dataarg = NULL; - gpgme_error_t err_status = 0; + gpgme_error_t err_status = 0; pygpgme_exception_init(); @@ -119,7 +119,7 @@ static void pyProgressCb(void *hook, const char *what, int type, int current, int total) { PyObject *func = NULL, *dataarg = NULL, *args = NULL, *retval = NULL; PyObject *pyhook = (PyObject *) hook; - + if (PyTuple_Check(pyhook)) { func = PyTuple_GetItem(pyhook, 0); dataarg = PyTuple_GetItem(pyhook, 1); @@ -137,7 +137,7 @@ static void pyProgressCb(void *hook, const char *what, int type, int current, Py_INCREF(dataarg); /* Because GetItem doesn't give a ref but SetItem taketh away */ PyTuple_SetItem(args, 4, dataarg); } - + retval = PyObject_CallObject(func, args); Py_DECREF(args); Py_XDECREF(retval); diff --git a/lang/python/pyme/callbacks.py b/lang/python/pyme/callbacks.py index e3c810cd..3a507b99 100644 --- a/lang/python/pyme/callbacks.py +++ b/lang/python/pyme/callbacks.py @@ -33,7 +33,7 @@ def passphrase_stdin(hint, desc, prev_bad, hook=None): def progress_stdout(what, type, current, total, hook=None): print("PROGRESS UPDATE: what = %s, type = %d, current = %d, total = %d" %\ (what, type, current, total)) - + def readcb_fh(count, hook): """A callback for data. hook should be a Python file-like object.""" if count: diff --git a/lang/python/pyme/core.py b/lang/python/pyme/core.py index b03cedb0..09f0fa88 100644 --- a/lang/python/pyme/core.py +++ b/lang/python/pyme/core.py @@ -37,7 +37,7 @@ class Context(GpgmeWrapper): def _getctype(self): return 'gpgme_ctx_t' - + def _getnameprepend(self): return 'gpgme_' @@ -106,7 +106,7 @@ class Context(GpgmeWrapper): if key: key.__del__ = lambda self: pygpgme.gpgme_key_unref(self) return key - + def get_key(self, fpr, secret): """Return the key corresponding to the fingerprint 'fpr'""" ptr = pygpgme.new_gpgme_key_t_p() @@ -147,7 +147,7 @@ class Context(GpgmeWrapper): desc, a string describing the passphrase it needs; prev_bad, a boolean equal True if this is a call made after unsuccessful previous attempt. - + If hook has a value other than None it will be passed into the func as a forth argument. @@ -206,7 +206,7 @@ class Context(GpgmeWrapper): context = pygpgme.gpgme_wait(self.wrapped, ptr, hang) status = pygpgme.gpgme_error_t_p_value(ptr) pygpgme.delete_gpgme_error_t_p(ptr) - + if context == None: errorcheck(status) return None @@ -219,7 +219,7 @@ class Context(GpgmeWrapper): raise ValueError("op_edit: First argument cannot be None") opaquedata = (func, fnc_value) errorcheck(pygpgme.gpgme_op_edit(self.wrapped, key, opaquedata, out)) - + class Data(GpgmeWrapper): """From the GPGME C manual: @@ -236,7 +236,7 @@ class Data(GpgmeWrapper): def _getctype(self): return 'gpgme_data_t' - + def _getnameprepend(self): return 'gpgme_data_' @@ -247,7 +247,7 @@ class Data(GpgmeWrapper): name == 'gpgme_data_seek': return 0 return 1 - + def __init__(self, string = None, file = None, offset = None, length = None, cbs = None): """Initialize a new gpgme_data_t object. @@ -360,7 +360,7 @@ class Data(GpgmeWrapper): """This wraps the GPGME gpgme_data_new_from_fd() function. The argument "file" may be a file-like object, supporting the fileno() call and the mode attribute.""" - + tmp = pygpgme.new_gpgme_data_t_p() fp = pygpgme.fdopen(file.fileno(), file.mode) if fp == None: @@ -375,18 +375,18 @@ class Data(GpgmeWrapper): new_from_fd() method since in python there's not difference between file stream and file descriptor""" self.new_from_fd(file) - + def write(self, buffer): errorcheck(pygpgme.gpgme_data_write(self.wrapped, buffer, len(buffer))) def read(self, size = -1): """Read at most size bytes, returned as a string. - + If the size argument is negative or omitted, read until EOF is reached. Returns the data read, or the empty string if there was no data to read before EOF was reached.""" - + if size == 0: return '' @@ -445,11 +445,11 @@ def set_locale(category, value): def wait(hang): """Wait for asynchronous call on any Context to finish. Wait forever if hang is True. - + For finished anynch calls it returns a tuple (status, context): status - status return by asnynchronous call. context - context which caused this call to return. - + Please read the GPGME manual of more information.""" ptr = pygpgme.new_gpgme_error_t_p() context = pygpgme.gpgme_wait(None, ptr, hang) diff --git a/lang/python/pyme/errors.py b/lang/python/pyme/errors.py index 0ad22f2b..37d0fe67 100644 --- a/lang/python/pyme/errors.py +++ b/lang/python/pyme/errors.py @@ -22,7 +22,7 @@ class GPGMEError(Exception): def __init__(self, error = None, message = None): self.error = error self.message = message - + def getstring(self): message = "%s: %s" % (pygpgme.gpgme_strsource(self.error), pygpgme.gpgme_strerror(self.error)) @@ -35,7 +35,7 @@ class GPGMEError(Exception): def getsource(self): return pygpgme.gpgme_err_source(self.error) - + def __str__(self): return "%s (%d,%d)"%(self.getstring(), self.getsource(), self.getcode()) diff --git a/lang/python/pyme/util.py b/lang/python/pyme/util.py index c5f02a96..32e2f556 100644 --- a/lang/python/pyme/util.py +++ b/lang/python/pyme/util.py @@ -28,7 +28,7 @@ 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.""" @@ -51,7 +51,7 @@ class GpgmeWrapper(object): def _getctype(self): raise NotImplementedException - + def __getattr__(self, name): """On-the-fly function generation.""" if name[0] == '_' or self._getnameprepend() == None: diff --git a/lang/python/setup.py b/lang/python/setup.py index b0ed3b2c..562c08f4 100755 --- a/lang/python/setup.py +++ b/lang/python/setup.py @@ -60,7 +60,7 @@ for item in getconfig('cflags'): # Adjust include and library locations in case of win32 uname_s = os.popen("uname -s").read() if uname_s.startswith("MINGW32"): - mnts = [x.split()[0:3:2] for x in os.popen("mount").read().split("\n") if x] + mnts = [x.split()[0:3:2] for x in os.popen("mount").read().split("\n") if x] tmplist = sorted([(len(x[1]), x[1], x[0]) for x in mnts]) tmplist.reverse() extra_dirs = [] @@ -89,9 +89,9 @@ except OSError as e: raise RuntimeError("Could not call swig, perhaps install swig.") else: raise - + subprocess.call(["make swig"], shell=True) - + swige = Extension("pyme._pygpgme", ["gpgme_wrap.c", "helpers.c"], include_dirs = include_dirs, define_macros = define_macros, @@ -106,7 +106,7 @@ setup(name = "pyme", url = version.homepage, ext_modules=[swige], packages = ['pyme', 'pyme.constants', 'pyme.constants.data', - 'pyme.constants.keylist', 'pyme.constants.sig'], + 'pyme.constants.keylist', 'pyme.constants.sig'], license = version.copyright + \ ", Licensed under the GPL version 2 and the LGPL version 2.1" ) -- cgit From af9371eb63664c92fb67e8e7e03cc984e7d38a7f Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Thu, 12 May 2016 12:51:30 +0200 Subject: python: Fix name of exception, make slot methods explicit. * lang/python/pyme/util.py (GpgmeWrapper._getctype): Fix exception, add docstring. (GpgmeWrapper._getnameprepend): New function. (GpgmeWrapper._errorcheck): Likewise. Signed-off-by: Justus Winter --- lang/python/pyme/util.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'lang/python/pyme/util.py') diff --git a/lang/python/pyme/util.py b/lang/python/pyme/util.py index 32e2f556..19bbb7f6 100644 --- a/lang/python/pyme/util.py +++ b/lang/python/pyme/util.py @@ -50,7 +50,24 @@ class GpgmeWrapper(object): return repr(self.wrapped) == repr(other.wrapped) def _getctype(self): - raise NotImplementedException + """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, name): """On-the-fly function generation.""" -- cgit From ed0ce84fbd2904bf59ac66ae7422716db3624efa Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Thu, 12 May 2016 14:57:42 +0200 Subject: python: Cache generated wrapper functions. * lang/python/util.py (GpgmeWrap.__getattr__): Cache generated wrapper functions. Signed-off-by: Justus Winter --- lang/python/pyme/util.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'lang/python/pyme/util.py') diff --git a/lang/python/pyme/util.py b/lang/python/pyme/util.py index 19bbb7f6..a8560992 100644 --- a/lang/python/pyme/util.py +++ b/lang/python/pyme/util.py @@ -69,11 +69,11 @@ class GpgmeWrapper(object): returning gpgme_error_t.""" raise NotImplementedError() - def __getattr__(self, name): + def __getattr__(self, key): """On-the-fly function generation.""" - if name[0] == '_' or self._getnameprepend() == None: + if key[0] == '_' or self._getnameprepend() == None: return None - name = self._getnameprepend() + name + name = self._getnameprepend() + key if self._errorcheck(name): def _funcwrap(*args, **kwargs): args = [self.wrapped] + list(args) @@ -85,5 +85,8 @@ class GpgmeWrapper(object): return getattr(pygpgme, name)(*args, **kwargs) _funcwrap.__doc__ = getattr(getattr(pygpgme, name), "__doc__") + + # Cache the wrapper function. + setattr(self, key, _funcwrap) return _funcwrap -- cgit From 11314f0db6e57597e3f56351a86fdb36a7a17dd7 Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Thu, 12 May 2016 18:29:04 +0200 Subject: python: Share generated methods between objects. * lang/python/pyme/util.py (GpgmeWrapper.__getattr__): Monkey-patch the class. * lang/python/tests/t-wrapper.py: Demonstrate the sharing. Signed-off-by: Justus Winter --- lang/python/pyme/util.py | 26 ++++++++++++++++---------- lang/python/tests/t-wrapper.py | 2 ++ 2 files changed, 18 insertions(+), 10 deletions(-) (limited to 'lang/python/pyme/util.py') diff --git a/lang/python/pyme/util.py b/lang/python/pyme/util.py index a8560992..a9fa19d2 100644 --- a/lang/python/pyme/util.py +++ b/lang/python/pyme/util.py @@ -74,19 +74,25 @@ class GpgmeWrapper(object): if key[0] == '_' or self._getnameprepend() == None: return None name = self._getnameprepend() + key + func = getattr(pygpgme, name) + if self._errorcheck(name): - def _funcwrap(*args, **kwargs): - args = [self.wrapped] + list(args) - return errorcheck(getattr(pygpgme, name)(*args, **kwargs), + def _funcwrap(slf, *args, **kwargs): + return errorcheck(func(slf.wrapped, *args, **kwargs), "Invocation of " + name) else: - def _funcwrap(*args, **kwargs): - args = [self.wrapped] + list(args) - return getattr(pygpgme, name)(*args, **kwargs) + def _funcwrap(slf, *args, **kwargs): + return func(slf.wrapped, *args, **kwargs) + + _funcwrap.__doc__ = getattr(func, "__doc__") + + # Monkey-patch the class. + setattr(self.__class__, key, _funcwrap) - _funcwrap.__doc__ = getattr(getattr(pygpgme, name), "__doc__") + # Bind the method to 'self'. + def wrapper(*args, **kwargs): + return _funcwrap(self, *args, **kwargs) + _funcwrap.__doc__ = getattr(func, "__doc__") - # Cache the wrapper function. - setattr(self, key, _funcwrap) - return _funcwrap + return wrapper diff --git a/lang/python/tests/t-wrapper.py b/lang/python/tests/t-wrapper.py index acc2ecfd..fab0d811 100755 --- a/lang/python/tests/t-wrapper.py +++ b/lang/python/tests/t-wrapper.py @@ -20,4 +20,6 @@ from pyme import core d0 = core.Data() +d0.seek # trigger on-demand-wrapping assert d0.seek == d0.seek, "Generated wrapper functions are not cached" +assert hasattr(core.Data, 'seek'), "Generated wrapper functions are not shared" -- cgit