From 2739006b5201322e9e978c98693ce4850713ecfc Mon Sep 17 00:00:00 2001 From: xstraok <89219595+xstraok@users.noreply.github.com> Date: Mon, 17 Apr 2023 13:14:03 -0400 Subject: [PATCH 1/3] Update fluentscan.py added: initial error checking support, detecting of unused entries --- fluentscan.py | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/fluentscan.py b/fluentscan.py index cf05b5e..85ad790 100644 --- a/fluentscan.py +++ b/fluentscan.py @@ -5,6 +5,17 @@ import os import sys +import glob + +valid_args=["diff","unused"] + +if len(sys.argv)<3 or len(sys.argv) == 0: + print("missing arguments") + sys.exit() + +if sys.argv[2] not in valid_args: + print(f"invalid argument:{sys.argv[2]}") + sys.exit() path = "assets/locales/" + sys.argv[1] + "/" @@ -48,8 +59,27 @@ for filename in os.listdir("assets/locales/en"): # TODO: why modified is not used? added, removed, modified, same = dict_compare(expected, expected2) + if sys.argv[2] == "unused" or sys.argv[2] == "missing": + files = glob.glob("src/" + '/**/*.rs', recursive=True) + used=[] + for i in files: + with open(i,"r") as script: + text=script.read() + if sys.argv[2] == "unused": + for j in expected: + if '"'+j+'"' in text: + used.append(j) + #elif sys.argv[2] == "missing": + #for j in text.split(): + #find all cases of tr( + + for i in expected: + if i not in used: + print(f"{i} is not used ({locale_file.name})") - if added or removed or same: + continue + + if (added or removed or same) and sys.argv[2] == "diff": print(f"[{created_locale.name[15:]}]") if added: @@ -72,3 +102,5 @@ for filename in os.listdir("assets/locales/en"): print(f" {i} = {expected[i]}") print("") + + From 3cea26c072dc47b1f8a6b8f648d240d6f6deff00 Mon Sep 17 00:00:00 2001 From: xstraok <89219595+xstraok@users.noreply.github.com> Date: Mon, 17 Apr 2023 19:52:56 -0400 Subject: [PATCH 2/3] add detection of missing entries --- fluentscan.py | 105 +++++++++++++++++++++++++++++--------------------- 1 file changed, 62 insertions(+), 43 deletions(-) diff --git a/fluentscan.py b/fluentscan.py index 85ad790..d6e0b31 100644 --- a/fluentscan.py +++ b/fluentscan.py @@ -6,62 +6,69 @@ import os import sys import glob +import re -valid_args=["diff","unused"] +valid_args=["diff","unused","missing"] if len(sys.argv)<3 or len(sys.argv) == 0: print("missing arguments") sys.exit() if sys.argv[2] not in valid_args: - print(f"invalid argument:{sys.argv[2]}") + print(f"invalid argument:{sys.argv[2]}\n Valid arguments: {valid_args}") sys.exit() path = "assets/locales/" + sys.argv[1] + "/" +all_entries={} + +def dict_compare(d1, d2): + d1_keys = set(d1.keys()) + d2_keys = set(d2.keys()) + shared_keys = d1_keys.intersection(d2_keys) + + added = d1_keys - d2_keys + removed = d2_keys - d1_keys + + same = set(o for o in shared_keys if d1[o] == d2[o]) + + return added, removed, same + +def to_dict(text): + result={} + + for i in text: + if " =" in i: + try: + result[i.split()[0]] = ' '.join(i.split()[2:]) + + except: + pass + + elif i: + result[list(result.keys())[-1]] += i + + return result + +def get_line_num(text,pattern): + line=1 + for i in text.split("\n"): + if pattern in i: + return line + line += 1 for filename in os.listdir("assets/locales/en"): with open(os.path.join("assets/locales/en", filename), 'r') as locale_file: created_locale = open(path + filename) - def to_dict(text): - result={} - - for i in text: - if " = " in i: - try: - result[i.split()[0]] = ' '.join(i.split()[2:]) - - except: - pass - - elif i: - result[list(result.keys())[-1]] += i - - return result - - def dict_compare(d1, d2): - d1_keys = set(d1.keys()) - d2_keys = set(d2.keys()) - - shared_keys = d1_keys.intersection(d2_keys) - - added = d1_keys - d2_keys - removed = d2_keys - d1_keys - - modified = {o : (d1[o], d2[o]) for o in shared_keys if d1[o] != d2[o]} - - same = set(o for o in shared_keys if d1[o] == d2[o]) - - return added, removed, modified, same - expected=to_dict(locale_file) + all_entries.update(expected) expected2=to_dict(created_locale) - # TODO: why modified is not used? - added, removed, modified, same = dict_compare(expected, expected2) + added, removed, same = dict_compare(expected, expected2) if sys.argv[2] == "unused" or sys.argv[2] == "missing": files = glob.glob("src/" + '/**/*.rs', recursive=True) used=[] + vars={} for i in files: with open(i,"r") as script: text=script.read() @@ -69,13 +76,20 @@ for filename in os.listdir("assets/locales/en"): for j in expected: if '"'+j+'"' in text: used.append(j) - #elif sys.argv[2] == "missing": - #for j in text.split(): - #find all cases of tr( - - for i in expected: - if i not in used: - print(f"{i} is not used ({locale_file.name})") + elif sys.argv[2] == "missing": + for j in text.split(): + if 'tr("' in j: + index=j.find('tr("') + var_name=re.sub('[^\\w-]+', '', + j[index:].replace('tr("','') + .replace("Some","")) + # TODO: search multiple lines + vars[var_name] = [script.name, get_line_num(text,var_name)] + + if sys.argv[2] == "unused": + for i in expected: + if i not in used: + print(f"{i} is not used ({locale_file.name})") continue @@ -102,5 +116,10 @@ for filename in os.listdir("assets/locales/en"): print(f" {i} = {expected[i]}") print("") - +if sys.argv[2] == "missing": + added, removed, same = dict_compare(vars, all_entries) + if not added: + print("nothing is missing") + for i in added: + print(f"missing entry: {i} ({vars[i][0]}), line {vars[i][1]}") From c82fbcfef4e060008d92d10e423ae90622d13a55 Mon Sep 17 00:00:00 2001 From: xstraok <89219595+xstraok@users.noreply.github.com> Date: Mon, 17 Apr 2023 20:20:37 -0400 Subject: [PATCH 3/3] finalize error checking and format printing formatted printing when "missing" or "unused" argument was used --- fluentscan.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/fluentscan.py b/fluentscan.py index d6e0b31..91d76c2 100644 --- a/fluentscan.py +++ b/fluentscan.py @@ -19,6 +19,13 @@ if sys.argv[2] not in valid_args: sys.exit() path = "assets/locales/" + sys.argv[1] + "/" +try: + x=open(path+"/main.ftl","r") + x.close() +except: + print(f"{path} does not exist") + sys.exit() + all_entries={} def dict_compare(d1, d2): @@ -78,18 +85,22 @@ for filename in os.listdir("assets/locales/en"): used.append(j) elif sys.argv[2] == "missing": for j in text.split(): + # TODO: ignore comments if 'tr("' in j: index=j.find('tr("') var_name=re.sub('[^\\w-]+', '', j[index:].replace('tr("','') .replace("Some","")) - # TODO: search multiple lines + # TODO: index multiple matches vars[var_name] = [script.name, get_line_num(text,var_name)] if sys.argv[2] == "unused": for i in expected: if i not in used: - print(f"{i} is not used ({locale_file.name})") + print(f"[{locale_file.name}]\n" + " [Unused]\n" + f" {i}") + continue @@ -122,4 +133,6 @@ if sys.argv[2] == "missing": if not added: print("nothing is missing") for i in added: - print(f"missing entry: {i} ({vars[i][0]}), line {vars[i][1]}") + print(f"[{vars[i][0]}, line {vars[i][1]}]\n" + " [Missing]\n" + f" {i}")