Skip to content

Commit 6e803e5

Browse files
authored
Get repos from devguide (python-docs-translations#18)
* Get list of repositories from devguide * Remove unused variable * Fetch devguide once
1 parent 59a620a commit 6e803e5

File tree

3 files changed

+52
-23
lines changed

3 files changed

+52
-23
lines changed

completion.py

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,29 @@
1+
import json
12
from functools import cache
23
from pathlib import Path
34
from tempfile import TemporaryDirectory
45

56
import git
67
from potodo import potodo
7-
import requests
88

99
@cache
10-
def branches_from_devguide() -> list[str]:
11-
r = requests.get(
12-
"https://raw.githubusercontent.com/"
13-
"python/devguide/main/include/release-cycle.json",
14-
timeout=10,
15-
)
16-
data = r.json()
10+
def branches_from_devguide(devguide_dir: Path) -> list[str]:
11+
p = devguide_dir.joinpath('include/release-cycle.json')
12+
data = json.loads(p.read_text())
1713
return [
1814
branch for branch in data if data[branch]["status"] in ("bugfix", "security")
1915
]
2016

2117

22-
def get_completion(clones_dir: str, language: str) -> float:
23-
clone_path = Path(clones_dir, language)
24-
25-
for branch in branches_from_devguide():
18+
def get_completion(clones_dir: str, repo: str) -> float:
19+
clone_path = Path(clones_dir, repo)
20+
for branch in branches_from_devguide(Path(clones_dir, 'devguide')) + ['master']:
2621
try:
2722
git.Repo.clone_from(
28-
f'https://github.com/python/python-docs-{language}.git', clone_path, depth=1, branch=branch
23+
f'https://github.com/{repo}.git', clone_path, depth=1, branch=branch
2924
)
3025
except git.GitCommandError:
31-
print(f'failed to clone {language} {branch}')
26+
print(f'failed to clone {repo} {branch}')
3227
continue
3328
else:
3429
break

generate.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# "potodo",
55
# "jinja2",
66
# "requests",
7+
# "docutils",
78
# ]
89
# ///
910
import subprocess
@@ -14,25 +15,32 @@
1415
from git import Repo
1516
from jinja2 import Template
1617

18+
import repositories
1719
import visitors
1820
from completion import branches_from_devguide, get_completion
1921

2022
completion_progress = []
2123
generation_time = datetime.now(timezone.utc)
2224

2325
with TemporaryDirectory() as clones_dir:
26+
Repo.clone_from(f'https://github.com/python/devguide.git', devguide_dir := Path(clones_dir, 'devguide'), depth=1)
27+
latest_branch = branches_from_devguide(devguide_dir)[0]
2428
Repo.clone_from(
25-
f'https://github.com/python/cpython.git', Path(clones_dir, 'cpython'), depth=1, branch=branches_from_devguide()[0]
29+
f'https://github.com/python/cpython.git', Path(clones_dir, 'cpython'), depth=1, branch=latest_branch
2630
)
2731
subprocess.run(['make', '-C', Path(clones_dir, 'cpython/Doc'), 'venv'], check=True)
2832
subprocess.run(['make', '-C', Path(clones_dir, 'cpython/Doc'), 'gettext'], check=True)
29-
for language in ('es', 'fr', 'id', 'it', 'ja', 'ko', 'pl', 'pt-br', 'tr', 'uk', 'zh-cn', 'zh-tw'):
30-
completion_number = get_completion(clones_dir, language)
31-
visitors_number = visitors.get_number_of_visitors(language)
32-
completion_progress.append((language, completion_number, visitors_number))
33+
for language, repo in repositories.get_languages_and_repos(devguide_dir):
34+
if repo:
35+
completion_number = get_completion(clones_dir, repo)
36+
visitors_number = visitors.get_number_of_visitors(language)
37+
else:
38+
completion_number, visitors_number = 0.0, 0
39+
completion_progress.append((language, repo, completion_number, visitors_number))
3340
print(completion_progress[-1])
3441

35-
template = Template("""
42+
template = Template(
43+
"""
3644
<html lang="en">
3745
<head>
3846
<title>Python Docs Translation Dashboard</title>
@@ -49,10 +57,11 @@
4957
</tr>
5058
</thead>
5159
<tbody>
52-
{% for language, completion, visitors in completion_progress | sort(attribute=1) | reverse %}
60+
{% for language, repo, completion, visitors in completion_progress | sort(attribute=2) | reverse %}
5361
<tr>
62+
{% if repo %}
5463
<td data-label="language">
55-
<a href="https://github.com/python/python-docs-{{ language }}" target="_blank">
64+
<a href="https://github.com/{{ repo }}" target="_blank">
5665
{{ language }}
5766
</a>
5867
</td>
@@ -61,6 +70,10 @@
6170
{{ '{:,}'.format(visitors) }}
6271
</a>
6372
</td>
73+
{% else %}
74+
<td data-label="language">{{ language }}</td>
75+
<td data-label="visitors">0</td>
76+
{% endif %}
6477
<td data-label="completion">
6578
<div class="progress-bar" style="width: {{ completion | round(2) }}%;">{{ completion | round(2) }}%</div>
6679
</td>
@@ -71,7 +84,8 @@
7184
<p>Last updated at {{ generation_time.strftime('%A, %d %B %Y, %X %Z') }}.</p>
7285
</body>
7386
</html>
74-
""")
87+
"""
88+
)
7589

7690
output = template.render(completion_progress=completion_progress, generation_time=generation_time)
7791

repositories.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import tempfile
2+
import pathlib
3+
import re
4+
from typing import Generator, Optional
5+
6+
from docutils import core
7+
from docutils.nodes import table, row
8+
9+
10+
def get_languages_and_repos(devguide_dir: pathlib.Path) -> Generator[tuple[str, Optional[str]], None, None]:
11+
translating = devguide_dir.joinpath('documentation/translating.rst').read_text()
12+
doctree = core.publish_doctree(translating)
13+
14+
for node in doctree.traverse(table):
15+
for row_node in node.traverse(row)[1:]:
16+
language = row_node[0].astext()
17+
repo = row_node[2].astext()
18+
language_code = re.match(r'.* \((.*)\)', language).group(1).lower().replace('_', '-')
19+
repo_match = re.match(':github:`GitHub <(.*)>`', repo)
20+
yield language_code, repo_match and repo_match.group(1)

0 commit comments

Comments
 (0)