Skip to content

Commit d624c96

Browse files
authored
feat: Model importer script (#118)
* Update package generator to be more explicit about importing (and to allow overwriting) * Regenerate SDK packages * Add command for importing multiple models by glob patterns * Add script to copy model artifacts into repository * Update ImportModels command description
1 parent f7e3b43 commit d624c96

39 files changed

+418
-209
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,5 @@ jspm_packages
2121

2222
lerna-debug.log
2323
package-lock.json
24+
25+
!serviceModels/logs

package.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
"scripts": {
88
"bootstrap": "lerna bootstrap",
99
"clean": "npm run clear-build-cache && lerna clean",
10-
"clear-build-cache": "lerna exec -- rm -rf ./build",
10+
"clear-build-cache": "rimraf ./packages/*/build/*",
11+
"copy-models": "node ./scripts/copyModels.js",
1112
"pretest": "lerna run pretest",
1213
"test": "jest --coverage"
1314
},
@@ -18,9 +19,12 @@
1819
"author": "[email protected]",
1920
"license": "UNLICENSED",
2021
"dependencies": {
22+
"glob": "^7.1.2",
2123
"jest": "^20.0.4",
2224
"lerna": "^2.0.0",
23-
"typescript": "^2.6"
25+
"rimraf": "^2.6.2",
26+
"typescript": "^2.6",
27+
"yargs": "^8.0.2"
2428
},
2529
"workspaces": [
2630
"packages/*"

packages/package-generator/package.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,17 @@
2727
"@aws/service-model": "^0.0.1",
2828
"@aws/service-types-generator": "^0.0.1",
2929
"@aws/types": "^0.0.1",
30+
"glob": "^7.1.2",
31+
"rimraf": "^2.6.2",
3032
"semver": "^5.4.1",
31-
"yargs": "^8.0.2",
32-
"tslib": "^1.8.0"
33+
"tslib": "^1.8.0",
34+
"yargs": "^8.0.2"
3335
},
3436
"devDependencies": {
37+
"@types/glob": "^5.0.35",
3538
"@types/jest": "^20.0.2",
3639
"@types/node": "^7.0.12",
40+
"@types/rimraf": "^2.0.2",
3741
"@types/semver": "^5.4.0",
3842
"@types/yargs": "^8.0",
3943
"jest": "^20.0.4",

packages/package-generator/src/ClientModuleGenerator.ts

Lines changed: 9 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { clientModuleIdentifier } from "./clientModuleIdentifier";
12
import { ModuleGenerator } from "./ModuleGenerator";
23
import {
34
ConfigurationDefinition,
@@ -21,6 +22,7 @@ export interface ClientModuleInit {
2122
customizations?: Array<CustomizationDefinition>;
2223
model: TreeModel;
2324
runtime: RuntimeTarget;
25+
prefix?: string;
2426
version?: string;
2527
}
2628

@@ -33,20 +35,12 @@ export class ClientModuleGenerator extends ModuleGenerator {
3335
constructor({
3436
customizations,
3537
model,
38+
prefix = "",
3639
runtime,
3740
version = "0.0.1"
3841
}: ClientModuleInit) {
39-
let name = `sdk-${getServiceId(model.metadata)}`;
40-
const modelVersion = determineServiceVersion(model.metadata);
41-
if (modelVersion > 1) {
42-
name += `-v${modelVersion}`;
43-
}
44-
if (runtime !== "universal") {
45-
name += `-${runtime}`;
46-
}
47-
4842
super({
49-
name,
43+
name: `${prefix}${clientModuleIdentifier(model.metadata, runtime)}`,
5044
description: `${runtime.substring(0, 1).toUpperCase()}${runtime.substring(
5145
1
5246
)} SDK for ${model.metadata.serviceFullName}`,
@@ -119,12 +113,15 @@ tsconfig.test.json
119113
}
120114

121115
protected tsconfig() {
122-
const { compilerOptions, ...rest } = super.tsconfig();
116+
let { compilerOptions, ...rest } = super.tsconfig();
123117
if (
124118
compilerOptions.lib &&
125119
(this.target === "browser" || this.target === "universal")
126120
) {
127-
compilerOptions.lib.push("dom");
121+
compilerOptions = {
122+
...compilerOptions,
123+
lib: [...compilerOptions.lib, "dom"]
124+
};
128125
}
129126

130127
return {
@@ -211,39 +208,3 @@ tsconfig.test.json
211208
}
212209

213210
type ObjStrMap = { [key: string]: string };
214-
215-
function getServiceId(metadata: ServiceMetadata): string {
216-
const { serviceAbbreviation, serviceFullName, serviceId } = metadata;
217-
218-
const className =
219-
serviceId ||
220-
(serviceAbbreviation || serviceFullName)
221-
.replace(/^(aws|amazon)/i, "")
222-
.trim();
223-
224-
return className.toLowerCase().replace(/\s/g, "-");
225-
}
226-
227-
// TODO use metadata.major_version when added to the model
228-
function determineServiceVersion(metadata: ServiceMetadata): number {
229-
const serviceId = getServiceId(metadata);
230-
if (
231-
serviceMajorVersions[serviceId] &&
232-
serviceMajorVersions[serviceId][metadata.apiVersion]
233-
) {
234-
return serviceMajorVersions[serviceId][metadata.apiVersion];
235-
}
236-
237-
return 1;
238-
}
239-
240-
interface MajorVersionMatcher {
241-
[serviceIdentifier: string]: {
242-
[apiVersion: string]: number;
243-
};
244-
}
245-
const serviceMajorVersions: MajorVersionMatcher = {
246-
dynamodb: {
247-
"2012-08-10": 2
248-
}
249-
};

packages/package-generator/src/ModuleGenerator.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ describe("ModuleGenerator", () => {
3131
});
3232

3333
describe("package.json", () => {
34-
it("should use the provided package name under the @aws scope", () => {
34+
it("should use the provided package name", () => {
3535
const name = "name";
3636
const generator = new ModuleGenerator({
3737
name,
@@ -43,7 +43,7 @@ describe("ModuleGenerator", () => {
4343
found = true;
4444
const packageJson = JSON.parse(contents);
4545
expect(typeof packageJson).toBe("object");
46-
expect(packageJson.name).toBe(`@aws/${name}`);
46+
expect(packageJson.name).toBe(name);
4747
}
4848
}
4949

packages/package-generator/src/ModuleGenerator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export class ModuleGenerator {
4444

4545
protected packageJson(): JsonDocument {
4646
return {
47-
name: `@aws/${this.name}`,
47+
name: this.name,
4848
description: this.description,
4949
version: this.version,
5050
scripts: {

packages/package-generator/src/cli.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import {
2-
CreateClientPackageCommand,
3-
CreateCustomPackageCommand
2+
CreateCustomPackageCommand,
3+
ImportClientPackageCommand,
4+
ImportModelsCommand
45
} from "./commands";
56

67
require("yargs")
78
.command(CreateCustomPackageCommand)
8-
.command(CreateClientPackageCommand)
9+
.command(ImportClientPackageCommand)
10+
.command(ImportModelsCommand)
911
.demandCommand()
1012
.help().argv;
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { clientModuleIdentifier } from "./clientModuleIdentifier";
2+
import { ServiceMetadata } from "@aws/types";
3+
4+
const minimalMetadata: ServiceMetadata = {
5+
apiVersion: "2018-02-06",
6+
endpointPrefix: "foo",
7+
protocol: "json",
8+
serviceFullName: "Amazon Simple Foo Service",
9+
signatureVersion: "none",
10+
uid: "foo-2018-02-06"
11+
};
12+
13+
describe("clientModuleIdentifier", () => {
14+
it("should use the service ID when available", () => {
15+
expect(
16+
clientModuleIdentifier({
17+
...minimalMetadata,
18+
serviceId: "Foo Control Plane"
19+
})
20+
).toBe("sdk-foo-control-plane");
21+
});
22+
23+
it("should use the service abbreviation in the absence of a service ID", () => {
24+
expect(
25+
clientModuleIdentifier({
26+
...minimalMetadata,
27+
serviceAbbreviation: "SFS"
28+
})
29+
).toBe("sdk-sfs");
30+
});
31+
32+
it("should fall back to the service full name", () => {
33+
expect(clientModuleIdentifier(minimalMetadata)).toBe(
34+
"sdk-simple-foo-service"
35+
);
36+
});
37+
38+
it("should apply known version identifiers", () => {
39+
expect(
40+
clientModuleIdentifier({
41+
...minimalMetadata,
42+
serviceId: "DynamoDB",
43+
apiVersion: "2012-08-10"
44+
})
45+
).toBe("sdk-dynamodb-v2");
46+
});
47+
48+
it("should append the runtime target", () => {
49+
expect(clientModuleIdentifier(minimalMetadata, "node")).toBe(
50+
"sdk-simple-foo-service-node"
51+
);
52+
});
53+
54+
it("should omit the runtime for universal packages", () => {
55+
expect(clientModuleIdentifier(minimalMetadata, "universal")).toBe(
56+
"sdk-simple-foo-service"
57+
);
58+
});
59+
});
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { RuntimeTarget } from "@aws/build-types";
2+
import { ServiceMetadata } from "@aws/types";
3+
4+
export function clientModuleIdentifier(
5+
metadata: ServiceMetadata,
6+
runtime: RuntimeTarget = "universal"
7+
): string {
8+
let name = `sdk-${getServiceId(metadata)}`;
9+
const modelVersion = determineServiceVersion(metadata);
10+
if (modelVersion > 1) {
11+
name += `-v${modelVersion}`;
12+
}
13+
if (runtime !== "universal") {
14+
name += `-${runtime}`;
15+
}
16+
17+
return name;
18+
}
19+
20+
function getServiceId(metadata: ServiceMetadata): string {
21+
const { serviceAbbreviation, serviceFullName, serviceId } = metadata;
22+
23+
const className =
24+
serviceId ||
25+
(serviceAbbreviation || serviceFullName)
26+
.replace(/^(aws|amazon)/i, "")
27+
.trim();
28+
29+
return className.toLowerCase().replace(/\s/g, "-");
30+
}
31+
32+
// TODO use metadata.major_version when added to the model
33+
function determineServiceVersion(metadata: ServiceMetadata): number {
34+
const serviceId = getServiceId(metadata);
35+
if (
36+
serviceMajorVersions[serviceId] &&
37+
serviceMajorVersions[serviceId][metadata.apiVersion]
38+
) {
39+
return serviceMajorVersions[serviceId][metadata.apiVersion];
40+
}
41+
42+
return 1;
43+
}
44+
45+
interface MajorVersionMatcher {
46+
[serviceIdentifier: string]: {
47+
[apiVersion: string]: number;
48+
};
49+
}
50+
51+
const serviceMajorVersions: MajorVersionMatcher = {
52+
dynamodb: {
53+
"2012-08-10": 2
54+
}
55+
};

packages/package-generator/src/commands/CreateClientPackageCommand.ts

Lines changed: 0 additions & 40 deletions
This file was deleted.

packages/package-generator/src/commands/CreateCustomPackageCommand.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ export const CreateCustomPackageCommand: yargs.CommandModule = {
1717
name: {
1818
alias: ["n"],
1919
type: "string",
20-
demandOption: true
20+
demandOption: true,
21+
coerce: name => `@aws/${name.replace(/^@aws\//, "")}`
2122
},
2223
description: {
2324
alias: ["d"],

0 commit comments

Comments
 (0)