Skip to content

Commit

Permalink
[tcgc] getDefaultApiVersion and service version enum hornor api ver…
Browse files Browse the repository at this point in the history
…sion config (#801)

resolve: #746

---------

Co-authored-by: iscai-msft <[email protected]>
Co-authored-by: iscai-msft <[email protected]>
  • Loading branch information
3 people committed May 10, 2024
1 parent 8a5b4ba commit 87e2e0c
Show file tree
Hide file tree
Showing 6 changed files with 195 additions and 3 deletions.
7 changes: 7 additions & 0 deletions .chronus/changes/tcgc_fix_api_version-2024-4-8-16-21-13.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
changeKind: fix
packages:
- "@azure-tools/typespec-client-generator-core"
---

`getDefaultApiVersion` and service version enum hornor api version config
13 changes: 12 additions & 1 deletion packages/typespec-client-generator-core/src/public-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,18 @@ export function getDefaultApiVersion(
serviceNamespace: Namespace
): Version | undefined {
try {
const versions = getVersions(context.program, serviceNamespace)[1]!.getVersions();
let versions = getVersions(context.program, serviceNamespace)[1]!.getVersions();
// filter with specific api version
if (
context.apiVersion !== undefined &&
context.apiVersion !== "latest" &&
context.apiVersion !== "all"
) {
const index = versions.findIndex((version) => version.value === context.apiVersion);
if (index >= 0) {
versions = versions.slice(0, index + 1);
}
}
// follow versioning principals of the versioning library and return last in list
return versions[versions.length - 1];
} catch (e) {
Expand Down
10 changes: 10 additions & 0 deletions packages/typespec-client-generator-core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1479,6 +1479,16 @@ export function getAllModelsWithDiagnostics(
if (versionMap && versionMap.getVersions()[0]) {
// create sdk enum for versions enum
const sdkVersionsEnum = getSdkEnum(context, versionMap.getVersions()[0].enumMember.enum);
if (
context.apiVersion !== undefined &&
context.apiVersion !== "latest" &&
context.apiVersion !== "all"
) {
const index = sdkVersionsEnum.values.findIndex((v) => v.value === context.apiVersion);
if (index >= 0) {
sdkVersionsEnum.values = sdkVersionsEnum.values.slice(0, index + 1);
}
}
updateUsageOfModel(context, UsageFlags.ApiVersionEnum, sdkVersionsEnum);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3010,7 +3010,7 @@ describe("typespec-client-generator-core: decorators", () => {
ok(versions);
deepStrictEqual(
versions.values.map((v) => v.value),
["v1", "v2", "v3"]
["v1", "v2"]
);
});

Expand Down Expand Up @@ -3099,7 +3099,7 @@ describe("typespec-client-generator-core: decorators", () => {
ok(versions);
deepStrictEqual(
versions.values.map((v) => v.value),
["v1", "v2", "v3"]
["v1"]
);
});

Expand Down
76 changes: 76 additions & 0 deletions packages/typespec-client-generator-core/test/public-utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { AzureCoreTestLibrary } from "@azure-tools/typespec-azure-core/testing";
import {
Model,
ModelProperty,
Namespace,
Operation,
ignoreDiagnostics,
listServices,
Expand Down Expand Up @@ -146,6 +147,81 @@ describe("typespec-client-generator-core: public-utils", () => {
const serviceNamespace = getServiceNamespace();
ok(!getDefaultApiVersion(runner.context, serviceNamespace));
});

it("get with all", async () => {
const runnerWithVersion = await createSdkTestRunner({
"api-version": "all",
emitterName: "@azure-tools/typespec-python",
});

const { MyService } = await runnerWithVersion.compile(`
enum Versions {
v1_0_0: "1.0",
v1_0_1: "1.0.1",
v1_1_0: "1.1.0",
}
@versioned(Versions)
@service({})
@test namespace MyService {};
`);
const defaultApiVersion = getDefaultApiVersion(
runnerWithVersion.context,
MyService as Namespace
);
ok(defaultApiVersion);
strictEqual(defaultApiVersion.value, "1.1.0");
});

it("get with latest", async () => {
const runnerWithVersion = await createSdkTestRunner({
"api-version": "latest",
emitterName: "@azure-tools/typespec-python",
});

const { MyService } = await runnerWithVersion.compile(`
enum Versions {
v1_0_0: "1.0",
v1_0_1: "1.0.1",
v1_1_0: "1.1.0",
}
@versioned(Versions)
@service({})
@test namespace MyService {};
`);
const defaultApiVersion = getDefaultApiVersion(
runnerWithVersion.context,
MyService as Namespace
);
ok(defaultApiVersion);
strictEqual(defaultApiVersion.value, "1.1.0");
});

it("get with specific version", async () => {
const runnerWithVersion = await createSdkTestRunner({
"api-version": "1.0.1",
emitterName: "@azure-tools/typespec-python",
});

const { MyService } = await runnerWithVersion.compile(`
enum Versions {
v1_0_0: "1.0",
v1_0_1: "1.0.1",
v1_1_0: "1.1.0",
}
@versioned(Versions)
@service({})
@test namespace MyService {};
`);
const defaultApiVersion = getDefaultApiVersion(
runnerWithVersion.context,
MyService as Namespace
);
ok(defaultApiVersion);
strictEqual(defaultApiVersion.value, "1.0.1");
});
});
describe("isApiVersion", () => {
it("is api version query", async () => {
Expand Down
88 changes: 88 additions & 0 deletions packages/typespec-client-generator-core/test/types.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1710,6 +1710,94 @@ describe("typespec-client-generator-core: types", () => {
strictEqual(enums.length, 1);
strictEqual(enums[0].name, "Versions");
strictEqual(enums[0].usage, UsageFlags.ApiVersionEnum);
deepStrictEqual(
enums[0].values.map((x) => x.value),
["v1", "v2"]
);
});

it("versioned enums with all", async () => {
const runnerWithVersion = await createSdkTestRunner({
"api-version": "all",
emitterName: "@azure-tools/typespec-python",
});

await runnerWithVersion.compile(
`
@versioned(Versions)
@service()
namespace DemoService;
enum Versions {
v1,
v2,
}
`
);
const enums = runnerWithVersion.context.experimental_sdkPackage.enums;
strictEqual(enums.length, 1);
strictEqual(enums[0].name, "Versions");
strictEqual(enums[0].usage, UsageFlags.ApiVersionEnum);
deepStrictEqual(
enums[0].values.map((x) => x.value),
["v1", "v2"]
);
});

it("versioned enums with latest", async () => {
const runnerWithVersion = await createSdkTestRunner({
"api-version": "latest",
emitterName: "@azure-tools/typespec-python",
});

await runnerWithVersion.compile(
`
@versioned(Versions)
@service()
namespace DemoService;
enum Versions {
v1,
v2,
}
`
);
const enums = runnerWithVersion.context.experimental_sdkPackage.enums;
strictEqual(enums.length, 1);
strictEqual(enums[0].name, "Versions");
strictEqual(enums[0].usage, UsageFlags.ApiVersionEnum);
deepStrictEqual(
enums[0].values.map((x) => x.value),
["v1", "v2"]
);
});

it("versioned enums with specific version", async () => {
const runnerWithVersion = await createSdkTestRunner({
"api-version": "v1",
emitterName: "@azure-tools/typespec-python",
});

await runnerWithVersion.compile(
`
@versioned(Versions)
@service()
namespace DemoService;
enum Versions {
v1,
v2,
}
`
);
const enums = runnerWithVersion.context.experimental_sdkPackage.enums;
strictEqual(enums.length, 1);
strictEqual(enums[0].name, "Versions");
strictEqual(enums[0].usage, UsageFlags.ApiVersionEnum);
deepStrictEqual(
enums[0].values.map((x) => x.value),
["v1"]
);
});

it("usage propagation for enum value", async () => {
Expand Down

0 comments on commit 87e2e0c

Please sign in to comment.