Dataclasses and attrs-heavy codebases
Capper works well even when you do not use Pydantic at all. This guide shows patterns for dataclasses and attrs using Polyfactory.
Dataclasses with DataclassFactory
from dataclasses import dataclass
from capper import Email, Name
from polyfactory.factories import DataclassFactory
@dataclass
class Person:
name: Name
email: Email
class PersonFactory(DataclassFactory[Person]):
__random_seed__ = 7
Use the factory in tests:
def test_person_factory_builds() -> None:
person = PersonFactory.build()
assert isinstance(person.name, str)
assert isinstance(person.email, str)
attrs classes
If you prefer attrs, use attrs.define and the same DataclassFactory:
import attrs
from capper import Name
from polyfactory.factories import DataclassFactory
@attrs.define
class Customer:
name: Name
class CustomerFactory(DataclassFactory[Customer]):
pass
Mixing Capper types with built-in types
Capper types behave like strings (or whatever base type you choose), so you can mix them with normal fields:
@dataclass
class Order:
customer_name: Name
total_cents: int
DataclassFactory[Order] will use Capper for customer_name and Polyfactory defaults for total_cents.
Running the example
From the repo root (with Capper installed):
python docs/examples/dataclasses_and_attrs.py
Example output (values will vary):
--- Person (dataclass) ---
Person(name='Chris Curtis', email='nicholsonclinton@example.net')
The example script demonstrates both dataclasses and attrs usage. See also: