mirror of
				https://github.com/graphql-python/graphene.git
				synced 2025-10-30 23:47:55 +03:00 
			
		
		
		
	Add crunch utility
This commit is contained in:
		
							parent
							
								
									9efdf4c46e
								
							
						
					
					
						commit
						1f541e4467
					
				
							
								
								
									
										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 | ||||
							
								
								
									
										40
									
								
								graphene/utils/tests/test_crunch.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								graphene/utils/tests/test_crunch.py
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,40 @@ | |||
| import pytest | ||||
| 
 | ||||
| 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', | ||||
|         {'a': None, 'b': 0, 'c': True, 'd': "string"}, | ||||
|         [None, 0, True, "string", {'a': 0, 'b': 1, 'c': 2, 'd': 3}] | ||||
|     ], | ||||
|     [ | ||||
|         'multi-item repeated object', | ||||
|         {'a': True, 'b': True, 'c': True, 'd': True}, | ||||
|         [True, {'a': 0, 'b': 0, 'c': 0, 'd': 0}] | ||||
|     ], | ||||
|     [ | ||||
|         'complex array', | ||||
|         [{'a': True, 'b': [1, 2, 3]}, [1, 2, 3]], | ||||
|         [True, 1, 2, 3, [1, 2, 3], {'a': 0, 'b': 4}, [5, 4]] | ||||
|     ], | ||||
|     [ | ||||
|         'complex object', | ||||
|         {'a': True, 'b': [1, 2, 3], 'c': {'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