From 24e312ec4f1df67f1b9304a7287705d9a3ddbeb0 Mon Sep 17 00:00:00 2001 From: Pierre Millot Date: Wed, 8 Dec 2021 18:13:38 +0100 Subject: [PATCH 1/6] chore(tooling): generation script for all language and clients --- .github/workflows/check.yml | 6 ++-- README.md | 9 ++++-- package.json | 10 ++----- scripts/generate.sh | 51 ++++++++++++++++++++++++++++++++++ scripts/post-gen/javascript.sh | 7 +++++ yarn.lock | 10 +++++++ 6 files changed, 80 insertions(+), 13 deletions(-) create mode 100755 scripts/generate.sh create mode 100755 scripts/post-gen/javascript.sh diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index da5f08bb0b..b7958b2732 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -39,19 +39,19 @@ jobs: uses: ./.github/actions/cache - name: Generate search client - run: yarn generate:js:search + run: yarn generate javascript search - name: Build search client run: yarn client:build-js:search - name: Generate recommend client - run: yarn generate:js:recommend + run: yarn generate javascript recommend - name: Build recommend client run: yarn client:build-js:recommend - name: Generate personalization client - run: yarn generate:js:personalization + run: yarn generate javascript personalization - name: Build personalization client run: yarn client:build-js:personalization diff --git a/README.md b/README.md index 8007e509d9..5a8c08c678 100644 --- a/README.md +++ b/README.md @@ -14,16 +14,21 @@ nvm use && yarn yarn generate ``` +Generic command: +```bash +yarn generate +``` + ### Search client ```bash -yarn generate:search +yarn generate all search ``` ### Recommend client ```bash -yarn generate:recommend +yarn generate all recommend ``` ## Build generated clients diff --git a/package.json b/package.json index 31b4f5a3c0..d6effc0601 100644 --- a/package.json +++ b/package.json @@ -26,14 +26,7 @@ "lint:client:fix": "eslint --ext=ts ${CLIENT} --fix", "lint": "eslint --ext=ts .", "format:specs": "yarn prettier --write specs", - "generate:js:personalization": "yarn openapi-generator-cli generate --generator-key javascript-personalization && CLIENT=client-personalization yarn utils:import-js && CLIENT=clients/algoliasearch-client-javascript/client-personalization/ yarn lint:client:fix", - "generate:js:recommend": "yarn openapi-generator-cli generate --generator-key javascript-recommend && CLIENT=recommend yarn utils:import-js && CLIENT=clients/algoliasearch-client-javascript/recommend/ yarn lint:client:fix", - "generate:js:search": "yarn openapi-generator-cli generate --generator-key javascript-search && CLIENT=client-search yarn utils:import-js && CLIENT=clients/algoliasearch-client-javascript/client-search/ yarn lint:client:fix", - "generate:js": "yarn generate:js:search && yarn generate:js:recommend && yarn generate:js:personalization", - "generate:personalization": "yarn generate:js:personalization", - "generate:recommend": "yarn generate:js:recommend", - "generate:search": "yarn generate:js:search", - "generate": "yarn generate:js && yarn format:specs", + "generate": "./scripts/generate.sh ${1:-all} ${2:-all} && yarn format:specs", "playground:js:personalization": "yarn workspace javascript-playground start:personalization", "playground:js:recommend": "yarn workspace javascript-playground start:recommend", "playground:js:search": "yarn workspace javascript-playground start:search", @@ -54,6 +47,7 @@ "eslint-plugin-jsdoc": "37.1.0", "eslint-plugin-prettier": "4.0.0", "eslint-plugin-unused-imports": "2.0.0", + "json": "11.0.0", "prettier": "2.5.0", "swagger-cli": "4.0.4", "typescript": "4.5.2" diff --git a/scripts/generate.sh b/scripts/generate.sh new file mode 100755 index 0000000000..705cd23d65 --- /dev/null +++ b/scripts/generate.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +# Break on non-zero code +set -e + +LANGUAGE=$1 +CLIENT=$2 + +LANGUAGES=(javascript) +CLIENTS=(search recommend personalization) + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" +# Move to the root (easier to locate other scripts) +cd ${DIR}/.. + +generate_client() { + local lang=$1 + local client=$2 + echo "Generating code for ${lang}-${client}" + yarn openapi-generator-cli generate --generator-key "${lang}-${client}" + + # run the post generation script if it exists (linting and additional files) + local postgen="./scripts/post-gen/${lang}.sh" + if [[ -f "$postgen" ]]; then + $postgen $client + fi +} + +if [[ $LANGUAGE == "all" ]]; then + LANGUAGE=("${LANGUAGES[@]}") +elif [[ " ${LANGUAGES[*]} " =~ " ${LANGUAGE} " ]]; then + LANGUAGE=($LANGUAGE) +else + echo "Unknown language ${LANGUAGE}" + exit 1 +fi + +if [[ $CLIENT == "all" ]]; then + CLIENT=("${CLIENTS[@]}") +elif [[ " ${CLIENTS[*]} " =~ " ${CLIENT} " ]]; then + CLIENT=($CLIENT) +else + echo "Unknown client ${CLIENT}" + exit 1 +fi + +for lang in "${LANGUAGE[@]}"; do + for client in "${CLIENT[@]}"; do + generate_client $lang $client + done +done diff --git a/scripts/post-gen/javascript.sh b/scripts/post-gen/javascript.sh new file mode 100755 index 0000000000..f0924ba7e7 --- /dev/null +++ b/scripts/post-gen/javascript.sh @@ -0,0 +1,7 @@ +client=$1 + +export CLIENT=$(cat openapitools.json | yarn json "generator-cli.generators.javascript-${client}.output" | sed 's/#{cwd}\///g') +mkdir -p $CLIENT/utils +cp -R clients/algoliasearch-client-javascript/utils/ $CLIENT/utils + +yarn lint:client:fix diff --git a/yarn.lock b/yarn.lock index 218431d335..e14bbac32d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,6 +22,7 @@ __metadata: eslint-plugin-jsdoc: 37.1.0 eslint-plugin-prettier: 4.0.0 eslint-plugin-unused-imports: 2.0.0 + json: 11.0.0 prettier: 2.5.0 swagger-cli: 4.0.4 typescript: 4.5.2 @@ -4264,6 +4265,15 @@ fsevents@^2.3.2: languageName: node linkType: hard +"json@npm:11.0.0": + version: 11.0.0 + resolution: "json@npm:11.0.0" + bin: + json: lib/json.js + checksum: 0beb8689722fc30251638543caf791bedc1a25199c18eb0281de115a0dadb00a07d4d36cbd7ff7680e04157fcb2bba76f29ed940b1e4e92f60c6fbaa74523fce + languageName: node + linkType: hard + "jsonfile@npm:^6.0.1": version: 6.1.0 resolution: "jsonfile@npm:6.1.0" From ba357601b95f3d9a50c398a8b0ad8457bca61305 Mon Sep 17 00:00:00 2001 From: Pierre Millot Date: Wed, 8 Dec 2021 18:17:28 +0100 Subject: [PATCH 2/6] remove utils --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index d6effc0601..7a4113bf75 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,6 @@ "playground:js:personalization": "yarn workspace javascript-playground start:personalization", "playground:js:recommend": "yarn workspace javascript-playground start:recommend", "playground:js:search": "yarn workspace javascript-playground start:search", - "utils:import-js": "mkdir -p -- clients/algoliasearch-client-javascript/${CLIENT}/utils && cp -R clients/algoliasearch-client-javascript/utils/ clients/algoliasearch-client-javascript/${CLIENT}/utils", "validate": "yarn swagger-cli validate specs/dist/search.yml && yarn swagger-cli validate specs/dist/recommend.yml && yarn swagger-cli validate specs/dist/personalization.yml" }, "devDependencies": { From 959ac8bc2fdb542331d3cc2ee85c13e3506e9d98 Mon Sep 17 00:00:00 2001 From: Pierre Millot Date: Wed, 8 Dec 2021 18:25:15 +0100 Subject: [PATCH 3/6] move arguments --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 7a4113bf75..31edf3cebc 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,8 @@ "cts:test": "yarn workspace tests test", "lint:client:fix": "eslint --ext=ts ${CLIENT} --fix", "lint": "eslint --ext=ts .", - "format:specs": "yarn prettier --write specs", - "generate": "./scripts/generate.sh ${1:-all} ${2:-all} && yarn format:specs", + "lint:specs:fix": "yarn prettier --write specs", + "generate": "./scripts/generate.sh ${0:-all} ${1:-all}", "playground:js:personalization": "yarn workspace javascript-playground start:personalization", "playground:js:recommend": "yarn workspace javascript-playground start:recommend", "playground:js:search": "yarn workspace javascript-playground start:search", From a8066d5b7c5c19f3e9fe71ac1a84f206fa677917 Mon Sep 17 00:00:00 2001 From: Pierre Millot Date: Thu, 9 Dec 2021 13:33:40 +0100 Subject: [PATCH 4/6] adopt more flexible structure --- package.json | 5 ++-- scripts/generate.sh | 53 ++++++++++------------------------ scripts/multiplexer.sh | 41 ++++++++++++++++++++++++++ scripts/post-gen/global.sh | 1 + scripts/post-gen/javascript.sh | 2 +- 5 files changed, 61 insertions(+), 41 deletions(-) create mode 100755 scripts/multiplexer.sh create mode 100644 scripts/post-gen/global.sh diff --git a/package.json b/package.json index 31edf3cebc..a8d3be553a 100644 --- a/package.json +++ b/package.json @@ -23,10 +23,9 @@ "client:build": "yarn client:build-js", "cts:generate": "yarn workspace tests cts:generate", "cts:test": "yarn workspace tests test", - "lint:client:fix": "eslint --ext=ts ${CLIENT} --fix", "lint": "eslint --ext=ts .", - "lint:specs:fix": "yarn prettier --write specs", - "generate": "./scripts/generate.sh ${0:-all} ${1:-all}", + "format:specs": "yarn prettier --write specs", + "generate": "./scripts/multiplexer.sh ./scripts/generate.sh ${0:-all} ${1:-all}", "playground:js:personalization": "yarn workspace javascript-playground start:personalization", "playground:js:recommend": "yarn workspace javascript-playground start:recommend", "playground:js:search": "yarn workspace javascript-playground start:search", diff --git a/scripts/generate.sh b/scripts/generate.sh index 705cd23d65..ee9938762b 100755 --- a/scripts/generate.sh +++ b/scripts/generate.sh @@ -3,49 +3,28 @@ # Break on non-zero code set -e -LANGUAGE=$1 -CLIENT=$2 - -LANGUAGES=(javascript) -CLIENTS=(search recommend personalization) - DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" # Move to the root (easier to locate other scripts) cd ${DIR}/.. -generate_client() { - local lang=$1 - local client=$2 - echo "Generating code for ${lang}-${client}" - yarn openapi-generator-cli generate --generator-key "${lang}-${client}" - - # run the post generation script if it exists (linting and additional files) - local postgen="./scripts/post-gen/${lang}.sh" - if [[ -f "$postgen" ]]; then - $postgen $client - fi -} +lang=$1 +client=$2 -if [[ $LANGUAGE == "all" ]]; then - LANGUAGE=("${LANGUAGES[@]}") -elif [[ " ${LANGUAGES[*]} " =~ " ${LANGUAGE} " ]]; then - LANGUAGE=($LANGUAGE) -else - echo "Unknown language ${LANGUAGE}" - exit 1 +# run the pre generation script if it exists (spec v) +pregen="./scripts/pre-gen/${lang}.sh" +if [[ -f "$pregen" ]]; then + echo "Pre-gen for ${lang}-${client}" + $pregen $client fi -if [[ $CLIENT == "all" ]]; then - CLIENT=("${CLIENTS[@]}") -elif [[ " ${CLIENTS[*]} " =~ " ${CLIENT} " ]]; then - CLIENT=($CLIENT) -else - echo "Unknown client ${CLIENT}" - exit 1 +echo "Generating code for ${lang}-${client}" +yarn openapi-generator-cli generate --generator-key "${lang}-${client}" + +# run the post generation script if it exists (linting and additional files) +postgen="./scripts/post-gen/${lang}.sh" +if [[ -f "$postgen" ]]; then + echo "Post-gen for ${lang}-${client}" + $postgen $client fi -for lang in "${LANGUAGE[@]}"; do - for client in "${CLIENT[@]}"; do - generate_client $lang $client - done -done +./scripts/post-gen/global.sh diff --git a/scripts/multiplexer.sh b/scripts/multiplexer.sh new file mode 100755 index 0000000000..96aa2ff7d8 --- /dev/null +++ b/scripts/multiplexer.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# Call this script with multiplexer.sh +# to run the cmd for all the required lang-client combination + +# Break on non-zero code +set -e + +DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" +# Move to the root (easier to locate other scripts) +cd ${DIR}/.. + +CMD=$1 +LANGUAGE=$2 +CLIENT=$3 + +LANGUAGES=(javascript java) +CLIENTS=(search recommend personalization) + +if [[ $LANGUAGE == "all" ]]; then + LANGUAGE=("${LANGUAGES[@]}") +elif [[ " ${LANGUAGES[*]} " =~ " ${LANGUAGE} " ]]; then + LANGUAGE=($LANGUAGE) +else + echo "Unknown language ${LANGUAGE}" + exit 1 +fi + +if [[ $CLIENT == "all" ]]; then + CLIENT=("${CLIENTS[@]}") +elif [[ " ${CLIENTS[*]} " =~ " ${CLIENT} " ]]; then + CLIENT=($CLIENT) +else + echo "Unknown client ${CLIENT}" + exit 1 +fi + +for lang in "${LANGUAGE[@]}"; do + for client in "${CLIENT[@]}"; do + $CMD $lang $client + done +done diff --git a/scripts/post-gen/global.sh b/scripts/post-gen/global.sh new file mode 100644 index 0000000000..2974b33651 --- /dev/null +++ b/scripts/post-gen/global.sh @@ -0,0 +1 @@ +yarn format:specs diff --git a/scripts/post-gen/javascript.sh b/scripts/post-gen/javascript.sh index f0924ba7e7..1e6e2bd53f 100755 --- a/scripts/post-gen/javascript.sh +++ b/scripts/post-gen/javascript.sh @@ -4,4 +4,4 @@ export CLIENT=$(cat openapitools.json | yarn json "generator-cli.generators.java mkdir -p $CLIENT/utils cp -R clients/algoliasearch-client-javascript/utils/ $CLIENT/utils -yarn lint:client:fix +eslint --ext=ts ${CLIENT} --fix From 493594abb77f29aac095026c1aef4aacd59af523 Mon Sep 17 00:00:00 2001 From: Pierre Millot Date: Thu, 9 Dec 2021 13:50:16 +0100 Subject: [PATCH 5/6] impossible to read openapitools.json for keys --- package.json | 2 +- scripts/generate.sh | 10 +++++++--- scripts/multiplexer.sh | 2 +- scripts/post-gen/global.sh | 0 4 files changed, 9 insertions(+), 5 deletions(-) mode change 100644 => 100755 scripts/post-gen/global.sh diff --git a/package.json b/package.json index a8d3be553a..e4244a71ea 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "cts:test": "yarn workspace tests test", "lint": "eslint --ext=ts .", "format:specs": "yarn prettier --write specs", - "generate": "./scripts/multiplexer.sh ./scripts/generate.sh ${0:-all} ${1:-all}", + "generate": "./scripts/multiplexer.sh ./scripts/generate.sh ${0:-all} ${1:-all} && ./scripts/post-gen/global.sh", "playground:js:personalization": "yarn workspace javascript-playground start:personalization", "playground:js:recommend": "yarn workspace javascript-playground start:recommend", "playground:js:search": "yarn workspace javascript-playground start:search", diff --git a/scripts/generate.sh b/scripts/generate.sh index ee9938762b..c88f0ccbb8 100755 --- a/scripts/generate.sh +++ b/scripts/generate.sh @@ -17,8 +17,14 @@ if [[ -f "$pregen" ]]; then $pregen $client fi +set +e echo "Generating code for ${lang}-${client}" -yarn openapi-generator-cli generate --generator-key "${lang}-${client}" +log=$(yarn openapi-generator-cli generate --generator-key "${lang}-${client}") +if [[ $? != 0 ]]; then + echo "$log" + exit 1 +fi +set -e # run the post generation script if it exists (linting and additional files) postgen="./scripts/post-gen/${lang}.sh" @@ -26,5 +32,3 @@ if [[ -f "$postgen" ]]; then echo "Post-gen for ${lang}-${client}" $postgen $client fi - -./scripts/post-gen/global.sh diff --git a/scripts/multiplexer.sh b/scripts/multiplexer.sh index 96aa2ff7d8..bf36ec37e2 100755 --- a/scripts/multiplexer.sh +++ b/scripts/multiplexer.sh @@ -13,7 +13,7 @@ CMD=$1 LANGUAGE=$2 CLIENT=$3 -LANGUAGES=(javascript java) +LANGUAGES=(javascript) CLIENTS=(search recommend personalization) if [[ $LANGUAGE == "all" ]]; then diff --git a/scripts/post-gen/global.sh b/scripts/post-gen/global.sh old mode 100644 new mode 100755 From 93b143467b47086b24a61f2a1a2f7c0f1ee6f3d6 Mon Sep 17 00:00:00 2001 From: Pierre Millot Date: Thu, 9 Dec 2021 14:35:05 +0100 Subject: [PATCH 6/6] doc --- doc/contribution_addNewClient.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/contribution_addNewClient.md b/doc/contribution_addNewClient.md index 75facebddd..5a72b51359 100644 --- a/doc/contribution_addNewClient.md +++ b/doc/contribution_addNewClient.md @@ -20,10 +20,18 @@ Example for the JavaScript client openapi-generator author template -g typescript-node -o templates/algoliasearch-client-javascript/ ``` +## Add the language/client to the tool chain + +Add each client in the file `openapitools.json`, following the others client structure. +Then add it to the `scripts/multiplexer.sh` file to register it for the other commands. + +Don't forget to write tests for it using the [CTS](./CTS.md) ## Customize the template API clients require a custom Algolia logic in order to seamlessly work with our engine. +The first thing to do is strip as much code as possible, because the generation include lots of useless feature. + You will need to implement: - An `init` method