summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/testing
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2022-12-03 09:11:14 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2022-12-04 10:45:35 -0500
commit1284fa377e53f03cec061d7af16f269ad73fa7b9 (patch)
tree40e421506cd20f3cf8c12cba834062cd1bb0505c /lib/sqlalchemy/testing
parent96db7cdd53ee9004be66545989b4ac5632bb7ccf (diff)
downloadsqlalchemy-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__.py1
-rw-r--r--lib/sqlalchemy/testing/config.py29
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),
},