]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Dropped loader param of Loader.register
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Thu, 29 Oct 2020 03:22:23 +0000 (04:22 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Thu, 29 Oct 2020 03:23:26 +0000 (04:23 +0100)
Just use `cls`, as the class method is available to all the subclasses.

psycopg3/psycopg3/adapt.py
psycopg3/psycopg3/types/array.py
psycopg3/psycopg3/types/composite.py
psycopg3_c/psycopg3_c/adapt.pyx
psycopg3_c/psycopg3_c/types/numeric.pyx
psycopg3_c/psycopg3_c/types/text.pyx
tests/test_adapt.py
tests/types/test_numeric.py

index f85c2b8c226d7749e8d29f6f42522d7d1cf04e89..0cf7c091cde61461f81bb8cffd99684b2aa14b1c 100644 (file)
@@ -106,36 +106,25 @@ class Loader:
     def register(
         cls,
         oid: int,
-        loader: LoaderType,
         context: AdaptContext = None,
         format: Format = Format.TEXT,
-    ) -> LoaderType:
+    ) -> None:
         if not isinstance(oid, int):
             raise TypeError(
                 f"loaders should be registered on oid, got {oid} instead"
             )
 
-        if not (
-            isinstance(loader, type) and issubclass(loader, _loader_classes)
-        ):
-            raise TypeError(
-                f"loaders should be Loader subclasses, got {loader} instead"
-            )
-
         where = context.loaders if context is not None else Loader.globals
-        where[oid, format] = loader
-        return loader
+        where[oid, format] = cls
 
     @classmethod
-    def register_binary(
-        cls, oid: int, loader: LoaderType, context: AdaptContext = None
-    ) -> LoaderType:
-        return cls.register(oid, loader, context, format=Format.BINARY)
+    def register_binary(cls, oid: int, context: AdaptContext = None) -> None:
+        cls.register(oid, context, format=Format.BINARY)
 
     @classmethod
     def text(cls, oid: int) -> Callable[[LoaderType], LoaderType]:
         def text_(loader: LoaderType) -> LoaderType:
-            cls.register(oid, loader)
+            loader.register(oid)
             return loader
 
         return text_
@@ -143,7 +132,7 @@ class Loader:
     @classmethod
     def binary(cls, oid: int) -> Callable[[LoaderType], LoaderType]:
         def binary_(loader: LoaderType) -> LoaderType:
-            cls.register_binary(oid, loader)
+            loader.register_binary(oid)
             return loader
 
         return binary_
index 0374ac767f8684eb7da853eb158acad310dfcf18..65ed8cbfe3e2a2794746a80470a51a0c560a7fff 100644 (file)
@@ -6,7 +6,7 @@ Adapters for arrays
 
 import re
 import struct
-from typing import Any, Generator, List, Optional
+from typing import Any, Generator, List, Optional, Type
 
 from .. import errors as e
 from ..adapt import Format, Dumper, Loader, Transformer
@@ -276,9 +276,9 @@ def register(
         (Format.TEXT, TextArrayLoader),
         (Format.BINARY, BinaryArrayLoader),
     ):
-        tcname = f"{name.title()}Array{format.name.title()}Loader"
-        t = type(tcname, (base,), {"base_oid": base_oid})
-        Loader.register(array_oid, t, context=context, format=format)
+        lname = f"{name.title()}Array{format.name.title()}Loader"
+        loader: Type[Loader] = type(lname, (base,), {"base_oid": base_oid})
+        loader.register(array_oid, context=context, format=format)
 
 
 def register_all_arrays() -> None:
index b4ce1418ce03488da7445bdb73077f4b87933b6f..e808c6e1b33d0a3c34a44562c1be945687c76b94 100644 (file)
@@ -5,7 +5,7 @@ Support for composite types adaptation.
 import re
 import struct
 from collections import namedtuple
-from typing import Any, Callable, Generator, Sequence, Tuple
+from typing import Any, Callable, Generator, Sequence, Tuple, Type
 from typing import Optional, TYPE_CHECKING
 
 from .. import pq
