From c2072b77d76e2325eb8137bb9baf157a58e4b3c2 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Fri, 24 Dec 2021 14:15:59 +0100 Subject: [PATCH 01/22] Annotate immutabledict --- .../SQLAlchemy/sqlalchemy/cimmutabledict.pyi | 29 +++++++++++-------- .../sqlalchemy/util/_collections.pyi | 11 +++++-- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/cimmutabledict.pyi b/stubs/SQLAlchemy/sqlalchemy/cimmutabledict.pyi index 851872094694..65b441e9eece 100644 --- a/stubs/SQLAlchemy/sqlalchemy/cimmutabledict.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/cimmutabledict.pyi @@ -1,12 +1,17 @@ -class immutabledict: - def __len__(self) -> int: ... - def __getitem__(self, __item): ... - def __iter__(self): ... - def union(self, **kwargs): ... - def merge_with(self, *args): ... - def keys(self): ... - def __contains__(self, __item): ... - def items(self): ... - def values(self): ... - def get(self, __key, __default=...): ... - def __reduce__(self): ... +from _typeshed import SupportsKeysAndGetItem +from collections.abc import Iterable, Mapping +from typing import Generic, TypeVar, overload + +_KT = TypeVar("_KT") +_KT2 = TypeVar("_KT2") +_VT = TypeVar("_VT") +_VT2 = TypeVar("_VT2") + +class immutabledict(dict[_KT, _VT], Generic[_KT, _VT]): + @overload + def union(self, __dict: dict[_KT2, _VT2]) -> immutabledict[_KT | _KT2, _VT | _VT2]: ... + @overload + def union(self, __dict: None = ..., **kw: SupportsKeysAndGetItem[_KT2, _VT2]) -> immutabledict[_KT | _KT2, _VT | _VT2]: ... + def merge_with( + self, *args: SupportsKeysAndGetItem[_KT | _KT2, _VT2] | Iterable[tuple[_KT2, _VT2]] | None + ) -> immutabledict[_KT | _KT2, _VT | _VT2]: ... diff --git a/stubs/SQLAlchemy/sqlalchemy/util/_collections.pyi b/stubs/SQLAlchemy/sqlalchemy/util/_collections.pyi index 49d369ea1713..3642158c13ba 100644 --- a/stubs/SQLAlchemy/sqlalchemy/util/_collections.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/util/_collections.pyi @@ -1,12 +1,14 @@ import collections.abc import sys from _typeshed import Self, SupportsKeysAndGetItem -from collections.abc import Callable, Iterable, Iterator +from collections.abc import Callable, Iterable, Iterator, Mapping from typing import Any, Generic, NoReturn, TypeVar, overload from ..cimmutabledict import immutabledict as immutabledict from ..sql.elements import ColumnElement +_KT = TypeVar("_KT") +_VT = TypeVar("_VT") _S = TypeVar("_S") _T = TypeVar("_T") @@ -19,9 +21,12 @@ class ImmutableContainer: def __setitem__(self, *arg: object, **kw: object) -> NoReturn: ... def __setattr__(self, *arg: object, **kw: object) -> NoReturn: ... -def coerce_to_immutabledict(d) -> immutabledict: ... +@overload +def coerce_to_immutabledict(d: None) -> immutabledict[Any, Any]: ... +@overload +def coerce_to_immutabledict(d: Mapping[_KT, _VT]) -> immutabledict[_KT, _VT]: ... -EMPTY_DICT: immutabledict +EMPTY_DICT: immutabledict[Any, Any] class FacadeDict(ImmutableContainer, dict[Any, Any]): clear: Any From a3dfffed66e1911f5724c60a924e93f70ff8ef8c Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Fri, 24 Dec 2021 16:06:00 +0100 Subject: [PATCH 02/22] Further annotate sqlalchemy.engine --- stubs/SQLAlchemy/sqlalchemy/dbapi.pyi | 36 +++ stubs/SQLAlchemy/sqlalchemy/engine/base.pyi | 206 +++++++++++------- stubs/SQLAlchemy/sqlalchemy/engine/create.pyi | 35 ++- .../sqlalchemy/engine/interfaces.pyi | 148 +++++++++++-- stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi | 41 +++- stubs/SQLAlchemy/sqlalchemy/engine/result.pyi | 22 +- stubs/SQLAlchemy/sqlalchemy/engine/url.pyi | 90 ++++---- stubs/SQLAlchemy/sqlalchemy/engine/util.pyi | 13 +- stubs/SQLAlchemy/sqlalchemy/future/engine.pyi | 20 +- 9 files changed, 445 insertions(+), 166 deletions(-) create mode 100644 stubs/SQLAlchemy/sqlalchemy/dbapi.pyi diff --git a/stubs/SQLAlchemy/sqlalchemy/dbapi.pyi b/stubs/SQLAlchemy/sqlalchemy/dbapi.pyi new file mode 100644 index 000000000000..432e5936a0c0 --- /dev/null +++ b/stubs/SQLAlchemy/sqlalchemy/dbapi.pyi @@ -0,0 +1,36 @@ +# TODO: Tempory copy of _typeshed.dbapi, until that file is available in all typecheckers. +# Does not exist at runtime. + +from collections.abc import Mapping, Sequence +from typing import Any, Protocol + +DBAPITypeCode = Any | None +# Strictly speaking, this should be a Sequence, but the type system does +# not support fixed-length sequences. +DBAPIColumnDescription = tuple[str, DBAPITypeCode, int | None, int | None, int | None, int | None, bool | None] + +class DBAPIConnection(Protocol): + def close(self) -> object: ... + def commit(self) -> object: ... + # optional: + # def rollback(self) -> Any: ... + def cursor(self) -> DBAPICursor: ... + +class DBAPICursor(Protocol): + @property + def description(self) -> Sequence[DBAPIColumnDescription] | None: ... + @property + def rowcount(self) -> int: ... + # optional: + # def callproc(self, __procname: str, __parameters: Sequence[Any] = ...) -> Sequence[Any]: ... + def close(self) -> object: ... + def execute(self, __operation: str, __parameters: Sequence[Any] | Mapping[str, Any] = ...) -> object: ... + def executemany(self, __operation: str, __seq_of_parameters: Sequence[Sequence[Any]]) -> object: ... + def fetchone(self) -> Sequence[Any] | None: ... + def fetchmany(self, __size: int = ...) -> Sequence[Sequence[Any]]: ... + def fetchall(self) -> Sequence[Sequence[Any]]: ... + # optional: + # def nextset(self) -> None | Literal[True]: ... + arraysize: int + def setinputsizes(self, __sizes: Sequence[DBAPITypeCode | int | None]) -> object: ... + def setoutputsize(self, __size: int, __column: int = ...) -> object: ... diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi index 32640ff8c132..95ae24fdb542 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi @@ -1,18 +1,30 @@ -from typing import Any +from collections.abc import Mapping +from types import TracebackType +from typing import Any, Callable, TypeVar, overload from .. import log -from .interfaces import Connectable as Connectable, ExceptionContext +from ..dbapi import DBAPIConnection +from ..pool import Pool +from ..sql.compiler import Compiled +from ..sql.ddl import DDLElement +from ..sql.elements import ClauseElement +from ..sql.functions import FunctionElement +from ..sql.schema import DefaultGenerator +from .cursor import CursorResult +from .interfaces import Connectable as Connectable, Dialect, ExceptionContext from .util import TransactionalContext +_T = TypeVar("_T") + class Connection(Connectable): - engine: Any - dialect: Any + engine: Engine + dialect: Dialect should_close_with_result: bool dispatch: Any def __init__( self, - engine, - connection: Any | None = ..., + engine: Engine, + connection: DBAPIConnection | None = ..., close_with_result: bool = ..., _branch_from: Any | None = ..., _execution_options: Any | None = ..., @@ -20,42 +32,64 @@ class Connection(Connectable): _has_events: Any | None = ..., _allow_revalidate: bool = ..., ) -> None: ... - def schema_for_object(self, obj): ... - def __enter__(self): ... - def __exit__(self, type_, value, traceback) -> None: ... + def schema_for_object(self, obj) -> str: ... + def __enter__(self) -> Connection: ... + def __exit__( + self, type_: type[BaseException] | None, value: BaseException | None, traceback: TracebackType | None + ) -> None: ... def execution_options(self, **opt): ... def get_execution_options(self): ... @property - def closed(self): ... + def closed(self) -> bool: ... @property - def invalidated(self): ... + def invalidated(self) -> bool: ... @property - def connection(self): ... + def connection(self) -> DBAPIConnection: ... def get_isolation_level(self): ... @property def default_isolation_level(self): ... @property def info(self): ... def connect(self, close_with_result: bool = ...): ... # type: ignore[override] - def invalidate(self, exception: Any | None = ...): ... + def invalidate(self, exception: Exception | None = ...) -> None: ... def detach(self) -> None: ... - def begin(self): ... - def begin_nested(self): ... - def begin_twophase(self, xid: Any | None = ...): ... + def begin(self) -> Transaction | None: ... + def begin_nested(self) -> Transaction | None: ... + def begin_twophase(self, xid: Any | None = ...) -> TwoPhaseTransaction: ... def recover_twophase(self): ... def rollback_prepared(self, xid, recover: bool = ...) -> None: ... def commit_prepared(self, xid, recover: bool = ...) -> None: ... - def in_transaction(self): ... - def in_nested_transaction(self): ... - def get_transaction(self): ... - def get_nested_transaction(self): ... + def in_transaction(self) -> bool: ... + def in_nested_transaction(self) -> bool: ... + def get_transaction(self) -> Transaction | None: ... + def get_nested_transaction(self) -> Transaction | None: ... def close(self) -> None: ... - def scalar(self, object_, *multiparams, **params): ... + @overload + def scalar( + self, + object_: ClauseElement | FunctionElement | DDLElement | DefaultGenerator | Compiled, + *multiparams: Mapping[str, Any], + **params: Any, + ) -> Any: ... + @overload + def scalar(self, object_: str, *multiparams: Any | tuple[Any, ...] | Mapping[str, Any], **params: Any) -> Any: ... def scalars(self, object_, *multiparams, **params): ... - def execute(self, statement, *multiparams, **params): ... - def exec_driver_sql(self, statement, parameters: Any | None = ..., execution_options: Any | None = ...): ... - def transaction(self, callable_, *args, **kwargs): ... - def run_callable(self, callable_, *args, **kwargs): ... + @overload # type: ignore[override] + def execute( + self, + statement: ClauseElement | FunctionElement | DDLElement | DefaultGenerator | Compiled, + *multiparams: Mapping[str, Any], + **params, + ) -> CursorResult: ... + @overload + def execute(self, statement: str, *multiparams: Any | tuple[Any, ...] | Mapping[str, Any], **params) -> CursorResult: ... + def exec_driver_sql(self, statement: str, parameters: Any | None = ..., execution_options: Any | None = ...): ... + # TODO: + # def transaction(self, callable_: Callable[Concatenate[Connection, _P], _T], *args: _P.args, **kwargs: _P.kwargs) -> _T | None: ... + def transaction(self, callable_: Callable[..., _T], *args: Any, **kwargs: Any) -> _T | None: ... + # TODO: + # def run_callable(self, callable_: Callable[Concatenate[Connection, _P], _T], *args: _P.args, **kwargs: _P.kwargs) -> _T: ... + def run_callable(self, callable_: Callable[..., _T], *args: Any, **kwargs: Any) -> _T: ... class ExceptionContextImpl(ExceptionContext): engine: Any @@ -81,89 +115,105 @@ class ExceptionContextImpl(ExceptionContext): invalidate_pool_on_disconnect, ) -> None: ... +# Abstract base class, non-instantiable class Transaction(TransactionalContext): - def __init__(self, connection) -> None: ... + def __init__(self, connection: Connection) -> None: ... @property - def is_valid(self): ... + def is_valid(self) -> bool: ... def close(self) -> None: ... def rollback(self) -> None: ... def commit(self) -> None: ... - -class MarkerTransaction(Transaction): - connection: Any - def __init__(self, connection) -> None: ... + # The following field are technically not defined on Transaction, but on + # all sub-classes. + connection: Connection @property - def is_active(self): ... - -class RootTransaction(Transaction): - connection: Any - is_active: bool - def __init__(self, connection) -> None: ... + def is_active(self) -> bool: ... -class NestedTransaction(Transaction): - connection: Any - is_active: bool - def __init__(self, connection) -> None: ... +class MarkerTransaction(Transaction): ... +class RootTransaction(Transaction): ... +class NestedTransaction(Transaction): ... class TwoPhaseTransaction(RootTransaction): xid: Any - def __init__(self, connection, xid) -> None: ... + def __init__(self, connection: Connection, xid) -> None: ... def prepare(self) -> None: ... class Engine(Connectable, log.Identified): - pool: Any - url: Any - dialect: Any - logging_name: Any - echo: Any - hide_parameters: Any + pool: Pool + url: str + dialect: Dialect + logging_name: str # only exists if not None during initialization + echo: bool | None + hide_parameters: bool def __init__( self, - pool, - dialect, - url, - logging_name: Any | None = ..., - echo: Any | None = ..., + pool: Pool, + dialect: Dialect, + url: str, + logging_name: str | None = ..., + echo: bool | None = ..., query_cache_size: int = ..., - execution_options: Any | None = ..., + execution_options: Mapping[str, Any] | None = ..., hide_parameters: bool = ..., ) -> None: ... @property - def engine(self): ... + def engine(self) -> Engine: ... def clear_compiled_cache(self) -> None: ... def update_execution_options(self, **opt) -> None: ... def execution_options(self, **opt): ... def get_execution_options(self): ... @property - def name(self): ... + def name(self) -> str: ... @property def driver(self): ... def dispose(self) -> None: ... class _trans_ctx: - conn: Any - transaction: Any - close_with_result: Any - def __init__(self, conn, transaction, close_with_result) -> None: ... - def __enter__(self): ... - def __exit__(self, type_, value, traceback) -> None: ... - def begin(self, close_with_result: bool = ...): ... - def transaction(self, callable_, *args, **kwargs): ... - def run_callable(self, callable_, *args, **kwargs): ... - def execute(self, statement, *multiparams, **params): ... - def scalar(self, statement, *multiparams, **params): ... - def connect(self, close_with_result: bool = ...): ... # type: ignore[override] - def table_names(self, schema: Any | None = ..., connection: Any | None = ...): ... - def has_table(self, table_name, schema: Any | None = ...): ... - def raw_connection(self, _connection: Any | None = ...): ... + conn: Connection + transaction: Transaction + close_with_result: bool + def __init__(self, conn: Connection, transaction: Transaction, close_with_result: bool) -> None: ... + def __enter__(self) -> Connection: ... + def __exit__( + self, type_: type[BaseException] | None, value: BaseException | None, traceback: TracebackType | None + ) -> None: ... + def begin(self, close_with_result: bool = ...) -> _trans_ctx: ... + # TODO: + # def transaction(self, callable_: Callable[Concatenate[Connection, _P], _T], *args: _P.args, **kwargs: _P.kwargs) -> _T | None: ... + def transaction(self, callable_: Callable[..., _T], *args: Any, **kwargs: Any) -> _T | None: ... + # TODO: + # def run_callable(self, callable_: Callable[Concatenate[Connection, _P], _T], *args: _P.args, **kwargs: _P.kwargs) -> _T: ... + def run_callable(self, callable_: Callable[..., _T], *args: Any, **kwargs: Any) -> _T: ... + @overload # type: ignore[override] + def execute( + self, + statement: ClauseElement | FunctionElement | DDLElement | DefaultGenerator | Compiled, + *multiparams: Mapping[str, Any], + **params: Any, + ) -> CursorResult: ... + @overload + def execute(self, statement: str, *multiparams: Any | tuple[Any, ...] | Mapping[str, Any], **params: Any) -> CursorResult: ... + @overload # type: ignore[override] + def scalar( + self, + statement: ClauseElement | FunctionElement | DDLElement | DefaultGenerator | Compiled, + *multiparams: Mapping[str, Any], + **params: Any, + ) -> Any: ... + @overload + def scalar(self, statement: str, *multiparams: Any | tuple[Any, ...] | Mapping[str, Any], **params: Any) -> Any: ... + def connect(self, close_with_result: bool = ...) -> Connection: ... # type: ignore[override] + def table_names(self, schema: Any | None = ..., connection: Connection | None = ...): ... + def has_table(self, table_name: str, schema: Any | None = ...) -> bool: ... + def raw_connection(self, _connection: Connection | None = ...) -> DBAPIConnection: ... class OptionEngineMixin: - url: Any - dialect: Any - logging_name: Any - echo: Any - hide_parameters: Any + url: str + dialect: Dialect + logging_name: str | None + echo: bool + hide_parameters: bool dispatch: Any def __init__(self, proxied, execution_options) -> None: ... - pool: Any + pool: Pool -class OptionEngine(OptionEngineMixin, Engine): ... +class OptionEngine(OptionEngineMixin, Engine): ... # type: ignore[misc] diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/create.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/create.pyi index b3f86c1fbb3a..59bc2c5319db 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/create.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/create.pyi @@ -1,2 +1,33 @@ -def create_engine(url, **kwargs): ... -def engine_from_config(configuration, prefix: str = ..., **kwargs): ... +from collections.abc import Mapping +from typing import Any, overload +from typing_extensions import Literal + +from ..future.engine import Engine as FutureEngine +from .base import Engine +from .mock import MockConnection +from .url import URL + +# Further kwargs are forwarded to the engine, dialect, or pool. +@overload +def create_engine(url: URL | str, *, strategy: Literal["mock"], **kwargs) -> MockConnection: ... # type: ignore[misc] +@overload +def create_engine( + url: URL | str, + *, + empty_in_strategy: object | None = ..., + module: Any | None = ..., + enable_from_linting: bool = ..., + future: Literal[True], + **kwargs, +) -> FutureEngine: ... +@overload +def create_engine( + url: URL | str, + *, + empty_in_strategy: object | None = ..., + module: Any | None = ..., + enable_from_linting: bool = ..., + future: Literal[False] = ..., + **kwargs, +) -> Engine: ... +def engine_from_config(configuration: Mapping[str, Any], prefix: str = ..., **kwargs) -> Engine: ... diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi index 24c6ae829c53..864d5d076a8a 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi @@ -1,55 +1,136 @@ -from typing import Any +from abc import abstractmethod +from collections.abc import Callable, Collection, Mapping +from typing import Any, overload -from ..sql.compiler import Compiled as Compiled, TypeCompiler as TypeCompiler +from ..dbapi import DBAPIConnection, DBAPICursor +from ..exc import StatementError +from ..sql.compiler import Compiled as Compiled, IdentifierPreparer, TypeCompiler as TypeCompiler +from ..sql.ddl import DDLElement +from ..sql.elements import ClauseElement +from ..sql.functions import FunctionElement +from ..sql.schema import DefaultGenerator +from .base import Connection, Engine +from .cursor import CursorResult +from .url import URL class Dialect: + # Sub-classes are required to have the following attributes: + name: str + driver: str + positional: bool + paramstyle: str + encoding: str + statement_compiler: Compiled + ddl_compiler: Compiled + server_version_info: tuple[Any, ...] + # Only available on supporting dialects: + # default_schema_name: str + execution_ctx_cls: ExecutionContext + execute_sequence_format: type[tuple[Any] | list[Any]] + preparer: IdentifierPreparer + supports_alter: bool + max_identifier_length: int + supports_sane_rowcount: bool + supports_sane_multi_rowcount: bool + preexecute_autoincrement_sequences: bool + implicit_returning: bool + colspecs: dict[Any, Any] + supports_default_values: bool + supports_sequences: bool + sequences_optional: bool + supports_native_enum: bool + supports_native_boolean: bool + dbapi_exception_translation_map: dict[Any, Any] + supports_statement_cache: bool - def create_connect_args(self, url) -> None: ... + @abstractmethod + def create_connect_args(self, url: URL) -> None: ... + @abstractmethod @classmethod def type_descriptor(cls, typeobj) -> None: ... def initialize(self, connection) -> None: ... + @abstractmethod def get_columns(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... + @abstractmethod def get_pk_constraint(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... + @abstractmethod def get_foreign_keys(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... + @abstractmethod def get_table_names(self, connection, schema: Any | None = ..., **kw) -> None: ... + @abstractmethod def get_temp_table_names(self, connection, schema: Any | None = ..., **kw) -> None: ... + @abstractmethod def get_view_names(self, connection, schema: Any | None = ..., **kw) -> None: ... + @abstractmethod def get_sequence_names(self, connection, schema: Any | None = ..., **kw) -> None: ... + @abstractmethod def get_temp_view_names(self, connection, schema: Any | None = ..., **kw) -> None: ... + @abstractmethod def get_view_definition(self, connection, view_name, schema: Any | None = ..., **kw) -> None: ... + @abstractmethod def get_indexes(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... + @abstractmethod def get_unique_constraints(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... + @abstractmethod def get_check_constraints(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... + @abstractmethod def get_table_comment(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... + @abstractmethod def normalize_name(self, name) -> None: ... + @abstractmethod def denormalize_name(self, name) -> None: ... + @abstractmethod def has_table(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... + @abstractmethod def has_index(self, connection, table_name, index_name, schema: Any | None = ...) -> None: ... + @abstractmethod def has_sequence(self, connection, sequence_name, schema: Any | None = ..., **kw) -> None: ... + @abstractmethod def do_begin(self, dbapi_connection) -> None: ... + @abstractmethod def do_rollback(self, dbapi_connection) -> None: ... + @abstractmethod def do_commit(self, dbapi_connection) -> None: ... + @abstractmethod def do_close(self, dbapi_connection) -> None: ... + @abstractmethod def do_set_input_sizes(self, cursor, list_of_tuples, context) -> None: ... + @abstractmethod def create_xid(self) -> None: ... + @abstractmethod def do_savepoint(self, connection, name) -> None: ... + @abstractmethod def do_rollback_to_savepoint(self, connection, name) -> None: ... + @abstractmethod def do_release_savepoint(self, connection, name) -> None: ... + @abstractmethod def do_begin_twophase(self, connection, xid) -> None: ... + @abstractmethod def do_prepare_twophase(self, connection, xid) -> None: ... + @abstractmethod def do_rollback_twophase(self, connection, xid, is_prepared: bool = ..., recover: bool = ...) -> None: ... + @abstractmethod def do_commit_twophase(self, connection, xid, is_prepared: bool = ..., recover: bool = ...) -> None: ... + @abstractmethod def do_recover_twophase(self, connection) -> None: ... + @abstractmethod def do_executemany(self, cursor, statement, parameters, context: Any | None = ...) -> None: ... + @abstractmethod def do_execute(self, cursor, statement, parameters, context: Any | None = ...) -> None: ... + @abstractmethod def do_execute_no_params(self, cursor, statement, parameters, context: Any | None = ...) -> None: ... + @abstractmethod def is_disconnect(self, e, connection, cursor) -> None: ... - def connect(self, *cargs, **cparams) -> None: ... - def on_connect_url(self, url): ... - def on_connect(self) -> None: ... + def connect(self, *cargs, **cparams) -> Callable[[DBAPIConnection], object] | None: ... + def on_connect_url(self, url) -> Callable[[DBAPIConnection], object] | None: ... + def on_connect(self) -> Callable[[DBAPIConnection], object] | None: ... + @abstractmethod def reset_isolation_level(self, dbapi_conn) -> None: ... + @abstractmethod def set_isolation_level(self, dbapi_conn, level) -> None: ... + @abstractmethod def get_isolation_level(self, dbapi_conn) -> None: ... + @abstractmethod def get_default_isolation_level(self, dbapi_conn) -> None: ... @classmethod def get_dialect_cls(cls, url): ... @@ -57,11 +138,12 @@ class Dialect: def load_provisioning(cls) -> None: ... @classmethod def engine_created(cls, engine) -> None: ... + @abstractmethod def get_driver_connection(self, connection) -> None: ... class CreateEnginePlugin: - url: Any - def __init__(self, url, kwargs) -> None: ... + url: URL + def __init__(self, url: URL, kwargs) -> None: ... def update_url(self, url) -> None: ... def handle_dialect_kwargs(self, dialect_cls, dialect_args) -> None: ... def handle_pool_kwargs(self, pool_cls, pool_args) -> None: ... @@ -79,22 +161,44 @@ class ExecutionContext: def get_rowcount(self) -> None: ... class Connectable: - def connect(self, **kwargs) -> None: ... - engine: Any - def execute(self, object_, *multiparams, **params) -> None: ... - def scalar(self, object_, *multiparams, **params) -> None: ... + @abstractmethod + def connect(self, **kwargs) -> Connection: ... + @property + def engine(self) -> Engine | None: ... + @abstractmethod + @overload + def execute( + self, + object_: ClauseElement | FunctionElement | DDLElement | DefaultGenerator | Compiled, + *multiparams: Mapping[str, Any], + **params: Any, + ) -> CursorResult: ... + @abstractmethod + @overload + def execute(self, object_: str, *multiparams: Any | tuple[Any, ...] | Mapping[str, Any], **params: Any) -> CursorResult: ... + @abstractmethod + @overload + def scalar( + self, + object_: ClauseElement | FunctionElement | DDLElement | DefaultGenerator | Compiled, + *multiparams: Mapping[str, Any], + **params: Any, + ) -> Any: ... + @abstractmethod + @overload + def scalar(self, object_: str, *multiparams: Any | tuple[Any, ...] | Mapping[str, Any], **params: Any) -> Any: ... class ExceptionContext: - connection: Any - engine: Any - cursor: Any - statement: Any - parameters: Any - original_exception: Any - sqlalchemy_exception: Any - chained_exception: Any - execution_context: Any - is_disconnect: Any + connection: Connection | None + engine: Engine | None + cursor: DBAPICursor | None + statement: str | None + parameters: Collection[Any] | None + original_exception: BaseException | None + sqlalchemy_exception: StatementError | None + chained_exception: BaseException | None + execution_context: ExecutionContext | None + is_disconnect: bool | None invalidate_pool_on_disconnect: bool class AdaptedConnection: diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi index 47bb1b0fc9da..510cc4e4b808 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi @@ -1,18 +1,41 @@ -from typing import Any +from _typeshed import Self +from abc import abstractmethod +from collections.abc import Mapping +from typing import Any, overload -from . import base +from ..sql.compiler import Compiled +from ..sql.ddl import DDLElement +from ..sql.elements import ClauseElement +from ..sql.functions import FunctionElement +from ..sql.schema import DefaultGenerator +from .cursor import CursorResult +from .interfaces import Connectable, Dialect +from .url import URL -class MockConnection(base.Connectable): - def __init__(self, dialect, execute) -> None: ... - engine: Any - dialect: Any - name: Any +class MockConnection(Connectable): + def __init__(self, dialect: Dialect, execute) -> None: ... + @property + def engine(self: Self) -> Self: ... # type: ignore[override] + @property + def dialect(self) -> Dialect: ... + @property + def name(self) -> str: ... def schema_for_object(self, obj): ... def connect(self, **kwargs): ... def execution_options(self, **kw): ... def compiler(self, statement, parameters, **kwargs): ... def create(self, entity, **kwargs) -> None: ... def drop(self, entity, **kwargs) -> None: ... - def execute(self, object_, *multiparams, **params) -> None: ... + @abstractmethod + @overload + def execute( + self, + object_: ClauseElement | FunctionElement | DDLElement | DefaultGenerator | Compiled, + *multiparams: Mapping[str, Any], + **params: Any, + ) -> CursorResult: ... + @abstractmethod + @overload + def execute(self, object_: str, *multiparams: Any | tuple[Any, ...] | Mapping[str, Any], **params: Any) -> CursorResult: ... -def create_mock_engine(url, executor, **kw): ... +def create_mock_engine(url: URL | str, executor, **kw) -> MockConnection: ... diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/result.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/result.pyi index 027a86dd8665..742ac5023916 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/result.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/result.pyi @@ -36,26 +36,26 @@ class _WithKeys: class Result(_WithKeys, ResultInternal): def __init__(self, cursor_metadata) -> None: ... def close(self) -> None: ... - def yield_per(self, num) -> None: ... + def yield_per(self, num: int) -> None: ... def unique(self, strategy: Any | None = ...) -> None: ... def columns(self, *col_expressions): ... - def scalars(self, index: int = ...): ... - def mappings(self): ... + def scalars(self, index: int = ...) -> ScalarResult: ... + def mappings(self) -> MappingResult: ... def __iter__(self): ... def __next__(self): ... - def partitions(self, size: Any | None = ...) -> None: ... - def fetchall(self): ... - def fetchone(self): ... - def fetchmany(self, size: Any | None = ...): ... - def all(self): ... + def partitions(self, size: int | None = ...) -> None: ... + def fetchall(self) -> list[Any]: ... + def fetchone(self) -> Any | None: ... + def fetchmany(self, size: int | None = ...) -> list[Any]: ... + def all(self) -> list[Any]: ... def first(self): ... def one_or_none(self): ... def scalar_one(self): ... def scalar_one_or_none(self): ... def one(self): ... def scalar(self): ... - def freeze(self): ... - def merge(self, *others): ... + def freeze(self) -> FrozenResult: ... + def merge(self, *others) -> MergedResult: ... class FilterResult(ResultInternal): ... @@ -100,7 +100,7 @@ class IteratorResult(Result): raw: Any def __init__(self, cursor_metadata, iterator, raw: Any | None = ..., _source_supports_scalars: bool = ...) -> None: ... -def null_result(): ... +def null_result() -> IteratorResult: ... class ChunkedIteratorResult(IteratorResult): chunks: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/url.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/url.pyi index 3ea48464fdff..82a067279c9a 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/url.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/url.pyi @@ -1,46 +1,60 @@ -from typing import Any +from _typeshed import Self, SupportsItems +from collections.abc import Iterable, Mapping, Sequence +from typing import Any, NamedTuple -from ..util import memoized_property +from ..util import immutabledict, memoized_property +from .interfaces import Dialect -class URL: - def __new__(cls, *arg, **kw): ... +# stub-only helper class +class _URLTuple(NamedTuple): + drivername: str + username: str | None + password: str | object | None # object that produces a password when called with str() + host: str | None + port: int | None + database: str | None + query: immutabledict[str, str | tuple[str, ...]] + +_Query = Mapping[str, str | Sequence[str]] | Sequence[tuple[str, str | Sequence[str]]] + +class URL(_URLTuple): @classmethod def create( cls, - drivername, - username: Any | None = ..., - password: Any | None = ..., - host: Any | None = ..., - port: Any | None = ..., - database: Any | None = ..., - query=..., - ): ... + drivername: str, + username: str | None = ..., + password: str | object | None = ..., # object that produces a password when called with str() + host: str | None = ..., + port: int | None = ..., + database: str | None = ..., + query: _Query | None = ..., + ) -> URL: ... def set( - self, - drivername: Any | None = ..., - username: Any | None = ..., - password: Any | None = ..., - host: Any | None = ..., - port: Any | None = ..., - database: Any | None = ..., - query: Any | None = ..., - ): ... - def update_query_string(self, query_string, append: bool = ...): ... - def update_query_pairs(self, key_value_pairs, append: bool = ...): ... - def update_query_dict(self, query_parameters, append: bool = ...): ... - def difference_update_query(self, names): ... + self: Self, + drivername: str | None = ..., + username: str | None = ..., + password: str | object | None = ..., + host: str | None = ..., + port: int | None = ..., + database: str | None = ..., + query: _Query | None = ..., + ) -> Self: ... + def update_query_string(self: Self, query_string: str, append: bool = ...) -> Self: ... + def update_query_pairs(self: Self, key_value_pairs: Iterable[tuple[str, str]], append: bool = ...) -> Self: ... + def update_query_dict(self: Self, query_parameters: SupportsItems[str, str | Sequence[str]], append: bool = ...) -> Self: ... + def difference_update_query(self, names: Iterable[str]) -> URL: ... @memoized_property - def normalized_query(self): ... - def __to_string__(self, hide_password: bool = ...): ... - def render_as_string(self, hide_password: bool = ...): ... - def __copy__(self): ... - def __deepcopy__(self, memo): ... - def __hash__(self): ... - def __eq__(self, other): ... - def __ne__(self, other): ... - def get_backend_name(self): ... - def get_driver_name(self): ... - def get_dialect(self): ... - def translate_connect_args(self, names: Any | None = ..., **kw): ... + def normalized_query(self) -> immutabledict[str, tuple[str, ...]]: ... + def __to_string__(self, hide_password: bool = ...) -> str: ... + def render_as_string(self, hide_password: bool = ...) -> str: ... + def __copy__(self: Self) -> Self: ... + def __deepcopy__(self: Self, memo: object) -> Self: ... + def __hash__(self) -> int: ... + def __eq__(self, other: object) -> bool: ... + def __ne__(self, other: object) -> bool: ... + def get_backend_name(self) -> str: ... + def get_driver_name(self) -> str: ... + def get_dialect(self) -> type[Dialect]: ... + def translate_connect_args(self, names: list[str] | None = ..., **kw: str) -> dict[str, Any]: ... -def make_url(name_or_url): ... +def make_url(name_or_url: str | URL) -> URL: ... diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/util.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/util.pyi index 32aea3338740..f711f0c83d0a 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/util.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/util.pyi @@ -1,5 +1,12 @@ -def connection_memoize(key): ... +from _typeshed import Self +from collections.abc import Callable +from types import TracebackType +from typing import Any + +def connection_memoize(key: str) -> Callable[..., Any]: ... class TransactionalContext: - def __enter__(self): ... - def __exit__(self, type_, value, traceback) -> None: ... + def __enter__(self: Self) -> Self: ... + def __exit__( + self, type_: type[BaseException] | None, value: BaseException | None, traceback: TracebackType | None + ) -> None: ... diff --git a/stubs/SQLAlchemy/sqlalchemy/future/engine.pyi b/stubs/SQLAlchemy/sqlalchemy/future/engine.pyi index 1af2b62ea36c..f8c9de7d760c 100644 --- a/stubs/SQLAlchemy/sqlalchemy/future/engine.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/future/engine.pyi @@ -1,11 +1,25 @@ -from typing import Any +from typing import Any, overload +from typing_extensions import Literal from ..engine import Connection as _LegacyConnection, Engine as _LegacyEngine from ..engine.base import OptionEngineMixin +from ..engine.mock import MockConnection +from ..engine.url import URL NO_OPTIONS: Any -def create_engine(*arg, **kw): ... +@overload +def create_engine(url: URL | str, *, strategy: Literal["mock"], **kwargs) -> MockConnection: ... # type: ignore[misc] +@overload +def create_engine( + url: URL | str, + *, + empty_in_strategy: object | None = ..., + module: Any | None = ..., + enable_from_linting: bool = ..., + future: bool = ..., + **kwargs, +) -> Engine: ... class Connection(_LegacyConnection): def begin(self): ... @@ -26,4 +40,4 @@ class Engine(_LegacyEngine): def begin(self) -> None: ... # type: ignore[override] def connect(self): ... -class OptionEngine(OptionEngineMixin, Engine): ... +class OptionEngine(OptionEngineMixin, Engine): ... # type: ignore[misc] From 2006decf6c7dadfee2912f54530b21141504e50c Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Fri, 24 Dec 2021 16:11:59 +0100 Subject: [PATCH 03/22] Remove unused import --- stubs/SQLAlchemy/sqlalchemy/cimmutabledict.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/cimmutabledict.pyi b/stubs/SQLAlchemy/sqlalchemy/cimmutabledict.pyi index 65b441e9eece..e3f87af28757 100644 --- a/stubs/SQLAlchemy/sqlalchemy/cimmutabledict.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/cimmutabledict.pyi @@ -1,5 +1,5 @@ from _typeshed import SupportsKeysAndGetItem -from collections.abc import Iterable, Mapping +from collections.abc import Iterable from typing import Generic, TypeVar, overload _KT = TypeVar("_KT") From 484997050657b6cec8d4fd52177ba4b5805b4ccb Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Fri, 24 Dec 2021 16:35:25 +0100 Subject: [PATCH 04/22] Stubtest fixes and overrides --- stubs/SQLAlchemy/@tests/stubtest_allowlist.txt | 13 +++++++++++++ .../sqlalchemy/dialects/firebird/base.pyi | 2 +- .../SQLAlchemy/sqlalchemy/dialects/firebird/fdb.pyi | 2 +- .../sqlalchemy/dialects/firebird/kinterbasdb.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mssql/base.pyi | 2 +- .../SQLAlchemy/sqlalchemy/dialects/mssql/mxodbc.pyi | 2 +- .../sqlalchemy/dialects/mssql/pymssql.pyi | 2 +- .../SQLAlchemy/sqlalchemy/dialects/mssql/pyodbc.pyi | 2 +- .../sqlalchemy/dialects/mysql/aiomysql.pyi | 2 +- .../sqlalchemy/dialects/mysql/asyncmy.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mysql/base.pyi | 2 +- .../sqlalchemy/dialects/mysql/cymysql.pyi | 2 +- .../sqlalchemy/dialects/mysql/mariadb.pyi | 2 +- .../sqlalchemy/dialects/mysql/mariadbconnector.pyi | 2 +- .../sqlalchemy/dialects/mysql/mysqlconnector.pyi | 2 +- .../sqlalchemy/dialects/mysql/mysqldb.pyi | 2 +- .../SQLAlchemy/sqlalchemy/dialects/mysql/oursql.pyi | 2 +- .../sqlalchemy/dialects/mysql/pymysql.pyi | 2 +- .../SQLAlchemy/sqlalchemy/dialects/mysql/pyodbc.pyi | 2 +- .../SQLAlchemy/sqlalchemy/dialects/oracle/base.pyi | 2 +- .../sqlalchemy/dialects/oracle/cx_oracle.pyi | 2 +- .../sqlalchemy/dialects/postgresql/asyncpg.pyi | 2 +- .../sqlalchemy/dialects/postgresql/base.pyi | 2 +- .../sqlalchemy/dialects/postgresql/pg8000.pyi | 2 +- .../sqlalchemy/dialects/postgresql/psycopg2.pyi | 2 +- .../sqlalchemy/dialects/postgresql/psycopg2cffi.pyi | 2 +- .../sqlalchemy/dialects/postgresql/pygresql.pyi | 2 +- .../sqlalchemy/dialects/postgresql/pypostgresql.pyi | 2 +- .../sqlalchemy/dialects/sqlite/aiosqlite.pyi | 2 +- .../SQLAlchemy/sqlalchemy/dialects/sqlite/base.pyi | 2 +- .../sqlalchemy/dialects/sqlite/pysqlcipher.pyi | 2 +- .../sqlalchemy/dialects/sqlite/pysqlite.pyi | 2 +- .../SQLAlchemy/sqlalchemy/dialects/sybase/base.pyi | 2 +- .../sqlalchemy/dialects/sybase/mxodbc.pyi | 2 +- .../sqlalchemy/dialects/sybase/pyodbc.pyi | 2 +- .../sqlalchemy/dialects/sybase/pysybase.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/engine/base.pyi | 6 +++--- stubs/SQLAlchemy/sqlalchemy/engine/default.pyi | 8 ++++---- stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi | 4 ++-- 39 files changed, 57 insertions(+), 44 deletions(-) diff --git a/stubs/SQLAlchemy/@tests/stubtest_allowlist.txt b/stubs/SQLAlchemy/@tests/stubtest_allowlist.txt index 7234e1eb1ae9..91d0e8351c72 100644 --- a/stubs/SQLAlchemy/@tests/stubtest_allowlist.txt +++ b/stubs/SQLAlchemy/@tests/stubtest_allowlist.txt @@ -1,3 +1,6 @@ +# stub-only module +sqlalchemy.dbapi + # wrong argument name in implementation ("self" instead of "cls") sqlalchemy.engine.URL.__new__ sqlalchemy.engine.url.URL.__new__ @@ -103,6 +106,16 @@ sqlalchemy.orm.strategy_options.Load.undefer sqlalchemy.orm.strategy_options.Load.undefer_group sqlalchemy.orm.strategy_options.Load.with_expression +# abstract fields not present at runtime +sqlalchemy.engine.Engine.logging_name # initialized to None +sqlalchemy.engine.Transaction.is_active +sqlalchemy.engine.base.Engine.logging_name # initialized to None +sqlalchemy.engine.base.Transaction.is_active + +# initialized to None during class construction, but overridden during __init__() +sqlalchemy.engine.Connection.engine +sqlalchemy.engine.base.Connection.engine + # unclear problems sqlalchemy.sql.elements.quoted_name.lower sqlalchemy.sql.elements.quoted_name.upper diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/base.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/base.pyi index d6764ab69e2c..e3fde5239f78 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/base.pyi @@ -75,7 +75,7 @@ class FBIdentifierPreparer(sql.compiler.IdentifierPreparer): class FBExecutionContext(default.DefaultExecutionContext): def fire_sequence(self, seq, type_): ... -class FBDialect(default.DefaultDialect): +class FBDialect(default.DefaultDialect): # type: ignore[misc] name: str supports_statement_cache: bool max_identifier_length: int diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/fdb.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/fdb.pyi index 4bc56c5a6659..d7d62208b836 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/fdb.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/fdb.pyi @@ -1,6 +1,6 @@ from .kinterbasdb import FBDialect_kinterbasdb -class FBDialect_fdb(FBDialect_kinterbasdb): +class FBDialect_fdb(FBDialect_kinterbasdb): # type: ignore[misc] supports_statement_cache: bool def __init__(self, enable_rowcount: bool = ..., retaining: bool = ..., **kwargs) -> None: ... @classmethod diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/kinterbasdb.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/kinterbasdb.pyi index a46e1c36198a..dea0e61a0a28 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/kinterbasdb.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/kinterbasdb.pyi @@ -13,7 +13,7 @@ class FBExecutionContext_kinterbasdb(FBExecutionContext): @property def rowcount(self): ... -class FBDialect_kinterbasdb(FBDialect): +class FBDialect_kinterbasdb(FBDialect): # type: ignore[misc] driver: str supports_statement_cache: bool supports_sane_rowcount: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/base.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/base.pyi index b1c24b256dfd..f219b41e9c06 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/base.pyi @@ -255,7 +255,7 @@ class MSIdentifierPreparer(compiler.IdentifierPreparer): def __init__(self, dialect) -> None: ... def quote_schema(self, schema, force: Any | None = ...): ... -class MSDialect(default.DefaultDialect): +class MSDialect(default.DefaultDialect): # type: ignore[misc] name: str supports_statement_cache: bool supports_default_values: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/mxodbc.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/mxodbc.pyi index bddc1929a4b9..9bb6657573bc 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/mxodbc.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/mxodbc.pyi @@ -17,7 +17,7 @@ class _VARBINARY_mxodbc(VARBINARY): class MSExecutionContext_mxodbc(MSExecutionContext_pyodbc): ... -class MSDialect_mxodbc(MxODBCConnector, MSDialect): +class MSDialect_mxodbc(MxODBCConnector, MSDialect): # type: ignore[misc] supports_statement_cache: bool colspecs: Any description_encoding: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pymssql.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pymssql.pyi index b16a0b4f729f..ad366b87f50c 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pymssql.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pymssql.pyi @@ -9,7 +9,7 @@ class _MSNumeric_pymssql(Numeric): class MSIdentifierPreparer_pymssql(MSIdentifierPreparer): def __init__(self, dialect) -> None: ... -class MSDialect_pymssql(MSDialect): +class MSDialect_pymssql(MSDialect): # type: ignore[misc] supports_statement_cache: bool supports_native_decimal: bool driver: str diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pyodbc.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pyodbc.pyi index 907824cea6f3..8940a501fb12 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pyodbc.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pyodbc.pyi @@ -29,7 +29,7 @@ class MSExecutionContext_pyodbc(MSExecutionContext): def pre_exec(self) -> None: ... def post_exec(self) -> None: ... -class MSDialect_pyodbc(PyODBCConnector, MSDialect): +class MSDialect_pyodbc(PyODBCConnector, MSDialect): # type: ignore[misc] supports_statement_cache: bool supports_sane_rowcount_returning: bool colspecs: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/aiomysql.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/aiomysql.pyi index 4021fd9061ba..5127906ff231 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/aiomysql.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/aiomysql.pyi @@ -57,7 +57,7 @@ class AsyncAdapt_aiomysql_dbapi: def __init__(self, aiomysql, pymysql) -> None: ... def connect(self, *arg, **kw): ... -class MySQLDialect_aiomysql(MySQLDialect_pymysql): +class MySQLDialect_aiomysql(MySQLDialect_pymysql): # type: ignore[misc] driver: str supports_statement_cache: bool supports_server_side_cursors: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/asyncmy.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/asyncmy.pyi index 6c37f8d5ab16..f4afbefb0acc 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/asyncmy.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/asyncmy.pyi @@ -57,7 +57,7 @@ class AsyncAdapt_asyncmy_dbapi: def __init__(self, asyncmy, pymysql) -> None: ... def connect(self, *arg, **kw): ... -class MySQLDialect_asyncmy(MySQLDialect_pymysql): +class MySQLDialect_asyncmy(MySQLDialect_pymysql): # type: ignore[misc] driver: str supports_statement_cache: bool supports_server_side_cursors: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/base.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/base.pyi index a7b58f6ea754..6be9ef1a6fe7 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/base.pyi @@ -165,7 +165,7 @@ class MySQLIdentifierPreparer(compiler.IdentifierPreparer): class MariaDBIdentifierPreparer(MySQLIdentifierPreparer): reserved_words: Any -class MySQLDialect(default.DefaultDialect): +class MySQLDialect(default.DefaultDialect): # type: ignore[misc] logger: Any name: str supports_statement_cache: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/cymysql.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/cymysql.pyi index 408d931df22d..4cd50a243f8a 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/cymysql.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/cymysql.pyi @@ -6,7 +6,7 @@ from .mysqldb import MySQLDialect_mysqldb class _cymysqlBIT(BIT): def result_processor(self, dialect, coltype): ... -class MySQLDialect_cymysql(MySQLDialect_mysqldb): +class MySQLDialect_cymysql(MySQLDialect_mysqldb): # type: ignore[misc] driver: str supports_statement_cache: bool description_encoding: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadb.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadb.pyi index db8f5abd5f09..4ff76da4743e 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadb.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadb.pyi @@ -2,7 +2,7 @@ from typing import Any from .base import MySQLDialect -class MariaDBDialect(MySQLDialect): +class MariaDBDialect(MySQLDialect): # type: ignore[misc] is_mariadb: bool supports_statement_cache: bool name: str diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadbconnector.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadbconnector.pyi index 0735fb75a28e..6eeca171cf44 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadbconnector.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadbconnector.pyi @@ -10,7 +10,7 @@ class MySQLExecutionContext_mariadbconnector(MySQLExecutionContext): class MySQLCompiler_mariadbconnector(MySQLCompiler): ... -class MySQLDialect_mariadbconnector(MySQLDialect): +class MySQLDialect_mariadbconnector(MySQLDialect): # type: ignore[misc] driver: str supports_statement_cache: bool supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqlconnector.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqlconnector.pyi index df0a63589b1c..6fbbe91f9d1e 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqlconnector.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqlconnector.pyi @@ -13,7 +13,7 @@ class MySQLIdentifierPreparer_mysqlconnector(MySQLIdentifierPreparer): ... class _myconnpyBIT(BIT): def result_processor(self, dialect, coltype) -> None: ... -class MySQLDialect_mysqlconnector(MySQLDialect): +class MySQLDialect_mysqlconnector(MySQLDialect): # type: ignore[misc] driver: str supports_statement_cache: bool supports_unicode_binds: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqldb.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqldb.pyi index bb41d161da2f..747e7a485c0e 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqldb.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqldb.pyi @@ -9,7 +9,7 @@ class MySQLExecutionContext_mysqldb(MySQLExecutionContext): class MySQLCompiler_mysqldb(MySQLCompiler): ... -class MySQLDialect_mysqldb(MySQLDialect): +class MySQLDialect_mysqldb(MySQLDialect): # type: ignore[misc] driver: str supports_statement_cache: bool supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/oursql.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/oursql.pyi index 40d1d6919ccb..22d216749cec 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/oursql.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/oursql.pyi @@ -9,7 +9,7 @@ class MySQLExecutionContext_oursql(MySQLExecutionContext): @property def plain_query(self): ... -class MySQLDialect_oursql(MySQLDialect): +class MySQLDialect_oursql(MySQLDialect): # type: ignore[misc] driver: str supports_statement_cache: bool supports_unicode_binds: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pymysql.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pymysql.pyi index a4f6cb64fc48..939d82449285 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pymysql.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pymysql.pyi @@ -3,7 +3,7 @@ from typing import Any from ...util import memoized_property from .mysqldb import MySQLDialect_mysqldb -class MySQLDialect_pymysql(MySQLDialect_mysqldb): +class MySQLDialect_pymysql(MySQLDialect_mysqldb): # type: ignore[misc] driver: str supports_statement_cache: bool description_encoding: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pyodbc.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pyodbc.pyi index f9363c3cc0b0..f4dd295a0c6d 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pyodbc.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pyodbc.pyi @@ -10,7 +10,7 @@ class _pyodbcTIME(TIME): class MySQLExecutionContext_pyodbc(MySQLExecutionContext): def get_lastrowid(self): ... -class MySQLDialect_pyodbc(PyODBCConnector, MySQLDialect): +class MySQLDialect_pyodbc(PyODBCConnector, MySQLDialect): # type: ignore[misc] supports_statement_cache: bool colspecs: Any supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/base.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/base.pyi index 6b9668957b2b..223b06eba77a 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/base.pyi @@ -145,7 +145,7 @@ class OracleIdentifierPreparer(compiler.IdentifierPreparer): class OracleExecutionContext(default.DefaultExecutionContext): def fire_sequence(self, seq, type_): ... -class OracleDialect(default.DefaultDialect): +class OracleDialect(default.DefaultDialect): # type: ignore[misc] name: str supports_statement_cache: bool supports_alter: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/cx_oracle.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/cx_oracle.pyi index 05f26b87b3ee..34352478ec36 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/cx_oracle.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/cx_oracle.pyi @@ -80,7 +80,7 @@ class OracleExecutionContext_cx_oracle(OracleExecutionContext): def create_cursor(self): ... def get_out_parameter_values(self, out_param_names): ... -class OracleDialect_cx_oracle(OracleDialect): +class OracleDialect_cx_oracle(OracleDialect): # type: ignore[misc] supports_statement_cache: bool statement_compiler: Any supports_sane_rowcount: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/asyncpg.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/asyncpg.pyi index 217ab044bec6..22b44bbf8ea1 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/asyncpg.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/asyncpg.pyi @@ -165,7 +165,7 @@ class AsyncAdapt_asyncpg_dbapi: DATETIME: Any BINARY: Any -class PGDialect_asyncpg(PGDialect): +class PGDialect_asyncpg(PGDialect): # type: ignore[misc] driver: str supports_statement_cache: bool supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/base.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/base.pyi index 047d14bdc152..5606116c4bca 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/base.pyi @@ -230,7 +230,7 @@ class PGDeferrableConnectionCharacteristic(characteristics.ConnectionCharacteris def set_characteristic(self, dialect, dbapi_conn, value) -> None: ... def get_characteristic(self, dialect, dbapi_conn): ... -class PGDialect(default.DefaultDialect): +class PGDialect(default.DefaultDialect): # type: ignore[misc] name: str supports_statement_cache: bool supports_alter: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pg8000.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pg8000.pyi index fc60c10383d7..3e8e719b0351 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pg8000.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pg8000.pyi @@ -98,7 +98,7 @@ class PGCompiler_pg8000(PGCompiler): class PGIdentifierPreparer_pg8000(PGIdentifierPreparer): def __init__(self, *args, **kwargs) -> None: ... -class PGDialect_pg8000(PGDialect): +class PGDialect_pg8000(PGDialect): # type: ignore[misc] driver: str supports_statement_cache: bool supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2.pyi index 7a5fa9941133..39ab9e3e650b 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2.pyi @@ -46,7 +46,7 @@ EXECUTEMANY_BATCH: Any EXECUTEMANY_VALUES: Any EXECUTEMANY_VALUES_PLUS_BATCH: Any -class PGDialect_psycopg2(PGDialect): +class PGDialect_psycopg2(PGDialect): # type: ignore[misc] driver: str supports_statement_cache: bool supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2cffi.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2cffi.pyi index 4456b3294a70..86aa80ada1b5 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2cffi.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2cffi.pyi @@ -2,7 +2,7 @@ from typing import Any from .psycopg2 import PGDialect_psycopg2 -class PGDialect_psycopg2cffi(PGDialect_psycopg2): +class PGDialect_psycopg2cffi(PGDialect_psycopg2): # type: ignore[misc] driver: str supports_unicode_statements: bool supports_statement_cache: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pygresql.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pygresql.pyi index a6f0d861b361..c11c42822408 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pygresql.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pygresql.pyi @@ -31,7 +31,7 @@ class _PGCompiler(PGCompiler): class _PGIdentifierPreparer(PGIdentifierPreparer): ... -class PGDialect_pygresql(PGDialect): +class PGDialect_pygresql(PGDialect): # type: ignore[misc] driver: str supports_statement_cache: bool statement_compiler: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pypostgresql.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pypostgresql.pyi index 1b5bed220c5c..d63ec453d3b0 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pypostgresql.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pypostgresql.pyi @@ -11,7 +11,7 @@ class PGNumeric(sqltypes.Numeric): class PGExecutionContext_pypostgresql(PGExecutionContext): ... -class PGDialect_pypostgresql(PGDialect): +class PGDialect_pypostgresql(PGDialect): # type: ignore[misc] driver: str supports_statement_cache: bool supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/aiosqlite.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/aiosqlite.pyi index dfc3247d5ea1..e50c574cb016 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/aiosqlite.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/aiosqlite.pyi @@ -57,7 +57,7 @@ class AsyncAdapt_aiosqlite_dbapi: class SQLiteExecutionContext_aiosqlite(SQLiteExecutionContext): def create_server_side_cursor(self): ... -class SQLiteDialect_aiosqlite(SQLiteDialect_pysqlite): +class SQLiteDialect_aiosqlite(SQLiteDialect_pysqlite): # type: ignore[misc] driver: str supports_statement_cache: bool is_async: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/base.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/base.pyi index 31efadb6c920..0791ebd2414b 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/base.pyi @@ -92,7 +92,7 @@ class SQLiteIdentifierPreparer(compiler.IdentifierPreparer): class SQLiteExecutionContext(default.DefaultExecutionContext): ... -class SQLiteDialect(default.DefaultDialect): +class SQLiteDialect(default.DefaultDialect): # type: ignore[misc] name: str supports_alter: bool supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlcipher.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlcipher.pyi index cf2d8738ed15..6ba04f6fd631 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlcipher.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlcipher.pyi @@ -2,7 +2,7 @@ from typing import Any from .pysqlite import SQLiteDialect_pysqlite -class SQLiteDialect_pysqlcipher(SQLiteDialect_pysqlite): +class SQLiteDialect_pysqlcipher(SQLiteDialect_pysqlite): # type: ignore[misc] driver: str supports_statement_cache: bool pragmas: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlite.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlite.pyi index 5703abbdf573..24b1e8993a2f 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlite.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlite.pyi @@ -10,7 +10,7 @@ class _SQLite_pysqliteDate(DATE): def bind_processor(self, dialect): ... def result_processor(self, dialect, coltype): ... -class SQLiteDialect_pysqlite(SQLiteDialect): +class SQLiteDialect_pysqlite(SQLiteDialect): # type: ignore[misc] default_paramstyle: str supports_statement_cache: bool colspecs: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/base.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/base.pyi index 40d48d646b76..64f4cc166bd5 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/base.pyi @@ -103,7 +103,7 @@ class SybaseDDLCompiler(compiler.DDLCompiler): class SybaseIdentifierPreparer(compiler.IdentifierPreparer): reserved_words: Any -class SybaseDialect(default.DefaultDialect): +class SybaseDialect(default.DefaultDialect): # type: ignore[misc] name: str supports_unicode_statements: bool supports_sane_rowcount: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/mxodbc.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/mxodbc.pyi index 596496ea18f5..893a81a71de5 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/mxodbc.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/mxodbc.pyi @@ -3,7 +3,7 @@ from sqlalchemy.dialects.sybase.base import SybaseDialect, SybaseExecutionContex class SybaseExecutionContext_mxodbc(SybaseExecutionContext): ... -class SybaseDialect_mxodbc(MxODBCConnector, SybaseDialect): +class SybaseDialect_mxodbc(MxODBCConnector, SybaseDialect): # type: ignore[misc] supports_statement_cache: bool dialect = SybaseDialect_mxodbc diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/pyodbc.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/pyodbc.pyi index 3940f1f665e3..78e46f611c1f 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/pyodbc.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/pyodbc.pyi @@ -10,7 +10,7 @@ class _SybNumeric_pyodbc(sqltypes.Numeric): class SybaseExecutionContext_pyodbc(SybaseExecutionContext): def set_ddl_autocommit(self, connection, value) -> None: ... -class SybaseDialect_pyodbc(PyODBCConnector, SybaseDialect): +class SybaseDialect_pyodbc(PyODBCConnector, SybaseDialect): # type: ignore[misc] supports_statement_cache: bool colspecs: Any @classmethod diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/pysybase.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/pysybase.pyi index ae8c0591f00e..f7f13e69920e 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/pysybase.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/pysybase.pyi @@ -13,7 +13,7 @@ class SybaseExecutionContext_pysybase(SybaseExecutionContext): class SybaseSQLCompiler_pysybase(SybaseSQLCompiler): def bindparam_string(self, name, **kw): ... -class SybaseDialect_pysybase(SybaseDialect): +class SybaseDialect_pysybase(SybaseDialect): # type: ignore[misc] driver: str statement_compiler: Any supports_statement_cache: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi index 95ae24fdb542..2a22d810357c 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi @@ -2,7 +2,7 @@ from collections.abc import Mapping from types import TracebackType from typing import Any, Callable, TypeVar, overload -from .. import log +from ..log import Identified, echo_property from ..dbapi import DBAPIConnection from ..pool import Pool from ..sql.compiler import Compiled @@ -138,12 +138,12 @@ class TwoPhaseTransaction(RootTransaction): def __init__(self, connection: Connection, xid) -> None: ... def prepare(self) -> None: ... -class Engine(Connectable, log.Identified): +class Engine(Connectable, Identified): pool: Pool url: str dialect: Dialect logging_name: str # only exists if not None during initialization - echo: bool | None + echo: echo_property hide_parameters: bool def __init__( self, diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/default.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/default.pyi index a461b5f5ac83..9e521bbb6b16 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/default.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/default.pyi @@ -1,4 +1,4 @@ -from typing import Any, ClassVar, Type +from typing import Any, ClassVar from .. import types as sqltypes from ..util import memoized_property @@ -12,8 +12,8 @@ CACHING_DISABLED: Any NO_CACHE_KEY: Any NO_DIALECT_SUPPORT: Any -class DefaultDialect(interfaces.Dialect): - execution_ctx_cls: ClassVar[Type[interfaces.ExecutionContext]] +class DefaultDialect(interfaces.Dialect): # type: ignore[misc] + execution_ctx_cls: ClassVar[type[interfaces.ExecutionContext]] statement_compiler: Any ddl_compiler: Any type_compiler: Any @@ -146,7 +146,7 @@ class _StrDateTime(_RendersLiteral, sqltypes.DateTime): ... class _StrDate(_RendersLiteral, sqltypes.Date): ... class _StrTime(_RendersLiteral, sqltypes.Time): ... -class StrCompileDialect(DefaultDialect): +class StrCompileDialect(DefaultDialect): # type: ignore[misc] statement_compiler: Any ddl_compiler: Any type_compiler: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi index 864d5d076a8a..df4a11718d15 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi @@ -1,6 +1,6 @@ from abc import abstractmethod from collections.abc import Callable, Collection, Mapping -from typing import Any, overload +from typing import Any, ClassVar, overload from ..dbapi import DBAPIConnection, DBAPICursor from ..exc import StatementError @@ -25,7 +25,7 @@ class Dialect: server_version_info: tuple[Any, ...] # Only available on supporting dialects: # default_schema_name: str - execution_ctx_cls: ExecutionContext + execution_ctx_cls: ClassVar[type[ExecutionContext]] execute_sequence_format: type[tuple[Any] | list[Any]] preparer: IdentifierPreparer supports_alter: bool From 778b880dee9b9fc4bc9719f24f73487d37e4f845 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 24 Dec 2021 15:36:35 +0000 Subject: [PATCH 05/22] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stubs/SQLAlchemy/sqlalchemy/engine/base.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi index 2a22d810357c..5096297d1570 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi @@ -2,8 +2,8 @@ from collections.abc import Mapping from types import TracebackType from typing import Any, Callable, TypeVar, overload -from ..log import Identified, echo_property from ..dbapi import DBAPIConnection +from ..log import Identified, echo_property from ..pool import Pool from ..sql.compiler import Compiled from ..sql.ddl import DDLElement From ddf3daad1280f38533424ad5ed189f09d2beca4d Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Fri, 24 Dec 2021 16:42:48 +0100 Subject: [PATCH 06/22] Use Self --- stubs/SQLAlchemy/sqlalchemy/engine/base.pyi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi index 5096297d1570..bdbf980b6561 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi @@ -1,3 +1,4 @@ +from _typeshed import Self from collections.abc import Mapping from types import TracebackType from typing import Any, Callable, TypeVar, overload @@ -33,7 +34,7 @@ class Connection(Connectable): _allow_revalidate: bool = ..., ) -> None: ... def schema_for_object(self, obj) -> str: ... - def __enter__(self) -> Connection: ... + def __enter__(self: Self) -> Self: ... def __exit__( self, type_: type[BaseException] | None, value: BaseException | None, traceback: TracebackType | None ) -> None: ... From 9c20df94cb81f119f37166790f50e95c3472c187 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Fri, 24 Dec 2021 16:51:47 +0100 Subject: [PATCH 07/22] Mark methods with @abstractmethod --- .../SQLAlchemy/@tests/stubtest_allowlist.txt | 6 ++++-- stubs/SQLAlchemy/sqlalchemy/engine/base.pyi | 21 ++++++++++++++----- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/stubs/SQLAlchemy/@tests/stubtest_allowlist.txt b/stubs/SQLAlchemy/@tests/stubtest_allowlist.txt index 91d0e8351c72..3284177f4448 100644 --- a/stubs/SQLAlchemy/@tests/stubtest_allowlist.txt +++ b/stubs/SQLAlchemy/@tests/stubtest_allowlist.txt @@ -28,6 +28,8 @@ sqlalchemy.testing.util.resolve_lambda sqlalchemy.util.WeakSequence.__init__ # not always present +sqlalchemy.engine.Engine.logging_name # initialized if not None +sqlalchemy.engine.base.Engine.logging_name # initialized if not None sqlalchemy.testing.util.non_refcount_gc_collect # replaced at runtime @@ -107,9 +109,9 @@ sqlalchemy.orm.strategy_options.Load.undefer_group sqlalchemy.orm.strategy_options.Load.with_expression # abstract fields not present at runtime -sqlalchemy.engine.Engine.logging_name # initialized to None +sqlalchemy.engine.Transaction.connection sqlalchemy.engine.Transaction.is_active -sqlalchemy.engine.base.Engine.logging_name # initialized to None +sqlalchemy.engine.base.Transaction.connection sqlalchemy.engine.base.Transaction.is_active # initialized to None during class construction, but overridden during __init__() diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi index bdbf980b6561..ccee4bf4f13a 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi @@ -1,4 +1,5 @@ from _typeshed import Self +from abc import abstractmethod from collections.abc import Mapping from types import TracebackType from typing import Any, Callable, TypeVar, overload @@ -116,7 +117,6 @@ class ExceptionContextImpl(ExceptionContext): invalidate_pool_on_disconnect, ) -> None: ... -# Abstract base class, non-instantiable class Transaction(TransactionalContext): def __init__(self, connection: Connection) -> None: ... @property @@ -126,13 +126,24 @@ class Transaction(TransactionalContext): def commit(self) -> None: ... # The following field are technically not defined on Transaction, but on # all sub-classes. - connection: Connection + @abstractmethod + @property + def connection(self) -> Connection: ... + @abstractmethod @property def is_active(self) -> bool: ... -class MarkerTransaction(Transaction): ... -class RootTransaction(Transaction): ... -class NestedTransaction(Transaction): ... +class MarkerTransaction(Transaction): + connection: Connection + is_active: bool + +class RootTransaction(Transaction): + connection: Connection + is_active: bool + +class NestedTransaction(Transaction): + connection: Connection + is_active: bool class TwoPhaseTransaction(RootTransaction): xid: Any From d80be6b0e338d62a0b9bb89852a99543da2199b5 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Fri, 24 Dec 2021 16:53:06 +0100 Subject: [PATCH 08/22] MarkerTransaction.is_active is a property --- stubs/SQLAlchemy/sqlalchemy/engine/base.pyi | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi index ccee4bf4f13a..be857a5335d7 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi @@ -135,7 +135,8 @@ class Transaction(TransactionalContext): class MarkerTransaction(Transaction): connection: Connection - is_active: bool + @property + def is_active(self) -> bool: ... class RootTransaction(Transaction): connection: Connection From a020f64c498c837b06151895a4568c6c34d4349a Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Fri, 24 Dec 2021 16:58:54 +0100 Subject: [PATCH 09/22] Fix decorator order --- stubs/SQLAlchemy/sqlalchemy/engine/base.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi index be857a5335d7..191d1df36497 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi @@ -126,11 +126,11 @@ class Transaction(TransactionalContext): def commit(self) -> None: ... # The following field are technically not defined on Transaction, but on # all sub-classes. - @abstractmethod @property - def connection(self) -> Connection: ... @abstractmethod + def connection(self) -> Connection: ... @property + @abstractmethod def is_active(self) -> bool: ... class MarkerTransaction(Transaction): From 0c3450eda45574d6d8a4b33f4a218e603276d746 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Sun, 2 Jan 2022 16:33:47 +0100 Subject: [PATCH 10/22] Remove None from return type of begin() --- stubs/SQLAlchemy/sqlalchemy/engine/base.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi index 191d1df36497..4d05904e7361 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi @@ -55,7 +55,7 @@ class Connection(Connectable): def connect(self, close_with_result: bool = ...): ... # type: ignore[override] def invalidate(self, exception: Exception | None = ...) -> None: ... def detach(self) -> None: ... - def begin(self) -> Transaction | None: ... + def begin(self) -> Transaction: ... def begin_nested(self) -> Transaction | None: ... def begin_twophase(self, xid: Any | None = ...) -> TwoPhaseTransaction: ... def recover_twophase(self): ... From 02de73a7f279ea7f375b56d4d0b57405d2e1c8af Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Sun, 2 Jan 2022 16:36:42 +0100 Subject: [PATCH 11/22] Remove None from return type of transaction() --- stubs/SQLAlchemy/sqlalchemy/engine/base.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi index 4d05904e7361..2276ff93fa54 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi @@ -87,8 +87,8 @@ class Connection(Connectable): def execute(self, statement: str, *multiparams: Any | tuple[Any, ...] | Mapping[str, Any], **params) -> CursorResult: ... def exec_driver_sql(self, statement: str, parameters: Any | None = ..., execution_options: Any | None = ...): ... # TODO: - # def transaction(self, callable_: Callable[Concatenate[Connection, _P], _T], *args: _P.args, **kwargs: _P.kwargs) -> _T | None: ... - def transaction(self, callable_: Callable[..., _T], *args: Any, **kwargs: Any) -> _T | None: ... + # def transaction(self, callable_: Callable[Concatenate[Connection, _P], _T], *args: _P.args, **kwargs: _P.kwargs) -> _T: ... + def transaction(self, callable_: Callable[..., _T], *args: Any, **kwargs: Any) -> _T: ... # TODO: # def run_callable(self, callable_: Callable[Concatenate[Connection, _P], _T], *args: _P.args, **kwargs: _P.kwargs) -> _T: ... def run_callable(self, callable_: Callable[..., _T], *args: Any, **kwargs: Any) -> _T: ... From a0b38c88631e7bf527f5e9065cdc604ebc55214b Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Sun, 2 Jan 2022 16:41:45 +0100 Subject: [PATCH 12/22] Use _EchoFlag for echo argument/field --- stubs/SQLAlchemy/sqlalchemy/engine/base.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi index 2276ff93fa54..ebc8ae3ac790 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi @@ -5,7 +5,7 @@ from types import TracebackType from typing import Any, Callable, TypeVar, overload from ..dbapi import DBAPIConnection -from ..log import Identified, echo_property +from ..log import Identified, _EchoFlag from ..pool import Pool from ..sql.compiler import Compiled from ..sql.ddl import DDLElement @@ -156,7 +156,7 @@ class Engine(Connectable, Identified): url: str dialect: Dialect logging_name: str # only exists if not None during initialization - echo: echo_property + echo: _EchoFlag hide_parameters: bool def __init__( self, @@ -164,7 +164,7 @@ class Engine(Connectable, Identified): dialect: Dialect, url: str, logging_name: str | None = ..., - echo: bool | None = ..., + echo: _EchoFlag = ..., query_cache_size: int = ..., execution_options: Mapping[str, Any] | None = ..., hide_parameters: bool = ..., From 75d9f1a7bdafb8f3abdfc2d0e169a24e93d86427 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Sun, 2 Jan 2022 16:46:53 +0100 Subject: [PATCH 13/22] Use echo_property --- stubs/SQLAlchemy/sqlalchemy/engine/base.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi index ebc8ae3ac790..1f185dcbcc77 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi @@ -5,7 +5,7 @@ from types import TracebackType from typing import Any, Callable, TypeVar, overload from ..dbapi import DBAPIConnection -from ..log import Identified, _EchoFlag +from ..log import Identified, _EchoFlag, echo_property from ..pool import Pool from ..sql.compiler import Compiled from ..sql.ddl import DDLElement @@ -156,7 +156,7 @@ class Engine(Connectable, Identified): url: str dialect: Dialect logging_name: str # only exists if not None during initialization - echo: _EchoFlag + echo: echo_property hide_parameters: bool def __init__( self, From 0c659738b5933576bf358417b481e03dbccee74d Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Sat, 8 Jan 2022 13:44:31 +0100 Subject: [PATCH 14/22] Address review feedback --- stubs/SQLAlchemy/sqlalchemy/engine/base.pyi | 21 +++++++++++-------- stubs/SQLAlchemy/sqlalchemy/engine/create.pyi | 2 -- .../sqlalchemy/engine/interfaces.pyi | 3 ++- stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi | 3 ++- stubs/SQLAlchemy/sqlalchemy/engine/result.pyi | 4 ++-- stubs/SQLAlchemy/sqlalchemy/future/engine.pyi | 1 - 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi index 1f185dcbcc77..a09bcbe3f7a4 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi @@ -14,10 +14,13 @@ from ..sql.functions import FunctionElement from ..sql.schema import DefaultGenerator from .cursor import CursorResult from .interfaces import Connectable as Connectable, Dialect, ExceptionContext +from .url import URL from .util import TransactionalContext _T = TypeVar("_T") +_Executable = ClauseElement | FunctionElement | DDLElement | DefaultGenerator | Compiled + class Connection(Connectable): engine: Engine dialect: Dialect @@ -34,7 +37,7 @@ class Connection(Connectable): _has_events: Any | None = ..., _allow_revalidate: bool = ..., ) -> None: ... - def schema_for_object(self, obj) -> str: ... + def schema_for_object(self, obj) -> str | None: ... def __enter__(self: Self) -> Self: ... def __exit__( self, type_: type[BaseException] | None, value: BaseException | None, traceback: TracebackType | None @@ -69,7 +72,7 @@ class Connection(Connectable): @overload def scalar( self, - object_: ClauseElement | FunctionElement | DDLElement | DefaultGenerator | Compiled, + object_: _Executable, *multiparams: Mapping[str, Any], **params: Any, ) -> Any: ... @@ -79,7 +82,7 @@ class Connection(Connectable): @overload # type: ignore[override] def execute( self, - statement: ClauseElement | FunctionElement | DDLElement | DefaultGenerator | Compiled, + statement: _Executable, *multiparams: Mapping[str, Any], **params, ) -> CursorResult: ... @@ -153,7 +156,7 @@ class TwoPhaseTransaction(RootTransaction): class Engine(Connectable, Identified): pool: Pool - url: str + url: URL dialect: Dialect logging_name: str # only exists if not None during initialization echo: echo_property @@ -162,7 +165,7 @@ class Engine(Connectable, Identified): self, pool: Pool, dialect: Dialect, - url: str, + url: str | URL, logging_name: str | None = ..., echo: _EchoFlag = ..., query_cache_size: int = ..., @@ -199,7 +202,7 @@ class Engine(Connectable, Identified): @overload # type: ignore[override] def execute( self, - statement: ClauseElement | FunctionElement | DDLElement | DefaultGenerator | Compiled, + statement: _Executable, *multiparams: Mapping[str, Any], **params: Any, ) -> CursorResult: ... @@ -208,7 +211,7 @@ class Engine(Connectable, Identified): @overload # type: ignore[override] def scalar( self, - statement: ClauseElement | FunctionElement | DDLElement | DefaultGenerator | Compiled, + statement: _Executable, *multiparams: Mapping[str, Any], **params: Any, ) -> Any: ... @@ -220,9 +223,9 @@ class Engine(Connectable, Identified): def raw_connection(self, _connection: Connection | None = ...) -> DBAPIConnection: ... class OptionEngineMixin: - url: str + url: URL dialect: Dialect - logging_name: str | None + logging_name: str echo: bool hide_parameters: bool dispatch: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/create.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/create.pyi index 59bc2c5319db..29404fe78edb 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/create.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/create.pyi @@ -14,7 +14,6 @@ def create_engine(url: URL | str, *, strategy: Literal["mock"], **kwargs) -> Moc def create_engine( url: URL | str, *, - empty_in_strategy: object | None = ..., module: Any | None = ..., enable_from_linting: bool = ..., future: Literal[True], @@ -24,7 +23,6 @@ def create_engine( def create_engine( url: URL | str, *, - empty_in_strategy: object | None = ..., module: Any | None = ..., enable_from_linting: bool = ..., future: Literal[False] = ..., diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi index df4a11718d15..583426bfcdfb 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi @@ -121,7 +121,8 @@ class Dialect: def do_execute_no_params(self, cursor, statement, parameters, context: Any | None = ...) -> None: ... @abstractmethod def is_disconnect(self, e, connection, cursor) -> None: ... - def connect(self, *cargs, **cparams) -> Callable[[DBAPIConnection], object] | None: ... + @abstractmethod + def connect(self, *cargs, **cparams) -> DBAPIConnection: ... def on_connect_url(self, url) -> Callable[[DBAPIConnection], object] | None: ... def on_connect(self) -> Callable[[DBAPIConnection], object] | None: ... @abstractmethod diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi index 510cc4e4b808..b2b258337679 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi @@ -8,6 +8,7 @@ from ..sql.ddl import DDLElement from ..sql.elements import ClauseElement from ..sql.functions import FunctionElement from ..sql.schema import DefaultGenerator +from .base import _Executable from .cursor import CursorResult from .interfaces import Connectable, Dialect from .url import URL @@ -30,7 +31,7 @@ class MockConnection(Connectable): @overload def execute( self, - object_: ClauseElement | FunctionElement | DDLElement | DefaultGenerator | Compiled, + object_: _Executable, *multiparams: Mapping[str, Any], **params: Any, ) -> CursorResult: ... diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/result.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/result.pyi index 742ac5023916..8aab5bc9de15 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/result.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/result.pyi @@ -1,4 +1,4 @@ -from collections.abc import KeysView +from collections.abc import Generator, KeysView from typing import Any from ..sql.base import InPlaceGenerative @@ -43,7 +43,7 @@ class Result(_WithKeys, ResultInternal): def mappings(self) -> MappingResult: ... def __iter__(self): ... def __next__(self): ... - def partitions(self, size: int | None = ...) -> None: ... + def partitions(self, size: int | None = ...) -> Generator[Any, None, None]: ... def fetchall(self) -> list[Any]: ... def fetchone(self) -> Any | None: ... def fetchmany(self, size: int | None = ...) -> list[Any]: ... diff --git a/stubs/SQLAlchemy/sqlalchemy/future/engine.pyi b/stubs/SQLAlchemy/sqlalchemy/future/engine.pyi index f8c9de7d760c..6e973da3557a 100644 --- a/stubs/SQLAlchemy/sqlalchemy/future/engine.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/future/engine.pyi @@ -14,7 +14,6 @@ def create_engine(url: URL | str, *, strategy: Literal["mock"], **kwargs) -> Moc def create_engine( url: URL | str, *, - empty_in_strategy: object | None = ..., module: Any | None = ..., enable_from_linting: bool = ..., future: bool = ..., From d79ca775ef7ab6e4746291bc69c221a7f522c659 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 8 Jan 2022 12:46:41 +0000 Subject: [PATCH 15/22] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stubs/SQLAlchemy/sqlalchemy/engine/base.pyi | 28 +++---------------- stubs/SQLAlchemy/sqlalchemy/engine/create.pyi | 14 ++-------- stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi | 7 +---- stubs/SQLAlchemy/sqlalchemy/future/engine.pyi | 7 +---- 4 files changed, 8 insertions(+), 48 deletions(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi index a09bcbe3f7a4..2ef9be686156 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/base.pyi @@ -70,22 +70,12 @@ class Connection(Connectable): def get_nested_transaction(self) -> Transaction | None: ... def close(self) -> None: ... @overload - def scalar( - self, - object_: _Executable, - *multiparams: Mapping[str, Any], - **params: Any, - ) -> Any: ... + def scalar(self, object_: _Executable, *multiparams: Mapping[str, Any], **params: Any) -> Any: ... @overload def scalar(self, object_: str, *multiparams: Any | tuple[Any, ...] | Mapping[str, Any], **params: Any) -> Any: ... def scalars(self, object_, *multiparams, **params): ... @overload # type: ignore[override] - def execute( - self, - statement: _Executable, - *multiparams: Mapping[str, Any], - **params, - ) -> CursorResult: ... + def execute(self, statement: _Executable, *multiparams: Mapping[str, Any], **params) -> CursorResult: ... @overload def execute(self, statement: str, *multiparams: Any | tuple[Any, ...] | Mapping[str, Any], **params) -> CursorResult: ... def exec_driver_sql(self, statement: str, parameters: Any | None = ..., execution_options: Any | None = ...): ... @@ -200,21 +190,11 @@ class Engine(Connectable, Identified): # def run_callable(self, callable_: Callable[Concatenate[Connection, _P], _T], *args: _P.args, **kwargs: _P.kwargs) -> _T: ... def run_callable(self, callable_: Callable[..., _T], *args: Any, **kwargs: Any) -> _T: ... @overload # type: ignore[override] - def execute( - self, - statement: _Executable, - *multiparams: Mapping[str, Any], - **params: Any, - ) -> CursorResult: ... + def execute(self, statement: _Executable, *multiparams: Mapping[str, Any], **params: Any) -> CursorResult: ... @overload def execute(self, statement: str, *multiparams: Any | tuple[Any, ...] | Mapping[str, Any], **params: Any) -> CursorResult: ... @overload # type: ignore[override] - def scalar( - self, - statement: _Executable, - *multiparams: Mapping[str, Any], - **params: Any, - ) -> Any: ... + def scalar(self, statement: _Executable, *multiparams: Mapping[str, Any], **params: Any) -> Any: ... @overload def scalar(self, statement: str, *multiparams: Any | tuple[Any, ...] | Mapping[str, Any], **params: Any) -> Any: ... def connect(self, close_with_result: bool = ...) -> Connection: ... # type: ignore[override] diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/create.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/create.pyi index 29404fe78edb..40c6b29fd63a 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/create.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/create.pyi @@ -12,20 +12,10 @@ from .url import URL def create_engine(url: URL | str, *, strategy: Literal["mock"], **kwargs) -> MockConnection: ... # type: ignore[misc] @overload def create_engine( - url: URL | str, - *, - module: Any | None = ..., - enable_from_linting: bool = ..., - future: Literal[True], - **kwargs, + url: URL | str, *, module: Any | None = ..., enable_from_linting: bool = ..., future: Literal[True], **kwargs ) -> FutureEngine: ... @overload def create_engine( - url: URL | str, - *, - module: Any | None = ..., - enable_from_linting: bool = ..., - future: Literal[False] = ..., - **kwargs, + url: URL | str, *, module: Any | None = ..., enable_from_linting: bool = ..., future: Literal[False] = ..., **kwargs ) -> Engine: ... def engine_from_config(configuration: Mapping[str, Any], prefix: str = ..., **kwargs) -> Engine: ... diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi index b2b258337679..b45dcb383e71 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi @@ -29,12 +29,7 @@ class MockConnection(Connectable): def drop(self, entity, **kwargs) -> None: ... @abstractmethod @overload - def execute( - self, - object_: _Executable, - *multiparams: Mapping[str, Any], - **params: Any, - ) -> CursorResult: ... + def execute(self, object_: _Executable, *multiparams: Mapping[str, Any], **params: Any) -> CursorResult: ... @abstractmethod @overload def execute(self, object_: str, *multiparams: Any | tuple[Any, ...] | Mapping[str, Any], **params: Any) -> CursorResult: ... diff --git a/stubs/SQLAlchemy/sqlalchemy/future/engine.pyi b/stubs/SQLAlchemy/sqlalchemy/future/engine.pyi index 6e973da3557a..bd4ff1dfaf1a 100644 --- a/stubs/SQLAlchemy/sqlalchemy/future/engine.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/future/engine.pyi @@ -12,12 +12,7 @@ NO_OPTIONS: Any def create_engine(url: URL | str, *, strategy: Literal["mock"], **kwargs) -> MockConnection: ... # type: ignore[misc] @overload def create_engine( - url: URL | str, - *, - module: Any | None = ..., - enable_from_linting: bool = ..., - future: bool = ..., - **kwargs, + url: URL | str, *, module: Any | None = ..., enable_from_linting: bool = ..., future: bool = ..., **kwargs ) -> Engine: ... class Connection(_LegacyConnection): From 8989e5461dff041e5f35ae67d790caefa650ab3b Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Sat, 8 Jan 2022 13:48:37 +0100 Subject: [PATCH 16/22] Remove unused imports --- stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi | 5 ----- 1 file changed, 5 deletions(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi index b45dcb383e71..dc685760d8c0 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/mock.pyi @@ -3,11 +3,6 @@ from abc import abstractmethod from collections.abc import Mapping from typing import Any, overload -from ..sql.compiler import Compiled -from ..sql.ddl import DDLElement -from ..sql.elements import ClauseElement -from ..sql.functions import FunctionElement -from ..sql.schema import DefaultGenerator from .base import _Executable from .cursor import CursorResult from .interfaces import Connectable, Dialect From 2f759574a5c2a4d1708a9b989b80be3bb0baa632 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Sat, 8 Jan 2022 14:03:06 +0100 Subject: [PATCH 17/22] Remove @abstractmethod markers --- .../sqlalchemy/engine/interfaces.pyi | 55 ++----------------- 1 file changed, 6 insertions(+), 49 deletions(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi index 583426bfcdfb..241f637d7557 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi @@ -45,101 +45,58 @@ class Dialect: supports_statement_cache: bool @abstractmethod def create_connect_args(self, url: URL) -> None: ... - @abstractmethod + def initialize(self, connection) -> None: ... + def on_connect_url(self, url) -> Callable[[DBAPIConnection], object] | None: ... + def on_connect(self) -> Callable[[DBAPIConnection], object] | None: ... + # The following methods all raise NotImplementedError, but not all + # dialects implement all methods, which is why they can't be marked + # as abstract. @classmethod def type_descriptor(cls, typeobj) -> None: ... - def initialize(self, connection) -> None: ... - @abstractmethod def get_columns(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... - @abstractmethod def get_pk_constraint(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... - @abstractmethod def get_foreign_keys(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... - @abstractmethod def get_table_names(self, connection, schema: Any | None = ..., **kw) -> None: ... - @abstractmethod def get_temp_table_names(self, connection, schema: Any | None = ..., **kw) -> None: ... - @abstractmethod def get_view_names(self, connection, schema: Any | None = ..., **kw) -> None: ... - @abstractmethod def get_sequence_names(self, connection, schema: Any | None = ..., **kw) -> None: ... - @abstractmethod def get_temp_view_names(self, connection, schema: Any | None = ..., **kw) -> None: ... - @abstractmethod def get_view_definition(self, connection, view_name, schema: Any | None = ..., **kw) -> None: ... - @abstractmethod def get_indexes(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... - @abstractmethod def get_unique_constraints(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... - @abstractmethod def get_check_constraints(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... - @abstractmethod def get_table_comment(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... - @abstractmethod def normalize_name(self, name) -> None: ... - @abstractmethod def denormalize_name(self, name) -> None: ... - @abstractmethod def has_table(self, connection, table_name, schema: Any | None = ..., **kw) -> None: ... - @abstractmethod def has_index(self, connection, table_name, index_name, schema: Any | None = ...) -> None: ... - @abstractmethod def has_sequence(self, connection, sequence_name, schema: Any | None = ..., **kw) -> None: ... - @abstractmethod def do_begin(self, dbapi_connection) -> None: ... - @abstractmethod def do_rollback(self, dbapi_connection) -> None: ... - @abstractmethod def do_commit(self, dbapi_connection) -> None: ... - @abstractmethod def do_close(self, dbapi_connection) -> None: ... - @abstractmethod def do_set_input_sizes(self, cursor, list_of_tuples, context) -> None: ... - @abstractmethod def create_xid(self) -> None: ... - @abstractmethod def do_savepoint(self, connection, name) -> None: ... - @abstractmethod def do_rollback_to_savepoint(self, connection, name) -> None: ... - @abstractmethod def do_release_savepoint(self, connection, name) -> None: ... - @abstractmethod def do_begin_twophase(self, connection, xid) -> None: ... - @abstractmethod def do_prepare_twophase(self, connection, xid) -> None: ... - @abstractmethod def do_rollback_twophase(self, connection, xid, is_prepared: bool = ..., recover: bool = ...) -> None: ... - @abstractmethod def do_commit_twophase(self, connection, xid, is_prepared: bool = ..., recover: bool = ...) -> None: ... - @abstractmethod def do_recover_twophase(self, connection) -> None: ... - @abstractmethod def do_executemany(self, cursor, statement, parameters, context: Any | None = ...) -> None: ... - @abstractmethod def do_execute(self, cursor, statement, parameters, context: Any | None = ...) -> None: ... - @abstractmethod def do_execute_no_params(self, cursor, statement, parameters, context: Any | None = ...) -> None: ... - @abstractmethod def is_disconnect(self, e, connection, cursor) -> None: ... - @abstractmethod def connect(self, *cargs, **cparams) -> DBAPIConnection: ... - def on_connect_url(self, url) -> Callable[[DBAPIConnection], object] | None: ... - def on_connect(self) -> Callable[[DBAPIConnection], object] | None: ... - @abstractmethod def reset_isolation_level(self, dbapi_conn) -> None: ... - @abstractmethod def set_isolation_level(self, dbapi_conn, level) -> None: ... - @abstractmethod def get_isolation_level(self, dbapi_conn) -> None: ... - @abstractmethod def get_default_isolation_level(self, dbapi_conn) -> None: ... - @classmethod def get_dialect_cls(cls, url): ... - @classmethod def load_provisioning(cls) -> None: ... - @classmethod def engine_created(cls, engine) -> None: ... - @abstractmethod def get_driver_connection(self, connection) -> None: ... class CreateEnginePlugin: From c956a553deed42f88311a58873e3d52bbcf521b6 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Sat, 8 Jan 2022 14:05:18 +0100 Subject: [PATCH 18/22] Remove unnecessary type ignores --- stubs/SQLAlchemy/sqlalchemy/dialects/firebird/base.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/firebird/fdb.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/firebird/kinterbasdb.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mssql/base.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mssql/mxodbc.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pymssql.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pyodbc.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mysql/aiomysql.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mysql/asyncmy.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mysql/base.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mysql/cymysql.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mysql/enumerated.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadb.pyi | 2 +- .../SQLAlchemy/sqlalchemy/dialects/mysql/mariadbconnector.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqlconnector.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqldb.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mysql/oursql.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pymysql.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pyodbc.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mysql/types.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/oracle/base.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/oracle/cx_oracle.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/asyncpg.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/base.pyi | 4 ++-- stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pg8000.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2.pyi | 2 +- .../sqlalchemy/dialects/postgresql/psycopg2cffi.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pygresql.pyi | 2 +- .../sqlalchemy/dialects/postgresql/pypostgresql.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/aiosqlite.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/base.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlcipher.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlite.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/sybase/base.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/sybase/mxodbc.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/sybase/pysybase.pyi | 2 +- 36 files changed, 37 insertions(+), 37 deletions(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/base.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/base.pyi index e3fde5239f78..d6764ab69e2c 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/base.pyi @@ -75,7 +75,7 @@ class FBIdentifierPreparer(sql.compiler.IdentifierPreparer): class FBExecutionContext(default.DefaultExecutionContext): def fire_sequence(self, seq, type_): ... -class FBDialect(default.DefaultDialect): # type: ignore[misc] +class FBDialect(default.DefaultDialect): name: str supports_statement_cache: bool max_identifier_length: int diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/fdb.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/fdb.pyi index d7d62208b836..4bc56c5a6659 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/fdb.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/fdb.pyi @@ -1,6 +1,6 @@ from .kinterbasdb import FBDialect_kinterbasdb -class FBDialect_fdb(FBDialect_kinterbasdb): # type: ignore[misc] +class FBDialect_fdb(FBDialect_kinterbasdb): supports_statement_cache: bool def __init__(self, enable_rowcount: bool = ..., retaining: bool = ..., **kwargs) -> None: ... @classmethod diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/kinterbasdb.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/kinterbasdb.pyi index dea0e61a0a28..a46e1c36198a 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/kinterbasdb.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/firebird/kinterbasdb.pyi @@ -13,7 +13,7 @@ class FBExecutionContext_kinterbasdb(FBExecutionContext): @property def rowcount(self): ... -class FBDialect_kinterbasdb(FBDialect): # type: ignore[misc] +class FBDialect_kinterbasdb(FBDialect): driver: str supports_statement_cache: bool supports_sane_rowcount: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/base.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/base.pyi index f219b41e9c06..b1c24b256dfd 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/base.pyi @@ -255,7 +255,7 @@ class MSIdentifierPreparer(compiler.IdentifierPreparer): def __init__(self, dialect) -> None: ... def quote_schema(self, schema, force: Any | None = ...): ... -class MSDialect(default.DefaultDialect): # type: ignore[misc] +class MSDialect(default.DefaultDialect): name: str supports_statement_cache: bool supports_default_values: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/mxodbc.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/mxodbc.pyi index 9bb6657573bc..bddc1929a4b9 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/mxodbc.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/mxodbc.pyi @@ -17,7 +17,7 @@ class _VARBINARY_mxodbc(VARBINARY): class MSExecutionContext_mxodbc(MSExecutionContext_pyodbc): ... -class MSDialect_mxodbc(MxODBCConnector, MSDialect): # type: ignore[misc] +class MSDialect_mxodbc(MxODBCConnector, MSDialect): supports_statement_cache: bool colspecs: Any description_encoding: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pymssql.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pymssql.pyi index ad366b87f50c..b16a0b4f729f 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pymssql.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pymssql.pyi @@ -9,7 +9,7 @@ class _MSNumeric_pymssql(Numeric): class MSIdentifierPreparer_pymssql(MSIdentifierPreparer): def __init__(self, dialect) -> None: ... -class MSDialect_pymssql(MSDialect): # type: ignore[misc] +class MSDialect_pymssql(MSDialect): supports_statement_cache: bool supports_native_decimal: bool driver: str diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pyodbc.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pyodbc.pyi index 8940a501fb12..907824cea6f3 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pyodbc.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mssql/pyodbc.pyi @@ -29,7 +29,7 @@ class MSExecutionContext_pyodbc(MSExecutionContext): def pre_exec(self) -> None: ... def post_exec(self) -> None: ... -class MSDialect_pyodbc(PyODBCConnector, MSDialect): # type: ignore[misc] +class MSDialect_pyodbc(PyODBCConnector, MSDialect): supports_statement_cache: bool supports_sane_rowcount_returning: bool colspecs: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/aiomysql.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/aiomysql.pyi index 5127906ff231..4021fd9061ba 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/aiomysql.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/aiomysql.pyi @@ -57,7 +57,7 @@ class AsyncAdapt_aiomysql_dbapi: def __init__(self, aiomysql, pymysql) -> None: ... def connect(self, *arg, **kw): ... -class MySQLDialect_aiomysql(MySQLDialect_pymysql): # type: ignore[misc] +class MySQLDialect_aiomysql(MySQLDialect_pymysql): driver: str supports_statement_cache: bool supports_server_side_cursors: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/asyncmy.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/asyncmy.pyi index f4afbefb0acc..6c37f8d5ab16 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/asyncmy.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/asyncmy.pyi @@ -57,7 +57,7 @@ class AsyncAdapt_asyncmy_dbapi: def __init__(self, asyncmy, pymysql) -> None: ... def connect(self, *arg, **kw): ... -class MySQLDialect_asyncmy(MySQLDialect_pymysql): # type: ignore[misc] +class MySQLDialect_asyncmy(MySQLDialect_pymysql): driver: str supports_statement_cache: bool supports_server_side_cursors: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/base.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/base.pyi index 6be9ef1a6fe7..a7b58f6ea754 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/base.pyi @@ -165,7 +165,7 @@ class MySQLIdentifierPreparer(compiler.IdentifierPreparer): class MariaDBIdentifierPreparer(MySQLIdentifierPreparer): reserved_words: Any -class MySQLDialect(default.DefaultDialect): # type: ignore[misc] +class MySQLDialect(default.DefaultDialect): logger: Any name: str supports_statement_cache: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/cymysql.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/cymysql.pyi index 4cd50a243f8a..408d931df22d 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/cymysql.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/cymysql.pyi @@ -6,7 +6,7 @@ from .mysqldb import MySQLDialect_mysqldb class _cymysqlBIT(BIT): def result_processor(self, dialect, coltype): ... -class MySQLDialect_cymysql(MySQLDialect_mysqldb): # type: ignore[misc] +class MySQLDialect_cymysql(MySQLDialect_mysqldb): driver: str supports_statement_cache: bool description_encoding: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/enumerated.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/enumerated.pyi index ba9343513318..fc3283c0d70c 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/enumerated.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/enumerated.pyi @@ -3,7 +3,7 @@ from typing import Any from ...sql import sqltypes from .types import _StringType -class ENUM(sqltypes.NativeForEmulated, sqltypes.Enum, _StringType): # type: ignore[misc] +class ENUM(sqltypes.NativeForEmulated, sqltypes.Enum, _StringType): __visit_name__: str native_enum: bool def __init__(self, *enums, **kw) -> None: ... diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadb.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadb.pyi index 4ff76da4743e..db8f5abd5f09 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadb.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadb.pyi @@ -2,7 +2,7 @@ from typing import Any from .base import MySQLDialect -class MariaDBDialect(MySQLDialect): # type: ignore[misc] +class MariaDBDialect(MySQLDialect): is_mariadb: bool supports_statement_cache: bool name: str diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadbconnector.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadbconnector.pyi index 6eeca171cf44..0735fb75a28e 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadbconnector.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mariadbconnector.pyi @@ -10,7 +10,7 @@ class MySQLExecutionContext_mariadbconnector(MySQLExecutionContext): class MySQLCompiler_mariadbconnector(MySQLCompiler): ... -class MySQLDialect_mariadbconnector(MySQLDialect): # type: ignore[misc] +class MySQLDialect_mariadbconnector(MySQLDialect): driver: str supports_statement_cache: bool supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqlconnector.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqlconnector.pyi index 6fbbe91f9d1e..df0a63589b1c 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqlconnector.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqlconnector.pyi @@ -13,7 +13,7 @@ class MySQLIdentifierPreparer_mysqlconnector(MySQLIdentifierPreparer): ... class _myconnpyBIT(BIT): def result_processor(self, dialect, coltype) -> None: ... -class MySQLDialect_mysqlconnector(MySQLDialect): # type: ignore[misc] +class MySQLDialect_mysqlconnector(MySQLDialect): driver: str supports_statement_cache: bool supports_unicode_binds: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqldb.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqldb.pyi index 747e7a485c0e..bb41d161da2f 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqldb.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/mysqldb.pyi @@ -9,7 +9,7 @@ class MySQLExecutionContext_mysqldb(MySQLExecutionContext): class MySQLCompiler_mysqldb(MySQLCompiler): ... -class MySQLDialect_mysqldb(MySQLDialect): # type: ignore[misc] +class MySQLDialect_mysqldb(MySQLDialect): driver: str supports_statement_cache: bool supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/oursql.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/oursql.pyi index 22d216749cec..40d1d6919ccb 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/oursql.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/oursql.pyi @@ -9,7 +9,7 @@ class MySQLExecutionContext_oursql(MySQLExecutionContext): @property def plain_query(self): ... -class MySQLDialect_oursql(MySQLDialect): # type: ignore[misc] +class MySQLDialect_oursql(MySQLDialect): driver: str supports_statement_cache: bool supports_unicode_binds: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pymysql.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pymysql.pyi index 939d82449285..a4f6cb64fc48 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pymysql.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pymysql.pyi @@ -3,7 +3,7 @@ from typing import Any from ...util import memoized_property from .mysqldb import MySQLDialect_mysqldb -class MySQLDialect_pymysql(MySQLDialect_mysqldb): # type: ignore[misc] +class MySQLDialect_pymysql(MySQLDialect_mysqldb): driver: str supports_statement_cache: bool description_encoding: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pyodbc.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pyodbc.pyi index f4dd295a0c6d..f9363c3cc0b0 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pyodbc.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/pyodbc.pyi @@ -10,7 +10,7 @@ class _pyodbcTIME(TIME): class MySQLExecutionContext_pyodbc(MySQLExecutionContext): def get_lastrowid(self): ... -class MySQLDialect_pyodbc(PyODBCConnector, MySQLDialect): # type: ignore[misc] +class MySQLDialect_pyodbc(PyODBCConnector, MySQLDialect): supports_statement_cache: bool colspecs: Any supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/types.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/types.pyi index 402a19aa52ca..bbaf6918185f 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/types.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/types.pyi @@ -32,7 +32,7 @@ class _StringType(sqltypes.String): **kw, ) -> None: ... -class _MatchType(sqltypes.Float, sqltypes.MatchType): # type: ignore[misc] +class _MatchType(sqltypes.Float, sqltypes.MatchType): def __init__(self, **kw) -> None: ... class NUMERIC(_NumericType, sqltypes.NUMERIC): diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/base.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/base.pyi index 223b06eba77a..6b9668957b2b 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/base.pyi @@ -145,7 +145,7 @@ class OracleIdentifierPreparer(compiler.IdentifierPreparer): class OracleExecutionContext(default.DefaultExecutionContext): def fire_sequence(self, seq, type_): ... -class OracleDialect(default.DefaultDialect): # type: ignore[misc] +class OracleDialect(default.DefaultDialect): name: str supports_statement_cache: bool supports_alter: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/cx_oracle.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/cx_oracle.pyi index 34352478ec36..05f26b87b3ee 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/cx_oracle.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/oracle/cx_oracle.pyi @@ -80,7 +80,7 @@ class OracleExecutionContext_cx_oracle(OracleExecutionContext): def create_cursor(self): ... def get_out_parameter_values(self, out_param_names): ... -class OracleDialect_cx_oracle(OracleDialect): # type: ignore[misc] +class OracleDialect_cx_oracle(OracleDialect): supports_statement_cache: bool statement_compiler: Any supports_sane_rowcount: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/asyncpg.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/asyncpg.pyi index 22b44bbf8ea1..217ab044bec6 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/asyncpg.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/asyncpg.pyi @@ -165,7 +165,7 @@ class AsyncAdapt_asyncpg_dbapi: DATETIME: Any BINARY: Any -class PGDialect_asyncpg(PGDialect): # type: ignore[misc] +class PGDialect_asyncpg(PGDialect): driver: str supports_statement_cache: bool supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/base.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/base.pyi index 5606116c4bca..a1a1b5138dc7 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/base.pyi @@ -96,7 +96,7 @@ PGUuid = UUID class TSVECTOR(sqltypes.TypeEngine): __visit_name__: str -class ENUM(sqltypes.NativeForEmulated, sqltypes.Enum): # type: ignore[misc] +class ENUM(sqltypes.NativeForEmulated, sqltypes.Enum): native_enum: bool create_type: Any def __init__(self, *enums, **kw) -> None: ... @@ -230,7 +230,7 @@ class PGDeferrableConnectionCharacteristic(characteristics.ConnectionCharacteris def set_characteristic(self, dialect, dbapi_conn, value) -> None: ... def get_characteristic(self, dialect, dbapi_conn): ... -class PGDialect(default.DefaultDialect): # type: ignore[misc] +class PGDialect(default.DefaultDialect): name: str supports_statement_cache: bool supports_alter: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pg8000.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pg8000.pyi index 3e8e719b0351..fc60c10383d7 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pg8000.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pg8000.pyi @@ -98,7 +98,7 @@ class PGCompiler_pg8000(PGCompiler): class PGIdentifierPreparer_pg8000(PGIdentifierPreparer): def __init__(self, *args, **kwargs) -> None: ... -class PGDialect_pg8000(PGDialect): # type: ignore[misc] +class PGDialect_pg8000(PGDialect): driver: str supports_statement_cache: bool supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2.pyi index 39ab9e3e650b..7a5fa9941133 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2.pyi @@ -46,7 +46,7 @@ EXECUTEMANY_BATCH: Any EXECUTEMANY_VALUES: Any EXECUTEMANY_VALUES_PLUS_BATCH: Any -class PGDialect_psycopg2(PGDialect): # type: ignore[misc] +class PGDialect_psycopg2(PGDialect): driver: str supports_statement_cache: bool supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2cffi.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2cffi.pyi index 86aa80ada1b5..4456b3294a70 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2cffi.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/psycopg2cffi.pyi @@ -2,7 +2,7 @@ from typing import Any from .psycopg2 import PGDialect_psycopg2 -class PGDialect_psycopg2cffi(PGDialect_psycopg2): # type: ignore[misc] +class PGDialect_psycopg2cffi(PGDialect_psycopg2): driver: str supports_unicode_statements: bool supports_statement_cache: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pygresql.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pygresql.pyi index c11c42822408..a6f0d861b361 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pygresql.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pygresql.pyi @@ -31,7 +31,7 @@ class _PGCompiler(PGCompiler): class _PGIdentifierPreparer(PGIdentifierPreparer): ... -class PGDialect_pygresql(PGDialect): # type: ignore[misc] +class PGDialect_pygresql(PGDialect): driver: str supports_statement_cache: bool statement_compiler: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pypostgresql.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pypostgresql.pyi index d63ec453d3b0..1b5bed220c5c 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pypostgresql.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/pypostgresql.pyi @@ -11,7 +11,7 @@ class PGNumeric(sqltypes.Numeric): class PGExecutionContext_pypostgresql(PGExecutionContext): ... -class PGDialect_pypostgresql(PGDialect): # type: ignore[misc] +class PGDialect_pypostgresql(PGDialect): driver: str supports_statement_cache: bool supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/aiosqlite.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/aiosqlite.pyi index e50c574cb016..dfc3247d5ea1 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/aiosqlite.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/aiosqlite.pyi @@ -57,7 +57,7 @@ class AsyncAdapt_aiosqlite_dbapi: class SQLiteExecutionContext_aiosqlite(SQLiteExecutionContext): def create_server_side_cursor(self): ... -class SQLiteDialect_aiosqlite(SQLiteDialect_pysqlite): # type: ignore[misc] +class SQLiteDialect_aiosqlite(SQLiteDialect_pysqlite): driver: str supports_statement_cache: bool is_async: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/base.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/base.pyi index 0791ebd2414b..31efadb6c920 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/base.pyi @@ -92,7 +92,7 @@ class SQLiteIdentifierPreparer(compiler.IdentifierPreparer): class SQLiteExecutionContext(default.DefaultExecutionContext): ... -class SQLiteDialect(default.DefaultDialect): # type: ignore[misc] +class SQLiteDialect(default.DefaultDialect): name: str supports_alter: bool supports_unicode_statements: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlcipher.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlcipher.pyi index 6ba04f6fd631..cf2d8738ed15 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlcipher.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlcipher.pyi @@ -2,7 +2,7 @@ from typing import Any from .pysqlite import SQLiteDialect_pysqlite -class SQLiteDialect_pysqlcipher(SQLiteDialect_pysqlite): # type: ignore[misc] +class SQLiteDialect_pysqlcipher(SQLiteDialect_pysqlite): driver: str supports_statement_cache: bool pragmas: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlite.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlite.pyi index 24b1e8993a2f..5703abbdf573 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlite.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/sqlite/pysqlite.pyi @@ -10,7 +10,7 @@ class _SQLite_pysqliteDate(DATE): def bind_processor(self, dialect): ... def result_processor(self, dialect, coltype): ... -class SQLiteDialect_pysqlite(SQLiteDialect): # type: ignore[misc] +class SQLiteDialect_pysqlite(SQLiteDialect): default_paramstyle: str supports_statement_cache: bool colspecs: Any diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/base.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/base.pyi index 64f4cc166bd5..40d48d646b76 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/base.pyi @@ -103,7 +103,7 @@ class SybaseDDLCompiler(compiler.DDLCompiler): class SybaseIdentifierPreparer(compiler.IdentifierPreparer): reserved_words: Any -class SybaseDialect(default.DefaultDialect): # type: ignore[misc] +class SybaseDialect(default.DefaultDialect): name: str supports_unicode_statements: bool supports_sane_rowcount: bool diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/mxodbc.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/mxodbc.pyi index 893a81a71de5..596496ea18f5 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/mxodbc.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/mxodbc.pyi @@ -3,7 +3,7 @@ from sqlalchemy.dialects.sybase.base import SybaseDialect, SybaseExecutionContex class SybaseExecutionContext_mxodbc(SybaseExecutionContext): ... -class SybaseDialect_mxodbc(MxODBCConnector, SybaseDialect): # type: ignore[misc] +class SybaseDialect_mxodbc(MxODBCConnector, SybaseDialect): supports_statement_cache: bool dialect = SybaseDialect_mxodbc diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/pysybase.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/pysybase.pyi index f7f13e69920e..ae8c0591f00e 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/pysybase.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/sybase/pysybase.pyi @@ -13,7 +13,7 @@ class SybaseExecutionContext_pysybase(SybaseExecutionContext): class SybaseSQLCompiler_pysybase(SybaseSQLCompiler): def bindparam_string(self, name, **kw): ... -class SybaseDialect_pysybase(SybaseDialect): # type: ignore[misc] +class SybaseDialect_pysybase(SybaseDialect): driver: str statement_compiler: Any supports_statement_cache: bool From 107002bf19997c439d80dcb506c8faa620a2492c Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Sat, 8 Jan 2022 19:56:21 +0100 Subject: [PATCH 19/22] Use plain property --- stubs/SQLAlchemy/sqlalchemy/engine/url.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/url.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/url.pyi index 82a067279c9a..0e0f535fd7f3 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/url.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/url.pyi @@ -2,7 +2,7 @@ from _typeshed import Self, SupportsItems from collections.abc import Iterable, Mapping, Sequence from typing import Any, NamedTuple -from ..util import immutabledict, memoized_property +from ..util import immutabledict from .interfaces import Dialect # stub-only helper class @@ -43,7 +43,7 @@ class URL(_URLTuple): def update_query_pairs(self: Self, key_value_pairs: Iterable[tuple[str, str]], append: bool = ...) -> Self: ... def update_query_dict(self: Self, query_parameters: SupportsItems[str, str | Sequence[str]], append: bool = ...) -> Self: ... def difference_update_query(self, names: Iterable[str]) -> URL: ... - @memoized_property + @property def normalized_query(self) -> immutabledict[str, tuple[str, ...]]: ... def __to_string__(self, hide_password: bool = ...) -> str: ... def render_as_string(self, hide_password: bool = ...) -> str: ... From 6236f771e8132443c4f00ddccc172da3386891f4 Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Sat, 8 Jan 2022 20:00:25 +0100 Subject: [PATCH 20/22] Fixes for pyright --- stubs/SQLAlchemy/sqlalchemy/dialects/mysql/enumerated.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/dialects/mysql/types.pyi | 2 +- stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/enumerated.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/enumerated.pyi index fc3283c0d70c..e68dcdfdf032 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/enumerated.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/enumerated.pyi @@ -3,7 +3,7 @@ from typing import Any from ...sql import sqltypes from .types import _StringType -class ENUM(sqltypes.NativeForEmulated, sqltypes.Enum, _StringType): +class ENUM(sqltypes.NativeForEmulated, sqltypes.Enum, _StringType): # type: ignore # incompatible with base class __visit_name__: str native_enum: bool def __init__(self, *enums, **kw) -> None: ... diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/types.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/types.pyi index bbaf6918185f..fecd364f683c 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/types.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/mysql/types.pyi @@ -32,7 +32,7 @@ class _StringType(sqltypes.String): **kw, ) -> None: ... -class _MatchType(sqltypes.Float, sqltypes.MatchType): +class _MatchType(sqltypes.Float, sqltypes.MatchType): # type: ignore # incompatible with base class def __init__(self, **kw) -> None: ... class NUMERIC(_NumericType, sqltypes.NUMERIC): diff --git a/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi b/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi index 241f637d7557..cdf04f61750d 100644 --- a/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/engine/interfaces.pyi @@ -94,8 +94,11 @@ class Dialect: def set_isolation_level(self, dbapi_conn, level) -> None: ... def get_isolation_level(self, dbapi_conn) -> None: ... def get_default_isolation_level(self, dbapi_conn) -> None: ... + @classmethod def get_dialect_cls(cls, url): ... + @classmethod def load_provisioning(cls) -> None: ... + @classmethod def engine_created(cls, engine) -> None: ... def get_driver_connection(self, connection) -> None: ... From 6b3ee69b59ff759dc1b23e164f90c9b9b0cb483e Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Sat, 8 Jan 2022 20:04:12 +0100 Subject: [PATCH 21/22] Add a missing type ignore --- stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/base.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/base.pyi b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/base.pyi index a1a1b5138dc7..b3ba752bb0e9 100644 --- a/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/base.pyi +++ b/stubs/SQLAlchemy/sqlalchemy/dialects/postgresql/base.pyi @@ -96,7 +96,7 @@ PGUuid = UUID class TSVECTOR(sqltypes.TypeEngine): __visit_name__: str -class ENUM(sqltypes.NativeForEmulated, sqltypes.Enum): +class ENUM(sqltypes.NativeForEmulated, sqltypes.Enum): # type: ignore # base classes incompatible native_enum: bool create_type: Any def __init__(self, *enums, **kw) -> None: ... From 9a11559c82a4a87e038c8134d1ec3716721740db Mon Sep 17 00:00:00 2001 From: Sebastian Rittau Date: Sat, 8 Jan 2022 20:08:31 +0100 Subject: [PATCH 22/22] Add URL.normalized_query to allowlist --- stubs/SQLAlchemy/@tests/stubtest_allowlist.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/stubs/SQLAlchemy/@tests/stubtest_allowlist.txt b/stubs/SQLAlchemy/@tests/stubtest_allowlist.txt index 3284177f4448..24dedb6a5a5e 100644 --- a/stubs/SQLAlchemy/@tests/stubtest_allowlist.txt +++ b/stubs/SQLAlchemy/@tests/stubtest_allowlist.txt @@ -118,6 +118,10 @@ sqlalchemy.engine.base.Transaction.is_active sqlalchemy.engine.Connection.engine sqlalchemy.engine.base.Connection.engine +# uses @memoized_property at runtime, but we use @property for compatibility +sqlalchemy.engine.URL.normalized_query +sqlalchemy.engine.url.URL.normalized_query + # unclear problems sqlalchemy.sql.elements.quoted_name.lower sqlalchemy.sql.elements.quoted_name.upper