Skip to content

Commit 7c5ebf7

Browse files
committed
Merge branch 'codex/python-guides-shared-infrastructure-20261006' into codex/python-graphql-guide-master-20261006
2 parents 879fb0e + d05c16c commit 7c5ebf7

3 files changed

Lines changed: 130 additions & 6 deletions

File tree

‎.github/scripts/guide_ci_tasks.py‎

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ class GuideMetadata:
1818
slug: str
1919
publish: bool
2020
base: str | None
21+
python_app: bool = False
2122

2223

2324
def kebab_case_to_gradle_name(name: str) -> str:
@@ -50,6 +51,7 @@ def load_guides(guides_dir: Path) -> dict[str, GuideMetadata]:
5051
slug=slug,
5152
publish=metadata.get("publish", True) is not False,
5253
base=metadata.get("base"),
54+
python_app="PYTHON" in (metadata.get("languages") or []) and metadata.get("apps") != [],
5355
)
5456
return guides
5557

@@ -75,12 +77,18 @@ def resolve_impacted_guide_slugs(
7577
)
7678

7779

78-
def tasks_for_changed_files(changed_files: Iterable[str], guides_dir: Path) -> list[str]:
80+
def tasks_for_changed_files(
81+
changed_files: Iterable[str], guides_dir: Path, *, jvm_only: bool = False,
82+
) -> list[str]:
7983
guides = load_guides(guides_dir)
80-
return [
81-
f"{kebab_case_to_gradle_name(slug)}Build"
82-
for slug in resolve_impacted_guide_slugs(changed_files, guides)
83-
]
84+
tasks = []
85+
for slug in resolve_impacted_guide_slugs(changed_files, guides):
86+
task_slug = kebab_case_to_gradle_name(slug)
87+
task = f"{task_slug}Build"
88+
if jvm_only and guides[slug].python_app:
89+
task += f" -x {task_slug}RunPythonTestScript"
90+
tasks.append(task)
91+
return tasks
8492

8593

8694
def matrix_for_tasks(tasks: Iterable[str]) -> dict[str, list[str]]:
@@ -124,6 +132,10 @@ def parse_args() -> argparse.Namespace:
124132
parser.add_argument("--guides-dir", help="Guides directory. Defaults to <repo>/guides.")
125133
parser.add_argument("--base", help="Base commit for git diff.")
126134
parser.add_argument("--head", default="HEAD", help="Head commit for git diff.")
135+
parser.add_argument(
136+
"--jvm-only", action="store_true",
137+
help="Exclude only Python runtime test tasks; retain JVM tests and guide generation.",
138+
)
127139
parser.add_argument(
128140
"--diff-mode",
129141
choices=("range", "merge-base"),
@@ -153,7 +165,7 @@ def main() -> int:
153165
if args.changed_files is not None
154166
else git_changed_files(repo, args.base, args.head, args.diff_mode)
155167
)
156-
tasks = tasks_for_changed_files(changed_files, guides_dir)
168+
tasks = tasks_for_changed_files(changed_files, guides_dir, jvm_only=args.jvm_only)
157169
matrix = matrix_for_tasks(tasks)
158170

159171
print(f"Changed files: {json.dumps(changed_files)}", file=sys.stderr)

‎.github/scripts/test_guide_ci_tasks.py‎

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
from __future__ import annotations
33

44
import json
5+
import subprocess
6+
import sys
57
import tempfile
68
import unittest
79
from pathlib import Path
@@ -78,13 +80,116 @@ def test_non_guide_changes_return_empty_task_list(self) -> None:
7880

7981
self.assertEqual([], tasks)
8082

