Skip to content

Commit 9379e57

Browse files
authored
Merge branch 'main' into clara/feat/merge-comp-api-clients
2 parents 276da13 + ebd1398 commit 9379e57

File tree

8 files changed

+102
-42
lines changed

8 files changed

+102
-42
lines changed

scripts/cli/index.ts

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Argument, program } from 'commander';
1+
import { Argument, Option, program } from 'commander';
22
import semver from 'semver';
33

44
import { buildLanguages } from '../buildLanguages.ts';
@@ -29,10 +29,11 @@ const args = {
2929
};
3030

3131
const flags = {
32-
verbose: {
33-
flag: '-v, --verbose',
34-
description: 'make the generation verbose',
35-
},
32+
verbose: new Option('-v, --verbose', 'make the generation verbose'),
33+
debugger: new Option(
34+
'-d, --debugger',
35+
'runs the generator in debug mode, it will wait for a Java debugger to be attached',
36+
),
3637
};
3738

3839
program.name('cli');
@@ -49,16 +50,17 @@ program
4950
.description('Generate a specified client')
5051
.addArgument(args.language)
5152
.addArgument(args.clients)
52-
.option(flags.verbose.flag, flags.verbose.description)
53-
.action(async (langArg: LangArg, clientArg: string[], { verbose }) => {
53+
.addOption(flags.verbose)
54+
.addOption(flags.debugger)
55+
.action(async (langArg: LangArg, clientArg: string[], { verbose, debugger: withDebugger }) => {
5456
const { language, client, clientList } = transformSelection({
5557
langArg,
5658
clientArg,
5759
});
5860

5961
setVerbose(Boolean(verbose));
6062

61-
await generate(generatorList({ language, client, clientList }));
63+
await generate(generatorList({ language, client, clientList }), Boolean(withDebugger));
6264
});
6365

6466
const buildCommand = program.command('build').description('Build the clients or specs');
@@ -68,7 +70,7 @@ buildCommand
6870
.description('Build a specified client')
6971
.addArgument(args.language)
7072
.addArgument(args.clients)
71-
.option(flags.verbose.flag, flags.verbose.description)
73+
.addOption(flags.verbose)
7274
.action(async (langArg: LangArg, clientArg: string[], { verbose }) => {
7375
const { language, client, clientList } = transformSelection({
7476
langArg,
@@ -85,7 +87,7 @@ buildCommand
8587
.description('Build a specified playground')
8688
.addArgument(args.language)
8789
.addArgument(args.clients)
88-
.option(flags.verbose.flag, flags.verbose.description)
90+
.addOption(flags.verbose)
8991
.action(async (langArg: LangArg, clientArg: string[], { verbose }) => {
9092
const { language, client, clientList } = transformSelection({
9193
langArg,
@@ -102,7 +104,7 @@ buildCommand
102104
.description('Build a specified snippets')
103105
.addArgument(args.language)
104106
.addArgument(args.clients)
105-
.option(flags.verbose.flag, flags.verbose.description)
107+
.addOption(flags.verbose)
106108
.action(async (langArg: LangArg, clientArg: string[], { verbose }) => {
107109
const { language, client, clientList } = transformSelection({
108110
langArg,
@@ -119,7 +121,7 @@ buildCommand
119121
.description('Build a specified guides')
120122
.addArgument(args.language)
121123
.addArgument(args.clients)
122-
.option(flags.verbose.flag, flags.verbose.description)
124+
.addOption(flags.verbose)
123125
.action(async (langArg: LangArg, clientArg: string[], { verbose }) => {
124126
const { language, client, clientList } = transformSelection({
125127
langArg,
@@ -135,7 +137,7 @@ buildCommand
135137
.command('specs')
136138
.description('Build a specified spec')
137139
.addArgument(args.clients)
138-
.option(flags.verbose.flag, flags.verbose.description)
140+
.addOption(flags.verbose)
139141
.option('-s, --skip-cache', 'skip cache checking to force building specs')
140142
.option('-j, --json', 'outputs the spec in JSON instead of yml')
141143
.option('-d, --docs', 'generates the doc specs with the code snippets')
@@ -172,25 +174,26 @@ ctsCommand
172174
.description('Generate the CTS tests')
173175
.addArgument(args.language)
174176
.addArgument(args.clients)
175-
.option(flags.verbose.flag, flags.verbose.description)
177+
.addOption(flags.verbose)
178+
.addOption(flags.debugger)
176179
.option('--lv, --language-version <version>', 'the version of the language to use')
177-
.action(async (langArg: LangArg, clientArg: string[], { verbose, languageVersion }) => {
180+
.action(async (langArg: LangArg, clientArg: string[], { verbose, debugger: withDebugger, languageVersion }) => {
178181
const { language, client, clientList } = transformSelection({
179182
langArg,
180183
clientArg,
181184
});
182185

183186
setVerbose(Boolean(verbose));
184187

185-
await ctsGenerateMany(generatorList({ language, client, clientList }), languageVersion);
188+
await ctsGenerateMany(generatorList({ language, client, clientList }), withDebugger, languageVersion);
186189
});
187190

188191
ctsCommand
189192
.command('run')
190193
.description('Run the tests for the CTS')
191194
.addArgument(args.language)
192195
.addArgument(args.clients)
193-
.option(flags.verbose.flag, flags.verbose.description)
196+
.addOption(flags.verbose)
194197
.option('-e, --no-e2e', 'skip the e2e tests, that requires internet connection')
195198
.option('-c, --no-client', 'skip the client tests')
196199
.option('-r, --no-requests', 'skip the requests tests')
@@ -250,7 +253,7 @@ program
250253
.description('Format the specified folder for a specific language')
251254
.addArgument(args.requiredLanguage)
252255
.argument('folder', 'The folder to format')
253-
.option(flags.verbose.flag, flags.verbose.description)
256+
.addOption(flags.verbose)
254257
.action(async (language: string, folder: string, { verbose }) => {
255258
setVerbose(Boolean(verbose));
256259

@@ -262,25 +265,27 @@ program
262265
.description('Generate the snippets')
263266
.addArgument(args.language)
264267
.addArgument(args.clients)
265-
.option(flags.verbose.flag, flags.verbose.description)
266-
.action(async (langArg: LangArg, clientArg: string[], { verbose }) => {
268+
.addOption(flags.verbose)
269+
.addOption(flags.debugger)
270+
.action(async (langArg: LangArg, clientArg: string[], { verbose, debugger: withDebugger }) => {
267271
const { language, client, clientList } = transformSelection({
268272
langArg,
269273
clientArg,
270274
});
271275

272276
setVerbose(Boolean(verbose));
273277

274-
await docsGenerateMany(generatorList({ language, client, clientList }), 'snippets');
278+
await docsGenerateMany(generatorList({ language, client, clientList }), 'snippets', Boolean(withDebugger));
275279
});
276280

277281
program
278282
.command('guides')
279283
.description('Generate the guides')
280284
.addArgument(args.language)
281285
.addArgument(args.clients)
282-
.option(flags.verbose.flag, flags.verbose.description)
283-
.action(async (langArg: LangArg, clientArg: string[], { verbose }) => {
286+
.addOption(flags.verbose)
287+
.addOption(flags.debugger)
288+
.action(async (langArg: LangArg, clientArg: string[], { verbose, debugger: withDebugger }) => {
284289
const { language, client, clientList } = transformSelection({
285290
langArg,
286291
clientArg,
@@ -293,13 +298,14 @@ program
293298
existsSync(toAbsolutePath(`templates/${gen.language}/guides/${gen.client}`)),
294299
),
295300
'guides',
301+
Boolean(withDebugger),
296302
);
297303
});
298304

299305
program
300306
.command('release')
301307
.description('Releases the client')
302-
.option(flags.verbose.flag, flags.verbose.description)
308+
.addOption(flags.verbose)
303309
.option<semver.ReleaseType>(
304310
'--rt --release-type <type>',
305311
'triggers a release for the given language list with the given releaseType',

scripts/common.ts

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import fsp from 'fs/promises';
22
import path from 'path';
33

44
import { Octokit } from '@octokit/rest';
5+
import chalk from 'chalk';
56
import type { ExecaError } from 'execa';
67
import { execa, execaCommand } from 'execa';
78
import { remove } from 'fs-extra';
@@ -270,13 +271,28 @@ export function isVerbose(): boolean {
270271
return verbose;
271272
}
272273

273-
export async function callGenerator(gen: Generator): Promise<void> {
274-
await run(
275-
// Use the following line if you want to be able to attach a debugger to the generators
276-
// `JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=\*:5009" yarn openapi-generator-cli --custom-generator=generators/build/libs/algolia-java-openapi-generator-1.0.0.jar generate --generator-key ${gen.key}`,
277-
`yarn openapi-generator-cli --custom-generator=generators/build/libs/algolia-java-openapi-generator-1.0.0.jar generate --generator-key ${gen.key}`,
278-
{ language: 'java' },
274+
export async function callGenerator(gen: Generator, withDebugger: boolean): Promise<void> {
275+
const cmd = `yarn openapi-generator-cli --custom-generator=generators/build/libs/algolia-java-openapi-generator-1.0.0.jar generate --generator-key ${gen.key}`;
276+
if (!withDebugger) {
277+
await run(cmd, { language: 'java' });
278+
return;
279+
}
280+
281+
console.log(
282+
chalk.yellow(
283+
'Running the generator in debug mode, waiting for debugger to be attached on port 5009\nsee the doc for reference: https://api-clients-automation.netlify.app/docs/CLI/cts-commands#attach-a-debugger-to-the-generator',
284+
),
279285
);
286+
287+
const verbose = isVerbose();
288+
setVerbose(false); // verbose messes up the order of execution
289+
290+
// kill previous debuggers
291+
await run('(killall -9 java && sleep 1) || true', { language: 'java' });
292+
setVerbose(verbose);
293+
await run(`JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5009" ${cmd}`, {
294+
language: 'java',
295+
});
280296
}
281297

282298
export function isWSL(): boolean {

scripts/cts/generate.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,17 @@ import { getTestOutputFolder } from '../config.ts';
33
import { formatter } from '../formatter.ts';
44
import type { Generator } from '../types.ts';
55

6-
export async function ctsGenerateMany(generators: Generator[], languageVersion = ''): Promise<void> {
6+
export async function ctsGenerateMany(
7+
generators: Generator[],
8+
withDebugger: boolean,
9+
languageVersion = '',
10+
): Promise<void> {
711
await setupAndGen(
812
generators,
913
'tests',
1014
async (gen) => {
1115
if (getTestOutputFolder(gen.language)) {
12-
await callGenerator(gen);
16+
await callGenerator(gen, withDebugger);
1317
}
1418
},
1519
{

scripts/docker/Dockerfile.base

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ SHELL ["/bin/bash", "--login", "-c"]
1616
# Global dependencies
1717
RUN apt-get update \
1818
&& apt-get install -y --no-install-recommends git curl zip unzip libexpat1-dev libicu76 \
19+
# for killall and ps
20+
&& apt-get install -y procps \
1921
&& apt-get clean \
2022
&& rm -rf /var/lib/apt/lists/*
2123

scripts/docs/generate.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@ import { getTestOutputFolder } from '../config.ts';
33
import { formatter } from '../formatter.ts';
44
import type { Generator } from '../types.ts';
55

6-
export async function docsGenerateMany(generators: Generator[], scope: 'guides' | 'snippets'): Promise<void> {
6+
export async function docsGenerateMany(
7+
generators: Generator[],
8+
scope: 'guides' | 'snippets',
9+
withDebugger: boolean,
10+
): Promise<void> {
711
await setupAndGen(generators, scope, async (gen) => {
812
if (getTestOutputFolder(gen.language)) {
9-
await callGenerator(gen);
13+
await callGenerator(gen, withDebugger);
1014
}
1115
});
1216

scripts/generate.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ async function preGen(gen: Generator): Promise<void> {
88
await removeExistingCodegen(gen);
99
}
1010

11-
export async function generate(generators: Generator[]): Promise<void> {
11+
export async function generate(generators: Generator[], withDebugger: boolean): Promise<void> {
1212
await setupAndGen(generators, 'client', async (gen) => {
1313
await preGen(gen);
14-
await callGenerator(gen);
14+
await callGenerator(gen, withDebugger);
1515
});
1616

1717
for (const lang of new Set(generators.map((gen) => gen.language))) {

website/docs/CLI/cts-commands.md

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ apic cts generate <language | all> <client... | all>
2626

2727
### Available options
2828

29-
| Option | Command | Description |
30-
| ------- | :------------ | :------------------------------------------------------------ |
31-
| verbose | -v, --verbose | Make the process verbose, display logs from third party tools |
29+
| Option | Command | Description |
30+
|----------|:---------------|:----------------------------------------------------------------------------------|
31+
| verbose | -v, --verbose | Make the process verbose, display logs from third party tools |
32+
| debugger | -d, --debugger | runs the generator in debug mode, it will wait for a Java debugger to be attached |
3233

3334
## Generate
3435

@@ -50,6 +51,32 @@ apic cts generate java search
5051
apic cts generate php insights recommend search
5152
```
5253

54+
### Attach a debugger to the generator
55+
56+
Using VS code extension [Debugger For Java](https://code.visualstudio.com/docs/java/java-debugging), you can attach breakpoint to the generator.
57+
Example config for VS Code in `.vscode/launch.json`:
58+
59+
```json
60+
{
61+
"version": "0.2.0",
62+
"configurations": [
63+
{
64+
"type": "java",
65+
"name": "APIC Generator",
66+
"request": "attach",
67+
"hostName": "localhost",
68+
"port": "5009"
69+
}
70+
]
71+
}
72+
```
73+
74+
```bash
75+
apic cts generate java search -d
76+
```
77+
78+
Then you can connect you favorite Java debugger, either IntelliJ, VS Code, or jdb.
79+
5380
## Run
5481

5582
### Run CTS for all supported languages

website/docs/CLI/generate-commands.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ apic generate <language | all> <client... | all>
2424

2525
### Available options
2626

27-
| Option | Command | Description |
28-
| ------- | :------------ | :------------------------------------------------------------ |
29-
| verbose | -v, --verbose | Make the process verbose, display logs from third party tools |
27+
| Option | Command | Description |
28+
|----------|:---------------|:----------------------------------------------------------------------------------|
29+
| verbose | -v, --verbose | Make the process verbose, display logs from third party tools |
30+
| debugger | -d, --debugger | runs the generator in debug mode, it will wait for a Java debugger to be attached |
3031

3132
## Generate
3233

0 commit comments

Comments
 (0)