mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-21 06:43:06 -08:00
106 lines
3.2 KiB
Python
106 lines
3.2 KiB
Python
import os
|
|
from typing import Dict, List
|
|
|
|
|
|
def has_implementation(lang: str, file_list: List[str], subdir_list: List[str]) -> bool:
|
|
if lang == "csharp":
|
|
return any(file.endswith(".cs") for file in file_list)
|
|
elif lang == "vbnet":
|
|
return any(file.endswith(".vb") for file in file_list)
|
|
else:
|
|
return len(file_list) > 1 or len(subdir_list) > 0
|
|
|
|
|
|
def get_data(checklist_orig: List[str], root_dir: str = "..") -> List[List[str]]:
|
|
"""
|
|
|
|
Parameters
|
|
----------
|
|
root_dir : str
|
|
The root directory you want to start from.
|
|
"""
|
|
lang_pos: Dict[str, int] = {
|
|
lang: i for i, lang in enumerate(checklist_orig[1:], start=1)
|
|
}
|
|
strings_done: List[List[str]] = []
|
|
|
|
ignore_folders = [
|
|
".git",
|
|
"00_Utilities",
|
|
".github",
|
|
".mypy_cache",
|
|
".pytest_cache",
|
|
"00_Alternate_Languages",
|
|
"00_Common",
|
|
"buildJvm",
|
|
"htmlcov",
|
|
]
|
|
|
|
prev_game = ""
|
|
|
|
empty_boxes = ["⬜️" for _ in checklist_orig]
|
|
checklist = empty_boxes[:]
|
|
|
|
for dir_name, subdir_list, file_list in sorted(os.walk(root_dir)):
|
|
# split_dir[1] is the game
|
|
# split_dir[2] is the language
|
|
split_dir = dir_name.split(os.path.sep)
|
|
|
|
if len(split_dir) == 2 and split_dir[1] not in ignore_folders:
|
|
if prev_game == "":
|
|
prev_game = split_dir[1]
|
|
checklist[0] = f"{split_dir[1]:<30}"
|
|
|
|
if prev_game != split_dir[1]:
|
|
# it's a new dir
|
|
strings_done.append(checklist)
|
|
checklist = [
|
|
f"{split_dir[1]:<30}",
|
|
] + empty_boxes[1:]
|
|
prev_game = split_dir[1]
|
|
elif (
|
|
len(split_dir) == 3 and split_dir[1] != ".git" and split_dir[2] in lang_pos
|
|
):
|
|
out = (
|
|
"✅"
|
|
if has_implementation(split_dir[2], file_list, subdir_list)
|
|
else "⬜️"
|
|
)
|
|
if split_dir[2] not in lang_pos or lang_pos[split_dir[2]] >= len(checklist):
|
|
print(f"Could not find {split_dir[2]}: {dir_name}")
|
|
checklist[lang_pos[split_dir[2]]] = "⬜️"
|
|
continue
|
|
checklist[lang_pos[split_dir[2]]] = out
|
|
return strings_done
|
|
|
|
|
|
def write_file(path: str, languages: List[str], strings_done: List[List[str]]) -> None:
|
|
dashes_arr = ["---"] * (len(languages) + 1)
|
|
dashes_arr[0] = "-" * 30
|
|
dashes = " | ".join(dashes_arr)
|
|
write_string = f"# TODO list\n {'game':<30}| {' | '.join(languages)}\n{dashes}\n"
|
|
sorted_strings = list(
|
|
map(lambda l: " | ".join(l) + "\n", sorted(strings_done, key=lambda x: x[0]))
|
|
)
|
|
write_string += "".join(sorted_strings)
|
|
|
|
with open(path, "w", encoding="utf-8") as f:
|
|
f.write(write_string)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
languages = {
|
|
"csharp": "C#",
|
|
"java": "Java",
|
|
"javascript": "JS",
|
|
"kotlin": "Kotlin",
|
|
"lua": "Lua",
|
|
"perl": "Perl",
|
|
"python": "Python",
|
|
"ruby": "Ruby",
|
|
"rust": "Rust",
|
|
"vbnet": "VB.NET",
|
|
}
|
|
strings_done = get_data(["game"] + list(languages.keys()))
|
|
write_file("TODO.md", list(languages.values()), strings_done)
|