@@ -70,6 +70,8 @@ def register(
             info.name, [f.name for f in info.fields]
         )
 
+    loader: Type[Loader]
+
     # generate and register a customized text loader
     loader = type(
         f"{info.name.title()}Loader",
@@ -79,7 +81,7 @@ def register(
             "fields_types": tuple(f.type_oid for f in info.fields),
         },
     )
-    Loader.register(info.oid, loader, context=context, format=Format.TEXT)
+    loader.register(info.oid, context=context, format=Format.TEXT)
 
     # generate and register a customized binary loader
     loader = type(
@@ -87,7 +89,7 @@ def register(
         (BinaryCompositeLoader,),
         {"factory": factory},
     )
-    Loader.register(info.oid, loader, context=context, format=Format.BINARY)
+    loader.register(info.oid, context=context, format=Format.BINARY)
 
     if info.array_oid:
         array.register(
index 2a88fb5847b22236c7788dd83fdb9ac8c9b3bea3..0f28299142738b065fe2ffc3951fe8ee3e403d34 100644 (file)
@@ -20,6 +20,8 @@ from cpython.bytes cimport PyBytes_AsStringAndSize
 from psycopg3_c.adapt cimport cloader_func, get_context_func
 from psycopg3_c cimport libpq as impl
 
+from psycopg3.pq.enums import Format
+
 import logging
 logger = logging.getLogger("psycopg3.adapt")
 
@@ -45,6 +47,29 @@ cdef class CLoader:
         PyBytes_AsStringAndSize(data, &buffer, &length)
         return self.cload(data, length)
 
+    @classmethod
+    def register(
+        cls,
+        oid: int,
+        context: "AdaptContext" = None,
+        format: Format = Format.TEXT,
+    ) -> None:
+        if not isinstance(oid, int):
+            raise TypeError(
+                f"loaders should be registered on oid, got {oid} instead"
+            )
+
+        from psycopg3.adapt import Loader
+
+        where = context.loaders if context else Loader.globals
+        where[oid, format] = cls
+
+    @classmethod
+    def register_binary(
+        cls, oid: int, context: AdaptContext = None
+    ) -> None:
+        cls.register(oid, context, format=Format.BINARY)
+
 
 def register_builtin_c_loaders():
     """
index e53876401152e6b2899d4a96212ded2e59cd7f68..0550661284ebc3eb18cbd1add2b105871844a3ef 100644 (file)
@@ -51,13 +51,13 @@ cdef void register_numeric_c_loaders():
     from psycopg3.adapt import Loader
     from psycopg3.types import builtins
 
-    Loader.register(builtins["int2"].oid, TextIntLoader)
-    Loader.register(builtins["int4"].oid, TextIntLoader)
-    Loader.register(builtins["int8"].oid, TextIntLoader)
-    Loader.register(builtins["oid"].oid, TextIntLoader)
-
-    Loader.register_binary(builtins["int2"].oid, BinaryInt2Loader)
-    Loader.register_binary(builtins["int4"].oid, BinaryInt4Loader)
-    Loader.register_binary(builtins["int8"].oid, BinaryInt8Loader)
-    Loader.register_binary(builtins["oid"].oid, BinaryOidLoader)
-    Loader.register_binary(builtins["bool"].oid, BinaryBoolLoader)
+    TextIntLoader.register(builtins["int2"].oid)
+    TextIntLoader.register(builtins["int4"].oid)
+    TextIntLoader.register(builtins["int8"].oid)
+    TextIntLoader.register(builtins["oid"].oid)
+
+    BinaryInt2Loader.register_binary(builtins["int2"].oid)
+    BinaryInt4Loader.register_binary(builtins["int4"].oid)
+    BinaryInt8Loader.register_binary(builtins["int8"].oid)
+    BinaryOidLoader.register_binary(builtins["oid"].oid)
+    BinaryBoolLoader.register_binary(builtins["bool"].oid)
index dece9bc46233383eee4be1a244e6a42fa4461212..98eebf480a353c9c827396457265212d305db185 100644 (file)
@@ -64,11 +64,11 @@ cdef void register_text_c_loaders():
     from psycopg3.adapt import Loader
     from psycopg3.types import builtins
 
-    Loader.register(0, StringLoader)    # INVALID_OID
-    Loader.register(builtins["text"].oid, StringLoader)
-    Loader.register_binary(builtins["text"].oid, StringLoader)
-    Loader.register(builtins["varchar"].oid, StringLoader)
-    Loader.register_binary(builtins["varchar"].oid, StringLoader)
-
-    Loader.register(builtins['bytea'].oid, TextByteaLoader)
-    Loader.register_binary(builtins['bytea'].oid, BinaryByteaLoader)
+    StringLoader.register(0)    # INVALID_OID
+    StringLoader.register(builtins["text"].oid)
+    StringLoader.register_binary(builtins["text"].oid)
+    StringLoader.register(builtins["varchar"].oid)
+    StringLoader.register_binary(builtins["varchar"].oid)
+
+    TextByteaLoader.register(builtins['bytea'].oid)
+    BinaryByteaLoader.register_binary(builtins['bytea'].oid)
index 8399d42ef7371ebdedf012be17df0bc1beab9fa6..03734bc6442f962a3ab261305f9d55f0f8d1ff4f 100644 (file)
@@ -86,8 +86,8 @@ def test_cast(data, format, type, result):
 
 
 def test_load_connection_ctx(conn):
-    Loader.register(TEXT_OID, make_loader("t"), conn)
-    Loader.register_binary(TEXT_OID, make_loader("b"), conn)
+    make_loader("t").register(TEXT_OID, conn)
+    make_loader("b").register_binary(TEXT_OID, conn)
 
     r = conn.cursor().execute("select 'hello'::text").fetchone()
     assert r == ("hellot",)
@@ -96,12 +96,12 @@ def test_load_connection_ctx(conn):
 
 
 def test_load_cursor_ctx(conn):
-    Loader.register(TEXT_OID, make_loader("t"), conn)
-    Loader.register_binary(TEXT_OID, make_loader("b"), conn)
+    make_loader("t").register(TEXT_OID, conn)
+    make_loader("b").register_binary(TEXT_OID, conn)
 
     cur = conn.cursor()
-    Loader.register(TEXT_OID, make_loader("tc"), cur)
-    Loader.register_binary(TEXT_OID, make_loader("bc"), cur)
+    make_loader("tc").register(TEXT_OID, cur)
+    make_loader("bc").register_binary(TEXT_OID, cur)
 
     r = cur.execute("select 'hello'::text").fetchone()
     assert r == ("hellotc",)
@@ -124,7 +124,7 @@ def test_load_cursor_ctx(conn):
 @pytest.mark.parametrize("fmt_out", [Format.TEXT, Format.BINARY])
 def test_load_cursor_ctx_nested(conn, sql, obj, fmt_out):
     cur = conn.cursor(format=fmt_out)
-    Loader.register(TEXT_OID, make_loader("c"), cur, format=fmt_out)
+    make_loader("c").register(TEXT_OID, cur, format=fmt_out)
     cur.execute(f"select {sql}")
     res = cur.fetchone()[0]
     assert res == obj
index f491e6aec021af25d995bcd07c76af79232f6ef5..e07b59026a4002bf2c1197a681536f7e0103e845 100644 (file)
@@ -4,7 +4,7 @@ from math import isnan, isinf, exp
 import pytest
 
 from psycopg3 import sql
-from psycopg3.adapt import Loader, Transformer, Format
+from psycopg3.adapt import Transformer, Format
 from psycopg3.types import builtins
 from psycopg3.types.numeric import TextFloatLoader
 
@@ -337,7 +337,7 @@ def test_load_numeric_binary(conn):
 )
 def test_numeric_as_float(conn, val):
     cur = conn.cursor()
-    Loader.register(builtins["numeric"].oid, TextFloatLoader, cur)
+    TextFloatLoader.register(builtins["numeric"].oid, cur)
 
     val = Decimal(val)
     cur.execute("select %s", (val,))