forked from ucloud/ucloud-sdk-python2
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfields.py
More file actions
132 lines (106 loc) · 3.91 KB
/
fields.py
File metadata and controls
132 lines (106 loc) · 3.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# -*- coding: utf-8 -*-
import base64
import collections
from ucloud.core.typesystem import abstract
from ucloud.core.exc import ValidationException
from ucloud.core.utils.compat import str
class List(abstract.Field):
""" array param is the custom field to parse custom param such as:
- IP.N
- UDisk.N.Size
- NetInterface.N.EIP.Bandwidth
"""
def __init__(self, item, default=list, **kwargs):
super(List, self).__init__(default=default, **kwargs)
self.item = item
def dumps(self, value, name=None, **kwargs):
if not isinstance(value, collections.Iterable):
raise ValidationException(
"invalid field {}, expect list, got {}".format(
name, type(value)
)
)
errors = []
values = []
for each in value:
try:
v = self.item.dumps(each)
except ValidationException as e:
errors.extend(e.errors)
else:
values.append(v)
if len(errors) > 0:
raise ValidationException(errors)
return values
def loads(self, value, name=None, **kwargs):
if not isinstance(value, collections.Iterable):
raise ValidationException(
"invalid field {}, expect list, got {}".format(
name, type(value)
)
)
errors = []
values = []
for each in value:
try:
v = self.item.loads(each)
except ValidationException as e:
errors.extend(e.errors)
else:
values.append(v)
if len(errors) > 0:
raise ValidationException(errors)
return values
class Str(abstract.Field):
def dumps(self, value, name=None, **kwargs):
return self._convert(value, name)
def loads(self, value, name=None, **kwargs):
return self._convert(value, name)
def _convert(self, value, name=None):
if self.strict and not isinstance(value, str):
self.fail(name, "str", type(value))
return str(value)
class Base64(Str):
def dumps(self, value, name=None, **kwargs):
s = super(Base64, self).dumps(value, name)
return base64.b64encode(s.encode()).decode()
def loads(self, value, name=None, **kwargs):
s = super(Base64, self).loads(value, name)
return base64.b64decode(s.encode()).decode()
class Int(abstract.Field):
def dumps(self, value, name=None, **kwargs):
return self._convert(value, name)
def loads(self, value, name=None, **kwargs):
return self._convert(value, name)
def _convert(self, value, name=None):
if self.strict and not isinstance(value, int):
self.fail(name, "int", type(value))
try:
return int(value)
except ValueError:
self.fail(name, "int", type(value))
class Float(abstract.Field):
def dumps(self, value, name=None, **kwargs):
return self._convert(value, name)
def loads(self, value, name=None, **kwargs):
return self._convert(value, name)
def _convert(self, value, name=None):
if self.strict and not isinstance(value, float):
self.fail(name, "float", type(value))
try:
return float(value)
except ValueError:
self.fail(name, "float", type(value))
class Bool(abstract.Field):
def dumps(self, value, name=None, **kwargs):
return self._convert(value, name)
def loads(self, value, name=None, **kwargs):
return self._convert(value, name)
def _convert(self, value, name=None):
if self.strict and not isinstance(value, bool):
self.fail(name, "bool", type(value))
if value == "true" or value is True:
return True
if value == "false" or value is False:
return False
self.fail(name, "bool", type(value))