Completed
Push — master ( 72b331...d4b7d2 )
by Steffen
02:14
created

kuon.api_response   A

Complexity

Total Complexity 29

Size/Duplication

Total Lines 102
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 29
eloc 65
dl 0
loc 102
rs 10
c 0
b 0
f 0

16 Methods

Rating   Name   Duplication   Size   Complexity  
A LockedList.__delitem__() 0 2 1
A LockedDict.__delattr__() 0 2 1
A LockedDict.__delitem__() 0 3 1
A LockedDict.__setattr__() 0 2 1
A LockedDict.__setitem__() 0 2 1
A LockedDict.__getattr__() 0 7 4
A LockedList.__init__() 0 7 2
A LockedList.__getitem__() 0 7 4
A LockedList.append() 0 2 1
A LockedList.__setitem__() 0 2 1
B LockedDict.__init__() 0 10 6
A APIResponse.__init__() 0 7 2
A LockedList.insert() 0 2 1
A LockedList.__len__() 0 2 1
A LockedList.__repr__() 0 2 1
A LockedList.__str__() 0 2 1
1
#!/usr/bin/python
2
# -*- coding: utf-8 -*-
3
4
import json
5
from collections import MutableSequence
6
7
from kuon.exceptions import InvalidApiResponseType
8
9
10
class LockedList(MutableSequence):
11
    """Custom list where customizing values isn't possible by default
12
    Return LockedList on list or tuple types
13
    and LockedDict on dict types"""
14
15
    def __init__(self, data=None):
16
        """Initialize the class"""
17
        super(LockedList, self).__init__()
18
        if data is not None:
19
            self._list = list(data)
20
        else:
21
            self._list = list()
22
23
    def __repr__(self):
24
        return str(self._list)
25
26
    def __len__(self):
27
        return len(self._list)
28
29
    def __getitem__(self, ii):
30
        val = self._list[ii]
31
        if isinstance(val, list) or isinstance(val, tuple):
32
            val = LockedList(val)
33
        if isinstance(val, dict):
34
            val = LockedDict(val)
35
        return val
36
37
    def __delitem__(self, ii):
38
        del self._list[ii]
39
40
    def __setitem__(self, ii, val):
41
        pass
42
43
    def __str__(self):
44
        return str(self._list)
45
46
    def insert(self, ii, val):
47
        pass
48
49
    def append(self, val):
50
        pass
51
52
53
class LockedDict(dict):
54
    """Custom dict where customizing values isn't possible by default
55
    Return LockedList on list or tuple types
56
    and LockedDict on dict types"""
57
58
    def __init__(self, *args, **kwargs):
59
        super(LockedDict, self).__init__(*args, **kwargs)
60
        for arg in args:
61
            if isinstance(arg, dict):
62
                for k, v in arg.items():
63
                    self[k] = v
64
65
        if kwargs:
66
            for k, v in kwargs.items():
67
                self[k] = v
68
69
    def __getattr__(self, attr):
70
        val = self.get(attr)
71
        if isinstance(val, list) or isinstance(val, tuple):
72
            val = LockedList(val)
73
        if isinstance(val, dict):
74
            val = LockedDict(val)
75
        return val
76
77
    def __setattr__(self, key, value):
78
        pass
79
80
    def __setitem__(self, key, value):
81
        pass
82
83
    def __delattr__(self, item):
84
        self.__delitem__(item)
85
86
    def __delitem__(self, key):
87
        super(LockedDict, self).__delitem__(key)
88
        del self.__dict__[key]
89
90
91
class APIResponse(LockedDict):
92
    """Wrapper for the json response returned from the APIs of OPSkins and Bitskins
93
    Uses LockedDict and LockedList classes to prevent modifications to the retrieved values"""
94
95
    def __init__(self, data):
96
        try:
97
            data = json.loads(data)
98
        except ValueError:
99
            raise InvalidApiResponseType("The API didn't return a valid json format", data)
100
101
        super().__init__(data)
102