| 
							 | 
						 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						"""A simple attribute dictionary used for representing configuration options.""" | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						from __future__ import absolute_import | 
					
					
						
						| 
							 | 
						from __future__ import division | 
					
					
						
						| 
							 | 
						from __future__ import print_function | 
					
					
						
						| 
							 | 
						from __future__ import unicode_literals | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						class AttrDict(dict): | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						    IMMUTABLE = '__immutable__' | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						    def __init__(self, *args, **kwargs): | 
					
					
						
						| 
							 | 
						        super().__init__(*args, **kwargs) | 
					
					
						
						| 
							 | 
						        self.__dict__[AttrDict.IMMUTABLE] = False | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						    def __getattr__(self, name): | 
					
					
						
						| 
							 | 
						        if name in self.__dict__: | 
					
					
						
						| 
							 | 
						            return self.__dict__[name] | 
					
					
						
						| 
							 | 
						        elif name in self: | 
					
					
						
						| 
							 | 
						            return self[name] | 
					
					
						
						| 
							 | 
						        else: | 
					
					
						
						| 
							 | 
						            raise AttributeError(name) | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						    def __setattr__(self, name, value): | 
					
					
						
						| 
							 | 
						        if not self.__dict__[AttrDict.IMMUTABLE]: | 
					
					
						
						| 
							 | 
						            if name in self.__dict__: | 
					
					
						
						| 
							 | 
						                self.__dict__[name] = value | 
					
					
						
						| 
							 | 
						            else: | 
					
					
						
						| 
							 | 
						                self[name] = value | 
					
					
						
						| 
							 | 
						        else: | 
					
					
						
						| 
							 | 
						            raise AttributeError( | 
					
					
						
						| 
							 | 
						                'Attempted to set "{}" to "{}", but AttrDict is immutable'.format(name, value) | 
					
					
						
						| 
							 | 
						            ) | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						    def immutable(self, is_immutable): | 
					
					
						
						| 
							 | 
						        """Set immutability to is_immutable and recursively apply the setting | 
					
					
						
						| 
							 | 
						        to all nested AttrDicts. | 
					
					
						
						| 
							 | 
						        """ | 
					
					
						
						| 
							 | 
						        self.__dict__[AttrDict.IMMUTABLE] = is_immutable | 
					
					
						
						| 
							 | 
						         | 
					
					
						
						| 
							 | 
						        for v in self.__dict__.values(): | 
					
					
						
						| 
							 | 
						            if isinstance(v, AttrDict): | 
					
					
						
						| 
							 | 
						                v.immutable(is_immutable) | 
					
					
						
						| 
							 | 
						        for v in self.values(): | 
					
					
						
						| 
							 | 
						            if isinstance(v, AttrDict): | 
					
					
						
						| 
							 | 
						                v.immutable(is_immutable) | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						    def is_immutable(self): | 
					
					
						
						| 
							 | 
						        return self.__dict__[AttrDict.IMMUTABLE] | 
					
					
						
						| 
							 | 
						
 |