|  | #!/usr/bin/env python3 | 
|  |  | 
|  | # Copyright (c) 2025 James Roy <rruuaanng@outlook.com> | 
|  | # SPDX-License-Identifier: Apache-2.0 | 
|  |  | 
|  | # This script is used to replace the properties containing | 
|  | # underscores in the binding. | 
|  |  | 
|  |  | 
|  | import argparse | 
|  | import os | 
|  | import sys | 
|  | from pathlib import Path | 
|  |  | 
|  | import yaml | 
|  |  | 
|  | # bindings base | 
|  | BINDINGS_PATH = [Path("dts/bindings/")] | 
|  | BINDINGS_PROPERTIES_AL = None | 
|  | with open(Path(__file__).parents[1] / 'bindings_properties_allowlist.yaml') as f: | 
|  | allowlist = yaml.safe_load(f.read()) | 
|  | if allowlist is not None: | 
|  | BINDINGS_PROPERTIES_AL = set(allowlist) | 
|  | else: | 
|  | BINDINGS_PROPERTIES_AL = set() | 
|  |  | 
|  |  | 
|  | def parse_cmd_args(): | 
|  | parse = argparse.ArgumentParser(allow_abbrev=False) | 
|  | parse.add_argument("--path", nargs="+", help="User binding path directory", type=Path) | 
|  | return parse.parse_args() | 
|  |  | 
|  |  | 
|  | def get_yaml_binding_paths() -> list: | 
|  | """Returns a list of 'dts/bindings/**/*.yaml'""" | 
|  | from glob import glob | 
|  |  | 
|  | bindings = [] | 
|  | for path in BINDINGS_PATH: | 
|  | yamls = glob(f"{os.fspath(path)}/**/*.yaml", recursive=True) | 
|  | bindings.extend(yamls) | 
|  | return bindings | 
|  |  | 
|  |  | 
|  | def replace_bindings_underscores(binding_paths): | 
|  | """ | 
|  | Replace all property names containing underscores in the bindings. | 
|  | """ | 
|  | for binding_path in binding_paths: | 
|  | with open(binding_path, encoding="utf-8") as f: | 
|  | yaml_binding = yaml.safe_load(f) | 
|  | properties = yaml_binding.get("properties", {}) | 
|  | for prop_name in properties: | 
|  | if '_' in prop_name and prop_name not in BINDINGS_PROPERTIES_AL: | 
|  | _replace_underscores(binding_path, prop_name) | 
|  |  | 
|  |  | 
|  | def _replace_underscores(binding_path, prop_name): | 
|  | """Replace implementation""" | 
|  | with open(binding_path, "r+", encoding="utf-8") as f: | 
|  | lines = f.readlines() | 
|  | for i, rowline in enumerate(lines): | 
|  | line = rowline.split(":")[0].strip() | 
|  | if prop_name == line and "#" not in rowline: | 
|  | new_key = prop_name.replace("_", "-") | 
|  | if new_key != line: | 
|  | lines[i] = rowline.replace(line, new_key) | 
|  | f.seek(0) | 
|  | f.writelines(lines) | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | args = parse_cmd_args() | 
|  |  | 
|  | if args.path is not None: | 
|  | BINDINGS_PATH.extend(args.path) | 
|  |  | 
|  | bindings = get_yaml_binding_paths() | 
|  | replace_bindings_underscores(bindings) | 
|  |  | 
|  | sys.exit(0) |