Skip to content

Commit 7bc1416

Browse files
committed
ingestion cts is good
1 parent a9c85af commit 7bc1416

15 files changed

+114
-81
lines changed

generators/src/main/java/com/algolia/codegen/AlgoliaGoGenerator.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.algolia.codegen;
22

3+
import com.algolia.codegen.cts.lambda.ScreamingSnakeCaseLambda;
34
import com.algolia.codegen.exceptions.*;
4-
import com.algolia.codegen.lambda.ScreamingSnakeCaseLambda;
55
import com.algolia.codegen.utils.*;
66
import com.google.common.collect.ImmutableMap;
77
import com.google.common.collect.Iterables;
@@ -20,6 +20,9 @@
2020

2121
public class AlgoliaGoGenerator extends GoClientCodegen {
2222

23+
// This is used for the CTS generation
24+
private static final AlgoliaGoGenerator INSTANCE = new AlgoliaGoGenerator();
25+
2326
@Override
2427
public String getName() {
2528
return "algolia-go";
@@ -30,7 +33,6 @@ public void processOpts() {
3033
String client = (String) additionalProperties.get("client");
3134

3235
additionalProperties.put("packageName", client.equals("query-suggestions") ? "suggestions" : Helpers.camelize(client));
33-
additionalProperties.put("enumClassPrefix", true);
3436
additionalProperties.put("is" + Helpers.capitalize(Helpers.camelize(client)) + "Client", true);
3537

3638
String outputFolder = "algolia" + File.separator + client;
@@ -256,4 +258,8 @@ private void flattenBody(CodegenOperation ope) {
256258
ope.allParams.add(param);
257259
}
258260
}
261+
262+
public static String toEnum(String value) {
263+
return INSTANCE.toEnumVarName(value, "String");
264+
}
259265
}

generators/src/main/java/com/algolia/codegen/cts/AlgoliaCTSGenerator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ protected Builder<String, Lambda> addMustacheLambdas() {
102102
lambdas.put("escapeSlash", new EscapeSlashLambda());
103103
lambdas.put("escapeJSON", new EscapeJSONLambda());
104104
lambdas.put("replaceBacktick", new ReplaceBacktickLambda());
105+
lambdas.put("screamingSnakeCase", new ScreamingSnakeCaseLambda());
105106

106107
return lambdas;
107108
}

generators/src/main/java/com/algolia/codegen/lambda/ScreamingSnakeCaseLambda.java renamed to generators/src/main/java/com/algolia/codegen/cts/lambda/ScreamingSnakeCaseLambda.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.algolia.codegen.lambda;
1+
package com.algolia.codegen.cts.lambda;
22

33
import com.algolia.codegen.utils.Helpers;
44
import com.samskivert.mustache.Mustache;

generators/src/main/java/com/algolia/codegen/cts/manager/GoCTSManager.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.algolia.codegen.cts.manager;
22

3+
import com.algolia.codegen.AlgoliaGoGenerator;
34
import com.algolia.codegen.exceptions.GeneratorException;
45
import com.algolia.codegen.utils.*;
6+
import com.samskivert.mustache.Mustache.Lambda;
57
import java.util.*;
68
import org.openapitools.codegen.SupportingFile;
79

@@ -40,4 +42,9 @@ public void addSnippetsSupportingFiles(List<SupportingFile> supportingFiles, Str
4042
supportingFiles.add(new SupportingFile("snippets/.golangci.mustache", output + "/go/.golangci.yml"));
4143
supportingFiles.add(new SupportingFile("snippets/go.mod.mustache", output + "/go/go.mod"));
4244
}
45+
46+
@Override
47+
public void addMustacheLambdas(Map<String, Lambda> lambdas) {
48+
lambdas.put("toEnum", (fragment, writer) -> writer.write(AlgoliaGoGenerator.toEnum(fragment.execute())));
49+
}
4350
}

generators/src/main/java/com/algolia/codegen/cts/manager/JavaCTSManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,6 @@ public void addDataToBundle(Map<String, Object> bundle) throws GeneratorExceptio
5252

5353
@Override
5454
public void addMustacheLambdas(Map<String, Lambda> lambdas) {
55-
lambdas.put("javaEnum", (fragment, writer) -> writer.write(AlgoliaJavaGenerator.toEnum(fragment.execute())));
55+
lambdas.put("toEnum", (fragment, writer) -> writer.write(AlgoliaJavaGenerator.toEnum(fragment.execute())));
5656
}
5757
}

