diff --git a/.gitmodules b/.gitmodules index 5fec53f..a03a488 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "Carthage/Checkouts/GCDKit"] path = Carthage/Checkouts/GCDKit url = https://github.com/JohnEstropia/GCDKit.git +[submodule "Carthage/Checkouts/Nimble"] + path = Carthage/Checkouts/Nimble + url = https://github.com/younata/Nimble.git diff --git a/Cartfile b/Cartfile index 849cd7e..d36a81c 100644 --- a/Cartfile +++ b/Cartfile @@ -1 +1,2 @@ github "JohnEstropia/GCDKit" == 1.2.0 +github "younata/Nimble" "swift2.2" diff --git a/Cartfile.resolved b/Cartfile.resolved index 65a9da9..d1e4091 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1 +1,2 @@ github "JohnEstropia/GCDKit" "1.2.0" +github "younata/Nimble" "62fe4e736aea9623d90a34d11c39862bb6515da6" diff --git a/Carthage/Checkouts/Nimble b/Carthage/Checkouts/Nimble new file mode 160000 index 0000000..62fe4e7 --- /dev/null +++ b/Carthage/Checkouts/Nimble @@ -0,0 +1 @@ +Subproject commit 62fe4e736aea9623d90a34d11c39862bb6515da6 diff --git a/CoreStore.xcodeproj/project.pbxproj b/CoreStore.xcodeproj/project.pbxproj index 9ff0e22..6d78e2a 100644 --- a/CoreStore.xcodeproj/project.pbxproj +++ b/CoreStore.xcodeproj/project.pbxproj @@ -206,6 +206,133 @@ B56321B61BD6521C006C9394 /* WeakObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E84F2D1AFF849C0064E85B /* WeakObject.swift */; }; B56964D41B22FFAD0075EE4A /* DataStack+Migration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B56964D31B22FFAD0075EE4A /* DataStack+Migration.swift */; }; B56965241B356B820075EE4A /* MigrationResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B56965231B356B820075EE4A /* MigrationResult.swift */; }; + B58B22F51C93C1BA00521925 /* CoreStore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F03A53019C5C6DA005002A5 /* CoreStore.framework */; }; + B58B23DE1C93C36500521925 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22F81C93C26600521925 /* AdapterProtocols.swift */; }; + B58B23DF1C93C36500521925 /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22F91C93C26600521925 /* AssertionDispatcher.swift */; }; + B58B23E01C93C36500521925 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FA1C93C26600521925 /* AssertionRecorder.swift */; }; + B58B23E11C93C36500521925 /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FB1C93C26600521925 /* NimbleEnvironment.swift */; }; + B58B23E21C93C36500521925 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FC1C93C26600521925 /* NimbleXCTestHandler.swift */; }; + B58B23E31C93C36500521925 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FD1C93C26600521925 /* DSL+Wait.swift */; }; + B58B23E41C93C36500521925 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FE1C93C26600521925 /* DSL.swift */; }; + B58B23E51C93C36500521925 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FF1C93C26600521925 /* Expectation.swift */; }; + B58B23E61C93C36500521925 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23001C93C26600521925 /* Expression.swift */; }; + B58B23E71C93C36500521925 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23011C93C26600521925 /* FailureMessage.swift */; }; + B58B23E81C93C36600521925 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22F81C93C26600521925 /* AdapterProtocols.swift */; }; + B58B23E91C93C36600521925 /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22F91C93C26600521925 /* AssertionDispatcher.swift */; }; + B58B23EA1C93C36600521925 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FA1C93C26600521925 /* AssertionRecorder.swift */; }; + B58B23EB1C93C36600521925 /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FB1C93C26600521925 /* NimbleEnvironment.swift */; }; + B58B23EC1C93C36600521925 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FC1C93C26600521925 /* NimbleXCTestHandler.swift */; }; + B58B23ED1C93C36600521925 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FD1C93C26600521925 /* DSL+Wait.swift */; }; + B58B23EE1C93C36600521925 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FE1C93C26600521925 /* DSL.swift */; }; + B58B23EF1C93C36600521925 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FF1C93C26600521925 /* Expectation.swift */; }; + B58B23F01C93C36600521925 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23001C93C26600521925 /* Expression.swift */; }; + B58B23F11C93C36600521925 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23011C93C26600521925 /* FailureMessage.swift */; }; + B58B23F21C93C36700521925 /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22F81C93C26600521925 /* AdapterProtocols.swift */; }; + B58B23F31C93C36700521925 /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22F91C93C26600521925 /* AssertionDispatcher.swift */; }; + B58B23F41C93C36700521925 /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FA1C93C26600521925 /* AssertionRecorder.swift */; }; + B58B23F51C93C36700521925 /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FB1C93C26600521925 /* NimbleEnvironment.swift */; }; + B58B23F61C93C36700521925 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FC1C93C26600521925 /* NimbleXCTestHandler.swift */; }; + B58B23F71C93C36700521925 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FD1C93C26600521925 /* DSL+Wait.swift */; }; + B58B23F81C93C36700521925 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FE1C93C26600521925 /* DSL.swift */; }; + B58B23F91C93C36700521925 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B22FF1C93C26600521925 /* Expectation.swift */; }; + B58B23FA1C93C36700521925 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23001C93C26600521925 /* Expression.swift */; }; + B58B23FB1C93C36700521925 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23011C93C26600521925 /* FailureMessage.swift */; }; + B58B23FC1C93C36E00521925 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23041C93C26600521925 /* AllPass.swift */; }; + B58B23FD1C93C36E00521925 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23051C93C26600521925 /* BeAKindOf.swift */; }; + B58B23FE1C93C36E00521925 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23061C93C26600521925 /* BeAnInstanceOf.swift */; }; + B58B23FF1C93C36E00521925 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23071C93C26600521925 /* BeCloseTo.swift */; }; + B58B24001C93C36E00521925 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23081C93C26600521925 /* BeEmpty.swift */; }; + B58B24011C93C36E00521925 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23091C93C26600521925 /* BeginWith.swift */; }; + B58B24021C93C36E00521925 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230A1C93C26600521925 /* BeGreaterThan.swift */; }; + B58B24031C93C36E00521925 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230B1C93C26600521925 /* BeGreaterThanOrEqualTo.swift */; }; + B58B24041C93C36E00521925 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230C1C93C26600521925 /* BeIdenticalTo.swift */; }; + B58B24051C93C36E00521925 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230D1C93C26600521925 /* BeLessThan.swift */; }; + B58B24061C93C36E00521925 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230E1C93C26600521925 /* BeLessThanOrEqual.swift */; }; + B58B24071C93C36E00521925 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230F1C93C26600521925 /* BeLogical.swift */; }; + B58B24081C93C36E00521925 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23101C93C26600521925 /* BeNil.swift */; }; + B58B24091C93C36E00521925 /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23111C93C26600521925 /* BeVoid.swift */; }; + B58B240A1C93C36E00521925 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23121C93C26600521925 /* Contain.swift */; }; + B58B240B1C93C36E00521925 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23131C93C26600521925 /* EndWith.swift */; }; + B58B240C1C93C36E00521925 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23141C93C26600521925 /* Equal.swift */; }; + B58B240D1C93C36E00521925 /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23151C93C26600521925 /* HaveCount.swift */; }; + B58B240E1C93C36E00521925 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23161C93C26600521925 /* Match.swift */; }; + B58B240F1C93C36E00521925 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23171C93C26600521925 /* MatcherProtocols.swift */; }; + B58B24101C93C36E00521925 /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23181C93C26600521925 /* PostNotification.swift */; }; + B58B24111C93C36E00521925 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23191C93C26600521925 /* RaisesException.swift */; }; + B58B24121C93C36E00521925 /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B231A1C93C26600521925 /* SatisfyAnyOf.swift */; }; + B58B24131C93C36E00521925 /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B231B1C93C26600521925 /* ThrowError.swift */; }; + B58B24141C93C36F00521925 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23041C93C26600521925 /* AllPass.swift */; }; + B58B24151C93C36F00521925 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23051C93C26600521925 /* BeAKindOf.swift */; }; + B58B24161C93C36F00521925 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23061C93C26600521925 /* BeAnInstanceOf.swift */; }; + B58B24171C93C36F00521925 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23071C93C26600521925 /* BeCloseTo.swift */; }; + B58B24181C93C36F00521925 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23081C93C26600521925 /* BeEmpty.swift */; }; + B58B24191C93C36F00521925 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23091C93C26600521925 /* BeginWith.swift */; }; + B58B241A1C93C36F00521925 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230A1C93C26600521925 /* BeGreaterThan.swift */; }; + B58B241B1C93C36F00521925 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230B1C93C26600521925 /* BeGreaterThanOrEqualTo.swift */; }; + B58B241C1C93C36F00521925 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230C1C93C26600521925 /* BeIdenticalTo.swift */; }; + B58B241D1C93C36F00521925 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230D1C93C26600521925 /* BeLessThan.swift */; }; + B58B241E1C93C36F00521925 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230E1C93C26600521925 /* BeLessThanOrEqual.swift */; }; + B58B241F1C93C36F00521925 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230F1C93C26600521925 /* BeLogical.swift */; }; + B58B24201C93C36F00521925 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23101C93C26600521925 /* BeNil.swift */; }; + B58B24211C93C36F00521925 /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23111C93C26600521925 /* BeVoid.swift */; }; + B58B24221C93C36F00521925 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23121C93C26600521925 /* Contain.swift */; }; + B58B24231C93C36F00521925 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23131C93C26600521925 /* EndWith.swift */; }; + B58B24241C93C36F00521925 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23141C93C26600521925 /* Equal.swift */; }; + B58B24251C93C36F00521925 /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23151C93C26600521925 /* HaveCount.swift */; }; + B58B24261C93C36F00521925 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23161C93C26600521925 /* Match.swift */; }; + B58B24271C93C36F00521925 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23171C93C26600521925 /* MatcherProtocols.swift */; }; + B58B24281C93C36F00521925 /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23181C93C26600521925 /* PostNotification.swift */; }; + B58B24291C93C36F00521925 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23191C93C26600521925 /* RaisesException.swift */; }; + B58B242A1C93C36F00521925 /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B231A1C93C26600521925 /* SatisfyAnyOf.swift */; }; + B58B242B1C93C36F00521925 /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B231B1C93C26600521925 /* ThrowError.swift */; }; + B58B242C1C93C37100521925 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23041C93C26600521925 /* AllPass.swift */; }; + B58B242D1C93C37100521925 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23051C93C26600521925 /* BeAKindOf.swift */; }; + B58B242E1C93C37100521925 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23061C93C26600521925 /* BeAnInstanceOf.swift */; }; + B58B242F1C93C37100521925 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23071C93C26600521925 /* BeCloseTo.swift */; }; + B58B24301C93C37100521925 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23081C93C26600521925 /* BeEmpty.swift */; }; + B58B24311C93C37100521925 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23091C93C26600521925 /* BeginWith.swift */; }; + B58B24321C93C37100521925 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230A1C93C26600521925 /* BeGreaterThan.swift */; }; + B58B24331C93C37100521925 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230B1C93C26600521925 /* BeGreaterThanOrEqualTo.swift */; }; + B58B24341C93C37100521925 /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230C1C93C26600521925 /* BeIdenticalTo.swift */; }; + B58B24351C93C37100521925 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230D1C93C26600521925 /* BeLessThan.swift */; }; + B58B24361C93C37100521925 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230E1C93C26600521925 /* BeLessThanOrEqual.swift */; }; + B58B24371C93C37100521925 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B230F1C93C26600521925 /* BeLogical.swift */; }; + B58B24381C93C37100521925 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23101C93C26600521925 /* BeNil.swift */; }; + B58B24391C93C37100521925 /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23111C93C26600521925 /* BeVoid.swift */; }; + B58B243A1C93C37100521925 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23121C93C26600521925 /* Contain.swift */; }; + B58B243B1C93C37100521925 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23131C93C26600521925 /* EndWith.swift */; }; + B58B243C1C93C37100521925 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23141C93C26600521925 /* Equal.swift */; }; + B58B243D1C93C37100521925 /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23151C93C26600521925 /* HaveCount.swift */; }; + B58B243E1C93C37100521925 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23161C93C26600521925 /* Match.swift */; }; + B58B243F1C93C37100521925 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23171C93C26600521925 /* MatcherProtocols.swift */; }; + B58B24401C93C37100521925 /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23181C93C26600521925 /* PostNotification.swift */; }; + B58B24411C93C37100521925 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23191C93C26600521925 /* RaisesException.swift */; }; + B58B24421C93C37100521925 /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B231A1C93C26600521925 /* SatisfyAnyOf.swift */; }; + B58B24431C93C37100521925 /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B231B1C93C26600521925 /* ThrowError.swift */; }; + B58B24441C93C37600521925 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23251C93C26600521925 /* Async.swift */; }; + B58B24451C93C37600521925 /* ExceptionCapture.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23261C93C26600521925 /* ExceptionCapture.swift */; }; + B58B24461C93C37600521925 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23271C93C26600521925 /* Functional.swift */; }; + B58B24471C93C37600521925 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23281C93C26600521925 /* SourceLocation.swift */; }; + B58B24481C93C37600521925 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23291C93C26600521925 /* Stringers.swift */; }; + B58B24491C93C37700521925 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23251C93C26600521925 /* Async.swift */; }; + B58B244A1C93C37700521925 /* ExceptionCapture.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23261C93C26600521925 /* ExceptionCapture.swift */; }; + B58B244B1C93C37700521925 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23271C93C26600521925 /* Functional.swift */; }; + B58B244C1C93C37700521925 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23281C93C26600521925 /* SourceLocation.swift */; }; + B58B244D1C93C37700521925 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23291C93C26600521925 /* Stringers.swift */; }; + B58B244E1C93C37900521925 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23251C93C26600521925 /* Async.swift */; }; + B58B244F1C93C37900521925 /* ExceptionCapture.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23261C93C26600521925 /* ExceptionCapture.swift */; }; + B58B24501C93C37900521925 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23271C93C26600521925 /* Functional.swift */; }; + B58B24511C93C37900521925 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23281C93C26600521925 /* SourceLocation.swift */; }; + B58B24521C93C37900521925 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B23291C93C26600521925 /* Stringers.swift */; }; + B58B24531C93C37E00521925 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B232B1C93C26600521925 /* AsyncMatcherWrapper.swift */; }; + B58B24541C93C37E00521925 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B232C1C93C26600521925 /* MatcherFunc.swift */; }; + B58B24551C93C37E00521925 /* ObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B232D1C93C26600521925 /* ObjCMatcher.swift */; }; + B58B24561C93C38000521925 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B232B1C93C26600521925 /* AsyncMatcherWrapper.swift */; }; + B58B24571C93C38000521925 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B232C1C93C26600521925 /* MatcherFunc.swift */; }; + B58B24581C93C38000521925 /* ObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B232D1C93C26600521925 /* ObjCMatcher.swift */; }; + B58B24591C93C38200521925 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B232B1C93C26600521925 /* AsyncMatcherWrapper.swift */; }; + B58B245A1C93C38200521925 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B232C1C93C26600521925 /* MatcherFunc.swift */; }; + B58B245B1C93C38200521925 /* ObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B232D1C93C26600521925 /* ObjCMatcher.swift */; }; B59851491C90289D00C99590 /* NSPersistentStoreCoordinator+Setup.swift in Sources */ = {isa = PBXBuildFile; fileRef = B59AFF401C6593E400C0ABE2 /* NSPersistentStoreCoordinator+Setup.swift */; }; B598514A1C90289E00C99590 /* NSPersistentStoreCoordinator+Setup.swift in Sources */ = {isa = PBXBuildFile; fileRef = B59AFF401C6593E400C0ABE2 /* NSPersistentStoreCoordinator+Setup.swift */; }; B598514B1C90289F00C99590 /* NSPersistentStoreCoordinator+Setup.swift in Sources */ = {isa = PBXBuildFile; fileRef = B59AFF401C6593E400C0ABE2 /* NSPersistentStoreCoordinator+Setup.swift */; }; @@ -227,6 +354,12 @@ B5D3F6471C887C0A00C7492A /* LegacySQLiteStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5D3F6441C887C0A00C7492A /* LegacySQLiteStore.swift */; }; B5D3F6481C887C0A00C7492A /* LegacySQLiteStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5D3F6441C887C0A00C7492A /* LegacySQLiteStore.swift */; }; B5D5E0CF1A4D6AAB006468AF /* TestEntity2.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5D5E0CE1A4D6AAB006468AF /* TestEntity2.swift */; }; + B5DC47C61C93D22900FA3BF3 /* MigrationChainTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5DC47C51C93D22900FA3BF3 /* MigrationChainTests.swift */; }; + B5DC47C71C93D22900FA3BF3 /* MigrationChainTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5DC47C51C93D22900FA3BF3 /* MigrationChainTests.swift */; }; + B5DC47C81C93D22900FA3BF3 /* MigrationChainTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5DC47C51C93D22900FA3BF3 /* MigrationChainTests.swift */; }; + B5DC47CA1C93D9C800FA3BF3 /* StorageInterfaceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5DC47C91C93D9C800FA3BF3 /* StorageInterfaceTests.swift */; }; + B5DC47CB1C93D9C800FA3BF3 /* StorageInterfaceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5DC47C91C93D9C800FA3BF3 /* StorageInterfaceTests.swift */; }; + B5DC47CC1C93D9C800FA3BF3 /* StorageInterfaceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5DC47C91C93D9C800FA3BF3 /* StorageInterfaceTests.swift */; }; B5E834B91B76311F001D3D50 /* BaseDataTransaction+Importing.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E834B81B76311F001D3D50 /* BaseDataTransaction+Importing.swift */; }; B5E834BB1B7691F3001D3D50 /* Functions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E834BA1B7691F3001D3D50 /* Functions.swift */; }; B5E84EDF1AFF84500064E85B /* DataStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5E84EDB1AFF84500064E85B /* DataStack.swift */; }; @@ -344,6 +477,48 @@ B563217B1BD650E3006C9394 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS2.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; B56964D31B22FFAD0075EE4A /* DataStack+Migration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DataStack+Migration.swift"; sourceTree = ""; }; B56965231B356B820075EE4A /* MigrationResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MigrationResult.swift; sourceTree = ""; }; + B58B22F81C93C26600521925 /* AdapterProtocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdapterProtocols.swift; sourceTree = ""; }; + B58B22F91C93C26600521925 /* AssertionDispatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssertionDispatcher.swift; sourceTree = ""; }; + B58B22FA1C93C26600521925 /* AssertionRecorder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AssertionRecorder.swift; sourceTree = ""; }; + B58B22FB1C93C26600521925 /* NimbleEnvironment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NimbleEnvironment.swift; sourceTree = ""; }; + B58B22FC1C93C26600521925 /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NimbleXCTestHandler.swift; sourceTree = ""; }; + B58B22FD1C93C26600521925 /* DSL+Wait.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DSL+Wait.swift"; sourceTree = ""; }; + B58B22FE1C93C26600521925 /* DSL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DSL.swift; sourceTree = ""; }; + B58B22FF1C93C26600521925 /* Expectation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Expectation.swift; sourceTree = ""; }; + B58B23001C93C26600521925 /* Expression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Expression.swift; sourceTree = ""; }; + B58B23011C93C26600521925 /* FailureMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FailureMessage.swift; sourceTree = ""; }; + B58B23041C93C26600521925 /* AllPass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AllPass.swift; sourceTree = ""; }; + B58B23051C93C26600521925 /* BeAKindOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeAKindOf.swift; sourceTree = ""; }; + B58B23061C93C26600521925 /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeAnInstanceOf.swift; sourceTree = ""; }; + B58B23071C93C26600521925 /* BeCloseTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeCloseTo.swift; sourceTree = ""; }; + B58B23081C93C26600521925 /* BeEmpty.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeEmpty.swift; sourceTree = ""; }; + B58B23091C93C26600521925 /* BeginWith.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeginWith.swift; sourceTree = ""; }; + B58B230A1C93C26600521925 /* BeGreaterThan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeGreaterThan.swift; sourceTree = ""; }; + B58B230B1C93C26600521925 /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeGreaterThanOrEqualTo.swift; sourceTree = ""; }; + B58B230C1C93C26600521925 /* BeIdenticalTo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeIdenticalTo.swift; sourceTree = ""; }; + B58B230D1C93C26600521925 /* BeLessThan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeLessThan.swift; sourceTree = ""; }; + B58B230E1C93C26600521925 /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeLessThanOrEqual.swift; sourceTree = ""; }; + B58B230F1C93C26600521925 /* BeLogical.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeLogical.swift; sourceTree = ""; }; + B58B23101C93C26600521925 /* BeNil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeNil.swift; sourceTree = ""; }; + B58B23111C93C26600521925 /* BeVoid.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeVoid.swift; sourceTree = ""; }; + B58B23121C93C26600521925 /* Contain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Contain.swift; sourceTree = ""; }; + B58B23131C93C26600521925 /* EndWith.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EndWith.swift; sourceTree = ""; }; + B58B23141C93C26600521925 /* Equal.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Equal.swift; sourceTree = ""; }; + B58B23151C93C26600521925 /* HaveCount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HaveCount.swift; sourceTree = ""; }; + B58B23161C93C26600521925 /* Match.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Match.swift; sourceTree = ""; }; + B58B23171C93C26600521925 /* MatcherProtocols.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatcherProtocols.swift; sourceTree = ""; }; + B58B23181C93C26600521925 /* PostNotification.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostNotification.swift; sourceTree = ""; }; + B58B23191C93C26600521925 /* RaisesException.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RaisesException.swift; sourceTree = ""; }; + B58B231A1C93C26600521925 /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SatisfyAnyOf.swift; sourceTree = ""; }; + B58B231B1C93C26600521925 /* ThrowError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThrowError.swift; sourceTree = ""; }; + B58B23251C93C26600521925 /* Async.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Async.swift; sourceTree = ""; }; + B58B23261C93C26600521925 /* ExceptionCapture.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExceptionCapture.swift; sourceTree = ""; }; + B58B23271C93C26600521925 /* Functional.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Functional.swift; sourceTree = ""; }; + B58B23281C93C26600521925 /* SourceLocation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SourceLocation.swift; sourceTree = ""; }; + B58B23291C93C26600521925 /* Stringers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stringers.swift; sourceTree = ""; }; + B58B232B1C93C26600521925 /* AsyncMatcherWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsyncMatcherWrapper.swift; sourceTree = ""; }; + B58B232C1C93C26600521925 /* MatcherFunc.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MatcherFunc.swift; sourceTree = ""; }; + B58B232D1C93C26600521925 /* ObjCMatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjCMatcher.swift; sourceTree = ""; }; B59AFF401C6593E400C0ABE2 /* NSPersistentStoreCoordinator+Setup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSPersistentStoreCoordinator+Setup.swift"; sourceTree = ""; }; B59D5C211B5BA34B00453479 /* NSFileManager+Setup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSFileManager+Setup.swift"; sourceTree = ""; }; B5A261201B64BFDB006EB6D3 /* MigrationType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MigrationType.swift; sourceTree = ""; }; @@ -359,6 +534,8 @@ B5D3F6441C887C0A00C7492A /* LegacySQLiteStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LegacySQLiteStore.swift; sourceTree = ""; }; B5D5E0CE1A4D6AAB006468AF /* TestEntity2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestEntity2.swift; sourceTree = ""; }; B5D9C8F61B160ED200E64F0E /* CoreStore.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; path = CoreStore.podspec; sourceTree = SOURCE_ROOT; }; + B5DC47C51C93D22900FA3BF3 /* MigrationChainTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MigrationChainTests.swift; sourceTree = ""; }; + B5DC47C91C93D9C800FA3BF3 /* StorageInterfaceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StorageInterfaceTests.swift; sourceTree = ""; }; B5E834B81B76311F001D3D50 /* BaseDataTransaction+Importing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BaseDataTransaction+Importing.swift"; sourceTree = ""; }; B5E834BA1B7691F3001D3D50 /* Functions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Functions.swift; sourceTree = ""; }; B5E84ED81AFF82360064E85B /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = SOURCE_ROOT; }; @@ -425,6 +602,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + B58B22F51C93C1BA00521925 /* CoreStore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -539,7 +717,10 @@ 2F03A53C19C5C6DA005002A5 /* CoreStoreTests */ = { isa = PBXGroup; children = ( + B58B22F61C93C26600521925 /* Nimble */, 2F03A53F19C5C6DA005002A5 /* CoreStoreTests.swift */, + B5DC47C91C93D9C800FA3BF3 /* StorageInterfaceTests.swift */, + B5DC47C51C93D22900FA3BF3 /* MigrationChainTests.swift */, B5D372851A39CDDB00F583D9 /* TestEntity1.swift */, B5D5E0CE1A4D6AAB006468AF /* TestEntity2.swift */, 2F03A53D19C5C6DA005002A5 /* Supporting Files */, @@ -592,6 +773,88 @@ path = Migrating; sourceTree = ""; }; + B58B22F61C93C26600521925 /* Nimble */ = { + isa = PBXGroup; + children = ( + B58B22F71C93C26600521925 /* Adapters */, + B58B22FD1C93C26600521925 /* DSL+Wait.swift */, + B58B22FE1C93C26600521925 /* DSL.swift */, + B58B22FF1C93C26600521925 /* Expectation.swift */, + B58B23001C93C26600521925 /* Expression.swift */, + B58B23011C93C26600521925 /* FailureMessage.swift */, + B58B23031C93C26600521925 /* Matchers */, + B58B23241C93C26600521925 /* Utils */, + B58B232A1C93C26600521925 /* Wrappers */, + ); + name = Nimble; + path = Carthage/Checkouts/Nimble/Sources/Nimble; + sourceTree = SOURCE_ROOT; + }; + B58B22F71C93C26600521925 /* Adapters */ = { + isa = PBXGroup; + children = ( + B58B22F81C93C26600521925 /* AdapterProtocols.swift */, + B58B22F91C93C26600521925 /* AssertionDispatcher.swift */, + B58B22FA1C93C26600521925 /* AssertionRecorder.swift */, + B58B22FB1C93C26600521925 /* NimbleEnvironment.swift */, + B58B22FC1C93C26600521925 /* NimbleXCTestHandler.swift */, + ); + path = Adapters; + sourceTree = ""; + }; + B58B23031C93C26600521925 /* Matchers */ = { + isa = PBXGroup; + children = ( + B58B23041C93C26600521925 /* AllPass.swift */, + B58B23051C93C26600521925 /* BeAKindOf.swift */, + B58B23061C93C26600521925 /* BeAnInstanceOf.swift */, + B58B23071C93C26600521925 /* BeCloseTo.swift */, + B58B23081C93C26600521925 /* BeEmpty.swift */, + B58B23091C93C26600521925 /* BeginWith.swift */, + B58B230A1C93C26600521925 /* BeGreaterThan.swift */, + B58B230B1C93C26600521925 /* BeGreaterThanOrEqualTo.swift */, + B58B230C1C93C26600521925 /* BeIdenticalTo.swift */, + B58B230D1C93C26600521925 /* BeLessThan.swift */, + B58B230E1C93C26600521925 /* BeLessThanOrEqual.swift */, + B58B230F1C93C26600521925 /* BeLogical.swift */, + B58B23101C93C26600521925 /* BeNil.swift */, + B58B23111C93C26600521925 /* BeVoid.swift */, + B58B23121C93C26600521925 /* Contain.swift */, + B58B23131C93C26600521925 /* EndWith.swift */, + B58B23141C93C26600521925 /* Equal.swift */, + B58B23151C93C26600521925 /* HaveCount.swift */, + B58B23161C93C26600521925 /* Match.swift */, + B58B23171C93C26600521925 /* MatcherProtocols.swift */, + B58B23181C93C26600521925 /* PostNotification.swift */, + B58B23191C93C26600521925 /* RaisesException.swift */, + B58B231A1C93C26600521925 /* SatisfyAnyOf.swift */, + B58B231B1C93C26600521925 /* ThrowError.swift */, + ); + path = Matchers; + sourceTree = ""; + }; + B58B23241C93C26600521925 /* Utils */ = { + isa = PBXGroup; + children = ( + B58B23251C93C26600521925 /* Async.swift */, + B58B23261C93C26600521925 /* ExceptionCapture.swift */, + B58B23271C93C26600521925 /* Functional.swift */, + B58B23281C93C26600521925 /* SourceLocation.swift */, + B58B23291C93C26600521925 /* Stringers.swift */, + ); + path = Utils; + sourceTree = ""; + }; + B58B232A1C93C26600521925 /* Wrappers */ = { + isa = PBXGroup; + children = ( + B58B232B1C93C26600521925 /* AsyncMatcherWrapper.swift */, + B58B232C1C93C26600521925 /* MatcherFunc.swift */, + B58B232D1C93C26600521925 /* ObjCMatcher.swift */, + ); + path = Wrappers; + sourceTree = ""; + }; B5E834B61B7630BD001D3D50 /* Importing Data */ = { isa = PBXGroup; children = ( @@ -1080,10 +1343,54 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + B58B24101C93C36E00521925 /* PostNotification.swift in Sources */, + B58B23E61C93C36500521925 /* Expression.swift in Sources */, + B58B24081C93C36E00521925 /* BeNil.swift in Sources */, + B58B24531C93C37E00521925 /* AsyncMatcherWrapper.swift in Sources */, + B58B23FC1C93C36E00521925 /* AllPass.swift in Sources */, + B58B24461C93C37600521925 /* Functional.swift in Sources */, + B58B24041C93C36E00521925 /* BeIdenticalTo.swift in Sources */, + B58B240C1C93C36E00521925 /* Equal.swift in Sources */, + B58B23DE1C93C36500521925 /* AdapterProtocols.swift in Sources */, + B58B24131C93C36E00521925 /* ThrowError.swift in Sources */, + B58B24011C93C36E00521925 /* BeginWith.swift in Sources */, 2F03A54019C5C6DA005002A5 /* CoreStoreTests.swift in Sources */, + B58B240E1C93C36E00521925 /* Match.swift in Sources */, + B58B23E41C93C36500521925 /* DSL.swift in Sources */, + B5DC47C61C93D22900FA3BF3 /* MigrationChainTests.swift in Sources */, + B58B24551C93C37E00521925 /* ObjCMatcher.swift in Sources */, + B58B24451C93C37600521925 /* ExceptionCapture.swift in Sources */, + B58B24541C93C37E00521925 /* MatcherFunc.swift in Sources */, + B58B24481C93C37600521925 /* Stringers.swift in Sources */, + B58B23E71C93C36500521925 /* FailureMessage.swift in Sources */, + B58B24471C93C37600521925 /* SourceLocation.swift in Sources */, + B58B24031C93C36E00521925 /* BeGreaterThanOrEqualTo.swift in Sources */, + B58B23FF1C93C36E00521925 /* BeCloseTo.swift in Sources */, + B58B23FE1C93C36E00521925 /* BeAnInstanceOf.swift in Sources */, + B58B24021C93C36E00521925 /* BeGreaterThan.swift in Sources */, + B58B24001C93C36E00521925 /* BeEmpty.swift in Sources */, + B58B23E31C93C36500521925 /* DSL+Wait.swift in Sources */, + B58B24111C93C36E00521925 /* RaisesException.swift in Sources */, + B58B23E51C93C36500521925 /* Expectation.swift in Sources */, + B58B24061C93C36E00521925 /* BeLessThanOrEqual.swift in Sources */, + B58B240A1C93C36E00521925 /* Contain.swift in Sources */, B5D372861A39CDDB00F583D9 /* TestEntity1.swift in Sources */, B5D372841A39CD6900F583D9 /* Model.xcdatamodeld in Sources */, + B58B24441C93C37600521925 /* Async.swift in Sources */, + B58B23E01C93C36500521925 /* AssertionRecorder.swift in Sources */, B5D5E0CF1A4D6AAB006468AF /* TestEntity2.swift in Sources */, + B58B240D1C93C36E00521925 /* HaveCount.swift in Sources */, + B58B23E11C93C36500521925 /* NimbleEnvironment.swift in Sources */, + B58B24051C93C36E00521925 /* BeLessThan.swift in Sources */, + B58B24071C93C36E00521925 /* BeLogical.swift in Sources */, + B58B24091C93C36E00521925 /* BeVoid.swift in Sources */, + B58B23FD1C93C36E00521925 /* BeAKindOf.swift in Sources */, + B58B24121C93C36E00521925 /* SatisfyAnyOf.swift in Sources */, + B58B240B1C93C36E00521925 /* EndWith.swift in Sources */, + B58B23E21C93C36500521925 /* NimbleXCTestHandler.swift in Sources */, + B58B240F1C93C36E00521925 /* MatcherProtocols.swift in Sources */, + B58B23DF1C93C36500521925 /* AssertionDispatcher.swift in Sources */, + B5DC47CA1C93D9C800FA3BF3 /* StorageInterfaceTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1163,10 +1470,54 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + B58B24281C93C36F00521925 /* PostNotification.swift in Sources */, + B58B23F01C93C36600521925 /* Expression.swift in Sources */, + B58B24201C93C36F00521925 /* BeNil.swift in Sources */, + B58B24561C93C38000521925 /* AsyncMatcherWrapper.swift in Sources */, + B58B24141C93C36F00521925 /* AllPass.swift in Sources */, + B58B244B1C93C37700521925 /* Functional.swift in Sources */, + B58B241C1C93C36F00521925 /* BeIdenticalTo.swift in Sources */, + B58B24241C93C36F00521925 /* Equal.swift in Sources */, + B58B23E81C93C36600521925 /* AdapterProtocols.swift in Sources */, + B58B242B1C93C36F00521925 /* ThrowError.swift in Sources */, + B58B24191C93C36F00521925 /* BeginWith.swift in Sources */, 82BA18DA1C4BBD9700A0916E /* TestEntity1.swift in Sources */, + B58B24261C93C36F00521925 /* Match.swift in Sources */, + B58B23EE1C93C36600521925 /* DSL.swift in Sources */, + B5DC47C71C93D22900FA3BF3 /* MigrationChainTests.swift in Sources */, + B58B24581C93C38000521925 /* ObjCMatcher.swift in Sources */, + B58B244A1C93C37700521925 /* ExceptionCapture.swift in Sources */, + B58B24571C93C38000521925 /* MatcherFunc.swift in Sources */, + B58B244D1C93C37700521925 /* Stringers.swift in Sources */, + B58B23F11C93C36600521925 /* FailureMessage.swift in Sources */, + B58B244C1C93C37700521925 /* SourceLocation.swift in Sources */, + B58B241B1C93C36F00521925 /* BeGreaterThanOrEqualTo.swift in Sources */, + B58B24171C93C36F00521925 /* BeCloseTo.swift in Sources */, + B58B24161C93C36F00521925 /* BeAnInstanceOf.swift in Sources */, + B58B241A1C93C36F00521925 /* BeGreaterThan.swift in Sources */, + B58B24181C93C36F00521925 /* BeEmpty.swift in Sources */, + B58B23ED1C93C36600521925 /* DSL+Wait.swift in Sources */, + B58B24291C93C36F00521925 /* RaisesException.swift in Sources */, + B58B23EF1C93C36600521925 /* Expectation.swift in Sources */, + B58B241E1C93C36F00521925 /* BeLessThanOrEqual.swift in Sources */, + B58B24221C93C36F00521925 /* Contain.swift in Sources */, 82BA18DB1C4BBD9700A0916E /* TestEntity2.swift in Sources */, 82BA18D91C4BBD9700A0916E /* CoreStoreTests.swift in Sources */, + B58B24491C93C37700521925 /* Async.swift in Sources */, + B58B23EA1C93C36600521925 /* AssertionRecorder.swift in Sources */, 82BA18DC1C4BBD9C00A0916E /* Model.xcdatamodeld in Sources */, + B58B24251C93C36F00521925 /* HaveCount.swift in Sources */, + B58B23EB1C93C36600521925 /* NimbleEnvironment.swift in Sources */, + B58B241D1C93C36F00521925 /* BeLessThan.swift in Sources */, + B58B241F1C93C36F00521925 /* BeLogical.swift in Sources */, + B58B24211C93C36F00521925 /* BeVoid.swift in Sources */, + B58B24151C93C36F00521925 /* BeAKindOf.swift in Sources */, + B58B242A1C93C36F00521925 /* SatisfyAnyOf.swift in Sources */, + B58B24231C93C36F00521925 /* EndWith.swift in Sources */, + B58B23EC1C93C36600521925 /* NimbleXCTestHandler.swift in Sources */, + B58B24271C93C36F00521925 /* MatcherProtocols.swift in Sources */, + B58B23E91C93C36600521925 /* AssertionDispatcher.swift in Sources */, + B5DC47CB1C93D9C800FA3BF3 /* StorageInterfaceTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1235,10 +1586,54 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + B58B24401C93C37100521925 /* PostNotification.swift in Sources */, + B58B23FA1C93C36700521925 /* Expression.swift in Sources */, + B58B24381C93C37100521925 /* BeNil.swift in Sources */, + B58B24591C93C38200521925 /* AsyncMatcherWrapper.swift in Sources */, + B58B242C1C93C37100521925 /* AllPass.swift in Sources */, + B58B24501C93C37900521925 /* Functional.swift in Sources */, + B58B24341C93C37100521925 /* BeIdenticalTo.swift in Sources */, + B58B243C1C93C37100521925 /* Equal.swift in Sources */, + B58B23F21C93C36700521925 /* AdapterProtocols.swift in Sources */, + B58B24431C93C37100521925 /* ThrowError.swift in Sources */, + B58B24311C93C37100521925 /* BeginWith.swift in Sources */, B52DD1CD1BE1F94D00949AFE /* TestEntity1.swift in Sources */, + B58B243E1C93C37100521925 /* Match.swift in Sources */, + B58B23F81C93C36700521925 /* DSL.swift in Sources */, + B5DC47C81C93D22900FA3BF3 /* MigrationChainTests.swift in Sources */, + B58B245B1C93C38200521925 /* ObjCMatcher.swift in Sources */, + B58B244F1C93C37900521925 /* ExceptionCapture.swift in Sources */, + B58B245A1C93C38200521925 /* MatcherFunc.swift in Sources */, + B58B24521C93C37900521925 /* Stringers.swift in Sources */, + B58B23FB1C93C36700521925 /* FailureMessage.swift in Sources */, + B58B24511C93C37900521925 /* SourceLocation.swift in Sources */, + B58B24331C93C37100521925 /* BeGreaterThanOrEqualTo.swift in Sources */, + B58B242F1C93C37100521925 /* BeCloseTo.swift in Sources */, + B58B242E1C93C37100521925 /* BeAnInstanceOf.swift in Sources */, + B58B24321C93C37100521925 /* BeGreaterThan.swift in Sources */, + B58B24301C93C37100521925 /* BeEmpty.swift in Sources */, + B58B23F71C93C36700521925 /* DSL+Wait.swift in Sources */, + B58B24411C93C37100521925 /* RaisesException.swift in Sources */, + B58B23F91C93C36700521925 /* Expectation.swift in Sources */, + B58B24361C93C37100521925 /* BeLessThanOrEqual.swift in Sources */, + B58B243A1C93C37100521925 /* Contain.swift in Sources */, B52DD1CE1BE1F94D00949AFE /* TestEntity2.swift in Sources */, B52DD1CC1BE1F94D00949AFE /* CoreStoreTests.swift in Sources */, + B58B244E1C93C37900521925 /* Async.swift in Sources */, + B58B23F41C93C36700521925 /* AssertionRecorder.swift in Sources */, B5598BCC1BE2093D0092EFCE /* Model.xcdatamodeld in Sources */, + B58B243D1C93C37100521925 /* HaveCount.swift in Sources */, + B58B23F51C93C36700521925 /* NimbleEnvironment.swift in Sources */, + B58B24351C93C37100521925 /* BeLessThan.swift in Sources */, + B58B24371C93C37100521925 /* BeLogical.swift in Sources */, + B58B24391C93C37100521925 /* BeVoid.swift in Sources */, + B58B242D1C93C37100521925 /* BeAKindOf.swift in Sources */, + B58B24421C93C37100521925 /* SatisfyAnyOf.swift in Sources */, + B58B243B1C93C37100521925 /* EndWith.swift in Sources */, + B58B23F61C93C36700521925 /* NimbleXCTestHandler.swift in Sources */, + B58B243F1C93C37100521925 /* MatcherProtocols.swift in Sources */, + B58B23F31C93C36700521925 /* AssertionDispatcher.swift in Sources */, + B5DC47CC1C93D9C800FA3BF3 /* StorageInterfaceTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/CoreStore.xcworkspace/xcshareddata/CoreStore.xcscmblueprint b/CoreStore.xcworkspace/xcshareddata/CoreStore.xcscmblueprint index 7203f19..48127bf 100644 --- a/CoreStore.xcworkspace/xcshareddata/CoreStore.xcscmblueprint +++ b/CoreStore.xcworkspace/xcshareddata/CoreStore.xcscmblueprint @@ -5,11 +5,13 @@ }, "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { "8B2E522D57154DFA93A06982C36315ECBEA4FA97" : 0, + "95438028B10BBB846574013D29F154A00556A9D1" : 0, "4B60F1BCB491FF717C56441AE7783C74F417BE48" : 0 }, "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "EBFDEFFE-8BA0-441A-862A-1DE28AA5CD21", "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { "8B2E522D57154DFA93A06982C36315ECBEA4FA97" : "CoreStore\/Carthage\/Checkouts\/GCDKit\/", + "95438028B10BBB846574013D29F154A00556A9D1" : "CoreStore\/Carthage\/Checkouts\/Nimble\/", "4B60F1BCB491FF717C56441AE7783C74F417BE48" : "CoreStore\/" }, "DVTSourceControlWorkspaceBlueprintNameKey" : "CoreStore", @@ -25,6 +27,11 @@ "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/JohnEstropia\/GCDKit.git", "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "8B2E522D57154DFA93A06982C36315ECBEA4FA97" + }, + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/Quick\/Nimble.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "95438028B10BBB846574013D29F154A00556A9D1" } ] } \ No newline at end of file diff --git a/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/FetchingAndQueryingDemoViewController.swift b/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/FetchingAndQueryingDemoViewController.swift index 59649da..b9d2a8a 100644 --- a/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/FetchingAndQueryingDemoViewController.swift +++ b/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/FetchingAndQueryingDemoViewController.swift @@ -99,12 +99,13 @@ class FetchingAndQueryingDemoViewController: UIViewController, UITableViewDataSo // MARK: UITableViewDataSource func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + switch self.segmentedControl?.selectedSegmentIndex { - case .Some(Section.Fetching.rawValue): + case Section.Fetching.rawValue?: return self.fetchingItems.count - case .Some(Section.Querying.rawValue): + case Section.Querying.rawValue?: return self.queryingItems.count default: @@ -118,10 +119,10 @@ class FetchingAndQueryingDemoViewController: UIViewController, UITableViewDataSo switch self.segmentedControl?.selectedSegmentIndex { - case .Some(Section.Fetching.rawValue): + case Section.Fetching.rawValue?: cell.textLabel?.text = self.fetchingItems[indexPath.row].title - case .Some(Section.Querying.rawValue): + case Section.Querying.rawValue?: cell.textLabel?.text = self.queryingItems[indexPath.row].title default: @@ -140,10 +141,10 @@ class FetchingAndQueryingDemoViewController: UIViewController, UITableViewDataSo switch self.segmentedControl?.selectedSegmentIndex { - case .Some(Section.Fetching.rawValue): + case Section.Fetching.rawValue?: self.performSegueWithIdentifier("FetchingResultsViewController", sender: indexPath) - case .Some(Section.Querying.rawValue): + case Section.Querying.rawValue?: self.performSegueWithIdentifier("QueryingResultsViewController", sender: indexPath) default: diff --git a/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/QueryingResultsViewController.swift b/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/QueryingResultsViewController.swift index a1d0b31..3399187 100644 --- a/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/QueryingResultsViewController.swift +++ b/CoreStoreDemo/CoreStoreDemo/Fetching and Querying Demo/QueryingResultsViewController.swift @@ -16,7 +16,7 @@ class QueryingResultsViewController: UITableViewController { switch value { - case .Some(let array as [AnyObject]): + case (let array as [AnyObject])?: self.values = array.map { (item: AnyObject) -> (title: String, detail: String) in ( title: item.description, @@ -24,7 +24,7 @@ class QueryingResultsViewController: UITableViewController { ) } - case .Some(let item): + case let item?: self.values = [ ( title: item.description, diff --git a/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ListObserverDemoViewController.swift b/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ListObserverDemoViewController.swift index 6e9ec72..1df7145 100644 --- a/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ListObserverDemoViewController.swift +++ b/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ListObserverDemoViewController.swift @@ -121,7 +121,7 @@ class ListObserverDemoViewController: UITableViewController, ListSectionObserver switch (segue.identifier, segue.destinationViewController, sender) { - case (.Some("ObjectObserverDemoViewController"), let destinationViewController as ObjectObserverDemoViewController, let palette as Palette): + case ("ObjectObserverDemoViewController"?, let destinationViewController as ObjectObserverDemoViewController, let palette as Palette): destinationViewController.palette = palette default: diff --git a/CoreStoreDemo/CoreStoreDemo/Loggers Demo/CustomLoggerViewController.swift b/CoreStoreDemo/CoreStoreDemo/Loggers Demo/CustomLoggerViewController.swift index ea142f9..bd29847 100644 --- a/CoreStoreDemo/CoreStoreDemo/Loggers Demo/CustomLoggerViewController.swift +++ b/CoreStoreDemo/CoreStoreDemo/Loggers Demo/CustomLoggerViewController.swift @@ -74,16 +74,17 @@ class CustomLoggerViewController: UIViewController, CoreStoreLogger { } } - func assert(@autoclosure condition: () -> Bool, message: String, fileName: StaticString, lineNumber: Int, functionName: StaticString) { + func assert(@autoclosure condition: () -> Bool, @autoclosure message: () -> String, fileName: StaticString, lineNumber: Int, functionName: StaticString) { if condition() { return } + let messageString = message() GCDQueue.Main.async { [weak self] in - self?.textView?.insertText("\((fileName.stringValue as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ [Assert] \(message)\n\n") + self?.textView?.insertText("\((fileName.stringValue as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ [Assert] \(messageString)\n\n") } } @@ -102,13 +103,13 @@ class CustomLoggerViewController: UIViewController, CoreStoreLogger { switch self.segmentedControl?.selectedSegmentIndex { - case .Some(0): + case 0?: self.dataStack.beginAsynchronous { (transaction) -> Void in transaction.create(Into(Palette)) } - case .Some(1): + case 1?: _ = try? dataStack.addStorageAndWait( SQLiteStore( fileName: "emptyStore.sqlite", @@ -116,7 +117,7 @@ class CustomLoggerViewController: UIViewController, CoreStoreLogger { ) ) - case .Some(2): + case 2?: self.dataStack.beginAsynchronous { (transaction) -> Void in transaction.commit() diff --git a/CoreStoreTests/CoreStoreTests.swift b/CoreStoreTests/CoreStoreTests.swift index 16aeff6..e7ae9f0 100644 --- a/CoreStoreTests/CoreStoreTests.swift +++ b/CoreStoreTests/CoreStoreTests.swift @@ -42,42 +42,6 @@ class CoreStoreTests: XCTestCase { super.tearDown() } - func testMigrationChains() { - - let emptyChain: MigrationChain = nil - XCTAssertTrue(emptyChain.valid, "emptyChain.valid") - XCTAssertTrue(emptyChain.empty, "emptyChain.empty") - - let normalChain: MigrationChain = "version1" - XCTAssertTrue(normalChain.valid, "normalChain.valid") - XCTAssertTrue(normalChain.empty, "normalChain.empty") - - let linearChain: MigrationChain = ["version1", "version2", "version3", "version4"] - XCTAssertTrue(linearChain.valid, "linearChain.valid") - XCTAssertFalse(linearChain.empty, "linearChain.empty") - - let treeChain: MigrationChain = [ - "version1": "version4", - "version2": "version3", - "version3": "version4" - ] - XCTAssertTrue(treeChain.valid, "treeChain.valid") - XCTAssertFalse(treeChain.empty, "treeChain.empty") - - // The cases below will trigger assertion failures internally - -// let linearLoopChain: MigrationChain = ["version1", "version2", "version1", "version3", "version4"] -// XCTAssertFalse(linearLoopChain.valid, "linearLoopChain.valid") -// -// let treeAmbiguousChain: MigrationChain = [ -// "version1": "version4", -// "version2": "version3", -// "version1": "version2", -// "version3": "version4" -// ] -// XCTAssertFalse(treeAmbiguousChain.valid, "treeAmbiguousChain.valid") - } - func testExample() { let stack = DataStack(modelName: "Model", bundle: NSBundle(forClass: self.dynamicType)) diff --git a/CoreStoreTests/MigrationChainTests.swift b/CoreStoreTests/MigrationChainTests.swift new file mode 100644 index 0000000..02c3d85 --- /dev/null +++ b/CoreStoreTests/MigrationChainTests.swift @@ -0,0 +1,111 @@ +// +// MigrationChainTests.swift +// CoreStore +// +// Copyright © 2016 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 XCTest + +@testable +import CoreStore + +class MigrationChainTests: XCTestCase { + + @objc dynamic func testEmptyChain() { + + let chain: MigrationChain = nil + expect(chain.valid).to(beTrue()) + expect(chain.empty).to(beTrue()) + + expect(chain.contains("version1")).to(beFalse()) + + expect(chain.nextVersionFrom("version1")).to(beNil()) + } + + @objc dynamic func testSingleChain() { + + let chain: MigrationChain = "version1" + expect(chain.valid).to(beTrue()) + expect(chain.empty).to(beTrue()) + + expect(chain.contains("version1")).to(beTrue()) + expect(chain.contains("version2")).to(beFalse()) + + expect(chain.nextVersionFrom("version1")).to(beNil()) + expect(chain.nextVersionFrom("version2")).to(beNil()) + } + + @objc dynamic func testLinearChain() { + + let chain: MigrationChain = ["version1", "version2", "version3", "version4"] + expect(chain.valid).to(beTrue()) + expect(chain.empty).to(beFalse()) + + expect(chain.contains("version1")).to(beTrue()) + expect(chain.contains("version2")).to(beTrue()) + expect(chain.contains("version3")).to(beTrue()) + expect(chain.contains("version4")).to(beTrue()) + expect(chain.contains("version5")).to(beFalse()) + + expect(chain.nextVersionFrom("version1")).to(equal("version2")) + expect(chain.nextVersionFrom("version2")).to(equal("version3")) + expect(chain.nextVersionFrom("version3")).to(equal("version4")) + expect(chain.nextVersionFrom("version4")).to(beNil()) + expect(chain.nextVersionFrom("version5")).to(beNil()) + } + + @objc dynamic func testTreeChain() { + + let chain: MigrationChain = [ + "version1": "version4", + "version2": "version3", + "version3": "version4" + ] + expect(chain.valid).to(beTrue()) + expect(chain.empty).to(beFalse()) + + expect(chain.contains("version1")).to(beTrue()) + expect(chain.contains("version2")).to(beTrue()) + expect(chain.contains("version3")).to(beTrue()) + expect(chain.contains("version4")).to(beTrue()) + expect(chain.contains("version5")).to(beFalse()) + + expect(chain.nextVersionFrom("version1")).to(equal("version4")) + expect(chain.nextVersionFrom("version2")).to(equal("version3")) + expect(chain.nextVersionFrom("version3")).to(equal("version4")) + expect(chain.nextVersionFrom("version4")).to(beNil()) + expect(chain.nextVersionFrom("version5")).to(beNil()) + + // The cases below will trigger assertion failures internally + + // let linearLoopChain: MigrationChain = ["version1", "version2", "version1", "version3", "version4"] + // XCTAssertFalse(linearLoopChain.valid, "linearLoopChain.valid") + // + // let treeAmbiguousChain: MigrationChain = [ + // "version1": "version4", + // "version2": "version3", + // "version1": "version2", + // "version3": "version4" + // ] + // XCTAssertFalse(treeAmbiguousChain.valid, "treeAmbiguousChain.valid") + } +} diff --git a/CoreStoreTests/StorageInterfaceTests.swift b/CoreStoreTests/StorageInterfaceTests.swift new file mode 100644 index 0000000..7966eea --- /dev/null +++ b/CoreStoreTests/StorageInterfaceTests.swift @@ -0,0 +1,205 @@ +// +// StorageInterfaceTests.swift +// CoreStore +// +// Copyright © 2016 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 XCTest + +@testable +import CoreStore + +class StorageInterfaceTests: XCTestCase { + + func testDefaultInMemoryStore() { + + let store = InMemoryStore() + expect(store.dynamicType.storeType).to(equal(NSInMemoryStoreType)) + expect(store.configuration).to(beNil()) + expect(store.storeOptions).to(beNil()) + } + + func testInMemoryStoreConfiguration() { + + let store = InMemoryStore(configuration: "config1") + expect(store.dynamicType.storeType).to(equal(NSInMemoryStoreType)) + expect(store.configuration).to(equal("config1")) + expect(store.storeOptions).to(beNil()) + } + + func testSQLiteStoreDefaultDirectories() { + + #if os(tvOS) + let systemDirectorySearchPath = NSSearchPathDirectory.CachesDirectory + #else + let systemDirectorySearchPath = NSSearchPathDirectory.ApplicationSupportDirectory + #endif + + let defaultSystemDirectory = NSFileManager + .defaultManager() + .URLsForDirectory(systemDirectorySearchPath, inDomains: .UserDomainMask).first! + + let defaultRootDirectory = defaultSystemDirectory.URLByAppendingPathComponent( + NSBundle.mainBundle().bundleIdentifier ?? "com.CoreStore.DataStack", + isDirectory: true + ) + let applicationName = (NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleName") as? String) ?? "CoreData" + + let defaultFileURL = defaultRootDirectory + .URLByAppendingPathComponent(applicationName, isDirectory: false) + .URLByAppendingPathExtension("sqlite") + + expect(SQLiteStore.defaultRootDirectory).to(equal(defaultRootDirectory)) + expect(SQLiteStore.defaultFileURL).to(equal(defaultFileURL)) + } + + func testDefaultSQLiteStore() { + + let store = SQLiteStore() + expect(store.dynamicType.storeType).to(equal(NSSQLiteStoreType)) + expect(store.configuration).to(beNil()) + expect(store.storeOptions).to(equal([NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary)) + + expect(store.fileURL).to(equal(SQLiteStore.defaultFileURL)) + expect(store.mappingModelBundles).to(equal(NSBundle.allBundles())) + expect(store.resetStoreOnModelMismatch).to(beFalse()) + } + + func testSQLiteStoreFileURL() { + + let fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()) + .URLByAppendingPathComponent(NSUUID().UUIDString, isDirectory: false) + .URLByAppendingPathExtension("db") + let bundles = [NSBundle(forClass: self.dynamicType)] + + let store = SQLiteStore( + fileURL: fileURL, + configuration: "config1", + mappingModelBundles: bundles, + resetStoreOnModelMismatch: true + ) + expect(store.dynamicType.storeType).to(equal(NSSQLiteStoreType)) + expect(store.configuration).to(equal("config1")) + expect(store.storeOptions).to(equal([NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary)) + + expect(store.fileURL).to(equal(fileURL)) + expect(store.mappingModelBundles).to(equal(bundles)) + expect(store.resetStoreOnModelMismatch).to(beTrue()) + } + + func testSQLiteStoreFileName() { + + let fileName = NSUUID().UUIDString + ".db" + let bundles = [NSBundle(forClass: self.dynamicType)] + + let store = SQLiteStore( + fileName: fileName, + configuration: "config1", + mappingModelBundles: bundles, + resetStoreOnModelMismatch: true + ) + expect(store.dynamicType.storeType).to(equal(NSSQLiteStoreType)) + expect(store.configuration).to(equal("config1")) + expect(store.storeOptions).to(equal([NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary)) + + expect(store.fileURL.URLByDeletingLastPathComponent).to(equal(SQLiteStore.defaultRootDirectory)) + expect(store.fileURL.lastPathComponent).to(equal(fileName)) + expect(store.mappingModelBundles).to(equal(bundles)) + expect(store.resetStoreOnModelMismatch).to(beTrue()) + } + + func testLegacySQLiteStoreDefaultDirectories() { + + #if os(tvOS) + let systemDirectorySearchPath = NSSearchPathDirectory.CachesDirectory + #else + let systemDirectorySearchPath = NSSearchPathDirectory.ApplicationSupportDirectory + #endif + + let legacyDefaultRootDirectory = NSFileManager.defaultManager().URLsForDirectory( + systemDirectorySearchPath, + inDomains: .UserDomainMask + ).first! + + let legacyDefaultFileURL = legacyDefaultRootDirectory + .URLByAppendingPathComponent(DataStack.applicationName, isDirectory: false) + .URLByAppendingPathExtension("sqlite") + + expect(LegacySQLiteStore.legacyDefaultRootDirectory).to(equal(legacyDefaultRootDirectory)) + expect(LegacySQLiteStore.legacyDefaultFileURL).to(equal(legacyDefaultFileURL)) + } + + func testDefaultLegacySQLiteStore() { + + let store = LegacySQLiteStore() + expect(store.dynamicType.storeType).to(equal(NSSQLiteStoreType)) + expect(store.configuration).to(beNil()) + expect(store.storeOptions).to(equal([NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary)) + + expect(store.fileURL).to(equal(LegacySQLiteStore.legacyDefaultFileURL)) + expect(store.mappingModelBundles).to(equal(NSBundle.allBundles())) + expect(store.resetStoreOnModelMismatch).to(beFalse()) + } + + func testLegacySQLiteStoreFileURL() { + + let fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()) + .URLByAppendingPathComponent(NSUUID().UUIDString, isDirectory: false) + .URLByAppendingPathExtension("db") + let bundles = [NSBundle(forClass: self.dynamicType)] + + let store = LegacySQLiteStore( + fileURL: fileURL, + configuration: "config1", + mappingModelBundles: bundles, + resetStoreOnModelMismatch: true + ) + expect(store.dynamicType.storeType).to(equal(NSSQLiteStoreType)) + expect(store.configuration).to(equal("config1")) + expect(store.storeOptions).to(equal([NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary)) + + expect(store.fileURL).to(equal(fileURL)) + expect(store.mappingModelBundles).to(equal(bundles)) + expect(store.resetStoreOnModelMismatch).to(beTrue()) + } + + func testLegacySQLiteStoreFileName() { + + let fileName = NSUUID().UUIDString + ".db" + let bundles = [NSBundle(forClass: self.dynamicType)] + + let store = LegacySQLiteStore( + fileName: fileName, + configuration: "config1", + mappingModelBundles: bundles, + resetStoreOnModelMismatch: true + ) + expect(store.dynamicType.storeType).to(equal(NSSQLiteStoreType)) + expect(store.configuration).to(equal("config1")) + expect(store.storeOptions).to(equal([NSSQLitePragmasOption: ["journal_mode": "WAL"]] as NSDictionary)) + + expect(store.fileURL.URLByDeletingLastPathComponent).to(equal(LegacySQLiteStore.legacyDefaultRootDirectory)) + expect(store.fileURL.lastPathComponent).to(equal(fileName)) + expect(store.mappingModelBundles).to(equal(bundles)) + expect(store.resetStoreOnModelMismatch).to(beTrue()) + } +} diff --git a/Sources/Logging/CoreStoreLogger.swift b/Sources/Logging/CoreStoreLogger.swift index 4898fe3..6a6652b 100644 --- a/Sources/Logging/CoreStoreLogger.swift +++ b/Sources/Logging/CoreStoreLogger.swift @@ -78,7 +78,7 @@ public protocol CoreStoreLogger { :lineNumber: the source line number :functionName: the source function name */ - func assert(@autoclosure condition: () -> Bool, message: String, fileName: StaticString, lineNumber: Int, functionName: StaticString) + func assert(@autoclosure condition: () -> Bool, @autoclosure message: () -> String, fileName: StaticString, lineNumber: Int, functionName: StaticString) } diff --git a/Sources/Logging/DefaultLogger.swift b/Sources/Logging/DefaultLogger.swift index e1a866f..8cff94f 100644 --- a/Sources/Logging/DefaultLogger.swift +++ b/Sources/Logging/DefaultLogger.swift @@ -73,14 +73,14 @@ public final class DefaultLogger: CoreStoreLogger { #endif } - public func assert(@autoclosure condition: () -> Bool, message: String, fileName: StaticString, lineNumber: Int, functionName: StaticString) { + public func assert(@autoclosure condition: () -> Bool, @autoclosure message: () -> String, fileName: StaticString, lineNumber: Int, functionName: StaticString) { #if DEBUG if condition() { return } - Swift.print("❗ [CoreStore: Assertion Failure] \((fileName.stringValue as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ \(message)\n") + Swift.print("❗ [CoreStore: Assertion Failure] \((fileName.stringValue as NSString).lastPathComponent):\(lineNumber) \(functionName)\n ↪︎ \(message())\n") Swift.fatalError() #endif } diff --git a/Sources/Migrating/DataStack+Migration.swift b/Sources/Migrating/DataStack+Migration.swift index 5a4317e..7e62642 100644 --- a/Sources/Migrating/DataStack+Migration.swift +++ b/Sources/Migrating/DataStack+Migration.swift @@ -596,7 +596,7 @@ public extension DataStack { switch result { case .Success(let storage): - completion(PersistentStoreResult(storage.internalStore!)) + completion(PersistentStoreResult(self.persistentStoreForStorage(storage)!)) case .Failure(let error): completion(PersistentStoreResult(error)) @@ -630,7 +630,7 @@ public extension DataStack { switch result { case .Success(let storage): - completion(PersistentStoreResult(storage.internalStore!)) + completion(PersistentStoreResult(self.persistentStoreForStorage(storage)!)) case .Failure(let error): completion(PersistentStoreResult(error)) @@ -659,7 +659,7 @@ public extension DataStack { switch result { case .Success(let storage): - completion(PersistentStoreResult(storage.internalStore!)) + completion(PersistentStoreResult(self.persistentStoreForStorage(storage)!)) case .Failure(let error): completion(PersistentStoreResult(error)) diff --git a/Sources/Saving and Processing/BaseDataTransaction.swift b/Sources/Saving and Processing/BaseDataTransaction.swift index 20d9fb8..714bd83 100644 --- a/Sources/Saving and Processing/BaseDataTransaction.swift +++ b/Sources/Saving and Processing/BaseDataTransaction.swift @@ -71,7 +71,7 @@ public /*abstract*/ class BaseDataTransaction { context.assignObject(object, toPersistentStore: persistentStore) return object - case (.None, true): + case (nil, true): fatalError("Attempted to create an entity of type \(typeName(entityClass)) with ambiguous destination persistent store, but the configuration name was not specified.") default: diff --git a/Sources/Setting Up/CoreStore+Setup.swift b/Sources/Setting Up/CoreStore+Setup.swift index 673c907..85c89ca 100644 --- a/Sources/Setting Up/CoreStore+Setup.swift +++ b/Sources/Setting Up/CoreStore+Setup.swift @@ -141,7 +141,6 @@ public extension CoreStore { /** Deprecated. Use `addStorageAndWait(_:)` by passing a `LegacySQLiteStore` instance. - - Warning: The default SQLite file location for the `LegacySQLiteStore` and `SQLiteStore` are different. If the app was using this method prior to 2.0.0, make sure to use `LegacySQLiteStore`. */ @available(*, deprecated=2.0.0, message="Use addStorageAndWait(_:) by passing a LegacySQLiteStore instance. Warning: The default SQLite file location for the LegacySQLiteStore and SQLiteStore are different. If the app was using this method prior to 2.0.0, make sure to use LegacySQLiteStore.") @@ -156,7 +155,6 @@ public extension CoreStore { /** Deprecated. Use `addStorageAndWait(_:)` by passing a `LegacySQLiteStore` instance. - - Warning: The default SQLite file location for the `LegacySQLiteStore` and `SQLiteStore` are different. If the app was using this method prior to 2.0.0, make sure to use `LegacySQLiteStore`. */ @available(*, deprecated=2.0.0, message="Use addStorageAndWait(_:) by passing a LegacySQLiteStore instance. Warning: The default SQLite file location for the LegacySQLiteStore and SQLiteStore are different. If the app was using this method prior to 2.0.0, make sure to use LegacySQLiteStore.") diff --git a/Sources/Setting Up/DataStack.swift b/Sources/Setting Up/DataStack.swift index 3c22f3f..77008c6 100644 --- a/Sources/Setting Up/DataStack.swift +++ b/Sources/Setting Up/DataStack.swift @@ -397,7 +397,7 @@ public final class DataStack { public func addInMemoryStoreAndWait(configuration configuration: String? = nil) throws -> NSPersistentStore { let storage = try self.addStorageAndWait(InMemoryStore(configuration: configuration)) - return storage.internalStore! + return self.persistentStoreForStorage(storage)! } /** @@ -415,7 +415,7 @@ public final class DataStack { resetStoreOnModelMismatch: resetStoreOnModelMismatch ) ) - return storage.internalStore! + return self.persistentStoreForStorage(storage)! } /** @@ -433,6 +433,6 @@ public final class DataStack { resetStoreOnModelMismatch: resetStoreOnModelMismatch ) ) - return storage.internalStore! + return self.persistentStoreForStorage(storage)! } } diff --git a/Sources/Setting Up/StorageInterfaces/LegacySQLiteStore.swift b/Sources/Setting Up/StorageInterfaces/LegacySQLiteStore.swift index e793f35..00239cf 100644 --- a/Sources/Setting Up/StorageInterfaces/LegacySQLiteStore.swift +++ b/Sources/Setting Up/StorageInterfaces/LegacySQLiteStore.swift @@ -40,7 +40,7 @@ public final class LegacySQLiteStore: SQLiteStore { - parameter fileURL: the local file URL for the target SQLite persistent store. Note that if you have multiple configurations, you will need to specify a different `fileURL` explicitly for each of them. - parameter configuration: an optional configuration name from the model file. If not specified, defaults to `nil`, the "Default" configuration. Note that if you have multiple configurations, you will need to specify a different `fileURL` explicitly for each of them. - parameter mappingModelBundles: a list of `NSBundle`s from which to search mapping models for migration. - - parameter resetStoreOnModelMismatch: When the `SQLiteStore` is passed to the `DataStack`'s `addStorage()` methods, a `true` value tells the `DataStack` to delete the store on model mismatch; a `false` value lets exceptions be thrown on failure instead. Typically should only be set to true when debugging, or if the persistent store can be recreated easily. If not specified, defaults to `false`. + - parameter resetStoreOnModelMismatch: When the `LegacySQLiteStore` is passed to the `DataStack`'s `addStorage()` methods, a `true` value tells the `DataStack` to delete the store on model mismatch; a `false` value lets exceptions be thrown on failure instead. Typically should only be set to true when debugging, or if the persistent store can be recreated easily. If not specified, defaults to `false`. */ public required init(fileURL: NSURL, configuration: String? = nil, mappingModelBundles: [NSBundle] = NSBundle.allBundles(), resetStoreOnModelMismatch: Bool = false) { @@ -54,10 +54,12 @@ public final class LegacySQLiteStore: SQLiteStore { /** Initializes an SQLite store interface from the given SQLite file name. When this instance is passed to the `DataStack`'s `addStorage()` methods, a new SQLite file will be created if it does not exist. + - Warning: The default SQLite file location for the `LegacySQLiteStore` and `SQLiteStore` are different. If the app was depending on CoreStore's default directories prior to 2.0.0, make sure to use `LegacySQLiteStore` instead of `SQLiteStore`. - - parameter fileName: the local filename for the SQLite persistent store in the "Application Support/" directory (or the "Caches/" directory on tvOS). Note that if you have multiple configurations, you will need to specify a different `fileName` explicitly for each of them. + - parameter fileName: the local filename for the SQLite persistent store in the "Application Support" directory (or the "Caches" directory on tvOS). Note that if you have multiple configurations, you will need to specify a different `fileName` explicitly for each of them. - parameter configuration: an optional configuration name from the model file. If not specified, defaults to `nil`, the "Default" configuration. Note that if you have multiple configurations, you will need to specify a different `fileName` explicitly for each of them. - - parameter resetStoreOnModelMismatch: When the `SQLiteStore` is passed to the `DataStack`'s `addStorage()` methods, a true value tells the `DataStack` to delete the store on model mismatch; a false value lets exceptions be thrown on failure instead. Typically should only be set to true when debugging, or if the persistent store can be recreated easily. If not specified, defaults to false. + - parameter mappingModelBundles: a list of `NSBundle`s from which to search mapping models for migration. + - parameter resetStoreOnModelMismatch: When the `LegacySQLiteStore` is passed to the `DataStack`'s `addStorage()` methods, a true value tells the `DataStack` to delete the store on model mismatch; a false value lets exceptions be thrown on failure instead. Typically should only be set to true when debugging, or if the persistent store can be recreated easily. If not specified, defaults to false. */ public required init(fileName: String, configuration: String? = nil, mappingModelBundles: [NSBundle] = NSBundle.allBundles(), resetStoreOnModelMismatch: Bool = false) { @@ -75,6 +77,10 @@ public final class LegacySQLiteStore: SQLiteStore { // MARK: DefaultInitializableStore + /** + Initializes an `LegacySQLiteStore` with an all-default settings: a `fileURL` pointing to a ".sqlite" file in the "Application Support" directory (or the "Caches" directory on tvOS), a `nil` `configuration` pertaining to the "Default" configuration, a `mappingModelBundles` set to search all `NSBundle`s, and `resetStoreOnModelMismatch` disabled. + - Warning: The default SQLite file location for the `LegacySQLiteStore` and `SQLiteStore` are different. If the app was depending on CoreStore's default directories prior to 2.0.0, make sure to use `LegacySQLiteStore` instead of `SQLiteStore`. + */ public required init() { super.init(fileURL: LegacySQLiteStore.legacyDefaultFileURL) diff --git a/Sources/Setting Up/StorageInterfaces/SQLiteStore.swift b/Sources/Setting Up/StorageInterfaces/SQLiteStore.swift index 2dfff1b..23e7b86 100644 --- a/Sources/Setting Up/StorageInterfaces/SQLiteStore.swift +++ b/Sources/Setting Up/StorageInterfaces/SQLiteStore.swift @@ -73,6 +73,7 @@ public class SQLiteStore: LocalStorage, DefaultInitializableStore { /** Initializes an `SQLiteStore` with an all-default settings: a `fileURL` pointing to a ".sqlite" file in the "Application Support/" directory (or the "Caches/" directory on tvOS), a `nil` `configuration` pertaining to the "Default" configuration, a `mappingModelBundles` set to search all `NSBundle`s, and `resetStoreOnModelMismatch` disabled. + - Warning: The default SQLite file location for the `LegacySQLiteStore` and `SQLiteStore` are different. If the app was depending on CoreStore's default directories prior to 2.0.0, make sure to use `LegacySQLiteStore` instead of `SQLiteStore`. */ public required init() {