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 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", + } + ) +)
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: