16 from ast
import literal_eval
17 from collections
import OrderedDict
19 from collections
import abc
21 import collections
as abc
22 from datetime
import datetime, date, timedelta
23 from decimal
import InvalidOperation, Decimal
29 from numbers
import Integral, Real
33 PY2, seq2str, type_name, unicode)
44 _converters = OrderedDict()
54 return self.
typetype.__name__.lower()
58 converter = converter_class()
59 cls.
_converters_converters[converter.type] = converter
60 for name
in (converter.type_name,) + converter.aliases:
63 return converter_class
69 if PY_VERSION >= (3, 7)
and hasattr(type_,
'__origin__'):
70 type_ = type_.__origin__
71 if isinstance(type_, (str, unicode)):
76 if not isinstance(type_, type)
or issubclass(type_, unicode):
80 for converter
in cls.
_converters_converters.values():
81 if converter.handles(type_):
82 return converter.get_converter(type_)
86 return (issubclass(type_, self.
typetype)
or
87 self.
abcabc
and issubclass(type_, self.
abcabc))
92 def convert(self, name, value, explicit_type=True):
93 if self.
convert_noneconvert_none
and value.upper() ==
'NONE':
96 return self.
_convert_convert(value, explicit_type)
97 except ValueError
as error:
98 return self.
_handle_error_handle_error(name, value, error, explicit_type)
101 raise NotImplementedError
104 if not explicit_type:
106 ending =
u': %s' % error
if error.args
else '.'
107 raise ValueError(
"Argument '%s' got value '%s' that cannot be "
116 raise ValueError(
'Sets are not supported on Python 2.')
121 value = literal_eval(value)
122 except (ValueError, SyntaxError):
124 raise ValueError(
'Invalid expression.')
125 except TypeError
as err:
126 raise ValueError(
'Evaluating expression failed: %s' % err)
127 if not isinstance(value, expected):
128 raise ValueError(
'Value is %s, not %s.' % (
type_name(value),
133 @TypeConverter.register
136 type_name =
'boolean'
140 upper = value.upper()
141 if upper
in TRUE_STRINGS:
143 if upper
in FALSE_STRINGS:
148 @TypeConverter.register
152 type_name =
'integer'
153 aliases = (
'int',
'long')
159 if not explicit_type:
167 @TypeConverter.register
171 aliases = (
'double',)
180 @TypeConverter.register
186 return Decimal(value)
187 except InvalidOperation:
194 @TypeConverter.register
197 abc = getattr(abc,
'ByteString',
None)
202 if PY2
and not explicit_type:
205 value = value.encode(
'latin-1')
206 except UnicodeEncodeError
as err:
207 raise ValueError(
"Character '%s' cannot be mapped to a byte."
208 % value[err.start:err.start+1])
209 return value
if not IRONPYTHON
else bytes(value)
212 @TypeConverter.register
219 return bytearray(value,
'latin-1')
220 except UnicodeEncodeError
as err:
221 raise ValueError(
"Character '%s' cannot be mapped to a byte."
222 % value[err.start:err.start+1])
225 @TypeConverter.register
233 @TypeConverter.register
239 if dt.hour
or dt.minute
or dt.second
or dt.microsecond:
240 raise ValueError(
"Value is datetime, not date.")
244 @TypeConverter.register
252 @TypeConverter.register
263 return self.
_enum_enum.__name__
if self.
_enum_enum
else None
273 return getattr(self.
_enum_enum, value)
274 except AttributeError:
276 raise ValueError(
"%s does not have member '%s'. Available: %s"
281 return list(enum.__members__)
282 except AttributeError:
283 return [attr
for attr
in dir(enum)
if not attr.startswith(
'_')]
286 @TypeConverter.register
294 @TypeConverter.register
303 @TypeConverter.register
311 @TypeConverter.register
315 type_name =
'dictionary'
316 aliases = (
'dict',
'map')
322 @TypeConverter.register
331 @TypeConverter.register
337 if value ==
'frozenset()' and not PY2:
339 return frozenset(self.
_literal_eval_literal_eval(value, set))
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def __init__(self, enum=None)
def _convert(self, value, explicit_type=True)
def _get_members(self, enum)
def get_converter(self, type_)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def _convert(self, value, explicit_type=True)
def get_converter(self, type_)
def convert(self, name, value, explicit_type=True)
def register(cls, converter_class)
def converter_for(cls, type_)
def _convert(self, value, explicit_type=True)
def _literal_eval(self, value, expected)
def _handle_error(self, name, value, error, explicit_type=True)
def convert_time(time, result_format='number', exclude_millis=False)
Converts between supported time formats.
def convert_date(date, result_format='timestamp', exclude_millis=False, date_format=None)
Converts between supported date formats.
def seq2str(sequence, quote="'", sep=', ', lastsep=' and ')
Returns sequence in format ‘'item 1’, 'item 2' and 'item 3'`.