summaryrefslogtreecommitdiff
path: root/test/orm/test_dataclasses_py3k.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2021-03-18 15:07:03 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2021-03-18 15:08:26 -0400
commitce2f28c37e0a2f2aa3b4a404ee190cdc00b8b918 (patch)
tree29a175c6614985f630a2434532e613d459066f68 /test/orm/test_dataclasses_py3k.py
parent3fec5028e695ad138aa46a0ae66c55e8bcb653f6 (diff)
downloadsqlalchemy-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.py117
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()