From 50f37e3a4099fca0043ecbe58c67eb649103de86 Mon Sep 17 00:00:00 2001 From: guacs Date: Wed, 1 Nov 2023 18:22:26 +0530 Subject: [PATCH 1/2] fix: respect 'init' in dataclasses --- polyfactory/factories/dataclass_factory.py | 3 +++ tests/test_dataclass_factory.py | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/polyfactory/factories/dataclass_factory.py b/polyfactory/factories/dataclass_factory.py index b4c6d2ba..01cfbe79 100644 --- a/polyfactory/factories/dataclass_factory.py +++ b/polyfactory/factories/dataclass_factory.py @@ -36,6 +36,9 @@ def get_model_fields(cls) -> list["FieldMeta"]: model_type_hints = get_type_hints(cls.__model__, include_extras=True) for field in fields(cls.__model__): # type: ignore[arg-type] + if not field.init: + continue + if field.default_factory and field.default_factory is not MISSING: default_value = field.default_factory() elif field.default is not MISSING: diff --git a/tests/test_dataclass_factory.py b/tests/test_dataclass_factory.py index 276b81b5..eb06199b 100644 --- a/tests/test_dataclass_factory.py +++ b/tests/test_dataclass_factory.py @@ -192,3 +192,16 @@ class FooFactory(DataclassFactory[Foo]): # type:ignore[valid-type] foo = FooFactory.build() assert isinstance(foo, Foo) + + +def test_dataclass_with_init_false() -> None: + @vanilla_dataclass + class VanillaDC: + id_: int = field(init=False) + + class MyFactory(DataclassFactory[VanillaDC]): + __model__ = VanillaDC + + result = MyFactory.build() + + assert result From d6f17ea1b381ede05de1f5069ced5554336b3978 Mon Sep 17 00:00:00 2001 From: guacs Date: Wed, 1 Nov 2023 18:26:11 +0530 Subject: [PATCH 2/2] fix: respect 'init' in attrs models --- polyfactory/factories/attrs_factory.py | 3 +++ tests/test_attrs_factory.py | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/polyfactory/factories/attrs_factory.py b/polyfactory/factories/attrs_factory.py index 52391520..f9302845 100644 --- a/polyfactory/factories/attrs_factory.py +++ b/polyfactory/factories/attrs_factory.py @@ -43,6 +43,9 @@ def get_model_fields(cls) -> list[FieldMeta]: fields = attrs.fields(cls.__model__) for field in fields: + if not field.init: + continue + annotation = none_type if field.type is None else field.type default = field.default diff --git a/tests/test_attrs_factory.py b/tests/test_attrs_factory.py index f4f56576..fbbae974 100644 --- a/tests/test_attrs_factory.py +++ b/tests/test_attrs_factory.py @@ -180,3 +180,14 @@ class FooFactory(AttrsFactory[Foo]): foo = FooFactory.build() assert isinstance(foo.int_field, int) + + +def test_with_init_false() -> None: + @define + class Foo: + foo: int = attrs.field(init=False) + + class FooFactory(AttrsFactory[Foo]): + __model__ = Foo + + assert FooFactory.build()