From 9c8266bb00a81861c23dd83d6d35a6f4a5d52c4c Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Thu, 5 Jan 2023 15:33:58 -0800 Subject: [PATCH 1/2] tim clean up --- packages/autorest.python/index.js | 0 packages/autorest.python/package.json | 1 + packages/cadl-python/package.json | 8 +- packages/cadl-python/src/emitter.ts | 127 ++++++++----------- packages/cadl-python/src/external-process.ts | 80 ++++++++++++ packages/cadl-python/tsconfig.json | 4 +- pnpm-lock.yaml | 86 ++++++------- 7 files changed, 186 insertions(+), 120 deletions(-) create mode 100644 packages/autorest.python/index.js create mode 100644 packages/cadl-python/src/external-process.ts diff --git a/packages/autorest.python/index.js b/packages/autorest.python/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/autorest.python/package.json b/packages/autorest.python/package.json index 5d07bd88b62..e2e87ba4e29 100644 --- a/packages/autorest.python/package.json +++ b/packages/autorest.python/package.json @@ -8,6 +8,7 @@ "install": "node run-python3.js install.py", "debug": "node run-python3.js start.py --debug" }, + "main": "index.js", "repository": { "type": "git", "url": "https://github.com/Azure/autorest.python/tree/autorestv3" diff --git a/packages/cadl-python/package.json b/packages/cadl-python/package.json index 698869c9eb5..33fae268733 100644 --- a/packages/cadl-python/package.json +++ b/packages/cadl-python/package.json @@ -43,20 +43,20 @@ ], "peerDependencies": { "@cadl-lang/versioning": "~0.38.0", - "@cadl-lang/rest": "~0.38.0", + "@cadl-lang/rest": "~0.38.1", "@azure-tools/cadl-azure-core": "~0.24.0" }, "dependencies": { "js-yaml": "~4.1.0", "@autorest/python": "workspace:^", - "@cadl-lang/compiler": "~0.38.0", - "@azure-tools/cadl-dpg": "~0.24.0" + "@cadl-lang/compiler": "~0.38.5", + "@azure-tools/cadl-dpg": "~0.25.0-dev.8" }, "devDependencies": { "@types/mocha": "~9.1.0", "@types/node": "^18.7.16", "@types/js-yaml": "~4.0.1", - "@cadl-lang/rest": "~0.38.0", + "@cadl-lang/rest": "~0.38.1", "@cadl-lang/versioning": "~0.38.0", "@cadl-lang/eslint-config-cadl": "~0.5.0", "eslint": "^8.23.1", diff --git a/packages/cadl-python/src/emitter.ts b/packages/cadl-python/src/emitter.ts index 89dd96b1d1b..173d0fff6b4 100644 --- a/packages/cadl-python/src/emitter.ts +++ b/packages/cadl-python/src/emitter.ts @@ -18,8 +18,6 @@ import { ModelProperty, Namespace, Program, - resolvePath, - Type, getEffectiveModelType, JSONSchemaType, createCadlLibrary, @@ -41,6 +39,8 @@ import { isNullType, SyntaxKind, emitFile, + Type, + getKnownValues, } from "@cadl-lang/compiler"; import { getAuthentication, @@ -53,14 +53,13 @@ import { HttpAuth, HttpOperationParameter, HttpOperationParameters, + HttpOperationRequestBody, HttpOperationResponse, HttpOperationResponseContent, HttpServer, isStatusCode, } from "@cadl-lang/rest/http"; import { getAddedOn } from "@cadl-lang/versioning"; -import { execFileSync } from "child_process"; -import { dump } from "js-yaml"; import { Client, listClients, @@ -68,8 +67,15 @@ import { listOperationsInOperationGroup, isApiVersion, getDefaultApiVersion, + getClientNamespaceString, + createDpgContext, + DpgContext, } from "@azure-tools/cadl-dpg"; import { getResourceOperation } from "@cadl-lang/rest"; +import { execAsync, resolveModuleRoot, saveCodeModelAsYaml } from "./external-process.js"; +import { dirname } from "path"; +import { fileURLToPath } from "url"; +import { dump } from "js-yaml"; interface HttpServerParameter { type: "endpointPath"; @@ -129,13 +135,13 @@ export async function $onEmit(context: EmitContext) { const program = context.program; const resolvedOptions = { ...defaultOptions, ...context.options }; - const root = process.cwd(); + const root = await resolveModuleRoot(program, "@autorest/python", dirname(fileURLToPath(import.meta.url))); const outputDir = context.emitterOutputDir; - const yamlMap = createYamlEmitter(program); - const yamlPath = resolvePath(outputDir, "output.yaml"); + const yamlMap = emitCodeModel(context); + const yamlPath = await saveCodeModelAsYaml("cadl-python-yaml-map", yamlMap); const commandArgs = [ - `${root}/node_modules/@autorest/python/run-python3.js`, - `${root}/node_modules/@autorest/python/run_cadl.py`, + `${root}/run-python3.js`, + `${root}/run_cadl.py`, `--output-folder=${outputDir}`, `--cadl-file=${yamlPath}`, ]; @@ -146,16 +152,7 @@ export async function $onEmit(context: EmitContext) { commandArgs.push("--debug"); } if (!program.compilerOptions.noEmit && !program.hasError()) { - // TODO: change behavior based off of https://github.com/microsoft/cadl/issues/401 - await emitFile(program, { - path: yamlPath, - content: dump(yamlMap), - newLine: "lf", - }); - execFileSync(process.execPath, commandArgs); - } - if (program.compilerOptions.trace === undefined) { - await program.host.rm(yamlPath); + await execAsync(process.execPath, commandArgs); } } @@ -288,7 +285,14 @@ function getAddedOnVersion(p: Program, t: Type): string | undefined { return getAddedOn(p as any, t as any)?.value; } -function emitParamBase(program: Program, parameter: ModelProperty | Type): Record { +type ParamBase = { + optional: boolean; + description: string; + addedOn: string | undefined; + clientName: string; + inOverload: boolean; +}; +function emitParamBase(program: Program, parameter: ModelProperty | Type): ParamBase { let optional: boolean; let name: string; let description: string = ""; @@ -313,17 +317,17 @@ function emitParamBase(program: Program, parameter: ModelProperty | Type): Recor }; } -function emitBodyParameter( - program: Program, - bodyType: Type, - params: HttpOperationParameters, - operation: Operation, -): Record { - const base = emitParamBase(program, params.bodyParameter ?? bodyType); - const contentTypeParam = params.parameters.find((p) => p.type === "header" && p.name === "content-type"); - const contentTypes = contentTypeParam - ? ignoreDiagnostics(getContentTypes(contentTypeParam.param)) - : ["application/json"]; +type BodyParameter = ParamBase & { + contentTypes: string[]; + type: Type; + restApiName: string; + location: "body"; + defaultContentType: string; +}; + +function emitBodyParameter(program: Program, body: HttpOperationRequestBody, operation: Operation): BodyParameter { + const base = emitParamBase(program, body.parameter ?? body.type); + const contentTypes = body.contentTypes ?? ["application/json"]; if (contentTypes.length !== 1) { throw Error("Currently only one kind of content-type!"); } @@ -331,10 +335,8 @@ function emitBodyParameter( const resourceOperation = getResourceOperation(program, operation); if (resourceOperation) { type = getType(program, resourceOperation.resourceType); - } else if (params.body) { - type = getType(program, params.body.type); } else { - type = getType(program, bodyType); + type = getType(program, body.type); } if (type.type === "model" && type.name === "") { @@ -344,10 +346,11 @@ function emitBodyParameter( return { contentTypes, type, - restApiName: params.bodyParameter?.name ?? "body", + restApiName: body.parameter?.name ?? "body", location: "body", ...base, - defaultContentType: contentTypes.includes("application/json") ? "application/json" : contentTypes[0], + defaultContentType: + body.parameter?.default ?? contentTypes.includes("application/json") ? "application/json" : contentTypes[0], }; } @@ -605,12 +608,7 @@ function emitBasicOperation(program: Program, operation: Operation, operationGro if (httpOperation.parameters.body === undefined) { bodyParameter = undefined; } else { - bodyParameter = emitBodyParameter( - program, - httpOperation.parameters.body.type, - httpOperation.parameters, - operation, - ); + bodyParameter = emitBodyParameter(program, httpOperation.parameters.body, operation); if (parameters.filter((e) => e.restApiName.toLowerCase() === "content-type").length === 0) { parameters.push(emitContentTypeParameter(bodyParameter, isOverload, isOverriden)); } @@ -681,17 +679,6 @@ function getName(program: Program, type: Model): string { } function emitModel(program: Program, type: Model): Record { - for (const decorator of type.decorators) { - if (decorator.decorator.name === "$knownValues") { - for (const arg of decorator.args) { - if (typeof arg.value === "object" && arg.value.kind === "Enum") { - const enumResult = emitEnum(program, arg.value); - enumResult["name"] = type.name; - return enumResult; - } - } - } - } // Now we know it's a defined model const properties: Record[] = []; let baseModel = undefined; @@ -1186,11 +1173,12 @@ function getApiVersionParameter(program: Program): Record | void { } } -function emitClients(program: Program, namespace: string): Record[] { +function emitClients(context: DpgContext, namespace: string): Record[] { + const program = context.program; const clients = listClients(program); const retval: Record[] = []; for (const client of clients) { - if (getNamespace(program, client.name) !== namespace) { + if (getNamespace(context, client.name) !== namespace) { continue; } const server = getServerHelper(program, client.service); @@ -1215,39 +1203,36 @@ function getServiceNamespace(program: Program): Namespace { return listServices(program)[0].type; } -function getServiceNamespaceString(program: Program): string { - return getNamespaceFullName(getServiceNamespace(program)).toLowerCase(); -} - -function getNamespace(program: Program, clientName: string): string { +function getNamespace(context: DpgContext, clientName: string): string { // We get client namespaces from the client name. If there's a dot, we add that to the namespace const submodule = clientName.split(".").slice(0, -1).join(".").toLowerCase(); if (!submodule) { - return getServiceNamespaceString(program).toLowerCase(); + return getClientNamespaceString(context)!; } return submodule; } -function getNamespaces(program: Program): Set { +function getNamespaces(context: DpgContext): Set { const namespaces = new Set(); - for (const client of listClients(program)) { - namespaces.add(getNamespace(program, client.name)); + for (const client of listClients(context.program)) { + namespaces.add(getNamespace(context, client.name)); } return namespaces; } -function createYamlEmitter(program: Program) { - const serviceNamespaceString = getServiceNamespaceString(program); +function emitCodeModel(context: EmitContext) { + const dpgContext = createDpgContext(context); + const clientNamespaceString = getClientNamespaceString(dpgContext); // Get types const codeModel: Record = { - namespace: serviceNamespaceString, + namespace: clientNamespaceString, subnamespaceToClients: {}, }; - for (const namespace of getNamespaces(program)) { - if (namespace === serviceNamespaceString) { - codeModel["clients"] = emitClients(program, namespace); + for (const namespace of getNamespaces(dpgContext)) { + if (namespace === clientNamespaceString) { + codeModel["clients"] = emitClients(dpgContext, namespace); } else { - codeModel["subnamespaceToClients"][namespace] = emitClients(program, namespace); + codeModel["subnamespaceToClients"][namespace] = emitClients(dpgContext, namespace); } } codeModel["types"] = [...typesMap.values(), ...Object.values(KnownTypes), ...simpleTypesMap.values()]; diff --git a/packages/cadl-python/src/external-process.ts b/packages/cadl-python/src/external-process.ts new file mode 100644 index 00000000000..845f41208b6 --- /dev/null +++ b/packages/cadl-python/src/external-process.ts @@ -0,0 +1,80 @@ +import { CompilerHost, joinPaths, Program, resolveModule, ResolveModuleHost } from "@cadl-lang/compiler"; +import { ChildProcess, spawn, SpawnOptions } from "child_process"; +import { randomUUID } from "crypto"; +import { mkdir, writeFile } from "fs/promises"; +import jsyaml from "js-yaml"; +import os from "os"; + +const cadlCodeGenTempDir = joinPaths(os.tmpdir(), "cadl-codegen"); + +export function createTempPath(extension: string, prefix: string = "") { + return joinPaths(cadlCodeGenTempDir, prefix + randomUUID() + extension); +} + +/** + * Save the given codemodel in a yaml file. + * @param name Name of the codemodel. To give a guide to the temp file name. + * @param codemodel Codemodel to save + * @return the absolute path to the created codemodel. + */ +export async function saveCodeModelAsYaml(name: string, codemodel: unknown): Promise { + await mkdir(cadlCodeGenTempDir, { recursive: true }); + const filename = createTempPath(".yaml", name); + const yamlStr = jsyaml.dump(codemodel); + await writeFile(filename, yamlStr); + return filename; +} + +/** + * Start external process async + * @param command Command to run. This is the just the executable path or name. + * @param args Command arguments. + * @param options Options + */ +export async function execAsync( + command: string, + args: string[], + options: SpawnOptions = {}, +): Promise<{ exitCode: number; proc: ChildProcess }> { + const child = spawn(command, args, { stdio: "inherit", ...options }); + return new Promise((resolve, reject) => { + child.on("error", (error) => { + reject(error); + }); + + child.on("exit", (exitCode) => { + resolve({ + exitCode: exitCode ?? -1, + proc: child, + }); + }); + }); +} + +/** + * Resolve root of module. + * @param program Cadl Program + * @param name Name of the module (e.g. "@autorest/python") + * @param baseDir Base directory to start looking from. Use `dirname(fileURLToPath(import.meta.url))` for current dir. + * @returns Path to the module root if found. + */ +export async function resolveModuleRoot(program: Program, name: string, baseDir: string): Promise { + const moduleHost = getResolveModuleHost(program.host); + + const resolved = await resolveModule(moduleHost, name, { + baseDir, + }); + + return resolved.path; +} + +function getResolveModuleHost(host: CompilerHost): ResolveModuleHost { + return { + realpath: host.realpath, + stat: host.stat, + readFile: async (path) => { + const file = await host.readFile(path); + return file.text; + }, + }; +} diff --git a/packages/cadl-python/tsconfig.json b/packages/cadl-python/tsconfig.json index ee41cb53dd4..643cbc3ba18 100644 --- a/packages/cadl-python/tsconfig.json +++ b/packages/cadl-python/tsconfig.json @@ -7,8 +7,8 @@ "composite": true, "alwaysStrict": true, "forceConsistentCasingInFileNames": true, - "module": "esnext", - "moduleResolution": "node", + "module": "Node16", + "moduleResolution": "Node16", "esModuleInterop": true, "noImplicitAny": true, "noImplicitReturns": true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e71855efb53..fc5ea86740b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,13 +35,13 @@ importers: specifiers: '@autorest/python': workspace:^ '@azure-tools/cadl-azure-core': ~0.24.0 - '@azure-tools/cadl-dpg': ~0.24.0 + '@azure-tools/cadl-dpg': ~0.25.0-dev.8 '@azure-tools/cadl-ranch-expect': ~0.1.13 '@azure-tools/cadl-ranch-specs': ~0.6.2 - '@cadl-lang/compiler': ~0.38.0 + '@cadl-lang/compiler': ~0.38.5 '@cadl-lang/eslint-config-cadl': ~0.5.0 '@cadl-lang/openapi': ~0.38.0 - '@cadl-lang/rest': ~0.38.0 + '@cadl-lang/rest': ~0.38.1 '@cadl-lang/versioning': ~0.38.0 '@types/js-yaml': ~4.0.1 '@types/mocha': ~9.1.0 @@ -55,16 +55,16 @@ importers: typescript: ^4.8.3 dependencies: '@autorest/python': link:../autorest.python - '@azure-tools/cadl-dpg': 0.24.0_nko3gy7xiiqlzxounegquahor4 - '@cadl-lang/compiler': 0.38.0 + '@azure-tools/cadl-dpg': 0.25.0-dev.8_iopur57mrygs2plj5yhy7t746q + '@cadl-lang/compiler': 0.38.5 js-yaml: 4.1.0 devDependencies: - '@azure-tools/cadl-azure-core': 0.24.0_nko3gy7xiiqlzxounegquahor4 - '@azure-tools/cadl-ranch-expect': 0.1.13_nko3gy7xiiqlzxounegquahor4 - '@azure-tools/cadl-ranch-specs': 0.6.2_qbwtpa6wtynbtw2zmntur7s24q + '@azure-tools/cadl-azure-core': 0.24.0_iopur57mrygs2plj5yhy7t746q + '@azure-tools/cadl-ranch-expect': 0.1.13_iopur57mrygs2plj5yhy7t746q + '@azure-tools/cadl-ranch-specs': 0.6.2_nkezgskkxfiwexklugaj7ceobq '@cadl-lang/eslint-config-cadl': 0.5.0_prettier@2.7.1 - '@cadl-lang/openapi': 0.38.0_nko3gy7xiiqlzxounegquahor4 - '@cadl-lang/rest': 0.38.0_@cadl-lang+compiler@0.38.0 + '@cadl-lang/openapi': 0.38.0_iopur57mrygs2plj5yhy7t746q + '@cadl-lang/rest': 0.38.1_@cadl-lang+compiler@0.38.5 '@cadl-lang/versioning': 0.38.0 '@types/js-yaml': 4.0.5 '@types/mocha': 9.1.1 @@ -87,27 +87,27 @@ packages: semver: 7.3.7 dev: false - /@azure-tools/cadl-azure-core/0.24.0_nko3gy7xiiqlzxounegquahor4: + /@azure-tools/cadl-azure-core/0.24.0_iopur57mrygs2plj5yhy7t746q: resolution: {integrity: sha512-Pzs1uC03Rbd783dAN8yvsFEWKJIBpV7zKf+Mj2S2x7F9IsR+KS1nlPmifIAtSCeSRPVkU21xD1WmzXvB1GR59w==} engines: {node: '>=16.0.0'} peerDependencies: '@cadl-lang/compiler': ~0.38.0 '@cadl-lang/rest': ~0.38.0 dependencies: - '@cadl-lang/compiler': 0.38.0 - '@cadl-lang/lint': 0.38.0_@cadl-lang+compiler@0.38.0 - '@cadl-lang/rest': 0.38.0_@cadl-lang+compiler@0.38.0 + '@cadl-lang/compiler': 0.38.5 + '@cadl-lang/lint': 0.38.0_@cadl-lang+compiler@0.38.5 + '@cadl-lang/rest': 0.38.1_@cadl-lang+compiler@0.38.5 dev: true - /@azure-tools/cadl-dpg/0.24.0_nko3gy7xiiqlzxounegquahor4: - resolution: {integrity: sha512-9tjkQywJKAHyTwWH5lxvd4w4De1DpEW10uTm4WM12glwef3ZIDE/fUl/yizYA8+kYle5YLTsAVXo0pKYCQWnOg==} + /@azure-tools/cadl-dpg/0.25.0-dev.8_iopur57mrygs2plj5yhy7t746q: + resolution: {integrity: sha512-p25IB04/6qOJGr6sHdyYVM8OlrnyjKb1Op6ihWgFICMW8qRWUyw7AiTw7E2DCcD1WziLfh8/DRC+7opm3ZFgEg==} engines: {node: '>=16.0.0'} peerDependencies: - '@cadl-lang/compiler': ~0.38.0 - '@cadl-lang/rest': ~0.38.0 + '@cadl-lang/compiler': '>=0.38.5' + '@cadl-lang/rest': '>=0.38.1' dependencies: - '@cadl-lang/compiler': 0.38.0 - '@cadl-lang/rest': 0.38.0_@cadl-lang+compiler@0.38.0 + '@cadl-lang/compiler': 0.38.5 + '@cadl-lang/rest': 0.38.1_@cadl-lang+compiler@0.38.5 dev: false /@azure-tools/cadl-ranch-api/0.1.10: @@ -140,18 +140,18 @@ packages: - supports-color dev: true - /@azure-tools/cadl-ranch-expect/0.1.13_nko3gy7xiiqlzxounegquahor4: + /@azure-tools/cadl-ranch-expect/0.1.13_iopur57mrygs2plj5yhy7t746q: resolution: {integrity: sha512-ucv9eDQZ31X9lsuI/C3prd87aL3WxH7rB/6JHYQq90hvTcVI26VMjgkZaXcWOuYgcsV41CiNbe+H5EQcg//C6A==} engines: {node: '>=16.0.0'} peerDependencies: '@cadl-lang/compiler': ~0.38.0 '@cadl-lang/rest': ~0.38.0 dependencies: - '@cadl-lang/compiler': 0.38.0 - '@cadl-lang/rest': 0.38.0_@cadl-lang+compiler@0.38.0 + '@cadl-lang/compiler': 0.38.5 + '@cadl-lang/rest': 0.38.1_@cadl-lang+compiler@0.38.5 dev: true - /@azure-tools/cadl-ranch-specs/0.6.2_qbwtpa6wtynbtw2zmntur7s24q: + /@azure-tools/cadl-ranch-specs/0.6.2_nkezgskkxfiwexklugaj7ceobq: resolution: {integrity: sha512-YVTF2ZhX1n4Yw6vkHsUcxQ5IQXv5OxUZ39Mw06mx05hbjvt2W8XX6/paI7Of4WTPb81fCt+hdPiktfCPIVs8KA==} engines: {node: '>=16.0.0'} peerDependencies: @@ -161,12 +161,12 @@ packages: '@cadl-lang/rest': ~0.38.0 '@cadl-lang/versioning': ~0.38.0 dependencies: - '@azure-tools/cadl-azure-core': 0.24.0_nko3gy7xiiqlzxounegquahor4 + '@azure-tools/cadl-azure-core': 0.24.0_iopur57mrygs2plj5yhy7t746q '@azure-tools/cadl-ranch': 0.2.11 '@azure-tools/cadl-ranch-api': 0.1.10 - '@azure-tools/cadl-ranch-expect': 0.1.13_nko3gy7xiiqlzxounegquahor4 - '@cadl-lang/compiler': 0.38.0 - '@cadl-lang/rest': 0.38.0_@cadl-lang+compiler@0.38.0 + '@azure-tools/cadl-ranch-expect': 0.1.13_iopur57mrygs2plj5yhy7t746q + '@cadl-lang/compiler': 0.38.5 + '@cadl-lang/rest': 0.38.1_@cadl-lang+compiler@0.38.5 '@cadl-lang/versioning': 0.38.0 transitivePeerDependencies: - '@types/express' @@ -181,10 +181,10 @@ packages: dependencies: '@azure-tools/cadl-ranch-api': 0.1.10 '@azure-tools/cadl-ranch-coverage-sdk': 0.1.3 - '@azure-tools/cadl-ranch-expect': 0.1.13_nko3gy7xiiqlzxounegquahor4 + '@azure-tools/cadl-ranch-expect': 0.1.13_iopur57mrygs2plj5yhy7t746q '@azure/identity': 3.0.0 - '@cadl-lang/compiler': 0.38.0 - '@cadl-lang/rest': 0.38.0_@cadl-lang+compiler@0.38.0 + '@cadl-lang/compiler': 0.38.5 + '@cadl-lang/rest': 0.38.1_@cadl-lang+compiler@0.38.5 '@types/js-yaml': 4.0.5 ajv: 8.11.0 body-parser: 1.20.0 @@ -404,8 +404,8 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@cadl-lang/compiler/0.38.0: - resolution: {integrity: sha512-SvKEbPdlNzkK7DWd/yM2+IiIVn593rv2bntzU+JY15LzbKmTDH6rrkArkr0nR7lMzcBXpBEEvU3vfRdeRrOTyg==} + /@cadl-lang/compiler/0.38.5: + resolution: {integrity: sha512-jd6a8TEp9ApBzekTb39aBPocYrkuqzsQbLTDcc/c6tA47Wmr87463MAXpeB80ziEsr15sccI01j3g63jt5W0Aw==} engines: {node: '>=16.0.0'} hasBin: true dependencies: @@ -442,24 +442,24 @@ packages: - supports-color dev: true - /@cadl-lang/lint/0.38.0_@cadl-lang+compiler@0.38.0: + /@cadl-lang/lint/0.38.0_@cadl-lang+compiler@0.38.5: resolution: {integrity: sha512-6g4yoXeaNnTYxEWA0QywN3HkTCINPTHI56IsDKp6JhLOiROj1NvoufUzX438vdTqDqNyHg2t08fRmLMJP4GsCQ==} engines: {node: '>=16.0.0'} peerDependencies: '@cadl-lang/compiler': ~0.38.0 dependencies: - '@cadl-lang/compiler': 0.38.0 + '@cadl-lang/compiler': 0.38.5 dev: true - /@cadl-lang/openapi/0.38.0_nko3gy7xiiqlzxounegquahor4: + /@cadl-lang/openapi/0.38.0_iopur57mrygs2plj5yhy7t746q: resolution: {integrity: sha512-lFmU5AsZtw7Ofcnq3lg18Ieg21iuS73NOb+549BxPZX2j70vEqqfRT3CCCFmpGCK2sAUy2x2qD+pVUBcQIXeHQ==} engines: {node: '>=16.0.0'} peerDependencies: '@cadl-lang/compiler': ~0.38.0 '@cadl-lang/rest': ~0.38.0 dependencies: - '@cadl-lang/compiler': 0.38.0 - '@cadl-lang/rest': 0.38.0_@cadl-lang+compiler@0.38.0 + '@cadl-lang/compiler': 0.38.5 + '@cadl-lang/rest': 0.38.1_@cadl-lang+compiler@0.38.5 dev: true /@cadl-lang/prettier-plugin-cadl/0.38.0: @@ -468,19 +468,19 @@ packages: prettier: 2.7.1 dev: true - /@cadl-lang/rest/0.38.0_@cadl-lang+compiler@0.38.0: - resolution: {integrity: sha512-DvLLoUaG3//nf4HC4BhFFNK8cotYbwtL35cb6Nko8MYruLCuxQn0vZKtAMLnlvZWXc65qfbnTz1W/EI0NQh8+w==} + /@cadl-lang/rest/0.38.1_@cadl-lang+compiler@0.38.5: + resolution: {integrity: sha512-bl+AKgX42+1B9bwDq1uORcAhEfkR0oKctMmbdqCZAhWmhWaKWm0JsnEyKQ1Ujfpw2La9DiVg5mgwsQqQ5jiTeA==} engines: {node: '>=16.0.0'} peerDependencies: - '@cadl-lang/compiler': ~0.38.0 + '@cadl-lang/compiler': ~0.38.3 dependencies: - '@cadl-lang/compiler': 0.38.0 + '@cadl-lang/compiler': 0.38.5 /@cadl-lang/versioning/0.38.0: resolution: {integrity: sha512-7ECvYQShLu80eyQzRgRH1Lu/P1lrjnHpnEcNZK8bVoHoy+QT+DkY/c22OoBRwcb5kux9/T1/CMF61WqfrKC8jQ==} engines: {node: '>=16.0.0'} dependencies: - '@cadl-lang/compiler': 0.38.0 + '@cadl-lang/compiler': 0.38.5 dev: true /@colors/colors/1.5.0: From 29d2f1307008ac507ecc88dc61d0e17d31e0312f Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Fri, 6 Jan 2023 13:15:43 -0800 Subject: [PATCH 2/2] fix content type issue --- packages/cadl-python/src/emitter.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/cadl-python/src/emitter.ts b/packages/cadl-python/src/emitter.ts index d9a613bddd9..9404a070c5e 100644 --- a/packages/cadl-python/src/emitter.ts +++ b/packages/cadl-python/src/emitter.ts @@ -327,7 +327,10 @@ type BodyParameter = ParamBase & { function emitBodyParameter(program: Program, body: HttpOperationRequestBody, operation: Operation): BodyParameter { const base = emitParamBase(program, body.parameter ?? body.type); - const contentTypes = body.contentTypes ?? ["application/json"]; + let contentTypes = body.contentTypes; + if (contentTypes.length === 0) { + contentTypes = ["application/json"]; + } if (contentTypes.length !== 1) { throw Error("Currently only one kind of content-type!"); } @@ -1238,7 +1241,7 @@ function getNamespace(context: DpgContext, clientName: string): string { // We get client namespaces from the client name. If there's a dot, we add that to the namespace const submodule = clientName.split(".").slice(0, -1).join(".").toLowerCase(); if (!submodule) { - return getClientNamespaceString(context)!; + return getClientNamespaceString(context)!.toLowerCase(); } return submodule; }