-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathrepositories.py
46 lines (38 loc) · 1.51 KB
/
repositories.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import re
from collections.abc import Iterator
from dataclasses import dataclass
from pathlib import Path
from tempfile import TemporaryDirectory
from docutils import core
from docutils.nodes import table, row
from git import Repo
def get_languages_and_repos(
devguide_dir: Path,
) -> Iterator[tuple['Language', str | None]]:
translating = devguide_dir.joinpath('documentation/translating.rst').read_text()
doctree = core.publish_doctree(translating)
for node in doctree.traverse(table):
for row_node in node.traverse(row)[1:]:
language = row_node[0].astext()
repo = row_node[2].astext()
language_match = re.match(r'(.*) \((.*)\)', language)
if not language_match:
raise ValueError(
f'Expected a language code in brackets in devguide table, found {language}'
)
language_name = language_match.group(1)
language_code = language_match.group(2).lower().replace('_', '-')
repo_match = re.match(':github:`GitHub <(.*)>`', repo)
yield (
Language(language_code, language_name),
repo_match and repo_match.group(1),
)
@dataclass(frozen=True)
class Language:
code: str
name: str
if __name__ == '__main__':
with TemporaryDirectory() as directory:
Repo.clone_from('https://github.com/python/devguide.git', directory, depth=1)
for item in get_languages_and_repos(Path(directory)):
print(item)