Skip to content

Commit a0dc0e2

Browse files
authored
[swift6] fix Vapor build, disable swift 5 tests on CI and enable more swift 6 tests on CI (#22805)
1 parent d19f0cd commit a0dc0e2

62 files changed

Lines changed: 446 additions & 983 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

bin/configs/swift6-vapor.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ generateAliasAsModel: true
77
additionalProperties:
88
projectName: PetstoreClient
99
useSPMFileStructure: true
10-
useClasses: true
10+
useClasses: false
1111
useBacktickEscapes: true
1212
mapFileBinaryToData: true

bitrise.yml

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,6 @@ workflows:
2727
set -e
2828
2929
./samples/client/petstore/swift6/swift6_test_all.sh
30-
- script@1.2.0:
31-
title: Run Swift5 tests
32-
inputs:
33-
- content: |
34-
#!/usr/bin/env bash
35-
36-
set -e
37-
38-
./samples/client/petstore/swift5/swift5_test_all.sh
3930
- script@1.2.0:
4031
title: Run swift-combine tests
4132
inputs:

modules/openapi-generator/src/main/resources/swift6/APIs.mustache

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ import Alamofire{{/useAlamofire}}
1919
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var basePath: String{{#useVapor}}
2020
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var customHeaders: HTTPHeaders
2121
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var apiClient: Vapor.Client?
22-
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var apiWrapper: (inout Vapor.ClientRequest) throws -> ()
23-
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var contentConfiguration{{/useVapor}}{{^useVapor}}
22+
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var apiWrapper: @Sendable (inout Vapor.ClientRequest) throws -> ()
23+
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var contentConfiguration: ContentConfiguration{{/useVapor}}{{^useVapor}}
2424
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var customHeaders: [String: String]
2525
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var credential: URLCredential?
2626
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var requestBuilderFactory: RequestBuilderFactory
@@ -49,8 +49,8 @@ import Alamofire{{/useAlamofire}}
4949
basePath: String = "{{{basePath}}}",{{#useVapor}}
5050
customHeaders: HTTPHeaders = [:],
5151
apiClient: Vapor.Client? = nil,
52-
apiWrapper: (inout Vapor.ClientRequest) throws -> () = { _ in },
53-
contentConfiguration = ContentConfiguration.default(){{/useVapor}}{{^useVapor}}
52+
apiWrapper: @escaping @Sendable (inout Vapor.ClientRequest) throws -> () = { _ in },
53+
contentConfiguration: ContentConfiguration = ContentConfiguration.default(){{/useVapor}}{{^useVapor}}
5454
customHeaders: [String: String] = [:],
5555
credential: URLCredential? = nil,
5656
requestBuilderFactory: RequestBuilderFactory = {{#useAlamofire}}AlamofireRequestBuilderFactory(){{/useAlamofire}}{{#useURLSession}}URLSessionRequestBuilderFactory(){{/useURLSession}},
@@ -63,10 +63,10 @@ import Alamofire{{/useAlamofire}}
6363
stringResponseSerializer: AnyResponseSerializer<String> = AnyResponseSerializer(StringResponseSerializer()){{/useAlamofire}}{{/useVapor}}
6464
) {
6565
self.basePath = basePath{{#useVapor}}
66-
customHeaders = customHeaders
67-
apiClient = apiClient
68-
apiWrapper = apiWrapper
69-
contentConfiguration = contentConfiguration{{/useVapor}}{{^useVapor}}
66+
self.customHeaders = customHeaders
67+
self.apiClient = apiClient
68+
self.apiWrapper = apiWrapper
69+
self.contentConfiguration = contentConfiguration{{/useVapor}}{{^useVapor}}
7070
self.customHeaders = customHeaders
7171
self.credential = credential
7272
self.requestBuilderFactory = requestBuilderFactory

modules/openapi-generator/src/main/resources/swift6/Extensions.mustache

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -236,13 +236,11 @@ extension RequestBuilder {
236236
}
237237
}{{/usePromiseKit}}{{#useVapor}}
238238

239-
extension UUID: Content { }
239+
extension UUID: @retroactive Content { }
240240

241-
extension URL: Content { }
241+
extension URL: @retroactive Content { }
242242

243-
extension Bool: Content { }
244-
245-
extension Set: ResponseEncodable where Element: Content {
243+
extension Set: @retroactive ResponseEncodable where Element: Content {
246244
public func encodeResponse(for request: Vapor.Request) -> EventLoopFuture<Vapor.Response> {
247245
let response = Vapor.Response()
248246
do {
@@ -254,7 +252,15 @@ extension Set: ResponseEncodable where Element: Content {
254252
}
255253
}
256254

257-
extension Set: RequestDecodable where Element: Content {
255+
extension Set: @retroactive AsyncResponseEncodable where Element: Content {
256+
public func encodeResponse(for request: Vapor.Request) async throws -> Vapor.Response {
257+
let response = Vapor.Response()
258+
try response.content.encode(Array(self))
259+
return response
260+
}
261+
}
262+
263+
extension Set: @retroactive RequestDecodable where Element: Content {
258264
public static func decodeRequest(_ request: Vapor.Request) -> EventLoopFuture<Self> {
259265
do {
260266
let content = try request.content.decode([Element].self)
@@ -265,6 +271,13 @@ extension Set: RequestDecodable where Element: Content {
265271
}
266272
}
267273

268-
extension Set: Content where Element: Content { }
274+
extension Set: @retroactive AsyncRequestDecodable where Element: Content {
275+
public static func decodeRequest(_ request: Vapor.Request) async throws -> Self {
276+
let content = try request.content.decode([Element].self)
277+
return Set(content)
278+
}
279+
}
280+
281+
extension Set: @retroactive Content where Element: Content { }
269282

270283
extension JSONValue: Content {}{{/useVapor}}

modules/openapi-generator/src/main/resources/swift6/Package.swift.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,15 @@ let package = Package(
3434
.package(url: "https://github.com/ReactiveX/RxSwift", .upToNextMajor(from: "6.8.0")),
3535
{{/useRxSwift}}
3636
{{#useVapor}}
37-
.package(url: "https://github.com/vapor/vapor", from: "4.0.0")
37+
.package(url: "https://github.com/vapor/vapor", from: "4.99.0"),
3838
{{/useVapor}}
3939
],
4040
targets: [
4141
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
4242
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
4343
.target(
4444
name: "{{projectName}}",
45-
dependencies: [{{#useVapor}}"Vapor", {{/useVapor}}{{#useAlamofire}}"Alamofire", {{/useAlamofire}}{{#usePromiseKit}}"PromiseKit", {{/usePromiseKit}}{{#useRxSwift}}"RxSwift"{{/useRxSwift}}],
45+
dependencies: [{{#useVapor}}.product(name: "Vapor", package: "vapor"){{/useVapor}}{{#useAlamofire}}"Alamofire", {{/useAlamofire}}{{#usePromiseKit}}"PromiseKit", {{/usePromiseKit}}{{#useRxSwift}}"RxSwift"{{/useRxSwift}}],
4646
path: "{{swiftPackagePath}}{{^swiftPackagePath}}{{#useSPMFileStructure}}Sources/{{projectName}}{{/useSPMFileStructure}}{{^useSPMFileStructure}}{{projectName}}/Classes{{/useSPMFileStructure}}{{/swiftPackagePath}}"
4747
),
4848
],

modules/openapi-generator/src/main/resources/swift6/api.mustache

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -355,19 +355,19 @@ extension {{projectName}}API {
355355
{{#isDeprecated}}
356356
@available(*, deprecated, message: "This operation is deprecated.")
357357
{{/isDeprecated}}
358-
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} {{#apiStaticMethod}}class {{/apiStaticMethod}}func {{operationId}}Raw({{#allParams}}{{paramName}}: {{#isEnum}}{{#isArray}}[{{enumName}}_{{operationId}}]{{/isArray}}{{^isArray}}{{#isContainer}}{{{dataType}}}{{/isContainer}}{{^isContainer}}{{{datatypeWithEnum}}}_{{operationId}}{{/isContainer}}{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}headers: HTTPHeaders = {{projectName}}APIConfiguration.shared.customHeaders, beforeSend: (inout ClientRequest) throws -> () = { _ in }) -> EventLoopFuture<ClientResponse> {
358+
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} {{#apiStaticMethod}}class {{/apiStaticMethod}}func {{operationId}}Raw({{#allParams}}{{paramName}}: {{#isEnum}}{{#isArray}}[{{enumName}}_{{operationId}}]{{/isArray}}{{^isArray}}{{#isContainer}}{{{dataType}}}{{/isContainer}}{{^isContainer}}{{{datatypeWithEnum}}}_{{operationId}}{{/isContainer}}{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}headers: HTTPHeaders? = nil, apiConfiguration: {{projectName}}APIConfiguration = {{projectName}}APIConfiguration.shared, beforeSend: (inout ClientRequest) throws -> () = { _ in }) -> EventLoopFuture<ClientResponse> {
359359
{{^pathParams}}let{{/pathParams}}{{#pathParams}}{{#-first}}var{{/-first}}{{/pathParams}} localVariablePath = "{{{path}}}"{{#pathParams}}
360360
let {{paramName}}PreEscape = String(describing: {{#isEnum}}{{paramName}}{{#isContainer}}{{{dataType}}}{{/isContainer}}{{^isContainer}}.rawValue{{/isContainer}}{{/isEnum}}{{^isEnum}}{{paramName}}{{/isEnum}})
361361
let {{paramName}}PostEscape = {{paramName}}PreEscape.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? ""
362362
localVariablePath = localVariablePath.replacingOccurrences(of: "{{=<% %>=}}{<%baseName%>}<%={{ }}=%>", with: {{paramName}}PostEscape, options: .literal, range: nil){{/pathParams}}
363363
let localVariableURLString = apiConfiguration.basePath + localVariablePath
364364

365-
guard let localVariableApiClient = {{#swiftUseApiNamespace}}{{projectName}}API.{{/swiftUseApiNamespace}}apiConfiguration.apiClient else {
365+
guard let localVariableApiClient = apiConfiguration.apiClient else {
366366
fatalError("apiConfiguration.apiClient is not set.")
367367
}
368368

369-
return localVariableApiClient.send(.{{httpMethod}}, headers: headers, to: URI(string: localVariableURLString)) { localVariableRequest in
370-
try {{#swiftUseApiNamespace}}{{projectName}}API.{{/swiftUseApiNamespace}}Configuration.apiWrapper(&localVariableRequest)
369+
return localVariableApiClient.send(.{{httpMethod}}, headers: headers ?? apiConfiguration.customHeaders, to: URI(string: localVariableURLString)) { localVariableRequest in
370+
try apiConfiguration.apiWrapper(&localVariableRequest)
371371
{{#hasHeaderParams}}{{#headerParams}}
372372
localVariableRequest.headers.add(name: "{{baseName}}", value: {{#isArray}}{{paramName}}{{^required}}?{{/required}}.map { $0{{#isEnum}}.rawValue{{/isEnum}}.description }.description{{/isArray}}{{^isArray}}{{#isEnum}}{{paramName}}{{^required}}?{{/required}}.rawValue.description{{/isEnum}}{{^isEnum}}{{paramName}}{{^required}}?{{/required}}.description{{/isEnum}}{{/isArray}}{{^required}} ?? ""{{/required}})
373373
{{/headerParams}}{{/hasHeaderParams}}
@@ -435,8 +435,8 @@ extension {{projectName}}API {
435435
{{#isDeprecated}}
436436
@available(*, deprecated, message: "This operation is deprecated.")
437437
{{/isDeprecated}}
438-
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} {{#apiStaticMethod}}class {{/apiStaticMethod}}func {{operationId}}({{#allParams}}{{paramName}}: {{#isEnum}}{{#isArray}}[{{enumName}}_{{operationId}}]{{/isArray}}{{^isArray}}{{#isContainer}}{{{dataType}}}{{/isContainer}}{{^isContainer}}{{{datatypeWithEnum}}}_{{operationId}}{{/isContainer}}{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}headers: HTTPHeaders = {{projectName}}APIConfiguration.shared.customHeaders, beforeSend: (inout ClientRequest) throws -> () = { _ in }) -> EventLoopFuture<{{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}}> {
439-
return {{operationId}}Raw({{#allParams}}{{paramName}}: {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}headers: headers, beforeSend: beforeSend).flatMapThrowing { response -> {{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}} in
438+
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} {{#apiStaticMethod}}class {{/apiStaticMethod}}func {{operationId}}({{#allParams}}{{paramName}}: {{#isEnum}}{{#isArray}}[{{enumName}}_{{operationId}}]{{/isArray}}{{^isArray}}{{#isContainer}}{{{dataType}}}{{/isContainer}}{{^isContainer}}{{{datatypeWithEnum}}}_{{operationId}}{{/isContainer}}{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}headers: HTTPHeaders? = nil, apiConfiguration: {{projectName}}APIConfiguration = {{projectName}}APIConfiguration.shared, beforeSend: (inout ClientRequest) throws -> () = { _ in }) -> EventLoopFuture<{{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}}> {
439+
return {{operationId}}Raw({{#allParams}}{{paramName}}: {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}headers: headers, apiConfiguration: apiConfiguration, beforeSend: beforeSend).flatMapThrowing { response -> {{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}} in
440440
switch response.status.code {
441441
{{#responses}}
442442
{{#isDefault}}default{{/isDefault}}{{^isDefault}}case {{code}}{{/isDefault}}:

samples/client/petstore/swift6/apiNonStaticMethod/SwaggerClientTests/SwaggerClient.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

samples/client/petstore/swift6/swift6_test_all.sh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,20 @@ DIRECTORY=`dirname $0`
1212
(cd $DIRECTORY/default/ && ./run_spmbuild.sh)
1313
(cd $DIRECTORY/objcCompatible/ && ./run_spmbuild.sh)
1414
(cd $DIRECTORY/oneOf/ && ./run_spmbuild.sh)
15-
# (cd $DIRECTORY/promisekitLibrary/ && ./run_spmbuild.sh) # Commented to save time in CI, building Swift5 and Swift6 is taking too much time, and making CI fail
15+
(cd $DIRECTORY/promisekitLibrary/ && ./run_spmbuild.sh)
1616
(cd $DIRECTORY/resultLibrary/ && ./run_spmbuild.sh)
1717
(cd $DIRECTORY/rxswiftLibrary/ && ./run_spmbuild.sh)
1818
(cd $DIRECTORY/urlsessionLibrary/ && ./run_spmbuild.sh)
1919
(cd $DIRECTORY/validation/ && ./run_spmbuild.sh)
20-
# (cd $DIRECTORY/vaporLibrary/ && ./run_spmbuild.sh) # Commented because it's not working
20+
(cd $DIRECTORY/vaporLibrary/ && ./run_spmbuild.sh)
2121

2222
# example project with unit tests
2323
(cd $DIRECTORY/alamofireLibrary/SwaggerClientTests/ && ./run_xcodebuild.sh)
2424
(cd $DIRECTORY/apiNonStaticMethod/SwaggerClientTests/ && ./run_xcodebuild.sh)
2525
(cd $DIRECTORY/asyncAwaitLibrary/SwaggerClientTests/ && ./run_xcodebuild.sh)
26-
# (cd $DIRECTORY/combineLibrary/SwaggerClientTests/ && ./run_xcodebuild.sh) # Commented to save time in CI, building Swift5 and Swift6 is taking too much time, and making CI fail
26+
(cd $DIRECTORY/combineLibrary/SwaggerClientTests/ && ./run_xcodebuild.sh)
2727
(cd $DIRECTORY/combineDeferredLibrary/SwaggerClientTests/ && ./run_xcodebuild.sh)
2828
(cd $DIRECTORY/default/SwaggerClientTests/ && ./run_xcodebuild.sh)
29-
# (cd $DIRECTORY/promisekitLibrary/SwaggerClientTests/ && ./run_xcodebuild.sh) # Commented to save time in CI, building Swift5 and Swift6 is taking too much time, and making CI fail
29+
(cd $DIRECTORY/promisekitLibrary/SwaggerClientTests/ && ./run_xcodebuild.sh)
3030
(cd $DIRECTORY/rxswiftLibrary/SwaggerClientTests/ && ./run_xcodebuild.sh)
3131
(cd $DIRECTORY/urlsessionLibrary/SwaggerClientTests/ && ./run_xcodebuild.sh)

0 commit comments

Comments
 (0)