Skip to content

Commit

Permalink
Improve tx_stats.py (#237)
Browse files Browse the repository at this point in the history
* Improve TX_TOKEN check

* Refactor tx_stats.py
  • Loading branch information
rffontenelle authored Oct 19, 2024
1 parent cbfc851 commit 94c27a1
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 30 deletions.
12 changes: 11 additions & 1 deletion .github/workflows/sync.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
108 changes: 79 additions & 29 deletions scripts/tx_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
}
)
)

0 comments on commit 94c27a1

Please sign in to comment.