diff --git a/Cartfile b/Cartfile index 4f4c0f2..b322e93 100644 --- a/Cartfile +++ b/Cartfile @@ -1 +1 @@ -github "JohnEstropia/GCDKit" == 1.2.5 +github "JohnEstropia/GCDKit" == 1.2.6 diff --git a/Cartfile.resolved b/Cartfile.resolved index e66b3b5..86ed4b6 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1 +1 @@ -github "JohnEstropia/GCDKit" "1.2.5" +github "JohnEstropia/GCDKit" "1.2.6" diff --git a/CoreStore.podspec b/CoreStore.podspec index 4044620..dd137c4 100644 --- a/CoreStore.podspec +++ b/CoreStore.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "CoreStore" - s.version = "2.0.0" + s.version = "2.0.3" s.license = "MIT" s.summary = "Unleashing the real power of Core Data with the elegance and safety of Swift" s.homepage = "https://github.com/JohnEstropia/CoreStore" @@ -19,5 +19,5 @@ Pod::Spec.new do |s| s.pod_target_xcconfig = { 'OTHER_SWIFT_FLAGS' => '-D USE_FRAMEWORKS', 'GCC_PREPROCESSOR_DEFINITIONS' => 'USE_FRAMEWORKS=1' } - s.dependency "GCDKit", "1.2.5" + s.dependency "GCDKit", "1.2.6" end \ No newline at end of file diff --git a/CoreStore.xcodeproj/project.pbxproj b/CoreStore.xcodeproj/project.pbxproj index 067b58c..759b0b4 100644 --- a/CoreStore.xcodeproj/project.pbxproj +++ b/CoreStore.xcodeproj/project.pbxproj @@ -2111,6 +2111,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + APPLICATION_EXTENSION_API_ONLY = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -2166,6 +2167,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + APPLICATION_EXTENSION_API_ONLY = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -2355,7 +2357,6 @@ B52DD1851BE1F8CD00949AFE /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; @@ -2381,7 +2382,6 @@ B52DD1861BE1F8CD00949AFE /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = "-"; COMBINE_HIDPI_IMAGES = YES; diff --git a/CoreStoreTests/ErrorTests.swift b/CoreStoreTests/ErrorTests.swift index 4c526b2..227f969 100644 --- a/CoreStoreTests/ErrorTests.swift +++ b/CoreStoreTests/ErrorTests.swift @@ -147,7 +147,7 @@ final class ErrorTests: XCTestCase { "key3": Date() ] ) - let error = CoreStoreError.internalError(NSError: internalError) + let error = CoreStoreError(internalError) XCTAssertEqual((error as NSError).domain, CoreStoreErrorDomain) XCTAssertEqual((error as NSError).code, CoreStoreErrorCode.internalError.rawValue) diff --git a/Package.swift b/Package.swift index a0d5c0d..0ab361a 100644 --- a/Package.swift +++ b/Package.swift @@ -44,7 +44,7 @@ let package = Package( dependencies: [ .Package( url: "https://github.com/JohnEstropia/GCDKit.git", - majorVersion: 1, minor: 2 + "1.2.6" ) ], exclude: ["Carthage", "CoreStoreDemo", "Sources/libA/images"] diff --git a/Sources/Fetching and Querying/Concrete Clauses/Select.swift b/Sources/Fetching and Querying/Concrete Clauses/Select.swift index 5727f60..b51983d 100644 --- a/Sources/Fetching and Querying/Concrete Clauses/Select.swift +++ b/Sources/Fetching and Querying/Concrete Clauses/Select.swift @@ -745,9 +745,28 @@ internal extension Collection where Iterator.Element == SelectTerm { fetchRequest.includesPendingChanges = false fetchRequest.resultType = .dictionaryResultType - let entityDescription = fetchRequest.entity! - let propertiesByName = entityDescription.propertiesByName - let attributesByName = entityDescription.attributesByName + func attributeDescriptionForKeyPath(keyPath: String, inEntity entity: NSEntityDescription) -> NSAttributeDescription? { + + let components = keyPath.componentsSeparatedByString(".") + switch components.count { + + case 0: + return nil + + case 1: + return entity.attributesByName[components[0]] + + default: + guard let relationship = entity.relationshipsByName[components[0]] else { + + return nil + } + return attributeDescriptionForKeyPath( + components.dropFirst().joinWithSeparator("."), + inEntity: relationship.entity + ) + } + } var propertiesToFetch = [AnyObject]() for term in self { @@ -755,20 +774,22 @@ internal extension Collection where Iterator.Element == SelectTerm { switch term { case ._attribute(let keyPath): - if let propertyDescription = propertiesByName[keyPath] { + let entityDescription = fetchRequest.entity! + if let attributeDescription = attributeDescriptionForKeyPath(keyPath, inEntity: entityDescription) { - propertiesToFetch.append(propertyDescription) + propertiesToFetch.append(attributeDescription) } else { CoreStore.log( .warning, - message: "The property \"\(keyPath)\" does not exist in entity \(cs_typeName(entityDescription.managedObjectClassName)) and will be ignored by \(cs_typeName(owner)) query clause." + message: "The key path \"\(keyPath)\" could not be resolved in entity \(cs_typeName(entityDescription.managedObjectClassName)) as an attribute and will be ignored by \(cs_typeName(owner)) query clause." ) } case ._aggregate(let function, let keyPath, let alias, let nativeType): - if let attributeDescription = attributesByName[keyPath] { + let entityDescription = fetchRequest.entity! + if let attributeDescription = attributeDescriptionForKeyPath(keyPath, inEntity: entityDescription) { let expressionDescription = NSExpressionDescription() expressionDescription.name = alias @@ -784,14 +805,13 @@ internal extension Collection where Iterator.Element == SelectTerm { forFunction: function, arguments: [NSExpression(forKeyPath: keyPath)] ) - propertiesToFetch.append(expressionDescription) } else { CoreStore.log( .warning, - message: "The attribute \"\(keyPath)\" does not exist in entity \(cs_typeName(entityDescription.managedObjectClassName)) and will be ignored by \(cs_typeName(owner)) query clause." + message: "The key path \"\(keyPath)\" could not be resolved in entity \(cs_typeName(entityDescription.managedObjectClassName)) as an attribute and will be ignored by \(cs_typeName(owner)) query clause." ) } diff --git a/Sources/Info.plist b/Sources/Info.plist index 7e7479f..0de69c1 100644 --- a/Sources/Info.plist +++ b/Sources/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 2.0.0 + 2.0.3 CFBundleSignature ???? CFBundleVersion diff --git a/Sources/ObjectiveC/CSError.swift b/Sources/ObjectiveC/CSError.swift index fb03980..6caf96f 100644 --- a/Sources/ObjectiveC/CSError.swift +++ b/Sources/ObjectiveC/CSError.swift @@ -248,9 +248,17 @@ internal extension ErrorProtocol { switch self { - case let error as CoreStoreError: return error - case let error as CSError: return error.bridgeToSwift - default: return .unknown + case let error as CoreStoreError: + return error + + case let error as CSError: + return error.bridgeToSwift + + case let error as NSError where self.dynamicType is NSError.Type: + return .internalError(NSError: error) + + default: + return .unknown } } @@ -258,9 +266,14 @@ internal extension ErrorProtocol { switch self { - case let error as CoreStoreError: return error.bridgeToObjectiveC - case let error as CSError: return error - default: return self as NSError + case let error as CoreStoreError: + return error.bridgeToObjectiveC + + case let error as CSError: + return error + + default: + return self as NSError } } }