def __init__(
self,
storage: Storage,
identity_field: str,
compare_fields: list[str] | None = None,
deactivation_threshold: float | None = 0.5,
transaction: Callable[[], AbstractContextManager[Any]] | None = None,
on_created: Callable[[str, dict[str, Any]], None] | None = None,
on_deactivated: Callable[[str], None] | None = None,
on_updated: Callable[[str, dict[str, Any], dict[str, Any]], None] | None = None,
on_complete: Callable[[Result], None] | None = None,
progress: Callable[[SyncStage, int, int], None] | None = None,
) -> None:
if not identity_field:
message = 'identity_field must be a non-empty string'
raise FileSyncParameterError(message)
if deactivation_threshold is not None and deactivation_threshold < 0.0:
message = (
f'deactivation_threshold must be non-negative '
f'or None, got {deactivation_threshold}'
)
raise FileSyncParameterError(message)
self._identity_field = identity_field
self._deactivation_threshold = deactivation_threshold
self._on_complete = on_complete
self._on_created = on_created
self._on_deactivated = on_deactivated
self._on_updated = on_updated
self._progress = progress
self._storage = storage
self._transaction = transaction or nullcontext
self._hasher = RecordHasher(identity_field, compare_fields)