summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Kögl <stefan@skoegl.net>2017-10-26 13:16:34 +0200
committerStefan Kögl <stefan@skoegl.net>2017-10-26 13:16:34 +0200
commitc118415bed27c8c0dcb11d045ca406177b7481ae (patch)
tree748c9f3ec53f31d2e65aa7763c455dabd2647e81
parent33d1513ad8453d345f0d7c6b9c350c25c9fddcd4 (diff)
downloadpython-json-pointer-issue-22.tar.gz
Pointers should not be assumed urlencoded, fix #22issue-22
-rw-r--r--jsonpointer.py28
1 files changed, 21 insertions, 7 deletions
diff --git a/jsonpointer.py b/jsonpointer.py
index 8592508..33095f7 100644
--- a/jsonpointer.py
+++ b/jsonpointer.py
@@ -42,11 +42,9 @@ __license__ = 'Modified BSD License'
try:
- from urllib import unquote
from itertools import izip
str = unicode
except ImportError: # Python 3
- from urllib.parse import unquote
izip = zip
try:
@@ -74,9 +72,14 @@ def set_pointer(doc, pointer, value, inplace=True):
{'foo': {'another prop': {'baz': 'A string'}, 'anArray': [{'prop': 55}]}}
True
- >>> set_pointer(obj, '/foo/yet%20another%20prop', 'added prop') == \
+ >>> set_pointer(obj, '/foo/yet another prop', 'added prop') == \
{'foo': {'another prop': {'baz': 'A string'}, 'yet another prop': 'added prop', 'anArray': [{'prop': 55}]}}
True
+
+ >>> obj = {'foo': {}}
+ >>> set_pointer(obj, '/foo/a%20b', 'x') == \
+ {'foo': {'a%20b': 'x' }}
+ True
"""
pointer = JsonPointer(pointer)
@@ -86,7 +89,7 @@ def set_pointer(doc, pointer, value, inplace=True):
def resolve_pointer(doc, pointer, default=_nothing):
""" Resolves pointer against doc and returns the referenced object
- >>> obj = {'foo': {'anArray': [ {'prop': 44}], 'another prop': {'baz': 'A string' }}}
+ >>> obj = {'foo': {'anArray': [ {'prop': 44}], 'another prop': {'baz': 'A string' }}, 'a%20b': 1, 'c d': 2}
>>> resolve_pointer(obj, '') == obj
True
@@ -94,10 +97,10 @@ def resolve_pointer(doc, pointer, default=_nothing):
>>> resolve_pointer(obj, '/foo') == obj['foo']
True
- >>> resolve_pointer(obj, '/foo/another%20prop') == obj['foo']['another prop']
+ >>> resolve_pointer(obj, '/foo/another prop') == obj['foo']['another prop']
True
- >>> resolve_pointer(obj, '/foo/another%20prop/baz') == obj['foo']['another prop']['baz']
+ >>> resolve_pointer(obj, '/foo/another prop/baz') == obj['foo']['another prop']['baz']
True
>>> resolve_pointer(obj, '/foo/anArray/0') == obj['foo']['anArray'][0]
@@ -105,6 +108,18 @@ def resolve_pointer(doc, pointer, default=_nothing):
>>> resolve_pointer(obj, '/some/path', None) == None
True
+
+ >>> resolve_pointer(obj, '/a b', None) == None
+ True
+
+ >>> resolve_pointer(obj, '/a%20b') == 1
+ True
+
+ >>> resolve_pointer(obj, '/c d') == 2
+ True
+
+ >>> resolve_pointer(obj, '/c%20d', None) == None
+ True
"""
pointer = JsonPointer(pointer)
@@ -158,7 +173,6 @@ class JsonPointer(object):
if parts.pop(0) != '':
raise JsonPointerException('location must starts with /')
- parts = map(unquote, parts)
parts = [unescape(part) for part in parts]
self.parts = parts