"""Exercise article snippets locally; the API example uses a fake transport. No real API request, credentials, account usage, or CLI submission is involved. """ from __future__ import annotations from contextlib import contextmanager import io import json import os from pathlib import Path import re import subprocess import tempfile import time import urllib.request LAB = Path(__file__).resolve().parent RUN = LAB.parent def main(): manuscript = (RUN / "07-draft.md").read_text(encoding="utf-8") body = manuscript.split("## 正文\n\n", 1)[1].split("## How we tested", 1)[0] blocks = re.findall(r"```(python|bash)\n(.*?)```", body, flags=re.S) reports = [] with tempfile.TemporaryDirectory(prefix="example-check-", dir=LAB) as name: work = Path(name) (work / "input.html").write_bytes((LAB / "corpus/article.html").read_bytes()) direct = blocks[0][1] subprocess.run(["/bin/zsh", "-c", direct], cwd=work, check=True, capture_output=True) from pptx import Presentation deck = Presentation(str(work / "output.pptx")) assert sum(shape.has_table for slide in deck.slides for shape in slide.shapes) == 1 reports.append({"snippet": "direct Pandoc", "result": "executed; native table present"}) local_python = blocks[1][1] subprocess.run([str(RUN.parents[1] / "tools/lab-venv/bin/python"), "-c", local_python], cwd=work, check=True, capture_output=True) assert (work / "output.md").read_text().rstrip() == (LAB / "markitdown-html/article.md").read_text().rstrip() reports.append({"snippet": "MarkItDown", "result": "executed; output matches the scored local sample"}) markdown_export = blocks[2][1] subprocess.run(["/bin/zsh", "-c", markdown_export], cwd=work, check=True, capture_output=True) deck = Presentation(str(work / "output.pptx")) assert sum(shape.has_table for slide in deck.slides for shape in slide.shapes) == 1 reports.append({"snippet": "Markdown to PPTX", "result": "executed; native table present"}) api_code = blocks[3][1] (LAB / "markovo_api_example.py").write_text(api_code, encoding="utf-8") compile(api_code, "markovo_api_example.py", "exec") snapshot = json.loads((LAB / "markovo/article.json").read_text()) expected = (LAB / "markovo/article.md").read_bytes() calls = [] polls = 0 def fake_urlopen(request, timeout): nonlocal polls assert request.full_url.startswith("https://markovo.net/v1/") assert request.get_header("Authorization") == "Bearer MOCK_TOKEN_NOT_A_REAL_KEY" calls.append({"method": request.get_method(), "url": request.full_url}) if request.full_url.endswith("/v1/convert"): assert b'name="file"; filename="input.html"' in request.data assert b"html-to-markdown" in request.data assert (work / "input.html").read_bytes() in request.data return io.BytesIO(json.dumps(snapshot["convert_response"]).encode()) if "/download?format=md" in request.full_url: return io.BytesIO(expected) polls += 1 state = dict(snapshot["job"]) if polls == 1: state["status"] = "running" return io.BytesIO(json.dumps({"job": state}).encode()) old_urlopen, old_sleep, old_cwd = urllib.request.urlopen, time.sleep, Path.cwd() saved_env = {key: os.environ.get(key) for key in ("MARKOVO_API_KEY", "MARKOVO_MAX_CREDIT_UNITS")} try: urllib.request.urlopen = fake_urlopen time.sleep = lambda seconds: None os.environ["MARKOVO_API_KEY"] = "MOCK_TOKEN_NOT_A_REAL_KEY" os.environ["MARKOVO_MAX_CREDIT_UNITS"] = str(snapshot["job"]["max_credit_units"]) os.chdir(work) exec(compile(api_code, "markovo_api_example.py", "exec"), {}) assert (work / "output.md").read_bytes() == expected finally: urllib.request.urlopen, time.sleep = old_urlopen, old_sleep os.chdir(old_cwd) for key, value in saved_env.items(): if value is None: os.environ.pop(key, None) else: os.environ[key] = value reports.append({"snippet": "Markovo API", "result": "fake transport only; multipart, queued-job ID, running-to-succeeded polling, download verified; no network call", "fake_requests": calls}) reports.append({"snippet": "Markovo CLI", "result": "not executed for this guide; statically checked against supplied install.md"}) (LAB / "example-checks.json").write_text(json.dumps({"network_calls": 0, "reports": reports}, ensure_ascii=False, indent=2) + "\n") print(json.dumps({"checks": len(reports), "real_network_calls": 0, "results": [r["result"] for r in reports]}, indent=2)) if __name__ == "__main__": main()