[Pkg-gnupg-commit] [gpgme] 41/53: python: Make 'get_key' more idiomatic.

Daniel Kahn Gillmor dkg at fifthhorseman.net
Mon Oct 24 19:26:52 UTC 2016


This is an automated email from the git hooks/post-receive script.

dkg pushed a commit to branch experimental
in repository gpgme.

commit f526d0e22e8b881ccbca66b46a0e1b68bbc4cd6b
Author: Justus Winter <justus at g10code.com>
Date:   Thu Oct 13 13:13:23 2016 +0200

    python: Make 'get_key' more idiomatic.
    
    * lang/python/pyme/core.py (Context.get_key): Raise errors.KeyNotFound
    if the key is not found.  This error is both a KeyError for idiomatic
    error handling as well as a GPGMEError so we don't break existing
    code.
    * lang/python/pyme/errors.py (KeyNotFound): New class.
    * lang/python/tests/support.py (no_such_key): New variable.
    * lang/python/tests/t-keylist.py: Test the new behavior.
    
    Signed-off-by: Justus Winter <justus at g10code.com>
---
 lang/python/pyme/core.py       | 10 +++++++++-
 lang/python/pyme/errors.py     | 22 +++++++++++++++++++---
 lang/python/tests/support.py   |  1 +
 lang/python/tests/t-keylist.py | 23 +++++++++++++++++++++++
 4 files changed, 52 insertions(+), 4 deletions(-)

diff --git a/lang/python/pyme/core.py b/lang/python/pyme/core.py
index cd5217f..f0eab43 100644
--- a/lang/python/pyme/core.py
+++ b/lang/python/pyme/core.py
@@ -680,11 +680,19 @@ class Context(GpgmeWrapper):
                         -- the matching key
 
         Raises:
+        KeyError	-- if the key was not found
         GPGMEError	-- as signaled by the underlying library
 
         """
         ptr = gpgme.new_gpgme_key_t_p()
-        errorcheck(gpgme.gpgme_get_key(self.wrapped, fpr, ptr, secret))
+
+        try:
+            errorcheck(gpgme.gpgme_get_key(self.wrapped, fpr, ptr, secret))
+        except errors.GPGMEError as e:
+            if e.getcode() == errors.EOF:
+                raise errors.KeyNotFound(fpr)
+            raise e
+
         key = gpgme.gpgme_key_t_p_value(ptr)
         gpgme.delete_gpgme_key_t_p(ptr)
         assert key
diff --git a/lang/python/pyme/errors.py b/lang/python/pyme/errors.py
index e26c747..0fd85ef 100644
--- a/lang/python/pyme/errors.py
+++ b/lang/python/pyme/errors.py
@@ -21,10 +21,12 @@ del absolute_import, print_function, unicode_literals
 from . import gpgme
 from . import util
 
-util.process_constants('GPG_ERR_', globals())
+# To appease static analysis tools, we define some constants here.
+# They are overwritten with the proper values by process_constants.
+NO_ERROR = None
+EOF = None
 
-# To appease static analysis tools, we define some constants here:
-NO_ERROR = 0
+util.process_constants('GPG_ERR_', globals())
 
 class PymeError(Exception):
     pass
@@ -58,6 +60,20 @@ def errorcheck(retval, extradata = None):
     if retval:
         raise GPGMEError(retval, extradata)
 
+class KeyNotFound(GPGMEError, KeyError):
+    """Raised if a key was not found
+
+    GPGME indicates this condition with EOF, which is not very
+    idiomatic.  We raise this error that is both a GPGMEError
+    indicating EOF, and a KeyError.
+
+    """
+    def __init__(self, keystr):
+        self.keystr = keystr
+        GPGMEError.__init__(self, EOF)
+    def __str__(self):
+        return self.keystr
+
 # These errors are raised in the idiomatic interface code.
 
 class EncryptionError(PymeError):
diff --git a/lang/python/tests/support.py b/lang/python/tests/support.py
index 4d7135e..f1ffdc3 100644
--- a/lang/python/tests/support.py
+++ b/lang/python/tests/support.py
@@ -27,6 +27,7 @@ alpha = "A0FF4590BB6122EDEF6E3C542D727CC768697734"
 bob = "D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2"
 encrypt_only = "F52770D5C4DB41408D918C9F920572769B9FE19C"
 sign_only = "7CCA20CCDE5394CEE71C9F0BFED153F12F18F45D"
+no_such_key = "A" * 40
 
 def make_filename(name):
     return os.path.join(os.environ['top_srcdir'], 'tests', 'gpg', name)
diff --git a/lang/python/tests/t-keylist.py b/lang/python/tests/t-keylist.py
index 5e8b333..f7f6674 100755
--- a/lang/python/tests/t-keylist.py
+++ b/lang/python/tests/t-keylist.py
@@ -20,6 +20,7 @@
 from __future__ import absolute_import, print_function, unicode_literals
 del absolute_import, print_function, unicode_literals
 
+import pyme
 from pyme import core, constants
 import support
 
@@ -244,3 +245,25 @@ for i, key in enumerate(c.keylist()):
 
     if misc_check:
         misc_check (uids[0][0], key)
+
+
+# check get_key()
+with pyme.Context() as c:
+  c.get_key(support.alpha)
+  c.get_key(support.alpha, secret=True)
+
+  c.get_key(support.bob)
+  try:
+    c.get_key(support.bob, secret=True)
+  except KeyError:
+    pass
+  else:
+    assert False, "Expected KeyError"
+
+  # Legacy error
+  try:
+    c.get_key(support.no_such_key)
+  except pyme.errors.GPGMEError:
+    pass
+  else:
+    assert False, "Expected GPGMEError"

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/gpgme.git



More information about the Pkg-gnupg-commit mailing list