File size: 6,772 Bytes
9c6594c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
from __future__ import annotations
from typing import TYPE_CHECKING, Any, Iterable
from pydantic import ValidationError
from typing_extensions import override
from wandb_gql import gql
from wandb_graphql.language.ast import Document
from wandb.apis.paginator import Paginator
if TYPE_CHECKING:
from wandb.apis.paginator import _Client
from wandb.automations import Integration, SlackIntegration, WebhookIntegration
from wandb.automations._generated import (
GenericWebhookIntegrationConnectionFields,
IntegrationConnectionFields,
SlackIntegrationConnectionFields,
)
class Integrations(Paginator["Integration"]):
last_response: IntegrationConnectionFields | None
_query: Document
def __init__(self, client: _Client, variables: dict[str, Any], per_page: int = 50):
from wandb.automations._generated import INTEGRATIONS_BY_ENTITY_GQL
super().__init__(client, variables, per_page=per_page)
# All integrations for entity
self._query = gql(INTEGRATIONS_BY_ENTITY_GQL)
@property
def more(self) -> bool:
"""Whether there are more Integrations to fetch."""
if self.last_response is None:
return True
return self.last_response.page_info.has_next_page
@property
def cursor(self) -> str | None:
"""The start cursor to use for the next page."""
if self.last_response is None:
return None
return self.last_response.page_info.end_cursor
@override
def _update_response(self) -> None:
"""Fetch and parse the response data for the current page."""
from wandb.automations._generated import IntegrationConnectionFields
data: dict[str, Any] = self.client.execute(
self._query, variable_values=self.variables
)
try:
page_data = data["entity"]["integrations"]
self.last_response = IntegrationConnectionFields.model_validate(page_data)
except (LookupError, AttributeError, ValidationError) as e:
raise ValueError("Unexpected response data") from e
def convert_objects(self) -> Iterable[Integration]:
"""Parse the page data into a list of integrations."""
from wandb.automations.integrations import _IntegrationEdge
page = self.last_response
return [_IntegrationEdge.model_validate(edge).node for edge in page.edges]
class WebhookIntegrations(Paginator["WebhookIntegration"]):
last_response: GenericWebhookIntegrationConnectionFields | None
_query: Document
def __init__(self, client: _Client, variables: dict[str, Any], per_page: int = 50):
from wandb.automations._generated import (
GENERIC_WEBHOOK_INTEGRATIONS_BY_ENTITY_GQL,
)
super().__init__(client, variables, per_page=per_page)
# Webhook integrations for entity
self._query = gql(GENERIC_WEBHOOK_INTEGRATIONS_BY_ENTITY_GQL)
@property
def more(self) -> bool:
"""Whether there are more webhook integrations to fetch."""
if self.last_response is None:
return True
return self.last_response.page_info.has_next_page
@property
def cursor(self) -> str | None:
"""The start cursor to use for the next page."""
if self.last_response is None:
return None
return self.last_response.page_info.end_cursor
@override
def _update_response(self) -> None:
"""Fetch and parse the response data for the current page."""
from wandb.automations._generated import (
GenericWebhookIntegrationConnectionFields,
)
data: dict[str, Any] = self.client.execute(
self._query, variable_values=self.variables
)
try:
page_data = data["entity"]["integrations"]
self.last_response = (
GenericWebhookIntegrationConnectionFields.model_validate(page_data)
)
except (LookupError, AttributeError, ValidationError) as e:
raise ValueError("Unexpected response data") from e
def convert_objects(self) -> Iterable[WebhookIntegration]:
"""Parse the page data into a list of webhook integrations."""
from wandb.automations import WebhookIntegration
typename = "GenericWebhookIntegration"
return [
# Filter on typename__ needed because the GQL response still
# includes all integration types
WebhookIntegration.model_validate(node)
for edge in self.last_response.edges
if (node := edge.node) and (node.typename__ == typename)
]
class SlackIntegrations(Paginator["SlackIntegration"]):
last_response: SlackIntegrationConnectionFields | None
_query: Document
def __init__(self, client: _Client, variables: dict[str, Any], per_page: int = 50):
from wandb.automations._generated import SLACK_INTEGRATIONS_BY_ENTITY_GQL
super().__init__(client, variables, per_page=per_page)
# Slack integrations for entity
self._query = gql(SLACK_INTEGRATIONS_BY_ENTITY_GQL)
@property
def more(self) -> bool:
"""Whether there are more Slack integrations to fetch."""
if self.last_response is None:
return True
return self.last_response.page_info.has_next_page
@property
def cursor(self) -> str | None:
"""The start cursor to use for the next page."""
if self.last_response is None:
return None
return self.last_response.page_info.end_cursor
@override
def _update_response(self) -> None:
"""Fetch and parse the response data for the current page."""
from wandb.automations._generated import SlackIntegrationConnectionFields
data: dict[str, Any] = self.client.execute(
self._query, variable_values=self.variables
)
try:
page_data = data["entity"]["integrations"]
self.last_response = SlackIntegrationConnectionFields.model_validate(
page_data
)
except (LookupError, AttributeError, ValidationError) as e:
raise ValueError("Unexpected response data") from e
def convert_objects(self) -> Iterable[SlackIntegration]:
"""Parse the page data into a list of Slack integrations."""
from wandb.automations import SlackIntegration
typename = "SlackIntegration"
return [
# Filter on typename__ needed because the GQL response still
# includes all integration types
SlackIntegration.model_validate(node)
for edge in self.last_response.edges
if (node := edge.node) and (node.typename__ == typename)
]
|