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

Работа с историей

FUCKTAR автоматически сохраняет историю сгенерированных уникальных данных для предотвращения дубликатов между сессиями. В этом разделе мы рассмотрим, как управлять историей генерации.

Как работает история

FUCKTAR сохраняет сигнатуры сгенерированных объектов в файловой системе. Каждый scope имеет свой файл истории в формате JSONL (JSON Lines), где каждая строка представляет собой JSON-объект с сигнатурой и данными.

Расположение файлов истории

Файлы истории сохраняются в директории .generator_scopes в рабочей директории. Каждый файл истории имеет имя, соответствующее scope паттерна, с расширением .jsonl.

Управление историей

Удаление истории для конкретного scope

from fucktar.storage import ScopeStorage

# Удаление истории для scope "users"
ScopeStorage.remove("users")

Очистка всей истории

from fucktar.storage import ScopeStorage

# Очистка всей истории
ScopeStorage.clear_all()

Сигнатуры объектов

FUCKTAR использует сигнатуры для идентификации уникальных объектов. Сигнатура создается как JSON-строка кортежа значений выбранных полей:

from fucktar.signature import SignatureService

# Создание сигнатуры по определенным полям
obj = {"name": "John", "email": "john@example.com", "age": 30}
sig = SignatureService.composite(obj, ["email"])

Если unique_fields не указаны, сигнатура создается для всех полей объекта.

Формат файла истории

Файлы истории имеют формат JSONL, где каждая строка представляет собой JSON-объект:

{"_sig": "[\"john@example.com\"]", "data": {"name": "John", "email": "john@example.com", "age": "30"}}
{"_sig": "[\"jane@example.com\"]", "data": {"name": "Jane", "email": "jane@example.com", "age": "25"}}

Работа с файлами истории напрямую

Хотя рекомендуется использовать API ScopeStorage, вы можете работать с файлами истории напрямую:

import json
from fucktar.constants import STORAGE_DIR

# Чтение истории напрямую
history_file = STORAGE_DIR / "users.jsonl"
if history_file.exists():
    with open(history_file, "r") as f:
        for line in f:
            entry = json.loads(line)
            print(f"Signature: {entry['_sig']}")
            print(f"Data: {entry['data']}")

Очистка истории в тестах

При написании тестов важно очищать историю между тестами:

import pytest
from fucktar.storage import ScopeStorage

@pytest.fixture(autouse=True)
def cleanup():
    """Очистка перед каждым тестом"""
    ScopeStorage.clear_all()
    yield
    ScopeStorage.clear_all()

Ограничения работы с историей

  1. Файлы истории не должны быть заблокированы другими процессами
  2. При повреждении файла истории поврежденные записи игнорируются
  3. Большие файлы истории могут замедлять процесс генерации

Рекомендации по работе с историей

  1. Регулярно очищайте историю в тестах
  2. Используйте осмысленные имена для scope
  3. Удаляйте историю для scope, когда она больше не нужна
  4. При работе с большими объемами данных рассмотрите возможность периодической очистки истории
  5. Используйте ignore_count=True при генерации большого количества уникальных данных, если точное количество не критично

Пример мониторинга размера истории

import os
from fucktar.constants import STORAGE_DIR

def get_history_size(scope_name):
    """Получение размера файла истории в байтах"""
    history_file = STORAGE_DIR / f"{scope_name}.jsonl"
    if history_file.exists():
        return os.path.getsize(history_file)
    return 0

# Использование
size = get_history_size("users")
print(f"Размер истории пользователей: {size} байт")

Это может быть полезно для мониторинга и оптимизации использования дискового пространства.