python: Extend SWIG gpgme_{sub,}key with a __repr__ method.
authorTobias Mueller <muelli@cryptobitch.de>
Tue, 20 Dec 2016 17:02:36 +0000 (18:02 +0100)
committerJustus Winter <justus@g10code.com>
Tue, 14 Feb 2017 10:19:50 +0000 (11:19 +0100)
* lang/python/gpgme.i: Added a genericrepr macro and use it for
gpgme_key, gpgme_subkey, and gpgme_key_sig.
--

To look nicer in Python's REPL.

We define a generic __repr__ as a SWIG macro and use that to extend some
defined SWIG objects.

The alternative would have been to write a custom __repr__ function for
each class but that would need to be changed everytime the object's
structure changes. The bindings should be easy to maintain, I guess.
This comes at the expense that the reprs are now relatively long and
contain, for example, both keyid and fingerprint.

Signed-off-by: Tobias Mueller <muelli@cryptobitch.de>
lang/python/gpgme.i

index e21aa6c..c0993ee 100644 (file)
@@ -649,3 +649,30 @@ _gpg_unwrap_gpgme_ctx_t(PyObject *wrapped)
 /* ... but only the public definitions here.  They will be exposed to
    the Python world, so let's be careful.  */
 %include "helpers.h"
+
+
+%define genericrepr(cls)
+%pythoncode %{
+    def __repr__(self):
+        names = [name for name in dir(self)
+            if not name.startswith("_") and name != "this"]
+        props = ", ".join(("{}={!r}".format(name, getattr(self, name))
+            for name in names)
+        )
+        return "cls({})".format(props)
+%}
+
+%enddef
+
+%extend _gpgme_key {
+  genericrepr(Key)
+};
+
+
+%extend _gpgme_subkey {
+  genericrepr(SubKey)
+};
+
+%extend _gpgme_key_sig {
+  genericrepr(KeySig)
+};