diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2023-04-10 12:56:47 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2023-04-12 15:11:03 -0400 |
| commit | 9f43b10e9014e694cb89fe2899dc52f602bf2197 (patch) | |
| tree | 03c54cbc80bd98e9d358b6a21a029b8524142696 /test/ext | |
| parent | 6e5ed192c6435ec107eae524bb2c6959c38bc654 (diff) | |
| download | sqlalchemy-9f43b10e9014e694cb89fe2899dc52f602bf2197.tar.gz | |
establish column_property and query_expression as readonly from a dc perspective
Fixed bug in ORM Declarative Dataclasses where the
:func:`_orm.queryable_attribute` and :func:`_orm.column_property`
constructs, which are documented as read-only constructs in the context of
a Declarative mapping, could not be used with a
:class:`_orm.MappedAsDataclass` class without adding ``init=False``, which
in the case of :func:`_orm.queryable_attribute` was not possible as no
``init`` parameter was included. These constructs have been modified from a
dataclass perspective to be assumed to be "read only", setting
``init=False`` by default and no longer including them in the pep-681
constructor. The dataclass parameters for :func:`_orm.column_property`
``init``, ``default``, ``default_factory``, ``kw_only`` are now deprecated;
these fields don't apply to :func:`_orm.column_property` as used in a
Declarative dataclasses configuration where the construct would be
read-only. Also added read-specific parameter
:paramref:`_orm.queryable_attribute.compare` to
:func:`_orm.queryable_attribute`; :paramref:`_orm.queryable_attribute.repr`
was already present.
Added missing :paramref:`_orm.mapped_column.active_history` parameter
to :func:`_orm.mapped_column` construct.
Fixes: #9628
Change-Id: I2ab44d6b763b20410bd1ebb5ac949a6d223f1ce2
Diffstat (limited to 'test/ext')
| -rw-r--r-- | test/ext/mypy/plain_files/dataclass_transforms_one.py | 50 | ||||
| -rw-r--r-- | test/ext/mypy/plain_files/pep681.py | 32 |
2 files changed, 50 insertions, 32 deletions
diff --git a/test/ext/mypy/plain_files/dataclass_transforms_one.py b/test/ext/mypy/plain_files/dataclass_transforms_one.py new file mode 100644 index 000000000..b7b88590f --- /dev/null +++ b/test/ext/mypy/plain_files/dataclass_transforms_one.py @@ -0,0 +1,50 @@ +from __future__ import annotations + +from typing import Optional + +from sqlalchemy.orm import column_property +from sqlalchemy.orm import DeclarativeBase +from sqlalchemy.orm import Mapped +from sqlalchemy.orm import mapped_column +from sqlalchemy.orm import MappedAsDataclass +from sqlalchemy.orm import query_expression + + +class Base(DeclarativeBase): + pass + + +class TestInitialSupport(Base): + __tablename__ = "a" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + data: Mapped[str] + x: Mapped[Optional[int]] = mapped_column(default=None) + y: Mapped[Optional[int]] = mapped_column(kw_only=True) + + +tis = TestInitialSupport(data="some data", y=5) + +# EXPECTED_TYPE: str +reveal_type(tis.data) + +# EXPECTED_RE_TYPE: .*Union\[builtins.int, None\] +reveal_type(tis.y) + +tis.data = "some other data" + + +class TestTicket9628(MappedAsDataclass, Base): + __tablename__ = "ticket_9628" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + data: Mapped[str] = mapped_column() + + d2: Mapped[str] = column_property(data + "Asdf") + d3: Mapped[str] = query_expression(data + "Asdf") + + +# d2 and d3 are not required, as these have init=False. We omit +# them from dataclass transforms entirely as these are never intended +# to be writeable fields in a 2.0 declarative mapping +t9628 = TestTicket9628(data="asf") diff --git a/test/ext/mypy/plain_files/pep681.py b/test/ext/mypy/plain_files/pep681.py deleted file mode 100644 index caa219d78..000000000 --- a/test/ext/mypy/plain_files/pep681.py +++ /dev/null @@ -1,32 +0,0 @@ -from __future__ import annotations - -from typing import Optional - -from sqlalchemy.orm import DeclarativeBase -from sqlalchemy.orm import Mapped -from sqlalchemy.orm import mapped_column -from sqlalchemy.orm import MappedAsDataclass - - -class Base(MappedAsDataclass, DeclarativeBase): - pass - - -class A(Base): - __tablename__ = "a" - - id: Mapped[int] = mapped_column(primary_key=True, init=False) - data: Mapped[str] - x: Mapped[Optional[int]] = mapped_column(default=None) - y: Mapped[Optional[int]] = mapped_column(kw_only=True) - - -a1 = A(data="some data", y=5) - -# EXPECTED_TYPE: str -reveal_type(a1.data) - -# EXPECTED_RE_TYPE: .*Union\[builtins.int, None\] -reveal_type(a1.y) - -a1.data = "some other data" |
