@classmethod
def from_dict(
cls, data: dict[str, Any],
) -> SyncManifest:
node_id = data.get('node_id')
checkpoint = data.get('checkpoint')
if node_id is None:
message = "SyncManifest requires 'node_id'"
raise ManifestFieldError(message)
if not isinstance(node_id, str):
message = "'node_id' must be a string"
raise ManifestFieldError(message)
if not node_id:
message = "'node_id' must be a non-empty string"
raise ManifestFieldError(message)
if checkpoint is None:
message = "SyncManifest requires 'checkpoint'"
raise ManifestFieldError(message)
if (
not isinstance(checkpoint, int)
or isinstance(checkpoint, bool)
):
message = "'checkpoint' must be an integer"
raise ManifestFieldError(message)
if checkpoint < 0:
message = (
f"'checkpoint' must be non-negative, "
f"got {checkpoint}"
)
raise ManifestFieldError(message)
node_time = data.get('node_time', 0)
if (
not isinstance(node_time, int)
or isinstance(node_time, bool)
):
message = "'node_time' must be an integer"
raise ManifestFieldError(message)
if node_time < 0:
message = (
f"'node_time' must be non-negative, "
f"got {node_time}"
)
raise ManifestFieldError(message)
after_keys = data.get('after_keys', {})
has_more = data.get('has_more', False)
raw_payloads = data.get('payloads', [])
if not isinstance(raw_payloads, list):
message = "'payloads' must be a list"
raise ManifestFieldError(message)
if len(raw_payloads) > _PAYLOADS_MAX:
message = (
f"'payloads' exceeds maximum of "
f"{_PAYLOADS_MAX}"
)
raise ManifestFieldError(message)
seen_labels: set[str] = set()
payloads: list[ModelPayload] = []
for raw_payload in raw_payloads:
payload = ModelPayload.from_dict(raw_payload)
if payload.model_label in seen_labels:
message = (
f"duplicate model_label: "
f"{payload.model_label!r}"
)
raise ManifestFieldError(message)
seen_labels.add(payload.model_label)
payloads.append(payload)
return cls(
node_id=node_id,
checkpoint=checkpoint,
after_keys=after_keys if isinstance(after_keys, dict) else {},
checksum=data.get('checksum', ''),
has_more=has_more,
node_time=node_time,
payloads=payloads,
)