Implement version checker

This commit is contained in:
Pedro Piñera Buendía 2016-06-28 23:35:45 +02:00
parent e331231adc
commit 77cff15866
13 changed files with 287 additions and 9 deletions

View File

@ -159,6 +159,7 @@
231C61EF1C17482100CD6532 /* CoreData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 231C61EE1C17482100CD6532 /* CoreData.swift */; };
231C61F11C174BE000CD6532 /* NSManagedObjectMemoryContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 231C61F01C174BE000CD6532 /* NSManagedObjectMemoryContext.swift */; };
231C61F21C174BE000CD6532 /* NSManagedObjectMemoryContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 231C61F01C174BE000CD6532 /* NSManagedObjectMemoryContext.swift */; };
2323031E1CDF4BFF00D6582F /* OHHTTPStubs.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 23EDB1DD1CDF4A6700C1577E /* OHHTTPStubs.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
233390121C67B41400844B9D /* ReactiveStorage+ReactiveCocoa.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2333900F1C67B41400844B9D /* ReactiveStorage+ReactiveCocoa.swift */; };
233390131C67B41400844B9D /* ReactiveStorage+ReactiveCocoa.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2333900F1C67B41400844B9D /* ReactiveStorage+ReactiveCocoa.swift */; };
233390141C67B41400844B9D /* ReactiveStorage+ReactiveCocoa.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2333900F1C67B41400844B9D /* ReactiveStorage+ReactiveCocoa.swift */; };
@ -264,12 +265,39 @@
23A916791C173E5F005E57D8 /* CoreDataDefaultStorageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23A916781C173E5F005E57D8 /* CoreDataDefaultStorageTests.swift */; };
23A9167D1C173FCF005E57D8 /* Requestable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23A9167C1C173FCF005E57D8 /* Requestable.swift */; };
23A9167E1C173FCF005E57D8 /* Requestable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23A9167C1C173FCF005E57D8 /* Requestable.swift */; };
23AB64331D2314DE0062B74F /* VersionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64321D2314DE0062B74F /* VersionProvider.swift */; };
23AB64341D2314DE0062B74F /* VersionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64321D2314DE0062B74F /* VersionProvider.swift */; };
23AB64351D2314DE0062B74F /* VersionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64321D2314DE0062B74F /* VersionProvider.swift */; };
23AB64361D2314DE0062B74F /* VersionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64321D2314DE0062B74F /* VersionProvider.swift */; };
23AB64371D2314DE0062B74F /* VersionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64321D2314DE0062B74F /* VersionProvider.swift */; };
23AB64381D2314DE0062B74F /* VersionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64321D2314DE0062B74F /* VersionProvider.swift */; };
23AB64391D2314DE0062B74F /* VersionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64321D2314DE0062B74F /* VersionProvider.swift */; };
23AB643A1D2314DE0062B74F /* VersionProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64321D2314DE0062B74F /* VersionProvider.swift */; };
23AB643D1D2315430062B74F /* VersionProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB643C1D2315430062B74F /* VersionProviderTests.swift */; };
23AB643F1D2316DA0062B74F /* VersionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB643E1D2316DA0062B74F /* VersionController.swift */; };
23AB64401D2316DA0062B74F /* VersionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB643E1D2316DA0062B74F /* VersionController.swift */; };
23AB64411D2316DA0062B74F /* VersionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB643E1D2316DA0062B74F /* VersionController.swift */; };
23AB64421D2316DA0062B74F /* VersionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB643E1D2316DA0062B74F /* VersionController.swift */; };
23AB64431D2316DA0062B74F /* VersionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB643E1D2316DA0062B74F /* VersionController.swift */; };
23AB64441D2316DA0062B74F /* VersionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB643E1D2316DA0062B74F /* VersionController.swift */; };
23AB64451D2316DA0062B74F /* VersionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB643E1D2316DA0062B74F /* VersionController.swift */; };
23AB64461D2316DA0062B74F /* VersionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB643E1D2316DA0062B74F /* VersionController.swift */; };
23AB64491D2317750062B74F /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64481D2317750062B74F /* Logger.swift */; };
23AB644A1D2317750062B74F /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64481D2317750062B74F /* Logger.swift */; };
23AB644B1D2317750062B74F /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64481D2317750062B74F /* Logger.swift */; };
23AB644C1D2317750062B74F /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64481D2317750062B74F /* Logger.swift */; };
23AB644D1D2317750062B74F /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64481D2317750062B74F /* Logger.swift */; };
23AB644E1D2317750062B74F /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64481D2317750062B74F /* Logger.swift */; };
23AB644F1D2317750062B74F /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64481D2317750062B74F /* Logger.swift */; };
23AB64501D2317750062B74F /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64481D2317750062B74F /* Logger.swift */; };
23AB64521D2318920062B74F /* VersionControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23AB64511D2318920062B74F /* VersionControllerTests.swift */; };
23AC16271BF370BA00FAF97A /* Entity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2305F8FE1BF1EA8D00F9D379 /* Entity.swift */; };
23B15C501BF352540059008E /* Repository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23B15C4F1BF352540059008E /* Repository.swift */; };
23B15C521BF352AD0059008E /* Issue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23B15C511BF352AD0059008E /* Issue.swift */; };
23B15C571BF3535E0059008E /* RealmTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23B15C561BF3535E0059008E /* RealmTests.swift */; };
23B15C591BF353F70059008E /* Realm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23B15C581BF353F70059008E /* Realm.swift */; };
23EDB1D11CDF3CEC00C1577E /* CoreDataObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2310154C1CDCCA42004486FA /* CoreDataObservable.swift */; };
23EDB1DE1CDF4A6700C1577E /* OHHTTPStubs.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 23EDB1DD1CDF4A6700C1577E /* OHHTTPStubs.framework */; };
23F3F36A1C1DFA6D009A5CC1 /* ReactiveError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23F3F3691C1DFA6D009A5CC1 /* ReactiveError.swift */; };
23F3F36B1C1DFA6D009A5CC1 /* ReactiveError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23F3F3691C1DFA6D009A5CC1 /* ReactiveError.swift */; };
23F3F3931C1E14BD009A5CC1 /* ReactiveStorageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23F3F3921C1E14BD009A5CC1 /* ReactiveStorageTests.swift */; };
@ -305,6 +333,7 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
2323031E1CDF4BFF00D6582F /* OHHTTPStubs.framework in Copy Frameworks */,
235400151CD3D4D30007E127 /* RxSwift.framework in Copy Frameworks */,
235400161CD3D4D30007E127 /* ReactiveCocoa.framework in Copy Frameworks */,
235400171CD3D4D30007E127 /* Realm.framework in Copy Frameworks */,
@ -391,11 +420,17 @@
23A916761C173CAF005E57D8 /* OptionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OptionsTests.swift; sourceTree = "<group>"; };
23A916781C173E5F005E57D8 /* CoreDataDefaultStorageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CoreDataDefaultStorageTests.swift; path = Storage/CoreDataDefaultStorageTests.swift; sourceTree = "<group>"; };
23A9167C1C173FCF005E57D8 /* Requestable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Requestable.swift; sourceTree = "<group>"; };
23AB64321D2314DE0062B74F /* VersionProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VersionProvider.swift; sourceTree = "<group>"; };
23AB643C1D2315430062B74F /* VersionProviderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VersionProviderTests.swift; sourceTree = "<group>"; };
23AB643E1D2316DA0062B74F /* VersionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VersionController.swift; sourceTree = "<group>"; };
23AB64481D2317750062B74F /* Logger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = "<group>"; };
23AB64511D2318920062B74F /* VersionControllerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VersionControllerTests.swift; sourceTree = "<group>"; };
23AC16281BF3716200FAF97A /* RealmEntity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RealmEntity.swift; sourceTree = "<group>"; };
23B15C4F1BF352540059008E /* Repository.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Repository.swift; sourceTree = "<group>"; };
23B15C511BF352AD0059008E /* Issue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Issue.swift; sourceTree = "<group>"; };
23B15C561BF3535E0059008E /* RealmTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RealmTests.swift; sourceTree = "<group>"; };
23B15C581BF353F70059008E /* Realm.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Realm.swift; sourceTree = "<group>"; };
23EDB1DD1CDF4A6700C1577E /* OHHTTPStubs.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = OHHTTPStubs.framework; sourceTree = BUILT_PRODUCTS_DIR; };
23F3F3691C1DFA6D009A5CC1 /* ReactiveError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReactiveError.swift; sourceTree = "<group>"; };
23F3F3921C1E14BD009A5CC1 /* ReactiveStorageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReactiveStorageTests.swift; sourceTree = "<group>"; };
3D733FD41C0C2AC400B74DA1 /* RequestTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestTests.swift; sourceTree = "<group>"; };
@ -535,6 +570,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
23EDB1DE1CDF4A6700C1577E /* OHHTTPStubs.framework in Frameworks */,
235400141CD3D4A00007E127 /* CoreData.framework in Frameworks */,
2354000E1CD3D43A0007E127 /* Nimble.framework in Frameworks */,
2354000B1CD3D42F0007E127 /* Quick.framework in Frameworks */,
@ -686,6 +722,8 @@
2353E62C1BED4AC00081E6E7 /* Foundation */ = {
isa = PBXGroup;
children = (
23AB64471D23176E0062B74F /* Logger */,
23AB64311D2314D20062B74F /* Version */,
2305F8EF1BF0FE1000F9D379 /* Utils */,
2353E62D1BED4AC00081E6E7 /* Entities */,
2353E6301BED4AC00081E6E7 /* Errors */,
@ -751,6 +789,7 @@
2354000C1CD3D4320007E127 /* Testing */ = {
isa = PBXGroup;
children = (
23EDB1DD1CDF4A6700C1577E /* OHHTTPStubs.framework */,
2354000D1CD3D43A0007E127 /* Nimble.framework */,
2354000A1CD3D42E0007E127 /* Quick.framework */,
);
@ -765,6 +804,32 @@
path = Utils;
sourceTree = "<group>";
};
23AB64311D2314D20062B74F /* Version */ = {
isa = PBXGroup;
children = (
23AB643E1D2316DA0062B74F /* VersionController.swift */,
23AB64321D2314DE0062B74F /* VersionProvider.swift */,
);
path = Version;
sourceTree = "<group>";
};
23AB643B1D2315370062B74F /* Version */ = {
isa = PBXGroup;
children = (
23AB643C1D2315430062B74F /* VersionProviderTests.swift */,
23AB64511D2318920062B74F /* VersionControllerTests.swift */,
);
path = Version;
sourceTree = "<group>";
};
23AB64471D23176E0062B74F /* Logger */ = {
isa = PBXGroup;
children = (
23AB64481D2317750062B74F /* Logger.swift */,
);
path = Logger;
sourceTree = "<group>";
};
23B15C4D1BF352470059008E /* CoreData */ = {
isa = PBXGroup;
children = (
@ -832,6 +897,7 @@
3D733FCF1C0C20A400B74DA1 /* Foundation */ = {
isa = PBXGroup;
children = (
23AB643B1D2315370062B74F /* Version */,
23A916731C173650005E57D8 /* Utils */,
3D733FD31C0C2AB400B74DA1 /* Entities */,
);
@ -1697,8 +1763,10 @@
233390131C67B41400844B9D /* ReactiveStorage+ReactiveCocoa.swift in Sources */,
2319B7DF1C23FF8F0050ABE8 /* Requestable.swift in Sources */,
2319B7E11C23FF8F0050ABE8 /* ReactiveError.swift in Sources */,
23AB644A1D2317750062B74F /* Logger.swift in Sources */,
2319B7E21C23FF8F0050ABE8 /* NSPredicateConvertible.swift in Sources */,
2319B7E31C23FF8F0050ABE8 /* Error.swift in Sources */,
23AB64401D2316DA0062B74F /* VersionController.swift in Sources */,
2319B7E41C23FF8F0050ABE8 /* Context.swift in Sources */,
2319B7E51C23FF8F0050ABE8 /* Results.swift in Sources */,
2319B7E81C23FF8F0050ABE8 /* RequestExtension.swift in Sources */,
@ -1706,6 +1774,7 @@
2319B7EA1C23FF8F0050ABE8 /* Entity.swift in Sources */,
2333901B1C67B41400844B9D /* ReactiveStorage+Rx.swift in Sources */,
231015391CDC9C64004486FA /* RequestObservable+Rx.swift in Sources */,
23AB64341D2314DE0062B74F /* VersionProvider.swift in Sources */,
2319B7EB1C23FF8F0050ABE8 /* Storage.swift in Sources */,
2319B7EC1C23FF8F0050ABE8 /* DirUtils.swift in Sources */,
2319B7ED1C23FF8F0050ABE8 /* RealmDefaultStorage.swift in Sources */,
@ -1726,8 +1795,10 @@
233390151C67B41400844B9D /* ReactiveStorage+ReactiveCocoa.swift in Sources */,
2319B8001C2400420050ABE8 /* Request.swift in Sources */,
2319B8061C2400420050ABE8 /* NSSortDescriptorConvertible.swift in Sources */,
23AB644C1D2317750062B74F /* Logger.swift in Sources */,
2319B80A1C2400420050ABE8 /* NSPredicateConvertible.swift in Sources */,
2319B80B1C2400420050ABE8 /* Error.swift in Sources */,
23AB64421D2316DA0062B74F /* VersionController.swift in Sources */,
2319B80C1C2400420050ABE8 /* Context.swift in Sources */,
2319B80E1C2400420050ABE8 /* RequestExtension.swift in Sources */,
2319B8101C2400420050ABE8 /* ReactiveError.swift in Sources */,
@ -1735,6 +1806,7 @@
2319B8111C2400420050ABE8 /* Entity.swift in Sources */,
2333901D1C67B41400844B9D /* ReactiveStorage+Rx.swift in Sources */,
2310153B1CDC9C64004486FA /* RequestObservable+Rx.swift in Sources */,
23AB64361D2314DE0062B74F /* VersionProvider.swift in Sources */,
2319B8121C2400420050ABE8 /* Storage.swift in Sources */,
2319B8131C2400420050ABE8 /* Requestable.swift in Sources */,
2319B8141C2400420050ABE8 /* DirUtils.swift in Sources */,
@ -1755,8 +1827,10 @@
2319B87E1C2402300050ABE8 /* NSPredicateConvertible.swift in Sources */,
233390171C67B41400844B9D /* ReactiveStorage+ReactiveCocoa.swift in Sources */,
2319B87F1C2402300050ABE8 /* NSSortDescriptorConvertible.swift in Sources */,
23AB644E1D2317750062B74F /* Logger.swift in Sources */,
2319B8801C2402300050ABE8 /* Context.swift in Sources */,
2319B8811C2402300050ABE8 /* Entity.swift in Sources */,
23AB64441D2316DA0062B74F /* VersionController.swift in Sources */,
2319B8821C2402300050ABE8 /* Requestable.swift in Sources */,
2319B8741C2402290050ABE8 /* Realm.swift in Sources */,
2319B8751C2402290050ABE8 /* Results.swift in Sources */,
@ -1764,6 +1838,7 @@
2319B8761C2402290050ABE8 /* Object.swift in Sources */,
2319B8771C2402290050ABE8 /* RealmEntity.swift in Sources */,
2310153D1CDC9C64004486FA /* RequestObservable+Rx.swift in Sources */,
23AB64381D2314DE0062B74F /* VersionProvider.swift in Sources */,
2333901F1C67B41400844B9D /* ReactiveStorage+Rx.swift in Sources */,
2319B8781C2402290050ABE8 /* RealmDefaultStorage.swift in Sources */,
2319B8721C2402220050ABE8 /* ReactiveError.swift in Sources */,
@ -1784,8 +1859,10 @@
2319B8D41C2402C30050ABE8 /* NSPredicateConvertible.swift in Sources */,
233390191C67B41400844B9D /* ReactiveStorage+ReactiveCocoa.swift in Sources */,
2319B8D51C2402C30050ABE8 /* NSSortDescriptorConvertible.swift in Sources */,
23AB64501D2317750062B74F /* Logger.swift in Sources */,
2319B8D61C2402C30050ABE8 /* Context.swift in Sources */,
2319B8D71C2402C30050ABE8 /* Entity.swift in Sources */,
23AB64461D2316DA0062B74F /* VersionController.swift in Sources */,
2319B8D81C2402C30050ABE8 /* Requestable.swift in Sources */,
2319B8C81C2402BA0050ABE8 /* ReactiveError.swift in Sources */,
2319B8CA1C2402BA0050ABE8 /* Realm.swift in Sources */,
@ -1793,6 +1870,7 @@
2319B8CB1C2402BA0050ABE8 /* Results.swift in Sources */,
233390211C67B41400844B9D /* ReactiveStorage+Rx.swift in Sources */,
2310153F1CDC9C64004486FA /* RequestObservable+Rx.swift in Sources */,
23AB643A1D2314DE0062B74F /* VersionProvider.swift in Sources */,
2319B8CC1C2402BA0050ABE8 /* Object.swift in Sources */,
2319B8CD1C2402BA0050ABE8 /* RealmEntity.swift in Sources */,
2319B8CE1C2402BA0050ABE8 /* RealmDefaultStorage.swift in Sources */,
@ -1805,6 +1883,8 @@
buildActionMask = 2147483647;
files = (
231C61F11C174BE000CD6532 /* NSManagedObjectMemoryContext.swift in Sources */,
23AB64491D2317750062B74F /* Logger.swift in Sources */,
23AB64331D2314DE0062B74F /* VersionProvider.swift in Sources */,
2353E6761BED4E420081E6E7 /* Store.swift in Sources */,
2353E6391BED4AC00081E6E7 /* NSManagedObject.swift in Sources */,
237A93D01C62A28B006BC2F1 /* iCloudConfig.swift in Sources */,
@ -1833,6 +1913,7 @@
2353E6491BED4AC00081E6E7 /* Storage.swift in Sources */,
233390121C67B41400844B9D /* ReactiveStorage+ReactiveCocoa.swift in Sources */,
2305F8F11BF0FE4500F9D379 /* DirUtils.swift in Sources */,
23AB643F1D2316DA0062B74F /* VersionController.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1841,6 +1922,8 @@
buildActionMask = 2147483647;
files = (
2353E6771BED4E420081E6E7 /* Store.swift in Sources */,
23AB644B1D2317750062B74F /* Logger.swift in Sources */,
23AB64351D2314DE0062B74F /* VersionProvider.swift in Sources */,
2353E63A1BED4AC00081E6E7 /* NSManagedObject.swift in Sources */,
2353E6461BED4AC00081E6E7 /* Request.swift in Sources */,
237A93CF1C62A28A006BC2F1 /* iCloudConfig.swift in Sources */,
@ -1869,6 +1952,7 @@
23A9167E1C173FCF005E57D8 /* Requestable.swift in Sources */,
233390141C67B41400844B9D /* ReactiveStorage+ReactiveCocoa.swift in Sources */,
2305F8F21BF0FE4500F9D379 /* DirUtils.swift in Sources */,
23AB64411D2316DA0062B74F /* VersionController.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1890,6 +1974,7 @@
2319B86D1C2401F80050ABE8 /* NSSortDescriptorConvertible.swift in Sources */,
237A93CD1C626AC8006BC2F1 /* iCloudConfig.swift in Sources */,
2319B86E1C2401F80050ABE8 /* Context.swift in Sources */,
23AB64371D2314DE0062B74F /* VersionProvider.swift in Sources */,
2319B86F1C2401F90050ABE8 /* Entity.swift in Sources */,
2319B8701C2401F90050ABE8 /* Requestable.swift in Sources */,
2333901E1C67B41400844B9D /* ReactiveStorage+Rx.swift in Sources */,
@ -1899,11 +1984,13 @@
2319B8601C2401F20050ABE8 /* Options.swift in Sources */,
231015451CDC9F0B004486FA /* RequestObservable+ReactiveCocoa.swift in Sources */,
2319B8611C2401F20050ABE8 /* ContextParent.swift in Sources */,
23AB644D1D2317750062B74F /* Logger.swift in Sources */,
2319B8621C2401F20050ABE8 /* CoreDataErrors.swift in Sources */,
2319B8631C2401F20050ABE8 /* NSManagedObject.swift in Sources */,
2319B8641C2401F20050ABE8 /* NSManagedObjectContext.swift in Sources */,
2310153C1CDC9C64004486FA /* RequestObservable+Rx.swift in Sources */,
2319B8651C2401F20050ABE8 /* NSManagedObjectMemoryContext.swift in Sources */,
23AB64431D2316DA0062B74F /* VersionController.swift in Sources */,
2319B8661C2401F20050ABE8 /* CoreDataDefaultStorage.swift in Sources */,
2319B85B1C2401E80050ABE8 /* ReactiveError.swift in Sources */,
);
@ -1927,6 +2014,7 @@
2319B8C31C2402960050ABE8 /* NSManagedObject.swift in Sources */,
2319B8C41C2402960050ABE8 /* NSManagedObjectContext.swift in Sources */,
2319B8C51C2402960050ABE8 /* NSManagedObjectMemoryContext.swift in Sources */,
23AB64391D2314DE0062B74F /* VersionProvider.swift in Sources */,
2319B8C61C2402960050ABE8 /* CoreDataDefaultStorage.swift in Sources */,
233390201C67B41400844B9D /* ReactiveStorage+Rx.swift in Sources */,
2319B8B21C24028C0050ABE8 /* DirUtils.swift in Sources */,
@ -1936,11 +2024,13 @@
231015471CDC9F0B004486FA /* RequestObservable+ReactiveCocoa.swift in Sources */,
2319B8B61C24028C0050ABE8 /* RequestExtension.swift in Sources */,
2319B8B71C24028C0050ABE8 /* NSPredicateConvertible.swift in Sources */,
23AB644F1D2317750062B74F /* Logger.swift in Sources */,
2319B8B81C24028C0050ABE8 /* NSSortDescriptorConvertible.swift in Sources */,
2319B8B91C24028C0050ABE8 /* Context.swift in Sources */,
2310153E1CDC9C64004486FA /* RequestObservable+Rx.swift in Sources */,
231015501CDCCA42004486FA /* CoreDataObservable.swift in Sources */,
2319B8BA1C24028C0050ABE8 /* Entity.swift in Sources */,
23AB64451D2316DA0062B74F /* VersionController.swift in Sources */,
2319B8BB1C24028C0050ABE8 /* Requestable.swift in Sources */,
2319B8B11C2402850050ABE8 /* ReactiveError.swift in Sources */,
);
@ -1961,10 +2051,12 @@
230CBDC21BF37F7A00C43A48 /* ResultsTests.swift in Sources */,
2305F8EE1BF0FAFC00F9D379 /* ObjectModelTests.swift in Sources */,
23A916791C173E5F005E57D8 /* CoreDataDefaultStorageTests.swift in Sources */,
23AB643D1D2315430062B74F /* VersionProviderTests.swift in Sources */,
239FE4CE1CDE67DE0050502F /* CoreDataObservableTests.swift in Sources */,
239FE4DA1CDE81D00050502F /* CoreDataChangeTests.swift in Sources */,
23B15C591BF353F70059008E /* Realm.swift in Sources */,
23B15C571BF3535E0059008E /* RealmTests.swift in Sources */,
23AB64521D2318920062B74F /* VersionControllerTests.swift in Sources */,
3D733FD51C0C2AC400B74DA1 /* RequestTests.swift in Sources */,
231C61EF1C17482100CD6532 /* CoreData.swift in Sources */,
2305F8EC1BF0F89200F9D379 /* StoreTests.swift in Sources */,

View File

@ -1,6 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Carthage/Checkouts/OHHTTPStubs/OHHTTPStubs/OHHTTPStubs.xcodeproj">
</FileRef>
<FileRef
location = "group:Carthage/Checkouts/RxSwift/Rx.xcodeproj">
</FileRef>

View File

@ -19,7 +19,7 @@
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<string>${CURRENT_PROJECT_VERSION}</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>

View File

@ -10,7 +10,7 @@ public class CoreDataDefaultStorage: Storage {
internal var persistentStore: NSPersistentStore! = nil
internal var persistentStoreCoordinator: NSPersistentStoreCoordinator! = nil
internal var rootSavingContext: NSManagedObjectContext! = nil
// MARK: - Storage conformance
@ -85,13 +85,18 @@ public class CoreDataDefaultStorage: Storage {
// MARK: - Init
public init(store: CoreData.Store, model: CoreData.ObjectModel, migrate: Bool = true) throws {
public convenience init(store: CoreData.Store, model: CoreData.ObjectModel, migrate: Bool = true) throws {
try self.init(store: store, model: model, migrate: migrate, versionController: VersionController())
}
internal init(store: CoreData.Store, model: CoreData.ObjectModel, migrate: Bool = true, versionController: VersionController) throws {
self.store = store
self.objectModel = model.model()!
self.persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: objectModel)
self.persistentStore = try cdInitializeStore(store, storeCoordinator: persistentStoreCoordinator, migrate: migrate)
self.rootSavingContext = cdContext(withParent: .Coordinator(self.persistentStoreCoordinator), concurrencyType: .PrivateQueueConcurrencyType, inMemory: false)
self.mainContext = cdContext(withParent: .Context(self.rootSavingContext), concurrencyType: .MainQueueConcurrencyType, inMemory: false)
versionController.check()
}

View File

@ -85,13 +85,18 @@ public class CoreDataiCloudStorage: Storage {
// MARK: - Init
public init(model: CoreData.ObjectModel, iCloud: ICloudConfig) throws {
public convenience init(model: CoreData.ObjectModel, iCloud: ICloudConfig) throws {
try self.init(model: model, iCloud: iCloud, versionController: VersionController())
}
internal init(model: CoreData.ObjectModel, iCloud: ICloudConfig, versionController: VersionController) throws {
self.objectModel = model.model()!
self.persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: objectModel)
(self.store, self.persistentStore) = try! cdiCloudInitializeStore(storeCoordinator: persistentStoreCoordinator, iCloud: iCloud)
self.rootSavingContext = cdContext(withParent: .Coordinator(self.persistentStoreCoordinator), concurrencyType: .PrivateQueueConcurrencyType, inMemory: false)
self.mainContext = cdContext(withParent: .Context(self.rootSavingContext), concurrencyType: .MainQueueConcurrencyType, inMemory: false)
self.observeiCloudChangesInCoordinator()
versionController.check()
}

View File

@ -0,0 +1,11 @@
import Foundation
internal class Logger {
// MARK: - Internal
internal func log(message: String) {
print("🍬 SugarRecord: \(message)")
}
}

View File

@ -0,0 +1,31 @@
import Foundation
internal class VersionController {
// MARK: - Attributes
private let provider: VersionProvider
private let logger: Logger
// MARK: - Init
internal init(provider: VersionProvider = VersionProvider(),
logger: Logger = Logger()) {
self.provider = provider
self.logger = logger
}
// MARK: - Internal
internal func check() {
let frameworkVersion = self.provider.framework()
self.provider.github { [weak self] (githubVersion) in
if frameworkVersion != githubVersion {
self?.logger.log("There's a new version available, \(githubVersion)")
}
}
}
}

View File

@ -0,0 +1,31 @@
import Foundation
internal class VersionProvider: NSObject {
// MARK: - Constants
internal static let apiReleasesUrl: String = "http://api.github.com/repos/pepibumur/sugarrecord/releases"
// MARK: - Internal
internal func framework() -> String! {
if let version = NSBundle(forClass: VersionProvider.classForCoder()).objectForInfoDictionaryKey("CFBundleShortVersionString") as? String {
return version
}
return nil
}
internal func github(completion: String -> Void) {
let request: NSURLRequest = NSURLRequest(URL: NSURL(string: VersionProvider.apiReleasesUrl)!)
NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()).dataTaskWithRequest(request, completionHandler: { (data, response, error) in
if let data = data {
let json: AnyObject? = try? NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments)
if let array = json as? [[String: AnyObject]], lastVersion = array.first, versionTag: String = lastVersion["tag_name"] as? String {
completion(versionTag)
}
}
}).resume()
}
}

View File

@ -10,8 +10,13 @@ public class RealmDefaultStorage: Storage {
/// MARK: - Init
public init(configuration: Realm.Configuration? = nil) {
public convenience init(configuration: Realm.Configuration? = nil) {
self.init(configuration: configuration, versionController: VersionController())
}
internal init(configuration: Realm.Configuration? = nil, versionController: VersionController) {
self.configuration = configuration
versionController.check()
}

View File

@ -0,0 +1,43 @@
import Foundation
import Quick
import Nimble
@testable import SugarRecordCoreData
class VersionControllerTests: QuickSpec {
override func spec() {
var provider: MockVersionProvider!
var logger: MockLogger!
var subject: VersionController!
beforeSuite {
provider = MockVersionProvider()
logger = MockLogger()
subject = VersionController(provider: provider, logger: logger)
}
it("should log when there's a new version") {
subject.check()
expect(logger.logged) == true
}
}
}
// MARK: - Mocking
private class MockVersionProvider: VersionProvider {
private override func framework() -> String! {
return "4.0.0"
}
private override func github(completion: String -> Void) {
completion("4.0.1")
}
}
private class MockLogger: Logger {
private var logged: Bool! = false
private override func log(message: String) {
self.logged = true
}
}

View File

@ -0,0 +1,48 @@
import Foundation
import Quick
import Nimble
import OHHTTPStubs
@testable import SugarRecordCoreData
class VersionProviderTests: QuickSpec {
override func spec() {
var subject: VersionProvider!
beforeEach {
subject = VersionProvider()
stub(isPath("/repos/pepibumur/sugarrecord/releases")) { _ in
let object = [["tag_name": "3.1.0"]]
return OHHTTPStubsResponse(JSONObject: object, statusCode: 200, headers: ["Content-Type":"application/json"])
}
}
afterEach {
OHHTTPStubs.removeAllStubs()
}
describe("-github:completion:") {
it("should return the version") {
waitUntil(timeout: 10, action: { (done) in
subject.github({ (version) in
expect(version) == "3.1.0"
done()
})
})
}
}
describe("-framework") {
it("should return a value") {
expect(subject.framework()).toNot(beNil())
}
it("should have the correct format") {
let regex = try! NSRegularExpression(pattern: "\\d+\\.\\d+\\.\\d+", options: [.CaseInsensitive])
let version = subject.framework()
let correctFormat = regex.firstMatchInString(version, options: [], range: NSMakeRange(0, version.characters.count)) != nil
expect(correctFormat) == true
}
}
}
}

View File

@ -47,14 +47,18 @@ class RealmObservableTests: QuickSpec {
}
context("update") {
it("should notify about updates") {
waitUntil(timeout: 5.0, action: { (done) in
var called: Bool = false
subject.observe({ (change) in
switch change {
case .Update(_, let insertions, _):
expect(insertions[0].element.id) == "666"
done()
if !called {
expect(insertions.first?.element.id) == "666"
done()
called = true
}
default:
break
}

View File

@ -101,4 +101,4 @@ class RealmDefaultStorageTests: QuickSpec {
}
}
}