]> 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:23:52 +0000 (21:23 +0100)
References: #12046
Change-Id: If950f7e2090a0f637c2c28cf21a40dc345acc89a

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 fc53981c1bbbe14ae3712988e2dae42fe15ebdc6..8f58749f9468407b311671a09df5a45e2c39ce77 100644 (file)
@@ -392,6 +392,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 2b6835a6a2b4d78d3d8b4f58a6da88945994233d..70c27ef5a8cfb1e7e94e902d257289f0a5607b71 100644 (file)
@@ -2441,7 +2441,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 9f40905fa62ca361a5c623997460b350452f8405..228020ec20e4b8a7f09cedc6ff121d94da871105 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())