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", + } + ) +) pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

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:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy