diff options
| author | Simon Schiele <simon.schiele@sony.com> | 2022-11-30 08:40:50 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-11-30 16:04:24 -0500 |
| commit | 0042076f5db0cdeceee51b5ce32d76cc54c2af69 (patch) | |
| tree | 05f816088f68c895d00040d56374bafc0ebd2064 /test | |
| parent | c440c920aecd6593974e5a0d37cdb9069e5d3e57 (diff) | |
| download | sqlalchemy-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.py | 52 |
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): |
