4242
4343
4444try :
45- from urllib import unquote
4645 from itertools import izip
4746 str = unicode
4847except ImportError : # Python 3
49- from urllib .parse import unquote
5048 izip = zip
5149
5250try :
@@ -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):
8689def 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