Files
SERiF/utils/defaultConfig/generateDefaultConfig.py
Emily Boudreaux 109326f339 feat(defaultConfig): added default config generation script
While writing 4DSSE we want a way to keep track of what defaults have been set for config files, and validate that we are using the same config variables where we want to. This python script generates a "default" yaml file based on the default values given in .get<T>
2025-02-23 11:29:16 -05:00

71 lines
2.6 KiB
Python

import os
import re
import yaml
# Regular expression to match .get<T>("a:b:c", x)
pattern = re.compile(r'\.get<([^>]+)>\("([^"]+)",\s*([^);]+)\)')
def parse_value(value, type_hint):
"""Converts values to appropriate types."""
value = value.strip()
# Handle common types
if type_hint in {"int", "long"}:
return int(value)
elif type_hint in {"float", "double"}:
return float(value)
elif type_hint == "bool":
return value.lower() in {"true", "1"}
elif value.startswith('"') and value.endswith('"'):
return value.strip('"') # Remove quotes for string literals
elif value.startswith("'") and value.endswith("'"):
return value.strip("'") # Remove single quotes
return value # Return as-is if unsure
def insert_into_dict(hierarchy_dict, keys, value, type_hint):
"""Recursively inserts values into a nested dictionary."""
key = keys.pop(0)
if not keys: # If last key, store value
hierarchy_dict[key] = parse_value(value, type_hint)
else:
if key not in hierarchy_dict:
hierarchy_dict[key] = {}
insert_into_dict(hierarchy_dict[key], keys, value, type_hint)
def scan_files(directory):
"""Scans all .cpp, .h, .c, and .hpp files in a directory recursively."""
hierarchy_dict = {}
for root, _, files in os.walk(directory):
for file in files:
if file.endswith(('.cpp', '.h', '.c', '.hpp')):
file_path = os.path.join(root, file)
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
for line in f:
match = pattern.search(line)
if match:
type_hint, hierarchy, value = match.groups()
keys = hierarchy.split(":")
insert_into_dict(hierarchy_dict, keys, value, type_hint)
return hierarchy_dict
def save_yaml(data, output_file):
"""Saves the nested dictionary to a YAML file."""
with open(output_file, 'w', encoding='utf-8') as f:
yaml.dump(data, f, default_flow_style=False, sort_keys=False, indent=4)
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="Generate a YAML file with default configuration values.")
parser.add_argument("directory", help="Directory to scan for .cpp, .h, .c, and .hpp files.")
parser.add_argument("-o", "--output", help="Output file name.", default="defaults.yaml")
args = parser.parse_args()
extracted_data = scan_files(args.directory)
save_yaml(extracted_data, args.output)
print(f"✅ YAML file generated: {args.output}")