diff --git a/src/main/java/com/twilio/oai/DirectoryStructureService.java b/src/main/java/com/twilio/oai/DirectoryStructureService.java index 9b43e51c7..9e24598ec 100644 --- a/src/main/java/com/twilio/oai/DirectoryStructureService.java +++ b/src/main/java/com/twilio/oai/DirectoryStructureService.java @@ -1,5 +1,7 @@ package com.twilio.oai; +import com.twilio.oai.api.ApiResourceBuilder; +import com.twilio.oai.common.ApplicationConstants; import com.twilio.oai.common.Utility; import com.twilio.oai.resolver.CaseResolver; import com.twilio.oai.resource.IResourceTree; @@ -14,6 +16,8 @@ import lombok.RequiredArgsConstructor; import org.openapitools.codegen.CodegenModel; import org.openapitools.codegen.CodegenOperation; +import org.openapitools.codegen.CodegenParameter; +import org.openapitools.codegen.CodegenProperty; import org.openapitools.codegen.model.ModelsMap; import org.openapitools.codegen.model.OperationMap; import org.openapitools.codegen.model.OperationsMap; @@ -39,6 +43,8 @@ public class DirectoryStructureService { @Getter private boolean isVersionLess = false; + + private String apiFileName; private final Map productMap = new HashMap<>(); private final List allModels = new ArrayList<>(); private final List dependentList = new ArrayList<>(); @@ -253,6 +259,16 @@ public List processOperations(final OperationsMap results) { additionalProperties.put("apiFilename", caseResolver.pathOperation(getResourceAliases(firstOperation.path, null).getClassName())); + apiFileName = caseResolver.pathOperation(getResourceAliases(firstOperation.path, + null).getClassName()); + apiFileName = Utility.convertToPascalCase(apiFileName); + +// for(CodegenOperation co : operations){ +// for(CodegenParameter cp : co.allParams){ +// if(cp.isModel) +// updateDataType(cp); +// } +// } if (isVersionLess) { additionalProperties.put(API_VERSION, caseResolver.productOperation(version)); @@ -311,6 +327,12 @@ public String toApiFilename(final String name) { return String.join(File.separator, pathParts); } +// private void updateDataType(CodegenParameter property) { +// property.dataType = apiFileName + ApplicationConstants.LIST + ApplicationConstants.DOT + property.dataType; +// property.baseType = property.dataType; +// property.datatypeWithEnum = property.dataType; +// } + public void configureAdditionalProps(Map pathMap, String domain, DirectoryStructureService directoryStructureService) { List dependents = new ArrayList<>(); if (domain.equals("api")) { diff --git a/src/main/java/com/twilio/oai/api/PythonApiResourceBuilder.java b/src/main/java/com/twilio/oai/api/PythonApiResourceBuilder.java index 4918ed713..244863dd9 100644 --- a/src/main/java/com/twilio/oai/api/PythonApiResourceBuilder.java +++ b/src/main/java/com/twilio/oai/api/PythonApiResourceBuilder.java @@ -102,6 +102,7 @@ public ApiResourceBuilder updateResponseModel(Resolver codegenP model.setName(resourceName); model.getVars().forEach(variable -> { codegenPropertyResolver.resolve(variable, this); + variable.vendorExtensions.put("json-name", variable.baseName); instancePathParams .stream() @@ -138,7 +139,8 @@ public ApiResourceBuilder updateResponseModel(Resolver codegenP getModelByClassname(variable.complexType).ifPresent(model -> { variable.baseType = variable.baseType.replace(variable.datatypeWithEnum, "str"); variable.datatypeWithEnum = "str"; - model.vendorExtensions.put("part-of-response-model", true); + if(!model.vendorExtensions.containsKey("part-of-request-model")) + model.vendorExtensions.put("part-of-response-model", true); }); } }); diff --git a/src/main/java/com/twilio/oai/common/Utility.java b/src/main/java/com/twilio/oai/common/Utility.java index 9268f6a25..6fb2cf12e 100644 --- a/src/main/java/com/twilio/oai/common/Utility.java +++ b/src/main/java/com/twilio/oai/common/Utility.java @@ -140,4 +140,19 @@ public static void resolveContentType(CodegenOperation co) { } } } + + public static String convertToPascalCase(String input) { + + String[] words = input.split("_"); + + StringBuilder result = new StringBuilder(); + + for (String word : words) { + if (!word.isEmpty()) { + result.append(word.substring(0, 1).toUpperCase()).append(word.substring(1).toLowerCase()); + } + } + + return result.toString(); + } } diff --git a/src/main/java/com/twilio/oai/resolver/python/PythonCodegenModelResolver.java b/src/main/java/com/twilio/oai/resolver/python/PythonCodegenModelResolver.java index 0767052fa..95f7d3c7b 100644 --- a/src/main/java/com/twilio/oai/resolver/python/PythonCodegenModelResolver.java +++ b/src/main/java/com/twilio/oai/resolver/python/PythonCodegenModelResolver.java @@ -45,7 +45,7 @@ public CodegenModel resolve(CodegenModel model, ApiResourceBuilder apiResourceBu if (model == null) { return null; } - + model.vendorExtensions.put("part-of-request-model", true); for (CodegenProperty property : model.vars) { CodegenModel nestedModel = resolveNestedModel(property, apiResourceBuilder); if(nestedModel != null) { @@ -63,6 +63,7 @@ public CodegenModel resolve(CodegenModel model, ApiResourceBuilder apiResourceBu else { model.vendorExtensions.put(key, value); } + return value; }); } diff --git a/src/main/resources/twilio-python/context.handlebars b/src/main/resources/twilio-python/context.handlebars index 0d2f34d60..f501f606a 100644 --- a/src/main/resources/twilio-python/context.handlebars +++ b/src/main/resources/twilio-python/context.handlebars @@ -27,12 +27,15 @@ class {{apiName}}Context(InstanceContext): :returns: The updated {{instanceName}} """ - data = values.of({ {{#allParams}}{{#isFormParam}} + {{#bodyParam}}data = {{paramName}}.to_dict(){{/bodyParam}} + {{^bodyParam}}data = values.of({ {{#allParams}}{{#isFormParam}} '{{{baseName}}}': {{#if vendorExtensions.x-serialize}}{{vendorExtensions.x-serialize}}({{paramName}}{{#if isArray}}, lambda e: e){{else}}){{/if}}{{else}}{{paramName}}{{/if}},{{/isFormParam}}{{/allParams}} - }) - + }){{/bodyParam}} headers = values.of({}) - {{#allParams}}{{#isHeaderParam}}headers['{{{baseName}}}'] = {{paramName}}{{/isHeaderParam}}{{/allParams}} + {{#allParams}}{{#isHeaderParam}} + {{^if required}} + if not ({{paramName}} is values.unset or (isinstance({{paramName}}, str) and not {{paramName}})):{{/if}} + headers['{{{baseName}}}'] = {{paramName}}{{/isHeaderParam}}{{/allParams}} {{#consumes}} headers["Content-Type"] = "{{{mediaType}}}" {{/consumes}} @@ -56,11 +59,16 @@ class {{apiName}}Context(InstanceContext): :returns: The updated {{instanceName}} """ - data = values.of({ {{#allParams}}{{#isFormParam}} + {{#bodyParam}}data = {{paramName}}.to_dict(){{/bodyParam}} + {{^bodyParam}}data = values.of({ {{#allParams}}{{#isFormParam}} '{{{baseName}}}': {{#if vendorExtensions.x-serialize}}{{vendorExtensions.x-serialize}}({{paramName}}{{#if isArray}}, lambda e: e){{else}}){{/if}}{{else}}{{paramName}}{{/if}},{{/isFormParam}}{{/allParams}} - }) + }){{/bodyParam}} headers = values.of({}) - {{#allParams}}{{#isHeaderParam}}headers['{{{baseName}}}'] = {{paramName}}{{/isHeaderParam}}{{/allParams}} + {{#allParams}}{{#isHeaderParam}} + {{^if required}} + if not ({{paramName}} is values.unset or (isinstance({{paramName}}, str) and not {{paramName}})):{{/if}} + headers['{{{baseName}}}'] = {{paramName}} + {{/isHeaderParam}}{{/allParams}} {{#consumes}} headers["Content-Type"] = "{{{mediaType}}}" {{/consumes}} diff --git a/src/main/resources/twilio-python/instance.handlebars b/src/main/resources/twilio-python/instance.handlebars index 9a2060866..d9f8fc545 100644 --- a/src/main/resources/twilio-python/instance.handlebars +++ b/src/main/resources/twilio-python/instance.handlebars @@ -31,7 +31,7 @@ class {{instanceName}}(InstanceResource): {{#operations}}{{#vendorExtensions.x-is-context-operation}} {{#vendorExtensions.x-is-update-operation}} def {{vendorExtensions.x-name-lower}}(self{{#allParams}}, {{paramName}}: {{#if required}}{{{dataType}}}{{else}}Union[{{{dataType}}}, object]=values.unset{{/if}}{{/allParams}}) -> "{{instanceName}}": - """ + """hello3 Update the {{instanceName}} {{#allParams}} :param {{paramName}}: {{{description}}}{{/allParams}} diff --git a/src/main/resources/twilio-python/modelClasses.handlebars b/src/main/resources/twilio-python/modelClasses.handlebars index 210863b2a..dc49eb21f 100644 --- a/src/main/resources/twilio-python/modelClasses.handlebars +++ b/src/main/resources/twilio-python/modelClasses.handlebars @@ -12,6 +12,6 @@ def to_dict(self): return { {{#vars}} - "{{{vendorExtensions.json-name}}}": {{#if complexType}}{{#containerType}}[{{name}}.to_dict() for {{name}} in self.{{name}}]{{/containerType}}{{^containerType}}self.{{name}}{{^vendorExtensions.x-enum-object}}.to_dict(){{/vendorExtensions.x-enum-object}}{{/containerType}}{{else}}self.{{name}}{{/if}},{{/vars}} + "{{{vendorExtensions.json-name}}}": {{#if complexType}}{{#containerType}}[{{name}}.to_dict() for {{name}} in self.{{name}}] if self.{{name}} is not None else None{{/containerType}}{{^containerType}}self.{{name}}{{^vendorExtensions.x-enum-object}}.to_dict() if self.{{name}} is not None else None {{/vendorExtensions.x-enum-object}}{{/containerType}}{{else}}self.{{name}}{{/if}},{{/vars}} } {{/hasVars}}{{/vendorExtensions.part-of-response-model}}{{/models}}