Skip to content

Commit 9ba5122

Browse files
authored
Merge pull request #36 from ctomkow/dev
Dev. 2.7 portability.
2 parents 0e4499c + a1ebd94 commit 9ba5122

File tree

7 files changed

+103
-110
lines changed

7 files changed

+103
-110
lines changed

.github/workflows/jsonparse-buildtest.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ name: jsonparse-buildtest
55

66
on:
77
push:
8-
branches: [ "master" ]
8+
branches: [ "master", "dev" ]
99
pull_request:
10-
branches: [ "master" ]
10+
branches: [ "master", "dev" ]
1111

1212
jobs:
1313
buildPy2-7_library_only:

.gitignore

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,9 @@ docs/_build
1212
docs/_static
1313
docs/_templates
1414
docs/make.bat
15-
test.json
15+
test.json
16+
src/*.egg-info
17+
src/.coverage
18+
src/jsonparse/*.pyc
19+
tests/*.pyc
20+
venv3

setup.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
1-
# local imports
2-
import jsonparse
3-
41
# python imports
5-
from setuptools import setup, find_namespace_packages
6-
import os
2+
from setuptools import setup, find_packages
73
from codecs import open
84

95
# read from the VERSION file
10-
with open(os.path.join(
11-
os.path.dirname(jsonparse.__file__), 'VERSION')) as version_file:
6+
with open('src/jsonparse/VERSION') as version_file:
127
version = version_file.read().strip()
138

149
# long description as readme
@@ -56,8 +51,8 @@
5651
'jp=jsonparse.cli:entrypoint',
5752
],
5853
},
59-
packages=find_namespace_packages(include=["jsonparse"]),
60-
package_dir={"jsonparse": "jsonparse"},
54+
packages=find_packages(where="src"),
55+
package_dir={"": "src"},
6156
package_data={
6257
'jsonparse': ['VERSION'],
6358
'jsonparse.static.css': ['*.css'],

src/jsonparse/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.14.1
1+
0.15.0.dev1

src/jsonparse/parser.py

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
# python imports
66
from typing import Union
7+
from collections import OrderedDict
78

89

910
class Parser:
@@ -67,7 +68,7 @@ def find_key(self, data, key):
6768

6869
if type(elem) is list:
6970
self._stack_push_list_elem(elem)
70-
elif type(elem) is dict:
71+
elif isinstance(elem, (dict, OrderedDict)):
7172
value = self._stack_all_key_values_in_dict(key, elem)
7273
if value:
7374
for v in value:
@@ -95,7 +96,7 @@ def find_keys(self, data, keys, group=True):
9596

9697
if type(elem) is list:
9798
self._stack_push_list_elem(elem)
98-
elif type(elem) is dict:
99+
elif isinstance(elem, (dict, OrderedDict)):
99100
value = self._stack_all_keys_values_in_dict(keys, elem)
100101
if value and group:
101102
value_list.insert(0, value)
@@ -132,7 +133,7 @@ def find_key_chain(self, data, keys):
132133

133134
if type(elem) is list:
134135
self._queue_push_list_elem(elem)
135-
elif type(elem) is dict:
136+
elif isinstance(elem, (dict, OrderedDict)):
136137
if self._queue_all_key_values_in_dict(keys[0], elem):
137138
key_found = True
138139
else: # according to RFC 7159, valid JSON can also contain a
@@ -163,7 +164,7 @@ def find_key_value(self, data, key, value):
163164

164165
if type(elem) is list:
165166
self._stack_push_list_elem(elem)
166-
elif type(elem) is dict:
167+
elif isinstance(elem, (dict, OrderedDict)):
167168
if self._stack_all_key_and_value_in_dict(key, value, elem):
168169
value_list.insert(0, elem)
169170
else: # according to RFC 7159, valid JSON can also contain a
@@ -189,7 +190,7 @@ def find_value(self, data, value):
189190

190191
if type(elem) is list:
191192
self._stack_push_list_elem(elem)
192-
elif type(elem) is dict:
193+
elif isinstance(elem, (dict, OrderedDict)):
193194
key = self._stack_all_value_in_dict(value, elem)
194195
if key:
195196
key_list.insert(0, key)
@@ -244,7 +245,7 @@ def _stack_all_key_values_in_dict(self, key, elem):
244245
# type: (str, dict) -> list
245246
value_list = []
246247

247-
if type(elem) is not dict:
248+
if not isinstance(elem, (dict, OrderedDict)):
248249
raise TypeError
249250
elif type(key) is not str:
250251
raise TypeError
@@ -264,7 +265,7 @@ def _stack_all_keys_values_in_dict(self, keys, elem):
264265
# type: (list, dict) -> list
265266
value_list = []
266267

267-
if type(elem) is not dict:
268+
if not isinstance(elem, (dict, OrderedDict)):
268269
raise TypeError
269270
elif type(keys) is not list:
270271
raise TypeError
@@ -285,7 +286,7 @@ def _stack_all_keys_values_in_dict(self, keys, elem):
285286

286287
def _stack_all_key_and_value_in_dict(self, key, value, elem):
287288
# type: (str, Union[str, int, float, bool, None], dict) -> bool
288-
if type(elem) is not dict:
289+
if not isinstance(elem, (dict, OrderedDict)):
289290
raise TypeError
290291
elif type(key) is not str:
291292
raise TypeError
@@ -305,7 +306,7 @@ def _stack_all_key_and_value_in_dict(self, key, value, elem):
305306

306307
def _stack_all_value_in_dict(self, value, elem):
307308
# type: (Union[str, int, float, bool, None], dict) -> str
308-
if type(elem) is not dict:
309+
if not isinstance(elem, (dict, OrderedDict)):
309310
raise TypeError
310311
elif not isinstance(value, (str, int, float, bool, type(None))):
311312
raise TypeError
@@ -374,7 +375,7 @@ def _queue_push_list_elem(self, elem):
374375
def _queue_all_key_values_in_dict(self, key, elem):
375376
# type: (str, dict) -> bool
376377
found = False
377-
if type(elem) is not dict:
378+
if not isinstance(elem, (dict, OrderedDict)):
378379
raise TypeError
379380
elif type(key) is not str:
380381
raise TypeError
@@ -406,8 +407,8 @@ def _queue_trace(self):
406407
# Input validation
407408

408409
def _valid_key_input(self, data, key):
409-
# type: (Union[dict, list], str) -> bool
410-
if not isinstance(data, (dict, list)):
410+
# type: (Union[dict, list, OrderedDict], str) -> bool
411+
if not isinstance(data, (dict, list, OrderedDict)):
411412
raise TypeError
412413
elif not isinstance(key, str):
413414
raise TypeError
@@ -416,8 +417,8 @@ def _valid_key_input(self, data, key):
416417
return True
417418

418419
def _valid_keys_input(self, data, keys, group):
419-
# type: (Union[dict, list], list, bool) -> bool
420-
if not isinstance(data, (dict, list)):
420+
# type: (Union[dict, list, OrderedDict], list, bool) -> bool
421+
if not isinstance(data, (dict, list, OrderedDict)):
421422
raise TypeError
422423
elif not isinstance(keys, list):
423424
raise TypeError
@@ -428,8 +429,8 @@ def _valid_keys_input(self, data, keys, group):
428429
return True
429430

430431
def _valid_key_chain_input(self, data, keys):
431-
# type: (Union[dict, list], list) -> bool
432-
if not isinstance(data, (dict, list)):
432+
# type: (Union[dict, list, OrderedDict], list) -> bool
433+
if not isinstance(data, (dict, list, OrderedDict)):
433434
raise TypeError
434435
elif not isinstance(keys, list):
435436
raise TypeError
@@ -443,8 +444,8 @@ def _valid_key_chain_input(self, data, keys):
443444
return True
444445

445446
def _valid_key_value_input(self, data, key, value):
446-
# type: (Union[dict, list], str, Union[str, int, float, bool, None]) -> bool
447-
if not isinstance(data, (dict, list)):
447+
# type: (Union[dict, list, OrderedDict], str, Union[str, int, float, bool, None]) -> bool
448+
if not isinstance(data, (dict, list, OrderedDict)):
448449
raise TypeError
449450
elif not isinstance(key, str):
450451
raise TypeError
@@ -455,8 +456,8 @@ def _valid_key_value_input(self, data, key, value):
455456
return True
456457

457458
def _valid_value_input(self, data, value):
458-
# type: (Union[dict, list], Union[str, int, float, bool, None]) -> bool
459-
if not isinstance(data, (dict, list)):
459+
# type: (Union[dict, list, OrderedDict], Union[str, int, float, bool, None]) -> bool
460+
if not isinstance(data, (dict, list, OrderedDict)):
460461
raise TypeError
461462
elif not isinstance(value, (str, int, float, bool, type(None))):
462463
raise TypeError

src/jsonparse/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.14.1"
1+
__version__ = "0.15.0.dev1"

tests/test_parser.py

Lines changed: 68 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
# local imports
66
from jsonparse.parser import Parser
7+
from collections import OrderedDict, deque
78

89
# 3rd part imports
910
import pytest
@@ -14,87 +15,78 @@ class TestParser:
1415
@pytest.fixture
1516
def parser(self):
1617

17-
return Parser(stack_trace=True, queue_trace=True)
18+
return Parser(stack_trace=False, queue_trace=False)
1819

1920
@pytest.fixture
2021
def complex_json(self):
2122

2223
return [
23-
{
24-
"id": "0001",
25-
"type": "donut",
26-
"exists": True,
27-
"ppu": 0.55,
28-
"batters":
29-
{
30-
"batter":
31-
[
32-
{"id": "1001", "type": "Reg"},
33-
{"id": "1002", "type": "Chocolate"},
34-
{"id": "1003", "type": "Blueberry"},
35-
{"id": "1004", "type": "Devil's Food"},
36-
{"start": 5, "end": 8}
37-
]
38-
},
39-
"topping":
40-
[
41-
{"id": "5001", "ty": "None"},
42-
{"id": "5002", "type": "Glazed"},
43-
{"id": "5003", "type": "Sugar"},
44-
{"id": "5004", "type": "Powdered Sugar"},
45-
{"id": "5005", "type": "Chocolate with Sprinkles"},
46-
{"id": "5006", "type": "Chocolate"},
47-
{"id": "5007", "type": "Maple"}
48-
],
49-
"start": 22,
50-
"end": 99
51-
},
52-
{
53-
"id": "0002",
54-
"type": "donut",
55-
"exists": False,
56-
"ppu": 42,
57-
"batters":
58-
{
59-
"batter":
60-
[
61-
{"id": "1001", "type": "Rul"}
62-
]
63-
},
64-
"top_stuff":
65-
[
66-
{"id": "5001", "typ": "None"},
67-
{"id": "5002", "type": "Glazed"},
68-
{"id": "5003", "type": "Sugar"},
69-
{"id": "5004", "type": "Chocolate"},
70-
{"id": "5005", "type": "Maple"}
71-
],
72-
"start": 1,
73-
"end": 9
74-
},
75-
{
76-
"id": "0003",
77-
"type": "donut",
78-
"exists": None,
79-
"ppu": 7,
80-
"batters":
81-
{
82-
"batter":
83-
[
84-
{"id": "1001", "type": "Lar"},
85-
{"id": "1002", "type": "Chocolate"}
86-
]
87-
},
88-
"on_top_thing":
89-
[
90-
{"id": "5001", "type": "None"},
91-
{"id": "5002", "type": "Glazed"},
92-
{"id": "5003", "type": "Chocolate"},
93-
{"id": "5004", "type": "Maple"}
94-
],
95-
"start": 4,
96-
"end": 7
97-
}
24+
OrderedDict([
25+
("id", "0001"),
26+
("type", "donut"),
27+
("exists", True),
28+
("ppu", 0.55),
29+
("batters", OrderedDict([
30+
("batter", [
31+
OrderedDict([("id", "1001"), ("type", "Reg")]),
32+
OrderedDict([("id", "1002"), ("type", "Chocolate")]),
33+
OrderedDict([("id", "1003"), ("type", "Blueberry")]),
34+
OrderedDict([("id", "1004"), ("type", "Devil's Food")]),
35+
OrderedDict([("start", 5), ("end", 8)])
36+
])
37+
])),
38+
("topping", [
39+
OrderedDict([("id", "5001"), ("ty", "None")]),
40+
OrderedDict([("id", "5002"), ("type", "Glazed")]),
41+
OrderedDict([("id", "5003"), ("type", "Sugar")]),
42+
OrderedDict([("id", "5004"), ("type", "Powdered Sugar")]),
43+
OrderedDict([("id", "5005"), ("type", "Chocolate with Sprinkles")]),
44+
OrderedDict([("id", "5006"), ("type", "Chocolate")]),
45+
OrderedDict([("id", "5007"), ("type", "Maple")])
46+
]),
47+
("start", 22),
48+
("end", 99)
49+
]),
50+
OrderedDict([
51+
("id", "0002"),
52+
("type", "donut"),
53+
("exists", False),
54+
("ppu", 42),
55+
("batters", OrderedDict([
56+
("batter", [
57+
OrderedDict([("id", "1001"), ("type", "Rul")])
58+
])
59+
])),
60+
("top_stuff", [
61+
OrderedDict([("id", "5001"), ("typ", "None")]),
62+
OrderedDict([("id", "5002"), ("type", "Glazed")]),
63+
OrderedDict([("id", "5003"), ("type", "Sugar")]),
64+
OrderedDict([("id", "5004"), ("type", "Chocolate")]),
65+
OrderedDict([("id", "5005"), ("type", "Maple")])
66+
]),
67+
("start", 1),
68+
("end", 9)
69+
]),
70+
OrderedDict([
71+
("id", "0003"),
72+
("type", "donut"),
73+
("exists", None),
74+
("ppu", 7),
75+
("batters", OrderedDict([
76+
("batter", [
77+
OrderedDict([("id", "1001"), ("type", "Lar")]),
78+
OrderedDict([("id", "1002"), ("type", "Chocolate")])
79+
])
80+
])),
81+
("on_top_thing", [
82+
OrderedDict([("id", "5001"), ("type", "None")]),
83+
OrderedDict([("id", "5002"), ("type", "Glazed")]),
84+
OrderedDict([("id", "5003"), ("type", "Chocolate")]),
85+
OrderedDict([("id", "5004"), ("type", "Maple")])
86+
]),
87+
("start", 4),
88+
("end", 7)
89+
])
9890
]
9991

10092
def test_find_key(self, parser, complex_json):

0 commit comments

Comments
 (0)