Source code for corvix.enrichment.providers.github_pr_state
"""GitHub pull-request state enrichment provider."""
from __future__ import annotations
from dataclasses import dataclass
from typing import TypeIs
from corvix.domain import Notification
from corvix.enrichment.base import EnrichmentContext, JsonFetchClient
[docs]
def _is_str_object_map(value: object) -> TypeIs[dict[str, object]]:
return isinstance(value, dict) and all(isinstance(key, str) for key in value)
@dataclass(slots=True)
[docs]
class GitHubPRStateProvider:
"""Enriches pull-request notifications with state metadata."""
[docs]
timeout_seconds: float = 10.0
[docs]
name: str = "github.pr_state"
[docs]
def enrich(
self,
notification: Notification,
client: JsonFetchClient,
ctx: EnrichmentContext,
) -> dict[str, object]:
"""Return pull-request state metadata under the provider namespace."""
if notification.subject_type != "PullRequest" or not notification.subject_url:
return {}
payload = ctx.get_json(client=client, url=notification.subject_url, timeout_seconds=self.timeout_seconds)
if not _is_str_object_map(payload):
return {}
state = payload.get("state")
merged = payload.get("merged")
draft = payload.get("draft")
user = payload.get("user")
author_login: str | None = None
if _is_str_object_map(user):
login = user.get("login")
if isinstance(login, str):
author_login = login
return {
"state": state if isinstance(state, str) else "",
"merged": merged if isinstance(merged, bool) else False,
"draft": draft if isinstance(draft, bool) else False,
"author": {"login": author_login} if author_login is not None else {},
}