Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support new added @flattenProperty decorator in autorest emitter #277

Merged
merged 9 commits into from
Feb 29, 2024
7 changes: 7 additions & 0 deletions .chronus/changes/flatten-2024-1-20-11-30-53.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
changeKind: feature
packages:
- "@azure-tools/typespec-autorest"
---

Support new added @flattenProperty decorator.
tadelesh marked this conversation as resolved.
Show resolved Hide resolved
8 changes: 8 additions & 0 deletions packages/typespec-autorest/src/openapi.ts
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we expect this decorator to be added in the main files or client.tsp? As if it is in the client.tsp it won't get picked up by autorest today.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It should be in client.tsp. Is there any blocking that we could not change autorest emitter's compile enter point to client.tsp?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that defeats the point of the separate client.tsp. However i have always been of the opinion that client.tsp should be imported from main

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since swagger contains not only the API definition but also some client related information, I think autorest emitter compile from client.tsp is reasonable.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is but then why do we have a different entry point, this separation is just for the spec repo, we should just import client.tsp from main.

Copy link
Member Author

@tadelesh tadelesh Feb 23, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, if that is the only reason for import main from client, then it is non-sense. I stand for import client from main which makes the entry point to be one.

Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {
SdkContext,
createSdkContext,
getClientNameOverride,
shouldFlattenProperty,
} from "@azure-tools/typespec-client-generator-core";
import {
ArrayModelType,
Expand Down Expand Up @@ -1945,6 +1946,13 @@ function createOAPIEmitter(
}
}

if (
typespecType.kind === "ModelProperty" &&
shouldFlattenProperty(tcgcSdkContext, typespecType)
) {
newTarget["x-ms-client-flatten"] = true;
}

attachExtensions(typespecType, newTarget);

return typespecType.kind === "Scalar" || typespecType.kind === "ModelProperty"
Expand Down
66 changes: 66 additions & 0 deletions packages/typespec-autorest/test/flatten.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import { deepStrictEqual } from "assert";
import { describe, it } from "vitest";
import { openApiFor } from "./test-host.js";

describe("typespec-autorest: flatten", () => {
tadelesh marked this conversation as resolved.
Show resolved Hide resolved
it("tcgc flatten decorator", async () => {
tadelesh marked this conversation as resolved.
Show resolved Hide resolved
const res = await openApiFor(
`
@service
namespace Test;

tadelesh marked this conversation as resolved.
Show resolved Hide resolved
model Widget {
#suppress "deprecated" "@flattenProperty decorator is not recommended to use."
@flattenProperty
properties?: WidgetProperties;
}

model WidgetProperties {
prop: string;
}

op get(): void;
tadelesh marked this conversation as resolved.
Show resolved Hide resolved
`
);
const model = res.definitions["Widget"]!;
deepStrictEqual(model, {
properties: {
properties: {
$ref: "#/definitions/WidgetProperties",
"x-ms-client-flatten": true,
},
},
type: "object",
});
});

it("openapi extension decorator", async () => {
tadelesh marked this conversation as resolved.
Show resolved Hide resolved
const res = await openApiFor(
`
@service
namespace Test;
tadelesh marked this conversation as resolved.
Show resolved Hide resolved

model Widget {
@extension("x-ms-client-flatten", true)
properties?: WidgetProperties;
}

model WidgetProperties {
prop: string;
}

op get(): void;
tadelesh marked this conversation as resolved.
Show resolved Hide resolved
`
);
const model = res.definitions["Widget"]!;
deepStrictEqual(model, {
properties: {
properties: {
$ref: "#/definitions/WidgetProperties",
"x-ms-client-flatten": true,
},
},
type: "object",
});
});
});
Loading