From: Daniele Varrazzo Date: Wed, 30 Dec 2020 21:52:18 +0000 (+0100) Subject: Loder and Dumper text/binary decorator unified as "builtin" X-Git-Tag: 3.0.dev0~216 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a38c49f95ac75059bd9c7a3266fe6078bc042769;p=thirdparty%2Fpsycopg.git Loder and Dumper text/binary decorator unified as "builtin" Allow registration by builtin name too and on several arguments for terseness. --- diff --git a/psycopg3/psycopg3/adapt.py b/psycopg3/psycopg3/adapt.py index 28358d016..d9f6e1754 100644 --- a/psycopg3/psycopg3/adapt.py +++ b/psycopg3/psycopg3/adapt.py @@ -10,7 +10,7 @@ from typing import Any, Callable, Optional, Type, TYPE_CHECKING, Union from . import pq from . import proto from .pq import Format as Format -from .oids import TEXT_OID +from .oids import builtins, TEXT_OID from .proto import DumpersMap, DumperType, LoadersMap, LoaderType, AdaptContext if TYPE_CHECKING: @@ -73,24 +73,19 @@ class Dumper(ABC): adapters.register_dumper(src, cls) @classmethod - def text(cls, src: Union[type, str]) -> Callable[[DumperType], DumperType]: - def text_(dumper: DumperType) -> DumperType: - assert dumper.format == Format.TEXT - dumper.register(src) - return dumper - - return text_ - - @classmethod - def binary( - cls, src: Union[type, str] + def builtin( + cls, *types: Union[type, str] ) -> Callable[[DumperType], DumperType]: - def binary_(dumper: DumperType) -> DumperType: - assert dumper.format == Format.BINARY - dumper.register(src) + """ + Decorator to mark a dumper class as default for a builtin type. + """ + + def builtin_(dumper: DumperType) -> DumperType: + for src in types: + dumper.register(src) return dumper - return binary_ + return builtin_ class Loader(ABC): @@ -121,22 +116,21 @@ class Loader(ABC): adapters.register_loader(oid, cls) @classmethod - def text(cls, oid: int) -> Callable[[LoaderType], LoaderType]: - def text_(loader: LoaderType) -> LoaderType: - assert loader.format == Format.TEXT - loader.register(oid) - return loader - - return text_ + def builtin( + cls, *types: Union[int, str] + ) -> Callable[[LoaderType], LoaderType]: + """ + Decorator to mark a loader class as default for a builtin type. + """ - @classmethod - def binary(cls, oid: int) -> Callable[[LoaderType], LoaderType]: - def binary_(loader: LoaderType) -> LoaderType: - assert loader.format == Format.BINARY - loader.register(oid) + def builtin_(loader: LoaderType) -> LoaderType: + for src in types: + if isinstance(src, str): + src = builtins[src].oid + loader.register(src) return loader - return binary_ + return builtin_ class AdaptersMap: diff --git a/psycopg3/psycopg3/dbapi20.py b/psycopg3/psycopg3/dbapi20.py index 24c5ad9c6..d414b719c 100644 --- a/psycopg3/psycopg3/dbapi20.py +++ b/psycopg3/psycopg3/dbapi20.py @@ -50,7 +50,7 @@ class Binary: self.obj = obj -@Dumper.text(Binary) +@Dumper.builtin(Binary) class BinaryDumper(Dumper): format = Format.TEXT diff --git a/psycopg3/psycopg3/types/array.py b/psycopg3/psycopg3/types/array.py index 7b5c366ce..ac302d3af 100644 --- a/psycopg3/psycopg3/types/array.py +++ b/psycopg3/psycopg3/types/array.py @@ -39,7 +39,7 @@ class BaseListDumper(Dumper): return oid or TEXT_ARRAY_OID -@Dumper.text(list) +@Dumper.builtin(list) class ListDumper(BaseListDumper): # from https://www.postgresql.org/docs/current/arrays.html#ARRAYS-IO # @@ -102,7 +102,7 @@ class ListDumper(BaseListDumper): return b"".join(tokens) -@Dumper.binary(list) +@Dumper.builtin(list) class ListBinaryDumper(BaseListDumper): format = Format.BINARY diff --git a/psycopg3/psycopg3/types/composite.py b/psycopg3/psycopg3/types/composite.py index 17b3f8068..4d727c96d 100644 --- a/psycopg3/psycopg3/types/composite.py +++ b/psycopg3/psycopg3/types/composite.py @@ -12,7 +12,7 @@ from typing import Sequence, Tuple, Type, Union, TYPE_CHECKING from .. import sql from .. import errors as e -from ..oids import builtins, TypeInfo, TEXT_OID +from ..oids import TypeInfo, TEXT_OID from ..adapt import Format, Dumper, Loader, Transformer from ..proto import AdaptContext from . import array @@ -182,7 +182,7 @@ class SequenceDumper(Dumper): _re_esc = re.compile(br"([\\\"])") -@Dumper.text(tuple) +@Dumper.builtin(tuple) class TupleDumper(SequenceDumper): # Should be this, but it doesn't work @@ -231,7 +231,7 @@ class BaseCompositeLoader(Loader): _re_undouble = re.compile(br'(["\\])\1') -@Loader.text(builtins["record"].oid) +@Loader.builtin("record") class RecordLoader(BaseCompositeLoader): def load(self, data: bytes) -> Tuple[Any, ...]: if data == b"()": @@ -248,7 +248,7 @@ _struct_len = struct.Struct("!i") _struct_oidlen = struct.Struct("!Ii") -@Loader.binary(builtins["record"].oid) +@Loader.builtin("record") class RecordBinaryLoader(Loader): format = Format.BINARY diff --git a/psycopg3/psycopg3/types/date.py b/psycopg3/psycopg3/types/date.py index fbf74834d..2d91bc59e 100644 --- a/psycopg3/psycopg3/types/date.py +++ b/psycopg3/psycopg3/types/date.py @@ -15,7 +15,7 @@ from ..proto import AdaptContext from ..errors import InterfaceError, DataError -@Dumper.text(date) +@Dumper.builtin(date) class DateDumper(Dumper): format = Format.TEXT @@ -27,7 +27,7 @@ class DateDumper(Dumper): return str(obj).encode("utf8") -@Dumper.text(time) +@Dumper.builtin(time) class TimeDumper(Dumper): format = Format.TEXT @@ -37,7 +37,7 @@ class TimeDumper(Dumper): return str(obj).encode("utf8") -@Dumper.text(datetime) +@Dumper.builtin(datetime) class DateTimeDumper(Dumper): format = Format.TEXT @@ -49,7 +49,7 @@ class DateTimeDumper(Dumper): return str(obj).encode("utf8") -@Dumper.text(timedelta) +@Dumper.builtin(timedelta) class TimeDeltaDumper(Dumper): format = Format.TEXT @@ -77,7 +77,7 @@ class TimeDeltaDumper(Dumper): ) -@Loader.text(builtins["date"].oid) +@Loader.builtin("date") class DateLoader(Loader): format = Format.TEXT @@ -138,7 +138,7 @@ class DateLoader(Loader): return max(map(len, parts)) -@Loader.text(builtins["time"].oid) +@Loader.builtin("time") class TimeLoader(Loader): format = Format.TEXT @@ -164,7 +164,7 @@ class TimeLoader(Loader): raise exc -@Loader.text(builtins["timetz"].oid) +@Loader.builtin("timetz") class TimeTzLoader(TimeLoader): format = Format.TEXT @@ -201,7 +201,7 @@ class TimeTzLoader(TimeLoader): return TimeTzLoader.load(self, data) -@Loader.text(builtins["timestamp"].oid) +@Loader.builtin("timestamp") class TimestampLoader(DateLoader): format = Format.TEXT @@ -256,7 +256,7 @@ class TimestampLoader(DateLoader): return 0 -@Loader.text(builtins["timestamptz"].oid) +@Loader.builtin("timestamptz") class TimestamptzLoader(TimestampLoader): format = Format.TEXT @@ -320,7 +320,7 @@ class TimestamptzLoader(TimestampLoader): ) -@Loader.text(builtins["interval"].oid) +@Loader.builtin("interval") class IntervalLoader(Loader): format = Format.TEXT diff --git a/psycopg3/psycopg3/types/json.py b/psycopg3/psycopg3/types/json.py index 272e2b650..701c90fcc 100644 --- a/psycopg3/psycopg3/types/json.py +++ b/psycopg3/psycopg3/types/json.py @@ -39,27 +39,27 @@ class _JsonDumper(Dumper): return obj.dumps().encode("utf-8") -@Dumper.text(Json) +@Dumper.builtin(Json) class JsonDumper(_JsonDumper): format = Format.TEXT _oid = builtins["json"].oid -@Dumper.binary(Json) +@Dumper.builtin(Json) class JsonBinaryDumper(JsonDumper): format = Format.BINARY -@Dumper.text(Jsonb) +@Dumper.builtin(Jsonb) class JsonbDumper(_JsonDumper): format = Format.TEXT _oid = builtins["jsonb"].oid -@Dumper.binary(Jsonb) +@Dumper.builtin(Jsonb) class JsonbBinaryDumper(JsonbDumper): format = Format.BINARY @@ -68,8 +68,7 @@ class JsonbBinaryDumper(JsonbDumper): return b"\x01" + obj.dumps().encode("utf-8") -@Loader.text(builtins["json"].oid) -@Loader.text(builtins["jsonb"].oid) +@Loader.builtin("json", "jsonb") class JsonLoader(Loader): format = Format.TEXT @@ -78,13 +77,13 @@ class JsonLoader(Loader): return json.loads(data) -@Loader.binary(builtins["json"].oid) +@Loader.builtin("json") class JsonBinaryLoader(JsonLoader): format = Format.BINARY -@Loader.binary(builtins["jsonb"].oid) +@Loader.builtin("jsonb") class JsonbBinaryLoader(Loader): format = Format.BINARY diff --git a/psycopg3/psycopg3/types/network.py b/psycopg3/psycopg3/types/network.py index 516508a6d..2494e9bda 100644 --- a/psycopg3/psycopg3/types/network.py +++ b/psycopg3/psycopg3/types/network.py @@ -24,10 +24,12 @@ ip_interface: Callable[[str], Interface] ip_network: Callable[[str], Network] -@Dumper.text("ipaddress.IPv4Address") -@Dumper.text("ipaddress.IPv6Address") -@Dumper.text("ipaddress.IPv4Interface") -@Dumper.text("ipaddress.IPv6Interface") +@Dumper.builtin( + "ipaddress.IPv4Address", + "ipaddress.IPv6Address", + "ipaddress.IPv4Interface", + "ipaddress.IPv6Interface", +) class InterfaceDumper(Dumper): format = Format.TEXT @@ -37,8 +39,7 @@ class InterfaceDumper(Dumper): return str(obj).encode("utf8") -@Dumper.text("ipaddress.IPv4Network") -@Dumper.text("ipaddress.IPv6Network") +@Dumper.builtin("ipaddress.IPv4Network", "ipaddress.IPv6Network") class NetworkDumper(Dumper): format = Format.TEXT @@ -58,7 +59,7 @@ class _LazyIpaddress(Loader): imported = True -@Loader.text(builtins["inet"].oid) +@Loader.builtin("inet") class InetLoader(_LazyIpaddress): format = Format.TEXT @@ -70,7 +71,7 @@ class InetLoader(_LazyIpaddress): return ip_address(data.decode("utf8")) -@Loader.text(builtins["cidr"].oid) +@Loader.builtin("cidr") class CidrLoader(_LazyIpaddress): format = Format.TEXT diff --git a/psycopg3/psycopg3/types/numeric.py b/psycopg3/psycopg3/types/numeric.py index 439f2be10..4f9b771eb 100644 --- a/psycopg3/psycopg3/types/numeric.py +++ b/psycopg3/psycopg3/types/numeric.py @@ -77,12 +77,12 @@ class SpecialValuesDumper(NumberDumper): return value if obj >= 0 else b" " + value -@Dumper.text(int) +@Dumper.builtin(int) class IntDumper(NumberDumper): _oid = builtins["int8"].oid -@Dumper.binary(int) +@Dumper.builtin(int) class IntBinaryDumper(IntDumper): format = Format.BINARY @@ -91,7 +91,7 @@ class IntBinaryDumper(IntDumper): return _pack_int8(obj) -@Dumper.text(float) +@Dumper.builtin(float) class FloatDumper(SpecialValuesDumper): format = Format.TEXT @@ -104,7 +104,7 @@ class FloatDumper(SpecialValuesDumper): } -@Dumper.binary(float) +@Dumper.builtin(float) class FloatBinaryDumper(Dumper): format = Format.BINARY @@ -114,7 +114,7 @@ class FloatBinaryDumper(Dumper): return _pack_float8(obj) -@Dumper.text(Decimal) +@Dumper.builtin(Decimal) class DecimalDumper(SpecialValuesDumper): _oid = builtins["numeric"].oid @@ -126,27 +126,27 @@ class DecimalDumper(SpecialValuesDumper): } -@Dumper.text(Int2) +@Dumper.builtin(Int2) class Int2Dumper(NumberDumper): _oid = builtins["int2"].oid -@Dumper.text(Int4) +@Dumper.builtin(Int4) class Int4Dumper(NumberDumper): _oid = builtins["int4"].oid -@Dumper.text(Int8) +@Dumper.builtin(Int8) class Int8Dumper(NumberDumper): _oid = builtins["int8"].oid -@Dumper.text(Oid) +@Dumper.builtin(Oid) class OidDumper(NumberDumper): _oid = builtins["oid"].oid -@Dumper.binary(Int2) +@Dumper.builtin(Int2) class Int2BinaryDumper(Int2Dumper): format = Format.BINARY @@ -155,7 +155,7 @@ class Int2BinaryDumper(Int2Dumper): return _pack_int2(obj) -@Dumper.binary(Int4) +@Dumper.builtin(Int4) class Int4BinaryDumper(Int4Dumper): format = Format.BINARY @@ -164,7 +164,7 @@ class Int4BinaryDumper(Int4Dumper): return _pack_int4(obj) -@Dumper.binary(Int8) +@Dumper.builtin(Int8) class Int8BinaryDumper(Int8Dumper): format = Format.BINARY @@ -173,7 +173,7 @@ class Int8BinaryDumper(Int8Dumper): return _pack_int8(obj) -@Dumper.binary(Oid) +@Dumper.builtin(Oid) class OidBinaryDumper(OidDumper): format = Format.BINARY @@ -182,10 +182,7 @@ class OidBinaryDumper(OidDumper): return _pack_uint4(obj) -@Loader.text(builtins["int2"].oid) -@Loader.text(builtins["int4"].oid) -@Loader.text(builtins["int8"].oid) -@Loader.text(builtins["oid"].oid) +@Loader.builtin("int2", "int4", "int8", "oid") class IntLoader(Loader): format = Format.TEXT @@ -195,7 +192,7 @@ class IntLoader(Loader): return int(data) -@Loader.binary(builtins["int2"].oid) +@Loader.builtin("int2") class Int2BinaryLoader(Loader): format = Format.BINARY @@ -204,7 +201,7 @@ class Int2BinaryLoader(Loader): return _unpack_int2(data)[0] -@Loader.binary(builtins["int4"].oid) +@Loader.builtin("int4") class Int4BinaryLoader(Loader): format = Format.BINARY @@ -213,7 +210,7 @@ class Int4BinaryLoader(Loader): return _unpack_int4(data)[0] -@Loader.binary(builtins["int8"].oid) +@Loader.builtin("int8") class Int8BinaryLoader(Loader): format = Format.BINARY @@ -222,7 +219,7 @@ class Int8BinaryLoader(Loader): return _unpack_int8(data)[0] -@Loader.binary(builtins["oid"].oid) +@Loader.builtin("oid") class OidBinaryLoader(Loader): format = Format.BINARY @@ -231,8 +228,7 @@ class OidBinaryLoader(Loader): return _unpack_uint4(data)[0] -@Loader.text(builtins["float4"].oid) -@Loader.text(builtins["float8"].oid) +@Loader.builtin("float4", "float8") class FloatLoader(Loader): format = Format.TEXT @@ -242,7 +238,7 @@ class FloatLoader(Loader): return float(data) -@Loader.binary(builtins["float4"].oid) +@Loader.builtin("float4") class Float4BinaryLoader(Loader): format = Format.BINARY @@ -251,7 +247,7 @@ class Float4BinaryLoader(Loader): return _unpack_float4(data)[0] -@Loader.binary(builtins["float8"].oid) +@Loader.builtin("float8") class Float8BinaryLoader(Loader): format = Format.BINARY @@ -260,7 +256,7 @@ class Float8BinaryLoader(Loader): return _unpack_float8(data)[0] -@Loader.text(builtins["numeric"].oid) +@Loader.builtin("numeric") class NumericLoader(Loader): format = Format.TEXT diff --git a/psycopg3/psycopg3/types/range.py b/psycopg3/psycopg3/types/range.py index c7c0caa4a..ce5086af2 100644 --- a/psycopg3/psycopg3/types/range.py +++ b/psycopg3/psycopg3/types/range.py @@ -287,32 +287,32 @@ class DateTimeTZRange(Range[datetime]): # Dumpers for builtin range types -@Dumper.text(Int4Range) +@Dumper.builtin(Int4Range) class Int4RangeDumper(RangeDumper): _oid = builtins["int4range"].oid -@Dumper.text(Int8Range) +@Dumper.builtin(Int8Range) class Int8RangeDumper(RangeDumper): _oid = builtins["int8range"].oid -@Dumper.text(DecimalRange) +@Dumper.builtin(DecimalRange) class NumRangeDumper(RangeDumper): _oid = builtins["numrange"].oid -@Dumper.text(DateRange) +@Dumper.builtin(DateRange) class DateRangeDumper(RangeDumper): _oid = builtins["daterange"].oid -@Dumper.text(DateTimeRange) +@Dumper.builtin(DateTimeRange) class TimestampRangeDumper(RangeDumper): _oid = builtins["tsrange"].oid -@Dumper.text(DateTimeTZRange) +@Dumper.builtin(DateTimeTZRange) class TimestampTZRangeDumper(RangeDumper): _oid = builtins["tstzrange"].oid @@ -320,37 +320,37 @@ class TimestampTZRangeDumper(RangeDumper): # Loaders for builtin range types -@Loader.text(builtins["int4range"].oid) +@Loader.builtin("int4range") class Int4RangeLoader(RangeLoader[int]): subtype_oid = builtins["int4"].oid cls = Int4Range -@Loader.text(builtins["int8range"].oid) +@Loader.builtin("int8range") class Int8RangeLoader(RangeLoader[int]): subtype_oid = builtins["int8"].oid cls = Int8Range -@Loader.text(builtins["numrange"].oid) +@Loader.builtin("numrange") class NumericRangeLoader(RangeLoader[Decimal]): subtype_oid = builtins["numeric"].oid cls = DecimalRange -@Loader.text(builtins["daterange"].oid) +@Loader.builtin("daterange") class DateRangeLoader(RangeLoader[date]): subtype_oid = builtins["date"].oid cls = DateRange -@Loader.text(builtins["tsrange"].oid) +@Loader.builtin("tsrange") class TimestampRangeLoader(RangeLoader[datetime]): subtype_oid = builtins["timestamp"].oid cls = DateTimeRange -@Loader.text(builtins["tstzrange"].oid) +@Loader.builtin("tstzrange") class TimestampTZRangeLoader(RangeLoader[datetime]): subtype_oid = builtins["timestamptz"].oid cls = DateTimeTZRange diff --git a/psycopg3/psycopg3/types/singletons.py b/psycopg3/psycopg3/types/singletons.py index 791761386..a88018416 100644 --- a/psycopg3/psycopg3/types/singletons.py +++ b/psycopg3/psycopg3/types/singletons.py @@ -8,7 +8,7 @@ from ..oids import builtins from ..adapt import Dumper, Loader, Format -@Dumper.text(bool) +@Dumper.builtin(bool) class BoolDumper(Dumper): format = Format.TEXT @@ -21,7 +21,7 @@ class BoolDumper(Dumper): return b"true" if obj else b"false" -@Dumper.binary(bool) +@Dumper.builtin(bool) class BoolBinaryDumper(Dumper): format = Format.BINARY @@ -31,7 +31,7 @@ class BoolBinaryDumper(Dumper): return b"\x01" if obj else b"\x00" -@Dumper.text(type(None)) +@Dumper.builtin(type(None)) class NoneDumper(Dumper): """ Not a complete dumper as it doesn't implement dump(), but it implements @@ -47,7 +47,7 @@ class NoneDumper(Dumper): return b"NULL" -@Loader.text(builtins["bool"].oid) +@Loader.builtin("bool") class BoolLoader(Loader): format = Format.TEXT @@ -56,7 +56,7 @@ class BoolLoader(Loader): return data == b"t" -@Loader.binary(builtins["bool"].oid) +@Loader.builtin("bool") class BoolBinaryLoader(Loader): format = Format.BINARY diff --git a/psycopg3/psycopg3/types/text.py b/psycopg3/psycopg3/types/text.py index ed927e476..a36eafee7 100644 --- a/psycopg3/psycopg3/types/text.py +++ b/psycopg3/psycopg3/types/text.py @@ -30,7 +30,7 @@ class _StringDumper(Dumper): self._encoding = enc -@Dumper.binary(str) +@Dumper.builtin(str) class StringBinaryDumper(_StringDumper): format = Format.BINARY @@ -40,7 +40,7 @@ class StringBinaryDumper(_StringDumper): return obj.encode(self._encoding) -@Dumper.text(str) +@Dumper.builtin(str) class StringDumper(_StringDumper): format = Format.TEXT @@ -54,11 +54,7 @@ class StringDumper(_StringDumper): return obj.encode(self._encoding) -@Loader.text(INVALID_OID) -@Loader.text(builtins["bpchar"].oid) -@Loader.text(builtins["name"].oid) -@Loader.text(builtins["text"].oid) -@Loader.text(builtins["varchar"].oid) +@Loader.builtin(INVALID_OID, "bpchar", "name", "text", "varchar") class TextLoader(Loader): format = Format.TEXT @@ -79,18 +75,13 @@ class TextLoader(Loader): return data -@Loader.binary(builtins["bpchar"].oid) -@Loader.binary(builtins["name"].oid) -@Loader.binary(builtins["text"].oid) -@Loader.binary(builtins["varchar"].oid) +@Loader.builtin("bpchar", "name", "text", "varchar") class TextBinaryLoader(TextLoader): format = Format.BINARY -@Dumper.text(bytes) -@Dumper.text(bytearray) -@Dumper.text(memoryview) +@Dumper.builtin(bytes, bytearray, memoryview) class BytesDumper(Dumper): format = Format.TEXT @@ -108,9 +99,7 @@ class BytesDumper(Dumper): return self._esc.escape_bytea(obj) -@Dumper.binary(bytes) -@Dumper.binary(bytearray) -@Dumper.binary(memoryview) +@Dumper.builtin(bytes, bytearray, memoryview) class BytesBinaryDumper(Dumper): format = Format.BINARY @@ -123,7 +112,7 @@ class BytesBinaryDumper(Dumper): return obj -@Loader.text(builtins["bytea"].oid) +@Loader.builtin("bytea") class ByteaLoader(Loader): format = Format.TEXT @@ -138,8 +127,7 @@ class ByteaLoader(Loader): return self._escaping.unescape_bytea(data) -@Loader.binary(builtins["bytea"].oid) -@Loader.binary(INVALID_OID) +@Loader.builtin("bytea", INVALID_OID) class ByteaBinaryLoader(Loader): format = Format.BINARY diff --git a/psycopg3/psycopg3/types/uuid.py b/psycopg3/psycopg3/types/uuid.py index 99fc7c3d4..bcf8f94d9 100644 --- a/psycopg3/psycopg3/types/uuid.py +++ b/psycopg3/psycopg3/types/uuid.py @@ -18,7 +18,7 @@ imported = False UUID: Callable[..., "uuid.UUID"] -@Dumper.text("uuid.UUID") +@Dumper.builtin("uuid.UUID") class UUIDDumper(Dumper): format = Format.TEXT @@ -28,7 +28,7 @@ class UUIDDumper(Dumper): return obj.hex.encode("utf8") -@Dumper.binary("uuid.UUID") +@Dumper.builtin("uuid.UUID") class UUIDBinaryDumper(UUIDDumper): format = Format.BINARY @@ -37,7 +37,7 @@ class UUIDBinaryDumper(UUIDDumper): return obj.bytes -@Loader.text(builtins["uuid"].oid) +@Loader.builtin("uuid") class UUIDLoader(Loader): format = Format.TEXT @@ -54,7 +54,7 @@ class UUIDLoader(Loader): return UUID(data.decode("utf8")) -@Loader.binary(builtins["uuid"].oid) +@Loader.builtin("uuid") class UUIDBinaryLoader(UUIDLoader): format = Format.BINARY