Skip to content

Commit fa5f5b0

Browse files
authored
Merge pull request #787 from jkimbo/crunch
Crunch response data
2 parents 1b746e6 + 1e40ece commit fa5f5b0

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

graphene/utils/crunch.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import json
2+
from collections import Mapping
3+
4+
5+
def to_key(value):
6+
return json.dumps(value)
7+
8+
9+
def insert(value, index, values):
10+
key = to_key(value)
11+
12+
if key not in index:
13+
index[key] = len(values)
14+
values.append(value)
15+
return len(values) - 1
16+
17+
return index.get(key)
18+
19+
20+
def flatten(data, index, values):
21+
if isinstance(data, (list, tuple)):
22+
flattened = [flatten(child, index, values) for child in data]
23+
elif isinstance(data, Mapping):
24+
flattened = {
25+
key: flatten(child, index, values) for key, child in data.items()
26+
}
27+
else:
28+
flattened = data
29+
return insert(flattened, index, values)
30+
31+
32+
def crunch(data):
33+
index = {}
34+
values = []
35+
36+
flatten(data, index, values)
37+
return values

graphene/utils/tests/test_crunch.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import pytest
2+
from collections import OrderedDict
3+
4+
from ..crunch import crunch
5+
6+
7+
@pytest.mark.parametrize("description,uncrunched,crunched", [
8+
['number primitive', 0, [0]],
9+
['boolean primitive', True, [True]],
10+
['string primitive', "string", ["string"]],
11+
['empty array', [], [[]]],
12+
['single-item array', [None], [None, [0]]],
13+
['multi-primitive all distinct array', [None, 0, True, "string"], [None, 0, True, "string", [0, 1, 2, 3]]],
14+
['multi-primitive repeated array', [True, True, True, True], [True, [0, 0, 0, 0]]],
15+
['one-level nested array', [[1, 2, 3]], [1, 2, 3, [0, 1, 2], [3]]],
16+
['two-level nested array', [[[1, 2, 3]]], [1, 2, 3, [0, 1, 2], [3], [4]]],
17+
['empty object', {}, [{}]],
18+
['single-item object', {'a': None}, [None, {'a': 0}]],
19+
[
20+
'multi-item all distinct object',
21+
OrderedDict([('a', None), ('b', 0), ('c', True), ('d', 'string')]),
22+
[None, 0, True, "string", {'a': 0, 'b': 1, 'c': 2, 'd': 3}]
23+
],
24+
[
25+
'multi-item repeated object',
26+
OrderedDict([('a', True), ('b', True), ('c', True), ('d', True)]),
27+
[True, {'a': 0, 'b': 0, 'c': 0, 'd': 0}]
28+
],
29+
[
30+
'complex array',
31+
[
32+
OrderedDict([('a', True), ('b', [1, 2, 3])]),
33+
[1, 2, 3]
34+
],
35+
[True, 1, 2, 3, [1, 2, 3], {'a': 0, 'b': 4}, [5, 4]]
36+
],
37+
[
38+
'complex object',
39+
OrderedDict([
40+
('a', True),
41+
('b', [1, 2, 3]),
42+
('c', OrderedDict([('a', True), ('b', [1, 2, 3])]))
43+
]),
44+
[True, 1, 2, 3, [1, 2, 3], {'a': 0, 'b': 4}, {'a': 0, 'b': 4, 'c': 5}]
45+
],
46+
])
47+
def test_crunch(description, uncrunched, crunched):
48+
assert crunch(uncrunched) == crunched

0 commit comments

Comments
 (0)