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:
11
utils/defaultConfig/defaults.yaml
Normal file
11
utils/defaultConfig/defaults.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
opac:
|
||||||
|
lowTemp:
|
||||||
|
numeric:
|
||||||
|
maxIter: 10
|
||||||
|
Probe:
|
||||||
|
GLVis:
|
||||||
|
Visualization: true
|
||||||
|
Host: localhost
|
||||||
|
Port: '19916'
|
||||||
|
LogManager:
|
||||||
|
DefaultLogName: 4DSSE.log
|
||||||
70
utils/defaultConfig/generateDefaultConfig.py
Normal file
70
utils/defaultConfig/generateDefaultConfig.py
Normal 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}")
|
||||||
|
|
||||||
9
utils/defaultConfig/generateDefaultConfig.sh
Executable file
9
utils/defaultConfig/generateDefaultConfig.sh
Executable 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
|
||||||
14
utils/defaultConfig/readme.md
Normal file
14
utils/defaultConfig/readme.md
Normal 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.
|
||||||
Reference in New Issue
Block a user