from dataclasses import dataclass from typing import Mapping @dataclass(frozen=True) class AbriConfig: endpoint_url: str username: str password: str default_resource: str @classmethod def from_env(cls, env: Mapping[str, str]) -> "AbriConfig": # A blank default_resource does not error at the relay — OpenHousing # logs the job but silently drops the appointment — so reject it here # rather than let the misconfiguration ship an empty resource. default_resource = env["ABRI_RELAY_DEFAULT_RESOURCE"] if not default_resource.strip(): raise ValueError("ABRI_RELAY_DEFAULT_RESOURCE must not be blank") return cls( endpoint_url=env["ABRI_RELAY_URL"], username=env["ABRI_RELAY_USERNAME"], password=env["ABRI_RELAY_PASSWORD"], default_resource=default_resource, )