Skip to content

Commit f5f6baa

Browse files
[tsp-client] Prefer emitter specific service-dir if specified (#8492)
* prefer emitter specific service-dir * update package version and changelog * update code * add tests --------- Co-authored-by: Catalina Peralta <caperal@microsoft.com>
1 parent c49db89 commit f5f6baa

7 files changed

Lines changed: 103 additions & 21 deletions

File tree

tools/tsp-client/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Release
22

3+
## 2024-06-21 - 0.9.0
4+
5+
- Prefer the `service-dir` parameter in the emitter configurations in tspconfig.yaml if specified.
6+
37
## 2024-06-07 - 0.8.1
48

59
- Normalize and clean up the directory property in tsp-location.yaml.

tools/tsp-client/package-lock.json

Lines changed: 23 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tools/tsp-client/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@azure-tools/typespec-client-generator-cli",
3-
"version": "0.8.1",
3+
"version": "0.9.0",
44
"description": "A tool to generate Azure SDKs from TypeSpec",
55
"main": "dist/index.js",
66
"homepage": "https://github.com/Azure/azure-sdk-tools/tree/main/tools/tsp-client#readme",

tools/tsp-client/src/index.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { addSpecFiles, checkoutCommit, cloneRepo, getRepoRoot, sparseCheckout }
88
import { doesFileExist } from "./network.js";
99
import { parse as parseYaml } from "yaml";
1010
import { joinPaths, normalizePath, resolvePath } from "@typespec/compiler";
11-
import { formatAdditionalDirectories, getAdditionalDirectoryName, makeSparseSpecDir } from "./utils.js";
11+
import { formatAdditionalDirectories, getAdditionalDirectoryName, getServiceDir, makeSparseSpecDir } from "./utils.js";
1212
import { resolve } from "node:path";
1313
import { config as dotenvConfig } from "dotenv";
1414

@@ -51,11 +51,7 @@ async function sdkInit(
5151
throw new Error(`tspconfig.yaml is empty at ${tspConfigPath}`);
5252
}
5353
const configYaml = parseYaml(data);
54-
const serviceDir = configYaml?.parameters?.["service-dir"]?.default;
55-
if (!serviceDir) {
56-
throw new Error(`Parameter service-dir is not defined correctly in tspconfig.yaml. Please refer to https://github.com/Azure/azure-rest-api-specs/blob/main/specification/contosowidgetmanager/Contoso.WidgetManager/tspconfig.yaml for the right schema.`)
57-
}
58-
Logger.debug(`Service directory: ${serviceDir}`)
54+
const serviceDir = getServiceDir(configYaml, emitter);
5955
const packageDir: string | undefined = configYaml?.options?.[emitter]?.["package-dir"];
6056
if (!packageDir) {
6157
throw new Error(`Missing package-dir in ${emitter} options of tspconfig.yaml. Please refer to https://github.com/Azure/azure-rest-api-specs/blob/main/specification/contosowidgetmanager/Contoso.WidgetManager/tspconfig.yaml for the right schema.`);
@@ -84,11 +80,7 @@ async function sdkInit(
8480
throw new Error(`tspconfig.yaml is empty at ${config}`);
8581
}
8682
const configYaml = parseYaml(data);
87-
const serviceDir = configYaml?.parameters?.["service-dir"]?.default;
88-
if (!serviceDir) {
89-
throw new Error(`Parameter service-dir is not defined correctly in tspconfig.yaml. Please refer to https://github.com/Azure/azure-rest-api-specs/blob/main/specification/contosowidgetmanager/Contoso.WidgetManager/tspconfig.yaml for the right schema.`)
90-
}
91-
Logger.debug(`Service directory: ${serviceDir}`)
83+
const serviceDir = getServiceDir(configYaml, emitter);
9284
const additionalDirOutput = formatAdditionalDirectories(configYaml?.parameters?.dependencies?.additionalDirectories);
9385
const packageDir = configYaml?.options?.[emitter]?.["package-dir"];
9486
if (!packageDir) {

tools/tsp-client/src/utils.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { joinPaths, normalizeSlashes } from "@typespec/compiler";
22
import { randomUUID } from "node:crypto";
33
import { mkdir } from "node:fs/promises";
4+
import { Logger } from "./log.js";
45

56
export function formatAdditionalDirectories(additionalDirectories?: string[]): string {
67
let additionalDirOutput = "";
@@ -27,3 +28,14 @@ export async function makeSparseSpecDir(repoRoot: string): Promise<string> {
2728
await mkdir(spareSpecPath, { recursive: true });
2829
return spareSpecPath;
2930
}
31+
32+
export function getServiceDir(configYaml: any, emitter: string): string {
33+
// Check if service-dir is defined in the emitter specific configurations in tspconfig.yaml.
34+
// Default to the top level service-dir parameter in tspconfig.yaml.
35+
const serviceDir = configYaml?.options?.[emitter]?.["service-dir"] ?? configYaml?.parameters?.["service-dir"]?.default;
36+
if (!serviceDir) {
37+
throw new Error(`Parameter service-dir is not defined correctly in tspconfig.yaml. Please refer to https://github.com/Azure/azure-rest-api-specs/blob/main/specification/contosowidgetmanager/Contoso.WidgetManager/tspconfig.yaml for the right schema.`)
38+
}
39+
Logger.debug(`Service directory: ${serviceDir}`)
40+
return serviceDir;
41+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
parameters:
2+
"service-dir":
3+
default: "sdk/contosowidgetmanager"
4+
"dependencies":
5+
"additionalDirectories":
6+
- "specification/contosowidgetmanager/Contoso.WidgetManager.Shared/"
7+
default: ""
8+
emit:
9+
- "@azure-tools/typespec-autorest"
10+
linter:
11+
extends:
12+
- "@azure-tools/typespec-azure-rulesets/data-plane"
13+
options:
14+
"@azure-tools/typespec-autorest":
15+
azure-resource-provider-folder: "data-plane"
16+
emit-lro-options: "none"
17+
emitter-output-dir: "{project-root}/.."
18+
examples-directory: "examples"
19+
output-file: "{azure-resource-provider-folder}/{service-name}/{version-status}/{version}/widgets.json"
20+
"@azure-tools/typespec-python":
21+
package-dir: "azure-contoso-widgetmanager"
22+
package-name: "{package-dir}"
23+
flavor: azure
24+
"@azure-tools/typespec-csharp":
25+
package-dir: "Azure.Template.Contoso"
26+
clear-output-folder: true
27+
model-namespace: false
28+
namespace: "{package-dir}"
29+
flavor: azure
30+
"@azure-tools/typespec-ts":
31+
service-dir: "sdk/contosowidgetmanager/widget"
32+
package-dir: "contosowidgetmanager-rest"
33+
packageDetails:
34+
name: "@azure-rest/contoso-widgetmanager-rest"
35+
flavor: azure
36+
"@azure-tools/typespec-java":
37+
package-dir: "azure-contoso-widgetmanager"
38+
namespace: com.azure.contoso.widgetmanager
39+
flavor: azure
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { describe, it } from "node:test";
2+
import { getServiceDir } from "../src/utils.js";
3+
import { parse as parseYaml } from "yaml";
4+
import { assert } from "chai";
5+
import { readFile } from "node:fs/promises";
6+
7+
describe("get the right service dir from tspconfig.yaml", function () {
8+
it("Get custom emitter service-dir", async function () {
9+
const data = await readFile("./test/examples/tspconfig-custom-service-dir.yaml", "utf8");
10+
const configYaml = parseYaml(data);
11+
const serviceDir = getServiceDir(configYaml, "@azure-tools/typespec-ts");
12+
assert.strictEqual(serviceDir, "sdk/contosowidgetmanager/widget");
13+
});
14+
15+
it("Get default service-dir", async function () {
16+
const data = await readFile("./test/examples/tspconfig-custom-service-dir.yaml", "utf8");
17+
const configYaml = parseYaml(data);
18+
const serviceDir = getServiceDir(configYaml, "@azure-tools/typespec-python");
19+
assert.strictEqual(serviceDir, "sdk/contosowidgetmanager");
20+
});
21+
});

0 commit comments

Comments
 (0)