diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-03-18 15:07:03 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-03-18 15:08:26 -0400 |
commit | ce2f28c37e0a2f2aa3b4a404ee190cdc00b8b918 (patch) | |
tree | 29a175c6614985f630a2434532e613d459066f68 /test/orm/test_dataclasses_py3k.py | |
parent | 3fec5028e695ad138aa46a0ae66c55e8bcb653f6 (diff) | |
download | sqlalchemy-ce2f28c37e0a2f2aa3b4a404ee190cdc00b8b918.tar.gz |
Adjust dataclass rules to account for field w/ default
Fixed issue in new ORM dataclasses functionality where dataclass fields on
an abstract base or mixin that contained column or other mapping constructs
would not be mapped if they also included a "default" key within the
dataclasses.field() object.
Fixes: #6093
Change-Id: I628086ceb48ab1dd0702f239cd12be74074f58f1
Diffstat (limited to 'test/orm/test_dataclasses_py3k.py')
-rw-r--r-- | test/orm/test_dataclasses_py3k.py | 117 |
1 files changed, 116 insertions, 1 deletions
diff --git a/test/orm/test_dataclasses_py3k.py b/test/orm/test_dataclasses_py3k.py index 51c76c125..ef1c12050 100644 --- a/test/orm/test_dataclasses_py3k.py +++ b/test/orm/test_dataclasses_py3k.py @@ -521,7 +521,7 @@ class FieldEmbeddedWMixinTest(FieldEmbeddedDeclarativeDataclassesTest): eq_(dataclasses.astuple(widget), (None, "Bar", True)) -class PropagationBlockTest(fixtures.TestBase): +class PropagationFromMixinTest(fixtures.TestBase): __requires__ = ("dataclasses",) run_setup_classes = "each" @@ -559,6 +559,25 @@ class PropagationBlockTest(fixtures.TestBase): run_test(CommonMixin) + def test_propagate_w_field_mixin_col_and_default(self, run_test): + @dataclasses.dataclass + class CommonMixin: + __sa_dataclass_metadata_key__ = "sa" + + @declared_attr + def __tablename__(cls): + return cls.__name__.lower() + + __table_args__ = {"mysql_engine": "InnoDB"} + + timestamp: int = dataclasses.field( + init=False, + default=12, + metadata={"sa": Column(Integer, nullable=False)}, + ) + + run_test(CommonMixin) + @testing.fixture() def run_test(self): def go(CommonMixin): @@ -603,3 +622,99 @@ class PropagationBlockTest(fixtures.TestBase): yield go clear_mappers() + + +class PropagationFromAbstractTest(fixtures.TestBase): + __requires__ = ("dataclasses",) + + run_setup_classes = "each" + run_setup_mappers = "each" + + def test_propagate_w_plain_mixin_col(self, run_test): + @dataclasses.dataclass + class BaseType: + __sa_dataclass_metadata_key__ = "sa" + + __table_args__ = {"mysql_engine": "InnoDB"} + + discriminator: str = Column("type", String(50)) + __mapper_args__ = dict(polymorphic_on=discriminator) + id: int = Column(Integer, primary_key=True) + value: int = Column(Integer()) + + timestamp: int = Column(Integer) + + run_test(BaseType) + + def test_propagate_w_field_mixin_col(self, run_test): + @dataclasses.dataclass + class BaseType: + __sa_dataclass_metadata_key__ = "sa" + + __table_args__ = {"mysql_engine": "InnoDB"} + + discriminator: str = Column("type", String(50)) + __mapper_args__ = dict(polymorphic_on=discriminator) + id: int = Column(Integer, primary_key=True) + value: int = Column(Integer()) + + timestamp: int = dataclasses.field( + init=False, + metadata={"sa": Column(Integer, nullable=False)}, + ) + + run_test(BaseType) + + def test_propagate_w_field_mixin_col_and_default(self, run_test): + @dataclasses.dataclass + class BaseType: + __sa_dataclass_metadata_key__ = "sa" + + __table_args__ = {"mysql_engine": "InnoDB"} + + discriminator: str = Column("type", String(50)) + __mapper_args__ = dict(polymorphic_on=discriminator) + id: int = Column(Integer, primary_key=True) + value: int = Column(Integer()) + + timestamp: int = dataclasses.field( + init=False, + default=None, + metadata={"sa": Column(Integer, nullable=False)}, + ) + + run_test(BaseType) + + @testing.fixture() + def run_test(self): + def go(BaseType): + declarative = registry().mapped + + @declarative + @dataclasses.dataclass + class Single(BaseType): + + __tablename__ = "single" + __mapper_args__ = dict(polymorphic_identity="type1") + + @declarative + @dataclasses.dataclass + class Joined(Single): + __tablename__ = "joined" + __mapper_args__ = dict(polymorphic_identity="type2") + id = Column(Integer, ForeignKey("single.id"), primary_key=True) + + eq_(Single.__table__.name, "single") + eq_( + list(Single.__table__.c.keys()), + ["type", "id", "value", "timestamp"], + ) + eq_(Single.__table__.kwargs, {"mysql_engine": "InnoDB"}) + + eq_(Joined.__table__.name, "joined") + eq_(list(Joined.__table__.c.keys()), ["id"]) + eq_(Joined.__table__.kwargs, {"mysql_engine": "InnoDB"}) + + yield go + + clear_mappers() |