ResultSets.selector()   F
last analyzed

Complexity

Conditions 15

Size

Total Lines 31

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 15
dl 0
loc 31
rs 2.7451
c 0
b 0
f 0

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.common.dimensiondata as dd
4
import libcloud.compute.base as base
5
import libcloud.loadbalancer.base as lb_base
6
7
8
class FieldLists():
9
    STATUS = ['action', 'request_time', 'user_name',
10
              'number_of_steps', 'update_time', 'step_name',
11
              'step_number', 'step_percent_complete', 'failure_reason']
12
    NETWORK = ['id', 'name', 'description', 'private_net',
13
               'multicast', 'status']
14
    NETWORK_DOMAIN = ['id', 'name', 'description', 'plan', 'status']
15
    VLAN = ['id', 'name', 'description', 'private_ipv4_range_address',
16
            'status', 'private_ipv4_range_size', 'network_domain',
17
            'ipv6_range_address', 'ipv6_range_size', 'ipv4_gateway',
18
            'ipv6_gateway']
19
    NODE = ['id', 'name', 'state', 'public_ips', 'private_ips', 'image']
20
    VIP_NODE = ['id', 'name', 'status', 'ip']
21
    NODE_IMAGE = ['id', 'name']
22
    LOCATION = ['id', 'name', 'country']
23
    FIREWALL_RULE = ['id', 'name', 'action', 'ip_version', 'protocol',
24
                     'enabled', 'source', 'destination', 'status', 'network_domain']
25
    FIREWALL_RULE_ADDRESS = ['any_ip', 'ip_address', 'ip_prefix_size',
26
                             'port_begin', 'port_end']
27
    NAT_RULE = ['id', 'internal_ip', 'external_ip', 'status']
28
    IP_BLOCK = ['id', 'base_ip', 'size', 'status', 'network_domain']
29
    MEMBER = ['id', 'ip', 'port', 'balancer']
30
    BALANCER = ['id', 'name', 'state', 'port']
31
32
33
class ResultSets(object):
34
35
    def selector(self, output):
36
        if isinstance(output, dd.DimensionDataNetwork):
37
            return self.parse(output, FieldLists.NETWORK)
38
        elif isinstance(output, dd.DimensionDataNetworkDomain):
39
            return self.parse(output, FieldLists.NETWORK_DOMAIN)
40
        elif isinstance(output, dd.DimensionDataFirewallRule):
41
            return self.parse(output, FieldLists.FIREWALL_RULE)
42
        elif isinstance(output, dd.DimensionDataFirewallAddress):
43
            return self.parse(output, FieldLists.FIREWALL_RULE_ADDRESS)
44
        elif isinstance(output, dd.DimensionDataVIPNode):
45
            return self.parse(output, FieldLists.VIP_NODE)
46
        elif isinstance(output, dd.DimensionDataPublicIpBlock):
47
            return self.parse(output, FieldLists.IP_BLOCK)
48
        elif isinstance(output, dd.DimensionDataNatRule):
49
            return self.parse(output, FieldLists.NAT_RULE)
50
        elif isinstance(output, dd.DimensionDataStatus):
51
            return self.parse(output, FieldLists.STATUS)
52
        elif isinstance(output, dd.DimensionDataVlan):
53
            return self.parse(output, FieldLists.VLAN)
54
        elif isinstance(output, base.Node):
55
            return self.parse(output, FieldLists.NODE)
56
        elif isinstance(output, base.NodeImage):
57
            return self.parse(output, FieldLists.NODE_IMAGE)
58
        elif isinstance(output, base.NodeLocation):
59
            return self.parse(output, FieldLists.LOCATION)
60
        elif isinstance(output, lb_base.Member):
61
            return self.parse(output, FieldLists.MEMBER)
62
        elif isinstance(output, lb_base.LoadBalancer):
63
            return self.parse(output, FieldLists.BALANCER)
64
        else:
65
            return output
66
67
    def formatter(self, output):
68
        formatted = []
69
        if isinstance(output, list):
70
            for o in output:
71
                formatted.append(self.selector(o))
72
        else:
73
            formatted = self.selector(output)
74
        return formatted
75
76
    def _getval(self, obj, field):
77
        return self.selector(getattr(obj, field))
78
79
    def parse(self, output, field_list):
80
        instance_data = {field: self._getval(output, field) for field in field_list}
81
        return instance_data
82