Skip to content

Commit f2cf055

Browse files
authored
Track number of translators (python-docs-translations#21)
* Track number of translators * Handle no year in a translator record * Get also from Git history
1 parent 6e803e5 commit f2cf055

File tree

3 files changed

+44
-8
lines changed

3 files changed

+44
-8
lines changed

completion.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
import git
77
from potodo import potodo
88

9+
import translators
10+
11+
912
@cache
1013
def branches_from_devguide(devguide_dir: Path) -> list[str]:
1114
p = devguide_dir.joinpath('include/release-cycle.json')
@@ -15,20 +18,20 @@ def branches_from_devguide(devguide_dir: Path) -> list[str]:
1518
]
1619

1720

18-
def get_completion(clones_dir: str, repo: str) -> float:
21+
def get_completion(clones_dir: str, repo: str) -> tuple[float, int]:
1922
clone_path = Path(clones_dir, repo)
2023
for branch in branches_from_devguide(Path(clones_dir, 'devguide')) + ['master']:
2124
try:
22-
git.Repo.clone_from(
23-
f'https://github.com/{repo}.git', clone_path, depth=1, branch=branch
24-
)
25+
git.Repo.clone_from(f'https://github.com/{repo}.git', clone_path, branch=branch)
2526
except git.GitCommandError:
2627
print(f'failed to clone {repo} {branch}')
28+
translators_number = 0
2729
continue
2830
else:
31+
translators_number = translators.get_number(clone_path)
2932
break
3033
with TemporaryDirectory() as tmpdir:
3134
completion = potodo.merge_and_scan_path(
3235
clone_path, pot_path=Path(clones_dir, 'cpython/Doc/build/gettext'), merge_path=Path(tmpdir), hide_reserved=False, api_url=''
3336
).completion
34-
return completion
37+
return completion, translators_number

generate.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@
3232
subprocess.run(['make', '-C', Path(clones_dir, 'cpython/Doc'), 'gettext'], check=True)
3333
for language, repo in repositories.get_languages_and_repos(devguide_dir):
3434
if repo:
35-
completion_number = get_completion(clones_dir, repo)
35+
completion_number, translators_number = get_completion(clones_dir, repo)
3636
visitors_number = visitors.get_number_of_visitors(language)
3737
else:
3838
completion_number, visitors_number = 0.0, 0
39-
completion_progress.append((language, repo, completion_number, visitors_number))
39+
completion_progress.append((language, repo, completion_number, translators_number, visitors_number))
4040
print(completion_progress[-1])
4141

4242
template = Template(
@@ -53,11 +53,12 @@
5353
<tr>
5454
<th>language</th>
5555
<th><a href="https://plausible.io/data-policy#how-we-count-unique-users-without-cookies">visitors<a/></th>
56+
<th>translators</th>
5657
<th>completion</th>
5758
</tr>
5859
</thead>
5960
<tbody>
60-
{% for language, repo, completion, visitors in completion_progress | sort(attribute=2) | reverse %}
61+
{% for language, repo, completion, translators, visitors in completion_progress | sort(attribute=2) | reverse %}
6162
<tr>
6263
{% if repo %}
6364
<td data-label="language">
@@ -70,9 +71,11 @@
7071
{{ '{:,}'.format(visitors) }}
7172
</a>
7273
</td>
74+
<td data-label="translators">{{ '{:,}'.format(translators) }}</td>
7375
{% else %}
7476
<td data-label="language">{{ language }}</td>
7577
<td data-label="visitors">0</td>
78+
<td data-label="translators">0</td>
7679
{% endif %}
7780
<td data-label="completion">
7881
<div class="progress-bar" style="width: {{ completion | round(2) }}%;">{{ completion | round(2) }}%</div>

translators.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from collections.abc import Generator
2+
from pathlib import Path
3+
4+
from git import Repo
5+
from polib import pofile
6+
7+
8+
def get_number(path: Path) -> int:
9+
from_headers = len(set(yield_from_headers(path)))
10+
from_git_history = get_number_from_git_history(path)
11+
return max(from_headers, from_git_history)
12+
13+
def get_number_from_git_history(path: Path) -> int:
14+
return len(Repo(path).git.shortlog('-s', 'HEAD').splitlines())
15+
16+
def yield_from_headers(path: Path) -> Generator[str, None, None]:
17+
for file in path.rglob('*.po'):
18+
try:
19+
header = pofile(file).header.splitlines()
20+
except IOError:
21+
continue
22+
if 'Translators:' not in header:
23+
continue
24+
for translator_record in header[header.index('Translators:') + 1:]:
25+
try:
26+
translator, _year = translator_record.split(', ')
27+
except ValueError:
28+
yield translator_record
29+
else:
30+
yield translator

0 commit comments

Comments
 (0)