CI / checks (push) Skipped
CI / checks (pull_request) Successful in 3m26s
Several work items on the new loop (L1, D4): - Switching parks the item on the workspace: its work is committed and its branch pushed; resuming checks the item's branch back out. Branches of open items are never set aside by a fresh workspace. - Next item: the operator's "do #N next" first, otherwise the oldest. - Issues with open Gitea dependencies are blocked until they close, checked at intake and on every round; status shows blocked items and the line. Tests: queue unit tests, the property walk over several issues with dependencies and a new parked_work_safe property (it catches parking disabled), and an end-to-end test with two issues where B depends on A. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PPQ14L3LikyefCMFBqEbKE
52 lines
1.7 KiB
Python
52 lines
1.7 KiB
Python
"""Shared by the end-to-end tests: each run gets work that can't already be
|
|
done, and a base branch of its own, so runs never depend on one another or
|
|
on what earlier runs merged."""
|
|
|
|
import contextlib
|
|
import os
|
|
from collections.abc import Iterator
|
|
|
|
from nisse_dev.gitea import GiteaClient, GiteaError
|
|
|
|
|
|
def task(run: str) -> str:
|
|
"""A request no earlier run can have fulfilled."""
|
|
return (
|
|
f"Add a function vowels_{run}(text) to the sandbox package that returns "
|
|
"how many of a, e, i, o, u (either case) the text contains, with tests."
|
|
)
|
|
|
|
|
|
def dependent_task(run: str) -> str:
|
|
"""A request that builds on task(run): it can only be done after it."""
|
|
return (
|
|
f"Add a function consonants_{run}(text) to the sandbox package that "
|
|
"returns how many letters in the text are not vowels, using "
|
|
f"vowels_{run}, with tests."
|
|
)
|
|
|
|
|
|
def operator_gitea(url: str) -> GiteaClient:
|
|
token = os.environ.get("NISSE_OPERATOR_TOKEN", "")
|
|
assert token.strip(), (
|
|
"NISSE_OPERATOR_TOKEN is not set: the test operator's Gitea token"
|
|
)
|
|
return GiteaClient(url, token)
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def base_branch(operator: GiteaClient, repo: str, run: str) -> Iterator[str]:
|
|
"""A branch off main for this run's PRs to target and merge into, so
|
|
nothing accumulates in main; deleted afterwards."""
|
|
name = f"e2e-base-{run}"
|
|
operator._request(
|
|
"POST",
|
|
f"/repos/{repo}/branches",
|
|
json={"new_branch_name": name, "old_branch_name": "main"},
|
|
)
|
|
try:
|
|
yield name
|
|
finally:
|
|
with contextlib.suppress(GiteaError):
|
|
operator._request("DELETE", f"/repos/{repo}/branches/{name}")
|