]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Improve mutable typing.
authorFederico Caselli <cfederico87@gmail.com>
Wed, 30 Oct 2024 20:17:45 +0000 (21:17 +0100)
committerFederico Caselli <cfederico87@gmail.com>
Wed, 30 Oct 2024 20:26:33 +0000 (21:26 +0100)
References: #12046
Change-Id: If950f7e2090a0f637c2c28cf21a40dc345acc89a
(cherry picked from commit 732698427e822b6ba81f1214864685903cdc13a4)

lib/sqlalchemy/ext/mutable.py
lib/sqlalchemy/sql/elements.py
lib/sqlalchemy/sql/type_api.py
test/typing/plain_files/ext/misc_ext.py [new file with mode: 0644]

index 7da5075a177f491a7b6d5b4d48e09b9caf335054..e005e4d63f12bae59d262d2ee433fc14ca89c2b2 100644 (file)
@@ -391,6 +391,7 @@ from ..orm.context import QueryContext
 from ..orm.decl_api import DeclarativeAttributeIntercept
 from ..orm.state import InstanceState
 from ..orm.unitofwork import UOWTransaction
+from ..sql._typing import _TypeEngineArgument
 from ..sql.base import SchemaEventTarget
 from ..sql.schema import Column
 from ..sql.type_api import TypeEngine
@@ -638,7 +639,7 @@ class Mutable(MutableBase):
         event.listen(Mapper, "mapper_configured", listen_for_type)
 
     @classmethod
-    def as_mutable(cls, sqltype: TypeEngine[_T]) -> TypeEngine[_T]:
+    def as_mutable(cls, sqltype: _TypeEngineArgument[_T]) -> TypeEngine[_T]:
         """Associate a SQL type with this mutable Python type.
 
         This establishes listeners that will detect ORM mappings against
index 45c1674d9fbff93520c795f261c68e0504b0869a..241aa4231e954d8feee9f15ea983d42c619121bc 100644 (file)
@@ -2431,7 +2431,9 @@ class TextClause(
 
     @util.preload_module("sqlalchemy.sql.selectable")
     def columns(
-        self, *cols: _ColumnExpressionArgument[Any], **types: TypeEngine[Any]
+        self,
+        *cols: _ColumnExpressionArgument[Any],
+        **types: _TypeEngineArgument[Any],
     ) -> TextualSelect:
         r"""Turn this :class:`_expression.TextClause` object into a
         :class:`_expression.TextualSelect`
index 2f6494e61cb3aa3b1697c30f348ade366a41fd8d..633763aaa51c8fd00d9c7a470c9e84659ced06e1 100644 (file)
@@ -2315,11 +2315,10 @@ def to_instance(
 
 
 def adapt_type(
-    typeobj: TypeEngine[Any],
+    typeobj: _TypeEngineArgument[Any],
     colspecs: Mapping[Type[Any], Type[TypeEngine[Any]]],
 ) -> TypeEngine[Any]:
-    if isinstance(typeobj, type):
-        typeobj = typeobj()
+    typeobj = to_instance(typeobj)
     for t in typeobj.__class__.__mro__[0:-1]:
         try:
             impltype = colspecs[t]
diff --git a/test/typing/plain_files/ext/misc_ext.py b/test/typing/plain_files/ext/misc_ext.py
new file mode 100644 (file)
index 0000000..c44d09b
--- /dev/null
@@ -0,0 +1,17 @@
+from typing import Any
+
+from sqlalchemy import JSON
+from sqlalchemy import Select
+from sqlalchemy.ext.compiler import compiles
+from sqlalchemy.ext.mutable import MutableDict
+from sqlalchemy.ext.mutable import MutableList
+from sqlalchemy.sql.compiler import SQLCompiler
+
+
+@compiles(Select[Any], "my_cool_driver")
+def go(sel: Select[Any], compiler: SQLCompiler, **kw: Any) -> str:
+    return "select 42"
+
+
+MutableList.as_mutable(JSON)
+MutableDict.as_mutable(JSON())