Работа с паттернами¶
Паттерны в FUCKTAR определяют правила генерации данных для каждой модели. В этом разделе мы рассмотрим, как создавать и использовать паттерны.
Структура паттерна¶
Паттерн представляет собой класс, наследующий от BasePattern[T], где T - это тип модели данных:
from fucktar.generator import BasePattern
from fucktar.config import PatternConfig
class UserPatterns(BasePattern[User]):
# Определение паттернов для полей
first_name = r"^[A-Z][a-z]{4,9}$"
last_name = r"^[A-Z][a-z]{4,12}$"
email = r"^[a-z0-9._%+-]{5,20}@(gmail\.com|mail\.ru)$"
# Конфигурация паттерна
pattern_config = PatternConfig(
scope="users",
unique_fields=["email"]
)
Использование встроенных паттернов¶
FUCKTAR предоставляет набор встроенных паттернов для различных типов данных:
from fucktar.default_patterns.users import UserRuPatterns
from fucktar.default_patterns.network import NetworkPatterns
class UserPatterns(BasePattern[User]):
first_name = UserRuPatterns.first_name
last_name = UserRuPatterns.last_name
email = UserRuPatterns.email
phone = UserRuPatterns.phone
ipv4 = NetworkPatterns.ipv4
Создание пользовательских паттернов¶
Вы можете создавать собственные паттерны для специфических требований:
class ProductPatterns(BasePattern[Product]):
name = r"^[A-Z][a-z]{5,20} [A-Z][a-z]{3,15}$"
price = r"^\d{1,4}\.\d{2}$" # Цена в формате 0.00 - 9999.99
category = r"^(electronics|clothing|books|home)$"
in_stock = r"^(True|False)$" # Булево значение как строка
Комбинирование паттернов¶
Вы можете комбинировать встроенные и пользовательские паттерны:
class UserPatterns(BasePattern[User]):
# Используем встроенные паттерны
first_name = UserRuPatterns.first_name
last_name = UserRuPatterns.last_name
email = UserRuPatterns.email
# Определяем собственные паттерны
custom_field = r"^[A-Z]{3}-\d{3}$"
Наследование паттернов¶
Вы можете создавать иерархии паттернов для повторного использования:
class BaseUserPatterns:
email = r"^[a-z0-9._%+-]{5,20}@(gmail\.com|mail\.ru)$"
phone = r"^\+79\d{9}$"
class UserRuPatterns(BaseUserPatterns):
first_name = r"^[А-ЯЁ][а-яё]{4,9}$"
last_name = r"^[А-ЯЁ][а-яё]{4,12}$"
class UserEnPatterns(BaseUserPatterns):
first_name = r"^[A-Z][a-z]{4,9}$"
last_name = r"^[A-Z][a-z]{4,12}$"
Паттерны для сложных типов данных¶
Для генерации сложных типов данных вы можете использовать строковые представления:
from datetime import datetime
from ipaddress import IPv4Address
class NetworkPatterns(BasePattern[NetworkData]):
# Генерируем строку, которая будет преобразована в IPv4Address
ipv4 = r"^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}$"
# Генерируем строку даты
created_at = r"^(19|20)\d{2}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|2[0-8])$"
В модели данных вы можете определить свойства для преобразования строк в нужные типы:
@dataclass
class NetworkData:
ipv4_str: str
created_at_str: str
@property
def ipv4(self) -> IPv4Address:
return IPv4Address(self.ipv4_str)
@property
def created_at(self) -> datetime:
return datetime.fromisoformat(self.created_at_str)
Валидация паттернов¶
FUCKTAR автоматически проверяет корректность регулярных выражений при создании паттерна. Если регулярное выражение некорректно, будет выброшено исключение PatternGenerationError.
Рекомендации по созданию паттернов¶
- Используйте встроенные паттерны, когда это возможно, для обеспечения согласованности
- Создавайте пользовательские паттерны для специфических требований вашего проекта
- Документируйте свои паттерны, чтобы другие разработчики могли понять их назначение
- Тестируйте паттерны, чтобы убедиться, что они генерируют корректные данные
- Используйте наследование для повторного использования общих паттернов