Abri relay requests share one envelope, transport and rejection path across request types 🟪

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Daniel Roth 2026-07-03 14:37:40 +00:00
parent c23c74be6b
commit 32b56050b0

View file

@ -1,4 +1,5 @@
import xml.etree.ElementTree as ET
from typing import List, Tuple, Union
import requests
@ -23,7 +24,7 @@ class AbriClient:
self._session = requests.Session()
def log_job(self, request: LogJobRequest) -> LogJobResult:
body = serialise_relay_request(
outcome = self._exchange(
request_type="logjob",
parameters=[
("place_ref", request.place_ref),
@ -37,6 +38,23 @@ class AbriClient:
("resource", self._config.default_resource),
("resource_group", RESOURCE_GROUP),
],
)
if isinstance(outcome, AbriRequestRejected):
return outcome
return self._parse_job_logged(outcome)
def _exchange(
self, request_type: str, parameters: List[Tuple[str, str]]
) -> Union[ET.Element, AbriRequestRejected]:
"""Send one relay request; return the success root or the typed rejection.
Shared by all four relay request types: transport failures raise
AbriTransportError, ambiguous bodies raise AbriResponseParseError, and
only a well-formed <success>false</success> body becomes a rejection.
"""
body = serialise_relay_request(
request_type=request_type,
parameters=parameters,
username=self._config.username,
password=self._config.password,
)
@ -51,6 +69,10 @@ class AbriClient:
raise AbriResponseParseError(str(error)) from error
if root.tag == "response":
return self._parse_rejection(root)
return root
@staticmethod
def _parse_job_logged(root: ET.Element) -> JobLogged:
job_logged = root.find("Jobs/Job_logged")
if job_logged is None:
raise AbriResponseParseError(