Skip to content

Commit

Permalink
Merge 4dc8234 into 490c7a2
Browse files Browse the repository at this point in the history
  • Loading branch information
thekafkaf committed Nov 5, 2014
2 parents 490c7a2 + 4dc8234 commit 622ec0d
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 7 deletions.
7 changes: 4 additions & 3 deletions jsonpointer.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,8 @@ def resolve(self, doc, default=_nothing):

try:
doc = self.walk(doc, part)
except JsonPointerException:
# Catching a broad exception to ensure the return of the default
except:
if default is _nothing:
raise
else:
Expand Down Expand Up @@ -215,7 +216,7 @@ 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):
Expand Down Expand Up @@ -249,7 +250,7 @@ def walk(self, doc, part):

def contains(self, ptr):
""" Returns True if self contains the given ptr """
return len(self.parts) > len(ptr.parts) and \
return len(self.parts) >= len(ptr.parts) and \
self.parts[:len(ptr.parts)] == ptr.parts

@property
Expand Down
54 changes: 50 additions & 4 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 All @@ -94,10 +96,10 @@ def test_contains(self):
p3 = JsonPointer("/b/c")

self.assertTrue(p1.contains(p2))
self.assertTrue(p1.contains(p1))
self.assertFalse(p1.contains(p3))



class WrongInputTests(unittest.TestCase):

def test_no_start_slash(self):
Expand Down Expand Up @@ -181,11 +183,11 @@ def test_set(self):

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

class AltTypesTests(unittest.TestCase):

def test_alttypes(self):
JsonPointer.alttypes = True
class AltTypesTests(unittest.TestCase):

@classmethod
def setUpClass(cls):
class Node(object):
def __init__(self, name, parent=None):
self.name = name
Expand Down Expand Up @@ -217,6 +219,18 @@ def __setitem__(self, key, val):

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]

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


def test_alttypes(self):
Node = self.Node

root = Node('root')
root.set_left(Node('a'))
Expand All @@ -238,6 +252,38 @@ 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(KeyError, resolve_pointer, doc, '/foo')



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

0 comments on commit 622ec0d

Please sign in to comment.