generators/src/main/java/com/algolia/codegen/cts/tests/ParametersWithDataType.java

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public void enhanceParameters(Map<String, Object> parameters, Map<String, Object
9191
operation != null &&
9292
operation.bodyParam != null &&
9393
operation.bodyParam.isModel &&
94-
operation.bodyParam.required
94+
operation.bodyParam.getVars().size() > 0
9595
) {
9696
// check for colision with other params
9797
boolean hasCollision = false;
@@ -105,14 +105,19 @@ public void enhanceParameters(Map<String, Object> parameters, Map<String, Object
105105
}
106106
if (!hasCollision) {
107107
// flatten the body params by skipping one level
108+
System.out.println("Flatten the body in " + operation.operationId);
108109
Map<String, Object> bodyParams = (Map<String, Object>) param.getValue();
109-
for (CodegenProperty prop : operation.bodyParam.getVars()) {
110-
Object nestedParam = bodyParams.get(prop.baseName);
111-
112-
Map<String, Object> paramWithType = traverseParams(prop.baseName, nestedParam, prop, "", 0, false);
113-
parametersWithDataType.add(paramWithType);
114-
parametersWithDataTypeMap.put((String) paramWithType.get("key"), paramWithType);
110+
for (String nestedParam : bodyParams.keySet()) {
111+
for (CodegenProperty prop : operation.bodyParam.getVars()) {
112+
if (prop.baseName.equals(nestedParam)) {
113+
Map<String, Object> paramWithType = traverseParams(prop.baseName, bodyParams.get(nestedParam), prop, "", 0, false);
114+
parametersWithDataType.add(paramWithType);
115+
parametersWithDataTypeMap.put((String) paramWithType.get("key"), paramWithType);
116+
break;
117+
}
118+
}
115119
}
120+
// sortParameters(operation.bodyParam, parametersWithDataType);
116121
}
117122
} else {
118123
Map<String, Object> paramWithType = traverseParams(param.getKey(), param.getValue(), specParam, "", 0, false);
@@ -121,6 +126,20 @@ public void enhanceParameters(Map<String, Object> parameters, Map<String, Object
121126
}
122127
}
123128
}
129+
} else if (language.equals("go") && parameters != null) {
130+
// also flatten when the body is the only parameter
131+
System.out.println("Skipping unique body in " + operation.operationId);
132+
for (String nestedParam : parameters.keySet()) {
133+
for (CodegenProperty prop : operation.bodyParam.getVars()) {
134+
if (prop.baseName.equals(nestedParam)) {
135+
Map<String, Object> paramWithType = traverseParams(prop.baseName, parameters.get(nestedParam), prop, "", 0, false);
136+
parametersWithDataType.add(paramWithType);
137+
parametersWithDataTypeMap.put((String) paramWithType.get("key"), paramWithType);
138+
break;
139+
}
140+
}
141+
}
142+
// sortParameters(operation.bodyParam, parametersWithDataType);
124143
} else {
125144
Map<String, Object> paramWithType = traverseParams(paramName, parameters, spec, "", 0, false);
126145
parametersWithDataType.add(paramWithType);
@@ -447,15 +466,7 @@ private void handleModel(
447466
}
448467

449468
if (language.equals("swift")) {
450-
// Store ordered params from the spec
451-
var orderedParams = spec.getVars().stream().map(v -> v.baseName).toList();
452-
453-
// Create a map to store the indices of each string in orderedParams
454-
Map<String, Integer> indexMap = IntStream.range(0, orderedParams.size())
455-
.boxed()
456-
.collect(Collectors.toMap(orderedParams::get, i -> i));
457-
458-
values.sort(Comparator.comparing(value -> indexMap.getOrDefault((String) value.get("key"), Integer.MAX_VALUE)));
469+
sortParameters(spec, values);
459470
}
460471

461472
var hasAdditionalProperties = values
@@ -783,4 +794,14 @@ private boolean couldMatchEnum(Object value, CodegenProperty model) {
783794

784795
return ((List) values).contains(value);
785796
}
797+
798+
private void sortParameters(IJsonSchemaValidationProperties spec, List<Map<String, Object>> parameters) {
799+
// Store ordered params from the spec
800+
var orderedParams = spec.getVars().stream().map(v -> v.baseName).toList();
801+
802+
// Create a map to store the indices of each string in orderedParams
803+
Map<String, Integer> indexMap = IntStream.range(0, orderedParams.size()).boxed().collect(Collectors.toMap(orderedParams::get, i -> i));
804+
805+
parameters.sort(Comparator.comparing(param -> indexMap.getOrDefault((String) param.get("key"), Integer.MAX_VALUE)));
806+
}
786807
}

generators/src/main/java/com/algolia/codegen/cts/tests/Snippet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public void addMethodCall(Map<String, Object> context, ParametersWithDataType pa
8585
}
8686
}
8787

88-
TestsGenerator.setOptionalParameters(ope, context);
88+
TestsGenerator.setOptionalParameters(ope, context, parameters);
8989

