From 5b63d6c1083bde9a2ab05b71145db76f57924ec1 Mon Sep 17 00:00:00 2001 From: Josh Elkins Date: Tue, 24 Sep 2024 16:42:35 -0500 Subject: [PATCH] fix: Make manifest Swift 6 Language Mode compatible (#1774) --- AWSSDKSwiftCLI/Package.swift | 3 +- .../Subcommands/GeneratePackageManifest.swift | 8 - .../Models/PackageManifestBuilder.swift | 68 ++- .../{Package.Base.swift => Package.Base.txt} | 224 ++++----- .../Resources/Package.Prefix.txt | 14 + .../GeneratePackageManifestTests.swift | 2 - .../Models/PackageManifestBuilderTests.swift | 25 +- Package.swift | 455 ++++++++---------- .../prepare_protocol_and_unit_tests.sh | 6 +- 9 files changed, 355 insertions(+), 450 deletions(-) rename AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Resources/{Package.Base.swift => Package.Base.txt} (58%) create mode 100644 AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Resources/Package.Prefix.txt diff --git a/AWSSDKSwiftCLI/Package.swift b/AWSSDKSwiftCLI/Package.swift index ef65a290fe8..8d9ac136740 100644 --- a/AWSSDKSwiftCLI/Package.swift +++ b/AWSSDKSwiftCLI/Package.swift @@ -24,7 +24,8 @@ let package = Package( .product(name: "Algorithms", package: "swift-algorithms"), ], resources: [ - .process("Resources/Package.Base.swift"), + .process("Resources/Package.Prefix.txt"), + .process("Resources/Package.Base.txt"), .process("Resources/DocIndex.Base.md") ] ), diff --git a/AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Commands/AWSSDKSwiftCLI/Subcommands/GeneratePackageManifest.swift b/AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Commands/AWSSDKSwiftCLI/Subcommands/GeneratePackageManifest.swift index fa2925f6d9f..376b0cf8c36 100644 --- a/AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Commands/AWSSDKSwiftCLI/Subcommands/GeneratePackageManifest.swift +++ b/AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Commands/AWSSDKSwiftCLI/Subcommands/GeneratePackageManifest.swift @@ -32,9 +32,6 @@ struct GeneratePackageManifestCommand: ParsableCommand { @Option(help: "The names of the services to include in the package manifest. This defaults to all services located in aws-sdk-swift/Sources/Services") var services: [String] = [] - @Flag(help: "If the package manifest should exclude AWS services.") - var excludeAWSServices = false - @Flag(help: "If the package manifest should exclude runtime tests.") var excludeRuntimeTests = false @@ -45,7 +42,6 @@ struct GeneratePackageManifestCommand: ParsableCommand { clientRuntimeVersion: clientRuntimeVersion, crtVersion: crtVersion, services: services.isEmpty ? nil : services, - excludeAWSServices: excludeAWSServices, excludeRuntimeTests: excludeRuntimeTests ) try generatePackageManifest.run() @@ -69,8 +65,6 @@ struct GeneratePackageManifest { /// The list of services to include as products /// If `nil` then the list is populated with the names of all items within the `Sources/Services` directory let services: [String]? - /// If the package manifest should exclude the AWS services. - let excludeAWSServices: Bool /// If the package manifest should exclude runtime unit tests. let excludeRuntimeTests: Bool @@ -213,14 +207,12 @@ extension GeneratePackageManifest { clientRuntimeVersion: clientRuntimeVersion, crtVersion: crtVersion, services: services, - excludeAWSServices: excludeAWSServices, excludeRuntimeTests: excludeRuntimeTests ) { _clientRuntimeVersion, _crtVersion, _services in let builder = PackageManifestBuilder( clientRuntimeVersion: _clientRuntimeVersion, crtVersion: _crtVersion, services: _services, - excludeAWSServices: excludeAWSServices, excludeRuntimeTests: excludeRuntimeTests ) return try builder.build() diff --git a/AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Models/PackageManifestBuilder.swift b/AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Models/PackageManifestBuilder.swift index 0f7e71b244f..a8a8ba68936 100644 --- a/AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Models/PackageManifestBuilder.swift +++ b/AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Models/PackageManifestBuilder.swift @@ -17,62 +17,69 @@ struct PackageManifestBuilder { let clientRuntimeVersion: Version let crtVersion: Version let services: [Service] - let excludeAWSServices: Bool let excludeRuntimeTests: Bool + let prefixContents: () throws -> String let basePackageContents: () throws -> String init( clientRuntimeVersion: Version, crtVersion: Version, services: [Service], - excludeAWSServices: Bool, excludeRuntimeTests: Bool, + prefixContents: @escaping () throws -> String, basePackageContents: @escaping () throws -> String ) { self.clientRuntimeVersion = clientRuntimeVersion self.crtVersion = crtVersion self.services = services - self.excludeAWSServices = excludeAWSServices - self.basePackageContents = basePackageContents self.excludeRuntimeTests = excludeRuntimeTests + self.prefixContents = prefixContents + self.basePackageContents = basePackageContents } init( clientRuntimeVersion: Version, crtVersion: Version, services: [Service], - excludeAWSServices: Bool, excludeRuntimeTests: Bool ) { - self.init(clientRuntimeVersion: clientRuntimeVersion, crtVersion: crtVersion, services: services, excludeAWSServices: excludeAWSServices, excludeRuntimeTests: excludeRuntimeTests) { - // Returns the contents of the base package manifest stored in the bundle at `Resources/Package.Base.swift` - let basePackageName = "Package.Base" - - // Get the url for the base package manifest that is stored in the bundle - guard let url = Bundle.module.url(forResource: basePackageName, withExtension: "swift") else { - throw Error("Could not find \(basePackageName).swift in bundle") + self.init( + clientRuntimeVersion: clientRuntimeVersion, + crtVersion: crtVersion, + services: services, + excludeRuntimeTests: excludeRuntimeTests, + prefixContents: Self.contentReader(filename: "Package.Prefix"), + basePackageContents: Self.contentReader(filename: "Package.Base") + ) + } + + static func contentReader(filename: String) -> () throws -> String { + return { + // Get the url for the file that is stored in the bundle + guard let url = Bundle.module.url(forResource: filename, withExtension: "txt") else { + throw Error("Could not find \(filename).txt in bundle") } - + // Load the contents of the base package manifest let fileContents = try FileManager.default.loadContents(atPath: url.path) - + // Convert the base package manifest data to a string guard let fileText = String(data: fileContents, encoding: .utf8) else { - throw Error("Failed to create string from contents of file \(basePackageName).swift") + throw Error("Failed to create string from contents of file \(filename).txt") } - + return fileText } } - + // MARK: - Build /// Builds the contents of the package manifest file. func build() throws-> String { let contents = try [ + prefixContents(), + buildGeneratedContent(), basePackageContents(), - "", - buildGeneratedContent() ] return contents.joined(separator: .newline) } @@ -92,8 +99,6 @@ struct PackageManifestBuilder { // Add the generated content that defines the list of services to include buildServiceTargets(), "", - buildResolvedServices(), - "\n" ] return contents.joined(separator: .newline) } @@ -102,25 +107,20 @@ struct PackageManifestBuilder { /// /// - Returns: A pragma mark comment to provide separation between the non-generated (base) and generated content private func buildPragmaMark() -> String { - "// MARK: - Generated" + "// MARK: - Dynamic Content" } /// Builds the dependencies versions private func buildDependencies() -> String { """ - addDependencies( - clientRuntimeVersion: \(clientRuntimeVersion.description.wrappedInQuotes()), - crtVersion: \(crtVersion.description.wrappedInQuotes()) - ) + let clientRuntimeVersion: Version = \(clientRuntimeVersion.description.wrappedInQuotes()) + let crtVersion: Version = \(crtVersion.description.wrappedInQuotes()) """ } private func buildRuntimeTests() -> String { - return [ - "// Uncomment this line to exclude runtime unit tests", - (excludeRuntimeTests ? "" : "// ") + "excludeRuntimeUnitTests()" - ].joined(separator: .newline) + "let excludeRuntimeUnitTests = \(excludeRuntimeTests)" } /// Builds the list of services to include. @@ -131,14 +131,6 @@ struct PackageManifestBuilder { lines += ["let serviceTargets: [String] = ["] lines += services.map { " \($0.name.wrappedInQuotes())," } lines += ["]"] - lines += [""] - lines += ["// Uncomment this line to enable all services"] - lines += ["\(excludeAWSServices ? "// " : "")addAllServices()"] - return lines.joined(separator: .newline) } - - private func buildResolvedServices() -> String { - "addResolvedTargets()" - } } diff --git a/AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Resources/Package.Base.swift b/AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Resources/Package.Base.txt similarity index 58% rename from AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Resources/Package.Base.swift rename to AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Resources/Package.Base.txt index 45335c3472d..dd7afe70594 100644 --- a/AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Resources/Package.Base.swift +++ b/AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Resources/Package.Base.txt @@ -1,19 +1,6 @@ -// swift-tools-version:5.9 +// MARK: - Static Content -// -// Copyright Amazon.com Inc. or its affiliates. -// All Rights Reserved. -// -// SPDX-License-Identifier: Apache-2.0 -// - -// This manifest is auto-generated. Do not commit edits to this file; -// they will be overwritten. - -import Foundation -import PackageDescription - -// MARK: - Target Dependencies +// MARK: Target Dependencies extension Target.Dependency { // AWS modules @@ -46,7 +33,7 @@ extension Target.Dependency { static var smithyStreams: Self { .product(name: "SmithyStreams", package: "smithy-swift") } } -// MARK: - Base Package +// MARK: Base Package let package = Package( name: "aws-sdk-swift", @@ -56,15 +43,50 @@ let package = Package( .tvOS(.v13), .watchOS(.v6) ], - products: [ - .library(name: "AWSClientRuntime", targets: ["AWSClientRuntime"]), - .library(name: "AWSSDKCommon", targets: ["AWSSDKCommon"]), - .library(name: "AWSSDKEventStreamsAuth", targets: ["AWSSDKEventStreamsAuth"]), - .library(name: "AWSSDKHTTPAuth", targets: ["AWSSDKHTTPAuth"]), - .library(name: "AWSSDKIdentity", targets: ["AWSSDKIdentity"]), - .library(name: "AWSSDKChecksums", targets: ["AWSSDKChecksums"]), - ], - targets: [ + products: + runtimeProducts + + serviceTargets.map(productForService(_:)), + dependencies: + [clientRuntimeDependency, crtDependency, doccDependencyOrNil].compactMap { $0 }, + targets: + runtimeTargets + + runtimeTestTargets + + serviceTargets.map(target(_:)) + + serviceTargets.map(unitTestTarget(_:)) +) + +// MARK: Products + +private var runtimeProducts: [Product] { + ["AWSClientRuntime", "AWSSDKCommon", "AWSSDKEventStreamsAuth", "AWSSDKHTTPAuth", "AWSSDKIdentity", "AWSSDKChecksums"] + .map { .library(name: $0, targets: [$0]) } +} + +private func productForService(_ service: String) -> Product { + .library(name: service, targets: [service]) +} + +// MARK: Dependencies + +private var clientRuntimeDependency: Package.Dependency { + let path = "../smithy-swift" + let gitURL = "https://github.com/smithy-lang/smithy-swift" + let useLocalDeps = ProcessInfo.processInfo.environment["AWS_SWIFT_SDK_USE_LOCAL_DEPS"] != nil + return useLocalDeps ? .package(path: path) : .package(url: gitURL, exact: clientRuntimeVersion) +} + +private var crtDependency: Package.Dependency { + .package(url: "https://github.com/awslabs/aws-crt-swift", exact: crtVersion) +} + +private var doccDependencyOrNil: Package.Dependency? { + guard ProcessInfo.processInfo.environment["AWS_SWIFT_SDK_ENABLE_DOCC"] != nil else { return nil } + return .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0")} + +// MARK: Targets + +private var runtimeTargets: [Target] { + [ .target( name: "AWSSDKForSwift", path: "Sources/Core/AWSSDKForSwift", @@ -112,7 +134,13 @@ let package = Package( name: "AWSSDKChecksums", dependencies: [.crt, .smithy, .clientRuntime, .smithyChecksumsAPI, .smithyChecksums, .smithyHTTPAPI], path: "Sources/Core/AWSSDKChecksums/Sources" - ), + ) + ] +} + +private var runtimeTestTargets: [Target] { + guard !excludeRuntimeUnitTests else { return [] } + return [ .testTarget( name: "AWSClientRuntimeTests", dependencies: [.awsClientRuntime, .clientRuntime, .smithyTestUtils, .awsSDKCommon], @@ -134,119 +162,43 @@ let package = Package( dependencies: [.smithy, .smithyIdentity, "AWSSDKIdentity", .awsClientRuntime], path: "Sources/Core/AWSSDKIdentity/Tests/AWSSDKIdentityTests", resources: [.process("Resources")] - ) - ] -) - -// MARK: - Dependencies - -func addDependencies(clientRuntimeVersion: Version, crtVersion: Version) { - addClientRuntimeDependency(clientRuntimeVersion) - addCRTDependency(crtVersion) - addDoccDependency() -} - -func addClientRuntimeDependency(_ version: Version) { - let smithySwiftURL = "https://github.com/smithy-lang/smithy-swift" - let useLocalDeps = ProcessInfo.processInfo.environment["AWS_SWIFT_SDK_USE_LOCAL_DEPS"] != nil - let useMainDeps = ProcessInfo.processInfo.environment["AWS_SWIFT_SDK_USE_MAIN_DEPS"] != nil - switch (useLocalDeps, useMainDeps) { - case (true, true): - fatalError("Unable to determine which dependencies to use. Please only specify one of AWS_SWIFT_SDK_USE_LOCAL_DEPS or AWS_SWIFT_SDK_USE_MAIN_DEPS.") - case (true, false): - package.dependencies += [ - .package(path: "../smithy-swift") - ] - case (false, true): - package.dependencies += [ - .package(url: smithySwiftURL, branch: "main") - ] - case (false, false): - package.dependencies += [ - .package(url: smithySwiftURL, exact: version) - ] - } -} - -func addCRTDependency(_ version: Version) { - package.dependencies += [ - .package(url: "https://github.com/awslabs/aws-crt-swift", exact: version) - ] -} - -func addDoccDependency() { - guard ProcessInfo.processInfo.environment["AWS_SWIFT_SDK_ENABLE_DOCC"] != nil else { return } - package.dependencies += [ - .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0") - ] -} - -// MARK: - Services - -let serviceTargetDependencies: [Target.Dependency] = [ - .clientRuntime, - .awsClientRuntime, - .smithyRetriesAPI, - .smithyRetries, - .smithy, - .smithyIdentity, - .smithyIdentityAPI, - .smithyEventStreamsAPI, - .smithyEventStreamsAuthAPI, - .smithyEventStreams, - .smithyChecksumsAPI, - .smithyChecksums, - .smithyWaitersAPI, - .awsSDKCommon, - .awsSDKIdentity, - .awsSDKHTTPAuth, - .awsSDKEventStreamsAuth, - .awsSDKChecksums, -] - -func addServiceTarget(_ name: String) { - package.products += [ - .library(name: name, targets: [name]), - ] - package.targets += [ - .target( - name: name, - dependencies: serviceTargetDependencies, - path: "Sources/Services/\(name)/Sources/\(name)", - resources: [.process("Resources")] - ) - ] -} - -func addServiceUnitTestTarget(_ name: String) { - let testName = "\(name)Tests" - package.targets += [ - .testTarget( - name: "\(testName)", - dependencies: [.clientRuntime, .awsClientRuntime, .byName(name: name), .smithyTestUtils], - path: "Sources/Services/\(name)/Tests/\(testName)" - ) + ), ] } -var enabledServices = Set() -var enabledServiceUnitTests = Set() - -func addAllServices() { - enabledServices = Set(serviceTargets) - enabledServiceUnitTests = Set(serviceTargets) -} - -func excludeRuntimeUnitTests() { - package.targets.removeAll { - $0.name == "AWSClientRuntimeTests" || - $0.name == "AWSSDKHTTPAuthTests" || - $0.name == "AWSSDKEventStreamsAuthTests" || - $0.name == "AWSSDKIdentityTests" - } +private func target(_ service: String) -> Target { + .target( + name: service, + dependencies: [ + .clientRuntime, + .awsClientRuntime, + .smithyRetriesAPI, + .smithyRetries, + .smithy, + .smithyIdentity, + .smithyIdentityAPI, + .smithyEventStreamsAPI, + .smithyEventStreamsAuthAPI, + .smithyEventStreams, + .smithyChecksumsAPI, + .smithyChecksums, + .smithyWaitersAPI, + .awsSDKCommon, + .awsSDKIdentity, + .awsSDKHTTPAuth, + .awsSDKEventStreamsAuth, + .awsSDKChecksums, + ], + path: "Sources/Services/\(service)/Sources/\(service)", + resources: [.process("Resources")] + ) } -func addResolvedTargets() { - enabledServices.forEach(addServiceTarget) - enabledServiceUnitTests.forEach(addServiceUnitTestTarget) +private func unitTestTarget(_ service: String) -> Target { + let testName = "\(service)Tests" + return .testTarget( + name: "\(testName)", + dependencies: [.clientRuntime, .awsClientRuntime, .byName(name: service), .smithyTestUtils], + path: "Sources/Services/\(service)/Tests/\(testName)" + ) } diff --git a/AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Resources/Package.Prefix.txt b/AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Resources/Package.Prefix.txt new file mode 100644 index 00000000000..e213f85e5be --- /dev/null +++ b/AWSSDKSwiftCLI/Sources/AWSSDKSwiftCLI/Resources/Package.Prefix.txt @@ -0,0 +1,14 @@ +// swift-tools-version:5.9 + +// +// Copyright Amazon.com Inc. or its affiliates. +// All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 +// + +// This manifest is auto-generated. Do not commit edits to this file; +// they will be overwritten. + +import Foundation +import PackageDescription diff --git a/AWSSDKSwiftCLI/Tests/AWSSDKSwiftCLITests/Commands/GeneratePackageManifestTests.swift b/AWSSDKSwiftCLI/Tests/AWSSDKSwiftCLITests/Commands/GeneratePackageManifestTests.swift index 9eae63e02bd..a0bc5b4cb02 100644 --- a/AWSSDKSwiftCLI/Tests/AWSSDKSwiftCLITests/Commands/GeneratePackageManifestTests.swift +++ b/AWSSDKSwiftCLI/Tests/AWSSDKSwiftCLITests/Commands/GeneratePackageManifestTests.swift @@ -114,7 +114,6 @@ extension GeneratePackageManifest { clientRuntimeVersion: Version? = nil, crtVersion: Version? = nil, services: [String]? = nil, - excludeAWSServices: Bool = false, excludeRuntimeTests: Bool = false, buildPackageManifest: @escaping BuildPackageManifest = { (_,_,_) throws -> String in "" } ) -> GeneratePackageManifest { @@ -124,7 +123,6 @@ extension GeneratePackageManifest { clientRuntimeVersion: clientRuntimeVersion, crtVersion: crtVersion, services: services, - excludeAWSServices: excludeAWSServices, excludeRuntimeTests: excludeRuntimeTests, buildPackageManifest: buildPackageManifest ) diff --git a/AWSSDKSwiftCLI/Tests/AWSSDKSwiftCLITests/Models/PackageManifestBuilderTests.swift b/AWSSDKSwiftCLI/Tests/AWSSDKSwiftCLITests/Models/PackageManifestBuilderTests.swift index 4d9dde10a64..16f8b836ac1 100644 --- a/AWSSDKSwiftCLI/Tests/AWSSDKSwiftCLITests/Models/PackageManifestBuilderTests.swift +++ b/AWSSDKSwiftCLI/Tests/AWSSDKSwiftCLITests/Models/PackageManifestBuilderTests.swift @@ -11,17 +11,14 @@ import XCTest class PackageManifestBuilderTests: XCTestCase { let expected = """ - + -// MARK: - Generated +// MARK: - Dynamic Content -addDependencies( - clientRuntimeVersion: "1.2.3", - crtVersion: "4.5.6" -) +let clientRuntimeVersion: Version = "1.2.3" +let crtVersion: Version = "4.5.6" -// Uncomment this line to exclude runtime unit tests -// excludeRuntimeUnitTests() +let excludeRuntimeUnitTests = false let serviceTargets: [String] = [ "A", @@ -31,12 +28,7 @@ let serviceTargets: [String] = [ "E", ] -// Uncomment this line to enable all services -addAllServices() - -addResolvedTargets() - - + """ func testBuild() throws { @@ -44,11 +36,14 @@ addResolvedTargets() clientRuntimeVersion: .init("1.2.3"), crtVersion: .init("4.5.6"), services: ["A","B","C","D","E"].map { PackageManifestBuilder.Service(name: $0) }, - excludeAWSServices: false, excludeRuntimeTests: false, + prefixContents: { "" }, basePackageContents: { "" } ) let result = try! subject.build() + print("") + print(result) + print("") XCTAssertEqual(result, expected) } } diff --git a/Package.swift b/Package.swift index a9095000717..40f81f7a855 100644 --- a/Package.swift +++ b/Package.swift @@ -13,254 +13,12 @@ import Foundation import PackageDescription -// MARK: - Target Dependencies +// MARK: - Dynamic Content -extension Target.Dependency { - // AWS modules - static var awsClientRuntime: Self { "AWSClientRuntime" } - static var awsSDKCommon: Self { "AWSSDKCommon" } - static var awsSDKEventStreamsAuth: Self { "AWSSDKEventStreamsAuth" } - static var awsSDKHTTPAuth: Self { "AWSSDKHTTPAuth" } - static var awsSDKIdentity: Self { "AWSSDKIdentity" } - static var awsSDKChecksums: Self { "AWSSDKChecksums" } - - // CRT module - static var crt: Self { .product(name: "AwsCommonRuntimeKit", package: "aws-crt-swift") } - - // Smithy modules - static var clientRuntime: Self { .product(name: "ClientRuntime", package: "smithy-swift") } - static var smithy: Self { .product(name: "Smithy", package: "smithy-swift") } - static var smithyChecksumsAPI: Self { .product(name: "SmithyChecksumsAPI", package: "smithy-swift") } - static var smithyChecksums: Self { .product(name: "SmithyChecksums", package: "smithy-swift") } - static var smithyEventStreams: Self { .product(name: "SmithyEventStreams", package: "smithy-swift") } - static var smithyEventStreamsAPI: Self { .product(name: "SmithyEventStreamsAPI", package: "smithy-swift") } - static var smithyEventStreamsAuthAPI: Self { .product(name: "SmithyEventStreamsAuthAPI", package: "smithy-swift") } - static var smithyHTTPAPI: Self { .product(name: "SmithyHTTPAPI", package: "smithy-swift") } - static var smithyHTTPAuth: Self { .product(name: "SmithyHTTPAuth", package: "smithy-swift") } - static var smithyIdentity: Self { .product(name: "SmithyIdentity", package: "smithy-swift") } - static var smithyIdentityAPI: Self { .product(name: "SmithyIdentityAPI", package: "smithy-swift") } - static var smithyRetries: Self { .product(name: "SmithyRetries", package: "smithy-swift") } - static var smithyRetriesAPI: Self { .product(name: "SmithyRetriesAPI", package: "smithy-swift") } - static var smithyWaitersAPI: Self { .product(name: "SmithyWaitersAPI", package: "smithy-swift") } - static var smithyTestUtils: Self { .product(name: "SmithyTestUtil", package: "smithy-swift") } - static var smithyStreams: Self { .product(name: "SmithyStreams", package: "smithy-swift") } -} +let clientRuntimeVersion: Version = "0.75.0" +let crtVersion: Version = "0.36.0" -// MARK: - Base Package - -let package = Package( - name: "aws-sdk-swift", - platforms: [ - .macOS(.v10_15), - .iOS(.v13), - .tvOS(.v13), - .watchOS(.v6) - ], - products: [ - .library(name: "AWSClientRuntime", targets: ["AWSClientRuntime"]), - .library(name: "AWSSDKCommon", targets: ["AWSSDKCommon"]), - .library(name: "AWSSDKEventStreamsAuth", targets: ["AWSSDKEventStreamsAuth"]), - .library(name: "AWSSDKHTTPAuth", targets: ["AWSSDKHTTPAuth"]), - .library(name: "AWSSDKIdentity", targets: ["AWSSDKIdentity"]), - .library(name: "AWSSDKChecksums", targets: ["AWSSDKChecksums"]), - ], - targets: [ - .target( - name: "AWSSDKForSwift", - path: "Sources/Core/AWSSDKForSwift", - exclude: ["Documentation.docc/AWSSDKForSwift.md"] - ), - .target( - name: "AWSClientRuntime", - dependencies: [ - .crt, - .clientRuntime, - .smithyRetriesAPI, - .smithyRetries, - .smithyEventStreamsAPI, - .smithyEventStreamsAuthAPI, - .awsSDKCommon, - .awsSDKHTTPAuth, - .awsSDKIdentity - ], - path: "Sources/Core/AWSClientRuntime/Sources/AWSClientRuntime", - resources: [ - .process("Resources"), - ] - ), - .target( - name: "AWSSDKCommon", - dependencies: [.crt], - path: "Sources/Core/AWSSDKCommon/Sources" - ), - .target( - name: "AWSSDKEventStreamsAuth", - dependencies: [.smithyEventStreamsAPI, .smithyEventStreamsAuthAPI, .smithyEventStreams, .crt, .clientRuntime, "AWSSDKHTTPAuth"], - path: "Sources/Core/AWSSDKEventStreamsAuth/Sources" - ), - .target( - name: "AWSSDKHTTPAuth", - dependencies: [.crt, .smithy, .clientRuntime, .smithyHTTPAuth, "AWSSDKIdentity", "AWSSDKChecksums"], - path: "Sources/Core/AWSSDKHTTPAuth/Sources" - ), - .target( - name: "AWSSDKIdentity", - dependencies: [.crt, .smithy, .clientRuntime, .smithyIdentity, .smithyIdentityAPI, .smithyHTTPAPI, .awsSDKCommon], - path: "Sources/Core/AWSSDKIdentity/Sources" - ), - .target( - name: "AWSSDKChecksums", - dependencies: [.crt, .smithy, .clientRuntime, .smithyChecksumsAPI, .smithyChecksums, .smithyHTTPAPI], - path: "Sources/Core/AWSSDKChecksums/Sources" - ), - .testTarget( - name: "AWSClientRuntimeTests", - dependencies: [.awsClientRuntime, .clientRuntime, .smithyTestUtils, .awsSDKCommon], - path: "Sources/Core/AWSClientRuntime/Tests/AWSClientRuntimeTests", - resources: [.process("Resources")] - ), - .testTarget( - name: "AWSSDKEventStreamsAuthTests", - dependencies: ["AWSClientRuntime", "AWSSDKEventStreamsAuth", .smithyStreams, .smithyTestUtils], - path: "Sources/Core/AWSSDKEventStreamsAuth/Tests/AWSSDKEventStreamsAuthTests" - ), - .testTarget( - name: "AWSSDKHTTPAuthTests", - dependencies: ["AWSSDKHTTPAuth", "AWSClientRuntime", "AWSSDKEventStreamsAuth", .crt, .clientRuntime, .smithyTestUtils], - path: "Sources/Core/AWSSDKHTTPAuth/Tests/AWSSDKHTTPAuthTests" - ), - .testTarget( - name: "AWSSDKIdentityTests", - dependencies: [.smithy, .smithyIdentity, "AWSSDKIdentity", .awsClientRuntime], - path: "Sources/Core/AWSSDKIdentity/Tests/AWSSDKIdentityTests", - resources: [.process("Resources")] - ) - ] -) - -// MARK: - Dependencies - -func addDependencies(clientRuntimeVersion: Version, crtVersion: Version) { - addClientRuntimeDependency(clientRuntimeVersion) - addCRTDependency(crtVersion) - addDoccDependency() -} - -func addClientRuntimeDependency(_ version: Version) { - let smithySwiftURL = "https://github.com/smithy-lang/smithy-swift" - let useLocalDeps = ProcessInfo.processInfo.environment["AWS_SWIFT_SDK_USE_LOCAL_DEPS"] != nil - let useMainDeps = ProcessInfo.processInfo.environment["AWS_SWIFT_SDK_USE_MAIN_DEPS"] != nil - switch (useLocalDeps, useMainDeps) { - case (true, true): - fatalError("Unable to determine which dependencies to use. Please only specify one of AWS_SWIFT_SDK_USE_LOCAL_DEPS or AWS_SWIFT_SDK_USE_MAIN_DEPS.") - case (true, false): - package.dependencies += [ - .package(path: "../smithy-swift") - ] - case (false, true): - package.dependencies += [ - .package(url: smithySwiftURL, branch: "main") - ] - case (false, false): - package.dependencies += [ - .package(url: smithySwiftURL, exact: version) - ] - } -} - -func addCRTDependency(_ version: Version) { - package.dependencies += [ - .package(url: "https://github.com/awslabs/aws-crt-swift", exact: version) - ] -} - -func addDoccDependency() { - guard ProcessInfo.processInfo.environment["AWS_SWIFT_SDK_ENABLE_DOCC"] != nil else { return } - package.dependencies += [ - .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0") - ] -} - -// MARK: - Services - -let serviceTargetDependencies: [Target.Dependency] = [ - .clientRuntime, - .awsClientRuntime, - .smithyRetriesAPI, - .smithyRetries, - .smithy, - .smithyIdentity, - .smithyIdentityAPI, - .smithyEventStreamsAPI, - .smithyEventStreamsAuthAPI, - .smithyEventStreams, - .smithyChecksumsAPI, - .smithyChecksums, - .smithyWaitersAPI, - .awsSDKCommon, - .awsSDKIdentity, - .awsSDKHTTPAuth, - .awsSDKEventStreamsAuth, - .awsSDKChecksums, -] - -func addServiceTarget(_ name: String) { - package.products += [ - .library(name: name, targets: [name]), - ] - package.targets += [ - .target( - name: name, - dependencies: serviceTargetDependencies, - path: "Sources/Services/\(name)/Sources/\(name)", - resources: [.process("Resources")] - ) - ] -} - -func addServiceUnitTestTarget(_ name: String) { - let testName = "\(name)Tests" - package.targets += [ - .testTarget( - name: "\(testName)", - dependencies: [.clientRuntime, .awsClientRuntime, .byName(name: name), .smithyTestUtils], - path: "Sources/Services/\(name)/Tests/\(testName)" - ) - ] -} - -var enabledServices = Set() -var enabledServiceUnitTests = Set() - -func addAllServices() { - enabledServices = Set(serviceTargets) - enabledServiceUnitTests = Set(serviceTargets) -} - -func excludeRuntimeUnitTests() { - package.targets.removeAll { - $0.name == "AWSClientRuntimeTests" || - $0.name == "AWSSDKHTTPAuthTests" || - $0.name == "AWSSDKEventStreamsAuthTests" || - $0.name == "AWSSDKIdentityTests" - } -} - -func addResolvedTargets() { - enabledServices.forEach(addServiceTarget) - enabledServiceUnitTests.forEach(addServiceUnitTestTarget) -} - - -// MARK: - Generated - -addDependencies( - clientRuntimeVersion: "0.75.0", - crtVersion: "0.36.0" -) - -// Uncomment this line to exclude runtime unit tests -// excludeRuntimeUnitTests() +let excludeRuntimeUnitTests = false let serviceTargets: [String] = [ "AWSACM", @@ -649,8 +407,207 @@ let serviceTargets: [String] = [ "AWSXRay", ] -// Uncomment this line to enable all services -addAllServices() +// MARK: - Static Content + +// MARK: Target Dependencies + +extension Target.Dependency { + // AWS modules + static var awsClientRuntime: Self { "AWSClientRuntime" } + static var awsSDKCommon: Self { "AWSSDKCommon" } + static var awsSDKEventStreamsAuth: Self { "AWSSDKEventStreamsAuth" } + static var awsSDKHTTPAuth: Self { "AWSSDKHTTPAuth" } + static var awsSDKIdentity: Self { "AWSSDKIdentity" } + static var awsSDKChecksums: Self { "AWSSDKChecksums" } + + // CRT module + static var crt: Self { .product(name: "AwsCommonRuntimeKit", package: "aws-crt-swift") } + + // Smithy modules + static var clientRuntime: Self { .product(name: "ClientRuntime", package: "smithy-swift") } + static var smithy: Self { .product(name: "Smithy", package: "smithy-swift") } + static var smithyChecksumsAPI: Self { .product(name: "SmithyChecksumsAPI", package: "smithy-swift") } + static var smithyChecksums: Self { .product(name: "SmithyChecksums", package: "smithy-swift") } + static var smithyEventStreams: Self { .product(name: "SmithyEventStreams", package: "smithy-swift") } + static var smithyEventStreamsAPI: Self { .product(name: "SmithyEventStreamsAPI", package: "smithy-swift") } + static var smithyEventStreamsAuthAPI: Self { .product(name: "SmithyEventStreamsAuthAPI", package: "smithy-swift") } + static var smithyHTTPAPI: Self { .product(name: "SmithyHTTPAPI", package: "smithy-swift") } + static var smithyHTTPAuth: Self { .product(name: "SmithyHTTPAuth", package: "smithy-swift") } + static var smithyIdentity: Self { .product(name: "SmithyIdentity", package: "smithy-swift") } + static var smithyIdentityAPI: Self { .product(name: "SmithyIdentityAPI", package: "smithy-swift") } + static var smithyRetries: Self { .product(name: "SmithyRetries", package: "smithy-swift") } + static var smithyRetriesAPI: Self { .product(name: "SmithyRetriesAPI", package: "smithy-swift") } + static var smithyWaitersAPI: Self { .product(name: "SmithyWaitersAPI", package: "smithy-swift") } + static var smithyTestUtils: Self { .product(name: "SmithyTestUtil", package: "smithy-swift") } + static var smithyStreams: Self { .product(name: "SmithyStreams", package: "smithy-swift") } +} + +// MARK: Base Package + +let package = Package( + name: "aws-sdk-swift", + platforms: [ + .macOS(.v10_15), + .iOS(.v13), + .tvOS(.v13), + .watchOS(.v6) + ], + products: + runtimeProducts + + serviceTargets.map(productForService(_:)), + dependencies: + [clientRuntimeDependency, crtDependency, doccDependencyOrNil].compactMap { $0 }, + targets: + runtimeTargets + + runtimeTestTargets + + serviceTargets.map(target(_:)) + + serviceTargets.map(unitTestTarget(_:)) +) + +// MARK: Products + +private var runtimeProducts: [Product] { + ["AWSClientRuntime", "AWSSDKCommon", "AWSSDKEventStreamsAuth", "AWSSDKHTTPAuth", "AWSSDKIdentity", "AWSSDKChecksums"] + .map { .library(name: $0, targets: [$0]) } +} + +private func productForService(_ service: String) -> Product { + .library(name: service, targets: [service]) +} + +// MARK: Dependencies + +private var clientRuntimeDependency: Package.Dependency { + let path = "../smithy-swift" + let gitURL = "https://github.com/smithy-lang/smithy-swift" + let useLocalDeps = ProcessInfo.processInfo.environment["AWS_SWIFT_SDK_USE_LOCAL_DEPS"] != nil + return useLocalDeps ? .package(path: path) : .package(url: gitURL, exact: clientRuntimeVersion) +} + +private var crtDependency: Package.Dependency { + .package(url: "https://github.com/awslabs/aws-crt-swift", exact: crtVersion) +} + +private var doccDependencyOrNil: Package.Dependency? { + guard ProcessInfo.processInfo.environment["AWS_SWIFT_SDK_ENABLE_DOCC"] != nil else { return nil } + return .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0")} + +// MARK: Targets + +private var runtimeTargets: [Target] { + [ + .target( + name: "AWSSDKForSwift", + path: "Sources/Core/AWSSDKForSwift", + exclude: ["Documentation.docc/AWSSDKForSwift.md"] + ), + .target( + name: "AWSClientRuntime", + dependencies: [ + .crt, + .clientRuntime, + .smithyRetriesAPI, + .smithyRetries, + .smithyEventStreamsAPI, + .smithyEventStreamsAuthAPI, + .awsSDKCommon, + .awsSDKHTTPAuth, + .awsSDKIdentity + ], + path: "Sources/Core/AWSClientRuntime/Sources/AWSClientRuntime", + resources: [ + .process("Resources"), + ] + ), + .target( + name: "AWSSDKCommon", + dependencies: [.crt], + path: "Sources/Core/AWSSDKCommon/Sources" + ), + .target( + name: "AWSSDKEventStreamsAuth", + dependencies: [.smithyEventStreamsAPI, .smithyEventStreamsAuthAPI, .smithyEventStreams, .crt, .clientRuntime, "AWSSDKHTTPAuth"], + path: "Sources/Core/AWSSDKEventStreamsAuth/Sources" + ), + .target( + name: "AWSSDKHTTPAuth", + dependencies: [.crt, .smithy, .clientRuntime, .smithyHTTPAuth, "AWSSDKIdentity", "AWSSDKChecksums"], + path: "Sources/Core/AWSSDKHTTPAuth/Sources" + ), + .target( + name: "AWSSDKIdentity", + dependencies: [.crt, .smithy, .clientRuntime, .smithyIdentity, .smithyIdentityAPI, .smithyHTTPAPI, .awsSDKCommon], + path: "Sources/Core/AWSSDKIdentity/Sources" + ), + .target( + name: "AWSSDKChecksums", + dependencies: [.crt, .smithy, .clientRuntime, .smithyChecksumsAPI, .smithyChecksums, .smithyHTTPAPI], + path: "Sources/Core/AWSSDKChecksums/Sources" + ) + ] +} + +private var runtimeTestTargets: [Target] { + guard !excludeRuntimeUnitTests else { return [] } + return [ + .testTarget( + name: "AWSClientRuntimeTests", + dependencies: [.awsClientRuntime, .clientRuntime, .smithyTestUtils, .awsSDKCommon], + path: "Sources/Core/AWSClientRuntime/Tests/AWSClientRuntimeTests", + resources: [.process("Resources")] + ), + .testTarget( + name: "AWSSDKEventStreamsAuthTests", + dependencies: ["AWSClientRuntime", "AWSSDKEventStreamsAuth", .smithyStreams, .smithyTestUtils], + path: "Sources/Core/AWSSDKEventStreamsAuth/Tests/AWSSDKEventStreamsAuthTests" + ), + .testTarget( + name: "AWSSDKHTTPAuthTests", + dependencies: ["AWSSDKHTTPAuth", "AWSClientRuntime", "AWSSDKEventStreamsAuth", .crt, .clientRuntime, .smithyTestUtils], + path: "Sources/Core/AWSSDKHTTPAuth/Tests/AWSSDKHTTPAuthTests" + ), + .testTarget( + name: "AWSSDKIdentityTests", + dependencies: [.smithy, .smithyIdentity, "AWSSDKIdentity", .awsClientRuntime], + path: "Sources/Core/AWSSDKIdentity/Tests/AWSSDKIdentityTests", + resources: [.process("Resources")] + ), + ] +} -addResolvedTargets() +private func target(_ service: String) -> Target { + .target( + name: service, + dependencies: [ + .clientRuntime, + .awsClientRuntime, + .smithyRetriesAPI, + .smithyRetries, + .smithy, + .smithyIdentity, + .smithyIdentityAPI, + .smithyEventStreamsAPI, + .smithyEventStreamsAuthAPI, + .smithyEventStreams, + .smithyChecksumsAPI, + .smithyChecksums, + .smithyWaitersAPI, + .awsSDKCommon, + .awsSDKIdentity, + .awsSDKHTTPAuth, + .awsSDKEventStreamsAuth, + .awsSDKChecksums, + ], + path: "Sources/Services/\(service)/Sources/\(service)", + resources: [.process("Resources")] + ) +} +private func unitTestTarget(_ service: String) -> Target { + let testName = "\(service)Tests" + return .testTarget( + name: "\(testName)", + dependencies: [.clientRuntime, .awsClientRuntime, .byName(name: service), .smithyTestUtils], + path: "Sources/Services/\(service)/Tests/\(testName)" + ) +} diff --git a/scripts/ci_steps/prepare_protocol_and_unit_tests.sh b/scripts/ci_steps/prepare_protocol_and_unit_tests.sh index f25745227fb..f159349fa8a 100755 --- a/scripts/ci_steps/prepare_protocol_and_unit_tests.sh +++ b/scripts/ci_steps/prepare_protocol_and_unit_tests.sh @@ -2,8 +2,12 @@ set -e +# Get rid of the generated services +rm -rf Sources/Services/* + +# Regenerate the SDK manifest, with only runtime included cd AWSSDKSwiftCLI -swift run AWSSDKSwiftCLI generate-package-manifest --exclude-aws-services .. +swift run AWSSDKSwiftCLI generate-package-manifest .. cd .. # Dump the Package.swift contents to the logs