#!/usr/bin/env python import json import gradio as gr from gradio_space_ci import enable_space_ci from huggingface_hub import CommitScheduler, hf_hub_download from open_pr import open_pr enable_space_ci() TITLE = "Listen to Pull Requests and start ephemeral Spaces on new PRs! 🚀" DESCRIPTION = """ ## Gradio Space CI is a tool to create ephemeral Spaces for each PR opened on your Space repo. The goal is to improve developer experience by making the review process as lean as possible. The app below let you open a PR to enable Space CI on a Space. The steps are the following: 1. Sign-in with Hugging Face. 2. Input a Space id from the Hub 3. Click "Submit" 4. That's it! You'll get feedback if it works or not, and if it worked, you'll get the URL of the opened PR 🔥 #### ⚠️ Disclaimer: **Gradio Space CI** works only on public Spaces. For more details about **Gradio Space CI**, checkout [this page](https://huggingface.co/spaces/Wauplin/gradio-space-ci/blob/main/README.md). If you find any issues, please report here: https://huggingface.co/spaces/Wauplin/gradio-space-ci/discussions """ SUCCESS_MESSAGE = """ ### Success 🔥 Yay! A PR has been open to enable Space CI on {space_id}. Check it out here: [{pr_url}]({pr_url}). You can contact the Space owner to let them know about this PR. """ ERROR_MESSAGE = """ ### Error ❌ An error happened while trying to open a PR to enable Space CI on {space_id}. {error}""" DATASET_ID = "Wauplin/gradio-space-ci-report" csv_path = hf_hub_download(repo_id=DATASET_ID, repo_type="dataset", filename="report.jsonl", local_dir="./report") scheduler = CommitScheduler(repo_id=DATASET_ID, repo_type="dataset", folder_path="./report") def append(**kwargs): with scheduler.lock: with open(csv_path, "a") as f: f.write(json.dumps(kwargs) + "\n") def fn(space_id_or_url: str, oauth_profile: gr.OAuthProfile | None, oauth_token: gr.OAuthToken | None) -> str: user = oauth_profile.username if oauth_profile is not None else "???" try: pr_url = open_pr(space_id_or_url, oauth_token) append(space_id=space_id_or_url, status="success", pr_url=pr_url, user=user) return SUCCESS_MESSAGE.format(space_id=space_id_or_url, pr_url=pr_url) except Exception as e: append(space_id=space_id_or_url, status="error", error=str(e), user=user) return ERROR_MESSAGE.format(space_id=space_id_or_url, error=str(e)) with gr.Blocks() as blocks: gr.Markdown(f"