mirror of
https://github.com/JohnEstropia/CoreStore.git
synced 2026-03-31 22:53:04 +02:00
WIP: update demo app
This commit is contained in:
@@ -37,6 +37,7 @@
|
|||||||
B569651A1B30888A0075EE4A /* FetchingResultsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B56965191B30888A0075EE4A /* FetchingResultsViewController.swift */; };
|
B569651A1B30888A0075EE4A /* FetchingResultsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B56965191B30888A0075EE4A /* FetchingResultsViewController.swift */; };
|
||||||
B569651C1B30889A0075EE4A /* QueryingResultsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B569651B1B30889A0075EE4A /* QueryingResultsViewController.swift */; };
|
B569651C1B30889A0075EE4A /* QueryingResultsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B569651B1B30889A0075EE4A /* QueryingResultsViewController.swift */; };
|
||||||
B56965291B3582D30075EE4A /* MigrationDemo.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = B56965271B3582D30075EE4A /* MigrationDemo.xcdatamodeld */; };
|
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 */; };
|
B5E599321B5240F50084BD5F /* OrganismTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E599311B5240F50084BD5F /* OrganismTableViewCell.swift */; };
|
||||||
B5E89AD01C5292A2003B04A9 /* CoreStore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B5BDC9211C202429008147CD /* CoreStore.framework */; };
|
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, ); }; };
|
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 = "<group>"; };
|
B56965191B30888A0075EE4A /* FetchingResultsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchingResultsViewController.swift; sourceTree = "<group>"; };
|
||||||
B569651B1B30889A0075EE4A /* QueryingResultsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueryingResultsViewController.swift; sourceTree = "<group>"; };
|
B569651B1B30889A0075EE4A /* QueryingResultsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueryingResultsViewController.swift; sourceTree = "<group>"; };
|
||||||
B56965281B3582D30075EE4A /* MigrationDemo.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MigrationDemo.xcdatamodel; sourceTree = "<group>"; };
|
B56965281B3582D30075EE4A /* MigrationDemo.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MigrationDemo.xcdatamodel; sourceTree = "<group>"; };
|
||||||
|
B5AA37EE2357D30300FFD4B9 /* ColorsDemo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorsDemo.swift; sourceTree = "<group>"; };
|
||||||
B5BDC9211C202429008147CD /* CoreStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CoreStore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
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; };
|
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 = "<group>"; };
|
B5EE25801B36E1B00000406B /* MigrationDemoV2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = MigrationDemoV2.xcdatamodel; sourceTree = "<group>"; };
|
||||||
@@ -133,6 +135,7 @@
|
|||||||
B503FADA1AFDC71700F90881 /* List and Object Observers Demo */ = {
|
B503FADA1AFDC71700F90881 /* List and Object Observers Demo */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
B5AA37EE2357D30300FFD4B9 /* ColorsDemo.swift */,
|
||||||
B52977D81B120B80003D50A5 /* ObserversViewController.swift */,
|
B52977D81B120B80003D50A5 /* ObserversViewController.swift */,
|
||||||
B503FADB1AFDC71700F90881 /* ListObserverDemoViewController.swift */,
|
B503FADB1AFDC71700F90881 /* ListObserverDemoViewController.swift */,
|
||||||
B503FADC1AFDC71700F90881 /* ObjectObserverDemoViewController.swift */,
|
B503FADC1AFDC71700F90881 /* ObjectObserverDemoViewController.swift */,
|
||||||
@@ -354,6 +357,7 @@
|
|||||||
B50132282344E5E900FC238B /* SwiftUIContainerViewController.swift in Sources */,
|
B50132282344E5E900FC238B /* SwiftUIContainerViewController.swift in Sources */,
|
||||||
B56964D71B231AE90075EE4A /* StackSetupDemo.xcdatamodeld in Sources */,
|
B56964D71B231AE90075EE4A /* StackSetupDemo.xcdatamodeld in Sources */,
|
||||||
B56964DC1B231BCB0075EE4A /* FemaleAccount.swift in Sources */,
|
B56964DC1B231BCB0075EE4A /* FemaleAccount.swift in Sources */,
|
||||||
|
B5AA37EF2357D30300FFD4B9 /* ColorsDemo.swift in Sources */,
|
||||||
B5EE259E1B3EC1B20000406B /* OrganismProtocol.swift in Sources */,
|
B5EE259E1B3EC1B20000406B /* OrganismProtocol.swift in Sources */,
|
||||||
B5EE258C1B36E40D0000406B /* MigrationsDemoViewController.swift in Sources */,
|
B5EE258C1B36E40D0000406B /* MigrationsDemoViewController.swift in Sources */,
|
||||||
B50132242344E24300FC238B /* SwiftUIView.swift in Sources */,
|
B50132242344E24300FC238B /* SwiftUIView.swift in Sources */,
|
||||||
|
|||||||
@@ -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<Palette> {
|
||||||
|
|
||||||
|
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<Palette>(.ascending(\.hue))
|
||||||
|
// )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static let stack: DataStack = {
|
||||||
|
|
||||||
|
let dataStack = DataStack(
|
||||||
|
CoreStoreSchema(
|
||||||
|
modelVersion: "ColorsDemo",
|
||||||
|
entities: [
|
||||||
|
Entity<Palette>("Palette"),
|
||||||
|
],
|
||||||
|
versionLock: [
|
||||||
|
"Palette": [0x8c25aa53c7c90a28, 0xa243a34d25f1a3a7, 0x56565b6935b6055a, 0x4f988bb257bf274f]
|
||||||
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
try! dataStack.addStorageAndWait(
|
||||||
|
SQLiteStore(
|
||||||
|
fileName: "ColorsDemo.sqlite",
|
||||||
|
localStorageOptions: .recreateStoreOnModelMismatch
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return dataStack
|
||||||
|
}()
|
||||||
|
|
||||||
|
static let palettes: LiveList<Palette> = {
|
||||||
|
|
||||||
|
return ColorsDemo.stack.liveList(
|
||||||
|
From<Palette>()
|
||||||
|
.sectionBy(\.colorName)
|
||||||
|
.orderBy(.ascending(\.hue))
|
||||||
|
)
|
||||||
|
}()
|
||||||
|
}
|
||||||
@@ -10,80 +10,6 @@ import UIKit
|
|||||||
import CoreStore
|
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<Palette> {
|
|
||||||
|
|
||||||
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<Palette>(.ascending(\.hue))
|
|
||||||
// )
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static let stack: DataStack = {
|
|
||||||
|
|
||||||
let dataStack = DataStack(
|
|
||||||
CoreStoreSchema(
|
|
||||||
modelVersion: "ColorsDemo",
|
|
||||||
entities: [
|
|
||||||
Entity<Palette>("Palette"),
|
|
||||||
],
|
|
||||||
versionLock: [
|
|
||||||
"Palette": [0x8c25aa53c7c90a28, 0xa243a34d25f1a3a7, 0x56565b6935b6055a, 0x4f988bb257bf274f]
|
|
||||||
]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
try! dataStack.addStorageAndWait(
|
|
||||||
SQLiteStore(
|
|
||||||
fileName: "ColorsDemo.sqlite",
|
|
||||||
localStorageOptions: .recreateStoreOnModelMismatch
|
|
||||||
)
|
|
||||||
)
|
|
||||||
return dataStack
|
|
||||||
}()
|
|
||||||
|
|
||||||
static let palettes: LiveList<Palette> = {
|
|
||||||
|
|
||||||
return ColorsDemo.stack.liveList(
|
|
||||||
From<Palette>()
|
|
||||||
.sectionBy(\.colorName)
|
|
||||||
.orderBy(.ascending(\.hue))
|
|
||||||
)
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: - ListObserverDemoViewController
|
// MARK: - ListObserverDemoViewController
|
||||||
|
|
||||||
class ListObserverDemoViewController: UITableViewController {
|
class ListObserverDemoViewController: UITableViewController {
|
||||||
|
|||||||
@@ -292,22 +292,22 @@ class DynamicModelTests: BaseTestDataTestCase {
|
|||||||
XCTAssertEqual(person.name.value, "John")
|
XCTAssertEqual(person.name.value, "John")
|
||||||
XCTAssertEqual(person.displayName.value, "Mr. John") // Custom getter
|
XCTAssertEqual(person.displayName.value, "Mr. John") // Custom getter
|
||||||
|
|
||||||
// let personSnapshot1 = person.createSnapshot()
|
let personSnapshot1 = person.asSnapshot(in: transaction)
|
||||||
// XCTAssertEqual(person.name.value, personSnapshot1.name)
|
XCTAssertEqual(person.name.value, personSnapshot1?.name)
|
||||||
// XCTAssertEqual(person.title.value, personSnapshot1.title)
|
XCTAssertEqual(person.title.value, personSnapshot1?.title)
|
||||||
// XCTAssertEqual(person.displayName.value, personSnapshot1.displayName)
|
XCTAssertEqual(person.displayName.value, personSnapshot1?.displayName)
|
||||||
|
|
||||||
person.title .= "Sir"
|
person.title .= "Sir"
|
||||||
XCTAssertEqual(person.displayName.value, "Sir John")
|
XCTAssertEqual(person.displayName.value, "Sir John")
|
||||||
|
|
||||||
// XCTAssertEqual(personSnapshot1.name, "John")
|
XCTAssertEqual(personSnapshot1?.name, "John")
|
||||||
// XCTAssertEqual(personSnapshot1.title, "Mr.")
|
XCTAssertEqual(personSnapshot1?.title, "Mr.")
|
||||||
// XCTAssertEqual(personSnapshot1.displayName, "Mr. John")
|
XCTAssertEqual(personSnapshot1?.displayName, "Mr. John")
|
||||||
|
|
||||||
// let personSnapshot2 = person.createSnapshot()
|
let personSnapshot2 = person.asSnapshot(in: transaction)
|
||||||
// XCTAssertEqual(person.name.value, personSnapshot2.name)
|
XCTAssertEqual(person.name.value, personSnapshot2?.name)
|
||||||
// XCTAssertEqual(person.title.value, personSnapshot2.title)
|
XCTAssertEqual(person.title.value, personSnapshot2?.title)
|
||||||
// XCTAssertEqual(person.displayName.value, personSnapshot2.displayName)
|
XCTAssertEqual(person.displayName.value, personSnapshot2?.displayName)
|
||||||
|
|
||||||
person.pets.value.insert(dog)
|
person.pets.value.insert(dog)
|
||||||
XCTAssertEqual(person.pets.count, 1)
|
XCTAssertEqual(person.pets.count, 1)
|
||||||
|
|||||||
@@ -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.
|
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) {
|
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.
|
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) {
|
public required init(asMeta: Void) {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user