Skip to content

Commit 2b98ad6

Browse files
committed
ingestion cts is good
1 parent edaa89f commit 2b98ad6

File tree

15 files changed

+114
-85
lines changed

15 files changed

+114
-85
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 & 20 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);
@@ -451,19 +470,7 @@ private void handleModel(
451470
}
452471

453472
if (language.equals("swift")) {
454-
// Store ordered params from the spec
455-
var orderedParams = spec
456-
.getVars()
457-
.stream()
458-
.map(v -> v.baseName)
459-
.toList();
460-
461-
// Create a map to store the indices of each string in orderedParams
462-
Map<String, Integer> indexMap = IntStream.range(0, orderedParams.size())
463-
.boxed()
464-
.collect(Collectors.toMap(orderedParams::get, i -> i));
465-
466-
values.sort(Comparator.comparing(value -> indexMap.getOrDefault((String) value.get("key"), Integer.MAX_VALUE)));
473+
sortParameters(spec, values);
467474
}
468475

469476
var hasAdditionalProperties = values
@@ -795,4 +802,14 @@ private boolean couldMatchEnum(Object value, CodegenProperty model) {
795802

796803
return ((List) values).contains(value);
797804
}
805+
806+
private void sortParameters(IJsonSchemaValidationProperties spec, List<Map<String, Object>> parameters) {
807+
// Store ordered params from the spec
808+
var orderedParams = spec.getVars().stream().map(v -> v.baseName).toList();
809+
810+
// Create a map to store the indices of each string in orderedParams
811+
Map<String, Integer> indexMap = IntStream.range(0, orderedParams.size()).boxed().collect(Collectors.toMap(orderedParams::get, i -> i));
812+
813+
parameters.sort(Comparator.comparing(param -> indexMap.getOrDefault((String) param.get("key"), Integer.MAX_VALUE)));
814+
}
798815
}

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
@@ -86,7 +86,7 @@ public void addMethodCall(Map<String, Object> context, ParametersWithDataType pa
8686
}
8787
}
8888

89-
TestsGenerator.setOptionalParameters(ope, context);
89+
TestsGenerator.setOptionalParameters(ope, context, parameters);
9090

9191
paramsType.enhanceParameters(parameters, context, ope);
9292
} 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
@@ -158,7 +158,7 @@ public void run(Map<String, CodegenModel> models, Map<String, CodegenOperation>
158158
// default to true because most api calls are asynchronous
159159
testOut.put("isAsyncMethod", (boolean) ope.vendorExtensions.getOrDefault("x-asynchronous-helper", true));
160160

161-
setOptionalParameters(ope, stepOut);
161+
setOptionalParameters(ope, stepOut, step.parameters);
162162
addRequestOptions(paramsType, step.requestOptions, stepOut);
163163

164164
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
@@ -129,44 +129,55 @@ protected void addRequestOptions(ParametersWithDataType paramsType, RequestOptio
129129
}
130130
}
131131

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

147-
if (!hasCollision) {
148-
bodyPropsOptional = ope.bodyParam.getVars().stream().filter(prop -> !prop.required).count();
151+
if (paramBody != null) System.out.println(
152+
prop.baseName + " is required " + prop.required + " " + paramBody.containsKey(prop.baseName)
153+
);
154+
if (!prop.required && paramBody != null && paramBody.containsKey(prop.baseName)) {
155+
actuallyHasOptional = true;
149156
}
150157
}
158+
159+
if (!hasCollision) {
160+
bodyPropsOptional = (int) ope.bodyParam.getVars().stream().filter(prop -> !prop.required).count();
161+
}
151162
}
152163

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

168173
// hasOptionalWrapper if there is more that one optional param, after the body has been
169174
// flattened, only relevant for go
170-
test.put("hasOptionalWrapper", ope.optionalParams.size() + bodyPropsOptional > 1);
175+
test.put("hasOptionalWrapper", (totalOptional > 1) && actuallyHasOptional);
176+
test.put("hasNilOptional", (totalOptional > 0) && !actuallyHasOptional);
177+
test.put("hasOptionalRequired", (totalOptional == 1) && actuallyHasOptional);
178+
179+
System.out.println(ope.operationId + " hasOptionalWrapper: " + test.get("hasOptionalWrapper"));
180+
System.out.println("hasNilOptional: " + test.get("hasNilOptional"));
181+
System.out.println("hasOptionalRequired: " + test.get("hasOptionalRequired"));
171182
}
172183
}

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
@@ -171,7 +171,7 @@ public void run(Map<String, CodegenModel> models, Map<String, CodegenOperation>
171171
test.put("hasParams", ope.getHasParams());
172172
test.put("isHelper", isHelper);
173173

174-
setOptionalParameters(ope, test);
174+
setOptionalParameters(ope, test, req.parameters);
175175
addRequestOptions(paramsType, req.requestOptions, test);
176176

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

0 commit comments

Comments
 (0)