Spaces:
Running
Running
from dataclasses import dataclass | |
import gradio as gr | |
from graphql_calls import get_tag_commit_date, get_commits | |
class Contributions: | |
additions: int | |
deletions: int | |
descriptions: list[str] | |
def get_release_notes( | |
token: str, | |
repo: str, | |
tag: str, | |
branch: str, | |
contributor_treshhold: int, | |
ignore_dependabot: bool, | |
ignore_direct: bool, | |
): | |
try: | |
date = get_tag_commit_date(token, repo, tag) | |
commits = get_commits(token, repo, branch, date) | |
except ValueError as e: | |
return str(e) | |
result = "" | |
contributors = {} | |
for idx, commit in enumerate(commits[::-1]): | |
if idx == 0: | |
result += "## All commits\n\n" | |
if "Hugging Face" not in commit.user.organizations: | |
if commit.user.name not in contributors: | |
contributors[commit.user.name] = Contributions( | |
additions=commit.additions, | |
deletions=commit.deletions, | |
descriptions=[commit.message], | |
) | |
else: | |
contributors[commit.user.name].additions += commit.additions | |
contributors[commit.user.name].deletions += commit.deletions | |
contributors[commit.user.name].descriptions += [commit.message] | |
if "(#" in commit.message: | |
if ignore_dependabot and commit.user.name == 'dependabot[bot]': | |
continue | |
split = commit.message.split("(#") | |
message = split[0] | |
number = split[1].strip(")") | |
result += f"* {message} by @{commit.user.name} in #{number}\n" | |
elif not ignore_direct: | |
result += f"* {commit.message} by @{commit.user.name} (direct commit on {branch})\n" | |
significant_contributors = { | |
k: v for k, v in contributors.items() if (v.additions + v.deletions) > contributor_treshhold and k != '<NOT FOUND>' | |
} | |
if len(significant_contributors): | |
result += ( | |
"\n## Significant community contributions\n" | |
"\nThe following contributors have made significant " | |
"changes to the library over the last release:\n\n" | |
) | |
for significant_contributor, contributions in significant_contributors.items(): | |
result += f"* @{significant_contributor}\n" | |
for description in contributions.descriptions: | |
result += f" * {description}\n" | |
return result | |
article = """ | |
## How to use the interface? | |
⚠️ Most errors are due to: | |
- A wrong `tag` -> the tag must exist on the repository! | |
- A wrong `branch` -> The branch must exist on the repository! | |
- A wrong `token` -> Obtaining a token is detailed below. | |
### token | |
This is a personal access token generated by GitHub. You can obtain one with the following guide: | |
https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token. | |
### Repository | |
The repository for which to create the release notes. Should be in the format `organization/repository`. | |
### Tag | |
The tag from which all commits were made. The app will fetch the date at which this tag was created, and will | |
return all commits of the branch defined below that have a timestamp following that date. | |
### Branch | |
The branch on which all commits lie. Usually `master` or `main`. | |
### Threshold | |
This threshold allows highlighting specific community contributors according to the size of their contributions. | |
It currently adds all their additions/deletions across all PRs included in this release. It is then compared | |
to the defined threshold: if above, that user will get a special note mentioning what they have worked on! | |
""" | |
demo = gr.Interface( | |
title='Automatic release notes 🤗', | |
article=article, | |
description="**See instructions below the form.**", | |
fn=get_release_notes, | |
inputs=[ | |
gr.components.Textbox(lines=1, placeholder="Your GitHub token"), | |
gr.components.Textbox( | |
lines=1, placeholder="Repository", value="huggingface/transformers" | |
), | |
gr.components.Textbox(lines=1, placeholder="The tag from which to get commit"), | |
gr.components.Textbox( | |
lines=1, | |
placeholder="The linear branch on which the new version tag will be added", | |
value="main", | |
), | |
gr.components.Slider( | |
minimum=0, | |
maximum=2000, | |
value=500, | |
label="Threshold for significant contributors", | |
), | |
gr.components.Checkbox(label="Ignore dependabot commits"), | |
gr.components.Checkbox(label="Ignore direct commits"), | |
], | |
outputs="text", | |
examples=[ | |
['ghp_XXX', 'huggingface/datasets', '2.1.0', 'master', 60, True, True], | |
['ghp_XXX', 'huggingface/accelerate', 'v0.7.1', 'main', 500, True, True], | |
['ghp_XXX', 'huggingface/transformers', 'v4.18.0', 'main', 500, True, True], | |
['ghp_XXX', 'huggingface/diffusers', 'v0.17.0', 'main', 500, True, True], | |
['ghp_XXX', 'gradio-app/gradio', 'v2.9.0', 'main', 500, True, True], | |
], | |
) | |
if __name__ == "__main__": | |
demo.launch(show_error=True) | |