committed by
GitHub
5 changed files with 137 additions and 0 deletions
@ -0,0 +1,7 @@ |
|||||
|
FROM python:3.7 |
||||
|
|
||||
|
RUN pip install httpx PyGithub "pydantic==1.5.1" "pyyaml>=5.3.1,<6.0.0" |
||||
|
|
||||
|
COPY ./app /app |
||||
|
|
||||
|
CMD ["python", "/app/main.py"] |
@ -0,0 +1,10 @@ |
|||||
|
name: "Notify Translations" |
||||
|
description: "Notify in the issue for a translation when there's a new PR available" |
||||
|
author: "Sebastián Ramírez <[email protected]>" |
||||
|
inputs: |
||||
|
token: |
||||
|
description: 'Token, to read the GitHub API. Can be passed in using {{ secrets.GITHUB_TOKEN }}' |
||||
|
required: true |
||||
|
runs: |
||||
|
using: 'docker' |
||||
|
image: 'Dockerfile' |
@ -0,0 +1,87 @@ |
|||||
|
import logging |
||||
|
from pathlib import Path |
||||
|
from typing import Dict, Optional |
||||
|
|
||||
|
import yaml |
||||
|
from github import Github |
||||
|
from pydantic import BaseModel, BaseSettings, SecretStr |
||||
|
|
||||
|
awaiting_label = "awaiting review" |
||||
|
lang_all_label = "lang-all" |
||||
|
approved_label = "approved-2" |
||||
|
translations_path = Path(__file__).parent / "translations.yml" |
||||
|
|
||||
|
|
||||
|
class Settings(BaseSettings): |
||||
|
github_repository: str |
||||
|
input_token: SecretStr |
||||
|
github_event_path: Path |
||||
|
github_event_name: Optional[str] = None |
||||
|
input_debug: Optional[bool] = False |
||||
|
|
||||
|
|
||||
|
class PartialGitHubEventIssue(BaseModel): |
||||
|
number: int |
||||
|
|
||||
|
|
||||
|
class PartialGitHubEvent(BaseModel): |
||||
|
pull_request: PartialGitHubEventIssue |
||||
|
|
||||
|
|
||||
|
if __name__ == "__main__": |
||||
|
settings = Settings() |
||||
|
if settings.input_debug: |
||||
|
logging.basicConfig(level=logging.DEBUG) |
||||
|
else: |
||||
|
logging.basicConfig(level=logging.INFO) |
||||
|
logging.debug(f"Using config: {settings.json()}") |
||||
|
g = Github(settings.input_token.get_secret_value()) |
||||
|
repo = g.get_repo(settings.github_repository) |
||||
|
if not settings.github_event_path.is_file(): |
||||
|
raise RuntimeError( |
||||
|
f"No github event file available at: {settings.github_event_path}" |
||||
|
) |
||||
|
contents = settings.github_event_path.read_text() |
||||
|
github_event = PartialGitHubEvent.parse_raw(contents) |
||||
|
translations_map: Dict[str, int] = yaml.safe_load(translations_path.read_text()) |
||||
|
logging.debug(f"Using translations map: {translations_map}") |
||||
|
pr = repo.get_pull(github_event.pull_request.number) |
||||
|
logging.debug(f"Processing PR: {pr.number}") |
||||
|
if pr.state == "open": |
||||
|
logging.debug(f"PR is open: {pr.number}") |
||||
|
label_strs = set([label.name for label in pr.get_labels()]) |
||||
|
if lang_all_label in label_strs and awaiting_label in label_strs: |
||||
|
logging.info( |
||||
|
f"This PR seems to be a language translation and awaiting reviews: {pr.number}" |
||||
|
) |
||||
|
if approved_label in label_strs: |
||||
|
message = ( |
||||
|
f"It seems this PR already has the approved label: {pr.number}" |
||||
|
) |
||||
|
logging.error(message) |
||||
|
raise RuntimeError(message) |
||||
|
langs = [] |
||||
|
for label in label_strs: |
||||
|
if label.startswith("lang-") and not label == lang_all_label: |
||||
|
langs.append(label[5:]) |
||||
|
for lang in langs: |
||||
|
if lang in translations_map: |
||||
|
num = translations_map[lang] |
||||
|
logging.info(f"Found a translation issue for language: {lang} in issue: {num}") |
||||
|
issue = repo.get_issue(num) |
||||
|
message = f"Good news everyone! 😉 There's a new translation PR to be reviewed: #{pr.number} 🎉" |
||||
|
already_notified = False |
||||
|
logging.info(f"Checking current comments in issue: {num} to see if already notified about this PR: {pr.number}") |
||||
|
for comment in issue.get_comments(): |
||||
|
if message in comment.body: |
||||
|
already_notified = True |
||||
|
if not already_notified: |
||||
|
logging.info(f"Writing comment in issue: {num} about PR: {pr.number}") |
||||
|
issue.create_comment(message) |
||||
|
else: |
||||
|
logging.info(f"Issue: {num} was already notified of PR: {pr.number}") |
||||
|
else: |
||||
|
logging.info( |
||||
|
f"Changing labels in a closed PR doesn't trigger comments, PR: {pr.number}" |
||||
|
) |
||||
|
logging.info("Finished") |
@ -0,0 +1,12 @@ |
|||||
|
pt: 1211 |
||||
|
es: 1218 |
||||
|
zh: 1228 |
||||
|
ru: 1362 |
||||
|
it: 1556 |
||||
|
ja: 1572 |
||||
|
uk: 1748 |
||||
|
tr: 1892 |
||||
|
fr: 1972 |
||||
|
ko: 2017 |
||||
|
sq: 2041 |
||||
|
pl: 3169 |
@ -0,0 +1,21 @@ |
|||||
|
name: Notify Translations |
||||
|
|
||||
|
on: |
||||
|
pull_request_target: |
||||
|
types: |
||||
|
- labeled |
||||
|
|
||||
|
jobs: |
||||
|
notify-translations: |
||||
|
runs-on: ubuntu-latest |
||||
|
steps: |
||||
|
- uses: actions/checkout@v2 |
||||
|
# Allow debugging with tmate |
||||
|
- name: Setup tmate session |
||||
|
uses: mxschmitt/action-tmate@v3 |
||||
|
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled }} |
||||
|
with: |
||||
|
limit-access-to-actor: true |
||||
|
- uses: ./.github/actions/notify-translations |
||||
|
with: |
||||
|
token: ${{ secrets.GITHUB_TOKEN }} |
Loading…
Reference in new issue