forked from mirrors/gecko-dev
		
	 08374b825e
			
		
	
	
		08374b825e
		
	
	
	
	
		
			
			MozReview-Commit-ID: IIX125xFoMx --HG-- extra : rebase_source : 1b90ae1c04bdbb156ce6fef2a6bbadd443f1416a
		
			
				
	
	
		
			51 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # This Source Code Form is subject to the terms of the Mozilla Public
 | |
| # License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
| # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | |
| 
 | |
| from __future__ import absolute_import, print_function, unicode_literals
 | |
| 
 | |
| import copy
 | |
| 
 | |
| 
 | |
| def merge_to(source, dest):
 | |
|     '''
 | |
|     Merge dict and arrays (override scalar values)
 | |
| 
 | |
|     Keys from source override keys from dest, and elements from lists in source
 | |
|     are appended to lists in dest.
 | |
| 
 | |
|     :param dict source: to copy from
 | |
|     :param dict dest: to copy to (modified in place)
 | |
|     '''
 | |
| 
 | |
|     for key, value in source.items():
 | |
|         # Override mismatching or empty types
 | |
|         if type(value) != type(dest.get(key)):  # noqa
 | |
|             dest[key] = source[key]
 | |
|             continue
 | |
| 
 | |
|         # Merge dict
 | |
|         if isinstance(value, dict):
 | |
|             merge_to(value, dest[key])
 | |
|             continue
 | |
| 
 | |
|         if isinstance(value, list):
 | |
|             dest[key] = dest[key] + source[key]
 | |
|             continue
 | |
| 
 | |
|         dest[key] = source[key]
 | |
| 
 | |
|     return dest
 | |
| 
 | |
| 
 | |
| def merge(*objects):
 | |
|     '''
 | |
|     Merge the given objects, using the semantics described for merge_to, with
 | |
|     objects later in the list taking precedence.  From an inheritance
 | |
|     perspective, "parents" should be listed before "children".
 | |
| 
 | |
|     Returns the result without modifying any arguments.
 | |
|     '''
 | |
|     if len(objects) == 1:
 | |
|         return copy.deepcopy(objects[0])
 | |
|     return merge_to(objects[-1], merge(*objects[:-1]))
 |