From 0ad98e70fb3402c3a97f822bbf1c44a7a2b57b83 Mon Sep 17 00:00:00 2001 From: "Jules Lasne (jlasne)" Date: Wed, 14 Nov 2018 15:56:52 +0100 Subject: [PATCH 1/3] Sorted the todo entries --- .gitignore | 2 ++ Makefile | 2 +- scripts/todo.py | 29 +++++++++++++++++++++++++++++ scripts/todo.sh | 5 +++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 scripts/todo.py create mode 100755 scripts/todo.sh diff --git a/.gitignore b/.gitignore index b94dfd2b9..44b8e1487 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ *.mo .tx/**/*.po +venv/ +.idea/ diff --git a/Makefile b/Makefile index b6e0c26df..201abcba4 100644 --- a/Makefile +++ b/Makefile @@ -57,7 +57,7 @@ progress: .PHONY: todo todo: - for file in *.po */*.po; do echo $$(msgattrib --untranslated $$file | grep ^msgid | sed 1d | wc -l ) $$file; done | grep -v ^0 | sort -gr + python3 scripts/todo.py .PHONY: merge diff --git a/scripts/todo.py b/scripts/todo.py new file mode 100644 index 000000000..0bf9fe57e --- /dev/null +++ b/scripts/todo.py @@ -0,0 +1,29 @@ +#!/bin/python3 + +import subprocess + +p2 = subprocess.run(['scripts/todo.sh'], encoding='utf-8', shell=True, stdout=subprocess.PIPE) +output = p2.stdout.split('\n') + +folders = { + 'c-api/': [entry for entry in output if 'c-api/' in entry], + 'distributing/': [entry for entry in output if 'distributing/' in entry], + 'distutils/': [entry for entry in output if 'distutils/' in entry], + 'extending/': [entry for entry in output if 'extending/' in entry], + 'faq/': [entry for entry in output if 'faq/' in entry], + 'howto/': [entry for entry in output if 'howto/' in entry], + 'install/': [entry for entry in output if 'install/' in entry], + 'installing/': [entry for entry in output if 'installing/' in entry], + 'library/': [entry for entry in output if 'library/' in entry], + 'reference/': [entry for entry in output if 'reference/' in entry], + 'tutorial/': [entry for entry in output if 'tutorial/' in entry], + 'using/': [entry for entry in output if 'using/' in entry], + 'whatsnew/': [entry for entry in output if 'whatsnew/' in entry], + '/': [entry for entry in output if '/' not in entry] +} + +for key, content in folders.items(): + if content: + print("\n\n" + key) + for item in content: + print(item) diff --git a/scripts/todo.sh b/scripts/todo.sh new file mode 100755 index 000000000..f1828b01a --- /dev/null +++ b/scripts/todo.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +for file in *.po */*.po + do echo $(msgattrib --untranslated $file | grep ^msgid | sed 1d | wc -l ) $file +done | grep -v ^0 | sort -gr From a378aa9c7726cbbdc812a407237ae7357d0b3e92 Mon Sep 17 00:00:00 2001 From: "Jules Lasne (jlasne)" Date: Thu, 15 Nov 2018 11:33:41 +0100 Subject: [PATCH 2/3] Added more details --- scripts/todo.py | 75 ++++++++++++++++++++++++++++++++++--------------- scripts/todo.sh | 5 ---- 2 files changed, 53 insertions(+), 27 deletions(-) delete mode 100755 scripts/todo.sh diff --git a/scripts/todo.py b/scripts/todo.py index 0bf9fe57e..e194cfcdb 100644 --- a/scripts/todo.py +++ b/scripts/todo.py @@ -1,29 +1,60 @@ #!/bin/python3 -import subprocess - -p2 = subprocess.run(['scripts/todo.sh'], encoding='utf-8', shell=True, stdout=subprocess.PIPE) -output = p2.stdout.split('\n') - -folders = { - 'c-api/': [entry for entry in output if 'c-api/' in entry], - 'distributing/': [entry for entry in output if 'distributing/' in entry], - 'distutils/': [entry for entry in output if 'distutils/' in entry], - 'extending/': [entry for entry in output if 'extending/' in entry], - 'faq/': [entry for entry in output if 'faq/' in entry], - 'howto/': [entry for entry in output if 'howto/' in entry], - 'install/': [entry for entry in output if 'install/' in entry], - 'installing/': [entry for entry in output if 'installing/' in entry], - 'library/': [entry for entry in output if 'library/' in entry], - 'reference/': [entry for entry in output if 'reference/' in entry], - 'tutorial/': [entry for entry in output if 'tutorial/' in entry], - 'using/': [entry for entry in output if 'using/' in entry], - 'whatsnew/': [entry for entry in output if 'whatsnew/' in entry], - '/': [entry for entry in output if '/' not in entry] +import os +from glob import glob + +try: + import polib +except ImportError: + print("Sorry, you need to install `polib` to be able to run make todo.") + exit(1) + +working_dir = os.path.dirname(os.path.realpath(__file__)) + +po_files = [] +for po_file in glob("**/*.po"): + po_files.append(po_file) +for po_file in glob("*.po"): + po_files.append(po_file) + + +all_po_files = { + 'c-api/': [entry for entry in po_files if 'c-api/' in entry], + 'distributing/': [entry for entry in po_files if 'distributing/' in entry], + 'distutils/': [entry for entry in po_files if 'distutils/' in entry], + 'extending/': [entry for entry in po_files if 'extending/' in entry], + 'faq/': [entry for entry in po_files if 'faq/' in entry], + 'howto/': [entry for entry in po_files if 'howto/' in entry], + 'install/': [entry for entry in po_files if 'install/' in entry], + 'installing/': [entry for entry in po_files if 'installing/' in entry], + 'library/': [entry for entry in po_files if 'library/' in entry], + 'reference/': [entry for entry in po_files if 'reference/' in entry], + 'tutorial/': [entry for entry in po_files if 'tutorial/' in entry], + 'using/': [entry for entry in po_files if 'using/' in entry], + 'whatsnew/': [entry for entry in po_files if 'whatsnew/' in entry], + '.': [entry for entry in po_files if '/' not in entry] +} + +unfinished_po_files = { + 'c-api/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['c-api/'] if polib.pofile(entry).percent_translated() is not 100], + 'distributing/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['distributing/'] if polib.pofile(entry).percent_translated() is not 100], + 'distutils/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['distutils/'] if polib.pofile(entry).percent_translated() is not 100], + 'extending/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['extending/'] if polib.pofile(entry).percent_translated() is not 100], + 'faq/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['faq/'] if polib.pofile(entry).percent_translated() is not 100], + 'howto/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['howto/'] if polib.pofile(entry).percent_translated() is not 100], + 'install/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['install/'] if polib.pofile(entry).percent_translated() is not 100], + 'installing/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['installing/'] if polib.pofile(entry).percent_translated() is not 100], + 'library/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['library/'] if polib.pofile(entry).percent_translated() is not 100], + 'reference/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['reference/'] if polib.pofile(entry).percent_translated() is not 100], + 'tutorial/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['tutorial/'] if polib.pofile(entry).percent_translated() is not 100], + 'using/': [[entry, polib.pofile(entry).percent_translated(),w len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['using/'] if polib.pofile(entry).percent_translated() is not 100], + 'whatsnew/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['whatsnew/'] if polib.pofile(entry).percent_translated() is not 100], + '.': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['.'] if polib.pofile(entry).percent_translated() is not 100], } -for key, content in folders.items(): +for key, content in unfinished_po_files.items(): if content: print("\n\n" + key) for item in content: - print(item) + print(f"{item[0]:<35} -> {item[1]:5.1f}% translated, {item[2]} entries are not translated," + f" {item[3]:5.1f} entries are translated, {item[4]:5.1f} entries are Fuzzy.".format()) diff --git a/scripts/todo.sh b/scripts/todo.sh deleted file mode 100755 index f1828b01a..000000000 --- a/scripts/todo.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -for file in *.po */*.po - do echo $(msgattrib --untranslated $file | grep ^msgid | sed 1d | wc -l ) $file -done | grep -v ^0 | sort -gr From ada3c8a8a295bb4c5aea1b89692022723f7c0015 Mon Sep 17 00:00:00 2001 From: "Jules Lasne (jlasne)" Date: Thu, 15 Nov 2018 13:25:56 +0100 Subject: [PATCH 3/3] Fixed alignement --- scripts/todo.py | 99 +++++++++++++++++++++++-------------------------- 1 file changed, 47 insertions(+), 52 deletions(-) diff --git a/scripts/todo.py b/scripts/todo.py index e194cfcdb..3e53900ad 100644 --- a/scripts/todo.py +++ b/scripts/todo.py @@ -1,60 +1,55 @@ #!/bin/python3 -import os -from glob import glob +import statistics + +from pathlib import Path try: import polib + import requests except ImportError: - print("Sorry, you need to install `polib` to be able to run make todo.") + print("You need to install polib and requests to be able to run make todo.") exit(1) -working_dir = os.path.dirname(os.path.realpath(__file__)) - -po_files = [] -for po_file in glob("**/*.po"): - po_files.append(po_file) -for po_file in glob("*.po"): - po_files.append(po_file) - - -all_po_files = { - 'c-api/': [entry for entry in po_files if 'c-api/' in entry], - 'distributing/': [entry for entry in po_files if 'distributing/' in entry], - 'distutils/': [entry for entry in po_files if 'distutils/' in entry], - 'extending/': [entry for entry in po_files if 'extending/' in entry], - 'faq/': [entry for entry in po_files if 'faq/' in entry], - 'howto/': [entry for entry in po_files if 'howto/' in entry], - 'install/': [entry for entry in po_files if 'install/' in entry], - 'installing/': [entry for entry in po_files if 'installing/' in entry], - 'library/': [entry for entry in po_files if 'library/' in entry], - 'reference/': [entry for entry in po_files if 'reference/' in entry], - 'tutorial/': [entry for entry in po_files if 'tutorial/' in entry], - 'using/': [entry for entry in po_files if 'using/' in entry], - 'whatsnew/': [entry for entry in po_files if 'whatsnew/' in entry], - '.': [entry for entry in po_files if '/' not in entry] -} - -unfinished_po_files = { - 'c-api/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['c-api/'] if polib.pofile(entry).percent_translated() is not 100], - 'distributing/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['distributing/'] if polib.pofile(entry).percent_translated() is not 100], - 'distutils/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['distutils/'] if polib.pofile(entry).percent_translated() is not 100], - 'extending/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['extending/'] if polib.pofile(entry).percent_translated() is not 100], - 'faq/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['faq/'] if polib.pofile(entry).percent_translated() is not 100], - 'howto/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['howto/'] if polib.pofile(entry).percent_translated() is not 100], - 'install/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['install/'] if polib.pofile(entry).percent_translated() is not 100], - 'installing/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['installing/'] if polib.pofile(entry).percent_translated() is not 100], - 'library/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['library/'] if polib.pofile(entry).percent_translated() is not 100], - 'reference/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['reference/'] if polib.pofile(entry).percent_translated() is not 100], - 'tutorial/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['tutorial/'] if polib.pofile(entry).percent_translated() is not 100], - 'using/': [[entry, polib.pofile(entry).percent_translated(),w len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['using/'] if polib.pofile(entry).percent_translated() is not 100], - 'whatsnew/': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['whatsnew/'] if polib.pofile(entry).percent_translated() is not 100], - '.': [[entry, polib.pofile(entry).percent_translated(), len(polib.pofile(entry).untranslated_entries()), len(polib.pofile(entry).translated_entries()), len(polib.pofile(entry).fuzzy_entries())] for entry in all_po_files['.'] if polib.pofile(entry).percent_translated() is not 100], -} - -for key, content in unfinished_po_files.items(): - if content: - print("\n\n" + key) - for item in content: - print(f"{item[0]:<35} -> {item[1]:5.1f}% translated, {item[2]} entries are not translated," - f" {item[3]:5.1f} entries are translated, {item[4]:5.1f} entries are Fuzzy.".format()) + +def main(): + issues = requests.get( + "https://api.github.com/repos/python/python-docs-fr/issues" + ).json() + reservations = { + issue["title"].split()[-1]: issue["user"]["login"] for issue in issues + } + + po_files = list(Path(".").glob("**/*.po")) + + po_files_per_directory = { + path.parent.name: set(path.parent.glob("*.po")) for path in po_files + } + + for directory, po_files in sorted(po_files_per_directory.items()): + print("\n\n# " + directory) + folder_stats = [] + for po_file in sorted(po_files): + stats = polib.pofile(po_file) + po_file_stat = stats.percent_translated() + if po_file_stat == 100: + folder_stats.append(po_file_stat) + continue + print( + f"{po_file.name:<30}", + f"{len(stats.translated_entries()):3d} / {len(stats):3d}", + f"({po_file_stat:5.1f}% translated)", + f"{len(stats.fuzzy_entries())} fuzzy" if stats.fuzzy_entries() else "", + f"Réservé par {reservations[str(po_file)]}" + if str(po_file) in reservations + else "", + ) + folder_stats.append(po_file_stat) + # TODO: Have the percentage printed next to the folder name + print("\n{}% done.".format(round(statistics.mean(folder_stats), 2))) + + +if __name__ == '__main__': + # TODO: Add PR handling + # TODO: Add total from all folders + main()