Skip to content

Commit

Permalink
http-client-java, compiler 0.65 (microsoft#5966)
Browse files Browse the repository at this point in the history
update for 0.65/0.51

added some tests
microsoft@fc614b9

improve handling of `ApiVersion` when it is not named as `api-version`
microsoft@0b24fa4

integration PR Azure/autorest.java#3025
  • Loading branch information
weidongxu-microsoft authored and dmnorc committed Feb 18, 2025
1 parent da4cfd5 commit f71a98c
Show file tree
Hide file tree
Showing 272 changed files with 7,579 additions and 1,478 deletions.
89 changes: 45 additions & 44 deletions packages/http-client-java/emitter/src/code-model-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import {
SdkDurationType,
SdkEnumType,
SdkEnumValueType,
SdkHeaderParameter,
SdkHttpErrorResponse,
SdkHttpOperation,
SdkHttpResponse,
Expand All @@ -63,13 +64,13 @@ import {
SdkModelPropertyType,
SdkModelType,
SdkPathParameter,
SdkQueryParameter,
SdkServiceMethod,
SdkType,
SdkUnionType,
createSdkContext,
getAllModels,
getHttpOperationParameter,
isApiVersion,
isSdkBuiltInKind,
isSdkIntKind,
} from "@azure-tools/typespec-client-generator-core";
Expand Down Expand Up @@ -112,7 +113,7 @@ import { OrSchema } from "./common/schemas/relationship.js";
import { DurationSchema } from "./common/schemas/time.js";
import { SchemaContext, SchemaUsage } from "./common/schemas/usage.js";
import { createPollOperationDetailsSchema, getFileDetailsSchema } from "./external-schemas.js";
import { EmitterOptions, createDiagnostic, reportDiagnostic } from "./lib.js";
import { EmitterOptions, LIB_NAME, createDiagnostic, reportDiagnostic } from "./lib.js";
import { ClientContext } from "./models.js";
import {
CONTENT_TYPE_KEY,
Expand Down Expand Up @@ -226,7 +227,7 @@ export class CodeModelBuilder {
return this.codeModel;
}

this.sdkContext = await createSdkContext(this.emitterContext, "@typespec/http-client-java", {
this.sdkContext = await createSdkContext(this.emitterContext, LIB_NAME, {
additionalDecorators: ["Azure\\.ClientGenerator\\.Core\\.@override"],
versioning: { previewStringRegex: /$/ },
}); // include all versions and do the filter by ourselves
Expand Down Expand Up @@ -1098,24 +1099,12 @@ export class CodeModelBuilder {
useNewPollStrategy &&
lroMetadata.finalStep &&
lroMetadata.finalStep.kind === "pollingSuccessProperty" &&
lroMetadata.finalResponse.resultPath
lroMetadata.finalResponse.resultSegments &&
lroMetadata.finalResponse.resultSegments[0].kind === "property"
) {
const finalResultPropertyClientName = lroMetadata.finalResponse.resultPath;

// find serializedName for lro result
if (finalResultPropertyClientName) {
lroMetadata.finalResponse.envelopeResult.properties?.forEach((p) => {
// TODO: "p.__raw?.name" should be "p.name", after TCGC fix https://github.com/Azure/typespec-azure/issues/2072
if (
!finalResultPropertySerializedName &&
p.kind === "property" &&
p.serializationOptions.json?.name &&
p.__raw?.name === finalResultPropertyClientName
) {
finalResultPropertySerializedName = p.serializationOptions.json?.name;
}
});
}
finalResultPropertySerializedName = getPropertySerializedName(
lroMetadata.finalResponse.resultSegments[0],
);
}
}

Expand Down Expand Up @@ -1158,14 +1147,12 @@ export class CodeModelBuilder {
}
}

private _armApiVersionParameter?: Parameter;

private processParameter(
op: CodeModelOperation,
param: SdkHttpOperationParameterType,
clientContext: ClientContext,
) {
if (clientContext.apiVersions && isApiVersion(this.sdkContext, param)) {
if (clientContext.apiVersions && param.isApiVersionParam && param.kind !== "cookie") {
// pre-condition for "isApiVersion": the client supports ApiVersions
if (this.isArm()) {
// Currently we assume ARM tsp only have one client and one api-version.
Expand All @@ -1181,8 +1168,7 @@ export class CodeModelBuilder {
}
op.addParameter(this._armApiVersionParameter);
} else {
const parameter =
param.kind === "query" ? this.apiVersionParameter : this.apiVersionParameterInPath;
const parameter = this.getApiVersionParameter(param);
op.addParameter(parameter);
clientContext.addGlobalParameter(parameter);
}
Expand Down Expand Up @@ -2901,26 +2887,41 @@ export class CodeModelBuilder {
}

private _apiVersionParameter?: Parameter;
get apiVersionParameter(): Parameter {
return (
this._apiVersionParameter ||
(this._apiVersionParameter = this.createApiVersionParameter(
"api-version",
ParameterLocation.Query,
))
);
}

private _apiVersionParameterInPath?: Parameter;
get apiVersionParameterInPath(): Parameter {
return (
this._apiVersionParameterInPath ||
// TODO: hardcode as "apiVersion", as it is what we get from compiler
(this._apiVersionParameterInPath = this.createApiVersionParameter(
"apiVersion",
ParameterLocation.Path,
))
);
private _apiVersionParameterInHeader?: Parameter;
private _armApiVersionParameter?: Parameter;

private getApiVersionParameter(
param: SdkQueryParameter | SdkPathParameter | SdkHeaderParameter,
): Parameter {
// apiVersionParameter is cached by param.kind
// we didn't expect Azure service have more than 1 type of api-version, and certainly not more than 1 of each kind.
if (param.kind === "query") {
return (
this._apiVersionParameter ||
(this._apiVersionParameter = this.createApiVersionParameter(
param.serializedName,
ParameterLocation.Query,
))
);
} else if (param.kind === "path") {
return (
this._apiVersionParameterInPath ||
(this._apiVersionParameterInPath = this.createApiVersionParameter(
param.serializedName,
ParameterLocation.Path,
))
);
} else {
// param.kind === "header"
return (
this._apiVersionParameterInHeader ||
(this._apiVersionParameterInHeader = this.createApiVersionParameter(
param.serializedName,
ParameterLocation.Header,
))
);
}
}

private isSubscriptionId(param: SdkPathParameter): boolean {
Expand Down
4 changes: 3 additions & 1 deletion packages/http-client-java/emitter/src/lib.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { createTypeSpecLibrary, JSONSchemaType, paramMessage } from "@typespec/compiler";

export const LIB_NAME = "@typespec/http-client-java";

export interface DevOptions {
"generate-code-model"?: boolean;
debug?: boolean;
Expand Down Expand Up @@ -89,7 +91,7 @@ const EmitterOptionsSchema: JSONSchemaType<EmitterOptions> = {
};

export const $lib = createTypeSpecLibrary({
name: "@typespec/http-client-java",
name: LIB_NAME,
diagnostics: {
// error
"unknown-error": {
Expand Down
2 changes: 1 addition & 1 deletion packages/http-client-java/emitter/src/operation-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ export function isLroNewPollingStrategy(
} else if (
lroMetadata.finalStep &&
lroMetadata.finalStep.kind === "pollingSuccessProperty" &&
lroMetadata.finalResponse?.resultPath
lroMetadata.finalResponse?.resultSegments
) {
// final result is the value in lroMetadata.finalStep.target
useNewStrategy = true;
Expand Down
6 changes: 6 additions & 0 deletions packages/http-client-java/eng/scripts/Test-Packages.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ try {
try {
& ./Setup.ps1
& ./Spector-Tests.ps1
if ($LASTEXITCODE -ne 0) {
exit $LASTEXITCODE
}
}
finally {
Pop-Location
Expand All @@ -49,6 +52,9 @@ try {
try {
& ./Setup.ps1
& ./Spector-Tests.ps1
if ($LASTEXITCODE -ne 0) {
exit $LASTEXITCODE
}
}
finally {
Pop-Location
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,21 @@
"spector-stop": "tsp-spector server stop"
},
"dependencies": {
"@typespec/http-specs": "0.1.0-alpha.7",
"@typespec/http-client-java": "file:../../typespec-http-client-java-0.1.9.tgz",
"@typespec/http-specs": "0.1.0-alpha.9",
"@typespec/http-client-java": "file:../../typespec-http-client-java-0.1.10.tgz",
"@typespec/http-client-java-tests": "file:"
},
"overrides": {
"@typespec/compiler": "~0.64.0",
"@typespec/http": "~0.64.0",
"@typespec/rest": "~0.64.0",
"@typespec/versioning": "~0.64.0",
"@typespec/openapi": "~0.64.0",
"@typespec/xml": "~0.64.0",
"@azure-tools/typespec-azure-core": "~0.50.0",
"@azure-tools/typespec-client-generator-core": "~0.50.3",
"@azure-tools/typespec-azure-resource-manager": "~0.50.0",
"@azure-tools/typespec-autorest": "~0.50.0"
"@typespec/compiler": "~0.65.0",
"@typespec/http": "~0.65.0",
"@typespec/rest": "~0.65.0",
"@typespec/versioning": "~0.65.0",
"@typespec/openapi": "~0.65.0",
"@typespec/xml": "~0.65.0",
"@azure-tools/typespec-azure-core": "~0.51.0",
"@azure-tools/typespec-client-generator-core": "~0.51.0",
"@azure-tools/typespec-azure-resource-manager": "~0.51.0",
"@azure-tools/typespec-autorest": "~0.51.0"
},
"private": true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
// Code generated by Microsoft (R) TypeSpec Code Generator.

package response.statuscoderange;

import io.clientcore.core.annotation.Metadata;
import io.clientcore.core.annotation.TypeConditions;
import io.clientcore.core.serialization.json.JsonReader;
import io.clientcore.core.serialization.json.JsonSerializable;
import io.clientcore.core.serialization.json.JsonToken;
import io.clientcore.core.serialization.json.JsonWriter;
import java.io.IOException;

/**
* The DefaultError model.
*/
@Metadata(conditions = { TypeConditions.IMMUTABLE })
public final class DefaultError implements JsonSerializable<DefaultError> {
/*
* The code property.
*/
@Metadata(generated = true)
private final String code;

/**
* Creates an instance of DefaultError class.
*
* @param code the code value to set.
*/
@Metadata(generated = true)
private DefaultError(String code) {
this.code = code;
}

/**
* Get the code property: The code property.
*
* @return the code value.
*/
@Metadata(generated = true)
public String getCode() {
return this.code;
}

/**
* {@inheritDoc}
*/
@Metadata(generated = true)
@Override
public JsonWriter toJson(JsonWriter jsonWriter) throws IOException {
jsonWriter.writeStartObject();
jsonWriter.writeStringField("code", this.code);
return jsonWriter.writeEndObject();
}

/**
* Reads an instance of DefaultError from the JsonReader.
*
* @param jsonReader The JsonReader being read.
* @return An instance of DefaultError if the JsonReader was pointing to an instance of it, or null if it was
* pointing to JSON null.
* @throws IllegalStateException If the deserialized JSON object was missing any required properties.
* @throws IOException If an error occurs while reading the DefaultError.
*/
@Metadata(generated = true)
public static DefaultError fromJson(JsonReader jsonReader) throws IOException {
return jsonReader.readObject(reader -> {
String code = null;
while (reader.nextToken() != JsonToken.END_OBJECT) {
String fieldName = reader.getFieldName();
reader.nextToken();

if ("code".equals(fieldName)) {
code = reader.getString();
} else {
reader.skipChildren();
}
}
return new DefaultError(code);
});
}
}
Loading

0 comments on commit f71a98c

Please sign in to comment.