Source code for transit.read_handlers

## Copyright 2014 Cognitect. All Rights Reserved.
##
## Licensed under the Apache License, Version 2.0 (the "License");
## you may not use this file except in compliance with the License.
## You may obtain a copy of the License at
##
##      http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing, software
## distributed under the License is distributed on an "AS-IS" BASIS,
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
## See the License for the specific language governing permissions and
## limitations under the License.

import transit_types
import uuid
import ctypes
import dateutil.parser
import datetime
import dateutil.tz
from helpers import pairs
from decimal import Decimal

## Read handlers are used by the decoder when parsing/reading in Transit
## data and returning Python objects


[docs]class DefaultHandler(object): @staticmethod
[docs] def from_rep(t, v): return transit_types.TaggedValue(t, v)
[docs]class NoneHandler(object): @staticmethod
[docs] def from_rep(_): return None
[docs]class KeywordHandler(object): @staticmethod
[docs] def from_rep(v): return transit_types.Keyword(v)
[docs]class SymbolHandler(object): @staticmethod
[docs] def from_rep(v): return transit_types.Symbol(v)
[docs]class BigDecimalHandler(object): @staticmethod
[docs] def from_rep(v): return Decimal(v)
[docs]class BooleanHandler(object): @staticmethod
[docs] def from_rep(x): return transit_types.true if x == "t" else transit_types.false
[docs]class IntHandler(object): @staticmethod
[docs] def from_rep(v): return int(v)
[docs]class FloatHandler(object): @staticmethod
[docs] def from_rep(v): return float(v)
[docs]class UuidHandler(object): @staticmethod
[docs] def from_rep(u): """Given a string, return a UUID object.""" if isinstance(u, basestring): return uuid.UUID(u) # hack to remove signs a = ctypes.c_ulong(u[0]) b = ctypes.c_ulong(u[1]) combined = a.value << 64 | b.value return uuid.UUID(int=combined)
[docs]class UriHandler(object): @staticmethod
[docs] def from_rep(u): return transit_types.URI(u)
[docs]class DateHandler(object): @staticmethod
[docs] def from_rep(d): if isinstance(d, (long, int)): return DateHandler._convert_timestamp(d) if "T" in d: return dateutil.parser.parse(d) return DateHandler._convert_timestamp(long(d))
@staticmethod def _convert_timestamp(ms): """Given a timestamp in ms, return a DateTime object.""" return datetime.datetime.fromtimestamp(ms/1000.0, dateutil.tz.tzutc())
[docs]class BigIntegerHandler(object): @staticmethod
[docs] def from_rep(d): return long(d)
[docs]class LinkHandler(object): @staticmethod
[docs] def from_rep(l): return transit_types.Link(**l)
[docs]class ListHandler(object): @staticmethod
[docs] def from_rep(l): return l
[docs]class SetHandler(object): @staticmethod
[docs] def from_rep(s): return frozenset(s)
[docs]class CmapHandler(object): @staticmethod
[docs] def from_rep(cmap): return transit_types.frozendict(pairs(cmap))
[docs]class IdentityHandler(object): @staticmethod
[docs] def from_rep(i): return i
[docs]class SpecialNumbersHandler(object): @staticmethod
[docs] def from_rep(z): if z == 'NaN': return float('Nan') if z == 'INF': return float('Inf') if z == '-INF': return float('-Inf') raise ValueError("Don't know how to handle: " + str(z) + " as \"z\"")