summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/build/changelog/unreleased_14/6804.rst6
-rw-r--r--lib/sqlalchemy/sql/visitors.py4
-rw-r--r--lib/sqlalchemy/testing/requirements.py5
-rw-r--r--lib/sqlalchemy/util/__init__.py2
-rw-r--r--lib/sqlalchemy/util/compat.py2
-rw-r--r--test/base/test_misc_py3k.py10
6 files changed, 28 insertions, 1 deletions
diff --git a/doc/build/changelog/unreleased_14/6804.rst b/doc/build/changelog/unreleased_14/6804.rst
new file mode 100644
index 000000000..92c41d6e3
--- /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 1cd7b63cd..7111c5efd 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 702a40fe2..74ed1ad9b 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 10139fb9f..bdd69431e 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 37239f532..5d52f740f 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 000000000..3cd9e1af4
--- /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