Completed
Push — master ( 0cea0f...5eca7a )
by Edward
17s
created

ResultSets.selector()   F

Complexity

Conditions 16

Size

Total Lines 33

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 16
dl 0
loc 33
rs 2.7326

How to fix   Complexity   

Complexity

Complex classes like ResultSets.selector() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
#!/usr/bin/env python
2
3
import libcloud.compute.base as compute_base
4
import libcloud.dns.base as dns_base
5
import libcloud.loadbalancer.base as lb_base
6
import libcloud.container.base as container_base
7
8
__all__ = [
9
    'FieldLists',
10
    'ResultSets'
11
]
12
13
14
class FieldLists(object):
15
    """
16
    The lists of fields we want to return for each class
17
    """
18
    NODE = ['id', 'name', 'state', 'public_ips', 'private_ips', 'size', 'image']
19
    NODE_SIZE = ['id', 'name', 'ram', 'disk', 'bandwidth', 'price']
20
    NODE_IMAGE = ['id', 'name']
21
    LOCATION = ['id', 'name', 'country']
22
    NODE_KEY = ['pubkey']
23
    NODE_PASSWORD = ['password', 'generated']
24
    STORAGE_VOLUME = ['id', 'name', 'size', 'state']
25
    VOLUME_SNAPSHOT = ['id', 'size', 'state']
26
    ZONE = ['id', 'domain', 'type', 'ttl']
27
    RECORD = ['id', 'name', 'type', 'data', 'zone']
28
    MEMBER = ['id', 'ip', 'port', 'balancer']
29
    BALANCER = ['id', 'name', 'state', 'port']
30
    CONTAINER = ['id', 'name', 'state']
31
    CONTAINER_IMAGE = ['id', 'name', 'path', 'version']
32
    CONTAINER_CLUSTER = ['id', 'name']
33
34
35
class ResultSets(object):
36
37
    def selector(self, output):
38
        if isinstance(output, compute_base.Node):
39
            return self.parse(output, FieldLists.NODE)
40
        elif isinstance(output, compute_base.NodeSize):
41
            return self.parse(output, FieldLists.NODE_SIZE)
42
        elif isinstance(output, compute_base.NodeImage):
43
            return self.parse(output, FieldLists.NODE_IMAGE)
44
        elif isinstance(output, compute_base.NodeLocation):
45
            return self.parse(output, FieldLists.LOCATION)
46
        elif isinstance(output, compute_base.NodeAuthSSHKey):
47
            return self.parse(output, FieldLists.NODE_KEY)
48
        elif isinstance(output, compute_base.NodeAuthPassword):
49
            return self.parse(output, FieldLists.NODE_PASSWORD)
50
        elif isinstance(output, compute_base.StorageVolume):
51
            return self.parse(output, FieldLists.STORAGE_VOLUME)
52
        elif isinstance(output, compute_base.VolumeSnapshot):
53
            return self.parse(output, FieldLists.VOLUME_SNAPSHOT)
54
        elif isinstance(output, dns_base.Zone):
55
            return self.parse(output, FieldLists.ZONE)
56
        elif isinstance(output, dns_base.Record):
57
            return self.parse(output, FieldLists.RECORD)
58
        elif isinstance(output, lb_base.Member):
59
            return self.parse(output, FieldLists.MEMBER)
60
        elif isinstance(output, lb_base.LoadBalancer):
61
            return self.parse(output, FieldLists.BALANCER)
62
        elif isinstance(output, container_base.Container):
63
            return self.parse(output, FieldLists.CONTAINER)
64
        elif isinstance(output, container_base.ContainerImage):
65
            return self.parse(output, FieldLists.CONTAINER_IMAGE)
66
        elif isinstance(output, container_base.ContainerCluster):
67
            return self.parse(output, FieldLists.CONTAINER_CLUSTER)
68
        else:
69
            return output
70
71
    def formatter(self, output):
72
        formatted = []
73
        if isinstance(output, list):
74
            for o in output:
75
                formatted.append(self.selector(o))
76
        else:
77
            formatted = self.selector(output)
78
        return formatted
79
80
    def _getval(self, obj, field):
81
        return self.selector(getattr(obj, field))
82
83
    def parse(self, output, field_list):
84
        instance_data = {field: self._getval(output, field) for field in field_list}
85
        return instance_data
86