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>
This commit is contained in:
2025-02-23 11:29:16 -05:00
parent a20a150c85
commit 109326f339
4 changed files with 104 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
opac:
lowTemp:
numeric:
maxIter: 10
Probe:
GLVis:
Visualization: true
Host: localhost
Port: '19916'
LogManager:
DefaultLogName: 4DSSE.log

View File

@@ -0,0 +1,70 @@
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}")

View File

@@ -0,0 +1,9 @@
#!/bin/bash
# Check if python is installed
if ! [ -x "$(command -v python)" ]; then
echo 'Error: python is not installed.' >&2
exit 1
fi
python ./generateDefaultConfig.py ../../src

View File

@@ -0,0 +1,14 @@
# Default Configuration Generator
Small tool to quickly generate a YAML config file which encodes all the default options used in 4DSSE. All c, c++, h, and hpp in the src directory are scanned and the config variables and their default values pulled out.
## Usage
- You must have python installed
```bash
./generateDefaultConfig.sh
```
There should now be a file called defaults.yaml which stores all the default values.
## Notes
This file could be used as a config file; however, it is more realistically intended for debugging and for checking what the default values set for config options in the code are.