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
}
}
}