]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Add mypy test to confirm types 10889/head
authorMartijn Pieters <mj@zopatista.com>
Mon, 15 Jan 2024 19:40:12 +0000 (19:40 +0000)
committerMartijn Pieters <mj@zopatista.com>
Sun, 24 Nov 2024 20:24:37 +0000 (20:24 +0000)
test/typing/plain_files/ext/orderinglist/orderinglist_one.py [new file with mode: 0644]

diff --git a/test/typing/plain_files/ext/orderinglist/orderinglist_one.py b/test/typing/plain_files/ext/orderinglist/orderinglist_one.py
new file mode 100644 (file)
index 0000000..d2b7c5e
--- /dev/null
@@ -0,0 +1,54 @@
+from __future__ import annotations
+
+import re
+from typing import Sequence
+from typing import TYPE_CHECKING
+
+from sqlalchemy import ForeignKey
+from sqlalchemy.ext.orderinglist import ordering_list
+from sqlalchemy.orm import DeclarativeBase
+from sqlalchemy.orm import Mapped
+from sqlalchemy.orm import mapped_column
+from sqlalchemy.orm import relationship
+
+
+class Base(DeclarativeBase):
+    pass
+
+
+def text_to_pos(index: int, items: Sequence[Bullet]) -> int:
+    match = re.search(r"(\d+)", items[index].text)
+    return int(match[1]) if match else index
+
+
+pos_from_text = ordering_list("position", ordering_func=text_to_pos)
+
+
+class Slide(Base):
+    __tablename__ = "slide"
+
+    id: Mapped[int] = mapped_column(primary_key=True)
+    name: Mapped[str]
+
+    bullets: Mapped[list[Bullet]] = relationship(
+        "Bullet", order_by="Bullet.position", collection_class=pos_from_text
+    )
+
+
+class Bullet(Base):
+    __tablename__ = "bullet"
+    id: Mapped[int] = mapped_column(primary_key=True)
+    slide_id: Mapped[int] = mapped_column(ForeignKey("slide.id"))
+    position: Mapped[int]
+    text: Mapped[str]
+
+
+slide = Slide()
+
+
+if TYPE_CHECKING:
+    # EXPECTED_RE_TYPE: def \(\) -> sqlalchemy.*.orderinglist.OrderingList\[orderinglist_one.Bullet\]
+    reveal_type(pos_from_text)
+
+    # EXPECTED_TYPE: builtins.list[orderinglist_one.Bullet]
+    reveal_type(slide.bullets)