Skip to content

Commit

Permalink
Merge 2ca270f into 490c7a2
Browse files Browse the repository at this point in the history
  • Loading branch information
thekafkaf committed Nov 14, 2014
2 parents 490c7a2 + 2ca270f commit 6a56f3e
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 40 deletions.
22 changes: 9 additions & 13 deletions jsonpointer.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,25 +215,17 @@ def get_part(self, doc, part):

else:
raise JsonPointerException("Document '%s' does not support indexing, "
"must be dict/list or support __getitem__" % type(doc))
"must be mapping/sequence or support __getitem__" % type(doc))


def walk(self, doc, part):
""" Walks one step in doc and returns the referenced part """

part = self.get_part(doc, part)

assert (type(doc) in (dict, list) or hasattr(doc, '__getitem__')), "invalid document type %s" % (type(doc),)

if isinstance(doc, Mapping):
try:
return doc[part]

except KeyError:
raise JsonPointerException("member '%s' not found in %s" % (part, doc))

elif isinstance(doc, Sequence):
assert hasattr(doc, '__getitem__'), "invalid document type %s" % (type(doc),)

if isinstance(doc, Sequence):
if part == '-':
return EndOfList(doc)

Expand All @@ -243,10 +235,14 @@ def walk(self, doc, part):
except IndexError:
raise JsonPointerException("index '%s' is out of bounds" % (part, ))

else:
# Object supports __getitem__, assume custom indexing
# Else the object is a mapping or supports __getitem__(so assume custom indexing)
try:
return doc[part]

except KeyError:
raise JsonPointerException("member '%s' not found in %s" % (part, doc))


def contains(self, ptr):
""" Returns True if self contains the given ptr """
return len(self.parts) > len(ptr.parts) and \
Expand Down
98 changes: 71 additions & 27 deletions tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from jsonpointer import resolve_pointer, EndOfList, JsonPointerException, \
JsonPointer, set_pointer


class SpecificationTests(unittest.TestCase):
""" Tests all examples from the JSON Pointer specification """

Expand Down Expand Up @@ -70,6 +71,7 @@ def test_round_trip(self):
new_ptr = JsonPointer.from_parts(parts)
self.assertEqual(ptr, new_ptr)


class ComparisonTests(unittest.TestCase):

def test_eq_hash(self):
Expand Down Expand Up @@ -97,7 +99,6 @@ def test_contains(self):
self.assertFalse(p1.contains(p3))



class WrongInputTests(unittest.TestCase):

def test_no_start_slash(self):
Expand Down Expand Up @@ -181,42 +182,52 @@ def test_set(self):

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


class AltTypesTests(unittest.TestCase):

def test_alttypes(self):
JsonPointer.alttypes = True
class Node(object):
def __init__(self, name, parent=None):
self.name = name
self.parent = parent
self.left = None
self.right = None

class Node(object):
def __init__(self, name, parent=None):
self.name = name
self.parent = parent
self.left = None
self.right = None
def set_left(self, node):
node.parent = self
self.left = node

def set_left(self, node):
node.parent = self
self.left = node
def set_right(self, node):
node.parent = self
self.right = node

def set_right(self, node):
node.parent = self
self.right = node
def __getitem__(self, key):
if key == 'left':
return self.left
if key == 'right':
return self.right

def __getitem__(self, key):
if key == 'left':
return self.left
if key == 'right':
return self.right
raise KeyError("Only left and right supported")

raise KeyError("Only left and right supported")
def __setitem__(self, key, val):
if key == 'left':
return self.set_left(val)
if key == 'right':
return self.set_right(val)

def __setitem__(self, key, val):
if key == 'left':
return self.set_left(val)
if key == 'right':
return self.set_right(val)
raise KeyError("Only left and right supported: %s" % key)

raise KeyError("Only left and right supported: %s" % key)
class mdict(object):
def __init__(self, d):
self._d = d
def __getitem__(self, item):
return self._d[item]

mdict = mdict({'root': {'1': {'2': '3'}}})
Node = Node


def test_alttypes(self):
Node = self.Node

root = Node('root')
root.set_left(Node('a'))
Expand All @@ -238,6 +249,39 @@ def __setitem__(self, key, val):
set_pointer(root, '/left/right', Node('AB'))
self.assertEqual(resolve_pointer(root, '/left/right').name, 'AB')

def test_mock_dict_sanity(self):
doc = self.mdict
default = None

# TODO: Generate this automatically for any given object
path_to_expected_value = {
'/root/1': {'2': '3'},
'/root': {'1': {'2': '3'}},
'/root/1/2': '3',
}

for path, expected_value in iter(path_to_expected_value.items()):
self.assertEqual(resolve_pointer(doc, path, default), expected_value)

def test_mock_dict_returns_default(self):
doc = self.mdict
default = None

path_to_expected_value = {
'/foo': default,
'/x/y/z/d': default
}

for path, expected_value in iter(path_to_expected_value.items()):
self.assertEqual(resolve_pointer(doc, path, default), expected_value)

def test_mock_dict_raises_key_error(self):
doc = self.mdict
self.assertRaises(JsonPointerException, resolve_pointer, doc, '/foo')
self.assertRaises(JsonPointerException, resolve_pointer, doc, '/root/1/2/3/4')



suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(SpecificationTests))
suite.addTest(unittest.makeSuite(ComparisonTests))
Expand Down

0 comments on commit 6a56f3e

Please sign in to comment.