From c03b6e09fd8bde01bf5928b439358b69a1ec7962 Mon Sep 17 00:00:00 2001 From: Federico Caselli Date: Sat, 24 Jul 2021 19:17:49 +0200 Subject: [PATCH] Support generics in code to allow Column[int] etc Fixes: #6804 Fixes: #6759 Change-Id: Ie7f32c38a22dbfa059b5709b883ff464b16031ae --- doc/build/changelog/unreleased_14/6804.rst | 6 ++++++ lib/sqlalchemy/sql/visitors.py | 4 ++++ lib/sqlalchemy/testing/requirements.py | 5 +++++ lib/sqlalchemy/util/__init__.py | 2 ++ lib/sqlalchemy/util/compat.py | 2 +- test/base/test_misc_py3k.py | 10 ++++++++++ 6 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 doc/build/changelog/unreleased_14/6804.rst create mode 100644 test/base/test_misc_py3k.py diff --git a/doc/build/changelog/unreleased_14/6804.rst b/doc/build/changelog/unreleased_14/6804.rst new file mode 100644 index 0000000000..92c41d6e31 --- /dev/null +++ b/doc/build/changelog/unreleased_14/6804.rst @@ -0,0 +1,6 @@ +.. change:: + :tags: change + :tickets: 6804, 6759 + + Add basic support for generic classes without requiring + ``TYPE_CHECKING``. diff --git a/lib/sqlalchemy/sql/visitors.py b/lib/sqlalchemy/sql/visitors.py index 1cd7b63cde..7111c5efd7 100644 --- a/lib/sqlalchemy/sql/visitors.py +++ b/lib/sqlalchemy/sql/visitors.py @@ -120,6 +120,10 @@ class Traversible(util.with_metaclass(TraversibleType)): """ + def __class_getitem__(cls, key): + # allow generic classes in py3.9+ + return cls + @util.preload_module("sqlalchemy.sql.traversals") def get_children(self, omit_attrs=(), **kw): r"""Return immediate child :class:`.visitors.Traversible` diff --git a/lib/sqlalchemy/testing/requirements.py b/lib/sqlalchemy/testing/requirements.py index 702a40fe29..74ed1ad9b7 100644 --- a/lib/sqlalchemy/testing/requirements.py +++ b/lib/sqlalchemy/testing/requirements.py @@ -1424,3 +1424,8 @@ class SuiteRequirements(Requirements): sequence. This should be false only for oracle. """ return exclusions.open() + + @property + def builtin_generics(self): + "If list[int] is a valid syntax. basically py3.9+" + return exclusions.only_if(lambda: util.py39) diff --git a/lib/sqlalchemy/util/__init__.py b/lib/sqlalchemy/util/__init__.py index 10139fb9f5..bdd69431e0 100644 --- a/lib/sqlalchemy/util/__init__.py +++ b/lib/sqlalchemy/util/__init__.py @@ -77,6 +77,8 @@ from .compat import pickle from .compat import print_ from .compat import py2k from .compat import py37 +from .compat import py38 +from .compat import py39 from .compat import py3k from .compat import pypy from .compat import quote_plus diff --git a/lib/sqlalchemy/util/compat.py b/lib/sqlalchemy/util/compat.py index 37239f532c..5d52f740fc 100644 --- a/lib/sqlalchemy/util/compat.py +++ b/lib/sqlalchemy/util/compat.py @@ -14,7 +14,7 @@ import operator import platform import sys -py310 = sys.version_info >= (3, 10) +py39 = sys.version_info >= (3, 9) py38 = sys.version_info >= (3, 8) py37 = sys.version_info >= (3, 7) py3k = sys.version_info >= (3, 0) diff --git a/test/base/test_misc_py3k.py b/test/base/test_misc_py3k.py new file mode 100644 index 0000000000..3cd9e1af49 --- /dev/null +++ b/test/base/test_misc_py3k.py @@ -0,0 +1,10 @@ +from sqlalchemy import Column +from sqlalchemy.testing import fixtures +from sqlalchemy.testing import requires + + +class TestGenerics(fixtures.TestBase): + @requires.builtin_generics + def test_traversible_is_generic(self): + col = Column[int] + assert col is Column -- 2.47.2