mirror of
https://github.com/ComposioHQ/composio.git
synced 2026-09-22 11:46:35 +08:00
e7bb45f449
This PR: - normalizes Python SDK reference examples generated from source docstrings - rewrites the `Triggers.parse()` docstring so the generated Flask/FastAPI examples are copy-pasteable - strips nested Markdown fences before wrapping generated examples in MDX code fences - regenerates `docs/content/reference/sdk-reference/python/` - adds regression coverage for the `Triggers.parse()` generated example and fenced example normalization - does not include a changeset because this only changes docs generation, generated docs, and tests ## Verification - `cd python && .venv/bin/python -m pytest tests/test_generate_docs.py -q` - `cd python && .venv/bin/ruff check --config config/ruff.toml composio/core/models/triggers.py scripts/generate-docs.py tests/test_generate_docs.py` - `cd python && .venv/bin/ruff format --check --config config/ruff.toml composio/core/models/triggers.py scripts/generate-docs.py tests/test_generate_docs.py` - `cd python && .venv/bin/python scripts/generate-docs.py` - `cd docs && bun install --frozen-lockfile` - `cd docs && bun run types:check`
59 lines
1.6 KiB
Python
59 lines
1.6 KiB
Python
"""Regression tests for SDK reference generation."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import ast
|
|
import importlib.util
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from composio.core.models.triggers import Triggers
|
|
|
|
|
|
def load_generate_docs_module():
|
|
script_path = Path(__file__).resolve().parents[1] / "scripts" / "generate-docs.py"
|
|
spec = importlib.util.spec_from_file_location("_generate_docs", script_path)
|
|
assert spec is not None
|
|
assert spec.loader is not None
|
|
|
|
module = importlib.util.module_from_spec(spec)
|
|
spec.loader.exec_module(module)
|
|
return module
|
|
|
|
|
|
def test_triggers_parse_generated_example_is_valid_python():
|
|
generate_docs = load_generate_docs_module()
|
|
|
|
parsed = generate_docs.parse_docstring(Triggers.parse.__doc__)
|
|
assert parsed["examples"], "Triggers.parse() must keep its public example"
|
|
|
|
try:
|
|
ast.parse(parsed["examples"][0])
|
|
except SyntaxError as exc:
|
|
pytest.fail(
|
|
"Triggers.parse() generated SDK reference example must be "
|
|
f"copy-pasteable Python: {exc}"
|
|
)
|
|
|
|
|
|
def test_generated_examples_do_not_keep_nested_markdown_fences():
|
|
generate_docs = load_generate_docs_module()
|
|
|
|
parsed = generate_docs.parse_docstring(
|
|
"""
|
|
Fetch SDK data.
|
|
|
|
Example:
|
|
```python
|
|
result = composio.tools.get_raw_tool_router_meta_tools("session_123")
|
|
print(result)
|
|
```
|
|
"""
|
|
)
|
|
|
|
assert parsed["examples"] == [
|
|
'result = composio.tools.get_raw_tool_router_meta_tools("session_123")\n'
|
|
"print(result)"
|
|
]
|