Skip to content

Commit 2f86564

Browse files
committed
rename to guide
1 parent 8b31d9e commit 2f86564

File tree

12 files changed

+242
-3
lines changed

12 files changed

+242
-3
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.algolia.codegen.cts.lambda.*;
44
import com.algolia.codegen.cts.manager.CTSManager;
55
import com.algolia.codegen.cts.manager.CTSManagerFactory;
6+
import com.algolia.codegen.cts.guides.GuidesGenerator;
67
import com.algolia.codegen.cts.tests.*;
78
import com.algolia.codegen.exceptions.*;
89
import com.algolia.codegen.utils.*;
@@ -66,6 +67,8 @@ public void processOpts() {
6667
ctsManager.addSnippetsSupportingFiles(supportingFiles);
6768

6869
testsGenerators.add(new SnippetsGenerator(ctsManager));
70+
} else if (mode.equals("guides")) {
71+
testsGenerators.add(new GuidesGenerator(ctsManager));
6972
} else {
7073
throw new RuntimeException("Unknown mode: " + mode);
7174
}
@@ -151,6 +154,7 @@ public Map<String, Object> postProcessSupportingFileData(Map<String, Object> obj
151154
bundle.put("isSyncClient", false);
152155
// special lambda for dynamic templates
153156
bundle.put("dynamicTemplate", new DynamicTemplateLambda(this));
157+
bundle.put("dynamicSnippet", new DynamicSnippetLambda(this, models, operations, language, client));
154158
bundle.put("lambda", lambda);
155159

156160
String languageVersion = ctsManager.getLanguageVersion((String) additionalProperties.getOrDefault("languageVersion", ""));
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.algolia.codegen.cts.guides;
2+
3+
import com.algolia.codegen.cts.manager.CTSManager;
4+
import com.algolia.codegen.cts.tests.TestsGenerator;
5+
import com.algolia.codegen.utils.*;
6+
import java.io.File;
7+
import java.util.*;
8+
import org.openapitools.codegen.CodegenModel;
9+
import org.openapitools.codegen.CodegenOperation;
10+
import org.openapitools.codegen.SupportingFile;
11+
12+
public class GuidesGenerator extends TestsGenerator {
13+
14+
public GuidesGenerator(CTSManager ctsManager) {
15+
super(ctsManager);
16+
}
17+
18+
@Override
19+
public boolean available() {
20+
File templates = new File("templates/" + language + "/guides/method.mustache");
21+
return templates.exists();
22+
}
23+
24+
@Override
25+
public void addSupportingFiles(List<SupportingFile> supportingFiles, String outputFolder, String extension) {
26+
if (!available()) {
27+
return;
28+
}
29+
30+
// same extension as the snippets
31+
extension = Helpers.getClientConfigField(language, "snippets", "extension");
32+
outputFolder = Helpers.getClientConfigField(language, "snippets", "outputFolder");
33+
34+
if (!outputFolder.equals("")) {
35+
outputFolder = "/" + outputFolder + "/";
36+
} else {
37+
outputFolder = "/";
38+
}
39+
40+
supportingFiles.add(
41+
new SupportingFile(
42+
"guides/method.mustache",
43+
"guides/" + language + outputFolder + Helpers.createClientName(client, language) + extension
44+
)
45+
);
46+
}
47+
48+
@Override
49+
public void run(Map<String, CodegenModel> models, Map<String, CodegenOperation> operations, Map<String, Object> bundle) throws Exception {
50+
if (this.client.equals("search")) {
51+
bundle.put("isSearchClient", true);
52+
}
53+
54+
List<Object> blocks = new ArrayList<>();
55+
}
56+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.algolia.codegen.cts.lambda;
2+
3+
import com.algolia.codegen.cts.tests.ParametersWithDataType;
4+
import com.algolia.codegen.exceptions.CTSException;
5+
import com.samskivert.mustache.Mustache;
6+
import com.samskivert.mustache.Template;
7+
import io.swagger.v3.core.util.Json;
8+
import java.io.IOException;
9+
import java.io.Writer;
10+
import java.util.Map;
11+
import org.openapitools.codegen.CodegenModel;
12+
import org.openapitools.codegen.CodegenOperation;
13+
import org.openapitools.codegen.DefaultCodegen;
14+
import org.openapitools.codegen.TemplateManager;
15+
import org.openapitools.codegen.api.TemplatePathLocator;
16+
import org.openapitools.codegen.api.TemplatingEngineAdapter;
17+
import org.openapitools.codegen.api.TemplatingExecutor;
18+
import org.openapitools.codegen.templating.CommonTemplateContentLocator;
19+
import org.openapitools.codegen.templating.GeneratorTemplateContentLocator;
20+
import org.openapitools.codegen.templating.TemplateManagerOptions;
21+
22+
public class DynamicSnippetLambda implements Mustache.Lambda {
23+
24+
private final TemplatingExecutor executor;
25+
private final TemplatingEngineAdapter adaptor;
26+
27+
private ParametersWithDataType paramsType;
28+
private Map<String, CodegenOperation> operations;
29+
30+
public DynamicSnippetLambda(
31+
DefaultCodegen generator,
32+
Map<String, CodegenModel> models,
33+
Map<String, CodegenOperation> operations,
34+
String language,
35+
String client
36+
) {
37+
this.operations = operations;
38+
this.paramsType = new ParametersWithDataType(models, language, client, true);
39+
40+
// we can't access the default template manager, so we have to create our own
41+
TemplateManager templateManager = new TemplateManager(
42+
new TemplateManagerOptions(generator.isEnableMinimalUpdate(), generator.isSkipOverwrite()),
43+
generator.getTemplatingEngine(),
44+
new TemplatePathLocator[] { new GeneratorTemplateContentLocator(generator), new CommonTemplateContentLocator() }
45+
);
46+
47+
this.executor = templateManager;
48+
this.adaptor = generator.getTemplatingEngine();
49+
}
50+
51+
@Override
52+
public void execute(Template.Fragment fragment, Writer writer) throws IOException, CTSException {
53+
String snippet = fragment.execute();
54+
String operationId = snippet.split(" ", 2)[0];
55+
56+
CodegenOperation operation = operations.get(operationId);
57+
if (operation == null) {
58+
throw new CTSException("Cannot find operation for method: " + operationId);
59+
}
60+
61+
// set the method attributes
62+
Map<String, Object> context = (Map<String, Object>) fragment.context();
63+
context.put("method", operationId);
64+
context.put("isAsyncMethod", (boolean) operation.vendorExtensions.getOrDefault("x-asynchronous-helper", true));
65+
context.put("isHelper", (boolean) operation.vendorExtensions.getOrDefault("x-helper", false));
66+
context.put("hasParams", operation.hasParams);
67+
68+
// set the parameters
69+
Map<String, Object> parameters = Json.mapper().readValue(params, Map.class);
70+
System.out.println("parameters: " + parameters);
71+
context.put("parameters", params);
72+
73+
writer.write(adaptor.compileTemplate(executor, context, "tests/client/method.mustache"));
74+
}
75+
}

scripts/cli/index.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { runCts } from '../cts/runCts.js';
99
import { startTestServer } from '../cts/testServer';
1010
import { formatter } from '../formatter.js';
1111
import { generate } from '../generate.js';
12+
import { guidesGenerateMany } from '../guides/generate.js';
1213
import { playground } from '../playground.js';
1314
import { createReleasePR } from '../release/createReleasePR.js';
1415
import { generateSLA } from '../release/sla.js';
@@ -239,6 +240,17 @@ program
239240
await snippetsGenerateMany(generatorList({ language, client, clientList }));
240241
});
241242

