Skip to content

Commit ee310c1

Browse files
authored
chore: add parameter to gradle task and update code-gen script (#976)
* chore: smithy gradle can generated from designated folder * chore: generate-clients scripts supports globs
1 parent 09a642a commit ee310c1

File tree

8 files changed

+884
-844
lines changed

8 files changed

+884
-844
lines changed

codegen/sdk-codegen/build.gradle.kts

+4-2
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,17 @@ tasks.create<SmithyBuild>("buildSdk") {
4141
tasks.register("generate-smithy-build") {
4242
doLast {
4343
val projectionsBuilder = Node.objectNodeBuilder()
44+
val modelsDirProp: String by project
45+
val models = File(modelsDirProp)
4446

45-
fileTree("aws-models").filter { it.isFile }.files.forEach { file ->
47+
fileTree(models).filter { it.isFile }.files.forEach { file ->
4648
val (sdkId, version, remaining) = file.name.split(".")
4749
var manifestOverwrites = Node.parse(
4850
File("smithy-aws-typescript-codegen/src/main/resources/software/amazon/smithy/aws/typescript/codegen/package.json.template")
4951
.readText()
5052
).expectObjectNode()
5153
val projectionContents = Node.objectNodeBuilder()
52-
.withMember("imports", Node.fromStrings("aws-models/" + file.name))
54+
.withMember("imports", Node.fromStrings("${models.getAbsolutePath()}${File.separator}${file.name}"))
5355
.withMember("plugins", Node.objectNode()
5456
.withMember("typescript-codegen", Node.objectNodeBuilder()
5557
.withMember("package", "@aws-sdk/client-" + sdkId.toLowerCase())

codegen/sdk-codegen/gradle.properties

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
modelsDirProp=aws-models

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
},
2929
"license": "UNLICENSED",
3030
"dependencies": {
31-
"glob": "^7.1.2",
31+
"glob": "^7.1.6",
3232
"rimraf": "^2.6.2",
3333
"yargs": "^15.1.0"
3434
},
@@ -69,4 +69,4 @@
6969
"lint-staged": {
7070
"**/*.{ts,js,md,json}": "prettier --write"
7171
}
72-
}
72+
}

scripts/generate-clients/README.md

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# How to generate clients from Smithy model
2+
3+
## Prerequisite
4+
5+
This script requires Node.js >= 12
6+
7+
## Options:
8+
9+
```
10+
-m, --models The directory of models. [string]
11+
-g, --globs A list of smithy model globs [array]
12+
-o, --output The output directory for built clients
13+
[string] [default: "../../clients"]
14+
--help Show help [boolean]
15+
```
16+
17+
## Examples:
18+
19+
- Generate clients from folder with models:
20+
21+
`yarn generate-clients -m path/to/model`
22+
23+
- Generate clients from a glob (e.g. generating S3, S3Control and DynamoDB clients):
24+
25+
`yarn generate-clients -g path/to/models/s3*.json path/to/another/dynamodb*.json`
26+
27+
- Generate all known AWS clients:
28+
29+
`yarn generate-clients`

scripts/generate-clients/code-gen-dir.js

+3-5
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ const { join, normalize } = require("path");
22

33
const CODE_GEN_ROOT = normalize(join(__dirname, "..", "..", "codegen"));
44

5-
const CODE_GEN_INPUT_DIR = normalize(
6-
join(__dirname, "..", "..", "codegen", "sdk-codegen", "aws-models")
7-
);
5+
const TEMP_CODE_GEN_INPUT_DIR = normalize(join(__dirname, ".aws-models"));
86

97
const CODE_GEN_OUTPUT_DIR = normalize(
108
join(
@@ -21,6 +19,6 @@ const CODE_GEN_OUTPUT_DIR = normalize(
2119

2220
module.exports = {
2321
CODE_GEN_ROOT,
24-
CODE_GEN_INPUT_DIR,
25-
CODE_GEN_OUTPUT_DIR
22+
CODE_GEN_OUTPUT_DIR,
23+
TEMP_CODE_GEN_INPUT_DIR
2624
};

scripts/generate-clients/code-gen.js

+42-22
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,56 @@ const path = require("path");
22
const { copyFileSync, emptyDirSync } = require("fs-extra");
33
const { readdirSync, lstatSync } = require("fs");
44
const { spawnProcess } = require("./spawn-process");
5-
const { CODE_GEN_ROOT, CODE_GEN_INPUT_DIR } = require("./code-gen-dir");
5+
const { CODE_GEN_ROOT, TEMP_CODE_GEN_INPUT_DIR } = require("./code-gen-dir");
6+
const Glob = require("glob");
67

78
async function generateClients(models) {
8-
console.info("models directory: ", models);
9-
if (models === CODE_GEN_INPUT_DIR) {
10-
// This script will clean the CODE_GEN_INPUT_DIR in execution.
11-
// throw to avoid input model being removed
12-
throw new Error(
13-
`models directory cannot be the same as ${CODE_GEN_INPUT_DIR}`
14-
);
15-
} else {
16-
console.log(`clearing code gen input folder...`);
17-
emptyDirSync(CODE_GEN_INPUT_DIR);
18-
console.log(`copying models from ${models} to ${CODE_GEN_INPUT_DIR}...`);
9+
let designatedModels = false;
10+
if (typeof models === "string") {
11+
//`models` is a folder path
12+
designatedModels = true;
13+
emptyDirSync(TEMP_CODE_GEN_INPUT_DIR);
14+
console.log(`preparing models from ${models}...`);
1915
for (const modelFileName of readdirSync(models)) {
2016
const modelPath = path.join(models, modelFileName);
2117
if (!lstatSync(modelPath).isFile()) continue;
2218
console.log(`copying model ${modelFileName}...`);
23-
copyFileSync(modelPath, path.join(CODE_GEN_INPUT_DIR, modelFileName), {
24-
overwrite: true
25-
});
19+
copyFileSync(
20+
modelPath,
21+
path.join(TEMP_CODE_GEN_INPUT_DIR, modelFileName),
22+
{
23+
overwrite: true
24+
}
25+
);
2626
}
27+
} else if (Array.isArray(models)) {
28+
//`models` is a list of globs
29+
designatedModels = true;
30+
emptyDirSync(TEMP_CODE_GEN_INPUT_DIR);
31+
models.forEach(pattern => {
32+
const files = Glob.sync(pattern, {
33+
realpath: true,
34+
absolute: true
35+
});
36+
files.forEach(file => {
37+
if (!lstatSync(file).isFile()) return;
38+
const name = path.basename(file);
39+
console.log(`copying model ${name}...`);
40+
copyFileSync(file, path.join(TEMP_CODE_GEN_INPUT_DIR, name), {
41+
overwrite: true
42+
});
43+
});
44+
});
45+
} else {
46+
console.log("no model supplied, generating all AWS clients");
2747
}
28-
await spawnProcess(
29-
"./gradlew",
30-
[":sdk-codegen:clean", ":sdk-codegen:build"],
31-
{
32-
cwd: CODE_GEN_ROOT
33-
}
34-
);
48+
const options = [":sdk-codegen:clean", ":sdk-codegen:build"];
49+
if (designatedModels) {
50+
options.push(`-PmodelsDirProp=${TEMP_CODE_GEN_INPUT_DIR}`);
51+
}
52+
await spawnProcess("./gradlew", options, {
53+
cwd: CODE_GEN_ROOT
54+
});
3555
}
3656

3757
module.exports = {

scripts/generate-clients/index.js

+15-8
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,38 @@
11
const yargs = require("yargs");
22
const path = require("path");
3-
const { emptyDirSync } = require("fs-extra");
3+
const { emptyDirSync, rmdirSync } = require("fs-extra");
44
const { generateClients } = require("./code-gen");
55
const { copyToClients } = require("./copy-to-clients");
6-
const { CODE_GEN_INPUT_DIR, CODE_GEN_OUTPUT_DIR } = require("./code-gen-dir");
6+
const {
7+
CODE_GEN_OUTPUT_DIR,
8+
TEMP_CODE_GEN_INPUT_DIR
9+
} = require("./code-gen-dir");
710
const { prettifyCode } = require("./code-prettify");
811

912
const CLIENTS_DIR = path.normalize(path.join(__dirname, "..", "..", "clients"));
1013

11-
const { models, output: clientsDir } = yargs
14+
const { models, globs, output: clientsDir } = yargs
1215
.alias("m", "models")
1316
.string("m")
14-
.describe("m", "the directory of models")
15-
.required("m")
17+
.describe("m", "The directory of models.")
18+
.alias("g", "globs")
19+
.array("g")
20+
.describe("g", "A list of smithy model globs")
21+
.conflicts("models", "globs") //either models(path) or globs is accepted
1622
.alias("o", "output")
1723
.string("o")
18-
.describe("o", "the output directory for built clients")
24+
.describe("o", "The output directory for built clients")
1925
.default("o", CLIENTS_DIR)
2026
.help().argv;
2127

2228
(async () => {
2329
try {
24-
await generateClients(models);
30+
await generateClients(models || globs);
2531
await prettifyCode();
2632
await copyToClients(clientsDir);
27-
emptyDirSync(CODE_GEN_INPUT_DIR);
2833
emptyDirSync(CODE_GEN_OUTPUT_DIR);
34+
emptyDirSync(TEMP_CODE_GEN_INPUT_DIR);
35+
rmdirSync(TEMP_CODE_GEN_INPUT_DIR);
2936
} catch (e) {
3037
console.log(e);
3138
process.exit(1);

0 commit comments

Comments
 (0)