Closed yeggor closed 3 years ago
Helper script (bf_guids.py
):
import json
import os
import re
import click
re_checker = re.compile(r"^[A-Z0-9_]+$")
re_splitter = re.compile(r"[A-Z][^A-Z]*")
@click.group()
def cli():
pass
def rename_guid(guid: str) -> str:
words = re_splitter.findall(guid)
return "_".join(words).upper()
def choose_name(dups: list) -> str:
# choose longest name as most informative
res_name = dups[0]
for dup in dups[1:]:
if len(dup) > len(res_name):
res_name = dup
return res_name
@click.command()
@click.argument("guids_path")
def rename_guids(guids_path: str) -> None:
if not os.path.isfile(guids_path):
exit("Check path to guids.json")
guids = dict()
with open(guids_path, "r") as f:
try:
guids = json.load(f)
except json.JSONDecodeError:
exit("Check guids.json format")
guids_res = dict()
for guid in guids:
if re_checker.match(guid) is not None:
guids_res[guid] = guids[guid]
continue
# convert GUID name
name = rename_guid(guid)
guids_res[name] = guids[guid]
with open("out-rename.json", "w") as f:
json.dump(guids_res, f, indent=2)
print("Done")
@click.command()
@click.argument("guids_path")
def detect_dups(guids_path) -> None:
if not os.path.isfile(guids_path):
exit("Check path to guids.json")
guids = dict()
with open(guids_path, "r") as f:
try:
guids = json.load(f)
except json.JSONDecodeError:
exit("Check guids.json format")
# sort GUIDs
res = dict()
for name, value in guids.items():
if tuple(value) in res:
res[tuple(value)].append(name)
else:
res[tuple(value)] = list([name])
# print diplicates
found = False
for g, dups in res.items():
if len(dups) > 1:
print(f"Found duplicates for {g}: {dups}")
res_name = choose_name(dups)
print(f"{res_name} remained, the rest are deleted")
for dup in dups:
if dup != res_name:
del guids[dup]
found = True
with open("out-dups.json", "w") as f:
json.dump(guids, f, indent=2)
if not found:
print("Duplicates not found")
cli.add_command(rename_guids)
cli.add_command(detect_dups)
if __name__ == "__main__":
cli()
Usage:
python3 bf_guids.py detect-dups {path to guids.json}
python3 bf_guids.py rename-guids out-dups.json
out-rename.json
file will cut the final result