Перейти к содержанию

Работа с паттернами

Паттерны в 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.

Рекомендации по созданию паттернов

  1. Используйте встроенные паттерны, когда это возможно, для обеспечения согласованности
  2. Создавайте пользовательские паттерны для специфических требований вашего проекта
  3. Документируйте свои паттерны, чтобы другие разработчики могли понять их назначение
  4. Тестируйте паттерны, чтобы убедиться, что они генерируют корректные данные
  5. Используйте наследование для повторного использования общих паттернов