| 1 | 1 |  | import sys | 
            
                                                                                                            
                            
            
                                    
            
            
                | 2 | 1 |  | import json | 
            
                                                                                                            
                            
            
                                    
            
            
                | 3 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 4 | 1 |  | from .traceitem import TraceItem | 
            
                                                                                                            
                            
            
                                    
            
            
                | 5 | 1 |  | from ..nodes import AbstractNode | 
            
                                                                                                            
                            
            
                                    
            
            
                | 6 | 1 |  | from .traceitem import TraceItem | 
            
                                                                                                            
                            
            
                                    
            
            
                | 7 | 1 |  | from ..exceptions import AttributeNotProvided | 
            
                                                                                                            
                            
            
                                    
            
            
                | 8 | 1 |  | from ..utils import SerializableAttributesHolder | 
            
                                                                                                            
                            
            
                                    
            
            
                | 9 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 10 | 1 |  | if sys.version_info[0] >= 3: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 11 | 1 |  |     basestring = str | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 12 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 13 | 1 |  | class Request(SerializableAttributesHolder): | 
            
                                                                        
                            
            
                                    
            
            
                | 14 |  |  |     """Represents a request. | 
            
                                                                        
                            
            
                                    
            
            
                | 15 |  |  |     https://github.com/ProjetPP/Documentation/blob/master/module-communication.md#request | 
            
                                                                        
                            
            
                                    
            
            
                | 16 |  |  |     """ | 
            
                                                                        
                            
            
                                    
            
            
                | 17 | 1 |  |     __slots__ = () | 
            
                                                                        
                            
            
                                    
            
            
                | 18 | 1 |  |     _possible_attributes = ('id', 'language', 'tree', 'measures', 'trace', 'response_language') | 
            
                                                                        
                            
            
                                    
            
            
                | 19 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 20 | 1 |  |     def _check_attributes(self, attributes, extra=None): | 
            
                                                                        
                            
            
                                    
            
            
                | 21 | 1 |  |         super(Request, self)._check_attributes(attributes) | 
            
                                                                        
                            
            
                                    
            
            
                | 22 | 1 |  |         missing_attributes = {'id', 'language', 'tree'} - set(attributes.keys()) | 
            
                                                                        
                            
            
                                    
            
            
                | 23 | 1 |  |         if missing_attributes: | 
            
                                                                        
                            
            
                                    
            
            
                | 24 |  |  |             raise AttributeNotProvided('Missing attributes: %s' % ', '.join(missing_attributes)) | 
            
                                                                        
                            
            
                                    
            
            
                | 25 | 1 |  |         if not isinstance(attributes['language'], basestring): | 
            
                                                                        
                            
            
                                    
            
            
                | 26 |  |  |             raise TypeError('"language" attribute is not a string.') | 
            
                                                                        
                            
            
                                    
            
            
                | 27 | 1 |  |         if 'response_language' not in attributes: | 
            
                                                                        
                            
            
                                    
            
            
                | 28 | 1 |  |             attributes['response_language'] = attributes['language'] | 
            
                                                                        
                            
            
                                    
            
            
                | 29 | 1 |  |         elif not isinstance(attributes['response_language'], basestring): | 
            
                                                                        
                            
            
                                    
            
            
                | 30 |  |  |             raise TypeError('"response_language" attribute is not a string.') | 
            
                                                                        
                            
            
                                    
            
            
                | 31 | 1 |  |         if not isinstance(attributes['tree'], AbstractNode): | 
            
                                                                        
                            
            
                                    
            
            
                | 32 |  |  |             raise TypeError('"tree" attribute is not an AbstractNode.') | 
            
                                                                        
                            
            
                                    
            
            
                | 33 | 1 |  |         if not isinstance(attributes['measures'], dict): | 
            
                                                                        
                            
            
                                    
            
            
                | 34 |  |  |             raise TypeError('"measures" attribute is not a dict.') | 
            
                                                                        
                            
            
                                    
            
            
                | 35 | 1 |  |         if not isinstance(attributes['trace'], list): | 
            
                                                                        
                            
            
                                    
            
            
                | 36 |  |  |             raise TypeError('"trace" attribute is not a list.') | 
            
                                                                        
                            
            
                                    
            
            
                | 37 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 38 | 1 |  |     def _parse_attributes(self, attributes): | 
            
                                                                        
                            
            
                                    
            
            
                | 39 | 1 |  |         attributes['measures'] = attributes.get('measures', {}) | 
            
                                                                        
                            
            
                                    
            
            
                | 40 | 1 |  |         attributes['trace'] = \ | 
            
                                                                        
                            
            
                                    
            
            
                | 41 |  |  |                 [x if isinstance(x, TraceItem) else TraceItem.from_dict(x) | 
            
                                                                        
                            
            
                                    
            
            
                | 42 |  |  |                  for x in attributes.get('trace', [])] | 
            
                                                                        
                            
            
                                    
            
            
                | 43 | 1 |  |         super(Request, self)._parse_attributes(attributes) | 
            
                                                                        
                            
            
                                    
            
            
                | 44 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 45 | 1 |  |     def __eq__(self, other): | 
            
                                                                        
                            
            
                                    
            
            
                | 46 | 1 |  |         if not isinstance(other, Request): | 
            
                                                                        
                            
            
                                    
            
            
                | 47 |  |  |             return False | 
            
                                                                        
                            
            
                                    
            
            
                | 48 |  |  |         else: | 
            
                                                                        
                            
            
                                    
            
            
                | 49 | 1 |  |             return super(Request, self).__eq__(other) | 
            
                                                                        
                            
            
                                    
            
            
                | 50 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 51 | 1 |  |     def __hash__(self): | 
            
                                                                        
                            
            
                                    
            
            
                | 52 |  |  |         return hash((Request, self._attributes)) | 
            
                                                                        
                            
            
                                    
            
            
                | 53 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 54 | 1 |  |     @classmethod | 
            
                                                                        
                            
            
                                    
            
            
                | 55 |  |  |     def deserialize_attribute(cls, key, value): | 
            
                                                                        
                            
            
                                    
            
            
                | 56 | 1 |  |         if key == 'tree': | 
            
                                                                        
                            
            
                                    
            
            
                | 57 | 1 |  |             return AbstractNode.deserialize_attribute(key, value) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 58 | 1 |  |         elif key == 'trace': | 
            
                                                                                                            
                            
            
                                    
            
            
                | 59 |  |  |             return [TraceItem.from_dict(x) for x in value] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 60 |  |  |         else: | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 61 |  |  |             return value | 
            
                                                        
            
                                    
            
            
                | 62 |  |  |  |