From a0e9d62f7aa3a302e703a86e170ce77b51884731 Mon Sep 17 00:00:00 2001 From: Rafael Fontenelle Date: Fri, 18 Oct 2024 23:37:38 -0300 Subject: [PATCH 1/2] Improve TX_TOKEN check --- .github/workflows/sync.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml index ad6abebd9..e1b83b047 100644 --- a/.github/workflows/sync.yml +++ b/.github/workflows/sync.yml @@ -58,6 +58,16 @@ jobs: requirements.txt cpython/Doc/requirements.txt + - name: Check for Transifex API Token availability + id: secret-check + # perform secret check & put boolean result as an output + shell: bash + run: | + available=false + [ "${{ secrets.TX_TOKEN }}" != '' ] && available=true + echo "available=$available" >> $GITHUB_OUTPUT + echo "available=$available" + # 2- Install dependencies - name: Install Transifex CLI tool @@ -95,7 +105,7 @@ jobs: powrap *.po **/*.po - name: Update statistics - if: always() && inputs.secrets.TX_TOKEN != 0 + if: always() && ${{ steps.secret-check.outputs.available != 'true' }} run: | python ./scripts/tx_stats.py > ./${{ env.LANGUAGE_DIR }}/stats.json git -C ./${{ env.LANGUAGE_DIR }} diff stats.json From 4d02f724afc8c6e7491799c651cae8f68b518437 Mon Sep 17 00:00:00 2001 From: Rafael Fontenelle Date: Fri, 18 Oct 2024 23:38:14 -0300 Subject: [PATCH 2/2] Refactor tx_stats.py --- scripts/tx_stats.py | 108 ++++++++++++++++++++++++++++++++------------ 1 file changed, 79 insertions(+), 29 deletions(-) diff --git a/scripts/tx_stats.py b/scripts/tx_stats.py index 1d6223b31..3decab504 100755 --- a/scripts/tx_stats.py +++ b/scripts/tx_stats.py @@ -3,35 +3,85 @@ import json import os +import configparser import urllib.request from datetime import datetime, timezone -key = os.environ.get('TX_TOKEN') -language = os.environ.get('PYDOC_LANGUAGE') -project = os.environ.get('PYDOC_TX_PROJECT') - -url = "https://rest.api.transifex.com/resource_language_stats?filter[project]=o%3Apython-doc%3Ap%3A{tx_project}&filter[language]=l%3A{langcode}".format(tx_project=project, langcode=language) - -headers = { - "accept": "application/vnd.api+json", - "authorization": "Bearer " + key -} - -total = 0 -translated = 0 - -while(url): - request = urllib.request.Request(url=url,headers=headers) - with urllib.request.urlopen(request) as response: - data = json.loads(response.read().decode("utf-8")) - url = data['links'].get('next') - for resourse in data['data']: - translated = translated + resourse['attributes']['translated_strings'] - total = total + resourse['attributes']['total_strings'] - -p = '{:.2%}'.format(translated/total) -print(json.dumps({ - 'translation':p, - 'total':total, - 'updated_at':datetime.now(timezone.utc).isoformat(timespec='seconds') + 'Z', - })) +# Get language and project from environment variables +language = os.environ.get("PYDOC_LANGUAGE") +project = os.environ.get("PYDOC_TX_PROJECT") +if language is None: + raise ValueError("The PYDOC_LANGUAGE environment variable must be set.") +if project is None: + raise ValueError("The PYDOC_TX_PROJECT environment variable must be set.") + + +# Try to read API token from TX_TOKEN env and then from ~/.transifexrc +def get_transifex_token(): + key = os.environ.get("TX_TOKEN") + if key is None: + config = configparser.ConfigParser() + config.read(os.path.expanduser("~/.transifexrc")) + try: + key = config["https://www.transifex.com"]["token"] + except KeyError: + raise ValueError("Unable to retrieve Transifex API token.") + return key + + +# API URL setup +url_template = ( + "https://rest.api.transifex.com/resource_language_stats" + "?filter[project]=o%3Apython-doc%3Ap%3A{project}" + "&filter[language]=l%3A{language}" +) + +# Get the authorization key +key = get_transifex_token() + +url = url_template.format(project=project, language=language) + +headers = {"accept": "application/vnd.api+json", "authorization": f"Bearer {key}"} + +# Initialize counters +total_strings = 0 +translated_strings = 0 + + +# Function to make an API request and handle potential errors +def fetch_data(url): + request = urllib.request.Request(url=url, headers=headers) + try: + with urllib.request.urlopen(request) as response: + return json.loads(response.read().decode("utf-8")) + except urllib.error.URLError as e: + raise ConnectionError(f"Error fetching data: {e}") + except json.JSONDecodeError as e: + raise ValueError(f"Error decoding JSON response: {e}") + + +# Fetch and process translation stats +while url: + data = fetch_data(url) + url = data["links"].get("next") + for resource in data["data"]: + translated_strings += resource["attributes"]["translated_strings"] + total_strings += resource["attributes"]["total_strings"] + +# Calculate translation percentage +if total_strings == 0: + raise ValueError("Total strings cannot be zero.") + +percentage = f"{(translated_strings / total_strings):.2%}" + +# Print the result as JSON +print( + json.dumps( + { + "translation": percentage, + "total": total_strings, + "updated_at": datetime.now(timezone.utc).isoformat(timespec="seconds") + + "Z", + } + ) +)