/usr/lib/python3/dist-packages/cerealizer/datetime_handler.py is in python3-cerealizer 0.8.1-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 | # Cerealizer
# Copyright (C) 2008 Steve Benson, Lann Martin
# Copyright (C) 2012 Jean-Baptiste LAMY
#
# This program is free software.
# It is available under the Python licence.
import datetime
import cerealizer
class DatetimeHandler(cerealizer.Handler):
classname = 'datetime\n'
def dump_obj(self, obj, dumper, s):
assert issubclass(obj.__class__, datetime.datetime)
# This works based on datetime.__reduce__():
# datetime.__reduce__()[1] is a string of bytes that is an internal
# representation of a datetime object (the data field
# PyDateTime_DateTime struct, an unsigned char
# _PyDateTime_DATETIME_DATASIZE bytes long). This should be platform
# independent and is validated upon reconstruction of a datetime.
# Pickle uses it and guarantees backwards compatibility, so
# presumably we can use it here too.
# I haven't verified that tzinfo objects have the same properties,
# which is why they're unsupported right now.
# This string returned by __reduce__ is encoded because it can
# return data that interferes with the cerealizer protocol.
if obj.tzinfo != None:
raise ValueError("DatetimeHandler doesn't yet know how to handle datetime objects with tzinfo.")
s.write(self.classname.encode("utf8"))
s.write(obj.__reduce__()[1][0].decode("latin").encode('unicode_escape'))
s.write(b'\n')
def undump_obj(self, dumper, s):
line = s.readline().decode('unicode_escape')
if line and (line[-1] == '\n'): line = line[:-1]
return datetime.datetime(line.encode("latin"))
class DateHandler(cerealizer.Handler):
classname = 'date\n'
def dump_obj(self, obj, dumper, s):
assert issubclass(obj.__class__, datetime.date)
s.write(self.classname.encode("utf8"))
s.write(obj.__reduce__()[1][0].decode("latin").encode('unicode_escape'))
s.write(b'\n')
def undump_obj(self, dumper, s):
line = s.readline().decode('unicode_escape')
if line and (line[-1] == '\n'): line = line[:-1]
return datetime.date(line.encode("latin"))
class TimeHandler(cerealizer.Handler):
classname = 'time\n'
def dump_obj(self, obj, dumper, s):
assert issubclass(obj.__class__, datetime.time)
if obj.tzinfo != None:
raise ValueError("DatetimeHandler doesn't yet know how to handle datetime objects with tzinfo.")
s.write(self.classname.encode("utf8"))
s.write(obj.__reduce__()[1][0].decode("latin").encode('unicode_escape'))
s.write(b'\n')
def undump_obj(self, dumper, s):
line = s.readline().decode('unicode_escape')
if line and (line[-1] == '\n'): line = line[:-1]
return datetime.time(line.encode("latin"))
cerealizer.register(datetime.datetime, DatetimeHandler())
cerealizer.register(datetime.date , DateHandler ())
cerealizer.register(datetime.time , TimeHandler ())
|