summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorSimon Schiele <simon.schiele@sony.com>2022-11-30 08:40:50 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2022-11-30 16:04:24 -0500
commit0042076f5db0cdeceee51b5ce32d76cc54c2af69 (patch)
tree05f816088f68c895d00040d56374bafc0ebd2064 /test
parentc440c920aecd6593974e5a0d37cdb9069e5d3e57 (diff)
downloadsqlalchemy-0042076f5db0cdeceee51b5ce32d76cc54c2af69.tar.gz
Add "compare" on dataclass fields
Added :paramref:`_orm.mapped_column.compare` parameter to relevant ORM attribute constructs including :func:`_orm.mapped_column`, :func:`_orm.relationship` etc. to provide for the Python dataclasses ``compare`` parameter on ``field()``, when using the :ref:`orm_declarative_native_dataclasses` feature. Pull request courtesy Simon Schiele. Added an additional case for associationproxy into test_dc_transforms.py -> test_attribute_options Fixes: #8905 Closes: #8906 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/8906 Pull-request-sha: ea9a53d2ca60befdd0c570013c0e57a78c11dd4a Change-Id: I390d043b06c1d668242325ef86e2f7b7dbfac442
Diffstat (limited to 'test')
-rw-r--r--test/orm/declarative/test_dc_transforms.py52
1 files changed, 35 insertions, 17 deletions
diff --git a/test/orm/declarative/test_dc_transforms.py b/test/orm/declarative/test_dc_transforms.py
index c9c2e69c8..202eaef4a 100644
--- a/test/orm/declarative/test_dc_transforms.py
+++ b/test/orm/declarative/test_dc_transforms.py
@@ -25,6 +25,7 @@ from sqlalchemy import JSON
from sqlalchemy import select
from sqlalchemy import String
from sqlalchemy import testing
+from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import column_property
from sqlalchemy.orm import composite
from sqlalchemy.orm import DeclarativeBase
@@ -570,6 +571,17 @@ class DCTransformsTest(AssertsCompiledSQL, fixtures.TestBase):
),
)
+ def test_compare(self, dc_decl_base: Type[MappedAsDataclass]):
+ class A(dc_decl_base):
+ __tablename__ = "a"
+
+ id: Mapped[int] = mapped_column(primary_key=True, compare=False)
+ data: Mapped[str]
+
+ a1 = A(id=0, data="foo")
+ a2 = A(id=1, data="foo")
+ eq_(a1, a2)
+
@testing.only_if(lambda: compat.py310, "python 3.10 is required")
def test_kw_only(self, dc_decl_base: Type[MappedAsDataclass]):
class A(dc_decl_base):
@@ -1192,30 +1204,36 @@ class DataclassArgsTest(fixtures.TestBase):
id: Mapped[int] = mapped_column(primary_key=True, init=False)
- @testing.combinations(True, False)
- def test_attribute_options(self, args):
- if args:
+ @testing.variation("use_arguments", [True, False])
+ @testing.combinations(
+ mapped_column,
+ lambda **kw: synonym("some_int", **kw),
+ lambda **kw: column_property(Column(Integer), **kw),
+ lambda **kw: deferred(Column(Integer), **kw),
+ lambda **kw: composite("foo", **kw),
+ lambda **kw: relationship("Foo", **kw),
+ lambda **kw: association_proxy("foo", "bar", **kw),
+ argnames="construct",
+ )
+ def test_attribute_options(self, use_arguments, construct):
+ if use_arguments:
kw = {
- "init": True,
- "repr": True,
- "default": True,
+ "init": False,
+ "repr": False,
+ "default": False,
"default_factory": list,
- "kw_only": True,
+ "compare": True,
+ "kw_only": False,
}
- exp = interfaces._AttributeOptions(True, True, True, list, True)
+ exp = interfaces._AttributeOptions(
+ False, False, False, list, True, False
+ )
else:
kw = {}
exp = interfaces._DEFAULT_ATTRIBUTE_OPTIONS
- for prop in [
- mapped_column(**kw),
- synonym("some_int", **kw),
- column_property(Column(Integer), **kw),
- deferred(Column(Integer), **kw),
- composite("foo", **kw),
- relationship("Foo", **kw),
- ]:
- eq_(prop._attribute_options, exp)
+ prop = construct(**kw)
+ eq_(prop._attribute_options, exp)
class MixinColumnTest(fixtures.TestBase, testing.AssertsCompiledSQL):