From: Daniele Varrazzo Date: Sat, 28 Dec 2024 01:47:34 +0000 (+0100) Subject: refactor: remove unneeded objects from _compat modules X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a58087f2f1b1033a6878733f871ab92f2757bc76;p=thirdparty%2Fpsycopg.git refactor: remove unneeded objects from _compat modules --- diff --git a/psycopg/psycopg/_compat.py b/psycopg/psycopg/_compat.py index 28a1edb6a..5157f77ae 100644 --- a/psycopg/psycopg/_compat.py +++ b/psycopg/psycopg/_compat.py @@ -6,12 +6,6 @@ compatibility functions for different Python versions import sys -from asyncio import to_thread -from zoneinfo import ZoneInfo -from functools import cache -from collections import Counter, deque as Deque - - if sys.version_info >= (3, 10): from typing import TypeGuard, TypeAlias else: @@ -28,14 +22,9 @@ else: from typing_extensions import TypeVar __all__ = [ - "Counter", - "Deque", "LiteralString", "Self", "TypeAlias", "TypeGuard", "TypeVar", - "ZoneInfo", - "cache", - "to_thread", ] diff --git a/psycopg/psycopg/_connection_base.py b/psycopg/psycopg/_connection_base.py index 90cd237ca..a260fe177 100644 --- a/psycopg/psycopg/_connection_base.py +++ b/psycopg/psycopg/_connection_base.py @@ -12,6 +12,7 @@ from typing import Callable, Generic, NamedTuple, TYPE_CHECKING from weakref import ref, ReferenceType from warnings import warn from functools import partial +from collections import deque from . import pq from . import errors as e @@ -23,7 +24,7 @@ from ._tpc import Xid from .rows import Row from .adapt import AdaptersMap from ._enums import IsolationLevel -from ._compat import Deque, LiteralString, Self, TypeAlias, TypeVar +from ._compat import LiteralString, Self, TypeAlias, TypeVar from .pq.misc import connection_summary from ._pipeline import BasePipeline from ._preparing import PrepareManager @@ -117,7 +118,7 @@ class BaseConnection(Generic[Row]): pgconn.notify_handler = partial(BaseConnection._notify_handler, wself) # Gather notifies when the notifies() generator is not running. - self._notifies_backlog = Deque[Notify]() + self._notifies_backlog = deque[Notify]() self._notifies_backlog_handler = partial( BaseConnection._add_notify_to_backlog, wself ) diff --git a/psycopg/psycopg/_encodings.py b/psycopg/psycopg/_encodings.py index 42da2c529..d6f924373 100644 --- a/psycopg/psycopg/_encodings.py +++ b/psycopg/psycopg/_encodings.py @@ -10,10 +10,10 @@ import re import string import codecs from typing import Any, TYPE_CHECKING +from functools import cache from .pq._enums import ConnStatus from .errors import NotSupportedError -from ._compat import cache if TYPE_CHECKING: from ._connection_base import BaseConnection diff --git a/psycopg/psycopg/_pipeline.py b/psycopg/psycopg/_pipeline.py index 6ad3b303f..6621658cb 100644 --- a/psycopg/psycopg/_pipeline.py +++ b/psycopg/psycopg/_pipeline.py @@ -9,11 +9,12 @@ from __future__ import annotations import logging from types import TracebackType from typing import Any, TYPE_CHECKING +from collections import deque from . import pq from . import errors as e from .abc import PipelineCommand, PQGen -from ._compat import Deque, Self, TypeAlias +from ._compat import Self, TypeAlias from .pq.misc import connection_summary from .generators import pipeline_communicate, fetch_many, send from ._capabilities import capabilities @@ -41,14 +42,14 @@ logger = logging.getLogger("psycopg") class BasePipeline: - command_queue: Deque[PipelineCommand] - result_queue: Deque[PendingResult] + command_queue: deque[PipelineCommand] + result_queue: deque[PendingResult] def __init__(self, conn: BaseConnection[Any]) -> None: self._conn = conn self.pgconn = conn.pgconn - self.command_queue = Deque[PipelineCommand]() - self.result_queue = Deque[PendingResult]() + self.command_queue = deque[PipelineCommand]() + self.result_queue = deque[PendingResult]() self.level = 0 def __repr__(self) -> str: diff --git a/psycopg/psycopg/_preparing.py b/psycopg/psycopg/_preparing.py index 4a06ff44f..6842e44a5 100644 --- a/psycopg/psycopg/_preparing.py +++ b/psycopg/psycopg/_preparing.py @@ -8,12 +8,12 @@ from __future__ import annotations from enum import IntEnum, auto from typing import Any, TYPE_CHECKING +from collections import deque, OrderedDict from collections.abc import Sequence -from collections import OrderedDict from . import pq from .abc import PQGen -from ._compat import Deque, TypeAlias +from ._compat import TypeAlias from ._queries import PostgresQuery if TYPE_CHECKING: @@ -49,7 +49,7 @@ class PrepareManager: # Counter to generate prepared statements names self._prepared_idx = 0 - self._to_flush = Deque["bytes | None"]() + self._to_flush = deque["bytes | None"]() @staticmethod def key(query: PostgresQuery) -> Key: diff --git a/psycopg/psycopg/_tz.py b/psycopg/psycopg/_tz.py index c6f400d7c..de7be44b5 100644 --- a/psycopg/psycopg/_tz.py +++ b/psycopg/psycopg/_tz.py @@ -8,9 +8,9 @@ from __future__ import annotations import logging from datetime import timezone, tzinfo +from zoneinfo import ZoneInfo from .pq.abc import PGconn -from ._compat import ZoneInfo logger = logging.getLogger("psycopg") diff --git a/psycopg/psycopg/connection_async.py b/psycopg/psycopg/connection_async.py index c581e7623..203976078 100644 --- a/psycopg/psycopg/connection_async.py +++ b/psycopg/psycopg/connection_async.py @@ -35,8 +35,7 @@ from ._connection_base import BaseConnection, CursorRow, Notify if True: # ASYNC import sys import asyncio - from asyncio import Lock - from ._compat import to_thread + from asyncio import Lock, to_thread else: from threading import Lock diff --git a/psycopg/psycopg/generators.py b/psycopg/psycopg/generators.py index 5d6554f36..8eee7ccca 100644 --- a/psycopg/psycopg/generators.py +++ b/psycopg/psycopg/generators.py @@ -24,13 +24,13 @@ from __future__ import annotations import logging from time import monotonic +from collections import deque from . import pq from . import errors as e from .abc import Buffer, PipelineCommand, PQGen, PQGenConn from .pq.abc import PGcancelConn, PGconn, PGresult from .waiting import Wait, Ready -from ._compat import Deque from ._cmodule import _psycopg from ._encodings import conninfo_encoding @@ -226,7 +226,7 @@ def _fetch(pgconn: PGconn) -> PQGen[PGresult | None]: def _pipeline_communicate( - pgconn: PGconn, commands: Deque[PipelineCommand] + pgconn: PGconn, commands: deque[PipelineCommand] ) -> PQGen[list[list[PGresult]]]: """Generator to send queries from a connection in pipeline mode while also receiving results. diff --git a/psycopg/psycopg/pq/misc.py b/psycopg/psycopg/pq/misc.py index cb95e5ef2..71206ee4f 100644 --- a/psycopg/psycopg/pq/misc.py +++ b/psycopg/psycopg/pq/misc.py @@ -13,10 +13,10 @@ import logging import ctypes.util from typing import NamedTuple from pathlib import Path +from functools import cache from . import abc from ._enums import ConnStatus, TransactionStatus, PipelineStatus -from .._compat import cache logger = logging.getLogger("psycopg.pq") diff --git a/psycopg/psycopg/types/array.py b/psycopg/psycopg/types/array.py index a50d3bf58..d14bd2b97 100644 --- a/psycopg/psycopg/types/array.py +++ b/psycopg/psycopg/types/array.py @@ -10,6 +10,7 @@ import re import struct from math import prod from typing import Any, cast, Callable +from functools import cache from .. import pq from .. import errors as e @@ -17,7 +18,6 @@ from .. import postgres from ..abc import AdaptContext, Buffer, Dumper, DumperKey, NoneType, Loader, Transformer from ..adapt import RecursiveDumper, RecursiveLoader, PyFormat from .._oids import TEXT_OID, INVALID_OID, TEXT_ARRAY_OID -from .._compat import cache from .._struct import pack_len, unpack_len from .._cmodule import _psycopg from .._typeinfo import TypeInfo diff --git a/psycopg/psycopg/types/composite.py b/psycopg/psycopg/types/composite.py index 8346ff334..3a1718565 100644 --- a/psycopg/psycopg/types/composite.py +++ b/psycopg/psycopg/types/composite.py @@ -9,6 +9,7 @@ from __future__ import annotations import re import struct from typing import Any, Callable, cast, NamedTuple, TYPE_CHECKING +from functools import cache from collections import namedtuple from collections.abc import Iterator, Sequence @@ -18,7 +19,6 @@ from .. import sql from .. import postgres from ..adapt import Transformer, PyFormat, RecursiveDumper, Loader, Dumper, Buffer from .._oids import TEXT_OID -from .._compat import cache from .._struct import pack_len, unpack_len from .._typeinfo import TypeInfo from .._encodings import _as_python_identifier diff --git a/psycopg/psycopg/types/enum.py b/psycopg/psycopg/types/enum.py index cfc09c342..1dfa4acd0 100644 --- a/psycopg/psycopg/types/enum.py +++ b/psycopg/psycopg/types/enum.py @@ -6,6 +6,7 @@ from __future__ import annotations from enum import Enum from typing import Any, Generic, cast, TYPE_CHECKING +from functools import cache from collections.abc import Mapping, Sequence from .. import sql @@ -14,7 +15,7 @@ from .. import errors as e from ..pq import Format from ..abc import AdaptContext, Query from ..adapt import Buffer, Dumper, Loader -from .._compat import cache, TypeAlias, TypeVar +from .._compat import TypeAlias, TypeVar from .._encodings import conn_encoding from .._typeinfo import TypeInfo diff --git a/psycopg/psycopg/types/hstore.py b/psycopg/psycopg/types/hstore.py index 55944c148..cd8388741 100644 --- a/psycopg/psycopg/types/hstore.py +++ b/psycopg/psycopg/types/hstore.py @@ -7,13 +7,14 @@ dict to hstore adaptation from __future__ import annotations import re +from functools import cache from .. import errors as e from .. import postgres from ..abc import Buffer, AdaptContext from .._oids import TEXT_OID from ..adapt import PyFormat, RecursiveDumper, RecursiveLoader -from .._compat import cache, TypeAlias +from .._compat import TypeAlias from .._typeinfo import TypeInfo _re_escape = re.compile(r'(["\\])') diff --git a/psycopg/psycopg/types/json.py b/psycopg/psycopg/types/json.py index 56ac23418..a3897049e 100644 --- a/psycopg/psycopg/types/json.py +++ b/psycopg/psycopg/types/json.py @@ -8,6 +8,7 @@ from __future__ import annotations import json from typing import Any, Callable +from functools import cache from .. import abc from .. import _oids @@ -15,7 +16,7 @@ from .. import errors as e from ..pq import Format from ..adapt import Buffer, Dumper, Loader, PyFormat, AdaptersMap from ..errors import DataError -from .._compat import cache, TypeAlias +from .._compat import TypeAlias JsonDumpsFunction: TypeAlias = Callable[[Any], "str | bytes"] JsonLoadsFunction: TypeAlias = Callable[["str | bytes"], Any] diff --git a/psycopg/psycopg/types/multirange.py b/psycopg/psycopg/types/multirange.py index 97b9f8f9e..33b419c42 100644 --- a/psycopg/psycopg/types/multirange.py +++ b/psycopg/psycopg/types/multirange.py @@ -9,6 +9,7 @@ from __future__ import annotations from decimal import Decimal from typing import Any, Generic, overload, TYPE_CHECKING from datetime import date, datetime +from functools import cache from collections.abc import Iterable, MutableSequence from .. import sql @@ -19,7 +20,6 @@ from ..pq import Format from ..abc import AdaptContext, Buffer, Dumper, DumperKey, Query from ..adapt import RecursiveDumper, RecursiveLoader, PyFormat from .._oids import INVALID_OID, TEXT_OID -from .._compat import cache from .._struct import pack_len, unpack_len from .._typeinfo import TypeInfo, TypesRegistry diff --git a/psycopg/psycopg/types/range.py b/psycopg/psycopg/types/range.py index 3327a8411..d5c28b417 100644 --- a/psycopg/psycopg/types/range.py +++ b/psycopg/psycopg/types/range.py @@ -10,6 +10,7 @@ import re from typing import Any, Generic, cast, TYPE_CHECKING from decimal import Decimal from datetime import date, datetime +from functools import cache from .. import sql from .. import _oids @@ -19,7 +20,7 @@ from ..pq import Format from ..abc import AdaptContext, Buffer, Dumper, DumperKey, DumpFunc, LoadFunc, Query from ..adapt import RecursiveDumper, RecursiveLoader, PyFormat from .._oids import INVALID_OID, TEXT_OID -from .._compat import cache, TypeVar +from .._compat import TypeVar from .._struct import pack_len, unpack_len from .._typeinfo import TypeInfo, TypesRegistry diff --git a/psycopg/psycopg/types/shapely.py b/psycopg/psycopg/types/shapely.py index 6a7e15761..0ea441a4f 100644 --- a/psycopg/psycopg/types/shapely.py +++ b/psycopg/psycopg/types/shapely.py @@ -4,11 +4,12 @@ Adapters for PostGIS geometries from __future__ import annotations +from functools import cache + from .. import postgres from ..abc import AdaptContext, Buffer from ..adapt import Dumper, Loader from ..pq import Format -from .._compat import cache from .._typeinfo import TypeInfo try: diff --git a/psycopg_c/psycopg_c/_psycopg.pyi b/psycopg_c/psycopg_c/_psycopg.pyi index 1c661ea99..61fa0ce3f 100644 --- a/psycopg_c/psycopg_c/_psycopg.pyi +++ b/psycopg_c/psycopg_c/_psycopg.pyi @@ -10,12 +10,12 @@ information. Will submit a bug. from __future__ import annotations from typing import Any, Sequence +from collections import deque from psycopg import pq, abc, BaseConnection from psycopg.rows import Row, RowMaker from psycopg.adapt import AdaptersMap, PyFormat from psycopg.pq.abc import PGcancelConn, PGconn, PGresult -from psycopg._compat import Deque class Transformer(abc.AdaptContext): types: tuple[int, ...] | None @@ -60,7 +60,7 @@ def send(pgconn: PGconn) -> abc.PQGen[None]: ... def fetch_many(pgconn: PGconn) -> abc.PQGen[list[PGresult]]: ... def fetch(pgconn: PGconn) -> abc.PQGen[PGresult | None]: ... def pipeline_communicate( - pgconn: PGconn, commands: Deque[abc.PipelineCommand] + pgconn: PGconn, commands: deque[abc.PipelineCommand] ) -> abc.PQGen[list[list[PGresult]]]: ... def wait_c( gen: abc.PQGen[abc.RV], fileno: int, interval: float | None = None diff --git a/psycopg_c/psycopg_c/_psycopg/generators.pyx b/psycopg_c/psycopg_c/_psycopg/generators.pyx index a908577c2..d382a4bd1 100644 --- a/psycopg_c/psycopg_c/_psycopg/generators.pyx +++ b/psycopg_c/psycopg_c/_psycopg/generators.pyx @@ -7,12 +7,12 @@ C implementation of generators for the communication protocols with the libpq from cpython.object cimport PyObject_CallFunctionObjArgs from time import monotonic +from collections import deque from psycopg import errors as e from psycopg.pq import abc from psycopg.abc import PipelineCommand, PQGen from psycopg._enums import Wait, Ready -from psycopg._compat import Deque from psycopg._encodings import conninfo_encoding cdef object WAIT_W = Wait.W @@ -245,7 +245,7 @@ def fetch(pq.PGconn pgconn) -> PQGen[PGresult | None]: def pipeline_communicate( - pq.PGconn pgconn, commands: Deque[PipelineCommand] + pq.PGconn pgconn, commands: deque[PipelineCommand] ) -> PQGen[list[list[PGresult]]]: """Generator to send queries from a connection in pipeline mode while also receiving results. diff --git a/psycopg_c/psycopg_c/types/datetime.pyx b/psycopg_c/psycopg_c/types/datetime.pyx index e2a6ac8a3..a3b80e181 100644 --- a/psycopg_c/psycopg_c/types/datetime.pyx +++ b/psycopg_c/psycopg_c/types/datetime.pyx @@ -22,11 +22,11 @@ static int _uspad[] = {0, 100000, 10000, 1000, 100, 10, 1}; cdef int *_uspad from datetime import date, time, timedelta, datetime, timezone +from zoneinfo import ZoneInfo from psycopg_c._psycopg cimport endian from psycopg import errors as e -from psycopg._compat import ZoneInfo # Initialise the datetime C API diff --git a/psycopg_pool/psycopg_pool/_compat.py b/psycopg_pool/psycopg_pool/_compat.py index 2f8a329f7..be6a967e0 100644 --- a/psycopg_pool/psycopg_pool/_compat.py +++ b/psycopg_pool/psycopg_pool/_compat.py @@ -7,7 +7,6 @@ compatibility functions for different Python versions from __future__ import annotations import sys -from collections import Counter, deque as Deque if sys.version_info >= (3, 10): from typing import TypeAlias @@ -27,8 +26,6 @@ else: import psycopg.errors as e __all__ = [ - "Counter", - "Deque", "Self", "TypeAlias", "TypeVar", diff --git a/psycopg_pool/psycopg_pool/base.py b/psycopg_pool/psycopg_pool/base.py index 427fd24dc..eb1edf381 100644 --- a/psycopg_pool/psycopg_pool/base.py +++ b/psycopg_pool/psycopg_pool/base.py @@ -9,11 +9,11 @@ from __future__ import annotations from time import monotonic from random import random from typing import Any, TYPE_CHECKING +from collections import Counter, deque from psycopg import errors as e from .errors import PoolClosed -from ._compat import Counter, Deque if TYPE_CHECKING: from psycopg._connection_base import BaseConnection @@ -40,7 +40,7 @@ class BasePool: _CONNECTIONS_ERRORS = "connections_errors" _CONNECTIONS_LOST = "connections_lost" - _pool: Deque[Any] + _pool: deque[Any] def __init__( self, @@ -79,7 +79,7 @@ class BasePool: self.num_workers = num_workers self._nconns = min_size # currently in the pool, out, being prepared - self._pool = Deque() + self._pool = deque() self._stats = Counter[str]() # Min number of connections in the pool in a max_idle unit of time. diff --git a/psycopg_pool/psycopg_pool/pool.py b/psycopg_pool/psycopg_pool/pool.py index 0f1a0e932..7466e021a 100644 --- a/psycopg_pool/psycopg_pool/pool.py +++ b/psycopg_pool/psycopg_pool/pool.py @@ -15,6 +15,7 @@ from abc import ABC, abstractmethod from time import monotonic from types import TracebackType from typing import Any, cast, Generic +from collections import deque from collections.abc import Iterator from weakref import ref from contextlib import contextmanager @@ -26,7 +27,7 @@ from psycopg.pq import TransactionStatus from .abc import CT, ConnectionCB, ConnectFailedCB from .base import AttemptWithBackoff, BasePool from .errors import PoolClosed, PoolTimeout, TooManyRequests -from ._compat import Deque, Self +from ._compat import Self from ._acompat import Condition, Event, Lock, Queue, Worker, spawn, gather from ._acompat import sleep, current_thread_name from .sched import Scheduler @@ -36,7 +37,7 @@ logger = logging.getLogger("psycopg.pool") class ConnectionPool(Generic[CT], BasePool): - _pool: Deque[CT] + _pool: deque[CT] def __init__( self, @@ -72,7 +73,7 @@ class ConnectionPool(Generic[CT], BasePool): self._sched: Scheduler self._tasks: Queue[MaintenanceTask] - self._waiting = Deque[WaitingClient[CT]]() + self._waiting = deque[WaitingClient[CT]]() # to notify that the pool is full self._pool_full_event: Event | None = None diff --git a/psycopg_pool/psycopg_pool/pool_async.py b/psycopg_pool/psycopg_pool/pool_async.py index 2ecb298b5..6f841dd09 100644 --- a/psycopg_pool/psycopg_pool/pool_async.py +++ b/psycopg_pool/psycopg_pool/pool_async.py @@ -12,6 +12,7 @@ from abc import ABC, abstractmethod from time import monotonic from types import TracebackType from typing import Any, cast, Generic +from collections import deque from collections.abc import AsyncIterator from weakref import ref from contextlib import asynccontextmanager @@ -23,7 +24,7 @@ from psycopg.pq import TransactionStatus from .abc import ACT, AsyncConnectionCB, AsyncConnectFailedCB from .base import AttemptWithBackoff, BasePool from .errors import PoolClosed, PoolTimeout, TooManyRequests -from ._compat import Deque, Self +from ._compat import Self from ._acompat import ACondition, AEvent, ALock, AQueue, AWorker, aspawn, agather from ._acompat import asleep, current_task_name from .sched_async import AsyncScheduler @@ -35,7 +36,7 @@ logger = logging.getLogger("psycopg.pool") class AsyncConnectionPool(Generic[ACT], BasePool): - _pool: Deque[ACT] + _pool: deque[ACT] def __init__( self, @@ -71,7 +72,7 @@ class AsyncConnectionPool(Generic[ACT], BasePool): self._sched: AsyncScheduler self._tasks: AQueue[MaintenanceTask] - self._waiting = Deque[WaitingClient[ACT]]() + self._waiting = deque[WaitingClient[ACT]]() # to notify that the pool is full self._pool_full_event: AEvent | None = None diff --git a/tests/fix_db.py b/tests/fix_db.py index bb1109c05..64744dbe5 100644 --- a/tests/fix_db.py +++ b/tests/fix_db.py @@ -5,13 +5,13 @@ import os import sys import pytest import logging +from functools import cache from contextlib import contextmanager import psycopg from psycopg import pq from psycopg import sql from psycopg.conninfo import conninfo_to_dict, make_conninfo -from psycopg._compat import cache from psycopg.pq._debug import PGconnDebug from .utils import check_postgres_version diff --git a/tests/fix_faker.py b/tests/fix_faker.py index e9c8f0770..c1cfbda36 100644 --- a/tests/fix_faker.py +++ b/tests/fix_faker.py @@ -9,13 +9,13 @@ from random import choice, random, randrange from typing import Any from decimal import Decimal from contextlib import contextmanager, asynccontextmanager +from collections import deque import pytest import psycopg from psycopg import sql from psycopg.adapt import PyFormat -from psycopg._compat import Deque from psycopg.types.range import Range from psycopg.types.json import Json, Jsonb from psycopg.types.numeric import Int4, Int8 @@ -932,7 +932,7 @@ class JsonFloat: def deep_import(name): - parts = Deque(name.split(".")) + parts = deque(name.split(".")) seen = [] if not parts: raise ValueError("name must be a dot-separated name") diff --git a/tests/scripts/pipeline-demo.py b/tests/scripts/pipeline-demo.py index 45956097f..d9eb92b5e 100644 --- a/tests/scripts/pipeline-demo.py +++ b/tests/scripts/pipeline-demo.py @@ -16,6 +16,7 @@ import logging from contextlib import contextmanager from functools import partial from typing import Any +from collections import deque from collections.abc import Iterator, Sequence from psycopg import AsyncConnection, Connection @@ -24,7 +25,6 @@ from psycopg import errors as e from psycopg.abc import PipelineCommand from psycopg.generators import pipeline_communicate from psycopg.pq import Format, DiagnosticField -from psycopg._compat import Deque psycopg_logger = logging.getLogger("psycopg") pipeline_logger = logging.getLogger("pipeline") @@ -112,7 +112,7 @@ class LoggingPGconn: @contextmanager def prepare_pipeline_demo_pq( pgconn: LoggingPGconn, rows_to_send: int, logger: logging.Logger -) -> Iterator[tuple[Deque[PipelineCommand], Deque[str]]]: +) -> Iterator[tuple[deque[PipelineCommand], deque[str]]]: """Set up pipeline demo with initial queries and yield commands and results queue for pipeline_communicate(). """ @@ -138,8 +138,8 @@ def prepare_pipeline_demo_pq( ), ] - commands = Deque[PipelineCommand]() - results_queue = Deque[str]() + commands = deque[PipelineCommand]() + results_queue = deque[str]() for qname, query in setup_queries: if qname == "prepare": diff --git a/tests/types/test_datetime.py b/tests/types/test_datetime.py index a50b53d18..907abe6dd 100644 --- a/tests/types/test_datetime.py +++ b/tests/types/test_datetime.py @@ -1,10 +1,10 @@ import datetime as dt import pytest +from zoneinfo import ZoneInfo from psycopg import DataError, pq, sql from psycopg.adapt import PyFormat -from psycopg._compat import ZoneInfo crdb_skip_datestyle = pytest.mark.crdb("skip", reason="set datestyle/intervalstyle") crdb_skip_negative_interval = pytest.mark.crdb("skip", reason="negative interval")