Работа с историей¶
FUCKTAR автоматически сохраняет историю сгенерированных уникальных данных для предотвращения дубликатов между сессиями. В этом разделе мы рассмотрим, как управлять историей генерации.
Как работает история¶
FUCKTAR сохраняет сигнатуры сгенерированных объектов в файловой системе. Каждый scope имеет свой файл истории в формате JSONL (JSON Lines), где каждая строка представляет собой JSON-объект с сигнатурой и данными.
Расположение файлов истории¶
Файлы истории сохраняются в директории .generator_scopes в рабочей директории. Каждый файл истории имеет имя, соответствующее scope паттерна, с расширением .jsonl.
Управление историей¶
Удаление истории для конкретного scope¶
from fucktar.storage import ScopeStorage
# Удаление истории для scope "users"
ScopeStorage.remove("users")
Очистка всей истории¶
Сигнатуры объектов¶
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()
Ограничения работы с историей¶
- Файлы истории не должны быть заблокированы другими процессами
- При повреждении файла истории поврежденные записи игнорируются
- Большие файлы истории могут замедлять процесс генерации
Рекомендации по работе с историей¶
- Регулярно очищайте историю в тестах
- Используйте осмысленные имена для scope
- Удаляйте историю для scope, когда она больше не нужна
- При работе с большими объемами данных рассмотрите возможность периодической очистки истории
- Используйте
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} байт")
Это может быть полезно для мониторинга и оптимизации использования дискового пространства.