Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package software.amazon.smithy.python.codegen.test;

import java.nio.file.Path;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import software.amazon.smithy.build.FileManifest;
import software.amazon.smithy.build.PluginContext;
import software.amazon.smithy.model.Model;
import software.amazon.smithy.model.node.ObjectNode;
import software.amazon.smithy.python.codegen.PythonClientCodegenPlugin;

/**
* Simple test that executes the Python client codegen plugin for an AWS-like service.
*/
public class AwsCodegenTest {

@Test
public void testCodegen(@TempDir Path tempDir) {
PythonClientCodegenPlugin plugin = new PythonClientCodegenPlugin();
Model model = Model.assembler(AwsCodegenTest.class.getClassLoader())
.discoverModels(AwsCodegenTest.class.getClassLoader())
.assemble()
.unwrap();
PluginContext context = PluginContext.builder()
.fileManifest(FileManifest.create(tempDir))
.settings(
ObjectNode.builder()
.withMember("service", "example.aws#RestJsonService")
.withMember("module", "restjson")
.withMember("moduleVersion", "0.0.1")
.build())
.model(model)
.build();
plugin.execute(context);
}

}
70 changes: 70 additions & 0 deletions codegen/aws/core/src/it/resources/META-INF/smithy/main.smithy
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
$version: "2.0"

namespace example.aws

use aws.protocols#restJson1
use aws.api#service

/// A test service that renders a restJson1 service with AWS traits
@restJson1(
http: ["h2", "http/1.1"]
eventStreamHttp: ["h2"]
)
@service(
sdkId: "REST JSON",
endpointPrefix: "rest-json-1"
)
@title("AWS REST JSON Service")
@paginated(inputToken: "nextToken", outputToken: "nextToken", pageSize: "pageSize")
@httpApiKeyAuth(name: "weather-auth", in: "header")
service RestJsonService {
version: "2006-03-01"
operations: [
BasicOperation
]
}

@http(code: 200, method: "POST", uri: "/basic-operation")
operation BasicOperation {
input := {
message: String
}
output := {
message: String
}
}

@http(code: 200, method: "POST", uri: "/input-stream")
operation InputStream {
input := {
stream: EventStream
}
}

@http(code: 200, method: "POST", uri: "/output-stream")
operation OutputStream {
output := {
stream: EventStream
}
}

@http(code: 200, method: "POST", uri: "/duplex-stream")
operation DuplexStream {
input := {
stream: EventStream
}
output := {
stream: EventStream
}
}


@streaming
union EventStream {
message: MessageEvent
}

structure MessageEvent {
message: String
}

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
main.smithy
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,9 @@

import java.util.List;
import software.amazon.smithy.aws.traits.ServiceTrait;
import software.amazon.smithy.python.codegen.CodegenUtils;
import software.amazon.smithy.python.codegen.GenerationContext;
import software.amazon.smithy.python.codegen.integrations.PythonIntegration;
import software.amazon.smithy.python.codegen.integrations.RuntimeClientPlugin;
import software.amazon.smithy.python.codegen.sections.EndpointParametersSection;
import software.amazon.smithy.python.codegen.sections.EndpointResolverSection;
import software.amazon.smithy.python.codegen.sections.InitDefaultEndpointResolverSection;
import software.amazon.smithy.python.codegen.writer.PythonWriter;
import software.amazon.smithy.utils.CodeInterceptor;
Expand All @@ -37,57 +34,9 @@ public List<? extends CodeInterceptor<? extends CodeSection, PythonWriter>> inte
GenerationContext context
) {
return List.of(
new RegionalEndpointParametersInterceptor(context),
new RegionalEndpointResolverInterceptor(context),
new RegionalInitEndpointResolverInterceptor(context));
}

private static final class RegionalEndpointParametersInterceptor
implements CodeInterceptor<EndpointParametersSection, PythonWriter> {

private final GenerationContext context;

public RegionalEndpointParametersInterceptor(GenerationContext context) {
this.context = context;
}

@Override
public Class<EndpointParametersSection> sectionType() {
return EndpointParametersSection.class;
}

@Override
public void write(PythonWriter writer, String previousText, EndpointParametersSection section) {
var params = CodegenUtils.getEndpointParametersSymbol(context.settings());

writer.write("from smithy_aws_core.endpoints.standard_regional import RegionalEndpointParameters");
writer.write("$L = RegionalEndpointParameters", params.getName());
}
}

private static final class RegionalEndpointResolverInterceptor
implements CodeInterceptor<EndpointResolverSection, PythonWriter> {

private final GenerationContext context;

public RegionalEndpointResolverInterceptor(GenerationContext context) {
this.context = context;
}

@Override
public Class<EndpointResolverSection> sectionType() {
return EndpointResolverSection.class;
}

@Override
public void write(PythonWriter writer, String previousText, EndpointResolverSection section) {
var resolver = CodegenUtils.getEndpointResolverSymbol(context.settings());

writer.write("from smithy_aws_core.endpoints.standard_regional import StandardRegionalEndpointsResolver");
writer.write("$L = StandardRegionalEndpointsResolver", resolver.getName());
}
}

private static final class RegionalInitEndpointResolverInterceptor
implements CodeInterceptor<InitDefaultEndpointResolverSection, PythonWriter> {

Expand All @@ -104,16 +53,17 @@ public Class<InitDefaultEndpointResolverSection> sectionType() {

@Override
public void write(PythonWriter writer, String previousText, InitDefaultEndpointResolverSection section) {
var resolver = CodegenUtils.getEndpointResolverSymbol(context.settings());

String endpointPrefix = context.settings()
.service(context.model())
.getTrait(ServiceTrait.class)
.map(ServiceTrait::getEndpointPrefix)
.orElse(context.settings().service().getName());

writer.write("self.endpoint_resolver = endpoint_resolver or $T(endpoint_prefix=$S)",
resolver,
writer.addImport("smithy_aws_core.endpoints.standard_regional",
"StandardRegionalEndpointsResolver",
"_RegionalResolver");
writer.write(
"self.endpoint_resolver = endpoint_resolver or _RegionalResolver(endpoint_prefix=$S)",
endpointPrefix);

}
Expand Down
Loading