diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-12-03 09:11:14 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-12-04 10:45:35 -0500 |
| commit | 1284fa377e53f03cec061d7af16f269ad73fa7b9 (patch) | |
| tree | 40e421506cd20f3cf8c12cba834062cd1bb0505c /lib/sqlalchemy/testing | |
| parent | 96db7cdd53ee9004be66545989b4ac5632bb7ccf (diff) | |
| download | sqlalchemy-1284fa377e53f03cec061d7af16f269ad73fa7b9.tar.gz | |
disallow same-named columns, unchecked replacement in Table
Fixed issue where table reflection using :paramref:`.Table.extend_existing`
would fail to deduplicate a same-named column if the existing
:class:`.Table` used a separate key. The
:paramref:`.Table.autoload_replace` parameter would allow the column to be
skipped but under no circumstances should a :class:`.Table` ever have the
same-named column twice.
Additionally, changed deprecation warnings to exceptions
as were implemented in I1d58c8ebe081079cb669e7ead60886ffc1b1a7f5 .
Fixes: #8925
Change-Id: I83d0f8658177a7ffbb06e01dbca91377d1a98d49
Diffstat (limited to 'lib/sqlalchemy/testing')
| -rw-r--r-- | lib/sqlalchemy/testing/__init__.py | 1 | ||||
| -rw-r--r-- | lib/sqlalchemy/testing/config.py | 29 |
2 files changed, 24 insertions, 6 deletions
diff --git a/lib/sqlalchemy/testing/__init__.py b/lib/sqlalchemy/testing/__init__.py index 3a028f002..993fc4954 100644 --- a/lib/sqlalchemy/testing/__init__.py +++ b/lib/sqlalchemy/testing/__init__.py @@ -54,6 +54,7 @@ from .config import db from .config import fixture from .config import requirements as requires from .config import skip_test +from .config import Variation from .config import variation from .exclusions import _is_excluded from .exclusions import _server_version diff --git a/lib/sqlalchemy/testing/config.py b/lib/sqlalchemy/testing/config.py index a75c36776..957876579 100644 --- a/lib/sqlalchemy/testing/config.py +++ b/lib/sqlalchemy/testing/config.py @@ -14,11 +14,13 @@ import typing from typing import Any from typing import Callable from typing import Iterable +from typing import NoReturn from typing import Optional from typing import Tuple from typing import TypeVar from typing import Union +from .util import fail from .. import util requirements = None @@ -128,21 +130,36 @@ def combinations_list( return combinations(*arg_iterable, **kw) -class _variation_base: - __slots__ = ("name", "argname") +class Variation: + __slots__ = ("_name", "_argname") def __init__(self, case, argname, case_names): - self.name = case - self.argname = argname + self._name = case + self._argname = argname for casename in case_names: setattr(self, casename, casename == case) + if typing.TYPE_CHECKING: + + def __getattr__(self, key: str) -> bool: + ... + + @property + def name(self): + return self._name + def __bool__(self): - return self.name == self.argname + return self._name == self._argname def __nonzero__(self): return not self.__bool__() + def __str__(self): + return f"{self._argname}={self._name!r}" + + def fail(self) -> NoReturn: + fail(f"Unknown {self}") + def variation(argname, cases): """a helper around testing.combinations that provides a single namespace @@ -193,7 +210,7 @@ def variation(argname, cases): typ = type( argname, - (_variation_base,), + (Variation,), { "__slots__": tuple(case_names), }, |
