--- /dev/null
+.. change::
+ :tags: bug, orm, typing
+ :tickets: 11814
+
+ Fixed issue where it was not possible to use ``typing.Literal`` with
+ ``Mapped[]`` on Python 3.8 and 3.9. Pull request courtesy Frazer McLean.
import collections.abc as collections_abc
import re
import sys
+import typing
from typing import Any
from typing import Callable
from typing import cast
TupleAny = Tuple[Any, ...]
+# typing_extensions.Literal is different from typing.Literal until
+# Python 3.10.1
+_LITERAL_TYPES = frozenset([typing.Literal, Literal])
+
if compat.py310:
# why they took until py310 to put this in stdlib is beyond me,
def is_literal(type_: _AnnotationScanType) -> bool:
- return get_origin(type_) is Literal
+ return get_origin(type_) in _LITERAL_TYPES
def is_newtype(type_: Optional[_AnnotationScanType]) -> TypeGuard[NewType]:
from typing import Union
import uuid
+import typing_extensions
from typing_extensions import get_args as get_args
from typing_extensions import Literal as Literal
from typing_extensions import TypeAlias as TypeAlias
_Recursive695_1: TypeAlias = _Recursive695_0
_Recursive695_2: TypeAlias = _Recursive695_1
+_TypingLiteral = typing.Literal["a", "b"]
+_TypingExtensionsLiteral = typing_extensions.Literal["a", "b"]
+
if compat.py312:
exec(
"""
eq_(col.type.enums, ["to-do", "in-progress", "done"])
is_(col.type.native_enum, False)
+ def test_typing_literal_identity(self, decl_base):
+ """See issue #11820"""
+
+ class Foo(decl_base):
+ __tablename__ = "footable"
+
+ id: Mapped[int] = mapped_column(primary_key=True)
+ t: Mapped[_TypingLiteral]
+ te: Mapped[_TypingExtensionsLiteral]
+
+ for col in (Foo.__table__.c.t, Foo.__table__.c.te):
+ is_true(isinstance(col.type, Enum))
+ eq_(col.type.enums, ["a", "b"])
+ is_(col.type.native_enum, False)
+
@testing.requires.python310
def test_we_got_all_attrs_test_annotated(self):
argnames = _py_inspect.getfullargspec(mapped_column)
from typing import Union
import uuid
+import typing_extensions
from typing_extensions import get_args as get_args
from typing_extensions import Literal as Literal
from typing_extensions import TypeAlias as TypeAlias
_Recursive695_1: TypeAlias = _Recursive695_0
_Recursive695_2: TypeAlias = _Recursive695_1
+_TypingLiteral = typing.Literal["a", "b"]
+_TypingExtensionsLiteral = typing_extensions.Literal["a", "b"]
+
if compat.py312:
exec(
"""
eq_(col.type.enums, ["to-do", "in-progress", "done"])
is_(col.type.native_enum, False)
+ def test_typing_literal_identity(self, decl_base):
+ """See issue #11820"""
+
+ class Foo(decl_base):
+ __tablename__ = "footable"
+
+ id: Mapped[int] = mapped_column(primary_key=True)
+ t: Mapped[_TypingLiteral]
+ te: Mapped[_TypingExtensionsLiteral]
+
+ for col in (Foo.__table__.c.t, Foo.__table__.c.te):
+ is_true(isinstance(col.type, Enum))
+ eq_(col.type.enums, ["a", "b"])
+ is_(col.type.native_enum, False)
+
@testing.requires.python310
def test_we_got_all_attrs_test_annotated(self):
argnames = _py_inspect.getfullargspec(mapped_column)