diff options
author | Stefan Kögl <stefan@skoegl.net> | 2012-09-07 11:25:32 +0200 |
---|---|---|
committer | Stefan Kögl <stefan@skoegl.net> | 2012-09-07 11:25:32 +0200 |
commit | 3fadd63a77c7074fa7a4cd6bc04b0c34891a0d64 (patch) | |
tree | 79fe27d661719ae8ae78de3642d1dcc03d4d23c7 | |
parent | c446946cd179bc2bcfb79699e454519ade1d94c6 (diff) | |
download | python-json-pointer-3fadd63a77c7074fa7a4cd6bc04b0c34891a0d64.tar.gz |
update jsonpointer to current specv0.3
http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-04
-rw-r--r-- | README | 2 | ||||
-rw-r--r-- | jsonpointer.py | 18 | ||||
-rwxr-xr-x | tests.py | 35 |
3 files changed, 46 insertions, 9 deletions
@@ -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>' @@ -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]) |