Files
wehub-resource-sync 6ede33ccdb
Build and Push Docker Images / create_manifest (web, surfsense-web, , cpu) (push) Has been cancelled
Build and Push Docker Images / finalize_release (push) Has been cancelled
Obsidian Plugin Lint / lint (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_web, cpu, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-24.04-arm, linux/arm64, arm64, , runner, false, cpu) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_web, cpu, ./surfsense_web/Dockerfile, web, surfsense-web, ubuntu-latest, linux/amd64, amd64, , runner, false, cpu) (push) Has been cancelled
Build and Push Docker Images / compute_version (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cpu, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, , production, false, cpu) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cpu, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, , production, false, cpu) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu126, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, -cuda126, production, true, cuda126) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu126, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, -cuda126, production, true, cuda126) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu128, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-24.04-arm, linux/arm64, arm64, -cuda, production, true, cuda) (push) Has been cancelled
Build and Push Docker Images / build (./surfsense_backend, cu128, ./surfsense_backend/Dockerfile, backend, surfsense-backend, ubuntu-latest, linux/amd64, amd64, -cuda, production, true, cuda) (push) Has been cancelled
Build and Push Docker Images / verify_digests (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, , cpu) (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda, cuda) (push) Has been cancelled
Build and Push Docker Images / create_manifest (backend, surfsense-backend, -cuda126, cuda126) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:33:44 +08:00

98 lines
2.4 KiB
Python

"""Standard exception hierarchy for all connectors.
ConnectorError
├── ConnectorAuthError (401/403 — non-retryable)
├── ConnectorRateLimitError (429 — retryable, carries ``retry_after``)
├── ConnectorTimeoutError (timeout/504 — retryable)
└── ConnectorAPIError (5xx or unexpected — retryable when >= 500)
"""
from __future__ import annotations
from typing import Any
class ConnectorError(Exception):
def __init__(
self,
message: str,
*,
service: str = "",
status_code: int | None = None,
response_body: Any = None,
) -> None:
super().__init__(message)
self.service = service
self.status_code = status_code
self.response_body = response_body
@property
def retryable(self) -> bool:
return False
class ConnectorAuthError(ConnectorError):
"""Token expired, revoked, insufficient scopes, or needs re-auth (401/403)."""
@property
def retryable(self) -> bool:
return False
class ConnectorRateLimitError(ConnectorError):
"""429 Too Many Requests."""
def __init__(
self,
message: str = "Rate limited",
*,
service: str = "",
retry_after: float | None = None,
status_code: int = 429,
response_body: Any = None,
) -> None:
super().__init__(
message,
service=service,
status_code=status_code,
response_body=response_body,
)
self.retry_after = retry_after
@property
def retryable(self) -> bool:
return True
class ConnectorTimeoutError(ConnectorError):
"""Request timeout or gateway timeout (504)."""
def __init__(
self,
message: str = "Request timed out",
*,
service: str = "",
status_code: int | None = None,
response_body: Any = None,
) -> None:
super().__init__(
message,
service=service,
status_code=status_code,
response_body=response_body,
)
@property
def retryable(self) -> bool:
return True
class ConnectorAPIError(ConnectorError):
"""Generic API error (5xx or unexpected status codes)."""
@property
def retryable(self) -> bool:
if self.status_code is not None:
return self.status_code >= 500
return False