Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions jsonpointer.py
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ def to_last(self, doc):
for part in self.parts[:-1]:
doc = self.walk(doc, part)

return doc, self.get_part(doc, self.parts[-1])
return doc, JsonPointer.get_part(doc, self.parts[-1])

def resolve(self, doc, default=_nothing):
"""Resolves the pointer against doc and returns the referenced object"""
Expand Down Expand Up @@ -228,7 +228,8 @@ def set(self, doc, value, inplace=True):
parent[part] = value
return doc

def get_part(self, doc, part):
@classmethod
def get_part(cls, doc, part):
"""Returns the next step in the correct type"""

if isinstance(doc, Mapping):
Expand All @@ -239,7 +240,7 @@ def get_part(self, doc, part):
if part == '-':
return part

if not self._RE_ARRAY_INDEX.match(str(part)):
if not JsonPointer._RE_ARRAY_INDEX.match(str(part)):
raise JsonPointerException("'%s' is not a valid sequence index" % part)

return int(part)
Expand All @@ -252,12 +253,17 @@ def get_part(self, doc, part):
else:
raise JsonPointerException("Document '%s' does not support indexing, "
"must be mapping/sequence or support __getitem__" % type(doc))

def get_parts(self):
"""Returns the list of the parts. For example, JsonPointer('/a/b').get_parts() == ['a', 'b']"""

return self.parts


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

part = self.get_part(doc, part)
part = JsonPointer.get_part(doc, part)

assert hasattr(doc, '__getitem__'), "invalid document type %s" % (type(doc),)

Expand Down
23 changes: 22 additions & 1 deletion tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,31 @@ def test_round_trip(self):
ptr = JsonPointer(path)
self.assertEqual(path, ptr.path)

parts = ptr.parts
parts = ptr.get_parts()
self.assertEqual(parts, ptr.parts)
new_ptr = JsonPointer.from_parts(parts)
self.assertEqual(ptr, new_ptr)

def test_parts(self):
paths = [
("", []),
("/foo", ['foo']),
("/foo/0", ['foo', '0']),
("/", ['']),
("/a~1b", ['a/b']),
("/c%d", ['c%d']),
("/e^f", ['e^f']),
("/g|h", ['g|h']),
("/i\\j", ['i\j']),
("/k\"l", ['k"l']),
("/ ", [' ']),
("/m~0n", ['m~n']),
('/\xee', ['\xee']),
]
for path in paths:
ptr = JsonPointer(path[0])
self.assertEqual(ptr.get_parts(), path[1])


class ComparisonTests(unittest.TestCase):

Expand Down