Completed
Pull Request — master (#51)
by Thomas
02:39 queued 01:37
created

Request._check_attributes()   B

Complexity

Conditions 6

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 8.048
Metric Value
cc 6
dl 0
loc 13
ccs 8
cts 13
cp 0.6153
crap 8.048
rs 8
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