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]}")