Skip to content

Commit a80d102

Browse files
committed
Merge branch 'thekafkaf-broad-exception-handling'
2 parents e9fa652 + 1bb180f commit a80d102

File tree

2 files changed

+84
-44
lines changed

2 files changed

+84
-44
lines changed

jsonpointer.py

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -228,26 +228,18 @@ def get_part(self, doc, part):
228228
return part
229229

230230
else:
231-
raise JsonPointerException("document '%s' does not support indexing, "
231+
raise JsonPointerException("Document '%s' does not support indexing, "
232232
"must be mapping/sequence or support __getitem__" % type(doc))
233233

234+
234235
def walk(self, doc, part):
235-
"""Walks one step in doc and returns the referenced part"""
236+
""" Walks one step in doc and returns the referenced part """
236237

237238
part = self.get_part(doc, part)
238239

239-
assert hasattr(doc, '__getitem__'), \
240-
'invalid document type %s' % type(doc)
241-
242-
if isinstance(doc, Mapping):
243-
try:
244-
return doc[part]
245-
246-
except KeyError:
247-
raise JsonPointerException("member '%s' not found in %s" % (part, doc))
248-
249-
elif isinstance(doc, Sequence):
240+
assert hasattr(doc, '__getitem__'), "invalid document type %s" % (type(doc),)
250241

242+
if isinstance(doc, Sequence):
251243
if part == '-':
252244
return EndOfList(doc)
253245

@@ -257,16 +249,20 @@ def walk(self, doc, part):
257249
except IndexError:
258250
raise JsonPointerException("index '%s' is out of bounds" % (part, ))
259251

260-
else:
261-
# Object supports __getitem__, assume custom indexing
252+
# Else the object is a mapping or supports __getitem__(so assume custom indexing)
253+
try:
262254
return doc[part]
263255

256+
except KeyError:
257+
raise JsonPointerException("member '%s' not found in %s" % (part, doc))
258+
259+
264260
def contains(self, ptr):
265-
"""Returns True if self contains the given ptr"""
261+
""" Returns True if self contains the given ptr """
266262
return self.parts[:len(ptr.parts)] == ptr.parts
267263

268264
def __contains__(self, item):
269-
"""Returns True if self contains the given ptr"""
265+
""" Returns True if self contains the given ptr """
270266
return self.contains(item)
271267

272268
@property

tests.py

Lines changed: 71 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from jsonpointer import resolve_pointer, EndOfList, JsonPointerException, \
1111
JsonPointer, set_pointer
1212

13+
1314
class SpecificationTests(unittest.TestCase):
1415
""" Tests all examples from the JSON Pointer specification """
1516

@@ -73,6 +74,7 @@ def test_round_trip(self):
7374
new_ptr = JsonPointer.from_parts(parts)
7475
self.assertEqual(ptr, new_ptr)
7576

77+
7678
class ComparisonTests(unittest.TestCase):
7779

7880
def setUp(self):
@@ -108,7 +110,6 @@ def test_contains_magic(self):
108110
self.assertTrue(self.ptr1 in self.ptr1)
109111
self.assertFalse(self.ptr3 in self.ptr1)
110112

111-
112113
class WrongInputTests(unittest.TestCase):
113114

114115
def test_no_start_slash(self):
@@ -192,42 +193,52 @@ def test_set(self):
192193

193194
self.assertRaises(JsonPointerException, set_pointer, doc, "", 9)
194195

196+
195197
class AltTypesTests(unittest.TestCase):
196198

197-
def test_alttypes(self):
198-
JsonPointer.alttypes = True
199+
class Node(object):
200+
def __init__(self, name, parent=None):
201+
self.name = name
202+
self.parent = parent
203+
self.left = None
204+
self.right = None
199205

200-
class Node(object):
201-
def __init__(self, name, parent=None):
202-
self.name = name
203-
self.parent = parent
204-
self.left = None
205-
self.right = None
206+
def set_left(self, node):
207+
node.parent = self
208+
self.left = node
206209

207-
def set_left(self, node):
208-
node.parent = self
209-
self.left = node
210+
def set_right(self, node):
211+
node.parent = self
212+
self.right = node
210213

211-
def set_right(self, node):
212-
node.parent = self
213-
self.right = node
214+
def __getitem__(self, key):
215+
if key == 'left':
216+
return self.left
217+
if key == 'right':
218+
return self.right
214219

215-
def __getitem__(self, key):
216-
if key == 'left':
217-
return self.left
218-
if key == 'right':
219-
return self.right
220+
raise KeyError("Only left and right supported")
220221

221-
raise KeyError("Only left and right supported")
222+
def __setitem__(self, key, val):
223+
if key == 'left':
224+
return self.set_left(val)
225+
if key == 'right':
226+
return self.set_right(val)
222227

223-
def __setitem__(self, key, val):
224-
if key == 'left':
225-
return self.set_left(val)
226-
if key == 'right':
227-
return self.set_right(val)
228+
raise KeyError("Only left and right supported: %s" % key)
228229

229-
raise KeyError("Only left and right supported: %s" % key)
230+
class mdict(object):
231+
def __init__(self, d):
232+
self._d = d
233+
def __getitem__(self, item):
234+
return self._d[item]
230235

236+
mdict = mdict({'root': {'1': {'2': '3'}}})
237+
Node = Node
238+
239+
240+
def test_alttypes(self):
241+
Node = self.Node
231242

232243
root = Node('root')
233244
root.set_left(Node('a'))
@@ -249,6 +260,39 @@ def __setitem__(self, key, val):
249260
set_pointer(root, '/left/right', Node('AB'))
250261
self.assertEqual(resolve_pointer(root, '/left/right').name, 'AB')
251262

263+
def test_mock_dict_sanity(self):
264+
doc = self.mdict
265+
default = None
266+
267+
# TODO: Generate this automatically for any given object
268+
path_to_expected_value = {
269+
'/root/1': {'2': '3'},
270+
'/root': {'1': {'2': '3'}},
271+
'/root/1/2': '3',
272+
}
273+
274+
for path, expected_value in iter(path_to_expected_value.items()):
275+
self.assertEqual(resolve_pointer(doc, path, default), expected_value)
276+
277+
def test_mock_dict_returns_default(self):
278+
doc = self.mdict
279+
default = None
280+
281+
path_to_expected_value = {
282+
'/foo': default,
283+
'/x/y/z/d': default
284+
}
285+
286+
for path, expected_value in iter(path_to_expected_value.items()):
287+
self.assertEqual(resolve_pointer(doc, path, default), expected_value)
288+
289+
def test_mock_dict_raises_key_error(self):
290+
doc = self.mdict
291+
self.assertRaises(JsonPointerException, resolve_pointer, doc, '/foo')
292+
self.assertRaises(JsonPointerException, resolve_pointer, doc, '/root/1/2/3/4')
293+
294+
295+
252296
suite = unittest.TestSuite()
253297
suite.addTest(unittest.makeSuite(SpecificationTests))
254298
suite.addTest(unittest.makeSuite(ComparisonTests))

0 commit comments

Comments
 (0)