From 81f2805a06d8617f13f8260c06618f5f1ec76db8 Mon Sep 17 00:00:00 2001 From: Jaykumar Gosar Date: Fri, 21 May 2021 15:01:47 -0700 Subject: [PATCH] feat(codegen): add user agent for non AWS clients --- .../codegen/AddUserAgentDependency.java | 24 +++-- .../codegen/AddUserAgentDependencyTest.java | 88 +++++++++++++++++++ .../typescript/codegen/NonAwsService.smithy | 21 +++++ 3 files changed, 119 insertions(+), 14 deletions(-) create mode 100644 codegen/smithy-aws-typescript-codegen/src/test/java/software/amazon/smithy/aws/typescript/codegen/AddUserAgentDependencyTest.java create mode 100644 codegen/smithy-aws-typescript-codegen/src/test/resources/software/amazon/smithy/aws/typescript/codegen/NonAwsService.smithy diff --git a/codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddUserAgentDependency.java b/codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddUserAgentDependency.java index 292e0832b1579..8bf68ba0e2d92 100644 --- a/codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddUserAgentDependency.java +++ b/codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/AddUserAgentDependency.java @@ -36,16 +36,13 @@ /** * Add client plubins and configs to support injecting user agent. */ -// TODO: Looks to add this back for non-AWS service clients, by fixing the dependency on ClientSharedValues.serviceId @SmithyInternalApi public class AddUserAgentDependency implements TypeScriptIntegration { @Override public List getClientPlugins() { return ListUtils.of( RuntimeClientPlugin.builder() - .withConventions(AwsDependency.MIDDLEWARE_USER_AGENT.dependency, "UserAgent") - .servicePredicate((m, s) -> isAwsService(s)) - .build()); + .withConventions(AwsDependency.MIDDLEWARE_USER_AGENT.dependency, "UserAgent").build()); } @Override @@ -55,9 +52,6 @@ public void addConfigInterfaceFields( SymbolProvider symbolProvider, TypeScriptWriter writer ) { - if (!isAwsService(settings, model)) { - return; - } writer.addImport("Provider", "Provider", TypeScriptDependency.AWS_SDK_TYPES.packageName); writer.addImport("UserAgent", "__UserAgent", TypeScriptDependency.AWS_SDK_TYPES.packageName); writer.writeDocs("The provider populating default tracking information to be sent with `user-agent`, " @@ -72,9 +66,6 @@ public Map> getRuntimeConfigWriters( SymbolProvider symbolProvider, LanguageTarget target ) { - if (!isAwsService(settings, model)) { - return Collections.emptyMap(); - } switch (target) { case NODE: return MapUtils.of( @@ -83,8 +74,7 @@ public Map> getRuntimeConfigWriters( writer.addImport("defaultUserAgent", "defaultUserAgent", AwsDependency.AWS_SDK_UTIL_USER_AGENT_NODE.packageName); writer.addDefaultImport("packageInfo", "./package.json"); - writer.write("defaultUserAgentProvider: defaultUserAgent({serviceId: " - + "ClientSharedValues.serviceId, clientVersion: packageInfo.version}),"); + writeDefaultUserAgentProvider(writer, settings, model); } ); case BROWSER: @@ -94,12 +84,18 @@ public Map> getRuntimeConfigWriters( writer.addImport("defaultUserAgent", "defaultUserAgent", AwsDependency.AWS_SDK_UTIL_USER_AGENT_BROWSER.packageName); writer.addDefaultImport("packageInfo", "./package.json"); - writer.write("defaultUserAgentProvider: defaultUserAgent({serviceId: " - + "ClientSharedValues.serviceId, clientVersion: packageInfo.version}),"); + writeDefaultUserAgentProvider(writer, settings, model); } ); default: return Collections.emptyMap(); } } + + private void writeDefaultUserAgentProvider(TypeScriptWriter writer, TypeScriptSettings settings, Model model) { + writer.write("defaultUserAgentProvider: defaultUserAgent({" + // serviceId is optional in defaultUserAgent. serviceId exists only for AWS services + + (isAwsService(settings, model) ? "serviceId: ClientSharedValues.serviceId, " : "") + + "clientVersion: packageInfo.version}),"); + } } diff --git a/codegen/smithy-aws-typescript-codegen/src/test/java/software/amazon/smithy/aws/typescript/codegen/AddUserAgentDependencyTest.java b/codegen/smithy-aws-typescript-codegen/src/test/java/software/amazon/smithy/aws/typescript/codegen/AddUserAgentDependencyTest.java new file mode 100644 index 0000000000000..c04f5972b1095 --- /dev/null +++ b/codegen/smithy-aws-typescript-codegen/src/test/java/software/amazon/smithy/aws/typescript/codegen/AddUserAgentDependencyTest.java @@ -0,0 +1,88 @@ +package software.amazon.smithy.aws.typescript.codegen; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; + +import org.junit.jupiter.api.Test; +import software.amazon.smithy.build.MockManifest; +import software.amazon.smithy.build.PluginContext; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.node.Node; +import software.amazon.smithy.typescript.codegen.TypeScriptCodegenPlugin; + +public class AddUserAgentDependencyTest { + @Test + public void addsUserAgentForAwsService() { + Model model = Model.assembler() + .addImport(getClass().getResource("NotSame.smithy")) + .discoverModels() + .assemble() + .unwrap(); + MockManifest manifest = new MockManifest(); + PluginContext context = PluginContext.builder() + .pluginClassLoader(getClass().getClassLoader()) + .model(model) + .fileManifest(manifest) + .settings(Node.objectNodeBuilder() + .withMember("service", Node.from("smithy.example#OriginalName")) + .withMember("package", Node.from("example")) + .withMember("packageVersion", Node.from("1.0.0")) + .build()) + .build(); + new TypeScriptCodegenPlugin().execute(context); + + // Check that one of the many dependencies was added. + assertThat(manifest.getFileString("package.json").get(), + containsString(AwsDependency.AWS_SDK_UTIL_USER_AGENT_NODE.packageName)); + + // Check that both the config files were updated. + assertThat(manifest.getFileString("runtimeConfig.ts").get(), containsString("defaultUserAgent")); + assertThat(manifest.getFileString("runtimeConfig.ts").get(), containsString("packageInfo.version")); + assertThat(manifest.getFileString("runtimeConfig.ts").get(), containsString("ClientSharedValues.serviceId")); + + assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), containsString("defaultUserAgent")); + assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), containsString("packageInfo.version")); + assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), containsString("ClientSharedValues.serviceId")); + + // Check that the dependency interface was updated. + assertThat(manifest.getFileString("NotSameClient.ts").get(), containsString("defaultUserAgentProvider?")); + } + + @Test + public void addsUserAgentForNonAwsService() { + Model model = Model.assembler() + .addImport(getClass().getResource("NonAwsService.smithy")) + .discoverModels() + .assemble() + .unwrap(); + MockManifest manifest = new MockManifest(); + PluginContext context = PluginContext.builder() + .pluginClassLoader(getClass().getClassLoader()) + .model(model) + .fileManifest(manifest) + .settings(Node.objectNodeBuilder() + .withMember("service", Node.from("smithy.example#ExampleService")) + .withMember("package", Node.from("example")) + .withMember("packageVersion", Node.from("1.0.0")) + .build()) + .build(); + new TypeScriptCodegenPlugin().execute(context); + + // Check that one of the many dependencies was added. + assertThat(manifest.getFileString("package.json").get(), + containsString(AwsDependency.AWS_SDK_UTIL_USER_AGENT_NODE.packageName)); + + // Check that both the config files were updated. + assertThat(manifest.getFileString("runtimeConfig.ts").get(), containsString("defaultUserAgent")); + assertThat(manifest.getFileString("runtimeConfig.ts").get(), containsString("packageInfo.version")); + assertThat(manifest.getFileString("runtimeConfig.ts").get(), not(containsString("ClientSharedValues.serviceId"))); + + assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), containsString("defaultUserAgent")); + assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), containsString("packageInfo.version")); + assertThat(manifest.getFileString("runtimeConfig.browser.ts").get(), not(containsString("ClientSharedValues.serviceId"))); + + // Check that the dependency interface was updated. + assertThat(manifest.getFileString("ExampleServiceClient.ts").get(), containsString("defaultUserAgentProvider?")); + } +} diff --git a/codegen/smithy-aws-typescript-codegen/src/test/resources/software/amazon/smithy/aws/typescript/codegen/NonAwsService.smithy b/codegen/smithy-aws-typescript-codegen/src/test/resources/software/amazon/smithy/aws/typescript/codegen/NonAwsService.smithy new file mode 100644 index 0000000000000..5773055530962 --- /dev/null +++ b/codegen/smithy-aws-typescript-codegen/src/test/resources/software/amazon/smithy/aws/typescript/codegen/NonAwsService.smithy @@ -0,0 +1,21 @@ +namespace smithy.example + +use aws.protocols#restJson1 + +@restJson1 +service ExampleService { + version: "2019-10-15", + operations: [GetFoo] +} + +operation GetFoo { + input: GetFooInput, + output: GetFooOutput, + errors: [GetFooError] +} + +structure GetFooInput {} +structure GetFooOutput {} + +@error("client") +structure GetFooError {} \ No newline at end of file