Skip to content

Commit 5275d8e

Browse files
authored
chore: Build service clients with exact dependencies (#953)
1 parent 85bfbaf commit 5275d8e

File tree

9 files changed

+110
-20
lines changed

9 files changed

+110
-20
lines changed

smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/DirectedSwiftCodegen.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,15 @@ class DirectedSwiftCodegen(
9898
LOGGER.info("[${service.id}] Generating smoke tests for service")
9999
generateSmokeTests(ctx)
100100

101-
LOGGER.info("Generating package manifest file")
102-
PackageManifestGenerator(ctx).writePackageManifest(writers.dependencies)
101+
if (settings.generatePackageManifest) {
102+
LOGGER.info("Generating package manifest file")
103+
PackageManifestGenerator(ctx).writePackageManifest(writers.dependencies)
104+
}
105+
106+
if (settings.generateDependencyJSON) {
107+
LOGGER.info("Generating dependency JSON file")
108+
DependencyJSONGenerator(ctx).writePackageJSON(writers.dependencies)
109+
}
103110

104111
LOGGER.info("Flushing swift writers")
105112
writers.flushWriters()

smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/PackageManifestGenerator.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@ import software.amazon.smithy.codegen.core.SymbolDependency
88
import software.amazon.smithy.swift.codegen.integration.ProtocolGenerator
99
import kotlin.jvm.optionals.getOrNull
1010

11-
val PACKAGE_MANIFEST_NAME = "Package.swift.txt"
12-
1311
class PackageManifestGenerator(
1412
val ctx: ProtocolGenerator.GenerationContext,
1513
) {
1614
fun writePackageManifest(dependencies: List<SymbolDependency>) {
17-
ctx.delegator.useFileWriter(PACKAGE_MANIFEST_NAME) { writer ->
15+
ctx.delegator.useFileWriter("Package.swift") { writer ->
1816
writer.write("// swift-tools-version: \$L", ctx.settings.swiftVersion)
1917
writer.write("")
2018
writer.write("import PackageDescription")
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0.
4+
*/
5+
package software.amazon.smithy.swift.codegen
6+
7+
import software.amazon.smithy.codegen.core.SymbolDependency
8+
import software.amazon.smithy.swift.codegen.integration.ProtocolGenerator
9+
import kotlin.jvm.optionals.getOrNull
10+
11+
val DEPENDENCY_JSON_NAME = "Dependencies.json"
12+
13+
class DependencyJSONGenerator(
14+
val ctx: ProtocolGenerator.GenerationContext,
15+
) {
16+
fun writePackageJSON(dependencies: List<SymbolDependency>) {
17+
ctx.delegator.useFileWriter(DEPENDENCY_JSON_NAME) { writer ->
18+
writer.openBlock("[", "]") {
19+
val externalDependencies =
20+
dependencies
21+
.filter {
22+
it.getProperty("url", String::class.java).getOrNull() != null ||
23+
it.getProperty("scope", String::class.java).getOrNull() != null
24+
}
25+
26+
val dependenciesByTarget =
27+
externalDependencies
28+
.distinctBy { it.targetName() + it.packageName }
29+
.sortedBy { it.targetName() }
30+
31+
dependenciesByTarget.forEach { writer.write("\$S,", it.targetName()) }
32+
writer.unwrite(",\n")
33+
writer.write("")
34+
}
35+
}
36+
}
37+
}
38+
39+
private fun SymbolDependency.targetName(): String = expectProperty("target", String::class.java)

smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/SwiftDependency.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class SwiftDependency(
4040
"",
4141
"",
4242
"",
43-
SwiftDependency.DistributionMethod.GIT,
43+
DistributionMethod.GIT,
4444
)
4545
val XCTest =
4646
SwiftDependency(
@@ -60,11 +60,8 @@ class SwiftDependency(
6060
val SMITHY_HTTP_API = smithySwiftDependency("SmithyHTTPAPI")
6161
val SMITHY_HTTP_AUTH_API = smithySwiftDependency("SmithyHTTPAuthAPI")
6262
val SMITHY_HTTP_AUTH = smithySwiftDependency("SmithyHTTPAuth")
63-
val SMITHY_CHECKSUMS_API = smithySwiftDependency("SmithyChecksumsAPI")
64-
val SMITHY_CHECKSUMS = smithySwiftDependency("SmithyChecksums")
6563
val SMITHY_STREAMS = smithySwiftDependency("SmithyStreams")
6664
val SMITHY_EVENT_STREAMS_API = smithySwiftDependency("SmithyEventStreamsAPI")
67-
val SMITHY_EVENT_STREAMS_AUTH_API = smithySwiftDependency("SmithyEventStreamsAuthAPI")
6865
val SMITHY_EVENT_STREAMS = smithySwiftDependency("SmithyEventStreams")
6966
val SMITHY_TEST_UTIL = smithySwiftDependency("SmithyTestUtil")
7067
val SMITHY_READ_WRITE = smithySwiftDependency("SmithyReadWrite")

smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/SwiftSettings.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ private const val MERGE_MODELS = "mergeModels"
3838
private const val COPYRIGHT_NOTICE = "copyrightNotice"
3939
private const val VISIBILITY = "visibility"
4040
private const val INTERNAL_CLIENT = "internalClient"
41-
private const val FOR_PROTOCOL_TESTS = "forProtocolTests"
41+
private const val GENERATE_PACKAGE_MANIFEST = "generatePackageManifest"
42+
private const val GENERATE_DEPENDENCY_JSON = "generateDependencyJSON"
4243

4344
// Prioritized list of protocols supported for code generation
4445
private val DEFAULT_PROTOCOL_RESOLUTION_PRIORITY =
@@ -66,7 +67,8 @@ class SwiftSettings(
6667
val copyrightNotice: String,
6768
val visibility: String,
6869
val internalClient: Boolean,
69-
val forProtocolTests: Boolean,
70+
val generatePackageManifest: Boolean,
71+
val generateDependencyJSON: Boolean,
7072
) {
7173
companion object {
7274
private val LOGGER: Logger = Logger.getLogger(SwiftSettings::class.java.name)
@@ -97,7 +99,9 @@ class SwiftSettings(
9799
MERGE_MODELS,
98100
COPYRIGHT_NOTICE,
99101
VISIBILITY,
100-
FOR_PROTOCOL_TESTS,
102+
INTERNAL_CLIENT,
103+
GENERATE_PACKAGE_MANIFEST,
104+
GENERATE_DEPENDENCY_JSON,
101105
),
102106
)
103107

@@ -123,7 +127,8 @@ class SwiftSettings(
123127
)
124128
val visibility = config.getStringMemberOrDefault(VISIBILITY, "public")
125129
val internalClient = config.getBooleanMemberOrDefault(INTERNAL_CLIENT, false)
126-
val forProtocolTests = config.getBooleanMemberOrDefault(FOR_PROTOCOL_TESTS, false)
130+
val generatePackageManifest = config.getBooleanMemberOrDefault(GENERATE_PACKAGE_MANIFEST, true)
131+
val generateDependencyJSON = config.getBooleanMemberOrDefault(GENERATE_DEPENDENCY_JSON, false)
127132

128133
return SwiftSettings(
129134
serviceId,
@@ -139,7 +144,8 @@ class SwiftSettings(
139144
copyrightNotice,
140145
visibility,
141146
internalClient,
142-
forProtocolTests,
147+
generatePackageManifest,
148+
generateDependencyJSON,
143149
)
144150
}
145151

smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/SwiftWriter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ class SwiftWriter(
174174
//
175175
// Also leave out the headers when JSON or the version file is being written,
176176
// as indicated by the file extension.
177-
val isPackageManifest = listOf(PACKAGE_MANIFEST_NAME, (PACKAGE_MANIFEST_NAME + ".swift")).contains(fullPackageName)
177+
val isPackageManifest = fullPackageName == "Package"
178178
val isNonSwiftSourceFile = listOf(".json", ".version").any { fullPackageName.endsWith(it) }
179179
val noHeader = isPackageManifest || isNonSwiftSourceFile
180180
return contents.takeIf { noHeader } ?: (copyrightNotice + imports + contents)

smithy-swift-codegen/src/test/kotlin/software/amazon/smithy/swift/codegen/codegencomponents/SwiftSettingsTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,9 @@ class SwiftSettingsTest {
193193
mergeModels = false,
194194
copyrightNotice = "// Test copyright",
195195
visibility = "public",
196-
forProtocolTests = false,
197196
internalClient = false,
197+
generatePackageManifest = false,
198+
generateDependencyJSON = true,
198199
)
199200

200201
private fun createServiceWithProtocols(protocols: Set<ShapeId>): ServiceShape {

smithy-swift-codegen/src/test/kotlin/software/amazon/smithy/swift/codegen/manifestanddocs/PackageManifestGeneratorTests.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ class PackageManifestGeneratorTests {
1919

2020
@Test
2121
fun `it starts with a swift-tools-version statement`() {
22-
val packageManifest = testContext.manifest.getFileString("Package.swift.txt").get()
22+
val packageManifest = testContext.manifest.getFileString("Package.swift").get()
2323
assertNotNull(packageManifest)
2424
packageManifest.shouldStartWith("// swift-tools-version: 5.5.0")
2525
}
2626

2727
@Test
2828
fun `it renders package manifest file with macOS and iOS platforms block`() {
29-
val packageManifest = testContext.manifest.getFileString("Package.swift.txt").get()
29+
val packageManifest = testContext.manifest.getFileString("Package.swift").get()
3030
assertNotNull(packageManifest)
3131
val expected = """
3232
platforms: [
@@ -38,7 +38,7 @@ class PackageManifestGeneratorTests {
3838

3939
@Test
4040
fun `it renders package manifest file with single library in product block`() {
41-
val packageManifest = testContext.manifest.getFileString("Package.swift.txt").get()
41+
val packageManifest = testContext.manifest.getFileString("Package.swift").get()
4242
assertNotNull(packageManifest)
4343
val expected = """
4444
products: [
@@ -50,7 +50,7 @@ class PackageManifestGeneratorTests {
5050

5151
@Test
5252
fun `it renders package manifest file with target and test target`() {
53-
val packageManifest = testContext.manifest.getFileString("Package.swift.txt").get()
53+
val packageManifest = testContext.manifest.getFileString("Package.swift").get()
5454
assertNotNull(packageManifest)
5555
val expected = """
5656
targets: [
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package software.amazon.smithy.swift.codegen.manifestanddocs
2+
3+
/*
4+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
5+
* SPDX-License-Identifier: Apache-2.0.
6+
*/
7+
8+
import io.kotest.matchers.string.shouldContain
9+
import org.junit.jupiter.api.Assertions.assertNotNull
10+
import org.junit.jupiter.api.Test
11+
import software.amazon.smithy.swift.codegen.DependencyJSONGenerator
12+
import software.amazon.smithy.swift.codegen.TestContext
13+
import software.amazon.smithy.swift.codegen.defaultSettings
14+
import software.amazon.smithy.swift.codegen.protocolgeneratormocks.MockHTTPAWSJson11ProtocolGenerator
15+
16+
class ServiceClientJSONManifestGeneratorTests {
17+
private val testContext = setupTests("simple-service-with-operation-and-dependency.smithy", "smithy.example#Example")
18+
19+
@Test
20+
fun `it renders package manifest JSON with dependencies`() {
21+
val packageManifest = testContext.manifest.getFileString("Dependencies.json").get()
22+
assertNotNull(packageManifest)
23+
val expected = """[
24+
25+
]
26+
"""
27+
packageManifest.shouldContain(expected)
28+
}
29+
30+
private fun setupTests(
31+
smithyFile: String,
32+
serviceShapeId: String,
33+
): TestContext {
34+
val context =
35+
TestContext.initContextFrom(smithyFile, serviceShapeId, MockHTTPAWSJson11ProtocolGenerator()) { model ->
36+
model.defaultSettings(serviceShapeId, "MockSDK", "2019-12-16", "MockSDKID")
37+
}
38+
DependencyJSONGenerator(context.generationCtx).writePackageJSON(context.generationCtx.delegator.dependencies)
39+
context.generationCtx.delegator.flushWriters()
40+
return context
41+
}
42+
}

0 commit comments

Comments
 (0)