Skip to content

Commit 680b32f

Browse files
authored
Merge pull request #9730 from plam4u/issue-9178
[Issue 9178] Handle multiple formats when decoding dates
2 parents 13cbb45 + ff5f359 commit 680b32f

File tree

28 files changed

+988
-715
lines changed

28 files changed

+988
-715
lines changed

modules/swagger-codegen/src/main/resources/swift4/CodableHelper.mustache

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ import Foundation
99

1010
public typealias EncodeResult = (data: Data?, error: Error?)
1111

12+
enum DateError: String, Error {
13+
case invalidDate
14+
}
15+
1216
open class CodableHelper {
1317
1418
open static var dateformatter: DateFormatter?
@@ -18,16 +22,39 @@ open class CodableHelper {
1822
var returnedError: Error? = nil
1923
2024
let decoder = JSONDecoder()
25+
2126
if let df = self.dateformatter {
2227
decoder.dateDecodingStrategy = .formatted(df)
2328
} else {
2429
decoder.dataDecodingStrategy = .base64
25-
let formatter = DateFormatter()
26-
formatter.calendar = Calendar(identifier: .iso8601)
27-
formatter.locale = Locale(identifier: "en_US_POSIX")
28-
formatter.timeZone = TimeZone(secondsFromGMT: 0)
29-
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
30-
decoder.dateDecodingStrategy = .formatted(formatter)
30+
decoder.dateDecodingStrategy = .custom({ (decoder) -> Date in
31+
let container = try decoder.singleValueContainer()
32+
let dateStr = try container.decode(String.self)
33+
34+
let formatters = [
35+
"yyyy-MM-dd",
36+
"yyyy-MM-dd'T'HH:mm:ssZZZZZ",
37+
"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ",
38+
"yyyy-MM-dd'T'HH:mm:ss'Z'",
39+
"yyyy-MM-dd'T'HH:mm:ss.SSS",
40+
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
41+
"yyyy-MM-dd HH:mm:ss"
42+
].map { (format: String) -> DateFormatter in
43+
let formatter = DateFormatter()
44+
formatter.locale = Locale(identifier: "en_US_POSIX")
45+
formatter.dateFormat = format
46+
return formatter
47+
}
48+
49+
for formatter in formatters {
50+
51+
if let date = formatter.date(from: dateStr) {
52+
return date
53+
}
54+
}
55+
56+
throw DateError.invalidDate
57+
})
3158
}
3259

3360
do {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.4.0-SNAPSHOT
1+
2.4.9-SNAPSHOT
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.4.3-SNAPSHOT
1+
2.4.9-SNAPSHOT

samples/client/petstore/swift4/default/PetstoreClient/Classes/Swaggers/APIs/FakeClassnameTags123API.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,7 @@ open class FakeClassnameTags123API {
4545
let parameters = JSONEncodingHelper.encodingParameters(forEncodableObject: body)
4646

4747
var url = URLComponents(string: URLString)
48-
url?.queryItems = APIHelper.mapValuesToQueryItems([
49-
])
48+
url?.queryItems = APIHelper.mapValuesToQueryItems([:])
5049

5150
let requestBuilder: RequestBuilder<Client>.Type = PetstoreClientAPI.requestBuilderFactory.getBuilder()
5251

samples/client/petstore/swift4/default/PetstoreClient/Classes/Swaggers/AlamofireImplementations.swift

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ class AlamofireRequestBuilderFactory: RequestBuilderFactory {
2020
// Store manager to retain its reference
2121
private var managerStore: [String: Alamofire.SessionManager] = [:]
2222

23+
// Sync queue to manage safe access to the store manager
24+
private let syncQueue = DispatchQueue(label: "thread-safe-sync-queue", attributes: .concurrent)
25+
2326
open class AlamofireRequestBuilder<T>: RequestBuilder<T> {
2427
required public init(method: String, URLString: String, parameters: [String : Any]?, isBody: Bool, headers: [String : String] = [:]) {
2528
super.init(method: method, URLString: URLString, parameters: parameters, isBody: isBody, headers: headers)
@@ -58,7 +61,9 @@ open class AlamofireRequestBuilder<T>: RequestBuilder<T> {
5861
let managerId:String = UUID().uuidString
5962
// Create a new manager for each request to customize its request header
6063
let manager = createSessionManager()
61-
managerStore[managerId] = manager
64+
syncQueue.async(flags: .barrier) {
65+
managerStore[managerId] = manager
66+
}
6267

6368
let encoding:ParameterEncoding = isBody ? JSONDataEncoding() : URLEncoding()
6469

@@ -112,7 +117,9 @@ open class AlamofireRequestBuilder<T>: RequestBuilder<T> {
112117
}
113118

114119
let cleanupRequest = {
115-
_ = managerStore.removeValue(forKey: managerId)
120+
syncQueue.async(flags: .barrier) {
121+
_ = managerStore.removeValue(forKey: managerId)
122+
}
116123
}
117124

118125
let validatedRequest = request.validate()
@@ -314,7 +321,9 @@ open class AlamofireDecodableRequestBuilder<T:Decodable>: AlamofireRequestBuilde
314321
}
315322

316323
let cleanupRequest = {
317-
_ = managerStore.removeValue(forKey: managerId)
324+
syncQueue.async(flags: .barrier) {
325+
_ = managerStore.removeValue(forKey: managerId)
326+
}
318327
}
319328

320329
let validatedRequest = request.validate()

samples/client/petstore/swift4/default/PetstoreClient/Classes/Swaggers/CodableHelper.swift

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ import Foundation
99

1010
public typealias EncodeResult = (data: Data?, error: Error?)
1111

12+
enum DateError: String, Error {
13+
case invalidDate
14+
}
15+
1216
open class CodableHelper {
1317

1418
open static var dateformatter: DateFormatter?
@@ -18,16 +22,39 @@ open class CodableHelper {
1822
var returnedError: Error? = nil
1923

2024
let decoder = JSONDecoder()
25+
2126
if let df = self.dateformatter {
2227
decoder.dateDecodingStrategy = .formatted(df)
2328
} else {
2429
decoder.dataDecodingStrategy = .base64
25-
let formatter = DateFormatter()
26-
formatter.calendar = Calendar(identifier: .iso8601)
27-
formatter.locale = Locale(identifier: "en_US_POSIX")
28-
formatter.timeZone = TimeZone(secondsFromGMT: 0)
29-
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXXXX"
30-
decoder.dateDecodingStrategy = .formatted(formatter)
30+
decoder.dateDecodingStrategy = .custom({ (decoder) -> Date in
31+
let container = try decoder.singleValueContainer()
32+
let dateStr = try container.decode(String.self)
33+
34+
let formatters = [
35+
"yyyy-MM-dd",
36+
"yyyy-MM-dd'T'HH:mm:ssZZZZZ",
37+
"yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ",
38+
"yyyy-MM-dd'T'HH:mm:ss'Z'",
39+
"yyyy-MM-dd'T'HH:mm:ss.SSS",
40+
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
41+
"yyyy-MM-dd HH:mm:ss"
42+
].map { (format: String) -> DateFormatter in
43+
let formatter = DateFormatter()
44+
formatter.locale = Locale(identifier: "en_US_POSIX")
45+
formatter.dateFormat = format
46+
return formatter
47+
}
48+
49+
for formatter in formatters {
50+
51+
if let date = formatter.date(from: dateStr) {
52+
return date
53+
}
54+
}
55+
56+
throw DateError.invalidDate
57+
})
3158
}
3259

3360
do {

samples/client/petstore/swift4/default/SwaggerClientTests/Podfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ end
1212
post_install do |installer|
1313
installer.pods_project.targets.each do |target|
1414
target.build_configurations.each do |configuration|
15-
configuration.build_settings['SWIFT_VERSION'] = "3.0"
15+
configuration.build_settings['SWIFT_VERSION'] = "4.2"
1616
end
1717
end
1818
end

samples/client/petstore/swift4/default/SwaggerClientTests/Podfile.lock

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,18 @@ PODS:
66
DEPENDENCIES:
77
- PetstoreClient (from `../`)
88

9+
SPEC REPOS:
10+
https://github.com/cocoapods/specs.git:
11+
- Alamofire
12+
913
EXTERNAL SOURCES:
1014
PetstoreClient:
11-
:path: ../
15+
:path: "../"
1216

1317
SPEC CHECKSUMS:
1418
Alamofire: f28cdffd29de33a7bfa022cbd63ae95a27fae140
15-
PetstoreClient: fef7934ac90bd28c2b81cc5234615112f9ace5f5
19+
PetstoreClient: 9f1c86c3f7194758e922fb64277bfb4fc60bbf20
1620

17-
PODFILE CHECKSUM: 417049e9ed0e4680602b34d838294778389bd418
21+
PODFILE CHECKSUM: 065fc3a3ec186d4f60ef8c7d9624786f07955f2f
1822

19-
COCOAPODS: 1.4.0
23+
COCOAPODS: 1.7.1

samples/client/petstore/swift4/default/SwaggerClientTests/Pods/Manifest.lock

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

0 commit comments

Comments
 (0)