243+
program
244+
.command('guides')
245+
.description('Generate the guides')
246+
.addArgument(args.language)
247+
.option(flags.verbose.flag, flags.verbose.description)
248+
.action(async (langArg: LangArg, { verbose }) => {
249+
setVerbose(Boolean(verbose));
250+
251+
await guidesGenerateMany(generatorList({ language: 'javascript', client: ['search'], clientList: ['search'] }));
252+
});
253+
242254
program
243255
.command('release')
244256
.description('Releases the client')

scripts/guides/generate.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { callGenerator, exists, run, setupAndGen, toAbsolutePath } from '../common.js';
2+
import { getTestOutputFolder } from '../config.js';
3+
import { formatter } from '../formatter.js';
4+
import type { Generator } from '../types.js';
5+
6+
export async function guidesGenerateMany(generators: Generator[]): Promise<void> {
7+
await setupAndGen(generators, 'guides', async (gen) => {
8+
if (getTestOutputFolder(gen.language)) {
9+
await callGenerator(gen);
10+
}
11+
});
12+
13+
const langs = [...new Set(generators.map((gen) => gen.language))];
14+
for (const lang of langs) {
15+
if (!getTestOutputFolder(lang)) {
16+
continue;
17+
}
18+
19+
if (lang === 'javascript') {
20+
await run('YARN_ENABLE_IMMUTABLE_INSTALLS=false yarn install', {
21+
cwd: 'guides/javascript',
22+
});
23+
}
24+
25+
if (lang === 'go') {
26+
await run('go mod tidy', {
27+
cwd: 'guides/go',
28+
language: 'go',
29+
});
30+
}
31+
32+
const guidesPath = `guides/${lang}`;
33+
if (await exists(toAbsolutePath(guidesPath))) {
34+
await formatter(lang, guidesPath);
35+
}
36+
}
37+
}

scripts/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export type Generator = Record<string, any> & {
3030
additionalProperties: AdditionalProperties;
3131
};
3232

33-
export type GeneratorMode = 'client' | 'snippets' | 'tests';
33+
export type GeneratorMode = 'client' | 'guides' | 'snippets' | 'tests';
3434

3535
export type RunOptions = {
3636
errorMessage?: string;

templates/java/tests/generateInnerParams.mustache

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
{{#isNull}}
22
null
33
{{/isNull}}
4+
{{#isVerbatim}}
5+
{{{value}}}
6+
{{/value}}
47
{{#isString}}
58
"{{#lambda.escapeQuotes}}{{#lambda.escapeSlash}}{{{value}}}{{/lambda.escapeSlash}}{{/lambda.escapeQuotes}}"
69
{{/isString}}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{{> tests/snippets/import}}
2+
3+
{{> tests/snippets/init}}
4+
5+
// Fetch and index objects in Algolia
6+
const processRecords = async () => {
7+
const datasetRequest = await fetch('https://dashboard.algolia.com/sample_datasets/movie.json');
8+
const objects = await datasetRequest.json();
9+
return {{#dynamicSnippet}}saveObjectsMovies{{/dynamicSnippet}}
10+
11+
{{#dynamicSnippet}}prout{{/dynamicSnippet}}
12+
};
13+
14+
processRecords()
15+
.then(() => console.log('Successfully indexed objects!'))
16+
.catch((err) => console.error(err));
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import { {{client}} } from '{{{import}}}';
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
const client = {{client}}("ALGOLIA_APPLICATION_ID", "ALGOLIA_API_KEY", {{#hasRegionalHost}}'ALGOLIA_APPLICATION_REGION', {{/hasRegionalHost}});

0 commit comments

Comments
 (0)