Module adcp.compat.legacy.v2_5.preview_creative
v2.5 → v3 adapter for preview_creative.
- Request shape: identical between v2.5 and v3 — pass-through.
- Response shape: v2.5 emits
output_id/output_roleon each preview render; v3 renames these torender_id/role. The normalizer accepts either set (preferring v3 names when both are present so a half-migrated server doesn't double-translate).
Handles both single-response {previews: [...]} and batch-response
{results: [{success, response: {previews: [...]}}, ...]} shapes.
Direct port of src/lib/utils/preview-normalizer.ts /
src/lib/adapters/legacy/v2-5/preview_creative.ts.
Functions
def normalize_response(response: dict[str, Any]) ‑> dict[str, typing.Any]-
Expand source code
def normalize_response(response: dict[str, Any]) -> dict[str, Any]: """Normalize a v2.5 ``preview_creative`` response. Two shapes are handled: * **Single:** ``{previews: [...], ...}`` — each preview's renders are normalized. * **Batch:** ``{results: [{success: bool, response: {previews: [...]}}, ...]}`` — successful entries get their nested previews normalized; failures pass through. """ previews = response.get("previews") if isinstance(previews, list): return { **response, "previews": [_normalize_preview(p) if isinstance(p, dict) else p for p in previews], } results = response.get("results") if isinstance(results, list): new_results: list[Any] = [] for entry in results: if not isinstance(entry, dict): new_results.append(entry) continue if entry.get("success") and isinstance(entry.get("response"), dict): inner = entry["response"] inner_previews = inner.get("previews") if isinstance(inner_previews, list): new_results.append( { **entry, "response": { **inner, "previews": [ _normalize_preview(p) if isinstance(p, dict) else p for p in inner_previews ], }, } ) continue new_results.append(entry) return {**response, "results": new_results} return responseNormalize a v2.5
preview_creativeresponse.Two shapes are handled:
- Single:
{previews: [...], ...}— each preview's renders are normalized. - Batch:
{results: [{success: bool, response: {previews: [...]}}, ...]}— successful entries get their nested previews normalized; failures pass through.
- Single: