Skip to content

Commit c118415

Browse files
committed
Pointers should not be assumed urlencoded, fix #22
1 parent 33d1513 commit c118415

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

jsonpointer.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,9 @@
4242

4343

4444
try:
45-
from urllib import unquote
4645
from itertools import izip
4746
str = unicode
4847
except ImportError: # Python 3
49-
from urllib.parse import unquote
5048
izip = zip
5149

5250
try:
@@ -74,9 +72,14 @@ def set_pointer(doc, pointer, value, inplace=True):
7472
{'foo': {'another prop': {'baz': 'A string'}, 'anArray': [{'prop': 55}]}}
7573
True
7674
77-
>>> set_pointer(obj, '/foo/yet%20another%20prop', 'added prop') == \
75+
>>> set_pointer(obj, '/foo/yet another prop', 'added prop') == \
7876
{'foo': {'another prop': {'baz': 'A string'}, 'yet another prop': 'added prop', 'anArray': [{'prop': 55}]}}
7977
True
78+
79+
>>> obj = {'foo': {}}
80+
>>> set_pointer(obj, '/foo/a%20b', 'x') == \
81+
{'foo': {'a%20b': 'x' }}
82+
True
8083
"""
8184

8285
pointer = JsonPointer(pointer)
@@ -86,25 +89,37 @@ def set_pointer(doc, pointer, value, inplace=True):
8689
def resolve_pointer(doc, pointer, default=_nothing):
8790
""" Resolves pointer against doc and returns the referenced object
8891
89-
>>> obj = {'foo': {'anArray': [ {'prop': 44}], 'another prop': {'baz': 'A string' }}}
92+
>>> obj = {'foo': {'anArray': [ {'prop': 44}], 'another prop': {'baz': 'A string' }}, 'a%20b': 1, 'c d': 2}
9093
9194
>>> resolve_pointer(obj, '') == obj
9295
True
9396
9497
>>> resolve_pointer(obj, '/foo') == obj['foo']
9598
True
9699
97-
>>> resolve_pointer(obj, '/foo/another%20prop') == obj['foo']['another prop']
100+
>>> resolve_pointer(obj, '/foo/another prop') == obj['foo']['another prop']
98101
True
99102
100-
>>> resolve_pointer(obj, '/foo/another%20prop/baz') == obj['foo']['another prop']['baz']
103+
>>> resolve_pointer(obj, '/foo/another prop/baz') == obj['foo']['another prop']['baz']
101104
True
102105
103106
>>> resolve_pointer(obj, '/foo/anArray/0') == obj['foo']['anArray'][0]
104107
True
105108
106109
>>> resolve_pointer(obj, '/some/path', None) == None
107110
True
111+
112+
>>> resolve_pointer(obj, '/a b', None) == None
113+
True
114+
115+
>>> resolve_pointer(obj, '/a%20b') == 1
116+
True
117+
118+
>>> resolve_pointer(obj, '/c d') == 2
119+
True
120+
121+
>>> resolve_pointer(obj, '/c%20d', None) == None
122+
True
108123
"""
109124

110125
pointer = JsonPointer(pointer)
@@ -158,7 +173,6 @@ def __init__(self, pointer):
158173
if parts.pop(0) != '':
159174
raise JsonPointerException('location must starts with /')
160175

161-
parts = map(unquote, parts)
162176
parts = [unescape(part) for part in parts]
163177
self.parts = parts
164178

0 commit comments

Comments
 (0)