]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Loder and Dumper text/binary decorator unified as "builtin"
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Wed, 30 Dec 2020 21:52:18 +0000 (22:52 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Fri, 8 Jan 2021 01:26:53 +0000 (02:26 +0100)
Allow registration by builtin name too and on several arguments for
terseness.

12 files changed:
psycopg3/psycopg3/adapt.py
psycopg3/psycopg3/dbapi20.py
psycopg3/psycopg3/types/array.py
psycopg3/psycopg3/types/composite.py
psycopg3/psycopg3/types/date.py
psycopg3/psycopg3/types/json.py
psycopg3/psycopg3/types/network.py
psycopg3/psycopg3/types/numeric.py
psycopg3/psycopg3/types/range.py
psycopg3/psycopg3/types/singletons.py
psycopg3/psycopg3/types/text.py
psycopg3/psycopg3/types/uuid.py

index 28358d016315f5c58cebe3434417d2ce01e80671..d9f6e17548e665515dd822cc46123cdedc36333a 100644 (file)
@@ -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:
index 24c5ad9c69655f904af59349cfa0c0846590dbcb..d414b719cd7f491f0f8876345c1dd83bbf3916c6 100644 (file)
@@ -50,7 +50,7 @@ class Binary:
         self.obj = obj
 
 
-@Dumper.text(Binary)
+@Dumper.builtin(Binary)
 class BinaryDumper(Dumper):
 
     format = Format.TEXT
index 7b5c366ce8511fb38980d1217eb27a7a67a5a20d..ac302d3afe555e255bd5060084d89b725ea4e9b4 100644 (file)
@@ -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
index 17b3f8068319bf3c7523c8d536e5bf6b29c2142d..4d727c96d3a49bf27d3363da0cbd41fd3cf3378a 100644 (file)
@@ -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
index fbf74834d0817a60328ca7dfd80cd3b5169070eb..2d91bc59eb78aa43285ee2b0a9e1fd2b59449888 100644 (file)
@@ -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
index 272e2b650a0050f4e1ea55fea2828fae2d2e4cbc..701c90fccff91b131ba7c31f8a46d4b2119aedc8 100644 (file)
@@ -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
index 516508a6dc1bd25ae4e453c00e6192f12a46df1a..2494e9bdab8d2acaa1868821044c2ab89e169bad 100644 (file)
@@ -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
index 439f2be10c8752994f9597fedfea952b6e02d7c5..4f9b771eb63170afc7c2a81022695d6620584e8b 100644 (file)
@@ -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
index c7c0caa4afebcd79f0bf0223d16498386cdfa9ff..ce5086af2430679a3f35bd457d2aff78d11136a5 100644 (file)
@@ -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
index 79176138621acb7516f6487a9f19a09760956f3c..a880184166907da516b08917f4cab32d31b090a5 100644 (file)
@@ -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
index ed927e476a0b479dc3a69d985eb1868395d44118..a36eafee73711a978d29121b3ff4126cf14e41d6 100644 (file)
@@ -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
index 99fc7c3d49a72bd66c1deea31c0cac5005ea1570..bcf8f94d9456ae22ca219ce31d76dad9c97b3ccf 100644 (file)
@@ -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