Custom Objects¶
Sometimes, probably, you need more power to give details to the generated objects, no problem, Dataclass bakery helps you to generate that special environment you need to test your code using the _default_attrs argument in the baker.
We are working with two dataclasses, Customer and Address:
from dataclasses import dataclass
from typing import List
from uuid import UUID
@dataclass
class Customer:
id: int
name: str
spent_money: float
address: Address
orders: List[UUID]
@dataclass
class Address
street_name: str
number: int
To change the behaviour with the default values of the baker we need to type:
from dataclass_bakery import baker
defaults = {
'street_name': {
'_max_length_': 15
}
}
baker.make(Address, _attr_defaults=defaults)
"""
Address(street_name='vnlHYKsDXQkyODI', number=49)
"""
You can read the default values you can change per generator in the generators page.
Also you can change the generator of an attribute:
from dataclass_bakery.generators.random_str_generator import RandomStrGenerator
defaults = {
'number': {
'_generator_': RandomStrGenerator
}
}
baker.make(Address, _attr_defaults=defaults)
"""
Address(street_name='RtfgQkyODI', number='KsDXQkyODI')
"""
Another possibility is fix a value:
defaults = {
'number': {
'_fixed_value_': 1234
}
}
baker.make(Address, _attr_defaults=defaults)
"""
Address(street_name='jdRFDadkXf', number=1234)
"""
And you can combine some different actions in your generated object:
from dataclass_bakery.generators.random_float_generator import RandomFloatGenerator
defaults = {
'number': {
'_generator_': RandomFloatGenerator,
'_min_limit_': 30
},
'street_name': {
'_max_length_': 20
}
}
baker.make(Address, _attr_defaults=defaults)
"""
Address(number=42.93, street_name='YqgpvEISVKzAlfeemJil')
"""
Finally you can do all actions you read before in different data class levels:
- defaults = {
- ‘name’: {
‘_max_length_’: 20
}, ‘address’: {
- ‘number’: {
‘_generator_’: RandomFloatGenerator, ‘_min_limit_’: 30
}, ‘street_name’: {
‘_max_length_’: 20
}
}
}
baker.make(Customer, _attr_defaults=defaults)
“”” Customer(id=16, name=’MRoWdUYJiKbFddoCbeOm’, spent_money=23.88, address=Address(number=48.34, street_name=’qRRXWiUPusHmOmQgKWPr’), orders=[UUID(‘cfbbad2d-bc77-474b-8934-b2438e2abb34’), UUID(‘f2a48ce4-30b4-46e0-b2d1-813be8e87e35’)]) “””