From eeec3979eec60210987445de4b595e8ec249c934 Mon Sep 17 00:00:00 2001 From: John Estropia Date: Tue, 12 Feb 2019 15:48:50 +0900 Subject: [PATCH] SwiftPM support --- CoreStore.xcodeproj/project.pbxproj | 28 ++-- CoreStoreTests/FromTests.swift | 122 +++++++++--------- CoreStoreTests/GroupByTests.swift | 2 +- CoreStoreTests/OrderByTests.swift | 2 +- CoreStoreTests/TweakTests.swift | 2 +- CoreStoreTests/WhereTests.swift | 2 +- Package.swift | 28 ++-- ...reStore+CustomDebugStringConvertible.swift | 5 +- Sources/CoreStoreBridge.h | 12 -- Sources/CoreStoreBridge.m | 37 ------ Sources/CoreStoreFetchRequest+CoreStore.swift | 41 ------ Sources/CoreStoreSchema.swift | 19 +-- Sources/DataStack+Migration.swift | 11 +- Sources/DynamicKeyPath.swift | 1 + Sources/DynamicObject.swift | 1 + Sources/Entity.swift | 60 ++++++++- Sources/ListMonitor.swift | 8 +- ...FetchedResultsController+Convenience.swift | 2 +- ...SFetchedResultsController+ObjectiveC.swift | 2 +- .../NSManagedObjectContext+ObjectiveC.swift | 54 ++++---- Sources/NSManagedObjectContext+Querying.swift | 40 +++--- Sources/ObjectMonitor.swift | 4 +- Sources/Select.swift | 2 +- 23 files changed, 236 insertions(+), 249 deletions(-) delete mode 100644 Sources/CoreStoreFetchRequest+CoreStore.swift diff --git a/CoreStore.xcodeproj/project.pbxproj b/CoreStore.xcodeproj/project.pbxproj index 2489be8..64def8c 100644 --- a/CoreStore.xcodeproj/project.pbxproj +++ b/CoreStore.xcodeproj/project.pbxproj @@ -165,10 +165,6 @@ B52557881D02DE8100E51965 /* FetchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52557871D02DE8100E51965 /* FetchTests.swift */; }; B52557891D02DE8100E51965 /* FetchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52557871D02DE8100E51965 /* FetchTests.swift */; }; B525578A1D02DE8100E51965 /* FetchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B52557871D02DE8100E51965 /* FetchTests.swift */; }; - B52661401CADD585007B85D9 /* CoreStoreFetchRequest+CoreStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B526613F1CADD585007B85D9 /* CoreStoreFetchRequest+CoreStore.swift */; }; - B52661421CADD585007B85D9 /* CoreStoreFetchRequest+CoreStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B526613F1CADD585007B85D9 /* CoreStoreFetchRequest+CoreStore.swift */; }; - B52661431CADD585007B85D9 /* CoreStoreFetchRequest+CoreStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B526613F1CADD585007B85D9 /* CoreStoreFetchRequest+CoreStore.swift */; }; - B52661441CADD585007B85D9 /* CoreStoreFetchRequest+CoreStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B526613F1CADD585007B85D9 /* CoreStoreFetchRequest+CoreStore.swift */; }; B529C2041CA4A2DB007E7EBD /* CSSaveResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B529C2031CA4A2DB007E7EBD /* CSSaveResult.swift */; }; B529C2061CA4A2DB007E7EBD /* CSSaveResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B529C2031CA4A2DB007E7EBD /* CSSaveResult.swift */; }; B529C2071CA4A2DC007E7EBD /* CSSaveResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B529C2031CA4A2DB007E7EBD /* CSSaveResult.swift */; }; @@ -477,6 +473,12 @@ B5831B7B1F34ACBA00A9F647 /* Transformable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5831B791F34ACBA00A9F647 /* Transformable.swift */; }; B5831B7C1F34ACBA00A9F647 /* Transformable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5831B791F34ACBA00A9F647 /* Transformable.swift */; }; B5831B7D1F34ACBA00A9F647 /* Transformable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5831B791F34ACBA00A9F647 /* Transformable.swift */; }; + B5831F4022126FEC00D8604C /* KeyPathGenericBindings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5DAFB492203E01D003FCCD0 /* KeyPathGenericBindings.swift */; }; + B5831F4122126FEC00D8604C /* KeyPathGenericBindings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5DAFB492203E01D003FCCD0 /* KeyPathGenericBindings.swift */; }; + B5831F4222126FED00D8604C /* KeyPathGenericBindings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5DAFB492203E01D003FCCD0 /* KeyPathGenericBindings.swift */; }; + B5831F432212700400D8604C /* Where.Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5DAFB472203D9F8003FCCD0 /* Where.Expression.swift */; }; + B5831F442212700500D8604C /* Where.Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5DAFB472203D9F8003FCCD0 /* Where.Expression.swift */; }; + B5831F452212700500D8604C /* Where.Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5DAFB472203D9F8003FCCD0 /* Where.Expression.swift */; }; B58B22F51C93C1BA00521925 /* CoreStore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F03A53019C5C6DA005002A5 /* CoreStore.framework */; }; B58D0C631EAA0C7E003EDD87 /* NSManagedObject+DynamicModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58D0C621EAA0C7E003EDD87 /* NSManagedObject+DynamicModel.swift */; }; B58D0C641EAA0C7E003EDD87 /* NSManagedObject+DynamicModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58D0C621EAA0C7E003EDD87 /* NSManagedObject+DynamicModel.swift */; }; @@ -798,7 +800,6 @@ B525577F1D029D2500E51965 /* TweakTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TweakTests.swift; sourceTree = ""; }; B52557831D02A07400E51965 /* SectionByTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SectionByTests.swift; sourceTree = ""; }; B52557871D02DE8100E51965 /* FetchTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchTests.swift; sourceTree = ""; }; - B526613F1CADD585007B85D9 /* CoreStoreFetchRequest+CoreStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CoreStoreFetchRequest+CoreStore.swift"; sourceTree = ""; }; B529C2031CA4A2DB007E7EBD /* CSSaveResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSSaveResult.swift; sourceTree = ""; }; B52DD1741BE1F8CC00949AFE /* CoreStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CoreStore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B52DD17D1BE1F8CC00949AFE /* CoreStoreTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CoreStoreTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -862,7 +863,7 @@ B56923F41EB828BF007C4DC9 /* CSDynamicSchema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSDynamicSchema.swift; sourceTree = ""; }; B56923F91EB82956007C4DC9 /* CSXcodeDataModelSchema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSXcodeDataModelSchema.swift; sourceTree = ""; }; B56923FE1EB82976007C4DC9 /* CSUnsafeDataModelSchema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CSUnsafeDataModelSchema.swift; sourceTree = ""; }; - B56964D31B22FFAD0075EE4A /* DataStack+Migration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "DataStack+Migration.swift"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + B56964D31B22FFAD0075EE4A /* DataStack+Migration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = "DataStack+Migration.swift"; sourceTree = ""; }; B56965231B356B820075EE4A /* MigrationResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MigrationResult.swift; sourceTree = ""; }; B57D27BD1D0BBE8200539C58 /* BaseTestDataTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseTestDataTestCase.swift; sourceTree = ""; }; B57D27C11D0BC20100539C58 /* QueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueryTests.swift; sourceTree = ""; }; @@ -1537,7 +1538,6 @@ B5831B6F1F34AC3400A9F647 /* AttributeProtocol.swift */, B5831B741F34AC7A00A9F647 /* RelationshipProtocol.swift */, B5C976E61C6E3A5900B1AF90 /* CoreStoreFetchedResultsController.swift */, - B526613F1CADD585007B85D9 /* CoreStoreFetchRequest+CoreStore.swift */, B53B275E1EE3B92E00E9B352 /* CoreStoreManagedObject.swift */, B533C4DA1D7D4BFA001383CB /* DispatchQueue+CoreStore.swift */, B51260921E9B28F100402229 /* EntityIdentifier.swift */, @@ -1947,7 +1947,6 @@ B53FB9FE1CAB2D2F00F0D40A /* CSMigrationResult.swift in Sources */, B5DBE2D21C991B3E00B5CEFA /* CSDataStack.swift in Sources */, B50392F91C478FF3009900CA /* NSManagedObject+Transaction.swift in Sources */, - B52661401CADD585007B85D9 /* CoreStoreFetchRequest+CoreStore.swift in Sources */, B53FBA181CAB63E200F0D40A /* NSManagedObject+ObjectiveC.swift in Sources */, B5202CFA1C04688100DED140 /* NSFetchedResultsController+Convenience.swift in Sources */, B5519A591CA2008C002BEF78 /* CSBaseDataTransaction.swift in Sources */, @@ -2136,9 +2135,11 @@ 82BA18A31C4BBD2200A0916E /* DataStack.swift in Sources */, 82BA18C81C4BBD5900A0916E /* MigrationChain.swift in Sources */, B546F9741C9C553300D5AC55 /* SetupResult.swift in Sources */, + B5831F4022126FEC00D8604C /* KeyPathGenericBindings.swift in Sources */, B53CA9A31EF1EF1600E0F440 /* PartialObject.swift in Sources */, 82BA18B11C4BBD3100A0916E /* SaveResult.swift in Sources */, 82BA18DD1C4BBE1400A0916E /* NSFetchedResultsController+Convenience.swift in Sources */, + B5831F432212700400D8604C /* Where.Expression.swift in Sources */, B51260941E9B28F100402229 /* EntityIdentifier.swift in Sources */, B5FE4DA81C84FB4400FA6A91 /* InMemoryStore.swift in Sources */, B53FBA001CAB2D2F00F0D40A /* CSMigrationResult.swift in Sources */, @@ -2146,7 +2147,6 @@ 82BA18B41C4BBD3900A0916E /* BaseDataTransaction+Importing.swift in Sources */, B53FBA1A1CAB63E200F0D40A /* NSManagedObject+ObjectiveC.swift in Sources */, 82BA18CA1C4BBD5900A0916E /* MigrationResult.swift in Sources */, - B52661421CADD585007B85D9 /* CoreStoreFetchRequest+CoreStore.swift in Sources */, B5519A5A1CA2008C002BEF78 /* CSBaseDataTransaction.swift in Sources */, B5ECDBE11CA6BB2B00C7F112 /* CSBaseDataTransaction+Querying.swift in Sources */, 82BA18C11C4BBD5300A0916E /* CoreStore+Observing.swift in Sources */, @@ -2333,9 +2333,11 @@ B52DD1961BE1F92500949AFE /* DataStack.swift in Sources */, B5ECDBFD1CA804FD00C7F112 /* NSManagedObjectContext+ObjectiveC.swift in Sources */, B52DD1BD1BE1F94300949AFE /* NSManagedObject+Convenience.swift in Sources */, + B5831F4222126FED00D8604C /* KeyPathGenericBindings.swift in Sources */, B53CA9A51EF1EF1600E0F440 /* PartialObject.swift in Sources */, B52DD1AD1BE1F93900949AFE /* Where.swift in Sources */, B53FBA1C1CAB63E200F0D40A /* NSManagedObject+ObjectiveC.swift in Sources */, + B5831F452212700500D8604C /* Where.Expression.swift in Sources */, B51260961E9B28F100402229 /* EntityIdentifier.swift in Sources */, B5ECDBE31CA6BB2B00C7F112 /* CSBaseDataTransaction+Querying.swift in Sources */, B5ECDC031CA80CBA00C7F112 /* CSWhere.swift in Sources */, @@ -2344,7 +2346,6 @@ B52DD1C71BE1F94600949AFE /* NSManagedObjectContext+Querying.swift in Sources */, B52DD1C81BE1F94600949AFE /* NSManagedObjectContext+Setup.swift in Sources */, B52DD1C31BE1F94600949AFE /* NotificationObserver.swift in Sources */, - B52661441CADD585007B85D9 /* CoreStoreFetchRequest+CoreStore.swift in Sources */, B52DD1A81BE1F93200949AFE /* DataStack+Querying.swift in Sources */, B5220E221D130818009BC71E /* CSSectionBy.swift in Sources */, B52DD1BC1BE1F94000949AFE /* MigrationResult.swift in Sources */, @@ -2530,14 +2531,15 @@ B56321A81BD65219006C9394 /* NSManagedObject+Convenience.swift in Sources */, B546F9751C9C553300D5AC55 /* SetupResult.swift in Sources */, B56321981BD65216006C9394 /* Where.swift in Sources */, + B5831F4122126FEC00D8604C /* KeyPathGenericBindings.swift in Sources */, B53CA9A41EF1EF1600E0F440 /* PartialObject.swift in Sources */, B5202CFD1C046E8400DED140 /* NSFetchedResultsController+Convenience.swift in Sources */, B5FE4DA91C84FB4400FA6A91 /* InMemoryStore.swift in Sources */, + B5831F442212700500D8604C /* Where.Expression.swift in Sources */, B51260951E9B28F100402229 /* EntityIdentifier.swift in Sources */, B53FBA011CAB2D2F00F0D40A /* CSMigrationResult.swift in Sources */, B5DBE2D41C991B3E00B5CEFA /* CSDataStack.swift in Sources */, B50392FA1C47963F009900CA /* NSManagedObject+Transaction.swift in Sources */, - B52661431CADD585007B85D9 /* CoreStoreFetchRequest+CoreStore.swift in Sources */, B53FBA1B1CAB63E200F0D40A /* NSManagedObject+ObjectiveC.swift in Sources */, B5519A5B1CA2008C002BEF78 /* CSBaseDataTransaction.swift in Sources */, B5ECDBE21CA6BB2B00C7F112 /* CSBaseDataTransaction+Querying.swift in Sources */, @@ -2717,7 +2719,7 @@ SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_SWIFT3_OBJC_INFERENCE = Off; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; TVOS_DEPLOYMENT_TARGET = 10.0; VERSIONING_SYSTEM = "apple-generic"; @@ -2779,7 +2781,7 @@ SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_SWIFT3_OBJC_INFERENCE = Off; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; TVOS_DEPLOYMENT_TARGET = 10.0; VALIDATE_PRODUCT = YES; diff --git a/CoreStoreTests/FromTests.swift b/CoreStoreTests/FromTests.swift index 854fdf2..51b1f2d 100644 --- a/CoreStoreTests/FromTests.swift +++ b/CoreStoreTests/FromTests.swift @@ -74,31 +74,31 @@ final class FromTests: BaseTestCase { let from = From() - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() try from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNotNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["PF_DEFAULT_CONFIGURATION_NAME"]) } do { let from = From("Config1") - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } } @@ -113,98 +113,98 @@ final class FromTests: BaseTestCase { let from = From() - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNotNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["Config1"]) } do { - + let from = From("Config1") - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNotNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["Config1"]) } do { let from = From("Config2") - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } do { let from = From() - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } do { let from = From("Config1") - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } do { let from = From("Config2") - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } } @@ -219,96 +219,96 @@ final class FromTests: BaseTestCase { let from = From() - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNotNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertEqual(Set(affectedConfigurations), ["PF_DEFAULT_CONFIGURATION_NAME", "Config1"] as Set) } do { let from = From("Config1") - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNotNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["Config1"]) } do { let from = From("Config2") - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } do { let from = From() - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNotNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["PF_DEFAULT_CONFIGURATION_NAME"]) } do { let from = From("Config1") - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } do { let from = From("Config2") - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } } @@ -323,94 +323,94 @@ final class FromTests: BaseTestCase { let from = From() - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNotNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["Config1"]) } do { let from = From("Config1") - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNotNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["Config1"]) } do { let from = From("Config2") - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } do { let from = From() - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNotNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["Config2"]) } do { let from = From("Config1") - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() self.expectError(code: .persistentStoreNotFound) { try from.applyToFetchRequest(request, context: dataStack.mainContext) } XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertTrue(affectedConfigurations.isEmpty) } do { let from = From("Config2") - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() let storesFound: Void? = try? from.applyToFetchRequest(request, context: dataStack.mainContext) XCTAssertNotNil(storesFound) XCTAssertNotNil(request.entity) - XCTAssertNotNil(request.safeAffectedStores) + XCTAssertNotNil(request.affectedStores) XCTAssert(from.entityClass == NSClassFromString(request.entity!.managedObjectClassName)) - let affectedConfigurations = request.safeAffectedStores!.map { $0.configurationName } + let affectedConfigurations = request.affectedStores?.map { $0.configurationName } ?? [] XCTAssertEqual(affectedConfigurations, ["Config2"]) } } diff --git a/CoreStoreTests/GroupByTests.swift b/CoreStoreTests/GroupByTests.swift index a209566..a2500ca 100644 --- a/CoreStoreTests/GroupByTests.swift +++ b/CoreStoreTests/GroupByTests.swift @@ -68,7 +68,7 @@ final class GroupByTests: BaseTestCase { let groupBy = GroupBy(#keyPath(TestEntity1.testString)) - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() try From().applyToFetchRequest(request, context: dataStack.mainContext) groupBy.applyToFetchRequest(request) diff --git a/CoreStoreTests/OrderByTests.swift b/CoreStoreTests/OrderByTests.swift index 1a87633..e7fd03c 100644 --- a/CoreStoreTests/OrderByTests.swift +++ b/CoreStoreTests/OrderByTests.swift @@ -179,7 +179,7 @@ final class OrderByTests: XCTestCase { dynamic func test_ThatOrderByClauses_ApplyToFetchRequestsCorrectly() { let orderBy = OrderBy(.ascending("key")) - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() orderBy.applyToFetchRequest(request) XCTAssertNotNil(request.sortDescriptors) XCTAssertEqual(request.sortDescriptors ?? [], orderBy.sortDescriptors) diff --git a/CoreStoreTests/TweakTests.swift b/CoreStoreTests/TweakTests.swift index 467c1e5..5d435ec 100644 --- a/CoreStoreTests/TweakTests.swift +++ b/CoreStoreTests/TweakTests.swift @@ -43,7 +43,7 @@ final class TweakTests: XCTestCase { $0.fetchLimit = 200 $0.predicate = predicate } - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() tweak.applyToFetchRequest(request) XCTAssertEqual(request.fetchOffset, 100) XCTAssertEqual(request.fetchLimit, 200) diff --git a/CoreStoreTests/WhereTests.swift b/CoreStoreTests/WhereTests.swift index e386bbf..231976a 100644 --- a/CoreStoreTests/WhereTests.swift +++ b/CoreStoreTests/WhereTests.swift @@ -583,7 +583,7 @@ final class WhereTests: XCTestCase { dynamic func test_ThatWhereClauses_ApplyToFetchRequestsCorrectly() { let whereClause = Where("key", isEqualTo: "value") - let request = CoreStoreFetchRequest() + let request = NSFetchRequest() whereClause.applyToFetchRequest(request) XCTAssertNotNil(request.predicate) XCTAssertEqual(request.predicate, whereClause.predicate) diff --git a/Package.swift b/Package.swift index 73d09d0..271d129 100644 --- a/Package.swift +++ b/Package.swift @@ -1,3 +1,4 @@ +// swift-tools-version:4.2 // // Package.swift // CoreStore @@ -25,21 +26,18 @@ import PackageDescription -let targets: [Target] -#if os(iOS) -targets = [Target(name: "CoreStore iOS")] -#elseif os(macOS) -targets = [Target(name: "CoreStore OSX")] -#elseif os(watchOS) -targets = [Target(name: "CoreStore watchOS")] -#elseif os(tvOS) -targets = [Target(name: "CoreStore tvOS")] -#else -targets = [] -#endif - let package = Package( name: "CoreStore", - targets: targets, - exclude: ["Carthage", "CoreStoreDemo", "Sources/libA/images"] + products: [ + .library(name: "CoreStore", type: .static, targets: ["CoreStore"]) + ], + dependencies: [], + targets: [ + .target( + name: "CoreStore", + dependencies: [], + path: "Sources", + exclude: ["CoreStoreBridge.h", "CoreStoreBridge.m"] + ) + ] ) diff --git a/Sources/CoreStore+CustomDebugStringConvertible.swift b/Sources/CoreStore+CustomDebugStringConvertible.swift index 90eb223..f810495 100644 --- a/Sources/CoreStore+CustomDebugStringConvertible.swift +++ b/Sources/CoreStore+CustomDebugStringConvertible.swift @@ -1286,7 +1286,10 @@ extension NSEntityDescription: CoreStoreDebugStringConvertible { info.append(("compoundIndexes", self.compoundIndexes)) } - info.append(("uniquenessConstraints", self.uniquenessConstraints)) + if #available(macOS 10.11, *) { + + info.append(("uniquenessConstraints", self.uniquenessConstraints)) + } return createFormattedString( "(", ")", info diff --git a/Sources/CoreStoreBridge.h b/Sources/CoreStoreBridge.h index 06e8f3c..6956619 100644 --- a/Sources/CoreStoreBridge.h +++ b/Sources/CoreStoreBridge.h @@ -564,16 +564,4 @@ CORESTORE_EXTERN CSWhere *_Nonnull CSWherePredicate(NSPredicate *_Nonnull predicate) CORESTORE_RETURNS_RETAINED; -#pragma mark CoreStoreFetchRequest - -// Bugfix for NSFetchRequest messing up memory management for `affectedStores` -// http://stackoverflow.com/questions/14396375/nsfetchedresultscontroller-crashes-in-ios-6-if-affectedstores-is-specified -NS_SWIFT_NAME(CoreStoreFetchRequest) -@interface _CSFetchRequest: NSFetchRequest - -@property (nullable, nonatomic, copy, readonly) NSArray *safeAffectedStores; - -@end - - #endif /* CoreStoreBridge_h */ diff --git a/Sources/CoreStoreBridge.m b/Sources/CoreStoreBridge.m index 8f5db66..3254b86 100644 --- a/Sources/CoreStoreBridge.m +++ b/Sources/CoreStoreBridge.m @@ -218,40 +218,3 @@ CSWhere *_Nonnull CSWherePredicate(NSPredicate *_Nonnull predicate) CORESTORE_RE return [[CSWhere alloc] initWithPredicate:predicate]; } - - -#pragma mark CoreStoreFetchRequest - -@interface _CSFetchRequest () - -@property (nullable, nonatomic, copy) NSArray *safeAffectedStores; -@property (nullable, nonatomic, assign) CFArrayRef releaseArray; - -@end - -@implementation _CSFetchRequest - -// MARK: NSFetchRequest - -- (void)setAffectedStores:(NSArray *_Nullable)affectedStores { - - if (NSFoundationVersionNumber < NSFoundationVersionNumber10_0 - || [[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){ 11, 0, 0 }]) { - - self.safeAffectedStores = affectedStores; - [super setAffectedStores:affectedStores]; - return; - } - // Bugfix for NSFetchRequest messing up memory management for `affectedStores` - // http://stackoverflow.com/questions/14396375/nsfetchedresultscontroller-crashes-in-ios-6-if-affectedstores-is-specified - if (self.releaseArray != NULL) { - - CFRelease(self.releaseArray); - self.releaseArray = NULL; - } - self.safeAffectedStores = affectedStores; - [super setAffectedStores:affectedStores]; - self.releaseArray = CFBridgingRetain([super affectedStores]); -} - -@end diff --git a/Sources/CoreStoreFetchRequest+CoreStore.swift b/Sources/CoreStoreFetchRequest+CoreStore.swift deleted file mode 100644 index c607038..0000000 --- a/Sources/CoreStoreFetchRequest+CoreStore.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// CoreStoreFetchRequest+CoreStore.swift -// CoreStore -// -// Copyright © 2018 John Rommel Estropia -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// - -import Foundation -import CoreData - - -// MARK: - CoreStoreFetchRequest - -extension CoreStoreFetchRequest { - - // MARK: Internal - - @nonobjc @inline(__always) - internal func dynamicCast() -> NSFetchRequest { - - return unsafeBitCast(self, to: NSFetchRequest.self) - } -} diff --git a/Sources/CoreStoreSchema.swift b/Sources/CoreStoreSchema.swift index 81f9db2..0db2166 100644 --- a/Sources/CoreStoreSchema.swift +++ b/Sources/CoreStoreSchema.swift @@ -450,15 +450,18 @@ public final class CoreStoreSchema: DynamicSchema { ) } for (entity, entityDescription) in entityDescriptionsByEntity { - - let uniqueConstraints = entity.uniqueConstraints.filter({ !$0.isEmpty }) - if !uniqueConstraints.isEmpty { + + if #available(macOS 10.11, *) { - CoreStore.assert( - entityDescription.superentity == nil, - "Uniqueness constraints must be defined at the highest level possible." - ) - entityDescription.uniquenessConstraints = entity.uniqueConstraints.map { $0.map { $0 as NSString } } + let uniqueConstraints = entity.uniqueConstraints.filter({ !$0.isEmpty }) + if !uniqueConstraints.isEmpty { + + CoreStore.assert( + entityDescription.superentity == nil, + "Uniqueness constraints must be defined at the highest level possible." + ) + entityDescription.uniquenessConstraints = entity.uniqueConstraints.map { $0.map { $0 as NSString } } + } } guard !entity.indexes.isEmpty else { diff --git a/Sources/DataStack+Migration.swift b/Sources/DataStack+Migration.swift index 23b8e78..f2c1434 100644 --- a/Sources/DataStack+Migration.swift +++ b/Sources/DataStack+Migration.swift @@ -749,7 +749,16 @@ extension DataStack { } } let fileManager = FileManager.default - let temporaryDirectoryURL = fileManager.temporaryDirectory + let systemTemporaryDirectoryURL: URL + if #available(macOS 10.12, *) { + + systemTemporaryDirectoryURL = fileManager.temporaryDirectory + } + else { + + systemTemporaryDirectoryURL = URL(fileURLWithPath: NSTemporaryDirectory()) + } + let temporaryDirectoryURL = systemTemporaryDirectoryURL .appendingPathComponent(Bundle.main.bundleIdentifier ?? "com.CoreStore.DataStack") .appendingPathComponent(ProcessInfo().globallyUniqueString) diff --git a/Sources/DynamicKeyPath.swift b/Sources/DynamicKeyPath.swift index f094a1f..ef7f365 100644 --- a/Sources/DynamicKeyPath.swift +++ b/Sources/DynamicKeyPath.swift @@ -24,6 +24,7 @@ // import Foundation +import CoreData // MARK: - AnyDynamicKeyPath diff --git a/Sources/DynamicObject.swift b/Sources/DynamicObject.swift index cf95438..49931ae 100644 --- a/Sources/DynamicObject.swift +++ b/Sources/DynamicObject.swift @@ -24,6 +24,7 @@ // import Foundation +import CoreData // MARK: - DynamicObject diff --git a/Sources/Entity.swift b/Sources/Entity.swift index 506893a..38986e2 100644 --- a/Sources/Entity.swift +++ b/Sources/Entity.swift @@ -70,7 +70,8 @@ public final class Entity: DynamicEntity { - parameter indexes: the compound indexes for the entity as an array of arrays. The arrays contained in the returned array contain `KeyPath`s to properties of the entity. - parameter uniqueConstraints: sets uniqueness constraints for the entity. A uniqueness constraint is a set of one or more `KeyPath`s whose value must be unique over the set of instances of that entity. This value forms part of the entity's version hash. Uniqueness constraint violations can be computationally expensive to handle. It is highly suggested that there be only one uniqueness constraint per entity hierarchy. Uniqueness constraints must be defined at the highest level possible, and CoreStore will raise an assertion failure if unique constraints are added to a sub entity. */ - public convenience init(_ entityName: String, isAbstract: Bool = false, versionHashModifier: String? = nil, indexes: [[PartialKeyPath]] = [], uniqueConstraints: [[PartialKeyPath]] = []) { + @available(macOS 10.11, *) + public convenience init(_ entityName: String, isAbstract: Bool = false, versionHashModifier: String? = nil, indexes: [[PartialKeyPath]] = [], uniqueConstraints: [[PartialKeyPath]]) { self.init( O.self, @@ -81,6 +82,28 @@ public final class Entity: DynamicEntity { uniqueConstraints: uniqueConstraints ) } + + /** + Initializes an `Entity`. Always provide a concrete generic type to `Entity`. + ``` + Entity("Animal") + ``` + - parameter entityName: the `NSEntityDescription` name to use for the entity + - parameter isAbstract: set to `true` if the entity is meant to be an abstract class and can only be initialized with subclass types. + - parameter versionHashModifier: the version hash modifier for the entity. Used to mark or denote an entity as being a different "version" than another even if all of the values which affect persistence are equal. (Such a difference is important in cases where, for example, the structure of an entity is unchanged but the format or content of data has changed.) + - parameter indexes: the compound indexes for the entity as an array of arrays. The arrays contained in the returned array contain `KeyPath`s to properties of the entity. + */ + public convenience init(_ entityName: String, isAbstract: Bool = false, versionHashModifier: String? = nil, indexes: [[PartialKeyPath]] = []) { + + self.init( + O.self, + entityName, + isAbstract: isAbstract, + versionHashModifier: versionHashModifier, + indexes: indexes, + uniqueConstraints: [] + ) + } /** Initializes an `Entity`. @@ -94,7 +117,8 @@ public final class Entity: DynamicEntity { - parameter indexes: the compound indexes for the entity as an array of arrays. The arrays contained in the returned array contain KeyPath's to properties of the entity. - parameter uniqueConstraints: sets uniqueness constraints for the entity. A uniqueness constraint is a set of one or more `KeyPath`s whose value must be unique over the set of instances of that entity. This value forms part of the entity's version hash. Uniqueness constraint violations can be computationally expensive to handle. It is highly suggested that there be only one uniqueness constraint per entity hierarchy. Uniqueness constraints must be defined at the highest level possible, and CoreStore will raise an assertion failure if unique constraints are added to a sub entity. */ - public init(_ type: O.Type, _ entityName: String, isAbstract: Bool = false, versionHashModifier: String? = nil, indexes: [[PartialKeyPath]] = [], uniqueConstraints: [[PartialKeyPath]] = []) { + @available(macOS 10.11, *) + public init(_ type: O.Type, _ entityName: String, isAbstract: Bool = false, versionHashModifier: String? = nil, indexes: [[PartialKeyPath]] = [], uniqueConstraints: [[PartialKeyPath]]) { let meta = O.meta let toStringArray: ([PartialKeyPath]) -> [KeyPathString] = { @@ -113,6 +137,38 @@ public final class Entity: DynamicEntity { uniqueConstraints: uniqueConstraints.map(toStringArray) ) } + + /** + Initializes an `Entity`. + ``` + Entity(Animal.self, "Animal") + ``` + - parameter type: the `DynamicObject` type associated with the entity + - parameter entityName: the `NSEntityDescription` name to use for the entity + - parameter isAbstract: set to `true` if the entity is meant to be an abstract class and can only be initialized with subclass types. + - parameter versionHashModifier: the version hash modifier for the entity. Used to mark or denote an entity as being a different "version" than another even if all of the values which affect persistence are equal. (Such a difference is important in cases where, for example, the structure of an entity is unchanged but the format or content of data has changed.) + - parameter indexes: the compound indexes for the entity as an array of arrays. The arrays contained in the returned array contain KeyPath's to properties of the entity. + - parameter uniqueConstraints: sets uniqueness constraints for the entity. A uniqueness constraint is a set of one or more `KeyPath`s whose value must be unique over the set of instances of that entity. This value forms part of the entity's version hash. Uniqueness constraint violations can be computationally expensive to handle. It is highly suggested that there be only one uniqueness constraint per entity hierarchy. Uniqueness constraints must be defined at the highest level possible, and CoreStore will raise an assertion failure if unique constraints are added to a sub entity. + */ + public init(_ type: O.Type, _ entityName: String, isAbstract: Bool = false, versionHashModifier: String? = nil, indexes: [[PartialKeyPath]] = []) { + + let meta = O.meta + let toStringArray: ([PartialKeyPath]) -> [KeyPathString] = { + + return $0.map { + + return (meta[keyPath: $0] as! AnyDynamicKeyPath).cs_keyPathString + } + } + super.init( + type: type, + entityName: entityName, + isAbstract: isAbstract, + versionHashModifier: versionHashModifier, + indexes: indexes.map(toStringArray), + uniqueConstraints: [] + ) + } } diff --git a/Sources/ListMonitor.swift b/Sources/ListMonitor.swift index 06c9abd..a7e1b28 100644 --- a/Sources/ListMonitor.swift +++ b/Sources/ListMonitor.swift @@ -1047,7 +1047,7 @@ public final class ListMonitor: Hashable { private static func recreateFetchedResultsController(context: NSManagedObjectContext, from: From, sectionBy: SectionBy?, applyFetchClauses: @escaping (_ fetchRequest: NSFetchRequest) -> Void) -> (controller: CoreStoreFetchedResultsController, delegate: FetchedResultsControllerDelegate) { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() fetchRequest.fetchLimit = 0 fetchRequest.resultType = .managedObjectResultType fetchRequest.fetchBatchSize = 20 @@ -1056,7 +1056,7 @@ public final class ListMonitor: Hashable { let fetchedResultsController = CoreStoreFetchedResultsController( context: context, - fetchRequest: fetchRequest.dynamicCast(), + fetchRequest: fetchRequest, from: from, sectionBy: sectionBy, applyFetchClauses: applyFetchClauses @@ -1114,7 +1114,7 @@ public final class ListMonitor: Hashable { self.isPersistentStoreChanging = true guard let removedStores = (note.userInfo?[NSRemovedPersistentStoresKey] as? [NSPersistentStore]).flatMap(Set.init), - !Set((self.fetchedResultsController.fetchRequest as Any as! CoreStoreFetchRequest).safeAffectedStores ?? []).intersection(removedStores).isEmpty else { + !Set(self.fetchedResultsController.fetchRequest.affectedStores ?? []).intersection(removedStores).isEmpty else { return } @@ -1135,7 +1135,7 @@ public final class ListMonitor: Hashable { if !self.isPendingRefetch { - let previousStores = Set((self.fetchedResultsController.fetchRequest as Any as! CoreStoreFetchRequest).safeAffectedStores ?? []) + let previousStores = Set(self.fetchedResultsController.fetchRequest.affectedStores ?? []) let currentStores = previousStores .subtracting(note.userInfo?[NSRemovedPersistentStoresKey] as? [NSPersistentStore] ?? []) .union(note.userInfo?[NSAddedPersistentStoresKey] as? [NSPersistentStore] ?? []) diff --git a/Sources/NSFetchedResultsController+Convenience.swift b/Sources/NSFetchedResultsController+Convenience.swift index 9d8ad93..5fa63fa 100644 --- a/Sources/NSFetchedResultsController+Convenience.swift +++ b/Sources/NSFetchedResultsController+Convenience.swift @@ -205,7 +205,7 @@ fileprivate func createFRC(fromContext context: NSManagedObj let controller = CoreStoreFetchedResultsController( context: context, - fetchRequest: CoreStoreFetchRequest().dynamicCast(), + fetchRequest: NSFetchRequest(), from: from, sectionBy: sectionBy, applyFetchClauses: { (fetchRequest) in diff --git a/Sources/NSFetchedResultsController+ObjectiveC.swift b/Sources/NSFetchedResultsController+ObjectiveC.swift index 0a47ed4..0851666 100644 --- a/Sources/NSFetchedResultsController+ObjectiveC.swift +++ b/Sources/NSFetchedResultsController+ObjectiveC.swift @@ -72,7 +72,7 @@ fileprivate func createFRC(fromContext context: NSManagedObjectContext, from: CS let controller = CoreStoreFetchedResultsController( context: context, - fetchRequest: CoreStoreFetchRequest().dynamicCast(), + fetchRequest: NSFetchRequest(), from: from.bridgeToSwift, sectionBy: sectionBy?.bridgeToSwift, applyFetchClauses: { (fetchRequest) in diff --git a/Sources/NSManagedObjectContext+ObjectiveC.swift b/Sources/NSManagedObjectContext+ObjectiveC.swift index 9a7e72f..bc52ca0 100644 --- a/Sources/NSManagedObjectContext+ObjectiveC.swift +++ b/Sources/NSManagedObjectContext+ObjectiveC.swift @@ -36,105 +36,107 @@ extension NSManagedObjectContext { @nonobjc internal func fetchOne(_ from: CSFrom, _ fetchClauses: [CSFetchClause]) throws -> NSManagedObject? { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 1 fetchRequest.resultType = .managedObjectResultType - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } - return try self.fetchOne(fetchRequest.dynamicCast()) + return try self.fetchOne(fetchRequest) } @nonobjc internal func fetchAll(_ from: CSFrom, _ fetchClauses: [CSFetchClause]) throws -> [T] { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 fetchRequest.resultType = .managedObjectResultType - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } - return try self.fetchAll(fetchRequest.dynamicCast()) + return try self.fetchAll(fetchRequest) } @nonobjc internal func fetchCount(_ from: CSFrom, _ fetchClauses: [CSFetchClause]) throws -> Int { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } - return try self.fetchCount(fetchRequest.dynamicCast()) + fetchRequest.resultType = .countResultType + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } + + return try self.fetchCount(fetchRequest) } @nonobjc internal func fetchObjectID(_ from: CSFrom, _ fetchClauses: [CSFetchClause]) throws -> NSManagedObjectID? { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 1 fetchRequest.resultType = .managedObjectIDResultType - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } - return try self.fetchObjectID(fetchRequest.dynamicCast()) + return try self.fetchObjectID(fetchRequest) } @nonobjc internal func fetchObjectIDs(_ from: CSFrom, _ fetchClauses: [CSFetchClause]) throws -> [NSManagedObjectID] { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 fetchRequest.resultType = .managedObjectIDResultType - fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } + fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } - return try self.fetchObjectIDs(fetchRequest.dynamicCast()) + return try self.fetchObjectIDs(fetchRequest) } @nonobjc internal func deleteAll(_ from: CSFrom, _ deleteClauses: [CSDeleteClause]) throws -> Int { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 fetchRequest.resultType = .managedObjectResultType fetchRequest.returnsObjectsAsFaults = true fetchRequest.includesPropertyValues = false - deleteClauses.forEach { $0.applyToFetchRequest(fetchRequest) } + deleteClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } - return try self.deleteAll(fetchRequest.dynamicCast()) + return try self.deleteAll(fetchRequest) } @nonobjc internal func queryValue(_ from: CSFrom, _ selectClause: CSSelect, _ queryClauses: [CSQueryClause]) throws -> Any? { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 - selectClause.applyToFetchRequest(fetchRequest) - queryClauses.forEach { $0.applyToFetchRequest(fetchRequest) } + selectClause.applyToFetchRequest(fetchRequest as! NSFetchRequest) + queryClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } - return try self.queryValue(selectClause.selectTerms, fetchRequest: fetchRequest.dynamicCast()) + return try self.queryValue(selectClause.selectTerms, fetchRequest: fetchRequest) } @nonobjc internal func queryAttributes(_ from: CSFrom, _ selectClause: CSSelect, _ queryClauses: [CSQueryClause]) throws -> [[String: Any]] { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() try from.bridgeToSwift.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 - selectClause.applyToFetchRequest(fetchRequest) - queryClauses.forEach { $0.applyToFetchRequest(fetchRequest) } + selectClause.applyToFetchRequest(fetchRequest as! NSFetchRequest) + queryClauses.forEach { $0.applyToFetchRequest(fetchRequest as! NSFetchRequest) } - return try self.queryAttributes(fetchRequest.dynamicCast()) + return try self.queryAttributes(fetchRequest) } } diff --git a/Sources/NSManagedObjectContext+Querying.swift b/Sources/NSManagedObjectContext+Querying.swift index 819536e..fe8b05d 100644 --- a/Sources/NSManagedObjectContext+Querying.swift +++ b/Sources/NSManagedObjectContext+Querying.swift @@ -109,14 +109,14 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc public func fetchOne(_ from: From, _ fetchClauses: [FetchClause]) throws -> D? { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 1 fetchRequest.resultType = .managedObjectResultType fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } - return try self.fetchOne(fetchRequest.dynamicCast()).flatMap(from.entityClass.cs_fromRaw) + return try self.fetchOne(fetchRequest).flatMap(from.entityClass.cs_fromRaw) } @nonobjc @@ -134,7 +134,7 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc public func fetchAll(_ from: From, _ fetchClauses: [FetchClause]) throws -> [D] { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 @@ -142,7 +142,7 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } let entityClass = from.entityClass - return try self.fetchAll(fetchRequest.dynamicCast()).map(entityClass.cs_fromRaw) + return try self.fetchAll(fetchRequest).map(entityClass.cs_fromRaw) } @nonobjc @@ -160,11 +160,13 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc public func fetchCount(_ from: From, _ fetchClauses: [FetchClause]) throws -> Int { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) + + fetchRequest.resultType = .countResultType fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } - return try self.fetchCount(fetchRequest.dynamicCast()) + return try self.fetchCount(fetchRequest) } @nonobjc @@ -182,14 +184,14 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc public func fetchObjectID(_ from: From, _ fetchClauses: [FetchClause]) throws -> NSManagedObjectID? { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 1 fetchRequest.resultType = .managedObjectIDResultType fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } - return try self.fetchObjectID(fetchRequest.dynamicCast()) + return try self.fetchObjectID(fetchRequest) } @nonobjc @@ -206,15 +208,15 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc public func fetchObjectIDs(_ from: From, _ fetchClauses: [FetchClause]) throws -> [NSManagedObjectID] { - - let fetchRequest = CoreStoreFetchRequest() + + let fetchRequest = NSFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 fetchRequest.resultType = .managedObjectIDResultType fetchClauses.forEach { $0.applyToFetchRequest(fetchRequest) } - return try self.fetchObjectIDs(fetchRequest.dynamicCast()) + return try self.fetchObjectIDs(fetchRequest) } @nonobjc @@ -263,7 +265,7 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc public func queryValue(_ from: From, _ selectClause: Select, _ queryClauses: [QueryClause]) throws -> U? { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 @@ -289,7 +291,7 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc public func queryAttributes(_ from: From, _ selectClause: Select, _ queryClauses: [QueryClause]) throws -> [[String: Any]] { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 @@ -320,7 +322,7 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { @nonobjc internal func deleteAll(_ from: From, _ deleteClauses: [FetchClause]) throws -> Int { - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() try from.applyToFetchRequest(fetchRequest, context: self) fetchRequest.fetchLimit = 0 @@ -329,7 +331,7 @@ extension NSManagedObjectContext: FetchableSource, QueryableSource { fetchRequest.includesPropertyValues = false deleteClauses.forEach { $0.applyToFetchRequest(fetchRequest) } - return try self.deleteAll(fetchRequest.dynamicCast()) + return try self.deleteAll(fetchRequest) } @@ -406,7 +408,7 @@ extension NSManagedObjectContext { } @nonobjc - internal func fetchCount(_ fetchRequest: NSFetchRequest) throws -> Int { + internal func fetchCount(_ fetchRequest: NSFetchRequest) throws -> Int { var count = 0 var countError: Error? @@ -465,7 +467,7 @@ extension NSManagedObjectContext { // MARK: Querying @nonobjc - internal func queryValue(_ selectTerms: [SelectTerm], fetchRequest: NSFetchRequest) throws -> U? { + internal func queryValue(_ selectTerms: [SelectTerm], fetchRequest: NSFetchRequest) throws -> U? { var fetchResults: [Any]? var fetchError: Error? @@ -498,7 +500,7 @@ extension NSManagedObjectContext { } @nonobjc - internal func queryValue(_ selectTerms: [SelectTerm], fetchRequest: NSFetchRequest) throws -> Any? { + internal func queryValue(_ selectTerms: [SelectTerm], fetchRequest: NSFetchRequest) throws -> Any? { var fetchResults: [Any]? var fetchError: Error? @@ -531,7 +533,7 @@ extension NSManagedObjectContext { } @nonobjc - internal func queryAttributes(_ fetchRequest: NSFetchRequest) throws -> [[String: Any]] { + internal func queryAttributes(_ fetchRequest: NSFetchRequest) throws -> [[String: Any]] { var fetchResults: [Any]? var fetchError: Error? diff --git a/Sources/ObjectMonitor.swift b/Sources/ObjectMonitor.swift index 8d2b8bc..2c06782 100644 --- a/Sources/ObjectMonitor.swift +++ b/Sources/ObjectMonitor.swift @@ -261,7 +261,7 @@ public final class ObjectMonitor: Equatable { private init(context: NSManagedObjectContext, object: ObjectType) { let objectID = object.cs_id() - let fetchRequest = CoreStoreFetchRequest() + let fetchRequest = NSFetchRequest() fetchRequest.entity = objectID.entity fetchRequest.fetchLimit = 0 fetchRequest.resultType = .managedObjectResultType @@ -271,7 +271,7 @@ public final class ObjectMonitor: Equatable { let fetchedResultsController = CoreStoreFetchedResultsController( context: context, - fetchRequest: fetchRequest.dynamicCast(), + fetchRequest: fetchRequest, from: From([objectID.persistentStore?.configurationName]), applyFetchClauses: Where("SELF", isEqualTo: objectID).applyToFetchRequest ) diff --git a/Sources/Select.swift b/Sources/Select.swift index a90579f..1edc2fb 100644 --- a/Sources/Select.swift +++ b/Sources/Select.swift @@ -722,7 +722,7 @@ public struct Select: SelectClause, Hasha // MARK: Internal - internal func applyToFetchRequest(_ fetchRequest: NSFetchRequest) { + internal func applyToFetchRequest(_ fetchRequest: NSFetchRequest) { fetchRequest.includesPendingChanges = false fetchRequest.resultType = .dictionaryResultType