| """ |
| This code adapts the following code for Linear.app. It is not official code. |
| https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/_webhooks_server.py |
| https://github.com/huggingface/huggingface_hub/blob/main/src/huggingface_hub/_webhooks_payload.py |
| |
| Currently, it only supports a small subset of the Issue Object. |
| https://studio.apollographql.com/public/Linear-API/variant/current/schema/reference/objects/Issue |
| |
| You need to set `api_key = linear-api-key` and `webhook_secret = linear-webhook-secret` in your `.env` file. |
| |
| Since the local URL changes with each startup, the URL is updated in the Linear API at startup. |
| At startup, it overwrites the webhook with the label specified by `target_webhook_label` (default value: Gradio). |
| |
| You need to pre-install gradio, fastapi, and pydantic. |
| You need to describe your Linear API key and Linear webhook secret in the `.env` file. |
| Also, since this example is only for Update, please create a Webhook with the label Gradio beforehand. |
| |
| ** Copyright Notice for Linear.app Adaptation ** |
| # Copyright 2025-present, Akihito Miyazaki |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| ** License Notice for Hugging Face Hub Library ** |
| # Copyright 2023-present, the HuggingFace Inc. team. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| This code includes parts of the Hugging Face Hub library, which is licensed under the Apache License, Version 2.0. |
| The full text of the license can be found at: http://www.apache.org/licenses/LICENSE-2.0 |
| """ |
|
|
| """Contains data structures to parse the webhooks payload.""" |
|
|
| from typing import List, Literal, Optional |
| from datetime import datetime |
|
|
|
|
| def is_pydantic_available(): |
| return True |
|
|
|
|
| if is_pydantic_available(): |
| from pydantic import BaseModel |
| else: |
| |
| |
|
|
| class BaseModel: |
| def __init__(self, *args, **kwargs) -> None: |
| raise ImportError( |
| "You must have `pydantic` installed to use `WebhookPayload`. This is an optional dependency that" |
| " should be installed separately. Please run `pip install --upgrade pydantic` and retry." |
| ) |
|
|
|
|
| |
| |
| |
|
|
|
|
| class WebhookPayloadUploadFrom(BaseModel): |
| stateId: Optional[str] = None |
| updatedAt: datetime |
| description: Optional[str] = None |
|
|
|
|
| class WebhookPayloadTeam(BaseModel): |
| id: str |
| name: str |
| key: str |
|
|
|
|
| class WebhookPayloadProject(BaseModel): |
| id: str |
| name: str |
| url: str |
|
|
|
|
| class WebhookPayloadState(BaseModel): |
| id: str |
| color: str |
| name: str |
| type: str |
|
|
|
|
| class WebhookPayloadLabel(BaseModel): |
| id: str |
| color: str |
| name: str |
|
|
|
|
| class WebhookPayloadData(BaseModel): |
| id: str |
| createdAt: datetime |
| updatedAt: datetime |
| archivedAt: Optional[datetime] = None |
| title: str |
| description: Optional[str] = None |
| labels: List[WebhookPayloadLabel] = [] |
| priority: int |
| estimate: Optional[int] = None |
| startedAt: Optional[datetime] = None |
| state: WebhookPayloadState |
| team: WebhookPayloadTeam |
| project: Optional[WebhookPayloadProject] = None |
|
|
|
|
| class WebhookPayload(BaseModel): |
| action: str |
| type: str |
| createdAt: str |
| data: WebhookPayloadData |
| url: Optional[str] = None |
| webhookTimestamp: int |
| webhookId: str |
| updatedFrom: Optional[WebhookPayloadUploadFrom] = None |
|
|