Skip to content

Commit 3894aa4

Browse files
authored
[swift5] Add useSPMFileStructure (#9074)
* [swift5] Add useSPMFileStructure Signed-off-by: Ayman Bagabas <[email protected]> * [swift5] Add swiftPackagePath Prioritize swiftPackagePath over useSPMFileStructure * [swift5] Add cli options and update docs * [swift5] Fix tests * [swift5] Update XcodeGen source path * [swift5] Update samples and docs Add useSPMFileStructure to URLSession library
1 parent 139e9e4 commit 3894aa4

File tree

125 files changed

+4174
-65
lines changed

Some content is hidden

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

125 files changed

+4174
-65
lines changed

bin/configs/swift5-urlsessionLibrary.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ additionalProperties:
99
podSummary: PetstoreClient
1010
projectName: PetstoreClient
1111
podHomepage: https://github.com/openapitools/openapi-generator
12+
useSPMFileStructure: true

docs/generators/swift5.md

Lines changed: 2 additions & 0 deletions

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift5ClientCodegen.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ public class Swift5ClientCodegen extends DefaultCodegen implements CodegenConfig
6161
public static final String SWIFT_USE_API_NAMESPACE = "swiftUseApiNamespace";
6262
public static final String DEFAULT_POD_AUTHORS = "OpenAPI Generator";
6363
public static final String LENIENT_TYPE_CAST = "lenientTypeCast";
64+
public static final String USE_SPM_FILE_STRUCTURE = "useSPMFileStructure";
65+
public static final String SWIFT_PACKAGE_PATH = "swiftPackagePath";
6466
protected static final String LIBRARY_ALAMOFIRE = "alamofire";
6567
protected static final String LIBRARY_URLSESSION = "urlsession";
6668
protected static final String RESPONSE_LIBRARY_PROMISE_KIT = "PromiseKit";
@@ -73,9 +75,11 @@ public class Swift5ClientCodegen extends DefaultCodegen implements CodegenConfig
7375
protected boolean objcCompatible = false;
7476
protected boolean lenientTypeCast = false;
7577
protected boolean readonlyProperties = false;
76-
protected boolean swiftUseApiNamespace;
78+
protected boolean swiftUseApiNamespace = false;
79+
protected boolean useSPMFileStructure = false;
80+
protected String swiftPackagePath = "Classes" + File.separator + "OpenAPIs";
7781
protected String[] responseAs = new String[0];
78-
protected String sourceFolder = "Classes" + File.separator + "OpenAPIs";
82+
protected String sourceFolder = swiftPackagePath;
7983
protected HashSet objcReservedWords;
8084
protected String apiDocPath = "docs/";
8185
protected String modelDocPath = "docs/";
@@ -261,6 +265,10 @@ public Swift5ClientCodegen() {
261265
.defaultValue(Boolean.FALSE.toString()));
262266

263267
cliOptions.add(new CliOption(CodegenConstants.API_NAME_PREFIX, CodegenConstants.API_NAME_PREFIX_DESC));
268+
cliOptions.add(new CliOption(USE_SPM_FILE_STRUCTURE, "Use SPM file structure"
269+
+ " and set the source path to Sources" + File.separator + "{{projectName}} (default: false)."));
270+
cliOptions.add(new CliOption(SWIFT_PACKAGE_PATH, "Set a custom source path instead of "
271+
+ projectName + File.separator + "Classes" + File.separator + "OpenAPIs" + "."));
264272

265273
supportedLibraries.put(LIBRARY_URLSESSION, "[DEFAULT] HTTP client: URLSession");
266274
supportedLibraries.put(LIBRARY_ALAMOFIRE, "HTTP client: Alamofire");
@@ -414,6 +422,16 @@ public void processOpts() {
414422
additionalProperties.put(POD_AUTHORS, DEFAULT_POD_AUTHORS);
415423
}
416424

425+
if (additionalProperties.containsKey(USE_SPM_FILE_STRUCTURE)) {
426+
setUseSPMFileStructure(convertPropertyToBooleanAndWriteBack(USE_SPM_FILE_STRUCTURE));
427+
sourceFolder = "Sources" + File.separator + projectName;
428+
}
429+
430+
if (additionalProperties.containsKey(SWIFT_PACKAGE_PATH) && ((String)additionalProperties.get(SWIFT_PACKAGE_PATH)).length() > 0) {
431+
setSwiftPackagePath((String)additionalProperties.get(SWIFT_PACKAGE_PATH));
432+
sourceFolder = swiftPackagePath;
433+
}
434+
417435
setLenientTypeCast(convertPropertyToBooleanAndWriteBack(LENIENT_TYPE_CAST));
418436

419437
// make api and model doc path available in mustache template
@@ -806,6 +824,14 @@ public void setSwiftUseApiNamespace(boolean swiftUseApiNamespace) {
806824
this.swiftUseApiNamespace = swiftUseApiNamespace;
807825
}
808826

827+
public void setUseSPMFileStructure(boolean useSPMFileStructure) {
828+
this.useSPMFileStructure = useSPMFileStructure;
829+
}
830+
831+
public void setSwiftPackagePath(String swiftPackagePath) {
832+
this.swiftPackagePath = swiftPackagePath;
833+
}
834+
809835
@Override
810836
public String toEnumValue(String value, String datatype) {
811837
// for string, array of string

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ let package = Package(
3535
.target(
3636
name: "{{projectName}}",
3737
dependencies: [{{#useAlamofire}}"Alamofire", {{/useAlamofire}}{{#usePromiseKit}}"PromiseKit", {{/usePromiseKit}}{{#useRxSwift}}"RxSwift"{{/useRxSwift}}],
38-
path: "{{projectName}}/Classes"
38+
path: "{{#swiftPackagePath}}{{swiftPackagePath}}{{/swiftPackagePath}}{{^swiftPackagePath}}{{#useSPMFileStructure}}Sources/{{projectName}}{{/useSPMFileStructure}}{{^useSPMFileStructure}}{{projectName}}/Classes{{/useSPMFileStructure}}{{/swiftPackagePath}}"
3939
),
4040
]
4141
)

modules/openapi-generator/src/main/resources/swift5/Podspec.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Pod::Spec.new do |s|
2525
{{#podDocumentationURL}}
2626
s.documentation_url = '{{podDocumentationURL}}'
2727
{{/podDocumentationURL}}
28-
s.source_files = '{{projectName}}/Classes/**/*.swift'
28+
s.source_files = '{{#swiftPackagePath}}{{swiftPackagePath}}{{/swiftPackagePath}}{{^swiftPackagePath}}{{#useSPMFileStructure}}Sources/{{projectName}}{{/useSPMFileStructure}}{{^useSPMFileStructure}}{{projectName}}/Classes{{/useSPMFileStructure}}{{/swiftPackagePath}}/**/*.swift'
2929
{{#usePromiseKit}}
3030
s.dependency 'PromiseKit/CorePromise', '~> 6.13.1'
3131
{{/usePromiseKit}}

modules/openapi-generator/src/main/resources/swift5/XcodeGen.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ targets:
44
type: framework
55
platform: iOS
66
deploymentTarget: "9.0"
7-
sources: [{{projectName}}]
7+
sources: [{{#swiftPackagePath}}{{swiftPackagePath}}{{/swiftPackagePath}}{{^swiftPackagePath}}{{#useSPMFileStructure}}Sources{{/useSPMFileStructure}}{{^useSPMFileStructure}}{{projectName}}{{/useSPMFileStructure}}{{/swiftPackagePath}}]
88
info:
99
path: ./Info.plist
1010
version: {{#podVersion}}{{podVersion}}{{/podVersion}}{{^podVersion}}{{#apiInfo}}{{version}}{{/apiInfo}}{{^apiInfo}}}0.0.1{{/apiInfo}}{{/podVersion}}

modules/openapi-generator/src/test/java/org/openapitools/codegen/options/Swift5OptionsProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.openapitools.codegen.CodegenConstants;
2222
import org.openapitools.codegen.languages.Swift5ClientCodegen;
2323

24+
import java.io.File;
2425
import java.util.Map;
2526

2627
public class Swift5OptionsProvider implements OptionsProvider {
@@ -48,6 +49,8 @@ public class Swift5OptionsProvider implements OptionsProvider {
4849
public static final String ALLOW_UNICODE_IDENTIFIERS_VALUE = "false";
4950
public static final String PREPEND_FORM_OR_BODY_PARAMETERS_VALUE = "true";
5051
public static final String LIBRARY_VALUE = "alamofire";
52+
public static final String USE_SPM_FILE_STRUCTURE_VALUE = "false";
53+
public static final String SWIFT_PACKAGE_PATH_VALUE = "";
5154

5255
@Override
5356
public String getLanguage() {
@@ -84,6 +87,8 @@ public Map<String, String> createOptions() {
8487
.put(CodegenConstants.LIBRARY, LIBRARY_VALUE)
8588
.put(CodegenConstants.LEGACY_DISCRIMINATOR_BEHAVIOR, "true")
8689
.put(CodegenConstants.DISALLOW_ADDITIONAL_PROPERTIES_IF_NOT_PRESENT, "true")
90+
.put(Swift5ClientCodegen.USE_SPM_FILE_STRUCTURE, USE_SPM_FILE_STRUCTURE_VALUE)
91+
.put(Swift5ClientCodegen.SWIFT_PACKAGE_PATH, SWIFT_PACKAGE_PATH_VALUE)
8792
.build();
8893
}
8994

samples/client/petstore/swift5/urlsessionLibrary/.openapi-generator/FILES

Lines changed: 57 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2,64 +2,64 @@
22
Cartfile
33
Package.swift
44
PetstoreClient.podspec
5-
PetstoreClient/Classes/OpenAPIs/APIHelper.swift
6-
PetstoreClient/Classes/OpenAPIs/APIs.swift
7-
PetstoreClient/Classes/OpenAPIs/APIs/AnotherFakeAPI.swift
8-
PetstoreClient/Classes/OpenAPIs/APIs/FakeAPI.swift
9-
PetstoreClient/Classes/OpenAPIs/APIs/FakeClassnameTags123API.swift
10-
PetstoreClient/Classes/OpenAPIs/APIs/PetAPI.swift
11-
PetstoreClient/Classes/OpenAPIs/APIs/StoreAPI.swift
12-
PetstoreClient/Classes/OpenAPIs/APIs/UserAPI.swift
13-
PetstoreClient/Classes/OpenAPIs/CodableHelper.swift
14-
PetstoreClient/Classes/OpenAPIs/Configuration.swift
15-
PetstoreClient/Classes/OpenAPIs/Extensions.swift
16-
PetstoreClient/Classes/OpenAPIs/JSONDataEncoding.swift
17-
PetstoreClient/Classes/OpenAPIs/JSONEncodingHelper.swift
18-
PetstoreClient/Classes/OpenAPIs/Models.swift
19-
PetstoreClient/Classes/OpenAPIs/Models/AdditionalPropertiesClass.swift
20-
PetstoreClient/Classes/OpenAPIs/Models/Animal.swift
21-
PetstoreClient/Classes/OpenAPIs/Models/AnimalFarm.swift
22-
PetstoreClient/Classes/OpenAPIs/Models/ApiResponse.swift
23-
PetstoreClient/Classes/OpenAPIs/Models/ArrayOfArrayOfNumberOnly.swift
24-
PetstoreClient/Classes/OpenAPIs/Models/ArrayOfNumberOnly.swift
25-
PetstoreClient/Classes/OpenAPIs/Models/ArrayTest.swift
26-
PetstoreClient/Classes/OpenAPIs/Models/Capitalization.swift
27-
PetstoreClient/Classes/OpenAPIs/Models/Cat.swift
28-
PetstoreClient/Classes/OpenAPIs/Models/CatAllOf.swift
29-
PetstoreClient/Classes/OpenAPIs/Models/Category.swift
30-
PetstoreClient/Classes/OpenAPIs/Models/ClassModel.swift
31-
PetstoreClient/Classes/OpenAPIs/Models/Client.swift
32-
PetstoreClient/Classes/OpenAPIs/Models/Dog.swift
33-
PetstoreClient/Classes/OpenAPIs/Models/DogAllOf.swift
34-
PetstoreClient/Classes/OpenAPIs/Models/EnumArrays.swift
35-
PetstoreClient/Classes/OpenAPIs/Models/EnumClass.swift
36-
PetstoreClient/Classes/OpenAPIs/Models/EnumTest.swift
37-
PetstoreClient/Classes/OpenAPIs/Models/File.swift
38-
PetstoreClient/Classes/OpenAPIs/Models/FileSchemaTestClass.swift
39-
PetstoreClient/Classes/OpenAPIs/Models/FormatTest.swift
40-
PetstoreClient/Classes/OpenAPIs/Models/HasOnlyReadOnly.swift
41-
PetstoreClient/Classes/OpenAPIs/Models/List.swift
42-
PetstoreClient/Classes/OpenAPIs/Models/MapTest.swift
43-
PetstoreClient/Classes/OpenAPIs/Models/MixedPropertiesAndAdditionalPropertiesClass.swift
44-
PetstoreClient/Classes/OpenAPIs/Models/Model200Response.swift
45-
PetstoreClient/Classes/OpenAPIs/Models/Name.swift
46-
PetstoreClient/Classes/OpenAPIs/Models/NumberOnly.swift
47-
PetstoreClient/Classes/OpenAPIs/Models/Order.swift
48-
PetstoreClient/Classes/OpenAPIs/Models/OuterComposite.swift
49-
PetstoreClient/Classes/OpenAPIs/Models/OuterEnum.swift
50-
PetstoreClient/Classes/OpenAPIs/Models/Pet.swift
51-
PetstoreClient/Classes/OpenAPIs/Models/ReadOnlyFirst.swift
52-
PetstoreClient/Classes/OpenAPIs/Models/Return.swift
53-
PetstoreClient/Classes/OpenAPIs/Models/SpecialModelName.swift
54-
PetstoreClient/Classes/OpenAPIs/Models/StringBooleanMap.swift
55-
PetstoreClient/Classes/OpenAPIs/Models/Tag.swift
56-
PetstoreClient/Classes/OpenAPIs/Models/TypeHolderDefault.swift
57-
PetstoreClient/Classes/OpenAPIs/Models/TypeHolderExample.swift
58-
PetstoreClient/Classes/OpenAPIs/Models/User.swift
59-
PetstoreClient/Classes/OpenAPIs/OpenISO8601DateFormatter.swift
60-
PetstoreClient/Classes/OpenAPIs/SynchronizedDictionary.swift
61-
PetstoreClient/Classes/OpenAPIs/URLSessionImplementations.swift
625
README.md
6+
Sources/PetstoreClient/APIHelper.swift
7+
Sources/PetstoreClient/APIs.swift
8+
Sources/PetstoreClient/APIs/AnotherFakeAPI.swift
9+
Sources/PetstoreClient/APIs/FakeAPI.swift
10+
Sources/PetstoreClient/APIs/FakeClassnameTags123API.swift
11+
Sources/PetstoreClient/APIs/PetAPI.swift
12+
Sources/PetstoreClient/APIs/StoreAPI.swift
13+
Sources/PetstoreClient/APIs/UserAPI.swift
14+
Sources/PetstoreClient/CodableHelper.swift
15+
Sources/PetstoreClient/Configuration.swift
16+
Sources/PetstoreClient/Extensions.swift
17+
Sources/PetstoreClient/JSONDataEncoding.swift
18+
Sources/PetstoreClient/JSONEncodingHelper.swift
19+
Sources/PetstoreClient/Models.swift
20+
Sources/PetstoreClient/Models/AdditionalPropertiesClass.swift
21+
Sources/PetstoreClient/Models/Animal.swift
22+
Sources/PetstoreClient/Models/AnimalFarm.swift
23+
Sources/PetstoreClient/Models/ApiResponse.swift
24+
Sources/PetstoreClient/Models/ArrayOfArrayOfNumberOnly.swift
25+
Sources/PetstoreClient/Models/ArrayOfNumberOnly.swift
26+
Sources/PetstoreClient/Models/ArrayTest.swift
27+
Sources/PetstoreClient/Models/Capitalization.swift
28+
Sources/PetstoreClient/Models/Cat.swift
29+
Sources/PetstoreClient/Models/CatAllOf.swift
30+
Sources/PetstoreClient/Models/Category.swift
31+
Sources/PetstoreClient/Models/ClassModel.swift
32+
Sources/PetstoreClient/Models/Client.swift
33+
Sources/PetstoreClient/Models/Dog.swift
34+
Sources/PetstoreClient/Models/DogAllOf.swift
35+
Sources/PetstoreClient/Models/EnumArrays.swift
36+
Sources/PetstoreClient/Models/EnumClass.swift
37+
Sources/PetstoreClient/Models/EnumTest.swift
38+
Sources/PetstoreClient/Models/File.swift
39+
Sources/PetstoreClient/Models/FileSchemaTestClass.swift
40+
Sources/PetstoreClient/Models/FormatTest.swift
41+
Sources/PetstoreClient/Models/HasOnlyReadOnly.swift
42+
Sources/PetstoreClient/Models/List.swift
43+
Sources/PetstoreClient/Models/MapTest.swift
44+
Sources/PetstoreClient/Models/MixedPropertiesAndAdditionalPropertiesClass.swift
45+
Sources/PetstoreClient/Models/Model200Response.swift
46+
Sources/PetstoreClient/Models/Name.swift
47+
Sources/PetstoreClient/Models/NumberOnly.swift
48+
Sources/PetstoreClient/Models/Order.swift
49+
Sources/PetstoreClient/Models/OuterComposite.swift
50+
Sources/PetstoreClient/Models/OuterEnum.swift
51+
Sources/PetstoreClient/Models/Pet.swift
52+
Sources/PetstoreClient/Models/ReadOnlyFirst.swift
53+
Sources/PetstoreClient/Models/Return.swift
54+
Sources/PetstoreClient/Models/SpecialModelName.swift
55+
Sources/PetstoreClient/Models/StringBooleanMap.swift
56+
Sources/PetstoreClient/Models/Tag.swift
57+
Sources/PetstoreClient/Models/TypeHolderDefault.swift
58+
Sources/PetstoreClient/Models/TypeHolderExample.swift
59+
Sources/PetstoreClient/Models/User.swift
60+
Sources/PetstoreClient/OpenISO8601DateFormatter.swift
61+
Sources/PetstoreClient/SynchronizedDictionary.swift
62+
Sources/PetstoreClient/URLSessionImplementations.swift
6363
docs/AdditionalPropertiesClass.md
6464
docs/Animal.md
6565
docs/AnimalFarm.md

samples/client/petstore/swift5/urlsessionLibrary/Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ let package = Package(
2626
.target(
2727
name: "PetstoreClient",
2828
dependencies: [],
29-
path: "PetstoreClient/Classes"
29+
path: "Sources/PetstoreClient"
3030
),
3131
]
3232
)

samples/client/petstore/swift5/urlsessionLibrary/PetstoreClient.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ Pod::Spec.new do |s|
1010
s.license = 'Proprietary'
1111
s.homepage = 'https://github.com/openapitools/openapi-generator'
1212
s.summary = 'PetstoreClient'
13-
s.source_files = 'PetstoreClient/Classes/**/*.swift'
13+
s.source_files = 'Sources/PetstoreClient/**/*.swift'
1414
end
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//
2+
// ClassModel.swift
3+
//
4+
// Generated by openapi-generator
5+
// https://openapi-generator.tech
6+
//
7+
8+
import Foundation
9+
10+
/** Model for testing model with \&quot;_class\&quot; property */
11+
public struct ClassModel: Codable, Hashable {
12+
13+
public var &#x60;class&#x60;: String?
14+
15+
public init(&#x60;class&#x60;: String? = nil) {
16+
self.&#x60;class&#x60; = &#x60;class&#x60;
17+
}
18+
19+
public enum CodingKeys: String, CodingKey, CaseIterable {
20+
case &#x60;class&#x60; = "_class"
21+
}
22+
23+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//
2+
// Model200Response.swift
3+
//
4+
// Generated by openapi-generator
5+
// https://openapi-generator.tech
6+
//
7+
8+
import Foundation
9+
10+
/** Model for testing model name starting with number */
11+
public struct Model200Response: Codable, Hashable {
12+
13+
public var name: Int?
14+
public var &#x60;class&#x60;: String?
15+
16+
public init(name: Int? = nil, &#x60;class&#x60;: String? = nil) {
17+
self.name = name
18+
self.&#x60;class&#x60; = &#x60;class&#x60;
19+
}
20+
21+
public enum CodingKeys: String, CodingKey, CaseIterable {
22+
case name
23+
case &#x60;class&#x60; = "class"
24+
}
25+
26+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//
2+
// Return.swift
3+
//
4+
// Generated by openapi-generator
5+
// https://openapi-generator.tech
6+
//
7+
8+
import Foundation
9+
10+
/** Model for testing reserved words */
11+
public struct Return: Codable, Hashable {
12+
13+
public var &#x60;return&#x60;: Int?
14+
15+
public init(&#x60;return&#x60;: Int? = nil) {
16+
self.&#x60;return&#x60; = &#x60;return&#x60;
17+
}
18+
19+
public enum CodingKeys: String, CodingKey, CaseIterable {
20+
case &#x60;return&#x60; = "return"
21+
}
22+
23+
}

0 commit comments

Comments
 (0)