Skip to content

Commit 8fac1e6

Browse files
committed
Merge branch 'main' into hd-draft-multiple-content-types
2 parents 4b7015e + 81f8743 commit 8fac1e6

File tree

17 files changed

+216
-51
lines changed

17 files changed

+216
-51
lines changed

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ let package = Package(
6464
// Read OpenAPI documents
6565
.package(
6666
url: "https://github.com/mattpolzin/OpenAPIKit.git",
67-
exact: "3.0.0-alpha.7"
67+
exact: "3.0.0-alpha.9"
6868
),
6969
.package(
7070
url: "https://github.com/jpsim/Yams.git",

Sources/_OpenAPIGeneratorCore/Translator/ClientTranslator/translateClientMethod.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,19 +172,19 @@ extension ClientFileTranslator {
172172
.identifier(Constants.Operations.namespace)
173173
.dot(description.methodName)
174174

175-
let operationArg: FunctionArgumentDescription = .init(
175+
let operationArg = FunctionArgumentDescription(
176176
label: "forOperation",
177177
expression: operationTypeExpr.dot("id")
178178
)
179-
let inputArg: FunctionArgumentDescription = .init(
179+
let inputArg = FunctionArgumentDescription(
180180
label: "input",
181181
expression: .identifier(Constants.Operation.Input.variableName)
182182
)
183-
let serializerArg: FunctionArgumentDescription = .init(
183+
let serializerArg = FunctionArgumentDescription(
184184
label: "serializer",
185185
expression: try translateClientSerializer(description)
186186
)
187-
let deserializerArg: FunctionArgumentDescription = .init(
187+
let deserializerArg = FunctionArgumentDescription(
188188
label: "deserializer",
189189
expression: try translateClientDeserializer(description)
190190
)

Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateAllAnyOneOf.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ extension FileTranslator {
5555
switch type {
5656
case .allOf:
5757
// AllOf uses all required properties.
58-
propertyType = rawPropertyType
58+
propertyType = rawPropertyType.withOptional(false)
5959
case .anyOf:
6060
// AnyOf uses all optional properties.
61-
propertyType = rawPropertyType.asOptional
61+
propertyType = rawPropertyType.withOptional(true)
6262
}
6363
let comment: Comment? = .property(
6464
originalName: key,

Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateCodable.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ extension FileTranslator {
2929
let knownKeys =
3030
properties
3131
.map(\.originalName)
32-
let knownKeysFunctionArg: FunctionArgumentDescription = .init(
32+
let knownKeysFunctionArg = FunctionArgumentDescription(
3333
label: "knownKeys",
3434
expression: .literal(
3535
.array(

Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateObjectStruct.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ extension FileTranslator {
144144
typeUsage = valueTypeUsage.asDictionaryValue
145145
}
146146

147-
let extraProperty: PropertyBlueprint = .init(
147+
let extraProperty = PropertyBlueprint(
148148
comment: .doc("A container of undocumented properties."),
149149
originalName: "additionalProperties",
150150
typeUsage: typeUsage,

Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateStringEnum.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ extension FileTranslator {
7272
]
7373
)
7474
}
75-
let unknownCase: SwitchCaseDescription = .init(
75+
let unknownCase = SwitchCaseDescription(
7676
kind: .default,
7777
body: [
7878
.expression(
@@ -126,7 +126,7 @@ extension FileTranslator {
126126
]
127127
)
128128
}
129-
let unknownCase: SwitchCaseDescription = .init(
129+
let unknownCase = SwitchCaseDescription(
130130
kind: .case(
131131
.valueBinding(
132132
kind: .let,
@@ -147,7 +147,7 @@ extension FileTranslator {
147147
]
148148
)
149149

150-
let variableDescription: VariableDescription = .init(
150+
let variableDescription = VariableDescription(
151151
accessModifier: config.access,
152152
kind: .var,
153153
left: "rawValue",
@@ -186,7 +186,7 @@ extension FileTranslator {
186186
)
187187
}
188188

189-
let enumDescription: EnumDescription = .init(
189+
let enumDescription = EnumDescription(
190190
isFrozen: true,
191191
accessModifier: config.access,
192192
name: typeName.shortSwiftName,

Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateTypealias.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ extension FileTranslator {
2626
userDescription: String?,
2727
to existingTypeUsage: TypeUsage
2828
) throws -> Declaration {
29-
let typealiasDescription: TypealiasDescription = .init(
29+
let typealiasDescription = TypealiasDescription(
3030
accessModifier: config.access,
3131
name: typeName.shortSwiftName,
3232
existingType: existingTypeUsage.fullyQualifiedNonOptionalSwiftName

Sources/_OpenAPIGeneratorCore/Translator/Operations/OperationDescription.swift

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,20 @@ extension OperationDescription {
5959
/// - components: The components from the OpenAPI document.
6060
/// - asSwiftSafeName: A converted function from user-provided strings
6161
/// to strings safe to be used as a Swift identifier.
62+
/// - Throws: if `map` contains any references; see discussion for details.
63+
///
64+
/// This function will throw an error if `map` contains any references, because:
65+
/// 1. OpenAPI 3.0.3 only supports external path references (cf. 3.1, which supports internal references too)
66+
/// 2. Swift OpenAPI Generator currently only supports OpenAPI 3.0.x.
67+
/// 3. Swift OpenAPI Generator currently doesn't support external references.
6268
static func all(
6369
from map: OpenAPI.PathItem.Map,
6470
in components: OpenAPI.Components,
6571
asSwiftSafeName: @escaping (String) -> String
66-
) -> [OperationDescription] {
67-
map.flatMap { path, value in
68-
value.endpoints.map { endpoint in
72+
) throws -> [OperationDescription] {
73+
try map.flatMap { path, value in
74+
let value = try value.resolve(in: components)
75+
return value.endpoints.map { endpoint in
6976
OperationDescription(
7077
path: path,
7178
endpoint: endpoint,

Sources/_OpenAPIGeneratorCore/Translator/RequestBody/translateRequestBody.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ extension ClientFileTranslator {
201201
])
202202
)
203203
)
204-
let caseDesc: SwitchCaseDescription = .init(
204+
let caseDesc = SwitchCaseDescription(
205205
kind: .case(.dot(contentTypeIdentifier), ["value"]),
206206
body: [
207207
.expression(bodyAssignExpr)
@@ -210,7 +210,7 @@ extension ClientFileTranslator {
210210
return caseDesc
211211
}
212212
if !requestBody.request.required {
213-
let noneCase: SwitchCaseDescription = .init(
213+
let noneCase = SwitchCaseDescription(
214214
kind: .case(.dot("none")),
215215
body: [
216216
.expression(

Sources/_OpenAPIGeneratorCore/Translator/Responses/translateResponseOutcome.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,8 +349,7 @@ extension ServerFileTranslator {
349349
let responseVarDecl: Declaration = .variable(
350350
kind: .var,
351351
left: "response",
352-
type: "Response",
353-
right: .dot("init")
352+
right: .identifier("Response")
354353
.call([
355354
.init(label: "statusCode", expression: statusCodeExpr)
356355
])

Sources/_OpenAPIGeneratorCore/Translator/ServerTranslator/translateServerMethod.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -178,19 +178,19 @@ extension ServerFileTranslator {
178178
.identifier(Constants.Operations.namespace)
179179
.dot(description.methodName)
180180

181-
let operationArg: FunctionArgumentDescription = .init(
181+
let operationArg = FunctionArgumentDescription(
182182
label: "forOperation",
183183
expression: operationTypeExpr.dot("id")
184184
)
185-
let requestArg: FunctionArgumentDescription = .init(
185+
let requestArg = FunctionArgumentDescription(
186186
label: "request",
187187
expression: .identifier("request")
188188
)
189-
let metadataArg: FunctionArgumentDescription = .init(
189+
let metadataArg = FunctionArgumentDescription(
190190
label: "with",
191191
expression: .identifier("metadata")
192192
)
193-
let methodArg: FunctionArgumentDescription = .init(
193+
let methodArg = FunctionArgumentDescription(
194194
label: "using",
195195
expression: .closureInvocation(
196196
body: [
@@ -204,11 +204,11 @@ extension ServerFileTranslator {
204204
]
205205
)
206206
)
207-
let deserializerArg: FunctionArgumentDescription = .init(
207+
let deserializerArg = FunctionArgumentDescription(
208208
label: "deserializer",
209209
expression: try translateServerDeserializer(description)
210210
)
211-
let serializerArg: FunctionArgumentDescription = .init(
211+
let serializerArg = FunctionArgumentDescription(
212212
label: "serializer",
213213
expression: try translateServerSerializer(description)
214214
)

Sources/_OpenAPIGeneratorCore/Translator/TypesTranslator/TypesFileTranslator.swift

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,17 @@ struct TypesFileTranslator: FileTranslator {
4141
+ config.additionalImports
4242
.map { ImportDescription(moduleName: $0) }
4343

44-
let apiProtocol = translateAPIProtocol(doc.paths)
44+
let apiProtocol = try translateAPIProtocol(doc.paths)
4545

4646
let serversDecl = translateServers(doc.servers)
4747

4848
let components = try translateComponents(doc.components)
4949

50-
let operationDescriptions =
51-
OperationDescription
52-
.all(
53-
from: parsedOpenAPI.paths,
54-
in: doc.components,
55-
asSwiftSafeName: swiftSafeName
56-
)
50+
let operationDescriptions = try OperationDescription.all(
51+
from: parsedOpenAPI.paths,
52+
in: doc.components,
53+
asSwiftSafeName: swiftSafeName
54+
)
5755
let operations = try translateOperations(operationDescriptions)
5856

5957
let typesFile = FileDescription(

Sources/_OpenAPIGeneratorCore/Translator/TypesTranslator/translateAPIProtocol.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ extension TypesFileTranslator {
1919
/// per HTTP operation defined in the OpenAPI document.
2020
/// - Parameter paths: The paths object from the OpenAPI document.
2121
/// - Returns: A protocol declaration.
22-
func translateAPIProtocol(_ paths: OpenAPI.PathItem.Map) -> Declaration {
22+
/// - Throws: If `paths` contains any references.
23+
func translateAPIProtocol(_ paths: OpenAPI.PathItem.Map) throws -> Declaration {
2324

24-
let operations = OperationDescription.all(
25+
let operations = try OperationDescription.all(
2526
from: paths,
2627
in: components,
2728
asSwiftSafeName: swiftSafeName
@@ -30,7 +31,7 @@ extension TypesFileTranslator {
3031
operations
3132
.map(translateAPIProtocolDeclaration(operation:))
3233

33-
let protocolDescription: ProtocolDescription = .init(
34+
let protocolDescription = ProtocolDescription(
3435
accessModifier: config.access,
3536
name: Constants.APIProtocol.typeName,
3637
conformances: Constants.APIProtocol.conformances,

Tests/OpenAPIGeneratorCoreTests/Parser/Test_YamsParser.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,12 @@ final class Test_YamsParser: Test_Core {
118118
description: Success
119119
"""
120120

121-
let expected =
122-
"/foo.yaml: error: Expected to find `responses` key for the **GET** endpoint under `/system` but it is missing."
121+
let expected = """
122+
/foo.yaml: error: Found neither a $ref nor a PathItem in Document.paths['/system'].
123+
124+
PathItem could not be decoded because:
125+
Expected to find `responses` key for the **GET** endpoint under `/system` but it is missing..
126+
"""
123127
assertThrownError(try _test(yaml), expectedDiagnostic: expected)
124128
}
125129

Tests/OpenAPIGeneratorCoreTests/Renderer/Test_TextBasedRenderer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import XCTest
1616

1717
final class Test_TextBasedRenderer: XCTestCase {
1818

19-
var renderer: TextBasedRenderer = .init()
19+
var renderer = TextBasedRenderer()
2020

2121
func testComment() throws {
2222
try _test(

Tests/OpenAPIGeneratorReferenceTests/Resources/ReferenceSources/Petstore/Server.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ fileprivate extension UniversalServer where APIHandler: APIProtocol {
125125
switch output {
126126
case let .ok(value):
127127
suppressUnusedWarning(value)
128-
var response: Response = .init(statusCode: 200)
128+
var response = Response(statusCode: 200)
129129
suppressMutabilityWarning(&response)
130130
try converter.setHeaderFieldAsText(
131131
in: &response.headerFields,
@@ -152,7 +152,7 @@ fileprivate extension UniversalServer where APIHandler: APIProtocol {
152152
return response
153153
case let .`default`(statusCode, value):
154154
suppressUnusedWarning(value)
155-
var response: Response = .init(statusCode: statusCode)
155+
var response = Response(statusCode: statusCode)
156156
suppressMutabilityWarning(&response)
157157
switch value.body {
158158
case let .json(value):
@@ -219,7 +219,7 @@ fileprivate extension UniversalServer where APIHandler: APIProtocol {
219219
switch output {
220220
case let .created(value):
221221
suppressUnusedWarning(value)
222-
var response: Response = .init(statusCode: 201)
222+
var response = Response(statusCode: 201)
223223
suppressMutabilityWarning(&response)
224224
try converter.setHeaderFieldAsJSON(
225225
in: &response.headerFields,
@@ -241,7 +241,7 @@ fileprivate extension UniversalServer where APIHandler: APIProtocol {
241241
return response
242242
case let .badRequest(value):
243243
suppressUnusedWarning(value)
244-
var response: Response = .init(statusCode: 400)
244+
var response = Response(statusCode: 400)
245245
suppressMutabilityWarning(&response)
246246
try converter.setHeaderFieldAsText(
247247
in: &response.headerFields,
@@ -384,7 +384,7 @@ fileprivate extension UniversalServer where APIHandler: APIProtocol {
384384
switch output {
385385
case let .noContent(value):
386386
suppressUnusedWarning(value)
387-
var response: Response = .init(statusCode: 204)
387+
var response = Response(statusCode: 204)
388388
suppressMutabilityWarning(&response)
389389
return response
390390
case let .undocumented(statusCode, _): return .init(statusCode: statusCode)
@@ -441,12 +441,12 @@ fileprivate extension UniversalServer where APIHandler: APIProtocol {
441441
switch output {
442442
case let .noContent(value):
443443
suppressUnusedWarning(value)
444-
var response: Response = .init(statusCode: 204)
444+
var response = Response(statusCode: 204)
445445
suppressMutabilityWarning(&response)
446446
return response
447447
case let .badRequest(value):
448448
suppressUnusedWarning(value)
449-
var response: Response = .init(statusCode: 400)
449+
var response = Response(statusCode: 400)
450450
suppressMutabilityWarning(&response)
451451
switch value.body {
452452
case let .json(value):
@@ -517,7 +517,7 @@ fileprivate extension UniversalServer where APIHandler: APIProtocol {
517517
switch output {
518518
case let .ok(value):
519519
suppressUnusedWarning(value)
520-
var response: Response = .init(statusCode: 200)
520+
var response = Response(statusCode: 200)
521521
suppressMutabilityWarning(&response)
522522
switch value.body {
523523
case let .binary(value):
@@ -534,7 +534,7 @@ fileprivate extension UniversalServer where APIHandler: APIProtocol {
534534
return response
535535
case let .preconditionFailed(value):
536536
suppressUnusedWarning(value)
537-
var response: Response = .init(statusCode: 412)
537+
var response = Response(statusCode: 412)
538538
suppressMutabilityWarning(&response)
539539
switch value.body {
540540
case let .json(value):
@@ -551,7 +551,7 @@ fileprivate extension UniversalServer where APIHandler: APIProtocol {
551551
return response
552552
case let .internalServerError(value):
553553
suppressUnusedWarning(value)
554-
var response: Response = .init(statusCode: 500)
554+
var response = Response(statusCode: 500)
555555
suppressMutabilityWarning(&response)
556556
switch value.body {
557557
case let .text(value):

0 commit comments

Comments
 (0)