def coerce_type(cls, value, dest_type): if value is not None: if cls.is_array_type(dest_type): base_type = cls.get_base_type(dest_type) return [ cls.coerce_type(v, base_type) for v in value ] elif cls.is_dict_type(dest_type): base_type = cls.get_base_type(dest_type) return { k : cls.coerce_type(v, base_type) for k,v in value.items() } if dest_type == cls.INT: return int(value) elif dest_type == cls.FLOAT: return float(value) elif dest_type == cls.STRING: if isinstance(value, bytes): value = value.decode("utf-8") return str(value) elif dest_type == cls.ASCII: if isinstance(value, str): value = value.encode("ascii","ignore") return value.decode("ascii","ignore") elif dest_type == cls.BOOL: return value in cls.TRUTHY_VALUES elif dest_type == cls.UNIXTIME: if isinstance(value, datetime.datetime): return value #cast to float from string then to int to remove decimal try: ts = int(float(value)) if ts > 0: return DateUtils.unix_to_datetime(ts) except (ValueError, TypeError): pass try: return DateUtils.mysql_to_datetime(value) except (ValueError, TypeError): pass return None elif dest_type == cls.JSON: return json.loads(value) #unknown type return value
def coerce_type(cls, value, dest_type): if value is not None: if cls.is_array_type(dest_type): base_type = cls.get_base_type(dest_type) return [ cls.coerce_type(v, base_type) for v in value ] elif cls.is_dict_type(dest_type): base_type = cls.get_base_type(dest_type) return { k : cls.coerce_type(v, base_type) for k,v in value.items() } if dest_type == cls.INT: return int(value) elif dest_type == cls.FLOAT: return float(value) elif dest_type == cls.STRING: if isinstance(value, bytes): value = value.decode("utf-8") return str(value) elif dest_type == cls.BOOL: return value in cls.TRUTHY_VALUES elif dest_type == cls.UNIXTIME: if isinstance(value, datetime.datetime): return value #cast to float from string then to int to remove decimal try: ts = int(float(value)) if ts > 0: return DateUtils.unix_to_datetime(ts) except (ValueError, TypeError): pass try: return DateUtils.mysql_to_datetime(value) except (ValueError, TypeError): pass return None elif dest_type == cls.JSON: return json.loads(value) #unknown type return value