summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README2
-rw-r--r--jsonpointer.py18
-rwxr-xr-xtests.py35
3 files changed, 46 insertions, 9 deletions
diff --git a/README b/README
index eb258c5..74593c4 100644
--- a/README
+++ b/README
@@ -3,7 +3,7 @@ python-json-pointer: Resolve JSON Pointers
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Library to resolve JSON Pointers according to
-http://tools.ietf.org/html/draft-pbryan-zyp-json-pointer-00
+http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-04
See Sourcecode for Examples
diff --git a/jsonpointer.py b/jsonpointer.py
index a96b0d5..8683303 100644
--- a/jsonpointer.py
+++ b/jsonpointer.py
@@ -31,11 +31,11 @@
#
""" Identify specific nodes in a JSON document according to
-http://tools.ietf.org/html/draft-pbryan-zyp-json-pointer-00 """
+http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-04 """
# Will be parsed by setup.py to determine package metadata
-__author__ = 'Stefan Kögl <stefan@skoegl.net>'
-__version__ = '0.2'
+__author__ = 'Stefan Kögl <stefan@skoegl.net>'
+__version__ = '0.3'
__website__ = 'https://github.com/stefankoegl/python-json-pointer'
__license__ = 'Modified BSD License'
@@ -57,7 +57,7 @@ def resolve_pointer(doc, pointer, default=_nothing):
>>> obj = {"foo": {"anArray": [ {"prop": 44}], "another prop": {"baz": "A string" }}}
- >>> resolve_pointer(obj, '/') == obj
+ >>> resolve_pointer(obj, '') == obj
True
>>> resolve_pointer(obj, '/foo') == obj['foo']
@@ -121,7 +121,11 @@ class JsonPointer(object):
if parts.pop(0) != '':
raise JsonPointerException('location must starts with /')
- self.parts = map(urllib.unquote, parts)
+ parts = map(urllib.unquote, parts)
+ parts = [part.replace('~1', '/') for part in parts]
+ parts = [part.replace('~0', '~') for part in parts]
+ self.parts = parts
+
def resolve(self, doc, default=_nothing):
@@ -188,9 +192,6 @@ class JsonPointer(object):
def walk(self, doc, part):
""" Walks one step in doc and returns the referenced part """
- if not part:
- return doc
-
# Its not clear if a location "1" should be considered as 1 or "1"
# We prefer the integer-variant if possible
part_variants = self._try_parse(part) + [part]
@@ -218,3 +219,4 @@ def pairwise(iterable):
a, b = tee(iterable)
next(b, None)
return izip(a, b)
+__author__ = 'Stefan Kögl <stefan@skoegl.net>'
diff --git a/tests.py b/tests.py
index 3a4b6a2..df500cc 100755
--- a/tests.py
+++ b/tests.py
@@ -5,11 +5,46 @@ from __future__ import print_function
import doctest
import unittest
import sys
+from jsonpointer import resolve_pointer
+
+class SpecificationTests(unittest.TestCase):
+ """ Tests all examples from the JSON Pointer specification """
+
+ def test_example(self):
+ doc = {
+ "foo": ["bar", "baz"],
+ "": 0,
+ "a/b": 1,
+ "c%d": 2,
+ "e^f": 3,
+ "g|h": 4,
+ "i\\j": 5,
+ "k\"l": 6,
+ " ": 7,
+ "m~n": 8
+ }
+
+ self.assertEqual(resolve_pointer(doc, ""), doc)
+ self.assertEqual(resolve_pointer(doc, "/foo"), ["bar", "baz"])
+ self.assertEqual(resolve_pointer(doc, "/foo/0"), "bar")
+ self.assertEqual(resolve_pointer(doc, "/"), 0)
+ self.assertEqual(resolve_pointer(doc, "/a~1b"), 1)
+ self.assertEqual(resolve_pointer(doc, "/c%d"), 2)
+ self.assertEqual(resolve_pointer(doc, "/e^f"), 3)
+ self.assertEqual(resolve_pointer(doc, "/g|h"), 4)
+ self.assertEqual(resolve_pointer(doc, "/i\\j"), 5)
+ self.assertEqual(resolve_pointer(doc, "/k\"l"), 6)
+ self.assertEqual(resolve_pointer(doc, "/ "), 7)
+ self.assertEqual(resolve_pointer(doc, "/m~0n"), 8)
+
+
+
modules = ['jsonpointer']
coverage_modules = []
suite = unittest.TestSuite()
+suite.addTest(unittest.makeSuite(SpecificationTests))
for module in modules:
m = __import__(module, fromlist=[module])