feat(calculator): support generate PerformanceAttributes & DifficultyAttributes from JSON Schema (#59)
Prepare for custom rulesets. Schema Genetator: https://github.com/GooGuTeam/custom-rulesets/tree/main/CustomRulesetMetadataGenerator ```bash dotnet -- schemas path/to/rulesets -o schema.json ``` ```bash python scripts/generate_ruleset_attributes.py schema.json ```
This commit is contained in:
64
scripts/generate_ruleset_attributes.py
Normal file
64
scripts/generate_ruleset_attributes.py
Normal file
@@ -0,0 +1,64 @@
|
||||
import datetime
|
||||
from pathlib import Path
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
from datamodel_code_generator import DataModelType, generate
|
||||
from datamodel_code_generator.format import Formatter
|
||||
|
||||
OUTPUT_FILE = Path("app/models/performance.py")
|
||||
|
||||
|
||||
def generate_model(schema_file: Path, version: str = ""):
|
||||
temp_file = OUTPUT_FILE.parent / "_temp.py"
|
||||
if temp_file.exists():
|
||||
temp_file.unlink()
|
||||
temp_file.touch()
|
||||
|
||||
version = version or datetime.datetime.now().strftime("%Y.%m.%d")
|
||||
|
||||
generate(
|
||||
input_=schema_file,
|
||||
output=temp_file,
|
||||
output_model_type=DataModelType.PydanticV2BaseModel,
|
||||
disable_future_imports=True,
|
||||
formatters=[Formatter.RUFF_CHECK, Formatter.RUFF_FORMAT],
|
||||
custom_file_header=(
|
||||
f"# Version: {version}\n"
|
||||
"# Auto-generated by scripts/generate_ruleset_attributes.py.\n"
|
||||
"# Schema generated by https://github.com/GooGuTeam/custom-rulesets\n"
|
||||
"# Do not edit this file directly.\n"
|
||||
"# ruff: noqa: E501\n"
|
||||
),
|
||||
)
|
||||
|
||||
code = temp_file.read_text()
|
||||
output = code
|
||||
performance_attributes_classes = re.findall(r"class (\w+PerformanceAttributes)", code)
|
||||
performance_attributes_classes.append("PerformanceAttributes")
|
||||
output += "PerformanceAttributesUnion = " + " | ".join(performance_attributes_classes) + "\n"
|
||||
difficulty_attributes_classes = re.findall(r"class (\w+DifficultyAttributes)", code)
|
||||
difficulty_attributes_classes.append("DifficultyAttributes")
|
||||
output += "DifficultyAttributesUnion = " + " | ".join(difficulty_attributes_classes) + "\n"
|
||||
OUTPUT_FILE.write_text(output)
|
||||
temp_file.unlink(missing_ok=True)
|
||||
|
||||
subprocess.run(
|
||||
["uv", "run", "ruff", "check", "--fix", "app/models/performance.py"], # nosec B607 # noqa: S607
|
||||
capture_output=True,
|
||||
)
|
||||
subprocess.run(
|
||||
["uv", "run", "ruff", "format", "app/models/performance.py"], # nosec B607 # noqa: S607
|
||||
capture_output=True,
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) < 1:
|
||||
print("Usage: python scripts/generate_ruleset_attributes.py <schema_file> [version]")
|
||||
sys.exit(1)
|
||||
if len(sys.argv) > 2:
|
||||
generate_model(Path(sys.argv[1]), sys.argv[2])
|
||||
else:
|
||||
generate_model(Path(sys.argv[1]))
|
||||
Reference in New Issue
Block a user