changeset 176:3f854e3bcdd1 2.2

client: raise KeyError from __getitem__ (BC) object.__getitem__ is supposed to raise either IndexError or KeyError (depending on whether the thing is a sequence or a mapping). Before, we would raise ValueError because that's what the context constructor raises. I choose to raise KeyError because IndexError felt a bit too limiting. This does sacrifice some magic with for loops handling IndexError. However, iteration of this object should be handled by a custom __iter__, so I don't think this is a problem.
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 06 Jul 2016 14:14:22 -0700
parents c16e2087660f
children 6f15cb7cc9cb
files hglib/client.py tests/test-context.py
diffstat 2 files changed, 6 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/hglib/client.py	Wed Jul 06 14:11:02 2016 -0700
+++ b/hglib/client.py	Wed Jul 06 14:14:22 2016 -0700
@@ -1631,7 +1631,10 @@
         return self._version
 
     def __getitem__(self, changeid):
-        return context.changectx(self, changeid)
+        try:
+            return context.changectx(self, changeid)
+        except ValueError as e:
+            raise KeyError(*e.args)
 
     def __contains__(self, changeid):
         """
--- a/tests/test-context.py	Wed Jul 06 14:11:02 2016 -0700
+++ b/tests/test-context.py	Wed Jul 06 14:14:22 2016 -0700
@@ -17,6 +17,8 @@
         self.append('c', 'c')
         rev1, node1 = self.client.commit(b('second'), addremove=True)
 
+        self.assertRaises(KeyError, self.client.__getitem__, 'doesnotexist')
+
         ctx = self.client[node0]
 
         self.assertEquals(ctx.description(), b('first'))