From 8d003b55681c8b8dbca36ff5dfef9cb566d3fc1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= <gp5761@partner.kit.edu> Date: Mon, 31 Mar 2025 15:10:03 +0200 Subject: [PATCH] WIP: Generate EnumObjects --- .../middleware_generator/MiddlewareLoader.py | 8 ++- .../middleware_generator/MiddlewareModel.py | 2 +- .../middleware_generator/generator.py | 64 ++++++++++++------- 3 files changed, 48 insertions(+), 26 deletions(-) diff --git a/net_api_generator/middleware_generator/MiddlewareLoader.py b/net_api_generator/middleware_generator/MiddlewareLoader.py index a3d0b95..3d64efc 100644 --- a/net_api_generator/middleware_generator/MiddlewareLoader.py +++ b/net_api_generator/middleware_generator/MiddlewareLoader.py @@ -1,6 +1,6 @@ import json from graphlib import TopologicalSorter -from typing import Optional +from typing import Optional, List from net_api_generator.middleware_generator.MiddlewareModel import ApiObject, FunctionParameterEnumType, EnumString, \ FunctionParameter, FunctionParameterBaseType, TypeConnector, FunctionParameterSimpleType, \ @@ -10,6 +10,7 @@ from net_api_generator.middleware_generator.MiddlewareModel import ApiObject, Fu class MiddlewareLoader: openapi_file: str api_objects: list[ApiObject] = [] + dependencies: dict[str, List[str]] = {} def __init__(self, openapi_file): self.openapi_file = openapi_file @@ -91,12 +92,12 @@ class MiddlewareLoader: def load_api_object(self, component_key, component: dict)->ApiObject: if 'properties' in component: function_paramter_types = self.load_properties_parameter_types(component['properties']) - function_parameters = {parameter_type.title: FunctionParameter(parameter_type.title, parameter_type) for parameter_type in function_paramter_types} + function_parameters = [FunctionParameter(parameter_type.title, parameter_type) for parameter_type in function_paramter_types] return ApiObject(component_key, function_parameters) elif 'enum' in component: enum_type = self.load_enum_parameter_type(component) function_parameter = FunctionParameter(enum_type.title, enum_type) - return ApiObject(enum_type.title, {enum_type.title: function_parameter}) + return ApiObject(enum_type.title, [function_parameter]) else: raise ValueError('Unexpected structure of Open API Component') @@ -123,6 +124,7 @@ class MiddlewareLoader: references = find_reference_dependencies(component) for reference in references: ts.add(component_key, reference) + self.dependencies[component_key] = references result = list(ts.static_order()) return result diff --git a/net_api_generator/middleware_generator/MiddlewareModel.py b/net_api_generator/middleware_generator/MiddlewareModel.py index 6dcee09..7ed1141 100644 --- a/net_api_generator/middleware_generator/MiddlewareModel.py +++ b/net_api_generator/middleware_generator/MiddlewareModel.py @@ -64,6 +64,6 @@ class FunctionParameter: @dataclass() class ApiObject: name: str - parameters: dict[str, FunctionParameter] + parameters: list[FunctionParameter] diff --git a/net_api_generator/middleware_generator/generator.py b/net_api_generator/middleware_generator/generator.py index d9c053d..b9378bf 100644 --- a/net_api_generator/middleware_generator/generator.py +++ b/net_api_generator/middleware_generator/generator.py @@ -1,34 +1,54 @@ import json + from net_api_generator.middleware_generator.MiddlewareLoader import MiddlewareLoader as Loader from net_api_generator.middleware_generator.MiddlewareModel import FunctionParameterEnumType, \ - FunctionParameterArrayType, FunctionParameterSimpleType, FunctionParameterComposedType + FunctionParameterArrayType, FunctionParameterSimpleType, FunctionParameterComposedType,\ + FunctionParameter, ApiObject def typescript(open_api_file): + def generate_object_class(api_object: ApiObject): + api_object_code = ("export class ${API_OBJECT_NAME} {\n" + "\t${API_ATTRIBUTE}\n" + "\tconstructor(${CONSTRUCTOR_PARAMETER}) {\n" + "\t\t${ATTRIBUTE_ASSIGNMENT}\n" + "\t}" + "}") + def generate_integer_enum(enum_parameter: FunctionParameter): + pass + + def generate_object_enum(api_object: ApiObject, enum_parameter: FunctionParameter): + if isinstance(enum_parameter.data_type, FunctionParameterEnumType): + code_template = ("export enum ${API_OBJECT_NAME} {\n" + "\t${ENUM_VALUE}\n" + "}") + code_template = code_template.replace("${API_OBJECT_NAME}", api_object.name) + if enum_parameter.data_type.data_type == 'string': + for i, possible_value in enumerate(enum_parameter.data_type.enum): + enum_value_str = f"{str(possible_value).upper()} = '{str(possible_value)}'" + if i < len(enum_parameter.data_type.enum) - 1: + code_template = code_template.replace("${ENUM_VALUE}", enum_value_str + ",\n\t${ENUM_VALUE}") + else: + code_template = code_template.replace("${ENUM_VALUE}", enum_value_str) + return code_template + else: + for i, possible_value in enumerate(enum_parameter.data_type.enum): + enum_value_str = f"VALUE_{possible_value} = '{str(possible_value)}'" + if i < len(enum_parameter.data_type.enum) - 1: + code_template = code_template.replace("${ENUM_VALUE}", enum_value_str + ",\n\t${ENUM_VALUE}") + else: + code_template = code_template.replace("${ENUM_VALUE}", enum_value_str) + print(code_template) + return code_template + else: + raise ValueError("Passed Parameter is not an enum!") + + loader = Loader(open_api_file) loader.load() api_objects = loader.api_objects for api_object in api_objects: - api_object_code = ("export class ${API_OBJECT_NAME}\n" - "\t${API_ATTRIBUTE}\n" - "\tconstructor(${CONSTRUCTOR_PARAMETER}) {\n" - "\t\t${ATTRIBUTE_ASSIGNMENT}\n" - "\t}" - "}") - - api_object_code = api_object_code.replace("${API_OBJECT_NAME}", api_object.name) - - for parameter in api_object.parameters.values(): - parameter_name = parameter.title - parameter_type = parameter.data_type - if isinstance(parameter_type, FunctionParameterEnumType): - print(parameter_name + " " + parameter_type.data_type) - elif isinstance(parameter_type, FunctionParameterArrayType): - print(parameter_name + " " + parameter_type.item_type.title) - elif isinstance(parameter_type, FunctionParameterSimpleType): - #todo: abstract method to resolve datatype name for referencing recursive data_type uses - print(parameter_name + " " + parameter_type.title) - elif isinstance(parameter_type, FunctionParameterComposedType): - print(parameter_name + " " + parameter_type.title) + if len(api_object.parameters) == 1 and isinstance(api_object.parameters[0].data_type, FunctionParameterEnumType): + generate_object_enum(api_object, api_object.parameters[0]) -- GitLab