Customisation
The
fake.FAKER
is an instance of thefake.Faker
class.The
fake.FACTORY
is an instance of thefake.Factory
class, initialised with thefake.FAKER
instance.
The Faker
class is easy to customise. See the following example:
Filename: custom_fake.py
import random
import string
from fake import Faker, Factory, provider
# Custom first names dictionary
FIRST_NAMES = [
"Anahit",
"Ani",
"Aram",
"Areg",
"Artur",
"Astghik",
"Atom",
"Barsegh",
"Gaiane",
"Gor",
"Hakob",
"Hasmik",
"Levon",
"Lilit",
"Mariam",
"Nare",
"Narek",
"Nune",
"Raffi",
"Shant",
"Tatev",
"Tigran",
"Vahan",
"Vardan",
]
# Custom last names dictionary
LAST_NAMES = [
"Amatouni",
"Avagyan",
"Danielyan",
"Egoyan",
"Gevorgyan",
"Gnouni",
"Grigoryan",
"Hakobyan",
"Harutyunyan",
"Hovhannisyan",
"Karapetyan",
"Khachatryan",
"Manukyan",
"Melikyan",
"Mkrtchyan",
"Petrosyan",
"Sahakyants",
"Sargsyan",
"Saroyan",
"Sedrakyan",
"Simonyan",
"Stepanyan",
"Ter-Martirosyan",
"Vardanyan",
]
# Custom words dictionary
WORDS = [
"time", "person", "year", "way", "day", "thing", "man", "world",
"life", "hand", "part", "child", "eye", "woman", "place", "work",
"week", "case", "point", "government", "company", "number", "group",
"problem", "fact", "be", "have", "do", "say", "get", "make", "go",
"know", "take", "see", "come", "think", "look", "want", "give",
"use", "find", "tell", "ask", "work", "seem", "feel", "try", "leave",
"call", "good", "new", "first", "last", "long", "great", "little",
"own", "other", "old", "right", "big", "high", "different", "small",
"large", "next", "early", "young", "important", "few", "public",
"bad", "same", "able", "to", "of", "in", "for", "on", "with", "as",
"at", "by", "from", "up", "about", "into", "over", "after",
"beneath", "under", "above", "the", "and", "a", "that", "I", "it",
"not",
]
STREET_NAMES = [
"Bosweg",
"Groningerweg",
"Jasmijnstraat",
"Noordstraat",
"Ooststraat",
"Oranjestraat",
"Prinsengracht",
"Ringweg",
"Weststraat",
"Zonnelaan",
"Zuidstraat",
]
CITIES = [
"Amsterdam",
"Delft",
"Den Haag",
"Groningen",
"Leiden",
"Nijmegen",
]
REGIONS = [
"Friesland",
"Groningen",
"Limburg",
"Utrecht",
]
class CustomFaker(Faker):
"""Custom Faker class."""
def load_names(self) -> None:
"""Override default first- and last-names dictionaries."""
self._first_names = FIRST_NAMES
self._last_names = LAST_NAMES
def load_words(self) -> None:
"""Override default words dictionary."""
self._words = WORDS
@provider
def address_line(self) -> str:
"""Generate a random Dutch address line like 'Oranjestraat 1'.
:return: A randomly generated Dutch address line as a string.
"""
# Generate components of the address
street = random.choice(STREET_NAMES)
house_number = random.randint(1, 200)
suffixes = [""] * 10 + ["A", "B", "C"] # Optional suffixes
suffix = random.choice(suffixes)
# Combine components into a Dutch address format
return f"{street} {house_number}{suffix}"
@provider
def city(self) -> str:
return random.choice(CITIES)
@provider
def region(self) -> str:
return random.choice(REGIONS)
@provider
def postal_code(self) -> str:
"""Generate a random Dutch postal code in the format '1234 AB'.
:return: A randomly generated Dutch postal code as a string.
"""
number_part = "".join(random.choices(string.digits, k=4))
letter_part = "".join(random.choices(string.ascii_uppercase, k=2))
return f"{number_part} {letter_part}"
FAKER = CustomFaker()
FACTORY = Factory(FAKER)
The postal_code
is the provider method and shall be decorated with
@provider
decorator.
You can now use both FAKER
and FACTORY
as you would normally do.
Filename: models.py
from dataclasses import dataclass
from datetime import date
@dataclass
class Address:
id: int
address_line: str
postal_code: str
city: str
region: str
def __str__(self) -> str:
return self.address_line
@dataclass
class Person:
id: int
first_name: str
last_name: str
email: str
dob: date
address: Address
def __str__(self) -> str:
return self.username
Filename: factories.py
from fake import ModelFactory, SubFactory, post_save, pre_save
# Import defined ORM models and customised FACTORY instance:
# from models import Address, Person
# from custom_fake import FACTORY
class AddressFactory(ModelFactory):
id = FACTORY.pyint()
address_line = FACTORY.address_line()
postal_code = FACTORY.postal_code()
city = FACTORY.city()
region = FACTORY.region()
class Meta:
model = Address
class PersonFactory(ModelFactory):
id = FACTORY.pyint()
first_name = FACTORY.first_name()
last_name = FACTORY.last_name()
email = FACTORY.email()
dob = FACTORY.date()
address = SubFactory(AddressFactory)
class Meta:
model = Person
And this is how you could use it:
address = AddressFactory()
assert isinstance(address, Address)
assert address.city in CITIES
assert address.region in REGIONS
person = PersonFactory()
assert isinstance(person, Person)
assert person.first_name in FIRST_NAMES
assert person.last_name in LAST_NAMES