|
3 | 3 | class CloudFlareError(Exception):
|
4 | 4 | """ errors for Cloudflare API"""
|
5 | 5 |
|
6 |
| - class CodeMessage(): |
| 6 | + class _CodeMessage(): |
7 | 7 | """ a small class to save away an interger and string (the code and the message)"""
|
8 | 8 |
|
9 | 9 | def __init__(self, code, message):
|
10 |
| - self.code = code |
11 |
| - self.message = message |
| 10 | + self._code = code |
| 11 | + self._message = message |
12 | 12 |
|
13 | 13 | def __int__(self):
|
14 |
| - return self.code |
| 14 | + return self._code |
15 | 15 |
|
16 | 16 | def __str__(self):
|
17 |
| - return self.message |
| 17 | + return self._message |
18 | 18 |
|
19 | 19 | def __init__(self, code=0, message=None, error_chain=None, e=None):
|
20 | 20 | """ errors for Cloudflare API"""
|
21 | 21 |
|
22 | 22 | if e and isinstance(e, CloudFlareAPIError):
|
23 |
| - self.evalue = e.evalue |
24 |
| - self.error_chain = e.error_chain |
| 23 | + # create fresh values (i.e copies) |
| 24 | + self._evalue = CloudFlareError._CodeMessage(int(e), str(e)) |
| 25 | + if getattr(e, '_error_chain', False): |
| 26 | + self._error_chain = [CloudFlareError._CodeMessage(int(v), str(v)) for v in e._error_chain] |
25 | 27 | return
|
26 | 28 |
|
27 |
| - self.evalue = CloudFlareError.CodeMessage(int(code), str(message)) |
28 |
| - self.error_chain = None |
| 29 | + self._evalue = CloudFlareError._CodeMessage(int(code), str(message)) |
29 | 30 | if error_chain is not None:
|
30 |
| - self.error_chain = [] |
| 31 | + self._error_chain = [] |
31 | 32 | for evalue in error_chain:
|
32 |
| - if isinstance(evalue, CloudFlareError.CodeMessage): |
| 33 | + if isinstance(evalue, CloudFlareError._CodeMessage): |
33 | 34 | v = evalue
|
34 | 35 | else:
|
35 |
| - v = CloudFlareError.CodeMessage(int(evalue['code']), str(evalue['message'])) |
36 |
| - self.error_chain.append(v) |
37 |
| - # self.error_chain.append({'code': self.code, 'message': str(self.message)}) |
| 36 | + v = CloudFlareError._CodeMessage(int(evalue['code']), str(evalue['message'])) |
| 37 | + self._error_chain.append(v) |
38 | 38 | # As we are built off Exception, we need to get our superclass all squared away
|
39 | 39 | # super().__init__(message)
|
40 | 40 |
|
| 41 | + def __bool__(self): |
| 42 | + """ bool value for Cloudflare API errors""" |
| 43 | + |
| 44 | + # required because there's a len() function below that can return 0 |
| 45 | + # see https://docs.python.org/3/library/stdtypes.html#truth-value-testing |
| 46 | + return True |
| 47 | + |
41 | 48 | def __int__(self):
|
42 | 49 | """ integer value for Cloudflare API errors"""
|
43 | 50 |
|
44 |
| - return int(self.evalue) |
| 51 | + return int(self._evalue) |
45 | 52 |
|
46 | 53 | def __str__(self):
|
47 | 54 | """ string value for Cloudflare API errors"""
|
48 | 55 |
|
49 |
| - return str(self.evalue) |
| 56 | + return str(self._evalue) |
| 57 | + |
| 58 | + def __repr__(self): |
| 59 | + """ string value for Cloudflare API errors""" |
| 60 | + |
| 61 | + s = '[%d:"%s"]' % (int(self._evalue), str(self._evalue)) |
| 62 | + if getattr(self, '_error_chain', False): |
| 63 | + for evalue in self._error_chain: |
| 64 | + s += ' [%d:"%s"]' % (int(evalue), str(evalue)) |
| 65 | + return s |
50 | 66 |
|
51 | 67 | def __len__(self):
|
52 | 68 | """ Cloudflare API errors can contain a chain of errors"""
|
53 | 69 |
|
54 |
| - if self.error_chain is None: |
| 70 | + try: |
| 71 | + return len(getattr(self, '_error_chain')) |
| 72 | + except AttributeError: |
55 | 73 | return 0
|
56 |
| - return len(self.error_chain) |
57 | 74 |
|
58 | 75 | def __getitem__(self, ii):
|
59 | 76 | """ Cloudflare API errors can contain a chain of errors"""
|
60 | 77 |
|
61 |
| - return self.error_chain[ii] |
| 78 | + return self._error_chain[ii] |
62 | 79 |
|
63 | 80 | def __iter__(self):
|
64 | 81 | """ Cloudflare API errors can contain a chain of errors"""
|
65 | 82 |
|
66 |
| - if self.error_chain is None: |
67 |
| - return |
68 |
| - for evalue in self.error_chain: |
69 |
| - yield evalue |
| 83 | + if getattr(self, '_error_chain', False): |
| 84 | + for evalue in self._error_chain: |
| 85 | + yield evalue |
| 86 | + return |
70 | 87 |
|
71 | 88 | def next(self):
|
72 | 89 | """ Cloudflare API errors can contain a chain of errors"""
|
73 | 90 |
|
74 |
| - if self.error_chain is None: |
| 91 | + if getattr(self, '_error_chain', False) is False: |
75 | 92 | raise StopIteration
|
76 | 93 |
|
77 | 94 | class CloudFlareAPIError(CloudFlareError):
|
|
0 commit comments