summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/util/typing.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2022-09-08 13:19:08 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2022-09-08 14:15:50 -0400
commitfcd298e1afe9b309de34d28b35e4debc3940d6b9 (patch)
treef65417b854556cf0ff1b199f38e0be942dc1e933 /lib/sqlalchemy/util/typing.py
parent36803bc5674e30741021462f77cd91d42b717066 (diff)
downloadsqlalchemy-fcd298e1afe9b309de34d28b35e4debc3940d6b9.tar.gz
additional de-stringify pass for unions
the change in c3cfee5b00a40790c18d took out a pass for de-stringify that broke some un-tested cases for Optional with future annotations mode. Adding tests for this revealed that this was a subset of a more general case where Union is presented with ForwardRefs inside of it matching up within the type map, which wasn't working before either, fixed that as well with an additional de-stringify for elements within the Union. Fixes: #8478 Change-Id: I8804cf6c67f14d10804584e1cddd2cfaa2376654
Diffstat (limited to 'lib/sqlalchemy/util/typing.py')
-rw-r--r--lib/sqlalchemy/util/typing.py17
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/sqlalchemy/util/typing.py b/lib/sqlalchemy/util/typing.py
index 85c1bae72..a0d59a630 100644
--- a/lib/sqlalchemy/util/typing.py
+++ b/lib/sqlalchemy/util/typing.py
@@ -120,6 +120,19 @@ def de_stringify_annotation(
return annotation # type: ignore
+def de_stringify_union_elements(
+ cls: Type[Any],
+ annotation: _AnnotationScanType,
+ str_cleanup_fn: Optional[Callable[[str], str]] = None,
+) -> Type[Any]:
+ return make_union_type(
+ *[
+ de_stringify_annotation(cls, anno, str_cleanup_fn)
+ for anno in annotation.__args__ # type: ignore
+ ]
+ )
+
+
def is_pep593(type_: Optional[_AnnotationScanType]) -> bool:
return type_ is not None and typing_get_origin(type_) is Annotated
@@ -186,7 +199,7 @@ def expand_unions(
return (type_,)
-def is_optional(type_):
+def is_optional(type_: Any) -> bool:
return is_origin_of(
type_,
"Optional",
@@ -199,7 +212,7 @@ def is_optional_union(type_: Any) -> bool:
return is_optional(type_) and NoneType in typing_get_args(type_)
-def is_union(type_):
+def is_union(type_: Any) -> bool:
return is_origin_of(type_, "Union")