1#!/usr/bin/env python3
2
3# Copyright (c) 2025 James Roy <rruuaanng@outlook.com>
4# SPDX-License-Identifier: Apache-2.0
5
6# This script is used to replace the properties containing
7# underscores in the binding.
8
9
10import argparse
11import os
12import sys
13from pathlib import Path
14
15import yaml
16
17# bindings base
18BINDINGS_PATH = [Path("dts/bindings/")]
19BINDINGS_PROPERTIES_AL = None
20with open(Path(__file__).parents[1] / 'bindings_properties_allowlist.yaml') as f:
21    allowlist = yaml.safe_load(f.read())
22    if allowlist is not None:
23        BINDINGS_PROPERTIES_AL = set(allowlist)
24    else:
25        BINDINGS_PROPERTIES_AL = set()
26
27
28def parse_cmd_args():
29    parse = argparse.ArgumentParser(allow_abbrev=False)
30    parse.add_argument("--path", nargs="+", help="User binding path directory", type=Path)
31    return parse.parse_args()
32
33
34def get_yaml_binding_paths() -> list:
35    """Returns a list of 'dts/bindings/**/*.yaml'"""
36    from glob import glob
37
38    bindings = []
39    for path in BINDINGS_PATH:
40        yamls = glob(f"{os.fspath(path)}/**/*.yaml", recursive=True)
41        bindings.extend(yamls)
42    return bindings
43
44
45def replace_bindings_underscores(binding_paths):
46    """
47    Replace all property names containing underscores in the bindings.
48    """
49    for binding_path in binding_paths:
50        with open(binding_path, encoding="utf-8") as f:
51            yaml_binding = yaml.safe_load(f)
52            properties = yaml_binding.get("properties", {})
53            for prop_name in properties:
54                if '_' in prop_name and prop_name not in BINDINGS_PROPERTIES_AL:
55                    _replace_underscores(binding_path, prop_name)
56
57
58def _replace_underscores(binding_path, prop_name):
59    """Replace implementation"""
60    with open(binding_path, "r+", encoding="utf-8") as f:
61        lines = f.readlines()
62        for i, rowline in enumerate(lines):
63            line = rowline.split(":")[0].strip()
64            if prop_name == line and "#" not in rowline:
65                new_key = prop_name.replace("_", "-")
66                if new_key != line:
67                    lines[i] = rowline.replace(line, new_key)
68        f.seek(0)
69        f.writelines(lines)
70
71
72if __name__ == '__main__':
73    args = parse_cmd_args()
74
75    if args.path is not None:
76        BINDINGS_PATH.extend(args.path)
77
78    bindings = get_yaml_binding_paths()
79    replace_bindings_underscores(bindings)
80
81    sys.exit(0)
82