From: Daniele Varrazzo Date: Thu, 6 Aug 2020 18:52:44 +0000 (+0100) Subject: Dropped support for loader functions X-Git-Tag: 3.0.dev0~458^2~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6cfe7e81234f18f1f1c63f47fa01e4ec04bbcee6;p=thirdparty%2Fpsycopg.git Dropped support for loader functions --- diff --git a/psycopg3/psycopg3/adapt.py b/psycopg3/psycopg3/adapt.py index 89429ac3a..933963524 100644 --- a/psycopg3/psycopg3/adapt.py +++ b/psycopg3/psycopg3/adapt.py @@ -103,13 +103,9 @@ class Loader: f"typeloaders should be registered on oid, got {oid} instead" ) - if not ( - callable(loader) - or (isinstance(loader, type) and issubclass(loader, Loader)) - ): + if not (isinstance(loader, type) and issubclass(loader, Loader)): raise TypeError( - f"dumpers should be callable or Loader subclasses," - f" got {loader} instead" + f"dumpers should be Loader subclasses, got {loader} instead" ) where = context.loaders if context is not None else Loader.globals diff --git a/psycopg3/psycopg3/proto.py b/psycopg3/psycopg3/proto.py index d46eab0ee..84601a4f7 100644 --- a/psycopg3/psycopg3/proto.py +++ b/psycopg3/psycopg3/proto.py @@ -41,7 +41,7 @@ DumperType = Type["Dumper"] DumpersMap = Dict[Tuple[type, Format], DumperType] LoadFunc = Callable[[bytes], Any] -LoaderType = Union[Type["Loader"], LoadFunc] +LoaderType = Type["Loader"] LoadersMap = Dict[Tuple[int, Format], LoaderType] diff --git a/psycopg3/psycopg3/transform.py b/psycopg3/psycopg3/transform.py index e3f96dcae..5d101fa95 100644 --- a/psycopg3/psycopg3/transform.py +++ b/psycopg3/psycopg3/transform.py @@ -204,13 +204,7 @@ class Transformer: pass loader = self.lookup_loader(oid, format) - func: LoadFunc - if isinstance(loader, type): - func = loader(oid, self).load - else: - func = loader - - self._load_funcs[key] = func + func = self._load_funcs[key] = loader(oid, self).load return func def lookup_loader(self, oid: int, format: Format) -> LoaderType: diff --git a/psycopg3_c/psycopg3_c/transform.pyx b/psycopg3_c/psycopg3_c/transform.pyx index d83eda460..a5e3cb250 100644 --- a/psycopg3_c/psycopg3_c/transform.pyx +++ b/psycopg3_c/psycopg3_c/transform.pyx @@ -307,13 +307,7 @@ cdef class Transformer: pass loader = self.lookup_loader(oid, format) - func: "LoadFunc" - if isinstance(loader, type): - func = loader(oid, self).load - else: - func = loader - - self._load_funcs[key] = func + func = self._load_funcs[key] = loader(oid, self).load return func def lookup_loader(self, oid: int, format: Format) -> "LoaderType": diff --git a/tests/test_adapt.py b/tests/test_adapt.py index 940e02537..5f01a97c4 100644 --- a/tests/test_adapt.py +++ b/tests/test_adapt.py @@ -20,16 +20,6 @@ def test_dump(data, format, result, type): assert dumper.oid == builtins[type].oid -def make_dumper(suffix): - """Create a test dumper appending a suffix to the bytes representation.""" - - class TestDumper(Dumper): - def dump(self, s): - return (s + suffix).encode("ascii") - - return TestDumper - - def test_dump_connection_ctx(conn): Dumper.register(str, make_dumper("t"), conn) Dumper.register_binary(str, make_dumper("b"), conn) @@ -72,8 +62,8 @@ def test_cast(data, format, type, result): def test_load_connection_ctx(conn): - Loader.register(TEXT_OID, lambda b: b.decode("ascii") + "t", conn) - Loader.register_binary(TEXT_OID, lambda b: b.decode("ascii") + "b", conn) + Loader.register(TEXT_OID, make_loader("t"), conn) + Loader.register_binary(TEXT_OID, make_loader("b"), conn) r = conn.cursor().execute("select 'hello'::text").fetchone() assert r == ("hellot",) @@ -82,12 +72,12 @@ def test_load_connection_ctx(conn): def test_load_cursor_ctx(conn): - Loader.register(TEXT_OID, lambda b: b.decode("ascii") + "t", conn) - Loader.register_binary(TEXT_OID, lambda b: b.decode("ascii") + "b", conn) + Loader.register(TEXT_OID, make_loader("t"), conn) + Loader.register_binary(TEXT_OID, make_loader("b"), conn) cur = conn.cursor() - Loader.register(TEXT_OID, lambda b: b.decode("ascii") + "tc", cur) - Loader.register_binary(TEXT_OID, lambda b: b.decode("ascii") + "bc", cur) + Loader.register(TEXT_OID, make_loader("tc"), cur) + Loader.register_binary(TEXT_OID, make_loader("bc"), cur) r = cur.execute("select 'hello'::text").fetchone() assert r == ("hellotc",) @@ -110,9 +100,27 @@ 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, lambda b: b.decode("ascii") + "c", cur, format=fmt_out - ) + Loader.register(TEXT_OID, make_loader("c"), cur, format=fmt_out) cur.execute(f"select {sql}") res = cur.fetchone()[0] assert res == obj + + +def make_dumper(suffix): + """Create a test dumper appending a suffix to the bytes representation.""" + + class TestDumper(Dumper): + def dump(self, s): + return (s + suffix).encode("ascii") + + return TestDumper + + +def make_loader(suffix): + """Create a test loader appending a suffix to the data returned.""" + + class TestLoader(Loader): + def load(self, b): + return b.decode("ascii") + suffix + + return TestLoader