From 1e818af78ec962d6b351f3de89d771dfa86a7368 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20K=C3=B6gl?= Date: Thu, 15 Nov 2012 11:08:01 +0100 Subject: add JsonPointer.to_last() for use in jsonpatch --- jsonpointer.py | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) (limited to 'jsonpointer.py') diff --git a/jsonpointer.py b/jsonpointer.py index 3a86773..fe3cecf 100644 --- a/jsonpointer.py +++ b/jsonpointer.py @@ -146,6 +146,14 @@ class JsonPointer(object): self.parts = parts + def to_last(self, doc, default=_nothing): + """ Resolves ptr until the last step, returns (sub-doc, last-step) """ + + for part in self.parts[:-1]: + doc = self.walk(doc, part) + + return doc, self.get_part(doc, self.parts[-1]) + def resolve(self, doc, default=_nothing): """Resolves the pointer against doc and returns the referenced object""" @@ -208,9 +216,31 @@ class JsonPointer(object): return doc[part] + def get_part(self, doc, part): + """ Returns the next step in the correct type """ + + if isinstance(doc, dict): + return part + + elif isinstance(doc, list): + + if part == '-': + return part + + try: + return int(part) + except ValueError: + raise JsonPointerException("'%s' is not a valid list index" % (part, )) + + else: + raise JsonPointerException("Unknown document type '%s'" % (doc.__class__,)) + + def walk(self, doc, part): """ Walks one step in doc and returns the referenced part """ + part = self.get_part(doc, part) + if isinstance(doc, dict): try: return doc[part] @@ -223,11 +253,6 @@ class JsonPointer(object): if part == '-': return EndOfList(doc) - try: - part = int(part) - except ValueError: - raise JsonPointerException("'%s' is not a valid list index" % (part, )) - try: return doc[part] -- cgit v1.2.1