ohmyzsh/tools/alias_collision/check_alias_collision.py
2024-02-19 12:54:59 +01:00

83 lines
2 KiB
Python

"""Check for alias collisions within the codebase"""
from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser
from pathlib import Path
from typing import List
from dataclasses import dataclass
import itertools
import re
ERROR_MESSAGE_TEMPLATE = """Found alias collision
Alias %s defined in %s already exists as %s in %s.
Consider renaming your alias.
"""
def dir_path(path_string: str) -> Path:
if Path(path_string).is_dir():
return Path(path_string)
else:
raise NotADirectoryError(path_string)
def parse_arguments():
parser = ArgumentParser(
description=__doc__,
formatter_class=ArgumentDefaultsHelpFormatter,
)
parser.add_argument(
"folder",
type=dir_path,
help="Folder to check",
)
return parser.parse_args()
@dataclass(frozen=True)
class Alias:
alias: str
value: str
module: Path
def find_aliases_in_file(file: Path) -> List[Alias]:
matches = re.findall(r"^alias (.*)='(.*)'", file.read_text(), re.M)
return [Alias(match[0], match[1], file) for match in matches]
def find_all_aliases(path: Path) -> List:
files = list(path.rglob("*.zsh"))
aliases = [find_aliases_in_file(file) for file in files]
return list(itertools.chain(*aliases))
def check_for_duplicates(aliases: List[Alias]) -> None:
elements = {}
for alias in aliases:
if alias.alias in elements:
existing = elements[alias.alias]
raise ValueError(
ERROR_MESSAGE_TEMPLATE
% (
f"{alias.alias}={alias.value}",
alias.module.name,
f"{existing.alias}={existing.value}",
existing.module.name,
)
)
else:
elements[alias.alias] = alias
def main():
"""main"""
args = parse_arguments()
aliases = find_all_aliases(args.folder)
check_for_duplicates(aliases)
print("Found no collisions")
if __name__ == "__main__":
main()