Skip to content

Commit

Permalink
Propose wishlist leaderboard upgrade workflow
Browse files Browse the repository at this point in the history
  • Loading branch information
rzadp committed Jul 19, 2024
1 parent 394ea70 commit e571ec1
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 0 deletions.
58 changes: 58 additions & 0 deletions .github/scripts/update-wishlist-leaderboard.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
from github import Github
import re
import os
from datetime import date

g = Github(os.getenv('GH_TOKEN'))

# Regex pattern to match wish format:
wish_pattern = re.compile(r"I wish for:? (https://github\.com/([a-zA-Z0-9_.-]+)/([a-zA-Z0-9_.-]+)/issues/(\d+))")

wishlist_issue = g.get_repo(os.getenv('WISHLIST_REPOSITORY')).get_issue(int(os.getenv('WISHLIST_ISSUE_NUMBER')))
new_leaderboard = "| Feature Request | Summary | Votes | Status |\n| --- | --- | --- | --- |\n"
wishes = {}
issue_details = {}

for comment in wishlist_issue.get_comments():
# in the comment body, if there is a string `#(\d)`, replace it with
# https://github.com/paritytech/polkadot-sdk/issues/(number)
updated_body = re.sub(r'#(\d+)', r"https://github.com/paritytech/polkadot-sdk/issues/\1", comment.body)

matches = wish_pattern.findall(updated_body)
for match in matches:
url, org, repo_name, issue_id = match
issue_key = (url, org, repo_name, issue_id)
if issue_key not in wishes: wishes[issue_key] = []

# Get the author and upvoters of the wish comment.
wishes[issue_key].append(comment.user.id)
wishes[issue_key].extend(
[reaction.user.id for reaction in comment.get_reactions() if reaction.content in ['+1', 'heart', 'rocket']]
)

# Get upvoters of the desired issue.
desired_issue = g.get_repo(f"{org}/{repo_name}").get_issue(int(issue_id))
wishes[issue_key].extend(
[reaction.user.id for reaction in desired_issue.get_reactions() if reaction.content in ['+1', 'heart', 'rocket']]
)
issue_details[url] = [desired_issue.title, "👾 Open" if desired_issue.state == 'open' else "✅Closed"]

# Count unique wishes - the author of the wish, upvoters of the wish, and upvoters of the desired issue.
for key in wishes: wishes[key] = len(list(set(wishes[key])))

# Sort wishes by count and add to the markdown table
sorted_wishes = sorted(wishes.items(), key=lambda x: x[1], reverse=True)
for (url, _, _, _), count in sorted_wishes:
[summary, status] = issue_details.get(url, "No summary available")
new_leaderboard += f"| {url} | {summary} | {count} | {status} |\n"
new_leaderboard += f"\n> Last updated: {date.today().strftime("%Y-%m-%d")}\n"
print(new_leaderboard)

new_content = re.sub(
r"(\| Feature Request \|)(.*?)(> Last updated:)(.*?\n)",
new_leaderboard,
wishlist_issue.body,
flags=re.DOTALL
)

wishlist_issue.edit(body=new_content)
36 changes: 36 additions & 0 deletions .github/workflows/misc-update-wishlist-leaderboard.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: Update wishlist leaderboard

on:
schedule:
# Run every 3 hours
- cron: '0 */3 * * *'

permissions:
contents: read
issues: write

jobs:
update-wishlist-leaderboard:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install PyGithub
- name: Update developer wishlist
env:
GH_TOKEN: ${{ github.token }}
WISHLIST_REPOSITORY: "paritytech/polkadot-sdk"
WISHLIST_ISSUE_NUMBER: "3900"
run: python .github/scripts/update-wishlist-leaderboard.py
- name: Update user wishlist
env:
GH_TOKEN: ${{ github.token }}
WISHLIST_REPOSITORY: "paritytech/polkadot-sdk"
WISHLIST_ISSUE_NUMBER: "3901"
run: python .github/scripts/update-wishlist-leaderboard.py

0 comments on commit e571ec1

Please sign in to comment.