From: Daniele Varrazzo Date: Sat, 26 Jun 2021 01:18:24 +0000 (+0100) Subject: Split types.singleton module into bool and none X-Git-Tag: 3.0.dev0~17^2~6 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d71580c453643762945c73e5507ed538fab9ebc6;p=thirdparty%2Fpsycopg.git Split types.singleton module into bool and none --- diff --git a/psycopg3/psycopg3/types/__init__.py b/psycopg3/psycopg3/types/__init__.py index 158eee8a3..4a23921d2 100644 --- a/psycopg3/psycopg3/types/__init__.py +++ b/psycopg3/psycopg3/types/__init__.py @@ -6,8 +6,10 @@ psycopg3 types package from typing import TYPE_CHECKING +from . import bool from . import date from . import json +from . import none from . import text from . import uuid from . import array @@ -15,7 +17,6 @@ from . import range from . import network from . import numeric from . import composite -from . import singletons from .._typeinfo import TypeInfo as TypeInfo # exported here @@ -24,8 +25,10 @@ if TYPE_CHECKING: def register_default_globals(ctx: "AdaptContext") -> None: + bool.register_default_globals(ctx) date.register_default_globals(ctx) json.register_default_globals(ctx) + none.register_default_globals(ctx) text.register_default_globals(ctx) uuid.register_default_globals(ctx) array.register_default_globals(ctx) @@ -33,7 +36,6 @@ def register_default_globals(ctx: "AdaptContext") -> None: network.register_default_globals(ctx) numeric.register_default_globals(ctx) composite.register_default_globals(ctx) - singletons.register_default_globals(ctx) # Must come after all the types are registered array.register_all_arrays(ctx) diff --git a/psycopg3/psycopg3/types/singletons.py b/psycopg3/psycopg3/types/bool.py similarity index 70% rename from psycopg3/psycopg3/types/singletons.py rename to psycopg3/psycopg3/types/bool.py index 9db920c0c..87ff29f27 100644 --- a/psycopg3/psycopg3/types/singletons.py +++ b/psycopg3/psycopg3/types/bool.py @@ -1,5 +1,5 @@ """ -Adapters for None and boolean. +Adapters for booleans. """ # Copyright (C) 2020-2021 The Psycopg Team @@ -31,21 +31,6 @@ class BoolBinaryDumper(Dumper): return b"\x01" if obj else b"\x00" -class NoneDumper(Dumper): - """ - Not a complete dumper as it doesn't implement dump(), but it implements - quote(), so it can be used in sql composition. - """ - - format = Format.TEXT - - def dump(self, obj: None) -> bytes: - raise NotImplementedError("NULL is passed to Postgres in other ways") - - def quote(self, obj: None) -> bytes: - return b"NULL" - - class BoolLoader(Loader): format = Format.TEXT @@ -65,6 +50,5 @@ class BoolBinaryLoader(Loader): def register_default_globals(ctx: AdaptContext) -> None: BoolDumper.register(bool, ctx) BoolBinaryDumper.register(bool, ctx) - NoneDumper.register(type(None), ctx) BoolLoader.register("bool", ctx) BoolBinaryLoader.register("bool", ctx) diff --git a/psycopg3/psycopg3/types/none.py b/psycopg3/psycopg3/types/none.py new file mode 100644 index 000000000..f200dd235 --- /dev/null +++ b/psycopg3/psycopg3/types/none.py @@ -0,0 +1,28 @@ +""" +Adapters for None. +""" + +# Copyright (C) 2020-2021 The Psycopg Team + +from ..pq import Format +from ..adapt import Dumper +from ..proto import AdaptContext + + +class NoneDumper(Dumper): + """ + Not a complete dumper as it doesn't implement dump(), but it implements + quote(), so it can be used in sql composition. + """ + + format = Format.TEXT + + def dump(self, obj: None) -> bytes: + raise NotImplementedError("NULL is passed to Postgres in other ways") + + def quote(self, obj: None) -> bytes: + return b"NULL" + + +def register_default_globals(ctx: AdaptContext) -> None: + NoneDumper.register(type(None), ctx) diff --git a/psycopg3_c/psycopg3_c/_psycopg3.pyx b/psycopg3_c/psycopg3_c/_psycopg3.pyx index 520a303ec..adface937 100644 --- a/psycopg3_c/psycopg3_c/_psycopg3.pyx +++ b/psycopg3_c/psycopg3_c/_psycopg3.pyx @@ -29,5 +29,5 @@ include "_psycopg3/transform.pyx" include "types/date.pyx" include "types/numeric.pyx" -include "types/singletons.pyx" +include "types/bool.pyx" include "types/text.pyx" diff --git a/psycopg3_c/psycopg3_c/types/singletons.pyx b/psycopg3_c/psycopg3_c/types/bool.pyx similarity index 100% rename from psycopg3_c/psycopg3_c/types/singletons.pyx rename to psycopg3_c/psycopg3_c/types/bool.pyx diff --git a/tests/types/test_singletons.py b/tests/types/test_bool.py similarity index 100% rename from tests/types/test_singletons.py rename to tests/types/test_bool.py diff --git a/tests/types/test_none.py b/tests/types/test_none.py new file mode 100644 index 000000000..892e352f0 --- /dev/null +++ b/tests/types/test_none.py @@ -0,0 +1,12 @@ +from psycopg3 import sql +from psycopg3.adapt import Transformer, Format + + +def test_quote_none(conn): + + tx = Transformer() + assert tx.get_dumper(None, Format.TEXT).quote(None) == b"NULL" + + cur = conn.cursor() + cur.execute(sql.SQL("select {v}").format(v=sql.Literal(None))) + assert cur.fetchone()[0] is None