9090
paramsType.enhanceParameters(parameters, context, ope);
9191
} catch (CTSException e) {

generators/src/main/java/com/algolia/codegen/cts/tests/TestsClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ public void run(Map<String, CodegenModel> models, Map<String, CodegenOperation>
156156
// default to true because most api calls are asynchronous
157157
testOut.put("isAsyncMethod", (boolean) ope.vendorExtensions.getOrDefault("x-asynchronous-helper", true));
158158

159-
setOptionalParameters(ope, stepOut);
159+
setOptionalParameters(ope, stepOut, step.parameters);
160160
addRequestOptions(paramsType, step.requestOptions, stepOut);
161161

162162
methodCount++;

generators/src/main/java/com/algolia/codegen/cts/tests/TestsGenerator.java

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -133,44 +133,55 @@ protected void addRequestOptions(ParametersWithDataType paramsType, RequestOptio
133133
}
134134
}
135135

136-
public static void setOptionalParameters(CodegenOperation ope, Map<String, Object> test) {
137-
long bodyPropsOptional = 0;
138-
if (ope.bodyParam != null) {
139-
if (ope.bodyParam.isModel && ope.bodyParam.required) {
140-
// check for colision with other params
141-
boolean hasCollision = false;
142-
for (CodegenProperty prop : ope.bodyParam.getVars()) {
143-
for (CodegenParameter param : ope.allParams) {
144-
if (param.paramName.equals(prop.baseName)) {
145-
hasCollision = true;
146-
break;
147-
}
136+
public static void setOptionalParameters(CodegenOperation ope, Map<String, Object> test, Map<String, Object> parameters) {
137+
int bodyPropsOptional = 0;
138+
boolean actuallyHasOptional = false;
139+
if (ope.bodyParam != null && ope.bodyParam.isModel) {
140+
// check for colision with other params
141+
boolean hasCollision = false;
142+
Map<String, Object> paramBody = (Map<String, Object>) parameters.get(ope.bodyParam.paramName);
143+
if (ope.allParams.size() == 1) { // edge case where the body is already flattened
144+
paramBody = parameters;
145+
}
146+
147+
System.out.println(ope.bodyParam.paramName + " len " + ope.bodyParam.getVars().size());
148+
for (CodegenProperty prop : ope.bodyParam.getVars()) {
149+
for (CodegenParameter param : ope.allParams) {
150+
if (param.paramName.equals(prop.baseName)) {
151+
hasCollision = true;
148152
}
149153
}
150154

151-
if (!hasCollision) {
152-
bodyPropsOptional = ope.bodyParam.getVars().stream().filter(prop -> !prop.required).count();
155+
if (paramBody != null) System.out.println(
156+
prop.baseName + " is required " + prop.required + " " + paramBody.containsKey(prop.baseName)
157+
);
158+
if (!prop.required && paramBody != null && paramBody.containsKey(prop.baseName)) {
159+
actuallyHasOptional = true;
153160
}
154161
}
162+
163+
if (!hasCollision) {
164+
bodyPropsOptional = (int) ope.bodyParam.getVars().stream().filter(prop -> !prop.required).count();
165+
}
155166
}
156167

157-
System.out.println(
158-
ope.operationId +
159-
" has " +
160-
ope.allParams.size() +
161-
" params " +
162-
ope.requiredParams.size() +
163-
" required params " +
164-
ope.optionalParams.size() +
165-
" optional params " +
166-
bodyPropsOptional +
167-
" bodyPropsOptional " +
168-
(ope.optionalParams.size() + bodyPropsOptional > 1) +
169-
" hasOptionalWrapper "
170-
);
168+
int totalOptional = ope.optionalParams.size() + bodyPropsOptional;
169+
170+
for (CodegenParameter param : ope.allParams) {
171+
if (!param.required && parameters.containsKey(param.baseName)) {
172+
actuallyHasOptional = true;
173+
break;
174+
}
175+
}
171176

172177
// hasOptionalWrapper if there is more that one optional param, after the body has been
173178
// flattened, only relevant for go
174-
test.put("hasOptionalWrapper", ope.optionalParams.size() + bodyPropsOptional > 1);
179+
test.put("hasOptionalWrapper", (totalOptional > 1) && actuallyHasOptional);
180+
test.put("hasNilOptional", (totalOptional > 0) && !actuallyHasOptional);
181+
test.put("hasOptionalRequired", (totalOptional == 1) && actuallyHasOptional);
182+
183+
System.out.println(ope.operationId + " hasOptionalWrapper: " + test.get("hasOptionalWrapper"));
184+
System.out.println("hasNilOptional: " + test.get("hasNilOptional"));
185+
System.out.println("hasOptionalRequired: " + test.get("hasOptionalRequired"));
175186
}
176187
}

generators/src/main/java/com/algolia/codegen/cts/tests/TestsRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ public void run(Map<String, CodegenModel> models, Map<String, CodegenOperation>
161161
test.put("hasParams", ope.hasParams);
162162
test.put("isHelper", isHelper);
163163

164-
setOptionalParameters(ope, test);
164+
setOptionalParameters(ope, test, req.parameters);
165165
addRequestOptions(paramsType, req.requestOptions, test);
166166

167167
// Determines whether the endpoint is expected to return a response payload deserialized

0 commit comments

Comments
 (0)