mirror of
				https://github.com/graphql-python/graphene.git
				synced 2025-10-30 23:47:55 +03:00 
			
		
		
		
	
						commit
						fa5f5b0acb
					
				
							
								
								
									
										37
									
								
								graphene/utils/crunch.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								graphene/utils/crunch.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,37 @@ | |||
| import json | ||||
| from collections import Mapping | ||||
| 
 | ||||
| 
 | ||||
| def to_key(value): | ||||
|     return json.dumps(value) | ||||
| 
 | ||||
| 
 | ||||
| def insert(value, index, values): | ||||
|     key = to_key(value) | ||||
| 
 | ||||
|     if key not in index: | ||||
|         index[key] = len(values) | ||||
|         values.append(value) | ||||
|         return len(values) - 1 | ||||
| 
 | ||||
|     return index.get(key) | ||||
| 
 | ||||
| 
 | ||||
| def flatten(data, index, values): | ||||
|     if isinstance(data, (list, tuple)): | ||||
|         flattened = [flatten(child, index, values) for child in data] | ||||
|     elif isinstance(data, Mapping): | ||||
|         flattened = { | ||||
|             key: flatten(child, index, values) for key, child in data.items() | ||||
|         } | ||||
|     else: | ||||
|         flattened = data | ||||
|     return insert(flattened, index, values) | ||||
| 
 | ||||
| 
 | ||||
| def crunch(data): | ||||
|     index = {} | ||||
|     values = [] | ||||
| 
 | ||||
|     flatten(data, index, values) | ||||
|     return values | ||||
							
								
								
									
										48
									
								
								graphene/utils/tests/test_crunch.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								graphene/utils/tests/test_crunch.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,48 @@ | |||
| import pytest | ||||
| from collections import OrderedDict | ||||
| 
 | ||||
| from ..crunch import crunch | ||||
| 
 | ||||
| 
 | ||||
| @pytest.mark.parametrize("description,uncrunched,crunched", [ | ||||
|     ['number primitive', 0, [0]], | ||||
|     ['boolean primitive', True, [True]], | ||||
|     ['string primitive', "string", ["string"]], | ||||
|     ['empty array', [], [[]]], | ||||
|     ['single-item array', [None], [None, [0]]], | ||||
|     ['multi-primitive all distinct array', [None, 0, True, "string"], [None, 0, True, "string", [0, 1, 2, 3]]], | ||||
|     ['multi-primitive repeated array', [True, True, True, True], [True, [0, 0, 0, 0]]], | ||||
|     ['one-level nested array', [[1, 2, 3]], [1, 2, 3, [0, 1, 2], [3]]], | ||||
|     ['two-level nested array', [[[1, 2, 3]]], [1, 2, 3, [0, 1, 2], [3], [4]]], | ||||
|     ['empty object', {}, [{}]], | ||||
|     ['single-item object', {'a': None}, [None, {'a': 0}]], | ||||
|     [ | ||||
|         'multi-item all distinct object', | ||||
|         OrderedDict([('a', None), ('b', 0), ('c', True), ('d', 'string')]), | ||||
|         [None, 0, True, "string", {'a': 0, 'b': 1, 'c': 2, 'd': 3}] | ||||
|     ], | ||||
|     [ | ||||
|         'multi-item repeated object', | ||||
|         OrderedDict([('a', True), ('b', True), ('c', True), ('d', True)]), | ||||
|         [True, {'a': 0, 'b': 0, 'c': 0, 'd': 0}] | ||||
|     ], | ||||
|     [ | ||||
|         'complex array', | ||||
|         [ | ||||
|             OrderedDict([('a', True), ('b', [1, 2, 3])]), | ||||
|             [1, 2, 3] | ||||
|         ], | ||||
|         [True, 1, 2, 3, [1, 2, 3], {'a': 0, 'b': 4}, [5, 4]] | ||||
|     ], | ||||
|     [ | ||||
|         'complex object', | ||||
|         OrderedDict([ | ||||
|             ('a', True), | ||||
|             ('b', [1, 2, 3]), | ||||
|             ('c', OrderedDict([('a', True), ('b', [1, 2, 3])])) | ||||
|         ]), | ||||
|         [True, 1, 2, 3, [1, 2, 3], {'a': 0, 'b': 4}, {'a': 0, 'b': 4, 'c': 5}] | ||||
|     ], | ||||
| ]) | ||||
| def test_crunch(description, uncrunched, crunched): | ||||
|     assert crunch(uncrunched) == crunched | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user