Skip to content

Commit 57cb6cb

Browse files
committed
[test] add real unit tests, polish jsonpath
1 parent 2647fc9 commit 57cb6cb

File tree

4 files changed

+340
-45
lines changed

4 files changed

+340
-45
lines changed

jdata/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
save,
3939
loadurl,
4040
show,
41+
dumpb,
4142
loadt,
4243
savet,
4344
loadts,
@@ -57,6 +58,7 @@
5758
"save",
5859
"loadurl",
5960
"show",
61+
"dumpb",
6062
"loadt",
6163
"savet",
6264
"loadts",

jdata/jfile.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"save",
1010
"loadurl",
1111
"show",
12+
"dumpb",
1213
"loadt",
1314
"savet",
1415
"loadts",
@@ -236,6 +237,23 @@ def show(data, opt={}, **kwargs):
236237
print(str)
237238

238239

240+
def dumpb(data, opt={}, **kwargs):
241+
"""@brief Printing native python data in binary JSON stream
242+
243+
@param[in] data: data to be saved
244+
@param[in] opt: options, if opt['encode']=True or 1 (default), call jdata.encode() before printing
245+
"""
246+
247+
try:
248+
import bjdata
249+
except ImportError:
250+
raise ImportError(
251+
'To read/write binary JData files, you must install the bjdata module by "pip install bjdata"'
252+
)
253+
else:
254+
return bjdata.dumpb(data)
255+
256+
239257
##====================================================================================
240258
## Loading and saving binary JData (i.e. UBJSON) files
241259
##====================================================================================

jdata/jpath.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,15 @@ def getonelevel(input_data, paths, pathid, opt):
7676

7777
if arrayrange["start"] is not None:
7878
if arrayrange["start"] < 0:
79-
arrayrange["start"] = len(input_data) + arrayrange["start"]
79+
arrayrange["start"] = len(input_data) + arrayrange["start"] + 1
8080
else:
8181
arrayrange["start"] += 1
8282
else:
8383
arrayrange["start"] = 1
8484

8585
if arrayrange["end"] is not None:
8686
if arrayrange["end"] < 0:
87-
arrayrange["end"] = len(input_data) + arrayrange["end"]
87+
arrayrange["end"] = len(input_data) + arrayrange["end"] + 1
8888
else:
8989
arrayrange["end"] += 1
9090
else:
@@ -97,7 +97,7 @@ def getonelevel(input_data, paths, pathid, opt):
9797
firstidx += 1
9898
arrayrange["start"] = arrayrange["end"] = firstidx
9999
elif re.match(r"^\*$", arraystr):
100-
pass
100+
arrayrange = {"start": 1, "end": len(input_data)}
101101

102102
if (
103103
"arrayrange" in locals()
@@ -117,7 +117,13 @@ def getonelevel(input_data, paths, pathid, opt):
117117
item, paths[:pathid] + [searchkey], pathid, opt
118118
)
119119
if isfound:
120-
newobj.extend(val)
120+
if isinstance(val, list):
121+
if len(val) > 1:
122+
newobj.extend(val)
123+
else:
124+
newobj.append(val)
125+
else:
126+
newobj.append(val)
121127
if newobj:
122128
obj = newobj
123129
if isinstance(obj, list) and len(obj) == 1:
@@ -130,7 +136,6 @@ def getonelevel(input_data, paths, pathid, opt):
130136
if stpath in input_data:
131137
obj = [input_data[stpath]]
132138

133-
deepscan = False
134139
if obj is None or deepscan:
135140
items = input_data.keys()
136141

@@ -141,7 +146,10 @@ def getonelevel(input_data, paths, pathid, opt):
141146
if isfound:
142147
obj = obj or []
143148
if isinstance(val, list):
144-
obj.extend(val)
149+
if len(val) > 1:
150+
obj.extend(val)
151+
else:
152+
obj.append(val)
145153
else:
146154
obj.append(val)
147155

0 commit comments

Comments
 (0)