Files
wehub-resource-sync 09e9f3545f
Test / Code Quality (push) Has been cancelled
Test / Test (macos-latest, Python 3.10) (push) Has been cancelled
Test / Test (macos-latest, Python 3.11) (push) Has been cancelled
Test / Test (macos-latest, Python 3.12) (push) Has been cancelled
Test / Test (macos-latest, Python 3.13) (push) Has been cancelled
Test / Test (macos-latest, Python 3.14) (push) Has been cancelled
Test / Test (ubuntu-latest, Python 3.10) (push) Has been cancelled
Test / Test (ubuntu-latest, Python 3.11) (push) Has been cancelled
Test / Test (ubuntu-latest, Python 3.12) (push) Has been cancelled
Test / Test (ubuntu-latest, Python 3.13) (push) Has been cancelled
Test / Test (ubuntu-latest, Python 3.14) (push) Has been cancelled
Test / Test (windows-latest, Python 3.10) (push) Has been cancelled
Test / Test (windows-latest, Python 3.11) (push) Has been cancelled
Test / Test (windows-latest, Python 3.12) (push) Has been cancelled
Test / Test (windows-latest, Python 3.13) (push) Has been cancelled
Test / Test (windows-latest, Python 3.14) (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
dependency-audit / pip-audit (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:30:13 +08:00

72 lines
2.6 KiB
Python

"""Guardrail tests for copy-paste documentation idioms.
The README and the runnable ``examples/*.py`` are the snippets users copy
first. They must demonstrate the *canonical* client idiom, not a deprecated one
that warns at runtime.
When this test fails, fix the doc/example (drop the ``await`` before
``NotebookLMClient.from_storage(...)``), not the test.
See ``docs/deprecations.md`` — awaiting ``from_storage(...)`` emits a
``DeprecationWarning`` (removed in v1.0); the canonical form is
``async with NotebookLMClient.from_storage(...) as client:``.
"""
from __future__ import annotations
from pathlib import Path
import pytest
pytestmark = pytest.mark.repo_lint
REPO_ROOT = Path(__file__).resolve().parents[2]
README_MD = REPO_ROOT / "README.md"
EXAMPLES_DIR = REPO_ROOT / "examples"
# Prose docs that carry copy-paste quickstarts and were corrected to the
# canonical idiom — guarded so they can't regress. (``docs/python-api.md``
# deliberately keeps the deprecated form as a *labeled* example, and
# ``docs/refactor-history.md`` is a historical record — both excluded.)
GUARDED_PROSE_DOCS = (
REPO_ROOT / "docs" / "rpc-development.md",
REPO_ROOT / "docs" / "auth-cookie-lifecycle.md",
)
# The deprecated idiom: awaiting ``from_storage`` inside the context manager.
DEPRECATED_AWAIT_IDIOM = "async with await NotebookLMClient.from_storage"
def _copy_paste_docs() -> list[Path]:
"""README + guarded prose docs + every runnable example.
These are the snippets users copy first; all must use the canonical
no-``await`` ``from_storage`` idiom.
"""
return [
README_MD,
*(p for p in GUARDED_PROSE_DOCS if p.exists()),
*sorted(EXAMPLES_DIR.glob("*.py")),
]
@pytest.mark.parametrize(
"doc",
_copy_paste_docs(),
ids=lambda p: str(p.relative_to(REPO_ROOT)),
)
def test_copy_paste_docs_use_canonical_from_storage(doc: Path) -> None:
"""README + examples must use ``async with NotebookLMClient.from_storage()``.
The ``await``-prefixed form still works but emits a ``DeprecationWarning``;
shipping it in the first snippets a user copies makes their very first run
warn. The canonical no-``await`` form is documented in ``docs/python-api.md``
(which deliberately keeps the deprecated form as a *labeled* example and is
therefore excluded here).
"""
text = doc.read_text(encoding="utf-8")
assert DEPRECATED_AWAIT_IDIOM not in text, (
f"{doc.relative_to(REPO_ROOT)} uses the deprecated "
f"'{DEPRECATED_AWAIT_IDIOM}(...)' idiom; drop the 'await' so the "
"snippet matches the canonical context-manager form."
)