Spaces:
Sleeping
Sleeping
| import importlib.util | |
| import json | |
| from pathlib import Path | |
| SCRIPT_PATH = Path(__file__).resolve().parents[1] / "scripts" / "devpost_form_kit.py" | |
| SPEC = importlib.util.spec_from_file_location("devpost_form_kit", SCRIPT_PATH) | |
| devpost_form_kit = importlib.util.module_from_spec(SPEC) | |
| assert SPEC.loader is not None | |
| SPEC.loader.exec_module(devpost_form_kit) | |
| def write_file(root: Path, relative_path: str, content: str) -> None: | |
| path = root / relative_path | |
| path.parent.mkdir(parents=True, exist_ok=True) | |
| path.write_text(content, encoding="utf-8") | |
| def packet(*, live: bool = False, video_url: str | None = None) -> dict[str, object]: | |
| return { | |
| "mode": "post_live_verified" if live else "pre_live_safe", | |
| "claim_warning": "Use only after live proof." if live else "Safe for public mock demo only.", | |
| "project_name": "ProofFrame", | |
| "tagline": "A provenance-first vault for generated media.", | |
| "one_liner": "ProofFrame turns generated media into reviewable evidence packets.", | |
| "repository_url": "https://github.com/adjcjh777/backblaze-proofframe", | |
| "demo_url": "https://adjcjh-backblaze-proofframe.hf.space/?judge=1", | |
| "video_url": video_url or "TBD after final B2 and Genblaze proof.", | |
| "short_description": "A review desk for generated media evidence packets.", | |
| "inspiration": "Generated media needs operational provenance.", | |
| "what_it_does": ["Create a campaign.", "Review assets.", "Export evidence."], | |
| "how_we_built_it": "FastAPI, local demo mode, B2 storage adapter, Genblaze adapter.", | |
| "b2_usage": "B2 live proof is a final submission gate.", | |
| "genblaze_usage": "Genblaze live proof is a final submission gate.", | |
| "challenges": "Avoiding shallow sponsor integration.", | |
| "accomplishments": ["Working product.", "Public mock demo.", "Fail-closed gates."], | |
| "what_we_learned": "The useful unit is an evidence packet.", | |
| "whats_next": ["Live B2 proof.", "Live Genblaze proof.", "Final video."], | |
| } | |
| def write_fixtures(root: Path, *, live: bool = False, video_url: str | None = None) -> None: | |
| task_ids = ["T020", "T021", "T040", "T041", "T041A", "T042"] | |
| statuses = { | |
| task_id: "done" if live and task_id in {"T020", "T021", "T040", "T041A"} else "todo" | |
| for task_id in task_ids | |
| } | |
| statuses["T040"] = "done" | |
| write_file( | |
| root, | |
| "tasks.json", | |
| json.dumps( | |
| { | |
| "tasks": [ | |
| {"id": task_id, "title": task_id, "status": status} | |
| for task_id, status in statuses.items() | |
| ] | |
| } | |
| ), | |
| ) | |
| write_file( | |
| root, | |
| "docs/assets/devpost-submission-packet.json", | |
| json.dumps(packet(live=live, video_url=video_url)), | |
| ) | |
| if live: | |
| write_file( | |
| root, | |
| "docs/assets/final-live-proof-evidence.json", | |
| json.dumps( | |
| { | |
| "ok": True, | |
| "storage_backend": "b2", | |
| "generation_backend": "genblaze", | |
| "asset_storage_backend": "b2", | |
| "asset_provider": "genblaze/gmicloud-image", | |
| "asset_sha256": "a" * 64, | |
| "manifest_sha256": "b" * 64, | |
| "asset_storage_key": "campaigns/cmp/assets/asset.png", | |
| "manifest_key": "campaigns/cmp/manifests/manifest.json", | |
| } | |
| ), | |
| ) | |
| def test_devpost_form_kit_is_mock_ready_but_not_final(tmp_path): | |
| write_fixtures(tmp_path) | |
| kit = devpost_form_kit.build_form_kit(tmp_path) | |
| assert kit["mock_form_ready"] is True | |
| assert kit["final_form_ready"] is False | |
| assert kit["public_video_ready"] is False | |
| assert "Regenerate the Devpost packet in post-live mode" in kit["next_actions"][0] | |
| def test_devpost_form_kit_flags_overlong_fields(tmp_path): | |
| write_fixtures(tmp_path) | |
| packet_path = tmp_path / "docs/assets/devpost-submission-packet.json" | |
| data = json.loads(packet_path.read_text(encoding="utf-8")) | |
| data["tagline"] = "x" * 141 | |
| packet_path.write_text(json.dumps(data), encoding="utf-8") | |
| kit = devpost_form_kit.build_form_kit(tmp_path) | |
| tagline = next(field for field in kit["fields"] if field["id"] == "tagline") | |
| assert kit["mock_form_ready"] is False | |
| assert tagline["too_long"] is True | |
| def test_devpost_form_kit_passes_final_with_live_proof_and_video(tmp_path): | |
| write_fixtures(tmp_path, live=True, video_url="https://youtu.be/example-proof") | |
| kit = devpost_form_kit.build_form_kit(tmp_path) | |
| assert kit["mock_form_ready"] is True | |
| assert kit["final_form_ready"] is True | |
| assert kit["mode"] == "final_form_ready" | |
| def test_devpost_form_kit_writes_outputs(tmp_path): | |
| write_fixtures(tmp_path) | |
| kit = devpost_form_kit.build_form_kit(tmp_path) | |
| json_path = tmp_path / "out" / "kit.json" | |
| markdown_path = tmp_path / "out" / "kit.md" | |
| devpost_form_kit.write_outputs(kit, json_path, markdown_path) | |
| saved = json.loads(json_path.read_text(encoding="utf-8")) | |
| markdown = markdown_path.read_text(encoding="utf-8") | |
| assert saved["schema"] == "proofframe.devpost_form_kit.v1" | |
| assert "# ProofFrame Devpost Form Kit" in markdown | |
| assert "## Fields" in markdown | |