diff --git a/README.md b/README.md index 768a6a7da..1fe4e890a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![parse-swift](https://user-images.githubusercontent.com/8621344/204069535-e1882bb0-bbcb-4178-87e6-58fd1bed96d1.png) -

iOS · macOS · watchOS · tvOS · Linux · Android · Windows

+

iOS · macOS · watchOS · tvOS · visionOS ·Linux · Android · Windows

⭐️ ParseSwift was highlighted in issue #560 of iOS Dev Weekly and discussed in episode 5 of Swift Package Index Twitter Spaces

diff --git a/Sources/ParseSwift/Coding/ParseEncoder.swift b/Sources/ParseSwift/Coding/ParseEncoder.swift index 7be469738..aac2d6419 100644 --- a/Sources/ParseSwift/Coding/ParseEncoder.swift +++ b/Sources/ParseSwift/Coding/ParseEncoder.swift @@ -435,60 +435,60 @@ private struct _ParseEncoderKeyedEncodingContainer: KeyedEncodin // MARK: - KeyedEncodingContainerProtocol Methods mutating func encodeNil(forKey key: Key) throws { - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + guard !shouldSkipKey(key) else { return } container[key.stringValue] = NSNull() } mutating func encode(_ value: Bool, forKey key: Key) throws { - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + guard !shouldSkipKey(key) else { return } self.container[key.stringValue] = self.encoder.box(value) } mutating func encode(_ value: Int, forKey key: Key) throws { - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + guard !shouldSkipKey(key) else { return } self.container[key.stringValue] = self.encoder.box(value) } mutating func encode(_ value: Int8, forKey key: Key) throws { - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + guard !shouldSkipKey(key) else { return } self.container[key.stringValue] = self.encoder.box(value) } mutating func encode(_ value: Int16, forKey key: Key) throws { - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + guard !shouldSkipKey(key) else { return } self.container[key.stringValue] = self.encoder.box(value) } mutating func encode(_ value: Int32, forKey key: Key) throws { - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + guard !shouldSkipKey(key) else { return } self.container[key.stringValue] = self.encoder.box(value) } mutating func encode(_ value: Int64, forKey key: Key) throws { - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + guard !shouldSkipKey(key) else { return } self.container[key.stringValue] = self.encoder.box(value) } mutating func encode(_ value: UInt, forKey key: Key) throws { - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + guard !shouldSkipKey(key) else { return } self.container[key.stringValue] = self.encoder.box(value) } mutating func encode(_ value: UInt8, forKey key: Key) throws { - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + guard !shouldSkipKey(key) else { return } self.container[key.stringValue] = self.encoder.box(value) } mutating func encode(_ value: UInt16, forKey key: Key) throws { - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + guard !shouldSkipKey(key) else { return } self.container[key.stringValue] = self.encoder.box(value) } mutating func encode(_ value: UInt32, forKey key: Key) throws { - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + guard !shouldSkipKey(key) else { return } self.container[key.stringValue] = self.encoder.box(value) } mutating func encode(_ value: UInt64, forKey key: Key) throws { - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + guard !shouldSkipKey(key) else { return } self.container[key.stringValue] = self.encoder.box(value) } mutating func encode(_ value: String, forKey key: Key) throws { - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + guard !shouldSkipKey(key) else { return } self.container[key.stringValue] = self.encoder.box(value) } mutating func encode(_ value: Float, forKey key: Key) throws { // Since the float may be invalid and throw, the coding path needs to contain this key. - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + guard !shouldSkipKey(key) else { return } self.encoder.codingPath.append(key) defer { self.encoder.codingPath.removeLast() } self.container[key.stringValue] = try self.encoder.box(value) @@ -496,14 +496,15 @@ private struct _ParseEncoderKeyedEncodingContainer: KeyedEncodin mutating func encode(_ value: Double, forKey key: Key) throws { // Since the double may be invalid and throw, the coding path needs to contain this key. - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + guard !shouldSkipKey(key) else { return } self.encoder.codingPath.append(key) defer { self.encoder.codingPath.removeLast() } self.container[key.stringValue] = try self.encoder.box(value) } mutating func encode(_ value: T, forKey key: Key) throws where T: Encodable { - if self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys { return } + + guard !shouldSkipKey(key) else { return } var valueToEncode: Encodable = value if ((value as? Objectable) != nil) @@ -542,6 +543,13 @@ private struct _ParseEncoderKeyedEncodingContainer: KeyedEncodin self.container[key.stringValue] = try self.encoder.box(valueToEncode) } + func shouldSkipKey(_ key: Key) -> Bool { + guard self.encoder.skippedKeys.contains(key.stringValue) && !self.encoder.ignoreSkipKeys else { + return false + } + return true + } + mutating func nestedContainer( keyedBy keyType: NestedKey.Type, forKey key: Key diff --git a/Tests/ParseSwiftTests/ParseEncoderTests/ParseEncoderExtraTests.swift b/Tests/ParseSwiftTests/ParseEncoderTests/ParseEncoderExtraTests.swift index 91c391004..64dcf8b9f 100644 --- a/Tests/ParseSwiftTests/ParseEncoderTests/ParseEncoderExtraTests.swift +++ b/Tests/ParseSwiftTests/ParseEncoderTests/ParseEncoderExtraTests.swift @@ -11,7 +11,7 @@ import XCTest class ParseEncoderTests: XCTestCase { struct GameScore: ParseObject, ParseQueryScorable { - //: These are required by ParseObject + // These are required by ParseObject var objectId: String? var createdAt: Date? var updatedAt: Date? @@ -19,13 +19,13 @@ class ParseEncoderTests: XCTestCase { var score: Double? var originalData: Data? - //: ParseUser property + // ParseUser property var emailVerified: Bool? - //: Your own properties + // Your own properties var points: Int - //: a custom initializer + // a custom initializer init() { self.points = 5 } @@ -34,6 +34,43 @@ class ParseEncoderTests: XCTestCase { } } + struct AdditionalTypes: ParseObject { + // These are required by ParseObject + var objectId: String? + var createdAt: Date? + var updatedAt: Date? + var ACL: ParseACL? + var score: Double? + var originalData: Data? + + // Your own properties + var int8: Int8 + var int16: Int16 + var int32: Int32 + var int64: Int64 + var uint: UInt + var uint8: UInt8 + var uint16: UInt16 + var uint32: UInt32 + var uint64: UInt64 + var float: Float + + // a custom initializer + init() { + self.int8 = 1 + self.int16 = 2 + self.int32 = 3 + self.int64 = 4 + self.uint = 5 + self.uint8 = 1 + self.uint16 = 2 + self.uint32 = 3 + self.uint64 = 4 + self.float = 1.1 + } + + } + struct Address: Codable { let street: String let city: String @@ -80,6 +117,25 @@ class ParseEncoderTests: XCTestCase { XCTAssertEqual(parseDecoded["*"]?["read"], true) } + func testEncodingAdditionalTypes() throws { + let object = AdditionalTypes() + + let encodedJSON = try ParseCoding.parseEncoder().encode(object, skipKeys: .object) + let decodedJSON = try ParseCoding.jsonDecoder().decode([String: AnyCodable].self, from: encodedJSON) + XCTAssertEqual(decodedJSON["int8"]?.value as? NSNumber, NSNumber(value: object.int8)) + XCTAssertEqual(decodedJSON["int16"]?.value as? NSNumber, NSNumber(value: object.int16)) + XCTAssertEqual(decodedJSON["int32"]?.value as? NSNumber, NSNumber(value: object.int32)) + XCTAssertEqual(decodedJSON["int64"]?.value as? NSNumber, NSNumber(value: object.int64)) + XCTAssertEqual(decodedJSON["uint"]?.value as? NSNumber, NSNumber(value: object.uint)) + XCTAssertEqual(decodedJSON["uint8"]?.value as? NSNumber, NSNumber(value: object.uint8)) + XCTAssertEqual(decodedJSON["uint16"]?.value as? NSNumber, NSNumber(value: object.uint16)) + XCTAssertEqual(decodedJSON["uint32"]?.value as? NSNumber, NSNumber(value: object.uint32)) + XCTAssertEqual(decodedJSON["uint64"]?.value as? NSNumber, NSNumber(value: object.uint64)) + #if !os(Linux) && !os(Android) && !os(Windows) + XCTAssertEqual(decodedJSON["float"]?.value as? Double, Double(object.float)) + #endif + } + func testSkipKeysDefaultCodingKeys() throws { var score = GameScore(points: 10) score.objectId = "yarr"