{
  "sha": "c39b2f5bb6d941f8c06a1a8bbf120df543543759",
  "message": "Merge pull request #223 from nnneeeooo-nnneeeooo/codex/optional-radar-snapshot\n\n雷達來源暫時無資料時仍可發布快報網站",
  "author": {
    "login": "nnneeeooo-nnneeeooo",
    "name": "",
    "email": ""
  },
  "committer": {
    "login": "web-flow",
    "name": "",
    "email": ""
  },
  "created_at": "2026-09-25T20:53:39Z",
  "files": [
    {
      "filename": ".github/workflows/briefing.yml",
      "previous_filename": "",
      "status": "modified",
      "additions": 1,
      "deletions": 1,
      "changes": 2
    },
    {
      "filename": ".github/workflows/hourly.yml",
      "previous_filename": "",
      "status": "modified",
      "additions": 1,
      "deletions": 1,
      "changes": 2
    },
    {
      "filename": ".github/workflows/manual-article-deploy.yml",
      "previous_filename": "",
      "status": "modified",
      "additions": 1,
      "deletions": 1,
      "changes": 2
    },
    {
      "filename": "pipeline/radar_snapshot.py",
      "previous_filename": "",
      "status": "modified",
      "additions": 9,
      "deletions": 1,
      "changes": 10
    },
    {
      "filename": "tests/test_radar_snapshot.py",
      "previous_filename": "",
      "status": "modified",
      "additions": 14,
      "deletions": 0,
      "changes": 14
    }
  ],
  "diff": "@@ -110,7 +110,7 @@ jobs:\\n             python pipeline/briefing.py --edition \"${{ steps.ed.outputs.edition }}\"\\n           fi\\n           python pipeline/build.py\\n-          python pipeline/radar_snapshot.py\\n+          python pipeline/radar_snapshot.py --optional\\n \\n       - name: Scan build output and committed data for secrets/reasoning\\n         run: |\\n@@ -146,7 +146,7 @@ jobs:\\n           git fetch origin \"${GITHUB_REF_NAME}\"\\n           git checkout \"origin/${GITHUB_REF_NAME}\" -- data/briefings || true\\n           python pipeline/build.py\\n-          python pipeline/radar_snapshot.py\\n+          python pipeline/radar_snapshot.py --optional\\n \\n       # Audit the pipeline output after images.py has had a chance to remove\\n       # stale or misleading cached photos. This still fails closed before any\\n@@ -66,7 +66,7 @@ jobs:\\n           python pipeline/image_captions.py\\n           python tests/test_image_captions.py\\n           python pipeline/build.py\\n-          python pipeline/radar_snapshot.py\\n+          python pipeline/radar_snapshot.py --optional\\n \\n       - name: Scan publishable output\\n         run: |\\n@@ -54,8 +54,16 @@ def write_snapshot(output: Path) -> dict:\\n def main() -> int:\\n     parser = argparse.ArgumentParser()\\n     parser.add_argument(\"--output\", type=Path, default=DEFAULT_OUTPUT)\\n+    parser.add_argument(\"--optional\", action=\"store_true\",\\n+                        help=\"Skip a missing provider snapshot during site builds\")\\n     args = parser.parse_args()\\n-    payload = write_snapshot(args.output)\\n+    try:\\n+        payload = write_snapshot(args.output)\\n+    except adsb.ProviderDown as exc:\\n+        if not args.optional:\\n+            raise\\n+        print(f\"radar snapshot: unavailable ({exc}); continuing site build\")\\n+        return 0\\n     print(\\n         f\"radar snapshot: {len(payload['ac'])} public / \"\\n         f\"{payload['source_total']} source rows\")\\n@@ -60,14 +60,28 @@ def main() -> None:\\n     assert \"emergency\" not in serialized\\n \\n     original = adsb.adsb_lol_point\\n+    original_argv = sys.argv\\n     try:\\n         adsb.adsb_lol_point = lambda *_: [row()]\\n         with tempfile.TemporaryDirectory() as tmp:\\n             output = Path(tmp) / \"assets\" / \"radar.json\"\\n             written = radar_snapshot.write_snapshot(output)\\n             assert json.loads(output.read_text(encoding=\"utf-8\")) == written\\n+            adsb.adsb_lol_point = lambda *_: []\\n+            sys.argv = [\"radar_snapshot.py\", \"--output\", str(output),\\n+                        \"--optional\"]\\n+            assert radar_snapshot.main() == 0\\n+            assert json.loads(output.read_text(encoding=\"utf-8\")) == written\\n+            sys.argv = [\"radar_snapshot.py\", \"--output\", str(output)]\\n+            try:\\n+                radar_snapshot.main()\\n+            except adsb.ProviderDown:\\n+                pass\\n+            else:\\n+                raise AssertionError(\"strict snapshot must fail on provider outage\")\\n     finally:\\n         adsb.adsb_lol_point = original\\n+        sys.argv = original_argv\\n     print(\"test_radar_snapshot: OK\")\\n \\n "
}
