From 1b8e517b5a1d6edb5fa4812c161fd921cb09406d Mon Sep 17 00:00:00 2001 From: John Estropia Date: Thu, 17 Oct 2019 07:40:15 +0900 Subject: [PATCH] WIP: update demo app --- .../CoreStoreDemo.xcodeproj/project.pbxproj | 4 + .../ColorsDemo.swift | 86 +++++++++++++++++++ .../ListObserverDemoViewController.swift | 74 ---------------- CoreStoreTests/DynamicModelTests.swift | 22 ++--- Sources/CoreStoreObject.swift | 4 +- 5 files changed, 103 insertions(+), 87 deletions(-) create mode 100644 CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ColorsDemo.swift diff --git a/CoreStoreDemo/CoreStoreDemo.xcodeproj/project.pbxproj b/CoreStoreDemo/CoreStoreDemo.xcodeproj/project.pbxproj index ebcc953..9492763 100644 --- a/CoreStoreDemo/CoreStoreDemo.xcodeproj/project.pbxproj +++ b/CoreStoreDemo/CoreStoreDemo.xcodeproj/project.pbxproj @@ -37,6 +37,7 @@ B569651A1B30888A0075EE4A /* FetchingResultsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B56965191B30888A0075EE4A /* FetchingResultsViewController.swift */; }; B569651C1B30889A0075EE4A /* QueryingResultsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B569651B1B30889A0075EE4A /* QueryingResultsViewController.swift */; }; B56965291B3582D30075EE4A /* MigrationDemo.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = B56965271B3582D30075EE4A /* MigrationDemo.xcdatamodeld */; }; + B5AA37EF2357D30300FFD4B9 /* ColorsDemo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5AA37EE2357D30300FFD4B9 /* ColorsDemo.swift */; }; B5E599321B5240F50084BD5F /* OrganismTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E599311B5240F50084BD5F /* OrganismTableViewCell.swift */; }; B5E89AD01C5292A2003B04A9 /* CoreStore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B5BDC9211C202429008147CD /* CoreStore.framework */; }; B5E89AD11C5292A2003B04A9 /* CoreStore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B5BDC9211C202429008147CD /* CoreStore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -95,6 +96,7 @@ B56965191B30888A0075EE4A /* FetchingResultsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchingResultsViewController.swift; sourceTree = ""; }; B569651B1B30889A0075EE4A /* QueryingResultsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueryingResultsViewController.swift; sourceTree = ""; }; B56965281B3582D30075EE4A /* MigrationDemo.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MigrationDemo.xcdatamodel; sourceTree = ""; }; + B5AA37EE2357D30300FFD4B9 /* ColorsDemo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorsDemo.swift; sourceTree = ""; }; B5BDC9211C202429008147CD /* CoreStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CoreStore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B5E599311B5240F50084BD5F /* OrganismTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OrganismTableViewCell.swift; path = "CoreStoreDemo/MIgrations Demo/OrganismTableViewCell.swift"; sourceTree = SOURCE_ROOT; }; B5EE25801B36E1B00000406B /* MigrationDemoV2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MigrationDemoV2.xcdatamodel; sourceTree = ""; }; @@ -133,6 +135,7 @@ B503FADA1AFDC71700F90881 /* List and Object Observers Demo */ = { isa = PBXGroup; children = ( + B5AA37EE2357D30300FFD4B9 /* ColorsDemo.swift */, B52977D81B120B80003D50A5 /* ObserversViewController.swift */, B503FADB1AFDC71700F90881 /* ListObserverDemoViewController.swift */, B503FADC1AFDC71700F90881 /* ObjectObserverDemoViewController.swift */, @@ -354,6 +357,7 @@ B50132282344E5E900FC238B /* SwiftUIContainerViewController.swift in Sources */, B56964D71B231AE90075EE4A /* StackSetupDemo.xcdatamodeld in Sources */, B56964DC1B231BCB0075EE4A /* FemaleAccount.swift in Sources */, + B5AA37EF2357D30300FFD4B9 /* ColorsDemo.swift in Sources */, B5EE259E1B3EC1B20000406B /* OrganismProtocol.swift in Sources */, B5EE258C1B36E40D0000406B /* MigrationsDemoViewController.swift in Sources */, B50132242344E24300FC238B /* SwiftUIView.swift in Sources */, diff --git a/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ColorsDemo.swift b/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ColorsDemo.swift new file mode 100644 index 0000000..7866298 --- /dev/null +++ b/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ColorsDemo.swift @@ -0,0 +1,86 @@ +// +// ColorsDemo.swift +// CoreStoreDemo +// +// Created by John Rommel Estropia on 2019/10/17. +// Copyright © 2019 John Rommel Estropia. All rights reserved. +// + +import Foundation +import CoreStore + + +// MARK: - ColorsDemo + +struct ColorsDemo { + + enum Filter: String { + + case all = "All Colors" + case light = "Light Colors" + case dark = "Dark Colors" + + func next() -> Filter { + + switch self { + + case .all: return .light + case .light: return .dark + case .dark: return .all + } + } + + func whereClause() -> Where { + + switch self { + + case .all: return .init() + case .light: return (\Palette.brightness >= 0.9) + case .dark: return (\Palette.brightness <= 0.4) + } + } + } + + static var filter = Filter.all { + + didSet { + +// self.palettes.refetch( +// self.filter.whereClause(), +// OrderBy(.ascending(\.hue)) +// ) + } + } + + static let stack: DataStack = { + + let dataStack = DataStack( + CoreStoreSchema( + modelVersion: "ColorsDemo", + entities: [ + Entity("Palette"), + ], + versionLock: [ + "Palette": [0x8c25aa53c7c90a28, 0xa243a34d25f1a3a7, 0x56565b6935b6055a, 0x4f988bb257bf274f] + ] + ) + ) + + try! dataStack.addStorageAndWait( + SQLiteStore( + fileName: "ColorsDemo.sqlite", + localStorageOptions: .recreateStoreOnModelMismatch + ) + ) + return dataStack + }() + + static let palettes: LiveList = { + + return ColorsDemo.stack.liveList( + From() + .sectionBy(\.colorName) + .orderBy(.ascending(\.hue)) + ) + }() +} diff --git a/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ListObserverDemoViewController.swift b/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ListObserverDemoViewController.swift index a2fc66b..cd3d3dc 100644 --- a/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ListObserverDemoViewController.swift +++ b/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ListObserverDemoViewController.swift @@ -10,80 +10,6 @@ import UIKit import CoreStore -struct ColorsDemo { - - enum Filter: String { - - case all = "All Colors" - case light = "Light Colors" - case dark = "Dark Colors" - - func next() -> Filter { - - switch self { - - case .all: return .light - case .light: return .dark - case .dark: return .all - } - } - - func whereClause() -> Where { - - switch self { - - case .all: return .init() - case .light: return (\Palette.brightness >= 0.9) - case .dark: return (\Palette.brightness <= 0.4) - } - } - } - - static var filter = Filter.all { - - didSet { - -// self.palettes.refetch( -// self.filter.whereClause(), -// OrderBy(.ascending(\.hue)) -// ) - } - } - - static let stack: DataStack = { - - let dataStack = DataStack( - CoreStoreSchema( - modelVersion: "ColorsDemo", - entities: [ - Entity("Palette"), - ], - versionLock: [ - "Palette": [0x8c25aa53c7c90a28, 0xa243a34d25f1a3a7, 0x56565b6935b6055a, 0x4f988bb257bf274f] - ] - ) - ) - - try! dataStack.addStorageAndWait( - SQLiteStore( - fileName: "ColorsDemo.sqlite", - localStorageOptions: .recreateStoreOnModelMismatch - ) - ) - return dataStack - }() - - static let palettes: LiveList = { - - return ColorsDemo.stack.liveList( - From() - .sectionBy(\.colorName) - .orderBy(.ascending(\.hue)) - ) - }() -} - - // MARK: - ListObserverDemoViewController class ListObserverDemoViewController: UITableViewController { diff --git a/CoreStoreTests/DynamicModelTests.swift b/CoreStoreTests/DynamicModelTests.swift index 1147710..2f8d94f 100644 --- a/CoreStoreTests/DynamicModelTests.swift +++ b/CoreStoreTests/DynamicModelTests.swift @@ -292,22 +292,22 @@ class DynamicModelTests: BaseTestDataTestCase { XCTAssertEqual(person.name.value, "John") XCTAssertEqual(person.displayName.value, "Mr. John") // Custom getter -// let personSnapshot1 = person.createSnapshot() -// XCTAssertEqual(person.name.value, personSnapshot1.name) -// XCTAssertEqual(person.title.value, personSnapshot1.title) -// XCTAssertEqual(person.displayName.value, personSnapshot1.displayName) + let personSnapshot1 = person.asSnapshot(in: transaction) + XCTAssertEqual(person.name.value, personSnapshot1?.name) + XCTAssertEqual(person.title.value, personSnapshot1?.title) + XCTAssertEqual(person.displayName.value, personSnapshot1?.displayName) person.title .= "Sir" XCTAssertEqual(person.displayName.value, "Sir John") -// XCTAssertEqual(personSnapshot1.name, "John") -// XCTAssertEqual(personSnapshot1.title, "Mr.") -// XCTAssertEqual(personSnapshot1.displayName, "Mr. John") + XCTAssertEqual(personSnapshot1?.name, "John") + XCTAssertEqual(personSnapshot1?.title, "Mr.") + XCTAssertEqual(personSnapshot1?.displayName, "Mr. John") -// let personSnapshot2 = person.createSnapshot() -// XCTAssertEqual(person.name.value, personSnapshot2.name) -// XCTAssertEqual(person.title.value, personSnapshot2.title) -// XCTAssertEqual(person.displayName.value, personSnapshot2.displayName) + let personSnapshot2 = person.asSnapshot(in: transaction) + XCTAssertEqual(person.name.value, personSnapshot2?.name) + XCTAssertEqual(person.title.value, personSnapshot2?.title) + XCTAssertEqual(person.displayName.value, personSnapshot2?.displayName) person.pets.value.insert(dog) XCTAssertEqual(person.pets.count, 1) diff --git a/Sources/CoreStoreObject.swift b/Sources/CoreStoreObject.swift index 43d73f3..01dd8d2 100644 --- a/Sources/CoreStoreObject.swift +++ b/Sources/CoreStoreObject.swift @@ -63,7 +63,7 @@ open /*abstract*/ class CoreStoreObject: DynamicObject, Hashable { /** Do not call this directly. This is exposed as public only as a required initializer. - - Important: subclasses that need a custom initializer should override both `init(_:)` and `init(asMeta:)`, and to call their corresponding super implementations. + - Important: subclasses that need a custom initializer should override both `init(rawObject:)` and `init(asMeta:)`, and to call their corresponding super implementations. */ public required init(rawObject: NSManagedObject) { @@ -77,7 +77,7 @@ open /*abstract*/ class CoreStoreObject: DynamicObject, Hashable { /** Do not call this directly. This is exposed as public only as a required initializer. - - Important: subclasses that need a custom initializer should override both `init(_:)` and `init(asMeta:)`, and to call their corresponding super implementations. + - Important: subclasses that need a custom initializer should override both `init(rawObject:)` and `init(asMeta:)`, and to call their corresponding super implementations. */ public required init(asMeta: Void) {