83+
def test_default_python_build_remains_unchanged(self) -> None:
84+
with tempfile.TemporaryDirectory() as temp_dir:
85+
guides_dir = Path(temp_dir)
86+
write_metadata(guides_dir, "python-guide", languages=["JAVA", "PYTHON"])
87+
88+
self.assertEqual(
89+
["pythonGuideBuild"],
90+
guide_ci_tasks.tasks_for_changed_files(
91+
["guides/python-guide/metadata.json"], guides_dir,
92+
),
93+
)
94+
95+
def test_jvm_only_excludes_python_runner_for_implicit_apps(self) -> None:
96+
with tempfile.TemporaryDirectory() as temp_dir:
97+
guides_dir = Path(temp_dir)
98+
write_metadata(guides_dir, "python-guide", languages=["JAVA", "PYTHON"])
99+
100+
self.assertEqual(
101+
["pythonGuideBuild -x pythonGuideRunPythonTestScript"],
102+
guide_ci_tasks.tasks_for_changed_files(
103+
["guides/python-guide/metadata.json"], guides_dir, jvm_only=True,
104+
),
105+
)
106+
107+
def test_jvm_only_excludes_python_runner_for_explicit_apps(self) -> None:
108+
with tempfile.TemporaryDirectory() as temp_dir:
109+
guides_dir = Path(temp_dir)
110+
write_metadata(
111+
guides_dir, "python-guide", languages=["JAVA", "PYTHON"],
112+
apps=[{"name": "books"}, {"name": "inventory"}],
113+
)
114+
115+
self.assertEqual(
116+
["pythonGuideBuild -x pythonGuideRunPythonTestScript"],
117+
guide_ci_tasks.tasks_for_changed_files(
118+
["guides/python-guide/python/tests/test_books.py"], guides_dir, jvm_only=True,
119+
),
120+
)
121+
122+
def test_jvm_only_docs_only_guide_has_no_absent_runner_exclusion(self) -> None:
123+
with tempfile.TemporaryDirectory() as temp_dir:
124+
guides_dir = Path(temp_dir)
125+
write_metadata(guides_dir, "docs-guide", languages=["JAVA", "PYTHON"], apps=[])
126+
127+
self.assertEqual(
128+
["docsGuideBuild"],
129+
guide_ci_tasks.tasks_for_changed_files(
130+
["guides/docs-guide/docs-guide.adoc"], guides_dir, jvm_only=True,
131+
),
132+
)
133+
134+
def test_jvm_only_retains_jvm_guide_build(self) -> None:
135+
with tempfile.TemporaryDirectory() as temp_dir:
136+
guides_dir = Path(temp_dir)
137+
write_metadata(guides_dir, "jvm-guide", languages=["JAVA", "GROOVY", "KOTLIN"])
138+
139+
self.assertEqual(
140+
["jvmGuideBuild"],
141+
guide_ci_tasks.tasks_for_changed_files(
142+
["guides/jvm-guide/metadata.json"], guides_dir, jvm_only=True,
143+
),
144+
)
145+
146+
def test_jvm_only_preserves_transitive_base_impacts_and_deduplication(self) -> None:
147+
with tempfile.TemporaryDirectory() as temp_dir:
148+
guides_dir = Path(temp_dir)
149+
write_metadata(guides_dir, "root-base", publish=False)
150+
write_metadata(guides_dir, "middle-base", publish=False, base="root-base")
151+
write_metadata(
152+
guides_dir, "python-guide", base="middle-base", languages=["JAVA", "PYTHON"],
153+
)
154+
155+
self.assertEqual(
156+
["pythonGuideBuild -x pythonGuideRunPythonTestScript"],
157+
guide_ci_tasks.tasks_for_changed_files(
158+
["guides/root-base/common.adoc", "guides/python-guide/metadata.json"],
159+
guides_dir, jvm_only=True,
160+
),
161+
)
162+
163+
def test_cli_jvm_only_flag(self) -> None:
164+
with tempfile.TemporaryDirectory() as temp_dir:
165+
repo = Path(temp_dir)
166+
guides_dir = repo / "guides"
167+
guides_dir.mkdir()
168+
write_metadata(guides_dir, "python-guide", languages=["JAVA", "PYTHON"])
169+
170+
for flags, task in (
171+
([], "pythonGuideBuild"),
172+
(["--jvm-only"], "pythonGuideBuild -x pythonGuideRunPythonTestScript"),
173+
):
174+
with self.subTest(flags=flags):
175+
result = subprocess.run(
176+
[sys.executable, str(Path(guide_ci_tasks.__file__).resolve()),
177+
"--repo", str(repo), "--changed-file", "guides/python-guide/metadata.json", *flags],
178+
capture_output=True, text=True,
179+
)
180+
181+
self.assertEqual(0, result.returncode, result.stderr)
182+
self.assertEqual({"group_test_tasks": [task]}, json.loads(result.stdout))
183+
81184

82185
def write_metadata(
83186
guides_dir: Path,
84187
slug: str,
85188
*,
86189
publish: bool = True,
87190
base: str | None = None,
191+
languages: list[str] | None = None,
192+
apps: list[dict[str, str]] | None = None,
88193
) -> None:
89194
guide_dir = guides_dir / slug
90195
guide_dir.mkdir()
@@ -93,6 +198,10 @@ def write_metadata(
93198
metadata["publish"] = publish
94199
if base is not None:
95200
metadata["base"] = base
201+
if languages is not None:
202+
metadata["languages"] = languages
203+
if apps is not None:
204+
metadata["apps"] = apps
96205
(guide_dir / "metadata.json").write_text(json.dumps(metadata), encoding="utf-8")
97206

98207

‎.github/workflows/gradle.yml‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ jobs:
1717
- uses: actions/checkout@v6.0.2
1818
with:
1919
fetch-depth: 0
20+
- name: Validate guide matrix selector
21+
run: python3 -m unittest discover -s .github/scripts -p 'test_*.py'
2022
- name: Generate Guide Test Matrix
2123
id: test_matrix_step
2224
env:
@@ -25,6 +27,7 @@ jobs:
2527
DIFF_MODE: ${{ github.event_name == 'pull_request' && 'merge-base' || 'range' }}
2628
run: |
2729
python3 .github/scripts/guide_ci_tasks.py \
30+
--jvm-only \
2831
--repo "$GITHUB_WORKSPACE" \
2932
--base "$BASE_SHA" \
3033
--head "$HEAD_SHA" \

0 commit comments

Comments
 (0)