From ddee83a1b54039551cd0e76a86e700bfd0ecfebb Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Tue, 4 Apr 2017 13:27:53 -0700 Subject: [PATCH 01/76] Placeholder SqliteNormalizedCache --- Apollo.xcodeproj/project.pbxproj | 16 ++++++++++++++++ Sources/InMemoryNormalizedCache.swift | 16 ++++++++++++++++ Sources/NormalizedCache.swift | 17 ----------------- Sources/SqliteNormalizedCache.swift | 13 +++++++++++++ 4 files changed, 45 insertions(+), 17 deletions(-) create mode 100644 Sources/InMemoryNormalizedCache.swift create mode 100644 Sources/SqliteNormalizedCache.swift diff --git a/Apollo.xcodeproj/project.pbxproj b/Apollo.xcodeproj/project.pbxproj index d2a0c03ec5..1b218124f8 100644 --- a/Apollo.xcodeproj/project.pbxproj +++ b/Apollo.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 544623A11E941BB100362E34 /* InMemoryNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544623A01E941BB100362E34 /* InMemoryNormalizedCache.swift */; }; + 544623A31E941BD700362E34 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544623A21E941BD700362E34 /* SqliteNormalizedCache.swift */; }; 9F0F98D41E7AC17D00BF0371 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F0F98D31E7AC17D00BF0371 /* StoreTransactionTests.swift */; }; 9F0F98E11E7BCC3400BF0371 /* Dictionary+KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F0F98E01E7BCC3400BF0371 /* Dictionary+KeyPath.swift */; }; 9F27D4641D40379500715680 /* JSONStandardTypeConversions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F27D4631D40379500715680 /* JSONStandardTypeConversions.swift */; }; @@ -145,6 +147,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 544623A01E941BB100362E34 /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; + 544623A21E941BD700362E34 /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCache.swift; sourceTree = ""; }; 9F0F98D31E7AC17D00BF0371 /* StoreTransactionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreTransactionTests.swift; sourceTree = ""; }; 9F0F98E01E7BCC3400BF0371 /* Dictionary+KeyPath.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Dictionary+KeyPath.swift"; sourceTree = ""; }; 9F27D4631D40379500715680 /* JSONStandardTypeConversions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSONStandardTypeConversions.swift; sourceTree = ""; }; @@ -276,6 +280,15 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 5446239F1E941B8D00362E34 /* NormalizedCaches */ = { + isa = PBXGroup; + children = ( + 544623A01E941BB100362E34 /* InMemoryNormalizedCache.swift */, + 544623A21E941BD700362E34 /* SqliteNormalizedCache.swift */, + ); + name = NormalizedCaches; + sourceTree = ""; + }; 9F17BC471DAF055A00138496 /* Supporting Files */ = { isa = PBXGroup; children = ( @@ -386,6 +399,7 @@ 9FC9A9CA1E2FD05C0023C4D5 /* Store */ = { isa = PBXGroup; children = ( + 5446239F1E941B8D00362E34 /* NormalizedCaches */, 9F55347A1DE1DB2100E54264 /* ApolloStore.swift */, 9FCE2CED1E6BE2D800E34457 /* NormalizedCache.swift */, 9FC9A9BC1E2C271C0023C4D5 /* RecordSet.swift */, @@ -750,11 +764,13 @@ 9F55347B1DE1DB2100E54264 /* ApolloStore.swift in Sources */, 9F69FFA91D42855900E000B1 /* NetworkTransport.swift in Sources */, 9FCDFD291E33D0CE007519DC /* GraphQLQueryWatcher.swift in Sources */, + 544623A31E941BD700362E34 /* SqliteNormalizedCache.swift in Sources */, 9FC2333D1E66BBF7001E4541 /* GraphQLDependencyTracker.swift in Sources */, 9F0F98E11E7BCC3400BF0371 /* Dictionary+KeyPath.swift in Sources */, 9FC9A9BF1E2C27FB0023C4D5 /* GraphQLResult.swift in Sources */, 9FC9A9D31E2FD48B0023C4D5 /* GraphQLError.swift in Sources */, 9FEB050D1DB5732300DA3B44 /* JSONSerializationFormat.swift in Sources */, + 544623A11E941BB100362E34 /* InMemoryNormalizedCache.swift in Sources */, 9FC9A9C51E2D6CE70023C4D5 /* Selections.swift in Sources */, 9FCDFD231E33A0D8007519DC /* AsynchronousOperation.swift in Sources */, 9FC9A9CC1E2FD0760023C4D5 /* Record.swift in Sources */, diff --git a/Sources/InMemoryNormalizedCache.swift b/Sources/InMemoryNormalizedCache.swift new file mode 100644 index 0000000000..28cf10a907 --- /dev/null +++ b/Sources/InMemoryNormalizedCache.swift @@ -0,0 +1,16 @@ +final class InMemoryNormalizedCache: NormalizedCache { + private var records: RecordSet + + init(records: RecordSet) { + self.records = records + } + + func loadRecords(forKeys keys: [CacheKey]) -> Promise<[Record?]> { + let records = keys.map { self.records[$0] } + return Promise(fulfilled: records) + } + + func merge(records: RecordSet) -> Promise> { + return Promise(fulfilled: self.records.merge(records: records)) + } +} diff --git a/Sources/NormalizedCache.swift b/Sources/NormalizedCache.swift index 1aafb552b7..3497780c9f 100644 --- a/Sources/NormalizedCache.swift +++ b/Sources/NormalizedCache.swift @@ -2,20 +2,3 @@ public protocol NormalizedCache { func loadRecords(forKeys keys: [CacheKey]) -> Promise<[Record?]> func merge(records: RecordSet) -> Promise> } - -final class InMemoryNormalizedCache: NormalizedCache { - private var records: RecordSet - - init(records: RecordSet) { - self.records = records - } - - func loadRecords(forKeys keys: [CacheKey]) -> Promise<[Record?]> { - let records = keys.map { self.records[$0] } - return Promise(fulfilled: records) - } - - func merge(records: RecordSet) -> Promise> { - return Promise(fulfilled: self.records.merge(records: records)) - } -} diff --git a/Sources/SqliteNormalizedCache.swift b/Sources/SqliteNormalizedCache.swift new file mode 100644 index 0000000000..af0fb0d31e --- /dev/null +++ b/Sources/SqliteNormalizedCache.swift @@ -0,0 +1,13 @@ +final class SqliteNormalizedCache: NormalizedCache { + + init(fileURL: URL) { + } + + public func merge(records: RecordSet) -> Promise> { + return Promise(fulfilled: Set()) + } + + public func loadRecords(forKeys keys: [CacheKey]) -> Promise<[Record?]> { + return Promise(fulfilled: []) + } +} From 55e8b8db09c4d309d4dac4af65dd719bbd8942fd Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Tue, 4 Apr 2017 14:10:39 -0700 Subject: [PATCH 02/76] Add SQLite.swift dependency to Apollo.podspec --- Apollo.podspec | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Apollo.podspec b/Apollo.podspec index 39a5dca90d..80d3e40c00 100644 --- a/Apollo.podspec +++ b/Apollo.podspec @@ -18,4 +18,6 @@ Pod::Spec.new do |s| s.source_files = 'Sources/**/*.swift' s.resource = 'scripts/check-and-run-apollo-codegen.sh' + + s.dependency 'SQLite.swift', '~> 0.11' end From 647884e54d63daefe48764e40b0ae43f8d3d0aec Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Tue, 4 Apr 2017 14:35:12 -0700 Subject: [PATCH 03/76] Create Example project to test Cocoapods installation --- .../ApolloExample.xcodeproj/project.pbxproj | 555 ++++++++ .../contents.xcworkspacedata | 7 + .../contents.xcworkspacedata | 10 + Example/ApolloExample/AppDelegate.swift | 46 + .../AppIcon.appiconset/Contents.json | 68 + .../Base.lproj/LaunchScreen.storyboard | 27 + .../ApolloExample/Base.lproj/Main.storyboard | 26 + Example/ApolloExample/Info.plist | 45 + Example/ApolloExample/ViewController.swift | 25 + .../ApolloExampleTests.swift | 36 + Example/ApolloExampleTests/Info.plist | 22 + Example/Podfile | 13 + Example/Podfile.lock | 21 + .../Pods/Local Podspecs/Apollo.podspec.json | 28 + Example/Pods/Manifest.lock | 21 + Example/Pods/Pods.xcodeproj/project.pbxproj | 1149 ++++++++++++++++ .../CocoaPods/appletvos/module.modulemap | 4 + .../appletvsimulator/module.modulemap | 4 + .../CocoaPods/iphoneos-10.0/module.modulemap | 4 + .../CocoaPods/iphoneos/module.modulemap | 4 + .../iphonesimulator-10.0/module.modulemap | 4 + .../iphonesimulator/module.modulemap | 4 + .../CocoaPods/macosx-10.11/module.modulemap | 4 + .../CocoaPods/macosx-10.12/module.modulemap | 4 + .../CocoaPods/macosx/module.modulemap | 4 + .../CocoaPods/watchos/module.modulemap | 4 + .../CocoaPods/watchsimulator/module.modulemap | 4 + Example/Pods/SQLite.swift/LICENSE.txt | 21 + Example/Pods/SQLite.swift/README.md | 263 ++++ .../Sources/SQLite/Core/Blob.swift | 60 + .../Sources/SQLite/Core/Connection.swift | 756 +++++++++++ .../Sources/SQLite/Core/Statement.swift | 297 +++++ .../Sources/SQLite/Core/Value.swift | 132 ++ .../Sources/SQLite/Extensions/FTS4.swift | 346 +++++ .../Sources/SQLite/Extensions/FTS5.swift | 97 ++ .../Sources/SQLite/Extensions/RTree.swift | 37 + .../Sources/SQLite/Foundation.swift | 108 ++ .../SQLite.swift/Sources/SQLite/Helpers.swift | 130 ++ .../Pods/SQLite.swift/Sources/SQLite/SQLite.h | 6 + .../SQLite/Typed/AggregateFunctions.swift | 251 ++++ .../Sources/SQLite/Typed/Collation.swift | 69 + .../Sources/SQLite/Typed/CoreFunctions.swift | 683 ++++++++++ .../SQLite/Typed/CustomFunctions.swift | 136 ++ .../Sources/SQLite/Typed/Expression.swift | 147 +++ .../Sources/SQLite/Typed/Operators.swift | 541 ++++++++ .../Sources/SQLite/Typed/Query.swift | 1162 +++++++++++++++++ .../Sources/SQLite/Typed/Schema.swift | 519 ++++++++ .../Sources/SQLite/Typed/Setter.swift | 277 ++++ .../Sources/SQLiteObjc/SQLite-Bridging.m | 138 ++ .../Sources/SQLiteObjc/fts3_tokenizer.h | 161 +++ .../SQLiteObjc/include/SQLite-Bridging.h | 37 + .../Apollo/Apollo-dummy.m | 5 + .../Apollo/Apollo-prefix.pch | 12 + .../Apollo/Apollo-umbrella.h | 16 + .../Apollo/Apollo.modulemap | 6 + .../Apollo/Apollo.xcconfig | 11 + .../Target Support Files/Apollo/Info.plist | 26 + .../Pods-ApolloExample/Info.plist | 26 + ...ds-ApolloExample-acknowledgements.markdown | 53 + .../Pods-ApolloExample-acknowledgements.plist | 91 ++ .../Pods-ApolloExample-dummy.m | 5 + .../Pods-ApolloExample-frameworks.sh | 101 ++ .../Pods-ApolloExample-resources.sh | 99 ++ .../Pods-ApolloExample-umbrella.h | 16 + .../Pods-ApolloExample.debug.xcconfig | 10 + .../Pods-ApolloExample.modulemap | 6 + .../Pods-ApolloExample.release.xcconfig | 10 + .../Pods-ApolloExampleTests/Info.plist | 26 + ...olloExampleTests-acknowledgements.markdown | 3 + ...-ApolloExampleTests-acknowledgements.plist | 29 + .../Pods-ApolloExampleTests-dummy.m | 5 + .../Pods-ApolloExampleTests-frameworks.sh | 92 ++ .../Pods-ApolloExampleTests-resources.sh | 99 ++ .../Pods-ApolloExampleTests-umbrella.h | 16 + .../Pods-ApolloExampleTests.debug.xcconfig | 7 + .../Pods-ApolloExampleTests.modulemap | 6 + .../Pods-ApolloExampleTests.release.xcconfig | 7 + .../SQLite.swift/Info.plist | 26 + .../SQLite.swift/SQLite.swift-dummy.m | 5 + .../SQLite.swift/SQLite.swift-prefix.pch | 12 + .../SQLite.swift/SQLite.swift-umbrella.h | 18 + .../SQLite.swift/SQLite.swift.modulemap | 6 + .../SQLite.swift/SQLite.swift.xcconfig | 23 + 83 files changed, 9390 insertions(+) create mode 100644 Example/ApolloExample.xcodeproj/project.pbxproj create mode 100644 Example/ApolloExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Example/ApolloExample.xcworkspace/contents.xcworkspacedata create mode 100644 Example/ApolloExample/AppDelegate.swift create mode 100644 Example/ApolloExample/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Example/ApolloExample/Base.lproj/LaunchScreen.storyboard create mode 100644 Example/ApolloExample/Base.lproj/Main.storyboard create mode 100644 Example/ApolloExample/Info.plist create mode 100644 Example/ApolloExample/ViewController.swift create mode 100644 Example/ApolloExampleTests/ApolloExampleTests.swift create mode 100644 Example/ApolloExampleTests/Info.plist create mode 100644 Example/Podfile create mode 100644 Example/Podfile.lock create mode 100644 Example/Pods/Local Podspecs/Apollo.podspec.json create mode 100644 Example/Pods/Manifest.lock create mode 100644 Example/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 Example/Pods/SQLite.swift/CocoaPods/appletvos/module.modulemap create mode 100644 Example/Pods/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap create mode 100644 Example/Pods/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap create mode 100644 Example/Pods/SQLite.swift/CocoaPods/iphoneos/module.modulemap create mode 100644 Example/Pods/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap create mode 100644 Example/Pods/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap create mode 100644 Example/Pods/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap create mode 100644 Example/Pods/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap create mode 100644 Example/Pods/SQLite.swift/CocoaPods/macosx/module.modulemap create mode 100644 Example/Pods/SQLite.swift/CocoaPods/watchos/module.modulemap create mode 100644 Example/Pods/SQLite.swift/CocoaPods/watchsimulator/module.modulemap create mode 100644 Example/Pods/SQLite.swift/LICENSE.txt create mode 100644 Example/Pods/SQLite.swift/README.md create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Core/Blob.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Core/Connection.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Core/Statement.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Core/Value.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Extensions/RTree.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Foundation.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Helpers.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/SQLite.h create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/Collation.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/Expression.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/Operators.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/Query.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/Schema.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/Setter.swift create mode 100644 Example/Pods/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m create mode 100644 Example/Pods/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h create mode 100644 Example/Pods/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h create mode 100644 Example/Pods/Target Support Files/Apollo/Apollo-dummy.m create mode 100644 Example/Pods/Target Support Files/Apollo/Apollo-prefix.pch create mode 100644 Example/Pods/Target Support Files/Apollo/Apollo-umbrella.h create mode 100644 Example/Pods/Target Support Files/Apollo/Apollo.modulemap create mode 100644 Example/Pods/Target Support Files/Apollo/Apollo.xcconfig create mode 100644 Example/Pods/Target Support Files/Apollo/Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.markdown create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.plist create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-dummy.m create mode 100755 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-frameworks.sh create mode 100755 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-resources.sh create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-umbrella.h create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.debug.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.modulemap create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.release.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExampleTests/Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-acknowledgements.markdown create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-acknowledgements.plist create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-dummy.m create mode 100755 Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-frameworks.sh create mode 100755 Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-resources.sh create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-umbrella.h create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.debug.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.modulemap create mode 100644 Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.release.xcconfig create mode 100644 Example/Pods/Target Support Files/SQLite.swift/Info.plist create mode 100644 Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-dummy.m create mode 100644 Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-prefix.pch create mode 100644 Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-umbrella.h create mode 100644 Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.modulemap create mode 100644 Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.xcconfig diff --git a/Example/ApolloExample.xcodeproj/project.pbxproj b/Example/ApolloExample.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..8033abd7e9 --- /dev/null +++ b/Example/ApolloExample.xcodeproj/project.pbxproj @@ -0,0 +1,555 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 54E966D41E9447F7002884AD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E966D31E9447F7002884AD /* AppDelegate.swift */; }; + 54E966D61E9447F7002884AD /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E966D51E9447F7002884AD /* ViewController.swift */; }; + 54E966D91E9447F7002884AD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 54E966D71E9447F7002884AD /* Main.storyboard */; }; + 54E966DB1E9447F7002884AD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 54E966DA1E9447F7002884AD /* Assets.xcassets */; }; + 54E966DE1E9447F7002884AD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 54E966DC1E9447F7002884AD /* LaunchScreen.storyboard */; }; + 54E966E91E9447F7002884AD /* ApolloExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E966E81E9447F7002884AD /* ApolloExampleTests.swift */; }; + 720CD5ED88A1DBC2947C9278 /* Pods_ApolloExample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD21DBB0EAAEAC44C0DAE2E0 /* Pods_ApolloExample.framework */; }; + A9291F9A2E9ECFA8638C1319 /* Pods_ApolloExampleTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D924536227C50FAA0070E95 /* Pods_ApolloExampleTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 54E966E51E9447F7002884AD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54E966C81E9447F7002884AD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 54E966CF1E9447F7002884AD; + remoteInfo = ApolloExample; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 1AAAF608B73F123ACD20BAB6 /* Pods-ApolloExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloExampleTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.release.xcconfig"; sourceTree = ""; }; + 41AA21D8F253186B9E485F75 /* Pods-ApolloExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloExample.release.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.release.xcconfig"; sourceTree = ""; }; + 4D924536227C50FAA0070E95 /* Pods_ApolloExampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ApolloExampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54E966D01E9447F7002884AD /* ApolloExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ApolloExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 54E966D31E9447F7002884AD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 54E966D51E9447F7002884AD /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 54E966D81E9447F7002884AD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 54E966DA1E9447F7002884AD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 54E966DD1E9447F7002884AD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 54E966DF1E9447F7002884AD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 54E966E41E9447F7002884AD /* ApolloExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 54E966E81E9447F7002884AD /* ApolloExampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApolloExampleTests.swift; sourceTree = ""; }; + 54E966EA1E9447F7002884AD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 96252404982964864A31A200 /* Pods-ApolloExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloExampleTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.debug.xcconfig"; sourceTree = ""; }; + AD21DBB0EAAEAC44C0DAE2E0 /* Pods_ApolloExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ApolloExample.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FC005AAA6953D6B8E8C04F0D /* Pods-ApolloExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloExample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 54E966CD1E9447F7002884AD /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 720CD5ED88A1DBC2947C9278 /* Pods_ApolloExample.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 54E966E11E9447F7002884AD /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A9291F9A2E9ECFA8638C1319 /* Pods_ApolloExampleTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 54E966C71E9447F7002884AD = { + isa = PBXGroup; + children = ( + 54E966D21E9447F7002884AD /* ApolloExample */, + 54E966E71E9447F7002884AD /* ApolloExampleTests */, + 54E966D11E9447F7002884AD /* Products */, + C1B8068DEABD85ECF3227AA2 /* Pods */, + C96167F12B5E3E2FD9D057A4 /* Frameworks */, + ); + sourceTree = ""; + }; + 54E966D11E9447F7002884AD /* Products */ = { + isa = PBXGroup; + children = ( + 54E966D01E9447F7002884AD /* ApolloExample.app */, + 54E966E41E9447F7002884AD /* ApolloExampleTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 54E966D21E9447F7002884AD /* ApolloExample */ = { + isa = PBXGroup; + children = ( + 54E966D31E9447F7002884AD /* AppDelegate.swift */, + 54E966D51E9447F7002884AD /* ViewController.swift */, + 54E966D71E9447F7002884AD /* Main.storyboard */, + 54E966DA1E9447F7002884AD /* Assets.xcassets */, + 54E966DC1E9447F7002884AD /* LaunchScreen.storyboard */, + 54E966DF1E9447F7002884AD /* Info.plist */, + ); + path = ApolloExample; + sourceTree = ""; + }; + 54E966E71E9447F7002884AD /* ApolloExampleTests */ = { + isa = PBXGroup; + children = ( + 54E966E81E9447F7002884AD /* ApolloExampleTests.swift */, + 54E966EA1E9447F7002884AD /* Info.plist */, + ); + path = ApolloExampleTests; + sourceTree = ""; + }; + C1B8068DEABD85ECF3227AA2 /* Pods */ = { + isa = PBXGroup; + children = ( + FC005AAA6953D6B8E8C04F0D /* Pods-ApolloExample.debug.xcconfig */, + 41AA21D8F253186B9E485F75 /* Pods-ApolloExample.release.xcconfig */, + 96252404982964864A31A200 /* Pods-ApolloExampleTests.debug.xcconfig */, + 1AAAF608B73F123ACD20BAB6 /* Pods-ApolloExampleTests.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + C96167F12B5E3E2FD9D057A4 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AD21DBB0EAAEAC44C0DAE2E0 /* Pods_ApolloExample.framework */, + 4D924536227C50FAA0070E95 /* Pods_ApolloExampleTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 54E966CF1E9447F7002884AD /* ApolloExample */ = { + isa = PBXNativeTarget; + buildConfigurationList = 54E966ED1E9447F7002884AD /* Build configuration list for PBXNativeTarget "ApolloExample" */; + buildPhases = ( + 34578E9F83BE52E8FFB08218 /* [CP] Check Pods Manifest.lock */, + 54E966CC1E9447F7002884AD /* Sources */, + 54E966CD1E9447F7002884AD /* Frameworks */, + 54E966CE1E9447F7002884AD /* Resources */, + BC1B88B78431B107FC3E744E /* [CP] Embed Pods Frameworks */, + 96571593B3149F00AF3D1198 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ApolloExample; + productName = ApolloExample; + productReference = 54E966D01E9447F7002884AD /* ApolloExample.app */; + productType = "com.apple.product-type.application"; + }; + 54E966E31E9447F7002884AD /* ApolloExampleTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 54E966F01E9447F7002884AD /* Build configuration list for PBXNativeTarget "ApolloExampleTests" */; + buildPhases = ( + D7605B6209DC68FECE6DE6D7 /* [CP] Check Pods Manifest.lock */, + 54E966E01E9447F7002884AD /* Sources */, + 54E966E11E9447F7002884AD /* Frameworks */, + 54E966E21E9447F7002884AD /* Resources */, + 09CCF837EEBAB8D08AE4258A /* [CP] Embed Pods Frameworks */, + 8EF878C231A237EA86BCCD44 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 54E966E61E9447F7002884AD /* PBXTargetDependency */, + ); + name = ApolloExampleTests; + productName = ApolloExampleTests; + productReference = 54E966E41E9447F7002884AD /* ApolloExampleTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 54E966C81E9447F7002884AD /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0820; + LastUpgradeCheck = 0820; + TargetAttributes = { + 54E966CF1E9447F7002884AD = { + CreatedOnToolsVersion = 8.2.1; + ProvisioningStyle = Automatic; + }; + 54E966E31E9447F7002884AD = { + CreatedOnToolsVersion = 8.2.1; + ProvisioningStyle = Automatic; + TestTargetID = 54E966CF1E9447F7002884AD; + }; + }; + }; + buildConfigurationList = 54E966CB1E9447F7002884AD /* Build configuration list for PBXProject "ApolloExample" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 54E966C71E9447F7002884AD; + productRefGroup = 54E966D11E9447F7002884AD /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 54E966CF1E9447F7002884AD /* ApolloExample */, + 54E966E31E9447F7002884AD /* ApolloExampleTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 54E966CE1E9447F7002884AD /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 54E966DE1E9447F7002884AD /* LaunchScreen.storyboard in Resources */, + 54E966DB1E9447F7002884AD /* Assets.xcassets in Resources */, + 54E966D91E9447F7002884AD /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 54E966E21E9447F7002884AD /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 09CCF837EEBAB8D08AE4258A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 34578E9F83BE52E8FFB08218 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + 8EF878C231A237EA86BCCD44 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 96571593B3149F00AF3D1198 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + BC1B88B78431B107FC3E744E /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + D7605B6209DC68FECE6DE6D7 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 54E966CC1E9447F7002884AD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 54E966D61E9447F7002884AD /* ViewController.swift in Sources */, + 54E966D41E9447F7002884AD /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 54E966E01E9447F7002884AD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 54E966E91E9447F7002884AD /* ApolloExampleTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 54E966E61E9447F7002884AD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 54E966CF1E9447F7002884AD /* ApolloExample */; + targetProxy = 54E966E51E9447F7002884AD /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 54E966D71E9447F7002884AD /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 54E966D81E9447F7002884AD /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 54E966DC1E9447F7002884AD /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 54E966DD1E9447F7002884AD /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 54E966EB1E9447F7002884AD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 54E966EC1E9447F7002884AD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 54E966EE1E9447F7002884AD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FC005AAA6953D6B8E8C04F0D /* Pods-ApolloExample.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = ApolloExample/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 54E966EF1E9447F7002884AD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 41AA21D8F253186B9E485F75 /* Pods-ApolloExample.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = ApolloExample/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; + 54E966F11E9447F7002884AD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 96252404982964864A31A200 /* Pods-ApolloExampleTests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = ApolloExampleTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloExampleTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ApolloExample.app/ApolloExample"; + }; + name = Debug; + }; + 54E966F21E9447F7002884AD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1AAAF608B73F123ACD20BAB6 /* Pods-ApolloExampleTests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + INFOPLIST_FILE = ApolloExampleTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloExampleTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ApolloExample.app/ApolloExample"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 54E966CB1E9447F7002884AD /* Build configuration list for PBXProject "ApolloExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 54E966EB1E9447F7002884AD /* Debug */, + 54E966EC1E9447F7002884AD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 54E966ED1E9447F7002884AD /* Build configuration list for PBXNativeTarget "ApolloExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 54E966EE1E9447F7002884AD /* Debug */, + 54E966EF1E9447F7002884AD /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; + 54E966F01E9447F7002884AD /* Build configuration list for PBXNativeTarget "ApolloExampleTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 54E966F11E9447F7002884AD /* Debug */, + 54E966F21E9447F7002884AD /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 54E966C81E9447F7002884AD /* Project object */; +} diff --git a/Example/ApolloExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/ApolloExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..ad9c79e410 --- /dev/null +++ b/Example/ApolloExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Example/ApolloExample.xcworkspace/contents.xcworkspacedata b/Example/ApolloExample.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..a8e59441de --- /dev/null +++ b/Example/ApolloExample.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Example/ApolloExample/AppDelegate.swift b/Example/ApolloExample/AppDelegate.swift new file mode 100644 index 0000000000..72bd591489 --- /dev/null +++ b/Example/ApolloExample/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// ApolloExample +// +// Created by paul_kompfner on 4/4/17. +// +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/Example/ApolloExample/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/ApolloExample/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..36d2c80d88 --- /dev/null +++ b/Example/ApolloExample/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/ApolloExample/Base.lproj/LaunchScreen.storyboard b/Example/ApolloExample/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000000..fdf3f97d1b --- /dev/null +++ b/Example/ApolloExample/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/ApolloExample/Base.lproj/Main.storyboard b/Example/ApolloExample/Base.lproj/Main.storyboard new file mode 100644 index 0000000000..273375fc70 --- /dev/null +++ b/Example/ApolloExample/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/ApolloExample/Info.plist b/Example/ApolloExample/Info.plist new file mode 100644 index 0000000000..d052473868 --- /dev/null +++ b/Example/ApolloExample/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Example/ApolloExample/ViewController.swift b/Example/ApolloExample/ViewController.swift new file mode 100644 index 0000000000..001d8a77b5 --- /dev/null +++ b/Example/ApolloExample/ViewController.swift @@ -0,0 +1,25 @@ +// +// ViewController.swift +// ApolloExample +// +// Created by paul_kompfner on 4/4/17. +// +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + +} + diff --git a/Example/ApolloExampleTests/ApolloExampleTests.swift b/Example/ApolloExampleTests/ApolloExampleTests.swift new file mode 100644 index 0000000000..d0aeca62eb --- /dev/null +++ b/Example/ApolloExampleTests/ApolloExampleTests.swift @@ -0,0 +1,36 @@ +// +// ApolloExampleTests.swift +// ApolloExampleTests +// +// Created by paul_kompfner on 4/4/17. +// +// + +import XCTest +@testable import ApolloExample + +class ApolloExampleTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/Example/ApolloExampleTests/Info.plist b/Example/ApolloExampleTests/Info.plist new file mode 100644 index 0000000000..6c6c23c43a --- /dev/null +++ b/Example/ApolloExampleTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Example/Podfile b/Example/Podfile new file mode 100644 index 0000000000..72990c2c40 --- /dev/null +++ b/Example/Podfile @@ -0,0 +1,13 @@ +platform :ios, '8.0' + +target 'ApolloExample' do + use_frameworks! + + # Pods for ApolloExample + pod 'Apollo', path: '../' + + target 'ApolloExampleTests' do + inherit! :search_paths + end + +end diff --git a/Example/Podfile.lock b/Example/Podfile.lock new file mode 100644 index 0000000000..7409c1c84a --- /dev/null +++ b/Example/Podfile.lock @@ -0,0 +1,21 @@ +PODS: + - Apollo (0.5.6): + - SQLite.swift (~> 0.11) + - SQLite.swift (0.11.2): + - SQLite.swift/standard (= 0.11.2) + - SQLite.swift/standard (0.11.2) + +DEPENDENCIES: + - Apollo (from `../`) + +EXTERNAL SOURCES: + Apollo: + :path: "../" + +SPEC CHECKSUMS: + Apollo: 6ced3e5ebf99730856f5c3643eb2cfe781d719b1 + SQLite.swift: 670c3e9e0a806bbfd56a3de5d530768dc0e6fe7c + +PODFILE CHECKSUM: ee061f3c4d84b796dbd982d1f0974254f2444ed7 + +COCOAPODS: 1.2.0 diff --git a/Example/Pods/Local Podspecs/Apollo.podspec.json b/Example/Pods/Local Podspecs/Apollo.podspec.json new file mode 100644 index 0000000000..5153430f8f --- /dev/null +++ b/Example/Pods/Local Podspecs/Apollo.podspec.json @@ -0,0 +1,28 @@ +{ + "name": "Apollo", + "version": "0.5.6", + "authors": "Meteor Development Group", + "homepage": "https://github.com/apollographql/apollo-ios", + "license": { + "type": "MIT", + "file": "LICENSE" + }, + "summary": "A GraphQL client for iOS, written in Swift.", + "source": { + "git": "https://github.com/apollographql/apollo-ios.git", + "tag": "0.5.6" + }, + "requires_arc": true, + "platforms": { + "ios": "8.0", + "tvos": "9.0", + "osx": "10.10" + }, + "source_files": "Sources/**/*.swift", + "resources": "scripts/check-and-run-apollo-codegen.sh", + "dependencies": { + "SQLite.swift": [ + "~> 0.11" + ] + } +} diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock new file mode 100644 index 0000000000..7409c1c84a --- /dev/null +++ b/Example/Pods/Manifest.lock @@ -0,0 +1,21 @@ +PODS: + - Apollo (0.5.6): + - SQLite.swift (~> 0.11) + - SQLite.swift (0.11.2): + - SQLite.swift/standard (= 0.11.2) + - SQLite.swift/standard (0.11.2) + +DEPENDENCIES: + - Apollo (from `../`) + +EXTERNAL SOURCES: + Apollo: + :path: "../" + +SPEC CHECKSUMS: + Apollo: 6ced3e5ebf99730856f5c3643eb2cfe781d719b1 + SQLite.swift: 670c3e9e0a806bbfd56a3de5d530768dc0e6fe7c + +PODFILE CHECKSUM: ee061f3c4d84b796dbd982d1f0974254f2444ed7 + +COCOAPODS: 1.2.0 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..a3805d1a53 --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1149 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 01CD0AAF59D458AC3EF2601332DC362C /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A8AF61E57D939C975D9A6B03DF50CC7 /* SqliteNormalizedCache.swift */; }; + 108A1CBD5D0C9FC34DD2B5C2B8DD0E1F /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF98B7BBADF63A0AF80D7829FA6F77B9 /* Schema.swift */; }; + 11D8F132B7F8704E64825695F6B0DC91 /* fts3_tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5AE2EFBEFDE20C4DDD8B3398D8AE5AE8 /* fts3_tokenizer.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 1569991C9A095D1FCE6B235BD63B51A4 /* Apollo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B5C756BCE1977B310FBCDFC81E7CB726 /* Apollo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 15E73F1CED9B85C8E03C6134581D2ED0 /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60FAE93532FD5578A02AF3CC523A3408 /* CoreFunctions.swift */; }; + 20C306F7AA685281AAEADDEF70FE27B4 /* Record.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616AA09AE6625A279D08C4E95BBF8FAF /* Record.swift */; }; + 24401D6F94D534811685D1F542F93892 /* GraphQLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95684FC3AB25B49063D525A7C78F0B17 /* GraphQLResponse.swift */; }; + 2650B6BD41F1BDFF5A15F9C4C8E61A37 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35069E56A5D5D4923A18BA7A092E73D4 /* Utilities.swift */; }; + 2664C21FA05281B3AEC72F71EA44028A /* Collections.swift in Sources */ = {isa = PBXBuildFile; fileRef = A918C3B2E22CB999534D187039A4D52A /* Collections.swift */; }; + 2C64BE3142AB8955A8F1B7ED8C4AC1FD /* AsynchronousOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A5D8EED2099F4E9AC37C5EC2D95A738 /* AsynchronousOperation.swift */; }; + 2F8B5597F178C1FBFC35700AB8BC15C6 /* Pods-ApolloExampleTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B9A381366F19009489326838310B31FD /* Pods-ApolloExampleTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 30382E91D15E7ED4E930564DE86EAF27 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44EE37E8BF436A90A9C40AD27A182DB2 /* Expression.swift */; }; + 3401D945C9C21F03B6E5100F26DF231C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; + 35E5EEDB90225D140DCA57800CD5A2CD /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23E934E5F923C9742E63347D5512C322 /* AggregateFunctions.swift */; }; + 3D85E3F5AB73653A962BCF09ED74A8C0 /* JSONSerializationFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30DAD61D66BBDE6441131A52D95BDB04 /* JSONSerializationFormat.swift */; }; + 3EB8845BB3EB8B7E031BCA86CEC2F0D2 /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B4C8E0D8DB99B4482E2549FEAE620B8 /* FTS5.swift */; }; + 3EEC07CDEFE2204C5CFC1E1B10B6537F /* GraphQLResultNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF17E380BFA697F14018DED6126C8AC8 /* GraphQLResultNormalizer.swift */; }; + 415B7E98D356AE4B47C6FD5D11E11C99 /* Pods-ApolloExample-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C3BEBD4B9A599D0ADDE174D8FF81C446 /* Pods-ApolloExample-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 42F81544370E1853391B67D56656A0C3 /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348491EAD9C18B0EEB2E855815254774 /* CustomFunctions.swift */; }; + 47628EC1F1DDCC60DF83EA01A277919E /* SQLite-Bridging.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E070D9E44393CD520D0B1AF87A6736D /* SQLite-Bridging.m */; }; + 47B4F5C1BFB40746F552A6D5CE482DC3 /* Locking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9090E10380883B7CA79EE41C691650F7 /* Locking.swift */; }; + 47BDB97605B55D76D846461E4AFCF7E7 /* Pods-ApolloExampleTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E3D732CCE212D0876E0126673CDB0726 /* Pods-ApolloExampleTests-dummy.m */; }; + 49876A987CA44C386457D31880AE1BD6 /* SQLite.swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 27B2D491F0A9B062233011B873DC118C /* SQLite.swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4A23CC3D6A3579C9F12AE00384A7A4F3 /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F331ABE5223829EDFFC088184DFA981 /* RTree.swift */; }; + 4DCCD02DB715AC161B0774E0C137353E /* NetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42BBD89CF65425C4A9DD8F6390DF859D /* NetworkTransport.swift */; }; + 4FFB64EBCE34E07A60C74F1957B34A7B /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FCCE88ECC9D892349AB6CB3160246D9 /* Query.swift */; }; + 54CFD21E9012A2554410D08EF63E42CB /* ApolloClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B42D8D8A4E18179F37824F2695F75F3 /* ApolloClient.swift */; }; + 5C154FC66B0272E926E740EB0D5DDF3E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; + 6263A24701DED2E7A447C0313C7C555D /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA7CCC1A073BC5540EA969CA71F0C552 /* Setter.swift */; }; + 636C2473106673D1432A22A0B7D6A2C9 /* Pods-ApolloExample-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EBE5D90E73ED2BB52CF8CF07A8705807 /* Pods-ApolloExample-dummy.m */; }; + 63D650CA310911FBCB77C3E6229330A7 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = B88C5FD0C85A5AE4583CC7DB512E6820 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6C5A957F0E47791FFA662827ADBA67A9 /* GraphQLResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB17F37738DF3903DEB18A03BAA3C0D8 /* GraphQLResult.swift */; }; + 6CC6B8EEDAA285718533CC1482D13B61 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = E993F928AC8B4275D32665A6205AE456 /* Result.swift */; }; + 6F378D7233AC3E51B00DB180BF8D6066 /* Selections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F3DE78C37EE122AA21BA986A77BB162 /* Selections.swift */; }; + 6FCDA3222BB1A7CADC500C19CA4A6611 /* check-and-run-apollo-codegen.sh in Resources */ = {isa = PBXBuildFile; fileRef = 872EA0E9B1EC6684546BEFF234C61E6E /* check-and-run-apollo-codegen.sh */; }; + 77E05C7059DFD498C2B323C3A707C0E8 /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 078C996EB71DC4EA36311067B6D81A3E /* Promise.swift */; }; + 787BB17CD95328B14A766F6BC04D2148 /* HTTPNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D40A77826E6FE48F27E93C4A66DD9C /* HTTPNetworkTransport.swift */; }; + 7FF4749CC9A33C7B79FE51E0962A4E8A /* Dictionary+KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FA62E20AC29F9ECA17CDE346F83E445 /* Dictionary+KeyPath.swift */; }; + 853B5034825B85498FE7857957760849 /* NormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED6DD22A402D834518D62E49A6D34114 /* NormalizedCache.swift */; }; + 87109E7659BAF278C52455C1D6529DF6 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DE06F129836BA95B0BE2222991D2BD0 /* Value.swift */; }; + 8916D47EB3F95315F2020922A6130D8D /* GraphQLExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 909F358C8C8DF9392766416B86EACE63 /* GraphQLExecutor.swift */; }; + 8D2A9E5942209EC7EAE309C3BDEC344E /* GraphQLQueryWatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0324BDEF4908733765A4E8909A7F10 /* GraphQLQueryWatcher.swift */; }; + 94ECE937BFDFCDBD700A107B1DC40CA9 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96600A78FEC066BF8931D7A58FBF0F16 /* Statement.swift */; }; + A11B9C4B8DC4AF252BA2727D21A1EEF1 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7B7855DE178D22988512E88C68325BE /* Collation.swift */; }; + A3FF4B5B363E91C3BE7FC3294C555032 /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E667D63233F61B551F3B93AF184020E0 /* Foundation.swift */; }; + A54DF0B95FE0DAD23D2A81D408683D03 /* DataLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 180A54E2C9EAC29BCD0767F9CF54EB79 /* DataLoader.swift */; }; + A60D999F6C5C2A7030430FBB2644A85D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; + AB1840F1E49F6C17A8A12662445629C3 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDA86AD441076D928D0621530CD5E745 /* Operators.swift */; }; + AC87CC13FC22BD408AA235121C216C85 /* ApolloStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6962E4B167BCDE8CACFF3DC269212EE7 /* ApolloStore.swift */; }; + AFC4EF684AAE208082F88A746E8799D5 /* SQLite-Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = AF7F8DDFC50FE6ACA57F6A16E253F8DC /* SQLite-Bridging.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B27809FB8835D7719B0AD7337D908431 /* SQLite.swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D30459F9DC30876AF6C299D26C7CE48 /* SQLite.swift-dummy.m */; }; + B6F6F22A0B59D1A386C7AC19789B74C0 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB44F0C85553660857F351B59660E399 /* SQLite.framework */; }; + B8354678757BF7E72C8E638F8FD096ED /* JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72488E3CB82621BCD287255DE4F91E6 /* JSON.swift */; }; + B948E00EC8119CFD8B9E55DBBDA5A4E3 /* GraphQLOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37BFA28F22BF54064B21348557B64BD3 /* GraphQLOperation.swift */; }; + BA32663AD51B09E7997DD5871D7FE383 /* GraphQLDependencyTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 399B342ADA72E237E0EBF1EEAA28FB25 /* GraphQLDependencyTracker.swift */; }; + C02AE58DC3E78ACB817163011C7A6734 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 680617B7B3999D016982CD479DADCCB0 /* Blob.swift */; }; + D850BB2A3E7B9A6AAEB54FA9A8B7AD4F /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCF813C6D3C0824E1BCFDACADE6109F5 /* Connection.swift */; }; + D99283BAF5F146D362611679A5ED1A5D /* Apollo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E5BB833C4CF9D696FCF839FB705C1A91 /* Apollo-dummy.m */; }; + DA0CEB1E0989DCA89796ABDF7267A7B0 /* InMemoryNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA52A0176DDC85E070F4BA3E088EDF79 /* InMemoryNormalizedCache.swift */; }; + DD139C21BC1B51C5078B8F9C2F55D0A3 /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7A99896DB5D793228657B5F5EC525DA /* FTS4.swift */; }; + E13D7AA4EFBA1345BDC2E05B4BD67F2A /* GraphQLError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74015506E81FA3C19EB6D906D81024AB /* GraphQLError.swift */; }; + E2D3B028353BC0FA74DA8536C717B9E4 /* GraphQLValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23BAD010DBCF8C2B764B7E2E9895805 /* GraphQLValues.swift */; }; + E3045780037989B31EDC92097561EDBF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; + EB775615489CE36C2D86C4EB279F3FF5 /* GraphQLResultMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5BED4FF18AC316194A81FD5C33ED9C5 /* GraphQLResultMapper.swift */; }; + EEA27311E6D18D94F27E12D2F0BE7BF0 /* GraphQLOutputType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A2AD2C9998545CA1776374D0EB8D35 /* GraphQLOutputType.swift */; }; + F0EF5885BD48A9B939F3FF9C1DC1A965 /* GraphQLResultAccumulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C326DB4844A6FBD86CFBA30BDD08DB6 /* GraphQLResultAccumulator.swift */; }; + F4DAAE8A4DF58A14A2B8A6272ED102C7 /* RecordSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB35A20B8A16FA8E837FAEA496B53CBE /* RecordSet.swift */; }; + F86D649610E4878DE71D25AA9CC614A2 /* JSONStandardTypeConversions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1F6997F619DB12A60F7EA5B8005190 /* JSONStandardTypeConversions.swift */; }; + FDA57D0DA6CBE5083CAF08A8B2F86AC9 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2C5D76BD109C46DEC526A712FC4A8BB /* Helpers.swift */; }; + FF53DDD16D8FC3431D3F148AC7FD56CD /* GraphQLResponseGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7156C5037F2DC118EFF48E601858205 /* GraphQLResponseGenerator.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 46F1F23422897FFFE9D31496B6CFD03F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 19C23DAC4474B6CD13A5110683532E69; + remoteInfo = SQLite.swift; + }; + 6EC485A2374F1AB1F5F33127C6257458 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = C566155694F9D7502B8E41EDDAE53326; + remoteInfo = Apollo; + }; + DA3A67213BA0213D69558FE47052F8CB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 19C23DAC4474B6CD13A5110683532E69; + remoteInfo = SQLite.swift; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 078C996EB71DC4EA36311067B6D81A3E /* Promise.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Promise.swift; sourceTree = ""; }; + 091A0558AC7BC81BA146427458F8F864 /* Pods-ApolloExample.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloExample.modulemap"; sourceTree = ""; }; + 0A875C28A4DE2F8521B9F5D7720A239C /* Pods-ApolloExampleTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExampleTests-resources.sh"; sourceTree = ""; }; + 0E070D9E44393CD520D0B1AF87A6736D /* SQLite-Bridging.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "SQLite-Bridging.m"; path = "Sources/SQLiteObjc/SQLite-Bridging.m"; sourceTree = ""; }; + 0F331ABE5223829EDFFC088184DFA981 /* RTree.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RTree.swift; path = Sources/SQLite/Extensions/RTree.swift; sourceTree = ""; }; + 180A54E2C9EAC29BCD0767F9CF54EB79 /* DataLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DataLoader.swift; sourceTree = ""; }; + 1A8AF61E57D939C975D9A6B03DF50CC7 /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCache.swift; sourceTree = ""; }; + 1D7DA9FB08FD2A913967F0D7996B8701 /* SQLite.swift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = SQLite.swift.modulemap; sourceTree = ""; }; + 1EC3C1E6C3B57B46326B94BAB568B649 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2060F7497CEA6FBBC300CEBB95DE7599 /* Pods-ApolloExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExample.debug.xcconfig"; sourceTree = ""; }; + 23E934E5F923C9742E63347D5512C322 /* AggregateFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AggregateFunctions.swift; path = Sources/SQLite/Typed/AggregateFunctions.swift; sourceTree = ""; }; + 269A666530B42952FF00B5B4A1844F67 /* Apollo.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Apollo.xcconfig; sourceTree = ""; }; + 27B2D491F0A9B062233011B873DC118C /* SQLite.swift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SQLite.swift-umbrella.h"; sourceTree = ""; }; + 2D30459F9DC30876AF6C299D26C7CE48 /* SQLite.swift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SQLite.swift-dummy.m"; sourceTree = ""; }; + 2FA62E20AC29F9ECA17CDE346F83E445 /* Dictionary+KeyPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Dictionary+KeyPath.swift"; sourceTree = ""; }; + 2FF924421EAF21716DEF0AE07417770D /* Apollo-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Apollo-prefix.pch"; sourceTree = ""; }; + 30DAD61D66BBDE6441131A52D95BDB04 /* JSONSerializationFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSONSerializationFormat.swift; sourceTree = ""; }; + 348491EAD9C18B0EEB2E855815254774 /* CustomFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomFunctions.swift; path = Sources/SQLite/Typed/CustomFunctions.swift; sourceTree = ""; }; + 35069E56A5D5D4923A18BA7A092E73D4 /* Utilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; + 37BFA28F22BF54064B21348557B64BD3 /* GraphQLOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLOperation.swift; sourceTree = ""; }; + 399B342ADA72E237E0EBF1EEAA28FB25 /* GraphQLDependencyTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLDependencyTracker.swift; sourceTree = ""; }; + 3B42D8D8A4E18179F37824F2695F75F3 /* ApolloClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ApolloClient.swift; sourceTree = ""; }; + 3BE1EC51FEAC565167D59985E9544068 /* Pods-ApolloExampleTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloExampleTests-acknowledgements.markdown"; sourceTree = ""; }; + 3C0324BDEF4908733765A4E8909A7F10 /* GraphQLQueryWatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLQueryWatcher.swift; sourceTree = ""; }; + 3CD44E8FA7A5011FCAABB4E3E2F3B153 /* Pods-ApolloExample-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExample-frameworks.sh"; sourceTree = ""; }; + 3E23FE1E344A74D7E542B4DE84D57DB7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 3FCCE88ECC9D892349AB6CB3160246D9 /* Query.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Query.swift; path = Sources/SQLite/Typed/Query.swift; sourceTree = ""; }; + 42BBD89CF65425C4A9DD8F6390DF859D /* NetworkTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NetworkTransport.swift; sourceTree = ""; }; + 44EE37E8BF436A90A9C40AD27A182DB2 /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/SQLite/Typed/Expression.swift; sourceTree = ""; }; + 4B4C8E0D8DB99B4482E2549FEAE620B8 /* FTS5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FTS5.swift; path = Sources/SQLite/Extensions/FTS5.swift; sourceTree = ""; }; + 4E1F6997F619DB12A60F7EA5B8005190 /* JSONStandardTypeConversions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSONStandardTypeConversions.swift; sourceTree = ""; }; + 5232E054E5318DB58C8DF2E3B7EC41CA /* Pods-ApolloExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExample.release.xcconfig"; sourceTree = ""; }; + 5AE2EFBEFDE20C4DDD8B3398D8AE5AE8 /* fts3_tokenizer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = fts3_tokenizer.h; path = Sources/SQLiteObjc/fts3_tokenizer.h; sourceTree = ""; }; + 60FAE93532FD5578A02AF3CC523A3408 /* CoreFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CoreFunctions.swift; path = Sources/SQLite/Typed/CoreFunctions.swift; sourceTree = ""; }; + 616AA09AE6625A279D08C4E95BBF8FAF /* Record.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Record.swift; sourceTree = ""; }; + 680617B7B3999D016982CD479DADCCB0 /* Blob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Blob.swift; path = Sources/SQLite/Core/Blob.swift; sourceTree = ""; }; + 6962E4B167BCDE8CACFF3DC269212EE7 /* ApolloStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ApolloStore.swift; sourceTree = ""; }; + 6AFFA1F0D3D36809E7A14DF579992319 /* Pods-ApolloExampleTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloExampleTests-acknowledgements.plist"; sourceTree = ""; }; + 6C326DB4844A6FBD86CFBA30BDD08DB6 /* GraphQLResultAccumulator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultAccumulator.swift; sourceTree = ""; }; + 6DDDE584F50E336C591DDDCBCF431A59 /* Pods-ApolloExampleTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExampleTests-frameworks.sh"; sourceTree = ""; }; + 74015506E81FA3C19EB6D906D81024AB /* GraphQLError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLError.swift; sourceTree = ""; }; + 76D40A77826E6FE48F27E93C4A66DD9C /* HTTPNetworkTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HTTPNetworkTransport.swift; sourceTree = ""; }; + 76D87FE3A16F88C13B02128F747599F9 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7A5D8EED2099F4E9AC37C5EC2D95A738 /* AsynchronousOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AsynchronousOperation.swift; sourceTree = ""; }; + 81EB8710A71482DC1F6F11F5914B1252 /* Pods-ApolloExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExampleTests.debug.xcconfig"; sourceTree = ""; }; + 82A2AD2C9998545CA1776374D0EB8D35 /* GraphQLOutputType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLOutputType.swift; sourceTree = ""; }; + 82D9DC92FC6CBDB7AF3A8D64A0E0BCE9 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SQLite.framework; path = SQLite.swift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 872EA0E9B1EC6684546BEFF234C61E6E /* check-and-run-apollo-codegen.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "check-and-run-apollo-codegen.sh"; sourceTree = ""; }; + 88BFCDC2C48A9AAC024D78C7786357F9 /* SQLite.swift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SQLite.swift.xcconfig; sourceTree = ""; }; + 8A46C98F58EE37835DC76FDAE429068F /* Pods_ApolloExampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloExampleTests.framework; path = "Pods-ApolloExampleTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 8D53B8E8BAF92A7BE16F4C79817D017B /* Apollo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Apollo.framework; path = Apollo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8F3DE78C37EE122AA21BA986A77BB162 /* Selections.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Selections.swift; sourceTree = ""; }; + 9090E10380883B7CA79EE41C691650F7 /* Locking.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Locking.swift; sourceTree = ""; }; + 909F358C8C8DF9392766416B86EACE63 /* GraphQLExecutor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLExecutor.swift; sourceTree = ""; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 94D650A756B69071D262EFC78E0E69F0 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 95684FC3AB25B49063D525A7C78F0B17 /* GraphQLResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResponse.swift; sourceTree = ""; }; + 96600A78FEC066BF8931D7A58FBF0F16 /* Statement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Statement.swift; path = Sources/SQLite/Core/Statement.swift; sourceTree = ""; }; + 9B43FC0646B9264E437BD567FCD00B22 /* Pods-ApolloExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExampleTests.release.xcconfig"; sourceTree = ""; }; + 9C9A4A60685118605481B9A7CD345813 /* Pods_ApolloExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloExample.framework; path = "Pods-ApolloExample.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 9DE06F129836BA95B0BE2222991D2BD0 /* Value.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Value.swift; path = Sources/SQLite/Core/Value.swift; sourceTree = ""; }; + A1945EC324B343B5D8026CC399CD8E6D /* Pods-ApolloExampleTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloExampleTests.modulemap"; sourceTree = ""; }; + A2C5D76BD109C46DEC526A712FC4A8BB /* Helpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Helpers.swift; path = Sources/SQLite/Helpers.swift; sourceTree = ""; }; + A7156C5037F2DC118EFF48E601858205 /* GraphQLResponseGenerator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResponseGenerator.swift; sourceTree = ""; }; + A72488E3CB82621BCD287255DE4F91E6 /* JSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSON.swift; sourceTree = ""; }; + A918C3B2E22CB999534D187039A4D52A /* Collections.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Collections.swift; sourceTree = ""; }; + AF7F8DDFC50FE6ACA57F6A16E253F8DC /* SQLite-Bridging.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "SQLite-Bridging.h"; path = "Sources/SQLiteObjc/include/SQLite-Bridging.h"; sourceTree = ""; }; + B23BAD010DBCF8C2B764B7E2E9895805 /* GraphQLValues.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLValues.swift; sourceTree = ""; }; + B41F236D0408A6C42DAAE76475846E1D /* Pods-ApolloExample-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExample-resources.sh"; sourceTree = ""; }; + B5BED4FF18AC316194A81FD5C33ED9C5 /* GraphQLResultMapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultMapper.swift; sourceTree = ""; }; + B5C756BCE1977B310FBCDFC81E7CB726 /* Apollo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Apollo-umbrella.h"; sourceTree = ""; }; + B7A99896DB5D793228657B5F5EC525DA /* FTS4.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FTS4.swift; path = Sources/SQLite/Extensions/FTS4.swift; sourceTree = ""; }; + B88C5FD0C85A5AE4583CC7DB512E6820 /* SQLite.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SQLite.h; path = Sources/SQLite/SQLite.h; sourceTree = ""; }; + B9A381366F19009489326838310B31FD /* Pods-ApolloExampleTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloExampleTests-umbrella.h"; sourceTree = ""; }; + BA52A0176DDC85E070F4BA3E088EDF79 /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; + BB17F37738DF3903DEB18A03BAA3C0D8 /* GraphQLResult.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResult.swift; sourceTree = ""; }; + BDA86AD441076D928D0621530CD5E745 /* Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operators.swift; path = Sources/SQLite/Typed/Operators.swift; sourceTree = ""; }; + BF17E380BFA697F14018DED6126C8AC8 /* GraphQLResultNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultNormalizer.swift; sourceTree = ""; }; + C3BEBD4B9A599D0ADDE174D8FF81C446 /* Pods-ApolloExample-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloExample-umbrella.h"; sourceTree = ""; }; + CA3ED8D54211455DE25A4DA036694445 /* SQLite.swift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SQLite.swift-prefix.pch"; sourceTree = ""; }; + CB35A20B8A16FA8E837FAEA496B53CBE /* RecordSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RecordSet.swift; sourceTree = ""; }; + CCF813C6D3C0824E1BCFDACADE6109F5 /* Connection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Connection.swift; path = Sources/SQLite/Core/Connection.swift; sourceTree = ""; }; + CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + D7B7855DE178D22988512E88C68325BE /* Collation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Collation.swift; path = Sources/SQLite/Typed/Collation.swift; sourceTree = ""; }; + DA7CCC1A073BC5540EA969CA71F0C552 /* Setter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Setter.swift; path = Sources/SQLite/Typed/Setter.swift; sourceTree = ""; }; + DB44F0C85553660857F351B59660E399 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DD70A928B7AE7F19B4E85EE9D82F7339 /* Pods-ApolloExample-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloExample-acknowledgements.plist"; sourceTree = ""; }; + DDF9C6BE6400F34A67F4B72664ECFFEB /* Pods-ApolloExample-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloExample-acknowledgements.markdown"; sourceTree = ""; }; + E3D732CCE212D0876E0126673CDB0726 /* Pods-ApolloExampleTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloExampleTests-dummy.m"; sourceTree = ""; }; + E5BB833C4CF9D696FCF839FB705C1A91 /* Apollo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Apollo-dummy.m"; sourceTree = ""; }; + E667D63233F61B551F3B93AF184020E0 /* Foundation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Foundation.swift; path = Sources/SQLite/Foundation.swift; sourceTree = ""; }; + E993F928AC8B4275D32665A6205AE456 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; }; + EBE5D90E73ED2BB52CF8CF07A8705807 /* Pods-ApolloExample-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloExample-dummy.m"; sourceTree = ""; }; + ED6DD22A402D834518D62E49A6D34114 /* NormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NormalizedCache.swift; sourceTree = ""; }; + F7AB6C9064A19E5E00C2C7B6CF7D38DD /* Apollo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Apollo.modulemap; sourceTree = ""; }; + FF98B7BBADF63A0AF80D7829FA6F77B9 /* Schema.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Schema.swift; path = Sources/SQLite/Typed/Schema.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 16F8FA5DAB94B72D46B2E2622F13F213 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E3045780037989B31EDC92097561EDBF /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 30AE83E2B9378413D12911D07B9342A1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3401D945C9C21F03B6E5100F26DF231C /* Foundation.framework in Frameworks */, + B6F6F22A0B59D1A386C7AC19789B74C0 /* SQLite.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A669049662D8B3E8CE1621BA70630893 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A60D999F6C5C2A7030430FBB2644A85D /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B7388B46AC95BDC5641A0B22BB0EE1C7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 5C154FC66B0272E926E740EB0D5DDF3E /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0CE5F9160B067C829D364E72878D0583 /* Support Files */ = { + isa = PBXGroup; + children = ( + 1EC3C1E6C3B57B46326B94BAB568B649 /* Info.plist */, + 1D7DA9FB08FD2A913967F0D7996B8701 /* SQLite.swift.modulemap */, + 88BFCDC2C48A9AAC024D78C7786357F9 /* SQLite.swift.xcconfig */, + 2D30459F9DC30876AF6C299D26C7CE48 /* SQLite.swift-dummy.m */, + CA3ED8D54211455DE25A4DA036694445 /* SQLite.swift-prefix.pch */, + 27B2D491F0A9B062233011B873DC118C /* SQLite.swift-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/SQLite.swift"; + sourceTree = ""; + }; + 0E9CC0217CE03B66912982F024F7C64D /* Frameworks */ = { + isa = PBXGroup; + children = ( + DB44F0C85553660857F351B59660E399 /* SQLite.framework */, + 5465A1FD5BAF28162C40A82C117432A0 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 1801812D8CCA5E614AF5B2E5A40FD00E /* Resources */ = { + isa = PBXGroup; + children = ( + 56260A0EEDA671CDB9D2E9F617A8E776 /* scripts */, + ); + name = Resources; + sourceTree = ""; + }; + 42A565AFFAD6D5669C3E9A617B18206F /* Pods */ = { + isa = PBXGroup; + children = ( + 6BF538A5818A9423DCAFBA3FE993650B /* SQLite.swift */, + ); + name = Pods; + sourceTree = ""; + }; + 434A8BD03DCA864AB67B6A3F5813F09B /* Products */ = { + isa = PBXGroup; + children = ( + 8D53B8E8BAF92A7BE16F4C79817D017B /* Apollo.framework */, + 9C9A4A60685118605481B9A7CD345813 /* Pods_ApolloExample.framework */, + 8A46C98F58EE37835DC76FDAE429068F /* Pods_ApolloExampleTests.framework */, + 82D9DC92FC6CBDB7AF3A8D64A0E0BCE9 /* SQLite.framework */, + ); + name = Products; + sourceTree = ""; + }; + 5465A1FD5BAF28162C40A82C117432A0 /* iOS */ = { + isa = PBXGroup; + children = ( + CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 56260A0EEDA671CDB9D2E9F617A8E776 /* scripts */ = { + isa = PBXGroup; + children = ( + 872EA0E9B1EC6684546BEFF234C61E6E /* check-and-run-apollo-codegen.sh */, + ); + name = scripts; + path = scripts; + sourceTree = ""; + }; + 669D356482AEF992CB35775348080989 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 82394BC43DADA5FD102F210BEE2D3706 /* Pods-ApolloExample */, + 7FEB87F687FCE3866596B61F36A71735 /* Pods-ApolloExampleTests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 6BF538A5818A9423DCAFBA3FE993650B /* SQLite.swift */ = { + isa = PBXGroup; + children = ( + 6E4CDA0705C72EBBEAC4EAD992E1850C /* standard */, + 0CE5F9160B067C829D364E72878D0583 /* Support Files */, + ); + name = SQLite.swift; + path = SQLite.swift; + sourceTree = ""; + }; + 6E4CDA0705C72EBBEAC4EAD992E1850C /* standard */ = { + isa = PBXGroup; + children = ( + 23E934E5F923C9742E63347D5512C322 /* AggregateFunctions.swift */, + 680617B7B3999D016982CD479DADCCB0 /* Blob.swift */, + D7B7855DE178D22988512E88C68325BE /* Collation.swift */, + CCF813C6D3C0824E1BCFDACADE6109F5 /* Connection.swift */, + 60FAE93532FD5578A02AF3CC523A3408 /* CoreFunctions.swift */, + 348491EAD9C18B0EEB2E855815254774 /* CustomFunctions.swift */, + 44EE37E8BF436A90A9C40AD27A182DB2 /* Expression.swift */, + E667D63233F61B551F3B93AF184020E0 /* Foundation.swift */, + 5AE2EFBEFDE20C4DDD8B3398D8AE5AE8 /* fts3_tokenizer.h */, + B7A99896DB5D793228657B5F5EC525DA /* FTS4.swift */, + 4B4C8E0D8DB99B4482E2549FEAE620B8 /* FTS5.swift */, + A2C5D76BD109C46DEC526A712FC4A8BB /* Helpers.swift */, + BDA86AD441076D928D0621530CD5E745 /* Operators.swift */, + 3FCCE88ECC9D892349AB6CB3160246D9 /* Query.swift */, + 0F331ABE5223829EDFFC088184DFA981 /* RTree.swift */, + FF98B7BBADF63A0AF80D7829FA6F77B9 /* Schema.swift */, + DA7CCC1A073BC5540EA969CA71F0C552 /* Setter.swift */, + B88C5FD0C85A5AE4583CC7DB512E6820 /* SQLite.h */, + AF7F8DDFC50FE6ACA57F6A16E253F8DC /* SQLite-Bridging.h */, + 0E070D9E44393CD520D0B1AF87A6736D /* SQLite-Bridging.m */, + 96600A78FEC066BF8931D7A58FBF0F16 /* Statement.swift */, + 9DE06F129836BA95B0BE2222991D2BD0 /* Value.swift */, + ); + name = standard; + sourceTree = ""; + }; + 768337ED42456230A0A77624D4991E13 /* Development Pods */ = { + isa = PBXGroup; + children = ( + 8389C6E68002254991191670D7F6BF1D /* Apollo */, + ); + name = "Development Pods"; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, + 768337ED42456230A0A77624D4991E13 /* Development Pods */, + 0E9CC0217CE03B66912982F024F7C64D /* Frameworks */, + 42A565AFFAD6D5669C3E9A617B18206F /* Pods */, + 434A8BD03DCA864AB67B6A3F5813F09B /* Products */, + 669D356482AEF992CB35775348080989 /* Targets Support Files */, + ); + sourceTree = ""; + }; + 7FEB87F687FCE3866596B61F36A71735 /* Pods-ApolloExampleTests */ = { + isa = PBXGroup; + children = ( + 3E23FE1E344A74D7E542B4DE84D57DB7 /* Info.plist */, + A1945EC324B343B5D8026CC399CD8E6D /* Pods-ApolloExampleTests.modulemap */, + 3BE1EC51FEAC565167D59985E9544068 /* Pods-ApolloExampleTests-acknowledgements.markdown */, + 6AFFA1F0D3D36809E7A14DF579992319 /* Pods-ApolloExampleTests-acknowledgements.plist */, + E3D732CCE212D0876E0126673CDB0726 /* Pods-ApolloExampleTests-dummy.m */, + 6DDDE584F50E336C591DDDCBCF431A59 /* Pods-ApolloExampleTests-frameworks.sh */, + 0A875C28A4DE2F8521B9F5D7720A239C /* Pods-ApolloExampleTests-resources.sh */, + B9A381366F19009489326838310B31FD /* Pods-ApolloExampleTests-umbrella.h */, + 81EB8710A71482DC1F6F11F5914B1252 /* Pods-ApolloExampleTests.debug.xcconfig */, + 9B43FC0646B9264E437BD567FCD00B22 /* Pods-ApolloExampleTests.release.xcconfig */, + ); + name = "Pods-ApolloExampleTests"; + path = "Target Support Files/Pods-ApolloExampleTests"; + sourceTree = ""; + }; + 82017056B1CC49B3DC02060971D2C82D /* Support Files */ = { + isa = PBXGroup; + children = ( + F7AB6C9064A19E5E00C2C7B6CF7D38DD /* Apollo.modulemap */, + 269A666530B42952FF00B5B4A1844F67 /* Apollo.xcconfig */, + E5BB833C4CF9D696FCF839FB705C1A91 /* Apollo-dummy.m */, + 2FF924421EAF21716DEF0AE07417770D /* Apollo-prefix.pch */, + B5C756BCE1977B310FBCDFC81E7CB726 /* Apollo-umbrella.h */, + 94D650A756B69071D262EFC78E0E69F0 /* Info.plist */, + ); + name = "Support Files"; + path = "Example/Pods/Target Support Files/Apollo"; + sourceTree = ""; + }; + 82394BC43DADA5FD102F210BEE2D3706 /* Pods-ApolloExample */ = { + isa = PBXGroup; + children = ( + 76D87FE3A16F88C13B02128F747599F9 /* Info.plist */, + 091A0558AC7BC81BA146427458F8F864 /* Pods-ApolloExample.modulemap */, + DDF9C6BE6400F34A67F4B72664ECFFEB /* Pods-ApolloExample-acknowledgements.markdown */, + DD70A928B7AE7F19B4E85EE9D82F7339 /* Pods-ApolloExample-acknowledgements.plist */, + EBE5D90E73ED2BB52CF8CF07A8705807 /* Pods-ApolloExample-dummy.m */, + 3CD44E8FA7A5011FCAABB4E3E2F3B153 /* Pods-ApolloExample-frameworks.sh */, + B41F236D0408A6C42DAAE76475846E1D /* Pods-ApolloExample-resources.sh */, + C3BEBD4B9A599D0ADDE174D8FF81C446 /* Pods-ApolloExample-umbrella.h */, + 2060F7497CEA6FBBC300CEBB95DE7599 /* Pods-ApolloExample.debug.xcconfig */, + 5232E054E5318DB58C8DF2E3B7EC41CA /* Pods-ApolloExample.release.xcconfig */, + ); + name = "Pods-ApolloExample"; + path = "Target Support Files/Pods-ApolloExample"; + sourceTree = ""; + }; + 8389C6E68002254991191670D7F6BF1D /* Apollo */ = { + isa = PBXGroup; + children = ( + 1801812D8CCA5E614AF5B2E5A40FD00E /* Resources */, + B28E56D49879D9E081C62CD89EE29101 /* Sources */, + 82017056B1CC49B3DC02060971D2C82D /* Support Files */, + ); + name = Apollo; + path = ../..; + sourceTree = ""; + }; + B28E56D49879D9E081C62CD89EE29101 /* Sources */ = { + isa = PBXGroup; + children = ( + 3B42D8D8A4E18179F37824F2695F75F3 /* ApolloClient.swift */, + 6962E4B167BCDE8CACFF3DC269212EE7 /* ApolloStore.swift */, + 7A5D8EED2099F4E9AC37C5EC2D95A738 /* AsynchronousOperation.swift */, + A918C3B2E22CB999534D187039A4D52A /* Collections.swift */, + 180A54E2C9EAC29BCD0767F9CF54EB79 /* DataLoader.swift */, + 2FA62E20AC29F9ECA17CDE346F83E445 /* Dictionary+KeyPath.swift */, + 399B342ADA72E237E0EBF1EEAA28FB25 /* GraphQLDependencyTracker.swift */, + 74015506E81FA3C19EB6D906D81024AB /* GraphQLError.swift */, + 909F358C8C8DF9392766416B86EACE63 /* GraphQLExecutor.swift */, + 37BFA28F22BF54064B21348557B64BD3 /* GraphQLOperation.swift */, + 82A2AD2C9998545CA1776374D0EB8D35 /* GraphQLOutputType.swift */, + 3C0324BDEF4908733765A4E8909A7F10 /* GraphQLQueryWatcher.swift */, + 95684FC3AB25B49063D525A7C78F0B17 /* GraphQLResponse.swift */, + A7156C5037F2DC118EFF48E601858205 /* GraphQLResponseGenerator.swift */, + BB17F37738DF3903DEB18A03BAA3C0D8 /* GraphQLResult.swift */, + 6C326DB4844A6FBD86CFBA30BDD08DB6 /* GraphQLResultAccumulator.swift */, + B5BED4FF18AC316194A81FD5C33ED9C5 /* GraphQLResultMapper.swift */, + BF17E380BFA697F14018DED6126C8AC8 /* GraphQLResultNormalizer.swift */, + B23BAD010DBCF8C2B764B7E2E9895805 /* GraphQLValues.swift */, + 76D40A77826E6FE48F27E93C4A66DD9C /* HTTPNetworkTransport.swift */, + BA52A0176DDC85E070F4BA3E088EDF79 /* InMemoryNormalizedCache.swift */, + A72488E3CB82621BCD287255DE4F91E6 /* JSON.swift */, + 30DAD61D66BBDE6441131A52D95BDB04 /* JSONSerializationFormat.swift */, + 4E1F6997F619DB12A60F7EA5B8005190 /* JSONStandardTypeConversions.swift */, + 9090E10380883B7CA79EE41C691650F7 /* Locking.swift */, + 42BBD89CF65425C4A9DD8F6390DF859D /* NetworkTransport.swift */, + ED6DD22A402D834518D62E49A6D34114 /* NormalizedCache.swift */, + 078C996EB71DC4EA36311067B6D81A3E /* Promise.swift */, + 616AA09AE6625A279D08C4E95BBF8FAF /* Record.swift */, + CB35A20B8A16FA8E837FAEA496B53CBE /* RecordSet.swift */, + E993F928AC8B4275D32665A6205AE456 /* Result.swift */, + 8F3DE78C37EE122AA21BA986A77BB162 /* Selections.swift */, + 1A8AF61E57D939C975D9A6B03DF50CC7 /* SqliteNormalizedCache.swift */, + 35069E56A5D5D4923A18BA7A092E73D4 /* Utilities.swift */, + ); + name = Sources; + path = Sources; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 0D0C7349578F8E35532A3A5D62C0EA97 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 2F8B5597F178C1FBFC35700AB8BC15C6 /* Pods-ApolloExampleTests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 909E810000654ADA0062A65395285656 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 1569991C9A095D1FCE6B235BD63B51A4 /* Apollo-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 915305A38C0D55178154A57AB4E7C52B /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 415B7E98D356AE4B47C6FD5D11E11C99 /* Pods-ApolloExample-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 99E8B3044AF71F8F23378FF7CDA8433F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 11D8F132B7F8704E64825695F6B0DC91 /* fts3_tokenizer.h in Headers */, + AFC4EF684AAE208082F88A746E8799D5 /* SQLite-Bridging.h in Headers */, + 63D650CA310911FBCB77C3E6229330A7 /* SQLite.h in Headers */, + 49876A987CA44C386457D31880AE1BD6 /* SQLite.swift-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */ = { + isa = PBXNativeTarget; + buildConfigurationList = 378B6EF64B2163CD9697BCEB0CE2A4B8 /* Build configuration list for PBXNativeTarget "SQLite.swift" */; + buildPhases = ( + EBD29A96FAFC82C68899AA23CCF587C9 /* Sources */, + A669049662D8B3E8CE1621BA70630893 /* Frameworks */, + 99E8B3044AF71F8F23378FF7CDA8433F /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SQLite.swift; + productName = SQLite.swift; + productReference = 82D9DC92FC6CBDB7AF3A8D64A0E0BCE9 /* SQLite.framework */; + productType = "com.apple.product-type.framework"; + }; + 60F810EAF064E153B2FC553CD7779BAA /* Pods-ApolloExampleTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 979CAF895B62E915B68EE92B9BE6517D /* Build configuration list for PBXNativeTarget "Pods-ApolloExampleTests" */; + buildPhases = ( + 9F4FFEB213C308A8E1092334616A2C4E /* Sources */, + 16F8FA5DAB94B72D46B2E2622F13F213 /* Frameworks */, + 0D0C7349578F8E35532A3A5D62C0EA97 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Pods-ApolloExampleTests"; + productName = "Pods-ApolloExampleTests"; + productReference = 8A46C98F58EE37835DC76FDAE429068F /* Pods_ApolloExampleTests.framework */; + productType = "com.apple.product-type.framework"; + }; + C566155694F9D7502B8E41EDDAE53326 /* Apollo */ = { + isa = PBXNativeTarget; + buildConfigurationList = AD027D256E067255F75669BD2CA381EA /* Build configuration list for PBXNativeTarget "Apollo" */; + buildPhases = ( + B7A20D035D753A416B0A9530DF3004A8 /* Sources */, + 30AE83E2B9378413D12911D07B9342A1 /* Frameworks */, + 1F1AA2CC5E749120C23FC4B83C026F2A /* Resources */, + 909E810000654ADA0062A65395285656 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 02B28FE1724BC6B743D6E5ECF3BF4774 /* PBXTargetDependency */, + ); + name = Apollo; + productName = Apollo; + productReference = 8D53B8E8BAF92A7BE16F4C79817D017B /* Apollo.framework */; + productType = "com.apple.product-type.framework"; + }; + CD971B48011CD3BD0356983083C8F0E0 /* Pods-ApolloExample */ = { + isa = PBXNativeTarget; + buildConfigurationList = C79EB8FDA380D31052FF2C49D1D80CD7 /* Build configuration list for PBXNativeTarget "Pods-ApolloExample" */; + buildPhases = ( + 6A929C77623DF34AFD30596C385E5395 /* Sources */, + B7388B46AC95BDC5641A0B22BB0EE1C7 /* Frameworks */, + 915305A38C0D55178154A57AB4E7C52B /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + EEEAD09294FC095B553735B1B97F0644 /* PBXTargetDependency */, + 7E8FAC92559ED7BB7F0BAD12225E305B /* PBXTargetDependency */, + ); + name = "Pods-ApolloExample"; + productName = "Pods-ApolloExample"; + productReference = 9C9A4A60685118605481B9A7CD345813 /* Pods_ApolloExample.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0730; + LastUpgradeCheck = 0700; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = 434A8BD03DCA864AB67B6A3F5813F09B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + C566155694F9D7502B8E41EDDAE53326 /* Apollo */, + CD971B48011CD3BD0356983083C8F0E0 /* Pods-ApolloExample */, + 60F810EAF064E153B2FC553CD7779BAA /* Pods-ApolloExampleTests */, + 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 1F1AA2CC5E749120C23FC4B83C026F2A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6FCDA3222BB1A7CADC500C19CA4A6611 /* check-and-run-apollo-codegen.sh in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 6A929C77623DF34AFD30596C385E5395 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 636C2473106673D1432A22A0B7D6A2C9 /* Pods-ApolloExample-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9F4FFEB213C308A8E1092334616A2C4E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 47BDB97605B55D76D846461E4AFCF7E7 /* Pods-ApolloExampleTests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B7A20D035D753A416B0A9530DF3004A8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D99283BAF5F146D362611679A5ED1A5D /* Apollo-dummy.m in Sources */, + 54CFD21E9012A2554410D08EF63E42CB /* ApolloClient.swift in Sources */, + AC87CC13FC22BD408AA235121C216C85 /* ApolloStore.swift in Sources */, + 2C64BE3142AB8955A8F1B7ED8C4AC1FD /* AsynchronousOperation.swift in Sources */, + 2664C21FA05281B3AEC72F71EA44028A /* Collections.swift in Sources */, + A54DF0B95FE0DAD23D2A81D408683D03 /* DataLoader.swift in Sources */, + 7FF4749CC9A33C7B79FE51E0962A4E8A /* Dictionary+KeyPath.swift in Sources */, + BA32663AD51B09E7997DD5871D7FE383 /* GraphQLDependencyTracker.swift in Sources */, + E13D7AA4EFBA1345BDC2E05B4BD67F2A /* GraphQLError.swift in Sources */, + 8916D47EB3F95315F2020922A6130D8D /* GraphQLExecutor.swift in Sources */, + B948E00EC8119CFD8B9E55DBBDA5A4E3 /* GraphQLOperation.swift in Sources */, + EEA27311E6D18D94F27E12D2F0BE7BF0 /* GraphQLOutputType.swift in Sources */, + 8D2A9E5942209EC7EAE309C3BDEC344E /* GraphQLQueryWatcher.swift in Sources */, + 24401D6F94D534811685D1F542F93892 /* GraphQLResponse.swift in Sources */, + FF53DDD16D8FC3431D3F148AC7FD56CD /* GraphQLResponseGenerator.swift in Sources */, + 6C5A957F0E47791FFA662827ADBA67A9 /* GraphQLResult.swift in Sources */, + F0EF5885BD48A9B939F3FF9C1DC1A965 /* GraphQLResultAccumulator.swift in Sources */, + EB775615489CE36C2D86C4EB279F3FF5 /* GraphQLResultMapper.swift in Sources */, + 3EEC07CDEFE2204C5CFC1E1B10B6537F /* GraphQLResultNormalizer.swift in Sources */, + E2D3B028353BC0FA74DA8536C717B9E4 /* GraphQLValues.swift in Sources */, + 787BB17CD95328B14A766F6BC04D2148 /* HTTPNetworkTransport.swift in Sources */, + DA0CEB1E0989DCA89796ABDF7267A7B0 /* InMemoryNormalizedCache.swift in Sources */, + B8354678757BF7E72C8E638F8FD096ED /* JSON.swift in Sources */, + 3D85E3F5AB73653A962BCF09ED74A8C0 /* JSONSerializationFormat.swift in Sources */, + F86D649610E4878DE71D25AA9CC614A2 /* JSONStandardTypeConversions.swift in Sources */, + 47B4F5C1BFB40746F552A6D5CE482DC3 /* Locking.swift in Sources */, + 4DCCD02DB715AC161B0774E0C137353E /* NetworkTransport.swift in Sources */, + 853B5034825B85498FE7857957760849 /* NormalizedCache.swift in Sources */, + 77E05C7059DFD498C2B323C3A707C0E8 /* Promise.swift in Sources */, + 20C306F7AA685281AAEADDEF70FE27B4 /* Record.swift in Sources */, + F4DAAE8A4DF58A14A2B8A6272ED102C7 /* RecordSet.swift in Sources */, + 6CC6B8EEDAA285718533CC1482D13B61 /* Result.swift in Sources */, + 6F378D7233AC3E51B00DB180BF8D6066 /* Selections.swift in Sources */, + 01CD0AAF59D458AC3EF2601332DC362C /* SqliteNormalizedCache.swift in Sources */, + 2650B6BD41F1BDFF5A15F9C4C8E61A37 /* Utilities.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EBD29A96FAFC82C68899AA23CCF587C9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 35E5EEDB90225D140DCA57800CD5A2CD /* AggregateFunctions.swift in Sources */, + C02AE58DC3E78ACB817163011C7A6734 /* Blob.swift in Sources */, + A11B9C4B8DC4AF252BA2727D21A1EEF1 /* Collation.swift in Sources */, + D850BB2A3E7B9A6AAEB54FA9A8B7AD4F /* Connection.swift in Sources */, + 15E73F1CED9B85C8E03C6134581D2ED0 /* CoreFunctions.swift in Sources */, + 42F81544370E1853391B67D56656A0C3 /* CustomFunctions.swift in Sources */, + 30382E91D15E7ED4E930564DE86EAF27 /* Expression.swift in Sources */, + A3FF4B5B363E91C3BE7FC3294C555032 /* Foundation.swift in Sources */, + DD139C21BC1B51C5078B8F9C2F55D0A3 /* FTS4.swift in Sources */, + 3EB8845BB3EB8B7E031BCA86CEC2F0D2 /* FTS5.swift in Sources */, + FDA57D0DA6CBE5083CAF08A8B2F86AC9 /* Helpers.swift in Sources */, + AB1840F1E49F6C17A8A12662445629C3 /* Operators.swift in Sources */, + 4FFB64EBCE34E07A60C74F1957B34A7B /* Query.swift in Sources */, + 4A23CC3D6A3579C9F12AE00384A7A4F3 /* RTree.swift in Sources */, + 108A1CBD5D0C9FC34DD2B5C2B8DD0E1F /* Schema.swift in Sources */, + 6263A24701DED2E7A447C0313C7C555D /* Setter.swift in Sources */, + 47628EC1F1DDCC60DF83EA01A277919E /* SQLite-Bridging.m in Sources */, + B27809FB8835D7719B0AD7337D908431 /* SQLite.swift-dummy.m in Sources */, + 94ECE937BFDFCDBD700A107B1DC40CA9 /* Statement.swift in Sources */, + 87109E7659BAF278C52455C1D6529DF6 /* Value.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 02B28FE1724BC6B743D6E5ECF3BF4774 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SQLite.swift; + target = 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */; + targetProxy = DA3A67213BA0213D69558FE47052F8CB /* PBXContainerItemProxy */; + }; + 7E8FAC92559ED7BB7F0BAD12225E305B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SQLite.swift; + target = 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */; + targetProxy = 46F1F23422897FFFE9D31496B6CFD03F /* PBXContainerItemProxy */; + }; + EEEAD09294FC095B553735B1B97F0644 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Apollo; + target = C566155694F9D7502B8E41EDDAE53326 /* Apollo */; + targetProxy = 6EC485A2374F1AB1F5F33127C6257458 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 015A368F878AC3E2CEAE21DDE8026304 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 27E7E6A7297EC998C4737A039EC23FF3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 88BFCDC2C48A9AAC024D78C7786357F9 /* SQLite.swift.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/SQLite.swift/SQLite.swift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SQLite.swift/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/SQLite.swift/SQLite.swift.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = SQLite; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 354CE588A6FCB21619EAF033C1DC3E01 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 81EB8710A71482DC1F6F11F5914B1252 /* Pods-ApolloExampleTests.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-ApolloExampleTests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_ApolloExampleTests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 44CDBB6D11DE06DB64D6268622BDC47E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 71A4E2F2604F856EAC9B9985B601B947 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2060F7497CEA6FBBC300CEBB95DE7599 /* Pods-ApolloExample.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-ApolloExample/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ApolloExample/Pods-ApolloExample.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_ApolloExample; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 7335027149CBC3B39EA4F93477DB2441 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5232E054E5318DB58C8DF2E3B7EC41CA /* Pods-ApolloExample.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-ApolloExample/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ApolloExample/Pods-ApolloExample.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_ApolloExample; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + B811BEA39F0C86CFD347C457E918CBA6 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9B43FC0646B9264E437BD567FCD00B22 /* Pods-ApolloExampleTests.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-ApolloExampleTests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_ApolloExampleTests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + BF59425203BD23DBB85AF465D9BB20B7 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 269A666530B42952FF00B5B4A1844F67 /* Apollo.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/Apollo/Apollo-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Apollo/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Apollo/Apollo.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = Apollo; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + D72042F45DC3C77B677875802D08ECDF /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 269A666530B42952FF00B5B4A1844F67 /* Apollo.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/Apollo/Apollo-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Apollo/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Apollo/Apollo.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = Apollo; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + DDA3B0206874483E8FCDB2CBC4593700 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 88BFCDC2C48A9AAC024D78C7786357F9 /* SQLite.swift.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/SQLite.swift/SQLite.swift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SQLite.swift/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/SQLite.swift/SQLite.swift.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = SQLite; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 015A368F878AC3E2CEAE21DDE8026304 /* Debug */, + 44CDBB6D11DE06DB64D6268622BDC47E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 378B6EF64B2163CD9697BCEB0CE2A4B8 /* Build configuration list for PBXNativeTarget "SQLite.swift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DDA3B0206874483E8FCDB2CBC4593700 /* Debug */, + 27E7E6A7297EC998C4737A039EC23FF3 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 979CAF895B62E915B68EE92B9BE6517D /* Build configuration list for PBXNativeTarget "Pods-ApolloExampleTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 354CE588A6FCB21619EAF033C1DC3E01 /* Debug */, + B811BEA39F0C86CFD347C457E918CBA6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + AD027D256E067255F75669BD2CA381EA /* Build configuration list for PBXNativeTarget "Apollo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BF59425203BD23DBB85AF465D9BB20B7 /* Debug */, + D72042F45DC3C77B677875802D08ECDF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C79EB8FDA380D31052FF2C49D1D80CD7 /* Build configuration list for PBXNativeTarget "Pods-ApolloExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 71A4E2F2604F856EAC9B9985B601B947 /* Debug */, + 7335027149CBC3B39EA4F93477DB2441 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/Example/Pods/SQLite.swift/CocoaPods/appletvos/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/appletvos/module.modulemap new file mode 100644 index 0000000000..637d993582 --- /dev/null +++ b/Example/Pods/SQLite.swift/CocoaPods/appletvos/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Example/Pods/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap new file mode 100644 index 0000000000..f8b9b671a7 --- /dev/null +++ b/Example/Pods/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Example/Pods/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap new file mode 100644 index 0000000000..67a6c20309 --- /dev/null +++ b/Example/Pods/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Example/Pods/SQLite.swift/CocoaPods/iphoneos/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/iphoneos/module.modulemap new file mode 100644 index 0000000000..043db6c484 --- /dev/null +++ b/Example/Pods/SQLite.swift/CocoaPods/iphoneos/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Example/Pods/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap new file mode 100644 index 0000000000..c8b84ab8f4 --- /dev/null +++ b/Example/Pods/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.0.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Example/Pods/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap new file mode 100644 index 0000000000..a7b14cbb48 --- /dev/null +++ b/Example/Pods/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Example/Pods/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap new file mode 100644 index 0000000000..9e0912979d --- /dev/null +++ b/Example/Pods/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Example/Pods/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap new file mode 100644 index 0000000000..8fc958e676 --- /dev/null +++ b/Example/Pods/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Example/Pods/SQLite.swift/CocoaPods/macosx/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/macosx/module.modulemap new file mode 100644 index 0000000000..cc8370ec56 --- /dev/null +++ b/Example/Pods/SQLite.swift/CocoaPods/macosx/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Example/Pods/SQLite.swift/CocoaPods/watchos/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/watchos/module.modulemap new file mode 100644 index 0000000000..62a6c4eef0 --- /dev/null +++ b/Example/Pods/SQLite.swift/CocoaPods/watchos/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Example/Pods/SQLite.swift/CocoaPods/watchsimulator/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/watchsimulator/module.modulemap new file mode 100644 index 0000000000..086fbab2de --- /dev/null +++ b/Example/Pods/SQLite.swift/CocoaPods/watchsimulator/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Example/Pods/SQLite.swift/LICENSE.txt b/Example/Pods/SQLite.swift/LICENSE.txt new file mode 100644 index 0000000000..13303c1135 --- /dev/null +++ b/Example/Pods/SQLite.swift/LICENSE.txt @@ -0,0 +1,21 @@ +(The MIT License) + +Copyright (c) 2014-2015 Stephen Celis () + +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. diff --git a/Example/Pods/SQLite.swift/README.md b/Example/Pods/SQLite.swift/README.md new file mode 100644 index 0000000000..89917b36b3 --- /dev/null +++ b/Example/Pods/SQLite.swift/README.md @@ -0,0 +1,263 @@ +# SQLite.swift + +[![Build Status][Badge]][Travis] [![CocoaPods Version](https://cocoapod-badges.herokuapp.com/v/SQLite.swift/badge.png)](http://cocoadocs.org/docsets/SQLite.swift) [![Swift](https://img.shields.io/badge/swift-3-orange.svg?style=flat)](https://developer.apple.com/swift/) [![Platform](https://cocoapod-badges.herokuapp.com/p/SQLite.swift/badge.png)](http://cocoadocs.org/docsets/SQLite.swift) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Join the chat at https://gitter.im/stephencelis/SQLite.swift](https://badges.gitter.im/stephencelis/SQLite.swift.svg)](https://gitter.im/stephencelis/SQLite.swift) + +A type-safe, [Swift][]-language layer over [SQLite3][]. + +[SQLite.swift][] provides compile-time confidence in SQL statement +syntax _and_ intent. + +[Badge]: https://img.shields.io/travis/stephencelis/SQLite.swift/master.svg?style=flat +[Travis]: https://travis-ci.org/stephencelis/SQLite.swift +[Swift]: https://developer.apple.com/swift/ +[SQLite3]: http://www.sqlite.org +[SQLite.swift]: https://github.com/stephencelis/SQLite.swift + + +## Features + + - A pure-Swift interface + - A type-safe, optional-aware SQL expression builder + - A flexible, chainable, lazy-executing query layer + - Automatically-typed data access + - A lightweight, uncomplicated query and parameter binding interface + - Developer-friendly error handling and debugging + - [Full-text search][] support + - [Well-documented][See Documentation] + - Extensively tested + - SQLCipher support via CocoaPods + - Active support at [StackOverflow](http://stackoverflow.com/questions/tagged/sqlite.swift), and [Gitter Chat Room](https://gitter.im/stephencelis/SQLite.swift) (_experimental_) + +[Full-text search]: Documentation/Index.md#full-text-search +[See Documentation]: Documentation/Index.md#sqliteswift-documentation + + +## Usage + +``` swift +import SQLite + +let db = try Connection("path/to/db.sqlite3") + +let users = Table("users") +let id = Expression("id") +let name = Expression("name") +let email = Expression("email") + +try db.run(users.create { t in + t.column(id, primaryKey: true) + t.column(name) + t.column(email, unique: true) +}) +// CREATE TABLE "users" ( +// "id" INTEGER PRIMARY KEY NOT NULL, +// "name" TEXT, +// "email" TEXT NOT NULL UNIQUE +// ) + +let insert = users.insert(name <- "Alice", email <- "alice@mac.com") +let rowid = try db.run(insert) +// INSERT INTO "users" ("name", "email") VALUES ('Alice', 'alice@mac.com') + +for user in try db.prepare(users) { + print("id: \(user[id]), name: \(user[name]), email: \(user[email])") + // id: 1, name: Optional("Alice"), email: alice@mac.com +} +// SELECT * FROM "users" + +let alice = users.filter(id == rowid) + +try db.run(alice.update(email <- email.replace("mac.com", with: "me.com"))) +// UPDATE "users" SET "email" = replace("email", 'mac.com', 'me.com') +// WHERE ("id" = 1) + +try db.run(alice.delete()) +// DELETE FROM "users" WHERE ("id" = 1) + +db.scalar(users.count) // 0 +// SELECT count(*) FROM "users" +``` + +SQLite.swift also works as a lightweight, Swift-friendly wrapper over the C +API. + +``` swift +let stmt = try db.prepare("INSERT INTO users (email) VALUES (?)") +for email in ["betty@icloud.com", "cathy@icloud.com"] { + try stmt.run(email) +} + +db.totalChanges // 3 +db.changes // 1 +db.lastInsertRowid // 3 + +for row in try db.prepare("SELECT id, email FROM users") { + print("id: \(row[0]), email: \(row[1])") + // id: Optional(2), email: Optional("betty@icloud.com") + // id: Optional(3), email: Optional("cathy@icloud.com") +} + +db.scalar("SELECT count(*) FROM users") // 2 +``` + +[Read the documentation][See Documentation] or explore more, +interactively, from the Xcode project’s playground. + +![SQLite.playground Screen Shot](Documentation/Resources/playground@2x.png) + +For a more comprehensive example, see [this article](http://masteringswift.blogspot.com/2015/09/create-data-access-layer-with.html) and the [companion repository](https://github.com/hoffmanjon/SQLiteDataAccessLayer2/tree/master). + +## Installation + +> _Note:_ SQLite.swift requires Swift 3 (and [Xcode][] 8) or greater. If you absolutely +> need compatibility with Swift 2.3 you can use the [swift-2.3][] branch or older +> released versions. New development will happen exclusively on the master/Swift 3 branch. + +### Carthage + +[Carthage][] is a simple, decentralized dependency manager for Cocoa. To +install SQLite.swift with Carthage: + + 1. Make sure Carthage is [installed][Carthage Installation]. + + 2. Update your Cartfile to include the following: + + ``` + github "stephencelis/SQLite.swift" ~> 0.11.2 + ``` + + 3. Run `carthage update` and [add the appropriate framework][Carthage Usage]. + + +[Carthage]: https://github.com/Carthage/Carthage +[Carthage Installation]: https://github.com/Carthage/Carthage#installing-carthage +[Carthage Usage]: https://github.com/Carthage/Carthage#adding-frameworks-to-an-application + + +### CocoaPods + +[CocoaPods][] is a dependency manager for Cocoa projects. To install +SQLite.swift with CocoaPods: + + 1. Verify that your copy of Xcode is installed and active in the default location (`/Applications/Xcode.app`). + + ```sh + sudo xcode-select --switch /Applications/Xcode.app + ``` + + 2. Make sure CocoaPods is [installed][CocoaPods Installation]. (SQLite.swift requires version 1.0.0 or greater.) + + ``` sh + # Using the default Ruby install will require you to use sudo when + # installing and updating gems. + [sudo] gem install cocoapods + ``` + + 3. Update your Podfile to include the following: + + ``` ruby + use_frameworks! + + target 'YourAppTargetName' do + pod 'SQLite.swift', '~> 0.11.2' + end + ``` + + 4. Run `pod install --repo-update`. + +[CocoaPods]: https://cocoapods.org +[CocoaPods Installation]: https://guides.cocoapods.org/using/getting-started.html#getting-started + +### Swift Package Manager + +The [Swift Package Manager][] is a tool for managing the distribution of Swift code. + +1. Add the following to your `Package.swift` file: + +```swift +dependencies: [ + .Package(url: "https://github.com/stephencelis/SQLite.swift.git", majorVersion: 0, minor: 11) +] +``` + +[Swift Package Manager]: https://swift.org/package-manager + +### Manual + +To install SQLite.swift as an Xcode sub-project: + + 1. Drag the **SQLite.xcodeproj** file into your own project. + ([Submodule][], clone, or [download][] the project first.) + + ![Installation Screen Shot](Documentation/Resources/installation@2x.png) + + 2. In your target’s **General** tab, click the **+** button under **Linked + Frameworks and Libraries**. + + 3. Select the appropriate **SQLite.framework** for your platform. + + 4. **Add**. + +Some additional steps are required to install the application on an actual device: + + 5. In the **General** tab, click the **+** button under **Embedded Binaries**. + + 6. Select the appropriate **SQLite.framework** for your platform. + + 7. **Add**. + + +[Xcode]: https://developer.apple.com/xcode/downloads/ +[Submodule]: http://git-scm.com/book/en/Git-Tools-Submodules +[download]: https://github.com/stephencelis/SQLite.swift/archive/master.zip + + +## Communication + +[See the planning document] for a roadmap and existing feature requests. + +[Read the contributing guidelines][]. The _TL;DR_ (but please; _R_): + + - Need **help** or have a **general question**? [Ask on Stack + Overflow][] (tag `sqlite.swift`). + - Found a **bug** or have a **feature request**? [Open an issue][]. + - Want to **contribute**? [Submit a pull request][]. + +[See the planning document]: /Documentation/Planning.md +[Read the contributing guidelines]: ./CONTRIBUTING.md#contributing +[Ask on Stack Overflow]: http://stackoverflow.com/questions/tagged/sqlite.swift +[Open an issue]: https://github.com/stephencelis/SQLite.swift/issues/new +[Submit a pull request]: https://github.com/stephencelis/SQLite.swift/fork + + +## Author + + - [Stephen Celis](mailto:stephen@stephencelis.com) + ([@stephencelis](https://twitter.com/stephencelis)) + + +## License + +SQLite.swift is available under the MIT license. See [the LICENSE +file](./LICENSE.txt) for more information. + +## Related + +These projects enhance or use SQLite.swift: + + - [SQLiteMigrationManager.swift](https://github.com/garriguv/SQLiteMigrationManager.swift) (inspired by [FMDBMigrationManager](https://github.com/layerhq/FMDBMigrationManager)) + + +## Alternatives + +Looking for something else? Try another Swift wrapper (or [FMDB][]): + + - [Camembert](https://github.com/remirobert/Camembert) + - [GRDB](https://github.com/groue/GRDB.swift) + - [SQLiteDB](https://github.com/FahimF/SQLiteDB) + - [Squeal](https://github.com/nerdyc/Squeal) + - [SwiftData](https://github.com/ryanfowler/SwiftData) + - [SwiftSQLite](https://github.com/chrismsimpson/SwiftSQLite) + +[FMDB]: https://github.com/ccgus/fmdb +[swift-2.3]: https://github.com/stephencelis/SQLite.swift/tree/swift-2.3 diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Core/Blob.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Core/Blob.swift new file mode 100644 index 0000000000..2f5d2a14f4 --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Core/Blob.swift @@ -0,0 +1,60 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +public struct Blob { + + public let bytes: [UInt8] + + public init(bytes: [UInt8]) { + self.bytes = bytes + } + + public init(bytes: UnsafeRawPointer, length: Int) { + let i8bufptr = UnsafeBufferPointer(start: bytes.assumingMemoryBound(to: UInt8.self), count: length) + self.init(bytes: [UInt8](i8bufptr)) + } + + public func toHex() -> String { + return bytes.map { + ($0 < 16 ? "0" : "") + String($0, radix: 16, uppercase: false) + }.joined(separator: "") + } + +} + +extension Blob : CustomStringConvertible { + + public var description: String { + return "x'\(toHex())'" + } + +} + +extension Blob : Equatable { + +} + +public func ==(lhs: Blob, rhs: Blob) -> Bool { + return lhs.bytes == rhs.bytes +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Core/Connection.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Core/Connection.swift new file mode 100644 index 0000000000..0661175664 --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Core/Connection.swift @@ -0,0 +1,756 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation.NSUUID +import Dispatch +#if SQLITE_SWIFT_STANDALONE +import sqlite3 +#elseif SQLITE_SWIFT_SQLCIPHER +import SQLCipher +#else +import CSQLite +#endif + +/// A connection to SQLite. +public final class Connection { + + /// The location of a SQLite database. + public enum Location { + + /// An in-memory database (equivalent to `.URI(":memory:")`). + /// + /// See: + case inMemory + + /// A temporary, file-backed database (equivalent to `.URI("")`). + /// + /// See: + case temporary + + /// A database located at the given URI filename (or path). + /// + /// See: + /// + /// - Parameter filename: A URI filename + case uri(String) + } + + /// An SQL operation passed to update callbacks. + public enum Operation { + + /// An INSERT operation. + case insert + + /// An UPDATE operation. + case update + + /// A DELETE operation. + case delete + + fileprivate init(rawValue:Int32) { + switch rawValue { + case SQLITE_INSERT: + self = .insert + case SQLITE_UPDATE: + self = .update + case SQLITE_DELETE: + self = .delete + default: + fatalError("unhandled operation code: \(rawValue)") + } + } + } + + public var handle: OpaquePointer { return _handle! } + + fileprivate var _handle: OpaquePointer? = nil + + /// Initializes a new SQLite connection. + /// + /// - Parameters: + /// + /// - location: The location of the database. Creates a new database if it + /// doesn’t already exist (unless in read-only mode). + /// + /// Default: `.InMemory`. + /// + /// - readonly: Whether or not to open the database in a read-only state. + /// + /// Default: `false`. + /// + /// - Returns: A new database connection. + public init(_ location: Location = .inMemory, readonly: Bool = false) throws { + let flags = readonly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE + try check(sqlite3_open_v2(location.description, &_handle, flags | SQLITE_OPEN_FULLMUTEX, nil)) + queue.setSpecific(key: Connection.queueKey, value: queueContext) + } + + /// Initializes a new connection to a database. + /// + /// - Parameters: + /// + /// - filename: The location of the database. Creates a new database if + /// it doesn’t already exist (unless in read-only mode). + /// + /// - readonly: Whether or not to open the database in a read-only state. + /// + /// Default: `false`. + /// + /// - Throws: `Result.Error` iff a connection cannot be established. + /// + /// - Returns: A new database connection. + public convenience init(_ filename: String, readonly: Bool = false) throws { + try self.init(.uri(filename), readonly: readonly) + } + + deinit { + sqlite3_close(handle) + } + + // MARK: - + + /// Whether or not the database was opened in a read-only state. + public var readonly: Bool { return sqlite3_db_readonly(handle, nil) == 1 } + + /// The last rowid inserted into the database via this connection. + public var lastInsertRowid: Int64 { + return sqlite3_last_insert_rowid(handle) + } + + /// The last number of changes (inserts, updates, or deletes) made to the + /// database via this connection. + public var changes: Int { + return Int(sqlite3_changes(handle)) + } + + /// The total number of changes (inserts, updates, or deletes) made to the + /// database via this connection. + public var totalChanges: Int { + return Int(sqlite3_total_changes(handle)) + } + + // MARK: - Execute + + /// Executes a batch of SQL statements. + /// + /// - Parameter SQL: A batch of zero or more semicolon-separated SQL + /// statements. + /// + /// - Throws: `Result.Error` if query execution fails. + public func execute(_ SQL: String) throws { + _ = try sync { try self.check(sqlite3_exec(self.handle, SQL, nil, nil, nil)) } + } + + // MARK: - Prepare + + /// Prepares a single SQL statement (with optional parameter bindings). + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A list of parameters to bind to the statement. + /// + /// - Returns: A prepared statement. + public func prepare(_ statement: String, _ bindings: Binding?...) throws -> Statement { + if !bindings.isEmpty { return try prepare(statement, bindings) } + return try Statement(self, statement) + } + + /// Prepares a single SQL statement and binds parameters to it. + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A list of parameters to bind to the statement. + /// + /// - Returns: A prepared statement. + public func prepare(_ statement: String, _ bindings: [Binding?]) throws -> Statement { + return try prepare(statement).bind(bindings) + } + + /// Prepares a single SQL statement and binds parameters to it. + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A dictionary of named parameters to bind to the statement. + /// + /// - Returns: A prepared statement. + public func prepare(_ statement: String, _ bindings: [String: Binding?]) throws -> Statement { + return try prepare(statement).bind(bindings) + } + + // MARK: - Run + + /// Runs a single SQL statement (with optional parameter bindings). + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A list of parameters to bind to the statement. + /// + /// - Throws: `Result.Error` if query execution fails. + /// + /// - Returns: The statement. + @discardableResult public func run(_ statement: String, _ bindings: Binding?...) throws -> Statement { + return try run(statement, bindings) + } + + /// Prepares, binds, and runs a single SQL statement. + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A list of parameters to bind to the statement. + /// + /// - Throws: `Result.Error` if query execution fails. + /// + /// - Returns: The statement. + @discardableResult public func run(_ statement: String, _ bindings: [Binding?]) throws -> Statement { + return try prepare(statement).run(bindings) + } + + /// Prepares, binds, and runs a single SQL statement. + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A dictionary of named parameters to bind to the statement. + /// + /// - Throws: `Result.Error` if query execution fails. + /// + /// - Returns: The statement. + @discardableResult public func run(_ statement: String, _ bindings: [String: Binding?]) throws -> Statement { + return try prepare(statement).run(bindings) + } + + // MARK: - Scalar + + /// Runs a single SQL statement (with optional parameter bindings), + /// returning the first value of the first row. + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A list of parameters to bind to the statement. + /// + /// - Returns: The first value of the first row returned. + public func scalar(_ statement: String, _ bindings: Binding?...) throws -> Binding? { + return try scalar(statement, bindings) + } + + /// Runs a single SQL statement (with optional parameter bindings), + /// returning the first value of the first row. + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A list of parameters to bind to the statement. + /// + /// - Returns: The first value of the first row returned. + public func scalar(_ statement: String, _ bindings: [Binding?]) throws -> Binding? { + return try prepare(statement).scalar(bindings) + } + + /// Runs a single SQL statement (with optional parameter bindings), + /// returning the first value of the first row. + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A dictionary of named parameters to bind to the statement. + /// + /// - Returns: The first value of the first row returned. + public func scalar(_ statement: String, _ bindings: [String: Binding?]) throws -> Binding? { + return try prepare(statement).scalar(bindings) + } + + // MARK: - Transactions + + /// The mode in which a transaction acquires a lock. + public enum TransactionMode : String { + + /// Defers locking the database till the first read/write executes. + case deferred = "DEFERRED" + + /// Immediately acquires a reserved lock on the database. + case immediate = "IMMEDIATE" + + /// Immediately acquires an exclusive lock on all databases. + case exclusive = "EXCLUSIVE" + + } + + // TODO: Consider not requiring a throw to roll back? + /// Runs a transaction with the given mode. + /// + /// - Note: Transactions cannot be nested. To nest transactions, see + /// `savepoint()`, instead. + /// + /// - Parameters: + /// + /// - mode: The mode in which a transaction acquires a lock. + /// + /// Default: `.Deferred` + /// + /// - block: A closure to run SQL statements within the transaction. + /// The transaction will be committed when the block returns. The block + /// must throw to roll the transaction back. + /// + /// - Throws: `Result.Error`, and rethrows. + public func transaction(_ mode: TransactionMode = .deferred, block: @escaping () throws -> Void) throws { + try transaction("BEGIN \(mode.rawValue) TRANSACTION", block, "COMMIT TRANSACTION", or: "ROLLBACK TRANSACTION") + } + + // TODO: Consider not requiring a throw to roll back? + // TODO: Consider removing ability to set a name? + /// Runs a transaction with the given savepoint name (if omitted, it will + /// generate a UUID). + /// + /// - SeeAlso: `transaction()`. + /// + /// - Parameters: + /// + /// - savepointName: A unique identifier for the savepoint (optional). + /// + /// - block: A closure to run SQL statements within the transaction. + /// The savepoint will be released (committed) when the block returns. + /// The block must throw to roll the savepoint back. + /// + /// - Throws: `SQLite.Result.Error`, and rethrows. + public func savepoint(_ name: String = UUID().uuidString, block: @escaping () throws -> Void) throws { + let name = name.quote("'") + let savepoint = "SAVEPOINT \(name)" + + try transaction(savepoint, block, "RELEASE \(savepoint)", or: "ROLLBACK TO \(savepoint)") + } + + fileprivate func transaction(_ begin: String, _ block: @escaping () throws -> Void, _ commit: String, or rollback: String) throws { + return try sync { + try self.run(begin) + do { + try block() + } catch { + try self.run(rollback) + throw error + } + try self.run(commit) + } + } + + /// Interrupts any long-running queries. + public func interrupt() { + sqlite3_interrupt(handle) + } + + // MARK: - Handlers + + /// The number of seconds a connection will attempt to retry a statement + /// after encountering a busy signal (lock). + public var busyTimeout: Double = 0 { + didSet { + sqlite3_busy_timeout(handle, Int32(busyTimeout * 1_000)) + } + } + + /// Sets a handler to call after encountering a busy signal (lock). + /// + /// - Parameter callback: This block is executed during a lock in which a + /// busy error would otherwise be returned. It’s passed the number of + /// times it’s been called for this lock. If it returns `true`, it will + /// try again. If it returns `false`, no further attempts will be made. + public func busyHandler(_ callback: ((_ tries: Int) -> Bool)?) { + guard let callback = callback else { + sqlite3_busy_handler(handle, nil, nil) + busyHandler = nil + return + } + + let box: BusyHandler = { callback(Int($0)) ? 1 : 0 } + sqlite3_busy_handler(handle, { callback, tries in + unsafeBitCast(callback, to: BusyHandler.self)(tries) + }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) + busyHandler = box + } + fileprivate typealias BusyHandler = @convention(block) (Int32) -> Int32 + fileprivate var busyHandler: BusyHandler? + + /// Sets a handler to call when a statement is executed with the compiled + /// SQL. + /// + /// - Parameter callback: This block is invoked when a statement is executed + /// with the compiled SQL as its argument. + /// + /// db.trace { SQL in print(SQL) } + public func trace(_ callback: ((String) -> Void)?) { + #if SQLITE_SWIFT_SQLCIPHER + trace_v1(callback) + #else + if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) { + trace_v2(callback) + } else { + trace_v1(callback) + } + #endif + } + + fileprivate func trace_v1(_ callback: ((String) -> Void)?) { + guard let callback = callback else { + sqlite3_trace(handle, nil /* xCallback */, nil /* pCtx */) + trace = nil + return + } + let box: Trace = { (pointer: UnsafeRawPointer) in + callback(String(cString: pointer.assumingMemoryBound(to: UInt8.self))) + } + sqlite3_trace(handle, + { + (C: UnsafeMutableRawPointer?, SQL: UnsafePointer?) in + if let C = C, let SQL = SQL { + unsafeBitCast(C, to: Trace.self)(SQL) + } + }, + unsafeBitCast(box, to: UnsafeMutableRawPointer.self) + ) + trace = box + } + + + + + fileprivate typealias Trace = @convention(block) (UnsafeRawPointer) -> Void + fileprivate var trace: Trace? + + /// Registers a callback to be invoked whenever a row is inserted, updated, + /// or deleted in a rowid table. + /// + /// - Parameter callback: A callback invoked with the `Operation` (one of + /// `.Insert`, `.Update`, or `.Delete`), database name, table name, and + /// rowid. + public func updateHook(_ callback: ((_ operation: Operation, _ db: String, _ table: String, _ rowid: Int64) -> Void)?) { + guard let callback = callback else { + sqlite3_update_hook(handle, nil, nil) + updateHook = nil + return + } + + let box: UpdateHook = { + callback( + Operation(rawValue: $0), + String(cString: $1), + String(cString: $2), + $3 + ) + } + sqlite3_update_hook(handle, { callback, operation, db, table, rowid in + unsafeBitCast(callback, to: UpdateHook.self)(operation, db!, table!, rowid) + }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) + updateHook = box + } + fileprivate typealias UpdateHook = @convention(block) (Int32, UnsafePointer, UnsafePointer, Int64) -> Void + fileprivate var updateHook: UpdateHook? + + /// Registers a callback to be invoked whenever a transaction is committed. + /// + /// - Parameter callback: A callback invoked whenever a transaction is + /// committed. If this callback throws, the transaction will be rolled + /// back. + public func commitHook(_ callback: (() throws -> Void)?) { + guard let callback = callback else { + sqlite3_commit_hook(handle, nil, nil) + commitHook = nil + return + } + + let box: CommitHook = { + do { + try callback() + } catch { + return 1 + } + return 0 + } + sqlite3_commit_hook(handle, { callback in + unsafeBitCast(callback, to: CommitHook.self)() + }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) + commitHook = box + } + fileprivate typealias CommitHook = @convention(block) () -> Int32 + fileprivate var commitHook: CommitHook? + + /// Registers a callback to be invoked whenever a transaction rolls back. + /// + /// - Parameter callback: A callback invoked when a transaction is rolled + /// back. + public func rollbackHook(_ callback: (() -> Void)?) { + guard let callback = callback else { + sqlite3_rollback_hook(handle, nil, nil) + rollbackHook = nil + return + } + + let box: RollbackHook = { callback() } + sqlite3_rollback_hook(handle, { callback in + unsafeBitCast(callback, to: RollbackHook.self)() + }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) + rollbackHook = box + } + fileprivate typealias RollbackHook = @convention(block) () -> Void + fileprivate var rollbackHook: RollbackHook? + + /// Creates or redefines a custom SQL function. + /// + /// - Parameters: + /// + /// - function: The name of the function to create or redefine. + /// + /// - argumentCount: The number of arguments that the function takes. If + /// `nil`, the function may take any number of arguments. + /// + /// Default: `nil` + /// + /// - deterministic: Whether or not the function is deterministic (_i.e._ + /// the function always returns the same result for a given input). + /// + /// Default: `false` + /// + /// - block: A block of code to run when the function is called. The block + /// is called with an array of raw SQL values mapped to the function’s + /// parameters and should return a raw SQL value (or nil). + public func createFunction(_ function: String, argumentCount: UInt? = nil, deterministic: Bool = false, _ block: @escaping (_ args: [Binding?]) -> Binding?) { + let argc = argumentCount.map { Int($0) } ?? -1 + let box: Function = { context, argc, argv in + let arguments: [Binding?] = (0..?) -> Void + fileprivate var functions = [String: [Int: Function]]() + + /// Defines a new collating sequence. + /// + /// - Parameters: + /// + /// - collation: The name of the collation added. + /// + /// - block: A collation function that takes two strings and returns the + /// comparison result. + public func createCollation(_ collation: String, _ block: @escaping (_ lhs: String, _ rhs: String) -> ComparisonResult) throws { + let box: Collation = { (lhs: UnsafeRawPointer, rhs: UnsafeRawPointer) in + let lstr = String(cString: lhs.assumingMemoryBound(to: UInt8.self)) + let rstr = String(cString: rhs.assumingMemoryBound(to: UInt8.self)) + return Int32(block(lstr, rstr).rawValue) + } + try check(sqlite3_create_collation_v2(handle, collation, SQLITE_UTF8, + unsafeBitCast(box, to: UnsafeMutableRawPointer.self), + { (callback: UnsafeMutableRawPointer?, _, lhs: UnsafeRawPointer?, _, rhs: UnsafeRawPointer?) in /* xCompare */ + if let lhs = lhs, let rhs = rhs { + return unsafeBitCast(callback, to: Collation.self)(lhs, rhs) + } else { + fatalError("sqlite3_create_collation_v2 callback called with NULL pointer") + } + }, nil /* xDestroy */)) + collations[collation] = box + } + fileprivate typealias Collation = @convention(block) (UnsafeRawPointer, UnsafeRawPointer) -> Int32 + fileprivate var collations = [String: Collation]() + + // MARK: - Error Handling + + func sync(_ block: @escaping () throws -> T) rethrows -> T { + var success: T? + var failure: Error? + + let box: () -> Void = { + do { + success = try block() + } catch { + failure = error + } + } + + if DispatchQueue.getSpecific(key: Connection.queueKey) == queueContext { + box() + } else { + queue.sync(execute: box) // FIXME: rdar://problem/21389236 + } + + if let failure = failure { + try { () -> Void in throw failure }() + } + + return success! + } + + @discardableResult func check(_ resultCode: Int32, statement: Statement? = nil) throws -> Int32 { + guard let error = Result(errorCode: resultCode, connection: self, statement: statement) else { + return resultCode + } + + throw error + } + + fileprivate var queue = DispatchQueue(label: "SQLite.Database", attributes: []) + + fileprivate static let queueKey = DispatchSpecificKey() + + fileprivate lazy var queueContext: Int = unsafeBitCast(self, to: Int.self) + +} + +extension Connection : CustomStringConvertible { + + public var description: String { + return String(cString: sqlite3_db_filename(handle, nil)) + } + +} + +extension Connection.Location : CustomStringConvertible { + + public var description: String { + switch self { + case .inMemory: + return ":memory:" + case .temporary: + return "" + case .uri(let URI): + return URI + } + } + +} + +public enum Result : Error { + + fileprivate static let successCodes: Set = [SQLITE_OK, SQLITE_ROW, SQLITE_DONE] + + case error(message: String, code: Int32, statement: Statement?) + + init?(errorCode: Int32, connection: Connection, statement: Statement? = nil) { + guard !Result.successCodes.contains(errorCode) else { return nil } + + let message = String(cString: sqlite3_errmsg(connection.handle)) + self = .error(message: message, code: errorCode, statement: statement) + } + +} + +extension Result : CustomStringConvertible { + + public var description: String { + switch self { + case let .error(message, errorCode, statement): + if let statement = statement { + return "\(message) (\(statement)) (code: \(errorCode))" + } else { + return "\(message) (code: \(errorCode))" + } + } + } +} + +#if !SQLITE_SWIFT_SQLCIPHER +@available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) +extension Connection { + fileprivate func trace_v2(_ callback: ((String) -> Void)?) { + guard let callback = callback else { + // If the X callback is NULL or if the M mask is zero, then tracing is disabled. + sqlite3_trace_v2(handle, 0 /* mask */, nil /* xCallback */, nil /* pCtx */) + trace = nil + return + } + + let box: Trace = { (pointer: UnsafeRawPointer) in + callback(String(cString: pointer.assumingMemoryBound(to: UInt8.self))) + } + sqlite3_trace_v2(handle, + UInt32(SQLITE_TRACE_STMT) /* mask */, + { + // A trace callback is invoked with four arguments: callback(T,C,P,X). + // The T argument is one of the SQLITE_TRACE constants to indicate why the + // callback was invoked. The C argument is a copy of the context pointer. + // The P and X arguments are pointers whose meanings depend on T. + (T: UInt32, C: UnsafeMutableRawPointer?, P: UnsafeMutableRawPointer?, X: UnsafeMutableRawPointer?) in + if let P = P, + let expandedSQL = sqlite3_expanded_sql(OpaquePointer(P)) { + unsafeBitCast(C, to: Trace.self)(expandedSQL) + sqlite3_free(expandedSQL) + } + return Int32(0) // currently ignored + }, + unsafeBitCast(box, to: UnsafeMutableRawPointer.self) /* pCtx */ + ) + trace = box + } +} +#endif diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Core/Statement.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Core/Statement.swift new file mode 100644 index 0000000000..766bd15b1f --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Core/Statement.swift @@ -0,0 +1,297 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +#if SQLITE_SWIFT_STANDALONE +import sqlite3 +#elseif SQLITE_SWIFT_SQLCIPHER +import SQLCipher +#else +import CSQLite +#endif + +/// A single SQL statement. +public final class Statement { + + fileprivate var handle: OpaquePointer? = nil + + fileprivate let connection: Connection + + init(_ connection: Connection, _ SQL: String) throws { + self.connection = connection + try connection.check(sqlite3_prepare_v2(connection.handle, SQL, -1, &handle, nil)) + } + + deinit { + sqlite3_finalize(handle) + } + + public lazy var columnCount: Int = Int(sqlite3_column_count(self.handle)) + + public lazy var columnNames: [String] = (0.. Statement { + return bind(values) + } + + /// Binds a list of parameters to a statement. + /// + /// - Parameter values: A list of parameters to bind to the statement. + /// + /// - Returns: The statement object (useful for chaining). + public func bind(_ values: [Binding?]) -> Statement { + if values.isEmpty { return self } + reset() + guard values.count == Int(sqlite3_bind_parameter_count(handle)) else { + fatalError("\(sqlite3_bind_parameter_count(handle)) values expected, \(values.count) passed") + } + for idx in 1...values.count { bind(values[idx - 1], atIndex: idx) } + return self + } + + /// Binds a dictionary of named parameters to a statement. + /// + /// - Parameter values: A dictionary of named parameters to bind to the + /// statement. + /// + /// - Returns: The statement object (useful for chaining). + public func bind(_ values: [String: Binding?]) -> Statement { + reset() + for (name, value) in values { + let idx = sqlite3_bind_parameter_index(handle, name) + guard idx > 0 else { + fatalError("parameter not found: \(name)") + } + bind(value, atIndex: Int(idx)) + } + return self + } + + fileprivate func bind(_ value: Binding?, atIndex idx: Int) { + if value == nil { + sqlite3_bind_null(handle, Int32(idx)) + } else if let value = value as? Blob { + sqlite3_bind_blob(handle, Int32(idx), value.bytes, Int32(value.bytes.count), SQLITE_TRANSIENT) + } else if let value = value as? Double { + sqlite3_bind_double(handle, Int32(idx), value) + } else if let value = value as? Int64 { + sqlite3_bind_int64(handle, Int32(idx), value) + } else if let value = value as? String { + sqlite3_bind_text(handle, Int32(idx), value, -1, SQLITE_TRANSIENT) + } else if let value = value as? Int { + self.bind(value.datatypeValue, atIndex: idx) + } else if let value = value as? Bool { + self.bind(value.datatypeValue, atIndex: idx) + } else if let value = value { + fatalError("tried to bind unexpected value \(value)") + } + } + + /// - Parameter bindings: A list of parameters to bind to the statement. + /// + /// - Throws: `Result.Error` if query execution fails. + /// + /// - Returns: The statement object (useful for chaining). + @discardableResult public func run(_ bindings: Binding?...) throws -> Statement { + guard bindings.isEmpty else { + return try run(bindings) + } + + reset(clearBindings: false) + repeat {} while try step() + return self + } + + /// - Parameter bindings: A list of parameters to bind to the statement. + /// + /// - Throws: `Result.Error` if query execution fails. + /// + /// - Returns: The statement object (useful for chaining). + @discardableResult public func run(_ bindings: [Binding?]) throws -> Statement { + return try bind(bindings).run() + } + + /// - Parameter bindings: A dictionary of named parameters to bind to the + /// statement. + /// + /// - Throws: `Result.Error` if query execution fails. + /// + /// - Returns: The statement object (useful for chaining). + @discardableResult public func run(_ bindings: [String: Binding?]) throws -> Statement { + return try bind(bindings).run() + } + + /// - Parameter bindings: A list of parameters to bind to the statement. + /// + /// - Returns: The first value of the first row returned. + public func scalar(_ bindings: Binding?...) throws -> Binding? { + guard bindings.isEmpty else { + return try scalar(bindings) + } + + reset(clearBindings: false) + _ = try step() + return row[0] + } + + /// - Parameter bindings: A list of parameters to bind to the statement. + /// + /// - Returns: The first value of the first row returned. + public func scalar(_ bindings: [Binding?]) throws -> Binding? { + return try bind(bindings).scalar() + } + + + /// - Parameter bindings: A dictionary of named parameters to bind to the + /// statement. + /// + /// - Returns: The first value of the first row returned. + public func scalar(_ bindings: [String: Binding?]) throws -> Binding? { + return try bind(bindings).scalar() + } + + public func step() throws -> Bool { + return try connection.sync { try self.connection.check(sqlite3_step(self.handle)) == SQLITE_ROW } + } + + fileprivate func reset(clearBindings shouldClear: Bool = true) { + sqlite3_reset(handle) + if (shouldClear) { sqlite3_clear_bindings(handle) } + } + +} + +extension Statement : Sequence { + + public func makeIterator() -> Statement { + reset(clearBindings: false) + return self + } + +} + +extension Statement : IteratorProtocol { + + public func next() -> [Binding?]? { + return try! step() ? Array(row) : nil + } + +} + +extension Statement : CustomStringConvertible { + + public var description: String { + return String(cString: sqlite3_sql(handle)) + } + +} + +public struct Cursor { + + fileprivate let handle: OpaquePointer + + fileprivate let columnCount: Int + + fileprivate init(_ statement: Statement) { + handle = statement.handle! + columnCount = statement.columnCount + } + + public subscript(idx: Int) -> Double { + return sqlite3_column_double(handle, Int32(idx)) + } + + public subscript(idx: Int) -> Int64 { + return sqlite3_column_int64(handle, Int32(idx)) + } + + public subscript(idx: Int) -> String { + return String(cString: UnsafePointer(sqlite3_column_text(handle, Int32(idx)))) + } + + public subscript(idx: Int) -> Blob { + if let pointer = sqlite3_column_blob(handle, Int32(idx)) { + let length = Int(sqlite3_column_bytes(handle, Int32(idx))) + return Blob(bytes: pointer, length: length) + } else { + // The return value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. + // https://www.sqlite.org/c3ref/column_blob.html + return Blob(bytes: []) + } + } + + // MARK: - + + public subscript(idx: Int) -> Bool { + return Bool.fromDatatypeValue(self[idx]) + } + + public subscript(idx: Int) -> Int { + return Int.fromDatatypeValue(self[idx]) + } + +} + +/// Cursors provide direct access to a statement’s current row. +extension Cursor : Sequence { + + public subscript(idx: Int) -> Binding? { + switch sqlite3_column_type(handle, Int32(idx)) { + case SQLITE_BLOB: + return self[idx] as Blob + case SQLITE_FLOAT: + return self[idx] as Double + case SQLITE_INTEGER: + return self[idx] as Int64 + case SQLITE_NULL: + return nil + case SQLITE_TEXT: + return self[idx] as String + case let type: + fatalError("unsupported column type: \(type)") + } + } + + public func makeIterator() -> AnyIterator { + var idx = 0 + return AnyIterator { + if idx >= self.columnCount { + return Optional.none + } else { + idx += 1 + return self[idx - 1] + } + } + } + +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Core/Value.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Core/Value.swift new file mode 100644 index 0000000000..608f0ce6fe --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Core/Value.swift @@ -0,0 +1,132 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +/// - Warning: `Binding` is a protocol that SQLite.swift uses internally to +/// directly map SQLite types to Swift types. +/// +/// Do not conform custom types to the Binding protocol. See the `Value` +/// protocol, instead. +public protocol Binding {} + +public protocol Number : Binding {} + +public protocol Value : Expressible { // extensions cannot have inheritance clauses + + associatedtype ValueType = Self + + associatedtype Datatype : Binding + + static var declaredDatatype: String { get } + + static func fromDatatypeValue(_ datatypeValue: Datatype) -> ValueType + + var datatypeValue: Datatype { get } + +} + +extension Double : Number, Value { + + public static let declaredDatatype = "REAL" + + public static func fromDatatypeValue(_ datatypeValue: Double) -> Double { + return datatypeValue + } + + public var datatypeValue: Double { + return self + } + +} + +extension Int64 : Number, Value { + + public static let declaredDatatype = "INTEGER" + + public static func fromDatatypeValue(_ datatypeValue: Int64) -> Int64 { + return datatypeValue + } + + public var datatypeValue: Int64 { + return self + } + +} + +extension String : Binding, Value { + + public static let declaredDatatype = "TEXT" + + public static func fromDatatypeValue(_ datatypeValue: String) -> String { + return datatypeValue + } + + public var datatypeValue: String { + return self + } + +} + +extension Blob : Binding, Value { + + public static let declaredDatatype = "BLOB" + + public static func fromDatatypeValue(_ datatypeValue: Blob) -> Blob { + return datatypeValue + } + + public var datatypeValue: Blob { + return self + } + +} + +// MARK: - + +extension Bool : Binding, Value { + + public static var declaredDatatype = Int64.declaredDatatype + + public static func fromDatatypeValue(_ datatypeValue: Int64) -> Bool { + return datatypeValue != 0 + } + + public var datatypeValue: Int64 { + return self ? 1 : 0 + } + +} + +extension Int : Number, Value { + + public static var declaredDatatype = Int64.declaredDatatype + + public static func fromDatatypeValue(_ datatypeValue: Int64) -> Int { + return Int(datatypeValue) + } + + public var datatypeValue: Int64 { + return Int64(self) + } + +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift new file mode 100644 index 0000000000..152a29219e --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift @@ -0,0 +1,346 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +#if SWIFT_PACKAGE +import SQLiteObjc +#endif + +extension Module { + + public static func FTS4(_ column: Expressible, _ more: Expressible...) -> Module { + return FTS4([column] + more) + } + + public static func FTS4(_ columns: [Expressible] = [], tokenize tokenizer: Tokenizer? = nil) -> Module { + return FTS4(FTS4Config().columns(columns).tokenizer(tokenizer)) + } + + public static func FTS4(_ config: FTS4Config) -> Module { + return Module(name: "fts4", arguments: config.arguments()) + } +} + +extension VirtualTable { + + /// Builds an expression appended with a `MATCH` query against the given + /// pattern. + /// + /// let emails = VirtualTable("emails") + /// + /// emails.filter(emails.match("Hello")) + /// // SELECT * FROM "emails" WHERE "emails" MATCH 'Hello' + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: An expression appended with a `MATCH` query against the given + /// pattern. + public func match(_ pattern: String) -> Expression { + return "MATCH".infix(tableName(), pattern) + } + + public func match(_ pattern: Expression) -> Expression { + return "MATCH".infix(tableName(), pattern) + } + + public func match(_ pattern: Expression) -> Expression { + return "MATCH".infix(tableName(), pattern) + } + + /// Builds a copy of the query with a `WHERE … MATCH` clause. + /// + /// let emails = VirtualTable("emails") + /// + /// emails.match("Hello") + /// // SELECT * FROM "emails" WHERE "emails" MATCH 'Hello' + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A query with the given `WHERE … MATCH` clause applied. + public func match(_ pattern: String) -> QueryType { + return filter(match(pattern)) + } + + public func match(_ pattern: Expression) -> QueryType { + return filter(match(pattern)) + } + + public func match(_ pattern: Expression) -> QueryType { + return filter(match(pattern)) + } + +} + +public struct Tokenizer { + + public static let Simple = Tokenizer("simple") + + public static let Porter = Tokenizer("porter") + + public static func Unicode61(removeDiacritics: Bool? = nil, tokenchars: Set = [], separators: Set = []) -> Tokenizer { + var arguments = [String]() + + if let removeDiacritics = removeDiacritics { + arguments.append("removeDiacritics=\(removeDiacritics ? 1 : 0)".quote()) + } + + if !tokenchars.isEmpty { + let joined = tokenchars.map { String($0) }.joined(separator: "") + arguments.append("tokenchars=\(joined)".quote()) + } + + if !separators.isEmpty { + let joined = separators.map { String($0) }.joined(separator: "") + arguments.append("separators=\(joined)".quote()) + } + + return Tokenizer("unicode61", arguments) + } + + public static func Custom(_ name: String) -> Tokenizer { + return Tokenizer(Tokenizer.moduleName.quote(), [name.quote()]) + } + + public let name: String + + public let arguments: [String] + + fileprivate init(_ name: String, _ arguments: [String] = []) { + self.name = name + self.arguments = arguments + } + + fileprivate static let moduleName = "SQLite.swift" + +} + +extension Tokenizer : CustomStringConvertible { + + public var description: String { + return ([name] + arguments).joined(separator: " ") + } + +} + +extension Connection { + + public func registerTokenizer(_ submoduleName: String, next: @escaping (String) -> (String, Range)?) throws { + try check(_SQLiteRegisterTokenizer(handle, Tokenizer.moduleName, submoduleName) { input, offset, length in + let string = String(cString: input) + + guard let (token, range) = next(string) else { return nil } + + let view = string.utf8 + offset.pointee += string.substring(to: range.lowerBound).utf8.count + length.pointee = Int32(view.distance(from: range.lowerBound.samePosition(in: view), to: range.upperBound.samePosition(in: view))) + return token + }) + } + +} + +/// Configuration options shared between the [FTS4](https://www.sqlite.org/fts3.html) and +/// [FTS5](https://www.sqlite.org/fts5.html) extensions. +open class FTSConfig { + public enum ColumnOption { + /// [The notindexed= option](https://www.sqlite.org/fts3.html#section_6_5) + case unindexed + } + + typealias ColumnDefinition = (Expressible, options: [ColumnOption]) + var columnDefinitions = [ColumnDefinition]() + var tokenizer: Tokenizer? + var prefixes = [Int]() + var externalContentSchema: SchemaType? + var isContentless: Bool = false + + /// Adds a column definition + @discardableResult open func column(_ column: Expressible, _ options: [ColumnOption] = []) -> Self { + self.columnDefinitions.append((column, options)) + return self + } + + @discardableResult open func columns(_ columns: [Expressible]) -> Self { + for column in columns { + self.column(column) + } + return self + } + + /// [Tokenizers](https://www.sqlite.org/fts3.html#tokenizer) + open func tokenizer(_ tokenizer: Tokenizer?) -> Self { + self.tokenizer = tokenizer + return self + } + + /// [The prefix= option](https://www.sqlite.org/fts3.html#section_6_6) + open func prefix(_ prefix: [Int]) -> Self { + self.prefixes += prefix + return self + } + + /// [The content= option](https://www.sqlite.org/fts3.html#section_6_2) + open func externalContent(_ schema: SchemaType) -> Self { + self.externalContentSchema = schema + return self + } + + /// [Contentless FTS4 Tables](https://www.sqlite.org/fts3.html#section_6_2_1) + open func contentless() -> Self { + self.isContentless = true + return self + } + + func formatColumnDefinitions() -> [Expressible] { + return columnDefinitions.map { $0.0 } + } + + func arguments() -> [Expressible] { + return options().arguments + } + + func options() -> Options { + var options = Options() + options.append(formatColumnDefinitions()) + if let tokenizer = tokenizer { + options.append("tokenize", value: Expression(literal: tokenizer.description)) + } + options.appendCommaSeparated("prefix", values:prefixes.sorted().map { String($0) }) + if isContentless { + options.append("content", value: "") + } else if let externalContentSchema = externalContentSchema { + options.append("content", value: externalContentSchema.tableName()) + } + return options + } + + struct Options { + var arguments = [Expressible]() + + @discardableResult mutating func append(_ columns: [Expressible]) -> Options { + arguments.append(contentsOf: columns) + return self + } + + @discardableResult mutating func appendCommaSeparated(_ key: String, values: [String]) -> Options { + if values.isEmpty { + return self + } else { + return append(key, value: values.joined(separator: ",")) + } + } + + @discardableResult mutating func append(_ key: String, value: CustomStringConvertible?) -> Options { + return append(key, value: value?.description) + } + + @discardableResult mutating func append(_ key: String, value: String?) -> Options { + return append(key, value: value.map { Expression($0) }) + } + + @discardableResult mutating func append(_ key: String, value: Expressible?) -> Options { + if let value = value { + arguments.append("=".join([Expression(literal: key), value])) + } + return self + } + } +} + +/// Configuration for the [FTS4](https://www.sqlite.org/fts3.html) extension. +open class FTS4Config : FTSConfig { + /// [The matchinfo= option](https://www.sqlite.org/fts3.html#section_6_4) + public enum MatchInfo : CustomStringConvertible { + case fts3 + public var description: String { + return "fts3" + } + } + + /// [FTS4 options](https://www.sqlite.org/fts3.html#fts4_options) + public enum Order : CustomStringConvertible { + /// Data structures are optimized for returning results in ascending order by docid (default) + case asc + /// FTS4 stores its data in such a way as to optimize returning results in descending order by docid. + case desc + + public var description: String { + switch self { + case .asc: return "asc" + case .desc: return "desc" + } + } + } + + var compressFunction: String? + var uncompressFunction: String? + var languageId: String? + var matchInfo: MatchInfo? + var order: Order? + + override public init() { + } + + /// [The compress= and uncompress= options](https://www.sqlite.org/fts3.html#section_6_1) + open func compress(_ functionName: String) -> Self { + self.compressFunction = functionName + return self + } + + /// [The compress= and uncompress= options](https://www.sqlite.org/fts3.html#section_6_1) + open func uncompress(_ functionName: String) -> Self { + self.uncompressFunction = functionName + return self + } + + /// [The languageid= option](https://www.sqlite.org/fts3.html#section_6_3) + open func languageId(_ columnName: String) -> Self { + self.languageId = columnName + return self + } + + /// [The matchinfo= option](https://www.sqlite.org/fts3.html#section_6_4) + open func matchInfo(_ matchInfo: MatchInfo) -> Self { + self.matchInfo = matchInfo + return self + } + + /// [FTS4 options](https://www.sqlite.org/fts3.html#fts4_options) + open func order(_ order: Order) -> Self { + self.order = order + return self + } + + override func options() -> Options { + var options = super.options() + for (column, _) in (columnDefinitions.filter { $0.options.contains(.unindexed) }) { + options.append("notindexed", value: column) + } + options.append("languageid", value: languageId) + options.append("compress", value: compressFunction) + options.append("uncompress", value: uncompressFunction) + options.append("matchinfo", value: matchInfo) + options.append("order", value: order) + return options + } +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift new file mode 100644 index 0000000000..763927ff48 --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift @@ -0,0 +1,97 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +extension Module { + public static func FTS5(_ config: FTS5Config) -> Module { + return Module(name: "fts5", arguments: config.arguments()) + } +} + +/// Configuration for the [FTS5](https://www.sqlite.org/fts5.html) extension. +/// +/// **Note:** this is currently only applicable when using SQLite.swift together with a FTS5-enabled version +/// of SQLite. +open class FTS5Config : FTSConfig { + public enum Detail : CustomStringConvertible { + /// store rowid, column number, term offset + case full + /// store rowid, column number + case column + /// store rowid + case none + + public var description: String { + switch self { + case .full: return "full" + case .column: return "column" + case .none: return "none" + } + } + } + + var detail: Detail? + var contentRowId: Expressible? + var columnSize: Int? + + override public init() { + } + + /// [External Content Tables](https://www.sqlite.org/fts5.html#section_4_4_2) + open func contentRowId(_ column: Expressible) -> Self { + self.contentRowId = column + return self + } + + /// [The Columnsize Option](https://www.sqlite.org/fts5.html#section_4_5) + open func columnSize(_ size: Int) -> Self { + self.columnSize = size + return self + } + + /// [The Detail Option](https://www.sqlite.org/fts5.html#section_4_6) + open func detail(_ detail: Detail) -> Self { + self.detail = detail + return self + } + + override func options() -> Options { + var options = super.options() + options.append("content_rowid", value: contentRowId) + if let columnSize = columnSize { + options.append("columnsize", value: Expression(value: columnSize)) + } + options.append("detail", value: detail) + return options + } + + override func formatColumnDefinitions() -> [Expressible] { + return columnDefinitions.map { definition in + if definition.options.contains(.unindexed) { + return " ".join([definition.0, Expression(literal: "UNINDEXED")]) + } else { + return definition.0 + } + } + } +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/RTree.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/RTree.swift new file mode 100644 index 0000000000..4fc1a23539 --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/RTree.swift @@ -0,0 +1,37 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +extension Module { + + public static func RTree(_ primaryKey: Expression, _ pairs: (Expression, Expression)...) -> Module where T.Datatype == Int64, U.Datatype == Double { + var arguments: [Expressible] = [primaryKey] + + for pair in pairs { + arguments.append(contentsOf: [pair.0, pair.1] as [Expressible]) + } + + return Module(name: "rtree", arguments: arguments) + } + +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Foundation.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Foundation.swift new file mode 100644 index 0000000000..5e102297b9 --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Foundation.swift @@ -0,0 +1,108 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +extension Data : Value { + + public static var declaredDatatype: String { + return Blob.declaredDatatype + } + + public static func fromDatatypeValue(_ dataValue: Blob) -> Data { + return Data(bytes: dataValue.bytes) + } + + public var datatypeValue: Blob { + return withUnsafeBytes { (pointer: UnsafePointer) -> Blob in + return Blob(bytes: pointer, length: count) + } + } + +} + +extension Date : Value { + + public static var declaredDatatype: String { + return String.declaredDatatype + } + + public static func fromDatatypeValue(_ stringValue: String) -> Date { + return dateFormatter.date(from: stringValue)! + } + + public var datatypeValue: String { + return dateFormatter.string(from: self) + } + +} + +/// A global date formatter used to serialize and deserialize `NSDate` objects. +/// If multiple date formats are used in an application’s database(s), use a +/// custom `Value` type per additional format. +public var dateFormatter: DateFormatter = { + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS" + formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.timeZone = TimeZone(secondsFromGMT: 0) + return formatter +}() + +// FIXME: rdar://problem/18673897 // subscript… + +extension QueryType { + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + +} + +extension Row { + + public subscript(column: Expression) -> Data { + return get(column) + } + public subscript(column: Expression) -> Data? { + return get(column) + } + + public subscript(column: Expression) -> Date { + return get(column) + } + public subscript(column: Expression) -> Date? { + return get(column) + } + +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Helpers.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Helpers.swift new file mode 100644 index 0000000000..81a7507ede --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Helpers.swift @@ -0,0 +1,130 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +#if SQLITE_SWIFT_STANDALONE +import sqlite3 +#elseif SQLITE_SWIFT_SQLCIPHER +import SQLCipher +#else +import CSQLite +#endif + +public typealias Star = (Expression?, Expression?) -> Expression + +public func *(_: Expression?, _: Expression?) -> Expression { + return Expression(literal: "*") +} + +public protocol _OptionalType { + + associatedtype WrappedType + +} + +extension Optional : _OptionalType { + + public typealias WrappedType = Wrapped + +} + +// let SQLITE_STATIC = unsafeBitCast(0, sqlite3_destructor_type.self) +let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) + +extension String { + + func quote(_ mark: Character = "\"") -> String { + let escaped = characters.reduce("") { string, character in + string + (character == mark ? "\(mark)\(mark)" : "\(character)") + } + return "\(mark)\(escaped)\(mark)" + } + + func join(_ expressions: [Expressible]) -> Expressible { + var (template, bindings) = ([String](), [Binding?]()) + for expressible in expressions { + let expression = expressible.expression + template.append(expression.template) + bindings.append(contentsOf: expression.bindings) + } + return Expression(template.joined(separator: self), bindings) + } + + func infix(_ lhs: Expressible, _ rhs: Expressible, wrap: Bool = true) -> Expression { + let expression = Expression(" \(self) ".join([lhs, rhs]).expression) + guard wrap else { + return expression + } + return "".wrap(expression) + } + + func prefix(_ expressions: Expressible) -> Expressible { + return "\(self) ".wrap(expressions) as Expression + } + + func prefix(_ expressions: [Expressible]) -> Expressible { + return "\(self) ".wrap(expressions) as Expression + } + + func wrap(_ expression: Expressible) -> Expression { + return Expression("\(self)(\(expression.expression.template))", expression.expression.bindings) + } + + func wrap(_ expressions: [Expressible]) -> Expression { + return wrap(", ".join(expressions)) + } + +} + +func infix(_ lhs: Expressible, _ rhs: Expressible, wrap: Bool = true, function: String = #function) -> Expression { + return function.infix(lhs, rhs, wrap: wrap) +} + +func wrap(_ expression: Expressible, function: String = #function) -> Expression { + return function.wrap(expression) +} + +func wrap(_ expressions: [Expressible], function: String = #function) -> Expression { + return function.wrap(", ".join(expressions)) +} + +func transcode(_ literal: Binding?) -> String { + guard let literal = literal else { return "NULL" } + + switch literal { + case let blob as Blob: + return blob.description + case let string as String: + return string.quote("'") + case let binding: + return "\(binding)" + } +} + +func value(_ v: Binding) -> A { + return A.fromDatatypeValue(v as! A.Datatype) as! A +} + +func value(_ v: Binding?) -> A { + return value(v!) +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/SQLite.h b/Example/Pods/SQLite.swift/Sources/SQLite/SQLite.h new file mode 100644 index 0000000000..693ce323cf --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/SQLite.h @@ -0,0 +1,6 @@ +@import Foundation; + +FOUNDATION_EXPORT double SQLiteVersionNumber; +FOUNDATION_EXPORT const unsigned char SQLiteVersionString[]; + +#import diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift new file mode 100644 index 0000000000..249bbe60cd --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift @@ -0,0 +1,251 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +extension ExpressionType where UnderlyingType : Value { + + /// Builds a copy of the expression prefixed with the `DISTINCT` keyword. + /// + /// let name = Expression("name") + /// name.distinct + /// // DISTINCT "name" + /// + /// - Returns: A copy of the expression prefixed with the `DISTINCT` + /// keyword. + public var distinct: Expression { + return Expression("DISTINCT \(template)", bindings) + } + + /// Builds a copy of the expression wrapped with the `count` aggregate + /// function. + /// + /// let name = Expression("name") + /// name.count + /// // count("name") + /// name.distinct.count + /// // count(DISTINCT "name") + /// + /// - Returns: A copy of the expression wrapped with the `count` aggregate + /// function. + public var count: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value { + + /// Builds a copy of the expression prefixed with the `DISTINCT` keyword. + /// + /// let name = Expression("name") + /// name.distinct + /// // DISTINCT "name" + /// + /// - Returns: A copy of the expression prefixed with the `DISTINCT` + /// keyword. + public var distinct: Expression { + return Expression("DISTINCT \(template)", bindings) + } + + /// Builds a copy of the expression wrapped with the `count` aggregate + /// function. + /// + /// let name = Expression("name") + /// name.count + /// // count("name") + /// name.distinct.count + /// // count(DISTINCT "name") + /// + /// - Returns: A copy of the expression wrapped with the `count` aggregate + /// function. + public var count: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType : Value, UnderlyingType.Datatype : Comparable { + + /// Builds a copy of the expression wrapped with the `max` aggregate + /// function. + /// + /// let age = Expression("age") + /// age.max + /// // max("age") + /// + /// - Returns: A copy of the expression wrapped with the `max` aggregate + /// function. + public var max: Expression { + return wrap(self) + } + + /// Builds a copy of the expression wrapped with the `min` aggregate + /// function. + /// + /// let age = Expression("age") + /// age.min + /// // min("age") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var min: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value, UnderlyingType.WrappedType.Datatype : Comparable { + + /// Builds a copy of the expression wrapped with the `max` aggregate + /// function. + /// + /// let age = Expression("age") + /// age.max + /// // max("age") + /// + /// - Returns: A copy of the expression wrapped with the `max` aggregate + /// function. + public var max: Expression { + return wrap(self) + } + + /// Builds a copy of the expression wrapped with the `min` aggregate + /// function. + /// + /// let age = Expression("age") + /// age.min + /// // min("age") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var min: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType : Value, UnderlyingType.Datatype : Number { + + /// Builds a copy of the expression wrapped with the `avg` aggregate + /// function. + /// + /// let salary = Expression("salary") + /// salary.average + /// // avg("salary") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var average: Expression { + return "avg".wrap(self) + } + + /// Builds a copy of the expression wrapped with the `sum` aggregate + /// function. + /// + /// let salary = Expression("salary") + /// salary.sum + /// // sum("salary") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var sum: Expression { + return wrap(self) + } + + /// Builds a copy of the expression wrapped with the `total` aggregate + /// function. + /// + /// let salary = Expression("salary") + /// salary.total + /// // total("salary") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var total: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value, UnderlyingType.WrappedType.Datatype : Number { + + /// Builds a copy of the expression wrapped with the `avg` aggregate + /// function. + /// + /// let salary = Expression("salary") + /// salary.average + /// // avg("salary") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var average: Expression { + return "avg".wrap(self) + } + + /// Builds a copy of the expression wrapped with the `sum` aggregate + /// function. + /// + /// let salary = Expression("salary") + /// salary.sum + /// // sum("salary") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var sum: Expression { + return wrap(self) + } + + /// Builds a copy of the expression wrapped with the `total` aggregate + /// function. + /// + /// let salary = Expression("salary") + /// salary.total + /// // total("salary") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var total: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType == Int { + + static func count(_ star: Star) -> Expression { + return wrap(star(nil, nil)) + } + +} + +/// Builds an expression representing `count(*)` (when called with the `*` +/// function literal). +/// +/// count(*) +/// // count(*) +/// +/// - Returns: An expression returning `count(*)` (when called with the `*` +/// function literal). +public func count(_ star: Star) -> Expression { + return Expression.count(star) +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Collation.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Collation.swift new file mode 100644 index 0000000000..e2ff9d1006 --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Collation.swift @@ -0,0 +1,69 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +/// A collating function used to compare to strings. +/// +/// - SeeAlso: +public enum Collation { + + /// Compares string by raw data. + case binary + + /// Like binary, but folds uppercase ASCII letters into their lowercase + /// equivalents. + case nocase + + /// Like binary, but strips trailing space. + case rtrim + + /// A custom collating sequence identified by the given string, registered + /// using `Database.create(collation:…)` + case custom(String) + +} + +extension Collation : Expressible { + + public var expression: Expression { + return Expression(literal: description) + } + +} + +extension Collation : CustomStringConvertible { + + public var description : String { + switch self { + case .binary: + return "BINARY" + case .nocase: + return "NOCASE" + case .rtrim: + return "RTRIM" + case .custom(let collation): + return collation.quote() + } + } + +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift new file mode 100644 index 0000000000..9d17a326bc --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift @@ -0,0 +1,683 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation.NSData + + +extension ExpressionType where UnderlyingType : Number { + + /// Builds a copy of the expression wrapped with the `abs` function. + /// + /// let x = Expression("x") + /// x.absoluteValue + /// // abs("x") + /// + /// - Returns: A copy of the expression wrapped with the `abs` function. + public var absoluteValue : Expression { + return "abs".wrap(self) + } + +} + +extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Number { + + /// Builds a copy of the expression wrapped with the `abs` function. + /// + /// let x = Expression("x") + /// x.absoluteValue + /// // abs("x") + /// + /// - Returns: A copy of the expression wrapped with the `abs` function. + public var absoluteValue : Expression { + return "abs".wrap(self) + } + +} + +extension ExpressionType where UnderlyingType == Double { + + /// Builds a copy of the expression wrapped with the `round` function. + /// + /// let salary = Expression("salary") + /// salary.round() + /// // round("salary") + /// salary.round(2) + /// // round("salary", 2) + /// + /// - Returns: A copy of the expression wrapped with the `round` function. + public func round(_ precision: Int? = nil) -> Expression { + guard let precision = precision else { + return wrap([self]) + } + return wrap([self, Int(precision)]) + } + +} + +extension ExpressionType where UnderlyingType == Double? { + + /// Builds a copy of the expression wrapped with the `round` function. + /// + /// let salary = Expression("salary") + /// salary.round() + /// // round("salary") + /// salary.round(2) + /// // round("salary", 2) + /// + /// - Returns: A copy of the expression wrapped with the `round` function. + public func round(_ precision: Int? = nil) -> Expression { + guard let precision = precision else { + return wrap(self) + } + return wrap([self, Int(precision)]) + } + +} + +extension ExpressionType where UnderlyingType : Value, UnderlyingType.Datatype == Int64 { + + /// Builds an expression representing the `random` function. + /// + /// Expression.random() + /// // random() + /// + /// - Returns: An expression calling the `random` function. + public static func random() -> Expression { + return "random".wrap([]) + } + +} + +extension ExpressionType where UnderlyingType == Data { + + /// Builds an expression representing the `randomblob` function. + /// + /// Expression.random(16) + /// // randomblob(16) + /// + /// - Parameter length: Length in bytes. + /// + /// - Returns: An expression calling the `randomblob` function. + public static func random(_ length: Int) -> Expression { + return "randomblob".wrap([]) + } + + /// Builds an expression representing the `zeroblob` function. + /// + /// Expression.allZeros(16) + /// // zeroblob(16) + /// + /// - Parameter length: Length in bytes. + /// + /// - Returns: An expression calling the `zeroblob` function. + public static func allZeros(_ length: Int) -> Expression { + return "zeroblob".wrap([]) + } + + /// Builds a copy of the expression wrapped with the `length` function. + /// + /// let data = Expression("data") + /// data.length + /// // length("data") + /// + /// - Returns: A copy of the expression wrapped with the `length` function. + public var length: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType == Data? { + + /// Builds a copy of the expression wrapped with the `length` function. + /// + /// let data = Expression("data") + /// data.length + /// // length("data") + /// + /// - Returns: A copy of the expression wrapped with the `length` function. + public var length: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType == String { + + /// Builds a copy of the expression wrapped with the `length` function. + /// + /// let name = Expression("name") + /// name.length + /// // length("name") + /// + /// - Returns: A copy of the expression wrapped with the `length` function. + public var length: Expression { + return wrap(self) + } + + /// Builds a copy of the expression wrapped with the `lower` function. + /// + /// let name = Expression("name") + /// name.lowercaseString + /// // lower("name") + /// + /// - Returns: A copy of the expression wrapped with the `lower` function. + public var lowercaseString: Expression { + return "lower".wrap(self) + } + + /// Builds a copy of the expression wrapped with the `upper` function. + /// + /// let name = Expression("name") + /// name.uppercaseString + /// // lower("name") + /// + /// - Returns: A copy of the expression wrapped with the `upper` function. + public var uppercaseString: Expression { + return "upper".wrap(self) + } + + /// Builds a copy of the expression appended with a `LIKE` query against the + /// given pattern. + /// + /// let email = Expression("email") + /// email.like("%@example.com") + /// // "email" LIKE '%@example.com' + /// email.like("99\\%@%", escape: "\\") + /// // "email" LIKE '99\%@%' ESCAPE '\' + /// + /// - Parameters: + /// + /// - pattern: A pattern to match. + /// + /// - escape: An (optional) character designated for escaping + /// pattern-matching characters (*i.e.*, the `%` and `_` characters). + /// + /// - Returns: A copy of the expression appended with a `LIKE` query against + /// the given pattern. + public func like(_ pattern: String, escape character: Character? = nil) -> Expression { + guard let character = character else { + return "LIKE".infix(self, pattern) + } + return Expression("(\(template) LIKE ? ESCAPE ?)", bindings + [pattern, String(character)]) + } + + /// Builds a copy of the expression appended with a `GLOB` query against the + /// given pattern. + /// + /// let path = Expression("path") + /// path.glob("*.png") + /// // "path" GLOB '*.png' + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression appended with a `GLOB` query against + /// the given pattern. + public func glob(_ pattern: String) -> Expression { + return "GLOB".infix(self, pattern) + } + + /// Builds a copy of the expression appended with a `MATCH` query against + /// the given pattern. + /// + /// let title = Expression("title") + /// title.match("swift AND programming") + /// // "title" MATCH 'swift AND programming' + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression appended with a `MATCH` query + /// against the given pattern. + public func match(_ pattern: String) -> Expression { + return "MATCH".infix(self, pattern) + } + + /// Builds a copy of the expression appended with a `REGEXP` query against + /// the given pattern. + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression appended with a `REGEXP` query + /// against the given pattern. + public func regexp(_ pattern: String) -> Expression { + return "REGEXP".infix(self, pattern) + } + + /// Builds a copy of the expression appended with a `COLLATE` clause with + /// the given sequence. + /// + /// let name = Expression("name") + /// name.collate(.Nocase) + /// // "name" COLLATE NOCASE + /// + /// - Parameter collation: A collating sequence. + /// + /// - Returns: A copy of the expression appended with a `COLLATE` clause + /// with the given sequence. + public func collate(_ collation: Collation) -> Expression { + return "COLLATE".infix(self, collation) + } + + /// Builds a copy of the expression wrapped with the `ltrim` function. + /// + /// let name = Expression("name") + /// name.ltrim() + /// // ltrim("name") + /// name.ltrim([" ", "\t"]) + /// // ltrim("name", ' \t') + /// + /// - Parameter characters: A set of characters to trim. + /// + /// - Returns: A copy of the expression wrapped with the `ltrim` function. + public func ltrim(_ characters: Set? = nil) -> Expression { + guard let characters = characters else { + return wrap(self) + } + return wrap([self, String(characters)]) + } + + /// Builds a copy of the expression wrapped with the `rtrim` function. + /// + /// let name = Expression("name") + /// name.rtrim() + /// // rtrim("name") + /// name.rtrim([" ", "\t"]) + /// // rtrim("name", ' \t') + /// + /// - Parameter characters: A set of characters to trim. + /// + /// - Returns: A copy of the expression wrapped with the `rtrim` function. + public func rtrim(_ characters: Set? = nil) -> Expression { + guard let characters = characters else { + return wrap(self) + } + return wrap([self, String(characters)]) + } + + /// Builds a copy of the expression wrapped with the `trim` function. + /// + /// let name = Expression("name") + /// name.trim() + /// // trim("name") + /// name.trim([" ", "\t"]) + /// // trim("name", ' \t') + /// + /// - Parameter characters: A set of characters to trim. + /// + /// - Returns: A copy of the expression wrapped with the `trim` function. + public func trim(_ characters: Set? = nil) -> Expression { + guard let characters = characters else { + return wrap([self]) + } + return wrap([self, String(characters)]) + } + + /// Builds a copy of the expression wrapped with the `replace` function. + /// + /// let email = Expression("email") + /// email.replace("@mac.com", with: "@icloud.com") + /// // replace("email", '@mac.com', '@icloud.com') + /// + /// - Parameters: + /// + /// - pattern: A pattern to match. + /// + /// - replacement: The replacement string. + /// + /// - Returns: A copy of the expression wrapped with the `replace` function. + public func replace(_ pattern: String, with replacement: String) -> Expression { + return "replace".wrap([self, pattern, replacement]) + } + + public func substring(_ location: Int, length: Int? = nil) -> Expression { + guard let length = length else { + return "substr".wrap([self, location]) + } + return "substr".wrap([self, location, length]) + } + + public subscript(range: Range) -> Expression { + return substring(range.lowerBound, length: range.upperBound - range.lowerBound) + } + +} + +extension ExpressionType where UnderlyingType == String? { + + /// Builds a copy of the expression wrapped with the `length` function. + /// + /// let name = Expression("name") + /// name.length + /// // length("name") + /// + /// - Returns: A copy of the expression wrapped with the `length` function. + public var length: Expression { + return wrap(self) + } + + /// Builds a copy of the expression wrapped with the `lower` function. + /// + /// let name = Expression("name") + /// name.lowercaseString + /// // lower("name") + /// + /// - Returns: A copy of the expression wrapped with the `lower` function. + public var lowercaseString: Expression { + return "lower".wrap(self) + } + + /// Builds a copy of the expression wrapped with the `upper` function. + /// + /// let name = Expression("name") + /// name.uppercaseString + /// // lower("name") + /// + /// - Returns: A copy of the expression wrapped with the `upper` function. + public var uppercaseString: Expression { + return "upper".wrap(self) + } + + /// Builds a copy of the expression appended with a `LIKE` query against the + /// given pattern. + /// + /// let email = Expression("email") + /// email.like("%@example.com") + /// // "email" LIKE '%@example.com' + /// email.like("99\\%@%", escape: "\\") + /// // "email" LIKE '99\%@%' ESCAPE '\' + /// + /// - Parameters: + /// + /// - pattern: A pattern to match. + /// + /// - escape: An (optional) character designated for escaping + /// pattern-matching characters (*i.e.*, the `%` and `_` characters). + /// + /// - Returns: A copy of the expression appended with a `LIKE` query against + /// the given pattern. + public func like(_ pattern: String, escape character: Character? = nil) -> Expression { + guard let character = character else { + return "LIKE".infix(self, pattern) + } + return Expression("(\(template) LIKE ? ESCAPE ?)", bindings + [pattern, String(character)]) + } + + /// Builds a copy of the expression appended with a `GLOB` query against the + /// given pattern. + /// + /// let path = Expression("path") + /// path.glob("*.png") + /// // "path" GLOB '*.png' + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression appended with a `GLOB` query against + /// the given pattern. + public func glob(_ pattern: String) -> Expression { + return "GLOB".infix(self, pattern) + } + + /// Builds a copy of the expression appended with a `MATCH` query against + /// the given pattern. + /// + /// let title = Expression("title") + /// title.match("swift AND programming") + /// // "title" MATCH 'swift AND programming' + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression appended with a `MATCH` query + /// against the given pattern. + public func match(_ pattern: String) -> Expression { + return "MATCH".infix(self, pattern) + } + + /// Builds a copy of the expression appended with a `REGEXP` query against + /// the given pattern. + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression appended with a `REGEXP` query + /// against the given pattern. + public func regexp(_ pattern: String) -> Expression { + return "REGEXP".infix(self, pattern) + } + + /// Builds a copy of the expression appended with a `COLLATE` clause with + /// the given sequence. + /// + /// let name = Expression("name") + /// name.collate(.Nocase) + /// // "name" COLLATE NOCASE + /// + /// - Parameter collation: A collating sequence. + /// + /// - Returns: A copy of the expression appended with a `COLLATE` clause + /// with the given sequence. + public func collate(_ collation: Collation) -> Expression { + return "COLLATE".infix(self, collation) + } + + /// Builds a copy of the expression wrapped with the `ltrim` function. + /// + /// let name = Expression("name") + /// name.ltrim() + /// // ltrim("name") + /// name.ltrim([" ", "\t"]) + /// // ltrim("name", ' \t') + /// + /// - Parameter characters: A set of characters to trim. + /// + /// - Returns: A copy of the expression wrapped with the `ltrim` function. + public func ltrim(_ characters: Set? = nil) -> Expression { + guard let characters = characters else { + return wrap(self) + } + return wrap([self, String(characters)]) + } + + /// Builds a copy of the expression wrapped with the `rtrim` function. + /// + /// let name = Expression("name") + /// name.rtrim() + /// // rtrim("name") + /// name.rtrim([" ", "\t"]) + /// // rtrim("name", ' \t') + /// + /// - Parameter characters: A set of characters to trim. + /// + /// - Returns: A copy of the expression wrapped with the `rtrim` function. + public func rtrim(_ characters: Set? = nil) -> Expression { + guard let characters = characters else { + return wrap(self) + } + return wrap([self, String(characters)]) + } + + /// Builds a copy of the expression wrapped with the `trim` function. + /// + /// let name = Expression("name") + /// name.trim() + /// // trim("name") + /// name.trim([" ", "\t"]) + /// // trim("name", ' \t') + /// + /// - Parameter characters: A set of characters to trim. + /// + /// - Returns: A copy of the expression wrapped with the `trim` function. + public func trim(_ characters: Set? = nil) -> Expression { + guard let characters = characters else { + return wrap(self) + } + return wrap([self, String(characters)]) + } + + /// Builds a copy of the expression wrapped with the `replace` function. + /// + /// let email = Expression("email") + /// email.replace("@mac.com", with: "@icloud.com") + /// // replace("email", '@mac.com', '@icloud.com') + /// + /// - Parameters: + /// + /// - pattern: A pattern to match. + /// + /// - replacement: The replacement string. + /// + /// - Returns: A copy of the expression wrapped with the `replace` function. + public func replace(_ pattern: String, with replacement: String) -> Expression { + return "replace".wrap([self, pattern, replacement]) + } + + /// Builds a copy of the expression wrapped with the `substr` function. + /// + /// let title = Expression("title") + /// title.substr(-100) + /// // substr("title", -100) + /// title.substr(0, length: 100) + /// // substr("title", 0, 100) + /// + /// - Parameters: + /// + /// - location: The substring’s start index. + /// + /// - length: An optional substring length. + /// + /// - Returns: A copy of the expression wrapped with the `substr` function. + public func substring(_ location: Int, length: Int? = nil) -> Expression { + guard let length = length else { + return "substr".wrap([self, location]) + } + return "substr".wrap([self, location, length]) + } + + /// Builds a copy of the expression wrapped with the `substr` function. + /// + /// let title = Expression("title") + /// title[0..<100] + /// // substr("title", 0, 100) + /// + /// - Parameter range: The character index range of the substring. + /// + /// - Returns: A copy of the expression wrapped with the `substr` function. + public subscript(range: Range) -> Expression { + return substring(range.lowerBound, length: range.upperBound - range.lowerBound) + } + +} + +extension Collection where Iterator.Element : Value, IndexDistance == Int { + + /// Builds a copy of the expression prepended with an `IN` check against the + /// collection. + /// + /// let name = Expression("name") + /// ["alice", "betty"].contains(name) + /// // "name" IN ('alice', 'betty') + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression prepended with an `IN` check against + /// the collection. + public func contains(_ expression: Expression) -> Expression { + let templates = [String](repeating: "?", count: count).joined(separator: ", ") + return "IN".infix(expression, Expression("(\(templates))", map { $0.datatypeValue })) + } + + /// Builds a copy of the expression prepended with an `IN` check against the + /// collection. + /// + /// let name = Expression("name") + /// ["alice", "betty"].contains(name) + /// // "name" IN ('alice', 'betty') + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression prepended with an `IN` check against + /// the collection. + public func contains(_ expression: Expression) -> Expression { + let templates = [String](repeating: "?", count: count).joined(separator: ", ") + return "IN".infix(expression, Expression("(\(templates))", map { $0.datatypeValue })) + } + +} + +/// Builds a copy of the given expressions wrapped with the `ifnull` function. +/// +/// let name = Expression("name") +/// name ?? "An Anonymous Coward" +/// // ifnull("name", 'An Anonymous Coward') +/// +/// - Parameters: +/// +/// - optional: An optional expression. +/// +/// - defaultValue: A fallback value for when the optional expression is +/// `nil`. +/// +/// - Returns: A copy of the given expressions wrapped with the `ifnull` +/// function. +public func ??(optional: Expression, defaultValue: V) -> Expression { + return "ifnull".wrap([optional, defaultValue]) +} + +/// Builds a copy of the given expressions wrapped with the `ifnull` function. +/// +/// let nick = Expression("nick") +/// let name = Expression("name") +/// nick ?? name +/// // ifnull("nick", "name") +/// +/// - Parameters: +/// +/// - optional: An optional expression. +/// +/// - defaultValue: A fallback expression for when the optional expression is +/// `nil`. +/// +/// - Returns: A copy of the given expressions wrapped with the `ifnull` +/// function. +public func ??(optional: Expression, defaultValue: Expression) -> Expression { + return "ifnull".wrap([optional, defaultValue]) +} + +/// Builds a copy of the given expressions wrapped with the `ifnull` function. +/// +/// let nick = Expression("nick") +/// let name = Expression("name") +/// nick ?? name +/// // ifnull("nick", "name") +/// +/// - Parameters: +/// +/// - optional: An optional expression. +/// +/// - defaultValue: A fallback expression for when the optional expression is +/// `nil`. +/// +/// - Returns: A copy of the given expressions wrapped with the `ifnull` +/// function. +public func ??(optional: Expression, defaultValue: Expression) -> Expression { + return "ifnull".wrap([optional, defaultValue]) +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift new file mode 100644 index 0000000000..64b54edb75 --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift @@ -0,0 +1,136 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +public extension Connection { + + /// Creates or redefines a custom SQL function. + /// + /// - Parameters: + /// + /// - function: The name of the function to create or redefine. + /// + /// - deterministic: Whether or not the function is deterministic (_i.e._ + /// the function always returns the same result for a given input). + /// + /// Default: `false` + /// + /// - block: A block of code to run when the function is called. + /// The assigned types must be explicit. + /// + /// - Returns: A closure returning an SQL expression to call the function. + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping () -> Z) throws -> (() -> Expression) { + let fn = try createFunction(function, 0, deterministic) { _ in block() } + return { fn([]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping () -> Z?) throws -> (() -> Expression) { + let fn = try createFunction(function, 0, deterministic) { _ in block() } + return { fn([]) } + } + + // MARK: - + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A) -> Z) throws -> ((Expression) -> Expression) { + let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0])) } + return { arg in fn([arg]) } + } + + public func createFunction(function: String, deterministic: Bool = false, _ block: @escaping (A?) -> Z) throws -> ((Expression) -> Expression) { + let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value)) } + return { arg in fn([arg]) } + } + + public func createFunction(function: String, deterministic: Bool = false, _ block: @escaping (A) -> Z?) throws -> ((Expression) -> Expression) { + let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0])) } + return { arg in fn([arg]) } + } + + public func createFunction(function: String, deterministic: Bool = false, _ block: @escaping (A?) -> Z?) throws -> ((Expression) -> Expression) { + let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value)) } + return { arg in fn([arg]) } + } + + // MARK: - + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B) -> Z) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), value(args[1])) } + return { a, b in fn([a, b]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B) -> Z) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), value(args[1])) } + return { a, b in fn([a, b]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B?) -> Z) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), args[1].map(value)) } + return { a, b in fn([a, b]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B) -> Z?) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), value(args[1])) } + return { a, b in fn([a, b]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B?) -> Z) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), args[1].map(value)) } + return { a, b in fn([a, b]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B) -> Z?) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), value(args[1])) } + return { a, b in fn([a, b]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B?) -> Z?) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), args[1].map(value)) } + return { a, b in fn([a, b]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B?) -> Z?) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), args[1].map(value)) } + return { a, b in fn([a, b]) } + } + + // MARK: - + + fileprivate func createFunction(_ function: String, _ argumentCount: UInt, _ deterministic: Bool, _ block: @escaping ([Binding?]) -> Z) throws -> (([Expressible]) -> Expression) { + createFunction(function, argumentCount: argumentCount, deterministic: deterministic) { arguments in + block(arguments).datatypeValue + } + return { arguments in + function.quote().wrap(", ".join(arguments)) + } + } + + fileprivate func createFunction(_ function: String, _ argumentCount: UInt, _ deterministic: Bool, _ block: @escaping ([Binding?]) -> Z?) throws -> (([Expressible]) -> Expression) { + createFunction(function, argumentCount: argumentCount, deterministic: deterministic) { arguments in + block(arguments)?.datatypeValue + } + return { arguments in + function.quote().wrap(", ".join(arguments)) + } + } + +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Expression.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Expression.swift new file mode 100644 index 0000000000..3198901c55 --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Expression.swift @@ -0,0 +1,147 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +public protocol ExpressionType : Expressible { // extensions cannot have inheritance clauses + + associatedtype UnderlyingType = Void + + var template: String { get } + var bindings: [Binding?] { get } + + init(_ template: String, _ bindings: [Binding?]) + +} + +extension ExpressionType { + + public init(literal: String) { + self.init(literal, []) + } + + public init(_ identifier: String) { + self.init(literal: identifier.quote()) + } + + public init(_ expression: U) { + self.init(expression.template, expression.bindings) + } + +} + +/// An `Expression` represents a raw SQL fragment and any associated bindings. +public struct Expression : ExpressionType { + + public typealias UnderlyingType = Datatype + + public var template: String + public var bindings: [Binding?] + + public init(_ template: String, _ bindings: [Binding?]) { + self.template = template + self.bindings = bindings + } + +} + +public protocol Expressible { + + var expression: Expression { get } + +} + +extension Expressible { + + // naïve compiler for statements that can’t be bound, e.g., CREATE TABLE + // FIXME: use @testable and make internal + public func asSQL() -> String { + let expressed = expression + var idx = 0 + return expressed.template.characters.reduce("") { template, character in + let transcoded: String + + if character == "?" { + transcoded = transcode(expressed.bindings[idx]) + idx += 1 + } else { + transcoded = String(character) + } + return template + transcoded + } + } + +} + +extension ExpressionType { + + public var expression: Expression { + return Expression(template, bindings) + } + + public var asc: Expressible { + return " ".join([self, Expression(literal: "ASC")]) + } + + public var desc: Expressible { + return " ".join([self, Expression(literal: "DESC")]) + } + +} + +extension ExpressionType where UnderlyingType : Value { + + public init(value: UnderlyingType) { + self.init("?", [value.datatypeValue]) + } + +} + +extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value { + + public static var null: Self { + return self.init(value: nil) + } + + public init(value: UnderlyingType.WrappedType?) { + self.init("?", [value?.datatypeValue]) + } + +} + +extension Value { + + public var expression: Expression { + return Expression(value: self).expression + } + +} + +public let rowid = Expression("ROWID") + +public func cast(_ expression: Expression) -> Expression { + return Expression("CAST (\(expression.template) AS \(U.declaredDatatype))", expression.bindings) +} + +public func cast(_ expression: Expression) -> Expression { + return Expression("CAST (\(expression.template) AS \(U.declaredDatatype))", expression.bindings) +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Operators.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Operators.swift new file mode 100644 index 0000000000..fdd293be71 --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Operators.swift @@ -0,0 +1,541 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +// TODO: use `@warn_unused_result` by the time operator functions support it + +public func +(lhs: Expression, rhs: Expression) -> Expression { + return "||".infix(lhs, rhs) +} + +public func +(lhs: Expression, rhs: Expression) -> Expression { + return "||".infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: Expression) -> Expression { + return "||".infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: Expression) -> Expression { + return "||".infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: String) -> Expression { + return "||".infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: String) -> Expression { + return "||".infix(lhs, rhs) +} +public func +(lhs: String, rhs: Expression) -> Expression { + return "||".infix(lhs, rhs) +} +public func +(lhs: String, rhs: Expression) -> Expression { + return "||".infix(lhs, rhs) +} + +// MARK: - + +public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func +(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func +(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} + +public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func -(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func -(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func -(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func -(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} + +public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func *(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func *(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func *(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func *(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} + +public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func /(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func /(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func /(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func /(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} + +public prefix func -(rhs: Expression) -> Expression where V.Datatype : Number { + return wrap(rhs) +} +public prefix func -(rhs: Expression) -> Expression where V.Datatype : Number { + return wrap(rhs) +} + +// MARK: - + +public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func %(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func %(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func %(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func %(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} + +public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func <<(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func <<(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func <<(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func <<(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} + +public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func >>(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func >>(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func >>(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func >>(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} + +public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func &(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func &(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func &(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func &(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} + +public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func |(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func |(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func |(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func |(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} + +public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} +public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} +public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} +public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} +public func ^(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} +public func ^(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} +public func ^(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} +public func ^(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} + +public prefix func ~(rhs: Expression) -> Expression where V.Datatype == Int64 { + return wrap(rhs) +} +public prefix func ~(rhs: Expression) -> Expression where V.Datatype == Int64 { + return wrap(rhs) +} + +// MARK: - + +public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return "=".infix(lhs, rhs) +} +public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return "=".infix(lhs, rhs) +} +public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return "=".infix(lhs, rhs) +} +public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return "=".infix(lhs, rhs) +} +public func ==(lhs: Expression, rhs: V) -> Expression where V.Datatype : Equatable { + return "=".infix(lhs, rhs) +} +public func ==(lhs: Expression, rhs: V?) -> Expression where V.Datatype : Equatable { + guard let rhs = rhs else { return "IS".infix(lhs, Expression(value: nil)) } + return "=".infix(lhs, rhs) +} +public func ==(lhs: V, rhs: Expression) -> Expression where V.Datatype : Equatable { + return "=".infix(lhs, rhs) +} +public func ==(lhs: V?, rhs: Expression) -> Expression where V.Datatype : Equatable { + guard let lhs = lhs else { return "IS".infix(Expression(value: nil), rhs) } + return "=".infix(lhs, rhs) +} + +public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return infix(lhs, rhs) +} +public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return infix(lhs, rhs) +} +public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return infix(lhs, rhs) +} +public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return infix(lhs, rhs) +} +public func !=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Equatable { + return infix(lhs, rhs) +} +public func !=(lhs: Expression, rhs: V?) -> Expression where V.Datatype : Equatable { + guard let rhs = rhs else { return "IS NOT".infix(lhs, Expression(value: nil)) } + return infix(lhs, rhs) +} +public func !=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Equatable { + return infix(lhs, rhs) +} +public func !=(lhs: V?, rhs: Expression) -> Expression where V.Datatype : Equatable { + guard let lhs = lhs else { return "IS NOT".infix(Expression(value: nil), rhs) } + return infix(lhs, rhs) +} + +public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} + +public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} + +public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} + +public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} + +public func ~=(lhs: ClosedRange, rhs: Expression) -> Expression where V.Datatype : Binding & Comparable { + return Expression("\(rhs.template) BETWEEN ? AND ?", rhs.bindings + [lhs.lowerBound as? Binding, lhs.upperBound as? Binding]) +} +public func ~=(lhs: ClosedRange, rhs: Expression) -> Expression where V.Datatype : Binding & Comparable { + return Expression("\(rhs.template) BETWEEN ? AND ?", rhs.bindings + [lhs.lowerBound as? Binding, lhs.upperBound as? Binding]) +} + +// MARK: - + +public func &&(lhs: Expression, rhs: Expression) -> Expression { + return "AND".infix(lhs, rhs) +} +public func &&(lhs: Expression, rhs: Expression) -> Expression { + return "AND".infix(lhs, rhs) +} +public func &&(lhs: Expression, rhs: Expression) -> Expression { + return "AND".infix(lhs, rhs) +} +public func &&(lhs: Expression, rhs: Expression) -> Expression { + return "AND".infix(lhs, rhs) +} +public func &&(lhs: Expression, rhs: Bool) -> Expression { + return "AND".infix(lhs, rhs) +} +public func &&(lhs: Expression, rhs: Bool) -> Expression { + return "AND".infix(lhs, rhs) +} +public func &&(lhs: Bool, rhs: Expression) -> Expression { + return "AND".infix(lhs, rhs) +} +public func &&(lhs: Bool, rhs: Expression) -> Expression { + return "AND".infix(lhs, rhs) +} + +public func ||(lhs: Expression, rhs: Expression) -> Expression { + return "OR".infix(lhs, rhs) +} +public func ||(lhs: Expression, rhs: Expression) -> Expression { + return "OR".infix(lhs, rhs) +} +public func ||(lhs: Expression, rhs: Expression) -> Expression { + return "OR".infix(lhs, rhs) +} +public func ||(lhs: Expression, rhs: Expression) -> Expression { + return "OR".infix(lhs, rhs) +} +public func ||(lhs: Expression, rhs: Bool) -> Expression { + return "OR".infix(lhs, rhs) +} +public func ||(lhs: Expression, rhs: Bool) -> Expression { + return "OR".infix(lhs, rhs) +} +public func ||(lhs: Bool, rhs: Expression) -> Expression { + return "OR".infix(lhs, rhs) +} +public func ||(lhs: Bool, rhs: Expression) -> Expression { + return "OR".infix(lhs, rhs) +} + +public prefix func !(rhs: Expression) -> Expression { + return "NOT ".wrap(rhs) +} +public prefix func !(rhs: Expression) -> Expression { + return "NOT ".wrap(rhs) +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Query.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Query.swift new file mode 100644 index 0000000000..c9d2ea9cc5 --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Query.swift @@ -0,0 +1,1162 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +public protocol QueryType : Expressible { + + var clauses: QueryClauses { get set } + + init(_ name: String, database: String?) + +} + +public protocol SchemaType : QueryType { + + static var identifier: String { get } + +} + +extension SchemaType { + + /// Builds a copy of the query with the `SELECT` clause applied. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// let email = Expression("email") + /// + /// users.select(id, email) + /// // SELECT "id", "email" FROM "users" + /// + /// - Parameter all: A list of expressions to select. + /// + /// - Returns: A query with the given `SELECT` clause applied. + public func select(_ column1: Expressible, _ more: Expressible...) -> Self { + return select(false, [column1] + more) + } + + /// Builds a copy of the query with the `SELECT DISTINCT` clause applied. + /// + /// let users = Table("users") + /// let email = Expression("email") + /// + /// users.select(distinct: email) + /// // SELECT DISTINCT "email" FROM "users" + /// + /// - Parameter columns: A list of expressions to select. + /// + /// - Returns: A query with the given `SELECT DISTINCT` clause applied. + public func select(distinct column1: Expressible, _ more: Expressible...) -> Self { + return select(true, [column1] + more) + } + + /// Builds a copy of the query with the `SELECT` clause applied. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// let email = Expression("email") + /// + /// users.select([id, email]) + /// // SELECT "id", "email" FROM "users" + /// + /// - Parameter all: A list of expressions to select. + /// + /// - Returns: A query with the given `SELECT` clause applied. + public func select(_ all: [Expressible]) -> Self { + return select(false, all) + } + + /// Builds a copy of the query with the `SELECT DISTINCT` clause applied. + /// + /// let users = Table("users") + /// let email = Expression("email") + /// + /// users.select(distinct: [email]) + /// // SELECT DISTINCT "email" FROM "users" + /// + /// - Parameter columns: A list of expressions to select. + /// + /// - Returns: A query with the given `SELECT DISTINCT` clause applied. + public func select(distinct columns: [Expressible]) -> Self { + return select(true, columns) + } + + /// Builds a copy of the query with the `SELECT *` clause applied. + /// + /// let users = Table("users") + /// + /// users.select(*) + /// // SELECT * FROM "users" + /// + /// - Parameter star: A star literal. + /// + /// - Returns: A query with the given `SELECT *` clause applied. + public func select(_ star: Star) -> Self { + return select([star(nil, nil)]) + } + + /// Builds a copy of the query with the `SELECT DISTINCT *` clause applied. + /// + /// let users = Table("users") + /// + /// users.select(distinct: *) + /// // SELECT DISTINCT * FROM "users" + /// + /// - Parameter star: A star literal. + /// + /// - Returns: A query with the given `SELECT DISTINCT *` clause applied. + public func select(distinct star: Star) -> Self { + return select(distinct: [star(nil, nil)]) + } + + /// Builds a scalar copy of the query with the `SELECT` clause applied. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// + /// users.select(id) + /// // SELECT "id" FROM "users" + /// + /// - Parameter all: A list of expressions to select. + /// + /// - Returns: A query with the given `SELECT` clause applied. + public func select(_ column: Expression) -> ScalarQuery { + return select(false, [column]) + } + public func select(_ column: Expression) -> ScalarQuery { + return select(false, [column]) + } + + /// Builds a scalar copy of the query with the `SELECT DISTINCT` clause + /// applied. + /// + /// let users = Table("users") + /// let email = Expression("email") + /// + /// users.select(distinct: email) + /// // SELECT DISTINCT "email" FROM "users" + /// + /// - Parameter column: A list of expressions to select. + /// + /// - Returns: A query with the given `SELECT DISTINCT` clause applied. + public func select(distinct column: Expression) -> ScalarQuery { + return select(true, [column]) + } + public func select(distinct column: Expression) -> ScalarQuery { + return select(true, [column]) + } + + public var count: ScalarQuery { + return select(Expression.count(*)) + } + +} + +extension QueryType { + + fileprivate func select(_ distinct: Bool, _ columns: [Expressible]) -> Q { + var query = Q.init(clauses.from.name, database: clauses.from.database) + query.clauses = clauses + query.clauses.select = (distinct, columns) + return query + } + + // MARK: JOIN + + /// Adds a `JOIN` clause to the query. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// let posts = Table("posts") + /// let userId = Expression("user_id") + /// + /// users.join(posts, on: posts[userId] == users[id]) + /// // SELECT * FROM "users" INNER JOIN "posts" ON ("posts"."user_id" = "users"."id") + /// + /// - Parameters: + /// + /// - table: A query representing the other table. + /// + /// - condition: A boolean expression describing the join condition. + /// + /// - Returns: A query with the given `JOIN` clause applied. + public func join(_ table: QueryType, on condition: Expression) -> Self { + return join(table, on: Expression(condition)) + } + + /// Adds a `JOIN` clause to the query. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// let posts = Table("posts") + /// let userId = Expression("user_id") + /// + /// users.join(posts, on: posts[userId] == users[id]) + /// // SELECT * FROM "users" INNER JOIN "posts" ON ("posts"."user_id" = "users"."id") + /// + /// - Parameters: + /// + /// - table: A query representing the other table. + /// + /// - condition: A boolean expression describing the join condition. + /// + /// - Returns: A query with the given `JOIN` clause applied. + public func join(_ table: QueryType, on condition: Expression) -> Self { + return join(.inner, table, on: condition) + } + + /// Adds a `JOIN` clause to the query. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// let posts = Table("posts") + /// let userId = Expression("user_id") + /// + /// users.join(.LeftOuter, posts, on: posts[userId] == users[id]) + /// // SELECT * FROM "users" LEFT OUTER JOIN "posts" ON ("posts"."user_id" = "users"."id") + /// + /// - Parameters: + /// + /// - type: The `JOIN` operator. + /// + /// - table: A query representing the other table. + /// + /// - condition: A boolean expression describing the join condition. + /// + /// - Returns: A query with the given `JOIN` clause applied. + public func join(_ type: JoinType, _ table: QueryType, on condition: Expression) -> Self { + return join(type, table, on: Expression(condition)) + } + + /// Adds a `JOIN` clause to the query. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// let posts = Table("posts") + /// let userId = Expression("user_id") + /// + /// users.join(.LeftOuter, posts, on: posts[userId] == users[id]) + /// // SELECT * FROM "users" LEFT OUTER JOIN "posts" ON ("posts"."user_id" = "users"."id") + /// + /// - Parameters: + /// + /// - type: The `JOIN` operator. + /// + /// - table: A query representing the other table. + /// + /// - condition: A boolean expression describing the join condition. + /// + /// - Returns: A query with the given `JOIN` clause applied. + public func join(_ type: JoinType, _ table: QueryType, on condition: Expression) -> Self { + var query = self + query.clauses.join.append((type: type, query: table, condition: table.clauses.filters.map { condition && $0 } ?? condition as Expressible)) + return query + } + + // MARK: WHERE + + /// Adds a condition to the query’s `WHERE` clause. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// + /// users.filter(id == 1) + /// // SELECT * FROM "users" WHERE ("id" = 1) + /// + /// - Parameter condition: A boolean expression to filter on. + /// + /// - Returns: A query with the given `WHERE` clause applied. + public func filter(_ predicate: Expression) -> Self { + return filter(Expression(predicate)) + } + + /// Adds a condition to the query’s `WHERE` clause. + /// + /// let users = Table("users") + /// let age = Expression("age") + /// + /// users.filter(age >= 35) + /// // SELECT * FROM "users" WHERE ("age" >= 35) + /// + /// - Parameter condition: A boolean expression to filter on. + /// + /// - Returns: A query with the given `WHERE` clause applied. + public func filter(_ predicate: Expression) -> Self { + var query = self + query.clauses.filters = query.clauses.filters.map { $0 && predicate } ?? predicate + return query + } + + /// Adds a condition to the query’s `WHERE` clause. + /// This is an alias for `filter(predicate)` + public func `where`(_ predicate: Expression) -> Self { + return `where`(Expression(predicate)) + } + + /// Adds a condition to the query’s `WHERE` clause. + /// This is an alias for `filter(predicate)` + public func `where`(_ predicate: Expression) -> Self { + return filter(predicate) + } + + // MARK: GROUP BY + + /// Sets a `GROUP BY` clause on the query. + /// + /// - Parameter by: A list of columns to group by. + /// + /// - Returns: A query with the given `GROUP BY` clause applied. + public func group(_ by: Expressible...) -> Self { + return group(by) + } + + /// Sets a `GROUP BY` clause on the query. + /// + /// - Parameter by: A list of columns to group by. + /// + /// - Returns: A query with the given `GROUP BY` clause applied. + public func group(_ by: [Expressible]) -> Self { + return group(by, nil) + } + + /// Sets a `GROUP BY`-`HAVING` clause on the query. + /// + /// - Parameters: + /// + /// - by: A column to group by. + /// + /// - having: A condition determining which groups are returned. + /// + /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. + public func group(_ by: Expressible, having: Expression) -> Self { + return group([by], having: having) + } + + /// Sets a `GROUP BY`-`HAVING` clause on the query. + /// + /// - Parameters: + /// + /// - by: A column to group by. + /// + /// - having: A condition determining which groups are returned. + /// + /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. + public func group(_ by: Expressible, having: Expression) -> Self { + return group([by], having: having) + } + + /// Sets a `GROUP BY`-`HAVING` clause on the query. + /// + /// - Parameters: + /// + /// - by: A list of columns to group by. + /// + /// - having: A condition determining which groups are returned. + /// + /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. + public func group(_ by: [Expressible], having: Expression) -> Self { + return group(by, Expression(having)) + } + + /// Sets a `GROUP BY`-`HAVING` clause on the query. + /// + /// - Parameters: + /// + /// - by: A list of columns to group by. + /// + /// - having: A condition determining which groups are returned. + /// + /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. + public func group(_ by: [Expressible], having: Expression) -> Self { + return group(by, having) + } + + fileprivate func group(_ by: [Expressible], _ having: Expression?) -> Self { + var query = self + query.clauses.group = (by, having) + return query + } + + // MARK: ORDER BY + + /// Sets an `ORDER BY` clause on the query. + /// + /// let users = Table("users") + /// let email = Expression("email") + /// let name = Expression("name") + /// + /// users.order(email.desc, name.asc) + /// // SELECT * FROM "users" ORDER BY "email" DESC, "name" ASC + /// + /// - Parameter by: An ordered list of columns and directions to sort by. + /// + /// - Returns: A query with the given `ORDER BY` clause applied. + public func order(_ by: Expressible...) -> Self { + return order(by) + } + + /// Sets an `ORDER BY` clause on the query. + /// + /// let users = Table("users") + /// let email = Expression("email") + /// let name = Expression("name") + /// + /// users.order([email.desc, name.asc]) + /// // SELECT * FROM "users" ORDER BY "email" DESC, "name" ASC + /// + /// - Parameter by: An ordered list of columns and directions to sort by. + /// + /// - Returns: A query with the given `ORDER BY` clause applied. + public func order(_ by: [Expressible]) -> Self { + var query = self + query.clauses.order = by + return query + } + + // MARK: LIMIT/OFFSET + + /// Sets the LIMIT clause (and resets any OFFSET clause) on the query. + /// + /// let users = Table("users") + /// + /// users.limit(20) + /// // SELECT * FROM "users" LIMIT 20 + /// + /// - Parameter length: The maximum number of rows to return (or `nil` to + /// return unlimited rows). + /// + /// - Returns: A query with the given LIMIT clause applied. + public func limit(_ length: Int?) -> Self { + return limit(length, nil) + } + + /// Sets LIMIT and OFFSET clauses on the query. + /// + /// let users = Table("users") + /// + /// users.limit(20, offset: 20) + /// // SELECT * FROM "users" LIMIT 20 OFFSET 20 + /// + /// - Parameters: + /// + /// - length: The maximum number of rows to return. + /// + /// - offset: The number of rows to skip. + /// + /// - Returns: A query with the given LIMIT and OFFSET clauses applied. + public func limit(_ length: Int, offset: Int) -> Self { + return limit(length, offset) + } + + // prevents limit(nil, offset: 5) + fileprivate func limit(_ length: Int?, _ offset: Int?) -> Self { + var query = self + query.clauses.limit = length.map { ($0, offset) } + return query + } + + // MARK: - Clauses + // + // MARK: SELECT + + // MARK: - + + fileprivate var selectClause: Expressible { + return " ".join([ + Expression(literal: clauses.select.distinct ? "SELECT DISTINCT" : "SELECT"), + ", ".join(clauses.select.columns), + Expression(literal: "FROM"), + tableName(alias: true) + ]) + } + + fileprivate var joinClause: Expressible? { + guard !clauses.join.isEmpty else { + return nil + } + + return " ".join(clauses.join.map { type, query, condition in + " ".join([ + Expression(literal: "\(type.rawValue) JOIN"), + query.tableName(alias: true), + Expression(literal: "ON"), + condition + ]) + }) + } + + fileprivate var whereClause: Expressible? { + guard let filters = clauses.filters else { + return nil + } + + return " ".join([ + Expression(literal: "WHERE"), + filters + ]) + } + + fileprivate var groupByClause: Expressible? { + guard let group = clauses.group else { + return nil + } + + let groupByClause = " ".join([ + Expression(literal: "GROUP BY"), + ", ".join(group.by) + ]) + + guard let having = group.having else { + return groupByClause + } + + return " ".join([ + groupByClause, + " ".join([ + Expression(literal: "HAVING"), + having + ]) + ]) + } + + fileprivate var orderClause: Expressible? { + guard !clauses.order.isEmpty else { + return nil + } + + return " ".join([ + Expression(literal: "ORDER BY"), + ", ".join(clauses.order) + ]) + } + + fileprivate var limitOffsetClause: Expressible? { + guard let limit = clauses.limit else { + return nil + } + + let limitClause = Expression(literal: "LIMIT \(limit.length)") + + guard let offset = limit.offset else { + return limitClause + } + + return " ".join([ + limitClause, + Expression(literal: "OFFSET \(offset)") + ]) + } + + // MARK: - + + public func alias(_ aliasName: String) -> Self { + var query = self + query.clauses.from = (clauses.from.name, aliasName, clauses.from.database) + return query + } + + // MARK: - Operations + // + // MARK: INSERT + + public func insert(_ value: Setter, _ more: Setter...) -> Insert { + return insert([value] + more) + } + + public func insert(_ values: [Setter]) -> Insert { + return insert(nil, values) + } + + public func insert(or onConflict: OnConflict, _ values: Setter...) -> Insert { + return insert(or: onConflict, values) + } + + public func insert(or onConflict: OnConflict, _ values: [Setter]) -> Insert { + return insert(onConflict, values) + } + + fileprivate func insert(_ or: OnConflict?, _ values: [Setter]) -> Insert { + let insert = values.reduce((columns: [Expressible](), values: [Expressible]())) { insert, setter in + (insert.columns + [setter.column], insert.values + [setter.value]) + } + + let clauses: [Expressible?] = [ + Expression(literal: "INSERT"), + or.map { Expression(literal: "OR \($0.rawValue)") }, + Expression(literal: "INTO"), + tableName(), + "".wrap(insert.columns) as Expression, + Expression(literal: "VALUES"), + "".wrap(insert.values) as Expression, + whereClause + ] + + return Insert(" ".join(clauses.flatMap { $0 }).expression) + } + + /// Runs an `INSERT` statement against the query with `DEFAULT VALUES`. + public func insert() -> Insert { + return Insert(" ".join([ + Expression(literal: "INSERT INTO"), + tableName(), + Expression(literal: "DEFAULT VALUES") + ]).expression) + } + + /// Runs an `INSERT` statement against the query with the results of another + /// query. + /// + /// - Parameter query: A query to `SELECT` results from. + /// + /// - Returns: The number of updated rows and statement. + public func insert(_ query: QueryType) -> Update { + return Update(" ".join([ + Expression(literal: "INSERT INTO"), + tableName(), + query.expression + ]).expression) + } + + // MARK: UPDATE + + public func update(_ values: Setter...) -> Update { + return update(values) + } + + public func update(_ values: [Setter]) -> Update { + let clauses: [Expressible?] = [ + Expression(literal: "UPDATE"), + tableName(), + Expression(literal: "SET"), + ", ".join(values.map { " = ".join([$0.column, $0.value]) }), + whereClause + ] + + return Update(" ".join(clauses.flatMap { $0 }).expression) + } + + // MARK: DELETE + + public func delete() -> Delete { + let clauses: [Expressible?] = [ + Expression(literal: "DELETE FROM"), + tableName(), + whereClause + ] + + return Delete(" ".join(clauses.flatMap { $0 }).expression) + } + + // MARK: EXISTS + + public var exists: Select { + return Select(" ".join([ + Expression(literal: "SELECT EXISTS"), + "".wrap(expression) as Expression + ]).expression) + } + + // MARK: - + + /// Prefixes a column expression with the query’s table name or alias. + /// + /// - Parameter column: A column expression. + /// + /// - Returns: A column expression namespaced with the query’s table name or + /// alias. + public func namespace(_ column: Expression) -> Expression { + return Expression(".".join([tableName(), column]).expression) + } + + // FIXME: rdar://problem/18673897 // subscript… + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + + /// Prefixes a star with the query’s table name or alias. + /// + /// - Parameter star: A literal `*`. + /// + /// - Returns: A `*` expression namespaced with the query’s table name or + /// alias. + public subscript(star: Star) -> Expression { + return namespace(star(nil, nil)) + } + + // MARK: - + + // TODO: alias support + func tableName(alias aliased: Bool = false) -> Expressible { + guard let alias = clauses.from.alias , aliased else { + return database(namespace: clauses.from.alias ?? clauses.from.name) + } + + return " ".join([ + database(namespace: clauses.from.name), + Expression(literal: "AS"), + Expression(alias) + ]) + } + + func tableName(qualified: Bool) -> Expressible { + if qualified { + return tableName() + } + return Expression(clauses.from.alias ?? clauses.from.name) + } + + func database(namespace name: String) -> Expressible { + let name = Expression(name) + + guard let database = clauses.from.database else { + return name + } + + return ".".join([Expression(database), name]) + } + + public var expression: Expression { + let clauses: [Expressible?] = [ + selectClause, + joinClause, + whereClause, + groupByClause, + orderClause, + limitOffsetClause + ] + + return " ".join(clauses.flatMap { $0 }).expression + } + +} + +// TODO: decide: simplify the below with a boxed type instead + +/// Queries a collection of chainable helper functions and expressions to build +/// executable SQL statements. +public struct Table : SchemaType { + + public static let identifier = "TABLE" + + public var clauses: QueryClauses + + public init(_ name: String, database: String? = nil) { + clauses = QueryClauses(name, alias: nil, database: database) + } + +} + +public struct View : SchemaType { + + public static let identifier = "VIEW" + + public var clauses: QueryClauses + + public init(_ name: String, database: String? = nil) { + clauses = QueryClauses(name, alias: nil, database: database) + } + +} + +public struct VirtualTable : SchemaType { + + public static let identifier = "VIRTUAL TABLE" + + public var clauses: QueryClauses + + public init(_ name: String, database: String? = nil) { + clauses = QueryClauses(name, alias: nil, database: database) + } + +} + +// TODO: make `ScalarQuery` work in `QueryType.select()`, `.filter()`, etc. + +public struct ScalarQuery : QueryType { + + public var clauses: QueryClauses + + public init(_ name: String, database: String? = nil) { + clauses = QueryClauses(name, alias: nil, database: database) + } + +} + +// TODO: decide: simplify the below with a boxed type instead + +public struct Select : ExpressionType { + + public var template: String + public var bindings: [Binding?] + + public init(_ template: String, _ bindings: [Binding?]) { + self.template = template + self.bindings = bindings + } + +} + +public struct Insert : ExpressionType { + + public var template: String + public var bindings: [Binding?] + + public init(_ template: String, _ bindings: [Binding?]) { + self.template = template + self.bindings = bindings + } + +} + +public struct Update : ExpressionType { + + public var template: String + public var bindings: [Binding?] + + public init(_ template: String, _ bindings: [Binding?]) { + self.template = template + self.bindings = bindings + } + +} + +public struct Delete : ExpressionType { + + public var template: String + public var bindings: [Binding?] + + public init(_ template: String, _ bindings: [Binding?]) { + self.template = template + self.bindings = bindings + } + +} + +extension Connection { + + public func prepare(_ query: QueryType) throws -> AnySequence { + let expression = query.expression + let statement = try prepare(expression.template, expression.bindings) + + let columnNames: [String: Int] = try { + var (columnNames, idx) = ([String: Int](), 0) + column: for each in query.clauses.select.columns { + var names = each.expression.template.characters.split { $0 == "." }.map(String.init) + let column = names.removeLast() + let namespace = names.joined(separator: ".") + + func expandGlob(_ namespace: Bool) -> ((QueryType) throws -> Void) { + return { (query: QueryType) throws -> (Void) in + var q = type(of: query).init(query.clauses.from.name, database: query.clauses.from.database) + q.clauses.select = query.clauses.select + let e = q.expression + var names = try self.prepare(e.template, e.bindings).columnNames.map { $0.quote() } + if namespace { names = names.map { "\(query.tableName().expression.template).\($0)" } } + for name in names { columnNames[name] = idx; idx += 1 } + } + } + + if column == "*" { + var select = query + select.clauses.select = (false, [Expression(literal: "*") as Expressible]) + let queries = [select] + query.clauses.join.map { $0.query } + if !namespace.isEmpty { + for q in queries { + if q.tableName().expression.template == namespace { + try expandGlob(true)(q) + continue column + } + } + fatalError("no such table: \(namespace)") + } + for q in queries { + try expandGlob(query.clauses.join.count > 0)(q) + } + continue + } + + columnNames[each.expression.template] = idx + idx += 1 + } + return columnNames + }() + + return AnySequence { + AnyIterator { statement.next().map { Row(columnNames, $0) } } + } + } + + public func scalar(_ query: ScalarQuery) throws -> V { + let expression = query.expression + return value(try scalar(expression.template, expression.bindings)) + } + + public func scalar(_ query: ScalarQuery) throws -> V.ValueType? { + let expression = query.expression + guard let value = try scalar(expression.template, expression.bindings) as? V.Datatype else { return nil } + return V.fromDatatypeValue(value) + } + + public func scalar(_ query: Select) throws -> V { + let expression = query.expression + return value(try scalar(expression.template, expression.bindings)) + } + + public func scalar(_ query: Select) throws -> V.ValueType? { + let expression = query.expression + guard let value = try scalar(expression.template, expression.bindings) as? V.Datatype else { return nil } + return V.fromDatatypeValue(value) + } + + public func pluck(_ query: QueryType) throws -> Row? { + return try prepare(query.limit(1, query.clauses.limit?.offset)).makeIterator().next() + } + + /// Runs an `Insert` query. + /// + /// - SeeAlso: `QueryType.insert(value:_:)` + /// - SeeAlso: `QueryType.insert(values:)` + /// - SeeAlso: `QueryType.insert(or:_:)` + /// - SeeAlso: `QueryType.insert()` + /// + /// - Parameter query: An insert query. + /// + /// - Returns: The insert’s rowid. + @discardableResult public func run(_ query: Insert) throws -> Int64 { + let expression = query.expression + return try sync { + try self.run(expression.template, expression.bindings) + return self.lastInsertRowid + } + } + + /// Runs an `Update` query. + /// + /// - SeeAlso: `QueryType.insert(query:)` + /// - SeeAlso: `QueryType.update(values:)` + /// + /// - Parameter query: An update query. + /// + /// - Returns: The number of updated rows. + @discardableResult public func run(_ query: Update) throws -> Int { + let expression = query.expression + return try sync { + try self.run(expression.template, expression.bindings) + return self.changes + } + } + + /// Runs a `Delete` query. + /// + /// - SeeAlso: `QueryType.delete()` + /// + /// - Parameter query: A delete query. + /// + /// - Returns: The number of deleted rows. + @discardableResult public func run(_ query: Delete) throws -> Int { + let expression = query.expression + return try sync { + try self.run(expression.template, expression.bindings) + return self.changes + } + } + +} + +public struct Row { + + fileprivate let columnNames: [String: Int] + + fileprivate let values: [Binding?] + + fileprivate init(_ columnNames: [String: Int], _ values: [Binding?]) { + self.columnNames = columnNames + self.values = values + } + + /// Returns a row’s value for the given column. + /// + /// - Parameter column: An expression representing a column selected in a Query. + /// + /// - Returns: The value for the given column. + public func get(_ column: Expression) -> V { + return get(Expression(column))! + } + public func get(_ column: Expression) -> V? { + func valueAtIndex(_ idx: Int) -> V? { + guard let value = values[idx] as? V.Datatype else { return nil } + return (V.fromDatatypeValue(value) as? V)! + } + + guard let idx = columnNames[column.template] else { + let similar = Array(columnNames.keys).filter { $0.hasSuffix(".\(column.template)") } + + switch similar.count { + case 0: + fatalError("no such column '\(column.template)' in columns: \(columnNames.keys.sorted())") + case 1: + return valueAtIndex(columnNames[similar[0]]!) + default: + fatalError("ambiguous column '\(column.template)' (please disambiguate: \(similar))") + } + } + + return valueAtIndex(idx) + } + + // FIXME: rdar://problem/18673897 // subscript… + + public subscript(column: Expression) -> Blob { + return get(column) + } + public subscript(column: Expression) -> Blob? { + return get(column) + } + + public subscript(column: Expression) -> Bool { + return get(column) + } + public subscript(column: Expression) -> Bool? { + return get(column) + } + + public subscript(column: Expression) -> Double { + return get(column) + } + public subscript(column: Expression) -> Double? { + return get(column) + } + + public subscript(column: Expression) -> Int { + return get(column) + } + public subscript(column: Expression) -> Int? { + return get(column) + } + + public subscript(column: Expression) -> Int64 { + return get(column) + } + public subscript(column: Expression) -> Int64? { + return get(column) + } + + public subscript(column: Expression) -> String { + return get(column) + } + public subscript(column: Expression) -> String? { + return get(column) + } + +} + +/// Determines the join operator for a query’s `JOIN` clause. +public enum JoinType : String { + + /// A `CROSS` join. + case cross = "CROSS" + + /// An `INNER` join. + case inner = "INNER" + + /// A `LEFT OUTER` join. + case leftOuter = "LEFT OUTER" + +} + +/// ON CONFLICT resolutions. +public enum OnConflict: String { + + case replace = "REPLACE" + + case rollback = "ROLLBACK" + + case abort = "ABORT" + + case fail = "FAIL" + + case ignore = "IGNORE" + +} + +// MARK: - Private + +public struct QueryClauses { + + var select = (distinct: false, columns: [Expression(literal: "*") as Expressible]) + + var from: (name: String, alias: String?, database: String?) + + var join = [(type: JoinType, query: QueryType, condition: Expressible)]() + + var filters: Expression? + + var group: (by: [Expressible], having: Expression?)? + + var order = [Expressible]() + + var limit: (length: Int, offset: Int?)? + + fileprivate init(_ name: String, alias: String?, database: String?) { + self.from = (name, alias, database) + } + +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Schema.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Schema.swift new file mode 100644 index 0000000000..1388170e47 --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Schema.swift @@ -0,0 +1,519 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +extension SchemaType { + + // MARK: - DROP TABLE / VIEW / VIRTUAL TABLE + + public func drop(ifExists: Bool = false) -> String { + return drop("TABLE", tableName(), ifExists) + } + +} + +extension Table { + + // MARK: - CREATE TABLE + + public func create(temporary: Bool = false, ifNotExists: Bool = false, block: (TableBuilder) -> Void) -> String { + let builder = TableBuilder() + + block(builder) + + let clauses: [Expressible?] = [ + create(Table.identifier, tableName(), temporary ? .Temporary : nil, ifNotExists), + "".wrap(builder.definitions) as Expression + ] + + return " ".join(clauses.flatMap { $0 }).asSQL() + } + + public func create(_ query: QueryType, temporary: Bool = false, ifNotExists: Bool = false) -> String { + let clauses: [Expressible?] = [ + create(Table.identifier, tableName(), temporary ? .Temporary : nil, ifNotExists), + Expression(literal: "AS"), + query + ] + + return " ".join(clauses.flatMap { $0 }).asSQL() + } + + // MARK: - ALTER TABLE … ADD COLUMN + + public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V) -> String { + return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, nil)) + } + + public func addColumn(_ name: Expression, check: Expression, defaultValue: V) -> String { + return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, nil)) + } + + public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V? = nil) -> String { + return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, nil)) + } + + public func addColumn(_ name: Expression, check: Expression, defaultValue: V? = nil) -> String { + return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, nil)) + } + + public func addColumn(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { + return addColumn(definition(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil)) + } + + public func addColumn(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { + return addColumn(definition(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil)) + } + + public func addColumn(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { + return addColumn(definition(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil)) + } + + public func addColumn(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { + return addColumn(definition(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil)) + } + + public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V, collate: Collation) -> String where V.Datatype == String { + return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, collate)) + } + + public func addColumn(_ name: Expression, check: Expression, defaultValue: V, collate: Collation) -> String where V.Datatype == String { + return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, collate)) + } + + public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V? = nil, collate: Collation) -> String where V.Datatype == String { + return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, collate)) + } + + public func addColumn(_ name: Expression, check: Expression, defaultValue: V? = nil, collate: Collation) -> String where V.Datatype == String { + return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, collate)) + } + + fileprivate func addColumn(_ expression: Expressible) -> String { + return " ".join([ + Expression(literal: "ALTER TABLE"), + tableName(), + Expression(literal: "ADD COLUMN"), + expression + ]).asSQL() + } + + // MARK: - ALTER TABLE … RENAME TO + + public func rename(_ to: Table) -> String { + return rename(to: to) + } + + // MARK: - CREATE INDEX + + public func createIndex(_ columns: Expressible...) -> String { + return createIndex(columns) + } + + public func createIndex(_ columns: [Expressible], unique: Bool = false, ifNotExists: Bool = false) -> String { + let clauses: [Expressible?] = [ + create("INDEX", indexName(columns), unique ? .Unique : nil, ifNotExists), + Expression(literal: "ON"), + tableName(qualified: false), + "".wrap(columns) as Expression + ] + + return " ".join(clauses.flatMap { $0 }).asSQL() + } + + // MARK: - DROP INDEX + + public func dropIndex(_ columns: Expressible...) -> String { + return dropIndex(columns) + } + + public func dropIndex(_ columns: [Expressible], ifExists: Bool = false) -> String { + return drop("INDEX", indexName(columns), ifExists) + } + + fileprivate func indexName(_ columns: [Expressible]) -> Expressible { + let string = (["index", clauses.from.name, "on"] + columns.map { $0.expression.template }).joined(separator: " ").lowercased() + + let index = string.characters.reduce("") { underscored, character in + guard character != "\"" else { + return underscored + } + guard "a"..."z" ~= character || "0"..."9" ~= character else { + return underscored + "_" + } + return underscored + String(character) + } + + return database(namespace: index) + } + +} + +extension View { + + // MARK: - CREATE VIEW + + public func create(_ query: QueryType, temporary: Bool = false, ifNotExists: Bool = false) -> String { + let clauses: [Expressible?] = [ + create(View.identifier, tableName(), temporary ? .Temporary : nil, ifNotExists), + Expression(literal: "AS"), + query + ] + + return " ".join(clauses.flatMap { $0 }).asSQL() + } + + // MARK: - DROP VIEW + + public func drop(ifExists: Bool = false) -> String { + return drop("VIEW", tableName(), ifExists) + } + +} + +extension VirtualTable { + + // MARK: - CREATE VIRTUAL TABLE + + public func create(_ using: Module, ifNotExists: Bool = false) -> String { + let clauses: [Expressible?] = [ + create(VirtualTable.identifier, tableName(), nil, ifNotExists), + Expression(literal: "USING"), + using + ] + + return " ".join(clauses.flatMap { $0 }).asSQL() + } + + // MARK: - ALTER TABLE … RENAME TO + + public func rename(_ to: VirtualTable) -> String { + return rename(to: to) + } + +} + +public final class TableBuilder { + + fileprivate var definitions = [Expressible]() + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil) { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V) { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil) { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V) { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil) { + column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression) { + column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V) { + column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil) { + column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression) { + column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V) { + column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, primaryKey: Bool, check: Expression? = nil, defaultValue: Expression? = nil) { + column(name, V.declaredDatatype, primaryKey ? .default : nil, false, false, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, primaryKey: Bool, check: Expression, defaultValue: Expression? = nil) { + column(name, V.declaredDatatype, primaryKey ? .default : nil, false, false, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, primaryKey: PrimaryKey, check: Expression? = nil) where V.Datatype == Int64 { + column(name, V.declaredDatatype, primaryKey, false, false, check, nil, nil, nil) + } + + public func column(_ name: Expression, primaryKey: PrimaryKey, check: Expression) where V.Datatype == Int64 { + column(name, V.declaredDatatype, primaryKey, false, false, check, nil, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { + column(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { + column(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { + column(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { + column(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + fileprivate func column(_ name: Expressible, _ datatype: String, _ primaryKey: PrimaryKey?, _ null: Bool, _ unique: Bool, _ check: Expressible?, _ defaultValue: Expressible?, _ references: (QueryType, Expressible)?, _ collate: Collation?) { + definitions.append(definition(name, datatype, primaryKey, null, unique, check, defaultValue, references, collate)) + } + + // MARK: - + + public func primaryKey(_ column: Expression) { + primaryKey([column]) + } + + public func primaryKey(_ compositeA: Expression, _ b: Expression) { + primaryKey([compositeA, b]) + } + + public func primaryKey(_ compositeA: Expression, _ b: Expression, _ c: Expression) { + primaryKey([compositeA, b, c]) + } + + fileprivate func primaryKey(_ composite: [Expressible]) { + definitions.append("PRIMARY KEY".prefix(composite)) + } + + public func unique(_ columns: Expressible...) { + unique(columns) + } + + public func unique(_ columns: [Expressible]) { + definitions.append("UNIQUE".prefix(columns)) + } + + public func check(_ condition: Expression) { + check(Expression(condition)) + } + + public func check(_ condition: Expression) { + definitions.append("CHECK".prefix(condition)) + } + + public enum Dependency: String { + + case noAction = "NO ACTION" + + case restrict = "RESTRICT" + + case setNull = "SET NULL" + + case setDefault = "SET DEFAULT" + + case cascade = "CASCADE" + + } + + public func foreignKey(_ column: Expression, references table: QueryType, _ other: Expression, update: Dependency? = nil, delete: Dependency? = nil) { + foreignKey(column, (table, other), update, delete) + } + + public func foreignKey(_ column: Expression, references table: QueryType, _ other: Expression, update: Dependency? = nil, delete: Dependency? = nil) { + foreignKey(column, (table, other), update, delete) + } + + public func foreignKey(_ composite: (Expression, Expression), references table: QueryType, _ other: (Expression, Expression), update: Dependency? = nil, delete: Dependency? = nil) { + let composite = ", ".join([composite.0, composite.1]) + let references = (table, ", ".join([other.0, other.1])) + + foreignKey(composite, references, update, delete) + } + + public func foreignKey(_ composite: (Expression, Expression, Expression), references table: QueryType, _ other: (Expression, Expression, Expression), update: Dependency? = nil, delete: Dependency? = nil) { + let composite = ", ".join([composite.0, composite.1, composite.2]) + let references = (table, ", ".join([other.0, other.1, other.2])) + + foreignKey(composite, references, update, delete) + } + + fileprivate func foreignKey(_ column: Expressible, _ references: (QueryType, Expressible), _ update: Dependency?, _ delete: Dependency?) { + let clauses: [Expressible?] = [ + "FOREIGN KEY".prefix(column), + reference(references), + update.map { Expression(literal: "ON UPDATE \($0.rawValue)") }, + delete.map { Expression(literal: "ON DELETE \($0.rawValue)") } + ] + + definitions.append(" ".join(clauses.flatMap { $0 })) + } + +} + +public enum PrimaryKey { + + case `default` + + case autoincrement + +} + +public struct Module { + + fileprivate let name: String + + fileprivate let arguments: [Expressible] + + public init(_ name: String, _ arguments: [Expressible]) { + self.init(name: name.quote(), arguments: arguments) + } + + init(name: String, arguments: [Expressible]) { + self.name = name + self.arguments = arguments + } + +} + +extension Module : Expressible { + + public var expression: Expression { + return name.wrap(arguments) + } + +} + +// MARK: - Private + +private extension QueryType { + + func create(_ identifier: String, _ name: Expressible, _ modifier: Modifier?, _ ifNotExists: Bool) -> Expressible { + let clauses: [Expressible?] = [ + Expression(literal: "CREATE"), + modifier.map { Expression(literal: $0.rawValue) }, + Expression(literal: identifier), + ifNotExists ? Expression(literal: "IF NOT EXISTS") : nil, + name + ] + + return " ".join(clauses.flatMap { $0 }) + } + + func rename(to: Self) -> String { + return " ".join([ + Expression(literal: "ALTER TABLE"), + tableName(), + Expression(literal: "RENAME TO"), + Expression(to.clauses.from.name) + ]).asSQL() + } + + func drop(_ identifier: String, _ name: Expressible, _ ifExists: Bool) -> String { + let clauses: [Expressible?] = [ + Expression(literal: "DROP \(identifier)"), + ifExists ? Expression(literal: "IF EXISTS") : nil, + name + ] + + return " ".join(clauses.flatMap { $0 }).asSQL() + } + +} + +private func definition(_ column: Expressible, _ datatype: String, _ primaryKey: PrimaryKey?, _ null: Bool, _ unique: Bool, _ check: Expressible?, _ defaultValue: Expressible?, _ references: (QueryType, Expressible)?, _ collate: Collation?) -> Expressible { + let clauses: [Expressible?] = [ + column, + Expression(literal: datatype), + primaryKey.map { Expression(literal: $0 == .autoincrement ? "PRIMARY KEY AUTOINCREMENT" : "PRIMARY KEY") }, + null ? nil : Expression(literal: "NOT NULL"), + unique ? Expression(literal: "UNIQUE") : nil, + check.map { " ".join([Expression(literal: "CHECK"), $0]) }, + defaultValue.map { "DEFAULT".prefix($0) }, + references.map(reference), + collate.map { " ".join([Expression(literal: "COLLATE"), $0]) } + ] + + return " ".join(clauses.flatMap { $0 }) +} + +private func reference(_ primary: (QueryType, Expressible)) -> Expressible { + return " ".join([ + Expression(literal: "REFERENCES"), + primary.0.tableName(qualified: false), + "".wrap(primary.1) as Expression + ]) +} + +private enum Modifier : String { + + case Unique = "UNIQUE" + + case Temporary = "TEMPORARY" + +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Setter.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Setter.swift new file mode 100644 index 0000000000..86f16fcae3 --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Setter.swift @@ -0,0 +1,277 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +precedencegroup ColumnAssignment { + associativity: left + assignment: true + lowerThan: AssignmentPrecedence +} + +infix operator <- : ColumnAssignment + +public struct Setter { + + let column: Expressible + let value: Expressible + + fileprivate init(column: Expression, value: Expression) { + self.column = column + self.value = value + } + + fileprivate init(column: Expression, value: V) { + self.column = column + self.value = value + } + + fileprivate init(column: Expression, value: Expression) { + self.column = column + self.value = value + } + + fileprivate init(column: Expression, value: Expression) { + self.column = column + self.value = value + } + + fileprivate init(column: Expression, value: V?) { + self.column = column + self.value = Expression(value: value) + } + +} + +extension Setter : Expressible { + + public var expression: Expression { + return "=".infix(column, value, wrap: false) + } + +} + +public func <-(column: Expression, value: Expression) -> Setter { + return Setter(column: column, value: value) +} +public func <-(column: Expression, value: V) -> Setter { + return Setter(column: column, value: value) +} +public func <-(column: Expression, value: Expression) -> Setter { + return Setter(column: column, value: value) +} +public func <-(column: Expression, value: Expression) -> Setter { + return Setter(column: column, value: value) +} +public func <-(column: Expression, value: V?) -> Setter { + return Setter(column: column, value: value) +} + +public func +=(column: Expression, value: Expression) -> Setter { + return column <- column + value +} +public func +=(column: Expression, value: String) -> Setter { + return column <- column + value +} +public func +=(column: Expression, value: Expression) -> Setter { + return column <- column + value +} +public func +=(column: Expression, value: Expression) -> Setter { + return column <- column + value +} +public func +=(column: Expression, value: String) -> Setter { + return column <- column + value +} + +public func +=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column + value +} +public func +=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column + value +} +public func +=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column + value +} +public func +=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column + value +} +public func +=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column + value +} + +public func -=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column - value +} +public func -=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column - value +} +public func -=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column - value +} +public func -=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column - value +} +public func -=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column - value +} + +public func *=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column * value +} +public func *=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column * value +} +public func *=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column * value +} +public func *=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column * value +} +public func *=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column * value +} + +public func /=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column / value +} +public func /=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column / value +} +public func /=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column / value +} +public func /=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column / value +} +public func /=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column / value +} + +public func %=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column % value +} +public func %=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column % value +} +public func %=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column % value +} +public func %=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column % value +} +public func %=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column % value +} + +public func <<=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column << value +} +public func <<=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column << value +} +public func <<=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column << value +} +public func <<=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column << value +} +public func <<=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column << value +} + +public func >>=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column >> value +} +public func >>=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column >> value +} +public func >>=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column >> value +} +public func >>=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column >> value +} +public func >>=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column >> value +} + +public func &=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column & value +} +public func &=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column & value +} +public func &=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column & value +} +public func &=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column & value +} +public func &=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column & value +} + +public func |=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column | value +} +public func |=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column | value +} +public func |=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column | value +} +public func |=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column | value +} +public func |=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column | value +} + +public func ^=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column ^ value +} +public func ^=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column ^ value +} +public func ^=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column ^ value +} +public func ^=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column ^ value +} +public func ^=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column ^ value +} + +public postfix func ++(column: Expression) -> Setter where V.Datatype == Int64 { + return Expression(column) += 1 +} +public postfix func ++(column: Expression) -> Setter where V.Datatype == Int64 { + return Expression(column) += 1 +} + +public postfix func --(column: Expression) -> Setter where V.Datatype == Int64 { + return Expression(column) -= 1 +} +public postfix func --(column: Expression) -> Setter where V.Datatype == Int64 { + return Expression(column) -= 1 +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m b/Example/Pods/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m new file mode 100644 index 0000000000..d8fe6b683c --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m @@ -0,0 +1,138 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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 "SQLite-Bridging.h" +#import "fts3_tokenizer.h" + +#pragma mark - FTS + +typedef struct __SQLiteTokenizer { + sqlite3_tokenizer base; + __unsafe_unretained _SQLiteTokenizerNextCallback callback; +} __SQLiteTokenizer; + +typedef struct __SQLiteTokenizerCursor { + void * base; + const char * input; + int inputOffset; + int inputLength; + int idx; +} __SQLiteTokenizerCursor; + +static NSMutableDictionary * __SQLiteTokenizerMap; + +static int __SQLiteTokenizerCreate(int argc, const char * const * argv, sqlite3_tokenizer ** ppTokenizer) { + __SQLiteTokenizer * tokenizer = (__SQLiteTokenizer *)sqlite3_malloc(sizeof(__SQLiteTokenizer)); + if (!tokenizer) { + return SQLITE_NOMEM; + } + memset(tokenizer, 0, sizeof(* tokenizer)); + + NSString * key = [NSString stringWithUTF8String:argv[0]]; + tokenizer->callback = [__SQLiteTokenizerMap objectForKey:key]; + if (!tokenizer->callback) { + return SQLITE_ERROR; + } + + *ppTokenizer = &tokenizer->base; + return SQLITE_OK; +} + +static int __SQLiteTokenizerDestroy(sqlite3_tokenizer * pTokenizer) { + sqlite3_free(pTokenizer); + return SQLITE_OK; +} + +static int __SQLiteTokenizerOpen(sqlite3_tokenizer * pTokenizer, const char * pInput, int nBytes, sqlite3_tokenizer_cursor ** ppCursor) { + __SQLiteTokenizerCursor * cursor = (__SQLiteTokenizerCursor *)sqlite3_malloc(sizeof(__SQLiteTokenizerCursor)); + if (!cursor) { + return SQLITE_NOMEM; + } + + cursor->input = pInput; + cursor->inputOffset = 0; + cursor->inputLength = 0; + cursor->idx = 0; + + *ppCursor = (sqlite3_tokenizer_cursor *)cursor; + return SQLITE_OK; +} + +static int __SQLiteTokenizerClose(sqlite3_tokenizer_cursor * pCursor) { + sqlite3_free(pCursor); + return SQLITE_OK; +} + +static int __SQLiteTokenizerNext(sqlite3_tokenizer_cursor * pCursor, const char ** ppToken, int * pnBytes, int * piStartOffset, int * piEndOffset, int * piPosition) { + __SQLiteTokenizerCursor * cursor = (__SQLiteTokenizerCursor *)pCursor; + __SQLiteTokenizer * tokenizer = (__SQLiteTokenizer *)cursor->base; + + cursor->inputOffset += cursor->inputLength; + const char * input = cursor->input + cursor->inputOffset; + const char * token = [tokenizer->callback(input, &cursor->inputOffset, &cursor->inputLength) cStringUsingEncoding:NSUTF8StringEncoding]; + if (!token) { + return SQLITE_DONE; + } + + *ppToken = token; + *pnBytes = (int)strlen(token); + *piStartOffset = cursor->inputOffset; + *piEndOffset = cursor->inputOffset + cursor->inputLength; + *piPosition = cursor->idx++; + return SQLITE_OK; +} + +static const sqlite3_tokenizer_module __SQLiteTokenizerModule = { + 0, + __SQLiteTokenizerCreate, + __SQLiteTokenizerDestroy, + __SQLiteTokenizerOpen, + __SQLiteTokenizerClose, + __SQLiteTokenizerNext +}; + +int _SQLiteRegisterTokenizer(SQLiteHandle * db, const char * moduleName, const char * submoduleName, _SQLiteTokenizerNextCallback callback) { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + __SQLiteTokenizerMap = [NSMutableDictionary new]; + }); + + sqlite3_stmt * stmt; + int status = sqlite3_prepare_v2((sqlite3 *)db, "SELECT fts3_tokenizer(?, ?)", -1, &stmt, 0); + if (status != SQLITE_OK ){ + return status; + } + const sqlite3_tokenizer_module * pModule = &__SQLiteTokenizerModule; + sqlite3_bind_text(stmt, 1, moduleName, -1, SQLITE_STATIC); + sqlite3_bind_blob(stmt, 2, &pModule, sizeof(pModule), SQLITE_STATIC); + sqlite3_step(stmt); + status = sqlite3_finalize(stmt); + if (status != SQLITE_OK ){ + return status; + } + + [__SQLiteTokenizerMap setObject:[callback copy] forKey:[NSString stringWithUTF8String:submoduleName]]; + + return SQLITE_OK; +} diff --git a/Example/Pods/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h b/Example/Pods/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h new file mode 100644 index 0000000000..d8a1e44b47 --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h @@ -0,0 +1,161 @@ +/* +** 2006 July 10 +** +** The author disclaims copyright to this source code. +** +************************************************************************* +** Defines the interface to tokenizers used by fulltext-search. There +** are three basic components: +** +** sqlite3_tokenizer_module is a singleton defining the tokenizer +** interface functions. This is essentially the class structure for +** tokenizers. +** +** sqlite3_tokenizer is used to define a particular tokenizer, perhaps +** including customization information defined at creation time. +** +** sqlite3_tokenizer_cursor is generated by a tokenizer to generate +** tokens from a particular input. +*/ +#ifndef _FTS3_TOKENIZER_H_ +#define _FTS3_TOKENIZER_H_ + +/* TODO(shess) Only used for SQLITE_OK and SQLITE_DONE at this time. +** If tokenizers are to be allowed to call sqlite3_*() functions, then +** we will need a way to register the API consistently. +*/ +#import "sqlite3.h" + +/* +** Structures used by the tokenizer interface. When a new tokenizer +** implementation is registered, the caller provides a pointer to +** an sqlite3_tokenizer_module containing pointers to the callback +** functions that make up an implementation. +** +** When an fts3 table is created, it passes any arguments passed to +** the tokenizer clause of the CREATE VIRTUAL TABLE statement to the +** sqlite3_tokenizer_module.xCreate() function of the requested tokenizer +** implementation. The xCreate() function in turn returns an +** sqlite3_tokenizer structure representing the specific tokenizer to +** be used for the fts3 table (customized by the tokenizer clause arguments). +** +** To tokenize an input buffer, the sqlite3_tokenizer_module.xOpen() +** method is called. It returns an sqlite3_tokenizer_cursor object +** that may be used to tokenize a specific input buffer based on +** the tokenization rules supplied by a specific sqlite3_tokenizer +** object. +*/ +typedef struct sqlite3_tokenizer_module sqlite3_tokenizer_module; +typedef struct sqlite3_tokenizer sqlite3_tokenizer; +typedef struct sqlite3_tokenizer_cursor sqlite3_tokenizer_cursor; + +struct sqlite3_tokenizer_module { + + /* + ** Structure version. Should always be set to 0 or 1. + */ + int iVersion; + + /* + ** Create a new tokenizer. The values in the argv[] array are the + ** arguments passed to the "tokenizer" clause of the CREATE VIRTUAL + ** TABLE statement that created the fts3 table. For example, if + ** the following SQL is executed: + ** + ** CREATE .. USING fts3( ... , tokenizer arg1 arg2) + ** + ** then argc is set to 2, and the argv[] array contains pointers + ** to the strings "arg1" and "arg2". + ** + ** This method should return either SQLITE_OK (0), or an SQLite error + ** code. If SQLITE_OK is returned, then *ppTokenizer should be set + ** to point at the newly created tokenizer structure. The generic + ** sqlite3_tokenizer.pModule variable should not be initialized by + ** this callback. The caller will do so. + */ + int (*xCreate)( + int argc, /* Size of argv array */ + const char *const*argv, /* Tokenizer argument strings */ + sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ + ); + + /* + ** Destroy an existing tokenizer. The fts3 module calls this method + ** exactly once for each successful call to xCreate(). + */ + int (*xDestroy)(sqlite3_tokenizer *pTokenizer); + + /* + ** Create a tokenizer cursor to tokenize an input buffer. The caller + ** is responsible for ensuring that the input buffer remains valid + ** until the cursor is closed (using the xClose() method). + */ + int (*xOpen)( + sqlite3_tokenizer *pTokenizer, /* Tokenizer object */ + const char *pInput, int nBytes, /* Input buffer */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Created tokenizer cursor */ + ); + + /* + ** Destroy an existing tokenizer cursor. The fts3 module calls this + ** method exactly once for each successful call to xOpen(). + */ + int (*xClose)(sqlite3_tokenizer_cursor *pCursor); + + /* + ** Retrieve the next token from the tokenizer cursor pCursor. This + ** method should either return SQLITE_OK and set the values of the + ** "OUT" variables identified below, or SQLITE_DONE to indicate that + ** the end of the buffer has been reached, or an SQLite error code. + ** + ** *ppToken should be set to point at a buffer containing the + ** normalized version of the token (i.e. after any case-folding and/or + ** stemming has been performed). *pnBytes should be set to the length + ** of this buffer in bytes. The input text that generated the token is + ** identified by the byte offsets returned in *piStartOffset and + ** *piEndOffset. *piStartOffset should be set to the index of the first + ** byte of the token in the input buffer. *piEndOffset should be set + ** to the index of the first byte just past the end of the token in + ** the input buffer. + ** + ** The buffer *ppToken is set to point at is managed by the tokenizer + ** implementation. It is only required to be valid until the next call + ** to xNext() or xClose(). + */ + /* TODO(shess) current implementation requires pInput to be + ** nul-terminated. This should either be fixed, or pInput/nBytes + ** should be converted to zInput. + */ + int (*xNext)( + sqlite3_tokenizer_cursor *pCursor, /* Tokenizer cursor */ + const char **ppToken, int *pnBytes, /* OUT: Normalized text for token */ + int *piStartOffset, /* OUT: Byte offset of token in input buffer */ + int *piEndOffset, /* OUT: Byte offset of end of token in input buffer */ + int *piPosition /* OUT: Number of tokens returned before this one */ + ); + + /*********************************************************************** + ** Methods below this point are only available if iVersion>=1. + */ + + /* + ** Configure the language id of a tokenizer cursor. + */ + int (*xLanguageid)(sqlite3_tokenizer_cursor *pCsr, int iLangid); +}; + +struct sqlite3_tokenizer { + const sqlite3_tokenizer_module *pModule; /* The module for this tokenizer */ + /* Tokenizer implementations will typically add additional fields */ +}; + +struct sqlite3_tokenizer_cursor { + sqlite3_tokenizer *pTokenizer; /* Tokenizer for this cursor. */ + /* Tokenizer implementations will typically add additional fields */ +}; + +int fts3_global_term_cnt(int iTerm, int iCol); +int fts3_term_cnt(int iTerm, int iCol); + + +#endif /* _FTS3_TOKENIZER_H_ */ diff --git a/Example/Pods/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h b/Example/Pods/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h new file mode 100644 index 0000000000..d15e8d56d6 --- /dev/null +++ b/Example/Pods/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h @@ -0,0 +1,37 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +@import Foundation; + +#ifndef COCOAPODS +#import "sqlite3.h" +#endif + +typedef struct SQLiteHandle SQLiteHandle; // CocoaPods workaround + +NS_ASSUME_NONNULL_BEGIN +typedef NSString * _Nullable (^_SQLiteTokenizerNextCallback)(const char * input, int * inputOffset, int * inputLength); +int _SQLiteRegisterTokenizer(SQLiteHandle * db, const char * module, const char * tokenizer, _Nullable _SQLiteTokenizerNextCallback callback); +NS_ASSUME_NONNULL_END + diff --git a/Example/Pods/Target Support Files/Apollo/Apollo-dummy.m b/Example/Pods/Target Support Files/Apollo/Apollo-dummy.m new file mode 100644 index 0000000000..843221b8be --- /dev/null +++ b/Example/Pods/Target Support Files/Apollo/Apollo-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Apollo : NSObject +@end +@implementation PodsDummy_Apollo +@end diff --git a/Example/Pods/Target Support Files/Apollo/Apollo-prefix.pch b/Example/Pods/Target Support Files/Apollo/Apollo-prefix.pch new file mode 100644 index 0000000000..beb2a24418 --- /dev/null +++ b/Example/Pods/Target Support Files/Apollo/Apollo-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Example/Pods/Target Support Files/Apollo/Apollo-umbrella.h b/Example/Pods/Target Support Files/Apollo/Apollo-umbrella.h new file mode 100644 index 0000000000..ae2de99bd2 --- /dev/null +++ b/Example/Pods/Target Support Files/Apollo/Apollo-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double ApolloVersionNumber; +FOUNDATION_EXPORT const unsigned char ApolloVersionString[]; + diff --git a/Example/Pods/Target Support Files/Apollo/Apollo.modulemap b/Example/Pods/Target Support Files/Apollo/Apollo.modulemap new file mode 100644 index 0000000000..008f0e5d56 --- /dev/null +++ b/Example/Pods/Target Support Files/Apollo/Apollo.modulemap @@ -0,0 +1,6 @@ +framework module Apollo { + umbrella header "Apollo-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Apollo/Apollo.xcconfig b/Example/Pods/Target Support Files/Apollo/Apollo.xcconfig new file mode 100644 index 0000000000..07dd75d24b --- /dev/null +++ b/Example/Pods/Target Support Files/Apollo/Apollo.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Apollo +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Example/Pods/Target Support Files/Apollo/Info.plist b/Example/Pods/Target Support Files/Apollo/Info.plist new file mode 100644 index 0000000000..a815dbde4c --- /dev/null +++ b/Example/Pods/Target Support Files/Apollo/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.5.6 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Info.plist b/Example/Pods/Target Support Files/Pods-ApolloExample/Info.plist new file mode 100644 index 0000000000..2243fe6e27 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExample/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.markdown new file mode 100644 index 0000000000..7d16a9fef3 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.markdown @@ -0,0 +1,53 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## Apollo + +The MIT License (MIT) + +Copyright (c) 2016 Meteor Development Group, Inc. + +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. + + +## SQLite.swift + +(The MIT License) + +Copyright (c) 2014-2015 Stephen Celis () + +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. + +Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.plist new file mode 100644 index 0000000000..1ffa30b22d --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.plist @@ -0,0 +1,91 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) + +Copyright (c) 2016 Meteor Development Group, Inc. + +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. + + License + MIT + Title + Apollo + Type + PSGroupSpecifier + + + FooterText + (The MIT License) + +Copyright (c) 2014-2015 Stephen Celis (<stephen@stephencelis.com>) + +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. + + License + MIT + Title + SQLite.swift + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-dummy.m b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-dummy.m new file mode 100644 index 0000000000..fc883816e5 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_ApolloExample : NSObject +@end +@implementation PodsDummy_Pods_ApolloExample +@end diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-frameworks.sh b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-frameworks.sh new file mode 100755 index 0000000000..bf3790a5fb --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-frameworks.sh @@ -0,0 +1,101 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current file + archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + stripped="" + for arch in $archs; do + if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "$BUILT_PRODUCTS_DIR/Apollo/Apollo.framework" + install_framework "$BUILT_PRODUCTS_DIR/SQLite.swift/SQLite.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "$BUILT_PRODUCTS_DIR/Apollo/Apollo.framework" + install_framework "$BUILT_PRODUCTS_DIR/SQLite.swift/SQLite.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-resources.sh b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-resources.sh new file mode 100755 index 0000000000..4602c68ab6 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-resources.sh @@ -0,0 +1,99 @@ +#!/bin/sh +set -e + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-umbrella.h b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-umbrella.h new file mode 100644 index 0000000000..7256f92c0b --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_ApolloExampleVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_ApolloExampleVersionString[]; + diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.debug.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.debug.xcconfig new file mode 100644 index 0000000000..236fc5d6bb --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.debug.xcconfig @@ -0,0 +1,10 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.modulemap b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.modulemap new file mode 100644 index 0000000000..5a3591cdde --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.modulemap @@ -0,0 +1,6 @@ +framework module Pods_ApolloExample { + umbrella header "Pods-ApolloExample-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.release.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.release.xcconfig new file mode 100644 index 0000000000..236fc5d6bb --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.release.xcconfig @@ -0,0 +1,10 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Info.plist b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Info.plist new file mode 100644 index 0000000000..2243fe6e27 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-acknowledgements.markdown new file mode 100644 index 0000000000..102af75385 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-acknowledgements.plist new file mode 100644 index 0000000000..7acbad1eab --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-dummy.m b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-dummy.m new file mode 100644 index 0000000000..dfdc9ff751 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_ApolloExampleTests : NSObject +@end +@implementation PodsDummy_Pods_ApolloExampleTests +@end diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-frameworks.sh b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-frameworks.sh new file mode 100755 index 0000000000..0f29f13c23 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-frameworks.sh @@ -0,0 +1,92 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current file + archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + stripped="" + for arch in $archs; do + if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi +} + +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-resources.sh b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-resources.sh new file mode 100755 index 0000000000..4602c68ab6 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-resources.sh @@ -0,0 +1,99 @@ +#!/bin/sh +set -e + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-umbrella.h b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-umbrella.h new file mode 100644 index 0000000000..af4ea892b0 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_ApolloExampleTestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_ApolloExampleTestsVersionString[]; + diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.debug.xcconfig new file mode 100644 index 0000000000..4a625a44ec --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.debug.xcconfig @@ -0,0 +1,7 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.modulemap b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.modulemap new file mode 100644 index 0000000000..bcc588bb4f --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_ApolloExampleTests { + umbrella header "Pods-ApolloExampleTests-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.release.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.release.xcconfig new file mode 100644 index 0000000000..4a625a44ec --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.release.xcconfig @@ -0,0 +1,7 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/SQLite.swift/Info.plist b/Example/Pods/Target Support Files/SQLite.swift/Info.plist new file mode 100644 index 0000000000..e500672166 --- /dev/null +++ b/Example/Pods/Target Support Files/SQLite.swift/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.11.2 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-dummy.m b/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-dummy.m new file mode 100644 index 0000000000..bc09ade872 --- /dev/null +++ b/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_SQLite_swift : NSObject +@end +@implementation PodsDummy_SQLite_swift +@end diff --git a/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-prefix.pch b/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-prefix.pch new file mode 100644 index 0000000000..beb2a24418 --- /dev/null +++ b/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-umbrella.h b/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-umbrella.h new file mode 100644 index 0000000000..3052d2cfd3 --- /dev/null +++ b/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-umbrella.h @@ -0,0 +1,18 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "SQLite.h" +#import "SQLite-Bridging.h" + +FOUNDATION_EXPORT double SQLiteVersionNumber; +FOUNDATION_EXPORT const unsigned char SQLiteVersionString[]; + diff --git a/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.modulemap b/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.modulemap new file mode 100644 index 0000000000..e835c30da8 --- /dev/null +++ b/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.modulemap @@ -0,0 +1,6 @@ +framework module SQLite { + umbrella header "SQLite.swift-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.xcconfig b/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.xcconfig new file mode 100644 index 0000000000..590d341c2a --- /dev/null +++ b/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.xcconfig @@ -0,0 +1,23 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/SQLite.swift +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" +OTHER_LDFLAGS = -l"sqlite3" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/SQLite.swift +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +SWIFT_INCLUDE_PATHS[sdk=appletvos*] = $(SRCROOT)/SQLite.swift/CocoaPods/appletvos +SWIFT_INCLUDE_PATHS[sdk=appletvsimulator*] = $(SRCROOT)/SQLite.swift/CocoaPods/appletvsimulator +SWIFT_INCLUDE_PATHS[sdk=iphoneos*] = $(SRCROOT)/SQLite.swift/CocoaPods/iphoneos +SWIFT_INCLUDE_PATHS[sdk=iphoneos10.0] = $(SRCROOT)/SQLite.swift/CocoaPods/iphoneos-10.0 +SWIFT_INCLUDE_PATHS[sdk=iphonesimulator*] = $(SRCROOT)/SQLite.swift/CocoaPods/iphonesimulator +SWIFT_INCLUDE_PATHS[sdk=iphonesimulator10.0] = $(SRCROOT)/SQLite.swift/CocoaPods/iphonesimulator-10.0 +SWIFT_INCLUDE_PATHS[sdk=macosx*] = $(SRCROOT)/SQLite.swift/CocoaPods/macosx +SWIFT_INCLUDE_PATHS[sdk=macosx10.11] = $(SRCROOT)/SQLite.swift/CocoaPods/macosx-10.11 +SWIFT_INCLUDE_PATHS[sdk=macosx10.12] = $(SRCROOT)/SQLite.swift/CocoaPods/macosx-10.12 +SWIFT_INCLUDE_PATHS[sdk=watchos*] = $(SRCROOT)/SQLite.swift/CocoaPods/watchos +SWIFT_INCLUDE_PATHS[sdk=watchsimulator*] = $(SRCROOT)/SQLite.swift/CocoaPods/watchsimulator +SWIFT_VERSION = 3.0 From 3a094a1bdb8a1a03c486cdbcff565e55523d5855 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Tue, 4 Apr 2017 17:55:09 -0700 Subject: [PATCH 04/76] Move tests from Apollo project to ApolloExample project (since they will depend on Sqlite pod) --- Apollo.xcodeproj/project.pbxproj | 750 ------------------ .../ApolloExample.xcodeproj/project.pbxproj | 738 +++++++++++++++-- .../ApolloExampleTests.swift | 36 - Example/ApolloExampleTests/Info.plist | 22 - .../ApolloPerformanceTests/Info.plist | 0 .../NormalizedCachingTests.swift | 0 .../ApolloPerformanceTests/PromiseTests.swift | 0 .../ApolloTests/BatchedLoadTests.swift | 0 .../ApolloTests/CacheKeyForFieldTests.swift | 0 .../ApolloTests/DataLoaderTests.swift | 0 .../ApolloTests/FetchQueryTests.swift | 0 .../GraphQLExecutorFieldValueTests.swift | 0 .../GraphQLInputValueEncodingTests.swift | 0 {Tests => Example}/ApolloTests/Info.plist | 0 .../ApolloTests/LoadQueryFromStoreTests.swift | 0 .../ApolloTests/MockNetworkTransport.swift | 0 .../ApolloTests/NormalizeQueryResults.swift | 0 .../ApolloTests/ParseQueryResponseTests.swift | 0 .../ApolloTests/PromiseTests.swift | 0 .../StarWarsServerCachingRoundtripTests.swift | 0 .../ApolloTests/StarWarsServerTests.swift | 0 .../ApolloTests/StoreTransactionTests.swift | 0 .../ApolloTests/Utilities.swift | 0 .../ApolloTests/WatchQueryTests.swift | 0 Example/Podfile | 10 +- Example/Podfile.lock | 2 +- Example/Pods/Manifest.lock | 2 +- Example/Pods/Pods.xcodeproj/project.pbxproj | 552 ++++++++++--- .../Pods-ApolloExampleTests-dummy.m | 5 - .../Pods-ApolloExampleTests.modulemap | 6 - .../Info.plist | 0 ...erformanceTests-acknowledgements.markdown} | 0 ...loPerformanceTests-acknowledgements.plist} | 0 .../Pods-ApolloPerformanceTests-dummy.m | 5 + ...Pods-ApolloPerformanceTests-frameworks.sh} | 0 .../Pods-ApolloPerformanceTests-resources.sh} | 0 .../Pods-ApolloPerformanceTests-umbrella.h | 16 + ...ods-ApolloPerformanceTests.debug.xcconfig} | 0 .../Pods-ApolloPerformanceTests.modulemap | 6 + ...s-ApolloPerformanceTests.release.xcconfig} | 0 .../Pods-ApolloTests/Info.plist | 26 + ...Pods-ApolloTests-acknowledgements.markdown | 3 + .../Pods-ApolloTests-acknowledgements.plist | 29 + .../Pods-ApolloTests/Pods-ApolloTests-dummy.m | 5 + .../Pods-ApolloTests-frameworks.sh | 92 +++ .../Pods-ApolloTests-resources.sh | 99 +++ .../Pods-ApolloTests-umbrella.h} | 4 +- .../Pods-ApolloTests.debug.xcconfig | 7 + .../Pods-ApolloTests.modulemap | 6 + .../Pods-ApolloTests.release.xcconfig | 7 + .../Pods-StarWarsAPI/Info.plist | 26 + ...Pods-StarWarsAPI-acknowledgements.markdown | 3 + .../Pods-StarWarsAPI-acknowledgements.plist | 29 + .../Pods-StarWarsAPI/Pods-StarWarsAPI-dummy.m | 5 + .../Pods-StarWarsAPI-resources.sh | 99 +++ .../Pods-StarWarsAPI-umbrella.h | 16 + .../Pods-StarWarsAPI.debug.xcconfig | 7 + .../Pods-StarWarsAPI.modulemap | 6 + .../Pods-StarWarsAPI.release.xcconfig | 7 + {Tests => Example}/StarWarsAPI/API.swift | 0 .../CreateReviewForEpisode.graphql | 0 .../StarWarsAPI/HeroAndFriendsNames.graphql | 0 .../StarWarsAPI/HeroAppearsIn.graphql | 0 .../StarWarsAPI/HeroDetails.graphql | 0 .../HeroDetailsWithFragment.graphql | 0 .../StarWarsAPI/HeroName.graphql | 0 .../StarWarsAPI/HeroNameConditional.graphql | 0 .../HeroParentTypeDependentField.graphql | 0 .../HeroTypeDependentAliasedField.graphql | 0 .../StarWarsAPI/HumanWithNullMass.graphql | 0 {Tests => Example}/StarWarsAPI/Info.plist | 0 .../StarWarsAPI/SameHeroTwice.graphql | 0 {Tests => Example}/StarWarsAPI/StarWarsAPI.h | 0 .../StarWarsAPI/Starship.graphql | 0 .../StarWarsAPI/TwoHeroes.graphql | 0 {Tests => Example}/StarWarsAPI/schema.json | 0 Example/TestHost iOS/AppDelegate.swift | 46 ++ .../AppIcon.appiconset/Contents.json | 0 .../Base.lproj/LaunchScreen.storyboard | 0 .../TestHost iOS/Base.lproj/Main.storyboard | 0 {Tests => Example}/TestHost iOS/Info.plist | 9 +- Example/TestHost iOS/ViewController.swift | 25 + Tests/TestHost iOS/AppDelegate.swift | 6 - Tests/TestHost iOS/ViewController.swift | 4 - 84 files changed, 1702 insertions(+), 1014 deletions(-) delete mode 100644 Example/ApolloExampleTests/ApolloExampleTests.swift delete mode 100644 Example/ApolloExampleTests/Info.plist rename {Tests => Example}/ApolloPerformanceTests/Info.plist (100%) rename {Tests => Example}/ApolloPerformanceTests/NormalizedCachingTests.swift (100%) rename {Tests => Example}/ApolloPerformanceTests/PromiseTests.swift (100%) rename {Tests => Example}/ApolloTests/BatchedLoadTests.swift (100%) rename {Tests => Example}/ApolloTests/CacheKeyForFieldTests.swift (100%) rename {Tests => Example}/ApolloTests/DataLoaderTests.swift (100%) rename {Tests => Example}/ApolloTests/FetchQueryTests.swift (100%) rename {Tests => Example}/ApolloTests/GraphQLExecutorFieldValueTests.swift (100%) rename {Tests => Example}/ApolloTests/GraphQLInputValueEncodingTests.swift (100%) rename {Tests => Example}/ApolloTests/Info.plist (100%) rename {Tests => Example}/ApolloTests/LoadQueryFromStoreTests.swift (100%) rename {Tests => Example}/ApolloTests/MockNetworkTransport.swift (100%) rename {Tests => Example}/ApolloTests/NormalizeQueryResults.swift (100%) rename {Tests => Example}/ApolloTests/ParseQueryResponseTests.swift (100%) rename {Tests => Example}/ApolloTests/PromiseTests.swift (100%) rename {Tests => Example}/ApolloTests/StarWarsServerCachingRoundtripTests.swift (100%) rename {Tests => Example}/ApolloTests/StarWarsServerTests.swift (100%) rename {Tests => Example}/ApolloTests/StoreTransactionTests.swift (100%) rename {Tests => Example}/ApolloTests/Utilities.swift (100%) rename {Tests => Example}/ApolloTests/WatchQueryTests.swift (100%) delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-dummy.m delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.modulemap rename Example/Pods/Target Support Files/{Pods-ApolloExampleTests => Pods-ApolloPerformanceTests}/Info.plist (100%) rename Example/Pods/Target Support Files/{Pods-ApolloExampleTests/Pods-ApolloExampleTests-acknowledgements.markdown => Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.markdown} (100%) rename Example/Pods/Target Support Files/{Pods-ApolloExampleTests/Pods-ApolloExampleTests-acknowledgements.plist => Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.plist} (100%) create mode 100644 Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-dummy.m rename Example/Pods/Target Support Files/{Pods-ApolloExampleTests/Pods-ApolloExampleTests-frameworks.sh => Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-frameworks.sh} (100%) rename Example/Pods/Target Support Files/{Pods-ApolloExampleTests/Pods-ApolloExampleTests-resources.sh => Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-resources.sh} (100%) create mode 100644 Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-umbrella.h rename Example/Pods/Target Support Files/{Pods-ApolloExampleTests/Pods-ApolloExampleTests.debug.xcconfig => Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.debug.xcconfig} (100%) create mode 100644 Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.modulemap rename Example/Pods/Target Support Files/{Pods-ApolloExampleTests/Pods-ApolloExampleTests.release.xcconfig => Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.release.xcconfig} (100%) create mode 100644 Example/Pods/Target Support Files/Pods-ApolloTests/Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.markdown create mode 100644 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.plist create mode 100644 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-dummy.m create mode 100755 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-frameworks.sh create mode 100755 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-resources.sh rename Example/Pods/Target Support Files/{Pods-ApolloExampleTests/Pods-ApolloExampleTests-umbrella.h => Pods-ApolloTests/Pods-ApolloTests-umbrella.h} (58%) create mode 100644 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.debug.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap create mode 100644 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.release.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.markdown create mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.plist create mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-dummy.m create mode 100755 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-resources.sh create mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-umbrella.h create mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.debug.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.modulemap create mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.release.xcconfig rename {Tests => Example}/StarWarsAPI/API.swift (100%) rename {Tests => Example}/StarWarsAPI/CreateReviewForEpisode.graphql (100%) rename {Tests => Example}/StarWarsAPI/HeroAndFriendsNames.graphql (100%) rename {Tests => Example}/StarWarsAPI/HeroAppearsIn.graphql (100%) rename {Tests => Example}/StarWarsAPI/HeroDetails.graphql (100%) rename {Tests => Example}/StarWarsAPI/HeroDetailsWithFragment.graphql (100%) rename {Tests => Example}/StarWarsAPI/HeroName.graphql (100%) rename {Tests => Example}/StarWarsAPI/HeroNameConditional.graphql (100%) rename {Tests => Example}/StarWarsAPI/HeroParentTypeDependentField.graphql (100%) rename {Tests => Example}/StarWarsAPI/HeroTypeDependentAliasedField.graphql (100%) rename {Tests => Example}/StarWarsAPI/HumanWithNullMass.graphql (100%) rename {Tests => Example}/StarWarsAPI/Info.plist (100%) rename {Tests => Example}/StarWarsAPI/SameHeroTwice.graphql (100%) rename {Tests => Example}/StarWarsAPI/StarWarsAPI.h (100%) rename {Tests => Example}/StarWarsAPI/Starship.graphql (100%) rename {Tests => Example}/StarWarsAPI/TwoHeroes.graphql (100%) rename {Tests => Example}/StarWarsAPI/schema.json (100%) create mode 100644 Example/TestHost iOS/AppDelegate.swift rename {Tests => Example}/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {Tests => Example}/TestHost iOS/Base.lproj/LaunchScreen.storyboard (100%) rename {Tests => Example}/TestHost iOS/Base.lproj/Main.storyboard (100%) rename {Tests => Example}/TestHost iOS/Info.plist (89%) create mode 100644 Example/TestHost iOS/ViewController.swift delete mode 100644 Tests/TestHost iOS/AppDelegate.swift delete mode 100644 Tests/TestHost iOS/ViewController.swift diff --git a/Apollo.xcodeproj/project.pbxproj b/Apollo.xcodeproj/project.pbxproj index 1b218124f8..34cd3f2c54 100644 --- a/Apollo.xcodeproj/project.pbxproj +++ b/Apollo.xcodeproj/project.pbxproj @@ -9,61 +9,31 @@ /* Begin PBXBuildFile section */ 544623A11E941BB100362E34 /* InMemoryNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544623A01E941BB100362E34 /* InMemoryNormalizedCache.swift */; }; 544623A31E941BD700362E34 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544623A21E941BD700362E34 /* SqliteNormalizedCache.swift */; }; - 9F0F98D41E7AC17D00BF0371 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F0F98D31E7AC17D00BF0371 /* StoreTransactionTests.swift */; }; 9F0F98E11E7BCC3400BF0371 /* Dictionary+KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F0F98E01E7BCC3400BF0371 /* Dictionary+KeyPath.swift */; }; 9F27D4641D40379500715680 /* JSONStandardTypeConversions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F27D4631D40379500715680 /* JSONStandardTypeConversions.swift */; }; - 9F295E2D1E27419800A24949 /* StarWarsServerCachingRoundtripTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F295E2B1E27418F00A24949 /* StarWarsServerCachingRoundtripTests.swift */; }; - 9F295E311E27534800A24949 /* NormalizeQueryResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F295E301E27534800A24949 /* NormalizeQueryResults.swift */; }; 9F295E381E277B2A00A24949 /* GraphQLResultNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F295E371E277B2A00A24949 /* GraphQLResultNormalizer.swift */; }; - 9F438D071E6C2FD9007BDC1A /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FC750441D2A532C00458D91 /* Apollo.framework */; }; - 9F438D081E6C30B1007BDC1A /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */; }; - 9F533AB31E6C4A4200CBE097 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F438D0B1E6C494C007BDC1A /* BatchedLoadTests.swift */; }; 9F55347B1DE1DB2100E54264 /* ApolloStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F55347A1DE1DB2100E54264 /* ApolloStore.swift */; }; - 9F55347E1DE1DB3500E54264 /* LoadQueryFromStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F55347D1DE1DB3500E54264 /* LoadQueryFromStoreTests.swift */; }; 9F578D901D8D2CB300C0EA36 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F578D8F1D8D2CB300C0EA36 /* Utilities.swift */; }; - 9F6291C71E39775000CDA57B /* MockNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDFD2E1E3579B6007519DC /* MockNetworkTransport.swift */; }; - 9F69FFA71D4271F400E000B1 /* StarWarsServerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F69FFA61D4271F400E000B1 /* StarWarsServerTests.swift */; }; 9F69FFA91D42855900E000B1 /* NetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F69FFA81D42855900E000B1 /* NetworkTransport.swift */; }; 9F86B68B1E6438D700B885FF /* GraphQLResultMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F86B68A1E6438D700B885FF /* GraphQLResultMapper.swift */; }; 9F86B6901E65533D00B885FF /* GraphQLResponseGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F86B68F1E65533D00B885FF /* GraphQLResponseGenerator.swift */; }; 9FA6F3681E65DF4700BF8D73 /* GraphQLResultAccumulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA6F3671E65DF4700BF8D73 /* GraphQLResultAccumulator.swift */; }; 9FADC84A1E6B0B2300C677E6 /* Locking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FADC8491E6B0B2300C677E6 /* Locking.swift */; }; 9FADC84F1E6B865E00C677E6 /* DataLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FADC84E1E6B865E00C677E6 /* DataLoader.swift */; }; - 9FADC8541E6B86D900C677E6 /* DataLoaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FADC8531E6B86D900C677E6 /* DataLoaderTests.swift */; }; 9FC2333D1E66BBF7001E4541 /* GraphQLDependencyTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC2333C1E66BBF7001E4541 /* GraphQLDependencyTracker.swift */; }; 9FC4B9201D2A6F8D0046A641 /* JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC4B91F1D2A6F8D0046A641 /* JSON.swift */; }; - 9FC631361E6AE2080062707E /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC631351E6AE2080062707E /* PromiseTests.swift */; }; - 9FC631381E6AE2080062707E /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FC750441D2A532C00458D91 /* Apollo.framework */; }; 9FC750481D2A532C00458D91 /* Apollo.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FC750471D2A532C00458D91 /* Apollo.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9FC7504F1D2A532D00458D91 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FC750441D2A532C00458D91 /* Apollo.framework */; }; 9FC750611D2A59C300458D91 /* GraphQLOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC750601D2A59C300458D91 /* GraphQLOperation.swift */; }; 9FC750631D2A59F600458D91 /* ApolloClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC750621D2A59F600458D91 /* ApolloClient.swift */; }; 9FC9A9BD1E2C271C0023C4D5 /* RecordSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9BC1E2C271C0023C4D5 /* RecordSet.swift */; }; 9FC9A9BF1E2C27FB0023C4D5 /* GraphQLResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9BE1E2C27FB0023C4D5 /* GraphQLResult.swift */; }; 9FC9A9C21E2D3CAF0023C4D5 /* GraphQLValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9C11E2D3CAF0023C4D5 /* GraphQLValues.swift */; }; 9FC9A9C51E2D6CE70023C4D5 /* Selections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9C41E2D6CE70023C4D5 /* Selections.swift */; }; - 9FC9A9C81E2EFE6E0023C4D5 /* CacheKeyForFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9C71E2EFE6E0023C4D5 /* CacheKeyForFieldTests.swift */; }; 9FC9A9CC1E2FD0760023C4D5 /* Record.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9CB1E2FD0760023C4D5 /* Record.swift */; }; 9FC9A9D31E2FD48B0023C4D5 /* GraphQLError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9D21E2FD48B0023C4D5 /* GraphQLError.swift */; }; - 9FCDFD1F1E32EABB007519DC /* FetchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDFD1E1E32EABB007519DC /* FetchQueryTests.swift */; }; 9FCDFD231E33A0D8007519DC /* AsynchronousOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDFD221E33A0D8007519DC /* AsynchronousOperation.swift */; }; 9FCDFD291E33D0CE007519DC /* GraphQLQueryWatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDFD281E33D0CE007519DC /* GraphQLQueryWatcher.swift */; }; - 9FCDFD2C1E35784B007519DC /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDFD2B1E35784B007519DC /* WatchQueryTests.swift */; }; - 9FCE2CEC1E6BDAD100E34457 /* NormalizedCachingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCE2CEB1E6BDAD100E34457 /* NormalizedCachingTests.swift */; }; 9FCE2CEE1E6BE2D900E34457 /* NormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCE2CED1E6BE2D800E34457 /* NormalizedCache.swift */; }; - 9FCE2CFE1E6C213D00E34457 /* StarWarsAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FCE2CFC1E6C213D00E34457 /* StarWarsAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9FCE2D011E6C213D00E34457 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */; }; - 9FCE2D021E6C213D00E34457 /* StarWarsAPI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9FCE2D091E6C254700E34457 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */; }; - 9FCE2D0B1E6C258A00E34457 /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCE2D0A1E6C258A00E34457 /* API.swift */; }; - 9FD637E41E6ACF88001EDBC8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FD637E31E6ACF88001EDBC8 /* AppDelegate.swift */; }; - 9FD637E61E6ACF88001EDBC8 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FD637E51E6ACF88001EDBC8 /* ViewController.swift */; }; - 9FD637E91E6ACF88001EDBC8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9FD637E71E6ACF88001EDBC8 /* Main.storyboard */; }; - 9FD637EB1E6ACF88001EDBC8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9FD637EA1E6ACF88001EDBC8 /* Assets.xcassets */; }; - 9FD637EE1E6ACF88001EDBC8 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9FD637EC1E6ACF88001EDBC8 /* LaunchScreen.storyboard */; }; - 9FD637F51E6AD43F001EDBC8 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FC750441D2A532C00458D91 /* Apollo.framework */; }; - 9FD637F61E6AD43F001EDBC8 /* Apollo.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9FC750441D2A532C00458D91 /* Apollo.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9FE1C6E71E634C8D00C02284 /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FE1C6E61E634C8D00C02284 /* PromiseTests.swift */; }; 9FE3F3981DADBD870072078F /* check-and-run-apollo-codegen.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9FE3F3971DADBD870072078F /* check-and-run-apollo-codegen.sh */; }; 9FE941CB1E5F20CA007CDD89 /* GraphQLOutputType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FE941CA1E5F20CA007CDD89 /* GraphQLOutputType.swift */; }; 9FE941D01E62C771007CDD89 /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FE941CF1E62C771007CDD89 /* Promise.swift */; }; @@ -73,153 +43,40 @@ 9FF33D811E48B98200F608A4 /* HTTPNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4DAF2D1E48B84B00EBFF0B /* HTTPNetworkTransport.swift */; }; 9FF90A611DDDEB100034C3B6 /* GraphQLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A5B1DDDEB100034C3B6 /* GraphQLResponse.swift */; }; 9FF90A651DDDEB100034C3B6 /* GraphQLExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A5C1DDDEB100034C3B6 /* GraphQLExecutor.swift */; }; - 9FF90A6F1DDDEB420034C3B6 /* GraphQLInputValueEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A6A1DDDEB420034C3B6 /* GraphQLInputValueEncodingTests.swift */; }; - 9FF90A711DDDEB420034C3B6 /* GraphQLExecutorFieldValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A6B1DDDEB420034C3B6 /* GraphQLExecutorFieldValueTests.swift */; }; - 9FF90A731DDDEB420034C3B6 /* ParseQueryResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A6C1DDDEB420034C3B6 /* ParseQueryResponseTests.swift */; }; - 9FF90A761DDDEB4C0034C3B6 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A751DDDEB4C0034C3B6 /* Utilities.swift */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - 9F438D091E6C30C3007BDC1A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 9FC7503B1D2A532C00458D91 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9FCE2CF91E6C213D00E34457; - remoteInfo = StarWarsAPI; - }; - 9FC631391E6AE2080062707E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 9FC7503B1D2A532C00458D91 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9FC750431D2A532C00458D91; - remoteInfo = "Apollo iOS"; - }; - 9FC6313E1E6AE2D90062707E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 9FC7503B1D2A532C00458D91 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9FD637E01E6ACF88001EDBC8; - remoteInfo = "TestHost iOS"; - }; - 9FC750501D2A532D00458D91 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 9FC7503B1D2A532C00458D91 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9FC750431D2A532C00458D91; - remoteInfo = Apollo; - }; - 9FCE2CFF1E6C213D00E34457 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 9FC7503B1D2A532C00458D91 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9FCE2CF91E6C213D00E34457; - remoteInfo = StarWarsAPI; - }; - 9FCE2D071E6C254000E34457 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 9FC7503B1D2A532C00458D91 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9FCE2CF91E6C213D00E34457; - remoteInfo = StarWarsAPI; - }; - 9FD637F71E6AD43F001EDBC8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 9FC7503B1D2A532C00458D91 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9FC750431D2A532C00458D91; - remoteInfo = "Apollo iOS"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9FD637F91E6AD440001EDBC8 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 9FCE2D021E6C213D00E34457 /* StarWarsAPI.framework in Embed Frameworks */, - 9FD637F61E6AD43F001EDBC8 /* Apollo.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - /* Begin PBXFileReference section */ 544623A01E941BB100362E34 /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; 544623A21E941BD700362E34 /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCache.swift; sourceTree = ""; }; - 9F0F98D31E7AC17D00BF0371 /* StoreTransactionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreTransactionTests.swift; sourceTree = ""; }; 9F0F98E01E7BCC3400BF0371 /* Dictionary+KeyPath.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Dictionary+KeyPath.swift"; sourceTree = ""; }; 9F27D4631D40379500715680 /* JSONStandardTypeConversions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSONStandardTypeConversions.swift; sourceTree = ""; }; - 9F295E2B1E27418F00A24949 /* StarWarsServerCachingRoundtripTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StarWarsServerCachingRoundtripTests.swift; sourceTree = ""; }; - 9F295E301E27534800A24949 /* NormalizeQueryResults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NormalizeQueryResults.swift; sourceTree = ""; }; 9F295E371E277B2A00A24949 /* GraphQLResultNormalizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResultNormalizer.swift; sourceTree = ""; }; - 9F438D0B1E6C494C007BDC1A /* BatchedLoadTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BatchedLoadTests.swift; sourceTree = ""; }; 9F4DAF2D1E48B84B00EBFF0B /* HTTPNetworkTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPNetworkTransport.swift; sourceTree = ""; }; 9F55347A1DE1DB2100E54264 /* ApolloStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApolloStore.swift; sourceTree = ""; }; - 9F55347D1DE1DB3500E54264 /* LoadQueryFromStoreTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadQueryFromStoreTests.swift; sourceTree = ""; }; 9F578D8F1D8D2CB300C0EA36 /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Framework.xcconfig; path = ../Framework.xcconfig; sourceTree = ""; }; - 9F69FFA61D4271F400E000B1 /* StarWarsServerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StarWarsServerTests.swift; sourceTree = ""; }; 9F69FFA81D42855900E000B1 /* NetworkTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkTransport.swift; sourceTree = ""; }; 9F86B68A1E6438D700B885FF /* GraphQLResultMapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResultMapper.swift; sourceTree = ""; }; 9F86B68F1E65533D00B885FF /* GraphQLResponseGenerator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResponseGenerator.swift; sourceTree = ""; }; 9FA6F3671E65DF4700BF8D73 /* GraphQLResultAccumulator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResultAccumulator.swift; sourceTree = ""; }; 9FADC8491E6B0B2300C677E6 /* Locking.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Locking.swift; sourceTree = ""; }; 9FADC84E1E6B865E00C677E6 /* DataLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataLoader.swift; sourceTree = ""; }; - 9FADC8531E6B86D900C677E6 /* DataLoaderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataLoaderTests.swift; sourceTree = ""; }; 9FC2333C1E66BBF7001E4541 /* GraphQLDependencyTracker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLDependencyTracker.swift; sourceTree = ""; }; 9FC4B91F1D2A6F8D0046A641 /* JSON.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSON.swift; sourceTree = ""; }; - 9FC631331E6AE2080062707E /* ApolloPerformanceTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloPerformanceTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 9FC631351E6AE2080062707E /* PromiseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromiseTests.swift; sourceTree = ""; }; - 9FC631371E6AE2080062707E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9FC750441D2A532C00458D91 /* Apollo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Apollo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9FC750471D2A532C00458D91 /* Apollo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Apollo.h; sourceTree = ""; }; 9FC750491D2A532C00458D91 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9FC7504E1D2A532D00458D91 /* ApolloTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 9FC750551D2A532D00458D91 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9FC750601D2A59C300458D91 /* GraphQLOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLOperation.swift; sourceTree = ""; }; 9FC750621D2A59F600458D91 /* ApolloClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApolloClient.swift; sourceTree = ""; }; 9FC9A9BC1E2C271C0023C4D5 /* RecordSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecordSet.swift; sourceTree = ""; }; 9FC9A9BE1E2C27FB0023C4D5 /* GraphQLResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResult.swift; sourceTree = ""; }; 9FC9A9C11E2D3CAF0023C4D5 /* GraphQLValues.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLValues.swift; sourceTree = ""; }; 9FC9A9C41E2D6CE70023C4D5 /* Selections.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Selections.swift; sourceTree = ""; }; - 9FC9A9C71E2EFE6E0023C4D5 /* CacheKeyForFieldTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CacheKeyForFieldTests.swift; sourceTree = ""; }; 9FC9A9CB1E2FD0760023C4D5 /* Record.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Record.swift; sourceTree = ""; }; 9FC9A9D21E2FD48B0023C4D5 /* GraphQLError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLError.swift; sourceTree = ""; }; - 9FCDFD1E1E32EABB007519DC /* FetchQueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchQueryTests.swift; sourceTree = ""; }; 9FCDFD221E33A0D8007519DC /* AsynchronousOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsynchronousOperation.swift; sourceTree = ""; }; 9FCDFD281E33D0CE007519DC /* GraphQLQueryWatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLQueryWatcher.swift; sourceTree = ""; }; - 9FCDFD2B1E35784B007519DC /* WatchQueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchQueryTests.swift; sourceTree = ""; }; - 9FCDFD2E1E3579B6007519DC /* MockNetworkTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockNetworkTransport.swift; sourceTree = ""; }; - 9FCE2CEB1E6BDAD100E34457 /* NormalizedCachingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NormalizedCachingTests.swift; sourceTree = ""; }; 9FCE2CED1E6BE2D800E34457 /* NormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NormalizedCache.swift; sourceTree = ""; }; - 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = StarWarsAPI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 9FCE2CFC1E6C213D00E34457 /* StarWarsAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StarWarsAPI.h; sourceTree = ""; }; - 9FCE2CFD1E6C213D00E34457 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9FCE2D0A1E6C258A00E34457 /* API.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; - 9FCE2D0C1E6C259B00E34457 /* CreateReviewForEpisode.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CreateReviewForEpisode.graphql; sourceTree = ""; }; - 9FCE2D0D1E6C259B00E34457 /* HeroAndFriendsNames.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroAndFriendsNames.graphql; sourceTree = ""; }; - 9FCE2D0E1E6C259B00E34457 /* HeroAppearsIn.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroAppearsIn.graphql; sourceTree = ""; }; - 9FCE2D0F1E6C259B00E34457 /* HeroDetails.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroDetails.graphql; sourceTree = ""; }; - 9FCE2D101E6C259B00E34457 /* HeroDetailsWithFragment.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroDetailsWithFragment.graphql; sourceTree = ""; }; - 9FCE2D111E6C259B00E34457 /* HeroName.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroName.graphql; sourceTree = ""; }; - 9FCE2D121E6C259B00E34457 /* HeroNameConditional.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroNameConditional.graphql; sourceTree = ""; }; - 9FCE2D131E6C259B00E34457 /* HeroParentTypeDependentField.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroParentTypeDependentField.graphql; sourceTree = ""; }; - 9FCE2D141E6C259B00E34457 /* HeroTypeDependentAliasedField.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroTypeDependentAliasedField.graphql; sourceTree = ""; }; - 9FCE2D151E6C259B00E34457 /* HumanWithNullMass.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HumanWithNullMass.graphql; sourceTree = ""; }; - 9FCE2D161E6C259B00E34457 /* SameHeroTwice.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SameHeroTwice.graphql; sourceTree = ""; }; - 9FCE2D171E6C259B00E34457 /* Starship.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Starship.graphql; sourceTree = ""; }; - 9FCE2D181E6C259B00E34457 /* TwoHeroes.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = TwoHeroes.graphql; sourceTree = ""; }; - 9FD637E11E6ACF88001EDBC8 /* TestHost iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "TestHost iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 9FD637E31E6ACF88001EDBC8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 9FD637E51E6ACF88001EDBC8 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 9FD637E81E6ACF88001EDBC8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 9FD637EA1E6ACF88001EDBC8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 9FD637ED1E6ACF88001EDBC8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 9FD637EF1E6ACF88001EDBC8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9FE1C6E61E634C8D00C02284 /* PromiseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseTests.swift; sourceTree = ""; }; 9FE3F3971DADBD870072078F /* check-and-run-apollo-codegen.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "check-and-run-apollo-codegen.sh"; path = "scripts/check-and-run-apollo-codegen.sh"; sourceTree = SOURCE_ROOT; }; 9FE941CA1E5F20CA007CDD89 /* GraphQLOutputType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLOutputType.swift; sourceTree = ""; }; 9FE941CF1E62C771007CDD89 /* Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Promise.swift; sourceTree = ""; }; @@ -228,22 +85,9 @@ 9FEC15B81E6965E300D461B4 /* Result.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; }; 9FF90A5B1DDDEB100034C3B6 /* GraphQLResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResponse.swift; sourceTree = ""; }; 9FF90A5C1DDDEB100034C3B6 /* GraphQLExecutor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLExecutor.swift; sourceTree = ""; }; - 9FF90A6A1DDDEB420034C3B6 /* GraphQLInputValueEncodingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLInputValueEncodingTests.swift; sourceTree = ""; }; - 9FF90A6B1DDDEB420034C3B6 /* GraphQLExecutorFieldValueTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLExecutorFieldValueTests.swift; sourceTree = ""; }; - 9FF90A6C1DDDEB420034C3B6 /* ParseQueryResponseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParseQueryResponseTests.swift; sourceTree = ""; }; - 9FF90A751DDDEB4C0034C3B6 /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 9FC631301E6AE2080062707E /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9FC631381E6AE2080062707E /* Apollo.framework in Frameworks */, - 9F438D081E6C30B1007BDC1A /* StarWarsAPI.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 9FC750401D2A532C00458D91 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -251,32 +95,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9FC7504B1D2A532D00458D91 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9FC7504F1D2A532D00458D91 /* Apollo.framework in Frameworks */, - 9FCE2D091E6C254700E34457 /* StarWarsAPI.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9FCE2CF61E6C213D00E34457 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9F438D071E6C2FD9007BDC1A /* Apollo.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9FD637DE1E6ACF88001EDBC8 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9FCE2D011E6C213D00E34457 /* StarWarsAPI.framework in Frameworks */, - 9FD637F51E6AD43F001EDBC8 /* Apollo.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -289,14 +107,6 @@ name = NormalizedCaches; sourceTree = ""; }; - 9F17BC471DAF055A00138496 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 9FC750551D2A532D00458D91 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; 9F27D4601D40363A00715680 /* Execution */ = { isa = PBXGroup; children = ( @@ -323,21 +133,10 @@ name = JSON; sourceTree = ""; }; - 9FC631341E6AE2080062707E /* ApolloPerformanceTests */ = { - isa = PBXGroup; - children = ( - 9FC631351E6AE2080062707E /* PromiseTests.swift */, - 9FCE2CEB1E6BDAD100E34457 /* NormalizedCachingTests.swift */, - 9FC631371E6AE2080062707E /* Info.plist */, - ); - path = ApolloPerformanceTests; - sourceTree = ""; - }; 9FC7503A1D2A532C00458D91 = { isa = PBXGroup; children = ( 9FC750461D2A532C00458D91 /* Apollo */, - 9FCE2CF41E6C20E000E34457 /* Tests */, 9FC750451D2A532C00458D91 /* Products */, ); sourceTree = ""; @@ -346,10 +145,6 @@ isa = PBXGroup; children = ( 9FC750441D2A532C00458D91 /* Apollo.framework */, - 9FC7504E1D2A532D00458D91 /* ApolloTests.xctest */, - 9FD637E11E6ACF88001EDBC8 /* TestHost iOS.app */, - 9FC631331E6AE2080062707E /* ApolloPerformanceTests.xctest */, - 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */, ); name = Products; sourceTree = ""; @@ -373,29 +168,6 @@ path = Sources; sourceTree = ""; }; - 9FC750521D2A532D00458D91 /* ApolloTests */ = { - isa = PBXGroup; - children = ( - 9FCDFD1E1E32EABB007519DC /* FetchQueryTests.swift */, - 9FCDFD2B1E35784B007519DC /* WatchQueryTests.swift */, - 9FF90A6C1DDDEB420034C3B6 /* ParseQueryResponseTests.swift */, - 9F295E301E27534800A24949 /* NormalizeQueryResults.swift */, - 9F55347D1DE1DB3500E54264 /* LoadQueryFromStoreTests.swift */, - 9F0F98D31E7AC17D00BF0371 /* StoreTransactionTests.swift */, - 9F438D0B1E6C494C007BDC1A /* BatchedLoadTests.swift */, - 9FF90A6A1DDDEB420034C3B6 /* GraphQLInputValueEncodingTests.swift */, - 9FF90A6B1DDDEB420034C3B6 /* GraphQLExecutorFieldValueTests.swift */, - 9FC9A9C71E2EFE6E0023C4D5 /* CacheKeyForFieldTests.swift */, - 9FE1C6E61E634C8D00C02284 /* PromiseTests.swift */, - 9FADC8531E6B86D900C677E6 /* DataLoaderTests.swift */, - 9FCDFD2E1E3579B6007519DC /* MockNetworkTransport.swift */, - 9FF90A751DDDEB4C0034C3B6 /* Utilities.swift */, - 9FC9A9D51E2FD5690023C4D5 /* Integration */, - 9F17BC471DAF055A00138496 /* Supporting Files */, - ); - path = ApolloTests; - sourceTree = ""; - }; 9FC9A9CA1E2FD05C0023C4D5 /* Store */ = { isa = PBXGroup; children = ( @@ -419,15 +191,6 @@ name = Network; sourceTree = ""; }; - 9FC9A9D51E2FD5690023C4D5 /* Integration */ = { - isa = PBXGroup; - children = ( - 9F69FFA61D4271F400E000B1 /* StarWarsServerTests.swift */, - 9F295E2B1E27418F00A24949 /* StarWarsServerCachingRoundtripTests.swift */, - ); - name = Integration; - sourceTree = ""; - }; 9FCDFD211E33A09F007519DC /* Utilities */ = { isa = PBXGroup; children = ( @@ -442,53 +205,6 @@ name = Utilities; sourceTree = ""; }; - 9FCE2CF41E6C20E000E34457 /* Tests */ = { - isa = PBXGroup; - children = ( - 9FC750521D2A532D00458D91 /* ApolloTests */, - 9FC631341E6AE2080062707E /* ApolloPerformanceTests */, - 9FCE2CFB1E6C213D00E34457 /* StarWarsAPI */, - 9FD637E21E6ACF88001EDBC8 /* TestHost iOS */, - ); - path = Tests; - sourceTree = ""; - }; - 9FCE2CFB1E6C213D00E34457 /* StarWarsAPI */ = { - isa = PBXGroup; - children = ( - 9FCE2D0C1E6C259B00E34457 /* CreateReviewForEpisode.graphql */, - 9FCE2D0D1E6C259B00E34457 /* HeroAndFriendsNames.graphql */, - 9FCE2D0E1E6C259B00E34457 /* HeroAppearsIn.graphql */, - 9FCE2D0F1E6C259B00E34457 /* HeroDetails.graphql */, - 9FCE2D101E6C259B00E34457 /* HeroDetailsWithFragment.graphql */, - 9FCE2D111E6C259B00E34457 /* HeroName.graphql */, - 9FCE2D121E6C259B00E34457 /* HeroNameConditional.graphql */, - 9FCE2D131E6C259B00E34457 /* HeroParentTypeDependentField.graphql */, - 9FCE2D141E6C259B00E34457 /* HeroTypeDependentAliasedField.graphql */, - 9FCE2D151E6C259B00E34457 /* HumanWithNullMass.graphql */, - 9FCE2D161E6C259B00E34457 /* SameHeroTwice.graphql */, - 9FCE2D171E6C259B00E34457 /* Starship.graphql */, - 9FCE2D181E6C259B00E34457 /* TwoHeroes.graphql */, - 9FCE2D0A1E6C258A00E34457 /* API.swift */, - 9FCE2CFC1E6C213D00E34457 /* StarWarsAPI.h */, - 9FCE2CFD1E6C213D00E34457 /* Info.plist */, - ); - path = StarWarsAPI; - sourceTree = ""; - }; - 9FD637E21E6ACF88001EDBC8 /* TestHost iOS */ = { - isa = PBXGroup; - children = ( - 9FD637E31E6ACF88001EDBC8 /* AppDelegate.swift */, - 9FD637E51E6ACF88001EDBC8 /* ViewController.swift */, - 9FD637E71E6ACF88001EDBC8 /* Main.storyboard */, - 9FD637EA1E6ACF88001EDBC8 /* Assets.xcassets */, - 9FD637EC1E6ACF88001EDBC8 /* LaunchScreen.storyboard */, - 9FD637EF1E6ACF88001EDBC8 /* Info.plist */, - ); - path = "TestHost iOS"; - sourceTree = ""; - }; 9FE3F3961DADBD0D0072078F /* Supporting Files */ = { isa = PBXGroup; children = ( @@ -511,37 +227,9 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9FCE2CF71E6C213D00E34457 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 9FCE2CFE1E6C213D00E34457 /* StarWarsAPI.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 9FC631321E6AE2080062707E /* ApolloPerformanceTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9FC6313B1E6AE2080062707E /* Build configuration list for PBXNativeTarget "ApolloPerformanceTests" */; - buildPhases = ( - 9FC6312F1E6AE2080062707E /* Sources */, - 9FC631301E6AE2080062707E /* Frameworks */, - 9FC631311E6AE2080062707E /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 9FC6313A1E6AE2080062707E /* PBXTargetDependency */, - 9F438D0A1E6C30C3007BDC1A /* PBXTargetDependency */, - 9FC6313F1E6AE2D90062707E /* PBXTargetDependency */, - ); - name = ApolloPerformanceTests; - productName = ApolloPerformanceTests; - productReference = 9FC631331E6AE2080062707E /* ApolloPerformanceTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; 9FC750431D2A532C00458D91 /* Apollo */ = { isa = PBXNativeTarget; buildConfigurationList = 9FC750581D2A532D00458D91 /* Build configuration list for PBXNativeTarget "Apollo" */; @@ -560,64 +248,6 @@ productReference = 9FC750441D2A532C00458D91 /* Apollo.framework */; productType = "com.apple.product-type.framework"; }; - 9FC7504D1D2A532D00458D91 /* ApolloTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9FC7505B1D2A532D00458D91 /* Build configuration list for PBXNativeTarget "ApolloTests" */; - buildPhases = ( - 9FC7504A1D2A532D00458D91 /* Sources */, - 9FC7504B1D2A532D00458D91 /* Frameworks */, - 9FC7504C1D2A532D00458D91 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 9FC750511D2A532D00458D91 /* PBXTargetDependency */, - 9FCE2D081E6C254000E34457 /* PBXTargetDependency */, - ); - name = ApolloTests; - productName = ApolloTests; - productReference = 9FC7504E1D2A532D00458D91 /* ApolloTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 9FCE2CF91E6C213D00E34457 /* StarWarsAPI */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9FCE2D031E6C213D00E34457 /* Build configuration list for PBXNativeTarget "StarWarsAPI" */; - buildPhases = ( - 9FCE2D061E6C251100E34457 /* Generate Apollo Client API */, - 9FCE2CF51E6C213D00E34457 /* Sources */, - 9FCE2CF61E6C213D00E34457 /* Frameworks */, - 9FCE2CF71E6C213D00E34457 /* Headers */, - 9FCE2CF81E6C213D00E34457 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = StarWarsAPI; - productName = StarWarsAPI; - productReference = 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */; - productType = "com.apple.product-type.framework"; - }; - 9FD637E01E6ACF88001EDBC8 /* TestHost iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9FD637F01E6ACF88001EDBC8 /* Build configuration list for PBXNativeTarget "TestHost iOS" */; - buildPhases = ( - 9FD637DD1E6ACF88001EDBC8 /* Sources */, - 9FD637DE1E6ACF88001EDBC8 /* Frameworks */, - 9FD637DF1E6ACF88001EDBC8 /* Resources */, - 9FD637F91E6AD440001EDBC8 /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 9FD637F81E6AD43F001EDBC8 /* PBXTargetDependency */, - 9FCE2D001E6C213D00E34457 /* PBXTargetDependency */, - ); - name = "TestHost iOS"; - productName = "TestHost iOS"; - productReference = 9FD637E11E6ACF88001EDBC8 /* TestHost iOS.app */; - productType = "com.apple.product-type.application"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -628,12 +258,6 @@ LastUpgradeCheck = 0810; ORGANIZATIONNAME = "Apollo GraphQL"; TargetAttributes = { - 9FC631321E6AE2080062707E = { - CreatedOnToolsVersion = 8.2.1; - DevelopmentTeam = 5TL236FN6U; - ProvisioningStyle = Automatic; - TestTargetID = 9FD637E01E6ACF88001EDBC8; - }; 9FC750431D2A532C00458D91 = { CreatedOnToolsVersion = 8.0; DevelopmentTeam = 5TL236FN6U; @@ -641,23 +265,6 @@ LastSwiftMigration = 0800; ProvisioningStyle = Automatic; }; - 9FC7504D1D2A532D00458D91 = { - CreatedOnToolsVersion = 8.0; - DevelopmentTeam = 5TL236FN6U; - DevelopmentTeamName = "Martijn Walraven"; - ProvisioningStyle = Automatic; - }; - 9FCE2CF91E6C213D00E34457 = { - CreatedOnToolsVersion = 8.2.1; - DevelopmentTeam = 5TL236FN6U; - LastSwiftMigration = 0820; - ProvisioningStyle = Automatic; - }; - 9FD637E01E6ACF88001EDBC8 = { - CreatedOnToolsVersion = 8.2.1; - DevelopmentTeam = 5TL236FN6U; - ProvisioningStyle = Automatic; - }; }; }; buildConfigurationList = 9FC7503E1D2A532C00458D91 /* Build configuration list for PBXProject "Apollo" */; @@ -674,22 +281,11 @@ projectRoot = ""; targets = ( 9FC750431D2A532C00458D91 /* Apollo */, - 9FC631321E6AE2080062707E /* ApolloPerformanceTests */, - 9FC7504D1D2A532D00458D91 /* ApolloTests */, - 9FCE2CF91E6C213D00E34457 /* StarWarsAPI */, - 9FD637E01E6ACF88001EDBC8 /* TestHost iOS */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 9FC631311E6AE2080062707E /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 9FC750421D2A532C00458D91 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -698,59 +294,9 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9FC7504C1D2A532D00458D91 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9FCE2CF81E6C213D00E34457 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9FD637DF1E6ACF88001EDBC8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9FD637EE1E6ACF88001EDBC8 /* LaunchScreen.storyboard in Resources */, - 9FD637EB1E6ACF88001EDBC8 /* Assets.xcassets in Resources */, - 9FD637E91E6ACF88001EDBC8 /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ -/* Begin PBXShellScriptBuildPhase section */ - 9FCE2D061E6C251100E34457 /* Generate Apollo Client API */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Generate Apollo Client API"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "APOLLO_FRAMEWORK_PATH=$(eval find $FRAMEWORK_SEARCH_PATHS -name \"Apollo.framework\" -maxdepth 1)\n\nif [ -z \"$APOLLO_FRAMEWORK_PATH\" ]; then\necho \"error: Couldn't find Apollo.framework in FRAMEWORK_SEARCH_PATHS; make sure to add the framework to your project.\"\nexit 1\nfi\n\ncd ${SRCROOT}/Tests/StarWarsAPI\n$(find $APOLLO_FRAMEWORK_PATH -name 'check-and-run-apollo-codegen.sh') generate $(find . -name '*.graphql') --schema schema.json --output API.swift"; - }; -/* End PBXShellScriptBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ - 9FC6312F1E6AE2080062707E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9FC631361E6AE2080062707E /* PromiseTests.swift in Sources */, - 9FCE2CEC1E6BDAD100E34457 /* NormalizedCachingTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 9FC7503F1D2A532C00458D91 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -792,132 +338,9 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9FC7504A1D2A532D00458D91 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9FC9A9C81E2EFE6E0023C4D5 /* CacheKeyForFieldTests.swift in Sources */, - 9F533AB31E6C4A4200CBE097 /* BatchedLoadTests.swift in Sources */, - 9F69FFA71D4271F400E000B1 /* StarWarsServerTests.swift in Sources */, - 9F295E2D1E27419800A24949 /* StarWarsServerCachingRoundtripTests.swift in Sources */, - 9FF90A6F1DDDEB420034C3B6 /* GraphQLInputValueEncodingTests.swift in Sources */, - 9FF90A761DDDEB4C0034C3B6 /* Utilities.swift in Sources */, - 9F55347E1DE1DB3500E54264 /* LoadQueryFromStoreTests.swift in Sources */, - 9F6291C71E39775000CDA57B /* MockNetworkTransport.swift in Sources */, - 9FE1C6E71E634C8D00C02284 /* PromiseTests.swift in Sources */, - 9FCDFD1F1E32EABB007519DC /* FetchQueryTests.swift in Sources */, - 9FADC8541E6B86D900C677E6 /* DataLoaderTests.swift in Sources */, - 9FF90A711DDDEB420034C3B6 /* GraphQLExecutorFieldValueTests.swift in Sources */, - 9F0F98D41E7AC17D00BF0371 /* StoreTransactionTests.swift in Sources */, - 9FCDFD2C1E35784B007519DC /* WatchQueryTests.swift in Sources */, - 9F295E311E27534800A24949 /* NormalizeQueryResults.swift in Sources */, - 9FF90A731DDDEB420034C3B6 /* ParseQueryResponseTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9FCE2CF51E6C213D00E34457 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9FCE2D0B1E6C258A00E34457 /* API.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9FD637DD1E6ACF88001EDBC8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9FD637E61E6ACF88001EDBC8 /* ViewController.swift in Sources */, - 9FD637E41E6ACF88001EDBC8 /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 9F438D0A1E6C30C3007BDC1A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 9FCE2CF91E6C213D00E34457 /* StarWarsAPI */; - targetProxy = 9F438D091E6C30C3007BDC1A /* PBXContainerItemProxy */; - }; - 9FC6313A1E6AE2080062707E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 9FC750431D2A532C00458D91 /* Apollo */; - targetProxy = 9FC631391E6AE2080062707E /* PBXContainerItemProxy */; - }; - 9FC6313F1E6AE2D90062707E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 9FD637E01E6ACF88001EDBC8 /* TestHost iOS */; - targetProxy = 9FC6313E1E6AE2D90062707E /* PBXContainerItemProxy */; - }; - 9FC750511D2A532D00458D91 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 9FC750431D2A532C00458D91 /* Apollo */; - targetProxy = 9FC750501D2A532D00458D91 /* PBXContainerItemProxy */; - }; - 9FCE2D001E6C213D00E34457 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 9FCE2CF91E6C213D00E34457 /* StarWarsAPI */; - targetProxy = 9FCE2CFF1E6C213D00E34457 /* PBXContainerItemProxy */; - }; - 9FCE2D081E6C254000E34457 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 9FCE2CF91E6C213D00E34457 /* StarWarsAPI */; - targetProxy = 9FCE2D071E6C254000E34457 /* PBXContainerItemProxy */; - }; - 9FD637F81E6AD43F001EDBC8 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 9FC750431D2A532C00458D91 /* Apollo */; - targetProxy = 9FD637F71E6AD43F001EDBC8 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 9FD637E71E6ACF88001EDBC8 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 9FD637E81E6ACF88001EDBC8 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 9FD637EC1E6ACF88001EDBC8 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 9FD637ED1E6ACF88001EDBC8 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - /* Begin XCBuildConfiguration section */ - 9FC6313C1E6AE2080062707E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEVELOPMENT_TEAM = 5TL236FN6U; - INFOPLIST_FILE = Tests/ApolloPerformanceTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloPerformanceTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestHost iOS.app/TestHost iOS"; - }; - name = Debug; - }; - 9FC6313D1E6AE2080062707E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEVELOPMENT_TEAM = 5TL236FN6U; - INFOPLIST_FILE = Tests/ApolloPerformanceTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloPerformanceTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestHost iOS.app/TestHost iOS"; - }; - name = Release; - }; 9FC750561D2A532D00458D91 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1039,86 +462,6 @@ }; name = Release; }; - 9FC7505C1D2A532D00458D91 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = Tests/ApolloTests/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = com.apollostack.ApolloTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 9FC7505D1D2A532D00458D91 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = Tests/ApolloTests/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = com.apollostack.ApolloTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 9FCE2D041E6C213D00E34457 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */; - buildSettings = { - DEFINES_MODULE = YES; - INFOPLIST_FILE = Tests/StarWarsAPI/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.StarWarsAPI; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 9FCE2D051E6C213D00E34457 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */; - buildSettings = { - DEFINES_MODULE = YES; - INFOPLIST_FILE = Tests/StarWarsAPI/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.StarWarsAPI; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; - 9FD637F11E6ACF88001EDBC8 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = 5TL236FN6U; - INFOPLIST_FILE = "Tests/TestHost iOS/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.TestHost; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - 9FD637F21E6ACF88001EDBC8 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = 5TL236FN6U; - INFOPLIST_FILE = "Tests/TestHost iOS/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.TestHost; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; 9FEFCFCD1E6C65CE0061834C /* PerformanceTesting */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1177,72 +520,9 @@ }; name = PerformanceTesting; }; - 9FEFCFCF1E6C65CE0061834C /* PerformanceTesting */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEVELOPMENT_TEAM = 5TL236FN6U; - INFOPLIST_FILE = Tests/ApolloPerformanceTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloPerformanceTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestHost iOS.app/TestHost iOS"; - }; - name = PerformanceTesting; - }; - 9FEFCFD01E6C65CE0061834C /* PerformanceTesting */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = Tests/ApolloTests/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = com.apollostack.ApolloTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = PerformanceTesting; - }; - 9FEFCFD61E6C65CE0061834C /* PerformanceTesting */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */; - buildSettings = { - DEFINES_MODULE = YES; - INFOPLIST_FILE = Tests/StarWarsAPI/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.StarWarsAPI; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = PerformanceTesting; - }; - 9FEFCFD71E6C65CE0061834C /* PerformanceTesting */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = 5TL236FN6U; - INFOPLIST_FILE = "Tests/TestHost iOS/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.TestHost; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; - SWIFT_VERSION = 3.0; - }; - name = PerformanceTesting; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 9FC6313B1E6AE2080062707E /* Build configuration list for PBXNativeTarget "ApolloPerformanceTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9FC6313C1E6AE2080062707E /* Debug */, - 9FC6313D1E6AE2080062707E /* Release */, - 9FEFCFCF1E6C65CE0061834C /* PerformanceTesting */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 9FC7503E1D2A532C00458D91 /* Build configuration list for PBXProject "Apollo" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1263,36 +543,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 9FC7505B1D2A532D00458D91 /* Build configuration list for PBXNativeTarget "ApolloTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9FC7505C1D2A532D00458D91 /* Debug */, - 9FC7505D1D2A532D00458D91 /* Release */, - 9FEFCFD01E6C65CE0061834C /* PerformanceTesting */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 9FCE2D031E6C213D00E34457 /* Build configuration list for PBXNativeTarget "StarWarsAPI" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9FCE2D041E6C213D00E34457 /* Debug */, - 9FCE2D051E6C213D00E34457 /* Release */, - 9FEFCFD61E6C65CE0061834C /* PerformanceTesting */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 9FD637F01E6ACF88001EDBC8 /* Build configuration list for PBXNativeTarget "TestHost iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 9FD637F11E6ACF88001EDBC8 /* Debug */, - 9FD637F21E6ACF88001EDBC8 /* Release */, - 9FEFCFD71E6C65CE0061834C /* PerformanceTesting */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = 9FC7503B1D2A532C00458D91 /* Project object */; diff --git a/Example/ApolloExample.xcodeproj/project.pbxproj b/Example/ApolloExample.xcodeproj/project.pbxproj index 8033abd7e9..1d4ff06dd5 100644 --- a/Example/ApolloExample.xcodeproj/project.pbxproj +++ b/Example/ApolloExample.xcodeproj/project.pbxproj @@ -7,30 +7,97 @@ objects = { /* Begin PBXBuildFile section */ + 18CAED8E9CA518A8387C31B5 /* Pods_ApolloTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 81EA39E0FF49825755B1B12F /* Pods_ApolloTests.framework */; }; + 5454C0881E944FD400661138 /* StarWarsAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 5454C0861E944FD400661138 /* StarWarsAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; 54E966D41E9447F7002884AD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E966D31E9447F7002884AD /* AppDelegate.swift */; }; 54E966D61E9447F7002884AD /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E966D51E9447F7002884AD /* ViewController.swift */; }; 54E966D91E9447F7002884AD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 54E966D71E9447F7002884AD /* Main.storyboard */; }; 54E966DB1E9447F7002884AD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 54E966DA1E9447F7002884AD /* Assets.xcassets */; }; 54E966DE1E9447F7002884AD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 54E966DC1E9447F7002884AD /* LaunchScreen.storyboard */; }; - 54E966E91E9447F7002884AD /* ApolloExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E966E81E9447F7002884AD /* ApolloExampleTests.swift */; }; + 54FFC8341E9478A300C72D16 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8241E9478A300C72D16 /* BatchedLoadTests.swift */; }; + 54FFC8351E9478A300C72D16 /* CacheKeyForFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8251E9478A300C72D16 /* CacheKeyForFieldTests.swift */; }; + 54FFC8361E9478A300C72D16 /* DataLoaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8261E9478A300C72D16 /* DataLoaderTests.swift */; }; + 54FFC8371E9478A300C72D16 /* FetchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8271E9478A300C72D16 /* FetchQueryTests.swift */; }; + 54FFC8381E9478A300C72D16 /* GraphQLExecutorFieldValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8281E9478A300C72D16 /* GraphQLExecutorFieldValueTests.swift */; }; + 54FFC8391E9478A300C72D16 /* GraphQLInputValueEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8291E9478A300C72D16 /* GraphQLInputValueEncodingTests.swift */; }; + 54FFC83A1E9478A300C72D16 /* LoadQueryFromStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC82A1E9478A300C72D16 /* LoadQueryFromStoreTests.swift */; }; + 54FFC83B1E9478A300C72D16 /* MockNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC82B1E9478A300C72D16 /* MockNetworkTransport.swift */; }; + 54FFC83C1E9478A300C72D16 /* NormalizeQueryResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC82C1E9478A300C72D16 /* NormalizeQueryResults.swift */; }; + 54FFC83D1E9478A300C72D16 /* ParseQueryResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC82D1E9478A300C72D16 /* ParseQueryResponseTests.swift */; }; + 54FFC83E1E9478A300C72D16 /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC82E1E9478A300C72D16 /* PromiseTests.swift */; }; + 54FFC83F1E9478A300C72D16 /* StarWarsServerCachingRoundtripTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC82F1E9478A300C72D16 /* StarWarsServerCachingRoundtripTests.swift */; }; + 54FFC8401E9478A300C72D16 /* StarWarsServerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8301E9478A300C72D16 /* StarWarsServerTests.swift */; }; + 54FFC8411E9478A300C72D16 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8311E9478A300C72D16 /* StoreTransactionTests.swift */; }; + 54FFC8421E9478A300C72D16 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8321E9478A300C72D16 /* Utilities.swift */; }; + 54FFC8431E9478A300C72D16 /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8331E9478A300C72D16 /* WatchQueryTests.swift */; }; + 54FFC8491E94796E00C72D16 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5454C0841E944FD400661138 /* StarWarsAPI.framework */; }; + 54FFC8591E947A2C00C72D16 /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC84A1E947A2B00C72D16 /* API.swift */; }; + 54FFC85A1E947A2C00C72D16 /* CreateReviewForEpisode.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC84B1E947A2B00C72D16 /* CreateReviewForEpisode.graphql */; }; + 54FFC85B1E947A2C00C72D16 /* HeroAndFriendsNames.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC84C1E947A2B00C72D16 /* HeroAndFriendsNames.graphql */; }; + 54FFC85C1E947A2C00C72D16 /* HeroAppearsIn.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC84D1E947A2B00C72D16 /* HeroAppearsIn.graphql */; }; + 54FFC85D1E947A2C00C72D16 /* HeroDetails.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC84E1E947A2B00C72D16 /* HeroDetails.graphql */; }; + 54FFC85E1E947A2C00C72D16 /* HeroDetailsWithFragment.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC84F1E947A2B00C72D16 /* HeroDetailsWithFragment.graphql */; }; + 54FFC85F1E947A2C00C72D16 /* HeroName.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8501E947A2C00C72D16 /* HeroName.graphql */; }; + 54FFC8601E947A2C00C72D16 /* HeroNameConditional.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8511E947A2C00C72D16 /* HeroNameConditional.graphql */; }; + 54FFC8611E947A2C00C72D16 /* HeroParentTypeDependentField.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8521E947A2C00C72D16 /* HeroParentTypeDependentField.graphql */; }; + 54FFC8621E947A2C00C72D16 /* HeroTypeDependentAliasedField.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8531E947A2C00C72D16 /* HeroTypeDependentAliasedField.graphql */; }; + 54FFC8631E947A2C00C72D16 /* HumanWithNullMass.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8541E947A2C00C72D16 /* HumanWithNullMass.graphql */; }; + 54FFC8641E947A2C00C72D16 /* SameHeroTwice.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8551E947A2C00C72D16 /* SameHeroTwice.graphql */; }; + 54FFC8651E947A2C00C72D16 /* schema.json in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8561E947A2C00C72D16 /* schema.json */; }; + 54FFC8661E947A2C00C72D16 /* Starship.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8571E947A2C00C72D16 /* Starship.graphql */; }; + 54FFC8671E947A2C00C72D16 /* TwoHeroes.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8581E947A2C00C72D16 /* TwoHeroes.graphql */; }; + 54FFC86F1E947CA900C72D16 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC86E1E947CA900C72D16 /* AppDelegate.swift */; }; + 54FFC8711E947CA900C72D16 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8701E947CA900C72D16 /* ViewController.swift */; }; + 54FFC8741E947CA900C72D16 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8721E947CA900C72D16 /* Main.storyboard */; }; + 54FFC8761E947CA900C72D16 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8751E947CA900C72D16 /* Assets.xcassets */; }; + 54FFC8791E947CA900C72D16 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8771E947CA900C72D16 /* LaunchScreen.storyboard */; }; + 54FFC88E1E947D5D00C72D16 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5454C0841E944FD400661138 /* StarWarsAPI.framework */; }; + 54FFC8921E947DBD00C72D16 /* NormalizedCachingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8901E947DBD00C72D16 /* NormalizedCachingTests.swift */; }; + 54FFC8931E947DBD00C72D16 /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8911E947DBD00C72D16 /* PromiseTests.swift */; }; + 6E850CF2A3A8848CB76D2220 /* Pods_ApolloPerformanceTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C5C4BC38A6DF130DAF68713 /* Pods_ApolloPerformanceTests.framework */; }; 720CD5ED88A1DBC2947C9278 /* Pods_ApolloExample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD21DBB0EAAEAC44C0DAE2E0 /* Pods_ApolloExample.framework */; }; - A9291F9A2E9ECFA8638C1319 /* Pods_ApolloExampleTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D924536227C50FAA0070E95 /* Pods_ApolloExampleTests.framework */; }; + CC09C19646CBF0BE364B3069 /* Pods_StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A05963DF880C07C7098254E7 /* Pods_StarWarsAPI.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 54E966E51E9447F7002884AD /* PBXContainerItemProxy */ = { + 54FFC81F1E94782400C72D16 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 54E966C81E9447F7002884AD /* Project object */; proxyType = 1; remoteGlobalIDString = 54E966CF1E9447F7002884AD; remoteInfo = ApolloExample; }; + 54FFC8471E94796400C72D16 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54E966C81E9447F7002884AD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5454C0831E944FD400661138; + remoteInfo = StarWarsAPI; + }; + 54FFC8871E947D0800C72D16 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54E966C81E9447F7002884AD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 54FFC86B1E947CA900C72D16; + remoteInfo = "TestHost iOS"; + }; + 54FFC88C1E947D3600C72D16 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54E966C81E9447F7002884AD /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5454C0831E944FD400661138; + remoteInfo = StarWarsAPI; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 1AAAF608B73F123ACD20BAB6 /* Pods-ApolloExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloExampleTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.release.xcconfig"; sourceTree = ""; }; + 2C1D521E7FD5370B3CEF23C5 /* Pods-StarWarsAPI.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StarWarsAPI.debug.xcconfig"; path = "Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.debug.xcconfig"; sourceTree = ""; }; 41AA21D8F253186B9E485F75 /* Pods-ApolloExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloExample.release.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.release.xcconfig"; sourceTree = ""; }; 4D924536227C50FAA0070E95 /* Pods_ApolloExampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ApolloExampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5454C0841E944FD400661138 /* StarWarsAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = StarWarsAPI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5454C0861E944FD400661138 /* StarWarsAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StarWarsAPI.h; sourceTree = ""; }; + 5454C0871E944FD400661138 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54E966D01E9447F7002884AD /* ApolloExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ApolloExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 54E966D31E9447F7002884AD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 54E966D51E9447F7002884AD /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -38,15 +105,72 @@ 54E966DA1E9447F7002884AD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 54E966DD1E9447F7002884AD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 54E966DF1E9447F7002884AD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 54E966E41E9447F7002884AD /* ApolloExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 54E966E81E9447F7002884AD /* ApolloExampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApolloExampleTests.swift; sourceTree = ""; }; - 54E966EA1E9447F7002884AD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 54FFC81A1E94782400C72D16 /* ApolloTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 54FFC81E1E94782400C72D16 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 54FFC8241E9478A300C72D16 /* BatchedLoadTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BatchedLoadTests.swift; sourceTree = ""; }; + 54FFC8251E9478A300C72D16 /* CacheKeyForFieldTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CacheKeyForFieldTests.swift; sourceTree = ""; }; + 54FFC8261E9478A300C72D16 /* DataLoaderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataLoaderTests.swift; sourceTree = ""; }; + 54FFC8271E9478A300C72D16 /* FetchQueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchQueryTests.swift; sourceTree = ""; }; + 54FFC8281E9478A300C72D16 /* GraphQLExecutorFieldValueTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLExecutorFieldValueTests.swift; sourceTree = ""; }; + 54FFC8291E9478A300C72D16 /* GraphQLInputValueEncodingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLInputValueEncodingTests.swift; sourceTree = ""; }; + 54FFC82A1E9478A300C72D16 /* LoadQueryFromStoreTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadQueryFromStoreTests.swift; sourceTree = ""; }; + 54FFC82B1E9478A300C72D16 /* MockNetworkTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockNetworkTransport.swift; sourceTree = ""; }; + 54FFC82C1E9478A300C72D16 /* NormalizeQueryResults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NormalizeQueryResults.swift; sourceTree = ""; }; + 54FFC82D1E9478A300C72D16 /* ParseQueryResponseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParseQueryResponseTests.swift; sourceTree = ""; }; + 54FFC82E1E9478A300C72D16 /* PromiseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseTests.swift; sourceTree = ""; }; + 54FFC82F1E9478A300C72D16 /* StarWarsServerCachingRoundtripTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StarWarsServerCachingRoundtripTests.swift; sourceTree = ""; }; + 54FFC8301E9478A300C72D16 /* StarWarsServerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StarWarsServerTests.swift; sourceTree = ""; }; + 54FFC8311E9478A300C72D16 /* StoreTransactionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreTransactionTests.swift; sourceTree = ""; }; + 54FFC8321E9478A300C72D16 /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; + 54FFC8331E9478A300C72D16 /* WatchQueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchQueryTests.swift; sourceTree = ""; }; + 54FFC84A1E947A2B00C72D16 /* API.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; + 54FFC84B1E947A2B00C72D16 /* CreateReviewForEpisode.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CreateReviewForEpisode.graphql; sourceTree = ""; }; + 54FFC84C1E947A2B00C72D16 /* HeroAndFriendsNames.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroAndFriendsNames.graphql; sourceTree = ""; }; + 54FFC84D1E947A2B00C72D16 /* HeroAppearsIn.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroAppearsIn.graphql; sourceTree = ""; }; + 54FFC84E1E947A2B00C72D16 /* HeroDetails.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroDetails.graphql; sourceTree = ""; }; + 54FFC84F1E947A2B00C72D16 /* HeroDetailsWithFragment.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroDetailsWithFragment.graphql; sourceTree = ""; }; + 54FFC8501E947A2C00C72D16 /* HeroName.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroName.graphql; sourceTree = ""; }; + 54FFC8511E947A2C00C72D16 /* HeroNameConditional.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroNameConditional.graphql; sourceTree = ""; }; + 54FFC8521E947A2C00C72D16 /* HeroParentTypeDependentField.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroParentTypeDependentField.graphql; sourceTree = ""; }; + 54FFC8531E947A2C00C72D16 /* HeroTypeDependentAliasedField.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroTypeDependentAliasedField.graphql; sourceTree = ""; }; + 54FFC8541E947A2C00C72D16 /* HumanWithNullMass.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HumanWithNullMass.graphql; sourceTree = ""; }; + 54FFC8551E947A2C00C72D16 /* SameHeroTwice.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SameHeroTwice.graphql; sourceTree = ""; }; + 54FFC8561E947A2C00C72D16 /* schema.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = schema.json; sourceTree = ""; }; + 54FFC8571E947A2C00C72D16 /* Starship.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Starship.graphql; sourceTree = ""; }; + 54FFC8581E947A2C00C72D16 /* TwoHeroes.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = TwoHeroes.graphql; sourceTree = ""; }; + 54FFC86C1E947CA900C72D16 /* TestHost iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "TestHost iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 54FFC86E1E947CA900C72D16 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 54FFC8701E947CA900C72D16 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 54FFC8731E947CA900C72D16 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 54FFC8751E947CA900C72D16 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 54FFC8781E947CA900C72D16 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 54FFC87A1E947CA900C72D16 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 54FFC8821E947D0800C72D16 /* ApolloPerformanceTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloPerformanceTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 54FFC8861E947D0800C72D16 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 54FFC8901E947DBD00C72D16 /* NormalizedCachingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NormalizedCachingTests.swift; sourceTree = ""; }; + 54FFC8911E947DBD00C72D16 /* PromiseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseTests.swift; sourceTree = ""; }; + 5C5C4BC38A6DF130DAF68713 /* Pods_ApolloPerformanceTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ApolloPerformanceTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 61F8D719D2C7FBF66AD2ED45 /* Pods-ApolloTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.debug.xcconfig"; sourceTree = ""; }; + 7F0F2E27BB660DC316A7B46A /* Pods-ApolloTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.release.xcconfig"; sourceTree = ""; }; + 81EA39E0FF49825755B1B12F /* Pods_ApolloTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ApolloTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 94187754DEB07DF0D9EDA415 /* Pods-StarWarsAPI.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StarWarsAPI.release.xcconfig"; path = "Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.release.xcconfig"; sourceTree = ""; }; 96252404982964864A31A200 /* Pods-ApolloExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloExampleTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.debug.xcconfig"; sourceTree = ""; }; + A05963DF880C07C7098254E7 /* Pods_StarWarsAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StarWarsAPI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; AD21DBB0EAAEAC44C0DAE2E0 /* Pods_ApolloExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ApolloExample.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C1B247319A0E9F0EB0132F61 /* Pods-ApolloPerformanceTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloPerformanceTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.debug.xcconfig"; sourceTree = ""; }; + DACC71495C403877EDD9A4D7 /* Pods-ApolloPerformanceTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloPerformanceTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.release.xcconfig"; sourceTree = ""; }; FC005AAA6953D6B8E8C04F0D /* Pods-ApolloExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloExample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 5454C0801E944FD400661138 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + CC09C19646CBF0BE364B3069 /* Pods_StarWarsAPI.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 54E966CD1E9447F7002884AD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -55,22 +179,66 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 54E966E11E9447F7002884AD /* Frameworks */ = { + 54FFC8171E94782400C72D16 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 54FFC8491E94796E00C72D16 /* StarWarsAPI.framework in Frameworks */, + 18CAED8E9CA518A8387C31B5 /* Pods_ApolloTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 54FFC8691E947CA900C72D16 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A9291F9A2E9ECFA8638C1319 /* Pods_ApolloExampleTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 54FFC87F1E947D0800C72D16 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 54FFC88E1E947D5D00C72D16 /* StarWarsAPI.framework in Frameworks */, + 6E850CF2A3A8848CB76D2220 /* Pods_ApolloPerformanceTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 5454C0851E944FD400661138 /* StarWarsAPI */ = { + isa = PBXGroup; + children = ( + 54FFC84A1E947A2B00C72D16 /* API.swift */, + 54FFC84B1E947A2B00C72D16 /* CreateReviewForEpisode.graphql */, + 54FFC84C1E947A2B00C72D16 /* HeroAndFriendsNames.graphql */, + 54FFC84D1E947A2B00C72D16 /* HeroAppearsIn.graphql */, + 54FFC84E1E947A2B00C72D16 /* HeroDetails.graphql */, + 54FFC84F1E947A2B00C72D16 /* HeroDetailsWithFragment.graphql */, + 54FFC8501E947A2C00C72D16 /* HeroName.graphql */, + 54FFC8511E947A2C00C72D16 /* HeroNameConditional.graphql */, + 54FFC8521E947A2C00C72D16 /* HeroParentTypeDependentField.graphql */, + 54FFC8531E947A2C00C72D16 /* HeroTypeDependentAliasedField.graphql */, + 54FFC8541E947A2C00C72D16 /* HumanWithNullMass.graphql */, + 54FFC8551E947A2C00C72D16 /* SameHeroTwice.graphql */, + 54FFC8561E947A2C00C72D16 /* schema.json */, + 54FFC8571E947A2C00C72D16 /* Starship.graphql */, + 54FFC8581E947A2C00C72D16 /* TwoHeroes.graphql */, + 5454C0861E944FD400661138 /* StarWarsAPI.h */, + 5454C0871E944FD400661138 /* Info.plist */, + ); + path = StarWarsAPI; + sourceTree = ""; + }; 54E966C71E9447F7002884AD = { isa = PBXGroup; children = ( 54E966D21E9447F7002884AD /* ApolloExample */, - 54E966E71E9447F7002884AD /* ApolloExampleTests */, + 5454C0851E944FD400661138 /* StarWarsAPI */, + 54FFC81B1E94782400C72D16 /* ApolloTests */, + 54FFC86D1E947CA900C72D16 /* TestHost iOS */, + 54FFC8831E947D0800C72D16 /* ApolloPerformanceTests */, 54E966D11E9447F7002884AD /* Products */, C1B8068DEABD85ECF3227AA2 /* Pods */, C96167F12B5E3E2FD9D057A4 /* Frameworks */, @@ -81,7 +249,10 @@ isa = PBXGroup; children = ( 54E966D01E9447F7002884AD /* ApolloExample.app */, - 54E966E41E9447F7002884AD /* ApolloExampleTests.xctest */, + 5454C0841E944FD400661138 /* StarWarsAPI.framework */, + 54FFC81A1E94782400C72D16 /* ApolloTests.xctest */, + 54FFC86C1E947CA900C72D16 /* TestHost iOS.app */, + 54FFC8821E947D0800C72D16 /* ApolloPerformanceTests.xctest */, ); name = Products; sourceTree = ""; @@ -99,13 +270,51 @@ path = ApolloExample; sourceTree = ""; }; - 54E966E71E9447F7002884AD /* ApolloExampleTests */ = { + 54FFC81B1E94782400C72D16 /* ApolloTests */ = { isa = PBXGroup; children = ( - 54E966E81E9447F7002884AD /* ApolloExampleTests.swift */, - 54E966EA1E9447F7002884AD /* Info.plist */, + 54FFC8241E9478A300C72D16 /* BatchedLoadTests.swift */, + 54FFC8251E9478A300C72D16 /* CacheKeyForFieldTests.swift */, + 54FFC8261E9478A300C72D16 /* DataLoaderTests.swift */, + 54FFC8271E9478A300C72D16 /* FetchQueryTests.swift */, + 54FFC8281E9478A300C72D16 /* GraphQLExecutorFieldValueTests.swift */, + 54FFC8291E9478A300C72D16 /* GraphQLInputValueEncodingTests.swift */, + 54FFC82A1E9478A300C72D16 /* LoadQueryFromStoreTests.swift */, + 54FFC82B1E9478A300C72D16 /* MockNetworkTransport.swift */, + 54FFC82C1E9478A300C72D16 /* NormalizeQueryResults.swift */, + 54FFC82D1E9478A300C72D16 /* ParseQueryResponseTests.swift */, + 54FFC82E1E9478A300C72D16 /* PromiseTests.swift */, + 54FFC82F1E9478A300C72D16 /* StarWarsServerCachingRoundtripTests.swift */, + 54FFC8301E9478A300C72D16 /* StarWarsServerTests.swift */, + 54FFC8311E9478A300C72D16 /* StoreTransactionTests.swift */, + 54FFC8321E9478A300C72D16 /* Utilities.swift */, + 54FFC8331E9478A300C72D16 /* WatchQueryTests.swift */, + 54FFC81E1E94782400C72D16 /* Info.plist */, ); - path = ApolloExampleTests; + path = ApolloTests; + sourceTree = ""; + }; + 54FFC86D1E947CA900C72D16 /* TestHost iOS */ = { + isa = PBXGroup; + children = ( + 54FFC86E1E947CA900C72D16 /* AppDelegate.swift */, + 54FFC8701E947CA900C72D16 /* ViewController.swift */, + 54FFC8721E947CA900C72D16 /* Main.storyboard */, + 54FFC8751E947CA900C72D16 /* Assets.xcassets */, + 54FFC8771E947CA900C72D16 /* LaunchScreen.storyboard */, + 54FFC87A1E947CA900C72D16 /* Info.plist */, + ); + path = "TestHost iOS"; + sourceTree = ""; + }; + 54FFC8831E947D0800C72D16 /* ApolloPerformanceTests */ = { + isa = PBXGroup; + children = ( + 54FFC8901E947DBD00C72D16 /* NormalizedCachingTests.swift */, + 54FFC8911E947DBD00C72D16 /* PromiseTests.swift */, + 54FFC8861E947D0800C72D16 /* Info.plist */, + ); + path = ApolloPerformanceTests; sourceTree = ""; }; C1B8068DEABD85ECF3227AA2 /* Pods */ = { @@ -115,6 +324,12 @@ 41AA21D8F253186B9E485F75 /* Pods-ApolloExample.release.xcconfig */, 96252404982964864A31A200 /* Pods-ApolloExampleTests.debug.xcconfig */, 1AAAF608B73F123ACD20BAB6 /* Pods-ApolloExampleTests.release.xcconfig */, + 2C1D521E7FD5370B3CEF23C5 /* Pods-StarWarsAPI.debug.xcconfig */, + 94187754DEB07DF0D9EDA415 /* Pods-StarWarsAPI.release.xcconfig */, + 61F8D719D2C7FBF66AD2ED45 /* Pods-ApolloTests.debug.xcconfig */, + 7F0F2E27BB660DC316A7B46A /* Pods-ApolloTests.release.xcconfig */, + C1B247319A0E9F0EB0132F61 /* Pods-ApolloPerformanceTests.debug.xcconfig */, + DACC71495C403877EDD9A4D7 /* Pods-ApolloPerformanceTests.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -124,13 +339,48 @@ children = ( AD21DBB0EAAEAC44C0DAE2E0 /* Pods_ApolloExample.framework */, 4D924536227C50FAA0070E95 /* Pods_ApolloExampleTests.framework */, + A05963DF880C07C7098254E7 /* Pods_StarWarsAPI.framework */, + 81EA39E0FF49825755B1B12F /* Pods_ApolloTests.framework */, + 5C5C4BC38A6DF130DAF68713 /* Pods_ApolloPerformanceTests.framework */, ); name = Frameworks; sourceTree = ""; }; /* End PBXGroup section */ +/* Begin PBXHeadersBuildPhase section */ + 5454C0811E944FD400661138 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 5454C0881E944FD400661138 /* StarWarsAPI.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + /* Begin PBXNativeTarget section */ + 5454C0831E944FD400661138 /* StarWarsAPI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5454C08B1E944FD400661138 /* Build configuration list for PBXNativeTarget "StarWarsAPI" */; + buildPhases = ( + 56DBD0B564F953D11E4663AE /* [CP] Check Pods Manifest.lock */, + 5454C08C1E9450AB00661138 /* Generate Apollo Client API */, + 5454C07F1E944FD400661138 /* Sources */, + 5454C0801E944FD400661138 /* Frameworks */, + 5454C0811E944FD400661138 /* Headers */, + 5454C0821E944FD400661138 /* Resources */, + EF736F02D9DE238B4C32CA7C /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = StarWarsAPI; + productName = StarWarsAPI; + productReference = 5454C0841E944FD400661138 /* StarWarsAPI.framework */; + productType = "com.apple.product-type.framework"; + }; 54E966CF1E9447F7002884AD /* ApolloExample */ = { isa = PBXNativeTarget; buildConfigurationList = 54E966ED1E9447F7002884AD /* Build configuration list for PBXNativeTarget "ApolloExample" */; @@ -151,25 +401,65 @@ productReference = 54E966D01E9447F7002884AD /* ApolloExample.app */; productType = "com.apple.product-type.application"; }; - 54E966E31E9447F7002884AD /* ApolloExampleTests */ = { + 54FFC8191E94782400C72D16 /* ApolloTests */ = { isa = PBXNativeTarget; - buildConfigurationList = 54E966F01E9447F7002884AD /* Build configuration list for PBXNativeTarget "ApolloExampleTests" */; + buildConfigurationList = 54FFC8211E94782400C72D16 /* Build configuration list for PBXNativeTarget "ApolloTests" */; buildPhases = ( - D7605B6209DC68FECE6DE6D7 /* [CP] Check Pods Manifest.lock */, - 54E966E01E9447F7002884AD /* Sources */, - 54E966E11E9447F7002884AD /* Frameworks */, - 54E966E21E9447F7002884AD /* Resources */, - 09CCF837EEBAB8D08AE4258A /* [CP] Embed Pods Frameworks */, - 8EF878C231A237EA86BCCD44 /* [CP] Copy Pods Resources */, + BFF37DD422A70822D50051AD /* [CP] Check Pods Manifest.lock */, + 54FFC8161E94782400C72D16 /* Sources */, + 54FFC8171E94782400C72D16 /* Frameworks */, + 54FFC8181E94782400C72D16 /* Resources */, + 210B025904C19B1FF0097125 /* [CP] Embed Pods Frameworks */, + B89527101ABE786CD181C00C /* [CP] Copy Pods Resources */, ); buildRules = ( ); dependencies = ( - 54E966E61E9447F7002884AD /* PBXTargetDependency */, + 54FFC8481E94796400C72D16 /* PBXTargetDependency */, + 54FFC8201E94782400C72D16 /* PBXTargetDependency */, ); - name = ApolloExampleTests; - productName = ApolloExampleTests; - productReference = 54E966E41E9447F7002884AD /* ApolloExampleTests.xctest */; + name = ApolloTests; + productName = ApolloTests; + productReference = 54FFC81A1E94782400C72D16 /* ApolloTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 54FFC86B1E947CA900C72D16 /* TestHost iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 54FFC87B1E947CA900C72D16 /* Build configuration list for PBXNativeTarget "TestHost iOS" */; + buildPhases = ( + 54FFC8681E947CA900C72D16 /* Sources */, + 54FFC8691E947CA900C72D16 /* Frameworks */, + 54FFC86A1E947CA900C72D16 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "TestHost iOS"; + productName = "TestHost iOS"; + productReference = 54FFC86C1E947CA900C72D16 /* TestHost iOS.app */; + productType = "com.apple.product-type.application"; + }; + 54FFC8811E947D0800C72D16 /* ApolloPerformanceTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 54FFC8891E947D0800C72D16 /* Build configuration list for PBXNativeTarget "ApolloPerformanceTests" */; + buildPhases = ( + 511CD961147011FC03E715E4 /* [CP] Check Pods Manifest.lock */, + 54FFC87E1E947D0800C72D16 /* Sources */, + 54FFC87F1E947D0800C72D16 /* Frameworks */, + 54FFC8801E947D0800C72D16 /* Resources */, + 34A349B732BC370DD00F6D64 /* [CP] Embed Pods Frameworks */, + 4940091A75956BDDC4DD521A /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + 54FFC88D1E947D3600C72D16 /* PBXTargetDependency */, + 54FFC8881E947D0800C72D16 /* PBXTargetDependency */, + ); + name = ApolloPerformanceTests; + productName = ApolloPerformanceTests; + productReference = 54FFC8821E947D0800C72D16 /* ApolloPerformanceTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; /* End PBXNativeTarget section */ @@ -181,15 +471,30 @@ LastSwiftUpdateCheck = 0820; LastUpgradeCheck = 0820; TargetAttributes = { + 5454C0831E944FD400661138 = { + CreatedOnToolsVersion = 8.2.1; + LastSwiftMigration = 0820; + ProvisioningStyle = Automatic; + }; 54E966CF1E9447F7002884AD = { CreatedOnToolsVersion = 8.2.1; ProvisioningStyle = Automatic; }; - 54E966E31E9447F7002884AD = { + 54FFC8191E94782400C72D16 = { CreatedOnToolsVersion = 8.2.1; ProvisioningStyle = Automatic; TestTargetID = 54E966CF1E9447F7002884AD; }; + 54FFC86B1E947CA900C72D16 = { + CreatedOnToolsVersion = 8.2.1; + ProvisioningStyle = Automatic; + }; + 54FFC8811E947D0800C72D16 = { + CreatedOnToolsVersion = 8.2.1; + LastSwiftMigration = 0820; + ProvisioningStyle = Automatic; + TestTargetID = 54FFC86B1E947CA900C72D16; + }; }; }; buildConfigurationList = 54E966CB1E9447F7002884AD /* Build configuration list for PBXProject "ApolloExample" */; @@ -206,12 +511,36 @@ projectRoot = ""; targets = ( 54E966CF1E9447F7002884AD /* ApolloExample */, - 54E966E31E9447F7002884AD /* ApolloExampleTests */, + 54FFC8191E94782400C72D16 /* ApolloTests */, + 54FFC8811E947D0800C72D16 /* ApolloPerformanceTests */, + 5454C0831E944FD400661138 /* StarWarsAPI */, + 54FFC86B1E947CA900C72D16 /* TestHost iOS */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 5454C0821E944FD400661138 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 54FFC8671E947A2C00C72D16 /* TwoHeroes.graphql in Resources */, + 54FFC85F1E947A2C00C72D16 /* HeroName.graphql in Resources */, + 54FFC85D1E947A2C00C72D16 /* HeroDetails.graphql in Resources */, + 54FFC85C1E947A2C00C72D16 /* HeroAppearsIn.graphql in Resources */, + 54FFC8601E947A2C00C72D16 /* HeroNameConditional.graphql in Resources */, + 54FFC8651E947A2C00C72D16 /* schema.json in Resources */, + 54FFC85B1E947A2C00C72D16 /* HeroAndFriendsNames.graphql in Resources */, + 54FFC85E1E947A2C00C72D16 /* HeroDetailsWithFragment.graphql in Resources */, + 54FFC8631E947A2C00C72D16 /* HumanWithNullMass.graphql in Resources */, + 54FFC8661E947A2C00C72D16 /* Starship.graphql in Resources */, + 54FFC8611E947A2C00C72D16 /* HeroParentTypeDependentField.graphql in Resources */, + 54FFC85A1E947A2C00C72D16 /* CreateReviewForEpisode.graphql in Resources */, + 54FFC8621E947A2C00C72D16 /* HeroTypeDependentAliasedField.graphql in Resources */, + 54FFC8641E947A2C00C72D16 /* SameHeroTwice.graphql in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 54E966CE1E9447F7002884AD /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -222,7 +551,24 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 54E966E21E9447F7002884AD /* Resources */ = { + 54FFC8181E94782400C72D16 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 54FFC86A1E947CA900C72D16 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 54FFC8791E947CA900C72D16 /* LaunchScreen.storyboard in Resources */, + 54FFC8761E947CA900C72D16 /* Assets.xcassets in Resources */, + 54FFC8741E947CA900C72D16 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 54FFC8801E947D0800C72D16 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -232,7 +578,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 09CCF837EEBAB8D08AE4258A /* [CP] Embed Pods Frameworks */ = { + 210B025904C19B1FF0097125 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -244,7 +590,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-frameworks.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 34578E9F83BE52E8FFB08218 /* [CP] Check Pods Manifest.lock */ = { @@ -262,7 +608,22 @@ shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; - 8EF878C231A237EA86BCCD44 /* [CP] Copy Pods Resources */ = { + 34A349B732BC370DD00F6D64 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 4940091A75956BDDC4DD521A /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -274,7 +635,51 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-resources.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 511CD961147011FC03E715E4 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + 5454C08C1E9450AB00661138 /* Generate Apollo Client API */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Generate Apollo Client API"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "APOLLO_FRAMEWORK_PATH=$(eval find $FRAMEWORK_SEARCH_PATHS -name \"Apollo.framework\" -maxdepth 1)\n\nif [ -z \"$APOLLO_FRAMEWORK_PATH\" ]; then\necho \"error: Couldn't find Apollo.framework in FRAMEWORK_SEARCH_PATHS; make sure to add the framework to your project.\"\nexit 1\nfi\n\ncd ${SRCROOT}/StarWarsAPI\n$(find $APOLLO_FRAMEWORK_PATH -name 'check-and-run-apollo-codegen.sh') generate $(find . -name '*.graphql') --schema schema.json --output API.swift"; + }; + 56DBD0B564F953D11E4663AE /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; 96571593B3149F00AF3D1198 /* [CP] Copy Pods Resources */ = { @@ -292,6 +697,21 @@ shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-resources.sh\"\n"; showEnvVarsInLog = 0; }; + B89527101ABE786CD181C00C /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; BC1B88B78431B107FC3E744E /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -307,7 +727,7 @@ shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - D7605B6209DC68FECE6DE6D7 /* [CP] Check Pods Manifest.lock */ = { + BFF37DD422A70822D50051AD /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -322,9 +742,32 @@ shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; + EF736F02D9DE238B4C32CA7C /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 5454C07F1E944FD400661138 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 54FFC8591E947A2C00C72D16 /* API.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 54E966CC1E9447F7002884AD /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -334,21 +777,69 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 54E966E01E9447F7002884AD /* Sources */ = { + 54FFC8161E94782400C72D16 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 54FFC8361E9478A300C72D16 /* DataLoaderTests.swift in Sources */, + 54FFC8381E9478A300C72D16 /* GraphQLExecutorFieldValueTests.swift in Sources */, + 54FFC83D1E9478A300C72D16 /* ParseQueryResponseTests.swift in Sources */, + 54FFC8401E9478A300C72D16 /* StarWarsServerTests.swift in Sources */, + 54FFC83E1E9478A300C72D16 /* PromiseTests.swift in Sources */, + 54FFC83A1E9478A300C72D16 /* LoadQueryFromStoreTests.swift in Sources */, + 54FFC8431E9478A300C72D16 /* WatchQueryTests.swift in Sources */, + 54FFC8421E9478A300C72D16 /* Utilities.swift in Sources */, + 54FFC8391E9478A300C72D16 /* GraphQLInputValueEncodingTests.swift in Sources */, + 54FFC8371E9478A300C72D16 /* FetchQueryTests.swift in Sources */, + 54FFC83F1E9478A300C72D16 /* StarWarsServerCachingRoundtripTests.swift in Sources */, + 54FFC8351E9478A300C72D16 /* CacheKeyForFieldTests.swift in Sources */, + 54FFC83C1E9478A300C72D16 /* NormalizeQueryResults.swift in Sources */, + 54FFC8341E9478A300C72D16 /* BatchedLoadTests.swift in Sources */, + 54FFC8411E9478A300C72D16 /* StoreTransactionTests.swift in Sources */, + 54FFC83B1E9478A300C72D16 /* MockNetworkTransport.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 54FFC8681E947CA900C72D16 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 54E966E91E9447F7002884AD /* ApolloExampleTests.swift in Sources */, + 54FFC8711E947CA900C72D16 /* ViewController.swift in Sources */, + 54FFC86F1E947CA900C72D16 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 54FFC87E1E947D0800C72D16 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 54FFC8921E947DBD00C72D16 /* NormalizedCachingTests.swift in Sources */, + 54FFC8931E947DBD00C72D16 /* PromiseTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 54E966E61E9447F7002884AD /* PBXTargetDependency */ = { + 54FFC8201E94782400C72D16 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 54E966CF1E9447F7002884AD /* ApolloExample */; - targetProxy = 54E966E51E9447F7002884AD /* PBXContainerItemProxy */; + targetProxy = 54FFC81F1E94782400C72D16 /* PBXContainerItemProxy */; + }; + 54FFC8481E94796400C72D16 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5454C0831E944FD400661138 /* StarWarsAPI */; + targetProxy = 54FFC8471E94796400C72D16 /* PBXContainerItemProxy */; + }; + 54FFC8881E947D0800C72D16 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 54FFC86B1E947CA900C72D16 /* TestHost iOS */; + targetProxy = 54FFC8871E947D0800C72D16 /* PBXContainerItemProxy */; + }; + 54FFC88D1E947D3600C72D16 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 5454C0831E944FD400661138 /* StarWarsAPI */; + targetProxy = 54FFC88C1E947D3600C72D16 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -369,9 +860,72 @@ name = LaunchScreen.storyboard; sourceTree = ""; }; + 54FFC8721E947CA900C72D16 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 54FFC8731E947CA900C72D16 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 54FFC8771E947CA900C72D16 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 54FFC8781E947CA900C72D16 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 5454C0891E944FD400661138 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2C1D521E7FD5370B3CEF23C5 /* Pods-StarWarsAPI.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = StarWarsAPI/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.StarWarsAPI; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 5454C08A1E944FD400661138 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 94187754DEB07DF0D9EDA415 /* Pods-StarWarsAPI.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = StarWarsAPI/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.StarWarsAPI; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; 54E966EB1E9447F7002884AD /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -491,39 +1045,101 @@ }; name = Release; }; - 54E966F11E9447F7002884AD /* Debug */ = { + 54FFC8221E94782400C72D16 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 96252404982964864A31A200 /* Pods-ApolloExampleTests.debug.xcconfig */; + baseConfigurationReference = 61F8D719D2C7FBF66AD2ED45 /* Pods-ApolloTests.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - INFOPLIST_FILE = ApolloExampleTests/Info.plist; + INFOPLIST_FILE = ApolloTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloExampleTests; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 3.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ApolloExample.app/ApolloExample"; }; name = Debug; }; - 54E966F21E9447F7002884AD /* Release */ = { + 54FFC8231E94782400C72D16 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1AAAF608B73F123ACD20BAB6 /* Pods-ApolloExampleTests.release.xcconfig */; + baseConfigurationReference = 7F0F2E27BB660DC316A7B46A /* Pods-ApolloTests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - BUNDLE_LOADER = "$(TEST_HOST)"; - INFOPLIST_FILE = ApolloExampleTests/Info.plist; + INFOPLIST_FILE = ApolloTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloExampleTests; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 3.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ApolloExample.app/ApolloExample"; }; name = Release; }; + 54FFC87C1E947CA900C72D16 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = "TestHost iOS/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.apollographql.TestHost-iOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 54FFC87D1E947CA900C72D16 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = "TestHost iOS/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.apollographql.TestHost-iOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; + 54FFC88A1E947D0800C72D16 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C1B247319A0E9F0EB0132F61 /* Pods-ApolloPerformanceTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; + INFOPLIST_FILE = ApolloPerformanceTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloPerformanceTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestHost iOS.app/TestHost iOS"; + }; + name = Debug; + }; + 54FFC88B1E947D0800C72D16 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DACC71495C403877EDD9A4D7 /* Pods-ApolloPerformanceTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; + INFOPLIST_FILE = ApolloPerformanceTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloPerformanceTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestHost iOS.app/TestHost iOS"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 5454C08B1E944FD400661138 /* Build configuration list for PBXNativeTarget "StarWarsAPI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5454C0891E944FD400661138 /* Debug */, + 5454C08A1E944FD400661138 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 54E966CB1E9447F7002884AD /* Build configuration list for PBXProject "ApolloExample" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -540,14 +1156,34 @@ 54E966EF1E9447F7002884AD /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 54FFC8211E94782400C72D16 /* Build configuration list for PBXNativeTarget "ApolloTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 54FFC8221E94782400C72D16 /* Debug */, + 54FFC8231E94782400C72D16 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; - 54E966F01E9447F7002884AD /* Build configuration list for PBXNativeTarget "ApolloExampleTests" */ = { + 54FFC87B1E947CA900C72D16 /* Build configuration list for PBXNativeTarget "TestHost iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( - 54E966F11E9447F7002884AD /* Debug */, - 54E966F21E9447F7002884AD /* Release */, + 54FFC87C1E947CA900C72D16 /* Debug */, + 54FFC87D1E947CA900C72D16 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 54FFC8891E947D0800C72D16 /* Build configuration list for PBXNativeTarget "ApolloPerformanceTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 54FFC88A1E947D0800C72D16 /* Debug */, + 54FFC88B1E947D0800C72D16 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/Example/ApolloExampleTests/ApolloExampleTests.swift b/Example/ApolloExampleTests/ApolloExampleTests.swift deleted file mode 100644 index d0aeca62eb..0000000000 --- a/Example/ApolloExampleTests/ApolloExampleTests.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// ApolloExampleTests.swift -// ApolloExampleTests -// -// Created by paul_kompfner on 4/4/17. -// -// - -import XCTest -@testable import ApolloExample - -class ApolloExampleTests: XCTestCase { - - override func setUp() { - super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - func testExample() { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. - } - - func testPerformanceExample() { - // This is an example of a performance test case. - self.measure { - // Put the code you want to measure the time of here. - } - } - -} diff --git a/Example/ApolloExampleTests/Info.plist b/Example/ApolloExampleTests/Info.plist deleted file mode 100644 index 6c6c23c43a..0000000000 --- a/Example/ApolloExampleTests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/Tests/ApolloPerformanceTests/Info.plist b/Example/ApolloPerformanceTests/Info.plist similarity index 100% rename from Tests/ApolloPerformanceTests/Info.plist rename to Example/ApolloPerformanceTests/Info.plist diff --git a/Tests/ApolloPerformanceTests/NormalizedCachingTests.swift b/Example/ApolloPerformanceTests/NormalizedCachingTests.swift similarity index 100% rename from Tests/ApolloPerformanceTests/NormalizedCachingTests.swift rename to Example/ApolloPerformanceTests/NormalizedCachingTests.swift diff --git a/Tests/ApolloPerformanceTests/PromiseTests.swift b/Example/ApolloPerformanceTests/PromiseTests.swift similarity index 100% rename from Tests/ApolloPerformanceTests/PromiseTests.swift rename to Example/ApolloPerformanceTests/PromiseTests.swift diff --git a/Tests/ApolloTests/BatchedLoadTests.swift b/Example/ApolloTests/BatchedLoadTests.swift similarity index 100% rename from Tests/ApolloTests/BatchedLoadTests.swift rename to Example/ApolloTests/BatchedLoadTests.swift diff --git a/Tests/ApolloTests/CacheKeyForFieldTests.swift b/Example/ApolloTests/CacheKeyForFieldTests.swift similarity index 100% rename from Tests/ApolloTests/CacheKeyForFieldTests.swift rename to Example/ApolloTests/CacheKeyForFieldTests.swift diff --git a/Tests/ApolloTests/DataLoaderTests.swift b/Example/ApolloTests/DataLoaderTests.swift similarity index 100% rename from Tests/ApolloTests/DataLoaderTests.swift rename to Example/ApolloTests/DataLoaderTests.swift diff --git a/Tests/ApolloTests/FetchQueryTests.swift b/Example/ApolloTests/FetchQueryTests.swift similarity index 100% rename from Tests/ApolloTests/FetchQueryTests.swift rename to Example/ApolloTests/FetchQueryTests.swift diff --git a/Tests/ApolloTests/GraphQLExecutorFieldValueTests.swift b/Example/ApolloTests/GraphQLExecutorFieldValueTests.swift similarity index 100% rename from Tests/ApolloTests/GraphQLExecutorFieldValueTests.swift rename to Example/ApolloTests/GraphQLExecutorFieldValueTests.swift diff --git a/Tests/ApolloTests/GraphQLInputValueEncodingTests.swift b/Example/ApolloTests/GraphQLInputValueEncodingTests.swift similarity index 100% rename from Tests/ApolloTests/GraphQLInputValueEncodingTests.swift rename to Example/ApolloTests/GraphQLInputValueEncodingTests.swift diff --git a/Tests/ApolloTests/Info.plist b/Example/ApolloTests/Info.plist similarity index 100% rename from Tests/ApolloTests/Info.plist rename to Example/ApolloTests/Info.plist diff --git a/Tests/ApolloTests/LoadQueryFromStoreTests.swift b/Example/ApolloTests/LoadQueryFromStoreTests.swift similarity index 100% rename from Tests/ApolloTests/LoadQueryFromStoreTests.swift rename to Example/ApolloTests/LoadQueryFromStoreTests.swift diff --git a/Tests/ApolloTests/MockNetworkTransport.swift b/Example/ApolloTests/MockNetworkTransport.swift similarity index 100% rename from Tests/ApolloTests/MockNetworkTransport.swift rename to Example/ApolloTests/MockNetworkTransport.swift diff --git a/Tests/ApolloTests/NormalizeQueryResults.swift b/Example/ApolloTests/NormalizeQueryResults.swift similarity index 100% rename from Tests/ApolloTests/NormalizeQueryResults.swift rename to Example/ApolloTests/NormalizeQueryResults.swift diff --git a/Tests/ApolloTests/ParseQueryResponseTests.swift b/Example/ApolloTests/ParseQueryResponseTests.swift similarity index 100% rename from Tests/ApolloTests/ParseQueryResponseTests.swift rename to Example/ApolloTests/ParseQueryResponseTests.swift diff --git a/Tests/ApolloTests/PromiseTests.swift b/Example/ApolloTests/PromiseTests.swift similarity index 100% rename from Tests/ApolloTests/PromiseTests.swift rename to Example/ApolloTests/PromiseTests.swift diff --git a/Tests/ApolloTests/StarWarsServerCachingRoundtripTests.swift b/Example/ApolloTests/StarWarsServerCachingRoundtripTests.swift similarity index 100% rename from Tests/ApolloTests/StarWarsServerCachingRoundtripTests.swift rename to Example/ApolloTests/StarWarsServerCachingRoundtripTests.swift diff --git a/Tests/ApolloTests/StarWarsServerTests.swift b/Example/ApolloTests/StarWarsServerTests.swift similarity index 100% rename from Tests/ApolloTests/StarWarsServerTests.swift rename to Example/ApolloTests/StarWarsServerTests.swift diff --git a/Tests/ApolloTests/StoreTransactionTests.swift b/Example/ApolloTests/StoreTransactionTests.swift similarity index 100% rename from Tests/ApolloTests/StoreTransactionTests.swift rename to Example/ApolloTests/StoreTransactionTests.swift diff --git a/Tests/ApolloTests/Utilities.swift b/Example/ApolloTests/Utilities.swift similarity index 100% rename from Tests/ApolloTests/Utilities.swift rename to Example/ApolloTests/Utilities.swift diff --git a/Tests/ApolloTests/WatchQueryTests.swift b/Example/ApolloTests/WatchQueryTests.swift similarity index 100% rename from Tests/ApolloTests/WatchQueryTests.swift rename to Example/ApolloTests/WatchQueryTests.swift diff --git a/Example/Podfile b/Example/Podfile index 72990c2c40..a84aee0f98 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -6,7 +6,15 @@ target 'ApolloExample' do # Pods for ApolloExample pod 'Apollo', path: '../' - target 'ApolloExampleTests' do + target 'ApolloTests' do + inherit! :search_paths + end + + target 'ApolloPerformanceTests' do + inherit! :search_paths + end + + target 'StarWarsAPI' do inherit! :search_paths end diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 7409c1c84a..7e0dee6446 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -16,6 +16,6 @@ SPEC CHECKSUMS: Apollo: 6ced3e5ebf99730856f5c3643eb2cfe781d719b1 SQLite.swift: 670c3e9e0a806bbfd56a3de5d530768dc0e6fe7c -PODFILE CHECKSUM: ee061f3c4d84b796dbd982d1f0974254f2444ed7 +PODFILE CHECKSUM: 55dff9f71ee00e7e1c0932f14b4fb701f80e0224 COCOAPODS: 1.2.0 diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index 7409c1c84a..7e0dee6446 100644 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -16,6 +16,6 @@ SPEC CHECKSUMS: Apollo: 6ced3e5ebf99730856f5c3643eb2cfe781d719b1 SQLite.swift: 670c3e9e0a806bbfd56a3de5d530768dc0e6fe7c -PODFILE CHECKSUM: ee061f3c4d84b796dbd982d1f0974254f2444ed7 +PODFILE CHECKSUM: 55dff9f71ee00e7e1c0932f14b4fb701f80e0224 COCOAPODS: 1.2.0 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index a3805d1a53..23e61e80eb 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -17,18 +17,18 @@ 2650B6BD41F1BDFF5A15F9C4C8E61A37 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35069E56A5D5D4923A18BA7A092E73D4 /* Utilities.swift */; }; 2664C21FA05281B3AEC72F71EA44028A /* Collections.swift in Sources */ = {isa = PBXBuildFile; fileRef = A918C3B2E22CB999534D187039A4D52A /* Collections.swift */; }; 2C64BE3142AB8955A8F1B7ED8C4AC1FD /* AsynchronousOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A5D8EED2099F4E9AC37C5EC2D95A738 /* AsynchronousOperation.swift */; }; - 2F8B5597F178C1FBFC35700AB8BC15C6 /* Pods-ApolloExampleTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B9A381366F19009489326838310B31FD /* Pods-ApolloExampleTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 30382E91D15E7ED4E930564DE86EAF27 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44EE37E8BF436A90A9C40AD27A182DB2 /* Expression.swift */; }; 3401D945C9C21F03B6E5100F26DF231C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; 35E5EEDB90225D140DCA57800CD5A2CD /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23E934E5F923C9742E63347D5512C322 /* AggregateFunctions.swift */; }; + 3881AED1848707B1BE97A19CCDB2DEA4 /* Pods-ApolloTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E12D36800035FA4AEBD5CCA0E467F5C2 /* Pods-ApolloTests-dummy.m */; }; 3D85E3F5AB73653A962BCF09ED74A8C0 /* JSONSerializationFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30DAD61D66BBDE6441131A52D95BDB04 /* JSONSerializationFormat.swift */; }; 3EB8845BB3EB8B7E031BCA86CEC2F0D2 /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B4C8E0D8DB99B4482E2549FEAE620B8 /* FTS5.swift */; }; 3EEC07CDEFE2204C5CFC1E1B10B6537F /* GraphQLResultNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF17E380BFA697F14018DED6126C8AC8 /* GraphQLResultNormalizer.swift */; }; - 415B7E98D356AE4B47C6FD5D11E11C99 /* Pods-ApolloExample-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C3BEBD4B9A599D0ADDE174D8FF81C446 /* Pods-ApolloExample-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 415B7E98D356AE4B47C6FD5D11E11C99 /* Pods-ApolloExample-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F2AA223F544DC4835618D4D4A2FAA05 /* Pods-ApolloExample-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 42356EE1E9CC755A203A384EBB3F4F9F /* Pods-StarWarsAPI-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 03D7BFAC37C274E39C5162127AEB6199 /* Pods-StarWarsAPI-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 42F81544370E1853391B67D56656A0C3 /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348491EAD9C18B0EEB2E855815254774 /* CustomFunctions.swift */; }; 47628EC1F1DDCC60DF83EA01A277919E /* SQLite-Bridging.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E070D9E44393CD520D0B1AF87A6736D /* SQLite-Bridging.m */; }; 47B4F5C1BFB40746F552A6D5CE482DC3 /* Locking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9090E10380883B7CA79EE41C691650F7 /* Locking.swift */; }; - 47BDB97605B55D76D846461E4AFCF7E7 /* Pods-ApolloExampleTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E3D732CCE212D0876E0126673CDB0726 /* Pods-ApolloExampleTests-dummy.m */; }; 49876A987CA44C386457D31880AE1BD6 /* SQLite.swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 27B2D491F0A9B062233011B873DC118C /* SQLite.swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A23CC3D6A3579C9F12AE00384A7A4F3 /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F331ABE5223829EDFFC088184DFA981 /* RTree.swift */; }; 4DCCD02DB715AC161B0774E0C137353E /* NetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42BBD89CF65425C4A9DD8F6390DF859D /* NetworkTransport.swift */; }; @@ -36,19 +36,22 @@ 54CFD21E9012A2554410D08EF63E42CB /* ApolloClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B42D8D8A4E18179F37824F2695F75F3 /* ApolloClient.swift */; }; 5C154FC66B0272E926E740EB0D5DDF3E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; 6263A24701DED2E7A447C0313C7C555D /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA7CCC1A073BC5540EA969CA71F0C552 /* Setter.swift */; }; - 636C2473106673D1432A22A0B7D6A2C9 /* Pods-ApolloExample-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EBE5D90E73ED2BB52CF8CF07A8705807 /* Pods-ApolloExample-dummy.m */; }; + 636C2473106673D1432A22A0B7D6A2C9 /* Pods-ApolloExample-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FD2E12182B5FA8C0EC9565A13BB8D01 /* Pods-ApolloExample-dummy.m */; }; 63D650CA310911FBCB77C3E6229330A7 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = B88C5FD0C85A5AE4583CC7DB512E6820 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6C5A957F0E47791FFA662827ADBA67A9 /* GraphQLResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB17F37738DF3903DEB18A03BAA3C0D8 /* GraphQLResult.swift */; }; 6CC6B8EEDAA285718533CC1482D13B61 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = E993F928AC8B4275D32665A6205AE456 /* Result.swift */; }; 6F378D7233AC3E51B00DB180BF8D6066 /* Selections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F3DE78C37EE122AA21BA986A77BB162 /* Selections.swift */; }; 6FCDA3222BB1A7CADC500C19CA4A6611 /* check-and-run-apollo-codegen.sh in Resources */ = {isa = PBXBuildFile; fileRef = 872EA0E9B1EC6684546BEFF234C61E6E /* check-and-run-apollo-codegen.sh */; }; + 75239A1E7D7F766070E7D7555D57F699 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; 77E05C7059DFD498C2B323C3A707C0E8 /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 078C996EB71DC4EA36311067B6D81A3E /* Promise.swift */; }; 787BB17CD95328B14A766F6BC04D2148 /* HTTPNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D40A77826E6FE48F27E93C4A66DD9C /* HTTPNetworkTransport.swift */; }; 7FF4749CC9A33C7B79FE51E0962A4E8A /* Dictionary+KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FA62E20AC29F9ECA17CDE346F83E445 /* Dictionary+KeyPath.swift */; }; + 83BEA6930F603459FFE20F907F385F40 /* Pods-ApolloTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A750E6B16B43489DE32A5211D58F9FBA /* Pods-ApolloTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 853B5034825B85498FE7857957760849 /* NormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED6DD22A402D834518D62E49A6D34114 /* NormalizedCache.swift */; }; 87109E7659BAF278C52455C1D6529DF6 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DE06F129836BA95B0BE2222991D2BD0 /* Value.swift */; }; 8916D47EB3F95315F2020922A6130D8D /* GraphQLExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 909F358C8C8DF9392766416B86EACE63 /* GraphQLExecutor.swift */; }; 8D2A9E5942209EC7EAE309C3BDEC344E /* GraphQLQueryWatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0324BDEF4908733765A4E8909A7F10 /* GraphQLQueryWatcher.swift */; }; + 8D6F15E5D4B6E92EE107915DCC8AA84E /* Pods-StarWarsAPI-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 179109F8B259422432C0355515576040 /* Pods-StarWarsAPI-dummy.m */; }; 94ECE937BFDFCDBD700A107B1DC40CA9 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96600A78FEC066BF8931D7A58FBF0F16 /* Statement.swift */; }; A11B9C4B8DC4AF252BA2727D21A1EEF1 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7B7855DE178D22988512E88C68325BE /* Collation.swift */; }; A3FF4B5B363E91C3BE7FC3294C555032 /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E667D63233F61B551F3B93AF184020E0 /* Foundation.swift */; }; @@ -63,17 +66,20 @@ B948E00EC8119CFD8B9E55DBBDA5A4E3 /* GraphQLOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37BFA28F22BF54064B21348557B64BD3 /* GraphQLOperation.swift */; }; BA32663AD51B09E7997DD5871D7FE383 /* GraphQLDependencyTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 399B342ADA72E237E0EBF1EEAA28FB25 /* GraphQLDependencyTracker.swift */; }; C02AE58DC3E78ACB817163011C7A6734 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 680617B7B3999D016982CD479DADCCB0 /* Blob.swift */; }; + D561E43C2701839473D10B2A483134DC /* Pods-ApolloPerformanceTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E664068C762C5F1811AB06C5856E5BC7 /* Pods-ApolloPerformanceTests-dummy.m */; }; D850BB2A3E7B9A6AAEB54FA9A8B7AD4F /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCF813C6D3C0824E1BCFDACADE6109F5 /* Connection.swift */; }; D99283BAF5F146D362611679A5ED1A5D /* Apollo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E5BB833C4CF9D696FCF839FB705C1A91 /* Apollo-dummy.m */; }; DA0CEB1E0989DCA89796ABDF7267A7B0 /* InMemoryNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA52A0176DDC85E070F4BA3E088EDF79 /* InMemoryNormalizedCache.swift */; }; DD139C21BC1B51C5078B8F9C2F55D0A3 /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7A99896DB5D793228657B5F5EC525DA /* FTS4.swift */; }; E13D7AA4EFBA1345BDC2E05B4BD67F2A /* GraphQLError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74015506E81FA3C19EB6D906D81024AB /* GraphQLError.swift */; }; + E14803A2EF5E0BE3E8AF387F00BB2912 /* Pods-ApolloPerformanceTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 975269A36A5CF422A22E5D5DA93EAB28 /* Pods-ApolloPerformanceTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E1594276237878B311DC1096AC1BFD45 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; E2D3B028353BC0FA74DA8536C717B9E4 /* GraphQLValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23BAD010DBCF8C2B764B7E2E9895805 /* GraphQLValues.swift */; }; - E3045780037989B31EDC92097561EDBF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; EB775615489CE36C2D86C4EB279F3FF5 /* GraphQLResultMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5BED4FF18AC316194A81FD5C33ED9C5 /* GraphQLResultMapper.swift */; }; EEA27311E6D18D94F27E12D2F0BE7BF0 /* GraphQLOutputType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A2AD2C9998545CA1776374D0EB8D35 /* GraphQLOutputType.swift */; }; F0EF5885BD48A9B939F3FF9C1DC1A965 /* GraphQLResultAccumulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C326DB4844A6FBD86CFBA30BDD08DB6 /* GraphQLResultAccumulator.swift */; }; F4DAAE8A4DF58A14A2B8A6272ED102C7 /* RecordSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB35A20B8A16FA8E837FAEA496B53CBE /* RecordSet.swift */; }; + F5959B98BB50AE11BD404C70AE8D503A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; F86D649610E4878DE71D25AA9CC614A2 /* JSONStandardTypeConversions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1F6997F619DB12A60F7EA5B8005190 /* JSONStandardTypeConversions.swift */; }; FDA57D0DA6CBE5083CAF08A8B2F86AC9 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2C5D76BD109C46DEC526A712FC4A8BB /* Helpers.swift */; }; FF53DDD16D8FC3431D3F148AC7FD56CD /* GraphQLResponseGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7156C5037F2DC118EFF48E601858205 /* GraphQLResponseGenerator.swift */; }; @@ -104,20 +110,28 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 01C3FA9C5081FAF3B433C1CAC200835C /* Pods-ApolloPerformanceTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloPerformanceTests.debug.xcconfig"; sourceTree = ""; }; + 03D7BFAC37C274E39C5162127AEB6199 /* Pods-StarWarsAPI-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-StarWarsAPI-umbrella.h"; sourceTree = ""; }; 078C996EB71DC4EA36311067B6D81A3E /* Promise.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Promise.swift; sourceTree = ""; }; - 091A0558AC7BC81BA146427458F8F864 /* Pods-ApolloExample.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloExample.modulemap"; sourceTree = ""; }; - 0A875C28A4DE2F8521B9F5D7720A239C /* Pods-ApolloExampleTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExampleTests-resources.sh"; sourceTree = ""; }; + 08674A30761B25CB7AE0CE4CFFBFF205 /* Pods-ApolloTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloTests.release.xcconfig"; sourceTree = ""; }; + 0AB6C025AC773267F2034B391653AEF6 /* Pods-ApolloTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloTests.debug.xcconfig"; sourceTree = ""; }; 0E070D9E44393CD520D0B1AF87A6736D /* SQLite-Bridging.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "SQLite-Bridging.m"; path = "Sources/SQLiteObjc/SQLite-Bridging.m"; sourceTree = ""; }; 0F331ABE5223829EDFFC088184DFA981 /* RTree.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RTree.swift; path = Sources/SQLite/Extensions/RTree.swift; sourceTree = ""; }; + 10FA3C1A5006EC52FC44C8EB07B5BDAE /* Pods-ApolloTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloTests.modulemap"; sourceTree = ""; }; + 160F355101277829561FC9CDD0D3F16B /* Pods-ApolloPerformanceTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloPerformanceTests-frameworks.sh"; sourceTree = ""; }; + 179109F8B259422432C0355515576040 /* Pods-StarWarsAPI-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-StarWarsAPI-dummy.m"; sourceTree = ""; }; 180A54E2C9EAC29BCD0767F9CF54EB79 /* DataLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DataLoader.swift; sourceTree = ""; }; 1A8AF61E57D939C975D9A6B03DF50CC7 /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCache.swift; sourceTree = ""; }; + 1AD67889E8665E2406E38CC279A50DB7 /* Pods-ApolloPerformanceTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloPerformanceTests-resources.sh"; sourceTree = ""; }; 1D7DA9FB08FD2A913967F0D7996B8701 /* SQLite.swift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = SQLite.swift.modulemap; sourceTree = ""; }; 1EC3C1E6C3B57B46326B94BAB568B649 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 2060F7497CEA6FBBC300CEBB95DE7599 /* Pods-ApolloExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExample.debug.xcconfig"; sourceTree = ""; }; + 1F4445F089281553CC23A453DBF203C7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 23E934E5F923C9742E63347D5512C322 /* AggregateFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AggregateFunctions.swift; path = Sources/SQLite/Typed/AggregateFunctions.swift; sourceTree = ""; }; + 261B0C331D5E3A2F400B2EC0F77CC1F7 /* Pods_StarWarsAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_StarWarsAPI.framework; path = "Pods-StarWarsAPI.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 269A666530B42952FF00B5B4A1844F67 /* Apollo.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Apollo.xcconfig; sourceTree = ""; }; 27B2D491F0A9B062233011B873DC118C /* SQLite.swift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SQLite.swift-umbrella.h"; sourceTree = ""; }; 2D30459F9DC30876AF6C299D26C7CE48 /* SQLite.swift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SQLite.swift-dummy.m"; sourceTree = ""; }; + 2DE423399B21C05322619DF24D280234 /* Pods-StarWarsAPI.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StarWarsAPI.debug.xcconfig"; sourceTree = ""; }; 2FA62E20AC29F9ECA17CDE346F83E445 /* Dictionary+KeyPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Dictionary+KeyPath.swift"; sourceTree = ""; }; 2FF924421EAF21716DEF0AE07417770D /* Apollo-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Apollo-prefix.pch"; sourceTree = ""; }; 30DAD61D66BBDE6441131A52D95BDB04 /* JSONSerializationFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSONSerializationFormat.swift; sourceTree = ""; }; @@ -126,63 +140,73 @@ 37BFA28F22BF54064B21348557B64BD3 /* GraphQLOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLOperation.swift; sourceTree = ""; }; 399B342ADA72E237E0EBF1EEAA28FB25 /* GraphQLDependencyTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLDependencyTracker.swift; sourceTree = ""; }; 3B42D8D8A4E18179F37824F2695F75F3 /* ApolloClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ApolloClient.swift; sourceTree = ""; }; - 3BE1EC51FEAC565167D59985E9544068 /* Pods-ApolloExampleTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloExampleTests-acknowledgements.markdown"; sourceTree = ""; }; 3C0324BDEF4908733765A4E8909A7F10 /* GraphQLQueryWatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLQueryWatcher.swift; sourceTree = ""; }; - 3CD44E8FA7A5011FCAABB4E3E2F3B153 /* Pods-ApolloExample-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExample-frameworks.sh"; sourceTree = ""; }; - 3E23FE1E344A74D7E542B4DE84D57DB7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 3C7116256A907933BD6C8D01B5E5D592 /* Pods-ApolloPerformanceTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloPerformanceTests.release.xcconfig"; sourceTree = ""; }; + 3D54BDE67F2AF934CA35178FCC1165EB /* Pods-ApolloPerformanceTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloPerformanceTests-acknowledgements.markdown"; sourceTree = ""; }; + 3F2AA223F544DC4835618D4D4A2FAA05 /* Pods-ApolloExample-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloExample-umbrella.h"; sourceTree = ""; }; + 3FA13D59DC7D79809DCEF476848EAED0 /* Pods_ApolloExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloExample.framework; path = "Pods-ApolloExample.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 3FCCE88ECC9D892349AB6CB3160246D9 /* Query.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Query.swift; path = Sources/SQLite/Typed/Query.swift; sourceTree = ""; }; 42BBD89CF65425C4A9DD8F6390DF859D /* NetworkTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NetworkTransport.swift; sourceTree = ""; }; 44EE37E8BF436A90A9C40AD27A182DB2 /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/SQLite/Typed/Expression.swift; sourceTree = ""; }; 4B4C8E0D8DB99B4482E2549FEAE620B8 /* FTS5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FTS5.swift; path = Sources/SQLite/Extensions/FTS5.swift; sourceTree = ""; }; 4E1F6997F619DB12A60F7EA5B8005190 /* JSONStandardTypeConversions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSONStandardTypeConversions.swift; sourceTree = ""; }; - 5232E054E5318DB58C8DF2E3B7EC41CA /* Pods-ApolloExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExample.release.xcconfig"; sourceTree = ""; }; + 550DCFFB3AF38FE48668B410DCC530D2 /* Pods-ApolloPerformanceTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloPerformanceTests.modulemap"; sourceTree = ""; }; + 58EA58A33C79BB0F400C14494D1142CC /* Pods-ApolloTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloTests-frameworks.sh"; sourceTree = ""; }; 5AE2EFBEFDE20C4DDD8B3398D8AE5AE8 /* fts3_tokenizer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = fts3_tokenizer.h; path = Sources/SQLiteObjc/fts3_tokenizer.h; sourceTree = ""; }; 60FAE93532FD5578A02AF3CC523A3408 /* CoreFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CoreFunctions.swift; path = Sources/SQLite/Typed/CoreFunctions.swift; sourceTree = ""; }; 616AA09AE6625A279D08C4E95BBF8FAF /* Record.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Record.swift; sourceTree = ""; }; + 6690FA900A959073D6602DDA8B9B96FC /* Pods-StarWarsAPI-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-StarWarsAPI-acknowledgements.plist"; sourceTree = ""; }; 680617B7B3999D016982CD479DADCCB0 /* Blob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Blob.swift; path = Sources/SQLite/Core/Blob.swift; sourceTree = ""; }; 6962E4B167BCDE8CACFF3DC269212EE7 /* ApolloStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ApolloStore.swift; sourceTree = ""; }; - 6AFFA1F0D3D36809E7A14DF579992319 /* Pods-ApolloExampleTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloExampleTests-acknowledgements.plist"; sourceTree = ""; }; 6C326DB4844A6FBD86CFBA30BDD08DB6 /* GraphQLResultAccumulator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultAccumulator.swift; sourceTree = ""; }; - 6DDDE584F50E336C591DDDCBCF431A59 /* Pods-ApolloExampleTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExampleTests-frameworks.sh"; sourceTree = ""; }; + 724B09788D59362DE110F9760831B30B /* Pods-StarWarsAPI.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StarWarsAPI.release.xcconfig"; sourceTree = ""; }; 74015506E81FA3C19EB6D906D81024AB /* GraphQLError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLError.swift; sourceTree = ""; }; 76D40A77826E6FE48F27E93C4A66DD9C /* HTTPNetworkTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HTTPNetworkTransport.swift; sourceTree = ""; }; - 76D87FE3A16F88C13B02128F747599F9 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 7A5D8EED2099F4E9AC37C5EC2D95A738 /* AsynchronousOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AsynchronousOperation.swift; sourceTree = ""; }; - 81EB8710A71482DC1F6F11F5914B1252 /* Pods-ApolloExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExampleTests.debug.xcconfig"; sourceTree = ""; }; + 7AF34EB0D4F25CC4FBA1A60724BBC66A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7ED2D87037EC2D5F09173EE9E979C813 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7FD2E12182B5FA8C0EC9565A13BB8D01 /* Pods-ApolloExample-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloExample-dummy.m"; sourceTree = ""; }; 82A2AD2C9998545CA1776374D0EB8D35 /* GraphQLOutputType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLOutputType.swift; sourceTree = ""; }; - 82D9DC92FC6CBDB7AF3A8D64A0E0BCE9 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SQLite.framework; path = SQLite.swift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8378EF5103C93E048B7DF8B41415FF63 /* Pods-ApolloExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExample.debug.xcconfig"; sourceTree = ""; }; 872EA0E9B1EC6684546BEFF234C61E6E /* check-and-run-apollo-codegen.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "check-and-run-apollo-codegen.sh"; sourceTree = ""; }; 88BFCDC2C48A9AAC024D78C7786357F9 /* SQLite.swift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SQLite.swift.xcconfig; sourceTree = ""; }; - 8A46C98F58EE37835DC76FDAE429068F /* Pods_ApolloExampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloExampleTests.framework; path = "Pods-ApolloExampleTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 8D53B8E8BAF92A7BE16F4C79817D017B /* Apollo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Apollo.framework; path = Apollo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8AA0C69818598EB79B91BCA0BE698842 /* Pods-ApolloExample-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExample-frameworks.sh"; sourceTree = ""; }; + 8C1BB3B1629831A0860FA95DD624C9F4 /* Pods-ApolloTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloTests-acknowledgements.markdown"; sourceTree = ""; }; 8F3DE78C37EE122AA21BA986A77BB162 /* Selections.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Selections.swift; sourceTree = ""; }; + 904829AAE2B1DE6B6F2CE13CDD6EDE22 /* Pods-ApolloExample-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloExample-acknowledgements.plist"; sourceTree = ""; }; 9090E10380883B7CA79EE41C691650F7 /* Locking.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Locking.swift; sourceTree = ""; }; 909F358C8C8DF9392766416B86EACE63 /* GraphQLExecutor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLExecutor.swift; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 949A295ACAD1338645F511B3B615304F /* Pods-StarWarsAPI.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-StarWarsAPI.modulemap"; sourceTree = ""; }; 94D650A756B69071D262EFC78E0E69F0 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 95684FC3AB25B49063D525A7C78F0B17 /* GraphQLResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResponse.swift; sourceTree = ""; }; 96600A78FEC066BF8931D7A58FBF0F16 /* Statement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Statement.swift; path = Sources/SQLite/Core/Statement.swift; sourceTree = ""; }; - 9B43FC0646B9264E437BD567FCD00B22 /* Pods-ApolloExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExampleTests.release.xcconfig"; sourceTree = ""; }; - 9C9A4A60685118605481B9A7CD345813 /* Pods_ApolloExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloExample.framework; path = "Pods-ApolloExample.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 975269A36A5CF422A22E5D5DA93EAB28 /* Pods-ApolloPerformanceTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloPerformanceTests-umbrella.h"; sourceTree = ""; }; + 9ADC492098AB1E55A5C9644F01624CA8 /* Pods-ApolloExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExample.release.xcconfig"; sourceTree = ""; }; 9DE06F129836BA95B0BE2222991D2BD0 /* Value.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Value.swift; path = Sources/SQLite/Core/Value.swift; sourceTree = ""; }; - A1945EC324B343B5D8026CC399CD8E6D /* Pods-ApolloExampleTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloExampleTests.modulemap"; sourceTree = ""; }; A2C5D76BD109C46DEC526A712FC4A8BB /* Helpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Helpers.swift; path = Sources/SQLite/Helpers.swift; sourceTree = ""; }; A7156C5037F2DC118EFF48E601858205 /* GraphQLResponseGenerator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResponseGenerator.swift; sourceTree = ""; }; A72488E3CB82621BCD287255DE4F91E6 /* JSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSON.swift; sourceTree = ""; }; + A750E6B16B43489DE32A5211D58F9FBA /* Pods-ApolloTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloTests-umbrella.h"; sourceTree = ""; }; A918C3B2E22CB999534D187039A4D52A /* Collections.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Collections.swift; sourceTree = ""; }; + AC7E77DE5E2272297487C6FDD2A16513 /* Pods-ApolloPerformanceTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloPerformanceTests-acknowledgements.plist"; sourceTree = ""; }; AF7F8DDFC50FE6ACA57F6A16E253F8DC /* SQLite-Bridging.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "SQLite-Bridging.h"; path = "Sources/SQLiteObjc/include/SQLite-Bridging.h"; sourceTree = ""; }; B23BAD010DBCF8C2B764B7E2E9895805 /* GraphQLValues.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLValues.swift; sourceTree = ""; }; - B41F236D0408A6C42DAAE76475846E1D /* Pods-ApolloExample-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExample-resources.sh"; sourceTree = ""; }; + B5A51A258D56CEEC8707C43B4CA66D57 /* Pods-ApolloTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloTests-acknowledgements.plist"; sourceTree = ""; }; B5BED4FF18AC316194A81FD5C33ED9C5 /* GraphQLResultMapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultMapper.swift; sourceTree = ""; }; B5C756BCE1977B310FBCDFC81E7CB726 /* Apollo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Apollo-umbrella.h"; sourceTree = ""; }; B7A99896DB5D793228657B5F5EC525DA /* FTS4.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FTS4.swift; path = Sources/SQLite/Extensions/FTS4.swift; sourceTree = ""; }; B88C5FD0C85A5AE4583CC7DB512E6820 /* SQLite.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SQLite.h; path = Sources/SQLite/SQLite.h; sourceTree = ""; }; - B9A381366F19009489326838310B31FD /* Pods-ApolloExampleTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloExampleTests-umbrella.h"; sourceTree = ""; }; + B9CA5768D35422C7387D78822AB2AA46 /* Pods-ApolloExample-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloExample-acknowledgements.markdown"; sourceTree = ""; }; BA52A0176DDC85E070F4BA3E088EDF79 /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; BB17F37738DF3903DEB18A03BAA3C0D8 /* GraphQLResult.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResult.swift; sourceTree = ""; }; BDA86AD441076D928D0621530CD5E745 /* Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operators.swift; path = Sources/SQLite/Typed/Operators.swift; sourceTree = ""; }; BF17E380BFA697F14018DED6126C8AC8 /* GraphQLResultNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultNormalizer.swift; sourceTree = ""; }; - C3BEBD4B9A599D0ADDE174D8FF81C446 /* Pods-ApolloExample-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloExample-umbrella.h"; sourceTree = ""; }; + C08D4B7E051B2878FD9A1DB195944C60 /* Pods_ApolloTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloTests.framework; path = "Pods-ApolloTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + C12EBB64588697C58EB83E3A1D147FA8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C1FDE43D56FD01FEC6EC0EC50C96A22D /* Pods-ApolloExample.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloExample.modulemap"; sourceTree = ""; }; + C97E29747EDD103755CD3BBB58DB0042 /* Pods_ApolloPerformanceTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloPerformanceTests.framework; path = "Pods-ApolloPerformanceTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + CA1C6F1BBEC2162E2BA5E756F9B77A2C /* Pods-ApolloTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloTests-resources.sh"; sourceTree = ""; }; CA3ED8D54211455DE25A4DA036694445 /* SQLite.swift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SQLite.swift-prefix.pch"; sourceTree = ""; }; CB35A20B8A16FA8E837FAEA496B53CBE /* RecordSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RecordSet.swift; sourceTree = ""; }; CCF813C6D3C0824E1BCFDACADE6109F5 /* Connection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Connection.swift; path = Sources/SQLite/Core/Connection.swift; sourceTree = ""; }; @@ -190,27 +214,22 @@ D7B7855DE178D22988512E88C68325BE /* Collation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Collation.swift; path = Sources/SQLite/Typed/Collation.swift; sourceTree = ""; }; DA7CCC1A073BC5540EA969CA71F0C552 /* Setter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Setter.swift; path = Sources/SQLite/Typed/Setter.swift; sourceTree = ""; }; DB44F0C85553660857F351B59660E399 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DD70A928B7AE7F19B4E85EE9D82F7339 /* Pods-ApolloExample-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloExample-acknowledgements.plist"; sourceTree = ""; }; - DDF9C6BE6400F34A67F4B72664ECFFEB /* Pods-ApolloExample-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloExample-acknowledgements.markdown"; sourceTree = ""; }; - E3D732CCE212D0876E0126673CDB0726 /* Pods-ApolloExampleTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloExampleTests-dummy.m"; sourceTree = ""; }; + E12D36800035FA4AEBD5CCA0E467F5C2 /* Pods-ApolloTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloTests-dummy.m"; sourceTree = ""; }; + E4C251316F1350DC62A6C4843F9E8DAC /* Pods-StarWarsAPI-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-StarWarsAPI-acknowledgements.markdown"; sourceTree = ""; }; + E4DDFDE7D66D82B6084F70FC8DE5F14D /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SQLite.framework; path = SQLite.swift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E5BB833C4CF9D696FCF839FB705C1A91 /* Apollo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Apollo-dummy.m"; sourceTree = ""; }; + E664068C762C5F1811AB06C5856E5BC7 /* Pods-ApolloPerformanceTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloPerformanceTests-dummy.m"; sourceTree = ""; }; E667D63233F61B551F3B93AF184020E0 /* Foundation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Foundation.swift; path = Sources/SQLite/Foundation.swift; sourceTree = ""; }; E993F928AC8B4275D32665A6205AE456 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; }; - EBE5D90E73ED2BB52CF8CF07A8705807 /* Pods-ApolloExample-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloExample-dummy.m"; sourceTree = ""; }; ED6DD22A402D834518D62E49A6D34114 /* NormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NormalizedCache.swift; sourceTree = ""; }; + F4E94D9B3A51997F835199160D3A6204 /* Apollo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Apollo.framework; path = Apollo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F7AB6C9064A19E5E00C2C7B6CF7D38DD /* Apollo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Apollo.modulemap; sourceTree = ""; }; + FC7AB7465546FD30A69F21B534830CF6 /* Pods-ApolloExample-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExample-resources.sh"; sourceTree = ""; }; + FF72FDA919EE62C2297D3C1EF8E50F18 /* Pods-StarWarsAPI-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-StarWarsAPI-resources.sh"; sourceTree = ""; }; FF98B7BBADF63A0AF80D7829FA6F77B9 /* Schema.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Schema.swift; path = Sources/SQLite/Typed/Schema.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 16F8FA5DAB94B72D46B2E2622F13F213 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - E3045780037989B31EDC92097561EDBF /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 30AE83E2B9378413D12911D07B9342A1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -236,9 +255,51 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + BFFF2CE0E64958B7B4B52B65E1A02931 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E1594276237878B311DC1096AC1BFD45 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DF6881DCDE90E4CCCA06D48A9066D2B5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F5959B98BB50AE11BD404C70AE8D503A /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E6A88AC1C093D7684B52F05F6FC40F94 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 75239A1E7D7F766070E7D7555D57F699 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 0874F9F078F1BB1E246AE7183E7C233E /* Pods-ApolloTests */ = { + isa = PBXGroup; + children = ( + 1F4445F089281553CC23A453DBF203C7 /* Info.plist */, + 10FA3C1A5006EC52FC44C8EB07B5BDAE /* Pods-ApolloTests.modulemap */, + 8C1BB3B1629831A0860FA95DD624C9F4 /* Pods-ApolloTests-acknowledgements.markdown */, + B5A51A258D56CEEC8707C43B4CA66D57 /* Pods-ApolloTests-acknowledgements.plist */, + E12D36800035FA4AEBD5CCA0E467F5C2 /* Pods-ApolloTests-dummy.m */, + 58EA58A33C79BB0F400C14494D1142CC /* Pods-ApolloTests-frameworks.sh */, + CA1C6F1BBEC2162E2BA5E756F9B77A2C /* Pods-ApolloTests-resources.sh */, + A750E6B16B43489DE32A5211D58F9FBA /* Pods-ApolloTests-umbrella.h */, + 0AB6C025AC773267F2034B391653AEF6 /* Pods-ApolloTests.debug.xcconfig */, + 08674A30761B25CB7AE0CE4CFFBFF205 /* Pods-ApolloTests.release.xcconfig */, + ); + name = "Pods-ApolloTests"; + path = "Target Support Files/Pods-ApolloTests"; + sourceTree = ""; + }; 0CE5F9160B067C829D364E72878D0583 /* Support Files */ = { isa = PBXGroup; children = ( @@ -270,6 +331,23 @@ name = Resources; sourceTree = ""; }; + 41EC9D1139C8584AC99C2D542C204E67 /* Pods-StarWarsAPI */ = { + isa = PBXGroup; + children = ( + 7AF34EB0D4F25CC4FBA1A60724BBC66A /* Info.plist */, + 949A295ACAD1338645F511B3B615304F /* Pods-StarWarsAPI.modulemap */, + E4C251316F1350DC62A6C4843F9E8DAC /* Pods-StarWarsAPI-acknowledgements.markdown */, + 6690FA900A959073D6602DDA8B9B96FC /* Pods-StarWarsAPI-acknowledgements.plist */, + 179109F8B259422432C0355515576040 /* Pods-StarWarsAPI-dummy.m */, + FF72FDA919EE62C2297D3C1EF8E50F18 /* Pods-StarWarsAPI-resources.sh */, + 03D7BFAC37C274E39C5162127AEB6199 /* Pods-StarWarsAPI-umbrella.h */, + 2DE423399B21C05322619DF24D280234 /* Pods-StarWarsAPI.debug.xcconfig */, + 724B09788D59362DE110F9760831B30B /* Pods-StarWarsAPI.release.xcconfig */, + ); + name = "Pods-StarWarsAPI"; + path = "Target Support Files/Pods-StarWarsAPI"; + sourceTree = ""; + }; 42A565AFFAD6D5669C3E9A617B18206F /* Pods */ = { isa = PBXGroup; children = ( @@ -278,15 +356,22 @@ name = Pods; sourceTree = ""; }; - 434A8BD03DCA864AB67B6A3F5813F09B /* Products */ = { + 4868B91744C534B8C083BD3A8E33DF1C /* Pods-ApolloExample */ = { isa = PBXGroup; children = ( - 8D53B8E8BAF92A7BE16F4C79817D017B /* Apollo.framework */, - 9C9A4A60685118605481B9A7CD345813 /* Pods_ApolloExample.framework */, - 8A46C98F58EE37835DC76FDAE429068F /* Pods_ApolloExampleTests.framework */, - 82D9DC92FC6CBDB7AF3A8D64A0E0BCE9 /* SQLite.framework */, + C12EBB64588697C58EB83E3A1D147FA8 /* Info.plist */, + C1FDE43D56FD01FEC6EC0EC50C96A22D /* Pods-ApolloExample.modulemap */, + B9CA5768D35422C7387D78822AB2AA46 /* Pods-ApolloExample-acknowledgements.markdown */, + 904829AAE2B1DE6B6F2CE13CDD6EDE22 /* Pods-ApolloExample-acknowledgements.plist */, + 7FD2E12182B5FA8C0EC9565A13BB8D01 /* Pods-ApolloExample-dummy.m */, + 8AA0C69818598EB79B91BCA0BE698842 /* Pods-ApolloExample-frameworks.sh */, + FC7AB7465546FD30A69F21B534830CF6 /* Pods-ApolloExample-resources.sh */, + 3F2AA223F544DC4835618D4D4A2FAA05 /* Pods-ApolloExample-umbrella.h */, + 8378EF5103C93E048B7DF8B41415FF63 /* Pods-ApolloExample.debug.xcconfig */, + 9ADC492098AB1E55A5C9644F01624CA8 /* Pods-ApolloExample.release.xcconfig */, ); - name = Products; + name = "Pods-ApolloExample"; + path = "Target Support Files/Pods-ApolloExample"; sourceTree = ""; }; 5465A1FD5BAF28162C40A82C117432A0 /* iOS */ = { @@ -306,15 +391,6 @@ path = scripts; sourceTree = ""; }; - 669D356482AEF992CB35775348080989 /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - 82394BC43DADA5FD102F210BEE2D3706 /* Pods-ApolloExample */, - 7FEB87F687FCE3866596B61F36A71735 /* Pods-ApolloExampleTests */, - ); - name = "Targets Support Files"; - sourceTree = ""; - }; 6BF538A5818A9423DCAFBA3FE993650B /* SQLite.swift */ = { isa = PBXGroup; children = ( @@ -369,29 +445,11 @@ 768337ED42456230A0A77624D4991E13 /* Development Pods */, 0E9CC0217CE03B66912982F024F7C64D /* Frameworks */, 42A565AFFAD6D5669C3E9A617B18206F /* Pods */, - 434A8BD03DCA864AB67B6A3F5813F09B /* Products */, - 669D356482AEF992CB35775348080989 /* Targets Support Files */, + CADF8E7A438C737280A69D0E24D5BDDC /* Products */, + 8EA1531CEA4152F55BDDB1F0EEB2000C /* Targets Support Files */, ); sourceTree = ""; }; - 7FEB87F687FCE3866596B61F36A71735 /* Pods-ApolloExampleTests */ = { - isa = PBXGroup; - children = ( - 3E23FE1E344A74D7E542B4DE84D57DB7 /* Info.plist */, - A1945EC324B343B5D8026CC399CD8E6D /* Pods-ApolloExampleTests.modulemap */, - 3BE1EC51FEAC565167D59985E9544068 /* Pods-ApolloExampleTests-acknowledgements.markdown */, - 6AFFA1F0D3D36809E7A14DF579992319 /* Pods-ApolloExampleTests-acknowledgements.plist */, - E3D732CCE212D0876E0126673CDB0726 /* Pods-ApolloExampleTests-dummy.m */, - 6DDDE584F50E336C591DDDCBCF431A59 /* Pods-ApolloExampleTests-frameworks.sh */, - 0A875C28A4DE2F8521B9F5D7720A239C /* Pods-ApolloExampleTests-resources.sh */, - B9A381366F19009489326838310B31FD /* Pods-ApolloExampleTests-umbrella.h */, - 81EB8710A71482DC1F6F11F5914B1252 /* Pods-ApolloExampleTests.debug.xcconfig */, - 9B43FC0646B9264E437BD567FCD00B22 /* Pods-ApolloExampleTests.release.xcconfig */, - ); - name = "Pods-ApolloExampleTests"; - path = "Target Support Files/Pods-ApolloExampleTests"; - sourceTree = ""; - }; 82017056B1CC49B3DC02060971D2C82D /* Support Files */ = { isa = PBXGroup; children = ( @@ -406,24 +464,6 @@ path = "Example/Pods/Target Support Files/Apollo"; sourceTree = ""; }; - 82394BC43DADA5FD102F210BEE2D3706 /* Pods-ApolloExample */ = { - isa = PBXGroup; - children = ( - 76D87FE3A16F88C13B02128F747599F9 /* Info.plist */, - 091A0558AC7BC81BA146427458F8F864 /* Pods-ApolloExample.modulemap */, - DDF9C6BE6400F34A67F4B72664ECFFEB /* Pods-ApolloExample-acknowledgements.markdown */, - DD70A928B7AE7F19B4E85EE9D82F7339 /* Pods-ApolloExample-acknowledgements.plist */, - EBE5D90E73ED2BB52CF8CF07A8705807 /* Pods-ApolloExample-dummy.m */, - 3CD44E8FA7A5011FCAABB4E3E2F3B153 /* Pods-ApolloExample-frameworks.sh */, - B41F236D0408A6C42DAAE76475846E1D /* Pods-ApolloExample-resources.sh */, - C3BEBD4B9A599D0ADDE174D8FF81C446 /* Pods-ApolloExample-umbrella.h */, - 2060F7497CEA6FBBC300CEBB95DE7599 /* Pods-ApolloExample.debug.xcconfig */, - 5232E054E5318DB58C8DF2E3B7EC41CA /* Pods-ApolloExample.release.xcconfig */, - ); - name = "Pods-ApolloExample"; - path = "Target Support Files/Pods-ApolloExample"; - sourceTree = ""; - }; 8389C6E68002254991191670D7F6BF1D /* Apollo */ = { isa = PBXGroup; children = ( @@ -435,6 +475,17 @@ path = ../..; sourceTree = ""; }; + 8EA1531CEA4152F55BDDB1F0EEB2000C /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 4868B91744C534B8C083BD3A8E33DF1C /* Pods-ApolloExample */, + D9F86A9E134D7F5AADC8F53E92C95EC4 /* Pods-ApolloPerformanceTests */, + 0874F9F078F1BB1E246AE7183E7C233E /* Pods-ApolloTests */, + 41EC9D1139C8584AC99C2D542C204E67 /* Pods-StarWarsAPI */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; B28E56D49879D9E081C62CD89EE29101 /* Sources */ = { isa = PBXGroup; children = ( @@ -477,14 +528,61 @@ path = Sources; sourceTree = ""; }; + CADF8E7A438C737280A69D0E24D5BDDC /* Products */ = { + isa = PBXGroup; + children = ( + F4E94D9B3A51997F835199160D3A6204 /* Apollo.framework */, + 3FA13D59DC7D79809DCEF476848EAED0 /* Pods_ApolloExample.framework */, + C97E29747EDD103755CD3BBB58DB0042 /* Pods_ApolloPerformanceTests.framework */, + C08D4B7E051B2878FD9A1DB195944C60 /* Pods_ApolloTests.framework */, + 261B0C331D5E3A2F400B2EC0F77CC1F7 /* Pods_StarWarsAPI.framework */, + E4DDFDE7D66D82B6084F70FC8DE5F14D /* SQLite.framework */, + ); + name = Products; + sourceTree = ""; + }; + D9F86A9E134D7F5AADC8F53E92C95EC4 /* Pods-ApolloPerformanceTests */ = { + isa = PBXGroup; + children = ( + 7ED2D87037EC2D5F09173EE9E979C813 /* Info.plist */, + 550DCFFB3AF38FE48668B410DCC530D2 /* Pods-ApolloPerformanceTests.modulemap */, + 3D54BDE67F2AF934CA35178FCC1165EB /* Pods-ApolloPerformanceTests-acknowledgements.markdown */, + AC7E77DE5E2272297487C6FDD2A16513 /* Pods-ApolloPerformanceTests-acknowledgements.plist */, + E664068C762C5F1811AB06C5856E5BC7 /* Pods-ApolloPerformanceTests-dummy.m */, + 160F355101277829561FC9CDD0D3F16B /* Pods-ApolloPerformanceTests-frameworks.sh */, + 1AD67889E8665E2406E38CC279A50DB7 /* Pods-ApolloPerformanceTests-resources.sh */, + 975269A36A5CF422A22E5D5DA93EAB28 /* Pods-ApolloPerformanceTests-umbrella.h */, + 01C3FA9C5081FAF3B433C1CAC200835C /* Pods-ApolloPerformanceTests.debug.xcconfig */, + 3C7116256A907933BD6C8D01B5E5D592 /* Pods-ApolloPerformanceTests.release.xcconfig */, + ); + name = "Pods-ApolloPerformanceTests"; + path = "Target Support Files/Pods-ApolloPerformanceTests"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 0D0C7349578F8E35532A3A5D62C0EA97 /* Headers */ = { + 66589AEC667FCA545203B8586032BAA6 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 83BEA6930F603459FFE20F907F385F40 /* Pods-ApolloTests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 74C5C5F3389C8332414F2DC51DB6835C /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 2F8B5597F178C1FBFC35700AB8BC15C6 /* Pods-ApolloExampleTests-umbrella.h in Headers */, + 42356EE1E9CC755A203A384EBB3F4F9F /* Pods-StarWarsAPI-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9022A811D2FFD9A937488B43C0787870 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + E14803A2EF5E0BE3E8AF387F00BB2912 /* Pods-ApolloPerformanceTests-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -532,24 +630,24 @@ ); name = SQLite.swift; productName = SQLite.swift; - productReference = 82D9DC92FC6CBDB7AF3A8D64A0E0BCE9 /* SQLite.framework */; + productReference = E4DDFDE7D66D82B6084F70FC8DE5F14D /* SQLite.framework */; productType = "com.apple.product-type.framework"; }; - 60F810EAF064E153B2FC553CD7779BAA /* Pods-ApolloExampleTests */ = { + 1BB44C4CC5427F2569076825E6E7B9F5 /* Pods-ApolloPerformanceTests */ = { isa = PBXNativeTarget; - buildConfigurationList = 979CAF895B62E915B68EE92B9BE6517D /* Build configuration list for PBXNativeTarget "Pods-ApolloExampleTests" */; + buildConfigurationList = 222228C35E74A852144A269ADEA44255 /* Build configuration list for PBXNativeTarget "Pods-ApolloPerformanceTests" */; buildPhases = ( - 9F4FFEB213C308A8E1092334616A2C4E /* Sources */, - 16F8FA5DAB94B72D46B2E2622F13F213 /* Frameworks */, - 0D0C7349578F8E35532A3A5D62C0EA97 /* Headers */, + 7A44D84B4571131FF57273041B550ECC /* Sources */, + E6A88AC1C093D7684B52F05F6FC40F94 /* Frameworks */, + 9022A811D2FFD9A937488B43C0787870 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = "Pods-ApolloExampleTests"; - productName = "Pods-ApolloExampleTests"; - productReference = 8A46C98F58EE37835DC76FDAE429068F /* Pods_ApolloExampleTests.framework */; + name = "Pods-ApolloPerformanceTests"; + productName = "Pods-ApolloPerformanceTests"; + productReference = C97E29747EDD103755CD3BBB58DB0042 /* Pods_ApolloPerformanceTests.framework */; productType = "com.apple.product-type.framework"; }; C566155694F9D7502B8E41EDDAE53326 /* Apollo */ = { @@ -568,7 +666,24 @@ ); name = Apollo; productName = Apollo; - productReference = 8D53B8E8BAF92A7BE16F4C79817D017B /* Apollo.framework */; + productReference = F4E94D9B3A51997F835199160D3A6204 /* Apollo.framework */; + productType = "com.apple.product-type.framework"; + }; + C6FB99BCC9BF63B3AB31D9C2C9BFACDD /* Pods-StarWarsAPI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9BC068DB07866A94AB008F596590DA29 /* Build configuration list for PBXNativeTarget "Pods-StarWarsAPI" */; + buildPhases = ( + 4850F19E40D33680244B67D003D51804 /* Sources */, + BFFF2CE0E64958B7B4B52B65E1A02931 /* Frameworks */, + 74C5C5F3389C8332414F2DC51DB6835C /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Pods-StarWarsAPI"; + productName = "Pods-StarWarsAPI"; + productReference = 261B0C331D5E3A2F400B2EC0F77CC1F7 /* Pods_StarWarsAPI.framework */; productType = "com.apple.product-type.framework"; }; CD971B48011CD3BD0356983083C8F0E0 /* Pods-ApolloExample */ = { @@ -587,7 +702,24 @@ ); name = "Pods-ApolloExample"; productName = "Pods-ApolloExample"; - productReference = 9C9A4A60685118605481B9A7CD345813 /* Pods_ApolloExample.framework */; + productReference = 3FA13D59DC7D79809DCEF476848EAED0 /* Pods_ApolloExample.framework */; + productType = "com.apple.product-type.framework"; + }; + DCBE4F9976E0BFC9450B27517F18EBBB /* Pods-ApolloTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = AB17C4CAD175CDAFC59BF191C4007542 /* Build configuration list for PBXNativeTarget "Pods-ApolloTests" */; + buildPhases = ( + 4CC28BEE91A89C3BF44435F9BE2183DF /* Sources */, + DF6881DCDE90E4CCCA06D48A9066D2B5 /* Frameworks */, + 66589AEC667FCA545203B8586032BAA6 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Pods-ApolloTests"; + productName = "Pods-ApolloTests"; + productReference = C08D4B7E051B2878FD9A1DB195944C60 /* Pods_ApolloTests.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -607,13 +739,15 @@ en, ); mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = 434A8BD03DCA864AB67B6A3F5813F09B /* Products */; + productRefGroup = CADF8E7A438C737280A69D0E24D5BDDC /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( C566155694F9D7502B8E41EDDAE53326 /* Apollo */, CD971B48011CD3BD0356983083C8F0E0 /* Pods-ApolloExample */, - 60F810EAF064E153B2FC553CD7779BAA /* Pods-ApolloExampleTests */, + 1BB44C4CC5427F2569076825E6E7B9F5 /* Pods-ApolloPerformanceTests */, + DCBE4F9976E0BFC9450B27517F18EBBB /* Pods-ApolloTests */, + C6FB99BCC9BF63B3AB31D9C2C9BFACDD /* Pods-StarWarsAPI */, 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */, ); }; @@ -631,6 +765,22 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 4850F19E40D33680244B67D003D51804 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D6F15E5D4B6E92EE107915DCC8AA84E /* Pods-StarWarsAPI-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CC28BEE91A89C3BF44435F9BE2183DF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3881AED1848707B1BE97A19CCDB2DEA4 /* Pods-ApolloTests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 6A929C77623DF34AFD30596C385E5395 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -639,11 +789,11 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 9F4FFEB213C308A8E1092334616A2C4E /* Sources */ = { + 7A44D84B4571131FF57273041B550ECC /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 47BDB97605B55D76D846461E4AFCF7E7 /* Pods-ApolloExampleTests-dummy.m in Sources */, + D561E43C2701839473D10B2A483134DC /* Pods-ApolloPerformanceTests-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -784,6 +934,41 @@ }; name = Debug; }; + 0E206AE35F16BDDB98DDB6D6C378F22C /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 724B09788D59362DE110F9760831B30B /* Pods-StarWarsAPI.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-StarWarsAPI/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_StarWarsAPI; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; 27E7E6A7297EC998C4737A039EC23FF3 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 88BFCDC2C48A9AAC024D78C7786357F9 /* SQLite.swift.xcconfig */; @@ -816,9 +1001,9 @@ }; name = Release; }; - 354CE588A6FCB21619EAF033C1DC3E01 /* Debug */ = { + 4176EC1974D617E004AB1E451936AE57 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 81EB8710A71482DC1F6F11F5914B1252 /* Pods-ApolloExampleTests.debug.xcconfig */; + baseConfigurationReference = 01C3FA9C5081FAF3B433C1CAC200835C /* Pods-ApolloPerformanceTests.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -831,18 +1016,18 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ApolloExampleTests/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ApolloPerformanceTests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ApolloExampleTests; + PRODUCT_NAME = Pods_ApolloPerformanceTests; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -891,9 +1076,44 @@ }; name = Release; }; + 6120DBA9F24C423B3AE6784EBD689696 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2DE423399B21C05322619DF24D280234 /* Pods-StarWarsAPI.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-StarWarsAPI/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_StarWarsAPI; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; 71A4E2F2604F856EAC9B9985B601B947 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2060F7497CEA6FBBC300CEBB95DE7599 /* Pods-ApolloExample.debug.xcconfig */; + baseConfigurationReference = 8378EF5103C93E048B7DF8B41415FF63 /* Pods-ApolloExample.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -929,7 +1149,7 @@ }; 7335027149CBC3B39EA4F93477DB2441 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5232E054E5318DB58C8DF2E3B7EC41CA /* Pods-ApolloExample.release.xcconfig */; + baseConfigurationReference = 9ADC492098AB1E55A5C9644F01624CA8 /* Pods-ApolloExample.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -962,9 +1182,44 @@ }; name = Release; }; - B811BEA39F0C86CFD347C457E918CBA6 /* Release */ = { + 744C7D932D697FAE9CBC1E2418B8438B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0AB6C025AC773267F2034B391653AEF6 /* Pods-ApolloTests.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-ApolloTests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_ApolloTests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 9F864E725BACB2A4698014F1EEB4F2EB /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9B43FC0646B9264E437BD567FCD00B22 /* Pods-ApolloExampleTests.release.xcconfig */; + baseConfigurationReference = 3C7116256A907933BD6C8D01B5E5D592 /* Pods-ApolloPerformanceTests.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -977,18 +1232,18 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ApolloExampleTests/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ApolloPerformanceTests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.modulemap"; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ApolloExampleTests; + PRODUCT_NAME = Pods_ApolloPerformanceTests; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1095,9 +1350,53 @@ }; name = Debug; }; + E50FEF70900FE0096F72284FC683D4A3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 08674A30761B25CB7AE0CE4CFFBFF205 /* Pods-ApolloTests.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-ApolloTests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_ApolloTests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 222228C35E74A852144A269ADEA44255 /* Build configuration list for PBXNativeTarget "Pods-ApolloPerformanceTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4176EC1974D617E004AB1E451936AE57 /* Debug */, + 9F864E725BACB2A4698014F1EEB4F2EB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1116,11 +1415,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 979CAF895B62E915B68EE92B9BE6517D /* Build configuration list for PBXNativeTarget "Pods-ApolloExampleTests" */ = { + 9BC068DB07866A94AB008F596590DA29 /* Build configuration list for PBXNativeTarget "Pods-StarWarsAPI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6120DBA9F24C423B3AE6784EBD689696 /* Debug */, + 0E206AE35F16BDDB98DDB6D6C378F22C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + AB17C4CAD175CDAFC59BF191C4007542 /* Build configuration list for PBXNativeTarget "Pods-ApolloTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 354CE588A6FCB21619EAF033C1DC3E01 /* Debug */, - B811BEA39F0C86CFD347C457E918CBA6 /* Release */, + 744C7D932D697FAE9CBC1E2418B8438B /* Debug */, + E50FEF70900FE0096F72284FC683D4A3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-dummy.m b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-dummy.m deleted file mode 100644 index dfdc9ff751..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_ApolloExampleTests : NSObject -@end -@implementation PodsDummy_Pods_ApolloExampleTests -@end diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.modulemap b/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.modulemap deleted file mode 100644 index bcc588bb4f..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_ApolloExampleTests { - umbrella header "Pods-ApolloExampleTests-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Info.plist b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Info.plist similarity index 100% rename from Example/Pods/Target Support Files/Pods-ApolloExampleTests/Info.plist rename to Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Info.plist diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.markdown similarity index 100% rename from Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-acknowledgements.markdown rename to Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.markdown diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.plist similarity index 100% rename from Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-acknowledgements.plist rename to Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.plist diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-dummy.m b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-dummy.m new file mode 100644 index 0000000000..2b1e440571 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_ApolloPerformanceTests : NSObject +@end +@implementation PodsDummy_Pods_ApolloPerformanceTests +@end diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-frameworks.sh b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-frameworks.sh similarity index 100% rename from Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-frameworks.sh rename to Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-frameworks.sh diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-resources.sh b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-resources.sh similarity index 100% rename from Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-resources.sh rename to Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-resources.sh diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-umbrella.h b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-umbrella.h new file mode 100644 index 0000000000..4bdc172cb3 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_ApolloPerformanceTestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_ApolloPerformanceTestsVersionString[]; + diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.debug.xcconfig similarity index 100% rename from Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.debug.xcconfig rename to Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.debug.xcconfig diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.modulemap b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.modulemap new file mode 100644 index 0000000000..754e100acc --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_ApolloPerformanceTests { + umbrella header "Pods-ApolloPerformanceTests-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.release.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.release.xcconfig similarity index 100% rename from Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.release.xcconfig rename to Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.release.xcconfig diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Info.plist b/Example/Pods/Target Support Files/Pods-ApolloTests/Info.plist new file mode 100644 index 0000000000..2243fe6e27 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloTests/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.markdown new file mode 100644 index 0000000000..102af75385 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.plist new file mode 100644 index 0000000000..7acbad1eab --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-dummy.m b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-dummy.m new file mode 100644 index 0000000000..11f165ecca --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_ApolloTests : NSObject +@end +@implementation PodsDummy_Pods_ApolloTests +@end diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-frameworks.sh b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-frameworks.sh new file mode 100755 index 0000000000..0f29f13c23 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-frameworks.sh @@ -0,0 +1,92 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current file + archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + stripped="" + for arch in $archs; do + if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi +} + +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-resources.sh b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-resources.sh new file mode 100755 index 0000000000..4602c68ab6 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-resources.sh @@ -0,0 +1,99 @@ +#!/bin/sh +set -e + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-umbrella.h b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-umbrella.h similarity index 58% rename from Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-umbrella.h rename to Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-umbrella.h index af4ea892b0..b465f576ec 100644 --- a/Example/Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests-umbrella.h +++ b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-umbrella.h @@ -11,6 +11,6 @@ #endif -FOUNDATION_EXPORT double Pods_ApolloExampleTestsVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_ApolloExampleTestsVersionString[]; +FOUNDATION_EXPORT double Pods_ApolloTestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_ApolloTestsVersionString[]; diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.debug.xcconfig new file mode 100644 index 0000000000..4a625a44ec --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.debug.xcconfig @@ -0,0 +1,7 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap new file mode 100644 index 0000000000..2a65d3711a --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_ApolloTests { + umbrella header "Pods-ApolloTests-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.release.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.release.xcconfig new file mode 100644 index 0000000000..4a625a44ec --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.release.xcconfig @@ -0,0 +1,7 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Info.plist b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Info.plist new file mode 100644 index 0000000000..2243fe6e27 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.markdown new file mode 100644 index 0000000000..102af75385 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.plist new file mode 100644 index 0000000000..7acbad1eab --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-dummy.m b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-dummy.m new file mode 100644 index 0000000000..61ba2e08b7 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_StarWarsAPI : NSObject +@end +@implementation PodsDummy_Pods_StarWarsAPI +@end diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-resources.sh b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-resources.sh new file mode 100755 index 0000000000..4602c68ab6 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-resources.sh @@ -0,0 +1,99 @@ +#!/bin/sh +set -e + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-umbrella.h b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-umbrella.h new file mode 100644 index 0000000000..d5a8a0d2bb --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_StarWarsAPIVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_StarWarsAPIVersionString[]; + diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.debug.xcconfig b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.debug.xcconfig new file mode 100644 index 0000000000..979a296ed8 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.debug.xcconfig @@ -0,0 +1,7 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.modulemap b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.modulemap new file mode 100644 index 0000000000..8f1e1860d1 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.modulemap @@ -0,0 +1,6 @@ +framework module Pods_StarWarsAPI { + umbrella header "Pods-StarWarsAPI-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.release.xcconfig b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.release.xcconfig new file mode 100644 index 0000000000..979a296ed8 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.release.xcconfig @@ -0,0 +1,7 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Tests/StarWarsAPI/API.swift b/Example/StarWarsAPI/API.swift similarity index 100% rename from Tests/StarWarsAPI/API.swift rename to Example/StarWarsAPI/API.swift diff --git a/Tests/StarWarsAPI/CreateReviewForEpisode.graphql b/Example/StarWarsAPI/CreateReviewForEpisode.graphql similarity index 100% rename from Tests/StarWarsAPI/CreateReviewForEpisode.graphql rename to Example/StarWarsAPI/CreateReviewForEpisode.graphql diff --git a/Tests/StarWarsAPI/HeroAndFriendsNames.graphql b/Example/StarWarsAPI/HeroAndFriendsNames.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroAndFriendsNames.graphql rename to Example/StarWarsAPI/HeroAndFriendsNames.graphql diff --git a/Tests/StarWarsAPI/HeroAppearsIn.graphql b/Example/StarWarsAPI/HeroAppearsIn.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroAppearsIn.graphql rename to Example/StarWarsAPI/HeroAppearsIn.graphql diff --git a/Tests/StarWarsAPI/HeroDetails.graphql b/Example/StarWarsAPI/HeroDetails.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroDetails.graphql rename to Example/StarWarsAPI/HeroDetails.graphql diff --git a/Tests/StarWarsAPI/HeroDetailsWithFragment.graphql b/Example/StarWarsAPI/HeroDetailsWithFragment.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroDetailsWithFragment.graphql rename to Example/StarWarsAPI/HeroDetailsWithFragment.graphql diff --git a/Tests/StarWarsAPI/HeroName.graphql b/Example/StarWarsAPI/HeroName.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroName.graphql rename to Example/StarWarsAPI/HeroName.graphql diff --git a/Tests/StarWarsAPI/HeroNameConditional.graphql b/Example/StarWarsAPI/HeroNameConditional.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroNameConditional.graphql rename to Example/StarWarsAPI/HeroNameConditional.graphql diff --git a/Tests/StarWarsAPI/HeroParentTypeDependentField.graphql b/Example/StarWarsAPI/HeroParentTypeDependentField.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroParentTypeDependentField.graphql rename to Example/StarWarsAPI/HeroParentTypeDependentField.graphql diff --git a/Tests/StarWarsAPI/HeroTypeDependentAliasedField.graphql b/Example/StarWarsAPI/HeroTypeDependentAliasedField.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroTypeDependentAliasedField.graphql rename to Example/StarWarsAPI/HeroTypeDependentAliasedField.graphql diff --git a/Tests/StarWarsAPI/HumanWithNullMass.graphql b/Example/StarWarsAPI/HumanWithNullMass.graphql similarity index 100% rename from Tests/StarWarsAPI/HumanWithNullMass.graphql rename to Example/StarWarsAPI/HumanWithNullMass.graphql diff --git a/Tests/StarWarsAPI/Info.plist b/Example/StarWarsAPI/Info.plist similarity index 100% rename from Tests/StarWarsAPI/Info.plist rename to Example/StarWarsAPI/Info.plist diff --git a/Tests/StarWarsAPI/SameHeroTwice.graphql b/Example/StarWarsAPI/SameHeroTwice.graphql similarity index 100% rename from Tests/StarWarsAPI/SameHeroTwice.graphql rename to Example/StarWarsAPI/SameHeroTwice.graphql diff --git a/Tests/StarWarsAPI/StarWarsAPI.h b/Example/StarWarsAPI/StarWarsAPI.h similarity index 100% rename from Tests/StarWarsAPI/StarWarsAPI.h rename to Example/StarWarsAPI/StarWarsAPI.h diff --git a/Tests/StarWarsAPI/Starship.graphql b/Example/StarWarsAPI/Starship.graphql similarity index 100% rename from Tests/StarWarsAPI/Starship.graphql rename to Example/StarWarsAPI/Starship.graphql diff --git a/Tests/StarWarsAPI/TwoHeroes.graphql b/Example/StarWarsAPI/TwoHeroes.graphql similarity index 100% rename from Tests/StarWarsAPI/TwoHeroes.graphql rename to Example/StarWarsAPI/TwoHeroes.graphql diff --git a/Tests/StarWarsAPI/schema.json b/Example/StarWarsAPI/schema.json similarity index 100% rename from Tests/StarWarsAPI/schema.json rename to Example/StarWarsAPI/schema.json diff --git a/Example/TestHost iOS/AppDelegate.swift b/Example/TestHost iOS/AppDelegate.swift new file mode 100644 index 0000000000..d81efbe54a --- /dev/null +++ b/Example/TestHost iOS/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// TestHost iOS +// +// Created by paul_kompfner on 4/4/17. +// +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/Tests/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Tests/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Example/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Tests/TestHost iOS/Base.lproj/LaunchScreen.storyboard b/Example/TestHost iOS/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from Tests/TestHost iOS/Base.lproj/LaunchScreen.storyboard rename to Example/TestHost iOS/Base.lproj/LaunchScreen.storyboard diff --git a/Tests/TestHost iOS/Base.lproj/Main.storyboard b/Example/TestHost iOS/Base.lproj/Main.storyboard similarity index 100% rename from Tests/TestHost iOS/Base.lproj/Main.storyboard rename to Example/TestHost iOS/Base.lproj/Main.storyboard diff --git a/Tests/TestHost iOS/Info.plist b/Example/TestHost iOS/Info.plist similarity index 89% rename from Tests/TestHost iOS/Info.plist rename to Example/TestHost iOS/Info.plist index 4190b7b906..d052473868 100644 --- a/Tests/TestHost iOS/Info.plist +++ b/Example/TestHost iOS/Info.plist @@ -15,16 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.5.6 + 1.0 CFBundleVersion - $(CURRENT_PROJECT_VERSION) + 1 LSRequiresIPhoneOS - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - UILaunchStoryboardName LaunchScreen UIMainStoryboardFile diff --git a/Example/TestHost iOS/ViewController.swift b/Example/TestHost iOS/ViewController.swift new file mode 100644 index 0000000000..d81f667429 --- /dev/null +++ b/Example/TestHost iOS/ViewController.swift @@ -0,0 +1,25 @@ +// +// ViewController.swift +// TestHost iOS +// +// Created by paul_kompfner on 4/4/17. +// +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + +} + diff --git a/Tests/TestHost iOS/AppDelegate.swift b/Tests/TestHost iOS/AppDelegate.swift deleted file mode 100644 index c1a82671dc..0000000000 --- a/Tests/TestHost iOS/AppDelegate.swift +++ /dev/null @@ -1,6 +0,0 @@ -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? -} diff --git a/Tests/TestHost iOS/ViewController.swift b/Tests/TestHost iOS/ViewController.swift deleted file mode 100644 index b9a63bbdea..0000000000 --- a/Tests/TestHost iOS/ViewController.swift +++ /dev/null @@ -1,4 +0,0 @@ -import UIKit - -class ViewController: UIViewController { -} From 6384fb4c7cc804f1e1215cfa2fd573d07f0ec0de Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Tue, 4 Apr 2017 19:25:44 -0700 Subject: [PATCH 05/76] Workaround to tests not running due to Apollo.framework not being in framework directory by the time StarWarsAPI generate API build phase is run --- Example/Podfile | 2 + Example/Podfile.lock | 2 +- Example/Pods/Manifest.lock | 2 +- Example/Pods/Pods.xcodeproj/project.pbxproj | 411 +++++++++++------- ...PerformanceTests-acknowledgements.markdown | 50 +++ ...lloPerformanceTests-acknowledgements.plist | 62 +++ .../Pods-ApolloPerformanceTests-frameworks.sh | 9 + ...Pods-ApolloPerformanceTests.debug.xcconfig | 3 + ...ds-ApolloPerformanceTests.release.xcconfig | 3 + ...Pods-ApolloTests-acknowledgements.markdown | 50 +++ .../Pods-ApolloTests-acknowledgements.plist | 62 +++ .../Pods-ApolloTests-frameworks.sh | 9 + .../Pods-ApolloTests.debug.xcconfig | 3 + .../Pods-ApolloTests.release.xcconfig | 3 + ...Pods-StarWarsAPI-acknowledgements.markdown | 50 +++ .../Pods-StarWarsAPI-acknowledgements.plist | 62 +++ .../Pods-StarWarsAPI.debug.xcconfig | 2 + .../Pods-StarWarsAPI.release.xcconfig | 2 + 18 files changed, 623 insertions(+), 164 deletions(-) diff --git a/Example/Podfile b/Example/Podfile index a84aee0f98..ad5ab8468b 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -16,6 +16,8 @@ target 'ApolloExample' do target 'StarWarsAPI' do inherit! :search_paths + # For some reason this is needed to ensure that Apollo.framework is built before StarWarsAPI + pod 'Apollo', path: '../' end end diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 7e0dee6446..8cfc68a3cf 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -16,6 +16,6 @@ SPEC CHECKSUMS: Apollo: 6ced3e5ebf99730856f5c3643eb2cfe781d719b1 SQLite.swift: 670c3e9e0a806bbfd56a3de5d530768dc0e6fe7c -PODFILE CHECKSUM: 55dff9f71ee00e7e1c0932f14b4fb701f80e0224 +PODFILE CHECKSUM: 9bd64f1e501820f8e5f1371c1e93f80107c6bb1f COCOAPODS: 1.2.0 diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index 7e0dee6446..8cfc68a3cf 100644 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -16,6 +16,6 @@ SPEC CHECKSUMS: Apollo: 6ced3e5ebf99730856f5c3643eb2cfe781d719b1 SQLite.swift: 670c3e9e0a806bbfd56a3de5d530768dc0e6fe7c -PODFILE CHECKSUM: 55dff9f71ee00e7e1c0932f14b4fb701f80e0224 +PODFILE CHECKSUM: 9bd64f1e501820f8e5f1371c1e93f80107c6bb1f COCOAPODS: 1.2.0 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 23e61e80eb..519a2c3f69 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -9,30 +9,34 @@ /* Begin PBXBuildFile section */ 01CD0AAF59D458AC3EF2601332DC362C /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A8AF61E57D939C975D9A6B03DF50CC7 /* SqliteNormalizedCache.swift */; }; 108A1CBD5D0C9FC34DD2B5C2B8DD0E1F /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF98B7BBADF63A0AF80D7829FA6F77B9 /* Schema.swift */; }; + 1105737F12067068DF24A2FD70FC93A3 /* Pods-ApolloPerformanceTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 975269A36A5CF422A22E5D5DA93EAB28 /* Pods-ApolloPerformanceTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11D8F132B7F8704E64825695F6B0DC91 /* fts3_tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5AE2EFBEFDE20C4DDD8B3398D8AE5AE8 /* fts3_tokenizer.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1569991C9A095D1FCE6B235BD63B51A4 /* Apollo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B5C756BCE1977B310FBCDFC81E7CB726 /* Apollo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15E73F1CED9B85C8E03C6134581D2ED0 /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60FAE93532FD5578A02AF3CC523A3408 /* CoreFunctions.swift */; }; + 16822C933B2ADA1EA5F2EB694F3DA728 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; 20C306F7AA685281AAEADDEF70FE27B4 /* Record.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616AA09AE6625A279D08C4E95BBF8FAF /* Record.swift */; }; + 2232C53C6D807D0DA97BBB9E4523412C /* Pods-ApolloPerformanceTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E664068C762C5F1811AB06C5856E5BC7 /* Pods-ApolloPerformanceTests-dummy.m */; }; 24401D6F94D534811685D1F542F93892 /* GraphQLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95684FC3AB25B49063D525A7C78F0B17 /* GraphQLResponse.swift */; }; 2650B6BD41F1BDFF5A15F9C4C8E61A37 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35069E56A5D5D4923A18BA7A092E73D4 /* Utilities.swift */; }; 2664C21FA05281B3AEC72F71EA44028A /* Collections.swift in Sources */ = {isa = PBXBuildFile; fileRef = A918C3B2E22CB999534D187039A4D52A /* Collections.swift */; }; 2C64BE3142AB8955A8F1B7ED8C4AC1FD /* AsynchronousOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A5D8EED2099F4E9AC37C5EC2D95A738 /* AsynchronousOperation.swift */; }; 30382E91D15E7ED4E930564DE86EAF27 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44EE37E8BF436A90A9C40AD27A182DB2 /* Expression.swift */; }; + 3046B5C2E5FFE5A008023E939500A575 /* Pods-StarWarsAPI-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 179109F8B259422432C0355515576040 /* Pods-StarWarsAPI-dummy.m */; }; 3401D945C9C21F03B6E5100F26DF231C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; 35E5EEDB90225D140DCA57800CD5A2CD /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23E934E5F923C9742E63347D5512C322 /* AggregateFunctions.swift */; }; - 3881AED1848707B1BE97A19CCDB2DEA4 /* Pods-ApolloTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E12D36800035FA4AEBD5CCA0E467F5C2 /* Pods-ApolloTests-dummy.m */; }; 3D85E3F5AB73653A962BCF09ED74A8C0 /* JSONSerializationFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30DAD61D66BBDE6441131A52D95BDB04 /* JSONSerializationFormat.swift */; }; 3EB8845BB3EB8B7E031BCA86CEC2F0D2 /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B4C8E0D8DB99B4482E2549FEAE620B8 /* FTS5.swift */; }; 3EEC07CDEFE2204C5CFC1E1B10B6537F /* GraphQLResultNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF17E380BFA697F14018DED6126C8AC8 /* GraphQLResultNormalizer.swift */; }; 415B7E98D356AE4B47C6FD5D11E11C99 /* Pods-ApolloExample-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F2AA223F544DC4835618D4D4A2FAA05 /* Pods-ApolloExample-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 42356EE1E9CC755A203A384EBB3F4F9F /* Pods-StarWarsAPI-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 03D7BFAC37C274E39C5162127AEB6199 /* Pods-StarWarsAPI-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 42F81544370E1853391B67D56656A0C3 /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348491EAD9C18B0EEB2E855815254774 /* CustomFunctions.swift */; }; + 44C82D3863ECC8C395C961C46C2F756B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; 47628EC1F1DDCC60DF83EA01A277919E /* SQLite-Bridging.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E070D9E44393CD520D0B1AF87A6736D /* SQLite-Bridging.m */; }; 47B4F5C1BFB40746F552A6D5CE482DC3 /* Locking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9090E10380883B7CA79EE41C691650F7 /* Locking.swift */; }; 49876A987CA44C386457D31880AE1BD6 /* SQLite.swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 27B2D491F0A9B062233011B873DC118C /* SQLite.swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A23CC3D6A3579C9F12AE00384A7A4F3 /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F331ABE5223829EDFFC088184DFA981 /* RTree.swift */; }; 4DCCD02DB715AC161B0774E0C137353E /* NetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42BBD89CF65425C4A9DD8F6390DF859D /* NetworkTransport.swift */; }; 4FFB64EBCE34E07A60C74F1957B34A7B /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FCCE88ECC9D892349AB6CB3160246D9 /* Query.swift */; }; + 54050A3940A7AAF2A4166F6B4027F1D0 /* Pods-StarWarsAPI-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 03D7BFAC37C274E39C5162127AEB6199 /* Pods-StarWarsAPI-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 54CFD21E9012A2554410D08EF63E42CB /* ApolloClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B42D8D8A4E18179F37824F2695F75F3 /* ApolloClient.swift */; }; 5C154FC66B0272E926E740EB0D5DDF3E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; 6263A24701DED2E7A447C0313C7C555D /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA7CCC1A073BC5540EA969CA71F0C552 /* Setter.swift */; }; @@ -42,17 +46,16 @@ 6CC6B8EEDAA285718533CC1482D13B61 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = E993F928AC8B4275D32665A6205AE456 /* Result.swift */; }; 6F378D7233AC3E51B00DB180BF8D6066 /* Selections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F3DE78C37EE122AA21BA986A77BB162 /* Selections.swift */; }; 6FCDA3222BB1A7CADC500C19CA4A6611 /* check-and-run-apollo-codegen.sh in Resources */ = {isa = PBXBuildFile; fileRef = 872EA0E9B1EC6684546BEFF234C61E6E /* check-and-run-apollo-codegen.sh */; }; - 75239A1E7D7F766070E7D7555D57F699 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; 77E05C7059DFD498C2B323C3A707C0E8 /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 078C996EB71DC4EA36311067B6D81A3E /* Promise.swift */; }; 787BB17CD95328B14A766F6BC04D2148 /* HTTPNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D40A77826E6FE48F27E93C4A66DD9C /* HTTPNetworkTransport.swift */; }; 7FF4749CC9A33C7B79FE51E0962A4E8A /* Dictionary+KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FA62E20AC29F9ECA17CDE346F83E445 /* Dictionary+KeyPath.swift */; }; - 83BEA6930F603459FFE20F907F385F40 /* Pods-ApolloTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A750E6B16B43489DE32A5211D58F9FBA /* Pods-ApolloTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 853B5034825B85498FE7857957760849 /* NormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED6DD22A402D834518D62E49A6D34114 /* NormalizedCache.swift */; }; 87109E7659BAF278C52455C1D6529DF6 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DE06F129836BA95B0BE2222991D2BD0 /* Value.swift */; }; 8916D47EB3F95315F2020922A6130D8D /* GraphQLExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 909F358C8C8DF9392766416B86EACE63 /* GraphQLExecutor.swift */; }; 8D2A9E5942209EC7EAE309C3BDEC344E /* GraphQLQueryWatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0324BDEF4908733765A4E8909A7F10 /* GraphQLQueryWatcher.swift */; }; - 8D6F15E5D4B6E92EE107915DCC8AA84E /* Pods-StarWarsAPI-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 179109F8B259422432C0355515576040 /* Pods-StarWarsAPI-dummy.m */; }; + 94C4501EC15533C68551FCFD9896339D /* Pods-ApolloTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E12D36800035FA4AEBD5CCA0E467F5C2 /* Pods-ApolloTests-dummy.m */; }; 94ECE937BFDFCDBD700A107B1DC40CA9 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96600A78FEC066BF8931D7A58FBF0F16 /* Statement.swift */; }; + 990D4881FF22A80867C475FB9823817A /* Pods-ApolloTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A750E6B16B43489DE32A5211D58F9FBA /* Pods-ApolloTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; A11B9C4B8DC4AF252BA2727D21A1EEF1 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7B7855DE178D22988512E88C68325BE /* Collation.swift */; }; A3FF4B5B363E91C3BE7FC3294C555032 /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E667D63233F61B551F3B93AF184020E0 /* Foundation.swift */; }; A54DF0B95FE0DAD23D2A81D408683D03 /* DataLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 180A54E2C9EAC29BCD0767F9CF54EB79 /* DataLoader.swift */; }; @@ -66,26 +69,44 @@ B948E00EC8119CFD8B9E55DBBDA5A4E3 /* GraphQLOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37BFA28F22BF54064B21348557B64BD3 /* GraphQLOperation.swift */; }; BA32663AD51B09E7997DD5871D7FE383 /* GraphQLDependencyTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 399B342ADA72E237E0EBF1EEAA28FB25 /* GraphQLDependencyTracker.swift */; }; C02AE58DC3E78ACB817163011C7A6734 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 680617B7B3999D016982CD479DADCCB0 /* Blob.swift */; }; - D561E43C2701839473D10B2A483134DC /* Pods-ApolloPerformanceTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E664068C762C5F1811AB06C5856E5BC7 /* Pods-ApolloPerformanceTests-dummy.m */; }; D850BB2A3E7B9A6AAEB54FA9A8B7AD4F /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCF813C6D3C0824E1BCFDACADE6109F5 /* Connection.swift */; }; D99283BAF5F146D362611679A5ED1A5D /* Apollo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E5BB833C4CF9D696FCF839FB705C1A91 /* Apollo-dummy.m */; }; DA0CEB1E0989DCA89796ABDF7267A7B0 /* InMemoryNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA52A0176DDC85E070F4BA3E088EDF79 /* InMemoryNormalizedCache.swift */; }; DD139C21BC1B51C5078B8F9C2F55D0A3 /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7A99896DB5D793228657B5F5EC525DA /* FTS4.swift */; }; E13D7AA4EFBA1345BDC2E05B4BD67F2A /* GraphQLError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74015506E81FA3C19EB6D906D81024AB /* GraphQLError.swift */; }; - E14803A2EF5E0BE3E8AF387F00BB2912 /* Pods-ApolloPerformanceTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 975269A36A5CF422A22E5D5DA93EAB28 /* Pods-ApolloPerformanceTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E1594276237878B311DC1096AC1BFD45 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; E2D3B028353BC0FA74DA8536C717B9E4 /* GraphQLValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23BAD010DBCF8C2B764B7E2E9895805 /* GraphQLValues.swift */; }; EB775615489CE36C2D86C4EB279F3FF5 /* GraphQLResultMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5BED4FF18AC316194A81FD5C33ED9C5 /* GraphQLResultMapper.swift */; }; EEA27311E6D18D94F27E12D2F0BE7BF0 /* GraphQLOutputType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A2AD2C9998545CA1776374D0EB8D35 /* GraphQLOutputType.swift */; }; F0EF5885BD48A9B939F3FF9C1DC1A965 /* GraphQLResultAccumulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C326DB4844A6FBD86CFBA30BDD08DB6 /* GraphQLResultAccumulator.swift */; }; F4DAAE8A4DF58A14A2B8A6272ED102C7 /* RecordSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB35A20B8A16FA8E837FAEA496B53CBE /* RecordSet.swift */; }; - F5959B98BB50AE11BD404C70AE8D503A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; F86D649610E4878DE71D25AA9CC614A2 /* JSONStandardTypeConversions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1F6997F619DB12A60F7EA5B8005190 /* JSONStandardTypeConversions.swift */; }; + FAB10CD9CFBBFB7DE9F271B434380C16 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; FDA57D0DA6CBE5083CAF08A8B2F86AC9 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2C5D76BD109C46DEC526A712FC4A8BB /* Helpers.swift */; }; FF53DDD16D8FC3431D3F148AC7FD56CD /* GraphQLResponseGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7156C5037F2DC118EFF48E601858205 /* GraphQLResponseGenerator.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 1F9242C10DCAAE891388E785556234B8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = C566155694F9D7502B8E41EDDAE53326; + remoteInfo = Apollo; + }; + 26821ADABDEB80E0955C6A95F66727F0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 19C23DAC4474B6CD13A5110683532E69; + remoteInfo = SQLite.swift; + }; + 3A80F75EB77EED46D454A98123AB9CE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 19C23DAC4474B6CD13A5110683532E69; + remoteInfo = SQLite.swift; + }; 46F1F23422897FFFE9D31496B6CFD03F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; @@ -93,6 +114,13 @@ remoteGlobalIDString = 19C23DAC4474B6CD13A5110683532E69; remoteInfo = SQLite.swift; }; + 64E5D955EF55FA4B878F3A32D0658ADE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 19C23DAC4474B6CD13A5110683532E69; + remoteInfo = SQLite.swift; + }; 6EC485A2374F1AB1F5F33127C6257458 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; @@ -100,6 +128,13 @@ remoteGlobalIDString = C566155694F9D7502B8E41EDDAE53326; remoteInfo = Apollo; }; + C00427F48EF37BFBCADF82EB7092C653 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = C566155694F9D7502B8E41EDDAE53326; + remoteInfo = Apollo; + }; DA3A67213BA0213D69558FE47052F8CB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; @@ -107,6 +142,13 @@ remoteGlobalIDString = 19C23DAC4474B6CD13A5110683532E69; remoteInfo = SQLite.swift; }; + F08278AA3683BE91FA7DC6EDE8AAA38A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = C566155694F9D7502B8E41EDDAE53326; + remoteInfo = Apollo; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -230,52 +272,52 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 30AE83E2B9378413D12911D07B9342A1 /* Frameworks */ = { + 204A049E51246EBFC6025779873FE742 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3401D945C9C21F03B6E5100F26DF231C /* Foundation.framework in Frameworks */, - B6F6F22A0B59D1A386C7AC19789B74C0 /* SQLite.framework in Frameworks */, + FAB10CD9CFBBFB7DE9F271B434380C16 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A669049662D8B3E8CE1621BA70630893 /* Frameworks */ = { + 30AE83E2B9378413D12911D07B9342A1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A60D999F6C5C2A7030430FBB2644A85D /* Foundation.framework in Frameworks */, + 3401D945C9C21F03B6E5100F26DF231C /* Foundation.framework in Frameworks */, + B6F6F22A0B59D1A386C7AC19789B74C0 /* SQLite.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - B7388B46AC95BDC5641A0B22BB0EE1C7 /* Frameworks */ = { + 480A9FB08056754438E61097D5ADB3A7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5C154FC66B0272E926E740EB0D5DDF3E /* Foundation.framework in Frameworks */, + 16822C933B2ADA1EA5F2EB694F3DA728 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BFFF2CE0E64958B7B4B52B65E1A02931 /* Frameworks */ = { + 79865417B1BFD4E495D7137ACF9240CB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E1594276237878B311DC1096AC1BFD45 /* Foundation.framework in Frameworks */, + 44C82D3863ECC8C395C961C46C2F756B /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - DF6881DCDE90E4CCCA06D48A9066D2B5 /* Frameworks */ = { + A669049662D8B3E8CE1621BA70630893 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F5959B98BB50AE11BD404C70AE8D503A /* Foundation.framework in Frameworks */, + A60D999F6C5C2A7030430FBB2644A85D /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - E6A88AC1C093D7684B52F05F6FC40F94 /* Frameworks */ = { + B7388B46AC95BDC5641A0B22BB0EE1C7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 75239A1E7D7F766070E7D7555D57F699 /* Foundation.framework in Frameworks */, + 5C154FC66B0272E926E740EB0D5DDF3E /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -562,27 +604,27 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 66589AEC667FCA545203B8586032BAA6 /* Headers */ = { + 2B89A7BBD697C64467DB27C9A5547D2E /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 83BEA6930F603459FFE20F907F385F40 /* Pods-ApolloTests-umbrella.h in Headers */, + 54050A3940A7AAF2A4166F6B4027F1D0 /* Pods-StarWarsAPI-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 74C5C5F3389C8332414F2DC51DB6835C /* Headers */ = { + 4308E4BFD6444A25DB264315A778DD8E /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 42356EE1E9CC755A203A384EBB3F4F9F /* Pods-StarWarsAPI-umbrella.h in Headers */, + 990D4881FF22A80867C475FB9823817A /* Pods-ApolloTests-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9022A811D2FFD9A937488B43C0787870 /* Headers */ = { + 89BE3ADE0C873396201A80EEBAE6C578 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - E14803A2EF5E0BE3E8AF387F00BB2912 /* Pods-ApolloPerformanceTests-umbrella.h in Headers */, + 1105737F12067068DF24A2FD70FC93A3 /* Pods-ApolloPerformanceTests-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -633,17 +675,57 @@ productReference = E4DDFDE7D66D82B6084F70FC8DE5F14D /* SQLite.framework */; productType = "com.apple.product-type.framework"; }; - 1BB44C4CC5427F2569076825E6E7B9F5 /* Pods-ApolloPerformanceTests */ = { + 41E97655D961AA41E6A2722B6C746208 /* Pods-StarWarsAPI */ = { + isa = PBXNativeTarget; + buildConfigurationList = A27E3654494474C12D100B961BBFAA7D /* Build configuration list for PBXNativeTarget "Pods-StarWarsAPI" */; + buildPhases = ( + 8B249350AF7614C7053C62865A2328C3 /* Sources */, + 204A049E51246EBFC6025779873FE742 /* Frameworks */, + 2B89A7BBD697C64467DB27C9A5547D2E /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 02965513AF2BF1C5C482907711613B42 /* PBXTargetDependency */, + D89E6E2F0F43C3D735FC872E160632B1 /* PBXTargetDependency */, + ); + name = "Pods-StarWarsAPI"; + productName = "Pods-StarWarsAPI"; + productReference = 261B0C331D5E3A2F400B2EC0F77CC1F7 /* Pods_StarWarsAPI.framework */; + productType = "com.apple.product-type.framework"; + }; + 57D6CAD9EA986DB7361786D32B260180 /* Pods-ApolloTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9898252794B21AF5F18F17B2C932E6AF /* Build configuration list for PBXNativeTarget "Pods-ApolloTests" */; + buildPhases = ( + 6BDBF318396893A065A76333CF493B33 /* Sources */, + 79865417B1BFD4E495D7137ACF9240CB /* Frameworks */, + 4308E4BFD6444A25DB264315A778DD8E /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 9A76605DF9334EC45AB370EB987BB906 /* PBXTargetDependency */, + 0F9D3875676717FCB29EDE23C548F181 /* PBXTargetDependency */, + ); + name = "Pods-ApolloTests"; + productName = "Pods-ApolloTests"; + productReference = C08D4B7E051B2878FD9A1DB195944C60 /* Pods_ApolloTests.framework */; + productType = "com.apple.product-type.framework"; + }; + 9FF47F905911618B121CF678C81FF44E /* Pods-ApolloPerformanceTests */ = { isa = PBXNativeTarget; - buildConfigurationList = 222228C35E74A852144A269ADEA44255 /* Build configuration list for PBXNativeTarget "Pods-ApolloPerformanceTests" */; + buildConfigurationList = B57D88FCAE5B541F13D51FC993902ECA /* Build configuration list for PBXNativeTarget "Pods-ApolloPerformanceTests" */; buildPhases = ( - 7A44D84B4571131FF57273041B550ECC /* Sources */, - E6A88AC1C093D7684B52F05F6FC40F94 /* Frameworks */, - 9022A811D2FFD9A937488B43C0787870 /* Headers */, + DE55A65AD35585F4D59CC7C2C1FB9035 /* Sources */, + 480A9FB08056754438E61097D5ADB3A7 /* Frameworks */, + 89BE3ADE0C873396201A80EEBAE6C578 /* Headers */, ); buildRules = ( ); dependencies = ( + C3D22173AE23354A536DC9691D8521AE /* PBXTargetDependency */, + 9D0A9CEED3B12F9EC0FEDF74AD13F20D /* PBXTargetDependency */, ); name = "Pods-ApolloPerformanceTests"; productName = "Pods-ApolloPerformanceTests"; @@ -669,23 +751,6 @@ productReference = F4E94D9B3A51997F835199160D3A6204 /* Apollo.framework */; productType = "com.apple.product-type.framework"; }; - C6FB99BCC9BF63B3AB31D9C2C9BFACDD /* Pods-StarWarsAPI */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9BC068DB07866A94AB008F596590DA29 /* Build configuration list for PBXNativeTarget "Pods-StarWarsAPI" */; - buildPhases = ( - 4850F19E40D33680244B67D003D51804 /* Sources */, - BFFF2CE0E64958B7B4B52B65E1A02931 /* Frameworks */, - 74C5C5F3389C8332414F2DC51DB6835C /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Pods-StarWarsAPI"; - productName = "Pods-StarWarsAPI"; - productReference = 261B0C331D5E3A2F400B2EC0F77CC1F7 /* Pods_StarWarsAPI.framework */; - productType = "com.apple.product-type.framework"; - }; CD971B48011CD3BD0356983083C8F0E0 /* Pods-ApolloExample */ = { isa = PBXNativeTarget; buildConfigurationList = C79EB8FDA380D31052FF2C49D1D80CD7 /* Build configuration list for PBXNativeTarget "Pods-ApolloExample" */; @@ -705,23 +770,6 @@ productReference = 3FA13D59DC7D79809DCEF476848EAED0 /* Pods_ApolloExample.framework */; productType = "com.apple.product-type.framework"; }; - DCBE4F9976E0BFC9450B27517F18EBBB /* Pods-ApolloTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = AB17C4CAD175CDAFC59BF191C4007542 /* Build configuration list for PBXNativeTarget "Pods-ApolloTests" */; - buildPhases = ( - 4CC28BEE91A89C3BF44435F9BE2183DF /* Sources */, - DF6881DCDE90E4CCCA06D48A9066D2B5 /* Frameworks */, - 66589AEC667FCA545203B8586032BAA6 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Pods-ApolloTests"; - productName = "Pods-ApolloTests"; - productReference = C08D4B7E051B2878FD9A1DB195944C60 /* Pods_ApolloTests.framework */; - productType = "com.apple.product-type.framework"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -745,9 +793,9 @@ targets = ( C566155694F9D7502B8E41EDDAE53326 /* Apollo */, CD971B48011CD3BD0356983083C8F0E0 /* Pods-ApolloExample */, - 1BB44C4CC5427F2569076825E6E7B9F5 /* Pods-ApolloPerformanceTests */, - DCBE4F9976E0BFC9450B27517F18EBBB /* Pods-ApolloTests */, - C6FB99BCC9BF63B3AB31D9C2C9BFACDD /* Pods-StarWarsAPI */, + 9FF47F905911618B121CF678C81FF44E /* Pods-ApolloPerformanceTests */, + 57D6CAD9EA986DB7361786D32B260180 /* Pods-ApolloTests */, + 41E97655D961AA41E6A2722B6C746208 /* Pods-StarWarsAPI */, 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */, ); }; @@ -765,35 +813,27 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 4850F19E40D33680244B67D003D51804 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D6F15E5D4B6E92EE107915DCC8AA84E /* Pods-StarWarsAPI-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4CC28BEE91A89C3BF44435F9BE2183DF /* Sources */ = { + 6A929C77623DF34AFD30596C385E5395 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3881AED1848707B1BE97A19CCDB2DEA4 /* Pods-ApolloTests-dummy.m in Sources */, + 636C2473106673D1432A22A0B7D6A2C9 /* Pods-ApolloExample-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6A929C77623DF34AFD30596C385E5395 /* Sources */ = { + 6BDBF318396893A065A76333CF493B33 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 636C2473106673D1432A22A0B7D6A2C9 /* Pods-ApolloExample-dummy.m in Sources */, + 94C4501EC15533C68551FCFD9896339D /* Pods-ApolloTests-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 7A44D84B4571131FF57273041B550ECC /* Sources */ = { + 8B249350AF7614C7053C62865A2328C3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - D561E43C2701839473D10B2A483134DC /* Pods-ApolloPerformanceTests-dummy.m in Sources */, + 3046B5C2E5FFE5A008023E939500A575 /* Pods-StarWarsAPI-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -839,6 +879,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + DE55A65AD35585F4D59CC7C2C1FB9035 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2232C53C6D807D0DA97BBB9E4523412C /* Pods-ApolloPerformanceTests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; EBD29A96FAFC82C68899AA23CCF587C9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -869,18 +917,54 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 02965513AF2BF1C5C482907711613B42 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Apollo; + target = C566155694F9D7502B8E41EDDAE53326 /* Apollo */; + targetProxy = C00427F48EF37BFBCADF82EB7092C653 /* PBXContainerItemProxy */; + }; 02B28FE1724BC6B743D6E5ECF3BF4774 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SQLite.swift; target = 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */; targetProxy = DA3A67213BA0213D69558FE47052F8CB /* PBXContainerItemProxy */; }; + 0F9D3875676717FCB29EDE23C548F181 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SQLite.swift; + target = 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */; + targetProxy = 26821ADABDEB80E0955C6A95F66727F0 /* PBXContainerItemProxy */; + }; 7E8FAC92559ED7BB7F0BAD12225E305B /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SQLite.swift; target = 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */; targetProxy = 46F1F23422897FFFE9D31496B6CFD03F /* PBXContainerItemProxy */; }; + 9A76605DF9334EC45AB370EB987BB906 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Apollo; + target = C566155694F9D7502B8E41EDDAE53326 /* Apollo */; + targetProxy = F08278AA3683BE91FA7DC6EDE8AAA38A /* PBXContainerItemProxy */; + }; + 9D0A9CEED3B12F9EC0FEDF74AD13F20D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SQLite.swift; + target = 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */; + targetProxy = 3A80F75EB77EED46D454A98123AB9CE5 /* PBXContainerItemProxy */; + }; + C3D22173AE23354A536DC9691D8521AE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Apollo; + target = C566155694F9D7502B8E41EDDAE53326 /* Apollo */; + targetProxy = 1F9242C10DCAAE891388E785556234B8 /* PBXContainerItemProxy */; + }; + D89E6E2F0F43C3D735FC872E160632B1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SQLite.swift; + target = 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */; + targetProxy = 64E5D955EF55FA4B878F3A32D0658ADE /* PBXContainerItemProxy */; + }; EEEAD09294FC095B553735B1B97F0644 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Apollo; @@ -934,7 +1018,7 @@ }; name = Debug; }; - 0E206AE35F16BDDB98DDB6D6C378F22C /* Release */ = { + 14A701696AB64646C10DAB0A691FD4B7 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 724B09788D59362DE110F9760831B30B /* Pods-StarWarsAPI.release.xcconfig */; buildSettings = { @@ -1001,15 +1085,50 @@ }; name = Release; }; - 4176EC1974D617E004AB1E451936AE57 /* Debug */ = { + 34136DCAA08D39CFEB43D3BAD2155601 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 01C3FA9C5081FAF3B433C1CAC200835C /* Pods-ApolloPerformanceTests.debug.xcconfig */; + baseConfigurationReference = 08674A30761B25CB7AE0CE4CFFBFF205 /* Pods-ApolloTests.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-ApolloTests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_ApolloTests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 3CC4C36F5289303C10A5C17CB8A89697 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3C7116256A907933BD6C8D01B5E5D592 /* Pods-ApolloPerformanceTests.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1022,7 +1141,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -1034,7 +1153,7 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; 44CDBB6D11DE06DB64D6268622BDC47E /* Release */ = { isa = XCBuildConfiguration; @@ -1076,7 +1195,7 @@ }; name = Release; }; - 6120DBA9F24C423B3AE6784EBD689696 /* Debug */ = { + 50122EDA2FE520893A88613D785EFA46 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 2DE423399B21C05322619DF24D280234 /* Pods-StarWarsAPI.debug.xcconfig */; buildSettings = { @@ -1105,6 +1224,7 @@ PRODUCT_NAME = Pods_StarWarsAPI; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -1147,85 +1267,86 @@ }; name = Debug; }; - 7335027149CBC3B39EA4F93477DB2441 /* Release */ = { + 71E51F2CAE81759CF7FE4B052BF17D18 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9ADC492098AB1E55A5C9644F01624CA8 /* Pods-ApolloExample.release.xcconfig */; + baseConfigurationReference = 0AB6C025AC773267F2034B391653AEF6 /* Pods-ApolloTests.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ApolloExample/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ApolloTests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ApolloExample/Pods-ApolloExample.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; + MODULEMAP_FILE = "Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ApolloExample; + PRODUCT_NAME = Pods_ApolloTests; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 744C7D932D697FAE9CBC1E2418B8438B /* Debug */ = { + 7335027149CBC3B39EA4F93477DB2441 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 0AB6C025AC773267F2034B391653AEF6 /* Pods-ApolloTests.debug.xcconfig */; + baseConfigurationReference = 9ADC492098AB1E55A5C9644F01624CA8 /* Pods-ApolloExample.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ApolloTests/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ApolloExample/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; + MODULEMAP_FILE = "Target Support Files/Pods-ApolloExample/Pods-ApolloExample.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ApolloTests; + PRODUCT_NAME = Pods_ApolloExample; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 9F864E725BACB2A4698014F1EEB4F2EB /* Release */ = { + 87263DFDFB0D861CCF5C75BB6BFB2308 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3C7116256A907933BD6C8D01B5E5D592 /* Pods-ApolloPerformanceTests.release.xcconfig */; + baseConfigurationReference = 01C3FA9C5081FAF3B433C1CAC200835C /* Pods-ApolloPerformanceTests.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -1238,7 +1359,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -1246,11 +1367,12 @@ PRODUCT_NAME = Pods_ApolloPerformanceTests; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; BF59425203BD23DBB85AF465D9BB20B7 /* Debug */ = { isa = XCBuildConfiguration; @@ -1350,53 +1472,9 @@ }; name = Debug; }; - E50FEF70900FE0096F72284FC683D4A3 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 08674A30761B25CB7AE0CE4CFFBFF205 /* Pods-ApolloTests.release.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ApolloTests/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ApolloTests; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 222228C35E74A852144A269ADEA44255 /* Build configuration list for PBXNativeTarget "Pods-ApolloPerformanceTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4176EC1974D617E004AB1E451936AE57 /* Debug */, - 9F864E725BACB2A4698014F1EEB4F2EB /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1415,20 +1493,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 9BC068DB07866A94AB008F596590DA29 /* Build configuration list for PBXNativeTarget "Pods-StarWarsAPI" */ = { + 9898252794B21AF5F18F17B2C932E6AF /* Build configuration list for PBXNativeTarget "Pods-ApolloTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 6120DBA9F24C423B3AE6784EBD689696 /* Debug */, - 0E206AE35F16BDDB98DDB6D6C378F22C /* Release */, + 71E51F2CAE81759CF7FE4B052BF17D18 /* Debug */, + 34136DCAA08D39CFEB43D3BAD2155601 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - AB17C4CAD175CDAFC59BF191C4007542 /* Build configuration list for PBXNativeTarget "Pods-ApolloTests" */ = { + A27E3654494474C12D100B961BBFAA7D /* Build configuration list for PBXNativeTarget "Pods-StarWarsAPI" */ = { isa = XCConfigurationList; buildConfigurations = ( - 744C7D932D697FAE9CBC1E2418B8438B /* Debug */, - E50FEF70900FE0096F72284FC683D4A3 /* Release */, + 50122EDA2FE520893A88613D785EFA46 /* Debug */, + 14A701696AB64646C10DAB0A691FD4B7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1442,6 +1520,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + B57D88FCAE5B541F13D51FC993902ECA /* Build configuration list for PBXNativeTarget "Pods-ApolloPerformanceTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 87263DFDFB0D861CCF5C75BB6BFB2308 /* Debug */, + 3CC4C36F5289303C10A5C17CB8A89697 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; C79EB8FDA380D31052FF2C49D1D80CD7 /* Build configuration list for PBXNativeTarget "Pods-ApolloExample" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.markdown index 102af75385..7d16a9fef3 100644 --- a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.markdown +++ b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.markdown @@ -1,3 +1,53 @@ # Acknowledgements This application makes use of the following third party libraries: + +## Apollo + +The MIT License (MIT) + +Copyright (c) 2016 Meteor Development Group, Inc. + +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. + + +## SQLite.swift + +(The MIT License) + +Copyright (c) 2014-2015 Stephen Celis () + +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. + Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.plist index 7acbad1eab..1ffa30b22d 100644 --- a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.plist +++ b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.plist @@ -12,6 +12,68 @@ Type PSGroupSpecifier + + FooterText + The MIT License (MIT) + +Copyright (c) 2016 Meteor Development Group, Inc. + +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. + + License + MIT + Title + Apollo + Type + PSGroupSpecifier + + + FooterText + (The MIT License) + +Copyright (c) 2014-2015 Stephen Celis (<stephen@stephencelis.com>) + +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. + + License + MIT + Title + SQLite.swift + Type + PSGroupSpecifier + FooterText Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-frameworks.sh b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-frameworks.sh index 0f29f13c23..bf3790a5fb 100755 --- a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-frameworks.sh +++ b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-frameworks.sh @@ -87,6 +87,15 @@ strip_invalid_archs() { fi } + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "$BUILT_PRODUCTS_DIR/Apollo/Apollo.framework" + install_framework "$BUILT_PRODUCTS_DIR/SQLite.swift/SQLite.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "$BUILT_PRODUCTS_DIR/Apollo/Apollo.framework" + install_framework "$BUILT_PRODUCTS_DIR/SQLite.swift/SQLite.framework" +fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then wait fi diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.debug.xcconfig index 4a625a44ec..236fc5d6bb 100644 --- a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.debug.xcconfig +++ b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.debug.xcconfig @@ -1,7 +1,10 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.release.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.release.xcconfig index 4a625a44ec..236fc5d6bb 100644 --- a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.release.xcconfig +++ b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.release.xcconfig @@ -1,7 +1,10 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.markdown index 102af75385..7d16a9fef3 100644 --- a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.markdown +++ b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.markdown @@ -1,3 +1,53 @@ # Acknowledgements This application makes use of the following third party libraries: + +## Apollo + +The MIT License (MIT) + +Copyright (c) 2016 Meteor Development Group, Inc. + +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. + + +## SQLite.swift + +(The MIT License) + +Copyright (c) 2014-2015 Stephen Celis () + +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. + Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.plist index 7acbad1eab..1ffa30b22d 100644 --- a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.plist +++ b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.plist @@ -12,6 +12,68 @@ Type PSGroupSpecifier + + FooterText + The MIT License (MIT) + +Copyright (c) 2016 Meteor Development Group, Inc. + +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. + + License + MIT + Title + Apollo + Type + PSGroupSpecifier + + + FooterText + (The MIT License) + +Copyright (c) 2014-2015 Stephen Celis (<stephen@stephencelis.com>) + +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. + + License + MIT + Title + SQLite.swift + Type + PSGroupSpecifier + FooterText Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-frameworks.sh b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-frameworks.sh index 0f29f13c23..bf3790a5fb 100755 --- a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-frameworks.sh +++ b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-frameworks.sh @@ -87,6 +87,15 @@ strip_invalid_archs() { fi } + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "$BUILT_PRODUCTS_DIR/Apollo/Apollo.framework" + install_framework "$BUILT_PRODUCTS_DIR/SQLite.swift/SQLite.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "$BUILT_PRODUCTS_DIR/Apollo/Apollo.framework" + install_framework "$BUILT_PRODUCTS_DIR/SQLite.swift/SQLite.framework" +fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then wait fi diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.debug.xcconfig index 4a625a44ec..236fc5d6bb 100644 --- a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.debug.xcconfig +++ b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.debug.xcconfig @@ -1,7 +1,10 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.release.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.release.xcconfig index 4a625a44ec..236fc5d6bb 100644 --- a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.release.xcconfig +++ b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.release.xcconfig @@ -1,7 +1,10 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.markdown index 102af75385..7d16a9fef3 100644 --- a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.markdown +++ b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.markdown @@ -1,3 +1,53 @@ # Acknowledgements This application makes use of the following third party libraries: + +## Apollo + +The MIT License (MIT) + +Copyright (c) 2016 Meteor Development Group, Inc. + +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. + + +## SQLite.swift + +(The MIT License) + +Copyright (c) 2014-2015 Stephen Celis () + +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. + Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.plist index 7acbad1eab..1ffa30b22d 100644 --- a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.plist +++ b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.plist @@ -12,6 +12,68 @@ Type PSGroupSpecifier + + FooterText + The MIT License (MIT) + +Copyright (c) 2016 Meteor Development Group, Inc. + +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. + + License + MIT + Title + Apollo + Type + PSGroupSpecifier + + + FooterText + (The MIT License) + +Copyright (c) 2014-2015 Stephen Celis (<stephen@stephencelis.com>) + +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. + + License + MIT + Title + SQLite.swift + Type + PSGroupSpecifier + FooterText Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.debug.xcconfig b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.debug.xcconfig index 979a296ed8..7913b37597 100644 --- a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.debug.xcconfig +++ b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.debug.xcconfig @@ -2,6 +2,8 @@ FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$P GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.release.xcconfig b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.release.xcconfig index 979a296ed8..7913b37597 100644 --- a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.release.xcconfig +++ b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.release.xcconfig @@ -2,6 +2,8 @@ FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$P GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT}/Pods From d4349f5757d76b5d2080fe9b02f5ff6681227ba0 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Wed, 5 Apr 2017 12:03:11 -0700 Subject: [PATCH 06/76] Crude implementation of SqliteNormalizedCache --- .../ApolloExample.xcodeproj/project.pbxproj | 4 + .../SqliteNormalizedCacheTests.swift | 6 ++ Sources/ApolloStore.swift | 5 +- Sources/RecordSet.swift | 4 + Sources/SqliteNormalizedCache.swift | 99 ++++++++++++++++++- 5 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 Example/ApolloTests/SqliteNormalizedCacheTests.swift diff --git a/Example/ApolloExample.xcodeproj/project.pbxproj b/Example/ApolloExample.xcodeproj/project.pbxproj index 1d4ff06dd5..562c7a5666 100644 --- a/Example/ApolloExample.xcodeproj/project.pbxproj +++ b/Example/ApolloExample.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 18CAED8E9CA518A8387C31B5 /* Pods_ApolloTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 81EA39E0FF49825755B1B12F /* Pods_ApolloTests.framework */; }; 5454C0881E944FD400661138 /* StarWarsAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 5454C0861E944FD400661138 /* StarWarsAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 54B59A561E94828100EB1B2B /* SqliteNormalizedCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54B59A551E94828100EB1B2B /* SqliteNormalizedCacheTests.swift */; }; 54E966D41E9447F7002884AD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E966D31E9447F7002884AD /* AppDelegate.swift */; }; 54E966D61E9447F7002884AD /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E966D51E9447F7002884AD /* ViewController.swift */; }; 54E966D91E9447F7002884AD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 54E966D71E9447F7002884AD /* Main.storyboard */; }; @@ -98,6 +99,7 @@ 5454C0841E944FD400661138 /* StarWarsAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = StarWarsAPI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5454C0861E944FD400661138 /* StarWarsAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StarWarsAPI.h; sourceTree = ""; }; 5454C0871E944FD400661138 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 54B59A551E94828100EB1B2B /* SqliteNormalizedCacheTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCacheTests.swift; sourceTree = ""; }; 54E966D01E9447F7002884AD /* ApolloExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ApolloExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 54E966D31E9447F7002884AD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 54E966D51E9447F7002884AD /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -284,6 +286,7 @@ 54FFC82C1E9478A300C72D16 /* NormalizeQueryResults.swift */, 54FFC82D1E9478A300C72D16 /* ParseQueryResponseTests.swift */, 54FFC82E1E9478A300C72D16 /* PromiseTests.swift */, + 54B59A551E94828100EB1B2B /* SqliteNormalizedCacheTests.swift */, 54FFC82F1E9478A300C72D16 /* StarWarsServerCachingRoundtripTests.swift */, 54FFC8301E9478A300C72D16 /* StarWarsServerTests.swift */, 54FFC8311E9478A300C72D16 /* StoreTransactionTests.swift */, @@ -781,6 +784,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 54B59A561E94828100EB1B2B /* SqliteNormalizedCacheTests.swift in Sources */, 54FFC8361E9478A300C72D16 /* DataLoaderTests.swift in Sources */, 54FFC8381E9478A300C72D16 /* GraphQLExecutorFieldValueTests.swift in Sources */, 54FFC83D1E9478A300C72D16 /* ParseQueryResponseTests.swift in Sources */, diff --git a/Example/ApolloTests/SqliteNormalizedCacheTests.swift b/Example/ApolloTests/SqliteNormalizedCacheTests.swift new file mode 100644 index 0000000000..a0fa200b64 --- /dev/null +++ b/Example/ApolloTests/SqliteNormalizedCacheTests.swift @@ -0,0 +1,6 @@ +import XCTest +@testable import Apollo +import StarWarsAPI + +class SqliteNormalizedCacheTests: XCTestCase { +} diff --git a/Sources/ApolloStore.swift b/Sources/ApolloStore.swift index a0de960779..1a4ae363b7 100644 --- a/Sources/ApolloStore.swift +++ b/Sources/ApolloStore.swift @@ -36,7 +36,10 @@ public final class ApolloStore { } convenience init(records: RecordSet = RecordSet()) { - self.init(cache: InMemoryNormalizedCache(records: records)) +// self.init(cache: InMemoryNormalizedCache(records: records)) + let cache = try! SqliteNormalizedCache() + cache.merge(records: records) + self.init(cache: cache) } func publish(records: RecordSet, context: UnsafeMutableRawPointer? = nil) -> Promise { diff --git a/Sources/RecordSet.swift b/Sources/RecordSet.swift index 1acb4636ac..d7545ff6e7 100644 --- a/Sources/RecordSet.swift +++ b/Sources/RecordSet.swift @@ -23,6 +23,10 @@ public struct RecordSet { public var isEmpty: Bool { return storage.isEmpty } + + public var keys: [CacheKey] { + return Array(storage.keys) + } @discardableResult public mutating func merge(records: RecordSet) -> Set { var changedKeys: Set = Set() diff --git a/Sources/SqliteNormalizedCache.swift b/Sources/SqliteNormalizedCache.swift index af0fb0d31e..c1e1246db6 100644 --- a/Sources/SqliteNormalizedCache.swift +++ b/Sources/SqliteNormalizedCache.swift @@ -1,13 +1,106 @@ +import SQLite + +enum SqliteNormalizedCacheError: Error { + case invalidRecordEncoding(record: String) + case invalidRecordShape(record: String) +} + final class SqliteNormalizedCache: NormalizedCache { - init(fileURL: URL) { +// init(fileURI: URL) throws { +// db = try Connection(.uri(fileURI.absoluteString), readonly: false) +// try createTableIfNeeded() +// } + + // TODO: we shouldn't have this in-memory initializer here - just for testing + init() throws { + db = try Connection(readonly: false) + try createTableIfNeeded() } public func merge(records: RecordSet) -> Promise> { - return Promise(fulfilled: Set()) + return Promise> { fulfill, reject in + do { + var recordSet = RecordSet(records: try select(withKeys: records.keys)) + let changedKeys = recordSet.merge(records: records) + // Shouldn't changedKeys contain full cache key (rather than just one level deep from QUERY_ROOT)? + // (e.g. it has "QUERY_ROOT.hero" but it wouldn't have anything nested any further than that) + // Also, shouldn't it rely on the passed-in cache key function rather than response shape path with periods? + for changedKey in changedKeys { + if let key = changedKey.components(separatedBy: ".").first, + let recordFields = recordSet[key]?.fields + { + print("\tupdating record: \(recordFields)...") + let recordData = try JSONSerializationFormat.serialize(value: recordFields) + let recordString = String(data: recordData, encoding: .utf8)! + let rowid = try db.run(self.records.insert(or: .replace, self.key <- key, self.record <- recordString)) + print("\t\ttrowid: \(rowid)") + } + } + print("updated records: \(changedKeys)") + fulfill(Set(changedKeys)) + } + catch { + print("failed updating records: \(error.localizedDescription)") + reject(error) + } + } } public func loadRecords(forKeys keys: [CacheKey]) -> Promise<[Record?]> { - return Promise(fulfilled: []) + return Promise<[Record?]> { fulfill, reject in + print("\n\nloading records: \(keys)...") // TODO: remove + do { + // TODO: one line + let records = try select(withKeys: keys) + fulfill(records) + print("finished loading records") + } + catch { + print("failed loading records: \(error.localizedDescription)") + reject(error) + } + } + } + + private let db: Connection + private let records = Table("records") + private let id = Expression("_id") + private let key = Expression("key") + private let record = Expression("record") + + private func createTableIfNeeded() throws { + try db.run(records.create(ifNotExists: true) { table in + table.column(id, primaryKey: .autoincrement) + table.column(key, unique: true) + table.column(record) + }) + try db.run(records.createIndex([key], unique: true, ifNotExists: true)) + } + + private func select(withKeys keys: [CacheKey]) throws -> [Record] { + // TODO: revert +// let query = records.filter(keys.contains(key)) +// return try db.prepare(query).map { try parse(row: $0) } + let query = records + for row in try db.prepare(records) { + print("row: \(row)") + } + return [] + } + + private func parse(row: Row) throws -> Record { + let record = row[self.record] + + // TODO: why don't we have to encode *into* utf8 when writing to db? + guard let recordData = record.data(using: .utf8) else { + throw SqliteNormalizedCacheError.invalidRecordEncoding(record: record) + } + + guard let recordJSON = (try JSONSerializationFormat.deserialize(data: recordData)) as? JSONObject else { + throw SqliteNormalizedCacheError.invalidRecordShape(record: record) + } + + return Record(key: row[key], recordJSON) } } From e34dd89bc24e7dbce0f0ceb9da0e104d50e6a3af Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Wed, 5 Apr 2017 18:16:55 -0700 Subject: [PATCH 07/76] More progress on crude implementation of SqliteNormalizedCache --- Example/ApolloTests/FetchQueryTests.swift | 4 +- Sources/InMemoryNormalizedCache.swift | 4 +- Sources/SqliteNormalizedCache.swift | 94 +++++++++++++++++------ 3 files changed, 77 insertions(+), 25 deletions(-) diff --git a/Example/ApolloTests/FetchQueryTests.swift b/Example/ApolloTests/FetchQueryTests.swift index 2832ee0888..861f2b9fbc 100644 --- a/Example/ApolloTests/FetchQueryTests.swift +++ b/Example/ApolloTests/FetchQueryTests.swift @@ -42,8 +42,8 @@ class FetchQueryTests: XCTestCase { let query = HeroNameQuery() let store = ApolloStore(records: [ - "QUERY_ROOT": ["hero": Reference(key: "hero")], - "hero": [ + "QUERY_ROOT": ["hero": Reference(key: "QUERY_ROOT.hero")], + "QUERY_ROOT.hero": [ "name": "R2-D2", "__typename": "Droid", ] diff --git a/Sources/InMemoryNormalizedCache.swift b/Sources/InMemoryNormalizedCache.swift index 28cf10a907..b92568bbc9 100644 --- a/Sources/InMemoryNormalizedCache.swift +++ b/Sources/InMemoryNormalizedCache.swift @@ -11,6 +11,8 @@ final class InMemoryNormalizedCache: NormalizedCache { } func merge(records: RecordSet) -> Promise> { - return Promise(fulfilled: self.records.merge(records: records)) + // TODO: revert + let changedKeys = self.records.merge(records: records) + return Promise(fulfilled: changedKeys) } } diff --git a/Sources/SqliteNormalizedCache.swift b/Sources/SqliteNormalizedCache.swift index c1e1246db6..a97bbc119a 100644 --- a/Sources/SqliteNormalizedCache.swift +++ b/Sources/SqliteNormalizedCache.swift @@ -22,23 +22,24 @@ final class SqliteNormalizedCache: NormalizedCache { return Promise> { fulfill, reject in do { var recordSet = RecordSet(records: try select(withKeys: records.keys)) - let changedKeys = recordSet.merge(records: records) + let changedFieldKeys = recordSet.merge(records: records) // Shouldn't changedKeys contain full cache key (rather than just one level deep from QUERY_ROOT)? // (e.g. it has "QUERY_ROOT.hero" but it wouldn't have anything nested any further than that) // Also, shouldn't it rely on the passed-in cache key function rather than response shape path with periods? - for changedKey in changedKeys { - if let key = changedKey.components(separatedBy: ".").first, - let recordFields = recordSet[key]?.fields + // TODO: first map and unique first components, to avoid duplicate work + for changedFieldKey in changedFieldKeys { + if let recordKey = recordCacheKey(forFieldCacheKey: changedFieldKey), + let recordFields = recordSet[recordKey]?.fields { - print("\tupdating record: \(recordFields)...") - let recordData = try JSONSerializationFormat.serialize(value: recordFields) - let recordString = String(data: recordData, encoding: .utf8)! - let rowid = try db.run(self.records.insert(or: .replace, self.key <- key, self.record <- recordString)) - print("\t\ttrowid: \(rowid)") + let recordData = try SqliteJSONSerializationFormat.serialize(value: recordFields) + let recordString = String(data: recordData, encoding: .utf8)! // TODO: remove ! + print("\tupdating record: \(recordKey): \(recordString)...") + let rowid = try db.run(self.records.insert(or: .replace, self.key <- recordKey, self.record <- recordString)) + print("\t\trowid: \(rowid)") } } - print("updated records: \(changedKeys)") - fulfill(Set(changedKeys)) + print("updated records: \(changedFieldKeys)") + fulfill(Set(changedFieldKeys)) } catch { print("failed updating records: \(error.localizedDescription)") @@ -51,7 +52,7 @@ final class SqliteNormalizedCache: NormalizedCache { return Promise<[Record?]> { fulfill, reject in print("\n\nloading records: \(keys)...") // TODO: remove do { - // TODO: one line + // TODO: do on one line let records = try select(withKeys: keys) fulfill(records) print("finished loading records") @@ -69,6 +70,15 @@ final class SqliteNormalizedCache: NormalizedCache { private let key = Expression("key") private let record = Expression("record") + private func recordCacheKey(forFieldCacheKey fieldCacheKey: CacheKey) -> CacheKey? { + var components = fieldCacheKey.components(separatedBy: ".") + components.removeLast() + guard components.count > 0 else { + return nil + } + return components.joined(separator: ".") + } + private func createTableIfNeeded() throws { try db.run(records.create(ifNotExists: true) { table in table.column(id, primaryKey: .autoincrement) @@ -79,28 +89,68 @@ final class SqliteNormalizedCache: NormalizedCache { } private func select(withKeys keys: [CacheKey]) throws -> [Record] { - // TODO: revert -// let query = records.filter(keys.contains(key)) -// return try db.prepare(query).map { try parse(row: $0) } - let query = records - for row in try db.prepare(records) { - print("row: \(row)") - } - return [] + let query = records.filter(keys.contains(key)) + return try db.prepare(query).map { try parse(row: $0) } } private func parse(row: Row) throws -> Record { let record = row[self.record] - // TODO: why don't we have to encode *into* utf8 when writing to db? guard let recordData = record.data(using: .utf8) else { throw SqliteNormalizedCacheError.invalidRecordEncoding(record: record) } - guard let recordJSON = (try JSONSerializationFormat.deserialize(data: recordData)) as? JSONObject else { + guard let recordJSON = (try SqliteJSONSerializationFormat.deserialize(data: recordData)) as? JSONObject else { throw SqliteNormalizedCacheError.invalidRecordShape(record: record) } return Record(key: row[key], recordJSON) } } + +final class SqliteJSONSerializationFormat { + class func serialize(value: JSONEncodable) throws -> Data { + return try JSONSerializationFormat.serialize(value: value) + } + + class func deserialize(data: Data) throws -> JSONValue { + let json = try JSONSerializationFormat.deserialize(data: data) + return deserializeReferences(json: json) + } + + private class func deserializeReferences(json: JSONValue) -> JSONValue { + switch json { + case var dictionary as NSDictionary: + var newDictionary = NSMutableDictionary() + for (key, value) in dictionary { + newDictionary[key] = deserializeReferences(json: value) + } + return newDictionary + case var array as NSArray: + return array.map { deserializeReferences(json: $0) } + case var string as String: + if let prefixRange = string.range(of: "ApolloCacheReference:") { + return Reference(key: string.substring(from: prefixRange.upperBound)) + } + return string + default: + return json + } + } +} + +// TODO: ask about doing this +extension Reference: JSONEncodable { + public var jsonValue: JSONValue { + return "ApolloCacheReference:\(self.key)" + } +} + +//extension Reference: JSONDecodable { +// public init(jsonValue value: JSONValue) throws { +// guard let key = value as? CacheKey else { +// throw JSONDecodingError.couldNotConvert(value: value, to: Reference.self) +// } +// self.init(key: key) +// } +//} From 9f8b5fb701f9081dc9e6efdc9358c7bcbf1762be Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Fri, 7 Apr 2017 10:53:30 -0700 Subject: [PATCH 08/76] Temporary workaround for JSON type conversion bug --- Sources/JSONStandardTypeConversions.swift | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Sources/JSONStandardTypeConversions.swift b/Sources/JSONStandardTypeConversions.swift index 9b3b577fa6..42b1ac4e91 100644 --- a/Sources/JSONStandardTypeConversions.swift +++ b/Sources/JSONStandardTypeConversions.swift @@ -121,7 +121,16 @@ extension Dictionary: JSONEncodable { if !isNil(value) { jsonObject[key] = value.jsonValue } - } else { + } + // TODO: temporary + else if case let (key as String, value as NSString) = (key, value) { + if !isNil(value) { + jsonObject[key] = (value as String).jsonValue + } + } + else { + print("key: \(type(of: key))") + print("value: \(type(of: value))") fatalError("Dictionary is only JSONEncodable if Value is (and if Key is String)") } } From 135ac3fd7930c8a2e471570fd48d97564c283c2c Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Fri, 7 Apr 2017 11:22:23 -0700 Subject: [PATCH 09/76] Replace temporary workaround with better fix --- Sources/JSONStandardTypeConversions.swift | 6 ------ Sources/SqliteNormalizedCache.swift | 8 ++++---- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Sources/JSONStandardTypeConversions.swift b/Sources/JSONStandardTypeConversions.swift index 42b1ac4e91..5caf1243d6 100644 --- a/Sources/JSONStandardTypeConversions.swift +++ b/Sources/JSONStandardTypeConversions.swift @@ -121,12 +121,6 @@ extension Dictionary: JSONEncodable { if !isNil(value) { jsonObject[key] = value.jsonValue } - } - // TODO: temporary - else if case let (key as String, value as NSString) = (key, value) { - if !isNil(value) { - jsonObject[key] = (value as String).jsonValue - } } else { print("key: \(type(of: key))") diff --git a/Sources/SqliteNormalizedCache.swift b/Sources/SqliteNormalizedCache.swift index a97bbc119a..500f20dbff 100644 --- a/Sources/SqliteNormalizedCache.swift +++ b/Sources/SqliteNormalizedCache.swift @@ -120,15 +120,15 @@ final class SqliteJSONSerializationFormat { private class func deserializeReferences(json: JSONValue) -> JSONValue { switch json { - case var dictionary as NSDictionary: - var newDictionary = NSMutableDictionary() + case let dictionary as JSONObject: + var newDictionary = JSONObject() for (key, value) in dictionary { newDictionary[key] = deserializeReferences(json: value) } return newDictionary - case var array as NSArray: + case let array as [JSONValue]: return array.map { deserializeReferences(json: $0) } - case var string as String: + case let string as String: if let prefixRange = string.range(of: "ApolloCacheReference:") { return Reference(key: string.substring(from: prefixRange.upperBound)) } From 76cdf911735bc5d961e9a725b0ece9e299fcf925 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Fri, 7 Apr 2017 13:51:39 -0700 Subject: [PATCH 10/76] Remove in-memory initializer from SqliteNormalizedCache --- Sources/SqliteNormalizedCache.swift | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Sources/SqliteNormalizedCache.swift b/Sources/SqliteNormalizedCache.swift index 500f20dbff..e761b6e3a9 100644 --- a/Sources/SqliteNormalizedCache.swift +++ b/Sources/SqliteNormalizedCache.swift @@ -7,14 +7,8 @@ enum SqliteNormalizedCacheError: Error { final class SqliteNormalizedCache: NormalizedCache { -// init(fileURI: URL) throws { -// db = try Connection(.uri(fileURI.absoluteString), readonly: false) -// try createTableIfNeeded() -// } - - // TODO: we shouldn't have this in-memory initializer here - just for testing - init() throws { - db = try Connection(readonly: false) + init(fileURL: URL) throws { + db = try Connection(.uri(fileURL.absoluteString), readonly: false) try createTableIfNeeded() } From 9680d222630fef4367913b404ace3d4af19a405b Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Fri, 7 Apr 2017 13:53:39 -0700 Subject: [PATCH 11/76] Avoid duplicating overwriting updated records in sqlite normalized cache --- Sources/SqliteNormalizedCache.swift | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/Sources/SqliteNormalizedCache.swift b/Sources/SqliteNormalizedCache.swift index e761b6e3a9..819374af3c 100644 --- a/Sources/SqliteNormalizedCache.swift +++ b/Sources/SqliteNormalizedCache.swift @@ -17,14 +17,9 @@ final class SqliteNormalizedCache: NormalizedCache { do { var recordSet = RecordSet(records: try select(withKeys: records.keys)) let changedFieldKeys = recordSet.merge(records: records) - // Shouldn't changedKeys contain full cache key (rather than just one level deep from QUERY_ROOT)? - // (e.g. it has "QUERY_ROOT.hero" but it wouldn't have anything nested any further than that) - // Also, shouldn't it rely on the passed-in cache key function rather than response shape path with periods? - // TODO: first map and unique first components, to avoid duplicate work - for changedFieldKey in changedFieldKeys { - if let recordKey = recordCacheKey(forFieldCacheKey: changedFieldKey), - let recordFields = recordSet[recordKey]?.fields - { + let changedRecordKeys = changedFieldKeys.map { recordCacheKey(forFieldCacheKey: $0) } + for recordKey in Set(changedRecordKeys) { + if let recordFields = recordSet[recordKey]?.fields { let recordData = try SqliteJSONSerializationFormat.serialize(value: recordFields) let recordString = String(data: recordData, encoding: .utf8)! // TODO: remove ! print("\tupdating record: \(recordKey): \(recordString)...") @@ -64,11 +59,10 @@ final class SqliteNormalizedCache: NormalizedCache { private let key = Expression("key") private let record = Expression("record") - private func recordCacheKey(forFieldCacheKey fieldCacheKey: CacheKey) -> CacheKey? { + private func recordCacheKey(forFieldCacheKey fieldCacheKey: CacheKey) -> CacheKey { var components = fieldCacheKey.components(separatedBy: ".") - components.removeLast() - guard components.count > 0 else { - return nil + if components.count > 1 { + components.removeLast() } return components.joined(separator: ".") } @@ -123,7 +117,7 @@ final class SqliteJSONSerializationFormat { case let array as [JSONValue]: return array.map { deserializeReferences(json: $0) } case let string as String: - if let prefixRange = string.range(of: "ApolloCacheReference:") { + if let prefixRange = string.range(of: "Reference:") { return Reference(key: string.substring(from: prefixRange.upperBound)) } return string @@ -136,7 +130,7 @@ final class SqliteJSONSerializationFormat { // TODO: ask about doing this extension Reference: JSONEncodable { public var jsonValue: JSONValue { - return "ApolloCacheReference:\(self.key)" + return "Reference:\(self.key)" } } From 8cba5f5d9ab4e4e564f4d9bb74dfe1f0f96883fd Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Fri, 7 Apr 2017 14:10:22 -0700 Subject: [PATCH 12/76] Better organize code in SqliteNormalizedCache merge method --- Sources/InMemoryNormalizedCache.swift | 4 +-- Sources/SqliteNormalizedCache.swift | 52 +++++++++++---------------- 2 files changed, 21 insertions(+), 35 deletions(-) diff --git a/Sources/InMemoryNormalizedCache.swift b/Sources/InMemoryNormalizedCache.swift index b92568bbc9..28cf10a907 100644 --- a/Sources/InMemoryNormalizedCache.swift +++ b/Sources/InMemoryNormalizedCache.swift @@ -11,8 +11,6 @@ final class InMemoryNormalizedCache: NormalizedCache { } func merge(records: RecordSet) -> Promise> { - // TODO: revert - let changedKeys = self.records.merge(records: records) - return Promise(fulfilled: changedKeys) + return Promise(fulfilled: self.records.merge(records: records)) } } diff --git a/Sources/SqliteNormalizedCache.swift b/Sources/SqliteNormalizedCache.swift index 819374af3c..a552138d21 100644 --- a/Sources/SqliteNormalizedCache.swift +++ b/Sources/SqliteNormalizedCache.swift @@ -15,23 +15,9 @@ final class SqliteNormalizedCache: NormalizedCache { public func merge(records: RecordSet) -> Promise> { return Promise> { fulfill, reject in do { - var recordSet = RecordSet(records: try select(withKeys: records.keys)) - let changedFieldKeys = recordSet.merge(records: records) - let changedRecordKeys = changedFieldKeys.map { recordCacheKey(forFieldCacheKey: $0) } - for recordKey in Set(changedRecordKeys) { - if let recordFields = recordSet[recordKey]?.fields { - let recordData = try SqliteJSONSerializationFormat.serialize(value: recordFields) - let recordString = String(data: recordData, encoding: .utf8)! // TODO: remove ! - print("\tupdating record: \(recordKey): \(recordString)...") - let rowid = try db.run(self.records.insert(or: .replace, self.key <- recordKey, self.record <- recordString)) - print("\t\trowid: \(rowid)") - } - } - print("updated records: \(changedFieldKeys)") - fulfill(Set(changedFieldKeys)) + fulfill(try mergeRecords(records: records)) } catch { - print("failed updating records: \(error.localizedDescription)") reject(error) } } @@ -39,15 +25,10 @@ final class SqliteNormalizedCache: NormalizedCache { public func loadRecords(forKeys keys: [CacheKey]) -> Promise<[Record?]> { return Promise<[Record?]> { fulfill, reject in - print("\n\nloading records: \(keys)...") // TODO: remove do { - // TODO: do on one line - let records = try select(withKeys: keys) - fulfill(records) - print("finished loading records") + fulfill(try selectRecords(forKeys: keys)) } catch { - print("failed loading records: \(error.localizedDescription)") reject(error) } } @@ -76,7 +57,24 @@ final class SqliteNormalizedCache: NormalizedCache { try db.run(records.createIndex([key], unique: true, ifNotExists: true)) } - private func select(withKeys keys: [CacheKey]) throws -> [Record] { + private func mergeRecords(records: RecordSet) throws -> Set { + var recordSet = RecordSet(records: try selectRecords(forKeys: records.keys)) + let changedFieldKeys = recordSet.merge(records: records) + let changedRecordKeys = changedFieldKeys.map { recordCacheKey(forFieldCacheKey: $0) } + for recordKey in Set(changedRecordKeys) { + if let recordFields = recordSet[recordKey]?.fields { + let recordData = try SqliteJSONSerializationFormat.serialize(value: recordFields) + guard let recordString = String(data: recordData, encoding: .utf8) else { + assertionFailure() // Serialization should yield UTF-8 data + continue + } + try db.run(self.records.insert(or: .replace, self.key <- recordKey, self.record <- recordString)) + } + } + return Set(changedFieldKeys) + } + + private func selectRecords(forKeys keys: [CacheKey]) throws -> [Record] { let query = records.filter(keys.contains(key)) return try db.prepare(query).map { try parse(row: $0) } } @@ -127,18 +125,8 @@ final class SqliteJSONSerializationFormat { } } -// TODO: ask about doing this extension Reference: JSONEncodable { public var jsonValue: JSONValue { return "Reference:\(self.key)" } } - -//extension Reference: JSONDecodable { -// public init(jsonValue value: JSONValue) throws { -// guard let key = value as? CacheKey else { -// throw JSONDecodingError.couldNotConvert(value: value, to: Reference.self) -// } -// self.init(key: key) -// } -//} From 829157d3ef3699e1be7e119cf69f4b5d1a3edefd Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 10 Apr 2017 10:46:02 -0700 Subject: [PATCH 13/76] Fix unit tests by setting NSAppTransportSecurity to enable arbitrary loads --- Example/ApolloExample/Info.plist | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Example/ApolloExample/Info.plist b/Example/ApolloExample/Info.plist index d052473868..627999ff2e 100644 --- a/Example/ApolloExample/Info.plist +++ b/Example/ApolloExample/Info.plist @@ -20,6 +20,11 @@ 1 LSRequiresIPhoneOS + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + UILaunchStoryboardName LaunchScreen UIMainStoryboardFile From deeab1635b4508a1d7f7d68051b7372baf624ef7 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 10 Apr 2017 11:41:43 -0700 Subject: [PATCH 14/76] SqliteNormalizedCache fulfills loadRecords(forKeys:) promise with [nil] instead of []. This is an odd behavior, but is what is currently required by ApolloStore. This should probably be revisited. --- Sources/NormalizedCache.swift | 1 + Sources/SqliteNormalizedCache.swift | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Sources/NormalizedCache.swift b/Sources/NormalizedCache.swift index 3497780c9f..28ddc641e9 100644 --- a/Sources/NormalizedCache.swift +++ b/Sources/NormalizedCache.swift @@ -1,4 +1,5 @@ public protocol NormalizedCache { + // When no records are found for the given keys, this should fulfill with [nil] func loadRecords(forKeys keys: [CacheKey]) -> Promise<[Record?]> func merge(records: RecordSet) -> Promise> } diff --git a/Sources/SqliteNormalizedCache.swift b/Sources/SqliteNormalizedCache.swift index a552138d21..b99b09a81b 100644 --- a/Sources/SqliteNormalizedCache.swift +++ b/Sources/SqliteNormalizedCache.swift @@ -26,7 +26,8 @@ final class SqliteNormalizedCache: NormalizedCache { public func loadRecords(forKeys keys: [CacheKey]) -> Promise<[Record?]> { return Promise<[Record?]> { fulfill, reject in do { - fulfill(try selectRecords(forKeys: keys)) + let records = try selectRecords(forKeys: keys) + fulfill(records.count == 0 ? [nil] : records) } catch { reject(error) From 6f5192bb501059071b373d567448f573896d0466 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 10 Apr 2017 14:24:12 -0700 Subject: [PATCH 15/76] =?UTF-8?q?Store=20record=20references=20in=20SQLite?= =?UTF-8?q?=20as=20JSON=20objects=20with=20a=20single=20key=20(=E2=80=9Cre?= =?UTF-8?q?ference=E2=80=9D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/SqliteNormalizedCache.swift | 76 +++++++++++++++++------------ 1 file changed, 45 insertions(+), 31 deletions(-) diff --git a/Sources/SqliteNormalizedCache.swift b/Sources/SqliteNormalizedCache.swift index b99b09a81b..eacd678e58 100644 --- a/Sources/SqliteNormalizedCache.swift +++ b/Sources/SqliteNormalizedCache.swift @@ -2,7 +2,8 @@ import SQLite enum SqliteNormalizedCacheError: Error { case invalidRecordEncoding(record: String) - case invalidRecordShape(record: String) + case invalidRecordShape(object: Any) + case invalidRecordValue(value: Any) } final class SqliteNormalizedCache: NormalizedCache { @@ -64,9 +65,9 @@ final class SqliteNormalizedCache: NormalizedCache { let changedRecordKeys = changedFieldKeys.map { recordCacheKey(forFieldCacheKey: $0) } for recordKey in Set(changedRecordKeys) { if let recordFields = recordSet[recordKey]?.fields { - let recordData = try SqliteJSONSerializationFormat.serialize(value: recordFields) + let recordData = try SqliteSerialization.serialize(fields: recordFields) guard let recordString = String(data: recordData, encoding: .utf8) else { - assertionFailure() // Serialization should yield UTF-8 data + assertionFailure("Serialization should yield UTF-8 data") continue } try db.run(self.records.insert(or: .replace, self.key <- recordKey, self.record <- recordString)) @@ -87,47 +88,60 @@ final class SqliteNormalizedCache: NormalizedCache { throw SqliteNormalizedCacheError.invalidRecordEncoding(record: record) } - guard let recordJSON = (try SqliteJSONSerializationFormat.deserialize(data: recordData)) as? JSONObject else { - throw SqliteNormalizedCacheError.invalidRecordShape(record: record) - } - + let recordJSON = try SqliteSerialization.deserialize(data: recordData) return Record(key: row[key], recordJSON) } } -final class SqliteJSONSerializationFormat { - class func serialize(value: JSONEncodable) throws -> Data { - return try JSONSerializationFormat.serialize(value: value) +private let serializedReferenceKey = "reference" + +final class SqliteSerialization { + static func serialize(fields: JSONObject) throws -> Data { + var objectToSerialize = JSONObject() + for (key, value) in fields { + objectToSerialize[key] = try serialize(value: value) + } + return try JSONSerializationFormat.serialize(value: objectToSerialize) } - class func deserialize(data: Data) throws -> JSONValue { - let json = try JSONSerializationFormat.deserialize(data: data) - return deserializeReferences(json: json) + static func deserialize(data: Data) throws -> JSONObject { + let object = try JSONSerializationFormat.deserialize(data: data) + guard let jsonObject = object as? JSONObject else { + throw SqliteNormalizedCacheError.invalidRecordShape(object: object) + } + var deserializedObject = JSONObject() + for (key, value) in jsonObject { + deserializedObject[key] = try deserialize(valueJSON: value) + } + return deserializedObject } - private class func deserializeReferences(json: JSONValue) -> JSONValue { - switch json { + private static func deserialize(valueJSON: Any) throws -> Any { + switch valueJSON { case let dictionary as JSONObject: - var newDictionary = JSONObject() - for (key, value) in dictionary { - newDictionary[key] = deserializeReferences(json: value) - } - return newDictionary - case let array as [JSONValue]: - return array.map { deserializeReferences(json: $0) } - case let string as String: - if let prefixRange = string.range(of: "Reference:") { - return Reference(key: string.substring(from: prefixRange.upperBound)) + guard let reference = dictionary[serializedReferenceKey] as? String else { + throw SqliteNormalizedCacheError.invalidRecordValue(value: valueJSON) } - return string + return Reference(key: reference) + case let array as NSArray: + return try array.map { try deserialize(valueJSON: $0) } default: - return json + return valueJSON } } -} -extension Reference: JSONEncodable { - public var jsonValue: JSONValue { - return "Reference:\(self.key)" + private static func serialize(value: Any) throws -> Any { + switch value { + case let reference as Reference: + return [serializedReferenceKey: reference.key] + case let array as NSArray: + return try array.map { try serialize(value: $0) } + case let string as NSString: + return string as String + case let number as NSNumber: + return number.doubleValue + default: + return value + } } } From 43b2cb5978a3bdebfa7feb3c5d191b94e219c175 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 10 Apr 2017 15:20:40 -0700 Subject: [PATCH 16/76] Update FetchQueryTests to use both in-memory and sqlite caches --- Example/ApolloTests/FetchQueryTests.swift | 303 ++++++++++++---------- Example/ApolloTests/Utilities.swift | 17 ++ Sources/InMemoryNormalizedCache.swift | 2 +- 3 files changed, 186 insertions(+), 136 deletions(-) diff --git a/Example/ApolloTests/FetchQueryTests.swift b/Example/ApolloTests/FetchQueryTests.swift index 861f2b9fbc..eda1a0dbdc 100644 --- a/Example/ApolloTests/FetchQueryTests.swift +++ b/Example/ApolloTests/FetchQueryTests.swift @@ -5,174 +5,204 @@ import StarWarsAPI class FetchQueryTests: XCTestCase { func testFetchIgnoringCacheData() throws { let query = HeroNameQuery() - - let store = ApolloStore(records: [ + + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "hero")], "hero": [ "name": "R2-D2", "__typename": "Droid", ] - ]) - - let networkTransport = MockNetworkTransport(body: [ - "data": [ - "hero": [ - "name": "Luke Skywalker", - "__typename": "Human" - ] - ] - ]) - - let client = ApolloClient(networkTransport: networkTransport, store: store) - - let expectation = self.expectation(description: "Fetching query") - - client.fetch(query: query, cachePolicy: .fetchIgnoringCacheData) { (result, error) in - defer { expectation.fulfill() } - - guard let result = result else { XCTFail("No query result"); return } - - XCTAssertEqual(result.data?.hero?.name, "Luke Skywalker") + ] + + withEachCacheType { (cache) in + let expectation = self.expectation(description: "Fetching query") + + cache.merge(records: initialRecords).andThen({ _ in + let store = ApolloStore(cache: cache) + + let networkTransport = MockNetworkTransport(body: [ + "data": [ + "hero": [ + "name": "Luke Skywalker", + "__typename": "Human" + ] + ] + ]) + + let client = ApolloClient(networkTransport: networkTransport, store: store) + + client.fetch(query: query, cachePolicy: .fetchIgnoringCacheData) { (result, error) in + defer { expectation.fulfill() } + + guard let result = result else { XCTFail("No query result"); return } + + XCTAssertEqual(result.data?.hero?.name, "Luke Skywalker") + } + + self.waitForExpectations(timeout: 1, handler: nil) + }) } - - waitForExpectations(timeout: 1, handler: nil) } func testReturnCacheDataElseFetchWithCachedData() throws { let query = HeroNameQuery() - - let store = ApolloStore(records: [ + + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "QUERY_ROOT.hero")], "QUERY_ROOT.hero": [ "name": "R2-D2", "__typename": "Droid", ] - ]) - - let networkTransport = MockNetworkTransport(body: [ - "data": [ - "hero": [ - "name": "Luke Skywalker", - "__typename": "Human" - ] - ] - ]) - - let client = ApolloClient(networkTransport: networkTransport, store: store) - - let expectation = self.expectation(description: "Fetching query") - - client.fetch(query: query, cachePolicy: .returnCacheDataElseFetch) { (result, error) in - defer { expectation.fulfill() } - - guard let result = result else { XCTFail("No query result"); return } - - XCTAssertEqual(result.data?.hero?.name, "R2-D2") + ] + + withEachCacheType { (cache) in + let expectation = self.expectation(description: "Fetching query") + + cache.merge(records: initialRecords).andThen({ _ in + let store = ApolloStore(cache: cache) + + let networkTransport = MockNetworkTransport(body: [ + "data": [ + "hero": [ + "name": "Luke Skywalker", + "__typename": "Human" + ] + ] + ]) + + let client = ApolloClient(networkTransport: networkTransport, store: store) + + client.fetch(query: query, cachePolicy: .returnCacheDataElseFetch) { (result, error) in + defer { expectation.fulfill() } + + guard let result = result else { XCTFail("No query result"); return } + + XCTAssertEqual(result.data?.hero?.name, "R2-D2") + } + + self.waitForExpectations(timeout: 1, handler: nil) + }) } - - waitForExpectations(timeout: 1, handler: nil) } func testReturnCacheDataElseFetchWithMissingData() throws { let query = HeroNameQuery() - - let store = ApolloStore(records: [ + + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "hero")], "hero": [ "name": "R2-D2", ] - ]) - - let networkTransport = MockNetworkTransport(body: [ - "data": [ - "hero": [ - "name": "Luke Skywalker", - "__typename": "Human" - ] - ] - ]) - - let client = ApolloClient(networkTransport: networkTransport, store: store) - - let expectation = self.expectation(description: "Fetching query") - - client.fetch(query: query, cachePolicy: .returnCacheDataElseFetch) { (result, error) in - defer { expectation.fulfill() } - - guard let result = result else { XCTFail("No query result"); return } - - XCTAssertEqual(result.data?.hero?.name, "Luke Skywalker") + ] + + withEachCacheType { (cache) in + let expectation = self.expectation(description: "Fetching query") + + cache.merge(records: initialRecords).andThen({ _ in + let store = ApolloStore(cache: cache) + + let networkTransport = MockNetworkTransport(body: [ + "data": [ + "hero": [ + "name": "Luke Skywalker", + "__typename": "Human" + ] + ] + ]) + + let client = ApolloClient(networkTransport: networkTransport, store: store) + + client.fetch(query: query, cachePolicy: .returnCacheDataElseFetch) { (result, error) in + defer { expectation.fulfill() } + + guard let result = result else { XCTFail("No query result"); return } + + XCTAssertEqual(result.data?.hero?.name, "Luke Skywalker") + } + + self.waitForExpectations(timeout: 1, handler: nil) + }) } - - waitForExpectations(timeout: 1, handler: nil) } func testReturnCacheDataDontFetchWithCachedData() throws { let query = HeroNameQuery() - - let store = ApolloStore(records: [ + + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "hero")], "hero": [ "name": "R2-D2", "__typename": "Droid", ] - ]) - - let networkTransport = MockNetworkTransport(body: [ - "data": [ - "hero": [ - "name": "Luke Skywalker", - "__typename": "Human" - ] - ] - ]) - - let client = ApolloClient(networkTransport: networkTransport, store: store) - - let expectation = self.expectation(description: "Fetching query") - - client.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in - defer { expectation.fulfill() } - - guard let result = result else { XCTFail("No query result"); return } - - XCTAssertEqual(result.data?.hero?.name, "R2-D2") + ] + + withEachCacheType { (cache) in + let expectation = self.expectation(description: "Fetching query") + + cache.merge(records: initialRecords).andThen({ _ in + let store = ApolloStore(cache: cache) + + let networkTransport = MockNetworkTransport(body: [ + "data": [ + "hero": [ + "name": "Luke Skywalker", + "__typename": "Human" + ] + ] + ]) + + let client = ApolloClient(networkTransport: networkTransport, store: store) + + client.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in + defer { expectation.fulfill() } + + guard let result = result else { XCTFail("No query result"); return } + + XCTAssertEqual(result.data?.hero?.name, "R2-D2") + } + + self.waitForExpectations(timeout: 1, handler: nil) + }) } - - waitForExpectations(timeout: 1, handler: nil) } func testReturnCacheDataDontFetchWithMissingData() throws { let query = HeroNameQuery() - - let store = ApolloStore(records: [ + + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "hero")], "hero": [ "name": "R2-D2", ] - ]) - - let networkTransport = MockNetworkTransport(body: [ - "data": [ - "hero": [ - "name": "Luke Skywalker", - "__typename": "Human" - ] - ] - ]) - - let client = ApolloClient(networkTransport: networkTransport, store: store) - - let expectation = self.expectation(description: "Fetching query") - - client.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in - defer { expectation.fulfill() } - - XCTAssertNil(error) - XCTAssertNil(result) + ] + + withEachCacheType { (cache) in + let expectation = self.expectation(description: "Fetching query") + + cache.merge(records: initialRecords).andThen({ _ in + let store = ApolloStore(cache: cache) + + let networkTransport = MockNetworkTransport(body: [ + "data": [ + "hero": [ + "name": "Luke Skywalker", + "__typename": "Human" + ] + ] + ]) + + let client = ApolloClient(networkTransport: networkTransport, store: store) + + client.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in + defer { expectation.fulfill() } + + XCTAssertNil(error) + XCTAssertNil(result) + } + + self.waitForExpectations(timeout: 1, handler: nil) + }) } - - waitForExpectations(timeout: 1, handler: nil) } func testCompletionHandlerIsCalledOnTheSpecifiedQueue() { @@ -191,17 +221,20 @@ class FetchQueryTests: XCTestCase { ] ] ]) - - let client = ApolloClient(networkTransport: networkTransport) - - let expectation = self.expectation(description: "Fetching query") - - client.fetch(query: query, cachePolicy: .fetchIgnoringCacheData, queue: queue) { (result, error) in - defer { expectation.fulfill() } - - XCTAssertNotNil(DispatchQueue.getSpecific(key: key)) + + withEachCacheType { (cache) in + let store = ApolloStore(cache: cache) + let client = ApolloClient(networkTransport: networkTransport, store: store) + + let expectation = self.expectation(description: "Fetching query") + + client.fetch(query: query, cachePolicy: .fetchIgnoringCacheData, queue: queue) { (result, error) in + defer { expectation.fulfill() } + + XCTAssertNotNil(DispatchQueue.getSpecific(key: key)) + } + + waitForExpectations(timeout: 1, handler: nil) } - - waitForExpectations(timeout: 1, handler: nil) } } diff --git a/Example/ApolloTests/Utilities.swift b/Example/ApolloTests/Utilities.swift index 44369fbe8c..3a0c3eafc3 100644 --- a/Example/ApolloTests/Utilities.swift +++ b/Example/ApolloTests/Utilities.swift @@ -64,3 +64,20 @@ public func XCTAssertMatch(_ valueExpression: @autoclosure ( XCTFail(message(), file: file, line: line) } + +public func withEachCacheType(test: (NormalizedCache) -> Void) { + withInMemoryCache(test: test) + withSqliteCache(test: test) +} + +private func withInMemoryCache(test: (NormalizedCache) -> Void) { + test(InMemoryNormalizedCache()) +} + +private func withSqliteCache(test: (NormalizedCache) -> Void) { + let docDirURL = URL(fileURLWithPath:NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!) + let dbURL = docDirURL.appendingPathComponent("db.sqlite3") + try? FileManager.default.removeItem(at: dbURL) + let cache = try! SqliteNormalizedCache(fileURL: dbURL) + test(cache) +} diff --git a/Sources/InMemoryNormalizedCache.swift b/Sources/InMemoryNormalizedCache.swift index 28cf10a907..b3465dd06d 100644 --- a/Sources/InMemoryNormalizedCache.swift +++ b/Sources/InMemoryNormalizedCache.swift @@ -1,7 +1,7 @@ final class InMemoryNormalizedCache: NormalizedCache { private var records: RecordSet - init(records: RecordSet) { + init(records: RecordSet = RecordSet()) { self.records = records } From 1ae3e37788ae2127d320996b6e3af9017151b645 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 10 Apr 2017 15:52:05 -0700 Subject: [PATCH 17/76] Update LoadQueryFromStoreTests to use both in-memory and sqlite caches --- Example/ApolloTests/FetchQueryTests.swift | 200 ++++++++-------- .../ApolloTests/LoadQueryFromStoreTests.swift | 222 ++++++++++-------- Example/ApolloTests/Utilities.swift | 15 +- 3 files changed, 231 insertions(+), 206 deletions(-) diff --git a/Example/ApolloTests/FetchQueryTests.swift b/Example/ApolloTests/FetchQueryTests.swift index eda1a0dbdc..ec7d982fa6 100644 --- a/Example/ApolloTests/FetchQueryTests.swift +++ b/Example/ApolloTests/FetchQueryTests.swift @@ -14,33 +14,31 @@ class FetchQueryTests: XCTestCase { ] ] - withEachCacheType { (cache) in - let expectation = self.expectation(description: "Fetching query") - - cache.merge(records: initialRecords).andThen({ _ in - let store = ApolloStore(cache: cache) + withEachCacheType(initialRecords: initialRecords) { (cache) in + let store = ApolloStore(cache: cache) - let networkTransport = MockNetworkTransport(body: [ - "data": [ - "hero": [ - "name": "Luke Skywalker", - "__typename": "Human" - ] + let networkTransport = MockNetworkTransport(body: [ + "data": [ + "hero": [ + "name": "Luke Skywalker", + "__typename": "Human" ] - ]) + ] + ]) + + let client = ApolloClient(networkTransport: networkTransport, store: store) - let client = ApolloClient(networkTransport: networkTransport, store: store) + let expectation = self.expectation(description: "Fetching query") + + client.fetch(query: query, cachePolicy: .fetchIgnoringCacheData) { (result, error) in + defer { expectation.fulfill() } - client.fetch(query: query, cachePolicy: .fetchIgnoringCacheData) { (result, error) in - defer { expectation.fulfill() } + guard let result = result else { XCTFail("No query result"); return } - guard let result = result else { XCTFail("No query result"); return } + XCTAssertEqual(result.data?.hero?.name, "Luke Skywalker") + } - XCTAssertEqual(result.data?.hero?.name, "Luke Skywalker") - } - - self.waitForExpectations(timeout: 1, handler: nil) - }) + self.waitForExpectations(timeout: 1, handler: nil) } } @@ -55,33 +53,31 @@ class FetchQueryTests: XCTestCase { ] ] - withEachCacheType { (cache) in - let expectation = self.expectation(description: "Fetching query") - - cache.merge(records: initialRecords).andThen({ _ in - let store = ApolloStore(cache: cache) + withEachCacheType(initialRecords: initialRecords) { (cache) in + let store = ApolloStore(cache: cache) - let networkTransport = MockNetworkTransport(body: [ - "data": [ - "hero": [ - "name": "Luke Skywalker", - "__typename": "Human" - ] + let networkTransport = MockNetworkTransport(body: [ + "data": [ + "hero": [ + "name": "Luke Skywalker", + "__typename": "Human" ] - ]) + ] + ]) + + let client = ApolloClient(networkTransport: networkTransport, store: store) - let client = ApolloClient(networkTransport: networkTransport, store: store) + let expectation = self.expectation(description: "Fetching query") + + client.fetch(query: query, cachePolicy: .returnCacheDataElseFetch) { (result, error) in + defer { expectation.fulfill() } - client.fetch(query: query, cachePolicy: .returnCacheDataElseFetch) { (result, error) in - defer { expectation.fulfill() } + guard let result = result else { XCTFail("No query result"); return } - guard let result = result else { XCTFail("No query result"); return } + XCTAssertEqual(result.data?.hero?.name, "R2-D2") + } - XCTAssertEqual(result.data?.hero?.name, "R2-D2") - } - - self.waitForExpectations(timeout: 1, handler: nil) - }) + self.waitForExpectations(timeout: 1, handler: nil) } } @@ -95,33 +91,31 @@ class FetchQueryTests: XCTestCase { ] ] - withEachCacheType { (cache) in - let expectation = self.expectation(description: "Fetching query") - - cache.merge(records: initialRecords).andThen({ _ in - let store = ApolloStore(cache: cache) + withEachCacheType(initialRecords: initialRecords) { (cache) in + let store = ApolloStore(cache: cache) - let networkTransport = MockNetworkTransport(body: [ - "data": [ - "hero": [ - "name": "Luke Skywalker", - "__typename": "Human" - ] + let networkTransport = MockNetworkTransport(body: [ + "data": [ + "hero": [ + "name": "Luke Skywalker", + "__typename": "Human" ] - ]) + ] + ]) - let client = ApolloClient(networkTransport: networkTransport, store: store) + let client = ApolloClient(networkTransport: networkTransport, store: store) - client.fetch(query: query, cachePolicy: .returnCacheDataElseFetch) { (result, error) in - defer { expectation.fulfill() } + let expectation = self.expectation(description: "Fetching query") + + client.fetch(query: query, cachePolicy: .returnCacheDataElseFetch) { (result, error) in + defer { expectation.fulfill() } - guard let result = result else { XCTFail("No query result"); return } + guard let result = result else { XCTFail("No query result"); return } - XCTAssertEqual(result.data?.hero?.name, "Luke Skywalker") - } - - self.waitForExpectations(timeout: 1, handler: nil) - }) + XCTAssertEqual(result.data?.hero?.name, "Luke Skywalker") + } + + self.waitForExpectations(timeout: 1, handler: nil) } } @@ -136,33 +130,31 @@ class FetchQueryTests: XCTestCase { ] ] - withEachCacheType { (cache) in - let expectation = self.expectation(description: "Fetching query") - - cache.merge(records: initialRecords).andThen({ _ in - let store = ApolloStore(cache: cache) + withEachCacheType(initialRecords: initialRecords) { (cache) in + let store = ApolloStore(cache: cache) - let networkTransport = MockNetworkTransport(body: [ - "data": [ - "hero": [ - "name": "Luke Skywalker", - "__typename": "Human" - ] + let networkTransport = MockNetworkTransport(body: [ + "data": [ + "hero": [ + "name": "Luke Skywalker", + "__typename": "Human" ] - ]) + ] + ]) - let client = ApolloClient(networkTransport: networkTransport, store: store) + let client = ApolloClient(networkTransport: networkTransport, store: store) - client.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in - defer { expectation.fulfill() } + let expectation = self.expectation(description: "Fetching query") + + client.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in + defer { expectation.fulfill() } - guard let result = result else { XCTFail("No query result"); return } + guard let result = result else { XCTFail("No query result"); return } - XCTAssertEqual(result.data?.hero?.name, "R2-D2") - } - - self.waitForExpectations(timeout: 1, handler: nil) - }) + XCTAssertEqual(result.data?.hero?.name, "R2-D2") + } + + self.waitForExpectations(timeout: 1, handler: nil) } } @@ -176,32 +168,30 @@ class FetchQueryTests: XCTestCase { ] ] - withEachCacheType { (cache) in - let expectation = self.expectation(description: "Fetching query") - - cache.merge(records: initialRecords).andThen({ _ in - let store = ApolloStore(cache: cache) + withEachCacheType(initialRecords: initialRecords) { (cache) in + let store = ApolloStore(cache: cache) - let networkTransport = MockNetworkTransport(body: [ - "data": [ - "hero": [ - "name": "Luke Skywalker", - "__typename": "Human" - ] + let networkTransport = MockNetworkTransport(body: [ + "data": [ + "hero": [ + "name": "Luke Skywalker", + "__typename": "Human" ] - ]) + ] + ]) - let client = ApolloClient(networkTransport: networkTransport, store: store) + let client = ApolloClient(networkTransport: networkTransport, store: store) + + let expectation = self.expectation(description: "Fetching query") - client.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in - defer { expectation.fulfill() } + client.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in + defer { expectation.fulfill() } + + XCTAssertNil(error) + XCTAssertNil(result) + } - XCTAssertNil(error) - XCTAssertNil(result) - } - - self.waitForExpectations(timeout: 1, handler: nil) - }) + self.waitForExpectations(timeout: 1, handler: nil) } } diff --git a/Example/ApolloTests/LoadQueryFromStoreTests.swift b/Example/ApolloTests/LoadQueryFromStoreTests.swift index 0a1f1574b1..04a9e924d1 100644 --- a/Example/ApolloTests/LoadQueryFromStoreTests.swift +++ b/Example/ApolloTests/LoadQueryFromStoreTests.swift @@ -6,77 +6,93 @@ class LoadQueryFromStoreTests: XCTestCase { var store: ApolloStore! func testLoadingHeroNameQuery() throws { - store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "hero")], "hero": ["__typename": "Droid", "name": "R2-D2"] - ]) - - let query = HeroNameQuery() - - load(query: query) { (result, error) in - XCTAssertNil(error) - XCTAssertNil(result?.errors) - XCTAssertEqual(result?.data?.hero?.name, "R2-D2") + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + store = ApolloStore(cache: cache) + + let query = HeroNameQuery() + + load(query: query) { (result, error) in + XCTAssertNil(error) + XCTAssertNil(result?.errors) + XCTAssertEqual(result?.data?.hero?.name, "R2-D2") + } } } func testLoadingHeroNameQueryWithVariable() throws { - store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero(episode:JEDI)": Reference(key: "hero(episode:JEDI)")], "hero(episode:JEDI)": ["__typename": "Droid", "name": "R2-D2"] - ]) - - let query = HeroNameQuery(episode: .jedi) - - load(query: query) { (result, error) in - XCTAssertNil(error) - XCTAssertNil(result?.errors) - XCTAssertEqual(result?.data?.hero?.name, "R2-D2") + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + store = ApolloStore(cache: cache) + + let query = HeroNameQuery(episode: .jedi) + + load(query: query) { (result, error) in + XCTAssertNil(error) + XCTAssertNil(result?.errors) + XCTAssertEqual(result?.data?.hero?.name, "R2-D2") + } } } func testLoadingHeroNameQueryWithMissingName() throws { - store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "hero")], "hero": ["__typename": "Droid"] - ]) - - let query = HeroNameQuery() - - load(query: query) { (result, error) in - XCTAssertNil(result) - - if case let error as GraphQLResultError = error { - XCTAssertEqual(error.path, ["hero", "name"]) - XCTAssertMatch(error.underlying, JSONDecodingError.missingValue) - } else { - XCTFail("Unexpected error: \(String(describing: error))") + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + store = ApolloStore(cache: cache) + + let query = HeroNameQuery() + + load(query: query) { (result, error) in + XCTAssertNil(result) + + if case let error as GraphQLResultError = error { + XCTAssertEqual(error.path, ["hero", "name"]) + XCTAssertMatch(error.underlying, JSONDecodingError.missingValue) + } else { + XCTFail("Unexpected error: \(String(describing: error))") + } } } } func testLoadingHeroNameQueryWithNullName() throws { - store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "hero")], "hero": ["__typename": "Droid", "name": NSNull()] - ]) - - let query = HeroNameQuery() - - load(query: query) { (result, error) in - XCTAssertNil(result) - - if case let error as GraphQLResultError = error { - XCTAssertEqual(error.path, ["hero", "name"]) - XCTAssertMatch(error.underlying, JSONDecodingError.nullValue) - } else { - XCTFail("Unexpected error: \(String(describing: error))") + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + store = ApolloStore(cache: cache) + + let query = HeroNameQuery() + + load(query: query) { (result, error) in + XCTAssertNil(result) + + if case let error as GraphQLResultError = error { + XCTAssertEqual(error.path, ["hero", "name"]) + XCTAssertMatch(error.underlying, JSONDecodingError.nullValue) + } else { + XCTFail("Unexpected error: \(String(describing: error))") + } } } } func testLoadingHeroAndFriendsNamesQueryWithoutIDs() throws { - store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero(episode:JEDI)": Reference(key: "hero(episode:JEDI)")], "hero(episode:JEDI)": [ "name": "R2-D2", @@ -90,23 +106,27 @@ class LoadQueryFromStoreTests: XCTestCase { "hero(episode:JEDI).friends.0": ["__typename": "Human", "name": "Luke Skywalker"], "hero(episode:JEDI).friends.1": ["__typename": "Human", "name": "Han Solo"], "hero(episode:JEDI).friends.2": ["__typename": "Human", "name": "Leia Organa"], - ]) - - let query = HeroAndFriendsNamesQuery(episode: .jedi) - - load(query: query) { (result, error) in - XCTAssertNil(error) - XCTAssertNil(result?.errors) - - guard let data = result?.data else { XCTFail(); return } - XCTAssertEqual(data.hero?.name, "R2-D2") - let friendsNames = data.hero?.friends?.flatMap { $0?.name } - XCTAssertEqual(friendsNames, ["Luke Skywalker", "Han Solo", "Leia Organa"]) + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + store = ApolloStore(cache: cache) + + let query = HeroAndFriendsNamesQuery(episode: .jedi) + + load(query: query) { (result, error) in + XCTAssertNil(error) + XCTAssertNil(result?.errors) + + guard let data = result?.data else { XCTFail(); return } + XCTAssertEqual(data.hero?.name, "R2-D2") + let friendsNames = data.hero?.friends?.flatMap { $0?.name } + XCTAssertEqual(friendsNames, ["Luke Skywalker", "Han Solo", "Leia Organa"]) + } } } func testLoadingHeroAndFriendsNamesQueryWithIDs() throws { - store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "2001")], "2001": [ "name": "R2-D2", @@ -120,59 +140,71 @@ class LoadQueryFromStoreTests: XCTestCase { "1000": ["__typename": "Human", "name": "Luke Skywalker"], "1002": ["__typename": "Human", "name": "Han Solo"], "1003": ["__typename": "Human", "name": "Leia Organa"], - ]) - - let query = HeroAndFriendsNamesQuery() - - load(query: query) { (result, error) in - XCTAssertNil(error) - XCTAssertNil(result?.errors) - - guard let data = result?.data else { XCTFail(); return } - XCTAssertEqual(data.hero?.name, "R2-D2") - let friendsNames = data.hero?.friends?.flatMap { $0?.name } - XCTAssertEqual(friendsNames, ["Luke Skywalker", "Han Solo", "Leia Organa"]) + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + store = ApolloStore(cache: cache) + + let query = HeroAndFriendsNamesQuery() + + load(query: query) { (result, error) in + XCTAssertNil(error) + XCTAssertNil(result?.errors) + + guard let data = result?.data else { XCTFail(); return } + XCTAssertEqual(data.hero?.name, "R2-D2") + let friendsNames = data.hero?.friends?.flatMap { $0?.name } + XCTAssertEqual(friendsNames, ["Luke Skywalker", "Han Solo", "Leia Organa"]) + } } } func testLoadingHeroAndFriendsNamesQueryWithNullFriends() throws { - store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "hero")], "hero": [ "name": "R2-D2", "__typename": "Droid", "friends": NSNull(), ] - ]) - - let query = HeroAndFriendsNamesQuery() - - load(query: query) { (result, error) in - XCTAssertNil(error) - XCTAssertNil(result?.errors) - - guard let data = result?.data else { XCTFail(); return } - XCTAssertEqual(data.hero?.name, "R2-D2") - XCTAssertNil(data.hero?.friends) + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + store = ApolloStore(cache: cache) + + let query = HeroAndFriendsNamesQuery() + + load(query: query) { (result, error) in + XCTAssertNil(error) + XCTAssertNil(result?.errors) + + guard let data = result?.data else { XCTFail(); return } + XCTAssertEqual(data.hero?.name, "R2-D2") + XCTAssertNil(data.hero?.friends) + } } } func testLoadingHeroAndFriendsNamesQueryWithMissingFriends() throws { - store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "hero")], "hero": ["__typename": "Droid", "name": "R2-D2"] - ]) - - let query = HeroAndFriendsNamesQuery() - - load(query: query) { (result, error) in - XCTAssertNil(result) - - if case let error as GraphQLResultError = error { - XCTAssertEqual(error.path, ["hero", "friends"]) - XCTAssertMatch(error.underlying, JSONDecodingError.missingValue) - } else { - XCTFail("Unexpected error: \(String(describing: error))") + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + store = ApolloStore(cache: cache) + + let query = HeroAndFriendsNamesQuery() + + load(query: query) { (result, error) in + XCTAssertNil(result) + + if case let error as GraphQLResultError = error { + XCTAssertEqual(error.path, ["hero", "friends"]) + XCTAssertMatch(error.underlying, JSONDecodingError.missingValue) + } else { + XCTFail("Unexpected error: \(String(describing: error))") + } } } } diff --git a/Example/ApolloTests/Utilities.swift b/Example/ApolloTests/Utilities.swift index 3a0c3eafc3..51aba91502 100644 --- a/Example/ApolloTests/Utilities.swift +++ b/Example/ApolloTests/Utilities.swift @@ -65,19 +65,22 @@ public func XCTAssertMatch(_ valueExpression: @autoclosure ( XCTFail(message(), file: file, line: line) } -public func withEachCacheType(test: (NormalizedCache) -> Void) { - withInMemoryCache(test: test) - withSqliteCache(test: test) +public func withEachCacheType(initialRecords: RecordSet? = nil, test: (NormalizedCache) -> Void) { + withInMemoryCache(initialRecords: initialRecords, test: test) + withSqliteCache(initialRecords: initialRecords, test: test) } -private func withInMemoryCache(test: (NormalizedCache) -> Void) { - test(InMemoryNormalizedCache()) +private func withInMemoryCache(initialRecords: RecordSet? = nil, test: (NormalizedCache) -> Void) { + test(InMemoryNormalizedCache(records: initialRecords ?? RecordSet())) } -private func withSqliteCache(test: (NormalizedCache) -> Void) { +private func withSqliteCache(initialRecords: RecordSet? = nil, test: (NormalizedCache) -> Void) { let docDirURL = URL(fileURLWithPath:NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!) let dbURL = docDirURL.appendingPathComponent("db.sqlite3") try? FileManager.default.removeItem(at: dbURL) let cache = try! SqliteNormalizedCache(fileURL: dbURL) + if let initialRecords = initialRecords { + _ = cache.merge(records: initialRecords) // This is synchronous + } test(cache) } From 6d9ef4820d1d05c6f9ee877b9bdcfdbadbca4923 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 10 Apr 2017 16:13:00 -0700 Subject: [PATCH 18/76] Update StarWarsServerCachingRoundtripTests to use both in-memory and sqlite caches --- .../StarWarsServerCachingRoundtripTests.swift | 68 ++++++++++--------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/Example/ApolloTests/StarWarsServerCachingRoundtripTests.swift b/Example/ApolloTests/StarWarsServerCachingRoundtripTests.swift index 048c951446..bbf96df392 100644 --- a/Example/ApolloTests/StarWarsServerCachingRoundtripTests.swift +++ b/Example/ApolloTests/StarWarsServerCachingRoundtripTests.swift @@ -3,14 +3,7 @@ import XCTest import StarWarsAPI class StarWarsServerCachingRoundtripTests: XCTestCase { - var client: ApolloClient! - - override func setUp() { - super.setUp() - - client = ApolloClient(url: URL(string: "http://localhost:8080/graphql")!) - } - + func testHeroAndFriendsNamesQuery() { let query = HeroAndFriendsNamesQuery() @@ -32,41 +25,50 @@ class StarWarsServerCachingRoundtripTests: XCTestCase { } func testHeroAndFriendsNamesWithIDsQuery() { - client.store.cacheKeyForObject = { $0["id"] } - let query = HeroAndFriendsNamesWithIDsQuery() - fetchAndLoadFromStore(query: query) { data in + fetchAndLoadFromStore(query: query, setupClient: { $0.store.cacheKeyForObject = {$0["id"]} }) { data in XCTAssertEqual(data.hero?.name, "R2-D2") let friendsNames = data.hero?.friends?.flatMap { $0?.name } XCTAssertEqual(friendsNames, ["Luke Skywalker", "Han Solo", "Leia Organa"]) } } - private func fetchAndLoadFromStore(query: Query, completionHandler: @escaping (_ data: Query.Data) -> Void) { - let expectation = self.expectation(description: "Fetching query") - - client.fetch(query: query) { (result, error) in - if let error = error { XCTFail("Error while fetching query: \(error.localizedDescription)"); return } - guard let result = result else { XCTFail("No query result"); return } - - if let errors = result.errors { - XCTFail("Errors in query result: \(errors)") + private func fetchAndLoadFromStore(query: Query, setupClient: ((ApolloClient) -> Void)? = nil, completionHandler: @escaping (_ data: Query.Data) -> Void) { + + withEachCacheType { (cache) in + let network = HTTPNetworkTransport(url: URL(string: "http://localhost:8080/graphql")!) + let store = ApolloStore(cache: cache) + let client = ApolloClient(networkTransport: network, store: store) + + if let setupClient = setupClient { + setupClient(client) } - - guard result.data != nil else { XCTFail("No query result data"); return } - - self.client.store.load(query: query) { (result, error) in - defer { expectation.fulfill() } - - if let error = error { XCTFail("Error while loading query from store: \(error.localizedDescription)"); return } - - guard let data = result?.data else { XCTFail("No query result data"); return } - - completionHandler(data) + + let expectation = self.expectation(description: "Fetching query") + + client.fetch(query: query) { (result, error) in + if let error = error { XCTFail("Error while fetching query: \(error.localizedDescription)"); return } + guard let result = result else { XCTFail("No query result"); return } + + if let errors = result.errors { + XCTFail("Errors in query result: \(errors)") + } + + guard result.data != nil else { XCTFail("No query result data"); return } + + client.store.load(query: query) { (result, error) in + defer { expectation.fulfill() } + + if let error = error { XCTFail("Error while loading query from store: \(error.localizedDescription)"); return } + + guard let data = result?.data else { XCTFail("No query result data"); return } + + completionHandler(data) + } } + + waitForExpectations(timeout: 1, handler: nil) } - - waitForExpectations(timeout: 1, handler: nil) } } From abaa650848b851faeb36ea86d51a64beba4597b8 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 10 Apr 2017 16:16:08 -0700 Subject: [PATCH 19/76] Update StarWarsServerTests to use both in-memory and sqlite caches --- Example/ApolloTests/StarWarsServerTests.swift | 67 ++++++++++--------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/Example/ApolloTests/StarWarsServerTests.swift b/Example/ApolloTests/StarWarsServerTests.swift index 6bb02593d8..22b1ef37b7 100644 --- a/Example/ApolloTests/StarWarsServerTests.swift +++ b/Example/ApolloTests/StarWarsServerTests.swift @@ -3,13 +3,6 @@ import XCTest import StarWarsAPI class StarWarsServerTests: XCTestCase { - var client: ApolloClient! - - override func setUp() { - super.setUp() - - client = ApolloClient(url: URL(string: "http://localhost:8080/graphql")!) - } // MARK: Queries @@ -143,44 +136,56 @@ class StarWarsServerTests: XCTestCase { // MARK: - Helpers private func fetch(query: Query, completionHandler: @escaping (_ data: Query.Data) -> Void) { - let expectation = self.expectation(description: "Fetching query") + withEachCacheType { (cache) in + let network = HTTPNetworkTransport(url: URL(string: "http://localhost:8080/graphql")!) + let store = ApolloStore(cache: cache) + let client = ApolloClient(networkTransport: network, store: store) - client.fetch(query: query) { (result, error) in - defer { expectation.fulfill() } + let expectation = self.expectation(description: "Fetching query") - if let error = error { XCTFail("Error while fetching query: \(error.localizedDescription)"); return } - guard let result = result else { XCTFail("No query result"); return } + client.fetch(query: query) { (result, error) in + defer { expectation.fulfill() } - if let errors = result.errors { - XCTFail("Errors in query result: \(errors)") - } + if let error = error { XCTFail("Error while fetching query: \(error.localizedDescription)"); return } + guard let result = result else { XCTFail("No query result"); return } - guard let data = result.data else { XCTFail("No query result data"); return } + if let errors = result.errors { + XCTFail("Errors in query result: \(errors)") + } - completionHandler(data) - } + guard let data = result.data else { XCTFail("No query result data"); return } - waitForExpectations(timeout: 1, handler: nil) + completionHandler(data) + } + + waitForExpectations(timeout: 1, handler: nil) + } } private func perform(mutation: Mutation, completionHandler: @escaping (_ data: Mutation.Data) -> Void) { - let expectation = self.expectation(description: "Performing mutation") + withEachCacheType { (cache) in + let network = HTTPNetworkTransport(url: URL(string: "http://localhost:8080/graphql")!) + let store = ApolloStore(cache: cache) + let client = ApolloClient(networkTransport: network, store: store) - client.perform(mutation: mutation) { (result, error) in - defer { expectation.fulfill() } + let expectation = self.expectation(description: "Performing mutation") - if let error = error { XCTFail("Error while performing mutation: \(error.localizedDescription)"); return } - guard let result = result else { XCTFail("No mutation result"); return } + client.perform(mutation: mutation) { (result, error) in + defer { expectation.fulfill() } - if let errors = result.errors { - XCTFail("Errors in mutation result: \(errors)") - } + if let error = error { XCTFail("Error while performing mutation: \(error.localizedDescription)"); return } + guard let result = result else { XCTFail("No mutation result"); return } - guard let data = result.data else { XCTFail("No mutation result data"); return } + if let errors = result.errors { + XCTFail("Errors in mutation result: \(errors)") + } - completionHandler(data) - } + guard let data = result.data else { XCTFail("No mutation result data"); return } - waitForExpectations(timeout: 1, handler: nil) + completionHandler(data) + } + + waitForExpectations(timeout: 1, handler: nil) + } } } From 589096f5801bb8a0a8c07863a852ff7bad91cbe9 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 10 Apr 2017 16:29:57 -0700 Subject: [PATCH 20/76] Update StoreTransactionTests to use both in-memory and sqlite caches --- .../ApolloTests/StoreTransactionTests.swift | 207 ++++++++++-------- 1 file changed, 116 insertions(+), 91 deletions(-) diff --git a/Example/ApolloTests/StoreTransactionTests.swift b/Example/ApolloTests/StoreTransactionTests.swift index 1ef46c8588..cdf3bd0488 100644 --- a/Example/ApolloTests/StoreTransactionTests.swift +++ b/Example/ApolloTests/StoreTransactionTests.swift @@ -3,43 +3,52 @@ import XCTest import StarWarsAPI class StoreTransactionTests: XCTestCase { + func testReadHeroNameQuery() throws { - let store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "hero")], "hero": ["__typename": "Droid", "name": "R2-D2"] - ]) - - let query = HeroNameQuery() - - try await(store.withinReadTransaction { transaction in - let data = try transaction.readObject(forQuery: query) - - XCTAssertEqual(data, ["hero": ["__typename": "Droid", "name": "R2-D2"]]) - }) + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + let store = ApolloStore(cache: cache) + + let query = HeroNameQuery() + + try! await(store.withinReadTransaction { transaction in + let data = try transaction.readObject(forQuery: query) + + XCTAssertEqual(data, ["hero": ["__typename": "Droid", "name": "R2-D2"]]) + }) + } } func testUpdateHeroNameQuery() throws { - let store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "QUERY_ROOT.hero")], "QUERY_ROOT.hero": ["__typename": "Droid", "name": "R2-D2"] - ]) - - let query = HeroNameQuery() - - try await(store.withinReadWriteTransaction { transaction in - var data = try transaction.readObject(forQuery: query) - data[keyPath: "hero.name"] = "Artoo" - try transaction.write(object: data, forQuery: query) - }) - - let result = try await(store.load(query: query)) - - guard let data = result.data else { XCTFail(); return } - XCTAssertEqual(data.hero?.name, "Artoo") + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + let store = ApolloStore(cache: cache) + + let query = HeroNameQuery() + + try! await(store.withinReadWriteTransaction { transaction in + var data = try! transaction.readObject(forQuery: query) + data[keyPath: "hero.name"] = "Artoo" + try transaction.write(object: data, forQuery: query) + }) + + let result = try! await(store.load(query: query)) + + guard let data = result.data else { XCTFail(); return } + XCTAssertEqual(data.hero?.name, "Artoo") + } } func testReadHeroAndFriendsNamesQuery() throws { - let store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "2001")], "2001": [ "name": "R2-D2", @@ -53,29 +62,33 @@ class StoreTransactionTests: XCTestCase { "1000": ["__typename": "Human", "name": "Luke Skywalker"], "1002": ["__typename": "Human", "name": "Han Solo"], "1003": ["__typename": "Human", "name": "Leia Organa"], - ]) - - let query = HeroAndFriendsNamesQuery() - - try await(store.withinReadTransaction { transaction in - let object = try transaction.readObject(forQuery: query) - - XCTAssertEqual(object, [ - "hero": [ - "name": "R2-D2", - "__typename": "Droid", - "friends": [ - ["__typename": "Human", "name": "Luke Skywalker"], - ["__typename": "Human", "name": "Han Solo"], - ["__typename": "Human", "name": "Leia Organa"] + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + let store = ApolloStore(cache: cache) + + let query = HeroAndFriendsNamesQuery() + + try! await(store.withinReadTransaction { transaction in + let object = try! transaction.readObject(forQuery: query) + + XCTAssertEqual(object, [ + "hero": [ + "name": "R2-D2", + "__typename": "Droid", + "friends": [ + ["__typename": "Human", "name": "Luke Skywalker"], + ["__typename": "Human", "name": "Han Solo"], + ["__typename": "Human", "name": "Leia Organa"] + ] ] - ] - ]) - }) + ]) + }) + } } func testUpdateHeroAndFriendsNamesQuery() throws { - let store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "2001")], "2001": [ "name": "R2-D2", @@ -89,26 +102,30 @@ class StoreTransactionTests: XCTestCase { "1000": ["__typename": "Human", "name": "Luke Skywalker"], "1002": ["__typename": "Human", "name": "Han Solo"], "1003": ["__typename": "Human", "name": "Leia Organa"], - ]) - - let query = HeroAndFriendsNamesQuery() - - try await(store.withinReadWriteTransaction { transaction in - var data = try transaction.readObject(forQuery: query) - data[arrayAt: "hero.friends"]?.append(["__typename": "Droid", "name": "C-3PO"]) - try transaction.write(object: data, forQuery: query) - }) - - let result = try await(store.load(query: query)) - guard let data = result.data else { XCTFail(); return } - - XCTAssertEqual(data.hero?.name, "R2-D2") - let friendsNames = data.hero?.friends?.flatMap { $0?.name } - XCTAssertEqual(friendsNames, ["Luke Skywalker", "Han Solo", "Leia Organa", "C-3PO"]) + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + let store = ApolloStore(cache: cache) + + let query = HeroAndFriendsNamesQuery() + + try! await(store.withinReadWriteTransaction { transaction in + var data = try! transaction.readObject(forQuery: query) + data[arrayAt: "hero.friends"]?.append(["__typename": "Droid", "name": "C-3PO"]) + try! transaction.write(object: data, forQuery: query) + }) + + let result = try! await(store.load(query: query)) + guard let data = result.data else { XCTFail(); return } + + XCTAssertEqual(data.hero?.name, "R2-D2") + let friendsNames = data.hero?.friends?.flatMap { $0?.name } + XCTAssertEqual(friendsNames, ["Luke Skywalker", "Han Solo", "Leia Organa", "C-3PO"]) + } } func testReadFriendsNamesFragment() throws { - let store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "2001")], "2001": [ "name": "R2-D2", @@ -122,24 +139,28 @@ class StoreTransactionTests: XCTestCase { "1000": ["__typename": "Human", "name": "Luke Skywalker"], "1002": ["__typename": "Human", "name": "Han Solo"], "1003": ["__typename": "Human", "name": "Leia Organa"], - ]) - - try await(store.withinReadTransaction { transaction in - let friendsNames = try transaction.readObject(forFragment: FriendsNames.self, withKey: "2001") - - XCTAssertEqual(friendsNames, [ - "__typename": "Droid", - "friends": [ - ["__typename": "Human", "name": "Luke Skywalker"], - ["__typename": "Human", "name": "Han Solo"], - ["__typename": "Human", "name": "Leia Organa"] - ] - ]) - }) + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + let store = ApolloStore(cache: cache) + + try! await(store.withinReadTransaction { transaction in + let friendsNames = try! transaction.readObject(forFragment: FriendsNames.self, withKey: "2001") + + XCTAssertEqual(friendsNames, [ + "__typename": "Droid", + "friends": [ + ["__typename": "Human", "name": "Luke Skywalker"], + ["__typename": "Human", "name": "Han Solo"], + ["__typename": "Human", "name": "Leia Organa"] + ] + ]) + }) + } } func testUpdateFriendsNamesFragment() throws { - let store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "2001")], "2001": [ "name": "R2-D2", @@ -153,19 +174,23 @@ class StoreTransactionTests: XCTestCase { "1000": ["__typename": "Human", "name": "Luke Skywalker"], "1002": ["__typename": "Human", "name": "Han Solo"], "1003": ["__typename": "Human", "name": "Leia Organa"], - ]) - - try await(store.withinReadWriteTransaction { transaction in - var friendsNames = try transaction.readObject(forFragment: FriendsNames.self, withKey: "2001") - friendsNames[arrayAt: "friends"]?.append(["__typename": "Droid", "name": "C-3PO"]) - try transaction.write(object: friendsNames, forFragment: FriendsNames.self, withKey: "2001") - }) - - let result = try await(store.load(query: HeroAndFriendsNamesQuery())) - guard let data = result.data else { XCTFail(); return } - - XCTAssertEqual(data.hero?.name, "R2-D2") - let friendsNames = data.hero?.friends?.flatMap { $0?.name } - XCTAssertEqual(friendsNames, ["Luke Skywalker", "Han Solo", "Leia Organa", "C-3PO"]) + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + let store = ApolloStore(cache: cache) + + try! await(store.withinReadWriteTransaction { transaction in + var friendsNames = try! transaction.readObject(forFragment: FriendsNames.self, withKey: "2001") + friendsNames[arrayAt: "friends"]?.append(["__typename": "Droid", "name": "C-3PO"]) + try! transaction.write(object: friendsNames, forFragment: FriendsNames.self, withKey: "2001") + }) + + let result = try! await(store.load(query: HeroAndFriendsNamesQuery())) + guard let data = result.data else { XCTFail(); return } + + XCTAssertEqual(data.hero?.name, "R2-D2") + let friendsNames = data.hero?.friends?.flatMap { $0?.name } + XCTAssertEqual(friendsNames, ["Luke Skywalker", "Han Solo", "Leia Organa", "C-3PO"]) + } } } From 20fa038ffffe79c6ea86711c22b81ecbeec2e723 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 10 Apr 2017 16:46:03 -0700 Subject: [PATCH 21/76] Update WatchQueryTests to use both in-memory and sqlite caches --- Example/ApolloTests/WatchQueryTests.swift | 359 +++++++++++----------- 1 file changed, 183 insertions(+), 176 deletions(-) diff --git a/Example/ApolloTests/WatchQueryTests.swift b/Example/ApolloTests/WatchQueryTests.swift index 13e943b485..a3a2bda850 100644 --- a/Example/ApolloTests/WatchQueryTests.swift +++ b/Example/ApolloTests/WatchQueryTests.swift @@ -3,62 +3,65 @@ import XCTest import StarWarsAPI class WatchQueryTests: XCTestCase { + func testRefetchWatchedQuery() throws { let query = HeroNameQuery() - - let store = ApolloStore(records: [ + + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "hero")], "hero": [ "name": "R2-D2", "__typename": "Droid", ] - ]) - - let networkTransport = MockNetworkTransport(body: [ - "data": [ - "hero": [ - "name": "Artoo", - "__typename": "Droid" + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + let networkTransport = MockNetworkTransport(body: [ + "data": [ + "hero": [ + "name": "Artoo", + "__typename": "Droid" + ] ] - ] - ]) - - let client = ApolloClient(networkTransport: networkTransport, store: store) - - var verifyResult: OperationResultHandler - - verifyResult = { (result, error) in - XCTAssertNil(error) - XCTAssertNil(result?.errors) - - XCTAssertEqual(result?.data?.hero?.name, "R2-D2") - } - - var expectation = self.expectation(description: "Fetching query") - - let watcher = client.watch(query: query) { (result, error) in - verifyResult(result, error) - expectation.fulfill() - } - - waitForExpectations(timeout: 1.0, handler: nil) - - verifyResult = { (result, error) in - XCTAssertNil(error) - XCTAssertNil(result?.errors) + ]) + let store = ApolloStore(cache: cache) + let client = ApolloClient(networkTransport: networkTransport, store: store) + + var verifyResult: OperationResultHandler + + verifyResult = { (result, error) in + XCTAssertNil(error) + XCTAssertNil(result?.errors) + + XCTAssertEqual(result?.data?.hero?.name, "R2-D2") + } + + var expectation = self.expectation(description: "Fetching query") + + let watcher = client.watch(query: query) { (result, error) in + verifyResult(result, error) + expectation.fulfill() + } + + waitForExpectations(timeout: 1.0, handler: nil) + + verifyResult = { (result, error) in + XCTAssertNil(error) + XCTAssertNil(result?.errors) + + XCTAssertEqual(result?.data?.hero?.name, "Artoo") + } + + expectation = self.expectation(description: "Refetching query") + + watcher.refetch() - XCTAssertEqual(result?.data?.hero?.name, "Artoo") + waitForExpectations(timeout: 1.0, handler: nil) } - - expectation = self.expectation(description: "Refetching query") - - watcher.refetch() - - waitForExpectations(timeout: 1.0, handler: nil) } func testWatchedQueryGetsUpdatedWithResultFromOtherQuery() throws { - let store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "QUERY_ROOT.hero")], "QUERY_ROOT.hero": [ "name": "R2-D2", @@ -72,61 +75,61 @@ class WatchQueryTests: XCTestCase { "QUERY_ROOT.hero.friends.0": ["__typename": "Human", "name": "Luke Skywalker"], "QUERY_ROOT.hero.friends.1": ["__typename": "Human", "name": "Han Solo"], "QUERY_ROOT.hero.friends.2": ["__typename": "Human", "name": "Leia Organa"], - ]) - - let networkTransport = MockNetworkTransport(body: [ - "data": [ - "hero": [ - "name": "Artoo", - "__typename": "Droid" - ] ] - ]) - - let client = ApolloClient(networkTransport: networkTransport, store: store) - - let query = HeroAndFriendsNamesQuery() - - var verifyResult: OperationResultHandler - - verifyResult = { (result, error) in - XCTAssertNil(error) - XCTAssertNil(result?.errors) - - guard let data = result?.data else { XCTFail(); return } - XCTAssertEqual(data.hero?.name, "R2-D2") - let friendsNames = data.hero?.friends?.flatMap { $0?.name } - XCTAssertEqual(friendsNames, ["Luke Skywalker", "Han Solo", "Leia Organa"]) - } - - var expectation = self.expectation(description: "Fetching query") - - _ = client.watch(query: query) { (result, error) in - verifyResult(result, error) - expectation.fulfill() - } - - waitForExpectations(timeout: 1.0, handler: nil) - - verifyResult = { (result, error) in - XCTAssertNil(error) - XCTAssertNil(result?.errors) + + withEachCacheType(initialRecords: initialRecords) { (cache) in + let networkTransport = MockNetworkTransport(body: [ + "data": [ + "hero": [ + "name": "Artoo", + "__typename": "Droid" + ] + ] + ]) + let store = ApolloStore(cache: cache) + let client = ApolloClient(networkTransport: networkTransport, store: store) + + let query = HeroAndFriendsNamesQuery() + + var verifyResult: OperationResultHandler + + verifyResult = { (result, error) in + XCTAssertNil(error) + XCTAssertNil(result?.errors) + + guard let data = result?.data else { XCTFail(); return } + XCTAssertEqual(data.hero?.name, "R2-D2") + let friendsNames = data.hero?.friends?.flatMap { $0?.name } + XCTAssertEqual(friendsNames, ["Luke Skywalker", "Han Solo", "Leia Organa"]) + } + + var expectation = self.expectation(description: "Fetching query") + + _ = client.watch(query: query) { (result, error) in + verifyResult(result, error) + expectation.fulfill() + } + + waitForExpectations(timeout: 1.0, handler: nil) + + verifyResult = { (result, error) in + XCTAssertNil(error) + XCTAssertNil(result?.errors) + + guard let data = result?.data else { XCTFail(); return } + XCTAssertEqual(data.hero?.name, "Artoo") + let friendsNames = data.hero?.friends?.flatMap { $0?.name } + XCTAssertEqual(friendsNames, ["Luke Skywalker", "Han Solo", "Leia Organa"]) + } + + expectation = self.expectation(description: "Updated after fetching other query") - guard let data = result?.data else { XCTFail(); return } - XCTAssertEqual(data.hero?.name, "Artoo") - let friendsNames = data.hero?.friends?.flatMap { $0?.name } - XCTAssertEqual(friendsNames, ["Luke Skywalker", "Han Solo", "Leia Organa"]) + waitForExpectations(timeout: 1.0, handler: nil) } - - expectation = self.expectation(description: "Updated after fetching other query") - - client.fetch(query: HeroNameQuery(), cachePolicy: .fetchIgnoringCacheData) - - waitForExpectations(timeout: 1.0, handler: nil) } func testWatchedQueryDoesNotRefetchAfterUnrelatedQuery() throws { - let store = ApolloStore(records: [ + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "QUERY_ROOT.hero")], "QUERY_ROOT.hero": [ "name": "R2-D2", @@ -140,106 +143,110 @@ class WatchQueryTests: XCTestCase { "QUERY_ROOT.hero.friends.0": ["__typename": "Human", "name": "Luke Skywalker"], "QUERY_ROOT.hero.friends.1": ["__typename": "Human", "name": "Han Solo"], "QUERY_ROOT.hero.friends.2": ["__typename": "Human", "name": "Leia Organa"], - ]) - - let networkTransport = MockNetworkTransport(body: [ - "data": [ - "hero": [ - "name": "Artoo", - "__typename": "Droid" - ] ] - ]) - - let client = ApolloClient(networkTransport: networkTransport, store: store) - - let query = HeroAndFriendsNamesQuery() - - var verifyResult: OperationResultHandler - - verifyResult = { (result, error) in - XCTAssertNil(error) - XCTAssertNil(result?.errors) + + withEachCacheType(initialRecords: initialRecords) { (cache) in + let networkTransport = MockNetworkTransport(body: [ + "data": [ + "hero": [ + "name": "Artoo", + "__typename": "Droid" + ] + ] + ]) + let store = ApolloStore(cache: cache) + let client = ApolloClient(networkTransport: networkTransport, store: store) + + let query = HeroAndFriendsNamesQuery() + + var verifyResult: OperationResultHandler + + verifyResult = { (result, error) in + XCTAssertNil(error) + XCTAssertNil(result?.errors) + + guard let data = result?.data else { XCTFail(); return } + XCTAssertEqual(data.hero?.name, "R2-D2") + let friendsNames = data.hero?.friends?.flatMap { $0?.name } + XCTAssertEqual(friendsNames, ["Luke Skywalker", "Han Solo", "Leia Organa"]) + } + + let expectation = self.expectation(description: "Fetching query") + + _ = client.watch(query: query) { (result, error) in + verifyResult(result, error) + expectation.fulfill() + } + + waitForExpectations(timeout: 1.0, handler: nil) + + verifyResult = { (result, error) in + XCTFail() + } + + client.fetch(query: HeroNameQuery(episode: .empire), cachePolicy: .fetchIgnoringCacheData) - guard let data = result?.data else { XCTFail(); return } - XCTAssertEqual(data.hero?.name, "R2-D2") - let friendsNames = data.hero?.friends?.flatMap { $0?.name } - XCTAssertEqual(friendsNames, ["Luke Skywalker", "Han Solo", "Leia Organa"]) - } - - let expectation = self.expectation(description: "Fetching query") - - _ = client.watch(query: query) { (result, error) in - verifyResult(result, error) - expectation.fulfill() - } - - waitForExpectations(timeout: 1.0, handler: nil) - - verifyResult = { (result, error) in - XCTFail() + waitFor(timeInterval: 1.0) } - - client.fetch(query: HeroNameQuery(episode: .empire), cachePolicy: .fetchIgnoringCacheData) - - waitFor(timeInterval: 1.0) } func testWatchedQueryWithID() throws { let query = HeroNameWithIdQuery() - - let store = ApolloStore(records: [ + + let initialRecords: RecordSet = [ "QUERY_ROOT": ["hero": Reference(key: "2001")], "2001": [ "id": "2001", "name": "R2-D2", "__typename": "Droid", ] - ]) - - let networkTransport = MockNetworkTransport(body: [ - "data": [ - "hero": [ - "id": "2001", - "name": "Luke Skywalker", - "__typename": "Human" + ] + + withEachCacheType(initialRecords: initialRecords) { (cache) in + let networkTransport = MockNetworkTransport(body: [ + "data": [ + "hero": [ + "id": "2001", + "name": "Luke Skywalker", + "__typename": "Human" + ] ] - ] - ]) - - let client = ApolloClient(networkTransport: networkTransport, store: store) - client.store.cacheKeyForObject = { $0["id"] } - - var verifyResult: OperationResultHandler - - verifyResult = { (result, error) in - XCTAssertNil(error) - XCTAssertNil(result?.errors) - - XCTAssertEqual(result?.data?.hero?.name, "R2-D2") - } - - var expectation = self.expectation(description: "Fetching query") - - _ = client.watch(query: query) { (result, error) in - verifyResult(result, error) - expectation.fulfill() - } - - waitForExpectations(timeout: 1.0, handler: nil) - - verifyResult = { (result, error) in - XCTAssertNil(error) - XCTAssertNil(result?.errors) + ]) + let store = ApolloStore(cache: cache) + let client = ApolloClient(networkTransport: networkTransport, store: store) + client.store.cacheKeyForObject = { $0["id"] } + + var verifyResult: OperationResultHandler + + verifyResult = { (result, error) in + XCTAssertNil(error) + XCTAssertNil(result?.errors) + + XCTAssertEqual(result?.data?.hero?.name, "R2-D2") + } + + var expectation = self.expectation(description: "Fetching query") + + _ = client.watch(query: query) { (result, error) in + verifyResult(result, error) + expectation.fulfill() + } + + waitForExpectations(timeout: 1.0, handler: nil) + + verifyResult = { (result, error) in + XCTAssertNil(error) + XCTAssertNil(result?.errors) + + XCTAssertEqual(result?.data?.hero?.name, "Luke Skywalker") + } + + expectation = self.expectation(description: "Fetching other query") + + client.fetch(query: HeroNameWithIdQuery(), cachePolicy: .fetchIgnoringCacheData) - XCTAssertEqual(result?.data?.hero?.name, "Luke Skywalker") + waitForExpectations(timeout: 1.0, handler: nil) } - - expectation = self.expectation(description: "Fetching other query") - - client.fetch(query: HeroNameWithIdQuery(), cachePolicy: .fetchIgnoringCacheData) - - waitForExpectations(timeout: 1.0, handler: nil) } // TODO: Replace with .inverted on XCTestExpectation, which is new in Xcode 8.3 From 26a2625eed14bd64a2484edc5816ec291141cef2 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 10 Apr 2017 16:48:00 -0700 Subject: [PATCH 22/76] Remove ApolloClient and ApolloStore convenience initializers that assume a specific type of cache --- Sources/ApolloClient.swift | 9 +-------- Sources/ApolloStore.swift | 7 ------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/Sources/ApolloClient.swift b/Sources/ApolloClient.swift index 241d91875d..13ff1d16e9 100644 --- a/Sources/ApolloClient.swift +++ b/Sources/ApolloClient.swift @@ -40,20 +40,13 @@ public class ApolloClient { /// - Parameters: /// - networkTransport: A network transport used to send operations to a server. /// - store: A store used as a local cache. Defaults to an empty store. - public init(networkTransport: NetworkTransport, store: ApolloStore = ApolloStore()) { + public init(networkTransport: NetworkTransport, store: ApolloStore) { self.networkTransport = networkTransport self.store = store queue = DispatchQueue(label: "com.apollographql.ApolloClient", attributes: .concurrent) operationQueue = OperationQueue() } - - /// Creates a client with an HTTP network transport connecting to the specified URL. - /// - /// - Parameter url: The URL of a GraphQL server to connect to. - public convenience init(url: URL) { - self.init(networkTransport: HTTPNetworkTransport(url: url)) - } /// Fetches a query from the server or from the local cache, depending on the current contents of the cache and the specified cache policy. /// diff --git a/Sources/ApolloStore.swift b/Sources/ApolloStore.swift index 1a4ae363b7..76dc51e247 100644 --- a/Sources/ApolloStore.swift +++ b/Sources/ApolloStore.swift @@ -35,13 +35,6 @@ public final class ApolloStore { queue = DispatchQueue(label: "com.apollographql.ApolloStore", attributes: .concurrent) } - convenience init(records: RecordSet = RecordSet()) { -// self.init(cache: InMemoryNormalizedCache(records: records)) - let cache = try! SqliteNormalizedCache() - cache.merge(records: records) - self.init(cache: cache) - } - func publish(records: RecordSet, context: UnsafeMutableRawPointer? = nil) -> Promise { return Promise { fulfill, reject in queue.async(flags: .barrier) { From 3e7a0ee96af0ce381d58e46400d8ab61106ac72d Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 10 Apr 2017 18:28:56 -0700 Subject: [PATCH 23/76] Add a test to CachePersistenceTests, verifying that a query response is cached in a persistent way --- .../ApolloExample.xcodeproj/project.pbxproj | 8 ++-- .../ApolloTests/CachePersistenceTests.swift | 43 +++++++++++++++++++ .../SqliteNormalizedCacheTests.swift | 6 --- Example/ApolloTests/Utilities.swift | 15 ++++--- .../AppIcon.appiconset/Contents.json | 25 +++++++++++ 5 files changed, 81 insertions(+), 16 deletions(-) create mode 100644 Example/ApolloTests/CachePersistenceTests.swift delete mode 100644 Example/ApolloTests/SqliteNormalizedCacheTests.swift diff --git a/Example/ApolloExample.xcodeproj/project.pbxproj b/Example/ApolloExample.xcodeproj/project.pbxproj index 562c7a5666..8251e2bee6 100644 --- a/Example/ApolloExample.xcodeproj/project.pbxproj +++ b/Example/ApolloExample.xcodeproj/project.pbxproj @@ -9,7 +9,7 @@ /* Begin PBXBuildFile section */ 18CAED8E9CA518A8387C31B5 /* Pods_ApolloTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 81EA39E0FF49825755B1B12F /* Pods_ApolloTests.framework */; }; 5454C0881E944FD400661138 /* StarWarsAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 5454C0861E944FD400661138 /* StarWarsAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 54B59A561E94828100EB1B2B /* SqliteNormalizedCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54B59A551E94828100EB1B2B /* SqliteNormalizedCacheTests.swift */; }; + 54B59A561E94828100EB1B2B /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54B59A551E94828100EB1B2B /* CachePersistenceTests.swift */; }; 54E966D41E9447F7002884AD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E966D31E9447F7002884AD /* AppDelegate.swift */; }; 54E966D61E9447F7002884AD /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E966D51E9447F7002884AD /* ViewController.swift */; }; 54E966D91E9447F7002884AD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 54E966D71E9447F7002884AD /* Main.storyboard */; }; @@ -99,7 +99,7 @@ 5454C0841E944FD400661138 /* StarWarsAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = StarWarsAPI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 5454C0861E944FD400661138 /* StarWarsAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StarWarsAPI.h; sourceTree = ""; }; 5454C0871E944FD400661138 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 54B59A551E94828100EB1B2B /* SqliteNormalizedCacheTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCacheTests.swift; sourceTree = ""; }; + 54B59A551E94828100EB1B2B /* CachePersistenceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachePersistenceTests.swift; sourceTree = ""; }; 54E966D01E9447F7002884AD /* ApolloExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ApolloExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 54E966D31E9447F7002884AD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 54E966D51E9447F7002884AD /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -286,7 +286,7 @@ 54FFC82C1E9478A300C72D16 /* NormalizeQueryResults.swift */, 54FFC82D1E9478A300C72D16 /* ParseQueryResponseTests.swift */, 54FFC82E1E9478A300C72D16 /* PromiseTests.swift */, - 54B59A551E94828100EB1B2B /* SqliteNormalizedCacheTests.swift */, + 54B59A551E94828100EB1B2B /* CachePersistenceTests.swift */, 54FFC82F1E9478A300C72D16 /* StarWarsServerCachingRoundtripTests.swift */, 54FFC8301E9478A300C72D16 /* StarWarsServerTests.swift */, 54FFC8311E9478A300C72D16 /* StoreTransactionTests.swift */, @@ -784,7 +784,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 54B59A561E94828100EB1B2B /* SqliteNormalizedCacheTests.swift in Sources */, + 54B59A561E94828100EB1B2B /* CachePersistenceTests.swift in Sources */, 54FFC8361E9478A300C72D16 /* DataLoaderTests.swift in Sources */, 54FFC8381E9478A300C72D16 /* GraphQLExecutorFieldValueTests.swift in Sources */, 54FFC83D1E9478A300C72D16 /* ParseQueryResponseTests.swift in Sources */, diff --git a/Example/ApolloTests/CachePersistenceTests.swift b/Example/ApolloTests/CachePersistenceTests.swift new file mode 100644 index 0000000000..70066eb1f5 --- /dev/null +++ b/Example/ApolloTests/CachePersistenceTests.swift @@ -0,0 +1,43 @@ +import XCTest +@testable import Apollo +import StarWarsAPI + +class CachePersistenceTests: XCTestCase { + + func testFetchAndPersist() { + let query = HeroNameQuery() + + withSqliteCache { (cache) in + let store = ApolloStore(cache: cache) + let networkTransport = MockNetworkTransport(body: [ + "data": [ + "hero": [ + "name": "Luke Skywalker", + "__typename": "Human" + ] + ] + ]) + let client = ApolloClient(networkTransport: networkTransport, store: store) + + let networkExpectation = self.expectation(description: "Fetching query from network") + let newCacheExpectation = self.expectation(description: "Fetch query from new cache") + + client.fetch(query: query, cachePolicy: .fetchIgnoringCacheData) { (result, error) in + defer { networkExpectation.fulfill() } + guard let result = result else { XCTFail("No query result"); return } + XCTAssertEqual(result.data?.hero?.name, "Luke Skywalker") + + let newCache = try! SqliteNormalizedCache(fileURL: sqliteFileURL) + let newStore = ApolloStore(cache: newCache) + let newClient = ApolloClient(networkTransport: networkTransport, store: newStore) + newClient.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in + defer { newCacheExpectation.fulfill() } + guard let result = result else { XCTFail("No query result"); return } + XCTAssertEqual(result.data?.hero?.name, "Luke Skywalker") + _ = newClient // Workaround for a bug - ensure that newClient is retained until this block is run + } + } + self.waitForExpectations(timeout: 1, handler: nil) + } + } +} diff --git a/Example/ApolloTests/SqliteNormalizedCacheTests.swift b/Example/ApolloTests/SqliteNormalizedCacheTests.swift deleted file mode 100644 index a0fa200b64..0000000000 --- a/Example/ApolloTests/SqliteNormalizedCacheTests.swift +++ /dev/null @@ -1,6 +0,0 @@ -import XCTest -@testable import Apollo -import StarWarsAPI - -class SqliteNormalizedCacheTests: XCTestCase { -} diff --git a/Example/ApolloTests/Utilities.swift b/Example/ApolloTests/Utilities.swift index 51aba91502..0dc92c4f3f 100644 --- a/Example/ApolloTests/Utilities.swift +++ b/Example/ApolloTests/Utilities.swift @@ -70,17 +70,20 @@ public func withEachCacheType(initialRecords: RecordSet? = nil, test: (Normalize withSqliteCache(initialRecords: initialRecords, test: test) } -private func withInMemoryCache(initialRecords: RecordSet? = nil, test: (NormalizedCache) -> Void) { +public func withInMemoryCache(initialRecords: RecordSet? = nil, test: (NormalizedCache) -> Void) { test(InMemoryNormalizedCache(records: initialRecords ?? RecordSet())) } -private func withSqliteCache(initialRecords: RecordSet? = nil, test: (NormalizedCache) -> Void) { - let docDirURL = URL(fileURLWithPath:NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!) - let dbURL = docDirURL.appendingPathComponent("db.sqlite3") - try? FileManager.default.removeItem(at: dbURL) - let cache = try! SqliteNormalizedCache(fileURL: dbURL) +public func withSqliteCache(initialRecords: RecordSet? = nil, test: (NormalizedCache) -> Void) { + try? FileManager.default.removeItem(at: sqliteFileURL) + let cache = try! SqliteNormalizedCache(fileURL: sqliteFileURL) if let initialRecords = initialRecords { _ = cache.merge(records: initialRecords) // This is synchronous } test(cache) } + +public var sqliteFileURL: URL { + let docDirURL = URL(fileURLWithPath:NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!) + return docDirURL.appendingPathComponent("db.sqlite3") +} diff --git a/Example/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json index 36d2c80d88..1d060ed288 100644 --- a/Example/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Example/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", @@ -30,6 +40,16 @@ "size" : "60x60", "scale" : "3x" }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, { "idiom" : "ipad", "size" : "29x29", @@ -59,6 +79,11 @@ "idiom" : "ipad", "size" : "76x76", "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" } ], "info" : { From 5245bf89e6d5575b8a5228f87fa42df2bddee305 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 10 Apr 2017 23:04:57 -0700 Subject: [PATCH 24/76] Add SqliteNormalizedCache subspec (which is not supported on tvos) --- Apollo.podspec | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Apollo.podspec b/Apollo.podspec index 80d3e40c00..a423110e9c 100644 --- a/Apollo.podspec +++ b/Apollo.podspec @@ -19,5 +19,10 @@ Pod::Spec.new do |s| s.source_files = 'Sources/**/*.swift' s.resource = 'scripts/check-and-run-apollo-codegen.sh' - s.dependency 'SQLite.swift', '~> 0.11' + s.subspec 'SqliteNormalizedCache' do |ss| + ss.platform = :ios, :osx + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + ss.dependency 'SQLite.swift', '~> 0.11' + end end From da1f9e7a70643bba4dd481e8daa4b13acc76c830 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 10 Apr 2017 23:35:21 -0700 Subject: [PATCH 25/76] =?UTF-8?q?Make=20=E2=80=9CApolloExample=E2=80=9D=20?= =?UTF-8?q?and=20=E2=80=9CTestHost=20iOS=E2=80=9D=20shared=20schemes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xcschemes/ApolloExample.xcscheme | 111 ++++++++++++++++++ .../xcschemes/TestHost iOS.xcscheme | 101 ++++++++++++++++ 2 files changed, 212 insertions(+) create mode 100644 Example/ApolloExample.xcodeproj/xcshareddata/xcschemes/ApolloExample.xcscheme create mode 100644 Example/ApolloExample.xcodeproj/xcshareddata/xcschemes/TestHost iOS.xcscheme diff --git a/Example/ApolloExample.xcodeproj/xcshareddata/xcschemes/ApolloExample.xcscheme b/Example/ApolloExample.xcodeproj/xcshareddata/xcschemes/ApolloExample.xcscheme new file mode 100644 index 0000000000..4eb74c1f6a --- /dev/null +++ b/Example/ApolloExample.xcodeproj/xcshareddata/xcschemes/ApolloExample.xcscheme @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/ApolloExample.xcodeproj/xcshareddata/xcschemes/TestHost iOS.xcscheme b/Example/ApolloExample.xcodeproj/xcshareddata/xcschemes/TestHost iOS.xcscheme new file mode 100644 index 0000000000..a0575322c6 --- /dev/null +++ b/Example/ApolloExample.xcodeproj/xcshareddata/xcschemes/TestHost iOS.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From b802c7b8ad2be2500d3bd938c03322a6dca85ed1 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 10 Apr 2017 23:49:22 -0700 Subject: [PATCH 26/76] Move SqliteNormalizedCache file into subspec --- Apollo.podspec | 3 +- Example/Podfile.lock | 4 +- .../Pods/Local Podspecs/Apollo.podspec.json | 22 +- Example/Pods/Manifest.lock | 4 +- Example/Pods/Pods.xcodeproj/project.pbxproj | 318 ++++++++++-------- .../SqliteNormalizedCache.swift | 0 6 files changed, 196 insertions(+), 155 deletions(-) rename Sources/{ => SqliteNormalizedCache}/SqliteNormalizedCache.swift (100%) diff --git a/Apollo.podspec b/Apollo.podspec index a423110e9c..82ad1047fb 100644 --- a/Apollo.podspec +++ b/Apollo.podspec @@ -16,11 +16,12 @@ Pod::Spec.new do |s| s.tvos.deployment_target = '9.0' s.osx.deployment_target = '10.10' - s.source_files = 'Sources/**/*.swift' + s.source_files = 'Sources/*.swift' s.resource = 'scripts/check-and-run-apollo-codegen.sh' s.subspec 'SqliteNormalizedCache' do |ss| ss.platform = :ios, :osx + ss.source_files = "Sources/SqliteNormalizedCache/*.swift" ss.ios.deployment_target = '8.0' ss.osx.deployment_target = '10.10' ss.dependency 'SQLite.swift', '~> 0.11' diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 8cfc68a3cf..8746c80f4e 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,5 +1,7 @@ PODS: - Apollo (0.5.6): + - Apollo/SqliteNormalizedCache (= 0.5.6) + - Apollo/SqliteNormalizedCache (0.5.6): - SQLite.swift (~> 0.11) - SQLite.swift (0.11.2): - SQLite.swift/standard (= 0.11.2) @@ -13,7 +15,7 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - Apollo: 6ced3e5ebf99730856f5c3643eb2cfe781d719b1 + Apollo: f119dae7a0a9c09cd7aa133152066f05e7f77225 SQLite.swift: 670c3e9e0a806bbfd56a3de5d530768dc0e6fe7c PODFILE CHECKSUM: 9bd64f1e501820f8e5f1371c1e93f80107c6bb1f diff --git a/Example/Pods/Local Podspecs/Apollo.podspec.json b/Example/Pods/Local Podspecs/Apollo.podspec.json index 5153430f8f..3e6a3a2bd1 100644 --- a/Example/Pods/Local Podspecs/Apollo.podspec.json +++ b/Example/Pods/Local Podspecs/Apollo.podspec.json @@ -18,11 +18,21 @@ "tvos": "9.0", "osx": "10.10" }, - "source_files": "Sources/**/*.swift", + "source_files": "Sources/*.swift", "resources": "scripts/check-and-run-apollo-codegen.sh", - "dependencies": { - "SQLite.swift": [ - "~> 0.11" - ] - } + "subspecs": [ + { + "name": "SqliteNormalizedCache", + "platforms": { + "ios": "8.0", + "osx": "10.10" + }, + "source_files": "Sources/SqliteNormalizedCache/*.swift", + "dependencies": { + "SQLite.swift": [ + "~> 0.11" + ] + } + } + ] } diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index 8cfc68a3cf..8746c80f4e 100644 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -1,5 +1,7 @@ PODS: - Apollo (0.5.6): + - Apollo/SqliteNormalizedCache (= 0.5.6) + - Apollo/SqliteNormalizedCache (0.5.6): - SQLite.swift (~> 0.11) - SQLite.swift (0.11.2): - SQLite.swift/standard (= 0.11.2) @@ -13,7 +15,7 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - Apollo: 6ced3e5ebf99730856f5c3643eb2cfe781d719b1 + Apollo: f119dae7a0a9c09cd7aa133152066f05e7f77225 SQLite.swift: 670c3e9e0a806bbfd56a3de5d530768dc0e6fe7c PODFILE CHECKSUM: 9bd64f1e501820f8e5f1371c1e93f80107c6bb1f diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 519a2c3f69..33f97195af 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -7,82 +7,82 @@ objects = { /* Begin PBXBuildFile section */ - 01CD0AAF59D458AC3EF2601332DC362C /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A8AF61E57D939C975D9A6B03DF50CC7 /* SqliteNormalizedCache.swift */; }; + 01CD0AAF59D458AC3EF2601332DC362C /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5900DA33E216DB7A1CCDB272F1B0CFE /* SqliteNormalizedCache.swift */; }; 108A1CBD5D0C9FC34DD2B5C2B8DD0E1F /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF98B7BBADF63A0AF80D7829FA6F77B9 /* Schema.swift */; }; 1105737F12067068DF24A2FD70FC93A3 /* Pods-ApolloPerformanceTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 975269A36A5CF422A22E5D5DA93EAB28 /* Pods-ApolloPerformanceTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11D8F132B7F8704E64825695F6B0DC91 /* fts3_tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5AE2EFBEFDE20C4DDD8B3398D8AE5AE8 /* fts3_tokenizer.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 1569991C9A095D1FCE6B235BD63B51A4 /* Apollo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B5C756BCE1977B310FBCDFC81E7CB726 /* Apollo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1569991C9A095D1FCE6B235BD63B51A4 /* Apollo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FCEE66B62EAC19AF05896543B1CC20DB /* Apollo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15E73F1CED9B85C8E03C6134581D2ED0 /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60FAE93532FD5578A02AF3CC523A3408 /* CoreFunctions.swift */; }; 16822C933B2ADA1EA5F2EB694F3DA728 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; - 20C306F7AA685281AAEADDEF70FE27B4 /* Record.swift in Sources */ = {isa = PBXBuildFile; fileRef = 616AA09AE6625A279D08C4E95BBF8FAF /* Record.swift */; }; + 20C306F7AA685281AAEADDEF70FE27B4 /* Record.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32ADDCAC7A45EFB20A30DA69CF38976B /* Record.swift */; }; 2232C53C6D807D0DA97BBB9E4523412C /* Pods-ApolloPerformanceTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E664068C762C5F1811AB06C5856E5BC7 /* Pods-ApolloPerformanceTests-dummy.m */; }; - 24401D6F94D534811685D1F542F93892 /* GraphQLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95684FC3AB25B49063D525A7C78F0B17 /* GraphQLResponse.swift */; }; - 2650B6BD41F1BDFF5A15F9C4C8E61A37 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35069E56A5D5D4923A18BA7A092E73D4 /* Utilities.swift */; }; - 2664C21FA05281B3AEC72F71EA44028A /* Collections.swift in Sources */ = {isa = PBXBuildFile; fileRef = A918C3B2E22CB999534D187039A4D52A /* Collections.swift */; }; - 2C64BE3142AB8955A8F1B7ED8C4AC1FD /* AsynchronousOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A5D8EED2099F4E9AC37C5EC2D95A738 /* AsynchronousOperation.swift */; }; + 24401D6F94D534811685D1F542F93892 /* GraphQLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABD0FB59CA8C02E9DFE2C186DF8A6AB2 /* GraphQLResponse.swift */; }; + 2650B6BD41F1BDFF5A15F9C4C8E61A37 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BF7A27967561797D7548C7F8496B176 /* Utilities.swift */; }; + 2664C21FA05281B3AEC72F71EA44028A /* Collections.swift in Sources */ = {isa = PBXBuildFile; fileRef = E65505F835204A94A5D03AB3FA68B1D3 /* Collections.swift */; }; + 2C64BE3142AB8955A8F1B7ED8C4AC1FD /* AsynchronousOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6231A3C03C676AA5C3645BE51E42184 /* AsynchronousOperation.swift */; }; 30382E91D15E7ED4E930564DE86EAF27 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44EE37E8BF436A90A9C40AD27A182DB2 /* Expression.swift */; }; 3046B5C2E5FFE5A008023E939500A575 /* Pods-StarWarsAPI-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 179109F8B259422432C0355515576040 /* Pods-StarWarsAPI-dummy.m */; }; 3401D945C9C21F03B6E5100F26DF231C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; 35E5EEDB90225D140DCA57800CD5A2CD /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23E934E5F923C9742E63347D5512C322 /* AggregateFunctions.swift */; }; - 3D85E3F5AB73653A962BCF09ED74A8C0 /* JSONSerializationFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30DAD61D66BBDE6441131A52D95BDB04 /* JSONSerializationFormat.swift */; }; + 3D85E3F5AB73653A962BCF09ED74A8C0 /* JSONSerializationFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5187F20FDC2CCB00F92F8634B15C62C /* JSONSerializationFormat.swift */; }; 3EB8845BB3EB8B7E031BCA86CEC2F0D2 /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B4C8E0D8DB99B4482E2549FEAE620B8 /* FTS5.swift */; }; - 3EEC07CDEFE2204C5CFC1E1B10B6537F /* GraphQLResultNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF17E380BFA697F14018DED6126C8AC8 /* GraphQLResultNormalizer.swift */; }; + 3EEC07CDEFE2204C5CFC1E1B10B6537F /* GraphQLResultNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC35D07889D7B7A9717D60C50C0649BF /* GraphQLResultNormalizer.swift */; }; 415B7E98D356AE4B47C6FD5D11E11C99 /* Pods-ApolloExample-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F2AA223F544DC4835618D4D4A2FAA05 /* Pods-ApolloExample-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 42F81544370E1853391B67D56656A0C3 /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348491EAD9C18B0EEB2E855815254774 /* CustomFunctions.swift */; }; 44C82D3863ECC8C395C961C46C2F756B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; 47628EC1F1DDCC60DF83EA01A277919E /* SQLite-Bridging.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E070D9E44393CD520D0B1AF87A6736D /* SQLite-Bridging.m */; }; - 47B4F5C1BFB40746F552A6D5CE482DC3 /* Locking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9090E10380883B7CA79EE41C691650F7 /* Locking.swift */; }; + 47B4F5C1BFB40746F552A6D5CE482DC3 /* Locking.swift in Sources */ = {isa = PBXBuildFile; fileRef = B149332CA02057A2C99DAD2391F92FB0 /* Locking.swift */; }; 49876A987CA44C386457D31880AE1BD6 /* SQLite.swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 27B2D491F0A9B062233011B873DC118C /* SQLite.swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A23CC3D6A3579C9F12AE00384A7A4F3 /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F331ABE5223829EDFFC088184DFA981 /* RTree.swift */; }; - 4DCCD02DB715AC161B0774E0C137353E /* NetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42BBD89CF65425C4A9DD8F6390DF859D /* NetworkTransport.swift */; }; + 4DCCD02DB715AC161B0774E0C137353E /* NetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FB067970EBEEE32B9F9B8CF8FA457C9 /* NetworkTransport.swift */; }; 4FFB64EBCE34E07A60C74F1957B34A7B /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FCCE88ECC9D892349AB6CB3160246D9 /* Query.swift */; }; 54050A3940A7AAF2A4166F6B4027F1D0 /* Pods-StarWarsAPI-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 03D7BFAC37C274E39C5162127AEB6199 /* Pods-StarWarsAPI-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 54CFD21E9012A2554410D08EF63E42CB /* ApolloClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B42D8D8A4E18179F37824F2695F75F3 /* ApolloClient.swift */; }; + 54CFD21E9012A2554410D08EF63E42CB /* ApolloClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B785FCECF6FFA0348FE3961AFDC5C0AF /* ApolloClient.swift */; }; 5C154FC66B0272E926E740EB0D5DDF3E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; 6263A24701DED2E7A447C0313C7C555D /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA7CCC1A073BC5540EA969CA71F0C552 /* Setter.swift */; }; 636C2473106673D1432A22A0B7D6A2C9 /* Pods-ApolloExample-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FD2E12182B5FA8C0EC9565A13BB8D01 /* Pods-ApolloExample-dummy.m */; }; 63D650CA310911FBCB77C3E6229330A7 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = B88C5FD0C85A5AE4583CC7DB512E6820 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6C5A957F0E47791FFA662827ADBA67A9 /* GraphQLResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB17F37738DF3903DEB18A03BAA3C0D8 /* GraphQLResult.swift */; }; - 6CC6B8EEDAA285718533CC1482D13B61 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = E993F928AC8B4275D32665A6205AE456 /* Result.swift */; }; - 6F378D7233AC3E51B00DB180BF8D6066 /* Selections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F3DE78C37EE122AA21BA986A77BB162 /* Selections.swift */; }; - 6FCDA3222BB1A7CADC500C19CA4A6611 /* check-and-run-apollo-codegen.sh in Resources */ = {isa = PBXBuildFile; fileRef = 872EA0E9B1EC6684546BEFF234C61E6E /* check-and-run-apollo-codegen.sh */; }; - 77E05C7059DFD498C2B323C3A707C0E8 /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 078C996EB71DC4EA36311067B6D81A3E /* Promise.swift */; }; - 787BB17CD95328B14A766F6BC04D2148 /* HTTPNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D40A77826E6FE48F27E93C4A66DD9C /* HTTPNetworkTransport.swift */; }; - 7FF4749CC9A33C7B79FE51E0962A4E8A /* Dictionary+KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FA62E20AC29F9ECA17CDE346F83E445 /* Dictionary+KeyPath.swift */; }; - 853B5034825B85498FE7857957760849 /* NormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED6DD22A402D834518D62E49A6D34114 /* NormalizedCache.swift */; }; + 6C5A957F0E47791FFA662827ADBA67A9 /* GraphQLResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74920BE3F88237C4C3DDA76227BDF2E1 /* GraphQLResult.swift */; }; + 6CC6B8EEDAA285718533CC1482D13B61 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53166497143EB24EE51313830B0378AA /* Result.swift */; }; + 6F378D7233AC3E51B00DB180BF8D6066 /* Selections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9F12AB5DA3FD3FAB850FD3819EBD3D /* Selections.swift */; }; + 6FCDA3222BB1A7CADC500C19CA4A6611 /* check-and-run-apollo-codegen.sh in Resources */ = {isa = PBXBuildFile; fileRef = C1365465663268B61753BF27B647DA39 /* check-and-run-apollo-codegen.sh */; }; + 77E05C7059DFD498C2B323C3A707C0E8 /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 715E2F902F7A750814E054D46287C284 /* Promise.swift */; }; + 787BB17CD95328B14A766F6BC04D2148 /* HTTPNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F59A34F6FBBC01495FA0EEFC7CFF5A1 /* HTTPNetworkTransport.swift */; }; + 7FF4749CC9A33C7B79FE51E0962A4E8A /* Dictionary+KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 941EEC1220197E2B07C634E14D4E319E /* Dictionary+KeyPath.swift */; }; + 853B5034825B85498FE7857957760849 /* NormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD0B42CB8E4BF2A6661253EFD4F57F6 /* NormalizedCache.swift */; }; 87109E7659BAF278C52455C1D6529DF6 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DE06F129836BA95B0BE2222991D2BD0 /* Value.swift */; }; - 8916D47EB3F95315F2020922A6130D8D /* GraphQLExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 909F358C8C8DF9392766416B86EACE63 /* GraphQLExecutor.swift */; }; - 8D2A9E5942209EC7EAE309C3BDEC344E /* GraphQLQueryWatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0324BDEF4908733765A4E8909A7F10 /* GraphQLQueryWatcher.swift */; }; + 8916D47EB3F95315F2020922A6130D8D /* GraphQLExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBED715F438CFACC415B97B86CFD6422 /* GraphQLExecutor.swift */; }; + 8D2A9E5942209EC7EAE309C3BDEC344E /* GraphQLQueryWatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0411C56E0121FFBAE30473AE1E25AB56 /* GraphQLQueryWatcher.swift */; }; 94C4501EC15533C68551FCFD9896339D /* Pods-ApolloTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E12D36800035FA4AEBD5CCA0E467F5C2 /* Pods-ApolloTests-dummy.m */; }; 94ECE937BFDFCDBD700A107B1DC40CA9 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96600A78FEC066BF8931D7A58FBF0F16 /* Statement.swift */; }; 990D4881FF22A80867C475FB9823817A /* Pods-ApolloTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A750E6B16B43489DE32A5211D58F9FBA /* Pods-ApolloTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; A11B9C4B8DC4AF252BA2727D21A1EEF1 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7B7855DE178D22988512E88C68325BE /* Collation.swift */; }; A3FF4B5B363E91C3BE7FC3294C555032 /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E667D63233F61B551F3B93AF184020E0 /* Foundation.swift */; }; - A54DF0B95FE0DAD23D2A81D408683D03 /* DataLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 180A54E2C9EAC29BCD0767F9CF54EB79 /* DataLoader.swift */; }; + A54DF0B95FE0DAD23D2A81D408683D03 /* DataLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = D80C65010D5FF9DA75FE564B3B16DE81 /* DataLoader.swift */; }; A60D999F6C5C2A7030430FBB2644A85D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; AB1840F1E49F6C17A8A12662445629C3 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDA86AD441076D928D0621530CD5E745 /* Operators.swift */; }; - AC87CC13FC22BD408AA235121C216C85 /* ApolloStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6962E4B167BCDE8CACFF3DC269212EE7 /* ApolloStore.swift */; }; + AC87CC13FC22BD408AA235121C216C85 /* ApolloStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D1BCE14534E37F1E56DA924CE5D2621 /* ApolloStore.swift */; }; AFC4EF684AAE208082F88A746E8799D5 /* SQLite-Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = AF7F8DDFC50FE6ACA57F6A16E253F8DC /* SQLite-Bridging.h */; settings = {ATTRIBUTES = (Public, ); }; }; B27809FB8835D7719B0AD7337D908431 /* SQLite.swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D30459F9DC30876AF6C299D26C7CE48 /* SQLite.swift-dummy.m */; }; B6F6F22A0B59D1A386C7AC19789B74C0 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB44F0C85553660857F351B59660E399 /* SQLite.framework */; }; - B8354678757BF7E72C8E638F8FD096ED /* JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = A72488E3CB82621BCD287255DE4F91E6 /* JSON.swift */; }; - B948E00EC8119CFD8B9E55DBBDA5A4E3 /* GraphQLOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37BFA28F22BF54064B21348557B64BD3 /* GraphQLOperation.swift */; }; - BA32663AD51B09E7997DD5871D7FE383 /* GraphQLDependencyTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 399B342ADA72E237E0EBF1EEAA28FB25 /* GraphQLDependencyTracker.swift */; }; + B8354678757BF7E72C8E638F8FD096ED /* JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFA61605E0CF60C23447BD3645A7F6C6 /* JSON.swift */; }; + B948E00EC8119CFD8B9E55DBBDA5A4E3 /* GraphQLOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3A2B1238E9781F0C22EE5733626AB01 /* GraphQLOperation.swift */; }; + BA32663AD51B09E7997DD5871D7FE383 /* GraphQLDependencyTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3834589AEC46AFC5618EDEB84BFDDC67 /* GraphQLDependencyTracker.swift */; }; C02AE58DC3E78ACB817163011C7A6734 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 680617B7B3999D016982CD479DADCCB0 /* Blob.swift */; }; D850BB2A3E7B9A6AAEB54FA9A8B7AD4F /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCF813C6D3C0824E1BCFDACADE6109F5 /* Connection.swift */; }; - D99283BAF5F146D362611679A5ED1A5D /* Apollo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E5BB833C4CF9D696FCF839FB705C1A91 /* Apollo-dummy.m */; }; - DA0CEB1E0989DCA89796ABDF7267A7B0 /* InMemoryNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA52A0176DDC85E070F4BA3E088EDF79 /* InMemoryNormalizedCache.swift */; }; + D99283BAF5F146D362611679A5ED1A5D /* Apollo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A30E06FEAB733A1938FDAA6CB0C7CAF4 /* Apollo-dummy.m */; }; + DA0CEB1E0989DCA89796ABDF7267A7B0 /* InMemoryNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 503243847991ECCB90434FCB18B8113B /* InMemoryNormalizedCache.swift */; }; DD139C21BC1B51C5078B8F9C2F55D0A3 /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7A99896DB5D793228657B5F5EC525DA /* FTS4.swift */; }; - E13D7AA4EFBA1345BDC2E05B4BD67F2A /* GraphQLError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74015506E81FA3C19EB6D906D81024AB /* GraphQLError.swift */; }; - E2D3B028353BC0FA74DA8536C717B9E4 /* GraphQLValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23BAD010DBCF8C2B764B7E2E9895805 /* GraphQLValues.swift */; }; - EB775615489CE36C2D86C4EB279F3FF5 /* GraphQLResultMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5BED4FF18AC316194A81FD5C33ED9C5 /* GraphQLResultMapper.swift */; }; - EEA27311E6D18D94F27E12D2F0BE7BF0 /* GraphQLOutputType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82A2AD2C9998545CA1776374D0EB8D35 /* GraphQLOutputType.swift */; }; - F0EF5885BD48A9B939F3FF9C1DC1A965 /* GraphQLResultAccumulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C326DB4844A6FBD86CFBA30BDD08DB6 /* GraphQLResultAccumulator.swift */; }; - F4DAAE8A4DF58A14A2B8A6272ED102C7 /* RecordSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB35A20B8A16FA8E837FAEA496B53CBE /* RecordSet.swift */; }; - F86D649610E4878DE71D25AA9CC614A2 /* JSONStandardTypeConversions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E1F6997F619DB12A60F7EA5B8005190 /* JSONStandardTypeConversions.swift */; }; + E13D7AA4EFBA1345BDC2E05B4BD67F2A /* GraphQLError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 974545E3C8A36D55A3FD3DCC46166F6D /* GraphQLError.swift */; }; + E2D3B028353BC0FA74DA8536C717B9E4 /* GraphQLValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = C070371DEFF116F4E1181DE8DD58D0A9 /* GraphQLValues.swift */; }; + EB775615489CE36C2D86C4EB279F3FF5 /* GraphQLResultMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC36364F2001FAE110A5756E8B9B04B5 /* GraphQLResultMapper.swift */; }; + EEA27311E6D18D94F27E12D2F0BE7BF0 /* GraphQLOutputType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6476D8DF83CC5E44AC295CA811992A17 /* GraphQLOutputType.swift */; }; + F0EF5885BD48A9B939F3FF9C1DC1A965 /* GraphQLResultAccumulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAFC7CF56F4E8EFC98F4FE6FB20E6384 /* GraphQLResultAccumulator.swift */; }; + F4DAAE8A4DF58A14A2B8A6272ED102C7 /* RecordSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CBABBFA8407D460F35404C52E1C0C74 /* RecordSet.swift */; }; + F86D649610E4878DE71D25AA9CC614A2 /* JSONStandardTypeConversions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96B258D77C330EC72CA1F86CFADB9702 /* JSONStandardTypeConversions.swift */; }; FAB10CD9CFBBFB7DE9F271B434380C16 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; FDA57D0DA6CBE5083CAF08A8B2F86AC9 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2C5D76BD109C46DEC526A712FC4A8BB /* Helpers.swift */; }; - FF53DDD16D8FC3431D3F148AC7FD56CD /* GraphQLResponseGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7156C5037F2DC118EFF48E601858205 /* GraphQLResponseGenerator.swift */; }; + FF53DDD16D8FC3431D3F148AC7FD56CD /* GraphQLResponseGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BFE9722636C12702C05748430E53F78 /* GraphQLResponseGenerator.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -154,119 +154,119 @@ /* Begin PBXFileReference section */ 01C3FA9C5081FAF3B433C1CAC200835C /* Pods-ApolloPerformanceTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloPerformanceTests.debug.xcconfig"; sourceTree = ""; }; 03D7BFAC37C274E39C5162127AEB6199 /* Pods-StarWarsAPI-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-StarWarsAPI-umbrella.h"; sourceTree = ""; }; - 078C996EB71DC4EA36311067B6D81A3E /* Promise.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Promise.swift; sourceTree = ""; }; + 0411C56E0121FFBAE30473AE1E25AB56 /* GraphQLQueryWatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLQueryWatcher.swift; sourceTree = ""; }; 08674A30761B25CB7AE0CE4CFFBFF205 /* Pods-ApolloTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloTests.release.xcconfig"; sourceTree = ""; }; 0AB6C025AC773267F2034B391653AEF6 /* Pods-ApolloTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloTests.debug.xcconfig"; sourceTree = ""; }; + 0CBABBFA8407D460F35404C52E1C0C74 /* RecordSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RecordSet.swift; sourceTree = ""; }; 0E070D9E44393CD520D0B1AF87A6736D /* SQLite-Bridging.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "SQLite-Bridging.m"; path = "Sources/SQLiteObjc/SQLite-Bridging.m"; sourceTree = ""; }; 0F331ABE5223829EDFFC088184DFA981 /* RTree.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RTree.swift; path = Sources/SQLite/Extensions/RTree.swift; sourceTree = ""; }; 10FA3C1A5006EC52FC44C8EB07B5BDAE /* Pods-ApolloTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloTests.modulemap"; sourceTree = ""; }; + 1542AA29919683732D5C2CDAC80381BE /* Apollo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Apollo.modulemap; sourceTree = ""; }; 160F355101277829561FC9CDD0D3F16B /* Pods-ApolloPerformanceTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloPerformanceTests-frameworks.sh"; sourceTree = ""; }; 179109F8B259422432C0355515576040 /* Pods-StarWarsAPI-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-StarWarsAPI-dummy.m"; sourceTree = ""; }; - 180A54E2C9EAC29BCD0767F9CF54EB79 /* DataLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DataLoader.swift; sourceTree = ""; }; - 1A8AF61E57D939C975D9A6B03DF50CC7 /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCache.swift; sourceTree = ""; }; 1AD67889E8665E2406E38CC279A50DB7 /* Pods-ApolloPerformanceTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloPerformanceTests-resources.sh"; sourceTree = ""; }; 1D7DA9FB08FD2A913967F0D7996B8701 /* SQLite.swift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = SQLite.swift.modulemap; sourceTree = ""; }; 1EC3C1E6C3B57B46326B94BAB568B649 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1F4445F089281553CC23A453DBF203C7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1F59A34F6FBBC01495FA0EEFC7CFF5A1 /* HTTPNetworkTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HTTPNetworkTransport.swift; sourceTree = ""; }; 23E934E5F923C9742E63347D5512C322 /* AggregateFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AggregateFunctions.swift; path = Sources/SQLite/Typed/AggregateFunctions.swift; sourceTree = ""; }; 261B0C331D5E3A2F400B2EC0F77CC1F7 /* Pods_StarWarsAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_StarWarsAPI.framework; path = "Pods-StarWarsAPI.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 269A666530B42952FF00B5B4A1844F67 /* Apollo.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Apollo.xcconfig; sourceTree = ""; }; 27B2D491F0A9B062233011B873DC118C /* SQLite.swift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SQLite.swift-umbrella.h"; sourceTree = ""; }; + 2D1BCE14534E37F1E56DA924CE5D2621 /* ApolloStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ApolloStore.swift; sourceTree = ""; }; 2D30459F9DC30876AF6C299D26C7CE48 /* SQLite.swift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SQLite.swift-dummy.m"; sourceTree = ""; }; 2DE423399B21C05322619DF24D280234 /* Pods-StarWarsAPI.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StarWarsAPI.debug.xcconfig"; sourceTree = ""; }; - 2FA62E20AC29F9ECA17CDE346F83E445 /* Dictionary+KeyPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Dictionary+KeyPath.swift"; sourceTree = ""; }; - 2FF924421EAF21716DEF0AE07417770D /* Apollo-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Apollo-prefix.pch"; sourceTree = ""; }; - 30DAD61D66BBDE6441131A52D95BDB04 /* JSONSerializationFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSONSerializationFormat.swift; sourceTree = ""; }; + 2FB067970EBEEE32B9F9B8CF8FA457C9 /* NetworkTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NetworkTransport.swift; sourceTree = ""; }; + 32ADDCAC7A45EFB20A30DA69CF38976B /* Record.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Record.swift; sourceTree = ""; }; 348491EAD9C18B0EEB2E855815254774 /* CustomFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomFunctions.swift; path = Sources/SQLite/Typed/CustomFunctions.swift; sourceTree = ""; }; - 35069E56A5D5D4923A18BA7A092E73D4 /* Utilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; - 37BFA28F22BF54064B21348557B64BD3 /* GraphQLOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLOperation.swift; sourceTree = ""; }; - 399B342ADA72E237E0EBF1EEAA28FB25 /* GraphQLDependencyTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLDependencyTracker.swift; sourceTree = ""; }; - 3B42D8D8A4E18179F37824F2695F75F3 /* ApolloClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ApolloClient.swift; sourceTree = ""; }; - 3C0324BDEF4908733765A4E8909A7F10 /* GraphQLQueryWatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLQueryWatcher.swift; sourceTree = ""; }; + 3834589AEC46AFC5618EDEB84BFDDC67 /* GraphQLDependencyTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLDependencyTracker.swift; sourceTree = ""; }; 3C7116256A907933BD6C8D01B5E5D592 /* Pods-ApolloPerformanceTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloPerformanceTests.release.xcconfig"; sourceTree = ""; }; 3D54BDE67F2AF934CA35178FCC1165EB /* Pods-ApolloPerformanceTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloPerformanceTests-acknowledgements.markdown"; sourceTree = ""; }; 3F2AA223F544DC4835618D4D4A2FAA05 /* Pods-ApolloExample-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloExample-umbrella.h"; sourceTree = ""; }; 3FA13D59DC7D79809DCEF476848EAED0 /* Pods_ApolloExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloExample.framework; path = "Pods-ApolloExample.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 3FCCE88ECC9D892349AB6CB3160246D9 /* Query.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Query.swift; path = Sources/SQLite/Typed/Query.swift; sourceTree = ""; }; - 42BBD89CF65425C4A9DD8F6390DF859D /* NetworkTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NetworkTransport.swift; sourceTree = ""; }; 44EE37E8BF436A90A9C40AD27A182DB2 /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/SQLite/Typed/Expression.swift; sourceTree = ""; }; 4B4C8E0D8DB99B4482E2549FEAE620B8 /* FTS5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FTS5.swift; path = Sources/SQLite/Extensions/FTS5.swift; sourceTree = ""; }; - 4E1F6997F619DB12A60F7EA5B8005190 /* JSONStandardTypeConversions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSONStandardTypeConversions.swift; sourceTree = ""; }; + 4C9F12AB5DA3FD3FAB850FD3819EBD3D /* Selections.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Selections.swift; sourceTree = ""; }; + 503243847991ECCB90434FCB18B8113B /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; + 53166497143EB24EE51313830B0378AA /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; }; 550DCFFB3AF38FE48668B410DCC530D2 /* Pods-ApolloPerformanceTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloPerformanceTests.modulemap"; sourceTree = ""; }; 58EA58A33C79BB0F400C14494D1142CC /* Pods-ApolloTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloTests-frameworks.sh"; sourceTree = ""; }; 5AE2EFBEFDE20C4DDD8B3398D8AE5AE8 /* fts3_tokenizer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = fts3_tokenizer.h; path = Sources/SQLiteObjc/fts3_tokenizer.h; sourceTree = ""; }; 60FAE93532FD5578A02AF3CC523A3408 /* CoreFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CoreFunctions.swift; path = Sources/SQLite/Typed/CoreFunctions.swift; sourceTree = ""; }; - 616AA09AE6625A279D08C4E95BBF8FAF /* Record.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Record.swift; sourceTree = ""; }; + 6476D8DF83CC5E44AC295CA811992A17 /* GraphQLOutputType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLOutputType.swift; sourceTree = ""; }; 6690FA900A959073D6602DDA8B9B96FC /* Pods-StarWarsAPI-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-StarWarsAPI-acknowledgements.plist"; sourceTree = ""; }; 680617B7B3999D016982CD479DADCCB0 /* Blob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Blob.swift; path = Sources/SQLite/Core/Blob.swift; sourceTree = ""; }; - 6962E4B167BCDE8CACFF3DC269212EE7 /* ApolloStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ApolloStore.swift; sourceTree = ""; }; - 6C326DB4844A6FBD86CFBA30BDD08DB6 /* GraphQLResultAccumulator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultAccumulator.swift; sourceTree = ""; }; + 6B2FAE16B52E13F2255D8D8D439C1466 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 715E2F902F7A750814E054D46287C284 /* Promise.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Promise.swift; sourceTree = ""; }; 724B09788D59362DE110F9760831B30B /* Pods-StarWarsAPI.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StarWarsAPI.release.xcconfig"; sourceTree = ""; }; - 74015506E81FA3C19EB6D906D81024AB /* GraphQLError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLError.swift; sourceTree = ""; }; - 76D40A77826E6FE48F27E93C4A66DD9C /* HTTPNetworkTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HTTPNetworkTransport.swift; sourceTree = ""; }; - 7A5D8EED2099F4E9AC37C5EC2D95A738 /* AsynchronousOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AsynchronousOperation.swift; sourceTree = ""; }; + 74920BE3F88237C4C3DDA76227BDF2E1 /* GraphQLResult.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResult.swift; sourceTree = ""; }; 7AF34EB0D4F25CC4FBA1A60724BBC66A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 7ED2D87037EC2D5F09173EE9E979C813 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 7FD2E12182B5FA8C0EC9565A13BB8D01 /* Pods-ApolloExample-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloExample-dummy.m"; sourceTree = ""; }; - 82A2AD2C9998545CA1776374D0EB8D35 /* GraphQLOutputType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLOutputType.swift; sourceTree = ""; }; 8378EF5103C93E048B7DF8B41415FF63 /* Pods-ApolloExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExample.debug.xcconfig"; sourceTree = ""; }; - 872EA0E9B1EC6684546BEFF234C61E6E /* check-and-run-apollo-codegen.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "check-and-run-apollo-codegen.sh"; sourceTree = ""; }; 88BFCDC2C48A9AAC024D78C7786357F9 /* SQLite.swift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SQLite.swift.xcconfig; sourceTree = ""; }; + 8910258E5AD30319CA72E05B90C4AC6D /* Apollo.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Apollo.xcconfig; sourceTree = ""; }; 8AA0C69818598EB79B91BCA0BE698842 /* Pods-ApolloExample-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExample-frameworks.sh"; sourceTree = ""; }; + 8BF7A27967561797D7548C7F8496B176 /* Utilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; 8C1BB3B1629831A0860FA95DD624C9F4 /* Pods-ApolloTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloTests-acknowledgements.markdown"; sourceTree = ""; }; - 8F3DE78C37EE122AA21BA986A77BB162 /* Selections.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Selections.swift; sourceTree = ""; }; 904829AAE2B1DE6B6F2CE13CDD6EDE22 /* Pods-ApolloExample-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloExample-acknowledgements.plist"; sourceTree = ""; }; - 9090E10380883B7CA79EE41C691650F7 /* Locking.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Locking.swift; sourceTree = ""; }; - 909F358C8C8DF9392766416B86EACE63 /* GraphQLExecutor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLExecutor.swift; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 941EEC1220197E2B07C634E14D4E319E /* Dictionary+KeyPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Dictionary+KeyPath.swift"; sourceTree = ""; }; 949A295ACAD1338645F511B3B615304F /* Pods-StarWarsAPI.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-StarWarsAPI.modulemap"; sourceTree = ""; }; - 94D650A756B69071D262EFC78E0E69F0 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 95684FC3AB25B49063D525A7C78F0B17 /* GraphQLResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResponse.swift; sourceTree = ""; }; 96600A78FEC066BF8931D7A58FBF0F16 /* Statement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Statement.swift; path = Sources/SQLite/Core/Statement.swift; sourceTree = ""; }; + 96B258D77C330EC72CA1F86CFADB9702 /* JSONStandardTypeConversions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSONStandardTypeConversions.swift; sourceTree = ""; }; + 974545E3C8A36D55A3FD3DCC46166F6D /* GraphQLError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLError.swift; sourceTree = ""; }; 975269A36A5CF422A22E5D5DA93EAB28 /* Pods-ApolloPerformanceTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloPerformanceTests-umbrella.h"; sourceTree = ""; }; 9ADC492098AB1E55A5C9644F01624CA8 /* Pods-ApolloExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExample.release.xcconfig"; sourceTree = ""; }; + 9BFE9722636C12702C05748430E53F78 /* GraphQLResponseGenerator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResponseGenerator.swift; sourceTree = ""; }; 9DE06F129836BA95B0BE2222991D2BD0 /* Value.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Value.swift; path = Sources/SQLite/Core/Value.swift; sourceTree = ""; }; A2C5D76BD109C46DEC526A712FC4A8BB /* Helpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Helpers.swift; path = Sources/SQLite/Helpers.swift; sourceTree = ""; }; - A7156C5037F2DC118EFF48E601858205 /* GraphQLResponseGenerator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResponseGenerator.swift; sourceTree = ""; }; - A72488E3CB82621BCD287255DE4F91E6 /* JSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSON.swift; sourceTree = ""; }; + A30E06FEAB733A1938FDAA6CB0C7CAF4 /* Apollo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Apollo-dummy.m"; sourceTree = ""; }; + A5900DA33E216DB7A1CCDB272F1B0CFE /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCache.swift; sourceTree = ""; }; + A6231A3C03C676AA5C3645BE51E42184 /* AsynchronousOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AsynchronousOperation.swift; sourceTree = ""; }; A750E6B16B43489DE32A5211D58F9FBA /* Pods-ApolloTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloTests-umbrella.h"; sourceTree = ""; }; - A918C3B2E22CB999534D187039A4D52A /* Collections.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Collections.swift; sourceTree = ""; }; + AAFC7CF56F4E8EFC98F4FE6FB20E6384 /* GraphQLResultAccumulator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultAccumulator.swift; sourceTree = ""; }; + ABD0FB59CA8C02E9DFE2C186DF8A6AB2 /* GraphQLResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResponse.swift; sourceTree = ""; }; + AC36364F2001FAE110A5756E8B9B04B5 /* GraphQLResultMapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultMapper.swift; sourceTree = ""; }; AC7E77DE5E2272297487C6FDD2A16513 /* Pods-ApolloPerformanceTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloPerformanceTests-acknowledgements.plist"; sourceTree = ""; }; AF7F8DDFC50FE6ACA57F6A16E253F8DC /* SQLite-Bridging.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "SQLite-Bridging.h"; path = "Sources/SQLiteObjc/include/SQLite-Bridging.h"; sourceTree = ""; }; - B23BAD010DBCF8C2B764B7E2E9895805 /* GraphQLValues.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLValues.swift; sourceTree = ""; }; + B149332CA02057A2C99DAD2391F92FB0 /* Locking.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Locking.swift; sourceTree = ""; }; + B3A2B1238E9781F0C22EE5733626AB01 /* GraphQLOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLOperation.swift; sourceTree = ""; }; + B5187F20FDC2CCB00F92F8634B15C62C /* JSONSerializationFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSONSerializationFormat.swift; sourceTree = ""; }; B5A51A258D56CEEC8707C43B4CA66D57 /* Pods-ApolloTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloTests-acknowledgements.plist"; sourceTree = ""; }; - B5BED4FF18AC316194A81FD5C33ED9C5 /* GraphQLResultMapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultMapper.swift; sourceTree = ""; }; - B5C756BCE1977B310FBCDFC81E7CB726 /* Apollo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Apollo-umbrella.h"; sourceTree = ""; }; + B785FCECF6FFA0348FE3961AFDC5C0AF /* ApolloClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ApolloClient.swift; sourceTree = ""; }; B7A99896DB5D793228657B5F5EC525DA /* FTS4.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FTS4.swift; path = Sources/SQLite/Extensions/FTS4.swift; sourceTree = ""; }; B88C5FD0C85A5AE4583CC7DB512E6820 /* SQLite.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SQLite.h; path = Sources/SQLite/SQLite.h; sourceTree = ""; }; B9CA5768D35422C7387D78822AB2AA46 /* Pods-ApolloExample-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloExample-acknowledgements.markdown"; sourceTree = ""; }; - BA52A0176DDC85E070F4BA3E088EDF79 /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; - BB17F37738DF3903DEB18A03BAA3C0D8 /* GraphQLResult.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResult.swift; sourceTree = ""; }; BDA86AD441076D928D0621530CD5E745 /* Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operators.swift; path = Sources/SQLite/Typed/Operators.swift; sourceTree = ""; }; - BF17E380BFA697F14018DED6126C8AC8 /* GraphQLResultNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultNormalizer.swift; sourceTree = ""; }; + C070371DEFF116F4E1181DE8DD58D0A9 /* GraphQLValues.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLValues.swift; sourceTree = ""; }; C08D4B7E051B2878FD9A1DB195944C60 /* Pods_ApolloTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloTests.framework; path = "Pods-ApolloTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; C12EBB64588697C58EB83E3A1D147FA8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C1365465663268B61753BF27B647DA39 /* check-and-run-apollo-codegen.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "check-and-run-apollo-codegen.sh"; sourceTree = ""; }; C1FDE43D56FD01FEC6EC0EC50C96A22D /* Pods-ApolloExample.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloExample.modulemap"; sourceTree = ""; }; C97E29747EDD103755CD3BBB58DB0042 /* Pods_ApolloPerformanceTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloPerformanceTests.framework; path = "Pods-ApolloPerformanceTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; CA1C6F1BBEC2162E2BA5E756F9B77A2C /* Pods-ApolloTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloTests-resources.sh"; sourceTree = ""; }; CA3ED8D54211455DE25A4DA036694445 /* SQLite.swift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SQLite.swift-prefix.pch"; sourceTree = ""; }; - CB35A20B8A16FA8E837FAEA496B53CBE /* RecordSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RecordSet.swift; sourceTree = ""; }; CCF813C6D3C0824E1BCFDACADE6109F5 /* Connection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Connection.swift; path = Sources/SQLite/Core/Connection.swift; sourceTree = ""; }; CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; D7B7855DE178D22988512E88C68325BE /* Collation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Collation.swift; path = Sources/SQLite/Typed/Collation.swift; sourceTree = ""; }; + D80C65010D5FF9DA75FE564B3B16DE81 /* DataLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DataLoader.swift; sourceTree = ""; }; DA7CCC1A073BC5540EA969CA71F0C552 /* Setter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Setter.swift; path = Sources/SQLite/Typed/Setter.swift; sourceTree = ""; }; DB44F0C85553660857F351B59660E399 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DBD0B42CB8E4BF2A6661253EFD4F57F6 /* NormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NormalizedCache.swift; sourceTree = ""; }; + DED7DCCFD5741991CA593441684AF181 /* Apollo-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Apollo-prefix.pch"; sourceTree = ""; }; + DFA61605E0CF60C23447BD3645A7F6C6 /* JSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSON.swift; sourceTree = ""; }; E12D36800035FA4AEBD5CCA0E467F5C2 /* Pods-ApolloTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloTests-dummy.m"; sourceTree = ""; }; E4C251316F1350DC62A6C4843F9E8DAC /* Pods-StarWarsAPI-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-StarWarsAPI-acknowledgements.markdown"; sourceTree = ""; }; E4DDFDE7D66D82B6084F70FC8DE5F14D /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SQLite.framework; path = SQLite.swift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E5BB833C4CF9D696FCF839FB705C1A91 /* Apollo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Apollo-dummy.m"; sourceTree = ""; }; + E65505F835204A94A5D03AB3FA68B1D3 /* Collections.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Collections.swift; sourceTree = ""; }; E664068C762C5F1811AB06C5856E5BC7 /* Pods-ApolloPerformanceTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloPerformanceTests-dummy.m"; sourceTree = ""; }; E667D63233F61B551F3B93AF184020E0 /* Foundation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Foundation.swift; path = Sources/SQLite/Foundation.swift; sourceTree = ""; }; - E993F928AC8B4275D32665A6205AE456 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; }; - ED6DD22A402D834518D62E49A6D34114 /* NormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NormalizedCache.swift; sourceTree = ""; }; + EBED715F438CFACC415B97B86CFD6422 /* GraphQLExecutor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLExecutor.swift; sourceTree = ""; }; F4E94D9B3A51997F835199160D3A6204 /* Apollo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Apollo.framework; path = Apollo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F7AB6C9064A19E5E00C2C7B6CF7D38DD /* Apollo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Apollo.modulemap; sourceTree = ""; }; + FC35D07889D7B7A9717D60C50C0649BF /* GraphQLResultNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultNormalizer.swift; sourceTree = ""; }; FC7AB7465546FD30A69F21B534830CF6 /* Pods-ApolloExample-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExample-resources.sh"; sourceTree = ""; }; + FCEE66B62EAC19AF05896543B1CC20DB /* Apollo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Apollo-umbrella.h"; sourceTree = ""; }; FF72FDA919EE62C2297D3C1EF8E50F18 /* Pods-StarWarsAPI-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-StarWarsAPI-resources.sh"; sourceTree = ""; }; FF98B7BBADF63A0AF80D7829FA6F77B9 /* Schema.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Schema.swift; path = Sources/SQLite/Typed/Schema.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -324,6 +324,31 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 035B096F07B7DC66E76DA60E02CC4F2A /* Sources */ = { + isa = PBXGroup; + children = ( + 7D4C8FC23C42C3AE0AED166522F344E4 /* SqliteNormalizedCache */, + ); + name = Sources; + path = Sources; + sourceTree = ""; + }; + 036E276F1B88E1EA4E926674B067BEAF /* Resources */ = { + isa = PBXGroup; + children = ( + 336DEC5C1518FB1515B412820E1B8EBB /* scripts */, + ); + name = Resources; + sourceTree = ""; + }; + 0780AE62F17E1B780D8C4170D5F2E768 /* Development Pods */ = { + isa = PBXGroup; + children = ( + 84AAC42334BA0A537FA21127F98BCE42 /* Apollo */, + ); + name = "Development Pods"; + sourceTree = ""; + }; 0874F9F078F1BB1E246AE7183E7C233E /* Pods-ApolloTests */ = { isa = PBXGroup; children = ( @@ -365,12 +390,13 @@ name = Frameworks; sourceTree = ""; }; - 1801812D8CCA5E614AF5B2E5A40FD00E /* Resources */ = { + 336DEC5C1518FB1515B412820E1B8EBB /* scripts */ = { isa = PBXGroup; children = ( - 56260A0EEDA671CDB9D2E9F617A8E776 /* scripts */, + C1365465663268B61753BF27B647DA39 /* check-and-run-apollo-codegen.sh */, ); - name = Resources; + name = scripts; + path = scripts; sourceTree = ""; }; 41EC9D1139C8584AC99C2D542C204E67 /* Pods-StarWarsAPI */ = { @@ -390,6 +416,20 @@ path = "Target Support Files/Pods-StarWarsAPI"; sourceTree = ""; }; + 423A21A61CA455A6041B1607B8A6FF33 /* Support Files */ = { + isa = PBXGroup; + children = ( + 1542AA29919683732D5C2CDAC80381BE /* Apollo.modulemap */, + 8910258E5AD30319CA72E05B90C4AC6D /* Apollo.xcconfig */, + A30E06FEAB733A1938FDAA6CB0C7CAF4 /* Apollo-dummy.m */, + DED7DCCFD5741991CA593441684AF181 /* Apollo-prefix.pch */, + FCEE66B62EAC19AF05896543B1CC20DB /* Apollo-umbrella.h */, + 6B2FAE16B52E13F2255D8D8D439C1466 /* Info.plist */, + ); + name = "Support Files"; + path = "Example/Pods/Target Support Files/Apollo"; + sourceTree = ""; + }; 42A565AFFAD6D5669C3E9A617B18206F /* Pods */ = { isa = PBXGroup; children = ( @@ -424,13 +464,45 @@ name = iOS; sourceTree = ""; }; - 56260A0EEDA671CDB9D2E9F617A8E776 /* scripts */ = { + 5647491FC16879125D472701DA7D8074 /* Sources */ = { isa = PBXGroup; children = ( - 872EA0E9B1EC6684546BEFF234C61E6E /* check-and-run-apollo-codegen.sh */, + B785FCECF6FFA0348FE3961AFDC5C0AF /* ApolloClient.swift */, + 2D1BCE14534E37F1E56DA924CE5D2621 /* ApolloStore.swift */, + A6231A3C03C676AA5C3645BE51E42184 /* AsynchronousOperation.swift */, + E65505F835204A94A5D03AB3FA68B1D3 /* Collections.swift */, + D80C65010D5FF9DA75FE564B3B16DE81 /* DataLoader.swift */, + 941EEC1220197E2B07C634E14D4E319E /* Dictionary+KeyPath.swift */, + 3834589AEC46AFC5618EDEB84BFDDC67 /* GraphQLDependencyTracker.swift */, + 974545E3C8A36D55A3FD3DCC46166F6D /* GraphQLError.swift */, + EBED715F438CFACC415B97B86CFD6422 /* GraphQLExecutor.swift */, + B3A2B1238E9781F0C22EE5733626AB01 /* GraphQLOperation.swift */, + 6476D8DF83CC5E44AC295CA811992A17 /* GraphQLOutputType.swift */, + 0411C56E0121FFBAE30473AE1E25AB56 /* GraphQLQueryWatcher.swift */, + ABD0FB59CA8C02E9DFE2C186DF8A6AB2 /* GraphQLResponse.swift */, + 9BFE9722636C12702C05748430E53F78 /* GraphQLResponseGenerator.swift */, + 74920BE3F88237C4C3DDA76227BDF2E1 /* GraphQLResult.swift */, + AAFC7CF56F4E8EFC98F4FE6FB20E6384 /* GraphQLResultAccumulator.swift */, + AC36364F2001FAE110A5756E8B9B04B5 /* GraphQLResultMapper.swift */, + FC35D07889D7B7A9717D60C50C0649BF /* GraphQLResultNormalizer.swift */, + C070371DEFF116F4E1181DE8DD58D0A9 /* GraphQLValues.swift */, + 1F59A34F6FBBC01495FA0EEFC7CFF5A1 /* HTTPNetworkTransport.swift */, + 503243847991ECCB90434FCB18B8113B /* InMemoryNormalizedCache.swift */, + DFA61605E0CF60C23447BD3645A7F6C6 /* JSON.swift */, + B5187F20FDC2CCB00F92F8634B15C62C /* JSONSerializationFormat.swift */, + 96B258D77C330EC72CA1F86CFADB9702 /* JSONStandardTypeConversions.swift */, + B149332CA02057A2C99DAD2391F92FB0 /* Locking.swift */, + 2FB067970EBEEE32B9F9B8CF8FA457C9 /* NetworkTransport.swift */, + DBD0B42CB8E4BF2A6661253EFD4F57F6 /* NormalizedCache.swift */, + 715E2F902F7A750814E054D46287C284 /* Promise.swift */, + 32ADDCAC7A45EFB20A30DA69CF38976B /* Record.swift */, + 0CBABBFA8407D460F35404C52E1C0C74 /* RecordSet.swift */, + 53166497143EB24EE51313830B0378AA /* Result.swift */, + 4C9F12AB5DA3FD3FAB850FD3819EBD3D /* Selections.swift */, + 8BF7A27967561797D7548C7F8496B176 /* Utilities.swift */, ); - name = scripts; - path = scripts; + name = Sources; + path = Sources; sourceTree = ""; }; 6BF538A5818A9423DCAFBA3FE993650B /* SQLite.swift */ = { @@ -472,19 +544,20 @@ name = standard; sourceTree = ""; }; - 768337ED42456230A0A77624D4991E13 /* Development Pods */ = { + 7D4C8FC23C42C3AE0AED166522F344E4 /* SqliteNormalizedCache */ = { isa = PBXGroup; children = ( - 8389C6E68002254991191670D7F6BF1D /* Apollo */, + A5900DA33E216DB7A1CCDB272F1B0CFE /* SqliteNormalizedCache.swift */, ); - name = "Development Pods"; + name = SqliteNormalizedCache; + path = SqliteNormalizedCache; sourceTree = ""; }; 7DB346D0F39D3F0E887471402A8071AB = { isa = PBXGroup; children = ( 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - 768337ED42456230A0A77624D4991E13 /* Development Pods */, + 0780AE62F17E1B780D8C4170D5F2E768 /* Development Pods */, 0E9CC0217CE03B66912982F024F7C64D /* Frameworks */, 42A565AFFAD6D5669C3E9A617B18206F /* Pods */, CADF8E7A438C737280A69D0E24D5BDDC /* Products */, @@ -492,26 +565,13 @@ ); sourceTree = ""; }; - 82017056B1CC49B3DC02060971D2C82D /* Support Files */ = { - isa = PBXGroup; - children = ( - F7AB6C9064A19E5E00C2C7B6CF7D38DD /* Apollo.modulemap */, - 269A666530B42952FF00B5B4A1844F67 /* Apollo.xcconfig */, - E5BB833C4CF9D696FCF839FB705C1A91 /* Apollo-dummy.m */, - 2FF924421EAF21716DEF0AE07417770D /* Apollo-prefix.pch */, - B5C756BCE1977B310FBCDFC81E7CB726 /* Apollo-umbrella.h */, - 94D650A756B69071D262EFC78E0E69F0 /* Info.plist */, - ); - name = "Support Files"; - path = "Example/Pods/Target Support Files/Apollo"; - sourceTree = ""; - }; - 8389C6E68002254991191670D7F6BF1D /* Apollo */ = { + 84AAC42334BA0A537FA21127F98BCE42 /* Apollo */ = { isa = PBXGroup; children = ( - 1801812D8CCA5E614AF5B2E5A40FD00E /* Resources */, - B28E56D49879D9E081C62CD89EE29101 /* Sources */, - 82017056B1CC49B3DC02060971D2C82D /* Support Files */, + 036E276F1B88E1EA4E926674B067BEAF /* Resources */, + 5647491FC16879125D472701DA7D8074 /* Sources */, + C30F51D1002D9EE51192D5EB07AC8CDF /* SqliteNormalizedCache */, + 423A21A61CA455A6041B1607B8A6FF33 /* Support Files */, ); name = Apollo; path = ../..; @@ -528,46 +588,12 @@ name = "Targets Support Files"; sourceTree = ""; }; - B28E56D49879D9E081C62CD89EE29101 /* Sources */ = { + C30F51D1002D9EE51192D5EB07AC8CDF /* SqliteNormalizedCache */ = { isa = PBXGroup; children = ( - 3B42D8D8A4E18179F37824F2695F75F3 /* ApolloClient.swift */, - 6962E4B167BCDE8CACFF3DC269212EE7 /* ApolloStore.swift */, - 7A5D8EED2099F4E9AC37C5EC2D95A738 /* AsynchronousOperation.swift */, - A918C3B2E22CB999534D187039A4D52A /* Collections.swift */, - 180A54E2C9EAC29BCD0767F9CF54EB79 /* DataLoader.swift */, - 2FA62E20AC29F9ECA17CDE346F83E445 /* Dictionary+KeyPath.swift */, - 399B342ADA72E237E0EBF1EEAA28FB25 /* GraphQLDependencyTracker.swift */, - 74015506E81FA3C19EB6D906D81024AB /* GraphQLError.swift */, - 909F358C8C8DF9392766416B86EACE63 /* GraphQLExecutor.swift */, - 37BFA28F22BF54064B21348557B64BD3 /* GraphQLOperation.swift */, - 82A2AD2C9998545CA1776374D0EB8D35 /* GraphQLOutputType.swift */, - 3C0324BDEF4908733765A4E8909A7F10 /* GraphQLQueryWatcher.swift */, - 95684FC3AB25B49063D525A7C78F0B17 /* GraphQLResponse.swift */, - A7156C5037F2DC118EFF48E601858205 /* GraphQLResponseGenerator.swift */, - BB17F37738DF3903DEB18A03BAA3C0D8 /* GraphQLResult.swift */, - 6C326DB4844A6FBD86CFBA30BDD08DB6 /* GraphQLResultAccumulator.swift */, - B5BED4FF18AC316194A81FD5C33ED9C5 /* GraphQLResultMapper.swift */, - BF17E380BFA697F14018DED6126C8AC8 /* GraphQLResultNormalizer.swift */, - B23BAD010DBCF8C2B764B7E2E9895805 /* GraphQLValues.swift */, - 76D40A77826E6FE48F27E93C4A66DD9C /* HTTPNetworkTransport.swift */, - BA52A0176DDC85E070F4BA3E088EDF79 /* InMemoryNormalizedCache.swift */, - A72488E3CB82621BCD287255DE4F91E6 /* JSON.swift */, - 30DAD61D66BBDE6441131A52D95BDB04 /* JSONSerializationFormat.swift */, - 4E1F6997F619DB12A60F7EA5B8005190 /* JSONStandardTypeConversions.swift */, - 9090E10380883B7CA79EE41C691650F7 /* Locking.swift */, - 42BBD89CF65425C4A9DD8F6390DF859D /* NetworkTransport.swift */, - ED6DD22A402D834518D62E49A6D34114 /* NormalizedCache.swift */, - 078C996EB71DC4EA36311067B6D81A3E /* Promise.swift */, - 616AA09AE6625A279D08C4E95BBF8FAF /* Record.swift */, - CB35A20B8A16FA8E837FAEA496B53CBE /* RecordSet.swift */, - E993F928AC8B4275D32665A6205AE456 /* Result.swift */, - 8F3DE78C37EE122AA21BA986A77BB162 /* Selections.swift */, - 1A8AF61E57D939C975D9A6B03DF50CC7 /* SqliteNormalizedCache.swift */, - 35069E56A5D5D4923A18BA7A092E73D4 /* Utilities.swift */, + 035B096F07B7DC66E76DA60E02CC4F2A /* Sources */, ); - name = Sources; - path = Sources; + name = SqliteNormalizedCache; sourceTree = ""; }; CADF8E7A438C737280A69D0E24D5BDDC /* Products */ = { @@ -1376,7 +1402,7 @@ }; BF59425203BD23DBB85AF465D9BB20B7 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 269A666530B42952FF00B5B4A1844F67 /* Apollo.xcconfig */; + baseConfigurationReference = 8910258E5AD30319CA72E05B90C4AC6D /* Apollo.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1409,7 +1435,7 @@ }; D72042F45DC3C77B677875802D08ECDF /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 269A666530B42952FF00B5B4A1844F67 /* Apollo.xcconfig */; + baseConfigurationReference = 8910258E5AD30319CA72E05B90C4AC6D /* Apollo.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; diff --git a/Sources/SqliteNormalizedCache.swift b/Sources/SqliteNormalizedCache/SqliteNormalizedCache.swift similarity index 100% rename from Sources/SqliteNormalizedCache.swift rename to Sources/SqliteNormalizedCache/SqliteNormalizedCache.swift From ae5b4c07d84978170f60ece48870a3e9abe19765 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Tue, 11 Apr 2017 14:00:53 -0700 Subject: [PATCH 27/76] =?UTF-8?q?Fix=20persistence=20unit=20test.=20The=20?= =?UTF-8?q?problem=20was=20that=20data=20wasn=E2=80=99t=20already=20cached?= =?UTF-8?q?=20by=20the=20time=20the=20fetch=E2=80=99s=20completion=20block?= =?UTF-8?q?=20was=20called?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ApolloTests/CachePersistenceTests.swift | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/Example/ApolloTests/CachePersistenceTests.swift b/Example/ApolloTests/CachePersistenceTests.swift index 70066eb1f5..6f6fdad87b 100644 --- a/Example/ApolloTests/CachePersistenceTests.swift +++ b/Example/ApolloTests/CachePersistenceTests.swift @@ -27,17 +27,20 @@ class CachePersistenceTests: XCTestCase { guard let result = result else { XCTFail("No query result"); return } XCTAssertEqual(result.data?.hero?.name, "Luke Skywalker") - let newCache = try! SqliteNormalizedCache(fileURL: sqliteFileURL) - let newStore = ApolloStore(cache: newCache) - let newClient = ApolloClient(networkTransport: networkTransport, store: newStore) - newClient.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in - defer { newCacheExpectation.fulfill() } - guard let result = result else { XCTFail("No query result"); return } - XCTAssertEqual(result.data?.hero?.name, "Luke Skywalker") - _ = newClient // Workaround for a bug - ensure that newClient is retained until this block is run + // Do another fetch from cache to ensure that data is cached before creating new cache + client.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in + let newCache = try! SqliteNormalizedCache(fileURL: sqliteFileURL) + let newStore = ApolloStore(cache: newCache) + let newClient = ApolloClient(networkTransport: networkTransport, store: newStore) + newClient.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in + defer { newCacheExpectation.fulfill() } + guard let result = result else { XCTFail("No query result"); return } + XCTAssertEqual(result.data?.hero?.name, "Luke Skywalker") + _ = newClient // Workaround for a bug - ensure that newClient is retained until this block is run + } } } - self.waitForExpectations(timeout: 1, handler: nil) + self.waitForExpectations(timeout: 2, handler: nil) } } } From 35fed379929bcf4bc06f6f4ff7f5a31fb9982d92 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Tue, 11 Apr 2017 15:15:09 -0700 Subject: [PATCH 28/76] Fix Apollo.xcodeproj building (without sqlite cache) --- Apollo.xcodeproj/project.pbxproj | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/Apollo.xcodeproj/project.pbxproj b/Apollo.xcodeproj/project.pbxproj index 34cd3f2c54..181ee62a0d 100644 --- a/Apollo.xcodeproj/project.pbxproj +++ b/Apollo.xcodeproj/project.pbxproj @@ -7,8 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 544623A11E941BB100362E34 /* InMemoryNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544623A01E941BB100362E34 /* InMemoryNormalizedCache.swift */; }; - 544623A31E941BD700362E34 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 544623A21E941BD700362E34 /* SqliteNormalizedCache.swift */; }; + 54623F541E9D8CD2005D1A76 /* InMemoryNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54623F531E9D8CD2005D1A76 /* InMemoryNormalizedCache.swift */; }; 9F0F98E11E7BCC3400BF0371 /* Dictionary+KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F0F98E01E7BCC3400BF0371 /* Dictionary+KeyPath.swift */; }; 9F27D4641D40379500715680 /* JSONStandardTypeConversions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F27D4631D40379500715680 /* JSONStandardTypeConversions.swift */; }; 9F295E381E277B2A00A24949 /* GraphQLResultNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F295E371E277B2A00A24949 /* GraphQLResultNormalizer.swift */; }; @@ -46,8 +45,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 544623A01E941BB100362E34 /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; - 544623A21E941BD700362E34 /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCache.swift; sourceTree = ""; }; + 54623F531E9D8CD2005D1A76 /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; 9F0F98E01E7BCC3400BF0371 /* Dictionary+KeyPath.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Dictionary+KeyPath.swift"; sourceTree = ""; }; 9F27D4631D40379500715680 /* JSONStandardTypeConversions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSONStandardTypeConversions.swift; sourceTree = ""; }; 9F295E371E277B2A00A24949 /* GraphQLResultNormalizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResultNormalizer.swift; sourceTree = ""; }; @@ -98,15 +96,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 5446239F1E941B8D00362E34 /* NormalizedCaches */ = { - isa = PBXGroup; - children = ( - 544623A01E941BB100362E34 /* InMemoryNormalizedCache.swift */, - 544623A21E941BD700362E34 /* SqliteNormalizedCache.swift */, - ); - name = NormalizedCaches; - sourceTree = ""; - }; 9F27D4601D40363A00715680 /* Execution */ = { isa = PBXGroup; children = ( @@ -171,7 +160,7 @@ 9FC9A9CA1E2FD05C0023C4D5 /* Store */ = { isa = PBXGroup; children = ( - 5446239F1E941B8D00362E34 /* NormalizedCaches */, + 54623F531E9D8CD2005D1A76 /* InMemoryNormalizedCache.swift */, 9F55347A1DE1DB2100E54264 /* ApolloStore.swift */, 9FCE2CED1E6BE2D800E34457 /* NormalizedCache.swift */, 9FC9A9BC1E2C271C0023C4D5 /* RecordSet.swift */, @@ -310,13 +299,12 @@ 9F55347B1DE1DB2100E54264 /* ApolloStore.swift in Sources */, 9F69FFA91D42855900E000B1 /* NetworkTransport.swift in Sources */, 9FCDFD291E33D0CE007519DC /* GraphQLQueryWatcher.swift in Sources */, - 544623A31E941BD700362E34 /* SqliteNormalizedCache.swift in Sources */, 9FC2333D1E66BBF7001E4541 /* GraphQLDependencyTracker.swift in Sources */, 9F0F98E11E7BCC3400BF0371 /* Dictionary+KeyPath.swift in Sources */, 9FC9A9BF1E2C27FB0023C4D5 /* GraphQLResult.swift in Sources */, 9FC9A9D31E2FD48B0023C4D5 /* GraphQLError.swift in Sources */, 9FEB050D1DB5732300DA3B44 /* JSONSerializationFormat.swift in Sources */, - 544623A11E941BB100362E34 /* InMemoryNormalizedCache.swift in Sources */, + 54623F541E9D8CD2005D1A76 /* InMemoryNormalizedCache.swift in Sources */, 9FC9A9C51E2D6CE70023C4D5 /* Selections.swift in Sources */, 9FCDFD231E33A0D8007519DC /* AsynchronousOperation.swift in Sources */, 9FC9A9CC1E2FD0760023C4D5 /* Record.swift in Sources */, From acbddf2ee912cd9122721b0aa2a6beb59a760dec Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Tue, 11 Apr 2017 15:52:37 -0700 Subject: [PATCH 29/76] =?UTF-8?q?Update=20Podfile=20with=20Core=20subspec,?= =?UTF-8?q?=20so=20consumers=20can=20choose=20to=20avoid=20SQLite=20depend?= =?UTF-8?q?ency=20if=20they=20don=E2=80=99t=20need=20persistence?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Apollo.podspec | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Apollo.podspec b/Apollo.podspec index 82ad1047fb..c1bd9f6870 100644 --- a/Apollo.podspec +++ b/Apollo.podspec @@ -10,20 +10,20 @@ Pod::Spec.new do |s| s.source = { :git => 'https://github.com/apollographql/apollo-ios.git', :tag => s.version } s.requires_arc = true - s.platform = :ios, :osx, :tvos - s.ios.deployment_target = '8.0' - s.tvos.deployment_target = '9.0' - s.osx.deployment_target = '10.10' - - s.source_files = 'Sources/*.swift' s.resource = 'scripts/check-and-run-apollo-codegen.sh' + s.subspec 'Core' do |ss| + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + ss.tvos.deployment_target = '9.0' + ss.source_files = 'Sources/*.swift' + end + s.subspec 'SqliteNormalizedCache' do |ss| - ss.platform = :ios, :osx - ss.source_files = "Sources/SqliteNormalizedCache/*.swift" ss.ios.deployment_target = '8.0' ss.osx.deployment_target = '10.10' + ss.source_files = "Sources/SqliteNormalizedCache/*.swift" ss.dependency 'SQLite.swift', '~> 0.11' end end From 82990f063f7d248402bf3a126fbca94509ae4486 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Tue, 11 Apr 2017 16:03:40 -0700 Subject: [PATCH 30/76] Pod install --- Example/Podfile.lock | 4 +- .../Pods/Local Podspecs/Apollo.podspec.json | 19 +- Example/Pods/Manifest.lock | 4 +- Example/Pods/Pods.xcodeproj/project.pbxproj | 344 +++++++++--------- 4 files changed, 196 insertions(+), 175 deletions(-) diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 8746c80f4e..6b66761c08 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,6 +1,8 @@ PODS: - Apollo (0.5.6): + - Apollo/Core (= 0.5.6) - Apollo/SqliteNormalizedCache (= 0.5.6) + - Apollo/Core (0.5.6) - Apollo/SqliteNormalizedCache (0.5.6): - SQLite.swift (~> 0.11) - SQLite.swift (0.11.2): @@ -15,7 +17,7 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - Apollo: f119dae7a0a9c09cd7aa133152066f05e7f77225 + Apollo: ce99c9c8b9173d6f81da3f9ad2339625b439f61d SQLite.swift: 670c3e9e0a806bbfd56a3de5d530768dc0e6fe7c PODFILE CHECKSUM: 9bd64f1e501820f8e5f1371c1e93f80107c6bb1f diff --git a/Example/Pods/Local Podspecs/Apollo.podspec.json b/Example/Pods/Local Podspecs/Apollo.podspec.json index 3e6a3a2bd1..971e371f29 100644 --- a/Example/Pods/Local Podspecs/Apollo.podspec.json +++ b/Example/Pods/Local Podspecs/Apollo.podspec.json @@ -13,14 +13,23 @@ "tag": "0.5.6" }, "requires_arc": true, + "resources": "scripts/check-and-run-apollo-codegen.sh", "platforms": { - "ios": "8.0", - "tvos": "9.0", - "osx": "10.10" + "osx": null, + "ios": null, + "tvos": null, + "watchos": null }, - "source_files": "Sources/*.swift", - "resources": "scripts/check-and-run-apollo-codegen.sh", "subspecs": [ + { + "name": "Core", + "platforms": { + "ios": "8.0", + "osx": "10.10", + "tvos": "9.0" + }, + "source_files": "Sources/*.swift" + }, { "name": "SqliteNormalizedCache", "platforms": { diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index 8746c80f4e..6b66761c08 100644 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -1,6 +1,8 @@ PODS: - Apollo (0.5.6): + - Apollo/Core (= 0.5.6) - Apollo/SqliteNormalizedCache (= 0.5.6) + - Apollo/Core (0.5.6) - Apollo/SqliteNormalizedCache (0.5.6): - SQLite.swift (~> 0.11) - SQLite.swift (0.11.2): @@ -15,7 +17,7 @@ EXTERNAL SOURCES: :path: "../" SPEC CHECKSUMS: - Apollo: f119dae7a0a9c09cd7aa133152066f05e7f77225 + Apollo: ce99c9c8b9173d6f81da3f9ad2339625b439f61d SQLite.swift: 670c3e9e0a806bbfd56a3de5d530768dc0e6fe7c PODFILE CHECKSUM: 9bd64f1e501820f8e5f1371c1e93f80107c6bb1f diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 33f97195af..b0fa8f51b4 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -7,82 +7,82 @@ objects = { /* Begin PBXBuildFile section */ - 01CD0AAF59D458AC3EF2601332DC362C /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5900DA33E216DB7A1CCDB272F1B0CFE /* SqliteNormalizedCache.swift */; }; + 01CD0AAF59D458AC3EF2601332DC362C /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5055831E03BFDFD4C3C8D027419F425 /* SqliteNormalizedCache.swift */; }; 108A1CBD5D0C9FC34DD2B5C2B8DD0E1F /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF98B7BBADF63A0AF80D7829FA6F77B9 /* Schema.swift */; }; 1105737F12067068DF24A2FD70FC93A3 /* Pods-ApolloPerformanceTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 975269A36A5CF422A22E5D5DA93EAB28 /* Pods-ApolloPerformanceTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11D8F132B7F8704E64825695F6B0DC91 /* fts3_tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5AE2EFBEFDE20C4DDD8B3398D8AE5AE8 /* fts3_tokenizer.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 1569991C9A095D1FCE6B235BD63B51A4 /* Apollo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FCEE66B62EAC19AF05896543B1CC20DB /* Apollo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1569991C9A095D1FCE6B235BD63B51A4 /* Apollo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 957927E0DFC5FB03E6CA1B87814A9E10 /* Apollo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15E73F1CED9B85C8E03C6134581D2ED0 /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60FAE93532FD5578A02AF3CC523A3408 /* CoreFunctions.swift */; }; 16822C933B2ADA1EA5F2EB694F3DA728 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; - 20C306F7AA685281AAEADDEF70FE27B4 /* Record.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32ADDCAC7A45EFB20A30DA69CF38976B /* Record.swift */; }; + 20C306F7AA685281AAEADDEF70FE27B4 /* Record.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF6D660C4C1C51D6932C1A19AD7991A9 /* Record.swift */; }; 2232C53C6D807D0DA97BBB9E4523412C /* Pods-ApolloPerformanceTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E664068C762C5F1811AB06C5856E5BC7 /* Pods-ApolloPerformanceTests-dummy.m */; }; - 24401D6F94D534811685D1F542F93892 /* GraphQLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABD0FB59CA8C02E9DFE2C186DF8A6AB2 /* GraphQLResponse.swift */; }; - 2650B6BD41F1BDFF5A15F9C4C8E61A37 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BF7A27967561797D7548C7F8496B176 /* Utilities.swift */; }; - 2664C21FA05281B3AEC72F71EA44028A /* Collections.swift in Sources */ = {isa = PBXBuildFile; fileRef = E65505F835204A94A5D03AB3FA68B1D3 /* Collections.swift */; }; - 2C64BE3142AB8955A8F1B7ED8C4AC1FD /* AsynchronousOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6231A3C03C676AA5C3645BE51E42184 /* AsynchronousOperation.swift */; }; + 24401D6F94D534811685D1F542F93892 /* GraphQLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEF7E7502D3D6F1C9360B904243E76A1 /* GraphQLResponse.swift */; }; + 2650B6BD41F1BDFF5A15F9C4C8E61A37 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 815355E6475667E8ED041F3EC76D4880 /* Utilities.swift */; }; + 2664C21FA05281B3AEC72F71EA44028A /* Collections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54AAF8298970F6D90491BF3D752ECFB6 /* Collections.swift */; }; + 2C64BE3142AB8955A8F1B7ED8C4AC1FD /* AsynchronousOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11877C4D6F494C575C9E88FA15AA98FA /* AsynchronousOperation.swift */; }; 30382E91D15E7ED4E930564DE86EAF27 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44EE37E8BF436A90A9C40AD27A182DB2 /* Expression.swift */; }; 3046B5C2E5FFE5A008023E939500A575 /* Pods-StarWarsAPI-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 179109F8B259422432C0355515576040 /* Pods-StarWarsAPI-dummy.m */; }; 3401D945C9C21F03B6E5100F26DF231C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; 35E5EEDB90225D140DCA57800CD5A2CD /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23E934E5F923C9742E63347D5512C322 /* AggregateFunctions.swift */; }; - 3D85E3F5AB73653A962BCF09ED74A8C0 /* JSONSerializationFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5187F20FDC2CCB00F92F8634B15C62C /* JSONSerializationFormat.swift */; }; + 3D85E3F5AB73653A962BCF09ED74A8C0 /* JSONSerializationFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = C548175F116A5CF621194BC4BA3581C8 /* JSONSerializationFormat.swift */; }; 3EB8845BB3EB8B7E031BCA86CEC2F0D2 /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B4C8E0D8DB99B4482E2549FEAE620B8 /* FTS5.swift */; }; - 3EEC07CDEFE2204C5CFC1E1B10B6537F /* GraphQLResultNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC35D07889D7B7A9717D60C50C0649BF /* GraphQLResultNormalizer.swift */; }; + 3EEC07CDEFE2204C5CFC1E1B10B6537F /* GraphQLResultNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29444EF033FEC5301794AA3FF05E1255 /* GraphQLResultNormalizer.swift */; }; 415B7E98D356AE4B47C6FD5D11E11C99 /* Pods-ApolloExample-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F2AA223F544DC4835618D4D4A2FAA05 /* Pods-ApolloExample-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 42F81544370E1853391B67D56656A0C3 /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348491EAD9C18B0EEB2E855815254774 /* CustomFunctions.swift */; }; 44C82D3863ECC8C395C961C46C2F756B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; 47628EC1F1DDCC60DF83EA01A277919E /* SQLite-Bridging.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E070D9E44393CD520D0B1AF87A6736D /* SQLite-Bridging.m */; }; - 47B4F5C1BFB40746F552A6D5CE482DC3 /* Locking.swift in Sources */ = {isa = PBXBuildFile; fileRef = B149332CA02057A2C99DAD2391F92FB0 /* Locking.swift */; }; + 47B4F5C1BFB40746F552A6D5CE482DC3 /* Locking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 953093E4245EE7B30DC3346C75ABDEDE /* Locking.swift */; }; 49876A987CA44C386457D31880AE1BD6 /* SQLite.swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 27B2D491F0A9B062233011B873DC118C /* SQLite.swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A23CC3D6A3579C9F12AE00384A7A4F3 /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F331ABE5223829EDFFC088184DFA981 /* RTree.swift */; }; - 4DCCD02DB715AC161B0774E0C137353E /* NetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FB067970EBEEE32B9F9B8CF8FA457C9 /* NetworkTransport.swift */; }; + 4DCCD02DB715AC161B0774E0C137353E /* NetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = A42E64B88B3B4D17143C3055589082E2 /* NetworkTransport.swift */; }; 4FFB64EBCE34E07A60C74F1957B34A7B /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FCCE88ECC9D892349AB6CB3160246D9 /* Query.swift */; }; 54050A3940A7AAF2A4166F6B4027F1D0 /* Pods-StarWarsAPI-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 03D7BFAC37C274E39C5162127AEB6199 /* Pods-StarWarsAPI-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 54CFD21E9012A2554410D08EF63E42CB /* ApolloClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B785FCECF6FFA0348FE3961AFDC5C0AF /* ApolloClient.swift */; }; + 54CFD21E9012A2554410D08EF63E42CB /* ApolloClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 401F038C1A93F7D71496AEEA082C8187 /* ApolloClient.swift */; }; 5C154FC66B0272E926E740EB0D5DDF3E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; 6263A24701DED2E7A447C0313C7C555D /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA7CCC1A073BC5540EA969CA71F0C552 /* Setter.swift */; }; 636C2473106673D1432A22A0B7D6A2C9 /* Pods-ApolloExample-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FD2E12182B5FA8C0EC9565A13BB8D01 /* Pods-ApolloExample-dummy.m */; }; 63D650CA310911FBCB77C3E6229330A7 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = B88C5FD0C85A5AE4583CC7DB512E6820 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6C5A957F0E47791FFA662827ADBA67A9 /* GraphQLResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74920BE3F88237C4C3DDA76227BDF2E1 /* GraphQLResult.swift */; }; - 6CC6B8EEDAA285718533CC1482D13B61 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53166497143EB24EE51313830B0378AA /* Result.swift */; }; - 6F378D7233AC3E51B00DB180BF8D6066 /* Selections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9F12AB5DA3FD3FAB850FD3819EBD3D /* Selections.swift */; }; - 6FCDA3222BB1A7CADC500C19CA4A6611 /* check-and-run-apollo-codegen.sh in Resources */ = {isa = PBXBuildFile; fileRef = C1365465663268B61753BF27B647DA39 /* check-and-run-apollo-codegen.sh */; }; - 77E05C7059DFD498C2B323C3A707C0E8 /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 715E2F902F7A750814E054D46287C284 /* Promise.swift */; }; - 787BB17CD95328B14A766F6BC04D2148 /* HTTPNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F59A34F6FBBC01495FA0EEFC7CFF5A1 /* HTTPNetworkTransport.swift */; }; - 7FF4749CC9A33C7B79FE51E0962A4E8A /* Dictionary+KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 941EEC1220197E2B07C634E14D4E319E /* Dictionary+KeyPath.swift */; }; - 853B5034825B85498FE7857957760849 /* NormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBD0B42CB8E4BF2A6661253EFD4F57F6 /* NormalizedCache.swift */; }; + 6C5A957F0E47791FFA662827ADBA67A9 /* GraphQLResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B91E033EE4268436D667B4A0516DF63B /* GraphQLResult.swift */; }; + 6CC6B8EEDAA285718533CC1482D13B61 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB48C810AC51836598FF53899021CAAA /* Result.swift */; }; + 6F378D7233AC3E51B00DB180BF8D6066 /* Selections.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE831C7B824D4684E2AA58D8A0E547A /* Selections.swift */; }; + 6FCDA3222BB1A7CADC500C19CA4A6611 /* check-and-run-apollo-codegen.sh in Resources */ = {isa = PBXBuildFile; fileRef = 3BEC86F0EAB93BCB8EA7A6615DBC98BE /* check-and-run-apollo-codegen.sh */; }; + 77E05C7059DFD498C2B323C3A707C0E8 /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1510979B9E8022F1675C9B31D38A561D /* Promise.swift */; }; + 787BB17CD95328B14A766F6BC04D2148 /* HTTPNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0E0E7DEA40266C91EEEF8DE80F9A821 /* HTTPNetworkTransport.swift */; }; + 7FF4749CC9A33C7B79FE51E0962A4E8A /* Dictionary+KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9601BDB184C7FA2886421EDA6BC51FE0 /* Dictionary+KeyPath.swift */; }; + 853B5034825B85498FE7857957760849 /* NormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4F73A249897121C29746449E83681B /* NormalizedCache.swift */; }; 87109E7659BAF278C52455C1D6529DF6 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DE06F129836BA95B0BE2222991D2BD0 /* Value.swift */; }; - 8916D47EB3F95315F2020922A6130D8D /* GraphQLExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBED715F438CFACC415B97B86CFD6422 /* GraphQLExecutor.swift */; }; - 8D2A9E5942209EC7EAE309C3BDEC344E /* GraphQLQueryWatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0411C56E0121FFBAE30473AE1E25AB56 /* GraphQLQueryWatcher.swift */; }; + 8916D47EB3F95315F2020922A6130D8D /* GraphQLExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3934F1038706695A3609AADC734C098B /* GraphQLExecutor.swift */; }; + 8D2A9E5942209EC7EAE309C3BDEC344E /* GraphQLQueryWatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFFEE6F4624C74CD2CA4DC90DA4760F4 /* GraphQLQueryWatcher.swift */; }; 94C4501EC15533C68551FCFD9896339D /* Pods-ApolloTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E12D36800035FA4AEBD5CCA0E467F5C2 /* Pods-ApolloTests-dummy.m */; }; 94ECE937BFDFCDBD700A107B1DC40CA9 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96600A78FEC066BF8931D7A58FBF0F16 /* Statement.swift */; }; 990D4881FF22A80867C475FB9823817A /* Pods-ApolloTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A750E6B16B43489DE32A5211D58F9FBA /* Pods-ApolloTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; A11B9C4B8DC4AF252BA2727D21A1EEF1 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7B7855DE178D22988512E88C68325BE /* Collation.swift */; }; A3FF4B5B363E91C3BE7FC3294C555032 /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E667D63233F61B551F3B93AF184020E0 /* Foundation.swift */; }; - A54DF0B95FE0DAD23D2A81D408683D03 /* DataLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = D80C65010D5FF9DA75FE564B3B16DE81 /* DataLoader.swift */; }; + A54DF0B95FE0DAD23D2A81D408683D03 /* DataLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9945BAB50B7F6365B802F25E004A2566 /* DataLoader.swift */; }; A60D999F6C5C2A7030430FBB2644A85D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; AB1840F1E49F6C17A8A12662445629C3 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDA86AD441076D928D0621530CD5E745 /* Operators.swift */; }; - AC87CC13FC22BD408AA235121C216C85 /* ApolloStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D1BCE14534E37F1E56DA924CE5D2621 /* ApolloStore.swift */; }; + AC87CC13FC22BD408AA235121C216C85 /* ApolloStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8037D537446EB8C0C0FC358AACDFBCDB /* ApolloStore.swift */; }; AFC4EF684AAE208082F88A746E8799D5 /* SQLite-Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = AF7F8DDFC50FE6ACA57F6A16E253F8DC /* SQLite-Bridging.h */; settings = {ATTRIBUTES = (Public, ); }; }; B27809FB8835D7719B0AD7337D908431 /* SQLite.swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D30459F9DC30876AF6C299D26C7CE48 /* SQLite.swift-dummy.m */; }; B6F6F22A0B59D1A386C7AC19789B74C0 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB44F0C85553660857F351B59660E399 /* SQLite.framework */; }; - B8354678757BF7E72C8E638F8FD096ED /* JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFA61605E0CF60C23447BD3645A7F6C6 /* JSON.swift */; }; - B948E00EC8119CFD8B9E55DBBDA5A4E3 /* GraphQLOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3A2B1238E9781F0C22EE5733626AB01 /* GraphQLOperation.swift */; }; - BA32663AD51B09E7997DD5871D7FE383 /* GraphQLDependencyTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3834589AEC46AFC5618EDEB84BFDDC67 /* GraphQLDependencyTracker.swift */; }; + B8354678757BF7E72C8E638F8FD096ED /* JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C463C83D40DC933D44D3FAFBB8D476E /* JSON.swift */; }; + B948E00EC8119CFD8B9E55DBBDA5A4E3 /* GraphQLOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC1A0D34707B7C5AB1AC9821F092A5F /* GraphQLOperation.swift */; }; + BA32663AD51B09E7997DD5871D7FE383 /* GraphQLDependencyTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CF244F5154EDAAAD43F2B551C5B1B34 /* GraphQLDependencyTracker.swift */; }; C02AE58DC3E78ACB817163011C7A6734 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 680617B7B3999D016982CD479DADCCB0 /* Blob.swift */; }; D850BB2A3E7B9A6AAEB54FA9A8B7AD4F /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCF813C6D3C0824E1BCFDACADE6109F5 /* Connection.swift */; }; - D99283BAF5F146D362611679A5ED1A5D /* Apollo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A30E06FEAB733A1938FDAA6CB0C7CAF4 /* Apollo-dummy.m */; }; - DA0CEB1E0989DCA89796ABDF7267A7B0 /* InMemoryNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 503243847991ECCB90434FCB18B8113B /* InMemoryNormalizedCache.swift */; }; + D99283BAF5F146D362611679A5ED1A5D /* Apollo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 42E5D07D44401421901F612C8D4837BC /* Apollo-dummy.m */; }; + DA0CEB1E0989DCA89796ABDF7267A7B0 /* InMemoryNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F18865B76F1771AD7CAF6C87A0B0A76 /* InMemoryNormalizedCache.swift */; }; DD139C21BC1B51C5078B8F9C2F55D0A3 /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7A99896DB5D793228657B5F5EC525DA /* FTS4.swift */; }; - E13D7AA4EFBA1345BDC2E05B4BD67F2A /* GraphQLError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 974545E3C8A36D55A3FD3DCC46166F6D /* GraphQLError.swift */; }; - E2D3B028353BC0FA74DA8536C717B9E4 /* GraphQLValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = C070371DEFF116F4E1181DE8DD58D0A9 /* GraphQLValues.swift */; }; - EB775615489CE36C2D86C4EB279F3FF5 /* GraphQLResultMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC36364F2001FAE110A5756E8B9B04B5 /* GraphQLResultMapper.swift */; }; - EEA27311E6D18D94F27E12D2F0BE7BF0 /* GraphQLOutputType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6476D8DF83CC5E44AC295CA811992A17 /* GraphQLOutputType.swift */; }; - F0EF5885BD48A9B939F3FF9C1DC1A965 /* GraphQLResultAccumulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAFC7CF56F4E8EFC98F4FE6FB20E6384 /* GraphQLResultAccumulator.swift */; }; - F4DAAE8A4DF58A14A2B8A6272ED102C7 /* RecordSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CBABBFA8407D460F35404C52E1C0C74 /* RecordSet.swift */; }; - F86D649610E4878DE71D25AA9CC614A2 /* JSONStandardTypeConversions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96B258D77C330EC72CA1F86CFADB9702 /* JSONStandardTypeConversions.swift */; }; + E13D7AA4EFBA1345BDC2E05B4BD67F2A /* GraphQLError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC7DBCA1F40B1DC0B762047428B9D510 /* GraphQLError.swift */; }; + E2D3B028353BC0FA74DA8536C717B9E4 /* GraphQLValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 677F4603A01A5098CB5B4238A4B5E16D /* GraphQLValues.swift */; }; + EB775615489CE36C2D86C4EB279F3FF5 /* GraphQLResultMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2211D04CA00FD182ADC495BC12C7E0FA /* GraphQLResultMapper.swift */; }; + EEA27311E6D18D94F27E12D2F0BE7BF0 /* GraphQLOutputType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD979ED094ED16CE55D3AB05A872C77F /* GraphQLOutputType.swift */; }; + F0EF5885BD48A9B939F3FF9C1DC1A965 /* GraphQLResultAccumulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71B233364D9628F60058A864201DEC5A /* GraphQLResultAccumulator.swift */; }; + F4DAAE8A4DF58A14A2B8A6272ED102C7 /* RecordSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF01E514190839B447A1DC628224BFD /* RecordSet.swift */; }; + F86D649610E4878DE71D25AA9CC614A2 /* JSONStandardTypeConversions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 951BEA39308FE598897A6798B562CDEA /* JSONStandardTypeConversions.swift */; }; FAB10CD9CFBBFB7DE9F271B434380C16 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; FDA57D0DA6CBE5083CAF08A8B2F86AC9 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2C5D76BD109C46DEC526A712FC4A8BB /* Helpers.swift */; }; - FF53DDD16D8FC3431D3F148AC7FD56CD /* GraphQLResponseGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BFE9722636C12702C05748430E53F78 /* GraphQLResponseGenerator.swift */; }; + FF53DDD16D8FC3431D3F148AC7FD56CD /* GraphQLResponseGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1DE0FBDF2EC85A9CB28E87D3016B69C /* GraphQLResponseGenerator.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -154,119 +154,119 @@ /* Begin PBXFileReference section */ 01C3FA9C5081FAF3B433C1CAC200835C /* Pods-ApolloPerformanceTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloPerformanceTests.debug.xcconfig"; sourceTree = ""; }; 03D7BFAC37C274E39C5162127AEB6199 /* Pods-StarWarsAPI-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-StarWarsAPI-umbrella.h"; sourceTree = ""; }; - 0411C56E0121FFBAE30473AE1E25AB56 /* GraphQLQueryWatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLQueryWatcher.swift; sourceTree = ""; }; 08674A30761B25CB7AE0CE4CFFBFF205 /* Pods-ApolloTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloTests.release.xcconfig"; sourceTree = ""; }; 0AB6C025AC773267F2034B391653AEF6 /* Pods-ApolloTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloTests.debug.xcconfig"; sourceTree = ""; }; - 0CBABBFA8407D460F35404C52E1C0C74 /* RecordSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RecordSet.swift; sourceTree = ""; }; 0E070D9E44393CD520D0B1AF87A6736D /* SQLite-Bridging.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "SQLite-Bridging.m"; path = "Sources/SQLiteObjc/SQLite-Bridging.m"; sourceTree = ""; }; 0F331ABE5223829EDFFC088184DFA981 /* RTree.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RTree.swift; path = Sources/SQLite/Extensions/RTree.swift; sourceTree = ""; }; 10FA3C1A5006EC52FC44C8EB07B5BDAE /* Pods-ApolloTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloTests.modulemap"; sourceTree = ""; }; - 1542AA29919683732D5C2CDAC80381BE /* Apollo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Apollo.modulemap; sourceTree = ""; }; + 11877C4D6F494C575C9E88FA15AA98FA /* AsynchronousOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AsynchronousOperation.swift; sourceTree = ""; }; + 1510979B9E8022F1675C9B31D38A561D /* Promise.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Promise.swift; sourceTree = ""; }; 160F355101277829561FC9CDD0D3F16B /* Pods-ApolloPerformanceTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloPerformanceTests-frameworks.sh"; sourceTree = ""; }; 179109F8B259422432C0355515576040 /* Pods-StarWarsAPI-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-StarWarsAPI-dummy.m"; sourceTree = ""; }; 1AD67889E8665E2406E38CC279A50DB7 /* Pods-ApolloPerformanceTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloPerformanceTests-resources.sh"; sourceTree = ""; }; 1D7DA9FB08FD2A913967F0D7996B8701 /* SQLite.swift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = SQLite.swift.modulemap; sourceTree = ""; }; 1EC3C1E6C3B57B46326B94BAB568B649 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1F4445F089281553CC23A453DBF203C7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1F59A34F6FBBC01495FA0EEFC7CFF5A1 /* HTTPNetworkTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HTTPNetworkTransport.swift; sourceTree = ""; }; + 21E66D4ED8F6CC300DC7FE2F93A367A2 /* Apollo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Apollo.modulemap; sourceTree = ""; }; + 2211D04CA00FD182ADC495BC12C7E0FA /* GraphQLResultMapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultMapper.swift; sourceTree = ""; }; 23E934E5F923C9742E63347D5512C322 /* AggregateFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AggregateFunctions.swift; path = Sources/SQLite/Typed/AggregateFunctions.swift; sourceTree = ""; }; 261B0C331D5E3A2F400B2EC0F77CC1F7 /* Pods_StarWarsAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_StarWarsAPI.framework; path = "Pods-StarWarsAPI.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 27B2D491F0A9B062233011B873DC118C /* SQLite.swift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SQLite.swift-umbrella.h"; sourceTree = ""; }; - 2D1BCE14534E37F1E56DA924CE5D2621 /* ApolloStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ApolloStore.swift; sourceTree = ""; }; + 29444EF033FEC5301794AA3FF05E1255 /* GraphQLResultNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultNormalizer.swift; sourceTree = ""; }; 2D30459F9DC30876AF6C299D26C7CE48 /* SQLite.swift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SQLite.swift-dummy.m"; sourceTree = ""; }; 2DE423399B21C05322619DF24D280234 /* Pods-StarWarsAPI.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StarWarsAPI.debug.xcconfig"; sourceTree = ""; }; - 2FB067970EBEEE32B9F9B8CF8FA457C9 /* NetworkTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NetworkTransport.swift; sourceTree = ""; }; - 32ADDCAC7A45EFB20A30DA69CF38976B /* Record.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Record.swift; sourceTree = ""; }; + 2F18865B76F1771AD7CAF6C87A0B0A76 /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; 348491EAD9C18B0EEB2E855815254774 /* CustomFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomFunctions.swift; path = Sources/SQLite/Typed/CustomFunctions.swift; sourceTree = ""; }; - 3834589AEC46AFC5618EDEB84BFDDC67 /* GraphQLDependencyTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLDependencyTracker.swift; sourceTree = ""; }; + 391CA98836DC28B658B23EE172EA2DC5 /* Apollo.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Apollo.xcconfig; sourceTree = ""; }; + 3934F1038706695A3609AADC734C098B /* GraphQLExecutor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLExecutor.swift; sourceTree = ""; }; + 3BEC86F0EAB93BCB8EA7A6615DBC98BE /* check-and-run-apollo-codegen.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "check-and-run-apollo-codegen.sh"; sourceTree = ""; }; 3C7116256A907933BD6C8D01B5E5D592 /* Pods-ApolloPerformanceTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloPerformanceTests.release.xcconfig"; sourceTree = ""; }; + 3CF244F5154EDAAAD43F2B551C5B1B34 /* GraphQLDependencyTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLDependencyTracker.swift; sourceTree = ""; }; 3D54BDE67F2AF934CA35178FCC1165EB /* Pods-ApolloPerformanceTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloPerformanceTests-acknowledgements.markdown"; sourceTree = ""; }; 3F2AA223F544DC4835618D4D4A2FAA05 /* Pods-ApolloExample-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloExample-umbrella.h"; sourceTree = ""; }; 3FA13D59DC7D79809DCEF476848EAED0 /* Pods_ApolloExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloExample.framework; path = "Pods-ApolloExample.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 3FCCE88ECC9D892349AB6CB3160246D9 /* Query.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Query.swift; path = Sources/SQLite/Typed/Query.swift; sourceTree = ""; }; + 401F038C1A93F7D71496AEEA082C8187 /* ApolloClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ApolloClient.swift; sourceTree = ""; }; + 42E5D07D44401421901F612C8D4837BC /* Apollo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Apollo-dummy.m"; sourceTree = ""; }; 44EE37E8BF436A90A9C40AD27A182DB2 /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/SQLite/Typed/Expression.swift; sourceTree = ""; }; 4B4C8E0D8DB99B4482E2549FEAE620B8 /* FTS5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FTS5.swift; path = Sources/SQLite/Extensions/FTS5.swift; sourceTree = ""; }; - 4C9F12AB5DA3FD3FAB850FD3819EBD3D /* Selections.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Selections.swift; sourceTree = ""; }; - 503243847991ECCB90434FCB18B8113B /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; - 53166497143EB24EE51313830B0378AA /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; }; + 54AAF8298970F6D90491BF3D752ECFB6 /* Collections.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Collections.swift; sourceTree = ""; }; 550DCFFB3AF38FE48668B410DCC530D2 /* Pods-ApolloPerformanceTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloPerformanceTests.modulemap"; sourceTree = ""; }; 58EA58A33C79BB0F400C14494D1142CC /* Pods-ApolloTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloTests-frameworks.sh"; sourceTree = ""; }; 5AE2EFBEFDE20C4DDD8B3398D8AE5AE8 /* fts3_tokenizer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = fts3_tokenizer.h; path = Sources/SQLiteObjc/fts3_tokenizer.h; sourceTree = ""; }; 60FAE93532FD5578A02AF3CC523A3408 /* CoreFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CoreFunctions.swift; path = Sources/SQLite/Typed/CoreFunctions.swift; sourceTree = ""; }; - 6476D8DF83CC5E44AC295CA811992A17 /* GraphQLOutputType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLOutputType.swift; sourceTree = ""; }; 6690FA900A959073D6602DDA8B9B96FC /* Pods-StarWarsAPI-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-StarWarsAPI-acknowledgements.plist"; sourceTree = ""; }; + 677F4603A01A5098CB5B4238A4B5E16D /* GraphQLValues.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLValues.swift; sourceTree = ""; }; 680617B7B3999D016982CD479DADCCB0 /* Blob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Blob.swift; path = Sources/SQLite/Core/Blob.swift; sourceTree = ""; }; - 6B2FAE16B52E13F2255D8D8D439C1466 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 715E2F902F7A750814E054D46287C284 /* Promise.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Promise.swift; sourceTree = ""; }; + 71B233364D9628F60058A864201DEC5A /* GraphQLResultAccumulator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultAccumulator.swift; sourceTree = ""; }; 724B09788D59362DE110F9760831B30B /* Pods-StarWarsAPI.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StarWarsAPI.release.xcconfig"; sourceTree = ""; }; - 74920BE3F88237C4C3DDA76227BDF2E1 /* GraphQLResult.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResult.swift; sourceTree = ""; }; + 7491C42CA1F0D47FF353804EDFC308A7 /* Apollo-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Apollo-prefix.pch"; sourceTree = ""; }; 7AF34EB0D4F25CC4FBA1A60724BBC66A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 7C463C83D40DC933D44D3FAFBB8D476E /* JSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSON.swift; sourceTree = ""; }; 7ED2D87037EC2D5F09173EE9E979C813 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 7FD2E12182B5FA8C0EC9565A13BB8D01 /* Pods-ApolloExample-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloExample-dummy.m"; sourceTree = ""; }; + 8037D537446EB8C0C0FC358AACDFBCDB /* ApolloStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ApolloStore.swift; sourceTree = ""; }; + 815355E6475667E8ED041F3EC76D4880 /* Utilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; 8378EF5103C93E048B7DF8B41415FF63 /* Pods-ApolloExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExample.debug.xcconfig"; sourceTree = ""; }; 88BFCDC2C48A9AAC024D78C7786357F9 /* SQLite.swift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SQLite.swift.xcconfig; sourceTree = ""; }; - 8910258E5AD30319CA72E05B90C4AC6D /* Apollo.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Apollo.xcconfig; sourceTree = ""; }; 8AA0C69818598EB79B91BCA0BE698842 /* Pods-ApolloExample-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExample-frameworks.sh"; sourceTree = ""; }; - 8BF7A27967561797D7548C7F8496B176 /* Utilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; 8C1BB3B1629831A0860FA95DD624C9F4 /* Pods-ApolloTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloTests-acknowledgements.markdown"; sourceTree = ""; }; 904829AAE2B1DE6B6F2CE13CDD6EDE22 /* Pods-ApolloExample-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloExample-acknowledgements.plist"; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 941EEC1220197E2B07C634E14D4E319E /* Dictionary+KeyPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Dictionary+KeyPath.swift"; sourceTree = ""; }; 949A295ACAD1338645F511B3B615304F /* Pods-StarWarsAPI.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-StarWarsAPI.modulemap"; sourceTree = ""; }; + 951BEA39308FE598897A6798B562CDEA /* JSONStandardTypeConversions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSONStandardTypeConversions.swift; sourceTree = ""; }; + 953093E4245EE7B30DC3346C75ABDEDE /* Locking.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Locking.swift; sourceTree = ""; }; + 957927E0DFC5FB03E6CA1B87814A9E10 /* Apollo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Apollo-umbrella.h"; sourceTree = ""; }; + 9601BDB184C7FA2886421EDA6BC51FE0 /* Dictionary+KeyPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Dictionary+KeyPath.swift"; sourceTree = ""; }; 96600A78FEC066BF8931D7A58FBF0F16 /* Statement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Statement.swift; path = Sources/SQLite/Core/Statement.swift; sourceTree = ""; }; - 96B258D77C330EC72CA1F86CFADB9702 /* JSONStandardTypeConversions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSONStandardTypeConversions.swift; sourceTree = ""; }; - 974545E3C8A36D55A3FD3DCC46166F6D /* GraphQLError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLError.swift; sourceTree = ""; }; 975269A36A5CF422A22E5D5DA93EAB28 /* Pods-ApolloPerformanceTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloPerformanceTests-umbrella.h"; sourceTree = ""; }; + 9945BAB50B7F6365B802F25E004A2566 /* DataLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DataLoader.swift; sourceTree = ""; }; 9ADC492098AB1E55A5C9644F01624CA8 /* Pods-ApolloExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExample.release.xcconfig"; sourceTree = ""; }; - 9BFE9722636C12702C05748430E53F78 /* GraphQLResponseGenerator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResponseGenerator.swift; sourceTree = ""; }; 9DE06F129836BA95B0BE2222991D2BD0 /* Value.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Value.swift; path = Sources/SQLite/Core/Value.swift; sourceTree = ""; }; A2C5D76BD109C46DEC526A712FC4A8BB /* Helpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Helpers.swift; path = Sources/SQLite/Helpers.swift; sourceTree = ""; }; - A30E06FEAB733A1938FDAA6CB0C7CAF4 /* Apollo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Apollo-dummy.m"; sourceTree = ""; }; - A5900DA33E216DB7A1CCDB272F1B0CFE /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCache.swift; sourceTree = ""; }; - A6231A3C03C676AA5C3645BE51E42184 /* AsynchronousOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AsynchronousOperation.swift; sourceTree = ""; }; + A42E64B88B3B4D17143C3055589082E2 /* NetworkTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NetworkTransport.swift; sourceTree = ""; }; A750E6B16B43489DE32A5211D58F9FBA /* Pods-ApolloTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloTests-umbrella.h"; sourceTree = ""; }; - AAFC7CF56F4E8EFC98F4FE6FB20E6384 /* GraphQLResultAccumulator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultAccumulator.swift; sourceTree = ""; }; - ABD0FB59CA8C02E9DFE2C186DF8A6AB2 /* GraphQLResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResponse.swift; sourceTree = ""; }; - AC36364F2001FAE110A5756E8B9B04B5 /* GraphQLResultMapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultMapper.swift; sourceTree = ""; }; + AB48C810AC51836598FF53899021CAAA /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; }; AC7E77DE5E2272297487C6FDD2A16513 /* Pods-ApolloPerformanceTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloPerformanceTests-acknowledgements.plist"; sourceTree = ""; }; + AF6D660C4C1C51D6932C1A19AD7991A9 /* Record.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Record.swift; sourceTree = ""; }; AF7F8DDFC50FE6ACA57F6A16E253F8DC /* SQLite-Bridging.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "SQLite-Bridging.h"; path = "Sources/SQLiteObjc/include/SQLite-Bridging.h"; sourceTree = ""; }; - B149332CA02057A2C99DAD2391F92FB0 /* Locking.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Locking.swift; sourceTree = ""; }; - B3A2B1238E9781F0C22EE5733626AB01 /* GraphQLOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLOperation.swift; sourceTree = ""; }; - B5187F20FDC2CCB00F92F8634B15C62C /* JSONSerializationFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSONSerializationFormat.swift; sourceTree = ""; }; B5A51A258D56CEEC8707C43B4CA66D57 /* Pods-ApolloTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloTests-acknowledgements.plist"; sourceTree = ""; }; - B785FCECF6FFA0348FE3961AFDC5C0AF /* ApolloClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ApolloClient.swift; sourceTree = ""; }; B7A99896DB5D793228657B5F5EC525DA /* FTS4.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FTS4.swift; path = Sources/SQLite/Extensions/FTS4.swift; sourceTree = ""; }; B88C5FD0C85A5AE4583CC7DB512E6820 /* SQLite.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SQLite.h; path = Sources/SQLite/SQLite.h; sourceTree = ""; }; + B91E033EE4268436D667B4A0516DF63B /* GraphQLResult.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResult.swift; sourceTree = ""; }; B9CA5768D35422C7387D78822AB2AA46 /* Pods-ApolloExample-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloExample-acknowledgements.markdown"; sourceTree = ""; }; + BC7DBCA1F40B1DC0B762047428B9D510 /* GraphQLError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLError.swift; sourceTree = ""; }; BDA86AD441076D928D0621530CD5E745 /* Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operators.swift; path = Sources/SQLite/Typed/Operators.swift; sourceTree = ""; }; - C070371DEFF116F4E1181DE8DD58D0A9 /* GraphQLValues.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLValues.swift; sourceTree = ""; }; C08D4B7E051B2878FD9A1DB195944C60 /* Pods_ApolloTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloTests.framework; path = "Pods-ApolloTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; C12EBB64588697C58EB83E3A1D147FA8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C1365465663268B61753BF27B647DA39 /* check-and-run-apollo-codegen.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "check-and-run-apollo-codegen.sh"; sourceTree = ""; }; C1FDE43D56FD01FEC6EC0EC50C96A22D /* Pods-ApolloExample.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloExample.modulemap"; sourceTree = ""; }; + C548175F116A5CF621194BC4BA3581C8 /* JSONSerializationFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSONSerializationFormat.swift; sourceTree = ""; }; C97E29747EDD103755CD3BBB58DB0042 /* Pods_ApolloPerformanceTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloPerformanceTests.framework; path = "Pods-ApolloPerformanceTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; CA1C6F1BBEC2162E2BA5E756F9B77A2C /* Pods-ApolloTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloTests-resources.sh"; sourceTree = ""; }; CA3ED8D54211455DE25A4DA036694445 /* SQLite.swift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SQLite.swift-prefix.pch"; sourceTree = ""; }; + CCC1A0D34707B7C5AB1AC9821F092A5F /* GraphQLOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLOperation.swift; sourceTree = ""; }; CCF813C6D3C0824E1BCFDACADE6109F5 /* Connection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Connection.swift; path = Sources/SQLite/Core/Connection.swift; sourceTree = ""; }; + CD4F73A249897121C29746449E83681B /* NormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NormalizedCache.swift; sourceTree = ""; }; + CD979ED094ED16CE55D3AB05A872C77F /* GraphQLOutputType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLOutputType.swift; sourceTree = ""; }; CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + CEF7E7502D3D6F1C9360B904243E76A1 /* GraphQLResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResponse.swift; sourceTree = ""; }; D7B7855DE178D22988512E88C68325BE /* Collation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Collation.swift; path = Sources/SQLite/Typed/Collation.swift; sourceTree = ""; }; - D80C65010D5FF9DA75FE564B3B16DE81 /* DataLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DataLoader.swift; sourceTree = ""; }; + D9D01E19268F158CBD26569BCDA0CB2A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; DA7CCC1A073BC5540EA969CA71F0C552 /* Setter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Setter.swift; path = Sources/SQLite/Typed/Setter.swift; sourceTree = ""; }; + DAE831C7B824D4684E2AA58D8A0E547A /* Selections.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Selections.swift; sourceTree = ""; }; DB44F0C85553660857F351B59660E399 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - DBD0B42CB8E4BF2A6661253EFD4F57F6 /* NormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NormalizedCache.swift; sourceTree = ""; }; - DED7DCCFD5741991CA593441684AF181 /* Apollo-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Apollo-prefix.pch"; sourceTree = ""; }; - DFA61605E0CF60C23447BD3645A7F6C6 /* JSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSON.swift; sourceTree = ""; }; E12D36800035FA4AEBD5CCA0E467F5C2 /* Pods-ApolloTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloTests-dummy.m"; sourceTree = ""; }; + E1DE0FBDF2EC85A9CB28E87D3016B69C /* GraphQLResponseGenerator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResponseGenerator.swift; sourceTree = ""; }; E4C251316F1350DC62A6C4843F9E8DAC /* Pods-StarWarsAPI-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-StarWarsAPI-acknowledgements.markdown"; sourceTree = ""; }; E4DDFDE7D66D82B6084F70FC8DE5F14D /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SQLite.framework; path = SQLite.swift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E65505F835204A94A5D03AB3FA68B1D3 /* Collections.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Collections.swift; sourceTree = ""; }; + E5055831E03BFDFD4C3C8D027419F425 /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCache.swift; sourceTree = ""; }; E664068C762C5F1811AB06C5856E5BC7 /* Pods-ApolloPerformanceTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloPerformanceTests-dummy.m"; sourceTree = ""; }; E667D63233F61B551F3B93AF184020E0 /* Foundation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Foundation.swift; path = Sources/SQLite/Foundation.swift; sourceTree = ""; }; - EBED715F438CFACC415B97B86CFD6422 /* GraphQLExecutor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLExecutor.swift; sourceTree = ""; }; + ECF01E514190839B447A1DC628224BFD /* RecordSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RecordSet.swift; sourceTree = ""; }; + EFFEE6F4624C74CD2CA4DC90DA4760F4 /* GraphQLQueryWatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLQueryWatcher.swift; sourceTree = ""; }; + F0E0E7DEA40266C91EEEF8DE80F9A821 /* HTTPNetworkTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HTTPNetworkTransport.swift; sourceTree = ""; }; F4E94D9B3A51997F835199160D3A6204 /* Apollo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Apollo.framework; path = Apollo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FC35D07889D7B7A9717D60C50C0649BF /* GraphQLResultNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultNormalizer.swift; sourceTree = ""; }; FC7AB7465546FD30A69F21B534830CF6 /* Pods-ApolloExample-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExample-resources.sh"; sourceTree = ""; }; - FCEE66B62EAC19AF05896543B1CC20DB /* Apollo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Apollo-umbrella.h"; sourceTree = ""; }; FF72FDA919EE62C2297D3C1EF8E50F18 /* Pods-StarWarsAPI-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-StarWarsAPI-resources.sh"; sourceTree = ""; }; FF98B7BBADF63A0AF80D7829FA6F77B9 /* Schema.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Schema.swift; path = Sources/SQLite/Typed/Schema.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -324,27 +324,10 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 035B096F07B7DC66E76DA60E02CC4F2A /* Sources */ = { - isa = PBXGroup; - children = ( - 7D4C8FC23C42C3AE0AED166522F344E4 /* SqliteNormalizedCache */, - ); - name = Sources; - path = Sources; - sourceTree = ""; - }; - 036E276F1B88E1EA4E926674B067BEAF /* Resources */ = { - isa = PBXGroup; - children = ( - 336DEC5C1518FB1515B412820E1B8EBB /* scripts */, - ); - name = Resources; - sourceTree = ""; - }; 0780AE62F17E1B780D8C4170D5F2E768 /* Development Pods */ = { isa = PBXGroup; children = ( - 84AAC42334BA0A537FA21127F98BCE42 /* Apollo */, + 7B1D34DAF505473A064474B664D669E1 /* Apollo */, ); name = "Development Pods"; sourceTree = ""; @@ -390,13 +373,12 @@ name = Frameworks; sourceTree = ""; }; - 336DEC5C1518FB1515B412820E1B8EBB /* scripts */ = { + 1402D1396693920C1E95678F7F963657 /* Resources */ = { isa = PBXGroup; children = ( - C1365465663268B61753BF27B647DA39 /* check-and-run-apollo-codegen.sh */, + EF01E8B6E2C8E0469E9FAC20340D45B6 /* scripts */, ); - name = scripts; - path = scripts; + name = Resources; sourceTree = ""; }; 41EC9D1139C8584AC99C2D542C204E67 /* Pods-StarWarsAPI */ = { @@ -416,20 +398,6 @@ path = "Target Support Files/Pods-StarWarsAPI"; sourceTree = ""; }; - 423A21A61CA455A6041B1607B8A6FF33 /* Support Files */ = { - isa = PBXGroup; - children = ( - 1542AA29919683732D5C2CDAC80381BE /* Apollo.modulemap */, - 8910258E5AD30319CA72E05B90C4AC6D /* Apollo.xcconfig */, - A30E06FEAB733A1938FDAA6CB0C7CAF4 /* Apollo-dummy.m */, - DED7DCCFD5741991CA593441684AF181 /* Apollo-prefix.pch */, - FCEE66B62EAC19AF05896543B1CC20DB /* Apollo-umbrella.h */, - 6B2FAE16B52E13F2255D8D8D439C1466 /* Info.plist */, - ); - name = "Support Files"; - path = "Example/Pods/Target Support Files/Apollo"; - sourceTree = ""; - }; 42A565AFFAD6D5669C3E9A617B18206F /* Pods */ = { isa = PBXGroup; children = ( @@ -464,42 +432,42 @@ name = iOS; sourceTree = ""; }; - 5647491FC16879125D472701DA7D8074 /* Sources */ = { + 57421CFAE26C3DB80E02F120D406D70C /* Sources */ = { isa = PBXGroup; children = ( - B785FCECF6FFA0348FE3961AFDC5C0AF /* ApolloClient.swift */, - 2D1BCE14534E37F1E56DA924CE5D2621 /* ApolloStore.swift */, - A6231A3C03C676AA5C3645BE51E42184 /* AsynchronousOperation.swift */, - E65505F835204A94A5D03AB3FA68B1D3 /* Collections.swift */, - D80C65010D5FF9DA75FE564B3B16DE81 /* DataLoader.swift */, - 941EEC1220197E2B07C634E14D4E319E /* Dictionary+KeyPath.swift */, - 3834589AEC46AFC5618EDEB84BFDDC67 /* GraphQLDependencyTracker.swift */, - 974545E3C8A36D55A3FD3DCC46166F6D /* GraphQLError.swift */, - EBED715F438CFACC415B97B86CFD6422 /* GraphQLExecutor.swift */, - B3A2B1238E9781F0C22EE5733626AB01 /* GraphQLOperation.swift */, - 6476D8DF83CC5E44AC295CA811992A17 /* GraphQLOutputType.swift */, - 0411C56E0121FFBAE30473AE1E25AB56 /* GraphQLQueryWatcher.swift */, - ABD0FB59CA8C02E9DFE2C186DF8A6AB2 /* GraphQLResponse.swift */, - 9BFE9722636C12702C05748430E53F78 /* GraphQLResponseGenerator.swift */, - 74920BE3F88237C4C3DDA76227BDF2E1 /* GraphQLResult.swift */, - AAFC7CF56F4E8EFC98F4FE6FB20E6384 /* GraphQLResultAccumulator.swift */, - AC36364F2001FAE110A5756E8B9B04B5 /* GraphQLResultMapper.swift */, - FC35D07889D7B7A9717D60C50C0649BF /* GraphQLResultNormalizer.swift */, - C070371DEFF116F4E1181DE8DD58D0A9 /* GraphQLValues.swift */, - 1F59A34F6FBBC01495FA0EEFC7CFF5A1 /* HTTPNetworkTransport.swift */, - 503243847991ECCB90434FCB18B8113B /* InMemoryNormalizedCache.swift */, - DFA61605E0CF60C23447BD3645A7F6C6 /* JSON.swift */, - B5187F20FDC2CCB00F92F8634B15C62C /* JSONSerializationFormat.swift */, - 96B258D77C330EC72CA1F86CFADB9702 /* JSONStandardTypeConversions.swift */, - B149332CA02057A2C99DAD2391F92FB0 /* Locking.swift */, - 2FB067970EBEEE32B9F9B8CF8FA457C9 /* NetworkTransport.swift */, - DBD0B42CB8E4BF2A6661253EFD4F57F6 /* NormalizedCache.swift */, - 715E2F902F7A750814E054D46287C284 /* Promise.swift */, - 32ADDCAC7A45EFB20A30DA69CF38976B /* Record.swift */, - 0CBABBFA8407D460F35404C52E1C0C74 /* RecordSet.swift */, - 53166497143EB24EE51313830B0378AA /* Result.swift */, - 4C9F12AB5DA3FD3FAB850FD3819EBD3D /* Selections.swift */, - 8BF7A27967561797D7548C7F8496B176 /* Utilities.swift */, + 401F038C1A93F7D71496AEEA082C8187 /* ApolloClient.swift */, + 8037D537446EB8C0C0FC358AACDFBCDB /* ApolloStore.swift */, + 11877C4D6F494C575C9E88FA15AA98FA /* AsynchronousOperation.swift */, + 54AAF8298970F6D90491BF3D752ECFB6 /* Collections.swift */, + 9945BAB50B7F6365B802F25E004A2566 /* DataLoader.swift */, + 9601BDB184C7FA2886421EDA6BC51FE0 /* Dictionary+KeyPath.swift */, + 3CF244F5154EDAAAD43F2B551C5B1B34 /* GraphQLDependencyTracker.swift */, + BC7DBCA1F40B1DC0B762047428B9D510 /* GraphQLError.swift */, + 3934F1038706695A3609AADC734C098B /* GraphQLExecutor.swift */, + CCC1A0D34707B7C5AB1AC9821F092A5F /* GraphQLOperation.swift */, + CD979ED094ED16CE55D3AB05A872C77F /* GraphQLOutputType.swift */, + EFFEE6F4624C74CD2CA4DC90DA4760F4 /* GraphQLQueryWatcher.swift */, + CEF7E7502D3D6F1C9360B904243E76A1 /* GraphQLResponse.swift */, + E1DE0FBDF2EC85A9CB28E87D3016B69C /* GraphQLResponseGenerator.swift */, + B91E033EE4268436D667B4A0516DF63B /* GraphQLResult.swift */, + 71B233364D9628F60058A864201DEC5A /* GraphQLResultAccumulator.swift */, + 2211D04CA00FD182ADC495BC12C7E0FA /* GraphQLResultMapper.swift */, + 29444EF033FEC5301794AA3FF05E1255 /* GraphQLResultNormalizer.swift */, + 677F4603A01A5098CB5B4238A4B5E16D /* GraphQLValues.swift */, + F0E0E7DEA40266C91EEEF8DE80F9A821 /* HTTPNetworkTransport.swift */, + 2F18865B76F1771AD7CAF6C87A0B0A76 /* InMemoryNormalizedCache.swift */, + 7C463C83D40DC933D44D3FAFBB8D476E /* JSON.swift */, + C548175F116A5CF621194BC4BA3581C8 /* JSONSerializationFormat.swift */, + 951BEA39308FE598897A6798B562CDEA /* JSONStandardTypeConversions.swift */, + 953093E4245EE7B30DC3346C75ABDEDE /* Locking.swift */, + A42E64B88B3B4D17143C3055589082E2 /* NetworkTransport.swift */, + CD4F73A249897121C29746449E83681B /* NormalizedCache.swift */, + 1510979B9E8022F1675C9B31D38A561D /* Promise.swift */, + AF6D660C4C1C51D6932C1A19AD7991A9 /* Record.swift */, + ECF01E514190839B447A1DC628224BFD /* RecordSet.swift */, + AB48C810AC51836598FF53899021CAAA /* Result.swift */, + DAE831C7B824D4684E2AA58D8A0E547A /* Selections.swift */, + 815355E6475667E8ED041F3EC76D4880 /* Utilities.swift */, ); name = Sources; path = Sources; @@ -544,13 +512,24 @@ name = standard; sourceTree = ""; }; - 7D4C8FC23C42C3AE0AED166522F344E4 /* SqliteNormalizedCache */ = { + 78447C38835AFAF2D4719B5693177D47 /* Core */ = { isa = PBXGroup; children = ( - A5900DA33E216DB7A1CCDB272F1B0CFE /* SqliteNormalizedCache.swift */, + 57421CFAE26C3DB80E02F120D406D70C /* Sources */, ); - name = SqliteNormalizedCache; - path = SqliteNormalizedCache; + name = Core; + sourceTree = ""; + }; + 7B1D34DAF505473A064474B664D669E1 /* Apollo */ = { + isa = PBXGroup; + children = ( + 78447C38835AFAF2D4719B5693177D47 /* Core */, + 1402D1396693920C1E95678F7F963657 /* Resources */, + B13577B7FE56A385D1ED14BFBC6F77B1 /* SqliteNormalizedCache */, + BBE188F1CAF08BFC2744FE0C194B5E5F /* Support Files */, + ); + name = Apollo; + path = ../..; sourceTree = ""; }; 7DB346D0F39D3F0E887471402A8071AB = { @@ -565,18 +544,6 @@ ); sourceTree = ""; }; - 84AAC42334BA0A537FA21127F98BCE42 /* Apollo */ = { - isa = PBXGroup; - children = ( - 036E276F1B88E1EA4E926674B067BEAF /* Resources */, - 5647491FC16879125D472701DA7D8074 /* Sources */, - C30F51D1002D9EE51192D5EB07AC8CDF /* SqliteNormalizedCache */, - 423A21A61CA455A6041B1607B8A6FF33 /* Support Files */, - ); - name = Apollo; - path = ../..; - sourceTree = ""; - }; 8EA1531CEA4152F55BDDB1F0EEB2000C /* Targets Support Files */ = { isa = PBXGroup; children = ( @@ -588,14 +555,37 @@ name = "Targets Support Files"; sourceTree = ""; }; - C30F51D1002D9EE51192D5EB07AC8CDF /* SqliteNormalizedCache */ = { + B13577B7FE56A385D1ED14BFBC6F77B1 /* SqliteNormalizedCache */ = { isa = PBXGroup; children = ( - 035B096F07B7DC66E76DA60E02CC4F2A /* Sources */, + C7998953974AB0B2D1633E310384F22B /* Sources */, ); name = SqliteNormalizedCache; sourceTree = ""; }; + BBE188F1CAF08BFC2744FE0C194B5E5F /* Support Files */ = { + isa = PBXGroup; + children = ( + 21E66D4ED8F6CC300DC7FE2F93A367A2 /* Apollo.modulemap */, + 391CA98836DC28B658B23EE172EA2DC5 /* Apollo.xcconfig */, + 42E5D07D44401421901F612C8D4837BC /* Apollo-dummy.m */, + 7491C42CA1F0D47FF353804EDFC308A7 /* Apollo-prefix.pch */, + 957927E0DFC5FB03E6CA1B87814A9E10 /* Apollo-umbrella.h */, + D9D01E19268F158CBD26569BCDA0CB2A /* Info.plist */, + ); + name = "Support Files"; + path = "Example/Pods/Target Support Files/Apollo"; + sourceTree = ""; + }; + C7998953974AB0B2D1633E310384F22B /* Sources */ = { + isa = PBXGroup; + children = ( + FCB4506966D17F3167DF2980953BEFE9 /* SqliteNormalizedCache */, + ); + name = Sources; + path = Sources; + sourceTree = ""; + }; CADF8E7A438C737280A69D0E24D5BDDC /* Products */ = { isa = PBXGroup; children = ( @@ -627,6 +617,24 @@ path = "Target Support Files/Pods-ApolloPerformanceTests"; sourceTree = ""; }; + EF01E8B6E2C8E0469E9FAC20340D45B6 /* scripts */ = { + isa = PBXGroup; + children = ( + 3BEC86F0EAB93BCB8EA7A6615DBC98BE /* check-and-run-apollo-codegen.sh */, + ); + name = scripts; + path = scripts; + sourceTree = ""; + }; + FCB4506966D17F3167DF2980953BEFE9 /* SqliteNormalizedCache */ = { + isa = PBXGroup; + children = ( + E5055831E03BFDFD4C3C8D027419F425 /* SqliteNormalizedCache.swift */, + ); + name = SqliteNormalizedCache; + path = SqliteNormalizedCache; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -1402,7 +1410,7 @@ }; BF59425203BD23DBB85AF465D9BB20B7 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8910258E5AD30319CA72E05B90C4AC6D /* Apollo.xcconfig */; + baseConfigurationReference = 391CA98836DC28B658B23EE172EA2DC5 /* Apollo.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1435,7 +1443,7 @@ }; D72042F45DC3C77B677875802D08ECDF /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8910258E5AD30319CA72E05B90C4AC6D /* Apollo.xcconfig */; + baseConfigurationReference = 391CA98836DC28B658B23EE172EA2DC5 /* Apollo.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; From 1c95de2e6339a56248cf2fa38fb827038a4b2083 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Tue, 11 Apr 2017 17:29:38 -0700 Subject: [PATCH 31/76] Add back line in WatchQueryTests.swift that was accidentally removed during rebase --- Example/ApolloTests/WatchQueryTests.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Example/ApolloTests/WatchQueryTests.swift b/Example/ApolloTests/WatchQueryTests.swift index a3a2bda850..e37b232a31 100644 --- a/Example/ApolloTests/WatchQueryTests.swift +++ b/Example/ApolloTests/WatchQueryTests.swift @@ -123,6 +123,8 @@ class WatchQueryTests: XCTestCase { } expectation = self.expectation(description: "Updated after fetching other query") + + client.fetch(query: HeroNameQuery(), cachePolicy: .fetchIgnoringCacheData) waitForExpectations(timeout: 1.0, handler: nil) } From 840905776ef5e1c0e59e618d656548017f796034 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Wed, 12 Apr 2017 13:04:46 -0700 Subject: [PATCH 32/76] =?UTF-8?q?Move=20codegen=20script=20resource=20unde?= =?UTF-8?q?r=20=E2=80=98Core=E2=80=99=20target=20in=20Apollo.podspec?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Apollo.podspec | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Apollo.podspec b/Apollo.podspec index c1bd9f6870..1aa54cb857 100644 --- a/Apollo.podspec +++ b/Apollo.podspec @@ -11,13 +11,12 @@ Pod::Spec.new do |s| s.requires_arc = true - s.resource = 'scripts/check-and-run-apollo-codegen.sh' - s.subspec 'Core' do |ss| ss.ios.deployment_target = '8.0' ss.osx.deployment_target = '10.10' ss.tvos.deployment_target = '9.0' ss.source_files = 'Sources/*.swift' + ss.resource = 'scripts/check-and-run-apollo-codegen.sh' end s.subspec 'SqliteNormalizedCache' do |ss| From 4a4457db8b91d4c79dd3b0d78a52183744c14848 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Wed, 12 Apr 2017 13:09:14 -0700 Subject: [PATCH 33/76] Make InMemoryNormalizedCache public, since it will need to be instantiated by consumers --- Sources/InMemoryNormalizedCache.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/InMemoryNormalizedCache.swift b/Sources/InMemoryNormalizedCache.swift index b3465dd06d..ce47a3fb15 100644 --- a/Sources/InMemoryNormalizedCache.swift +++ b/Sources/InMemoryNormalizedCache.swift @@ -1,16 +1,16 @@ -final class InMemoryNormalizedCache: NormalizedCache { +public final class InMemoryNormalizedCache: NormalizedCache { private var records: RecordSet - init(records: RecordSet = RecordSet()) { + public init(records: RecordSet = RecordSet()) { self.records = records } - func loadRecords(forKeys keys: [CacheKey]) -> Promise<[Record?]> { + public func loadRecords(forKeys keys: [CacheKey]) -> Promise<[Record?]> { let records = keys.map { self.records[$0] } return Promise(fulfilled: records) } - func merge(records: RecordSet) -> Promise> { + public func merge(records: RecordSet) -> Promise> { return Promise(fulfilled: self.records.merge(records: records)) } } From 1d195f7c1ce8cd2549754c11c721b2785fd2523e Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Wed, 12 Apr 2017 15:23:00 -0700 Subject: [PATCH 34/76] Make SqliteNormalizedCache public, since it will need to be instantiated by consumers --- Sources/SqliteNormalizedCache/SqliteNormalizedCache.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/SqliteNormalizedCache/SqliteNormalizedCache.swift b/Sources/SqliteNormalizedCache/SqliteNormalizedCache.swift index eacd678e58..97770e31a0 100644 --- a/Sources/SqliteNormalizedCache/SqliteNormalizedCache.swift +++ b/Sources/SqliteNormalizedCache/SqliteNormalizedCache.swift @@ -1,14 +1,14 @@ import SQLite -enum SqliteNormalizedCacheError: Error { +public enum SqliteNormalizedCacheError: Error { case invalidRecordEncoding(record: String) case invalidRecordShape(object: Any) case invalidRecordValue(value: Any) } -final class SqliteNormalizedCache: NormalizedCache { +public final class SqliteNormalizedCache: NormalizedCache { - init(fileURL: URL) throws { + public init(fileURL: URL) throws { db = try Connection(.uri(fileURL.absoluteString), readonly: false) try createTableIfNeeded() } From 2a6ec2d34f5a9fb45c7aa2a3a33fd2bcf9cbcfe5 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Thu, 13 Apr 2017 16:31:07 -0700 Subject: [PATCH 35/76] Split podspec into Apollo.podspec and ApolloSQLite.podspec --- Apollo.podspec | 19 +++++-------------- ApolloSQLite.podspec | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 14 deletions(-) create mode 100644 ApolloSQLite.podspec diff --git a/Apollo.podspec b/Apollo.podspec index 1aa54cb857..a0c0320fbf 100644 --- a/Apollo.podspec +++ b/Apollo.podspec @@ -11,18 +11,9 @@ Pod::Spec.new do |s| s.requires_arc = true - s.subspec 'Core' do |ss| - ss.ios.deployment_target = '8.0' - ss.osx.deployment_target = '10.10' - ss.tvos.deployment_target = '9.0' - ss.source_files = 'Sources/*.swift' - ss.resource = 'scripts/check-and-run-apollo-codegen.sh' - end - - s.subspec 'SqliteNormalizedCache' do |ss| - ss.ios.deployment_target = '8.0' - ss.osx.deployment_target = '10.10' - ss.source_files = "Sources/SqliteNormalizedCache/*.swift" - ss.dependency 'SQLite.swift', '~> 0.11' - end + s.ios.deployment_target = '8.0' + s.osx.deployment_target = '10.10' + s.tvos.deployment_target = '9.0' + s.source_files = 'Sources/*.swift' + s.resource = 'scripts/check-and-run-apollo-codegen.sh' end diff --git a/ApolloSQLite.podspec b/ApolloSQLite.podspec new file mode 100644 index 0000000000..ead5511302 --- /dev/null +++ b/ApolloSQLite.podspec @@ -0,0 +1,18 @@ +Pod::Spec.new do |s| + s.name = 'ApolloSQLite' + s.version = `scripts/get-version.sh` + s.author = 'Meteor Development Group' + s.homepage = 'https://github.com/apollographql/apollo-ios' + s.license = { :type => 'MIT', :file => 'LICENSE' } + + s.summary = "A GraphQL client for iOS, written in Swift." + + s.source = { :git => 'https://github.com/apollographql/apollo-ios.git', :tag => s.version } + + s.requires_arc = true + + s.ios.deployment_target = '8.0' + s.osx.deployment_target = '10.10' + s.source_files = "Sources/SqliteNormalizedCache/*.swift" + s.dependency 'SQLite.swift', '~> 0.11' +end From 91af7ce3ae962734ef2988f39f936b622b20a36f Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Fri, 14 Apr 2017 10:39:14 -0700 Subject: [PATCH 36/76] =?UTF-8?q?Restructure=20project=20into=20two=20sepa?= =?UTF-8?q?rate=20projects=20(Apollo=20and=20ApolloSQLite)=20with=20shared?= =?UTF-8?q?=20=E2=80=9Cparameterized=E2=80=9D=20unit=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Apollo.xcodeproj/project.pbxproj | 762 +++++++- .../xcschemes/TestHost iOS.xcscheme | 22 +- .../ApolloExample.xcodeproj/project.pbxproj | 1195 ------------- .../contents.xcworkspacedata | 7 - .../xcschemes/ApolloExample.xcscheme | 111 -- .../contents.xcworkspacedata | 10 - Example/ApolloExample/AppDelegate.swift | 46 - Example/ApolloExample/ViewController.swift | 25 - Example/Podfile | 23 - Example/Podfile.lock | 25 - .../Pods/Local Podspecs/Apollo.podspec.json | 47 - Example/Pods/Manifest.lock | 25 - Example/Pods/Pods.xcodeproj/project.pbxproj | 1578 ----------------- .../CocoaPods/appletvos/module.modulemap | 4 - .../appletvsimulator/module.modulemap | 4 - .../CocoaPods/iphoneos-10.0/module.modulemap | 4 - .../CocoaPods/iphoneos/module.modulemap | 4 - .../iphonesimulator-10.0/module.modulemap | 4 - .../iphonesimulator/module.modulemap | 4 - .../CocoaPods/macosx-10.11/module.modulemap | 4 - .../CocoaPods/macosx-10.12/module.modulemap | 4 - .../CocoaPods/macosx/module.modulemap | 4 - .../CocoaPods/watchos/module.modulemap | 4 - .../CocoaPods/watchsimulator/module.modulemap | 4 - Example/Pods/SQLite.swift/LICENSE.txt | 21 - Example/Pods/SQLite.swift/README.md | 263 --- .../Sources/SQLite/Core/Blob.swift | 60 - .../Sources/SQLite/Core/Connection.swift | 756 -------- .../Sources/SQLite/Core/Statement.swift | 297 ---- .../Sources/SQLite/Core/Value.swift | 132 -- .../Sources/SQLite/Extensions/FTS4.swift | 346 ---- .../Sources/SQLite/Extensions/FTS5.swift | 97 - .../Sources/SQLite/Extensions/RTree.swift | 37 - .../Sources/SQLite/Foundation.swift | 108 -- .../SQLite.swift/Sources/SQLite/Helpers.swift | 130 -- .../Pods/SQLite.swift/Sources/SQLite/SQLite.h | 6 - .../SQLite/Typed/AggregateFunctions.swift | 251 --- .../Sources/SQLite/Typed/Collation.swift | 69 - .../Sources/SQLite/Typed/CoreFunctions.swift | 683 ------- .../SQLite/Typed/CustomFunctions.swift | 136 -- .../Sources/SQLite/Typed/Expression.swift | 147 -- .../Sources/SQLite/Typed/Operators.swift | 541 ------ .../Sources/SQLite/Typed/Query.swift | 1162 ------------ .../Sources/SQLite/Typed/Schema.swift | 519 ------ .../Sources/SQLite/Typed/Setter.swift | 277 --- .../Sources/SQLiteObjc/SQLite-Bridging.m | 138 -- .../Sources/SQLiteObjc/fts3_tokenizer.h | 161 -- .../SQLiteObjc/include/SQLite-Bridging.h | 37 - .../Apollo/Apollo-dummy.m | 5 - .../Apollo/Apollo-prefix.pch | 12 - .../Apollo/Apollo-umbrella.h | 16 - .../Apollo/Apollo.modulemap | 6 - .../Apollo/Apollo.xcconfig | 11 - .../Target Support Files/Apollo/Info.plist | 26 - .../Pods-ApolloExample/Info.plist | 26 - ...ds-ApolloExample-acknowledgements.markdown | 53 - .../Pods-ApolloExample-acknowledgements.plist | 91 - .../Pods-ApolloExample-dummy.m | 5 - .../Pods-ApolloExample-frameworks.sh | 101 -- .../Pods-ApolloExample-resources.sh | 99 -- .../Pods-ApolloExample-umbrella.h | 16 - .../Pods-ApolloExample.debug.xcconfig | 10 - .../Pods-ApolloExample.modulemap | 6 - .../Pods-ApolloExample.release.xcconfig | 10 - .../Pods-ApolloPerformanceTests/Info.plist | 26 - ...PerformanceTests-acknowledgements.markdown | 53 - ...lloPerformanceTests-acknowledgements.plist | 91 - .../Pods-ApolloPerformanceTests-dummy.m | 5 - .../Pods-ApolloPerformanceTests-frameworks.sh | 101 -- .../Pods-ApolloPerformanceTests-resources.sh | 99 -- .../Pods-ApolloPerformanceTests-umbrella.h | 16 - ...Pods-ApolloPerformanceTests.debug.xcconfig | 10 - .../Pods-ApolloPerformanceTests.modulemap | 6 - ...ds-ApolloPerformanceTests.release.xcconfig | 10 - .../Pods-ApolloTests/Info.plist | 26 - ...Pods-ApolloTests-acknowledgements.markdown | 53 - .../Pods-ApolloTests-acknowledgements.plist | 91 - .../Pods-ApolloTests/Pods-ApolloTests-dummy.m | 5 - .../Pods-ApolloTests-frameworks.sh | 101 -- .../Pods-ApolloTests-resources.sh | 99 -- .../Pods-ApolloTests-umbrella.h | 16 - .../Pods-ApolloTests.debug.xcconfig | 10 - .../Pods-ApolloTests.modulemap | 6 - .../Pods-ApolloTests.release.xcconfig | 10 - .../Pods-StarWarsAPI/Info.plist | 26 - ...Pods-StarWarsAPI-acknowledgements.markdown | 53 - .../Pods-StarWarsAPI-acknowledgements.plist | 91 - .../Pods-StarWarsAPI/Pods-StarWarsAPI-dummy.m | 5 - .../Pods-StarWarsAPI-resources.sh | 99 -- .../Pods-StarWarsAPI-umbrella.h | 16 - .../Pods-StarWarsAPI.debug.xcconfig | 9 - .../Pods-StarWarsAPI.modulemap | 6 - .../Pods-StarWarsAPI.release.xcconfig | 9 - .../SQLite.swift/Info.plist | 26 - .../SQLite.swift/SQLite.swift-dummy.m | 5 - .../SQLite.swift/SQLite.swift-prefix.pch | 12 - .../SQLite.swift/SQLite.swift-umbrella.h | 18 - .../SQLite.swift/SQLite.swift.modulemap | 6 - .../SQLite.swift/SQLite.swift.xcconfig | 23 - Example/TestHost iOS/AppDelegate.swift | 46 - .../AppIcon.appiconset/Contents.json | 93 - .../Base.lproj/LaunchScreen.storyboard | 27 - .../TestHost iOS/Base.lproj/Main.storyboard | 26 - Example/TestHost iOS/Info.plist | 45 - Example/TestHost iOS/ViewController.swift | 25 - .../ApolloPerformanceTests/Info.plist | 0 .../NormalizedCachingTests.swift | 0 .../ApolloPerformanceTests/PromiseTests.swift | 0 .../ApolloTests/BatchedLoadTests.swift | 0 .../ApolloTests/CacheKeyForFieldTests.swift | 0 .../ApolloTests/CachePersistenceTests.swift | 0 .../ApolloTests/DataLoaderTests.swift | 0 .../ApolloTests/FetchQueryTests.swift | 12 +- .../GraphQLExecutorFieldValueTests.swift | 0 .../GraphQLInputValueEncodingTests.swift | 0 {Example => Tests}/ApolloTests/Info.plist | 0 .../ApolloTests/LoadQueryFromStoreTests.swift | 16 +- .../ApolloTests/MockNetworkTransport.swift | 0 .../ApolloTests/NormalizeQueryResults.swift | 0 .../ApolloTests/ParseQueryResponseTests.swift | 0 .../ApolloTests/PromiseTests.swift | 0 .../StarWarsServerCachingRoundtripTests.swift | 2 +- .../ApolloTests/StarWarsServerTests.swift | 4 +- .../ApolloTests/StoreTransactionTests.swift | 12 +- .../ApolloTests/Utilities.swift | 23 - .../ApolloTests/WatchQueryTests.swift | 8 +- {Example => Tests}/StarWarsAPI/API.swift | 0 .../CreateReviewForEpisode.graphql | 0 .../StarWarsAPI/HeroAndFriendsNames.graphql | 0 .../StarWarsAPI/HeroAppearsIn.graphql | 0 .../StarWarsAPI/HeroDetails.graphql | 0 .../HeroDetailsWithFragment.graphql | 0 .../StarWarsAPI/HeroName.graphql | 0 .../StarWarsAPI/HeroNameConditional.graphql | 0 .../HeroParentTypeDependentField.graphql | 0 .../HeroTypeDependentAliasedField.graphql | 0 .../StarWarsAPI/HumanWithNullMass.graphql | 0 {Example => Tests}/StarWarsAPI/Info.plist | 0 .../StarWarsAPI/SameHeroTwice.graphql | 0 {Example => Tests}/StarWarsAPI/StarWarsAPI.h | 0 .../StarWarsAPI/Starship.graphql | 0 .../StarWarsAPI/TwoHeroes.graphql | 0 {Example => Tests}/StarWarsAPI/schema.json | 0 Tests/TestCacheProvider.swift | 11 + Tests/TestHost iOS/AppDelegate.swift | 6 + .../AppIcon.appiconset/Contents.json | 0 .../Base.lproj/LaunchScreen.storyboard | 0 .../TestHost iOS}/Base.lproj/Main.storyboard | 0 .../TestHost iOS}/Info.plist | 4 +- Tests/TestHost iOS/ViewController.swift | 4 + 150 files changed, 819 insertions(+), 11570 deletions(-) rename {Example/ApolloExample.xcodeproj => Apollo.xcodeproj}/xcshareddata/xcschemes/TestHost iOS.xcscheme (81%) delete mode 100644 Example/ApolloExample.xcodeproj/project.pbxproj delete mode 100644 Example/ApolloExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Example/ApolloExample.xcodeproj/xcshareddata/xcschemes/ApolloExample.xcscheme delete mode 100644 Example/ApolloExample.xcworkspace/contents.xcworkspacedata delete mode 100644 Example/ApolloExample/AppDelegate.swift delete mode 100644 Example/ApolloExample/ViewController.swift delete mode 100644 Example/Podfile delete mode 100644 Example/Podfile.lock delete mode 100644 Example/Pods/Local Podspecs/Apollo.podspec.json delete mode 100644 Example/Pods/Manifest.lock delete mode 100644 Example/Pods/Pods.xcodeproj/project.pbxproj delete mode 100644 Example/Pods/SQLite.swift/CocoaPods/appletvos/module.modulemap delete mode 100644 Example/Pods/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap delete mode 100644 Example/Pods/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap delete mode 100644 Example/Pods/SQLite.swift/CocoaPods/iphoneos/module.modulemap delete mode 100644 Example/Pods/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap delete mode 100644 Example/Pods/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap delete mode 100644 Example/Pods/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap delete mode 100644 Example/Pods/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap delete mode 100644 Example/Pods/SQLite.swift/CocoaPods/macosx/module.modulemap delete mode 100644 Example/Pods/SQLite.swift/CocoaPods/watchos/module.modulemap delete mode 100644 Example/Pods/SQLite.swift/CocoaPods/watchsimulator/module.modulemap delete mode 100644 Example/Pods/SQLite.swift/LICENSE.txt delete mode 100644 Example/Pods/SQLite.swift/README.md delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Core/Blob.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Core/Connection.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Core/Statement.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Core/Value.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Extensions/RTree.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Foundation.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Helpers.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/SQLite.h delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/Collation.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/Expression.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/Operators.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/Query.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/Schema.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLite/Typed/Setter.swift delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h delete mode 100644 Example/Pods/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h delete mode 100644 Example/Pods/Target Support Files/Apollo/Apollo-dummy.m delete mode 100644 Example/Pods/Target Support Files/Apollo/Apollo-prefix.pch delete mode 100644 Example/Pods/Target Support Files/Apollo/Apollo-umbrella.h delete mode 100644 Example/Pods/Target Support Files/Apollo/Apollo.modulemap delete mode 100644 Example/Pods/Target Support Files/Apollo/Apollo.xcconfig delete mode 100644 Example/Pods/Target Support Files/Apollo/Info.plist delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Info.plist delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.markdown delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.plist delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-dummy.m delete mode 100755 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-frameworks.sh delete mode 100755 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-resources.sh delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-umbrella.h delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.debug.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.modulemap delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.release.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Info.plist delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.markdown delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.plist delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-dummy.m delete mode 100755 Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-frameworks.sh delete mode 100755 Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-resources.sh delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-umbrella.h delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.debug.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.modulemap delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.release.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloTests/Info.plist delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.markdown delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.plist delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-dummy.m delete mode 100755 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-frameworks.sh delete mode 100755 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-resources.sh delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-umbrella.h delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.debug.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap delete mode 100644 Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.release.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Info.plist delete mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.markdown delete mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.plist delete mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-dummy.m delete mode 100755 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-resources.sh delete mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-umbrella.h delete mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.debug.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.modulemap delete mode 100644 Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.release.xcconfig delete mode 100644 Example/Pods/Target Support Files/SQLite.swift/Info.plist delete mode 100644 Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-dummy.m delete mode 100644 Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-prefix.pch delete mode 100644 Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-umbrella.h delete mode 100644 Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.modulemap delete mode 100644 Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.xcconfig delete mode 100644 Example/TestHost iOS/AppDelegate.swift delete mode 100644 Example/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 Example/TestHost iOS/Base.lproj/LaunchScreen.storyboard delete mode 100644 Example/TestHost iOS/Base.lproj/Main.storyboard delete mode 100644 Example/TestHost iOS/Info.plist delete mode 100644 Example/TestHost iOS/ViewController.swift rename {Example => Tests}/ApolloPerformanceTests/Info.plist (100%) rename {Example => Tests}/ApolloPerformanceTests/NormalizedCachingTests.swift (100%) rename {Example => Tests}/ApolloPerformanceTests/PromiseTests.swift (100%) rename {Example => Tests}/ApolloTests/BatchedLoadTests.swift (100%) rename {Example => Tests}/ApolloTests/CacheKeyForFieldTests.swift (100%) rename {Example => Tests}/ApolloTests/CachePersistenceTests.swift (100%) rename {Example => Tests}/ApolloTests/DataLoaderTests.swift (100%) rename {Example => Tests}/ApolloTests/FetchQueryTests.swift (93%) rename {Example => Tests}/ApolloTests/GraphQLExecutorFieldValueTests.swift (100%) rename {Example => Tests}/ApolloTests/GraphQLInputValueEncodingTests.swift (100%) rename {Example => Tests}/ApolloTests/Info.plist (100%) rename {Example => Tests}/ApolloTests/LoadQueryFromStoreTests.swift (91%) rename {Example => Tests}/ApolloTests/MockNetworkTransport.swift (100%) rename {Example => Tests}/ApolloTests/NormalizeQueryResults.swift (100%) rename {Example => Tests}/ApolloTests/ParseQueryResponseTests.swift (100%) rename {Example => Tests}/ApolloTests/PromiseTests.swift (100%) rename {Example => Tests}/ApolloTests/StarWarsServerCachingRoundtripTests.swift (98%) rename {Example => Tests}/ApolloTests/StarWarsServerTests.swift (98%) rename {Example => Tests}/ApolloTests/StoreTransactionTests.swift (93%) rename {Example => Tests}/ApolloTests/Utilities.swift (70%) rename {Example => Tests}/ApolloTests/WatchQueryTests.swift (96%) rename {Example => Tests}/StarWarsAPI/API.swift (100%) rename {Example => Tests}/StarWarsAPI/CreateReviewForEpisode.graphql (100%) rename {Example => Tests}/StarWarsAPI/HeroAndFriendsNames.graphql (100%) rename {Example => Tests}/StarWarsAPI/HeroAppearsIn.graphql (100%) rename {Example => Tests}/StarWarsAPI/HeroDetails.graphql (100%) rename {Example => Tests}/StarWarsAPI/HeroDetailsWithFragment.graphql (100%) rename {Example => Tests}/StarWarsAPI/HeroName.graphql (100%) rename {Example => Tests}/StarWarsAPI/HeroNameConditional.graphql (100%) rename {Example => Tests}/StarWarsAPI/HeroParentTypeDependentField.graphql (100%) rename {Example => Tests}/StarWarsAPI/HeroTypeDependentAliasedField.graphql (100%) rename {Example => Tests}/StarWarsAPI/HumanWithNullMass.graphql (100%) rename {Example => Tests}/StarWarsAPI/Info.plist (100%) rename {Example => Tests}/StarWarsAPI/SameHeroTwice.graphql (100%) rename {Example => Tests}/StarWarsAPI/StarWarsAPI.h (100%) rename {Example => Tests}/StarWarsAPI/Starship.graphql (100%) rename {Example => Tests}/StarWarsAPI/TwoHeroes.graphql (100%) rename {Example => Tests}/StarWarsAPI/schema.json (100%) create mode 100644 Tests/TestCacheProvider.swift create mode 100644 Tests/TestHost iOS/AppDelegate.swift rename {Example/ApolloExample => Tests/TestHost iOS}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {Example/ApolloExample => Tests/TestHost iOS}/Base.lproj/LaunchScreen.storyboard (100%) rename {Example/ApolloExample => Tests/TestHost iOS}/Base.lproj/Main.storyboard (100%) rename {Example/ApolloExample => Tests/TestHost iOS}/Info.plist (95%) create mode 100644 Tests/TestHost iOS/ViewController.swift diff --git a/Apollo.xcodeproj/project.pbxproj b/Apollo.xcodeproj/project.pbxproj index 181ee62a0d..0cc3b45176 100644 --- a/Apollo.xcodeproj/project.pbxproj +++ b/Apollo.xcodeproj/project.pbxproj @@ -7,32 +7,63 @@ objects = { /* Begin PBXBuildFile section */ - 54623F541E9D8CD2005D1A76 /* InMemoryNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54623F531E9D8CD2005D1A76 /* InMemoryNormalizedCache.swift */; }; + 54DDB0921EA045870009DD99 /* InMemoryNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB0911EA045870009DD99 /* InMemoryNormalizedCache.swift */; }; + 54DDB0951EA13C700009DD99 /* TestCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB0931EA13C1B0009DD99 /* TestCacheProvider.swift */; }; + 9F0F98D41E7AC17D00BF0371 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F0F98D31E7AC17D00BF0371 /* StoreTransactionTests.swift */; }; 9F0F98E11E7BCC3400BF0371 /* Dictionary+KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F0F98E01E7BCC3400BF0371 /* Dictionary+KeyPath.swift */; }; 9F27D4641D40379500715680 /* JSONStandardTypeConversions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F27D4631D40379500715680 /* JSONStandardTypeConversions.swift */; }; + 9F295E2D1E27419800A24949 /* StarWarsServerCachingRoundtripTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F295E2B1E27418F00A24949 /* StarWarsServerCachingRoundtripTests.swift */; }; + 9F295E311E27534800A24949 /* NormalizeQueryResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F295E301E27534800A24949 /* NormalizeQueryResults.swift */; }; 9F295E381E277B2A00A24949 /* GraphQLResultNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F295E371E277B2A00A24949 /* GraphQLResultNormalizer.swift */; }; + 9F438D071E6C2FD9007BDC1A /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FC750441D2A532C00458D91 /* Apollo.framework */; }; + 9F438D081E6C30B1007BDC1A /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */; }; + 9F533AB31E6C4A4200CBE097 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F438D0B1E6C494C007BDC1A /* BatchedLoadTests.swift */; }; 9F55347B1DE1DB2100E54264 /* ApolloStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F55347A1DE1DB2100E54264 /* ApolloStore.swift */; }; + 9F55347E1DE1DB3500E54264 /* LoadQueryFromStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F55347D1DE1DB3500E54264 /* LoadQueryFromStoreTests.swift */; }; 9F578D901D8D2CB300C0EA36 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F578D8F1D8D2CB300C0EA36 /* Utilities.swift */; }; + 9F6291C71E39775000CDA57B /* MockNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDFD2E1E3579B6007519DC /* MockNetworkTransport.swift */; }; + 9F69FFA71D4271F400E000B1 /* StarWarsServerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F69FFA61D4271F400E000B1 /* StarWarsServerTests.swift */; }; 9F69FFA91D42855900E000B1 /* NetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F69FFA81D42855900E000B1 /* NetworkTransport.swift */; }; 9F86B68B1E6438D700B885FF /* GraphQLResultMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F86B68A1E6438D700B885FF /* GraphQLResultMapper.swift */; }; 9F86B6901E65533D00B885FF /* GraphQLResponseGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F86B68F1E65533D00B885FF /* GraphQLResponseGenerator.swift */; }; 9FA6F3681E65DF4700BF8D73 /* GraphQLResultAccumulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FA6F3671E65DF4700BF8D73 /* GraphQLResultAccumulator.swift */; }; 9FADC84A1E6B0B2300C677E6 /* Locking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FADC8491E6B0B2300C677E6 /* Locking.swift */; }; 9FADC84F1E6B865E00C677E6 /* DataLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FADC84E1E6B865E00C677E6 /* DataLoader.swift */; }; + 9FADC8541E6B86D900C677E6 /* DataLoaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FADC8531E6B86D900C677E6 /* DataLoaderTests.swift */; }; 9FC2333D1E66BBF7001E4541 /* GraphQLDependencyTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC2333C1E66BBF7001E4541 /* GraphQLDependencyTracker.swift */; }; 9FC4B9201D2A6F8D0046A641 /* JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC4B91F1D2A6F8D0046A641 /* JSON.swift */; }; + 9FC631361E6AE2080062707E /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC631351E6AE2080062707E /* PromiseTests.swift */; }; + 9FC631381E6AE2080062707E /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FC750441D2A532C00458D91 /* Apollo.framework */; }; 9FC750481D2A532C00458D91 /* Apollo.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FC750471D2A532C00458D91 /* Apollo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9FC7504F1D2A532D00458D91 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FC750441D2A532C00458D91 /* Apollo.framework */; }; 9FC750611D2A59C300458D91 /* GraphQLOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC750601D2A59C300458D91 /* GraphQLOperation.swift */; }; 9FC750631D2A59F600458D91 /* ApolloClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC750621D2A59F600458D91 /* ApolloClient.swift */; }; 9FC9A9BD1E2C271C0023C4D5 /* RecordSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9BC1E2C271C0023C4D5 /* RecordSet.swift */; }; 9FC9A9BF1E2C27FB0023C4D5 /* GraphQLResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9BE1E2C27FB0023C4D5 /* GraphQLResult.swift */; }; 9FC9A9C21E2D3CAF0023C4D5 /* GraphQLValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9C11E2D3CAF0023C4D5 /* GraphQLValues.swift */; }; 9FC9A9C51E2D6CE70023C4D5 /* Selections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9C41E2D6CE70023C4D5 /* Selections.swift */; }; + 9FC9A9C81E2EFE6E0023C4D5 /* CacheKeyForFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9C71E2EFE6E0023C4D5 /* CacheKeyForFieldTests.swift */; }; 9FC9A9CC1E2FD0760023C4D5 /* Record.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9CB1E2FD0760023C4D5 /* Record.swift */; }; 9FC9A9D31E2FD48B0023C4D5 /* GraphQLError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9D21E2FD48B0023C4D5 /* GraphQLError.swift */; }; + 9FCDFD1F1E32EABB007519DC /* FetchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDFD1E1E32EABB007519DC /* FetchQueryTests.swift */; }; 9FCDFD231E33A0D8007519DC /* AsynchronousOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDFD221E33A0D8007519DC /* AsynchronousOperation.swift */; }; 9FCDFD291E33D0CE007519DC /* GraphQLQueryWatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDFD281E33D0CE007519DC /* GraphQLQueryWatcher.swift */; }; + 9FCDFD2C1E35784B007519DC /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDFD2B1E35784B007519DC /* WatchQueryTests.swift */; }; + 9FCE2CEC1E6BDAD100E34457 /* NormalizedCachingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCE2CEB1E6BDAD100E34457 /* NormalizedCachingTests.swift */; }; 9FCE2CEE1E6BE2D900E34457 /* NormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCE2CED1E6BE2D800E34457 /* NormalizedCache.swift */; }; + 9FCE2CFE1E6C213D00E34457 /* StarWarsAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FCE2CFC1E6C213D00E34457 /* StarWarsAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9FCE2D011E6C213D00E34457 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */; }; + 9FCE2D021E6C213D00E34457 /* StarWarsAPI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9FCE2D091E6C254700E34457 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */; }; + 9FCE2D0B1E6C258A00E34457 /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCE2D0A1E6C258A00E34457 /* API.swift */; }; + 9FD637E41E6ACF88001EDBC8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FD637E31E6ACF88001EDBC8 /* AppDelegate.swift */; }; + 9FD637E61E6ACF88001EDBC8 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FD637E51E6ACF88001EDBC8 /* ViewController.swift */; }; + 9FD637E91E6ACF88001EDBC8 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9FD637E71E6ACF88001EDBC8 /* Main.storyboard */; }; + 9FD637EB1E6ACF88001EDBC8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9FD637EA1E6ACF88001EDBC8 /* Assets.xcassets */; }; + 9FD637EE1E6ACF88001EDBC8 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9FD637EC1E6ACF88001EDBC8 /* LaunchScreen.storyboard */; }; + 9FD637F51E6AD43F001EDBC8 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FC750441D2A532C00458D91 /* Apollo.framework */; }; + 9FD637F61E6AD43F001EDBC8 /* Apollo.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9FC750441D2A532C00458D91 /* Apollo.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9FE1C6E71E634C8D00C02284 /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FE1C6E61E634C8D00C02284 /* PromiseTests.swift */; }; 9FE3F3981DADBD870072078F /* check-and-run-apollo-codegen.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9FE3F3971DADBD870072078F /* check-and-run-apollo-codegen.sh */; }; 9FE941CB1E5F20CA007CDD89 /* GraphQLOutputType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FE941CA1E5F20CA007CDD89 /* GraphQLOutputType.swift */; }; 9FE941D01E62C771007CDD89 /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FE941CF1E62C771007CDD89 /* Promise.swift */; }; @@ -42,39 +73,153 @@ 9FF33D811E48B98200F608A4 /* HTTPNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F4DAF2D1E48B84B00EBFF0B /* HTTPNetworkTransport.swift */; }; 9FF90A611DDDEB100034C3B6 /* GraphQLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A5B1DDDEB100034C3B6 /* GraphQLResponse.swift */; }; 9FF90A651DDDEB100034C3B6 /* GraphQLExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A5C1DDDEB100034C3B6 /* GraphQLExecutor.swift */; }; + 9FF90A6F1DDDEB420034C3B6 /* GraphQLInputValueEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A6A1DDDEB420034C3B6 /* GraphQLInputValueEncodingTests.swift */; }; + 9FF90A711DDDEB420034C3B6 /* GraphQLExecutorFieldValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A6B1DDDEB420034C3B6 /* GraphQLExecutorFieldValueTests.swift */; }; + 9FF90A731DDDEB420034C3B6 /* ParseQueryResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A6C1DDDEB420034C3B6 /* ParseQueryResponseTests.swift */; }; + 9FF90A761DDDEB4C0034C3B6 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A751DDDEB4C0034C3B6 /* Utilities.swift */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 9F438D091E6C30C3007BDC1A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9FC7503B1D2A532C00458D91 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9FCE2CF91E6C213D00E34457; + remoteInfo = StarWarsAPI; + }; + 9FC631391E6AE2080062707E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9FC7503B1D2A532C00458D91 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9FC750431D2A532C00458D91; + remoteInfo = "Apollo iOS"; + }; + 9FC6313E1E6AE2D90062707E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9FC7503B1D2A532C00458D91 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9FD637E01E6ACF88001EDBC8; + remoteInfo = "TestHost iOS"; + }; + 9FC750501D2A532D00458D91 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9FC7503B1D2A532C00458D91 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9FC750431D2A532C00458D91; + remoteInfo = Apollo; + }; + 9FCE2CFF1E6C213D00E34457 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9FC7503B1D2A532C00458D91 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9FCE2CF91E6C213D00E34457; + remoteInfo = StarWarsAPI; + }; + 9FCE2D071E6C254000E34457 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9FC7503B1D2A532C00458D91 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9FCE2CF91E6C213D00E34457; + remoteInfo = StarWarsAPI; + }; + 9FD637F71E6AD43F001EDBC8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 9FC7503B1D2A532C00458D91 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9FC750431D2A532C00458D91; + remoteInfo = "Apollo iOS"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9FD637F91E6AD440001EDBC8 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 9FCE2D021E6C213D00E34457 /* StarWarsAPI.framework in Embed Frameworks */, + 9FD637F61E6AD43F001EDBC8 /* Apollo.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ - 54623F531E9D8CD2005D1A76 /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; + 54DDB0911EA045870009DD99 /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; + 54DDB0931EA13C1B0009DD99 /* TestCacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestCacheProvider.swift; sourceTree = ""; }; + 9F0F98D31E7AC17D00BF0371 /* StoreTransactionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreTransactionTests.swift; sourceTree = ""; }; 9F0F98E01E7BCC3400BF0371 /* Dictionary+KeyPath.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Dictionary+KeyPath.swift"; sourceTree = ""; }; 9F27D4631D40379500715680 /* JSONStandardTypeConversions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSONStandardTypeConversions.swift; sourceTree = ""; }; + 9F295E2B1E27418F00A24949 /* StarWarsServerCachingRoundtripTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StarWarsServerCachingRoundtripTests.swift; sourceTree = ""; }; + 9F295E301E27534800A24949 /* NormalizeQueryResults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NormalizeQueryResults.swift; sourceTree = ""; }; 9F295E371E277B2A00A24949 /* GraphQLResultNormalizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResultNormalizer.swift; sourceTree = ""; }; + 9F438D0B1E6C494C007BDC1A /* BatchedLoadTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BatchedLoadTests.swift; sourceTree = ""; }; 9F4DAF2D1E48B84B00EBFF0B /* HTTPNetworkTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPNetworkTransport.swift; sourceTree = ""; }; 9F55347A1DE1DB2100E54264 /* ApolloStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApolloStore.swift; sourceTree = ""; }; + 9F55347D1DE1DB3500E54264 /* LoadQueryFromStoreTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadQueryFromStoreTests.swift; sourceTree = ""; }; 9F578D8F1D8D2CB300C0EA36 /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Framework.xcconfig; path = ../Framework.xcconfig; sourceTree = ""; }; + 9F69FFA61D4271F400E000B1 /* StarWarsServerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StarWarsServerTests.swift; sourceTree = ""; }; 9F69FFA81D42855900E000B1 /* NetworkTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkTransport.swift; sourceTree = ""; }; 9F86B68A1E6438D700B885FF /* GraphQLResultMapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResultMapper.swift; sourceTree = ""; }; 9F86B68F1E65533D00B885FF /* GraphQLResponseGenerator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResponseGenerator.swift; sourceTree = ""; }; 9FA6F3671E65DF4700BF8D73 /* GraphQLResultAccumulator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResultAccumulator.swift; sourceTree = ""; }; 9FADC8491E6B0B2300C677E6 /* Locking.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Locking.swift; sourceTree = ""; }; 9FADC84E1E6B865E00C677E6 /* DataLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataLoader.swift; sourceTree = ""; }; + 9FADC8531E6B86D900C677E6 /* DataLoaderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataLoaderTests.swift; sourceTree = ""; }; 9FC2333C1E66BBF7001E4541 /* GraphQLDependencyTracker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLDependencyTracker.swift; sourceTree = ""; }; 9FC4B91F1D2A6F8D0046A641 /* JSON.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSON.swift; sourceTree = ""; }; + 9FC631331E6AE2080062707E /* ApolloPerformanceTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloPerformanceTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 9FC631351E6AE2080062707E /* PromiseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromiseTests.swift; sourceTree = ""; }; + 9FC631371E6AE2080062707E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9FC750441D2A532C00458D91 /* Apollo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Apollo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9FC750471D2A532C00458D91 /* Apollo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Apollo.h; sourceTree = ""; }; 9FC750491D2A532C00458D91 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9FC7504E1D2A532D00458D91 /* ApolloTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 9FC750551D2A532D00458D91 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9FC750601D2A59C300458D91 /* GraphQLOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLOperation.swift; sourceTree = ""; }; 9FC750621D2A59F600458D91 /* ApolloClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApolloClient.swift; sourceTree = ""; }; 9FC9A9BC1E2C271C0023C4D5 /* RecordSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecordSet.swift; sourceTree = ""; }; 9FC9A9BE1E2C27FB0023C4D5 /* GraphQLResult.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResult.swift; sourceTree = ""; }; 9FC9A9C11E2D3CAF0023C4D5 /* GraphQLValues.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLValues.swift; sourceTree = ""; }; 9FC9A9C41E2D6CE70023C4D5 /* Selections.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Selections.swift; sourceTree = ""; }; + 9FC9A9C71E2EFE6E0023C4D5 /* CacheKeyForFieldTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CacheKeyForFieldTests.swift; sourceTree = ""; }; 9FC9A9CB1E2FD0760023C4D5 /* Record.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Record.swift; sourceTree = ""; }; 9FC9A9D21E2FD48B0023C4D5 /* GraphQLError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLError.swift; sourceTree = ""; }; + 9FCDFD1E1E32EABB007519DC /* FetchQueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchQueryTests.swift; sourceTree = ""; }; 9FCDFD221E33A0D8007519DC /* AsynchronousOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsynchronousOperation.swift; sourceTree = ""; }; 9FCDFD281E33D0CE007519DC /* GraphQLQueryWatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLQueryWatcher.swift; sourceTree = ""; }; + 9FCDFD2B1E35784B007519DC /* WatchQueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchQueryTests.swift; sourceTree = ""; }; + 9FCDFD2E1E3579B6007519DC /* MockNetworkTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockNetworkTransport.swift; sourceTree = ""; }; + 9FCE2CEB1E6BDAD100E34457 /* NormalizedCachingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NormalizedCachingTests.swift; sourceTree = ""; }; 9FCE2CED1E6BE2D800E34457 /* NormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NormalizedCache.swift; sourceTree = ""; }; + 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = StarWarsAPI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9FCE2CFC1E6C213D00E34457 /* StarWarsAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StarWarsAPI.h; sourceTree = ""; }; + 9FCE2CFD1E6C213D00E34457 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9FCE2D0A1E6C258A00E34457 /* API.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; + 9FCE2D0C1E6C259B00E34457 /* CreateReviewForEpisode.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CreateReviewForEpisode.graphql; sourceTree = ""; }; + 9FCE2D0D1E6C259B00E34457 /* HeroAndFriendsNames.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroAndFriendsNames.graphql; sourceTree = ""; }; + 9FCE2D0E1E6C259B00E34457 /* HeroAppearsIn.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroAppearsIn.graphql; sourceTree = ""; }; + 9FCE2D0F1E6C259B00E34457 /* HeroDetails.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroDetails.graphql; sourceTree = ""; }; + 9FCE2D101E6C259B00E34457 /* HeroDetailsWithFragment.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroDetailsWithFragment.graphql; sourceTree = ""; }; + 9FCE2D111E6C259B00E34457 /* HeroName.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroName.graphql; sourceTree = ""; }; + 9FCE2D121E6C259B00E34457 /* HeroNameConditional.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroNameConditional.graphql; sourceTree = ""; }; + 9FCE2D131E6C259B00E34457 /* HeroParentTypeDependentField.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroParentTypeDependentField.graphql; sourceTree = ""; }; + 9FCE2D141E6C259B00E34457 /* HeroTypeDependentAliasedField.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroTypeDependentAliasedField.graphql; sourceTree = ""; }; + 9FCE2D151E6C259B00E34457 /* HumanWithNullMass.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HumanWithNullMass.graphql; sourceTree = ""; }; + 9FCE2D161E6C259B00E34457 /* SameHeroTwice.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SameHeroTwice.graphql; sourceTree = ""; }; + 9FCE2D171E6C259B00E34457 /* Starship.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Starship.graphql; sourceTree = ""; }; + 9FCE2D181E6C259B00E34457 /* TwoHeroes.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = TwoHeroes.graphql; sourceTree = ""; }; + 9FD637E11E6ACF88001EDBC8 /* TestHost iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "TestHost iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 9FD637E31E6ACF88001EDBC8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 9FD637E51E6ACF88001EDBC8 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 9FD637E81E6ACF88001EDBC8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 9FD637EA1E6ACF88001EDBC8 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 9FD637ED1E6ACF88001EDBC8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 9FD637EF1E6ACF88001EDBC8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9FE1C6E61E634C8D00C02284 /* PromiseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseTests.swift; sourceTree = ""; }; 9FE3F3971DADBD870072078F /* check-and-run-apollo-codegen.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; name = "check-and-run-apollo-codegen.sh"; path = "scripts/check-and-run-apollo-codegen.sh"; sourceTree = SOURCE_ROOT; }; 9FE941CA1E5F20CA007CDD89 /* GraphQLOutputType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLOutputType.swift; sourceTree = ""; }; 9FE941CF1E62C771007CDD89 /* Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Promise.swift; sourceTree = ""; }; @@ -83,9 +228,22 @@ 9FEC15B81E6965E300D461B4 /* Result.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; }; 9FF90A5B1DDDEB100034C3B6 /* GraphQLResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResponse.swift; sourceTree = ""; }; 9FF90A5C1DDDEB100034C3B6 /* GraphQLExecutor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLExecutor.swift; sourceTree = ""; }; + 9FF90A6A1DDDEB420034C3B6 /* GraphQLInputValueEncodingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLInputValueEncodingTests.swift; sourceTree = ""; }; + 9FF90A6B1DDDEB420034C3B6 /* GraphQLExecutorFieldValueTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLExecutorFieldValueTests.swift; sourceTree = ""; }; + 9FF90A6C1DDDEB420034C3B6 /* ParseQueryResponseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParseQueryResponseTests.swift; sourceTree = ""; }; + 9FF90A751DDDEB4C0034C3B6 /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 9FC631301E6AE2080062707E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9FC631381E6AE2080062707E /* Apollo.framework in Frameworks */, + 9F438D081E6C30B1007BDC1A /* StarWarsAPI.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 9FC750401D2A532C00458D91 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -93,9 +251,43 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9FC7504B1D2A532D00458D91 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9FC7504F1D2A532D00458D91 /* Apollo.framework in Frameworks */, + 9FCE2D091E6C254700E34457 /* StarWarsAPI.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9FCE2CF61E6C213D00E34457 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9F438D071E6C2FD9007BDC1A /* Apollo.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9FD637DE1E6ACF88001EDBC8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9FCE2D011E6C213D00E34457 /* StarWarsAPI.framework in Frameworks */, + 9FD637F51E6AD43F001EDBC8 /* Apollo.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 9F17BC471DAF055A00138496 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 9FC750551D2A532D00458D91 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; 9F27D4601D40363A00715680 /* Execution */ = { isa = PBXGroup; children = ( @@ -122,10 +314,21 @@ name = JSON; sourceTree = ""; }; + 9FC631341E6AE2080062707E /* ApolloPerformanceTests */ = { + isa = PBXGroup; + children = ( + 9FC631351E6AE2080062707E /* PromiseTests.swift */, + 9FCE2CEB1E6BDAD100E34457 /* NormalizedCachingTests.swift */, + 9FC631371E6AE2080062707E /* Info.plist */, + ); + path = ApolloPerformanceTests; + sourceTree = ""; + }; 9FC7503A1D2A532C00458D91 = { isa = PBXGroup; children = ( 9FC750461D2A532C00458D91 /* Apollo */, + 9FCE2CF41E6C20E000E34457 /* Tests */, 9FC750451D2A532C00458D91 /* Products */, ); sourceTree = ""; @@ -134,6 +337,10 @@ isa = PBXGroup; children = ( 9FC750441D2A532C00458D91 /* Apollo.framework */, + 9FC7504E1D2A532D00458D91 /* ApolloTests.xctest */, + 9FD637E11E6ACF88001EDBC8 /* TestHost iOS.app */, + 9FC631331E6AE2080062707E /* ApolloPerformanceTests.xctest */, + 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */, ); name = Products; sourceTree = ""; @@ -157,12 +364,35 @@ path = Sources; sourceTree = ""; }; + 9FC750521D2A532D00458D91 /* ApolloTests */ = { + isa = PBXGroup; + children = ( + 9FCDFD1E1E32EABB007519DC /* FetchQueryTests.swift */, + 9FCDFD2B1E35784B007519DC /* WatchQueryTests.swift */, + 9FF90A6C1DDDEB420034C3B6 /* ParseQueryResponseTests.swift */, + 9F295E301E27534800A24949 /* NormalizeQueryResults.swift */, + 9F55347D1DE1DB3500E54264 /* LoadQueryFromStoreTests.swift */, + 9F0F98D31E7AC17D00BF0371 /* StoreTransactionTests.swift */, + 9F438D0B1E6C494C007BDC1A /* BatchedLoadTests.swift */, + 9FF90A6A1DDDEB420034C3B6 /* GraphQLInputValueEncodingTests.swift */, + 9FF90A6B1DDDEB420034C3B6 /* GraphQLExecutorFieldValueTests.swift */, + 9FC9A9C71E2EFE6E0023C4D5 /* CacheKeyForFieldTests.swift */, + 9FE1C6E61E634C8D00C02284 /* PromiseTests.swift */, + 9FADC8531E6B86D900C677E6 /* DataLoaderTests.swift */, + 9FCDFD2E1E3579B6007519DC /* MockNetworkTransport.swift */, + 9FF90A751DDDEB4C0034C3B6 /* Utilities.swift */, + 9FC9A9D51E2FD5690023C4D5 /* Integration */, + 9F17BC471DAF055A00138496 /* Supporting Files */, + ); + path = ApolloTests; + sourceTree = ""; + }; 9FC9A9CA1E2FD05C0023C4D5 /* Store */ = { isa = PBXGroup; children = ( - 54623F531E9D8CD2005D1A76 /* InMemoryNormalizedCache.swift */, 9F55347A1DE1DB2100E54264 /* ApolloStore.swift */, 9FCE2CED1E6BE2D800E34457 /* NormalizedCache.swift */, + 54DDB0911EA045870009DD99 /* InMemoryNormalizedCache.swift */, 9FC9A9BC1E2C271C0023C4D5 /* RecordSet.swift */, 9FC9A9CB1E2FD0760023C4D5 /* Record.swift */, 9FADC84E1E6B865E00C677E6 /* DataLoader.swift */, @@ -180,6 +410,15 @@ name = Network; sourceTree = ""; }; + 9FC9A9D51E2FD5690023C4D5 /* Integration */ = { + isa = PBXGroup; + children = ( + 9F69FFA61D4271F400E000B1 /* StarWarsServerTests.swift */, + 9F295E2B1E27418F00A24949 /* StarWarsServerCachingRoundtripTests.swift */, + ); + name = Integration; + sourceTree = ""; + }; 9FCDFD211E33A09F007519DC /* Utilities */ = { isa = PBXGroup; children = ( @@ -194,6 +433,54 @@ name = Utilities; sourceTree = ""; }; + 9FCE2CF41E6C20E000E34457 /* Tests */ = { + isa = PBXGroup; + children = ( + 9FC750521D2A532D00458D91 /* ApolloTests */, + 9FC631341E6AE2080062707E /* ApolloPerformanceTests */, + 9FCE2CFB1E6C213D00E34457 /* StarWarsAPI */, + 9FD637E21E6ACF88001EDBC8 /* TestHost iOS */, + 54DDB0931EA13C1B0009DD99 /* TestCacheProvider.swift */, + ); + path = Tests; + sourceTree = ""; + }; + 9FCE2CFB1E6C213D00E34457 /* StarWarsAPI */ = { + isa = PBXGroup; + children = ( + 9FCE2D0C1E6C259B00E34457 /* CreateReviewForEpisode.graphql */, + 9FCE2D0D1E6C259B00E34457 /* HeroAndFriendsNames.graphql */, + 9FCE2D0E1E6C259B00E34457 /* HeroAppearsIn.graphql */, + 9FCE2D0F1E6C259B00E34457 /* HeroDetails.graphql */, + 9FCE2D101E6C259B00E34457 /* HeroDetailsWithFragment.graphql */, + 9FCE2D111E6C259B00E34457 /* HeroName.graphql */, + 9FCE2D121E6C259B00E34457 /* HeroNameConditional.graphql */, + 9FCE2D131E6C259B00E34457 /* HeroParentTypeDependentField.graphql */, + 9FCE2D141E6C259B00E34457 /* HeroTypeDependentAliasedField.graphql */, + 9FCE2D151E6C259B00E34457 /* HumanWithNullMass.graphql */, + 9FCE2D161E6C259B00E34457 /* SameHeroTwice.graphql */, + 9FCE2D171E6C259B00E34457 /* Starship.graphql */, + 9FCE2D181E6C259B00E34457 /* TwoHeroes.graphql */, + 9FCE2D0A1E6C258A00E34457 /* API.swift */, + 9FCE2CFC1E6C213D00E34457 /* StarWarsAPI.h */, + 9FCE2CFD1E6C213D00E34457 /* Info.plist */, + ); + path = StarWarsAPI; + sourceTree = ""; + }; + 9FD637E21E6ACF88001EDBC8 /* TestHost iOS */ = { + isa = PBXGroup; + children = ( + 9FD637E31E6ACF88001EDBC8 /* AppDelegate.swift */, + 9FD637E51E6ACF88001EDBC8 /* ViewController.swift */, + 9FD637E71E6ACF88001EDBC8 /* Main.storyboard */, + 9FD637EA1E6ACF88001EDBC8 /* Assets.xcassets */, + 9FD637EC1E6ACF88001EDBC8 /* LaunchScreen.storyboard */, + 9FD637EF1E6ACF88001EDBC8 /* Info.plist */, + ); + path = "TestHost iOS"; + sourceTree = ""; + }; 9FE3F3961DADBD0D0072078F /* Supporting Files */ = { isa = PBXGroup; children = ( @@ -216,9 +503,37 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9FCE2CF71E6C213D00E34457 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 9FCE2CFE1E6C213D00E34457 /* StarWarsAPI.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 9FC631321E6AE2080062707E /* ApolloPerformanceTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9FC6313B1E6AE2080062707E /* Build configuration list for PBXNativeTarget "ApolloPerformanceTests" */; + buildPhases = ( + 9FC6312F1E6AE2080062707E /* Sources */, + 9FC631301E6AE2080062707E /* Frameworks */, + 9FC631311E6AE2080062707E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 9FC6313A1E6AE2080062707E /* PBXTargetDependency */, + 9F438D0A1E6C30C3007BDC1A /* PBXTargetDependency */, + 9FC6313F1E6AE2D90062707E /* PBXTargetDependency */, + ); + name = ApolloPerformanceTests; + productName = ApolloPerformanceTests; + productReference = 9FC631331E6AE2080062707E /* ApolloPerformanceTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; 9FC750431D2A532C00458D91 /* Apollo */ = { isa = PBXNativeTarget; buildConfigurationList = 9FC750581D2A532D00458D91 /* Build configuration list for PBXNativeTarget "Apollo" */; @@ -237,6 +552,64 @@ productReference = 9FC750441D2A532C00458D91 /* Apollo.framework */; productType = "com.apple.product-type.framework"; }; + 9FC7504D1D2A532D00458D91 /* ApolloTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9FC7505B1D2A532D00458D91 /* Build configuration list for PBXNativeTarget "ApolloTests" */; + buildPhases = ( + 9FC7504A1D2A532D00458D91 /* Sources */, + 9FC7504B1D2A532D00458D91 /* Frameworks */, + 9FC7504C1D2A532D00458D91 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 9FC750511D2A532D00458D91 /* PBXTargetDependency */, + 9FCE2D081E6C254000E34457 /* PBXTargetDependency */, + ); + name = ApolloTests; + productName = ApolloTests; + productReference = 9FC7504E1D2A532D00458D91 /* ApolloTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 9FCE2CF91E6C213D00E34457 /* StarWarsAPI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9FCE2D031E6C213D00E34457 /* Build configuration list for PBXNativeTarget "StarWarsAPI" */; + buildPhases = ( + 9FCE2D061E6C251100E34457 /* Generate Apollo Client API */, + 9FCE2CF51E6C213D00E34457 /* Sources */, + 9FCE2CF61E6C213D00E34457 /* Frameworks */, + 9FCE2CF71E6C213D00E34457 /* Headers */, + 9FCE2CF81E6C213D00E34457 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = StarWarsAPI; + productName = StarWarsAPI; + productReference = 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */; + productType = "com.apple.product-type.framework"; + }; + 9FD637E01E6ACF88001EDBC8 /* TestHost iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9FD637F01E6ACF88001EDBC8 /* Build configuration list for PBXNativeTarget "TestHost iOS" */; + buildPhases = ( + 9FD637DD1E6ACF88001EDBC8 /* Sources */, + 9FD637DE1E6ACF88001EDBC8 /* Frameworks */, + 9FD637DF1E6ACF88001EDBC8 /* Resources */, + 9FD637F91E6AD440001EDBC8 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 9FD637F81E6AD43F001EDBC8 /* PBXTargetDependency */, + 9FCE2D001E6C213D00E34457 /* PBXTargetDependency */, + ); + name = "TestHost iOS"; + productName = "TestHost iOS"; + productReference = 9FD637E11E6ACF88001EDBC8 /* TestHost iOS.app */; + productType = "com.apple.product-type.application"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -247,6 +620,12 @@ LastUpgradeCheck = 0810; ORGANIZATIONNAME = "Apollo GraphQL"; TargetAttributes = { + 9FC631321E6AE2080062707E = { + CreatedOnToolsVersion = 8.2.1; + DevelopmentTeam = 5TL236FN6U; + ProvisioningStyle = Automatic; + TestTargetID = 9FD637E01E6ACF88001EDBC8; + }; 9FC750431D2A532C00458D91 = { CreatedOnToolsVersion = 8.0; DevelopmentTeam = 5TL236FN6U; @@ -254,6 +633,23 @@ LastSwiftMigration = 0800; ProvisioningStyle = Automatic; }; + 9FC7504D1D2A532D00458D91 = { + CreatedOnToolsVersion = 8.0; + DevelopmentTeam = 5TL236FN6U; + DevelopmentTeamName = "Martijn Walraven"; + ProvisioningStyle = Automatic; + }; + 9FCE2CF91E6C213D00E34457 = { + CreatedOnToolsVersion = 8.2.1; + DevelopmentTeam = 5TL236FN6U; + LastSwiftMigration = 0820; + ProvisioningStyle = Automatic; + }; + 9FD637E01E6ACF88001EDBC8 = { + CreatedOnToolsVersion = 8.2.1; + DevelopmentTeam = 5TL236FN6U; + ProvisioningStyle = Automatic; + }; }; }; buildConfigurationList = 9FC7503E1D2A532C00458D91 /* Build configuration list for PBXProject "Apollo" */; @@ -270,11 +666,22 @@ projectRoot = ""; targets = ( 9FC750431D2A532C00458D91 /* Apollo */, + 9FC631321E6AE2080062707E /* ApolloPerformanceTests */, + 9FC7504D1D2A532D00458D91 /* ApolloTests */, + 9FCE2CF91E6C213D00E34457 /* StarWarsAPI */, + 9FD637E01E6ACF88001EDBC8 /* TestHost iOS */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 9FC631311E6AE2080062707E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 9FC750421D2A532C00458D91 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -283,9 +690,59 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9FC7504C1D2A532D00458D91 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9FCE2CF81E6C213D00E34457 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9FD637DF1E6ACF88001EDBC8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9FD637EE1E6ACF88001EDBC8 /* LaunchScreen.storyboard in Resources */, + 9FD637EB1E6ACF88001EDBC8 /* Assets.xcassets in Resources */, + 9FD637E91E6ACF88001EDBC8 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 9FCE2D061E6C251100E34457 /* Generate Apollo Client API */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Generate Apollo Client API"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "APOLLO_FRAMEWORK_PATH=$(eval find $FRAMEWORK_SEARCH_PATHS -name \"Apollo.framework\" -maxdepth 1)\n\nif [ -z \"$APOLLO_FRAMEWORK_PATH\" ]; then\necho \"error: Couldn't find Apollo.framework in FRAMEWORK_SEARCH_PATHS; make sure to add the framework to your project.\"\nexit 1\nfi\n\ncd ${SRCROOT}/Tests/StarWarsAPI\n$(find $APOLLO_FRAMEWORK_PATH -name 'check-and-run-apollo-codegen.sh') generate $(find . -name '*.graphql') --schema schema.json --output API.swift"; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ + 9FC6312F1E6AE2080062707E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9FC631361E6AE2080062707E /* PromiseTests.swift in Sources */, + 9FCE2CEC1E6BDAD100E34457 /* NormalizedCachingTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 9FC7503F1D2A532C00458D91 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -304,7 +761,7 @@ 9FC9A9BF1E2C27FB0023C4D5 /* GraphQLResult.swift in Sources */, 9FC9A9D31E2FD48B0023C4D5 /* GraphQLError.swift in Sources */, 9FEB050D1DB5732300DA3B44 /* JSONSerializationFormat.swift in Sources */, - 54623F541E9D8CD2005D1A76 /* InMemoryNormalizedCache.swift in Sources */, + 54DDB0921EA045870009DD99 /* InMemoryNormalizedCache.swift in Sources */, 9FC9A9C51E2D6CE70023C4D5 /* Selections.swift in Sources */, 9FCDFD231E33A0D8007519DC /* AsynchronousOperation.swift in Sources */, 9FC9A9CC1E2FD0760023C4D5 /* Record.swift in Sources */, @@ -326,9 +783,133 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 9FC7504A1D2A532D00458D91 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9FC9A9C81E2EFE6E0023C4D5 /* CacheKeyForFieldTests.swift in Sources */, + 9F533AB31E6C4A4200CBE097 /* BatchedLoadTests.swift in Sources */, + 9F69FFA71D4271F400E000B1 /* StarWarsServerTests.swift in Sources */, + 9F295E2D1E27419800A24949 /* StarWarsServerCachingRoundtripTests.swift in Sources */, + 9FF90A6F1DDDEB420034C3B6 /* GraphQLInputValueEncodingTests.swift in Sources */, + 9FF90A761DDDEB4C0034C3B6 /* Utilities.swift in Sources */, + 9F55347E1DE1DB3500E54264 /* LoadQueryFromStoreTests.swift in Sources */, + 9F6291C71E39775000CDA57B /* MockNetworkTransport.swift in Sources */, + 9FE1C6E71E634C8D00C02284 /* PromiseTests.swift in Sources */, + 9FCDFD1F1E32EABB007519DC /* FetchQueryTests.swift in Sources */, + 9FADC8541E6B86D900C677E6 /* DataLoaderTests.swift in Sources */, + 54DDB0951EA13C700009DD99 /* TestCacheProvider.swift in Sources */, + 9FF90A711DDDEB420034C3B6 /* GraphQLExecutorFieldValueTests.swift in Sources */, + 9F0F98D41E7AC17D00BF0371 /* StoreTransactionTests.swift in Sources */, + 9FCDFD2C1E35784B007519DC /* WatchQueryTests.swift in Sources */, + 9F295E311E27534800A24949 /* NormalizeQueryResults.swift in Sources */, + 9FF90A731DDDEB420034C3B6 /* ParseQueryResponseTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9FCE2CF51E6C213D00E34457 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9FCE2D0B1E6C258A00E34457 /* API.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9FD637DD1E6ACF88001EDBC8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9FD637E61E6ACF88001EDBC8 /* ViewController.swift in Sources */, + 9FD637E41E6ACF88001EDBC8 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 9F438D0A1E6C30C3007BDC1A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 9FCE2CF91E6C213D00E34457 /* StarWarsAPI */; + targetProxy = 9F438D091E6C30C3007BDC1A /* PBXContainerItemProxy */; + }; + 9FC6313A1E6AE2080062707E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 9FC750431D2A532C00458D91 /* Apollo */; + targetProxy = 9FC631391E6AE2080062707E /* PBXContainerItemProxy */; + }; + 9FC6313F1E6AE2D90062707E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 9FD637E01E6ACF88001EDBC8 /* TestHost iOS */; + targetProxy = 9FC6313E1E6AE2D90062707E /* PBXContainerItemProxy */; + }; + 9FC750511D2A532D00458D91 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 9FC750431D2A532C00458D91 /* Apollo */; + targetProxy = 9FC750501D2A532D00458D91 /* PBXContainerItemProxy */; + }; + 9FCE2D001E6C213D00E34457 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 9FCE2CF91E6C213D00E34457 /* StarWarsAPI */; + targetProxy = 9FCE2CFF1E6C213D00E34457 /* PBXContainerItemProxy */; + }; + 9FCE2D081E6C254000E34457 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 9FCE2CF91E6C213D00E34457 /* StarWarsAPI */; + targetProxy = 9FCE2D071E6C254000E34457 /* PBXContainerItemProxy */; + }; + 9FD637F81E6AD43F001EDBC8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 9FC750431D2A532C00458D91 /* Apollo */; + targetProxy = 9FD637F71E6AD43F001EDBC8 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 9FD637E71E6ACF88001EDBC8 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 9FD637E81E6ACF88001EDBC8 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 9FD637EC1E6ACF88001EDBC8 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 9FD637ED1E6ACF88001EDBC8 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + /* Begin XCBuildConfiguration section */ + 9FC6313C1E6AE2080062707E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = 5TL236FN6U; + INFOPLIST_FILE = Tests/ApolloPerformanceTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloPerformanceTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestHost iOS.app/TestHost iOS"; + }; + name = Debug; + }; + 9FC6313D1E6AE2080062707E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = 5TL236FN6U; + INFOPLIST_FILE = Tests/ApolloPerformanceTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloPerformanceTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestHost iOS.app/TestHost iOS"; + }; + name = Release; + }; 9FC750561D2A532D00458D91 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -450,6 +1031,86 @@ }; name = Release; }; + 9FC7505C1D2A532D00458D91 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = Tests/ApolloTests/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = com.apollostack.ApolloTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 9FC7505D1D2A532D00458D91 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = Tests/ApolloTests/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = com.apollostack.ApolloTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 9FCE2D041E6C213D00E34457 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */; + buildSettings = { + DEFINES_MODULE = YES; + INFOPLIST_FILE = Tests/StarWarsAPI/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.StarWarsAPI; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 9FCE2D051E6C213D00E34457 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */; + buildSettings = { + DEFINES_MODULE = YES; + INFOPLIST_FILE = Tests/StarWarsAPI/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.StarWarsAPI; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 9FD637F11E6ACF88001EDBC8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = 5TL236FN6U; + INFOPLIST_FILE = "Tests/TestHost iOS/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.TestHost; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 9FD637F21E6ACF88001EDBC8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = 5TL236FN6U; + INFOPLIST_FILE = "Tests/TestHost iOS/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.TestHost; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; 9FEFCFCD1E6C65CE0061834C /* PerformanceTesting */ = { isa = XCBuildConfiguration; buildSettings = { @@ -508,9 +1169,72 @@ }; name = PerformanceTesting; }; + 9FEFCFCF1E6C65CE0061834C /* PerformanceTesting */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = 5TL236FN6U; + INFOPLIST_FILE = Tests/ApolloPerformanceTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloPerformanceTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestHost iOS.app/TestHost iOS"; + }; + name = PerformanceTesting; + }; + 9FEFCFD01E6C65CE0061834C /* PerformanceTesting */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = Tests/ApolloTests/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = com.apollostack.ApolloTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = PerformanceTesting; + }; + 9FEFCFD61E6C65CE0061834C /* PerformanceTesting */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */; + buildSettings = { + DEFINES_MODULE = YES; + INFOPLIST_FILE = Tests/StarWarsAPI/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.StarWarsAPI; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = PerformanceTesting; + }; + 9FEFCFD71E6C65CE0061834C /* PerformanceTesting */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = 5TL236FN6U; + INFOPLIST_FILE = "Tests/TestHost iOS/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.TestHost; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_VERSION = 3.0; + }; + name = PerformanceTesting; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 9FC6313B1E6AE2080062707E /* Build configuration list for PBXNativeTarget "ApolloPerformanceTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9FC6313C1E6AE2080062707E /* Debug */, + 9FC6313D1E6AE2080062707E /* Release */, + 9FEFCFCF1E6C65CE0061834C /* PerformanceTesting */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 9FC7503E1D2A532C00458D91 /* Build configuration list for PBXProject "Apollo" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -531,6 +1255,36 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 9FC7505B1D2A532D00458D91 /* Build configuration list for PBXNativeTarget "ApolloTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9FC7505C1D2A532D00458D91 /* Debug */, + 9FC7505D1D2A532D00458D91 /* Release */, + 9FEFCFD01E6C65CE0061834C /* PerformanceTesting */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9FCE2D031E6C213D00E34457 /* Build configuration list for PBXNativeTarget "StarWarsAPI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9FCE2D041E6C213D00E34457 /* Debug */, + 9FCE2D051E6C213D00E34457 /* Release */, + 9FEFCFD61E6C65CE0061834C /* PerformanceTesting */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9FD637F01E6ACF88001EDBC8 /* Build configuration list for PBXNativeTarget "TestHost iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9FD637F11E6ACF88001EDBC8 /* Debug */, + 9FD637F21E6ACF88001EDBC8 /* Release */, + 9FEFCFD71E6C65CE0061834C /* PerformanceTesting */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 9FC7503B1D2A532C00458D91 /* Project object */; diff --git a/Example/ApolloExample.xcodeproj/xcshareddata/xcschemes/TestHost iOS.xcscheme b/Apollo.xcodeproj/xcshareddata/xcschemes/TestHost iOS.xcscheme similarity index 81% rename from Example/ApolloExample.xcodeproj/xcshareddata/xcschemes/TestHost iOS.xcscheme rename to Apollo.xcodeproj/xcshareddata/xcschemes/TestHost iOS.xcscheme index a0575322c6..4fee9e2e79 100644 --- a/Example/ApolloExample.xcodeproj/xcshareddata/xcschemes/TestHost iOS.xcscheme +++ b/Apollo.xcodeproj/xcshareddata/xcschemes/TestHost iOS.xcscheme @@ -1,6 +1,6 @@ + ReferencedContainer = "container:Apollo.xcodeproj"> @@ -32,20 +32,20 @@ skipped = "NO"> + ReferencedContainer = "container:Apollo.xcodeproj"> + ReferencedContainer = "container:Apollo.xcodeproj"> @@ -65,10 +65,10 @@ runnableDebuggingMode = "0"> + ReferencedContainer = "container:Apollo.xcodeproj"> @@ -84,10 +84,10 @@ runnableDebuggingMode = "0"> + ReferencedContainer = "container:Apollo.xcodeproj"> diff --git a/Example/ApolloExample.xcodeproj/project.pbxproj b/Example/ApolloExample.xcodeproj/project.pbxproj deleted file mode 100644 index 8251e2bee6..0000000000 --- a/Example/ApolloExample.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1195 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 18CAED8E9CA518A8387C31B5 /* Pods_ApolloTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 81EA39E0FF49825755B1B12F /* Pods_ApolloTests.framework */; }; - 5454C0881E944FD400661138 /* StarWarsAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 5454C0861E944FD400661138 /* StarWarsAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 54B59A561E94828100EB1B2B /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54B59A551E94828100EB1B2B /* CachePersistenceTests.swift */; }; - 54E966D41E9447F7002884AD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E966D31E9447F7002884AD /* AppDelegate.swift */; }; - 54E966D61E9447F7002884AD /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E966D51E9447F7002884AD /* ViewController.swift */; }; - 54E966D91E9447F7002884AD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 54E966D71E9447F7002884AD /* Main.storyboard */; }; - 54E966DB1E9447F7002884AD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 54E966DA1E9447F7002884AD /* Assets.xcassets */; }; - 54E966DE1E9447F7002884AD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 54E966DC1E9447F7002884AD /* LaunchScreen.storyboard */; }; - 54FFC8341E9478A300C72D16 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8241E9478A300C72D16 /* BatchedLoadTests.swift */; }; - 54FFC8351E9478A300C72D16 /* CacheKeyForFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8251E9478A300C72D16 /* CacheKeyForFieldTests.swift */; }; - 54FFC8361E9478A300C72D16 /* DataLoaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8261E9478A300C72D16 /* DataLoaderTests.swift */; }; - 54FFC8371E9478A300C72D16 /* FetchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8271E9478A300C72D16 /* FetchQueryTests.swift */; }; - 54FFC8381E9478A300C72D16 /* GraphQLExecutorFieldValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8281E9478A300C72D16 /* GraphQLExecutorFieldValueTests.swift */; }; - 54FFC8391E9478A300C72D16 /* GraphQLInputValueEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8291E9478A300C72D16 /* GraphQLInputValueEncodingTests.swift */; }; - 54FFC83A1E9478A300C72D16 /* LoadQueryFromStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC82A1E9478A300C72D16 /* LoadQueryFromStoreTests.swift */; }; - 54FFC83B1E9478A300C72D16 /* MockNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC82B1E9478A300C72D16 /* MockNetworkTransport.swift */; }; - 54FFC83C1E9478A300C72D16 /* NormalizeQueryResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC82C1E9478A300C72D16 /* NormalizeQueryResults.swift */; }; - 54FFC83D1E9478A300C72D16 /* ParseQueryResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC82D1E9478A300C72D16 /* ParseQueryResponseTests.swift */; }; - 54FFC83E1E9478A300C72D16 /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC82E1E9478A300C72D16 /* PromiseTests.swift */; }; - 54FFC83F1E9478A300C72D16 /* StarWarsServerCachingRoundtripTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC82F1E9478A300C72D16 /* StarWarsServerCachingRoundtripTests.swift */; }; - 54FFC8401E9478A300C72D16 /* StarWarsServerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8301E9478A300C72D16 /* StarWarsServerTests.swift */; }; - 54FFC8411E9478A300C72D16 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8311E9478A300C72D16 /* StoreTransactionTests.swift */; }; - 54FFC8421E9478A300C72D16 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8321E9478A300C72D16 /* Utilities.swift */; }; - 54FFC8431E9478A300C72D16 /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8331E9478A300C72D16 /* WatchQueryTests.swift */; }; - 54FFC8491E94796E00C72D16 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5454C0841E944FD400661138 /* StarWarsAPI.framework */; }; - 54FFC8591E947A2C00C72D16 /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC84A1E947A2B00C72D16 /* API.swift */; }; - 54FFC85A1E947A2C00C72D16 /* CreateReviewForEpisode.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC84B1E947A2B00C72D16 /* CreateReviewForEpisode.graphql */; }; - 54FFC85B1E947A2C00C72D16 /* HeroAndFriendsNames.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC84C1E947A2B00C72D16 /* HeroAndFriendsNames.graphql */; }; - 54FFC85C1E947A2C00C72D16 /* HeroAppearsIn.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC84D1E947A2B00C72D16 /* HeroAppearsIn.graphql */; }; - 54FFC85D1E947A2C00C72D16 /* HeroDetails.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC84E1E947A2B00C72D16 /* HeroDetails.graphql */; }; - 54FFC85E1E947A2C00C72D16 /* HeroDetailsWithFragment.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC84F1E947A2B00C72D16 /* HeroDetailsWithFragment.graphql */; }; - 54FFC85F1E947A2C00C72D16 /* HeroName.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8501E947A2C00C72D16 /* HeroName.graphql */; }; - 54FFC8601E947A2C00C72D16 /* HeroNameConditional.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8511E947A2C00C72D16 /* HeroNameConditional.graphql */; }; - 54FFC8611E947A2C00C72D16 /* HeroParentTypeDependentField.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8521E947A2C00C72D16 /* HeroParentTypeDependentField.graphql */; }; - 54FFC8621E947A2C00C72D16 /* HeroTypeDependentAliasedField.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8531E947A2C00C72D16 /* HeroTypeDependentAliasedField.graphql */; }; - 54FFC8631E947A2C00C72D16 /* HumanWithNullMass.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8541E947A2C00C72D16 /* HumanWithNullMass.graphql */; }; - 54FFC8641E947A2C00C72D16 /* SameHeroTwice.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8551E947A2C00C72D16 /* SameHeroTwice.graphql */; }; - 54FFC8651E947A2C00C72D16 /* schema.json in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8561E947A2C00C72D16 /* schema.json */; }; - 54FFC8661E947A2C00C72D16 /* Starship.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8571E947A2C00C72D16 /* Starship.graphql */; }; - 54FFC8671E947A2C00C72D16 /* TwoHeroes.graphql in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8581E947A2C00C72D16 /* TwoHeroes.graphql */; }; - 54FFC86F1E947CA900C72D16 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC86E1E947CA900C72D16 /* AppDelegate.swift */; }; - 54FFC8711E947CA900C72D16 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8701E947CA900C72D16 /* ViewController.swift */; }; - 54FFC8741E947CA900C72D16 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8721E947CA900C72D16 /* Main.storyboard */; }; - 54FFC8761E947CA900C72D16 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8751E947CA900C72D16 /* Assets.xcassets */; }; - 54FFC8791E947CA900C72D16 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 54FFC8771E947CA900C72D16 /* LaunchScreen.storyboard */; }; - 54FFC88E1E947D5D00C72D16 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5454C0841E944FD400661138 /* StarWarsAPI.framework */; }; - 54FFC8921E947DBD00C72D16 /* NormalizedCachingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8901E947DBD00C72D16 /* NormalizedCachingTests.swift */; }; - 54FFC8931E947DBD00C72D16 /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54FFC8911E947DBD00C72D16 /* PromiseTests.swift */; }; - 6E850CF2A3A8848CB76D2220 /* Pods_ApolloPerformanceTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C5C4BC38A6DF130DAF68713 /* Pods_ApolloPerformanceTests.framework */; }; - 720CD5ED88A1DBC2947C9278 /* Pods_ApolloExample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD21DBB0EAAEAC44C0DAE2E0 /* Pods_ApolloExample.framework */; }; - CC09C19646CBF0BE364B3069 /* Pods_StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A05963DF880C07C7098254E7 /* Pods_StarWarsAPI.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 54FFC81F1E94782400C72D16 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 54E966C81E9447F7002884AD /* Project object */; - proxyType = 1; - remoteGlobalIDString = 54E966CF1E9447F7002884AD; - remoteInfo = ApolloExample; - }; - 54FFC8471E94796400C72D16 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 54E966C81E9447F7002884AD /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5454C0831E944FD400661138; - remoteInfo = StarWarsAPI; - }; - 54FFC8871E947D0800C72D16 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 54E966C81E9447F7002884AD /* Project object */; - proxyType = 1; - remoteGlobalIDString = 54FFC86B1E947CA900C72D16; - remoteInfo = "TestHost iOS"; - }; - 54FFC88C1E947D3600C72D16 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 54E966C81E9447F7002884AD /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5454C0831E944FD400661138; - remoteInfo = StarWarsAPI; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 1AAAF608B73F123ACD20BAB6 /* Pods-ApolloExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloExampleTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.release.xcconfig"; sourceTree = ""; }; - 2C1D521E7FD5370B3CEF23C5 /* Pods-StarWarsAPI.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StarWarsAPI.debug.xcconfig"; path = "Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.debug.xcconfig"; sourceTree = ""; }; - 41AA21D8F253186B9E485F75 /* Pods-ApolloExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloExample.release.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.release.xcconfig"; sourceTree = ""; }; - 4D924536227C50FAA0070E95 /* Pods_ApolloExampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ApolloExampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5454C0841E944FD400661138 /* StarWarsAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = StarWarsAPI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5454C0861E944FD400661138 /* StarWarsAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StarWarsAPI.h; sourceTree = ""; }; - 5454C0871E944FD400661138 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 54B59A551E94828100EB1B2B /* CachePersistenceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachePersistenceTests.swift; sourceTree = ""; }; - 54E966D01E9447F7002884AD /* ApolloExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ApolloExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 54E966D31E9447F7002884AD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 54E966D51E9447F7002884AD /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 54E966D81E9447F7002884AD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 54E966DA1E9447F7002884AD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 54E966DD1E9447F7002884AD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 54E966DF1E9447F7002884AD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 54FFC81A1E94782400C72D16 /* ApolloTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 54FFC81E1E94782400C72D16 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 54FFC8241E9478A300C72D16 /* BatchedLoadTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BatchedLoadTests.swift; sourceTree = ""; }; - 54FFC8251E9478A300C72D16 /* CacheKeyForFieldTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CacheKeyForFieldTests.swift; sourceTree = ""; }; - 54FFC8261E9478A300C72D16 /* DataLoaderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataLoaderTests.swift; sourceTree = ""; }; - 54FFC8271E9478A300C72D16 /* FetchQueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchQueryTests.swift; sourceTree = ""; }; - 54FFC8281E9478A300C72D16 /* GraphQLExecutorFieldValueTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLExecutorFieldValueTests.swift; sourceTree = ""; }; - 54FFC8291E9478A300C72D16 /* GraphQLInputValueEncodingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLInputValueEncodingTests.swift; sourceTree = ""; }; - 54FFC82A1E9478A300C72D16 /* LoadQueryFromStoreTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadQueryFromStoreTests.swift; sourceTree = ""; }; - 54FFC82B1E9478A300C72D16 /* MockNetworkTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockNetworkTransport.swift; sourceTree = ""; }; - 54FFC82C1E9478A300C72D16 /* NormalizeQueryResults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NormalizeQueryResults.swift; sourceTree = ""; }; - 54FFC82D1E9478A300C72D16 /* ParseQueryResponseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParseQueryResponseTests.swift; sourceTree = ""; }; - 54FFC82E1E9478A300C72D16 /* PromiseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseTests.swift; sourceTree = ""; }; - 54FFC82F1E9478A300C72D16 /* StarWarsServerCachingRoundtripTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StarWarsServerCachingRoundtripTests.swift; sourceTree = ""; }; - 54FFC8301E9478A300C72D16 /* StarWarsServerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StarWarsServerTests.swift; sourceTree = ""; }; - 54FFC8311E9478A300C72D16 /* StoreTransactionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreTransactionTests.swift; sourceTree = ""; }; - 54FFC8321E9478A300C72D16 /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; - 54FFC8331E9478A300C72D16 /* WatchQueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchQueryTests.swift; sourceTree = ""; }; - 54FFC84A1E947A2B00C72D16 /* API.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; - 54FFC84B1E947A2B00C72D16 /* CreateReviewForEpisode.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CreateReviewForEpisode.graphql; sourceTree = ""; }; - 54FFC84C1E947A2B00C72D16 /* HeroAndFriendsNames.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroAndFriendsNames.graphql; sourceTree = ""; }; - 54FFC84D1E947A2B00C72D16 /* HeroAppearsIn.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroAppearsIn.graphql; sourceTree = ""; }; - 54FFC84E1E947A2B00C72D16 /* HeroDetails.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroDetails.graphql; sourceTree = ""; }; - 54FFC84F1E947A2B00C72D16 /* HeroDetailsWithFragment.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroDetailsWithFragment.graphql; sourceTree = ""; }; - 54FFC8501E947A2C00C72D16 /* HeroName.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroName.graphql; sourceTree = ""; }; - 54FFC8511E947A2C00C72D16 /* HeroNameConditional.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroNameConditional.graphql; sourceTree = ""; }; - 54FFC8521E947A2C00C72D16 /* HeroParentTypeDependentField.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroParentTypeDependentField.graphql; sourceTree = ""; }; - 54FFC8531E947A2C00C72D16 /* HeroTypeDependentAliasedField.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HeroTypeDependentAliasedField.graphql; sourceTree = ""; }; - 54FFC8541E947A2C00C72D16 /* HumanWithNullMass.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = HumanWithNullMass.graphql; sourceTree = ""; }; - 54FFC8551E947A2C00C72D16 /* SameHeroTwice.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SameHeroTwice.graphql; sourceTree = ""; }; - 54FFC8561E947A2C00C72D16 /* schema.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = schema.json; sourceTree = ""; }; - 54FFC8571E947A2C00C72D16 /* Starship.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Starship.graphql; sourceTree = ""; }; - 54FFC8581E947A2C00C72D16 /* TwoHeroes.graphql */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = TwoHeroes.graphql; sourceTree = ""; }; - 54FFC86C1E947CA900C72D16 /* TestHost iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "TestHost iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 54FFC86E1E947CA900C72D16 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 54FFC8701E947CA900C72D16 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 54FFC8731E947CA900C72D16 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 54FFC8751E947CA900C72D16 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 54FFC8781E947CA900C72D16 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 54FFC87A1E947CA900C72D16 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 54FFC8821E947D0800C72D16 /* ApolloPerformanceTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloPerformanceTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 54FFC8861E947D0800C72D16 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 54FFC8901E947DBD00C72D16 /* NormalizedCachingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NormalizedCachingTests.swift; sourceTree = ""; }; - 54FFC8911E947DBD00C72D16 /* PromiseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseTests.swift; sourceTree = ""; }; - 5C5C4BC38A6DF130DAF68713 /* Pods_ApolloPerformanceTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ApolloPerformanceTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 61F8D719D2C7FBF66AD2ED45 /* Pods-ApolloTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.debug.xcconfig"; sourceTree = ""; }; - 7F0F2E27BB660DC316A7B46A /* Pods-ApolloTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.release.xcconfig"; sourceTree = ""; }; - 81EA39E0FF49825755B1B12F /* Pods_ApolloTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ApolloTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 94187754DEB07DF0D9EDA415 /* Pods-StarWarsAPI.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-StarWarsAPI.release.xcconfig"; path = "Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.release.xcconfig"; sourceTree = ""; }; - 96252404982964864A31A200 /* Pods-ApolloExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloExampleTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloExampleTests/Pods-ApolloExampleTests.debug.xcconfig"; sourceTree = ""; }; - A05963DF880C07C7098254E7 /* Pods_StarWarsAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StarWarsAPI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - AD21DBB0EAAEAC44C0DAE2E0 /* Pods_ApolloExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ApolloExample.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C1B247319A0E9F0EB0132F61 /* Pods-ApolloPerformanceTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloPerformanceTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.debug.xcconfig"; sourceTree = ""; }; - DACC71495C403877EDD9A4D7 /* Pods-ApolloPerformanceTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloPerformanceTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.release.xcconfig"; sourceTree = ""; }; - FC005AAA6953D6B8E8C04F0D /* Pods-ApolloExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApolloExample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.debug.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 5454C0801E944FD400661138 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - CC09C19646CBF0BE364B3069 /* Pods_StarWarsAPI.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54E966CD1E9447F7002884AD /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 720CD5ED88A1DBC2947C9278 /* Pods_ApolloExample.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54FFC8171E94782400C72D16 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 54FFC8491E94796E00C72D16 /* StarWarsAPI.framework in Frameworks */, - 18CAED8E9CA518A8387C31B5 /* Pods_ApolloTests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54FFC8691E947CA900C72D16 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54FFC87F1E947D0800C72D16 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 54FFC88E1E947D5D00C72D16 /* StarWarsAPI.framework in Frameworks */, - 6E850CF2A3A8848CB76D2220 /* Pods_ApolloPerformanceTests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5454C0851E944FD400661138 /* StarWarsAPI */ = { - isa = PBXGroup; - children = ( - 54FFC84A1E947A2B00C72D16 /* API.swift */, - 54FFC84B1E947A2B00C72D16 /* CreateReviewForEpisode.graphql */, - 54FFC84C1E947A2B00C72D16 /* HeroAndFriendsNames.graphql */, - 54FFC84D1E947A2B00C72D16 /* HeroAppearsIn.graphql */, - 54FFC84E1E947A2B00C72D16 /* HeroDetails.graphql */, - 54FFC84F1E947A2B00C72D16 /* HeroDetailsWithFragment.graphql */, - 54FFC8501E947A2C00C72D16 /* HeroName.graphql */, - 54FFC8511E947A2C00C72D16 /* HeroNameConditional.graphql */, - 54FFC8521E947A2C00C72D16 /* HeroParentTypeDependentField.graphql */, - 54FFC8531E947A2C00C72D16 /* HeroTypeDependentAliasedField.graphql */, - 54FFC8541E947A2C00C72D16 /* HumanWithNullMass.graphql */, - 54FFC8551E947A2C00C72D16 /* SameHeroTwice.graphql */, - 54FFC8561E947A2C00C72D16 /* schema.json */, - 54FFC8571E947A2C00C72D16 /* Starship.graphql */, - 54FFC8581E947A2C00C72D16 /* TwoHeroes.graphql */, - 5454C0861E944FD400661138 /* StarWarsAPI.h */, - 5454C0871E944FD400661138 /* Info.plist */, - ); - path = StarWarsAPI; - sourceTree = ""; - }; - 54E966C71E9447F7002884AD = { - isa = PBXGroup; - children = ( - 54E966D21E9447F7002884AD /* ApolloExample */, - 5454C0851E944FD400661138 /* StarWarsAPI */, - 54FFC81B1E94782400C72D16 /* ApolloTests */, - 54FFC86D1E947CA900C72D16 /* TestHost iOS */, - 54FFC8831E947D0800C72D16 /* ApolloPerformanceTests */, - 54E966D11E9447F7002884AD /* Products */, - C1B8068DEABD85ECF3227AA2 /* Pods */, - C96167F12B5E3E2FD9D057A4 /* Frameworks */, - ); - sourceTree = ""; - }; - 54E966D11E9447F7002884AD /* Products */ = { - isa = PBXGroup; - children = ( - 54E966D01E9447F7002884AD /* ApolloExample.app */, - 5454C0841E944FD400661138 /* StarWarsAPI.framework */, - 54FFC81A1E94782400C72D16 /* ApolloTests.xctest */, - 54FFC86C1E947CA900C72D16 /* TestHost iOS.app */, - 54FFC8821E947D0800C72D16 /* ApolloPerformanceTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 54E966D21E9447F7002884AD /* ApolloExample */ = { - isa = PBXGroup; - children = ( - 54E966D31E9447F7002884AD /* AppDelegate.swift */, - 54E966D51E9447F7002884AD /* ViewController.swift */, - 54E966D71E9447F7002884AD /* Main.storyboard */, - 54E966DA1E9447F7002884AD /* Assets.xcassets */, - 54E966DC1E9447F7002884AD /* LaunchScreen.storyboard */, - 54E966DF1E9447F7002884AD /* Info.plist */, - ); - path = ApolloExample; - sourceTree = ""; - }; - 54FFC81B1E94782400C72D16 /* ApolloTests */ = { - isa = PBXGroup; - children = ( - 54FFC8241E9478A300C72D16 /* BatchedLoadTests.swift */, - 54FFC8251E9478A300C72D16 /* CacheKeyForFieldTests.swift */, - 54FFC8261E9478A300C72D16 /* DataLoaderTests.swift */, - 54FFC8271E9478A300C72D16 /* FetchQueryTests.swift */, - 54FFC8281E9478A300C72D16 /* GraphQLExecutorFieldValueTests.swift */, - 54FFC8291E9478A300C72D16 /* GraphQLInputValueEncodingTests.swift */, - 54FFC82A1E9478A300C72D16 /* LoadQueryFromStoreTests.swift */, - 54FFC82B1E9478A300C72D16 /* MockNetworkTransport.swift */, - 54FFC82C1E9478A300C72D16 /* NormalizeQueryResults.swift */, - 54FFC82D1E9478A300C72D16 /* ParseQueryResponseTests.swift */, - 54FFC82E1E9478A300C72D16 /* PromiseTests.swift */, - 54B59A551E94828100EB1B2B /* CachePersistenceTests.swift */, - 54FFC82F1E9478A300C72D16 /* StarWarsServerCachingRoundtripTests.swift */, - 54FFC8301E9478A300C72D16 /* StarWarsServerTests.swift */, - 54FFC8311E9478A300C72D16 /* StoreTransactionTests.swift */, - 54FFC8321E9478A300C72D16 /* Utilities.swift */, - 54FFC8331E9478A300C72D16 /* WatchQueryTests.swift */, - 54FFC81E1E94782400C72D16 /* Info.plist */, - ); - path = ApolloTests; - sourceTree = ""; - }; - 54FFC86D1E947CA900C72D16 /* TestHost iOS */ = { - isa = PBXGroup; - children = ( - 54FFC86E1E947CA900C72D16 /* AppDelegate.swift */, - 54FFC8701E947CA900C72D16 /* ViewController.swift */, - 54FFC8721E947CA900C72D16 /* Main.storyboard */, - 54FFC8751E947CA900C72D16 /* Assets.xcassets */, - 54FFC8771E947CA900C72D16 /* LaunchScreen.storyboard */, - 54FFC87A1E947CA900C72D16 /* Info.plist */, - ); - path = "TestHost iOS"; - sourceTree = ""; - }; - 54FFC8831E947D0800C72D16 /* ApolloPerformanceTests */ = { - isa = PBXGroup; - children = ( - 54FFC8901E947DBD00C72D16 /* NormalizedCachingTests.swift */, - 54FFC8911E947DBD00C72D16 /* PromiseTests.swift */, - 54FFC8861E947D0800C72D16 /* Info.plist */, - ); - path = ApolloPerformanceTests; - sourceTree = ""; - }; - C1B8068DEABD85ECF3227AA2 /* Pods */ = { - isa = PBXGroup; - children = ( - FC005AAA6953D6B8E8C04F0D /* Pods-ApolloExample.debug.xcconfig */, - 41AA21D8F253186B9E485F75 /* Pods-ApolloExample.release.xcconfig */, - 96252404982964864A31A200 /* Pods-ApolloExampleTests.debug.xcconfig */, - 1AAAF608B73F123ACD20BAB6 /* Pods-ApolloExampleTests.release.xcconfig */, - 2C1D521E7FD5370B3CEF23C5 /* Pods-StarWarsAPI.debug.xcconfig */, - 94187754DEB07DF0D9EDA415 /* Pods-StarWarsAPI.release.xcconfig */, - 61F8D719D2C7FBF66AD2ED45 /* Pods-ApolloTests.debug.xcconfig */, - 7F0F2E27BB660DC316A7B46A /* Pods-ApolloTests.release.xcconfig */, - C1B247319A0E9F0EB0132F61 /* Pods-ApolloPerformanceTests.debug.xcconfig */, - DACC71495C403877EDD9A4D7 /* Pods-ApolloPerformanceTests.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - C96167F12B5E3E2FD9D057A4 /* Frameworks */ = { - isa = PBXGroup; - children = ( - AD21DBB0EAAEAC44C0DAE2E0 /* Pods_ApolloExample.framework */, - 4D924536227C50FAA0070E95 /* Pods_ApolloExampleTests.framework */, - A05963DF880C07C7098254E7 /* Pods_StarWarsAPI.framework */, - 81EA39E0FF49825755B1B12F /* Pods_ApolloTests.framework */, - 5C5C4BC38A6DF130DAF68713 /* Pods_ApolloPerformanceTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 5454C0811E944FD400661138 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 5454C0881E944FD400661138 /* StarWarsAPI.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 5454C0831E944FD400661138 /* StarWarsAPI */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5454C08B1E944FD400661138 /* Build configuration list for PBXNativeTarget "StarWarsAPI" */; - buildPhases = ( - 56DBD0B564F953D11E4663AE /* [CP] Check Pods Manifest.lock */, - 5454C08C1E9450AB00661138 /* Generate Apollo Client API */, - 5454C07F1E944FD400661138 /* Sources */, - 5454C0801E944FD400661138 /* Frameworks */, - 5454C0811E944FD400661138 /* Headers */, - 5454C0821E944FD400661138 /* Resources */, - EF736F02D9DE238B4C32CA7C /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = StarWarsAPI; - productName = StarWarsAPI; - productReference = 5454C0841E944FD400661138 /* StarWarsAPI.framework */; - productType = "com.apple.product-type.framework"; - }; - 54E966CF1E9447F7002884AD /* ApolloExample */ = { - isa = PBXNativeTarget; - buildConfigurationList = 54E966ED1E9447F7002884AD /* Build configuration list for PBXNativeTarget "ApolloExample" */; - buildPhases = ( - 34578E9F83BE52E8FFB08218 /* [CP] Check Pods Manifest.lock */, - 54E966CC1E9447F7002884AD /* Sources */, - 54E966CD1E9447F7002884AD /* Frameworks */, - 54E966CE1E9447F7002884AD /* Resources */, - BC1B88B78431B107FC3E744E /* [CP] Embed Pods Frameworks */, - 96571593B3149F00AF3D1198 /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ApolloExample; - productName = ApolloExample; - productReference = 54E966D01E9447F7002884AD /* ApolloExample.app */; - productType = "com.apple.product-type.application"; - }; - 54FFC8191E94782400C72D16 /* ApolloTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 54FFC8211E94782400C72D16 /* Build configuration list for PBXNativeTarget "ApolloTests" */; - buildPhases = ( - BFF37DD422A70822D50051AD /* [CP] Check Pods Manifest.lock */, - 54FFC8161E94782400C72D16 /* Sources */, - 54FFC8171E94782400C72D16 /* Frameworks */, - 54FFC8181E94782400C72D16 /* Resources */, - 210B025904C19B1FF0097125 /* [CP] Embed Pods Frameworks */, - B89527101ABE786CD181C00C /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - 54FFC8481E94796400C72D16 /* PBXTargetDependency */, - 54FFC8201E94782400C72D16 /* PBXTargetDependency */, - ); - name = ApolloTests; - productName = ApolloTests; - productReference = 54FFC81A1E94782400C72D16 /* ApolloTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 54FFC86B1E947CA900C72D16 /* TestHost iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 54FFC87B1E947CA900C72D16 /* Build configuration list for PBXNativeTarget "TestHost iOS" */; - buildPhases = ( - 54FFC8681E947CA900C72D16 /* Sources */, - 54FFC8691E947CA900C72D16 /* Frameworks */, - 54FFC86A1E947CA900C72D16 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "TestHost iOS"; - productName = "TestHost iOS"; - productReference = 54FFC86C1E947CA900C72D16 /* TestHost iOS.app */; - productType = "com.apple.product-type.application"; - }; - 54FFC8811E947D0800C72D16 /* ApolloPerformanceTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 54FFC8891E947D0800C72D16 /* Build configuration list for PBXNativeTarget "ApolloPerformanceTests" */; - buildPhases = ( - 511CD961147011FC03E715E4 /* [CP] Check Pods Manifest.lock */, - 54FFC87E1E947D0800C72D16 /* Sources */, - 54FFC87F1E947D0800C72D16 /* Frameworks */, - 54FFC8801E947D0800C72D16 /* Resources */, - 34A349B732BC370DD00F6D64 /* [CP] Embed Pods Frameworks */, - 4940091A75956BDDC4DD521A /* [CP] Copy Pods Resources */, - ); - buildRules = ( - ); - dependencies = ( - 54FFC88D1E947D3600C72D16 /* PBXTargetDependency */, - 54FFC8881E947D0800C72D16 /* PBXTargetDependency */, - ); - name = ApolloPerformanceTests; - productName = ApolloPerformanceTests; - productReference = 54FFC8821E947D0800C72D16 /* ApolloPerformanceTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 54E966C81E9447F7002884AD /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0820; - LastUpgradeCheck = 0820; - TargetAttributes = { - 5454C0831E944FD400661138 = { - CreatedOnToolsVersion = 8.2.1; - LastSwiftMigration = 0820; - ProvisioningStyle = Automatic; - }; - 54E966CF1E9447F7002884AD = { - CreatedOnToolsVersion = 8.2.1; - ProvisioningStyle = Automatic; - }; - 54FFC8191E94782400C72D16 = { - CreatedOnToolsVersion = 8.2.1; - ProvisioningStyle = Automatic; - TestTargetID = 54E966CF1E9447F7002884AD; - }; - 54FFC86B1E947CA900C72D16 = { - CreatedOnToolsVersion = 8.2.1; - ProvisioningStyle = Automatic; - }; - 54FFC8811E947D0800C72D16 = { - CreatedOnToolsVersion = 8.2.1; - LastSwiftMigration = 0820; - ProvisioningStyle = Automatic; - TestTargetID = 54FFC86B1E947CA900C72D16; - }; - }; - }; - buildConfigurationList = 54E966CB1E9447F7002884AD /* Build configuration list for PBXProject "ApolloExample" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 54E966C71E9447F7002884AD; - productRefGroup = 54E966D11E9447F7002884AD /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 54E966CF1E9447F7002884AD /* ApolloExample */, - 54FFC8191E94782400C72D16 /* ApolloTests */, - 54FFC8811E947D0800C72D16 /* ApolloPerformanceTests */, - 5454C0831E944FD400661138 /* StarWarsAPI */, - 54FFC86B1E947CA900C72D16 /* TestHost iOS */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 5454C0821E944FD400661138 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 54FFC8671E947A2C00C72D16 /* TwoHeroes.graphql in Resources */, - 54FFC85F1E947A2C00C72D16 /* HeroName.graphql in Resources */, - 54FFC85D1E947A2C00C72D16 /* HeroDetails.graphql in Resources */, - 54FFC85C1E947A2C00C72D16 /* HeroAppearsIn.graphql in Resources */, - 54FFC8601E947A2C00C72D16 /* HeroNameConditional.graphql in Resources */, - 54FFC8651E947A2C00C72D16 /* schema.json in Resources */, - 54FFC85B1E947A2C00C72D16 /* HeroAndFriendsNames.graphql in Resources */, - 54FFC85E1E947A2C00C72D16 /* HeroDetailsWithFragment.graphql in Resources */, - 54FFC8631E947A2C00C72D16 /* HumanWithNullMass.graphql in Resources */, - 54FFC8661E947A2C00C72D16 /* Starship.graphql in Resources */, - 54FFC8611E947A2C00C72D16 /* HeroParentTypeDependentField.graphql in Resources */, - 54FFC85A1E947A2C00C72D16 /* CreateReviewForEpisode.graphql in Resources */, - 54FFC8621E947A2C00C72D16 /* HeroTypeDependentAliasedField.graphql in Resources */, - 54FFC8641E947A2C00C72D16 /* SameHeroTwice.graphql in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54E966CE1E9447F7002884AD /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 54E966DE1E9447F7002884AD /* LaunchScreen.storyboard in Resources */, - 54E966DB1E9447F7002884AD /* Assets.xcassets in Resources */, - 54E966D91E9447F7002884AD /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54FFC8181E94782400C72D16 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54FFC86A1E947CA900C72D16 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 54FFC8791E947CA900C72D16 /* LaunchScreen.storyboard in Resources */, - 54FFC8761E947CA900C72D16 /* Assets.xcassets in Resources */, - 54FFC8741E947CA900C72D16 /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54FFC8801E947D0800C72D16 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 210B025904C19B1FF0097125 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 34578E9F83BE52E8FFB08218 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; - 34A349B732BC370DD00F6D64 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 4940091A75956BDDC4DD521A /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 511CD961147011FC03E715E4 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; - 5454C08C1E9450AB00661138 /* Generate Apollo Client API */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Generate Apollo Client API"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "APOLLO_FRAMEWORK_PATH=$(eval find $FRAMEWORK_SEARCH_PATHS -name \"Apollo.framework\" -maxdepth 1)\n\nif [ -z \"$APOLLO_FRAMEWORK_PATH\" ]; then\necho \"error: Couldn't find Apollo.framework in FRAMEWORK_SEARCH_PATHS; make sure to add the framework to your project.\"\nexit 1\nfi\n\ncd ${SRCROOT}/StarWarsAPI\n$(find $APOLLO_FRAMEWORK_PATH -name 'check-and-run-apollo-codegen.sh') generate $(find . -name '*.graphql') --schema schema.json --output API.swift"; - }; - 56DBD0B564F953D11E4663AE /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; - 96571593B3149F00AF3D1198 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - B89527101ABE786CD181C00C /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - BC1B88B78431B107FC3E744E /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - BFF37DD422A70822D50051AD /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; - EF736F02D9DE238B4C32CA7C /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 5454C07F1E944FD400661138 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 54FFC8591E947A2C00C72D16 /* API.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54E966CC1E9447F7002884AD /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 54E966D61E9447F7002884AD /* ViewController.swift in Sources */, - 54E966D41E9447F7002884AD /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54FFC8161E94782400C72D16 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 54B59A561E94828100EB1B2B /* CachePersistenceTests.swift in Sources */, - 54FFC8361E9478A300C72D16 /* DataLoaderTests.swift in Sources */, - 54FFC8381E9478A300C72D16 /* GraphQLExecutorFieldValueTests.swift in Sources */, - 54FFC83D1E9478A300C72D16 /* ParseQueryResponseTests.swift in Sources */, - 54FFC8401E9478A300C72D16 /* StarWarsServerTests.swift in Sources */, - 54FFC83E1E9478A300C72D16 /* PromiseTests.swift in Sources */, - 54FFC83A1E9478A300C72D16 /* LoadQueryFromStoreTests.swift in Sources */, - 54FFC8431E9478A300C72D16 /* WatchQueryTests.swift in Sources */, - 54FFC8421E9478A300C72D16 /* Utilities.swift in Sources */, - 54FFC8391E9478A300C72D16 /* GraphQLInputValueEncodingTests.swift in Sources */, - 54FFC8371E9478A300C72D16 /* FetchQueryTests.swift in Sources */, - 54FFC83F1E9478A300C72D16 /* StarWarsServerCachingRoundtripTests.swift in Sources */, - 54FFC8351E9478A300C72D16 /* CacheKeyForFieldTests.swift in Sources */, - 54FFC83C1E9478A300C72D16 /* NormalizeQueryResults.swift in Sources */, - 54FFC8341E9478A300C72D16 /* BatchedLoadTests.swift in Sources */, - 54FFC8411E9478A300C72D16 /* StoreTransactionTests.swift in Sources */, - 54FFC83B1E9478A300C72D16 /* MockNetworkTransport.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54FFC8681E947CA900C72D16 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 54FFC8711E947CA900C72D16 /* ViewController.swift in Sources */, - 54FFC86F1E947CA900C72D16 /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54FFC87E1E947D0800C72D16 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 54FFC8921E947DBD00C72D16 /* NormalizedCachingTests.swift in Sources */, - 54FFC8931E947DBD00C72D16 /* PromiseTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 54FFC8201E94782400C72D16 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 54E966CF1E9447F7002884AD /* ApolloExample */; - targetProxy = 54FFC81F1E94782400C72D16 /* PBXContainerItemProxy */; - }; - 54FFC8481E94796400C72D16 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5454C0831E944FD400661138 /* StarWarsAPI */; - targetProxy = 54FFC8471E94796400C72D16 /* PBXContainerItemProxy */; - }; - 54FFC8881E947D0800C72D16 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 54FFC86B1E947CA900C72D16 /* TestHost iOS */; - targetProxy = 54FFC8871E947D0800C72D16 /* PBXContainerItemProxy */; - }; - 54FFC88D1E947D3600C72D16 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 5454C0831E944FD400661138 /* StarWarsAPI */; - targetProxy = 54FFC88C1E947D3600C72D16 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 54E966D71E9447F7002884AD /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 54E966D81E9447F7002884AD /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 54E966DC1E9447F7002884AD /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 54E966DD1E9447F7002884AD /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; - 54FFC8721E947CA900C72D16 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 54FFC8731E947CA900C72D16 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 54FFC8771E947CA900C72D16 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 54FFC8781E947CA900C72D16 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 5454C0891E944FD400661138 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2C1D521E7FD5370B3CEF23C5 /* Pods-StarWarsAPI.debug.xcconfig */; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = StarWarsAPI/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.StarWarsAPI; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 5454C08A1E944FD400661138 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 94187754DEB07DF0D9EDA415 /* Pods-StarWarsAPI.release.xcconfig */; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = StarWarsAPI/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.StarWarsAPI; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 54E966EB1E9447F7002884AD /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.2; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 54E966EC1E9447F7002884AD /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.2; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 54E966EE1E9447F7002884AD /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FC005AAA6953D6B8E8C04F0D /* Pods-ApolloExample.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = ApolloExample/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - 54E966EF1E9447F7002884AD /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 41AA21D8F253186B9E485F75 /* Pods-ApolloExample.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = ApolloExample/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; - 54FFC8221E94782400C72D16 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 61F8D719D2C7FBF66AD2ED45 /* Pods-ApolloTests.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - INFOPLIST_FILE = ApolloTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ApolloExample.app/ApolloExample"; - }; - name = Debug; - }; - 54FFC8231E94782400C72D16 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7F0F2E27BB660DC316A7B46A /* Pods-ApolloTests.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - INFOPLIST_FILE = ApolloTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ApolloExample.app/ApolloExample"; - }; - name = Release; - }; - 54FFC87C1E947CA900C72D16 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = "TestHost iOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.apollographql.TestHost-iOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - 54FFC87D1E947CA900C72D16 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = "TestHost iOS/Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.apollographql.TestHost-iOS"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; - 54FFC88A1E947D0800C72D16 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C1B247319A0E9F0EB0132F61 /* Pods-ApolloPerformanceTests.debug.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ENABLE_MODULES = YES; - INFOPLIST_FILE = ApolloPerformanceTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloPerformanceTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestHost iOS.app/TestHost iOS"; - }; - name = Debug; - }; - 54FFC88B1E947D0800C72D16 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = DACC71495C403877EDD9A4D7 /* Pods-ApolloPerformanceTests.release.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ENABLE_MODULES = YES; - INFOPLIST_FILE = ApolloPerformanceTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloPerformanceTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TestHost iOS.app/TestHost iOS"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 5454C08B1E944FD400661138 /* Build configuration list for PBXNativeTarget "StarWarsAPI" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5454C0891E944FD400661138 /* Debug */, - 5454C08A1E944FD400661138 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 54E966CB1E9447F7002884AD /* Build configuration list for PBXProject "ApolloExample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 54E966EB1E9447F7002884AD /* Debug */, - 54E966EC1E9447F7002884AD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 54E966ED1E9447F7002884AD /* Build configuration list for PBXNativeTarget "ApolloExample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 54E966EE1E9447F7002884AD /* Debug */, - 54E966EF1E9447F7002884AD /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 54FFC8211E94782400C72D16 /* Build configuration list for PBXNativeTarget "ApolloTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 54FFC8221E94782400C72D16 /* Debug */, - 54FFC8231E94782400C72D16 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 54FFC87B1E947CA900C72D16 /* Build configuration list for PBXNativeTarget "TestHost iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 54FFC87C1E947CA900C72D16 /* Debug */, - 54FFC87D1E947CA900C72D16 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 54FFC8891E947D0800C72D16 /* Build configuration list for PBXNativeTarget "ApolloPerformanceTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 54FFC88A1E947D0800C72D16 /* Debug */, - 54FFC88B1E947D0800C72D16 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 54E966C81E9447F7002884AD /* Project object */; -} diff --git a/Example/ApolloExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/ApolloExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index ad9c79e410..0000000000 --- a/Example/ApolloExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Example/ApolloExample.xcodeproj/xcshareddata/xcschemes/ApolloExample.xcscheme b/Example/ApolloExample.xcodeproj/xcshareddata/xcschemes/ApolloExample.xcscheme deleted file mode 100644 index 4eb74c1f6a..0000000000 --- a/Example/ApolloExample.xcodeproj/xcshareddata/xcschemes/ApolloExample.xcscheme +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/ApolloExample.xcworkspace/contents.xcworkspacedata b/Example/ApolloExample.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index a8e59441de..0000000000 --- a/Example/ApolloExample.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/Example/ApolloExample/AppDelegate.swift b/Example/ApolloExample/AppDelegate.swift deleted file mode 100644 index 72bd591489..0000000000 --- a/Example/ApolloExample/AppDelegate.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// AppDelegate.swift -// ApolloExample -// -// Created by paul_kompfner on 4/4/17. -// -// - -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - return true - } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - -} - diff --git a/Example/ApolloExample/ViewController.swift b/Example/ApolloExample/ViewController.swift deleted file mode 100644 index 001d8a77b5..0000000000 --- a/Example/ApolloExample/ViewController.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// ViewController.swift -// ApolloExample -// -// Created by paul_kompfner on 4/4/17. -// -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - -} - diff --git a/Example/Podfile b/Example/Podfile deleted file mode 100644 index ad5ab8468b..0000000000 --- a/Example/Podfile +++ /dev/null @@ -1,23 +0,0 @@ -platform :ios, '8.0' - -target 'ApolloExample' do - use_frameworks! - - # Pods for ApolloExample - pod 'Apollo', path: '../' - - target 'ApolloTests' do - inherit! :search_paths - end - - target 'ApolloPerformanceTests' do - inherit! :search_paths - end - - target 'StarWarsAPI' do - inherit! :search_paths - # For some reason this is needed to ensure that Apollo.framework is built before StarWarsAPI - pod 'Apollo', path: '../' - end - -end diff --git a/Example/Podfile.lock b/Example/Podfile.lock deleted file mode 100644 index 6b66761c08..0000000000 --- a/Example/Podfile.lock +++ /dev/null @@ -1,25 +0,0 @@ -PODS: - - Apollo (0.5.6): - - Apollo/Core (= 0.5.6) - - Apollo/SqliteNormalizedCache (= 0.5.6) - - Apollo/Core (0.5.6) - - Apollo/SqliteNormalizedCache (0.5.6): - - SQLite.swift (~> 0.11) - - SQLite.swift (0.11.2): - - SQLite.swift/standard (= 0.11.2) - - SQLite.swift/standard (0.11.2) - -DEPENDENCIES: - - Apollo (from `../`) - -EXTERNAL SOURCES: - Apollo: - :path: "../" - -SPEC CHECKSUMS: - Apollo: ce99c9c8b9173d6f81da3f9ad2339625b439f61d - SQLite.swift: 670c3e9e0a806bbfd56a3de5d530768dc0e6fe7c - -PODFILE CHECKSUM: 9bd64f1e501820f8e5f1371c1e93f80107c6bb1f - -COCOAPODS: 1.2.0 diff --git a/Example/Pods/Local Podspecs/Apollo.podspec.json b/Example/Pods/Local Podspecs/Apollo.podspec.json deleted file mode 100644 index 971e371f29..0000000000 --- a/Example/Pods/Local Podspecs/Apollo.podspec.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "Apollo", - "version": "0.5.6", - "authors": "Meteor Development Group", - "homepage": "https://github.com/apollographql/apollo-ios", - "license": { - "type": "MIT", - "file": "LICENSE" - }, - "summary": "A GraphQL client for iOS, written in Swift.", - "source": { - "git": "https://github.com/apollographql/apollo-ios.git", - "tag": "0.5.6" - }, - "requires_arc": true, - "resources": "scripts/check-and-run-apollo-codegen.sh", - "platforms": { - "osx": null, - "ios": null, - "tvos": null, - "watchos": null - }, - "subspecs": [ - { - "name": "Core", - "platforms": { - "ios": "8.0", - "osx": "10.10", - "tvos": "9.0" - }, - "source_files": "Sources/*.swift" - }, - { - "name": "SqliteNormalizedCache", - "platforms": { - "ios": "8.0", - "osx": "10.10" - }, - "source_files": "Sources/SqliteNormalizedCache/*.swift", - "dependencies": { - "SQLite.swift": [ - "~> 0.11" - ] - } - } - ] -} diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock deleted file mode 100644 index 6b66761c08..0000000000 --- a/Example/Pods/Manifest.lock +++ /dev/null @@ -1,25 +0,0 @@ -PODS: - - Apollo (0.5.6): - - Apollo/Core (= 0.5.6) - - Apollo/SqliteNormalizedCache (= 0.5.6) - - Apollo/Core (0.5.6) - - Apollo/SqliteNormalizedCache (0.5.6): - - SQLite.swift (~> 0.11) - - SQLite.swift (0.11.2): - - SQLite.swift/standard (= 0.11.2) - - SQLite.swift/standard (0.11.2) - -DEPENDENCIES: - - Apollo (from `../`) - -EXTERNAL SOURCES: - Apollo: - :path: "../" - -SPEC CHECKSUMS: - Apollo: ce99c9c8b9173d6f81da3f9ad2339625b439f61d - SQLite.swift: 670c3e9e0a806bbfd56a3de5d530768dc0e6fe7c - -PODFILE CHECKSUM: 9bd64f1e501820f8e5f1371c1e93f80107c6bb1f - -COCOAPODS: 1.2.0 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj deleted file mode 100644 index b0fa8f51b4..0000000000 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1578 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 01CD0AAF59D458AC3EF2601332DC362C /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5055831E03BFDFD4C3C8D027419F425 /* SqliteNormalizedCache.swift */; }; - 108A1CBD5D0C9FC34DD2B5C2B8DD0E1F /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF98B7BBADF63A0AF80D7829FA6F77B9 /* Schema.swift */; }; - 1105737F12067068DF24A2FD70FC93A3 /* Pods-ApolloPerformanceTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 975269A36A5CF422A22E5D5DA93EAB28 /* Pods-ApolloPerformanceTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 11D8F132B7F8704E64825695F6B0DC91 /* fts3_tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5AE2EFBEFDE20C4DDD8B3398D8AE5AE8 /* fts3_tokenizer.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 1569991C9A095D1FCE6B235BD63B51A4 /* Apollo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 957927E0DFC5FB03E6CA1B87814A9E10 /* Apollo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 15E73F1CED9B85C8E03C6134581D2ED0 /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60FAE93532FD5578A02AF3CC523A3408 /* CoreFunctions.swift */; }; - 16822C933B2ADA1EA5F2EB694F3DA728 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; - 20C306F7AA685281AAEADDEF70FE27B4 /* Record.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF6D660C4C1C51D6932C1A19AD7991A9 /* Record.swift */; }; - 2232C53C6D807D0DA97BBB9E4523412C /* Pods-ApolloPerformanceTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E664068C762C5F1811AB06C5856E5BC7 /* Pods-ApolloPerformanceTests-dummy.m */; }; - 24401D6F94D534811685D1F542F93892 /* GraphQLResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEF7E7502D3D6F1C9360B904243E76A1 /* GraphQLResponse.swift */; }; - 2650B6BD41F1BDFF5A15F9C4C8E61A37 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 815355E6475667E8ED041F3EC76D4880 /* Utilities.swift */; }; - 2664C21FA05281B3AEC72F71EA44028A /* Collections.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54AAF8298970F6D90491BF3D752ECFB6 /* Collections.swift */; }; - 2C64BE3142AB8955A8F1B7ED8C4AC1FD /* AsynchronousOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11877C4D6F494C575C9E88FA15AA98FA /* AsynchronousOperation.swift */; }; - 30382E91D15E7ED4E930564DE86EAF27 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44EE37E8BF436A90A9C40AD27A182DB2 /* Expression.swift */; }; - 3046B5C2E5FFE5A008023E939500A575 /* Pods-StarWarsAPI-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 179109F8B259422432C0355515576040 /* Pods-StarWarsAPI-dummy.m */; }; - 3401D945C9C21F03B6E5100F26DF231C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; - 35E5EEDB90225D140DCA57800CD5A2CD /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23E934E5F923C9742E63347D5512C322 /* AggregateFunctions.swift */; }; - 3D85E3F5AB73653A962BCF09ED74A8C0 /* JSONSerializationFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = C548175F116A5CF621194BC4BA3581C8 /* JSONSerializationFormat.swift */; }; - 3EB8845BB3EB8B7E031BCA86CEC2F0D2 /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B4C8E0D8DB99B4482E2549FEAE620B8 /* FTS5.swift */; }; - 3EEC07CDEFE2204C5CFC1E1B10B6537F /* GraphQLResultNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29444EF033FEC5301794AA3FF05E1255 /* GraphQLResultNormalizer.swift */; }; - 415B7E98D356AE4B47C6FD5D11E11C99 /* Pods-ApolloExample-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F2AA223F544DC4835618D4D4A2FAA05 /* Pods-ApolloExample-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 42F81544370E1853391B67D56656A0C3 /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348491EAD9C18B0EEB2E855815254774 /* CustomFunctions.swift */; }; - 44C82D3863ECC8C395C961C46C2F756B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; - 47628EC1F1DDCC60DF83EA01A277919E /* SQLite-Bridging.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E070D9E44393CD520D0B1AF87A6736D /* SQLite-Bridging.m */; }; - 47B4F5C1BFB40746F552A6D5CE482DC3 /* Locking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 953093E4245EE7B30DC3346C75ABDEDE /* Locking.swift */; }; - 49876A987CA44C386457D31880AE1BD6 /* SQLite.swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 27B2D491F0A9B062233011B873DC118C /* SQLite.swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4A23CC3D6A3579C9F12AE00384A7A4F3 /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F331ABE5223829EDFFC088184DFA981 /* RTree.swift */; }; - 4DCCD02DB715AC161B0774E0C137353E /* NetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = A42E64B88B3B4D17143C3055589082E2 /* NetworkTransport.swift */; }; - 4FFB64EBCE34E07A60C74F1957B34A7B /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FCCE88ECC9D892349AB6CB3160246D9 /* Query.swift */; }; - 54050A3940A7AAF2A4166F6B4027F1D0 /* Pods-StarWarsAPI-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 03D7BFAC37C274E39C5162127AEB6199 /* Pods-StarWarsAPI-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 54CFD21E9012A2554410D08EF63E42CB /* ApolloClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 401F038C1A93F7D71496AEEA082C8187 /* ApolloClient.swift */; }; - 5C154FC66B0272E926E740EB0D5DDF3E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; - 6263A24701DED2E7A447C0313C7C555D /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA7CCC1A073BC5540EA969CA71F0C552 /* Setter.swift */; }; - 636C2473106673D1432A22A0B7D6A2C9 /* Pods-ApolloExample-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FD2E12182B5FA8C0EC9565A13BB8D01 /* Pods-ApolloExample-dummy.m */; }; - 63D650CA310911FBCB77C3E6229330A7 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = B88C5FD0C85A5AE4583CC7DB512E6820 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6C5A957F0E47791FFA662827ADBA67A9 /* GraphQLResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = B91E033EE4268436D667B4A0516DF63B /* GraphQLResult.swift */; }; - 6CC6B8EEDAA285718533CC1482D13B61 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB48C810AC51836598FF53899021CAAA /* Result.swift */; }; - 6F378D7233AC3E51B00DB180BF8D6066 /* Selections.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAE831C7B824D4684E2AA58D8A0E547A /* Selections.swift */; }; - 6FCDA3222BB1A7CADC500C19CA4A6611 /* check-and-run-apollo-codegen.sh in Resources */ = {isa = PBXBuildFile; fileRef = 3BEC86F0EAB93BCB8EA7A6615DBC98BE /* check-and-run-apollo-codegen.sh */; }; - 77E05C7059DFD498C2B323C3A707C0E8 /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1510979B9E8022F1675C9B31D38A561D /* Promise.swift */; }; - 787BB17CD95328B14A766F6BC04D2148 /* HTTPNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0E0E7DEA40266C91EEEF8DE80F9A821 /* HTTPNetworkTransport.swift */; }; - 7FF4749CC9A33C7B79FE51E0962A4E8A /* Dictionary+KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9601BDB184C7FA2886421EDA6BC51FE0 /* Dictionary+KeyPath.swift */; }; - 853B5034825B85498FE7857957760849 /* NormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD4F73A249897121C29746449E83681B /* NormalizedCache.swift */; }; - 87109E7659BAF278C52455C1D6529DF6 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DE06F129836BA95B0BE2222991D2BD0 /* Value.swift */; }; - 8916D47EB3F95315F2020922A6130D8D /* GraphQLExecutor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3934F1038706695A3609AADC734C098B /* GraphQLExecutor.swift */; }; - 8D2A9E5942209EC7EAE309C3BDEC344E /* GraphQLQueryWatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFFEE6F4624C74CD2CA4DC90DA4760F4 /* GraphQLQueryWatcher.swift */; }; - 94C4501EC15533C68551FCFD9896339D /* Pods-ApolloTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E12D36800035FA4AEBD5CCA0E467F5C2 /* Pods-ApolloTests-dummy.m */; }; - 94ECE937BFDFCDBD700A107B1DC40CA9 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96600A78FEC066BF8931D7A58FBF0F16 /* Statement.swift */; }; - 990D4881FF22A80867C475FB9823817A /* Pods-ApolloTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A750E6B16B43489DE32A5211D58F9FBA /* Pods-ApolloTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A11B9C4B8DC4AF252BA2727D21A1EEF1 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7B7855DE178D22988512E88C68325BE /* Collation.swift */; }; - A3FF4B5B363E91C3BE7FC3294C555032 /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E667D63233F61B551F3B93AF184020E0 /* Foundation.swift */; }; - A54DF0B95FE0DAD23D2A81D408683D03 /* DataLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9945BAB50B7F6365B802F25E004A2566 /* DataLoader.swift */; }; - A60D999F6C5C2A7030430FBB2644A85D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; - AB1840F1E49F6C17A8A12662445629C3 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDA86AD441076D928D0621530CD5E745 /* Operators.swift */; }; - AC87CC13FC22BD408AA235121C216C85 /* ApolloStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8037D537446EB8C0C0FC358AACDFBCDB /* ApolloStore.swift */; }; - AFC4EF684AAE208082F88A746E8799D5 /* SQLite-Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = AF7F8DDFC50FE6ACA57F6A16E253F8DC /* SQLite-Bridging.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B27809FB8835D7719B0AD7337D908431 /* SQLite.swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D30459F9DC30876AF6C299D26C7CE48 /* SQLite.swift-dummy.m */; }; - B6F6F22A0B59D1A386C7AC19789B74C0 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DB44F0C85553660857F351B59660E399 /* SQLite.framework */; }; - B8354678757BF7E72C8E638F8FD096ED /* JSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C463C83D40DC933D44D3FAFBB8D476E /* JSON.swift */; }; - B948E00EC8119CFD8B9E55DBBDA5A4E3 /* GraphQLOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC1A0D34707B7C5AB1AC9821F092A5F /* GraphQLOperation.swift */; }; - BA32663AD51B09E7997DD5871D7FE383 /* GraphQLDependencyTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CF244F5154EDAAAD43F2B551C5B1B34 /* GraphQLDependencyTracker.swift */; }; - C02AE58DC3E78ACB817163011C7A6734 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 680617B7B3999D016982CD479DADCCB0 /* Blob.swift */; }; - D850BB2A3E7B9A6AAEB54FA9A8B7AD4F /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCF813C6D3C0824E1BCFDACADE6109F5 /* Connection.swift */; }; - D99283BAF5F146D362611679A5ED1A5D /* Apollo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 42E5D07D44401421901F612C8D4837BC /* Apollo-dummy.m */; }; - DA0CEB1E0989DCA89796ABDF7267A7B0 /* InMemoryNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F18865B76F1771AD7CAF6C87A0B0A76 /* InMemoryNormalizedCache.swift */; }; - DD139C21BC1B51C5078B8F9C2F55D0A3 /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7A99896DB5D793228657B5F5EC525DA /* FTS4.swift */; }; - E13D7AA4EFBA1345BDC2E05B4BD67F2A /* GraphQLError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC7DBCA1F40B1DC0B762047428B9D510 /* GraphQLError.swift */; }; - E2D3B028353BC0FA74DA8536C717B9E4 /* GraphQLValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 677F4603A01A5098CB5B4238A4B5E16D /* GraphQLValues.swift */; }; - EB775615489CE36C2D86C4EB279F3FF5 /* GraphQLResultMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2211D04CA00FD182ADC495BC12C7E0FA /* GraphQLResultMapper.swift */; }; - EEA27311E6D18D94F27E12D2F0BE7BF0 /* GraphQLOutputType.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD979ED094ED16CE55D3AB05A872C77F /* GraphQLOutputType.swift */; }; - F0EF5885BD48A9B939F3FF9C1DC1A965 /* GraphQLResultAccumulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71B233364D9628F60058A864201DEC5A /* GraphQLResultAccumulator.swift */; }; - F4DAAE8A4DF58A14A2B8A6272ED102C7 /* RecordSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF01E514190839B447A1DC628224BFD /* RecordSet.swift */; }; - F86D649610E4878DE71D25AA9CC614A2 /* JSONStandardTypeConversions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 951BEA39308FE598897A6798B562CDEA /* JSONStandardTypeConversions.swift */; }; - FAB10CD9CFBBFB7DE9F271B434380C16 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */; }; - FDA57D0DA6CBE5083CAF08A8B2F86AC9 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2C5D76BD109C46DEC526A712FC4A8BB /* Helpers.swift */; }; - FF53DDD16D8FC3431D3F148AC7FD56CD /* GraphQLResponseGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1DE0FBDF2EC85A9CB28E87D3016B69C /* GraphQLResponseGenerator.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 1F9242C10DCAAE891388E785556234B8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = C566155694F9D7502B8E41EDDAE53326; - remoteInfo = Apollo; - }; - 26821ADABDEB80E0955C6A95F66727F0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 19C23DAC4474B6CD13A5110683532E69; - remoteInfo = SQLite.swift; - }; - 3A80F75EB77EED46D454A98123AB9CE5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 19C23DAC4474B6CD13A5110683532E69; - remoteInfo = SQLite.swift; - }; - 46F1F23422897FFFE9D31496B6CFD03F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 19C23DAC4474B6CD13A5110683532E69; - remoteInfo = SQLite.swift; - }; - 64E5D955EF55FA4B878F3A32D0658ADE /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 19C23DAC4474B6CD13A5110683532E69; - remoteInfo = SQLite.swift; - }; - 6EC485A2374F1AB1F5F33127C6257458 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = C566155694F9D7502B8E41EDDAE53326; - remoteInfo = Apollo; - }; - C00427F48EF37BFBCADF82EB7092C653 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = C566155694F9D7502B8E41EDDAE53326; - remoteInfo = Apollo; - }; - DA3A67213BA0213D69558FE47052F8CB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 19C23DAC4474B6CD13A5110683532E69; - remoteInfo = SQLite.swift; - }; - F08278AA3683BE91FA7DC6EDE8AAA38A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = C566155694F9D7502B8E41EDDAE53326; - remoteInfo = Apollo; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 01C3FA9C5081FAF3B433C1CAC200835C /* Pods-ApolloPerformanceTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloPerformanceTests.debug.xcconfig"; sourceTree = ""; }; - 03D7BFAC37C274E39C5162127AEB6199 /* Pods-StarWarsAPI-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-StarWarsAPI-umbrella.h"; sourceTree = ""; }; - 08674A30761B25CB7AE0CE4CFFBFF205 /* Pods-ApolloTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloTests.release.xcconfig"; sourceTree = ""; }; - 0AB6C025AC773267F2034B391653AEF6 /* Pods-ApolloTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloTests.debug.xcconfig"; sourceTree = ""; }; - 0E070D9E44393CD520D0B1AF87A6736D /* SQLite-Bridging.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "SQLite-Bridging.m"; path = "Sources/SQLiteObjc/SQLite-Bridging.m"; sourceTree = ""; }; - 0F331ABE5223829EDFFC088184DFA981 /* RTree.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RTree.swift; path = Sources/SQLite/Extensions/RTree.swift; sourceTree = ""; }; - 10FA3C1A5006EC52FC44C8EB07B5BDAE /* Pods-ApolloTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloTests.modulemap"; sourceTree = ""; }; - 11877C4D6F494C575C9E88FA15AA98FA /* AsynchronousOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AsynchronousOperation.swift; sourceTree = ""; }; - 1510979B9E8022F1675C9B31D38A561D /* Promise.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Promise.swift; sourceTree = ""; }; - 160F355101277829561FC9CDD0D3F16B /* Pods-ApolloPerformanceTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloPerformanceTests-frameworks.sh"; sourceTree = ""; }; - 179109F8B259422432C0355515576040 /* Pods-StarWarsAPI-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-StarWarsAPI-dummy.m"; sourceTree = ""; }; - 1AD67889E8665E2406E38CC279A50DB7 /* Pods-ApolloPerformanceTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloPerformanceTests-resources.sh"; sourceTree = ""; }; - 1D7DA9FB08FD2A913967F0D7996B8701 /* SQLite.swift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = SQLite.swift.modulemap; sourceTree = ""; }; - 1EC3C1E6C3B57B46326B94BAB568B649 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1F4445F089281553CC23A453DBF203C7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 21E66D4ED8F6CC300DC7FE2F93A367A2 /* Apollo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Apollo.modulemap; sourceTree = ""; }; - 2211D04CA00FD182ADC495BC12C7E0FA /* GraphQLResultMapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultMapper.swift; sourceTree = ""; }; - 23E934E5F923C9742E63347D5512C322 /* AggregateFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AggregateFunctions.swift; path = Sources/SQLite/Typed/AggregateFunctions.swift; sourceTree = ""; }; - 261B0C331D5E3A2F400B2EC0F77CC1F7 /* Pods_StarWarsAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_StarWarsAPI.framework; path = "Pods-StarWarsAPI.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 27B2D491F0A9B062233011B873DC118C /* SQLite.swift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SQLite.swift-umbrella.h"; sourceTree = ""; }; - 29444EF033FEC5301794AA3FF05E1255 /* GraphQLResultNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultNormalizer.swift; sourceTree = ""; }; - 2D30459F9DC30876AF6C299D26C7CE48 /* SQLite.swift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SQLite.swift-dummy.m"; sourceTree = ""; }; - 2DE423399B21C05322619DF24D280234 /* Pods-StarWarsAPI.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StarWarsAPI.debug.xcconfig"; sourceTree = ""; }; - 2F18865B76F1771AD7CAF6C87A0B0A76 /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; - 348491EAD9C18B0EEB2E855815254774 /* CustomFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomFunctions.swift; path = Sources/SQLite/Typed/CustomFunctions.swift; sourceTree = ""; }; - 391CA98836DC28B658B23EE172EA2DC5 /* Apollo.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Apollo.xcconfig; sourceTree = ""; }; - 3934F1038706695A3609AADC734C098B /* GraphQLExecutor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLExecutor.swift; sourceTree = ""; }; - 3BEC86F0EAB93BCB8EA7A6615DBC98BE /* check-and-run-apollo-codegen.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "check-and-run-apollo-codegen.sh"; sourceTree = ""; }; - 3C7116256A907933BD6C8D01B5E5D592 /* Pods-ApolloPerformanceTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloPerformanceTests.release.xcconfig"; sourceTree = ""; }; - 3CF244F5154EDAAAD43F2B551C5B1B34 /* GraphQLDependencyTracker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLDependencyTracker.swift; sourceTree = ""; }; - 3D54BDE67F2AF934CA35178FCC1165EB /* Pods-ApolloPerformanceTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloPerformanceTests-acknowledgements.markdown"; sourceTree = ""; }; - 3F2AA223F544DC4835618D4D4A2FAA05 /* Pods-ApolloExample-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloExample-umbrella.h"; sourceTree = ""; }; - 3FA13D59DC7D79809DCEF476848EAED0 /* Pods_ApolloExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloExample.framework; path = "Pods-ApolloExample.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3FCCE88ECC9D892349AB6CB3160246D9 /* Query.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Query.swift; path = Sources/SQLite/Typed/Query.swift; sourceTree = ""; }; - 401F038C1A93F7D71496AEEA082C8187 /* ApolloClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ApolloClient.swift; sourceTree = ""; }; - 42E5D07D44401421901F612C8D4837BC /* Apollo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Apollo-dummy.m"; sourceTree = ""; }; - 44EE37E8BF436A90A9C40AD27A182DB2 /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/SQLite/Typed/Expression.swift; sourceTree = ""; }; - 4B4C8E0D8DB99B4482E2549FEAE620B8 /* FTS5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FTS5.swift; path = Sources/SQLite/Extensions/FTS5.swift; sourceTree = ""; }; - 54AAF8298970F6D90491BF3D752ECFB6 /* Collections.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Collections.swift; sourceTree = ""; }; - 550DCFFB3AF38FE48668B410DCC530D2 /* Pods-ApolloPerformanceTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloPerformanceTests.modulemap"; sourceTree = ""; }; - 58EA58A33C79BB0F400C14494D1142CC /* Pods-ApolloTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloTests-frameworks.sh"; sourceTree = ""; }; - 5AE2EFBEFDE20C4DDD8B3398D8AE5AE8 /* fts3_tokenizer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = fts3_tokenizer.h; path = Sources/SQLiteObjc/fts3_tokenizer.h; sourceTree = ""; }; - 60FAE93532FD5578A02AF3CC523A3408 /* CoreFunctions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CoreFunctions.swift; path = Sources/SQLite/Typed/CoreFunctions.swift; sourceTree = ""; }; - 6690FA900A959073D6602DDA8B9B96FC /* Pods-StarWarsAPI-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-StarWarsAPI-acknowledgements.plist"; sourceTree = ""; }; - 677F4603A01A5098CB5B4238A4B5E16D /* GraphQLValues.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLValues.swift; sourceTree = ""; }; - 680617B7B3999D016982CD479DADCCB0 /* Blob.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Blob.swift; path = Sources/SQLite/Core/Blob.swift; sourceTree = ""; }; - 71B233364D9628F60058A864201DEC5A /* GraphQLResultAccumulator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResultAccumulator.swift; sourceTree = ""; }; - 724B09788D59362DE110F9760831B30B /* Pods-StarWarsAPI.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StarWarsAPI.release.xcconfig"; sourceTree = ""; }; - 7491C42CA1F0D47FF353804EDFC308A7 /* Apollo-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Apollo-prefix.pch"; sourceTree = ""; }; - 7AF34EB0D4F25CC4FBA1A60724BBC66A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 7C463C83D40DC933D44D3FAFBB8D476E /* JSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSON.swift; sourceTree = ""; }; - 7ED2D87037EC2D5F09173EE9E979C813 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 7FD2E12182B5FA8C0EC9565A13BB8D01 /* Pods-ApolloExample-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloExample-dummy.m"; sourceTree = ""; }; - 8037D537446EB8C0C0FC358AACDFBCDB /* ApolloStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ApolloStore.swift; sourceTree = ""; }; - 815355E6475667E8ED041F3EC76D4880 /* Utilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; - 8378EF5103C93E048B7DF8B41415FF63 /* Pods-ApolloExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExample.debug.xcconfig"; sourceTree = ""; }; - 88BFCDC2C48A9AAC024D78C7786357F9 /* SQLite.swift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SQLite.swift.xcconfig; sourceTree = ""; }; - 8AA0C69818598EB79B91BCA0BE698842 /* Pods-ApolloExample-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExample-frameworks.sh"; sourceTree = ""; }; - 8C1BB3B1629831A0860FA95DD624C9F4 /* Pods-ApolloTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloTests-acknowledgements.markdown"; sourceTree = ""; }; - 904829AAE2B1DE6B6F2CE13CDD6EDE22 /* Pods-ApolloExample-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloExample-acknowledgements.plist"; sourceTree = ""; }; - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 949A295ACAD1338645F511B3B615304F /* Pods-StarWarsAPI.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-StarWarsAPI.modulemap"; sourceTree = ""; }; - 951BEA39308FE598897A6798B562CDEA /* JSONStandardTypeConversions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSONStandardTypeConversions.swift; sourceTree = ""; }; - 953093E4245EE7B30DC3346C75ABDEDE /* Locking.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Locking.swift; sourceTree = ""; }; - 957927E0DFC5FB03E6CA1B87814A9E10 /* Apollo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Apollo-umbrella.h"; sourceTree = ""; }; - 9601BDB184C7FA2886421EDA6BC51FE0 /* Dictionary+KeyPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Dictionary+KeyPath.swift"; sourceTree = ""; }; - 96600A78FEC066BF8931D7A58FBF0F16 /* Statement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Statement.swift; path = Sources/SQLite/Core/Statement.swift; sourceTree = ""; }; - 975269A36A5CF422A22E5D5DA93EAB28 /* Pods-ApolloPerformanceTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloPerformanceTests-umbrella.h"; sourceTree = ""; }; - 9945BAB50B7F6365B802F25E004A2566 /* DataLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DataLoader.swift; sourceTree = ""; }; - 9ADC492098AB1E55A5C9644F01624CA8 /* Pods-ApolloExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ApolloExample.release.xcconfig"; sourceTree = ""; }; - 9DE06F129836BA95B0BE2222991D2BD0 /* Value.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Value.swift; path = Sources/SQLite/Core/Value.swift; sourceTree = ""; }; - A2C5D76BD109C46DEC526A712FC4A8BB /* Helpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Helpers.swift; path = Sources/SQLite/Helpers.swift; sourceTree = ""; }; - A42E64B88B3B4D17143C3055589082E2 /* NetworkTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NetworkTransport.swift; sourceTree = ""; }; - A750E6B16B43489DE32A5211D58F9FBA /* Pods-ApolloTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ApolloTests-umbrella.h"; sourceTree = ""; }; - AB48C810AC51836598FF53899021CAAA /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; }; - AC7E77DE5E2272297487C6FDD2A16513 /* Pods-ApolloPerformanceTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloPerformanceTests-acknowledgements.plist"; sourceTree = ""; }; - AF6D660C4C1C51D6932C1A19AD7991A9 /* Record.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Record.swift; sourceTree = ""; }; - AF7F8DDFC50FE6ACA57F6A16E253F8DC /* SQLite-Bridging.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "SQLite-Bridging.h"; path = "Sources/SQLiteObjc/include/SQLite-Bridging.h"; sourceTree = ""; }; - B5A51A258D56CEEC8707C43B4CA66D57 /* Pods-ApolloTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ApolloTests-acknowledgements.plist"; sourceTree = ""; }; - B7A99896DB5D793228657B5F5EC525DA /* FTS4.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FTS4.swift; path = Sources/SQLite/Extensions/FTS4.swift; sourceTree = ""; }; - B88C5FD0C85A5AE4583CC7DB512E6820 /* SQLite.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SQLite.h; path = Sources/SQLite/SQLite.h; sourceTree = ""; }; - B91E033EE4268436D667B4A0516DF63B /* GraphQLResult.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResult.swift; sourceTree = ""; }; - B9CA5768D35422C7387D78822AB2AA46 /* Pods-ApolloExample-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ApolloExample-acknowledgements.markdown"; sourceTree = ""; }; - BC7DBCA1F40B1DC0B762047428B9D510 /* GraphQLError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLError.swift; sourceTree = ""; }; - BDA86AD441076D928D0621530CD5E745 /* Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operators.swift; path = Sources/SQLite/Typed/Operators.swift; sourceTree = ""; }; - C08D4B7E051B2878FD9A1DB195944C60 /* Pods_ApolloTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloTests.framework; path = "Pods-ApolloTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - C12EBB64588697C58EB83E3A1D147FA8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C1FDE43D56FD01FEC6EC0EC50C96A22D /* Pods-ApolloExample.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-ApolloExample.modulemap"; sourceTree = ""; }; - C548175F116A5CF621194BC4BA3581C8 /* JSONSerializationFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = JSONSerializationFormat.swift; sourceTree = ""; }; - C97E29747EDD103755CD3BBB58DB0042 /* Pods_ApolloPerformanceTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ApolloPerformanceTests.framework; path = "Pods-ApolloPerformanceTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - CA1C6F1BBEC2162E2BA5E756F9B77A2C /* Pods-ApolloTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloTests-resources.sh"; sourceTree = ""; }; - CA3ED8D54211455DE25A4DA036694445 /* SQLite.swift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SQLite.swift-prefix.pch"; sourceTree = ""; }; - CCC1A0D34707B7C5AB1AC9821F092A5F /* GraphQLOperation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLOperation.swift; sourceTree = ""; }; - CCF813C6D3C0824E1BCFDACADE6109F5 /* Connection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Connection.swift; path = Sources/SQLite/Core/Connection.swift; sourceTree = ""; }; - CD4F73A249897121C29746449E83681B /* NormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NormalizedCache.swift; sourceTree = ""; }; - CD979ED094ED16CE55D3AB05A872C77F /* GraphQLOutputType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLOutputType.swift; sourceTree = ""; }; - CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - CEF7E7502D3D6F1C9360B904243E76A1 /* GraphQLResponse.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResponse.swift; sourceTree = ""; }; - D7B7855DE178D22988512E88C68325BE /* Collation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Collation.swift; path = Sources/SQLite/Typed/Collation.swift; sourceTree = ""; }; - D9D01E19268F158CBD26569BCDA0CB2A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DA7CCC1A073BC5540EA969CA71F0C552 /* Setter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Setter.swift; path = Sources/SQLite/Typed/Setter.swift; sourceTree = ""; }; - DAE831C7B824D4684E2AA58D8A0E547A /* Selections.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Selections.swift; sourceTree = ""; }; - DB44F0C85553660857F351B59660E399 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E12D36800035FA4AEBD5CCA0E467F5C2 /* Pods-ApolloTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloTests-dummy.m"; sourceTree = ""; }; - E1DE0FBDF2EC85A9CB28E87D3016B69C /* GraphQLResponseGenerator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLResponseGenerator.swift; sourceTree = ""; }; - E4C251316F1350DC62A6C4843F9E8DAC /* Pods-StarWarsAPI-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-StarWarsAPI-acknowledgements.markdown"; sourceTree = ""; }; - E4DDFDE7D66D82B6084F70FC8DE5F14D /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SQLite.framework; path = SQLite.swift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E5055831E03BFDFD4C3C8D027419F425 /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCache.swift; sourceTree = ""; }; - E664068C762C5F1811AB06C5856E5BC7 /* Pods-ApolloPerformanceTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ApolloPerformanceTests-dummy.m"; sourceTree = ""; }; - E667D63233F61B551F3B93AF184020E0 /* Foundation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Foundation.swift; path = Sources/SQLite/Foundation.swift; sourceTree = ""; }; - ECF01E514190839B447A1DC628224BFD /* RecordSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RecordSet.swift; sourceTree = ""; }; - EFFEE6F4624C74CD2CA4DC90DA4760F4 /* GraphQLQueryWatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GraphQLQueryWatcher.swift; sourceTree = ""; }; - F0E0E7DEA40266C91EEEF8DE80F9A821 /* HTTPNetworkTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HTTPNetworkTransport.swift; sourceTree = ""; }; - F4E94D9B3A51997F835199160D3A6204 /* Apollo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Apollo.framework; path = Apollo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FC7AB7465546FD30A69F21B534830CF6 /* Pods-ApolloExample-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ApolloExample-resources.sh"; sourceTree = ""; }; - FF72FDA919EE62C2297D3C1EF8E50F18 /* Pods-StarWarsAPI-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-StarWarsAPI-resources.sh"; sourceTree = ""; }; - FF98B7BBADF63A0AF80D7829FA6F77B9 /* Schema.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Schema.swift; path = Sources/SQLite/Typed/Schema.swift; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 204A049E51246EBFC6025779873FE742 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - FAB10CD9CFBBFB7DE9F271B434380C16 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 30AE83E2B9378413D12911D07B9342A1 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3401D945C9C21F03B6E5100F26DF231C /* Foundation.framework in Frameworks */, - B6F6F22A0B59D1A386C7AC19789B74C0 /* SQLite.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 480A9FB08056754438E61097D5ADB3A7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 16822C933B2ADA1EA5F2EB694F3DA728 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 79865417B1BFD4E495D7137ACF9240CB /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 44C82D3863ECC8C395C961C46C2F756B /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A669049662D8B3E8CE1621BA70630893 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - A60D999F6C5C2A7030430FBB2644A85D /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B7388B46AC95BDC5641A0B22BB0EE1C7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5C154FC66B0272E926E740EB0D5DDF3E /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 0780AE62F17E1B780D8C4170D5F2E768 /* Development Pods */ = { - isa = PBXGroup; - children = ( - 7B1D34DAF505473A064474B664D669E1 /* Apollo */, - ); - name = "Development Pods"; - sourceTree = ""; - }; - 0874F9F078F1BB1E246AE7183E7C233E /* Pods-ApolloTests */ = { - isa = PBXGroup; - children = ( - 1F4445F089281553CC23A453DBF203C7 /* Info.plist */, - 10FA3C1A5006EC52FC44C8EB07B5BDAE /* Pods-ApolloTests.modulemap */, - 8C1BB3B1629831A0860FA95DD624C9F4 /* Pods-ApolloTests-acknowledgements.markdown */, - B5A51A258D56CEEC8707C43B4CA66D57 /* Pods-ApolloTests-acknowledgements.plist */, - E12D36800035FA4AEBD5CCA0E467F5C2 /* Pods-ApolloTests-dummy.m */, - 58EA58A33C79BB0F400C14494D1142CC /* Pods-ApolloTests-frameworks.sh */, - CA1C6F1BBEC2162E2BA5E756F9B77A2C /* Pods-ApolloTests-resources.sh */, - A750E6B16B43489DE32A5211D58F9FBA /* Pods-ApolloTests-umbrella.h */, - 0AB6C025AC773267F2034B391653AEF6 /* Pods-ApolloTests.debug.xcconfig */, - 08674A30761B25CB7AE0CE4CFFBFF205 /* Pods-ApolloTests.release.xcconfig */, - ); - name = "Pods-ApolloTests"; - path = "Target Support Files/Pods-ApolloTests"; - sourceTree = ""; - }; - 0CE5F9160B067C829D364E72878D0583 /* Support Files */ = { - isa = PBXGroup; - children = ( - 1EC3C1E6C3B57B46326B94BAB568B649 /* Info.plist */, - 1D7DA9FB08FD2A913967F0D7996B8701 /* SQLite.swift.modulemap */, - 88BFCDC2C48A9AAC024D78C7786357F9 /* SQLite.swift.xcconfig */, - 2D30459F9DC30876AF6C299D26C7CE48 /* SQLite.swift-dummy.m */, - CA3ED8D54211455DE25A4DA036694445 /* SQLite.swift-prefix.pch */, - 27B2D491F0A9B062233011B873DC118C /* SQLite.swift-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/SQLite.swift"; - sourceTree = ""; - }; - 0E9CC0217CE03B66912982F024F7C64D /* Frameworks */ = { - isa = PBXGroup; - children = ( - DB44F0C85553660857F351B59660E399 /* SQLite.framework */, - 5465A1FD5BAF28162C40A82C117432A0 /* iOS */, - ); - name = Frameworks; - sourceTree = ""; - }; - 1402D1396693920C1E95678F7F963657 /* Resources */ = { - isa = PBXGroup; - children = ( - EF01E8B6E2C8E0469E9FAC20340D45B6 /* scripts */, - ); - name = Resources; - sourceTree = ""; - }; - 41EC9D1139C8584AC99C2D542C204E67 /* Pods-StarWarsAPI */ = { - isa = PBXGroup; - children = ( - 7AF34EB0D4F25CC4FBA1A60724BBC66A /* Info.plist */, - 949A295ACAD1338645F511B3B615304F /* Pods-StarWarsAPI.modulemap */, - E4C251316F1350DC62A6C4843F9E8DAC /* Pods-StarWarsAPI-acknowledgements.markdown */, - 6690FA900A959073D6602DDA8B9B96FC /* Pods-StarWarsAPI-acknowledgements.plist */, - 179109F8B259422432C0355515576040 /* Pods-StarWarsAPI-dummy.m */, - FF72FDA919EE62C2297D3C1EF8E50F18 /* Pods-StarWarsAPI-resources.sh */, - 03D7BFAC37C274E39C5162127AEB6199 /* Pods-StarWarsAPI-umbrella.h */, - 2DE423399B21C05322619DF24D280234 /* Pods-StarWarsAPI.debug.xcconfig */, - 724B09788D59362DE110F9760831B30B /* Pods-StarWarsAPI.release.xcconfig */, - ); - name = "Pods-StarWarsAPI"; - path = "Target Support Files/Pods-StarWarsAPI"; - sourceTree = ""; - }; - 42A565AFFAD6D5669C3E9A617B18206F /* Pods */ = { - isa = PBXGroup; - children = ( - 6BF538A5818A9423DCAFBA3FE993650B /* SQLite.swift */, - ); - name = Pods; - sourceTree = ""; - }; - 4868B91744C534B8C083BD3A8E33DF1C /* Pods-ApolloExample */ = { - isa = PBXGroup; - children = ( - C12EBB64588697C58EB83E3A1D147FA8 /* Info.plist */, - C1FDE43D56FD01FEC6EC0EC50C96A22D /* Pods-ApolloExample.modulemap */, - B9CA5768D35422C7387D78822AB2AA46 /* Pods-ApolloExample-acknowledgements.markdown */, - 904829AAE2B1DE6B6F2CE13CDD6EDE22 /* Pods-ApolloExample-acknowledgements.plist */, - 7FD2E12182B5FA8C0EC9565A13BB8D01 /* Pods-ApolloExample-dummy.m */, - 8AA0C69818598EB79B91BCA0BE698842 /* Pods-ApolloExample-frameworks.sh */, - FC7AB7465546FD30A69F21B534830CF6 /* Pods-ApolloExample-resources.sh */, - 3F2AA223F544DC4835618D4D4A2FAA05 /* Pods-ApolloExample-umbrella.h */, - 8378EF5103C93E048B7DF8B41415FF63 /* Pods-ApolloExample.debug.xcconfig */, - 9ADC492098AB1E55A5C9644F01624CA8 /* Pods-ApolloExample.release.xcconfig */, - ); - name = "Pods-ApolloExample"; - path = "Target Support Files/Pods-ApolloExample"; - sourceTree = ""; - }; - 5465A1FD5BAF28162C40A82C117432A0 /* iOS */ = { - isa = PBXGroup; - children = ( - CE010265104DFCB5F6118970E4A336F2 /* Foundation.framework */, - ); - name = iOS; - sourceTree = ""; - }; - 57421CFAE26C3DB80E02F120D406D70C /* Sources */ = { - isa = PBXGroup; - children = ( - 401F038C1A93F7D71496AEEA082C8187 /* ApolloClient.swift */, - 8037D537446EB8C0C0FC358AACDFBCDB /* ApolloStore.swift */, - 11877C4D6F494C575C9E88FA15AA98FA /* AsynchronousOperation.swift */, - 54AAF8298970F6D90491BF3D752ECFB6 /* Collections.swift */, - 9945BAB50B7F6365B802F25E004A2566 /* DataLoader.swift */, - 9601BDB184C7FA2886421EDA6BC51FE0 /* Dictionary+KeyPath.swift */, - 3CF244F5154EDAAAD43F2B551C5B1B34 /* GraphQLDependencyTracker.swift */, - BC7DBCA1F40B1DC0B762047428B9D510 /* GraphQLError.swift */, - 3934F1038706695A3609AADC734C098B /* GraphQLExecutor.swift */, - CCC1A0D34707B7C5AB1AC9821F092A5F /* GraphQLOperation.swift */, - CD979ED094ED16CE55D3AB05A872C77F /* GraphQLOutputType.swift */, - EFFEE6F4624C74CD2CA4DC90DA4760F4 /* GraphQLQueryWatcher.swift */, - CEF7E7502D3D6F1C9360B904243E76A1 /* GraphQLResponse.swift */, - E1DE0FBDF2EC85A9CB28E87D3016B69C /* GraphQLResponseGenerator.swift */, - B91E033EE4268436D667B4A0516DF63B /* GraphQLResult.swift */, - 71B233364D9628F60058A864201DEC5A /* GraphQLResultAccumulator.swift */, - 2211D04CA00FD182ADC495BC12C7E0FA /* GraphQLResultMapper.swift */, - 29444EF033FEC5301794AA3FF05E1255 /* GraphQLResultNormalizer.swift */, - 677F4603A01A5098CB5B4238A4B5E16D /* GraphQLValues.swift */, - F0E0E7DEA40266C91EEEF8DE80F9A821 /* HTTPNetworkTransport.swift */, - 2F18865B76F1771AD7CAF6C87A0B0A76 /* InMemoryNormalizedCache.swift */, - 7C463C83D40DC933D44D3FAFBB8D476E /* JSON.swift */, - C548175F116A5CF621194BC4BA3581C8 /* JSONSerializationFormat.swift */, - 951BEA39308FE598897A6798B562CDEA /* JSONStandardTypeConversions.swift */, - 953093E4245EE7B30DC3346C75ABDEDE /* Locking.swift */, - A42E64B88B3B4D17143C3055589082E2 /* NetworkTransport.swift */, - CD4F73A249897121C29746449E83681B /* NormalizedCache.swift */, - 1510979B9E8022F1675C9B31D38A561D /* Promise.swift */, - AF6D660C4C1C51D6932C1A19AD7991A9 /* Record.swift */, - ECF01E514190839B447A1DC628224BFD /* RecordSet.swift */, - AB48C810AC51836598FF53899021CAAA /* Result.swift */, - DAE831C7B824D4684E2AA58D8A0E547A /* Selections.swift */, - 815355E6475667E8ED041F3EC76D4880 /* Utilities.swift */, - ); - name = Sources; - path = Sources; - sourceTree = ""; - }; - 6BF538A5818A9423DCAFBA3FE993650B /* SQLite.swift */ = { - isa = PBXGroup; - children = ( - 6E4CDA0705C72EBBEAC4EAD992E1850C /* standard */, - 0CE5F9160B067C829D364E72878D0583 /* Support Files */, - ); - name = SQLite.swift; - path = SQLite.swift; - sourceTree = ""; - }; - 6E4CDA0705C72EBBEAC4EAD992E1850C /* standard */ = { - isa = PBXGroup; - children = ( - 23E934E5F923C9742E63347D5512C322 /* AggregateFunctions.swift */, - 680617B7B3999D016982CD479DADCCB0 /* Blob.swift */, - D7B7855DE178D22988512E88C68325BE /* Collation.swift */, - CCF813C6D3C0824E1BCFDACADE6109F5 /* Connection.swift */, - 60FAE93532FD5578A02AF3CC523A3408 /* CoreFunctions.swift */, - 348491EAD9C18B0EEB2E855815254774 /* CustomFunctions.swift */, - 44EE37E8BF436A90A9C40AD27A182DB2 /* Expression.swift */, - E667D63233F61B551F3B93AF184020E0 /* Foundation.swift */, - 5AE2EFBEFDE20C4DDD8B3398D8AE5AE8 /* fts3_tokenizer.h */, - B7A99896DB5D793228657B5F5EC525DA /* FTS4.swift */, - 4B4C8E0D8DB99B4482E2549FEAE620B8 /* FTS5.swift */, - A2C5D76BD109C46DEC526A712FC4A8BB /* Helpers.swift */, - BDA86AD441076D928D0621530CD5E745 /* Operators.swift */, - 3FCCE88ECC9D892349AB6CB3160246D9 /* Query.swift */, - 0F331ABE5223829EDFFC088184DFA981 /* RTree.swift */, - FF98B7BBADF63A0AF80D7829FA6F77B9 /* Schema.swift */, - DA7CCC1A073BC5540EA969CA71F0C552 /* Setter.swift */, - B88C5FD0C85A5AE4583CC7DB512E6820 /* SQLite.h */, - AF7F8DDFC50FE6ACA57F6A16E253F8DC /* SQLite-Bridging.h */, - 0E070D9E44393CD520D0B1AF87A6736D /* SQLite-Bridging.m */, - 96600A78FEC066BF8931D7A58FBF0F16 /* Statement.swift */, - 9DE06F129836BA95B0BE2222991D2BD0 /* Value.swift */, - ); - name = standard; - sourceTree = ""; - }; - 78447C38835AFAF2D4719B5693177D47 /* Core */ = { - isa = PBXGroup; - children = ( - 57421CFAE26C3DB80E02F120D406D70C /* Sources */, - ); - name = Core; - sourceTree = ""; - }; - 7B1D34DAF505473A064474B664D669E1 /* Apollo */ = { - isa = PBXGroup; - children = ( - 78447C38835AFAF2D4719B5693177D47 /* Core */, - 1402D1396693920C1E95678F7F963657 /* Resources */, - B13577B7FE56A385D1ED14BFBC6F77B1 /* SqliteNormalizedCache */, - BBE188F1CAF08BFC2744FE0C194B5E5F /* Support Files */, - ); - name = Apollo; - path = ../..; - sourceTree = ""; - }; - 7DB346D0F39D3F0E887471402A8071AB = { - isa = PBXGroup; - children = ( - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - 0780AE62F17E1B780D8C4170D5F2E768 /* Development Pods */, - 0E9CC0217CE03B66912982F024F7C64D /* Frameworks */, - 42A565AFFAD6D5669C3E9A617B18206F /* Pods */, - CADF8E7A438C737280A69D0E24D5BDDC /* Products */, - 8EA1531CEA4152F55BDDB1F0EEB2000C /* Targets Support Files */, - ); - sourceTree = ""; - }; - 8EA1531CEA4152F55BDDB1F0EEB2000C /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - 4868B91744C534B8C083BD3A8E33DF1C /* Pods-ApolloExample */, - D9F86A9E134D7F5AADC8F53E92C95EC4 /* Pods-ApolloPerformanceTests */, - 0874F9F078F1BB1E246AE7183E7C233E /* Pods-ApolloTests */, - 41EC9D1139C8584AC99C2D542C204E67 /* Pods-StarWarsAPI */, - ); - name = "Targets Support Files"; - sourceTree = ""; - }; - B13577B7FE56A385D1ED14BFBC6F77B1 /* SqliteNormalizedCache */ = { - isa = PBXGroup; - children = ( - C7998953974AB0B2D1633E310384F22B /* Sources */, - ); - name = SqliteNormalizedCache; - sourceTree = ""; - }; - BBE188F1CAF08BFC2744FE0C194B5E5F /* Support Files */ = { - isa = PBXGroup; - children = ( - 21E66D4ED8F6CC300DC7FE2F93A367A2 /* Apollo.modulemap */, - 391CA98836DC28B658B23EE172EA2DC5 /* Apollo.xcconfig */, - 42E5D07D44401421901F612C8D4837BC /* Apollo-dummy.m */, - 7491C42CA1F0D47FF353804EDFC308A7 /* Apollo-prefix.pch */, - 957927E0DFC5FB03E6CA1B87814A9E10 /* Apollo-umbrella.h */, - D9D01E19268F158CBD26569BCDA0CB2A /* Info.plist */, - ); - name = "Support Files"; - path = "Example/Pods/Target Support Files/Apollo"; - sourceTree = ""; - }; - C7998953974AB0B2D1633E310384F22B /* Sources */ = { - isa = PBXGroup; - children = ( - FCB4506966D17F3167DF2980953BEFE9 /* SqliteNormalizedCache */, - ); - name = Sources; - path = Sources; - sourceTree = ""; - }; - CADF8E7A438C737280A69D0E24D5BDDC /* Products */ = { - isa = PBXGroup; - children = ( - F4E94D9B3A51997F835199160D3A6204 /* Apollo.framework */, - 3FA13D59DC7D79809DCEF476848EAED0 /* Pods_ApolloExample.framework */, - C97E29747EDD103755CD3BBB58DB0042 /* Pods_ApolloPerformanceTests.framework */, - C08D4B7E051B2878FD9A1DB195944C60 /* Pods_ApolloTests.framework */, - 261B0C331D5E3A2F400B2EC0F77CC1F7 /* Pods_StarWarsAPI.framework */, - E4DDFDE7D66D82B6084F70FC8DE5F14D /* SQLite.framework */, - ); - name = Products; - sourceTree = ""; - }; - D9F86A9E134D7F5AADC8F53E92C95EC4 /* Pods-ApolloPerformanceTests */ = { - isa = PBXGroup; - children = ( - 7ED2D87037EC2D5F09173EE9E979C813 /* Info.plist */, - 550DCFFB3AF38FE48668B410DCC530D2 /* Pods-ApolloPerformanceTests.modulemap */, - 3D54BDE67F2AF934CA35178FCC1165EB /* Pods-ApolloPerformanceTests-acknowledgements.markdown */, - AC7E77DE5E2272297487C6FDD2A16513 /* Pods-ApolloPerformanceTests-acknowledgements.plist */, - E664068C762C5F1811AB06C5856E5BC7 /* Pods-ApolloPerformanceTests-dummy.m */, - 160F355101277829561FC9CDD0D3F16B /* Pods-ApolloPerformanceTests-frameworks.sh */, - 1AD67889E8665E2406E38CC279A50DB7 /* Pods-ApolloPerformanceTests-resources.sh */, - 975269A36A5CF422A22E5D5DA93EAB28 /* Pods-ApolloPerformanceTests-umbrella.h */, - 01C3FA9C5081FAF3B433C1CAC200835C /* Pods-ApolloPerformanceTests.debug.xcconfig */, - 3C7116256A907933BD6C8D01B5E5D592 /* Pods-ApolloPerformanceTests.release.xcconfig */, - ); - name = "Pods-ApolloPerformanceTests"; - path = "Target Support Files/Pods-ApolloPerformanceTests"; - sourceTree = ""; - }; - EF01E8B6E2C8E0469E9FAC20340D45B6 /* scripts */ = { - isa = PBXGroup; - children = ( - 3BEC86F0EAB93BCB8EA7A6615DBC98BE /* check-and-run-apollo-codegen.sh */, - ); - name = scripts; - path = scripts; - sourceTree = ""; - }; - FCB4506966D17F3167DF2980953BEFE9 /* SqliteNormalizedCache */ = { - isa = PBXGroup; - children = ( - E5055831E03BFDFD4C3C8D027419F425 /* SqliteNormalizedCache.swift */, - ); - name = SqliteNormalizedCache; - path = SqliteNormalizedCache; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 2B89A7BBD697C64467DB27C9A5547D2E /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 54050A3940A7AAF2A4166F6B4027F1D0 /* Pods-StarWarsAPI-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4308E4BFD6444A25DB264315A778DD8E /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 990D4881FF22A80867C475FB9823817A /* Pods-ApolloTests-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 89BE3ADE0C873396201A80EEBAE6C578 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 1105737F12067068DF24A2FD70FC93A3 /* Pods-ApolloPerformanceTests-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 909E810000654ADA0062A65395285656 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 1569991C9A095D1FCE6B235BD63B51A4 /* Apollo-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 915305A38C0D55178154A57AB4E7C52B /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 415B7E98D356AE4B47C6FD5D11E11C99 /* Pods-ApolloExample-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 99E8B3044AF71F8F23378FF7CDA8433F /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 11D8F132B7F8704E64825695F6B0DC91 /* fts3_tokenizer.h in Headers */, - AFC4EF684AAE208082F88A746E8799D5 /* SQLite-Bridging.h in Headers */, - 63D650CA310911FBCB77C3E6229330A7 /* SQLite.h in Headers */, - 49876A987CA44C386457D31880AE1BD6 /* SQLite.swift-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */ = { - isa = PBXNativeTarget; - buildConfigurationList = 378B6EF64B2163CD9697BCEB0CE2A4B8 /* Build configuration list for PBXNativeTarget "SQLite.swift" */; - buildPhases = ( - EBD29A96FAFC82C68899AA23CCF587C9 /* Sources */, - A669049662D8B3E8CE1621BA70630893 /* Frameworks */, - 99E8B3044AF71F8F23378FF7CDA8433F /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = SQLite.swift; - productName = SQLite.swift; - productReference = E4DDFDE7D66D82B6084F70FC8DE5F14D /* SQLite.framework */; - productType = "com.apple.product-type.framework"; - }; - 41E97655D961AA41E6A2722B6C746208 /* Pods-StarWarsAPI */ = { - isa = PBXNativeTarget; - buildConfigurationList = A27E3654494474C12D100B961BBFAA7D /* Build configuration list for PBXNativeTarget "Pods-StarWarsAPI" */; - buildPhases = ( - 8B249350AF7614C7053C62865A2328C3 /* Sources */, - 204A049E51246EBFC6025779873FE742 /* Frameworks */, - 2B89A7BBD697C64467DB27C9A5547D2E /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - 02965513AF2BF1C5C482907711613B42 /* PBXTargetDependency */, - D89E6E2F0F43C3D735FC872E160632B1 /* PBXTargetDependency */, - ); - name = "Pods-StarWarsAPI"; - productName = "Pods-StarWarsAPI"; - productReference = 261B0C331D5E3A2F400B2EC0F77CC1F7 /* Pods_StarWarsAPI.framework */; - productType = "com.apple.product-type.framework"; - }; - 57D6CAD9EA986DB7361786D32B260180 /* Pods-ApolloTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 9898252794B21AF5F18F17B2C932E6AF /* Build configuration list for PBXNativeTarget "Pods-ApolloTests" */; - buildPhases = ( - 6BDBF318396893A065A76333CF493B33 /* Sources */, - 79865417B1BFD4E495D7137ACF9240CB /* Frameworks */, - 4308E4BFD6444A25DB264315A778DD8E /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - 9A76605DF9334EC45AB370EB987BB906 /* PBXTargetDependency */, - 0F9D3875676717FCB29EDE23C548F181 /* PBXTargetDependency */, - ); - name = "Pods-ApolloTests"; - productName = "Pods-ApolloTests"; - productReference = C08D4B7E051B2878FD9A1DB195944C60 /* Pods_ApolloTests.framework */; - productType = "com.apple.product-type.framework"; - }; - 9FF47F905911618B121CF678C81FF44E /* Pods-ApolloPerformanceTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = B57D88FCAE5B541F13D51FC993902ECA /* Build configuration list for PBXNativeTarget "Pods-ApolloPerformanceTests" */; - buildPhases = ( - DE55A65AD35585F4D59CC7C2C1FB9035 /* Sources */, - 480A9FB08056754438E61097D5ADB3A7 /* Frameworks */, - 89BE3ADE0C873396201A80EEBAE6C578 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - C3D22173AE23354A536DC9691D8521AE /* PBXTargetDependency */, - 9D0A9CEED3B12F9EC0FEDF74AD13F20D /* PBXTargetDependency */, - ); - name = "Pods-ApolloPerformanceTests"; - productName = "Pods-ApolloPerformanceTests"; - productReference = C97E29747EDD103755CD3BBB58DB0042 /* Pods_ApolloPerformanceTests.framework */; - productType = "com.apple.product-type.framework"; - }; - C566155694F9D7502B8E41EDDAE53326 /* Apollo */ = { - isa = PBXNativeTarget; - buildConfigurationList = AD027D256E067255F75669BD2CA381EA /* Build configuration list for PBXNativeTarget "Apollo" */; - buildPhases = ( - B7A20D035D753A416B0A9530DF3004A8 /* Sources */, - 30AE83E2B9378413D12911D07B9342A1 /* Frameworks */, - 1F1AA2CC5E749120C23FC4B83C026F2A /* Resources */, - 909E810000654ADA0062A65395285656 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - 02B28FE1724BC6B743D6E5ECF3BF4774 /* PBXTargetDependency */, - ); - name = Apollo; - productName = Apollo; - productReference = F4E94D9B3A51997F835199160D3A6204 /* Apollo.framework */; - productType = "com.apple.product-type.framework"; - }; - CD971B48011CD3BD0356983083C8F0E0 /* Pods-ApolloExample */ = { - isa = PBXNativeTarget; - buildConfigurationList = C79EB8FDA380D31052FF2C49D1D80CD7 /* Build configuration list for PBXNativeTarget "Pods-ApolloExample" */; - buildPhases = ( - 6A929C77623DF34AFD30596C385E5395 /* Sources */, - B7388B46AC95BDC5641A0B22BB0EE1C7 /* Frameworks */, - 915305A38C0D55178154A57AB4E7C52B /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - EEEAD09294FC095B553735B1B97F0644 /* PBXTargetDependency */, - 7E8FAC92559ED7BB7F0BAD12225E305B /* PBXTargetDependency */, - ); - name = "Pods-ApolloExample"; - productName = "Pods-ApolloExample"; - productReference = 3FA13D59DC7D79809DCEF476848EAED0 /* Pods_ApolloExample.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0700; - }; - buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = CADF8E7A438C737280A69D0E24D5BDDC /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - C566155694F9D7502B8E41EDDAE53326 /* Apollo */, - CD971B48011CD3BD0356983083C8F0E0 /* Pods-ApolloExample */, - 9FF47F905911618B121CF678C81FF44E /* Pods-ApolloPerformanceTests */, - 57D6CAD9EA986DB7361786D32B260180 /* Pods-ApolloTests */, - 41E97655D961AA41E6A2722B6C746208 /* Pods-StarWarsAPI */, - 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1F1AA2CC5E749120C23FC4B83C026F2A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 6FCDA3222BB1A7CADC500C19CA4A6611 /* check-and-run-apollo-codegen.sh in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 6A929C77623DF34AFD30596C385E5395 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 636C2473106673D1432A22A0B7D6A2C9 /* Pods-ApolloExample-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6BDBF318396893A065A76333CF493B33 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 94C4501EC15533C68551FCFD9896339D /* Pods-ApolloTests-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8B249350AF7614C7053C62865A2328C3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3046B5C2E5FFE5A008023E939500A575 /* Pods-StarWarsAPI-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B7A20D035D753A416B0A9530DF3004A8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - D99283BAF5F146D362611679A5ED1A5D /* Apollo-dummy.m in Sources */, - 54CFD21E9012A2554410D08EF63E42CB /* ApolloClient.swift in Sources */, - AC87CC13FC22BD408AA235121C216C85 /* ApolloStore.swift in Sources */, - 2C64BE3142AB8955A8F1B7ED8C4AC1FD /* AsynchronousOperation.swift in Sources */, - 2664C21FA05281B3AEC72F71EA44028A /* Collections.swift in Sources */, - A54DF0B95FE0DAD23D2A81D408683D03 /* DataLoader.swift in Sources */, - 7FF4749CC9A33C7B79FE51E0962A4E8A /* Dictionary+KeyPath.swift in Sources */, - BA32663AD51B09E7997DD5871D7FE383 /* GraphQLDependencyTracker.swift in Sources */, - E13D7AA4EFBA1345BDC2E05B4BD67F2A /* GraphQLError.swift in Sources */, - 8916D47EB3F95315F2020922A6130D8D /* GraphQLExecutor.swift in Sources */, - B948E00EC8119CFD8B9E55DBBDA5A4E3 /* GraphQLOperation.swift in Sources */, - EEA27311E6D18D94F27E12D2F0BE7BF0 /* GraphQLOutputType.swift in Sources */, - 8D2A9E5942209EC7EAE309C3BDEC344E /* GraphQLQueryWatcher.swift in Sources */, - 24401D6F94D534811685D1F542F93892 /* GraphQLResponse.swift in Sources */, - FF53DDD16D8FC3431D3F148AC7FD56CD /* GraphQLResponseGenerator.swift in Sources */, - 6C5A957F0E47791FFA662827ADBA67A9 /* GraphQLResult.swift in Sources */, - F0EF5885BD48A9B939F3FF9C1DC1A965 /* GraphQLResultAccumulator.swift in Sources */, - EB775615489CE36C2D86C4EB279F3FF5 /* GraphQLResultMapper.swift in Sources */, - 3EEC07CDEFE2204C5CFC1E1B10B6537F /* GraphQLResultNormalizer.swift in Sources */, - E2D3B028353BC0FA74DA8536C717B9E4 /* GraphQLValues.swift in Sources */, - 787BB17CD95328B14A766F6BC04D2148 /* HTTPNetworkTransport.swift in Sources */, - DA0CEB1E0989DCA89796ABDF7267A7B0 /* InMemoryNormalizedCache.swift in Sources */, - B8354678757BF7E72C8E638F8FD096ED /* JSON.swift in Sources */, - 3D85E3F5AB73653A962BCF09ED74A8C0 /* JSONSerializationFormat.swift in Sources */, - F86D649610E4878DE71D25AA9CC614A2 /* JSONStandardTypeConversions.swift in Sources */, - 47B4F5C1BFB40746F552A6D5CE482DC3 /* Locking.swift in Sources */, - 4DCCD02DB715AC161B0774E0C137353E /* NetworkTransport.swift in Sources */, - 853B5034825B85498FE7857957760849 /* NormalizedCache.swift in Sources */, - 77E05C7059DFD498C2B323C3A707C0E8 /* Promise.swift in Sources */, - 20C306F7AA685281AAEADDEF70FE27B4 /* Record.swift in Sources */, - F4DAAE8A4DF58A14A2B8A6272ED102C7 /* RecordSet.swift in Sources */, - 6CC6B8EEDAA285718533CC1482D13B61 /* Result.swift in Sources */, - 6F378D7233AC3E51B00DB180BF8D6066 /* Selections.swift in Sources */, - 01CD0AAF59D458AC3EF2601332DC362C /* SqliteNormalizedCache.swift in Sources */, - 2650B6BD41F1BDFF5A15F9C4C8E61A37 /* Utilities.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DE55A65AD35585F4D59CC7C2C1FB9035 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2232C53C6D807D0DA97BBB9E4523412C /* Pods-ApolloPerformanceTests-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EBD29A96FAFC82C68899AA23CCF587C9 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 35E5EEDB90225D140DCA57800CD5A2CD /* AggregateFunctions.swift in Sources */, - C02AE58DC3E78ACB817163011C7A6734 /* Blob.swift in Sources */, - A11B9C4B8DC4AF252BA2727D21A1EEF1 /* Collation.swift in Sources */, - D850BB2A3E7B9A6AAEB54FA9A8B7AD4F /* Connection.swift in Sources */, - 15E73F1CED9B85C8E03C6134581D2ED0 /* CoreFunctions.swift in Sources */, - 42F81544370E1853391B67D56656A0C3 /* CustomFunctions.swift in Sources */, - 30382E91D15E7ED4E930564DE86EAF27 /* Expression.swift in Sources */, - A3FF4B5B363E91C3BE7FC3294C555032 /* Foundation.swift in Sources */, - DD139C21BC1B51C5078B8F9C2F55D0A3 /* FTS4.swift in Sources */, - 3EB8845BB3EB8B7E031BCA86CEC2F0D2 /* FTS5.swift in Sources */, - FDA57D0DA6CBE5083CAF08A8B2F86AC9 /* Helpers.swift in Sources */, - AB1840F1E49F6C17A8A12662445629C3 /* Operators.swift in Sources */, - 4FFB64EBCE34E07A60C74F1957B34A7B /* Query.swift in Sources */, - 4A23CC3D6A3579C9F12AE00384A7A4F3 /* RTree.swift in Sources */, - 108A1CBD5D0C9FC34DD2B5C2B8DD0E1F /* Schema.swift in Sources */, - 6263A24701DED2E7A447C0313C7C555D /* Setter.swift in Sources */, - 47628EC1F1DDCC60DF83EA01A277919E /* SQLite-Bridging.m in Sources */, - B27809FB8835D7719B0AD7337D908431 /* SQLite.swift-dummy.m in Sources */, - 94ECE937BFDFCDBD700A107B1DC40CA9 /* Statement.swift in Sources */, - 87109E7659BAF278C52455C1D6529DF6 /* Value.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 02965513AF2BF1C5C482907711613B42 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Apollo; - target = C566155694F9D7502B8E41EDDAE53326 /* Apollo */; - targetProxy = C00427F48EF37BFBCADF82EB7092C653 /* PBXContainerItemProxy */; - }; - 02B28FE1724BC6B743D6E5ECF3BF4774 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SQLite.swift; - target = 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */; - targetProxy = DA3A67213BA0213D69558FE47052F8CB /* PBXContainerItemProxy */; - }; - 0F9D3875676717FCB29EDE23C548F181 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SQLite.swift; - target = 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */; - targetProxy = 26821ADABDEB80E0955C6A95F66727F0 /* PBXContainerItemProxy */; - }; - 7E8FAC92559ED7BB7F0BAD12225E305B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SQLite.swift; - target = 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */; - targetProxy = 46F1F23422897FFFE9D31496B6CFD03F /* PBXContainerItemProxy */; - }; - 9A76605DF9334EC45AB370EB987BB906 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Apollo; - target = C566155694F9D7502B8E41EDDAE53326 /* Apollo */; - targetProxy = F08278AA3683BE91FA7DC6EDE8AAA38A /* PBXContainerItemProxy */; - }; - 9D0A9CEED3B12F9EC0FEDF74AD13F20D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SQLite.swift; - target = 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */; - targetProxy = 3A80F75EB77EED46D454A98123AB9CE5 /* PBXContainerItemProxy */; - }; - C3D22173AE23354A536DC9691D8521AE /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Apollo; - target = C566155694F9D7502B8E41EDDAE53326 /* Apollo */; - targetProxy = 1F9242C10DCAAE891388E785556234B8 /* PBXContainerItemProxy */; - }; - D89E6E2F0F43C3D735FC872E160632B1 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SQLite.swift; - target = 19C23DAC4474B6CD13A5110683532E69 /* SQLite.swift */; - targetProxy = 64E5D955EF55FA4B878F3A32D0658ADE /* PBXContainerItemProxy */; - }; - EEEAD09294FC095B553735B1B97F0644 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Apollo; - target = C566155694F9D7502B8E41EDDAE53326 /* Apollo */; - targetProxy = 6EC485A2374F1AB1F5F33127C6257458 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 015A368F878AC3E2CEAE21DDE8026304 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = NO; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - ONLY_ACTIVE_ARCH = YES; - PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; - STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Debug; - }; - 14A701696AB64646C10DAB0A691FD4B7 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 724B09788D59362DE110F9760831B30B /* Pods-StarWarsAPI.release.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-StarWarsAPI/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_StarWarsAPI; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 27E7E6A7297EC998C4737A039EC23FF3 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 88BFCDC2C48A9AAC024D78C7786357F9 /* SQLite.swift.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/SQLite.swift/SQLite.swift-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SQLite.swift/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/SQLite.swift/SQLite.swift.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = SQLite; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 34136DCAA08D39CFEB43D3BAD2155601 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 08674A30761B25CB7AE0CE4CFFBFF205 /* Pods-ApolloTests.release.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ApolloTests/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ApolloTests; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 3CC4C36F5289303C10A5C17CB8A89697 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3C7116256A907933BD6C8D01B5E5D592 /* Pods-ApolloPerformanceTests.release.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ApolloPerformanceTests/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ApolloPerformanceTests; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 44CDBB6D11DE06DB64D6268622BDC47E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; - STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "${SRCROOT}/../build"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 50122EDA2FE520893A88613D785EFA46 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2DE423399B21C05322619DF24D280234 /* Pods-StarWarsAPI.debug.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-StarWarsAPI/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_StarWarsAPI; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 71A4E2F2604F856EAC9B9985B601B947 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8378EF5103C93E048B7DF8B41415FF63 /* Pods-ApolloExample.debug.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ApolloExample/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ApolloExample/Pods-ApolloExample.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ApolloExample; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 71E51F2CAE81759CF7FE4B052BF17D18 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0AB6C025AC773267F2034B391653AEF6 /* Pods-ApolloTests.debug.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ApolloTests/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ApolloTests; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 7335027149CBC3B39EA4F93477DB2441 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9ADC492098AB1E55A5C9644F01624CA8 /* Pods-ApolloExample.release.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ApolloExample/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ApolloExample/Pods-ApolloExample.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ApolloExample; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 87263DFDFB0D861CCF5C75BB6BFB2308 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 01C3FA9C5081FAF3B433C1CAC200835C /* Pods-ApolloPerformanceTests.debug.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-ApolloPerformanceTests/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_ApolloPerformanceTests; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - BF59425203BD23DBB85AF465D9BB20B7 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 391CA98836DC28B658B23EE172EA2DC5 /* Apollo.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Apollo/Apollo-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Apollo/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Apollo/Apollo.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = Apollo; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - D72042F45DC3C77B677875802D08ECDF /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 391CA98836DC28B658B23EE172EA2DC5 /* Apollo.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Apollo/Apollo-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Apollo/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Apollo/Apollo.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Apollo; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - DDA3B0206874483E8FCDB2CBC4593700 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 88BFCDC2C48A9AAC024D78C7786357F9 /* SQLite.swift.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/SQLite.swift/SQLite.swift-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SQLite.swift/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/SQLite.swift/SQLite.swift.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = SQLite; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 015A368F878AC3E2CEAE21DDE8026304 /* Debug */, - 44CDBB6D11DE06DB64D6268622BDC47E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 378B6EF64B2163CD9697BCEB0CE2A4B8 /* Build configuration list for PBXNativeTarget "SQLite.swift" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DDA3B0206874483E8FCDB2CBC4593700 /* Debug */, - 27E7E6A7297EC998C4737A039EC23FF3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 9898252794B21AF5F18F17B2C932E6AF /* Build configuration list for PBXNativeTarget "Pods-ApolloTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 71E51F2CAE81759CF7FE4B052BF17D18 /* Debug */, - 34136DCAA08D39CFEB43D3BAD2155601 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - A27E3654494474C12D100B961BBFAA7D /* Build configuration list for PBXNativeTarget "Pods-StarWarsAPI" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 50122EDA2FE520893A88613D785EFA46 /* Debug */, - 14A701696AB64646C10DAB0A691FD4B7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - AD027D256E067255F75669BD2CA381EA /* Build configuration list for PBXNativeTarget "Apollo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BF59425203BD23DBB85AF465D9BB20B7 /* Debug */, - D72042F45DC3C77B677875802D08ECDF /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - B57D88FCAE5B541F13D51FC993902ECA /* Build configuration list for PBXNativeTarget "Pods-ApolloPerformanceTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 87263DFDFB0D861CCF5C75BB6BFB2308 /* Debug */, - 3CC4C36F5289303C10A5C17CB8A89697 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C79EB8FDA380D31052FF2C49D1D80CD7 /* Build configuration list for PBXNativeTarget "Pods-ApolloExample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 71A4E2F2604F856EAC9B9985B601B947 /* Debug */, - 7335027149CBC3B39EA4F93477DB2441 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; -} diff --git a/Example/Pods/SQLite.swift/CocoaPods/appletvos/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/appletvos/module.modulemap deleted file mode 100644 index 637d993582..0000000000 --- a/Example/Pods/SQLite.swift/CocoaPods/appletvos/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Example/Pods/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap deleted file mode 100644 index f8b9b671a7..0000000000 --- a/Example/Pods/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Example/Pods/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap deleted file mode 100644 index 67a6c20309..0000000000 --- a/Example/Pods/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Example/Pods/SQLite.swift/CocoaPods/iphoneos/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/iphoneos/module.modulemap deleted file mode 100644 index 043db6c484..0000000000 --- a/Example/Pods/SQLite.swift/CocoaPods/iphoneos/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Example/Pods/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap deleted file mode 100644 index c8b84ab8f4..0000000000 --- a/Example/Pods/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.0.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Example/Pods/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap deleted file mode 100644 index a7b14cbb48..0000000000 --- a/Example/Pods/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Example/Pods/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap deleted file mode 100644 index 9e0912979d..0000000000 --- a/Example/Pods/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Example/Pods/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap deleted file mode 100644 index 8fc958e676..0000000000 --- a/Example/Pods/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Example/Pods/SQLite.swift/CocoaPods/macosx/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/macosx/module.modulemap deleted file mode 100644 index cc8370ec56..0000000000 --- a/Example/Pods/SQLite.swift/CocoaPods/macosx/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Example/Pods/SQLite.swift/CocoaPods/watchos/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/watchos/module.modulemap deleted file mode 100644 index 62a6c4eef0..0000000000 --- a/Example/Pods/SQLite.swift/CocoaPods/watchos/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Example/Pods/SQLite.swift/CocoaPods/watchsimulator/module.modulemap b/Example/Pods/SQLite.swift/CocoaPods/watchsimulator/module.modulemap deleted file mode 100644 index 086fbab2de..0000000000 --- a/Example/Pods/SQLite.swift/CocoaPods/watchsimulator/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Example/Pods/SQLite.swift/LICENSE.txt b/Example/Pods/SQLite.swift/LICENSE.txt deleted file mode 100644 index 13303c1135..0000000000 --- a/Example/Pods/SQLite.swift/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -(The MIT License) - -Copyright (c) 2014-2015 Stephen Celis () - -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. diff --git a/Example/Pods/SQLite.swift/README.md b/Example/Pods/SQLite.swift/README.md deleted file mode 100644 index 89917b36b3..0000000000 --- a/Example/Pods/SQLite.swift/README.md +++ /dev/null @@ -1,263 +0,0 @@ -# SQLite.swift - -[![Build Status][Badge]][Travis] [![CocoaPods Version](https://cocoapod-badges.herokuapp.com/v/SQLite.swift/badge.png)](http://cocoadocs.org/docsets/SQLite.swift) [![Swift](https://img.shields.io/badge/swift-3-orange.svg?style=flat)](https://developer.apple.com/swift/) [![Platform](https://cocoapod-badges.herokuapp.com/p/SQLite.swift/badge.png)](http://cocoadocs.org/docsets/SQLite.swift) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Join the chat at https://gitter.im/stephencelis/SQLite.swift](https://badges.gitter.im/stephencelis/SQLite.swift.svg)](https://gitter.im/stephencelis/SQLite.swift) - -A type-safe, [Swift][]-language layer over [SQLite3][]. - -[SQLite.swift][] provides compile-time confidence in SQL statement -syntax _and_ intent. - -[Badge]: https://img.shields.io/travis/stephencelis/SQLite.swift/master.svg?style=flat -[Travis]: https://travis-ci.org/stephencelis/SQLite.swift -[Swift]: https://developer.apple.com/swift/ -[SQLite3]: http://www.sqlite.org -[SQLite.swift]: https://github.com/stephencelis/SQLite.swift - - -## Features - - - A pure-Swift interface - - A type-safe, optional-aware SQL expression builder - - A flexible, chainable, lazy-executing query layer - - Automatically-typed data access - - A lightweight, uncomplicated query and parameter binding interface - - Developer-friendly error handling and debugging - - [Full-text search][] support - - [Well-documented][See Documentation] - - Extensively tested - - SQLCipher support via CocoaPods - - Active support at [StackOverflow](http://stackoverflow.com/questions/tagged/sqlite.swift), and [Gitter Chat Room](https://gitter.im/stephencelis/SQLite.swift) (_experimental_) - -[Full-text search]: Documentation/Index.md#full-text-search -[See Documentation]: Documentation/Index.md#sqliteswift-documentation - - -## Usage - -``` swift -import SQLite - -let db = try Connection("path/to/db.sqlite3") - -let users = Table("users") -let id = Expression("id") -let name = Expression("name") -let email = Expression("email") - -try db.run(users.create { t in - t.column(id, primaryKey: true) - t.column(name) - t.column(email, unique: true) -}) -// CREATE TABLE "users" ( -// "id" INTEGER PRIMARY KEY NOT NULL, -// "name" TEXT, -// "email" TEXT NOT NULL UNIQUE -// ) - -let insert = users.insert(name <- "Alice", email <- "alice@mac.com") -let rowid = try db.run(insert) -// INSERT INTO "users" ("name", "email") VALUES ('Alice', 'alice@mac.com') - -for user in try db.prepare(users) { - print("id: \(user[id]), name: \(user[name]), email: \(user[email])") - // id: 1, name: Optional("Alice"), email: alice@mac.com -} -// SELECT * FROM "users" - -let alice = users.filter(id == rowid) - -try db.run(alice.update(email <- email.replace("mac.com", with: "me.com"))) -// UPDATE "users" SET "email" = replace("email", 'mac.com', 'me.com') -// WHERE ("id" = 1) - -try db.run(alice.delete()) -// DELETE FROM "users" WHERE ("id" = 1) - -db.scalar(users.count) // 0 -// SELECT count(*) FROM "users" -``` - -SQLite.swift also works as a lightweight, Swift-friendly wrapper over the C -API. - -``` swift -let stmt = try db.prepare("INSERT INTO users (email) VALUES (?)") -for email in ["betty@icloud.com", "cathy@icloud.com"] { - try stmt.run(email) -} - -db.totalChanges // 3 -db.changes // 1 -db.lastInsertRowid // 3 - -for row in try db.prepare("SELECT id, email FROM users") { - print("id: \(row[0]), email: \(row[1])") - // id: Optional(2), email: Optional("betty@icloud.com") - // id: Optional(3), email: Optional("cathy@icloud.com") -} - -db.scalar("SELECT count(*) FROM users") // 2 -``` - -[Read the documentation][See Documentation] or explore more, -interactively, from the Xcode project’s playground. - -![SQLite.playground Screen Shot](Documentation/Resources/playground@2x.png) - -For a more comprehensive example, see [this article](http://masteringswift.blogspot.com/2015/09/create-data-access-layer-with.html) and the [companion repository](https://github.com/hoffmanjon/SQLiteDataAccessLayer2/tree/master). - -## Installation - -> _Note:_ SQLite.swift requires Swift 3 (and [Xcode][] 8) or greater. If you absolutely -> need compatibility with Swift 2.3 you can use the [swift-2.3][] branch or older -> released versions. New development will happen exclusively on the master/Swift 3 branch. - -### Carthage - -[Carthage][] is a simple, decentralized dependency manager for Cocoa. To -install SQLite.swift with Carthage: - - 1. Make sure Carthage is [installed][Carthage Installation]. - - 2. Update your Cartfile to include the following: - - ``` - github "stephencelis/SQLite.swift" ~> 0.11.2 - ``` - - 3. Run `carthage update` and [add the appropriate framework][Carthage Usage]. - - -[Carthage]: https://github.com/Carthage/Carthage -[Carthage Installation]: https://github.com/Carthage/Carthage#installing-carthage -[Carthage Usage]: https://github.com/Carthage/Carthage#adding-frameworks-to-an-application - - -### CocoaPods - -[CocoaPods][] is a dependency manager for Cocoa projects. To install -SQLite.swift with CocoaPods: - - 1. Verify that your copy of Xcode is installed and active in the default location (`/Applications/Xcode.app`). - - ```sh - sudo xcode-select --switch /Applications/Xcode.app - ``` - - 2. Make sure CocoaPods is [installed][CocoaPods Installation]. (SQLite.swift requires version 1.0.0 or greater.) - - ``` sh - # Using the default Ruby install will require you to use sudo when - # installing and updating gems. - [sudo] gem install cocoapods - ``` - - 3. Update your Podfile to include the following: - - ``` ruby - use_frameworks! - - target 'YourAppTargetName' do - pod 'SQLite.swift', '~> 0.11.2' - end - ``` - - 4. Run `pod install --repo-update`. - -[CocoaPods]: https://cocoapods.org -[CocoaPods Installation]: https://guides.cocoapods.org/using/getting-started.html#getting-started - -### Swift Package Manager - -The [Swift Package Manager][] is a tool for managing the distribution of Swift code. - -1. Add the following to your `Package.swift` file: - -```swift -dependencies: [ - .Package(url: "https://github.com/stephencelis/SQLite.swift.git", majorVersion: 0, minor: 11) -] -``` - -[Swift Package Manager]: https://swift.org/package-manager - -### Manual - -To install SQLite.swift as an Xcode sub-project: - - 1. Drag the **SQLite.xcodeproj** file into your own project. - ([Submodule][], clone, or [download][] the project first.) - - ![Installation Screen Shot](Documentation/Resources/installation@2x.png) - - 2. In your target’s **General** tab, click the **+** button under **Linked - Frameworks and Libraries**. - - 3. Select the appropriate **SQLite.framework** for your platform. - - 4. **Add**. - -Some additional steps are required to install the application on an actual device: - - 5. In the **General** tab, click the **+** button under **Embedded Binaries**. - - 6. Select the appropriate **SQLite.framework** for your platform. - - 7. **Add**. - - -[Xcode]: https://developer.apple.com/xcode/downloads/ -[Submodule]: http://git-scm.com/book/en/Git-Tools-Submodules -[download]: https://github.com/stephencelis/SQLite.swift/archive/master.zip - - -## Communication - -[See the planning document] for a roadmap and existing feature requests. - -[Read the contributing guidelines][]. The _TL;DR_ (but please; _R_): - - - Need **help** or have a **general question**? [Ask on Stack - Overflow][] (tag `sqlite.swift`). - - Found a **bug** or have a **feature request**? [Open an issue][]. - - Want to **contribute**? [Submit a pull request][]. - -[See the planning document]: /Documentation/Planning.md -[Read the contributing guidelines]: ./CONTRIBUTING.md#contributing -[Ask on Stack Overflow]: http://stackoverflow.com/questions/tagged/sqlite.swift -[Open an issue]: https://github.com/stephencelis/SQLite.swift/issues/new -[Submit a pull request]: https://github.com/stephencelis/SQLite.swift/fork - - -## Author - - - [Stephen Celis](mailto:stephen@stephencelis.com) - ([@stephencelis](https://twitter.com/stephencelis)) - - -## License - -SQLite.swift is available under the MIT license. See [the LICENSE -file](./LICENSE.txt) for more information. - -## Related - -These projects enhance or use SQLite.swift: - - - [SQLiteMigrationManager.swift](https://github.com/garriguv/SQLiteMigrationManager.swift) (inspired by [FMDBMigrationManager](https://github.com/layerhq/FMDBMigrationManager)) - - -## Alternatives - -Looking for something else? Try another Swift wrapper (or [FMDB][]): - - - [Camembert](https://github.com/remirobert/Camembert) - - [GRDB](https://github.com/groue/GRDB.swift) - - [SQLiteDB](https://github.com/FahimF/SQLiteDB) - - [Squeal](https://github.com/nerdyc/Squeal) - - [SwiftData](https://github.com/ryanfowler/SwiftData) - - [SwiftSQLite](https://github.com/chrismsimpson/SwiftSQLite) - -[FMDB]: https://github.com/ccgus/fmdb -[swift-2.3]: https://github.com/stephencelis/SQLite.swift/tree/swift-2.3 diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Core/Blob.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Core/Blob.swift deleted file mode 100644 index 2f5d2a14f4..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Core/Blob.swift +++ /dev/null @@ -1,60 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -public struct Blob { - - public let bytes: [UInt8] - - public init(bytes: [UInt8]) { - self.bytes = bytes - } - - public init(bytes: UnsafeRawPointer, length: Int) { - let i8bufptr = UnsafeBufferPointer(start: bytes.assumingMemoryBound(to: UInt8.self), count: length) - self.init(bytes: [UInt8](i8bufptr)) - } - - public func toHex() -> String { - return bytes.map { - ($0 < 16 ? "0" : "") + String($0, radix: 16, uppercase: false) - }.joined(separator: "") - } - -} - -extension Blob : CustomStringConvertible { - - public var description: String { - return "x'\(toHex())'" - } - -} - -extension Blob : Equatable { - -} - -public func ==(lhs: Blob, rhs: Blob) -> Bool { - return lhs.bytes == rhs.bytes -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Core/Connection.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Core/Connection.swift deleted file mode 100644 index 0661175664..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Core/Connection.swift +++ /dev/null @@ -1,756 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -import Foundation.NSUUID -import Dispatch -#if SQLITE_SWIFT_STANDALONE -import sqlite3 -#elseif SQLITE_SWIFT_SQLCIPHER -import SQLCipher -#else -import CSQLite -#endif - -/// A connection to SQLite. -public final class Connection { - - /// The location of a SQLite database. - public enum Location { - - /// An in-memory database (equivalent to `.URI(":memory:")`). - /// - /// See: - case inMemory - - /// A temporary, file-backed database (equivalent to `.URI("")`). - /// - /// See: - case temporary - - /// A database located at the given URI filename (or path). - /// - /// See: - /// - /// - Parameter filename: A URI filename - case uri(String) - } - - /// An SQL operation passed to update callbacks. - public enum Operation { - - /// An INSERT operation. - case insert - - /// An UPDATE operation. - case update - - /// A DELETE operation. - case delete - - fileprivate init(rawValue:Int32) { - switch rawValue { - case SQLITE_INSERT: - self = .insert - case SQLITE_UPDATE: - self = .update - case SQLITE_DELETE: - self = .delete - default: - fatalError("unhandled operation code: \(rawValue)") - } - } - } - - public var handle: OpaquePointer { return _handle! } - - fileprivate var _handle: OpaquePointer? = nil - - /// Initializes a new SQLite connection. - /// - /// - Parameters: - /// - /// - location: The location of the database. Creates a new database if it - /// doesn’t already exist (unless in read-only mode). - /// - /// Default: `.InMemory`. - /// - /// - readonly: Whether or not to open the database in a read-only state. - /// - /// Default: `false`. - /// - /// - Returns: A new database connection. - public init(_ location: Location = .inMemory, readonly: Bool = false) throws { - let flags = readonly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE - try check(sqlite3_open_v2(location.description, &_handle, flags | SQLITE_OPEN_FULLMUTEX, nil)) - queue.setSpecific(key: Connection.queueKey, value: queueContext) - } - - /// Initializes a new connection to a database. - /// - /// - Parameters: - /// - /// - filename: The location of the database. Creates a new database if - /// it doesn’t already exist (unless in read-only mode). - /// - /// - readonly: Whether or not to open the database in a read-only state. - /// - /// Default: `false`. - /// - /// - Throws: `Result.Error` iff a connection cannot be established. - /// - /// - Returns: A new database connection. - public convenience init(_ filename: String, readonly: Bool = false) throws { - try self.init(.uri(filename), readonly: readonly) - } - - deinit { - sqlite3_close(handle) - } - - // MARK: - - - /// Whether or not the database was opened in a read-only state. - public var readonly: Bool { return sqlite3_db_readonly(handle, nil) == 1 } - - /// The last rowid inserted into the database via this connection. - public var lastInsertRowid: Int64 { - return sqlite3_last_insert_rowid(handle) - } - - /// The last number of changes (inserts, updates, or deletes) made to the - /// database via this connection. - public var changes: Int { - return Int(sqlite3_changes(handle)) - } - - /// The total number of changes (inserts, updates, or deletes) made to the - /// database via this connection. - public var totalChanges: Int { - return Int(sqlite3_total_changes(handle)) - } - - // MARK: - Execute - - /// Executes a batch of SQL statements. - /// - /// - Parameter SQL: A batch of zero or more semicolon-separated SQL - /// statements. - /// - /// - Throws: `Result.Error` if query execution fails. - public func execute(_ SQL: String) throws { - _ = try sync { try self.check(sqlite3_exec(self.handle, SQL, nil, nil, nil)) } - } - - // MARK: - Prepare - - /// Prepares a single SQL statement (with optional parameter bindings). - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A list of parameters to bind to the statement. - /// - /// - Returns: A prepared statement. - public func prepare(_ statement: String, _ bindings: Binding?...) throws -> Statement { - if !bindings.isEmpty { return try prepare(statement, bindings) } - return try Statement(self, statement) - } - - /// Prepares a single SQL statement and binds parameters to it. - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A list of parameters to bind to the statement. - /// - /// - Returns: A prepared statement. - public func prepare(_ statement: String, _ bindings: [Binding?]) throws -> Statement { - return try prepare(statement).bind(bindings) - } - - /// Prepares a single SQL statement and binds parameters to it. - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A dictionary of named parameters to bind to the statement. - /// - /// - Returns: A prepared statement. - public func prepare(_ statement: String, _ bindings: [String: Binding?]) throws -> Statement { - return try prepare(statement).bind(bindings) - } - - // MARK: - Run - - /// Runs a single SQL statement (with optional parameter bindings). - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A list of parameters to bind to the statement. - /// - /// - Throws: `Result.Error` if query execution fails. - /// - /// - Returns: The statement. - @discardableResult public func run(_ statement: String, _ bindings: Binding?...) throws -> Statement { - return try run(statement, bindings) - } - - /// Prepares, binds, and runs a single SQL statement. - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A list of parameters to bind to the statement. - /// - /// - Throws: `Result.Error` if query execution fails. - /// - /// - Returns: The statement. - @discardableResult public func run(_ statement: String, _ bindings: [Binding?]) throws -> Statement { - return try prepare(statement).run(bindings) - } - - /// Prepares, binds, and runs a single SQL statement. - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A dictionary of named parameters to bind to the statement. - /// - /// - Throws: `Result.Error` if query execution fails. - /// - /// - Returns: The statement. - @discardableResult public func run(_ statement: String, _ bindings: [String: Binding?]) throws -> Statement { - return try prepare(statement).run(bindings) - } - - // MARK: - Scalar - - /// Runs a single SQL statement (with optional parameter bindings), - /// returning the first value of the first row. - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A list of parameters to bind to the statement. - /// - /// - Returns: The first value of the first row returned. - public func scalar(_ statement: String, _ bindings: Binding?...) throws -> Binding? { - return try scalar(statement, bindings) - } - - /// Runs a single SQL statement (with optional parameter bindings), - /// returning the first value of the first row. - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A list of parameters to bind to the statement. - /// - /// - Returns: The first value of the first row returned. - public func scalar(_ statement: String, _ bindings: [Binding?]) throws -> Binding? { - return try prepare(statement).scalar(bindings) - } - - /// Runs a single SQL statement (with optional parameter bindings), - /// returning the first value of the first row. - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A dictionary of named parameters to bind to the statement. - /// - /// - Returns: The first value of the first row returned. - public func scalar(_ statement: String, _ bindings: [String: Binding?]) throws -> Binding? { - return try prepare(statement).scalar(bindings) - } - - // MARK: - Transactions - - /// The mode in which a transaction acquires a lock. - public enum TransactionMode : String { - - /// Defers locking the database till the first read/write executes. - case deferred = "DEFERRED" - - /// Immediately acquires a reserved lock on the database. - case immediate = "IMMEDIATE" - - /// Immediately acquires an exclusive lock on all databases. - case exclusive = "EXCLUSIVE" - - } - - // TODO: Consider not requiring a throw to roll back? - /// Runs a transaction with the given mode. - /// - /// - Note: Transactions cannot be nested. To nest transactions, see - /// `savepoint()`, instead. - /// - /// - Parameters: - /// - /// - mode: The mode in which a transaction acquires a lock. - /// - /// Default: `.Deferred` - /// - /// - block: A closure to run SQL statements within the transaction. - /// The transaction will be committed when the block returns. The block - /// must throw to roll the transaction back. - /// - /// - Throws: `Result.Error`, and rethrows. - public func transaction(_ mode: TransactionMode = .deferred, block: @escaping () throws -> Void) throws { - try transaction("BEGIN \(mode.rawValue) TRANSACTION", block, "COMMIT TRANSACTION", or: "ROLLBACK TRANSACTION") - } - - // TODO: Consider not requiring a throw to roll back? - // TODO: Consider removing ability to set a name? - /// Runs a transaction with the given savepoint name (if omitted, it will - /// generate a UUID). - /// - /// - SeeAlso: `transaction()`. - /// - /// - Parameters: - /// - /// - savepointName: A unique identifier for the savepoint (optional). - /// - /// - block: A closure to run SQL statements within the transaction. - /// The savepoint will be released (committed) when the block returns. - /// The block must throw to roll the savepoint back. - /// - /// - Throws: `SQLite.Result.Error`, and rethrows. - public func savepoint(_ name: String = UUID().uuidString, block: @escaping () throws -> Void) throws { - let name = name.quote("'") - let savepoint = "SAVEPOINT \(name)" - - try transaction(savepoint, block, "RELEASE \(savepoint)", or: "ROLLBACK TO \(savepoint)") - } - - fileprivate func transaction(_ begin: String, _ block: @escaping () throws -> Void, _ commit: String, or rollback: String) throws { - return try sync { - try self.run(begin) - do { - try block() - } catch { - try self.run(rollback) - throw error - } - try self.run(commit) - } - } - - /// Interrupts any long-running queries. - public func interrupt() { - sqlite3_interrupt(handle) - } - - // MARK: - Handlers - - /// The number of seconds a connection will attempt to retry a statement - /// after encountering a busy signal (lock). - public var busyTimeout: Double = 0 { - didSet { - sqlite3_busy_timeout(handle, Int32(busyTimeout * 1_000)) - } - } - - /// Sets a handler to call after encountering a busy signal (lock). - /// - /// - Parameter callback: This block is executed during a lock in which a - /// busy error would otherwise be returned. It’s passed the number of - /// times it’s been called for this lock. If it returns `true`, it will - /// try again. If it returns `false`, no further attempts will be made. - public func busyHandler(_ callback: ((_ tries: Int) -> Bool)?) { - guard let callback = callback else { - sqlite3_busy_handler(handle, nil, nil) - busyHandler = nil - return - } - - let box: BusyHandler = { callback(Int($0)) ? 1 : 0 } - sqlite3_busy_handler(handle, { callback, tries in - unsafeBitCast(callback, to: BusyHandler.self)(tries) - }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) - busyHandler = box - } - fileprivate typealias BusyHandler = @convention(block) (Int32) -> Int32 - fileprivate var busyHandler: BusyHandler? - - /// Sets a handler to call when a statement is executed with the compiled - /// SQL. - /// - /// - Parameter callback: This block is invoked when a statement is executed - /// with the compiled SQL as its argument. - /// - /// db.trace { SQL in print(SQL) } - public func trace(_ callback: ((String) -> Void)?) { - #if SQLITE_SWIFT_SQLCIPHER - trace_v1(callback) - #else - if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) { - trace_v2(callback) - } else { - trace_v1(callback) - } - #endif - } - - fileprivate func trace_v1(_ callback: ((String) -> Void)?) { - guard let callback = callback else { - sqlite3_trace(handle, nil /* xCallback */, nil /* pCtx */) - trace = nil - return - } - let box: Trace = { (pointer: UnsafeRawPointer) in - callback(String(cString: pointer.assumingMemoryBound(to: UInt8.self))) - } - sqlite3_trace(handle, - { - (C: UnsafeMutableRawPointer?, SQL: UnsafePointer?) in - if let C = C, let SQL = SQL { - unsafeBitCast(C, to: Trace.self)(SQL) - } - }, - unsafeBitCast(box, to: UnsafeMutableRawPointer.self) - ) - trace = box - } - - - - - fileprivate typealias Trace = @convention(block) (UnsafeRawPointer) -> Void - fileprivate var trace: Trace? - - /// Registers a callback to be invoked whenever a row is inserted, updated, - /// or deleted in a rowid table. - /// - /// - Parameter callback: A callback invoked with the `Operation` (one of - /// `.Insert`, `.Update`, or `.Delete`), database name, table name, and - /// rowid. - public func updateHook(_ callback: ((_ operation: Operation, _ db: String, _ table: String, _ rowid: Int64) -> Void)?) { - guard let callback = callback else { - sqlite3_update_hook(handle, nil, nil) - updateHook = nil - return - } - - let box: UpdateHook = { - callback( - Operation(rawValue: $0), - String(cString: $1), - String(cString: $2), - $3 - ) - } - sqlite3_update_hook(handle, { callback, operation, db, table, rowid in - unsafeBitCast(callback, to: UpdateHook.self)(operation, db!, table!, rowid) - }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) - updateHook = box - } - fileprivate typealias UpdateHook = @convention(block) (Int32, UnsafePointer, UnsafePointer, Int64) -> Void - fileprivate var updateHook: UpdateHook? - - /// Registers a callback to be invoked whenever a transaction is committed. - /// - /// - Parameter callback: A callback invoked whenever a transaction is - /// committed. If this callback throws, the transaction will be rolled - /// back. - public func commitHook(_ callback: (() throws -> Void)?) { - guard let callback = callback else { - sqlite3_commit_hook(handle, nil, nil) - commitHook = nil - return - } - - let box: CommitHook = { - do { - try callback() - } catch { - return 1 - } - return 0 - } - sqlite3_commit_hook(handle, { callback in - unsafeBitCast(callback, to: CommitHook.self)() - }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) - commitHook = box - } - fileprivate typealias CommitHook = @convention(block) () -> Int32 - fileprivate var commitHook: CommitHook? - - /// Registers a callback to be invoked whenever a transaction rolls back. - /// - /// - Parameter callback: A callback invoked when a transaction is rolled - /// back. - public func rollbackHook(_ callback: (() -> Void)?) { - guard let callback = callback else { - sqlite3_rollback_hook(handle, nil, nil) - rollbackHook = nil - return - } - - let box: RollbackHook = { callback() } - sqlite3_rollback_hook(handle, { callback in - unsafeBitCast(callback, to: RollbackHook.self)() - }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) - rollbackHook = box - } - fileprivate typealias RollbackHook = @convention(block) () -> Void - fileprivate var rollbackHook: RollbackHook? - - /// Creates or redefines a custom SQL function. - /// - /// - Parameters: - /// - /// - function: The name of the function to create or redefine. - /// - /// - argumentCount: The number of arguments that the function takes. If - /// `nil`, the function may take any number of arguments. - /// - /// Default: `nil` - /// - /// - deterministic: Whether or not the function is deterministic (_i.e._ - /// the function always returns the same result for a given input). - /// - /// Default: `false` - /// - /// - block: A block of code to run when the function is called. The block - /// is called with an array of raw SQL values mapped to the function’s - /// parameters and should return a raw SQL value (or nil). - public func createFunction(_ function: String, argumentCount: UInt? = nil, deterministic: Bool = false, _ block: @escaping (_ args: [Binding?]) -> Binding?) { - let argc = argumentCount.map { Int($0) } ?? -1 - let box: Function = { context, argc, argv in - let arguments: [Binding?] = (0..?) -> Void - fileprivate var functions = [String: [Int: Function]]() - - /// Defines a new collating sequence. - /// - /// - Parameters: - /// - /// - collation: The name of the collation added. - /// - /// - block: A collation function that takes two strings and returns the - /// comparison result. - public func createCollation(_ collation: String, _ block: @escaping (_ lhs: String, _ rhs: String) -> ComparisonResult) throws { - let box: Collation = { (lhs: UnsafeRawPointer, rhs: UnsafeRawPointer) in - let lstr = String(cString: lhs.assumingMemoryBound(to: UInt8.self)) - let rstr = String(cString: rhs.assumingMemoryBound(to: UInt8.self)) - return Int32(block(lstr, rstr).rawValue) - } - try check(sqlite3_create_collation_v2(handle, collation, SQLITE_UTF8, - unsafeBitCast(box, to: UnsafeMutableRawPointer.self), - { (callback: UnsafeMutableRawPointer?, _, lhs: UnsafeRawPointer?, _, rhs: UnsafeRawPointer?) in /* xCompare */ - if let lhs = lhs, let rhs = rhs { - return unsafeBitCast(callback, to: Collation.self)(lhs, rhs) - } else { - fatalError("sqlite3_create_collation_v2 callback called with NULL pointer") - } - }, nil /* xDestroy */)) - collations[collation] = box - } - fileprivate typealias Collation = @convention(block) (UnsafeRawPointer, UnsafeRawPointer) -> Int32 - fileprivate var collations = [String: Collation]() - - // MARK: - Error Handling - - func sync(_ block: @escaping () throws -> T) rethrows -> T { - var success: T? - var failure: Error? - - let box: () -> Void = { - do { - success = try block() - } catch { - failure = error - } - } - - if DispatchQueue.getSpecific(key: Connection.queueKey) == queueContext { - box() - } else { - queue.sync(execute: box) // FIXME: rdar://problem/21389236 - } - - if let failure = failure { - try { () -> Void in throw failure }() - } - - return success! - } - - @discardableResult func check(_ resultCode: Int32, statement: Statement? = nil) throws -> Int32 { - guard let error = Result(errorCode: resultCode, connection: self, statement: statement) else { - return resultCode - } - - throw error - } - - fileprivate var queue = DispatchQueue(label: "SQLite.Database", attributes: []) - - fileprivate static let queueKey = DispatchSpecificKey() - - fileprivate lazy var queueContext: Int = unsafeBitCast(self, to: Int.self) - -} - -extension Connection : CustomStringConvertible { - - public var description: String { - return String(cString: sqlite3_db_filename(handle, nil)) - } - -} - -extension Connection.Location : CustomStringConvertible { - - public var description: String { - switch self { - case .inMemory: - return ":memory:" - case .temporary: - return "" - case .uri(let URI): - return URI - } - } - -} - -public enum Result : Error { - - fileprivate static let successCodes: Set = [SQLITE_OK, SQLITE_ROW, SQLITE_DONE] - - case error(message: String, code: Int32, statement: Statement?) - - init?(errorCode: Int32, connection: Connection, statement: Statement? = nil) { - guard !Result.successCodes.contains(errorCode) else { return nil } - - let message = String(cString: sqlite3_errmsg(connection.handle)) - self = .error(message: message, code: errorCode, statement: statement) - } - -} - -extension Result : CustomStringConvertible { - - public var description: String { - switch self { - case let .error(message, errorCode, statement): - if let statement = statement { - return "\(message) (\(statement)) (code: \(errorCode))" - } else { - return "\(message) (code: \(errorCode))" - } - } - } -} - -#if !SQLITE_SWIFT_SQLCIPHER -@available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) -extension Connection { - fileprivate func trace_v2(_ callback: ((String) -> Void)?) { - guard let callback = callback else { - // If the X callback is NULL or if the M mask is zero, then tracing is disabled. - sqlite3_trace_v2(handle, 0 /* mask */, nil /* xCallback */, nil /* pCtx */) - trace = nil - return - } - - let box: Trace = { (pointer: UnsafeRawPointer) in - callback(String(cString: pointer.assumingMemoryBound(to: UInt8.self))) - } - sqlite3_trace_v2(handle, - UInt32(SQLITE_TRACE_STMT) /* mask */, - { - // A trace callback is invoked with four arguments: callback(T,C,P,X). - // The T argument is one of the SQLITE_TRACE constants to indicate why the - // callback was invoked. The C argument is a copy of the context pointer. - // The P and X arguments are pointers whose meanings depend on T. - (T: UInt32, C: UnsafeMutableRawPointer?, P: UnsafeMutableRawPointer?, X: UnsafeMutableRawPointer?) in - if let P = P, - let expandedSQL = sqlite3_expanded_sql(OpaquePointer(P)) { - unsafeBitCast(C, to: Trace.self)(expandedSQL) - sqlite3_free(expandedSQL) - } - return Int32(0) // currently ignored - }, - unsafeBitCast(box, to: UnsafeMutableRawPointer.self) /* pCtx */ - ) - trace = box - } -} -#endif diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Core/Statement.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Core/Statement.swift deleted file mode 100644 index 766bd15b1f..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Core/Statement.swift +++ /dev/null @@ -1,297 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -#if SQLITE_SWIFT_STANDALONE -import sqlite3 -#elseif SQLITE_SWIFT_SQLCIPHER -import SQLCipher -#else -import CSQLite -#endif - -/// A single SQL statement. -public final class Statement { - - fileprivate var handle: OpaquePointer? = nil - - fileprivate let connection: Connection - - init(_ connection: Connection, _ SQL: String) throws { - self.connection = connection - try connection.check(sqlite3_prepare_v2(connection.handle, SQL, -1, &handle, nil)) - } - - deinit { - sqlite3_finalize(handle) - } - - public lazy var columnCount: Int = Int(sqlite3_column_count(self.handle)) - - public lazy var columnNames: [String] = (0.. Statement { - return bind(values) - } - - /// Binds a list of parameters to a statement. - /// - /// - Parameter values: A list of parameters to bind to the statement. - /// - /// - Returns: The statement object (useful for chaining). - public func bind(_ values: [Binding?]) -> Statement { - if values.isEmpty { return self } - reset() - guard values.count == Int(sqlite3_bind_parameter_count(handle)) else { - fatalError("\(sqlite3_bind_parameter_count(handle)) values expected, \(values.count) passed") - } - for idx in 1...values.count { bind(values[idx - 1], atIndex: idx) } - return self - } - - /// Binds a dictionary of named parameters to a statement. - /// - /// - Parameter values: A dictionary of named parameters to bind to the - /// statement. - /// - /// - Returns: The statement object (useful for chaining). - public func bind(_ values: [String: Binding?]) -> Statement { - reset() - for (name, value) in values { - let idx = sqlite3_bind_parameter_index(handle, name) - guard idx > 0 else { - fatalError("parameter not found: \(name)") - } - bind(value, atIndex: Int(idx)) - } - return self - } - - fileprivate func bind(_ value: Binding?, atIndex idx: Int) { - if value == nil { - sqlite3_bind_null(handle, Int32(idx)) - } else if let value = value as? Blob { - sqlite3_bind_blob(handle, Int32(idx), value.bytes, Int32(value.bytes.count), SQLITE_TRANSIENT) - } else if let value = value as? Double { - sqlite3_bind_double(handle, Int32(idx), value) - } else if let value = value as? Int64 { - sqlite3_bind_int64(handle, Int32(idx), value) - } else if let value = value as? String { - sqlite3_bind_text(handle, Int32(idx), value, -1, SQLITE_TRANSIENT) - } else if let value = value as? Int { - self.bind(value.datatypeValue, atIndex: idx) - } else if let value = value as? Bool { - self.bind(value.datatypeValue, atIndex: idx) - } else if let value = value { - fatalError("tried to bind unexpected value \(value)") - } - } - - /// - Parameter bindings: A list of parameters to bind to the statement. - /// - /// - Throws: `Result.Error` if query execution fails. - /// - /// - Returns: The statement object (useful for chaining). - @discardableResult public func run(_ bindings: Binding?...) throws -> Statement { - guard bindings.isEmpty else { - return try run(bindings) - } - - reset(clearBindings: false) - repeat {} while try step() - return self - } - - /// - Parameter bindings: A list of parameters to bind to the statement. - /// - /// - Throws: `Result.Error` if query execution fails. - /// - /// - Returns: The statement object (useful for chaining). - @discardableResult public func run(_ bindings: [Binding?]) throws -> Statement { - return try bind(bindings).run() - } - - /// - Parameter bindings: A dictionary of named parameters to bind to the - /// statement. - /// - /// - Throws: `Result.Error` if query execution fails. - /// - /// - Returns: The statement object (useful for chaining). - @discardableResult public func run(_ bindings: [String: Binding?]) throws -> Statement { - return try bind(bindings).run() - } - - /// - Parameter bindings: A list of parameters to bind to the statement. - /// - /// - Returns: The first value of the first row returned. - public func scalar(_ bindings: Binding?...) throws -> Binding? { - guard bindings.isEmpty else { - return try scalar(bindings) - } - - reset(clearBindings: false) - _ = try step() - return row[0] - } - - /// - Parameter bindings: A list of parameters to bind to the statement. - /// - /// - Returns: The first value of the first row returned. - public func scalar(_ bindings: [Binding?]) throws -> Binding? { - return try bind(bindings).scalar() - } - - - /// - Parameter bindings: A dictionary of named parameters to bind to the - /// statement. - /// - /// - Returns: The first value of the first row returned. - public func scalar(_ bindings: [String: Binding?]) throws -> Binding? { - return try bind(bindings).scalar() - } - - public func step() throws -> Bool { - return try connection.sync { try self.connection.check(sqlite3_step(self.handle)) == SQLITE_ROW } - } - - fileprivate func reset(clearBindings shouldClear: Bool = true) { - sqlite3_reset(handle) - if (shouldClear) { sqlite3_clear_bindings(handle) } - } - -} - -extension Statement : Sequence { - - public func makeIterator() -> Statement { - reset(clearBindings: false) - return self - } - -} - -extension Statement : IteratorProtocol { - - public func next() -> [Binding?]? { - return try! step() ? Array(row) : nil - } - -} - -extension Statement : CustomStringConvertible { - - public var description: String { - return String(cString: sqlite3_sql(handle)) - } - -} - -public struct Cursor { - - fileprivate let handle: OpaquePointer - - fileprivate let columnCount: Int - - fileprivate init(_ statement: Statement) { - handle = statement.handle! - columnCount = statement.columnCount - } - - public subscript(idx: Int) -> Double { - return sqlite3_column_double(handle, Int32(idx)) - } - - public subscript(idx: Int) -> Int64 { - return sqlite3_column_int64(handle, Int32(idx)) - } - - public subscript(idx: Int) -> String { - return String(cString: UnsafePointer(sqlite3_column_text(handle, Int32(idx)))) - } - - public subscript(idx: Int) -> Blob { - if let pointer = sqlite3_column_blob(handle, Int32(idx)) { - let length = Int(sqlite3_column_bytes(handle, Int32(idx))) - return Blob(bytes: pointer, length: length) - } else { - // The return value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. - // https://www.sqlite.org/c3ref/column_blob.html - return Blob(bytes: []) - } - } - - // MARK: - - - public subscript(idx: Int) -> Bool { - return Bool.fromDatatypeValue(self[idx]) - } - - public subscript(idx: Int) -> Int { - return Int.fromDatatypeValue(self[idx]) - } - -} - -/// Cursors provide direct access to a statement’s current row. -extension Cursor : Sequence { - - public subscript(idx: Int) -> Binding? { - switch sqlite3_column_type(handle, Int32(idx)) { - case SQLITE_BLOB: - return self[idx] as Blob - case SQLITE_FLOAT: - return self[idx] as Double - case SQLITE_INTEGER: - return self[idx] as Int64 - case SQLITE_NULL: - return nil - case SQLITE_TEXT: - return self[idx] as String - case let type: - fatalError("unsupported column type: \(type)") - } - } - - public func makeIterator() -> AnyIterator { - var idx = 0 - return AnyIterator { - if idx >= self.columnCount { - return Optional.none - } else { - idx += 1 - return self[idx - 1] - } - } - } - -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Core/Value.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Core/Value.swift deleted file mode 100644 index 608f0ce6fe..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Core/Value.swift +++ /dev/null @@ -1,132 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -/// - Warning: `Binding` is a protocol that SQLite.swift uses internally to -/// directly map SQLite types to Swift types. -/// -/// Do not conform custom types to the Binding protocol. See the `Value` -/// protocol, instead. -public protocol Binding {} - -public protocol Number : Binding {} - -public protocol Value : Expressible { // extensions cannot have inheritance clauses - - associatedtype ValueType = Self - - associatedtype Datatype : Binding - - static var declaredDatatype: String { get } - - static func fromDatatypeValue(_ datatypeValue: Datatype) -> ValueType - - var datatypeValue: Datatype { get } - -} - -extension Double : Number, Value { - - public static let declaredDatatype = "REAL" - - public static func fromDatatypeValue(_ datatypeValue: Double) -> Double { - return datatypeValue - } - - public var datatypeValue: Double { - return self - } - -} - -extension Int64 : Number, Value { - - public static let declaredDatatype = "INTEGER" - - public static func fromDatatypeValue(_ datatypeValue: Int64) -> Int64 { - return datatypeValue - } - - public var datatypeValue: Int64 { - return self - } - -} - -extension String : Binding, Value { - - public static let declaredDatatype = "TEXT" - - public static func fromDatatypeValue(_ datatypeValue: String) -> String { - return datatypeValue - } - - public var datatypeValue: String { - return self - } - -} - -extension Blob : Binding, Value { - - public static let declaredDatatype = "BLOB" - - public static func fromDatatypeValue(_ datatypeValue: Blob) -> Blob { - return datatypeValue - } - - public var datatypeValue: Blob { - return self - } - -} - -// MARK: - - -extension Bool : Binding, Value { - - public static var declaredDatatype = Int64.declaredDatatype - - public static func fromDatatypeValue(_ datatypeValue: Int64) -> Bool { - return datatypeValue != 0 - } - - public var datatypeValue: Int64 { - return self ? 1 : 0 - } - -} - -extension Int : Number, Value { - - public static var declaredDatatype = Int64.declaredDatatype - - public static func fromDatatypeValue(_ datatypeValue: Int64) -> Int { - return Int(datatypeValue) - } - - public var datatypeValue: Int64 { - return Int64(self) - } - -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift deleted file mode 100644 index 152a29219e..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift +++ /dev/null @@ -1,346 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -#if SWIFT_PACKAGE -import SQLiteObjc -#endif - -extension Module { - - public static func FTS4(_ column: Expressible, _ more: Expressible...) -> Module { - return FTS4([column] + more) - } - - public static func FTS4(_ columns: [Expressible] = [], tokenize tokenizer: Tokenizer? = nil) -> Module { - return FTS4(FTS4Config().columns(columns).tokenizer(tokenizer)) - } - - public static func FTS4(_ config: FTS4Config) -> Module { - return Module(name: "fts4", arguments: config.arguments()) - } -} - -extension VirtualTable { - - /// Builds an expression appended with a `MATCH` query against the given - /// pattern. - /// - /// let emails = VirtualTable("emails") - /// - /// emails.filter(emails.match("Hello")) - /// // SELECT * FROM "emails" WHERE "emails" MATCH 'Hello' - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: An expression appended with a `MATCH` query against the given - /// pattern. - public func match(_ pattern: String) -> Expression { - return "MATCH".infix(tableName(), pattern) - } - - public func match(_ pattern: Expression) -> Expression { - return "MATCH".infix(tableName(), pattern) - } - - public func match(_ pattern: Expression) -> Expression { - return "MATCH".infix(tableName(), pattern) - } - - /// Builds a copy of the query with a `WHERE … MATCH` clause. - /// - /// let emails = VirtualTable("emails") - /// - /// emails.match("Hello") - /// // SELECT * FROM "emails" WHERE "emails" MATCH 'Hello' - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A query with the given `WHERE … MATCH` clause applied. - public func match(_ pattern: String) -> QueryType { - return filter(match(pattern)) - } - - public func match(_ pattern: Expression) -> QueryType { - return filter(match(pattern)) - } - - public func match(_ pattern: Expression) -> QueryType { - return filter(match(pattern)) - } - -} - -public struct Tokenizer { - - public static let Simple = Tokenizer("simple") - - public static let Porter = Tokenizer("porter") - - public static func Unicode61(removeDiacritics: Bool? = nil, tokenchars: Set = [], separators: Set = []) -> Tokenizer { - var arguments = [String]() - - if let removeDiacritics = removeDiacritics { - arguments.append("removeDiacritics=\(removeDiacritics ? 1 : 0)".quote()) - } - - if !tokenchars.isEmpty { - let joined = tokenchars.map { String($0) }.joined(separator: "") - arguments.append("tokenchars=\(joined)".quote()) - } - - if !separators.isEmpty { - let joined = separators.map { String($0) }.joined(separator: "") - arguments.append("separators=\(joined)".quote()) - } - - return Tokenizer("unicode61", arguments) - } - - public static func Custom(_ name: String) -> Tokenizer { - return Tokenizer(Tokenizer.moduleName.quote(), [name.quote()]) - } - - public let name: String - - public let arguments: [String] - - fileprivate init(_ name: String, _ arguments: [String] = []) { - self.name = name - self.arguments = arguments - } - - fileprivate static let moduleName = "SQLite.swift" - -} - -extension Tokenizer : CustomStringConvertible { - - public var description: String { - return ([name] + arguments).joined(separator: " ") - } - -} - -extension Connection { - - public func registerTokenizer(_ submoduleName: String, next: @escaping (String) -> (String, Range)?) throws { - try check(_SQLiteRegisterTokenizer(handle, Tokenizer.moduleName, submoduleName) { input, offset, length in - let string = String(cString: input) - - guard let (token, range) = next(string) else { return nil } - - let view = string.utf8 - offset.pointee += string.substring(to: range.lowerBound).utf8.count - length.pointee = Int32(view.distance(from: range.lowerBound.samePosition(in: view), to: range.upperBound.samePosition(in: view))) - return token - }) - } - -} - -/// Configuration options shared between the [FTS4](https://www.sqlite.org/fts3.html) and -/// [FTS5](https://www.sqlite.org/fts5.html) extensions. -open class FTSConfig { - public enum ColumnOption { - /// [The notindexed= option](https://www.sqlite.org/fts3.html#section_6_5) - case unindexed - } - - typealias ColumnDefinition = (Expressible, options: [ColumnOption]) - var columnDefinitions = [ColumnDefinition]() - var tokenizer: Tokenizer? - var prefixes = [Int]() - var externalContentSchema: SchemaType? - var isContentless: Bool = false - - /// Adds a column definition - @discardableResult open func column(_ column: Expressible, _ options: [ColumnOption] = []) -> Self { - self.columnDefinitions.append((column, options)) - return self - } - - @discardableResult open func columns(_ columns: [Expressible]) -> Self { - for column in columns { - self.column(column) - } - return self - } - - /// [Tokenizers](https://www.sqlite.org/fts3.html#tokenizer) - open func tokenizer(_ tokenizer: Tokenizer?) -> Self { - self.tokenizer = tokenizer - return self - } - - /// [The prefix= option](https://www.sqlite.org/fts3.html#section_6_6) - open func prefix(_ prefix: [Int]) -> Self { - self.prefixes += prefix - return self - } - - /// [The content= option](https://www.sqlite.org/fts3.html#section_6_2) - open func externalContent(_ schema: SchemaType) -> Self { - self.externalContentSchema = schema - return self - } - - /// [Contentless FTS4 Tables](https://www.sqlite.org/fts3.html#section_6_2_1) - open func contentless() -> Self { - self.isContentless = true - return self - } - - func formatColumnDefinitions() -> [Expressible] { - return columnDefinitions.map { $0.0 } - } - - func arguments() -> [Expressible] { - return options().arguments - } - - func options() -> Options { - var options = Options() - options.append(formatColumnDefinitions()) - if let tokenizer = tokenizer { - options.append("tokenize", value: Expression(literal: tokenizer.description)) - } - options.appendCommaSeparated("prefix", values:prefixes.sorted().map { String($0) }) - if isContentless { - options.append("content", value: "") - } else if let externalContentSchema = externalContentSchema { - options.append("content", value: externalContentSchema.tableName()) - } - return options - } - - struct Options { - var arguments = [Expressible]() - - @discardableResult mutating func append(_ columns: [Expressible]) -> Options { - arguments.append(contentsOf: columns) - return self - } - - @discardableResult mutating func appendCommaSeparated(_ key: String, values: [String]) -> Options { - if values.isEmpty { - return self - } else { - return append(key, value: values.joined(separator: ",")) - } - } - - @discardableResult mutating func append(_ key: String, value: CustomStringConvertible?) -> Options { - return append(key, value: value?.description) - } - - @discardableResult mutating func append(_ key: String, value: String?) -> Options { - return append(key, value: value.map { Expression($0) }) - } - - @discardableResult mutating func append(_ key: String, value: Expressible?) -> Options { - if let value = value { - arguments.append("=".join([Expression(literal: key), value])) - } - return self - } - } -} - -/// Configuration for the [FTS4](https://www.sqlite.org/fts3.html) extension. -open class FTS4Config : FTSConfig { - /// [The matchinfo= option](https://www.sqlite.org/fts3.html#section_6_4) - public enum MatchInfo : CustomStringConvertible { - case fts3 - public var description: String { - return "fts3" - } - } - - /// [FTS4 options](https://www.sqlite.org/fts3.html#fts4_options) - public enum Order : CustomStringConvertible { - /// Data structures are optimized for returning results in ascending order by docid (default) - case asc - /// FTS4 stores its data in such a way as to optimize returning results in descending order by docid. - case desc - - public var description: String { - switch self { - case .asc: return "asc" - case .desc: return "desc" - } - } - } - - var compressFunction: String? - var uncompressFunction: String? - var languageId: String? - var matchInfo: MatchInfo? - var order: Order? - - override public init() { - } - - /// [The compress= and uncompress= options](https://www.sqlite.org/fts3.html#section_6_1) - open func compress(_ functionName: String) -> Self { - self.compressFunction = functionName - return self - } - - /// [The compress= and uncompress= options](https://www.sqlite.org/fts3.html#section_6_1) - open func uncompress(_ functionName: String) -> Self { - self.uncompressFunction = functionName - return self - } - - /// [The languageid= option](https://www.sqlite.org/fts3.html#section_6_3) - open func languageId(_ columnName: String) -> Self { - self.languageId = columnName - return self - } - - /// [The matchinfo= option](https://www.sqlite.org/fts3.html#section_6_4) - open func matchInfo(_ matchInfo: MatchInfo) -> Self { - self.matchInfo = matchInfo - return self - } - - /// [FTS4 options](https://www.sqlite.org/fts3.html#fts4_options) - open func order(_ order: Order) -> Self { - self.order = order - return self - } - - override func options() -> Options { - var options = super.options() - for (column, _) in (columnDefinitions.filter { $0.options.contains(.unindexed) }) { - options.append("notindexed", value: column) - } - options.append("languageid", value: languageId) - options.append("compress", value: compressFunction) - options.append("uncompress", value: uncompressFunction) - options.append("matchinfo", value: matchInfo) - options.append("order", value: order) - return options - } -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift deleted file mode 100644 index 763927ff48..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift +++ /dev/null @@ -1,97 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -extension Module { - public static func FTS5(_ config: FTS5Config) -> Module { - return Module(name: "fts5", arguments: config.arguments()) - } -} - -/// Configuration for the [FTS5](https://www.sqlite.org/fts5.html) extension. -/// -/// **Note:** this is currently only applicable when using SQLite.swift together with a FTS5-enabled version -/// of SQLite. -open class FTS5Config : FTSConfig { - public enum Detail : CustomStringConvertible { - /// store rowid, column number, term offset - case full - /// store rowid, column number - case column - /// store rowid - case none - - public var description: String { - switch self { - case .full: return "full" - case .column: return "column" - case .none: return "none" - } - } - } - - var detail: Detail? - var contentRowId: Expressible? - var columnSize: Int? - - override public init() { - } - - /// [External Content Tables](https://www.sqlite.org/fts5.html#section_4_4_2) - open func contentRowId(_ column: Expressible) -> Self { - self.contentRowId = column - return self - } - - /// [The Columnsize Option](https://www.sqlite.org/fts5.html#section_4_5) - open func columnSize(_ size: Int) -> Self { - self.columnSize = size - return self - } - - /// [The Detail Option](https://www.sqlite.org/fts5.html#section_4_6) - open func detail(_ detail: Detail) -> Self { - self.detail = detail - return self - } - - override func options() -> Options { - var options = super.options() - options.append("content_rowid", value: contentRowId) - if let columnSize = columnSize { - options.append("columnsize", value: Expression(value: columnSize)) - } - options.append("detail", value: detail) - return options - } - - override func formatColumnDefinitions() -> [Expressible] { - return columnDefinitions.map { definition in - if definition.options.contains(.unindexed) { - return " ".join([definition.0, Expression(literal: "UNINDEXED")]) - } else { - return definition.0 - } - } - } -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/RTree.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/RTree.swift deleted file mode 100644 index 4fc1a23539..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Extensions/RTree.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -extension Module { - - public static func RTree(_ primaryKey: Expression, _ pairs: (Expression, Expression)...) -> Module where T.Datatype == Int64, U.Datatype == Double { - var arguments: [Expressible] = [primaryKey] - - for pair in pairs { - arguments.append(contentsOf: [pair.0, pair.1] as [Expressible]) - } - - return Module(name: "rtree", arguments: arguments) - } - -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Foundation.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Foundation.swift deleted file mode 100644 index 5e102297b9..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Foundation.swift +++ /dev/null @@ -1,108 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -import Foundation - -extension Data : Value { - - public static var declaredDatatype: String { - return Blob.declaredDatatype - } - - public static func fromDatatypeValue(_ dataValue: Blob) -> Data { - return Data(bytes: dataValue.bytes) - } - - public var datatypeValue: Blob { - return withUnsafeBytes { (pointer: UnsafePointer) -> Blob in - return Blob(bytes: pointer, length: count) - } - } - -} - -extension Date : Value { - - public static var declaredDatatype: String { - return String.declaredDatatype - } - - public static func fromDatatypeValue(_ stringValue: String) -> Date { - return dateFormatter.date(from: stringValue)! - } - - public var datatypeValue: String { - return dateFormatter.string(from: self) - } - -} - -/// A global date formatter used to serialize and deserialize `NSDate` objects. -/// If multiple date formats are used in an application’s database(s), use a -/// custom `Value` type per additional format. -public var dateFormatter: DateFormatter = { - let formatter = DateFormatter() - formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS" - formatter.locale = Locale(identifier: "en_US_POSIX") - formatter.timeZone = TimeZone(secondsFromGMT: 0) - return formatter -}() - -// FIXME: rdar://problem/18673897 // subscript… - -extension QueryType { - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - -} - -extension Row { - - public subscript(column: Expression) -> Data { - return get(column) - } - public subscript(column: Expression) -> Data? { - return get(column) - } - - public subscript(column: Expression) -> Date { - return get(column) - } - public subscript(column: Expression) -> Date? { - return get(column) - } - -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Helpers.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Helpers.swift deleted file mode 100644 index 81a7507ede..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Helpers.swift +++ /dev/null @@ -1,130 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -#if SQLITE_SWIFT_STANDALONE -import sqlite3 -#elseif SQLITE_SWIFT_SQLCIPHER -import SQLCipher -#else -import CSQLite -#endif - -public typealias Star = (Expression?, Expression?) -> Expression - -public func *(_: Expression?, _: Expression?) -> Expression { - return Expression(literal: "*") -} - -public protocol _OptionalType { - - associatedtype WrappedType - -} - -extension Optional : _OptionalType { - - public typealias WrappedType = Wrapped - -} - -// let SQLITE_STATIC = unsafeBitCast(0, sqlite3_destructor_type.self) -let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) - -extension String { - - func quote(_ mark: Character = "\"") -> String { - let escaped = characters.reduce("") { string, character in - string + (character == mark ? "\(mark)\(mark)" : "\(character)") - } - return "\(mark)\(escaped)\(mark)" - } - - func join(_ expressions: [Expressible]) -> Expressible { - var (template, bindings) = ([String](), [Binding?]()) - for expressible in expressions { - let expression = expressible.expression - template.append(expression.template) - bindings.append(contentsOf: expression.bindings) - } - return Expression(template.joined(separator: self), bindings) - } - - func infix(_ lhs: Expressible, _ rhs: Expressible, wrap: Bool = true) -> Expression { - let expression = Expression(" \(self) ".join([lhs, rhs]).expression) - guard wrap else { - return expression - } - return "".wrap(expression) - } - - func prefix(_ expressions: Expressible) -> Expressible { - return "\(self) ".wrap(expressions) as Expression - } - - func prefix(_ expressions: [Expressible]) -> Expressible { - return "\(self) ".wrap(expressions) as Expression - } - - func wrap(_ expression: Expressible) -> Expression { - return Expression("\(self)(\(expression.expression.template))", expression.expression.bindings) - } - - func wrap(_ expressions: [Expressible]) -> Expression { - return wrap(", ".join(expressions)) - } - -} - -func infix(_ lhs: Expressible, _ rhs: Expressible, wrap: Bool = true, function: String = #function) -> Expression { - return function.infix(lhs, rhs, wrap: wrap) -} - -func wrap(_ expression: Expressible, function: String = #function) -> Expression { - return function.wrap(expression) -} - -func wrap(_ expressions: [Expressible], function: String = #function) -> Expression { - return function.wrap(", ".join(expressions)) -} - -func transcode(_ literal: Binding?) -> String { - guard let literal = literal else { return "NULL" } - - switch literal { - case let blob as Blob: - return blob.description - case let string as String: - return string.quote("'") - case let binding: - return "\(binding)" - } -} - -func value(_ v: Binding) -> A { - return A.fromDatatypeValue(v as! A.Datatype) as! A -} - -func value(_ v: Binding?) -> A { - return value(v!) -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/SQLite.h b/Example/Pods/SQLite.swift/Sources/SQLite/SQLite.h deleted file mode 100644 index 693ce323cf..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/SQLite.h +++ /dev/null @@ -1,6 +0,0 @@ -@import Foundation; - -FOUNDATION_EXPORT double SQLiteVersionNumber; -FOUNDATION_EXPORT const unsigned char SQLiteVersionString[]; - -#import diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift deleted file mode 100644 index 249bbe60cd..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift +++ /dev/null @@ -1,251 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -extension ExpressionType where UnderlyingType : Value { - - /// Builds a copy of the expression prefixed with the `DISTINCT` keyword. - /// - /// let name = Expression("name") - /// name.distinct - /// // DISTINCT "name" - /// - /// - Returns: A copy of the expression prefixed with the `DISTINCT` - /// keyword. - public var distinct: Expression { - return Expression("DISTINCT \(template)", bindings) - } - - /// Builds a copy of the expression wrapped with the `count` aggregate - /// function. - /// - /// let name = Expression("name") - /// name.count - /// // count("name") - /// name.distinct.count - /// // count(DISTINCT "name") - /// - /// - Returns: A copy of the expression wrapped with the `count` aggregate - /// function. - public var count: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value { - - /// Builds a copy of the expression prefixed with the `DISTINCT` keyword. - /// - /// let name = Expression("name") - /// name.distinct - /// // DISTINCT "name" - /// - /// - Returns: A copy of the expression prefixed with the `DISTINCT` - /// keyword. - public var distinct: Expression { - return Expression("DISTINCT \(template)", bindings) - } - - /// Builds a copy of the expression wrapped with the `count` aggregate - /// function. - /// - /// let name = Expression("name") - /// name.count - /// // count("name") - /// name.distinct.count - /// // count(DISTINCT "name") - /// - /// - Returns: A copy of the expression wrapped with the `count` aggregate - /// function. - public var count: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType : Value, UnderlyingType.Datatype : Comparable { - - /// Builds a copy of the expression wrapped with the `max` aggregate - /// function. - /// - /// let age = Expression("age") - /// age.max - /// // max("age") - /// - /// - Returns: A copy of the expression wrapped with the `max` aggregate - /// function. - public var max: Expression { - return wrap(self) - } - - /// Builds a copy of the expression wrapped with the `min` aggregate - /// function. - /// - /// let age = Expression("age") - /// age.min - /// // min("age") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var min: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value, UnderlyingType.WrappedType.Datatype : Comparable { - - /// Builds a copy of the expression wrapped with the `max` aggregate - /// function. - /// - /// let age = Expression("age") - /// age.max - /// // max("age") - /// - /// - Returns: A copy of the expression wrapped with the `max` aggregate - /// function. - public var max: Expression { - return wrap(self) - } - - /// Builds a copy of the expression wrapped with the `min` aggregate - /// function. - /// - /// let age = Expression("age") - /// age.min - /// // min("age") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var min: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType : Value, UnderlyingType.Datatype : Number { - - /// Builds a copy of the expression wrapped with the `avg` aggregate - /// function. - /// - /// let salary = Expression("salary") - /// salary.average - /// // avg("salary") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var average: Expression { - return "avg".wrap(self) - } - - /// Builds a copy of the expression wrapped with the `sum` aggregate - /// function. - /// - /// let salary = Expression("salary") - /// salary.sum - /// // sum("salary") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var sum: Expression { - return wrap(self) - } - - /// Builds a copy of the expression wrapped with the `total` aggregate - /// function. - /// - /// let salary = Expression("salary") - /// salary.total - /// // total("salary") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var total: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value, UnderlyingType.WrappedType.Datatype : Number { - - /// Builds a copy of the expression wrapped with the `avg` aggregate - /// function. - /// - /// let salary = Expression("salary") - /// salary.average - /// // avg("salary") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var average: Expression { - return "avg".wrap(self) - } - - /// Builds a copy of the expression wrapped with the `sum` aggregate - /// function. - /// - /// let salary = Expression("salary") - /// salary.sum - /// // sum("salary") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var sum: Expression { - return wrap(self) - } - - /// Builds a copy of the expression wrapped with the `total` aggregate - /// function. - /// - /// let salary = Expression("salary") - /// salary.total - /// // total("salary") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var total: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType == Int { - - static func count(_ star: Star) -> Expression { - return wrap(star(nil, nil)) - } - -} - -/// Builds an expression representing `count(*)` (when called with the `*` -/// function literal). -/// -/// count(*) -/// // count(*) -/// -/// - Returns: An expression returning `count(*)` (when called with the `*` -/// function literal). -public func count(_ star: Star) -> Expression { - return Expression.count(star) -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Collation.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Collation.swift deleted file mode 100644 index e2ff9d1006..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Collation.swift +++ /dev/null @@ -1,69 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -/// A collating function used to compare to strings. -/// -/// - SeeAlso: -public enum Collation { - - /// Compares string by raw data. - case binary - - /// Like binary, but folds uppercase ASCII letters into their lowercase - /// equivalents. - case nocase - - /// Like binary, but strips trailing space. - case rtrim - - /// A custom collating sequence identified by the given string, registered - /// using `Database.create(collation:…)` - case custom(String) - -} - -extension Collation : Expressible { - - public var expression: Expression { - return Expression(literal: description) - } - -} - -extension Collation : CustomStringConvertible { - - public var description : String { - switch self { - case .binary: - return "BINARY" - case .nocase: - return "NOCASE" - case .rtrim: - return "RTRIM" - case .custom(let collation): - return collation.quote() - } - } - -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift deleted file mode 100644 index 9d17a326bc..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift +++ /dev/null @@ -1,683 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -import Foundation.NSData - - -extension ExpressionType where UnderlyingType : Number { - - /// Builds a copy of the expression wrapped with the `abs` function. - /// - /// let x = Expression("x") - /// x.absoluteValue - /// // abs("x") - /// - /// - Returns: A copy of the expression wrapped with the `abs` function. - public var absoluteValue : Expression { - return "abs".wrap(self) - } - -} - -extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Number { - - /// Builds a copy of the expression wrapped with the `abs` function. - /// - /// let x = Expression("x") - /// x.absoluteValue - /// // abs("x") - /// - /// - Returns: A copy of the expression wrapped with the `abs` function. - public var absoluteValue : Expression { - return "abs".wrap(self) - } - -} - -extension ExpressionType where UnderlyingType == Double { - - /// Builds a copy of the expression wrapped with the `round` function. - /// - /// let salary = Expression("salary") - /// salary.round() - /// // round("salary") - /// salary.round(2) - /// // round("salary", 2) - /// - /// - Returns: A copy of the expression wrapped with the `round` function. - public func round(_ precision: Int? = nil) -> Expression { - guard let precision = precision else { - return wrap([self]) - } - return wrap([self, Int(precision)]) - } - -} - -extension ExpressionType where UnderlyingType == Double? { - - /// Builds a copy of the expression wrapped with the `round` function. - /// - /// let salary = Expression("salary") - /// salary.round() - /// // round("salary") - /// salary.round(2) - /// // round("salary", 2) - /// - /// - Returns: A copy of the expression wrapped with the `round` function. - public func round(_ precision: Int? = nil) -> Expression { - guard let precision = precision else { - return wrap(self) - } - return wrap([self, Int(precision)]) - } - -} - -extension ExpressionType where UnderlyingType : Value, UnderlyingType.Datatype == Int64 { - - /// Builds an expression representing the `random` function. - /// - /// Expression.random() - /// // random() - /// - /// - Returns: An expression calling the `random` function. - public static func random() -> Expression { - return "random".wrap([]) - } - -} - -extension ExpressionType where UnderlyingType == Data { - - /// Builds an expression representing the `randomblob` function. - /// - /// Expression.random(16) - /// // randomblob(16) - /// - /// - Parameter length: Length in bytes. - /// - /// - Returns: An expression calling the `randomblob` function. - public static func random(_ length: Int) -> Expression { - return "randomblob".wrap([]) - } - - /// Builds an expression representing the `zeroblob` function. - /// - /// Expression.allZeros(16) - /// // zeroblob(16) - /// - /// - Parameter length: Length in bytes. - /// - /// - Returns: An expression calling the `zeroblob` function. - public static func allZeros(_ length: Int) -> Expression { - return "zeroblob".wrap([]) - } - - /// Builds a copy of the expression wrapped with the `length` function. - /// - /// let data = Expression("data") - /// data.length - /// // length("data") - /// - /// - Returns: A copy of the expression wrapped with the `length` function. - public var length: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType == Data? { - - /// Builds a copy of the expression wrapped with the `length` function. - /// - /// let data = Expression("data") - /// data.length - /// // length("data") - /// - /// - Returns: A copy of the expression wrapped with the `length` function. - public var length: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType == String { - - /// Builds a copy of the expression wrapped with the `length` function. - /// - /// let name = Expression("name") - /// name.length - /// // length("name") - /// - /// - Returns: A copy of the expression wrapped with the `length` function. - public var length: Expression { - return wrap(self) - } - - /// Builds a copy of the expression wrapped with the `lower` function. - /// - /// let name = Expression("name") - /// name.lowercaseString - /// // lower("name") - /// - /// - Returns: A copy of the expression wrapped with the `lower` function. - public var lowercaseString: Expression { - return "lower".wrap(self) - } - - /// Builds a copy of the expression wrapped with the `upper` function. - /// - /// let name = Expression("name") - /// name.uppercaseString - /// // lower("name") - /// - /// - Returns: A copy of the expression wrapped with the `upper` function. - public var uppercaseString: Expression { - return "upper".wrap(self) - } - - /// Builds a copy of the expression appended with a `LIKE` query against the - /// given pattern. - /// - /// let email = Expression("email") - /// email.like("%@example.com") - /// // "email" LIKE '%@example.com' - /// email.like("99\\%@%", escape: "\\") - /// // "email" LIKE '99\%@%' ESCAPE '\' - /// - /// - Parameters: - /// - /// - pattern: A pattern to match. - /// - /// - escape: An (optional) character designated for escaping - /// pattern-matching characters (*i.e.*, the `%` and `_` characters). - /// - /// - Returns: A copy of the expression appended with a `LIKE` query against - /// the given pattern. - public func like(_ pattern: String, escape character: Character? = nil) -> Expression { - guard let character = character else { - return "LIKE".infix(self, pattern) - } - return Expression("(\(template) LIKE ? ESCAPE ?)", bindings + [pattern, String(character)]) - } - - /// Builds a copy of the expression appended with a `GLOB` query against the - /// given pattern. - /// - /// let path = Expression("path") - /// path.glob("*.png") - /// // "path" GLOB '*.png' - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression appended with a `GLOB` query against - /// the given pattern. - public func glob(_ pattern: String) -> Expression { - return "GLOB".infix(self, pattern) - } - - /// Builds a copy of the expression appended with a `MATCH` query against - /// the given pattern. - /// - /// let title = Expression("title") - /// title.match("swift AND programming") - /// // "title" MATCH 'swift AND programming' - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression appended with a `MATCH` query - /// against the given pattern. - public func match(_ pattern: String) -> Expression { - return "MATCH".infix(self, pattern) - } - - /// Builds a copy of the expression appended with a `REGEXP` query against - /// the given pattern. - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression appended with a `REGEXP` query - /// against the given pattern. - public func regexp(_ pattern: String) -> Expression { - return "REGEXP".infix(self, pattern) - } - - /// Builds a copy of the expression appended with a `COLLATE` clause with - /// the given sequence. - /// - /// let name = Expression("name") - /// name.collate(.Nocase) - /// // "name" COLLATE NOCASE - /// - /// - Parameter collation: A collating sequence. - /// - /// - Returns: A copy of the expression appended with a `COLLATE` clause - /// with the given sequence. - public func collate(_ collation: Collation) -> Expression { - return "COLLATE".infix(self, collation) - } - - /// Builds a copy of the expression wrapped with the `ltrim` function. - /// - /// let name = Expression("name") - /// name.ltrim() - /// // ltrim("name") - /// name.ltrim([" ", "\t"]) - /// // ltrim("name", ' \t') - /// - /// - Parameter characters: A set of characters to trim. - /// - /// - Returns: A copy of the expression wrapped with the `ltrim` function. - public func ltrim(_ characters: Set? = nil) -> Expression { - guard let characters = characters else { - return wrap(self) - } - return wrap([self, String(characters)]) - } - - /// Builds a copy of the expression wrapped with the `rtrim` function. - /// - /// let name = Expression("name") - /// name.rtrim() - /// // rtrim("name") - /// name.rtrim([" ", "\t"]) - /// // rtrim("name", ' \t') - /// - /// - Parameter characters: A set of characters to trim. - /// - /// - Returns: A copy of the expression wrapped with the `rtrim` function. - public func rtrim(_ characters: Set? = nil) -> Expression { - guard let characters = characters else { - return wrap(self) - } - return wrap([self, String(characters)]) - } - - /// Builds a copy of the expression wrapped with the `trim` function. - /// - /// let name = Expression("name") - /// name.trim() - /// // trim("name") - /// name.trim([" ", "\t"]) - /// // trim("name", ' \t') - /// - /// - Parameter characters: A set of characters to trim. - /// - /// - Returns: A copy of the expression wrapped with the `trim` function. - public func trim(_ characters: Set? = nil) -> Expression { - guard let characters = characters else { - return wrap([self]) - } - return wrap([self, String(characters)]) - } - - /// Builds a copy of the expression wrapped with the `replace` function. - /// - /// let email = Expression("email") - /// email.replace("@mac.com", with: "@icloud.com") - /// // replace("email", '@mac.com', '@icloud.com') - /// - /// - Parameters: - /// - /// - pattern: A pattern to match. - /// - /// - replacement: The replacement string. - /// - /// - Returns: A copy of the expression wrapped with the `replace` function. - public func replace(_ pattern: String, with replacement: String) -> Expression { - return "replace".wrap([self, pattern, replacement]) - } - - public func substring(_ location: Int, length: Int? = nil) -> Expression { - guard let length = length else { - return "substr".wrap([self, location]) - } - return "substr".wrap([self, location, length]) - } - - public subscript(range: Range) -> Expression { - return substring(range.lowerBound, length: range.upperBound - range.lowerBound) - } - -} - -extension ExpressionType where UnderlyingType == String? { - - /// Builds a copy of the expression wrapped with the `length` function. - /// - /// let name = Expression("name") - /// name.length - /// // length("name") - /// - /// - Returns: A copy of the expression wrapped with the `length` function. - public var length: Expression { - return wrap(self) - } - - /// Builds a copy of the expression wrapped with the `lower` function. - /// - /// let name = Expression("name") - /// name.lowercaseString - /// // lower("name") - /// - /// - Returns: A copy of the expression wrapped with the `lower` function. - public var lowercaseString: Expression { - return "lower".wrap(self) - } - - /// Builds a copy of the expression wrapped with the `upper` function. - /// - /// let name = Expression("name") - /// name.uppercaseString - /// // lower("name") - /// - /// - Returns: A copy of the expression wrapped with the `upper` function. - public var uppercaseString: Expression { - return "upper".wrap(self) - } - - /// Builds a copy of the expression appended with a `LIKE` query against the - /// given pattern. - /// - /// let email = Expression("email") - /// email.like("%@example.com") - /// // "email" LIKE '%@example.com' - /// email.like("99\\%@%", escape: "\\") - /// // "email" LIKE '99\%@%' ESCAPE '\' - /// - /// - Parameters: - /// - /// - pattern: A pattern to match. - /// - /// - escape: An (optional) character designated for escaping - /// pattern-matching characters (*i.e.*, the `%` and `_` characters). - /// - /// - Returns: A copy of the expression appended with a `LIKE` query against - /// the given pattern. - public func like(_ pattern: String, escape character: Character? = nil) -> Expression { - guard let character = character else { - return "LIKE".infix(self, pattern) - } - return Expression("(\(template) LIKE ? ESCAPE ?)", bindings + [pattern, String(character)]) - } - - /// Builds a copy of the expression appended with a `GLOB` query against the - /// given pattern. - /// - /// let path = Expression("path") - /// path.glob("*.png") - /// // "path" GLOB '*.png' - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression appended with a `GLOB` query against - /// the given pattern. - public func glob(_ pattern: String) -> Expression { - return "GLOB".infix(self, pattern) - } - - /// Builds a copy of the expression appended with a `MATCH` query against - /// the given pattern. - /// - /// let title = Expression("title") - /// title.match("swift AND programming") - /// // "title" MATCH 'swift AND programming' - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression appended with a `MATCH` query - /// against the given pattern. - public func match(_ pattern: String) -> Expression { - return "MATCH".infix(self, pattern) - } - - /// Builds a copy of the expression appended with a `REGEXP` query against - /// the given pattern. - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression appended with a `REGEXP` query - /// against the given pattern. - public func regexp(_ pattern: String) -> Expression { - return "REGEXP".infix(self, pattern) - } - - /// Builds a copy of the expression appended with a `COLLATE` clause with - /// the given sequence. - /// - /// let name = Expression("name") - /// name.collate(.Nocase) - /// // "name" COLLATE NOCASE - /// - /// - Parameter collation: A collating sequence. - /// - /// - Returns: A copy of the expression appended with a `COLLATE` clause - /// with the given sequence. - public func collate(_ collation: Collation) -> Expression { - return "COLLATE".infix(self, collation) - } - - /// Builds a copy of the expression wrapped with the `ltrim` function. - /// - /// let name = Expression("name") - /// name.ltrim() - /// // ltrim("name") - /// name.ltrim([" ", "\t"]) - /// // ltrim("name", ' \t') - /// - /// - Parameter characters: A set of characters to trim. - /// - /// - Returns: A copy of the expression wrapped with the `ltrim` function. - public func ltrim(_ characters: Set? = nil) -> Expression { - guard let characters = characters else { - return wrap(self) - } - return wrap([self, String(characters)]) - } - - /// Builds a copy of the expression wrapped with the `rtrim` function. - /// - /// let name = Expression("name") - /// name.rtrim() - /// // rtrim("name") - /// name.rtrim([" ", "\t"]) - /// // rtrim("name", ' \t') - /// - /// - Parameter characters: A set of characters to trim. - /// - /// - Returns: A copy of the expression wrapped with the `rtrim` function. - public func rtrim(_ characters: Set? = nil) -> Expression { - guard let characters = characters else { - return wrap(self) - } - return wrap([self, String(characters)]) - } - - /// Builds a copy of the expression wrapped with the `trim` function. - /// - /// let name = Expression("name") - /// name.trim() - /// // trim("name") - /// name.trim([" ", "\t"]) - /// // trim("name", ' \t') - /// - /// - Parameter characters: A set of characters to trim. - /// - /// - Returns: A copy of the expression wrapped with the `trim` function. - public func trim(_ characters: Set? = nil) -> Expression { - guard let characters = characters else { - return wrap(self) - } - return wrap([self, String(characters)]) - } - - /// Builds a copy of the expression wrapped with the `replace` function. - /// - /// let email = Expression("email") - /// email.replace("@mac.com", with: "@icloud.com") - /// // replace("email", '@mac.com', '@icloud.com') - /// - /// - Parameters: - /// - /// - pattern: A pattern to match. - /// - /// - replacement: The replacement string. - /// - /// - Returns: A copy of the expression wrapped with the `replace` function. - public func replace(_ pattern: String, with replacement: String) -> Expression { - return "replace".wrap([self, pattern, replacement]) - } - - /// Builds a copy of the expression wrapped with the `substr` function. - /// - /// let title = Expression("title") - /// title.substr(-100) - /// // substr("title", -100) - /// title.substr(0, length: 100) - /// // substr("title", 0, 100) - /// - /// - Parameters: - /// - /// - location: The substring’s start index. - /// - /// - length: An optional substring length. - /// - /// - Returns: A copy of the expression wrapped with the `substr` function. - public func substring(_ location: Int, length: Int? = nil) -> Expression { - guard let length = length else { - return "substr".wrap([self, location]) - } - return "substr".wrap([self, location, length]) - } - - /// Builds a copy of the expression wrapped with the `substr` function. - /// - /// let title = Expression("title") - /// title[0..<100] - /// // substr("title", 0, 100) - /// - /// - Parameter range: The character index range of the substring. - /// - /// - Returns: A copy of the expression wrapped with the `substr` function. - public subscript(range: Range) -> Expression { - return substring(range.lowerBound, length: range.upperBound - range.lowerBound) - } - -} - -extension Collection where Iterator.Element : Value, IndexDistance == Int { - - /// Builds a copy of the expression prepended with an `IN` check against the - /// collection. - /// - /// let name = Expression("name") - /// ["alice", "betty"].contains(name) - /// // "name" IN ('alice', 'betty') - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression prepended with an `IN` check against - /// the collection. - public func contains(_ expression: Expression) -> Expression { - let templates = [String](repeating: "?", count: count).joined(separator: ", ") - return "IN".infix(expression, Expression("(\(templates))", map { $0.datatypeValue })) - } - - /// Builds a copy of the expression prepended with an `IN` check against the - /// collection. - /// - /// let name = Expression("name") - /// ["alice", "betty"].contains(name) - /// // "name" IN ('alice', 'betty') - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression prepended with an `IN` check against - /// the collection. - public func contains(_ expression: Expression) -> Expression { - let templates = [String](repeating: "?", count: count).joined(separator: ", ") - return "IN".infix(expression, Expression("(\(templates))", map { $0.datatypeValue })) - } - -} - -/// Builds a copy of the given expressions wrapped with the `ifnull` function. -/// -/// let name = Expression("name") -/// name ?? "An Anonymous Coward" -/// // ifnull("name", 'An Anonymous Coward') -/// -/// - Parameters: -/// -/// - optional: An optional expression. -/// -/// - defaultValue: A fallback value for when the optional expression is -/// `nil`. -/// -/// - Returns: A copy of the given expressions wrapped with the `ifnull` -/// function. -public func ??(optional: Expression, defaultValue: V) -> Expression { - return "ifnull".wrap([optional, defaultValue]) -} - -/// Builds a copy of the given expressions wrapped with the `ifnull` function. -/// -/// let nick = Expression("nick") -/// let name = Expression("name") -/// nick ?? name -/// // ifnull("nick", "name") -/// -/// - Parameters: -/// -/// - optional: An optional expression. -/// -/// - defaultValue: A fallback expression for when the optional expression is -/// `nil`. -/// -/// - Returns: A copy of the given expressions wrapped with the `ifnull` -/// function. -public func ??(optional: Expression, defaultValue: Expression) -> Expression { - return "ifnull".wrap([optional, defaultValue]) -} - -/// Builds a copy of the given expressions wrapped with the `ifnull` function. -/// -/// let nick = Expression("nick") -/// let name = Expression("name") -/// nick ?? name -/// // ifnull("nick", "name") -/// -/// - Parameters: -/// -/// - optional: An optional expression. -/// -/// - defaultValue: A fallback expression for when the optional expression is -/// `nil`. -/// -/// - Returns: A copy of the given expressions wrapped with the `ifnull` -/// function. -public func ??(optional: Expression, defaultValue: Expression) -> Expression { - return "ifnull".wrap([optional, defaultValue]) -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift deleted file mode 100644 index 64b54edb75..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift +++ /dev/null @@ -1,136 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -public extension Connection { - - /// Creates or redefines a custom SQL function. - /// - /// - Parameters: - /// - /// - function: The name of the function to create or redefine. - /// - /// - deterministic: Whether or not the function is deterministic (_i.e._ - /// the function always returns the same result for a given input). - /// - /// Default: `false` - /// - /// - block: A block of code to run when the function is called. - /// The assigned types must be explicit. - /// - /// - Returns: A closure returning an SQL expression to call the function. - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping () -> Z) throws -> (() -> Expression) { - let fn = try createFunction(function, 0, deterministic) { _ in block() } - return { fn([]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping () -> Z?) throws -> (() -> Expression) { - let fn = try createFunction(function, 0, deterministic) { _ in block() } - return { fn([]) } - } - - // MARK: - - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A) -> Z) throws -> ((Expression) -> Expression) { - let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0])) } - return { arg in fn([arg]) } - } - - public func createFunction(function: String, deterministic: Bool = false, _ block: @escaping (A?) -> Z) throws -> ((Expression) -> Expression) { - let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value)) } - return { arg in fn([arg]) } - } - - public func createFunction(function: String, deterministic: Bool = false, _ block: @escaping (A) -> Z?) throws -> ((Expression) -> Expression) { - let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0])) } - return { arg in fn([arg]) } - } - - public func createFunction(function: String, deterministic: Bool = false, _ block: @escaping (A?) -> Z?) throws -> ((Expression) -> Expression) { - let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value)) } - return { arg in fn([arg]) } - } - - // MARK: - - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B) -> Z) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), value(args[1])) } - return { a, b in fn([a, b]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B) -> Z) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), value(args[1])) } - return { a, b in fn([a, b]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B?) -> Z) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), args[1].map(value)) } - return { a, b in fn([a, b]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B) -> Z?) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), value(args[1])) } - return { a, b in fn([a, b]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B?) -> Z) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), args[1].map(value)) } - return { a, b in fn([a, b]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B) -> Z?) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), value(args[1])) } - return { a, b in fn([a, b]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B?) -> Z?) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), args[1].map(value)) } - return { a, b in fn([a, b]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B?) -> Z?) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), args[1].map(value)) } - return { a, b in fn([a, b]) } - } - - // MARK: - - - fileprivate func createFunction(_ function: String, _ argumentCount: UInt, _ deterministic: Bool, _ block: @escaping ([Binding?]) -> Z) throws -> (([Expressible]) -> Expression) { - createFunction(function, argumentCount: argumentCount, deterministic: deterministic) { arguments in - block(arguments).datatypeValue - } - return { arguments in - function.quote().wrap(", ".join(arguments)) - } - } - - fileprivate func createFunction(_ function: String, _ argumentCount: UInt, _ deterministic: Bool, _ block: @escaping ([Binding?]) -> Z?) throws -> (([Expressible]) -> Expression) { - createFunction(function, argumentCount: argumentCount, deterministic: deterministic) { arguments in - block(arguments)?.datatypeValue - } - return { arguments in - function.quote().wrap(", ".join(arguments)) - } - } - -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Expression.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Expression.swift deleted file mode 100644 index 3198901c55..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Expression.swift +++ /dev/null @@ -1,147 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -public protocol ExpressionType : Expressible { // extensions cannot have inheritance clauses - - associatedtype UnderlyingType = Void - - var template: String { get } - var bindings: [Binding?] { get } - - init(_ template: String, _ bindings: [Binding?]) - -} - -extension ExpressionType { - - public init(literal: String) { - self.init(literal, []) - } - - public init(_ identifier: String) { - self.init(literal: identifier.quote()) - } - - public init(_ expression: U) { - self.init(expression.template, expression.bindings) - } - -} - -/// An `Expression` represents a raw SQL fragment and any associated bindings. -public struct Expression : ExpressionType { - - public typealias UnderlyingType = Datatype - - public var template: String - public var bindings: [Binding?] - - public init(_ template: String, _ bindings: [Binding?]) { - self.template = template - self.bindings = bindings - } - -} - -public protocol Expressible { - - var expression: Expression { get } - -} - -extension Expressible { - - // naïve compiler for statements that can’t be bound, e.g., CREATE TABLE - // FIXME: use @testable and make internal - public func asSQL() -> String { - let expressed = expression - var idx = 0 - return expressed.template.characters.reduce("") { template, character in - let transcoded: String - - if character == "?" { - transcoded = transcode(expressed.bindings[idx]) - idx += 1 - } else { - transcoded = String(character) - } - return template + transcoded - } - } - -} - -extension ExpressionType { - - public var expression: Expression { - return Expression(template, bindings) - } - - public var asc: Expressible { - return " ".join([self, Expression(literal: "ASC")]) - } - - public var desc: Expressible { - return " ".join([self, Expression(literal: "DESC")]) - } - -} - -extension ExpressionType where UnderlyingType : Value { - - public init(value: UnderlyingType) { - self.init("?", [value.datatypeValue]) - } - -} - -extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value { - - public static var null: Self { - return self.init(value: nil) - } - - public init(value: UnderlyingType.WrappedType?) { - self.init("?", [value?.datatypeValue]) - } - -} - -extension Value { - - public var expression: Expression { - return Expression(value: self).expression - } - -} - -public let rowid = Expression("ROWID") - -public func cast(_ expression: Expression) -> Expression { - return Expression("CAST (\(expression.template) AS \(U.declaredDatatype))", expression.bindings) -} - -public func cast(_ expression: Expression) -> Expression { - return Expression("CAST (\(expression.template) AS \(U.declaredDatatype))", expression.bindings) -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Operators.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Operators.swift deleted file mode 100644 index fdd293be71..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Operators.swift +++ /dev/null @@ -1,541 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -// TODO: use `@warn_unused_result` by the time operator functions support it - -public func +(lhs: Expression, rhs: Expression) -> Expression { - return "||".infix(lhs, rhs) -} - -public func +(lhs: Expression, rhs: Expression) -> Expression { - return "||".infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: Expression) -> Expression { - return "||".infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: Expression) -> Expression { - return "||".infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: String) -> Expression { - return "||".infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: String) -> Expression { - return "||".infix(lhs, rhs) -} -public func +(lhs: String, rhs: Expression) -> Expression { - return "||".infix(lhs, rhs) -} -public func +(lhs: String, rhs: Expression) -> Expression { - return "||".infix(lhs, rhs) -} - -// MARK: - - -public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func +(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func +(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} - -public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func -(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func -(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func -(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func -(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} - -public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func *(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func *(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func *(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func *(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} - -public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func /(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func /(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func /(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func /(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} - -public prefix func -(rhs: Expression) -> Expression where V.Datatype : Number { - return wrap(rhs) -} -public prefix func -(rhs: Expression) -> Expression where V.Datatype : Number { - return wrap(rhs) -} - -// MARK: - - -public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func %(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func %(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func %(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func %(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} - -public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func <<(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func <<(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func <<(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func <<(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} - -public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func >>(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func >>(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func >>(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func >>(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} - -public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func &(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func &(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func &(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func &(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} - -public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func |(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func |(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func |(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func |(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} - -public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} -public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} -public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} -public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} -public func ^(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} -public func ^(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} -public func ^(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} -public func ^(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} - -public prefix func ~(rhs: Expression) -> Expression where V.Datatype == Int64 { - return wrap(rhs) -} -public prefix func ~(rhs: Expression) -> Expression where V.Datatype == Int64 { - return wrap(rhs) -} - -// MARK: - - -public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return "=".infix(lhs, rhs) -} -public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return "=".infix(lhs, rhs) -} -public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return "=".infix(lhs, rhs) -} -public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return "=".infix(lhs, rhs) -} -public func ==(lhs: Expression, rhs: V) -> Expression where V.Datatype : Equatable { - return "=".infix(lhs, rhs) -} -public func ==(lhs: Expression, rhs: V?) -> Expression where V.Datatype : Equatable { - guard let rhs = rhs else { return "IS".infix(lhs, Expression(value: nil)) } - return "=".infix(lhs, rhs) -} -public func ==(lhs: V, rhs: Expression) -> Expression where V.Datatype : Equatable { - return "=".infix(lhs, rhs) -} -public func ==(lhs: V?, rhs: Expression) -> Expression where V.Datatype : Equatable { - guard let lhs = lhs else { return "IS".infix(Expression(value: nil), rhs) } - return "=".infix(lhs, rhs) -} - -public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return infix(lhs, rhs) -} -public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return infix(lhs, rhs) -} -public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return infix(lhs, rhs) -} -public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return infix(lhs, rhs) -} -public func !=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Equatable { - return infix(lhs, rhs) -} -public func !=(lhs: Expression, rhs: V?) -> Expression where V.Datatype : Equatable { - guard let rhs = rhs else { return "IS NOT".infix(lhs, Expression(value: nil)) } - return infix(lhs, rhs) -} -public func !=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Equatable { - return infix(lhs, rhs) -} -public func !=(lhs: V?, rhs: Expression) -> Expression where V.Datatype : Equatable { - guard let lhs = lhs else { return "IS NOT".infix(Expression(value: nil), rhs) } - return infix(lhs, rhs) -} - -public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} - -public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} - -public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} - -public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} - -public func ~=(lhs: ClosedRange, rhs: Expression) -> Expression where V.Datatype : Binding & Comparable { - return Expression("\(rhs.template) BETWEEN ? AND ?", rhs.bindings + [lhs.lowerBound as? Binding, lhs.upperBound as? Binding]) -} -public func ~=(lhs: ClosedRange, rhs: Expression) -> Expression where V.Datatype : Binding & Comparable { - return Expression("\(rhs.template) BETWEEN ? AND ?", rhs.bindings + [lhs.lowerBound as? Binding, lhs.upperBound as? Binding]) -} - -// MARK: - - -public func &&(lhs: Expression, rhs: Expression) -> Expression { - return "AND".infix(lhs, rhs) -} -public func &&(lhs: Expression, rhs: Expression) -> Expression { - return "AND".infix(lhs, rhs) -} -public func &&(lhs: Expression, rhs: Expression) -> Expression { - return "AND".infix(lhs, rhs) -} -public func &&(lhs: Expression, rhs: Expression) -> Expression { - return "AND".infix(lhs, rhs) -} -public func &&(lhs: Expression, rhs: Bool) -> Expression { - return "AND".infix(lhs, rhs) -} -public func &&(lhs: Expression, rhs: Bool) -> Expression { - return "AND".infix(lhs, rhs) -} -public func &&(lhs: Bool, rhs: Expression) -> Expression { - return "AND".infix(lhs, rhs) -} -public func &&(lhs: Bool, rhs: Expression) -> Expression { - return "AND".infix(lhs, rhs) -} - -public func ||(lhs: Expression, rhs: Expression) -> Expression { - return "OR".infix(lhs, rhs) -} -public func ||(lhs: Expression, rhs: Expression) -> Expression { - return "OR".infix(lhs, rhs) -} -public func ||(lhs: Expression, rhs: Expression) -> Expression { - return "OR".infix(lhs, rhs) -} -public func ||(lhs: Expression, rhs: Expression) -> Expression { - return "OR".infix(lhs, rhs) -} -public func ||(lhs: Expression, rhs: Bool) -> Expression { - return "OR".infix(lhs, rhs) -} -public func ||(lhs: Expression, rhs: Bool) -> Expression { - return "OR".infix(lhs, rhs) -} -public func ||(lhs: Bool, rhs: Expression) -> Expression { - return "OR".infix(lhs, rhs) -} -public func ||(lhs: Bool, rhs: Expression) -> Expression { - return "OR".infix(lhs, rhs) -} - -public prefix func !(rhs: Expression) -> Expression { - return "NOT ".wrap(rhs) -} -public prefix func !(rhs: Expression) -> Expression { - return "NOT ".wrap(rhs) -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Query.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Query.swift deleted file mode 100644 index c9d2ea9cc5..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Query.swift +++ /dev/null @@ -1,1162 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -public protocol QueryType : Expressible { - - var clauses: QueryClauses { get set } - - init(_ name: String, database: String?) - -} - -public protocol SchemaType : QueryType { - - static var identifier: String { get } - -} - -extension SchemaType { - - /// Builds a copy of the query with the `SELECT` clause applied. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// let email = Expression("email") - /// - /// users.select(id, email) - /// // SELECT "id", "email" FROM "users" - /// - /// - Parameter all: A list of expressions to select. - /// - /// - Returns: A query with the given `SELECT` clause applied. - public func select(_ column1: Expressible, _ more: Expressible...) -> Self { - return select(false, [column1] + more) - } - - /// Builds a copy of the query with the `SELECT DISTINCT` clause applied. - /// - /// let users = Table("users") - /// let email = Expression("email") - /// - /// users.select(distinct: email) - /// // SELECT DISTINCT "email" FROM "users" - /// - /// - Parameter columns: A list of expressions to select. - /// - /// - Returns: A query with the given `SELECT DISTINCT` clause applied. - public func select(distinct column1: Expressible, _ more: Expressible...) -> Self { - return select(true, [column1] + more) - } - - /// Builds a copy of the query with the `SELECT` clause applied. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// let email = Expression("email") - /// - /// users.select([id, email]) - /// // SELECT "id", "email" FROM "users" - /// - /// - Parameter all: A list of expressions to select. - /// - /// - Returns: A query with the given `SELECT` clause applied. - public func select(_ all: [Expressible]) -> Self { - return select(false, all) - } - - /// Builds a copy of the query with the `SELECT DISTINCT` clause applied. - /// - /// let users = Table("users") - /// let email = Expression("email") - /// - /// users.select(distinct: [email]) - /// // SELECT DISTINCT "email" FROM "users" - /// - /// - Parameter columns: A list of expressions to select. - /// - /// - Returns: A query with the given `SELECT DISTINCT` clause applied. - public func select(distinct columns: [Expressible]) -> Self { - return select(true, columns) - } - - /// Builds a copy of the query with the `SELECT *` clause applied. - /// - /// let users = Table("users") - /// - /// users.select(*) - /// // SELECT * FROM "users" - /// - /// - Parameter star: A star literal. - /// - /// - Returns: A query with the given `SELECT *` clause applied. - public func select(_ star: Star) -> Self { - return select([star(nil, nil)]) - } - - /// Builds a copy of the query with the `SELECT DISTINCT *` clause applied. - /// - /// let users = Table("users") - /// - /// users.select(distinct: *) - /// // SELECT DISTINCT * FROM "users" - /// - /// - Parameter star: A star literal. - /// - /// - Returns: A query with the given `SELECT DISTINCT *` clause applied. - public func select(distinct star: Star) -> Self { - return select(distinct: [star(nil, nil)]) - } - - /// Builds a scalar copy of the query with the `SELECT` clause applied. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// - /// users.select(id) - /// // SELECT "id" FROM "users" - /// - /// - Parameter all: A list of expressions to select. - /// - /// - Returns: A query with the given `SELECT` clause applied. - public func select(_ column: Expression) -> ScalarQuery { - return select(false, [column]) - } - public func select(_ column: Expression) -> ScalarQuery { - return select(false, [column]) - } - - /// Builds a scalar copy of the query with the `SELECT DISTINCT` clause - /// applied. - /// - /// let users = Table("users") - /// let email = Expression("email") - /// - /// users.select(distinct: email) - /// // SELECT DISTINCT "email" FROM "users" - /// - /// - Parameter column: A list of expressions to select. - /// - /// - Returns: A query with the given `SELECT DISTINCT` clause applied. - public func select(distinct column: Expression) -> ScalarQuery { - return select(true, [column]) - } - public func select(distinct column: Expression) -> ScalarQuery { - return select(true, [column]) - } - - public var count: ScalarQuery { - return select(Expression.count(*)) - } - -} - -extension QueryType { - - fileprivate func select(_ distinct: Bool, _ columns: [Expressible]) -> Q { - var query = Q.init(clauses.from.name, database: clauses.from.database) - query.clauses = clauses - query.clauses.select = (distinct, columns) - return query - } - - // MARK: JOIN - - /// Adds a `JOIN` clause to the query. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// let posts = Table("posts") - /// let userId = Expression("user_id") - /// - /// users.join(posts, on: posts[userId] == users[id]) - /// // SELECT * FROM "users" INNER JOIN "posts" ON ("posts"."user_id" = "users"."id") - /// - /// - Parameters: - /// - /// - table: A query representing the other table. - /// - /// - condition: A boolean expression describing the join condition. - /// - /// - Returns: A query with the given `JOIN` clause applied. - public func join(_ table: QueryType, on condition: Expression) -> Self { - return join(table, on: Expression(condition)) - } - - /// Adds a `JOIN` clause to the query. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// let posts = Table("posts") - /// let userId = Expression("user_id") - /// - /// users.join(posts, on: posts[userId] == users[id]) - /// // SELECT * FROM "users" INNER JOIN "posts" ON ("posts"."user_id" = "users"."id") - /// - /// - Parameters: - /// - /// - table: A query representing the other table. - /// - /// - condition: A boolean expression describing the join condition. - /// - /// - Returns: A query with the given `JOIN` clause applied. - public func join(_ table: QueryType, on condition: Expression) -> Self { - return join(.inner, table, on: condition) - } - - /// Adds a `JOIN` clause to the query. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// let posts = Table("posts") - /// let userId = Expression("user_id") - /// - /// users.join(.LeftOuter, posts, on: posts[userId] == users[id]) - /// // SELECT * FROM "users" LEFT OUTER JOIN "posts" ON ("posts"."user_id" = "users"."id") - /// - /// - Parameters: - /// - /// - type: The `JOIN` operator. - /// - /// - table: A query representing the other table. - /// - /// - condition: A boolean expression describing the join condition. - /// - /// - Returns: A query with the given `JOIN` clause applied. - public func join(_ type: JoinType, _ table: QueryType, on condition: Expression) -> Self { - return join(type, table, on: Expression(condition)) - } - - /// Adds a `JOIN` clause to the query. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// let posts = Table("posts") - /// let userId = Expression("user_id") - /// - /// users.join(.LeftOuter, posts, on: posts[userId] == users[id]) - /// // SELECT * FROM "users" LEFT OUTER JOIN "posts" ON ("posts"."user_id" = "users"."id") - /// - /// - Parameters: - /// - /// - type: The `JOIN` operator. - /// - /// - table: A query representing the other table. - /// - /// - condition: A boolean expression describing the join condition. - /// - /// - Returns: A query with the given `JOIN` clause applied. - public func join(_ type: JoinType, _ table: QueryType, on condition: Expression) -> Self { - var query = self - query.clauses.join.append((type: type, query: table, condition: table.clauses.filters.map { condition && $0 } ?? condition as Expressible)) - return query - } - - // MARK: WHERE - - /// Adds a condition to the query’s `WHERE` clause. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// - /// users.filter(id == 1) - /// // SELECT * FROM "users" WHERE ("id" = 1) - /// - /// - Parameter condition: A boolean expression to filter on. - /// - /// - Returns: A query with the given `WHERE` clause applied. - public func filter(_ predicate: Expression) -> Self { - return filter(Expression(predicate)) - } - - /// Adds a condition to the query’s `WHERE` clause. - /// - /// let users = Table("users") - /// let age = Expression("age") - /// - /// users.filter(age >= 35) - /// // SELECT * FROM "users" WHERE ("age" >= 35) - /// - /// - Parameter condition: A boolean expression to filter on. - /// - /// - Returns: A query with the given `WHERE` clause applied. - public func filter(_ predicate: Expression) -> Self { - var query = self - query.clauses.filters = query.clauses.filters.map { $0 && predicate } ?? predicate - return query - } - - /// Adds a condition to the query’s `WHERE` clause. - /// This is an alias for `filter(predicate)` - public func `where`(_ predicate: Expression) -> Self { - return `where`(Expression(predicate)) - } - - /// Adds a condition to the query’s `WHERE` clause. - /// This is an alias for `filter(predicate)` - public func `where`(_ predicate: Expression) -> Self { - return filter(predicate) - } - - // MARK: GROUP BY - - /// Sets a `GROUP BY` clause on the query. - /// - /// - Parameter by: A list of columns to group by. - /// - /// - Returns: A query with the given `GROUP BY` clause applied. - public func group(_ by: Expressible...) -> Self { - return group(by) - } - - /// Sets a `GROUP BY` clause on the query. - /// - /// - Parameter by: A list of columns to group by. - /// - /// - Returns: A query with the given `GROUP BY` clause applied. - public func group(_ by: [Expressible]) -> Self { - return group(by, nil) - } - - /// Sets a `GROUP BY`-`HAVING` clause on the query. - /// - /// - Parameters: - /// - /// - by: A column to group by. - /// - /// - having: A condition determining which groups are returned. - /// - /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. - public func group(_ by: Expressible, having: Expression) -> Self { - return group([by], having: having) - } - - /// Sets a `GROUP BY`-`HAVING` clause on the query. - /// - /// - Parameters: - /// - /// - by: A column to group by. - /// - /// - having: A condition determining which groups are returned. - /// - /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. - public func group(_ by: Expressible, having: Expression) -> Self { - return group([by], having: having) - } - - /// Sets a `GROUP BY`-`HAVING` clause on the query. - /// - /// - Parameters: - /// - /// - by: A list of columns to group by. - /// - /// - having: A condition determining which groups are returned. - /// - /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. - public func group(_ by: [Expressible], having: Expression) -> Self { - return group(by, Expression(having)) - } - - /// Sets a `GROUP BY`-`HAVING` clause on the query. - /// - /// - Parameters: - /// - /// - by: A list of columns to group by. - /// - /// - having: A condition determining which groups are returned. - /// - /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. - public func group(_ by: [Expressible], having: Expression) -> Self { - return group(by, having) - } - - fileprivate func group(_ by: [Expressible], _ having: Expression?) -> Self { - var query = self - query.clauses.group = (by, having) - return query - } - - // MARK: ORDER BY - - /// Sets an `ORDER BY` clause on the query. - /// - /// let users = Table("users") - /// let email = Expression("email") - /// let name = Expression("name") - /// - /// users.order(email.desc, name.asc) - /// // SELECT * FROM "users" ORDER BY "email" DESC, "name" ASC - /// - /// - Parameter by: An ordered list of columns and directions to sort by. - /// - /// - Returns: A query with the given `ORDER BY` clause applied. - public func order(_ by: Expressible...) -> Self { - return order(by) - } - - /// Sets an `ORDER BY` clause on the query. - /// - /// let users = Table("users") - /// let email = Expression("email") - /// let name = Expression("name") - /// - /// users.order([email.desc, name.asc]) - /// // SELECT * FROM "users" ORDER BY "email" DESC, "name" ASC - /// - /// - Parameter by: An ordered list of columns and directions to sort by. - /// - /// - Returns: A query with the given `ORDER BY` clause applied. - public func order(_ by: [Expressible]) -> Self { - var query = self - query.clauses.order = by - return query - } - - // MARK: LIMIT/OFFSET - - /// Sets the LIMIT clause (and resets any OFFSET clause) on the query. - /// - /// let users = Table("users") - /// - /// users.limit(20) - /// // SELECT * FROM "users" LIMIT 20 - /// - /// - Parameter length: The maximum number of rows to return (or `nil` to - /// return unlimited rows). - /// - /// - Returns: A query with the given LIMIT clause applied. - public func limit(_ length: Int?) -> Self { - return limit(length, nil) - } - - /// Sets LIMIT and OFFSET clauses on the query. - /// - /// let users = Table("users") - /// - /// users.limit(20, offset: 20) - /// // SELECT * FROM "users" LIMIT 20 OFFSET 20 - /// - /// - Parameters: - /// - /// - length: The maximum number of rows to return. - /// - /// - offset: The number of rows to skip. - /// - /// - Returns: A query with the given LIMIT and OFFSET clauses applied. - public func limit(_ length: Int, offset: Int) -> Self { - return limit(length, offset) - } - - // prevents limit(nil, offset: 5) - fileprivate func limit(_ length: Int?, _ offset: Int?) -> Self { - var query = self - query.clauses.limit = length.map { ($0, offset) } - return query - } - - // MARK: - Clauses - // - // MARK: SELECT - - // MARK: - - - fileprivate var selectClause: Expressible { - return " ".join([ - Expression(literal: clauses.select.distinct ? "SELECT DISTINCT" : "SELECT"), - ", ".join(clauses.select.columns), - Expression(literal: "FROM"), - tableName(alias: true) - ]) - } - - fileprivate var joinClause: Expressible? { - guard !clauses.join.isEmpty else { - return nil - } - - return " ".join(clauses.join.map { type, query, condition in - " ".join([ - Expression(literal: "\(type.rawValue) JOIN"), - query.tableName(alias: true), - Expression(literal: "ON"), - condition - ]) - }) - } - - fileprivate var whereClause: Expressible? { - guard let filters = clauses.filters else { - return nil - } - - return " ".join([ - Expression(literal: "WHERE"), - filters - ]) - } - - fileprivate var groupByClause: Expressible? { - guard let group = clauses.group else { - return nil - } - - let groupByClause = " ".join([ - Expression(literal: "GROUP BY"), - ", ".join(group.by) - ]) - - guard let having = group.having else { - return groupByClause - } - - return " ".join([ - groupByClause, - " ".join([ - Expression(literal: "HAVING"), - having - ]) - ]) - } - - fileprivate var orderClause: Expressible? { - guard !clauses.order.isEmpty else { - return nil - } - - return " ".join([ - Expression(literal: "ORDER BY"), - ", ".join(clauses.order) - ]) - } - - fileprivate var limitOffsetClause: Expressible? { - guard let limit = clauses.limit else { - return nil - } - - let limitClause = Expression(literal: "LIMIT \(limit.length)") - - guard let offset = limit.offset else { - return limitClause - } - - return " ".join([ - limitClause, - Expression(literal: "OFFSET \(offset)") - ]) - } - - // MARK: - - - public func alias(_ aliasName: String) -> Self { - var query = self - query.clauses.from = (clauses.from.name, aliasName, clauses.from.database) - return query - } - - // MARK: - Operations - // - // MARK: INSERT - - public func insert(_ value: Setter, _ more: Setter...) -> Insert { - return insert([value] + more) - } - - public func insert(_ values: [Setter]) -> Insert { - return insert(nil, values) - } - - public func insert(or onConflict: OnConflict, _ values: Setter...) -> Insert { - return insert(or: onConflict, values) - } - - public func insert(or onConflict: OnConflict, _ values: [Setter]) -> Insert { - return insert(onConflict, values) - } - - fileprivate func insert(_ or: OnConflict?, _ values: [Setter]) -> Insert { - let insert = values.reduce((columns: [Expressible](), values: [Expressible]())) { insert, setter in - (insert.columns + [setter.column], insert.values + [setter.value]) - } - - let clauses: [Expressible?] = [ - Expression(literal: "INSERT"), - or.map { Expression(literal: "OR \($0.rawValue)") }, - Expression(literal: "INTO"), - tableName(), - "".wrap(insert.columns) as Expression, - Expression(literal: "VALUES"), - "".wrap(insert.values) as Expression, - whereClause - ] - - return Insert(" ".join(clauses.flatMap { $0 }).expression) - } - - /// Runs an `INSERT` statement against the query with `DEFAULT VALUES`. - public func insert() -> Insert { - return Insert(" ".join([ - Expression(literal: "INSERT INTO"), - tableName(), - Expression(literal: "DEFAULT VALUES") - ]).expression) - } - - /// Runs an `INSERT` statement against the query with the results of another - /// query. - /// - /// - Parameter query: A query to `SELECT` results from. - /// - /// - Returns: The number of updated rows and statement. - public func insert(_ query: QueryType) -> Update { - return Update(" ".join([ - Expression(literal: "INSERT INTO"), - tableName(), - query.expression - ]).expression) - } - - // MARK: UPDATE - - public func update(_ values: Setter...) -> Update { - return update(values) - } - - public func update(_ values: [Setter]) -> Update { - let clauses: [Expressible?] = [ - Expression(literal: "UPDATE"), - tableName(), - Expression(literal: "SET"), - ", ".join(values.map { " = ".join([$0.column, $0.value]) }), - whereClause - ] - - return Update(" ".join(clauses.flatMap { $0 }).expression) - } - - // MARK: DELETE - - public func delete() -> Delete { - let clauses: [Expressible?] = [ - Expression(literal: "DELETE FROM"), - tableName(), - whereClause - ] - - return Delete(" ".join(clauses.flatMap { $0 }).expression) - } - - // MARK: EXISTS - - public var exists: Select { - return Select(" ".join([ - Expression(literal: "SELECT EXISTS"), - "".wrap(expression) as Expression - ]).expression) - } - - // MARK: - - - /// Prefixes a column expression with the query’s table name or alias. - /// - /// - Parameter column: A column expression. - /// - /// - Returns: A column expression namespaced with the query’s table name or - /// alias. - public func namespace(_ column: Expression) -> Expression { - return Expression(".".join([tableName(), column]).expression) - } - - // FIXME: rdar://problem/18673897 // subscript… - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - - /// Prefixes a star with the query’s table name or alias. - /// - /// - Parameter star: A literal `*`. - /// - /// - Returns: A `*` expression namespaced with the query’s table name or - /// alias. - public subscript(star: Star) -> Expression { - return namespace(star(nil, nil)) - } - - // MARK: - - - // TODO: alias support - func tableName(alias aliased: Bool = false) -> Expressible { - guard let alias = clauses.from.alias , aliased else { - return database(namespace: clauses.from.alias ?? clauses.from.name) - } - - return " ".join([ - database(namespace: clauses.from.name), - Expression(literal: "AS"), - Expression(alias) - ]) - } - - func tableName(qualified: Bool) -> Expressible { - if qualified { - return tableName() - } - return Expression(clauses.from.alias ?? clauses.from.name) - } - - func database(namespace name: String) -> Expressible { - let name = Expression(name) - - guard let database = clauses.from.database else { - return name - } - - return ".".join([Expression(database), name]) - } - - public var expression: Expression { - let clauses: [Expressible?] = [ - selectClause, - joinClause, - whereClause, - groupByClause, - orderClause, - limitOffsetClause - ] - - return " ".join(clauses.flatMap { $0 }).expression - } - -} - -// TODO: decide: simplify the below with a boxed type instead - -/// Queries a collection of chainable helper functions and expressions to build -/// executable SQL statements. -public struct Table : SchemaType { - - public static let identifier = "TABLE" - - public var clauses: QueryClauses - - public init(_ name: String, database: String? = nil) { - clauses = QueryClauses(name, alias: nil, database: database) - } - -} - -public struct View : SchemaType { - - public static let identifier = "VIEW" - - public var clauses: QueryClauses - - public init(_ name: String, database: String? = nil) { - clauses = QueryClauses(name, alias: nil, database: database) - } - -} - -public struct VirtualTable : SchemaType { - - public static let identifier = "VIRTUAL TABLE" - - public var clauses: QueryClauses - - public init(_ name: String, database: String? = nil) { - clauses = QueryClauses(name, alias: nil, database: database) - } - -} - -// TODO: make `ScalarQuery` work in `QueryType.select()`, `.filter()`, etc. - -public struct ScalarQuery : QueryType { - - public var clauses: QueryClauses - - public init(_ name: String, database: String? = nil) { - clauses = QueryClauses(name, alias: nil, database: database) - } - -} - -// TODO: decide: simplify the below with a boxed type instead - -public struct Select : ExpressionType { - - public var template: String - public var bindings: [Binding?] - - public init(_ template: String, _ bindings: [Binding?]) { - self.template = template - self.bindings = bindings - } - -} - -public struct Insert : ExpressionType { - - public var template: String - public var bindings: [Binding?] - - public init(_ template: String, _ bindings: [Binding?]) { - self.template = template - self.bindings = bindings - } - -} - -public struct Update : ExpressionType { - - public var template: String - public var bindings: [Binding?] - - public init(_ template: String, _ bindings: [Binding?]) { - self.template = template - self.bindings = bindings - } - -} - -public struct Delete : ExpressionType { - - public var template: String - public var bindings: [Binding?] - - public init(_ template: String, _ bindings: [Binding?]) { - self.template = template - self.bindings = bindings - } - -} - -extension Connection { - - public func prepare(_ query: QueryType) throws -> AnySequence { - let expression = query.expression - let statement = try prepare(expression.template, expression.bindings) - - let columnNames: [String: Int] = try { - var (columnNames, idx) = ([String: Int](), 0) - column: for each in query.clauses.select.columns { - var names = each.expression.template.characters.split { $0 == "." }.map(String.init) - let column = names.removeLast() - let namespace = names.joined(separator: ".") - - func expandGlob(_ namespace: Bool) -> ((QueryType) throws -> Void) { - return { (query: QueryType) throws -> (Void) in - var q = type(of: query).init(query.clauses.from.name, database: query.clauses.from.database) - q.clauses.select = query.clauses.select - let e = q.expression - var names = try self.prepare(e.template, e.bindings).columnNames.map { $0.quote() } - if namespace { names = names.map { "\(query.tableName().expression.template).\($0)" } } - for name in names { columnNames[name] = idx; idx += 1 } - } - } - - if column == "*" { - var select = query - select.clauses.select = (false, [Expression(literal: "*") as Expressible]) - let queries = [select] + query.clauses.join.map { $0.query } - if !namespace.isEmpty { - for q in queries { - if q.tableName().expression.template == namespace { - try expandGlob(true)(q) - continue column - } - } - fatalError("no such table: \(namespace)") - } - for q in queries { - try expandGlob(query.clauses.join.count > 0)(q) - } - continue - } - - columnNames[each.expression.template] = idx - idx += 1 - } - return columnNames - }() - - return AnySequence { - AnyIterator { statement.next().map { Row(columnNames, $0) } } - } - } - - public func scalar(_ query: ScalarQuery) throws -> V { - let expression = query.expression - return value(try scalar(expression.template, expression.bindings)) - } - - public func scalar(_ query: ScalarQuery) throws -> V.ValueType? { - let expression = query.expression - guard let value = try scalar(expression.template, expression.bindings) as? V.Datatype else { return nil } - return V.fromDatatypeValue(value) - } - - public func scalar(_ query: Select) throws -> V { - let expression = query.expression - return value(try scalar(expression.template, expression.bindings)) - } - - public func scalar(_ query: Select) throws -> V.ValueType? { - let expression = query.expression - guard let value = try scalar(expression.template, expression.bindings) as? V.Datatype else { return nil } - return V.fromDatatypeValue(value) - } - - public func pluck(_ query: QueryType) throws -> Row? { - return try prepare(query.limit(1, query.clauses.limit?.offset)).makeIterator().next() - } - - /// Runs an `Insert` query. - /// - /// - SeeAlso: `QueryType.insert(value:_:)` - /// - SeeAlso: `QueryType.insert(values:)` - /// - SeeAlso: `QueryType.insert(or:_:)` - /// - SeeAlso: `QueryType.insert()` - /// - /// - Parameter query: An insert query. - /// - /// - Returns: The insert’s rowid. - @discardableResult public func run(_ query: Insert) throws -> Int64 { - let expression = query.expression - return try sync { - try self.run(expression.template, expression.bindings) - return self.lastInsertRowid - } - } - - /// Runs an `Update` query. - /// - /// - SeeAlso: `QueryType.insert(query:)` - /// - SeeAlso: `QueryType.update(values:)` - /// - /// - Parameter query: An update query. - /// - /// - Returns: The number of updated rows. - @discardableResult public func run(_ query: Update) throws -> Int { - let expression = query.expression - return try sync { - try self.run(expression.template, expression.bindings) - return self.changes - } - } - - /// Runs a `Delete` query. - /// - /// - SeeAlso: `QueryType.delete()` - /// - /// - Parameter query: A delete query. - /// - /// - Returns: The number of deleted rows. - @discardableResult public func run(_ query: Delete) throws -> Int { - let expression = query.expression - return try sync { - try self.run(expression.template, expression.bindings) - return self.changes - } - } - -} - -public struct Row { - - fileprivate let columnNames: [String: Int] - - fileprivate let values: [Binding?] - - fileprivate init(_ columnNames: [String: Int], _ values: [Binding?]) { - self.columnNames = columnNames - self.values = values - } - - /// Returns a row’s value for the given column. - /// - /// - Parameter column: An expression representing a column selected in a Query. - /// - /// - Returns: The value for the given column. - public func get(_ column: Expression) -> V { - return get(Expression(column))! - } - public func get(_ column: Expression) -> V? { - func valueAtIndex(_ idx: Int) -> V? { - guard let value = values[idx] as? V.Datatype else { return nil } - return (V.fromDatatypeValue(value) as? V)! - } - - guard let idx = columnNames[column.template] else { - let similar = Array(columnNames.keys).filter { $0.hasSuffix(".\(column.template)") } - - switch similar.count { - case 0: - fatalError("no such column '\(column.template)' in columns: \(columnNames.keys.sorted())") - case 1: - return valueAtIndex(columnNames[similar[0]]!) - default: - fatalError("ambiguous column '\(column.template)' (please disambiguate: \(similar))") - } - } - - return valueAtIndex(idx) - } - - // FIXME: rdar://problem/18673897 // subscript… - - public subscript(column: Expression) -> Blob { - return get(column) - } - public subscript(column: Expression) -> Blob? { - return get(column) - } - - public subscript(column: Expression) -> Bool { - return get(column) - } - public subscript(column: Expression) -> Bool? { - return get(column) - } - - public subscript(column: Expression) -> Double { - return get(column) - } - public subscript(column: Expression) -> Double? { - return get(column) - } - - public subscript(column: Expression) -> Int { - return get(column) - } - public subscript(column: Expression) -> Int? { - return get(column) - } - - public subscript(column: Expression) -> Int64 { - return get(column) - } - public subscript(column: Expression) -> Int64? { - return get(column) - } - - public subscript(column: Expression) -> String { - return get(column) - } - public subscript(column: Expression) -> String? { - return get(column) - } - -} - -/// Determines the join operator for a query’s `JOIN` clause. -public enum JoinType : String { - - /// A `CROSS` join. - case cross = "CROSS" - - /// An `INNER` join. - case inner = "INNER" - - /// A `LEFT OUTER` join. - case leftOuter = "LEFT OUTER" - -} - -/// ON CONFLICT resolutions. -public enum OnConflict: String { - - case replace = "REPLACE" - - case rollback = "ROLLBACK" - - case abort = "ABORT" - - case fail = "FAIL" - - case ignore = "IGNORE" - -} - -// MARK: - Private - -public struct QueryClauses { - - var select = (distinct: false, columns: [Expression(literal: "*") as Expressible]) - - var from: (name: String, alias: String?, database: String?) - - var join = [(type: JoinType, query: QueryType, condition: Expressible)]() - - var filters: Expression? - - var group: (by: [Expressible], having: Expression?)? - - var order = [Expressible]() - - var limit: (length: Int, offset: Int?)? - - fileprivate init(_ name: String, alias: String?, database: String?) { - self.from = (name, alias, database) - } - -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Schema.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Schema.swift deleted file mode 100644 index 1388170e47..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Schema.swift +++ /dev/null @@ -1,519 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -extension SchemaType { - - // MARK: - DROP TABLE / VIEW / VIRTUAL TABLE - - public func drop(ifExists: Bool = false) -> String { - return drop("TABLE", tableName(), ifExists) - } - -} - -extension Table { - - // MARK: - CREATE TABLE - - public func create(temporary: Bool = false, ifNotExists: Bool = false, block: (TableBuilder) -> Void) -> String { - let builder = TableBuilder() - - block(builder) - - let clauses: [Expressible?] = [ - create(Table.identifier, tableName(), temporary ? .Temporary : nil, ifNotExists), - "".wrap(builder.definitions) as Expression - ] - - return " ".join(clauses.flatMap { $0 }).asSQL() - } - - public func create(_ query: QueryType, temporary: Bool = false, ifNotExists: Bool = false) -> String { - let clauses: [Expressible?] = [ - create(Table.identifier, tableName(), temporary ? .Temporary : nil, ifNotExists), - Expression(literal: "AS"), - query - ] - - return " ".join(clauses.flatMap { $0 }).asSQL() - } - - // MARK: - ALTER TABLE … ADD COLUMN - - public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V) -> String { - return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, nil)) - } - - public func addColumn(_ name: Expression, check: Expression, defaultValue: V) -> String { - return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, nil)) - } - - public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V? = nil) -> String { - return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, nil)) - } - - public func addColumn(_ name: Expression, check: Expression, defaultValue: V? = nil) -> String { - return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, nil)) - } - - public func addColumn(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { - return addColumn(definition(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil)) - } - - public func addColumn(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { - return addColumn(definition(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil)) - } - - public func addColumn(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { - return addColumn(definition(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil)) - } - - public func addColumn(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { - return addColumn(definition(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil)) - } - - public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V, collate: Collation) -> String where V.Datatype == String { - return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, collate)) - } - - public func addColumn(_ name: Expression, check: Expression, defaultValue: V, collate: Collation) -> String where V.Datatype == String { - return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, collate)) - } - - public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V? = nil, collate: Collation) -> String where V.Datatype == String { - return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, collate)) - } - - public func addColumn(_ name: Expression, check: Expression, defaultValue: V? = nil, collate: Collation) -> String where V.Datatype == String { - return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, collate)) - } - - fileprivate func addColumn(_ expression: Expressible) -> String { - return " ".join([ - Expression(literal: "ALTER TABLE"), - tableName(), - Expression(literal: "ADD COLUMN"), - expression - ]).asSQL() - } - - // MARK: - ALTER TABLE … RENAME TO - - public func rename(_ to: Table) -> String { - return rename(to: to) - } - - // MARK: - CREATE INDEX - - public func createIndex(_ columns: Expressible...) -> String { - return createIndex(columns) - } - - public func createIndex(_ columns: [Expressible], unique: Bool = false, ifNotExists: Bool = false) -> String { - let clauses: [Expressible?] = [ - create("INDEX", indexName(columns), unique ? .Unique : nil, ifNotExists), - Expression(literal: "ON"), - tableName(qualified: false), - "".wrap(columns) as Expression - ] - - return " ".join(clauses.flatMap { $0 }).asSQL() - } - - // MARK: - DROP INDEX - - public func dropIndex(_ columns: Expressible...) -> String { - return dropIndex(columns) - } - - public func dropIndex(_ columns: [Expressible], ifExists: Bool = false) -> String { - return drop("INDEX", indexName(columns), ifExists) - } - - fileprivate func indexName(_ columns: [Expressible]) -> Expressible { - let string = (["index", clauses.from.name, "on"] + columns.map { $0.expression.template }).joined(separator: " ").lowercased() - - let index = string.characters.reduce("") { underscored, character in - guard character != "\"" else { - return underscored - } - guard "a"..."z" ~= character || "0"..."9" ~= character else { - return underscored + "_" - } - return underscored + String(character) - } - - return database(namespace: index) - } - -} - -extension View { - - // MARK: - CREATE VIEW - - public func create(_ query: QueryType, temporary: Bool = false, ifNotExists: Bool = false) -> String { - let clauses: [Expressible?] = [ - create(View.identifier, tableName(), temporary ? .Temporary : nil, ifNotExists), - Expression(literal: "AS"), - query - ] - - return " ".join(clauses.flatMap { $0 }).asSQL() - } - - // MARK: - DROP VIEW - - public func drop(ifExists: Bool = false) -> String { - return drop("VIEW", tableName(), ifExists) - } - -} - -extension VirtualTable { - - // MARK: - CREATE VIRTUAL TABLE - - public func create(_ using: Module, ifNotExists: Bool = false) -> String { - let clauses: [Expressible?] = [ - create(VirtualTable.identifier, tableName(), nil, ifNotExists), - Expression(literal: "USING"), - using - ] - - return " ".join(clauses.flatMap { $0 }).asSQL() - } - - // MARK: - ALTER TABLE … RENAME TO - - public func rename(_ to: VirtualTable) -> String { - return rename(to: to) - } - -} - -public final class TableBuilder { - - fileprivate var definitions = [Expressible]() - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil) { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V) { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil) { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V) { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil) { - column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression) { - column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V) { - column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil) { - column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression) { - column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V) { - column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, primaryKey: Bool, check: Expression? = nil, defaultValue: Expression? = nil) { - column(name, V.declaredDatatype, primaryKey ? .default : nil, false, false, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, primaryKey: Bool, check: Expression, defaultValue: Expression? = nil) { - column(name, V.declaredDatatype, primaryKey ? .default : nil, false, false, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, primaryKey: PrimaryKey, check: Expression? = nil) where V.Datatype == Int64 { - column(name, V.declaredDatatype, primaryKey, false, false, check, nil, nil, nil) - } - - public func column(_ name: Expression, primaryKey: PrimaryKey, check: Expression) where V.Datatype == Int64 { - column(name, V.declaredDatatype, primaryKey, false, false, check, nil, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { - column(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { - column(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { - column(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { - column(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - fileprivate func column(_ name: Expressible, _ datatype: String, _ primaryKey: PrimaryKey?, _ null: Bool, _ unique: Bool, _ check: Expressible?, _ defaultValue: Expressible?, _ references: (QueryType, Expressible)?, _ collate: Collation?) { - definitions.append(definition(name, datatype, primaryKey, null, unique, check, defaultValue, references, collate)) - } - - // MARK: - - - public func primaryKey(_ column: Expression) { - primaryKey([column]) - } - - public func primaryKey(_ compositeA: Expression, _ b: Expression) { - primaryKey([compositeA, b]) - } - - public func primaryKey(_ compositeA: Expression, _ b: Expression, _ c: Expression) { - primaryKey([compositeA, b, c]) - } - - fileprivate func primaryKey(_ composite: [Expressible]) { - definitions.append("PRIMARY KEY".prefix(composite)) - } - - public func unique(_ columns: Expressible...) { - unique(columns) - } - - public func unique(_ columns: [Expressible]) { - definitions.append("UNIQUE".prefix(columns)) - } - - public func check(_ condition: Expression) { - check(Expression(condition)) - } - - public func check(_ condition: Expression) { - definitions.append("CHECK".prefix(condition)) - } - - public enum Dependency: String { - - case noAction = "NO ACTION" - - case restrict = "RESTRICT" - - case setNull = "SET NULL" - - case setDefault = "SET DEFAULT" - - case cascade = "CASCADE" - - } - - public func foreignKey(_ column: Expression, references table: QueryType, _ other: Expression, update: Dependency? = nil, delete: Dependency? = nil) { - foreignKey(column, (table, other), update, delete) - } - - public func foreignKey(_ column: Expression, references table: QueryType, _ other: Expression, update: Dependency? = nil, delete: Dependency? = nil) { - foreignKey(column, (table, other), update, delete) - } - - public func foreignKey(_ composite: (Expression, Expression), references table: QueryType, _ other: (Expression, Expression), update: Dependency? = nil, delete: Dependency? = nil) { - let composite = ", ".join([composite.0, composite.1]) - let references = (table, ", ".join([other.0, other.1])) - - foreignKey(composite, references, update, delete) - } - - public func foreignKey(_ composite: (Expression, Expression, Expression), references table: QueryType, _ other: (Expression, Expression, Expression), update: Dependency? = nil, delete: Dependency? = nil) { - let composite = ", ".join([composite.0, composite.1, composite.2]) - let references = (table, ", ".join([other.0, other.1, other.2])) - - foreignKey(composite, references, update, delete) - } - - fileprivate func foreignKey(_ column: Expressible, _ references: (QueryType, Expressible), _ update: Dependency?, _ delete: Dependency?) { - let clauses: [Expressible?] = [ - "FOREIGN KEY".prefix(column), - reference(references), - update.map { Expression(literal: "ON UPDATE \($0.rawValue)") }, - delete.map { Expression(literal: "ON DELETE \($0.rawValue)") } - ] - - definitions.append(" ".join(clauses.flatMap { $0 })) - } - -} - -public enum PrimaryKey { - - case `default` - - case autoincrement - -} - -public struct Module { - - fileprivate let name: String - - fileprivate let arguments: [Expressible] - - public init(_ name: String, _ arguments: [Expressible]) { - self.init(name: name.quote(), arguments: arguments) - } - - init(name: String, arguments: [Expressible]) { - self.name = name - self.arguments = arguments - } - -} - -extension Module : Expressible { - - public var expression: Expression { - return name.wrap(arguments) - } - -} - -// MARK: - Private - -private extension QueryType { - - func create(_ identifier: String, _ name: Expressible, _ modifier: Modifier?, _ ifNotExists: Bool) -> Expressible { - let clauses: [Expressible?] = [ - Expression(literal: "CREATE"), - modifier.map { Expression(literal: $0.rawValue) }, - Expression(literal: identifier), - ifNotExists ? Expression(literal: "IF NOT EXISTS") : nil, - name - ] - - return " ".join(clauses.flatMap { $0 }) - } - - func rename(to: Self) -> String { - return " ".join([ - Expression(literal: "ALTER TABLE"), - tableName(), - Expression(literal: "RENAME TO"), - Expression(to.clauses.from.name) - ]).asSQL() - } - - func drop(_ identifier: String, _ name: Expressible, _ ifExists: Bool) -> String { - let clauses: [Expressible?] = [ - Expression(literal: "DROP \(identifier)"), - ifExists ? Expression(literal: "IF EXISTS") : nil, - name - ] - - return " ".join(clauses.flatMap { $0 }).asSQL() - } - -} - -private func definition(_ column: Expressible, _ datatype: String, _ primaryKey: PrimaryKey?, _ null: Bool, _ unique: Bool, _ check: Expressible?, _ defaultValue: Expressible?, _ references: (QueryType, Expressible)?, _ collate: Collation?) -> Expressible { - let clauses: [Expressible?] = [ - column, - Expression(literal: datatype), - primaryKey.map { Expression(literal: $0 == .autoincrement ? "PRIMARY KEY AUTOINCREMENT" : "PRIMARY KEY") }, - null ? nil : Expression(literal: "NOT NULL"), - unique ? Expression(literal: "UNIQUE") : nil, - check.map { " ".join([Expression(literal: "CHECK"), $0]) }, - defaultValue.map { "DEFAULT".prefix($0) }, - references.map(reference), - collate.map { " ".join([Expression(literal: "COLLATE"), $0]) } - ] - - return " ".join(clauses.flatMap { $0 }) -} - -private func reference(_ primary: (QueryType, Expressible)) -> Expressible { - return " ".join([ - Expression(literal: "REFERENCES"), - primary.0.tableName(qualified: false), - "".wrap(primary.1) as Expression - ]) -} - -private enum Modifier : String { - - case Unique = "UNIQUE" - - case Temporary = "TEMPORARY" - -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Setter.swift b/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Setter.swift deleted file mode 100644 index 86f16fcae3..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLite/Typed/Setter.swift +++ /dev/null @@ -1,277 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -precedencegroup ColumnAssignment { - associativity: left - assignment: true - lowerThan: AssignmentPrecedence -} - -infix operator <- : ColumnAssignment - -public struct Setter { - - let column: Expressible - let value: Expressible - - fileprivate init(column: Expression, value: Expression) { - self.column = column - self.value = value - } - - fileprivate init(column: Expression, value: V) { - self.column = column - self.value = value - } - - fileprivate init(column: Expression, value: Expression) { - self.column = column - self.value = value - } - - fileprivate init(column: Expression, value: Expression) { - self.column = column - self.value = value - } - - fileprivate init(column: Expression, value: V?) { - self.column = column - self.value = Expression(value: value) - } - -} - -extension Setter : Expressible { - - public var expression: Expression { - return "=".infix(column, value, wrap: false) - } - -} - -public func <-(column: Expression, value: Expression) -> Setter { - return Setter(column: column, value: value) -} -public func <-(column: Expression, value: V) -> Setter { - return Setter(column: column, value: value) -} -public func <-(column: Expression, value: Expression) -> Setter { - return Setter(column: column, value: value) -} -public func <-(column: Expression, value: Expression) -> Setter { - return Setter(column: column, value: value) -} -public func <-(column: Expression, value: V?) -> Setter { - return Setter(column: column, value: value) -} - -public func +=(column: Expression, value: Expression) -> Setter { - return column <- column + value -} -public func +=(column: Expression, value: String) -> Setter { - return column <- column + value -} -public func +=(column: Expression, value: Expression) -> Setter { - return column <- column + value -} -public func +=(column: Expression, value: Expression) -> Setter { - return column <- column + value -} -public func +=(column: Expression, value: String) -> Setter { - return column <- column + value -} - -public func +=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column + value -} -public func +=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column + value -} -public func +=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column + value -} -public func +=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column + value -} -public func +=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column + value -} - -public func -=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column - value -} -public func -=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column - value -} -public func -=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column - value -} -public func -=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column - value -} -public func -=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column - value -} - -public func *=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column * value -} -public func *=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column * value -} -public func *=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column * value -} -public func *=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column * value -} -public func *=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column * value -} - -public func /=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column / value -} -public func /=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column / value -} -public func /=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column / value -} -public func /=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column / value -} -public func /=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column / value -} - -public func %=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column % value -} -public func %=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column % value -} -public func %=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column % value -} -public func %=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column % value -} -public func %=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column % value -} - -public func <<=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column << value -} -public func <<=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column << value -} -public func <<=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column << value -} -public func <<=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column << value -} -public func <<=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column << value -} - -public func >>=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column >> value -} -public func >>=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column >> value -} -public func >>=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column >> value -} -public func >>=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column >> value -} -public func >>=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column >> value -} - -public func &=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column & value -} -public func &=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column & value -} -public func &=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column & value -} -public func &=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column & value -} -public func &=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column & value -} - -public func |=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column | value -} -public func |=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column | value -} -public func |=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column | value -} -public func |=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column | value -} -public func |=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column | value -} - -public func ^=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column ^ value -} -public func ^=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column ^ value -} -public func ^=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column ^ value -} -public func ^=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column ^ value -} -public func ^=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column ^ value -} - -public postfix func ++(column: Expression) -> Setter where V.Datatype == Int64 { - return Expression(column) += 1 -} -public postfix func ++(column: Expression) -> Setter where V.Datatype == Int64 { - return Expression(column) += 1 -} - -public postfix func --(column: Expression) -> Setter where V.Datatype == Int64 { - return Expression(column) -= 1 -} -public postfix func --(column: Expression) -> Setter where V.Datatype == Int64 { - return Expression(column) -= 1 -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m b/Example/Pods/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m deleted file mode 100644 index d8fe6b683c..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m +++ /dev/null @@ -1,138 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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 "SQLite-Bridging.h" -#import "fts3_tokenizer.h" - -#pragma mark - FTS - -typedef struct __SQLiteTokenizer { - sqlite3_tokenizer base; - __unsafe_unretained _SQLiteTokenizerNextCallback callback; -} __SQLiteTokenizer; - -typedef struct __SQLiteTokenizerCursor { - void * base; - const char * input; - int inputOffset; - int inputLength; - int idx; -} __SQLiteTokenizerCursor; - -static NSMutableDictionary * __SQLiteTokenizerMap; - -static int __SQLiteTokenizerCreate(int argc, const char * const * argv, sqlite3_tokenizer ** ppTokenizer) { - __SQLiteTokenizer * tokenizer = (__SQLiteTokenizer *)sqlite3_malloc(sizeof(__SQLiteTokenizer)); - if (!tokenizer) { - return SQLITE_NOMEM; - } - memset(tokenizer, 0, sizeof(* tokenizer)); - - NSString * key = [NSString stringWithUTF8String:argv[0]]; - tokenizer->callback = [__SQLiteTokenizerMap objectForKey:key]; - if (!tokenizer->callback) { - return SQLITE_ERROR; - } - - *ppTokenizer = &tokenizer->base; - return SQLITE_OK; -} - -static int __SQLiteTokenizerDestroy(sqlite3_tokenizer * pTokenizer) { - sqlite3_free(pTokenizer); - return SQLITE_OK; -} - -static int __SQLiteTokenizerOpen(sqlite3_tokenizer * pTokenizer, const char * pInput, int nBytes, sqlite3_tokenizer_cursor ** ppCursor) { - __SQLiteTokenizerCursor * cursor = (__SQLiteTokenizerCursor *)sqlite3_malloc(sizeof(__SQLiteTokenizerCursor)); - if (!cursor) { - return SQLITE_NOMEM; - } - - cursor->input = pInput; - cursor->inputOffset = 0; - cursor->inputLength = 0; - cursor->idx = 0; - - *ppCursor = (sqlite3_tokenizer_cursor *)cursor; - return SQLITE_OK; -} - -static int __SQLiteTokenizerClose(sqlite3_tokenizer_cursor * pCursor) { - sqlite3_free(pCursor); - return SQLITE_OK; -} - -static int __SQLiteTokenizerNext(sqlite3_tokenizer_cursor * pCursor, const char ** ppToken, int * pnBytes, int * piStartOffset, int * piEndOffset, int * piPosition) { - __SQLiteTokenizerCursor * cursor = (__SQLiteTokenizerCursor *)pCursor; - __SQLiteTokenizer * tokenizer = (__SQLiteTokenizer *)cursor->base; - - cursor->inputOffset += cursor->inputLength; - const char * input = cursor->input + cursor->inputOffset; - const char * token = [tokenizer->callback(input, &cursor->inputOffset, &cursor->inputLength) cStringUsingEncoding:NSUTF8StringEncoding]; - if (!token) { - return SQLITE_DONE; - } - - *ppToken = token; - *pnBytes = (int)strlen(token); - *piStartOffset = cursor->inputOffset; - *piEndOffset = cursor->inputOffset + cursor->inputLength; - *piPosition = cursor->idx++; - return SQLITE_OK; -} - -static const sqlite3_tokenizer_module __SQLiteTokenizerModule = { - 0, - __SQLiteTokenizerCreate, - __SQLiteTokenizerDestroy, - __SQLiteTokenizerOpen, - __SQLiteTokenizerClose, - __SQLiteTokenizerNext -}; - -int _SQLiteRegisterTokenizer(SQLiteHandle * db, const char * moduleName, const char * submoduleName, _SQLiteTokenizerNextCallback callback) { - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - __SQLiteTokenizerMap = [NSMutableDictionary new]; - }); - - sqlite3_stmt * stmt; - int status = sqlite3_prepare_v2((sqlite3 *)db, "SELECT fts3_tokenizer(?, ?)", -1, &stmt, 0); - if (status != SQLITE_OK ){ - return status; - } - const sqlite3_tokenizer_module * pModule = &__SQLiteTokenizerModule; - sqlite3_bind_text(stmt, 1, moduleName, -1, SQLITE_STATIC); - sqlite3_bind_blob(stmt, 2, &pModule, sizeof(pModule), SQLITE_STATIC); - sqlite3_step(stmt); - status = sqlite3_finalize(stmt); - if (status != SQLITE_OK ){ - return status; - } - - [__SQLiteTokenizerMap setObject:[callback copy] forKey:[NSString stringWithUTF8String:submoduleName]]; - - return SQLITE_OK; -} diff --git a/Example/Pods/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h b/Example/Pods/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h deleted file mode 100644 index d8a1e44b47..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h +++ /dev/null @@ -1,161 +0,0 @@ -/* -** 2006 July 10 -** -** The author disclaims copyright to this source code. -** -************************************************************************* -** Defines the interface to tokenizers used by fulltext-search. There -** are three basic components: -** -** sqlite3_tokenizer_module is a singleton defining the tokenizer -** interface functions. This is essentially the class structure for -** tokenizers. -** -** sqlite3_tokenizer is used to define a particular tokenizer, perhaps -** including customization information defined at creation time. -** -** sqlite3_tokenizer_cursor is generated by a tokenizer to generate -** tokens from a particular input. -*/ -#ifndef _FTS3_TOKENIZER_H_ -#define _FTS3_TOKENIZER_H_ - -/* TODO(shess) Only used for SQLITE_OK and SQLITE_DONE at this time. -** If tokenizers are to be allowed to call sqlite3_*() functions, then -** we will need a way to register the API consistently. -*/ -#import "sqlite3.h" - -/* -** Structures used by the tokenizer interface. When a new tokenizer -** implementation is registered, the caller provides a pointer to -** an sqlite3_tokenizer_module containing pointers to the callback -** functions that make up an implementation. -** -** When an fts3 table is created, it passes any arguments passed to -** the tokenizer clause of the CREATE VIRTUAL TABLE statement to the -** sqlite3_tokenizer_module.xCreate() function of the requested tokenizer -** implementation. The xCreate() function in turn returns an -** sqlite3_tokenizer structure representing the specific tokenizer to -** be used for the fts3 table (customized by the tokenizer clause arguments). -** -** To tokenize an input buffer, the sqlite3_tokenizer_module.xOpen() -** method is called. It returns an sqlite3_tokenizer_cursor object -** that may be used to tokenize a specific input buffer based on -** the tokenization rules supplied by a specific sqlite3_tokenizer -** object. -*/ -typedef struct sqlite3_tokenizer_module sqlite3_tokenizer_module; -typedef struct sqlite3_tokenizer sqlite3_tokenizer; -typedef struct sqlite3_tokenizer_cursor sqlite3_tokenizer_cursor; - -struct sqlite3_tokenizer_module { - - /* - ** Structure version. Should always be set to 0 or 1. - */ - int iVersion; - - /* - ** Create a new tokenizer. The values in the argv[] array are the - ** arguments passed to the "tokenizer" clause of the CREATE VIRTUAL - ** TABLE statement that created the fts3 table. For example, if - ** the following SQL is executed: - ** - ** CREATE .. USING fts3( ... , tokenizer arg1 arg2) - ** - ** then argc is set to 2, and the argv[] array contains pointers - ** to the strings "arg1" and "arg2". - ** - ** This method should return either SQLITE_OK (0), or an SQLite error - ** code. If SQLITE_OK is returned, then *ppTokenizer should be set - ** to point at the newly created tokenizer structure. The generic - ** sqlite3_tokenizer.pModule variable should not be initialized by - ** this callback. The caller will do so. - */ - int (*xCreate)( - int argc, /* Size of argv array */ - const char *const*argv, /* Tokenizer argument strings */ - sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ - ); - - /* - ** Destroy an existing tokenizer. The fts3 module calls this method - ** exactly once for each successful call to xCreate(). - */ - int (*xDestroy)(sqlite3_tokenizer *pTokenizer); - - /* - ** Create a tokenizer cursor to tokenize an input buffer. The caller - ** is responsible for ensuring that the input buffer remains valid - ** until the cursor is closed (using the xClose() method). - */ - int (*xOpen)( - sqlite3_tokenizer *pTokenizer, /* Tokenizer object */ - const char *pInput, int nBytes, /* Input buffer */ - sqlite3_tokenizer_cursor **ppCursor /* OUT: Created tokenizer cursor */ - ); - - /* - ** Destroy an existing tokenizer cursor. The fts3 module calls this - ** method exactly once for each successful call to xOpen(). - */ - int (*xClose)(sqlite3_tokenizer_cursor *pCursor); - - /* - ** Retrieve the next token from the tokenizer cursor pCursor. This - ** method should either return SQLITE_OK and set the values of the - ** "OUT" variables identified below, or SQLITE_DONE to indicate that - ** the end of the buffer has been reached, or an SQLite error code. - ** - ** *ppToken should be set to point at a buffer containing the - ** normalized version of the token (i.e. after any case-folding and/or - ** stemming has been performed). *pnBytes should be set to the length - ** of this buffer in bytes. The input text that generated the token is - ** identified by the byte offsets returned in *piStartOffset and - ** *piEndOffset. *piStartOffset should be set to the index of the first - ** byte of the token in the input buffer. *piEndOffset should be set - ** to the index of the first byte just past the end of the token in - ** the input buffer. - ** - ** The buffer *ppToken is set to point at is managed by the tokenizer - ** implementation. It is only required to be valid until the next call - ** to xNext() or xClose(). - */ - /* TODO(shess) current implementation requires pInput to be - ** nul-terminated. This should either be fixed, or pInput/nBytes - ** should be converted to zInput. - */ - int (*xNext)( - sqlite3_tokenizer_cursor *pCursor, /* Tokenizer cursor */ - const char **ppToken, int *pnBytes, /* OUT: Normalized text for token */ - int *piStartOffset, /* OUT: Byte offset of token in input buffer */ - int *piEndOffset, /* OUT: Byte offset of end of token in input buffer */ - int *piPosition /* OUT: Number of tokens returned before this one */ - ); - - /*********************************************************************** - ** Methods below this point are only available if iVersion>=1. - */ - - /* - ** Configure the language id of a tokenizer cursor. - */ - int (*xLanguageid)(sqlite3_tokenizer_cursor *pCsr, int iLangid); -}; - -struct sqlite3_tokenizer { - const sqlite3_tokenizer_module *pModule; /* The module for this tokenizer */ - /* Tokenizer implementations will typically add additional fields */ -}; - -struct sqlite3_tokenizer_cursor { - sqlite3_tokenizer *pTokenizer; /* Tokenizer for this cursor. */ - /* Tokenizer implementations will typically add additional fields */ -}; - -int fts3_global_term_cnt(int iTerm, int iCol); -int fts3_term_cnt(int iTerm, int iCol); - - -#endif /* _FTS3_TOKENIZER_H_ */ diff --git a/Example/Pods/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h b/Example/Pods/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h deleted file mode 100644 index d15e8d56d6..0000000000 --- a/Example/Pods/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -@import Foundation; - -#ifndef COCOAPODS -#import "sqlite3.h" -#endif - -typedef struct SQLiteHandle SQLiteHandle; // CocoaPods workaround - -NS_ASSUME_NONNULL_BEGIN -typedef NSString * _Nullable (^_SQLiteTokenizerNextCallback)(const char * input, int * inputOffset, int * inputLength); -int _SQLiteRegisterTokenizer(SQLiteHandle * db, const char * module, const char * tokenizer, _Nullable _SQLiteTokenizerNextCallback callback); -NS_ASSUME_NONNULL_END - diff --git a/Example/Pods/Target Support Files/Apollo/Apollo-dummy.m b/Example/Pods/Target Support Files/Apollo/Apollo-dummy.m deleted file mode 100644 index 843221b8be..0000000000 --- a/Example/Pods/Target Support Files/Apollo/Apollo-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Apollo : NSObject -@end -@implementation PodsDummy_Apollo -@end diff --git a/Example/Pods/Target Support Files/Apollo/Apollo-prefix.pch b/Example/Pods/Target Support Files/Apollo/Apollo-prefix.pch deleted file mode 100644 index beb2a24418..0000000000 --- a/Example/Pods/Target Support Files/Apollo/Apollo-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Example/Pods/Target Support Files/Apollo/Apollo-umbrella.h b/Example/Pods/Target Support Files/Apollo/Apollo-umbrella.h deleted file mode 100644 index ae2de99bd2..0000000000 --- a/Example/Pods/Target Support Files/Apollo/Apollo-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double ApolloVersionNumber; -FOUNDATION_EXPORT const unsigned char ApolloVersionString[]; - diff --git a/Example/Pods/Target Support Files/Apollo/Apollo.modulemap b/Example/Pods/Target Support Files/Apollo/Apollo.modulemap deleted file mode 100644 index 008f0e5d56..0000000000 --- a/Example/Pods/Target Support Files/Apollo/Apollo.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Apollo { - umbrella header "Apollo-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Apollo/Apollo.xcconfig b/Example/Pods/Target Support Files/Apollo/Apollo.xcconfig deleted file mode 100644 index 07dd75d24b..0000000000 --- a/Example/Pods/Target Support Files/Apollo/Apollo.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Apollo -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Example/Pods/Target Support Files/Apollo/Info.plist b/Example/Pods/Target Support Files/Apollo/Info.plist deleted file mode 100644 index a815dbde4c..0000000000 --- a/Example/Pods/Target Support Files/Apollo/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 0.5.6 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Info.plist b/Example/Pods/Target Support Files/Pods-ApolloExample/Info.plist deleted file mode 100644 index 2243fe6e27..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloExample/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.markdown deleted file mode 100644 index 7d16a9fef3..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.markdown +++ /dev/null @@ -1,53 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: - -## Apollo - -The MIT License (MIT) - -Copyright (c) 2016 Meteor Development Group, Inc. - -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. - - -## SQLite.swift - -(The MIT License) - -Copyright (c) 2014-2015 Stephen Celis () - -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. - -Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.plist deleted file mode 100644 index 1ffa30b22d..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-acknowledgements.plist +++ /dev/null @@ -1,91 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - The MIT License (MIT) - -Copyright (c) 2016 Meteor Development Group, Inc. - -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. - - License - MIT - Title - Apollo - Type - PSGroupSpecifier - - - FooterText - (The MIT License) - -Copyright (c) 2014-2015 Stephen Celis (<stephen@stephencelis.com>) - -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. - - License - MIT - Title - SQLite.swift - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - https://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-dummy.m b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-dummy.m deleted file mode 100644 index fc883816e5..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_ApolloExample : NSObject -@end -@implementation PodsDummy_Pods_ApolloExample -@end diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-frameworks.sh b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-frameworks.sh deleted file mode 100755 index bf3790a5fb..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-frameworks.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/sh -set -e - -echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" -mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - -SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" - -install_framework() -{ - if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then - local source="${BUILT_PRODUCTS_DIR}/$1" - elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then - local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" - elif [ -r "$1" ]; then - local source="$1" - fi - - local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - - if [ -L "${source}" ]; then - echo "Symlinked..." - source="$(readlink "${source}")" - fi - - # use filter instead of exclude so missing patterns dont' throw errors - echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" - - local basename - basename="$(basename -s .framework "$1")" - binary="${destination}/${basename}.framework/${basename}" - if ! [ -r "$binary" ]; then - binary="${destination}/${basename}" - fi - - # Strip invalid architectures so "fat" simulator / device frameworks work on device - if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then - strip_invalid_archs "$binary" - fi - - # Resign the code if required by the build settings to avoid unstable apps - code_sign_if_enabled "${destination}/$(basename "$1")" - - # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. - if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then - local swift_runtime_libs - swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) - for lib in $swift_runtime_libs; do - echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" - rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" - code_sign_if_enabled "${destination}/${lib}" - done - fi -} - -# Signs a framework with the provided identity -code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then - # Use the current code_sign_identitiy - echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" - - if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - code_sign_cmd="$code_sign_cmd &" - fi - echo "$code_sign_cmd" - eval "$code_sign_cmd" - fi -} - -# Strip invalid architectures -strip_invalid_archs() { - binary="$1" - # Get architectures for current file - archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" - stripped="" - for arch in $archs; do - if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then - # Strip non-valid architectures in-place - lipo -remove "$arch" -output "$binary" "$binary" || exit 1 - stripped="$stripped $arch" - fi - done - if [[ "$stripped" ]]; then - echo "Stripped $binary of architectures:$stripped" - fi -} - - -if [[ "$CONFIGURATION" == "Debug" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/Apollo/Apollo.framework" - install_framework "$BUILT_PRODUCTS_DIR/SQLite.swift/SQLite.framework" -fi -if [[ "$CONFIGURATION" == "Release" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/Apollo/Apollo.framework" - install_framework "$BUILT_PRODUCTS_DIR/SQLite.swift/SQLite.framework" -fi -if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - wait -fi diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-resources.sh b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-resources.sh deleted file mode 100755 index 4602c68ab6..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-resources.sh +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/sh -set -e - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -case "${TARGETED_DEVICE_FAMILY}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - 3) - TARGET_DEVICE_ARGS="--target-device tv" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; -esac - -install_resource() -{ - if [[ "$1" = /* ]] ; then - RESOURCE_PATH="$1" - else - RESOURCE_PATH="${PODS_ROOT}/$1" - fi - if [[ ! -e "$RESOURCE_PATH" ]] ; then - cat << EOM -error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. -EOM - exit 1 - fi - case $RESOURCE_PATH in - *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" - xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - *) - echo "$RESOURCE_PATH" - echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" - ;; - esac -} - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] -then - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "${PODS_ROOT}*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-umbrella.h b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-umbrella.h deleted file mode 100644 index 7256f92c0b..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double Pods_ApolloExampleVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_ApolloExampleVersionString[]; - diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.debug.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.debug.xcconfig deleted file mode 100644 index 236fc5d6bb..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.debug.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.modulemap b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.modulemap deleted file mode 100644 index 5a3591cdde..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_ApolloExample { - umbrella header "Pods-ApolloExample-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.release.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.release.xcconfig deleted file mode 100644 index 236fc5d6bb..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloExample/Pods-ApolloExample.release.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Info.plist b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Info.plist deleted file mode 100644 index 2243fe6e27..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.markdown deleted file mode 100644 index 7d16a9fef3..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.markdown +++ /dev/null @@ -1,53 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: - -## Apollo - -The MIT License (MIT) - -Copyright (c) 2016 Meteor Development Group, Inc. - -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. - - -## SQLite.swift - -(The MIT License) - -Copyright (c) 2014-2015 Stephen Celis () - -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. - -Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.plist deleted file mode 100644 index 1ffa30b22d..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-acknowledgements.plist +++ /dev/null @@ -1,91 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - The MIT License (MIT) - -Copyright (c) 2016 Meteor Development Group, Inc. - -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. - - License - MIT - Title - Apollo - Type - PSGroupSpecifier - - - FooterText - (The MIT License) - -Copyright (c) 2014-2015 Stephen Celis (<stephen@stephencelis.com>) - -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. - - License - MIT - Title - SQLite.swift - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - https://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-dummy.m b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-dummy.m deleted file mode 100644 index 2b1e440571..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_ApolloPerformanceTests : NSObject -@end -@implementation PodsDummy_Pods_ApolloPerformanceTests -@end diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-frameworks.sh b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-frameworks.sh deleted file mode 100755 index bf3790a5fb..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-frameworks.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/sh -set -e - -echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" -mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - -SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" - -install_framework() -{ - if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then - local source="${BUILT_PRODUCTS_DIR}/$1" - elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then - local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" - elif [ -r "$1" ]; then - local source="$1" - fi - - local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - - if [ -L "${source}" ]; then - echo "Symlinked..." - source="$(readlink "${source}")" - fi - - # use filter instead of exclude so missing patterns dont' throw errors - echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" - - local basename - basename="$(basename -s .framework "$1")" - binary="${destination}/${basename}.framework/${basename}" - if ! [ -r "$binary" ]; then - binary="${destination}/${basename}" - fi - - # Strip invalid architectures so "fat" simulator / device frameworks work on device - if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then - strip_invalid_archs "$binary" - fi - - # Resign the code if required by the build settings to avoid unstable apps - code_sign_if_enabled "${destination}/$(basename "$1")" - - # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. - if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then - local swift_runtime_libs - swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) - for lib in $swift_runtime_libs; do - echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" - rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" - code_sign_if_enabled "${destination}/${lib}" - done - fi -} - -# Signs a framework with the provided identity -code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then - # Use the current code_sign_identitiy - echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" - - if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - code_sign_cmd="$code_sign_cmd &" - fi - echo "$code_sign_cmd" - eval "$code_sign_cmd" - fi -} - -# Strip invalid architectures -strip_invalid_archs() { - binary="$1" - # Get architectures for current file - archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" - stripped="" - for arch in $archs; do - if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then - # Strip non-valid architectures in-place - lipo -remove "$arch" -output "$binary" "$binary" || exit 1 - stripped="$stripped $arch" - fi - done - if [[ "$stripped" ]]; then - echo "Stripped $binary of architectures:$stripped" - fi -} - - -if [[ "$CONFIGURATION" == "Debug" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/Apollo/Apollo.framework" - install_framework "$BUILT_PRODUCTS_DIR/SQLite.swift/SQLite.framework" -fi -if [[ "$CONFIGURATION" == "Release" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/Apollo/Apollo.framework" - install_framework "$BUILT_PRODUCTS_DIR/SQLite.swift/SQLite.framework" -fi -if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - wait -fi diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-resources.sh b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-resources.sh deleted file mode 100755 index 4602c68ab6..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-resources.sh +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/sh -set -e - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -case "${TARGETED_DEVICE_FAMILY}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - 3) - TARGET_DEVICE_ARGS="--target-device tv" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; -esac - -install_resource() -{ - if [[ "$1" = /* ]] ; then - RESOURCE_PATH="$1" - else - RESOURCE_PATH="${PODS_ROOT}/$1" - fi - if [[ ! -e "$RESOURCE_PATH" ]] ; then - cat << EOM -error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. -EOM - exit 1 - fi - case $RESOURCE_PATH in - *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" - xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - *) - echo "$RESOURCE_PATH" - echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" - ;; - esac -} - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] -then - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "${PODS_ROOT}*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-umbrella.h b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-umbrella.h deleted file mode 100644 index 4bdc172cb3..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double Pods_ApolloPerformanceTestsVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_ApolloPerformanceTestsVersionString[]; - diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.debug.xcconfig deleted file mode 100644 index 236fc5d6bb..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.debug.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.modulemap b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.modulemap deleted file mode 100644 index 754e100acc..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_ApolloPerformanceTests { - umbrella header "Pods-ApolloPerformanceTests-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.release.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.release.xcconfig deleted file mode 100644 index 236fc5d6bb..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloPerformanceTests/Pods-ApolloPerformanceTests.release.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Info.plist b/Example/Pods/Target Support Files/Pods-ApolloTests/Info.plist deleted file mode 100644 index 2243fe6e27..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloTests/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.markdown deleted file mode 100644 index 7d16a9fef3..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.markdown +++ /dev/null @@ -1,53 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: - -## Apollo - -The MIT License (MIT) - -Copyright (c) 2016 Meteor Development Group, Inc. - -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. - - -## SQLite.swift - -(The MIT License) - -Copyright (c) 2014-2015 Stephen Celis () - -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. - -Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.plist deleted file mode 100644 index 1ffa30b22d..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-acknowledgements.plist +++ /dev/null @@ -1,91 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - The MIT License (MIT) - -Copyright (c) 2016 Meteor Development Group, Inc. - -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. - - License - MIT - Title - Apollo - Type - PSGroupSpecifier - - - FooterText - (The MIT License) - -Copyright (c) 2014-2015 Stephen Celis (<stephen@stephencelis.com>) - -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. - - License - MIT - Title - SQLite.swift - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - https://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-dummy.m b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-dummy.m deleted file mode 100644 index 11f165ecca..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_ApolloTests : NSObject -@end -@implementation PodsDummy_Pods_ApolloTests -@end diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-frameworks.sh b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-frameworks.sh deleted file mode 100755 index bf3790a5fb..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-frameworks.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/sh -set -e - -echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" -mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - -SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" - -install_framework() -{ - if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then - local source="${BUILT_PRODUCTS_DIR}/$1" - elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then - local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" - elif [ -r "$1" ]; then - local source="$1" - fi - - local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - - if [ -L "${source}" ]; then - echo "Symlinked..." - source="$(readlink "${source}")" - fi - - # use filter instead of exclude so missing patterns dont' throw errors - echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" - - local basename - basename="$(basename -s .framework "$1")" - binary="${destination}/${basename}.framework/${basename}" - if ! [ -r "$binary" ]; then - binary="${destination}/${basename}" - fi - - # Strip invalid architectures so "fat" simulator / device frameworks work on device - if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then - strip_invalid_archs "$binary" - fi - - # Resign the code if required by the build settings to avoid unstable apps - code_sign_if_enabled "${destination}/$(basename "$1")" - - # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. - if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then - local swift_runtime_libs - swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) - for lib in $swift_runtime_libs; do - echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" - rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" - code_sign_if_enabled "${destination}/${lib}" - done - fi -} - -# Signs a framework with the provided identity -code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then - # Use the current code_sign_identitiy - echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" - - if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - code_sign_cmd="$code_sign_cmd &" - fi - echo "$code_sign_cmd" - eval "$code_sign_cmd" - fi -} - -# Strip invalid architectures -strip_invalid_archs() { - binary="$1" - # Get architectures for current file - archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" - stripped="" - for arch in $archs; do - if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then - # Strip non-valid architectures in-place - lipo -remove "$arch" -output "$binary" "$binary" || exit 1 - stripped="$stripped $arch" - fi - done - if [[ "$stripped" ]]; then - echo "Stripped $binary of architectures:$stripped" - fi -} - - -if [[ "$CONFIGURATION" == "Debug" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/Apollo/Apollo.framework" - install_framework "$BUILT_PRODUCTS_DIR/SQLite.swift/SQLite.framework" -fi -if [[ "$CONFIGURATION" == "Release" ]]; then - install_framework "$BUILT_PRODUCTS_DIR/Apollo/Apollo.framework" - install_framework "$BUILT_PRODUCTS_DIR/SQLite.swift/SQLite.framework" -fi -if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - wait -fi diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-resources.sh b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-resources.sh deleted file mode 100755 index 4602c68ab6..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-resources.sh +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/sh -set -e - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -case "${TARGETED_DEVICE_FAMILY}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - 3) - TARGET_DEVICE_ARGS="--target-device tv" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; -esac - -install_resource() -{ - if [[ "$1" = /* ]] ; then - RESOURCE_PATH="$1" - else - RESOURCE_PATH="${PODS_ROOT}/$1" - fi - if [[ ! -e "$RESOURCE_PATH" ]] ; then - cat << EOM -error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. -EOM - exit 1 - fi - case $RESOURCE_PATH in - *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" - xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - *) - echo "$RESOURCE_PATH" - echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" - ;; - esac -} - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] -then - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "${PODS_ROOT}*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-umbrella.h b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-umbrella.h deleted file mode 100644 index b465f576ec..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double Pods_ApolloTestsVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_ApolloTestsVersionString[]; - diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.debug.xcconfig deleted file mode 100644 index 236fc5d6bb..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.debug.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap deleted file mode 100644 index 2a65d3711a..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_ApolloTests { - umbrella header "Pods-ApolloTests-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.release.xcconfig b/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.release.xcconfig deleted file mode 100644 index 236fc5d6bb..0000000000 --- a/Example/Pods/Target Support Files/Pods-ApolloTests/Pods-ApolloTests.release.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Info.plist b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Info.plist deleted file mode 100644 index 2243fe6e27..0000000000 --- a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.markdown deleted file mode 100644 index 7d16a9fef3..0000000000 --- a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.markdown +++ /dev/null @@ -1,53 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: - -## Apollo - -The MIT License (MIT) - -Copyright (c) 2016 Meteor Development Group, Inc. - -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. - - -## SQLite.swift - -(The MIT License) - -Copyright (c) 2014-2015 Stephen Celis () - -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. - -Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.plist deleted file mode 100644 index 1ffa30b22d..0000000000 --- a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-acknowledgements.plist +++ /dev/null @@ -1,91 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - The MIT License (MIT) - -Copyright (c) 2016 Meteor Development Group, Inc. - -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. - - License - MIT - Title - Apollo - Type - PSGroupSpecifier - - - FooterText - (The MIT License) - -Copyright (c) 2014-2015 Stephen Celis (<stephen@stephencelis.com>) - -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. - - License - MIT - Title - SQLite.swift - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - https://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-dummy.m b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-dummy.m deleted file mode 100644 index 61ba2e08b7..0000000000 --- a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_StarWarsAPI : NSObject -@end -@implementation PodsDummy_Pods_StarWarsAPI -@end diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-resources.sh b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-resources.sh deleted file mode 100755 index 4602c68ab6..0000000000 --- a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-resources.sh +++ /dev/null @@ -1,99 +0,0 @@ -#!/bin/sh -set -e - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -case "${TARGETED_DEVICE_FAMILY}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - 3) - TARGET_DEVICE_ARGS="--target-device tv" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; -esac - -install_resource() -{ - if [[ "$1" = /* ]] ; then - RESOURCE_PATH="$1" - else - RESOURCE_PATH="${PODS_ROOT}/$1" - fi - if [[ ! -e "$RESOURCE_PATH" ]] ; then - cat << EOM -error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. -EOM - exit 1 - fi - case $RESOURCE_PATH in - *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" - xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - *) - echo "$RESOURCE_PATH" - echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" - ;; - esac -} - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] -then - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "${PODS_ROOT}*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-umbrella.h b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-umbrella.h deleted file mode 100644 index d5a8a0d2bb..0000000000 --- a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double Pods_StarWarsAPIVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_StarWarsAPIVersionString[]; - diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.debug.xcconfig b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.debug.xcconfig deleted file mode 100644 index 7913b37597..0000000000 --- a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.debug.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.modulemap b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.modulemap deleted file mode 100644 index 8f1e1860d1..0000000000 --- a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_StarWarsAPI { - umbrella header "Pods-StarWarsAPI-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.release.xcconfig b/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.release.xcconfig deleted file mode 100644 index 7913b37597..0000000000 --- a/Example/Pods/Target Support Files/Pods-StarWarsAPI/Pods-StarWarsAPI.release.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Apollo" "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/Apollo/Apollo.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/SQLite.swift/SQLite.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Apollo" -framework "SQLite" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/SQLite.swift/Info.plist b/Example/Pods/Target Support Files/SQLite.swift/Info.plist deleted file mode 100644 index e500672166..0000000000 --- a/Example/Pods/Target Support Files/SQLite.swift/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 0.11.2 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-dummy.m b/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-dummy.m deleted file mode 100644 index bc09ade872..0000000000 --- a/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_SQLite_swift : NSObject -@end -@implementation PodsDummy_SQLite_swift -@end diff --git a/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-prefix.pch b/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-prefix.pch deleted file mode 100644 index beb2a24418..0000000000 --- a/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-umbrella.h b/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-umbrella.h deleted file mode 100644 index 3052d2cfd3..0000000000 --- a/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift-umbrella.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - -#import "SQLite.h" -#import "SQLite-Bridging.h" - -FOUNDATION_EXPORT double SQLiteVersionNumber; -FOUNDATION_EXPORT const unsigned char SQLiteVersionString[]; - diff --git a/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.modulemap b/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.modulemap deleted file mode 100644 index e835c30da8..0000000000 --- a/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module SQLite { - umbrella header "SQLite.swift-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.xcconfig b/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.xcconfig deleted file mode 100644 index 590d341c2a..0000000000 --- a/Example/Pods/Target Support Files/SQLite.swift/SQLite.swift.xcconfig +++ /dev/null @@ -1,23 +0,0 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/SQLite.swift -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" -OTHER_LDFLAGS = -l"sqlite3" -OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/SQLite.swift -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -SWIFT_INCLUDE_PATHS[sdk=appletvos*] = $(SRCROOT)/SQLite.swift/CocoaPods/appletvos -SWIFT_INCLUDE_PATHS[sdk=appletvsimulator*] = $(SRCROOT)/SQLite.swift/CocoaPods/appletvsimulator -SWIFT_INCLUDE_PATHS[sdk=iphoneos*] = $(SRCROOT)/SQLite.swift/CocoaPods/iphoneos -SWIFT_INCLUDE_PATHS[sdk=iphoneos10.0] = $(SRCROOT)/SQLite.swift/CocoaPods/iphoneos-10.0 -SWIFT_INCLUDE_PATHS[sdk=iphonesimulator*] = $(SRCROOT)/SQLite.swift/CocoaPods/iphonesimulator -SWIFT_INCLUDE_PATHS[sdk=iphonesimulator10.0] = $(SRCROOT)/SQLite.swift/CocoaPods/iphonesimulator-10.0 -SWIFT_INCLUDE_PATHS[sdk=macosx*] = $(SRCROOT)/SQLite.swift/CocoaPods/macosx -SWIFT_INCLUDE_PATHS[sdk=macosx10.11] = $(SRCROOT)/SQLite.swift/CocoaPods/macosx-10.11 -SWIFT_INCLUDE_PATHS[sdk=macosx10.12] = $(SRCROOT)/SQLite.swift/CocoaPods/macosx-10.12 -SWIFT_INCLUDE_PATHS[sdk=watchos*] = $(SRCROOT)/SQLite.swift/CocoaPods/watchos -SWIFT_INCLUDE_PATHS[sdk=watchsimulator*] = $(SRCROOT)/SQLite.swift/CocoaPods/watchsimulator -SWIFT_VERSION = 3.0 diff --git a/Example/TestHost iOS/AppDelegate.swift b/Example/TestHost iOS/AppDelegate.swift deleted file mode 100644 index d81efbe54a..0000000000 --- a/Example/TestHost iOS/AppDelegate.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// AppDelegate.swift -// TestHost iOS -// -// Created by paul_kompfner on 4/4/17. -// -// - -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - return true - } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - -} - diff --git a/Example/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 1d060ed288..0000000000 --- a/Example/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "83.5x83.5", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Example/TestHost iOS/Base.lproj/LaunchScreen.storyboard b/Example/TestHost iOS/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index fdf3f97d1b..0000000000 --- a/Example/TestHost iOS/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/TestHost iOS/Base.lproj/Main.storyboard b/Example/TestHost iOS/Base.lproj/Main.storyboard deleted file mode 100644 index 273375fc70..0000000000 --- a/Example/TestHost iOS/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/TestHost iOS/Info.plist b/Example/TestHost iOS/Info.plist deleted file mode 100644 index d052473868..0000000000 --- a/Example/TestHost iOS/Info.plist +++ /dev/null @@ -1,45 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/Example/TestHost iOS/ViewController.swift b/Example/TestHost iOS/ViewController.swift deleted file mode 100644 index d81f667429..0000000000 --- a/Example/TestHost iOS/ViewController.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// ViewController.swift -// TestHost iOS -// -// Created by paul_kompfner on 4/4/17. -// -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - -} - diff --git a/Example/ApolloPerformanceTests/Info.plist b/Tests/ApolloPerformanceTests/Info.plist similarity index 100% rename from Example/ApolloPerformanceTests/Info.plist rename to Tests/ApolloPerformanceTests/Info.plist diff --git a/Example/ApolloPerformanceTests/NormalizedCachingTests.swift b/Tests/ApolloPerformanceTests/NormalizedCachingTests.swift similarity index 100% rename from Example/ApolloPerformanceTests/NormalizedCachingTests.swift rename to Tests/ApolloPerformanceTests/NormalizedCachingTests.swift diff --git a/Example/ApolloPerformanceTests/PromiseTests.swift b/Tests/ApolloPerformanceTests/PromiseTests.swift similarity index 100% rename from Example/ApolloPerformanceTests/PromiseTests.swift rename to Tests/ApolloPerformanceTests/PromiseTests.swift diff --git a/Example/ApolloTests/BatchedLoadTests.swift b/Tests/ApolloTests/BatchedLoadTests.swift similarity index 100% rename from Example/ApolloTests/BatchedLoadTests.swift rename to Tests/ApolloTests/BatchedLoadTests.swift diff --git a/Example/ApolloTests/CacheKeyForFieldTests.swift b/Tests/ApolloTests/CacheKeyForFieldTests.swift similarity index 100% rename from Example/ApolloTests/CacheKeyForFieldTests.swift rename to Tests/ApolloTests/CacheKeyForFieldTests.swift diff --git a/Example/ApolloTests/CachePersistenceTests.swift b/Tests/ApolloTests/CachePersistenceTests.swift similarity index 100% rename from Example/ApolloTests/CachePersistenceTests.swift rename to Tests/ApolloTests/CachePersistenceTests.swift diff --git a/Example/ApolloTests/DataLoaderTests.swift b/Tests/ApolloTests/DataLoaderTests.swift similarity index 100% rename from Example/ApolloTests/DataLoaderTests.swift rename to Tests/ApolloTests/DataLoaderTests.swift diff --git a/Example/ApolloTests/FetchQueryTests.swift b/Tests/ApolloTests/FetchQueryTests.swift similarity index 93% rename from Example/ApolloTests/FetchQueryTests.swift rename to Tests/ApolloTests/FetchQueryTests.swift index ec7d982fa6..cea0d1c46e 100644 --- a/Example/ApolloTests/FetchQueryTests.swift +++ b/Tests/ApolloTests/FetchQueryTests.swift @@ -14,7 +14,7 @@ class FetchQueryTests: XCTestCase { ] ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in let store = ApolloStore(cache: cache) let networkTransport = MockNetworkTransport(body: [ @@ -53,7 +53,7 @@ class FetchQueryTests: XCTestCase { ] ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in let store = ApolloStore(cache: cache) let networkTransport = MockNetworkTransport(body: [ @@ -91,7 +91,7 @@ class FetchQueryTests: XCTestCase { ] ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in let store = ApolloStore(cache: cache) let networkTransport = MockNetworkTransport(body: [ @@ -130,7 +130,7 @@ class FetchQueryTests: XCTestCase { ] ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in let store = ApolloStore(cache: cache) let networkTransport = MockNetworkTransport(body: [ @@ -168,7 +168,7 @@ class FetchQueryTests: XCTestCase { ] ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in let store = ApolloStore(cache: cache) let networkTransport = MockNetworkTransport(body: [ @@ -212,7 +212,7 @@ class FetchQueryTests: XCTestCase { ] ]) - withEachCacheType { (cache) in + TestCacheProvider.withCache { (cache) in let store = ApolloStore(cache: cache) let client = ApolloClient(networkTransport: networkTransport, store: store) diff --git a/Example/ApolloTests/GraphQLExecutorFieldValueTests.swift b/Tests/ApolloTests/GraphQLExecutorFieldValueTests.swift similarity index 100% rename from Example/ApolloTests/GraphQLExecutorFieldValueTests.swift rename to Tests/ApolloTests/GraphQLExecutorFieldValueTests.swift diff --git a/Example/ApolloTests/GraphQLInputValueEncodingTests.swift b/Tests/ApolloTests/GraphQLInputValueEncodingTests.swift similarity index 100% rename from Example/ApolloTests/GraphQLInputValueEncodingTests.swift rename to Tests/ApolloTests/GraphQLInputValueEncodingTests.swift diff --git a/Example/ApolloTests/Info.plist b/Tests/ApolloTests/Info.plist similarity index 100% rename from Example/ApolloTests/Info.plist rename to Tests/ApolloTests/Info.plist diff --git a/Example/ApolloTests/LoadQueryFromStoreTests.swift b/Tests/ApolloTests/LoadQueryFromStoreTests.swift similarity index 91% rename from Example/ApolloTests/LoadQueryFromStoreTests.swift rename to Tests/ApolloTests/LoadQueryFromStoreTests.swift index 04a9e924d1..9de120a39c 100644 --- a/Example/ApolloTests/LoadQueryFromStoreTests.swift +++ b/Tests/ApolloTests/LoadQueryFromStoreTests.swift @@ -11,7 +11,7 @@ class LoadQueryFromStoreTests: XCTestCase { "hero": ["__typename": "Droid", "name": "R2-D2"] ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in store = ApolloStore(cache: cache) let query = HeroNameQuery() @@ -30,7 +30,7 @@ class LoadQueryFromStoreTests: XCTestCase { "hero(episode:JEDI)": ["__typename": "Droid", "name": "R2-D2"] ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in store = ApolloStore(cache: cache) let query = HeroNameQuery(episode: .jedi) @@ -49,7 +49,7 @@ class LoadQueryFromStoreTests: XCTestCase { "hero": ["__typename": "Droid"] ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in store = ApolloStore(cache: cache) let query = HeroNameQuery() @@ -73,7 +73,7 @@ class LoadQueryFromStoreTests: XCTestCase { "hero": ["__typename": "Droid", "name": NSNull()] ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in store = ApolloStore(cache: cache) let query = HeroNameQuery() @@ -108,7 +108,7 @@ class LoadQueryFromStoreTests: XCTestCase { "hero(episode:JEDI).friends.2": ["__typename": "Human", "name": "Leia Organa"], ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in store = ApolloStore(cache: cache) let query = HeroAndFriendsNamesQuery(episode: .jedi) @@ -142,7 +142,7 @@ class LoadQueryFromStoreTests: XCTestCase { "1003": ["__typename": "Human", "name": "Leia Organa"], ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in store = ApolloStore(cache: cache) let query = HeroAndFriendsNamesQuery() @@ -169,7 +169,7 @@ class LoadQueryFromStoreTests: XCTestCase { ] ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in store = ApolloStore(cache: cache) let query = HeroAndFriendsNamesQuery() @@ -191,7 +191,7 @@ class LoadQueryFromStoreTests: XCTestCase { "hero": ["__typename": "Droid", "name": "R2-D2"] ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in store = ApolloStore(cache: cache) let query = HeroAndFriendsNamesQuery() diff --git a/Example/ApolloTests/MockNetworkTransport.swift b/Tests/ApolloTests/MockNetworkTransport.swift similarity index 100% rename from Example/ApolloTests/MockNetworkTransport.swift rename to Tests/ApolloTests/MockNetworkTransport.swift diff --git a/Example/ApolloTests/NormalizeQueryResults.swift b/Tests/ApolloTests/NormalizeQueryResults.swift similarity index 100% rename from Example/ApolloTests/NormalizeQueryResults.swift rename to Tests/ApolloTests/NormalizeQueryResults.swift diff --git a/Example/ApolloTests/ParseQueryResponseTests.swift b/Tests/ApolloTests/ParseQueryResponseTests.swift similarity index 100% rename from Example/ApolloTests/ParseQueryResponseTests.swift rename to Tests/ApolloTests/ParseQueryResponseTests.swift diff --git a/Example/ApolloTests/PromiseTests.swift b/Tests/ApolloTests/PromiseTests.swift similarity index 100% rename from Example/ApolloTests/PromiseTests.swift rename to Tests/ApolloTests/PromiseTests.swift diff --git a/Example/ApolloTests/StarWarsServerCachingRoundtripTests.swift b/Tests/ApolloTests/StarWarsServerCachingRoundtripTests.swift similarity index 98% rename from Example/ApolloTests/StarWarsServerCachingRoundtripTests.swift rename to Tests/ApolloTests/StarWarsServerCachingRoundtripTests.swift index bbf96df392..84d63e2bcf 100644 --- a/Example/ApolloTests/StarWarsServerCachingRoundtripTests.swift +++ b/Tests/ApolloTests/StarWarsServerCachingRoundtripTests.swift @@ -36,7 +36,7 @@ class StarWarsServerCachingRoundtripTests: XCTestCase { private func fetchAndLoadFromStore(query: Query, setupClient: ((ApolloClient) -> Void)? = nil, completionHandler: @escaping (_ data: Query.Data) -> Void) { - withEachCacheType { (cache) in + TestCacheProvider.withCache { (cache) in let network = HTTPNetworkTransport(url: URL(string: "http://localhost:8080/graphql")!) let store = ApolloStore(cache: cache) let client = ApolloClient(networkTransport: network, store: store) diff --git a/Example/ApolloTests/StarWarsServerTests.swift b/Tests/ApolloTests/StarWarsServerTests.swift similarity index 98% rename from Example/ApolloTests/StarWarsServerTests.swift rename to Tests/ApolloTests/StarWarsServerTests.swift index 22b1ef37b7..b9d630e1c4 100644 --- a/Example/ApolloTests/StarWarsServerTests.swift +++ b/Tests/ApolloTests/StarWarsServerTests.swift @@ -136,7 +136,7 @@ class StarWarsServerTests: XCTestCase { // MARK: - Helpers private func fetch(query: Query, completionHandler: @escaping (_ data: Query.Data) -> Void) { - withEachCacheType { (cache) in + TestCacheProvider.withCache { (cache) in let network = HTTPNetworkTransport(url: URL(string: "http://localhost:8080/graphql")!) let store = ApolloStore(cache: cache) let client = ApolloClient(networkTransport: network, store: store) @@ -163,7 +163,7 @@ class StarWarsServerTests: XCTestCase { } private func perform(mutation: Mutation, completionHandler: @escaping (_ data: Mutation.Data) -> Void) { - withEachCacheType { (cache) in + TestCacheProvider.withCache { (cache) in let network = HTTPNetworkTransport(url: URL(string: "http://localhost:8080/graphql")!) let store = ApolloStore(cache: cache) let client = ApolloClient(networkTransport: network, store: store) diff --git a/Example/ApolloTests/StoreTransactionTests.swift b/Tests/ApolloTests/StoreTransactionTests.swift similarity index 93% rename from Example/ApolloTests/StoreTransactionTests.swift rename to Tests/ApolloTests/StoreTransactionTests.swift index cdf3bd0488..1b284e0d8e 100644 --- a/Example/ApolloTests/StoreTransactionTests.swift +++ b/Tests/ApolloTests/StoreTransactionTests.swift @@ -10,7 +10,7 @@ class StoreTransactionTests: XCTestCase { "hero": ["__typename": "Droid", "name": "R2-D2"] ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in let store = ApolloStore(cache: cache) let query = HeroNameQuery() @@ -29,7 +29,7 @@ class StoreTransactionTests: XCTestCase { "QUERY_ROOT.hero": ["__typename": "Droid", "name": "R2-D2"] ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in let store = ApolloStore(cache: cache) let query = HeroNameQuery() @@ -64,7 +64,7 @@ class StoreTransactionTests: XCTestCase { "1003": ["__typename": "Human", "name": "Leia Organa"], ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in let store = ApolloStore(cache: cache) let query = HeroAndFriendsNamesQuery() @@ -104,7 +104,7 @@ class StoreTransactionTests: XCTestCase { "1003": ["__typename": "Human", "name": "Leia Organa"], ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in let store = ApolloStore(cache: cache) let query = HeroAndFriendsNamesQuery() @@ -141,7 +141,7 @@ class StoreTransactionTests: XCTestCase { "1003": ["__typename": "Human", "name": "Leia Organa"], ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in let store = ApolloStore(cache: cache) try! await(store.withinReadTransaction { transaction in @@ -176,7 +176,7 @@ class StoreTransactionTests: XCTestCase { "1003": ["__typename": "Human", "name": "Leia Organa"], ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in let store = ApolloStore(cache: cache) try! await(store.withinReadWriteTransaction { transaction in diff --git a/Example/ApolloTests/Utilities.swift b/Tests/ApolloTests/Utilities.swift similarity index 70% rename from Example/ApolloTests/Utilities.swift rename to Tests/ApolloTests/Utilities.swift index 0dc92c4f3f..44369fbe8c 100644 --- a/Example/ApolloTests/Utilities.swift +++ b/Tests/ApolloTests/Utilities.swift @@ -64,26 +64,3 @@ public func XCTAssertMatch(_ valueExpression: @autoclosure ( XCTFail(message(), file: file, line: line) } - -public func withEachCacheType(initialRecords: RecordSet? = nil, test: (NormalizedCache) -> Void) { - withInMemoryCache(initialRecords: initialRecords, test: test) - withSqliteCache(initialRecords: initialRecords, test: test) -} - -public func withInMemoryCache(initialRecords: RecordSet? = nil, test: (NormalizedCache) -> Void) { - test(InMemoryNormalizedCache(records: initialRecords ?? RecordSet())) -} - -public func withSqliteCache(initialRecords: RecordSet? = nil, test: (NormalizedCache) -> Void) { - try? FileManager.default.removeItem(at: sqliteFileURL) - let cache = try! SqliteNormalizedCache(fileURL: sqliteFileURL) - if let initialRecords = initialRecords { - _ = cache.merge(records: initialRecords) // This is synchronous - } - test(cache) -} - -public var sqliteFileURL: URL { - let docDirURL = URL(fileURLWithPath:NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!) - return docDirURL.appendingPathComponent("db.sqlite3") -} diff --git a/Example/ApolloTests/WatchQueryTests.swift b/Tests/ApolloTests/WatchQueryTests.swift similarity index 96% rename from Example/ApolloTests/WatchQueryTests.swift rename to Tests/ApolloTests/WatchQueryTests.swift index e37b232a31..9a8447e0aa 100644 --- a/Example/ApolloTests/WatchQueryTests.swift +++ b/Tests/ApolloTests/WatchQueryTests.swift @@ -15,7 +15,7 @@ class WatchQueryTests: XCTestCase { ] ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in let networkTransport = MockNetworkTransport(body: [ "data": [ "hero": [ @@ -77,7 +77,7 @@ class WatchQueryTests: XCTestCase { "QUERY_ROOT.hero.friends.2": ["__typename": "Human", "name": "Leia Organa"], ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in let networkTransport = MockNetworkTransport(body: [ "data": [ "hero": [ @@ -147,7 +147,7 @@ class WatchQueryTests: XCTestCase { "QUERY_ROOT.hero.friends.2": ["__typename": "Human", "name": "Leia Organa"], ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in let networkTransport = MockNetworkTransport(body: [ "data": [ "hero": [ @@ -204,7 +204,7 @@ class WatchQueryTests: XCTestCase { ] ] - withEachCacheType(initialRecords: initialRecords) { (cache) in + TestCacheProvider.withCache(initialRecords: initialRecords) { (cache) in let networkTransport = MockNetworkTransport(body: [ "data": [ "hero": [ diff --git a/Example/StarWarsAPI/API.swift b/Tests/StarWarsAPI/API.swift similarity index 100% rename from Example/StarWarsAPI/API.swift rename to Tests/StarWarsAPI/API.swift diff --git a/Example/StarWarsAPI/CreateReviewForEpisode.graphql b/Tests/StarWarsAPI/CreateReviewForEpisode.graphql similarity index 100% rename from Example/StarWarsAPI/CreateReviewForEpisode.graphql rename to Tests/StarWarsAPI/CreateReviewForEpisode.graphql diff --git a/Example/StarWarsAPI/HeroAndFriendsNames.graphql b/Tests/StarWarsAPI/HeroAndFriendsNames.graphql similarity index 100% rename from Example/StarWarsAPI/HeroAndFriendsNames.graphql rename to Tests/StarWarsAPI/HeroAndFriendsNames.graphql diff --git a/Example/StarWarsAPI/HeroAppearsIn.graphql b/Tests/StarWarsAPI/HeroAppearsIn.graphql similarity index 100% rename from Example/StarWarsAPI/HeroAppearsIn.graphql rename to Tests/StarWarsAPI/HeroAppearsIn.graphql diff --git a/Example/StarWarsAPI/HeroDetails.graphql b/Tests/StarWarsAPI/HeroDetails.graphql similarity index 100% rename from Example/StarWarsAPI/HeroDetails.graphql rename to Tests/StarWarsAPI/HeroDetails.graphql diff --git a/Example/StarWarsAPI/HeroDetailsWithFragment.graphql b/Tests/StarWarsAPI/HeroDetailsWithFragment.graphql similarity index 100% rename from Example/StarWarsAPI/HeroDetailsWithFragment.graphql rename to Tests/StarWarsAPI/HeroDetailsWithFragment.graphql diff --git a/Example/StarWarsAPI/HeroName.graphql b/Tests/StarWarsAPI/HeroName.graphql similarity index 100% rename from Example/StarWarsAPI/HeroName.graphql rename to Tests/StarWarsAPI/HeroName.graphql diff --git a/Example/StarWarsAPI/HeroNameConditional.graphql b/Tests/StarWarsAPI/HeroNameConditional.graphql similarity index 100% rename from Example/StarWarsAPI/HeroNameConditional.graphql rename to Tests/StarWarsAPI/HeroNameConditional.graphql diff --git a/Example/StarWarsAPI/HeroParentTypeDependentField.graphql b/Tests/StarWarsAPI/HeroParentTypeDependentField.graphql similarity index 100% rename from Example/StarWarsAPI/HeroParentTypeDependentField.graphql rename to Tests/StarWarsAPI/HeroParentTypeDependentField.graphql diff --git a/Example/StarWarsAPI/HeroTypeDependentAliasedField.graphql b/Tests/StarWarsAPI/HeroTypeDependentAliasedField.graphql similarity index 100% rename from Example/StarWarsAPI/HeroTypeDependentAliasedField.graphql rename to Tests/StarWarsAPI/HeroTypeDependentAliasedField.graphql diff --git a/Example/StarWarsAPI/HumanWithNullMass.graphql b/Tests/StarWarsAPI/HumanWithNullMass.graphql similarity index 100% rename from Example/StarWarsAPI/HumanWithNullMass.graphql rename to Tests/StarWarsAPI/HumanWithNullMass.graphql diff --git a/Example/StarWarsAPI/Info.plist b/Tests/StarWarsAPI/Info.plist similarity index 100% rename from Example/StarWarsAPI/Info.plist rename to Tests/StarWarsAPI/Info.plist diff --git a/Example/StarWarsAPI/SameHeroTwice.graphql b/Tests/StarWarsAPI/SameHeroTwice.graphql similarity index 100% rename from Example/StarWarsAPI/SameHeroTwice.graphql rename to Tests/StarWarsAPI/SameHeroTwice.graphql diff --git a/Example/StarWarsAPI/StarWarsAPI.h b/Tests/StarWarsAPI/StarWarsAPI.h similarity index 100% rename from Example/StarWarsAPI/StarWarsAPI.h rename to Tests/StarWarsAPI/StarWarsAPI.h diff --git a/Example/StarWarsAPI/Starship.graphql b/Tests/StarWarsAPI/Starship.graphql similarity index 100% rename from Example/StarWarsAPI/Starship.graphql rename to Tests/StarWarsAPI/Starship.graphql diff --git a/Example/StarWarsAPI/TwoHeroes.graphql b/Tests/StarWarsAPI/TwoHeroes.graphql similarity index 100% rename from Example/StarWarsAPI/TwoHeroes.graphql rename to Tests/StarWarsAPI/TwoHeroes.graphql diff --git a/Example/StarWarsAPI/schema.json b/Tests/StarWarsAPI/schema.json similarity index 100% rename from Example/StarWarsAPI/schema.json rename to Tests/StarWarsAPI/schema.json diff --git a/Tests/TestCacheProvider.swift b/Tests/TestCacheProvider.swift new file mode 100644 index 0000000000..105a0edd17 --- /dev/null +++ b/Tests/TestCacheProvider.swift @@ -0,0 +1,11 @@ +import Apollo + +enum TestCacheProvider { + + /// Execute a test block rather than return a cache synchronously, since cache setup may be + /// asynchronous at some point. + static func withCache(initialRecords: RecordSet? = nil, execute test: (NormalizedCache) -> ()) { + let cache = InMemoryNormalizedCache(records: initialRecords ?? [:]) + test(cache) + } +} diff --git a/Tests/TestHost iOS/AppDelegate.swift b/Tests/TestHost iOS/AppDelegate.swift new file mode 100644 index 0000000000..c1a82671dc --- /dev/null +++ b/Tests/TestHost iOS/AppDelegate.swift @@ -0,0 +1,6 @@ +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + var window: UIWindow? +} diff --git a/Example/ApolloExample/Assets.xcassets/AppIcon.appiconset/Contents.json b/Tests/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Example/ApolloExample/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Tests/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Example/ApolloExample/Base.lproj/LaunchScreen.storyboard b/Tests/TestHost iOS/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from Example/ApolloExample/Base.lproj/LaunchScreen.storyboard rename to Tests/TestHost iOS/Base.lproj/LaunchScreen.storyboard diff --git a/Example/ApolloExample/Base.lproj/Main.storyboard b/Tests/TestHost iOS/Base.lproj/Main.storyboard similarity index 100% rename from Example/ApolloExample/Base.lproj/Main.storyboard rename to Tests/TestHost iOS/Base.lproj/Main.storyboard diff --git a/Example/ApolloExample/Info.plist b/Tests/TestHost iOS/Info.plist similarity index 95% rename from Example/ApolloExample/Info.plist rename to Tests/TestHost iOS/Info.plist index 627999ff2e..4190b7b906 100644 --- a/Example/ApolloExample/Info.plist +++ b/Tests/TestHost iOS/Info.plist @@ -15,9 +15,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 0.5.6 CFBundleVersion - 1 + $(CURRENT_PROJECT_VERSION) LSRequiresIPhoneOS NSAppTransportSecurity diff --git a/Tests/TestHost iOS/ViewController.swift b/Tests/TestHost iOS/ViewController.swift new file mode 100644 index 0000000000..b9a63bbdea --- /dev/null +++ b/Tests/TestHost iOS/ViewController.swift @@ -0,0 +1,4 @@ +import UIKit + +class ViewController: UIViewController { +} From adbfc2704ce9dc3671fdbd7fdb4f1512d8a6c4d7 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 11:48:19 -0700 Subject: [PATCH 37/76] =?UTF-8?q?(continued)=20Restructure=20project=20int?= =?UTF-8?q?o=20two=20separate=20projects=20(Apollo=20and=20ApolloSQLite)?= =?UTF-8?q?=20with=20shared=20=E2=80=9Cparameterized=E2=80=9D=20unit=20tes?= =?UTF-8?q?ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitmodules | 3 + Apollo.xcodeproj/project.pbxproj | 24 + ApolloSQLite.xcodeproj/project.pbxproj | 665 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/ApolloSQLite.xcscmblueprint | 30 + ApolloSQLite/Mac/ApolloSQLiteMac.h | 19 + ApolloSQLite/Mac/Info.plist | 24 + ApolloSQLite/iOS/ApolloSQLite.h | 11 + ApolloSQLite/iOS/Info.plist | 26 + Cartfile | 1 + Cartfile.resolved | 1 + Sources/JSONSerializationFormat.swift | 6 +- .../SqliteNormalizedCache.swift | 1 + 13 files changed, 815 insertions(+), 3 deletions(-) create mode 100644 .gitmodules create mode 100644 ApolloSQLite.xcodeproj/project.pbxproj create mode 100644 ApolloSQLite.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ApolloSQLite.xcodeproj/project.xcworkspace/xcshareddata/ApolloSQLite.xcscmblueprint create mode 100644 ApolloSQLite/Mac/ApolloSQLiteMac.h create mode 100644 ApolloSQLite/Mac/Info.plist create mode 100644 ApolloSQLite/iOS/ApolloSQLite.h create mode 100644 ApolloSQLite/iOS/Info.plist create mode 100644 Cartfile create mode 100644 Cartfile.resolved diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..c5a63baefc --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Carthage/Checkouts/SQLite.swift"] + path = Carthage/Checkouts/SQLite.swift + url = https://github.com/stephencelis/SQLite.swift.git diff --git a/Apollo.xcodeproj/project.pbxproj b/Apollo.xcodeproj/project.pbxproj index 0cc3b45176..4bc5eb4b90 100644 --- a/Apollo.xcodeproj/project.pbxproj +++ b/Apollo.xcodeproj/project.pbxproj @@ -149,6 +149,10 @@ /* Begin PBXFileReference section */ 54DDB0911EA045870009DD99 /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; 54DDB0931EA13C1B0009DD99 /* TestCacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestCacheProvider.swift; sourceTree = ""; }; + 54DDB1111EA5402C0009DD99 /* ApolloSQLite.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ApolloSQLite.h; sourceTree = ""; }; + 54DDB1121EA5402C0009DD99 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 54DDB11F1EA541150009DD99 /* ApolloSQLiteMac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ApolloSQLiteMac.h; sourceTree = ""; }; + 54DDB1201EA541150009DD99 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9F0F98D31E7AC17D00BF0371 /* StoreTransactionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreTransactionTests.swift; sourceTree = ""; }; 9F0F98E01E7BCC3400BF0371 /* Dictionary+KeyPath.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Dictionary+KeyPath.swift"; sourceTree = ""; }; 9F27D4631D40379500715680 /* JSONStandardTypeConversions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSONStandardTypeConversions.swift; sourceTree = ""; }; @@ -280,6 +284,24 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 54DDB1101EA5402C0009DD99 /* ApolloSQLite */ = { + isa = PBXGroup; + children = ( + 54DDB1111EA5402C0009DD99 /* ApolloSQLite.h */, + 54DDB1121EA5402C0009DD99 /* Info.plist */, + ); + path = ApolloSQLite; + sourceTree = ""; + }; + 54DDB11E1EA541150009DD99 /* ApolloSQLiteMac */ = { + isa = PBXGroup; + children = ( + 54DDB11F1EA541150009DD99 /* ApolloSQLiteMac.h */, + 54DDB1201EA541150009DD99 /* Info.plist */, + ); + path = ApolloSQLiteMac; + sourceTree = ""; + }; 9F17BC471DAF055A00138496 /* Supporting Files */ = { isa = PBXGroup; children = ( @@ -329,6 +351,8 @@ children = ( 9FC750461D2A532C00458D91 /* Apollo */, 9FCE2CF41E6C20E000E34457 /* Tests */, + 54DDB1101EA5402C0009DD99 /* ApolloSQLite */, + 54DDB11E1EA541150009DD99 /* ApolloSQLiteMac */, 9FC750451D2A532C00458D91 /* Products */, ); sourceTree = ""; diff --git a/ApolloSQLite.xcodeproj/project.pbxproj b/ApolloSQLite.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..a20a2f71e5 --- /dev/null +++ b/ApolloSQLite.xcodeproj/project.pbxproj @@ -0,0 +1,665 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 54DDB0DE1EA1562B0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB0DD1EA1562B0009DD99 /* SqliteNormalizedCache.swift */; }; + 54DDB0F71EA157870009DD99 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0D41EA156170009DD99 /* Apollo.framework */; }; + 54DDB1091EA53FD30009DD99 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0EA1EA1573C0009DD99 /* SQLite.framework */; }; + 54DDB1461EA544700009DD99 /* ApolloSQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = 54DDB1411EA544700009DD99 /* ApolloSQLite.h */; }; + 54DDB1471EA544700009DD99 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54DDB1421EA544700009DD99 /* Info.plist */; }; + 54DDB1481EA544700009DD99 /* ApolloSQLiteMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 54DDB1441EA544700009DD99 /* ApolloSQLiteMac.h */; }; + 54DDB1491EA544700009DD99 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54DDB1451EA544700009DD99 /* Info.plist */; }; + 54DDB14A1EA544EB0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB0DD1EA1562B0009DD99 /* SqliteNormalizedCache.swift */; }; + 54DDB14B1EA545500009DD99 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0D41EA156170009DD99 /* Apollo.framework */; }; + 54DDB14C1EA545560009DD99 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0EE1EA1573C0009DD99 /* SQLite.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 54DDB0D31EA156170009DD99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9FC750441D2A532C00458D91; + remoteInfo = Apollo; + }; + 54DDB0D51EA156170009DD99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9FC631331E6AE2080062707E; + remoteInfo = ApolloPerformanceTests; + }; + 54DDB0D71EA156170009DD99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9FC7504E1D2A532D00458D91; + remoteInfo = ApolloTests; + }; + 54DDB0D91EA156170009DD99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9FCE2CFA1E6C213D00E34457; + remoteInfo = StarWarsAPI; + }; + 54DDB0DB1EA156170009DD99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 9FD637E11E6ACF88001EDBC8; + remoteInfo = "TestHost iOS"; + }; + 54DDB0E91EA1573C0009DD99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EE247AD31C3F04ED00AE3E12; + remoteInfo = "SQLite iOS"; + }; + 54DDB0EB1EA1573C0009DD99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EE247ADD1C3F04ED00AE3E12; + remoteInfo = "SQLiteTests iOS"; + }; + 54DDB0ED1EA1573C0009DD99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EE247B3C1C3F3ED000AE3E12; + remoteInfo = "SQLite Mac"; + }; + 54DDB0EF1EA1573C0009DD99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EE247B451C3F3ED000AE3E12; + remoteInfo = "SQLiteTests Mac"; + }; + 54DDB0F11EA1573C0009DD99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 03A65E5A1C6BB0F50062603F; + remoteInfo = "SQLite tvOS"; + }; + 54DDB0F31EA1573C0009DD99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 03A65E631C6BB0F60062603F; + remoteInfo = "SQLiteTests tvOS"; + }; + 54DDB0F51EA1573C0009DD99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = A121AC451CA35C79005A31D1; + remoteInfo = "SQLite watchOS"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 54DDB0BE1EA1523E0009DD99 /* ApolloSQLiteIOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ApolloSQLiteIOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Apollo.xcodeproj; sourceTree = ""; }; + 54DDB0DD1EA1562B0009DD99 /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SqliteNormalizedCache.swift; path = Sources/SqliteNormalizedCache/SqliteNormalizedCache.swift; sourceTree = SOURCE_ROOT; }; + 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SQLite.xcodeproj; path = Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj; sourceTree = ""; }; + 54DDB1381EA543F80009DD99 /* ApolloSQLiteMac.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ApolloSQLiteMac.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54DDB1411EA544700009DD99 /* ApolloSQLite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApolloSQLite.h; sourceTree = ""; }; + 54DDB1421EA544700009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 54DDB1441EA544700009DD99 /* ApolloSQLiteMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApolloSQLiteMac.h; sourceTree = ""; }; + 54DDB1451EA544700009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 54DDB0BA1EA1523E0009DD99 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 54DDB1091EA53FD30009DD99 /* SQLite.framework in Frameworks */, + 54DDB0F71EA157870009DD99 /* Apollo.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 54DDB1341EA543F80009DD99 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 54DDB14C1EA545560009DD99 /* SQLite.framework in Frameworks */, + 54DDB14B1EA545500009DD99 /* Apollo.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 54DDB0B41EA1523E0009DD99 = { + isa = PBXGroup; + children = ( + 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */, + 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */, + 54DDB0C01EA1523E0009DD99 /* ApolloSQLite */, + 54DDB0BF1EA1523E0009DD99 /* Products */, + ); + sourceTree = ""; + }; + 54DDB0BF1EA1523E0009DD99 /* Products */ = { + isa = PBXGroup; + children = ( + 54DDB0BE1EA1523E0009DD99 /* ApolloSQLiteIOS.framework */, + 54DDB1381EA543F80009DD99 /* ApolloSQLiteMac.framework */, + ); + name = Products; + sourceTree = ""; + }; + 54DDB0C01EA1523E0009DD99 /* ApolloSQLite */ = { + isa = PBXGroup; + children = ( + 54DDB1401EA544700009DD99 /* iOS */, + 54DDB1431EA544700009DD99 /* Mac */, + 54DDB0DD1EA1562B0009DD99 /* SqliteNormalizedCache.swift */, + ); + path = ApolloSQLite; + sourceTree = ""; + }; + 54DDB0CC1EA156170009DD99 /* Products */ = { + isa = PBXGroup; + children = ( + 54DDB0D41EA156170009DD99 /* Apollo.framework */, + 54DDB0D61EA156170009DD99 /* ApolloPerformanceTests.xctest */, + 54DDB0D81EA156170009DD99 /* ApolloTests.xctest */, + 54DDB0DA1EA156170009DD99 /* StarWarsAPI.framework */, + 54DDB0DC1EA156170009DD99 /* TestHost iOS.app */, + ); + name = Products; + sourceTree = ""; + }; + 54DDB0E01EA1573C0009DD99 /* Products */ = { + isa = PBXGroup; + children = ( + 54DDB0EA1EA1573C0009DD99 /* SQLite.framework */, + 54DDB0EC1EA1573C0009DD99 /* SQLiteTests iOS.xctest */, + 54DDB0EE1EA1573C0009DD99 /* SQLite.framework */, + 54DDB0F01EA1573C0009DD99 /* SQLiteTests Mac.xctest */, + 54DDB0F21EA1573C0009DD99 /* SQLite.framework */, + 54DDB0F41EA1573C0009DD99 /* SQLiteTests tvOS.xctest */, + 54DDB0F61EA1573C0009DD99 /* SQLite.framework */, + ); + name = Products; + sourceTree = ""; + }; + 54DDB1401EA544700009DD99 /* iOS */ = { + isa = PBXGroup; + children = ( + 54DDB1411EA544700009DD99 /* ApolloSQLite.h */, + 54DDB1421EA544700009DD99 /* Info.plist */, + ); + path = iOS; + sourceTree = ""; + }; + 54DDB1431EA544700009DD99 /* Mac */ = { + isa = PBXGroup; + children = ( + 54DDB1441EA544700009DD99 /* ApolloSQLiteMac.h */, + 54DDB1451EA544700009DD99 /* Info.plist */, + ); + path = Mac; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 54DDB0BB1EA1523E0009DD99 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 54DDB1461EA544700009DD99 /* ApolloSQLite.h in Headers */, + 54DDB1481EA544700009DD99 /* ApolloSQLiteMac.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 54DDB1351EA543F80009DD99 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 54DDB0BD1EA1523E0009DD99 /* ApolloSQLiteIOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 54DDB0C61EA1523E0009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteIOS" */; + buildPhases = ( + 54DDB0B91EA1523E0009DD99 /* Sources */, + 54DDB0BA1EA1523E0009DD99 /* Frameworks */, + 54DDB0BB1EA1523E0009DD99 /* Headers */, + 54DDB0BC1EA1523E0009DD99 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ApolloSQLiteIOS; + productName = ApolloSQLite; + productReference = 54DDB0BE1EA1523E0009DD99 /* ApolloSQLiteIOS.framework */; + productType = "com.apple.product-type.framework"; + }; + 54DDB1371EA543F80009DD99 /* ApolloSQLiteMac */ = { + isa = PBXNativeTarget; + buildConfigurationList = 54DDB13D1EA543F80009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteMac" */; + buildPhases = ( + 54DDB1331EA543F80009DD99 /* Sources */, + 54DDB1341EA543F80009DD99 /* Frameworks */, + 54DDB1351EA543F80009DD99 /* Headers */, + 54DDB1361EA543F80009DD99 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ApolloSQLiteMac; + productName = ApolloSQLiteMac; + productReference = 54DDB1381EA543F80009DD99 /* ApolloSQLiteMac.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 54DDB0B51EA1523E0009DD99 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0830; + TargetAttributes = { + 54DDB0BD1EA1523E0009DD99 = { + CreatedOnToolsVersion = 8.3.1; + LastSwiftMigration = 0830; + ProvisioningStyle = Automatic; + }; + 54DDB1371EA543F80009DD99 = { + CreatedOnToolsVersion = 8.3.1; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 54DDB0B81EA1523E0009DD99 /* Build configuration list for PBXProject "ApolloSQLite" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 54DDB0B41EA1523E0009DD99; + productRefGroup = 54DDB0BF1EA1523E0009DD99 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 54DDB0CC1EA156170009DD99 /* Products */; + ProjectRef = 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */; + }, + { + ProductGroup = 54DDB0E01EA1573C0009DD99 /* Products */; + ProjectRef = 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 54DDB0BD1EA1523E0009DD99 /* ApolloSQLiteIOS */, + 54DDB1371EA543F80009DD99 /* ApolloSQLiteMac */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 54DDB0D41EA156170009DD99 /* Apollo.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = Apollo.framework; + remoteRef = 54DDB0D31EA156170009DD99 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 54DDB0D61EA156170009DD99 /* ApolloPerformanceTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = ApolloPerformanceTests.xctest; + remoteRef = 54DDB0D51EA156170009DD99 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 54DDB0D81EA156170009DD99 /* ApolloTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = ApolloTests.xctest; + remoteRef = 54DDB0D71EA156170009DD99 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 54DDB0DA1EA156170009DD99 /* StarWarsAPI.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = StarWarsAPI.framework; + remoteRef = 54DDB0D91EA156170009DD99 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 54DDB0DC1EA156170009DD99 /* TestHost iOS.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = "TestHost iOS.app"; + remoteRef = 54DDB0DB1EA156170009DD99 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 54DDB0EA1EA1573C0009DD99 /* SQLite.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = SQLite.framework; + remoteRef = 54DDB0E91EA1573C0009DD99 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 54DDB0EC1EA1573C0009DD99 /* SQLiteTests iOS.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "SQLiteTests iOS.xctest"; + remoteRef = 54DDB0EB1EA1573C0009DD99 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 54DDB0EE1EA1573C0009DD99 /* SQLite.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = SQLite.framework; + remoteRef = 54DDB0ED1EA1573C0009DD99 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 54DDB0F01EA1573C0009DD99 /* SQLiteTests Mac.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "SQLiteTests Mac.xctest"; + remoteRef = 54DDB0EF1EA1573C0009DD99 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 54DDB0F21EA1573C0009DD99 /* SQLite.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = SQLite.framework; + remoteRef = 54DDB0F11EA1573C0009DD99 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 54DDB0F41EA1573C0009DD99 /* SQLiteTests tvOS.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "SQLiteTests tvOS.xctest"; + remoteRef = 54DDB0F31EA1573C0009DD99 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 54DDB0F61EA1573C0009DD99 /* SQLite.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = SQLite.framework; + remoteRef = 54DDB0F51EA1573C0009DD99 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 54DDB0BC1EA1523E0009DD99 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 54DDB1491EA544700009DD99 /* Info.plist in Resources */, + 54DDB1471EA544700009DD99 /* Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 54DDB1361EA543F80009DD99 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 54DDB0B91EA1523E0009DD99 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 54DDB0DE1EA1562B0009DD99 /* SqliteNormalizedCache.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 54DDB1331EA543F80009DD99 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 54DDB14A1EA544EB0009DD99 /* SqliteNormalizedCache.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 54DDB0C41EA1523E0009DD99 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 54DDB0C51EA1523E0009DD99 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 54DDB0C71EA1523E0009DD99 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "$(SRCROOT)/ApolloSQLite/iOS/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLite; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 54DDB0C81EA1523E0009DD99 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "$(SRCROOT)/ApolloSQLite/iOS/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLite; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; + 54DDB13E1EA543F80009DD99 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "-"; + COMBINE_HIDPI_IMAGES = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = "$(SRCROOT)/ApolloSQLite/Mac/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteMac; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 54DDB13F1EA543F80009DD99 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "-"; + COMBINE_HIDPI_IMAGES = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = "$(SRCROOT)/ApolloSQLite/Mac/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteMac; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 54DDB0B81EA1523E0009DD99 /* Build configuration list for PBXProject "ApolloSQLite" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 54DDB0C41EA1523E0009DD99 /* Debug */, + 54DDB0C51EA1523E0009DD99 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 54DDB0C61EA1523E0009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteIOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 54DDB0C71EA1523E0009DD99 /* Debug */, + 54DDB0C81EA1523E0009DD99 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 54DDB13D1EA543F80009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteMac" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 54DDB13E1EA543F80009DD99 /* Debug */, + 54DDB13F1EA543F80009DD99 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; +/* End XCConfigurationList section */ + }; + rootObject = 54DDB0B51EA1523E0009DD99 /* Project object */; +} diff --git a/ApolloSQLite.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ApolloSQLite.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..39d1ae6dff --- /dev/null +++ b/ApolloSQLite.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ApolloSQLite.xcodeproj/project.xcworkspace/xcshareddata/ApolloSQLite.xcscmblueprint b/ApolloSQLite.xcodeproj/project.xcworkspace/xcshareddata/ApolloSQLite.xcscmblueprint new file mode 100644 index 0000000000..1a37ff2953 --- /dev/null +++ b/ApolloSQLite.xcodeproj/project.xcworkspace/xcshareddata/ApolloSQLite.xcscmblueprint @@ -0,0 +1,30 @@ +{ + "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "11467B891B05E74285D0FDA7F262E859A9337C82", + "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { + + }, + "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { + "3AE8ED2E684071AF4FB151FA51BF266B82FF45BD" : 9223372036854775807, + "11467B891B05E74285D0FDA7F262E859A9337C82" : 9223372036854775807 + }, + "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "A678D396-FEAA-4514-AAB6-F194B5B1883D", + "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { + "3AE8ED2E684071AF4FB151FA51BF266B82FF45BD" : "apollo-ios\/Carthage\/Checkouts\/SQLite.swift\/", + "11467B891B05E74285D0FDA7F262E859A9337C82" : "apollo-ios\/" + }, + "DVTSourceControlWorkspaceBlueprintNameKey" : "ApolloSQLite", + "DVTSourceControlWorkspaceBlueprintVersion" : 204, + "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "ApolloSQLite.xcodeproj", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/kompfner\/apollo-ios.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "11467B891B05E74285D0FDA7F262E859A9337C82" + }, + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/stephencelis\/SQLite.swift.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "3AE8ED2E684071AF4FB151FA51BF266B82FF45BD" + } + ] +} \ No newline at end of file diff --git a/ApolloSQLite/Mac/ApolloSQLiteMac.h b/ApolloSQLite/Mac/ApolloSQLiteMac.h new file mode 100644 index 0000000000..abe2a69254 --- /dev/null +++ b/ApolloSQLite/Mac/ApolloSQLiteMac.h @@ -0,0 +1,19 @@ +// +// ApolloSQLiteMac.h +// ApolloSQLiteMac +// +// Created by paul_kompfner on 4/17/17. +// +// + +#import + +//! Project version number for ApolloSQLiteMac. +FOUNDATION_EXPORT double ApolloSQLiteMacVersionNumber; + +//! Project version string for ApolloSQLiteMac. +FOUNDATION_EXPORT const unsigned char ApolloSQLiteMacVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/ApolloSQLite/Mac/Info.plist b/ApolloSQLite/Mac/Info.plist new file mode 100644 index 0000000000..fbe1e6b314 --- /dev/null +++ b/ApolloSQLite/Mac/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/ApolloSQLite/iOS/ApolloSQLite.h b/ApolloSQLite/iOS/ApolloSQLite.h new file mode 100644 index 0000000000..ee73917d5c --- /dev/null +++ b/ApolloSQLite/iOS/ApolloSQLite.h @@ -0,0 +1,11 @@ +#import + +//! Project version number for ApolloSQLite. +FOUNDATION_EXPORT double ApolloSQLiteVersionNumber; + +//! Project version string for ApolloSQLite. +FOUNDATION_EXPORT const unsigned char ApolloSQLiteVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/ApolloSQLite/iOS/Info.plist b/ApolloSQLite/iOS/Info.plist new file mode 100644 index 0000000000..a4099bdd7c --- /dev/null +++ b/ApolloSQLite/iOS/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSHumanReadableCopyright + Copyright © 2017 Apollo GraphQL. All rights reserved. + NSPrincipalClass + + + diff --git a/Cartfile b/Cartfile new file mode 100644 index 0000000000..f0711ebc40 --- /dev/null +++ b/Cartfile @@ -0,0 +1 @@ +github "stephencelis/SQLite.swift" ~> 0.11 \ No newline at end of file diff --git a/Cartfile.resolved b/Cartfile.resolved new file mode 100644 index 0000000000..7ae31ca1f9 --- /dev/null +++ b/Cartfile.resolved @@ -0,0 +1 @@ +github "stephencelis/SQLite.swift" "0.11.3" diff --git a/Sources/JSONSerializationFormat.swift b/Sources/JSONSerializationFormat.swift index 4d62f83eb3..814625c44a 100644 --- a/Sources/JSONSerializationFormat.swift +++ b/Sources/JSONSerializationFormat.swift @@ -1,9 +1,9 @@ -final class JSONSerializationFormat { - class func serialize(value: JSONEncodable) throws -> Data { +public final class JSONSerializationFormat { + public class func serialize(value: JSONEncodable) throws -> Data { return try JSONSerialization.data(withJSONObject: value.jsonValue, options: []) } - class func deserialize(data: Data) throws -> JSONValue { + public class func deserialize(data: Data) throws -> JSONValue { return try JSONSerialization.jsonObject(with: data, options: []) } } diff --git a/Sources/SqliteNormalizedCache/SqliteNormalizedCache.swift b/Sources/SqliteNormalizedCache/SqliteNormalizedCache.swift index 97770e31a0..18b7f0dbaa 100644 --- a/Sources/SqliteNormalizedCache/SqliteNormalizedCache.swift +++ b/Sources/SqliteNormalizedCache/SqliteNormalizedCache.swift @@ -1,3 +1,4 @@ +import Apollo import SQLite public enum SqliteNormalizedCacheError: Error { From a8d94b2b07b66f3b5e9c3f7f3e8084fcead49f67 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 11:50:24 -0700 Subject: [PATCH 38/76] =?UTF-8?q?(continued)=20Restructure=20project=20int?= =?UTF-8?q?o=20two=20separate=20projects=20(Apollo=20and=20ApolloSQLite)?= =?UTF-8?q?=20with=20shared=20=E2=80=9Cparameterized=E2=80=9D=20unit=20tes?= =?UTF-8?q?ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ApolloSQLite.xcodeproj/project.pbxproj | 4 ++-- ApolloSQLite/iOS/Info.plist | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ApolloSQLite.xcodeproj/project.pbxproj b/ApolloSQLite.xcodeproj/project.pbxproj index a20a2f71e5..99bff4b67f 100644 --- a/ApolloSQLite.xcodeproj/project.pbxproj +++ b/ApolloSQLite.xcodeproj/project.pbxproj @@ -600,7 +600,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteMac; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLite; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SKIP_INSTALL = YES; @@ -622,7 +622,7 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteMac; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLite; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; SKIP_INSTALL = YES; diff --git a/ApolloSQLite/iOS/Info.plist b/ApolloSQLite/iOS/Info.plist index a4099bdd7c..b30021bc5b 100644 --- a/ApolloSQLite/iOS/Info.plist +++ b/ApolloSQLite/iOS/Info.plist @@ -4,6 +4,8 @@ CFBundleDevelopmentRegion en + CFBundleDisplayName + ApolloSQLite CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier From 0a92c5dd3cc70243c4749ceb5792216172280939 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 12:23:43 -0700 Subject: [PATCH 39/76] =?UTF-8?q?(continued)=20Restructure=20project=20int?= =?UTF-8?q?o=20two=20separate=20projects=20(Apollo=20and=20ApolloSQLite)?= =?UTF-8?q?=20with=20shared=20=E2=80=9Cparameterized=E2=80=9D=20unit=20tes?= =?UTF-8?q?ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ApolloSQLite.xcodeproj/project.pbxproj | 201 ++++++++++++++++++ .../iOSTests}/CachePersistenceTests.swift | 19 +- ApolloSQLite/iOSTests/Info.plist | 22 ++ ApolloSQLite/iOSTests/TestCacheProvider.swift | 23 ++ 4 files changed, 256 insertions(+), 9 deletions(-) rename {Tests/ApolloTests => ApolloSQLite/iOSTests}/CachePersistenceTests.swift (64%) create mode 100644 ApolloSQLite/iOSTests/Info.plist create mode 100644 ApolloSQLite/iOSTests/TestCacheProvider.swift diff --git a/ApolloSQLite.xcodeproj/project.pbxproj b/ApolloSQLite.xcodeproj/project.pbxproj index 99bff4b67f..ca782a3d49 100644 --- a/ApolloSQLite.xcodeproj/project.pbxproj +++ b/ApolloSQLite.xcodeproj/project.pbxproj @@ -17,6 +17,27 @@ 54DDB14A1EA544EB0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB0DD1EA1562B0009DD99 /* SqliteNormalizedCache.swift */; }; 54DDB14B1EA545500009DD99 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0D41EA156170009DD99 /* Apollo.framework */; }; 54DDB14C1EA545560009DD99 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0EE1EA1573C0009DD99 /* SQLite.framework */; }; + 54DDB1561EA546840009DD99 /* ApolloSQLiteIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0BE1EA1523E0009DD99 /* ApolloSQLiteIOS.framework */; }; + 54DDB17E1EA548BC0009DD99 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0DA1EA156170009DD99 /* StarWarsAPI.framework */; }; + 54DDB1851EA549ED0009DD99 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54DDB1841EA549ED0009DD99 /* Info.plist */; }; + 54DDB1971EA54A820009DD99 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */; }; + 54DDB1981EA54A820009DD99 /* CacheKeyForFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */; }; + 54DDB19A1EA54A820009DD99 /* DataLoaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1891EA54A820009DD99 /* DataLoaderTests.swift */; }; + 54DDB19B1EA54A820009DD99 /* FetchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18A1EA54A820009DD99 /* FetchQueryTests.swift */; }; + 54DDB19C1EA54A820009DD99 /* GraphQLExecutorFieldValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18B1EA54A820009DD99 /* GraphQLExecutorFieldValueTests.swift */; }; + 54DDB19D1EA54A820009DD99 /* GraphQLInputValueEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18C1EA54A820009DD99 /* GraphQLInputValueEncodingTests.swift */; }; + 54DDB19E1EA54A820009DD99 /* LoadQueryFromStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18D1EA54A820009DD99 /* LoadQueryFromStoreTests.swift */; }; + 54DDB19F1EA54A820009DD99 /* MockNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18E1EA54A820009DD99 /* MockNetworkTransport.swift */; }; + 54DDB1A01EA54A820009DD99 /* NormalizeQueryResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18F1EA54A820009DD99 /* NormalizeQueryResults.swift */; }; + 54DDB1A11EA54A820009DD99 /* ParseQueryResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1901EA54A820009DD99 /* ParseQueryResponseTests.swift */; }; + 54DDB1A21EA54A820009DD99 /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1911EA54A820009DD99 /* PromiseTests.swift */; }; + 54DDB1A31EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1921EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift */; }; + 54DDB1A41EA54A820009DD99 /* StarWarsServerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1931EA54A820009DD99 /* StarWarsServerTests.swift */; }; + 54DDB1A51EA54A820009DD99 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1941EA54A820009DD99 /* StoreTransactionTests.swift */; }; + 54DDB1A61EA54A820009DD99 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1951EA54A820009DD99 /* Utilities.swift */; }; + 54DDB1A71EA54A820009DD99 /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */; }; + 54DDB1A91EA54ACE0009DD99 /* TestCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1A81EA54ACE0009DD99 /* TestCacheProvider.swift */; }; + 54DDB1AC1EA54B740009DD99 /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AB1EA54B740009DD99 /* CachePersistenceTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -104,6 +125,20 @@ remoteGlobalIDString = A121AC451CA35C79005A31D1; remoteInfo = "SQLite watchOS"; }; + 54DDB1571EA546840009DD99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0B51EA1523E0009DD99 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 54DDB0BD1EA1523E0009DD99; + remoteInfo = ApolloSQLiteIOS; + }; + 54DDB17F1EA548C40009DD99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 9FCE2CF91E6C213D00E34457; + remoteInfo = StarWarsAPI; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -116,6 +151,26 @@ 54DDB1421EA544700009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54DDB1441EA544700009DD99 /* ApolloSQLiteMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApolloSQLiteMac.h; sourceTree = ""; }; 54DDB1451EA544700009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 54DDB1511EA546840009DD99 /* ApolloSQLiteIOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloSQLiteIOSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 54DDB1841EA549ED0009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = BatchedLoadTests.swift; path = ../../Tests/ApolloTests/BatchedLoadTests.swift; sourceTree = ""; }; + 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = CacheKeyForFieldTests.swift; path = ../../Tests/ApolloTests/CacheKeyForFieldTests.swift; sourceTree = ""; }; + 54DDB1891EA54A820009DD99 /* DataLoaderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = DataLoaderTests.swift; path = ../../Tests/ApolloTests/DataLoaderTests.swift; sourceTree = ""; }; + 54DDB18A1EA54A820009DD99 /* FetchQueryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = FetchQueryTests.swift; path = ../../Tests/ApolloTests/FetchQueryTests.swift; sourceTree = ""; }; + 54DDB18B1EA54A820009DD99 /* GraphQLExecutorFieldValueTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = GraphQLExecutorFieldValueTests.swift; path = ../../Tests/ApolloTests/GraphQLExecutorFieldValueTests.swift; sourceTree = ""; }; + 54DDB18C1EA54A820009DD99 /* GraphQLInputValueEncodingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = GraphQLInputValueEncodingTests.swift; path = ../../Tests/ApolloTests/GraphQLInputValueEncodingTests.swift; sourceTree = ""; }; + 54DDB18D1EA54A820009DD99 /* LoadQueryFromStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = LoadQueryFromStoreTests.swift; path = ../../Tests/ApolloTests/LoadQueryFromStoreTests.swift; sourceTree = ""; }; + 54DDB18E1EA54A820009DD99 /* MockNetworkTransport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MockNetworkTransport.swift; path = ../../Tests/ApolloTests/MockNetworkTransport.swift; sourceTree = ""; }; + 54DDB18F1EA54A820009DD99 /* NormalizeQueryResults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = NormalizeQueryResults.swift; path = ../../Tests/ApolloTests/NormalizeQueryResults.swift; sourceTree = ""; }; + 54DDB1901EA54A820009DD99 /* ParseQueryResponseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ParseQueryResponseTests.swift; path = ../../Tests/ApolloTests/ParseQueryResponseTests.swift; sourceTree = ""; }; + 54DDB1911EA54A820009DD99 /* PromiseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = PromiseTests.swift; path = ../../Tests/ApolloTests/PromiseTests.swift; sourceTree = ""; }; + 54DDB1921EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = StarWarsServerCachingRoundtripTests.swift; path = ../../Tests/ApolloTests/StarWarsServerCachingRoundtripTests.swift; sourceTree = ""; }; + 54DDB1931EA54A820009DD99 /* StarWarsServerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = StarWarsServerTests.swift; path = ../../Tests/ApolloTests/StarWarsServerTests.swift; sourceTree = ""; }; + 54DDB1941EA54A820009DD99 /* StoreTransactionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = StoreTransactionTests.swift; path = ../../Tests/ApolloTests/StoreTransactionTests.swift; sourceTree = ""; }; + 54DDB1951EA54A820009DD99 /* Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Utilities.swift; path = ../../Tests/ApolloTests/Utilities.swift; sourceTree = ""; }; + 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = WatchQueryTests.swift; path = ../../Tests/ApolloTests/WatchQueryTests.swift; sourceTree = ""; }; + 54DDB1A81EA54ACE0009DD99 /* TestCacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestCacheProvider.swift; sourceTree = ""; }; + 54DDB1AB1EA54B740009DD99 /* CachePersistenceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachePersistenceTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -137,6 +192,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 54DDB14E1EA546840009DD99 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 54DDB17E1EA548BC0009DD99 /* StarWarsAPI.framework in Frameworks */, + 54DDB1561EA546840009DD99 /* ApolloSQLiteIOS.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -155,6 +219,7 @@ children = ( 54DDB0BE1EA1523E0009DD99 /* ApolloSQLiteIOS.framework */, 54DDB1381EA543F80009DD99 /* ApolloSQLiteMac.framework */, + 54DDB1511EA546840009DD99 /* ApolloSQLiteIOSTests.xctest */, ); name = Products; sourceTree = ""; @@ -163,6 +228,7 @@ isa = PBXGroup; children = ( 54DDB1401EA544700009DD99 /* iOS */, + 54DDB1831EA549ED0009DD99 /* iOSTests */, 54DDB1431EA544700009DD99 /* Mac */, 54DDB0DD1EA1562B0009DD99 /* SqliteNormalizedCache.swift */, ); @@ -213,6 +279,40 @@ path = Mac; sourceTree = ""; }; + 54DDB1831EA549ED0009DD99 /* iOSTests */ = { + isa = PBXGroup; + children = ( + 54DDB1AA1EA54AD30009DD99 /* SharedCacheTests */, + 54DDB1AB1EA54B740009DD99 /* CachePersistenceTests.swift */, + 54DDB1A81EA54ACE0009DD99 /* TestCacheProvider.swift */, + 54DDB1841EA549ED0009DD99 /* Info.plist */, + ); + path = iOSTests; + sourceTree = ""; + }; + 54DDB1AA1EA54AD30009DD99 /* SharedCacheTests */ = { + isa = PBXGroup; + children = ( + 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */, + 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */, + 54DDB1891EA54A820009DD99 /* DataLoaderTests.swift */, + 54DDB18A1EA54A820009DD99 /* FetchQueryTests.swift */, + 54DDB18B1EA54A820009DD99 /* GraphQLExecutorFieldValueTests.swift */, + 54DDB18C1EA54A820009DD99 /* GraphQLInputValueEncodingTests.swift */, + 54DDB18D1EA54A820009DD99 /* LoadQueryFromStoreTests.swift */, + 54DDB18E1EA54A820009DD99 /* MockNetworkTransport.swift */, + 54DDB18F1EA54A820009DD99 /* NormalizeQueryResults.swift */, + 54DDB1901EA54A820009DD99 /* ParseQueryResponseTests.swift */, + 54DDB1911EA54A820009DD99 /* PromiseTests.swift */, + 54DDB1921EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift */, + 54DDB1931EA54A820009DD99 /* StarWarsServerTests.swift */, + 54DDB1941EA54A820009DD99 /* StoreTransactionTests.swift */, + 54DDB1951EA54A820009DD99 /* Utilities.swift */, + 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */, + ); + name = SharedCacheTests; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -271,12 +371,32 @@ productReference = 54DDB1381EA543F80009DD99 /* ApolloSQLiteMac.framework */; productType = "com.apple.product-type.framework"; }; + 54DDB1501EA546840009DD99 /* ApolloSQLiteIOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 54DDB1591EA546840009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteIOSTests" */; + buildPhases = ( + 54DDB14D1EA546840009DD99 /* Sources */, + 54DDB14E1EA546840009DD99 /* Frameworks */, + 54DDB14F1EA546840009DD99 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 54DDB1801EA548C40009DD99 /* PBXTargetDependency */, + 54DDB1581EA546840009DD99 /* PBXTargetDependency */, + ); + name = ApolloSQLiteIOSTests; + productName = ApolloSQLiteIOSTests; + productReference = 54DDB1511EA546840009DD99 /* ApolloSQLiteIOSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 54DDB0B51EA1523E0009DD99 /* Project object */ = { isa = PBXProject; attributes = { + LastSwiftUpdateCheck = 0830; LastUpgradeCheck = 0830; TargetAttributes = { 54DDB0BD1EA1523E0009DD99 = { @@ -288,6 +408,10 @@ CreatedOnToolsVersion = 8.3.1; ProvisioningStyle = Automatic; }; + 54DDB1501EA546840009DD99 = { + CreatedOnToolsVersion = 8.3.1; + ProvisioningStyle = Automatic; + }; }; }; buildConfigurationList = 54DDB0B81EA1523E0009DD99 /* Build configuration list for PBXProject "ApolloSQLite" */; @@ -314,6 +438,7 @@ targets = ( 54DDB0BD1EA1523E0009DD99 /* ApolloSQLiteIOS */, 54DDB1371EA543F80009DD99 /* ApolloSQLiteMac */, + 54DDB1501EA546840009DD99 /* ApolloSQLiteIOSTests */, ); }; /* End PBXProject section */ @@ -422,6 +547,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 54DDB14F1EA546840009DD99 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 54DDB1851EA549ED0009DD99 /* Info.plist in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -441,8 +574,46 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 54DDB14D1EA546840009DD99 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 54DDB1971EA54A820009DD99 /* BatchedLoadTests.swift in Sources */, + 54DDB1A91EA54ACE0009DD99 /* TestCacheProvider.swift in Sources */, + 54DDB1981EA54A820009DD99 /* CacheKeyForFieldTests.swift in Sources */, + 54DDB19A1EA54A820009DD99 /* DataLoaderTests.swift in Sources */, + 54DDB19B1EA54A820009DD99 /* FetchQueryTests.swift in Sources */, + 54DDB19C1EA54A820009DD99 /* GraphQLExecutorFieldValueTests.swift in Sources */, + 54DDB19D1EA54A820009DD99 /* GraphQLInputValueEncodingTests.swift in Sources */, + 54DDB19E1EA54A820009DD99 /* LoadQueryFromStoreTests.swift in Sources */, + 54DDB19F1EA54A820009DD99 /* MockNetworkTransport.swift in Sources */, + 54DDB1A01EA54A820009DD99 /* NormalizeQueryResults.swift in Sources */, + 54DDB1A11EA54A820009DD99 /* ParseQueryResponseTests.swift in Sources */, + 54DDB1A21EA54A820009DD99 /* PromiseTests.swift in Sources */, + 54DDB1AC1EA54B740009DD99 /* CachePersistenceTests.swift in Sources */, + 54DDB1A31EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift in Sources */, + 54DDB1A41EA54A820009DD99 /* StarWarsServerTests.swift in Sources */, + 54DDB1A51EA54A820009DD99 /* StoreTransactionTests.swift in Sources */, + 54DDB1A61EA54A820009DD99 /* Utilities.swift in Sources */, + 54DDB1A71EA54A820009DD99 /* WatchQueryTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 54DDB1581EA546840009DD99 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 54DDB0BD1EA1523E0009DD99 /* ApolloSQLiteIOS */; + targetProxy = 54DDB1571EA546840009DD99 /* PBXContainerItemProxy */; + }; + 54DDB1801EA548C40009DD99 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = StarWarsAPI; + targetProxy = 54DDB17F1EA548C40009DD99 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ 54DDB0C41EA1523E0009DD99 /* Debug */ = { isa = XCBuildConfiguration; @@ -630,6 +801,28 @@ }; name = Release; }; + 54DDB15A1EA546840009DD99 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = ApolloSQLite/iOSTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteIOSTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 54DDB15B1EA546840009DD99 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = ApolloSQLite/iOSTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteIOSTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -659,6 +852,14 @@ ); defaultConfigurationIsVisible = 0; }; + 54DDB1591EA546840009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteIOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 54DDB15A1EA546840009DD99 /* Debug */, + 54DDB15B1EA546840009DD99 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; /* End XCConfigurationList section */ }; rootObject = 54DDB0B51EA1523E0009DD99 /* Project object */; diff --git a/Tests/ApolloTests/CachePersistenceTests.swift b/ApolloSQLite/iOSTests/CachePersistenceTests.swift similarity index 64% rename from Tests/ApolloTests/CachePersistenceTests.swift rename to ApolloSQLite/iOSTests/CachePersistenceTests.swift index 6f6fdad87b..b91aba3ebc 100644 --- a/Tests/ApolloTests/CachePersistenceTests.swift +++ b/ApolloSQLite/iOSTests/CachePersistenceTests.swift @@ -7,7 +7,7 @@ class CachePersistenceTests: XCTestCase { func testFetchAndPersist() { let query = HeroNameQuery() - withSqliteCache { (cache) in + TestCacheProvider.withCache { (cache) in let store = ApolloStore(cache: cache) let networkTransport = MockNetworkTransport(body: [ "data": [ @@ -29,14 +29,15 @@ class CachePersistenceTests: XCTestCase { // Do another fetch from cache to ensure that data is cached before creating new cache client.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in - let newCache = try! SqliteNormalizedCache(fileURL: sqliteFileURL) - let newStore = ApolloStore(cache: newCache) - let newClient = ApolloClient(networkTransport: networkTransport, store: newStore) - newClient.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in - defer { newCacheExpectation.fulfill() } - guard let result = result else { XCTFail("No query result"); return } - XCTAssertEqual(result.data?.hero?.name, "Luke Skywalker") - _ = newClient // Workaround for a bug - ensure that newClient is retained until this block is run + TestCacheProvider.withCache(clearCache: false) { (cache) in + let newStore = ApolloStore(cache: cache) + let newClient = ApolloClient(networkTransport: networkTransport, store: newStore) + newClient.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in + defer { newCacheExpectation.fulfill() } + guard let result = result else { XCTFail("No query result"); return } + XCTAssertEqual(result.data?.hero?.name, "Luke Skywalker") + _ = newClient // Workaround for a bug - ensure that newClient is retained until this block is run + } } } } diff --git a/ApolloSQLite/iOSTests/Info.plist b/ApolloSQLite/iOSTests/Info.plist new file mode 100644 index 0000000000..6c6c23c43a --- /dev/null +++ b/ApolloSQLite/iOSTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/ApolloSQLite/iOSTests/TestCacheProvider.swift b/ApolloSQLite/iOSTests/TestCacheProvider.swift new file mode 100644 index 0000000000..68e73e6e2e --- /dev/null +++ b/ApolloSQLite/iOSTests/TestCacheProvider.swift @@ -0,0 +1,23 @@ +import Apollo +import ApolloSQLiteIOS + +enum TestCacheProvider { + + /// Execute a test block rather than return a cache synchronously, since cache setup may be + /// asynchronous at some point. + static func withCache(initialRecords: RecordSet? = nil, clearCache: Bool = true, execute test: (NormalizedCache) -> ()) { + if clearCache { + try? FileManager.default.removeItem(at: sqliteFileURL) + } + let cache = try! SqliteNormalizedCache(fileURL: sqliteFileURL) + if let initialRecords = initialRecords { + _ = cache.merge(records: initialRecords) // This is synchronous + } + test(cache) + } + + private static var sqliteFileURL: URL { + let docDirURL = URL(fileURLWithPath:NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!) + return docDirURL.appendingPathComponent("db.sqlite3") + } +} From c2a25c21e413b0a9368614d229fce5d089fb8099 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 12:34:12 -0700 Subject: [PATCH 40/76] =?UTF-8?q?(continued)=20Restructure=20project=20int?= =?UTF-8?q?o=20two=20separate=20projects=20(Apollo=20and=20ApolloSQLite)?= =?UTF-8?q?=20with=20shared=20=E2=80=9Cparameterized=E2=80=9D=20unit=20tes?= =?UTF-8?q?ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ApolloSQLite.xcodeproj/project.pbxproj | 14 ++++++++------ .../SqliteNormalizedCache.swift | 0 2 files changed, 8 insertions(+), 6 deletions(-) rename {Sources/SqliteNormalizedCache => ApolloSQLite}/SqliteNormalizedCache.swift (100%) diff --git a/ApolloSQLite.xcodeproj/project.pbxproj b/ApolloSQLite.xcodeproj/project.pbxproj index ca782a3d49..81a97fbce0 100644 --- a/ApolloSQLite.xcodeproj/project.pbxproj +++ b/ApolloSQLite.xcodeproj/project.pbxproj @@ -7,14 +7,12 @@ objects = { /* Begin PBXBuildFile section */ - 54DDB0DE1EA1562B0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB0DD1EA1562B0009DD99 /* SqliteNormalizedCache.swift */; }; 54DDB0F71EA157870009DD99 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0D41EA156170009DD99 /* Apollo.framework */; }; 54DDB1091EA53FD30009DD99 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0EA1EA1573C0009DD99 /* SQLite.framework */; }; 54DDB1461EA544700009DD99 /* ApolloSQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = 54DDB1411EA544700009DD99 /* ApolloSQLite.h */; }; 54DDB1471EA544700009DD99 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54DDB1421EA544700009DD99 /* Info.plist */; }; 54DDB1481EA544700009DD99 /* ApolloSQLiteMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 54DDB1441EA544700009DD99 /* ApolloSQLiteMac.h */; }; 54DDB1491EA544700009DD99 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54DDB1451EA544700009DD99 /* Info.plist */; }; - 54DDB14A1EA544EB0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB0DD1EA1562B0009DD99 /* SqliteNormalizedCache.swift */; }; 54DDB14B1EA545500009DD99 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0D41EA156170009DD99 /* Apollo.framework */; }; 54DDB14C1EA545560009DD99 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0EE1EA1573C0009DD99 /* SQLite.framework */; }; 54DDB1561EA546840009DD99 /* ApolloSQLiteIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0BE1EA1523E0009DD99 /* ApolloSQLiteIOS.framework */; }; @@ -38,6 +36,8 @@ 54DDB1A71EA54A820009DD99 /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */; }; 54DDB1A91EA54ACE0009DD99 /* TestCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1A81EA54ACE0009DD99 /* TestCacheProvider.swift */; }; 54DDB1AC1EA54B740009DD99 /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AB1EA54B740009DD99 /* CachePersistenceTests.swift */; }; + 54DDB1AF1EA54F7E0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */; }; + 54DDB1B01EA54F7F0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -144,7 +144,6 @@ /* Begin PBXFileReference section */ 54DDB0BE1EA1523E0009DD99 /* ApolloSQLiteIOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ApolloSQLiteIOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Apollo.xcodeproj; sourceTree = ""; }; - 54DDB0DD1EA1562B0009DD99 /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SqliteNormalizedCache.swift; path = Sources/SqliteNormalizedCache/SqliteNormalizedCache.swift; sourceTree = SOURCE_ROOT; }; 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SQLite.xcodeproj; path = Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj; sourceTree = ""; }; 54DDB1381EA543F80009DD99 /* ApolloSQLiteMac.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ApolloSQLiteMac.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 54DDB1411EA544700009DD99 /* ApolloSQLite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApolloSQLite.h; sourceTree = ""; }; @@ -171,6 +170,7 @@ 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = WatchQueryTests.swift; path = ../../Tests/ApolloTests/WatchQueryTests.swift; sourceTree = ""; }; 54DDB1A81EA54ACE0009DD99 /* TestCacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestCacheProvider.swift; sourceTree = ""; }; 54DDB1AB1EA54B740009DD99 /* CachePersistenceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachePersistenceTests.swift; sourceTree = ""; }; + 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCache.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -227,10 +227,10 @@ 54DDB0C01EA1523E0009DD99 /* ApolloSQLite */ = { isa = PBXGroup; children = ( + 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */, 54DDB1401EA544700009DD99 /* iOS */, 54DDB1831EA549ED0009DD99 /* iOSTests */, 54DDB1431EA544700009DD99 /* Mac */, - 54DDB0DD1EA1562B0009DD99 /* SqliteNormalizedCache.swift */, ); path = ApolloSQLite; sourceTree = ""; @@ -562,7 +562,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 54DDB0DE1EA1562B0009DD99 /* SqliteNormalizedCache.swift in Sources */, + 54DDB1AF1EA54F7E0009DD99 /* SqliteNormalizedCache.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -570,7 +570,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 54DDB14A1EA544EB0009DD99 /* SqliteNormalizedCache.swift in Sources */, + 54DDB1B01EA54F7F0009DD99 /* SqliteNormalizedCache.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -804,6 +804,7 @@ 54DDB15A1EA546840009DD99 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; INFOPLIST_FILE = ApolloSQLite/iOSTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteIOSTests; @@ -815,6 +816,7 @@ 54DDB15B1EA546840009DD99 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; INFOPLIST_FILE = ApolloSQLite/iOSTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteIOSTests; diff --git a/Sources/SqliteNormalizedCache/SqliteNormalizedCache.swift b/ApolloSQLite/SqliteNormalizedCache.swift similarity index 100% rename from Sources/SqliteNormalizedCache/SqliteNormalizedCache.swift rename to ApolloSQLite/SqliteNormalizedCache.swift From b18b616014e209808f8b8890790314495dd041a9 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 12:43:36 -0700 Subject: [PATCH 41/76] =?UTF-8?q?(continued)=20Restructure=20project=20int?= =?UTF-8?q?o=20two=20separate=20projects=20(Apollo=20and=20ApolloSQLite)?= =?UTF-8?q?=20with=20shared=20=E2=80=9Cparameterized=E2=80=9D=20unit=20tes?= =?UTF-8?q?ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ApolloSQLite.xcodeproj/project.pbxproj | 163 +++++++++++++++++- .../CachePersistenceTests.swift | 0 ApolloSQLite/MacTests/Info.plist | 22 +++ ApolloSQLite/MacTests/TestCacheProvider.swift | 23 +++ 4 files changed, 201 insertions(+), 7 deletions(-) rename ApolloSQLite/{iOSTests => }/CachePersistenceTests.swift (100%) create mode 100644 ApolloSQLite/MacTests/Info.plist create mode 100644 ApolloSQLite/MacTests/TestCacheProvider.swift diff --git a/ApolloSQLite.xcodeproj/project.pbxproj b/ApolloSQLite.xcodeproj/project.pbxproj index 81a97fbce0..a0debe935c 100644 --- a/ApolloSQLite.xcodeproj/project.pbxproj +++ b/ApolloSQLite.xcodeproj/project.pbxproj @@ -35,9 +35,29 @@ 54DDB1A61EA54A820009DD99 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1951EA54A820009DD99 /* Utilities.swift */; }; 54DDB1A71EA54A820009DD99 /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */; }; 54DDB1A91EA54ACE0009DD99 /* TestCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1A81EA54ACE0009DD99 /* TestCacheProvider.swift */; }; - 54DDB1AC1EA54B740009DD99 /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AB1EA54B740009DD99 /* CachePersistenceTests.swift */; }; 54DDB1AF1EA54F7E0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */; }; 54DDB1B01EA54F7F0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */; }; + 54DDB1BA1EA550550009DD99 /* ApolloSQLiteMac.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB1381EA543F80009DD99 /* ApolloSQLiteMac.framework */; }; + 54DDB1C41EA5508A0009DD99 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54DDB1C21EA5508A0009DD99 /* Info.plist */; }; + 54DDB1C61EA551310009DD99 /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1C51EA551310009DD99 /* CachePersistenceTests.swift */; }; + 54DDB1C71EA5516B0009DD99 /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1C51EA551310009DD99 /* CachePersistenceTests.swift */; }; + 54DDB1C81EA551E60009DD99 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */; }; + 54DDB1C91EA551E60009DD99 /* CacheKeyForFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */; }; + 54DDB1CA1EA551E60009DD99 /* DataLoaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1891EA54A820009DD99 /* DataLoaderTests.swift */; }; + 54DDB1CB1EA551E60009DD99 /* FetchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18A1EA54A820009DD99 /* FetchQueryTests.swift */; }; + 54DDB1CC1EA551E60009DD99 /* GraphQLExecutorFieldValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18B1EA54A820009DD99 /* GraphQLExecutorFieldValueTests.swift */; }; + 54DDB1CD1EA551E60009DD99 /* GraphQLInputValueEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18C1EA54A820009DD99 /* GraphQLInputValueEncodingTests.swift */; }; + 54DDB1CE1EA551E60009DD99 /* LoadQueryFromStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18D1EA54A820009DD99 /* LoadQueryFromStoreTests.swift */; }; + 54DDB1CF1EA551E60009DD99 /* MockNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18E1EA54A820009DD99 /* MockNetworkTransport.swift */; }; + 54DDB1D01EA551E60009DD99 /* NormalizeQueryResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18F1EA54A820009DD99 /* NormalizeQueryResults.swift */; }; + 54DDB1D11EA551E60009DD99 /* ParseQueryResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1901EA54A820009DD99 /* ParseQueryResponseTests.swift */; }; + 54DDB1D21EA551E60009DD99 /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1911EA54A820009DD99 /* PromiseTests.swift */; }; + 54DDB1D31EA551E60009DD99 /* StarWarsServerCachingRoundtripTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1921EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift */; }; + 54DDB1D41EA551E60009DD99 /* StarWarsServerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1931EA54A820009DD99 /* StarWarsServerTests.swift */; }; + 54DDB1D51EA551E60009DD99 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1941EA54A820009DD99 /* StoreTransactionTests.swift */; }; + 54DDB1D61EA551E60009DD99 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1951EA54A820009DD99 /* Utilities.swift */; }; + 54DDB1D71EA551E60009DD99 /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */; }; + 54DDB1DA1EA552100009DD99 /* TestCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1D81EA552080009DD99 /* TestCacheProvider.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -139,6 +159,13 @@ remoteGlobalIDString = 9FCE2CF91E6C213D00E34457; remoteInfo = StarWarsAPI; }; + 54DDB1BB1EA550550009DD99 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0B51EA1523E0009DD99 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 54DDB1371EA543F80009DD99; + remoteInfo = ApolloSQLiteMac; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ @@ -169,8 +196,11 @@ 54DDB1951EA54A820009DD99 /* Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Utilities.swift; path = ../../Tests/ApolloTests/Utilities.swift; sourceTree = ""; }; 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = WatchQueryTests.swift; path = ../../Tests/ApolloTests/WatchQueryTests.swift; sourceTree = ""; }; 54DDB1A81EA54ACE0009DD99 /* TestCacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestCacheProvider.swift; sourceTree = ""; }; - 54DDB1AB1EA54B740009DD99 /* CachePersistenceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachePersistenceTests.swift; sourceTree = ""; }; 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCache.swift; sourceTree = ""; }; + 54DDB1B51EA550540009DD99 /* ApolloSQLiteMacTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloSQLiteMacTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 54DDB1C21EA5508A0009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 54DDB1C51EA551310009DD99 /* CachePersistenceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CachePersistenceTests.swift; path = ../CachePersistenceTests.swift; sourceTree = ""; }; + 54DDB1D81EA552080009DD99 /* TestCacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestCacheProvider.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -201,6 +231,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 54DDB1B21EA550540009DD99 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 54DDB1BA1EA550550009DD99 /* ApolloSQLiteMac.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -220,6 +258,7 @@ 54DDB0BE1EA1523E0009DD99 /* ApolloSQLiteIOS.framework */, 54DDB1381EA543F80009DD99 /* ApolloSQLiteMac.framework */, 54DDB1511EA546840009DD99 /* ApolloSQLiteIOSTests.xctest */, + 54DDB1B51EA550540009DD99 /* ApolloSQLiteMacTests.xctest */, ); name = Products; sourceTree = ""; @@ -231,6 +270,8 @@ 54DDB1401EA544700009DD99 /* iOS */, 54DDB1831EA549ED0009DD99 /* iOSTests */, 54DDB1431EA544700009DD99 /* Mac */, + 54DDB1C01EA5508A0009DD99 /* MacTests */, + 54DDB1AA1EA54AD30009DD99 /* SharedTests */, ); path = ApolloSQLite; sourceTree = ""; @@ -282,17 +323,16 @@ 54DDB1831EA549ED0009DD99 /* iOSTests */ = { isa = PBXGroup; children = ( - 54DDB1AA1EA54AD30009DD99 /* SharedCacheTests */, - 54DDB1AB1EA54B740009DD99 /* CachePersistenceTests.swift */, 54DDB1A81EA54ACE0009DD99 /* TestCacheProvider.swift */, 54DDB1841EA549ED0009DD99 /* Info.plist */, ); path = iOSTests; sourceTree = ""; }; - 54DDB1AA1EA54AD30009DD99 /* SharedCacheTests */ = { + 54DDB1AA1EA54AD30009DD99 /* SharedTests */ = { isa = PBXGroup; children = ( + 54DDB1C51EA551310009DD99 /* CachePersistenceTests.swift */, 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */, 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */, 54DDB1891EA54A820009DD99 /* DataLoaderTests.swift */, @@ -310,7 +350,17 @@ 54DDB1951EA54A820009DD99 /* Utilities.swift */, 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */, ); - name = SharedCacheTests; + name = SharedTests; + path = iOSTests; + sourceTree = ""; + }; + 54DDB1C01EA5508A0009DD99 /* MacTests */ = { + isa = PBXGroup; + children = ( + 54DDB1D81EA552080009DD99 /* TestCacheProvider.swift */, + 54DDB1C21EA5508A0009DD99 /* Info.plist */, + ); + path = MacTests; sourceTree = ""; }; /* End PBXGroup section */ @@ -390,6 +440,24 @@ productReference = 54DDB1511EA546840009DD99 /* ApolloSQLiteIOSTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + 54DDB1B41EA550540009DD99 /* ApolloSQLiteMacTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 54DDB1BD1EA550550009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteMacTests" */; + buildPhases = ( + 54DDB1B11EA550540009DD99 /* Sources */, + 54DDB1B21EA550540009DD99 /* Frameworks */, + 54DDB1B31EA550540009DD99 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 54DDB1BC1EA550550009DD99 /* PBXTargetDependency */, + ); + name = ApolloSQLiteMacTests; + productName = ApolloSQLiteMacTests; + productReference = 54DDB1B51EA550540009DD99 /* ApolloSQLiteMacTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -412,6 +480,10 @@ CreatedOnToolsVersion = 8.3.1; ProvisioningStyle = Automatic; }; + 54DDB1B41EA550540009DD99 = { + CreatedOnToolsVersion = 8.3.1; + ProvisioningStyle = Automatic; + }; }; }; buildConfigurationList = 54DDB0B81EA1523E0009DD99 /* Build configuration list for PBXProject "ApolloSQLite" */; @@ -439,6 +511,7 @@ 54DDB0BD1EA1523E0009DD99 /* ApolloSQLiteIOS */, 54DDB1371EA543F80009DD99 /* ApolloSQLiteMac */, 54DDB1501EA546840009DD99 /* ApolloSQLiteIOSTests */, + 54DDB1B41EA550540009DD99 /* ApolloSQLiteMacTests */, ); }; /* End PBXProject section */ @@ -551,10 +624,18 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 54DDB1C41EA5508A0009DD99 /* Info.plist in Resources */, 54DDB1851EA549ED0009DD99 /* Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; + 54DDB1B31EA550540009DD99 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -590,7 +671,7 @@ 54DDB1A01EA54A820009DD99 /* NormalizeQueryResults.swift in Sources */, 54DDB1A11EA54A820009DD99 /* ParseQueryResponseTests.swift in Sources */, 54DDB1A21EA54A820009DD99 /* PromiseTests.swift in Sources */, - 54DDB1AC1EA54B740009DD99 /* CachePersistenceTests.swift in Sources */, + 54DDB1C61EA551310009DD99 /* CachePersistenceTests.swift in Sources */, 54DDB1A31EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift in Sources */, 54DDB1A41EA54A820009DD99 /* StarWarsServerTests.swift in Sources */, 54DDB1A51EA54A820009DD99 /* StoreTransactionTests.swift in Sources */, @@ -599,6 +680,31 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 54DDB1B11EA550540009DD99 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 54DDB1CA1EA551E60009DD99 /* DataLoaderTests.swift in Sources */, + 54DDB1DA1EA552100009DD99 /* TestCacheProvider.swift in Sources */, + 54DDB1CC1EA551E60009DD99 /* GraphQLExecutorFieldValueTests.swift in Sources */, + 54DDB1D11EA551E60009DD99 /* ParseQueryResponseTests.swift in Sources */, + 54DDB1D41EA551E60009DD99 /* StarWarsServerTests.swift in Sources */, + 54DDB1D21EA551E60009DD99 /* PromiseTests.swift in Sources */, + 54DDB1CE1EA551E60009DD99 /* LoadQueryFromStoreTests.swift in Sources */, + 54DDB1D71EA551E60009DD99 /* WatchQueryTests.swift in Sources */, + 54DDB1D61EA551E60009DD99 /* Utilities.swift in Sources */, + 54DDB1CD1EA551E60009DD99 /* GraphQLInputValueEncodingTests.swift in Sources */, + 54DDB1CB1EA551E60009DD99 /* FetchQueryTests.swift in Sources */, + 54DDB1C71EA5516B0009DD99 /* CachePersistenceTests.swift in Sources */, + 54DDB1D31EA551E60009DD99 /* StarWarsServerCachingRoundtripTests.swift in Sources */, + 54DDB1C91EA551E60009DD99 /* CacheKeyForFieldTests.swift in Sources */, + 54DDB1D01EA551E60009DD99 /* NormalizeQueryResults.swift in Sources */, + 54DDB1C81EA551E60009DD99 /* BatchedLoadTests.swift in Sources */, + 54DDB1D51EA551E60009DD99 /* StoreTransactionTests.swift in Sources */, + 54DDB1CF1EA551E60009DD99 /* MockNetworkTransport.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -612,6 +718,11 @@ name = StarWarsAPI; targetProxy = 54DDB17F1EA548C40009DD99 /* PBXContainerItemProxy */; }; + 54DDB1BC1EA550550009DD99 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 54DDB1371EA543F80009DD99 /* ApolloSQLiteMac */; + targetProxy = 54DDB1BB1EA550550009DD99 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ @@ -825,6 +936,36 @@ }; name = Release; }; + 54DDB1BE1EA550550009DD99 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "-"; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = ApolloSQLite/MacTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteMacTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 54DDB1BF1EA550550009DD99 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "-"; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = ApolloSQLite/MacTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteMacTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -862,6 +1003,14 @@ ); defaultConfigurationIsVisible = 0; }; + 54DDB1BD1EA550550009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteMacTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 54DDB1BE1EA550550009DD99 /* Debug */, + 54DDB1BF1EA550550009DD99 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; /* End XCConfigurationList section */ }; rootObject = 54DDB0B51EA1523E0009DD99 /* Project object */; diff --git a/ApolloSQLite/iOSTests/CachePersistenceTests.swift b/ApolloSQLite/CachePersistenceTests.swift similarity index 100% rename from ApolloSQLite/iOSTests/CachePersistenceTests.swift rename to ApolloSQLite/CachePersistenceTests.swift diff --git a/ApolloSQLite/MacTests/Info.plist b/ApolloSQLite/MacTests/Info.plist new file mode 100644 index 0000000000..6c6c23c43a --- /dev/null +++ b/ApolloSQLite/MacTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/ApolloSQLite/MacTests/TestCacheProvider.swift b/ApolloSQLite/MacTests/TestCacheProvider.swift new file mode 100644 index 0000000000..509056c5ee --- /dev/null +++ b/ApolloSQLite/MacTests/TestCacheProvider.swift @@ -0,0 +1,23 @@ +import Apollo +import ApolloSQLiteMac + +enum TestCacheProvider { + + /// Execute a test block rather than return a cache synchronously, since cache setup may be + /// asynchronous at some point. + static func withCache(initialRecords: RecordSet? = nil, clearCache: Bool = true, execute test: (NormalizedCache) -> ()) { + if clearCache { + try? FileManager.default.removeItem(at: sqliteFileURL) + } + let cache = try! SqliteNormalizedCache(fileURL: sqliteFileURL) + if let initialRecords = initialRecords { + _ = cache.merge(records: initialRecords) // This is synchronous + } + test(cache) + } + + private static var sqliteFileURL: URL { + let docDirURL = URL(fileURLWithPath:NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!) + return docDirURL.appendingPathComponent("db.sqlite3") + } +} From 859936be2240d9e9b55a38dc7f6f6102eb07f9f0 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 13:09:22 -0700 Subject: [PATCH 42/76] =?UTF-8?q?(continued)=20Restructure=20project=20int?= =?UTF-8?q?o=20two=20separate=20projects=20(Apollo=20and=20ApolloSQLite)?= =?UTF-8?q?=20with=20shared=20=E2=80=9Cparameterized=E2=80=9D=20unit=20tes?= =?UTF-8?q?ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ApolloSQLite.xcodeproj/project.pbxproj | 13 +++++-------- .../{ => SharedTests}/CachePersistenceTests.swift | 0 2 files changed, 5 insertions(+), 8 deletions(-) rename ApolloSQLite/{ => SharedTests}/CachePersistenceTests.swift (100%) diff --git a/ApolloSQLite.xcodeproj/project.pbxproj b/ApolloSQLite.xcodeproj/project.pbxproj index a0debe935c..4fdfd23c23 100644 --- a/ApolloSQLite.xcodeproj/project.pbxproj +++ b/ApolloSQLite.xcodeproj/project.pbxproj @@ -39,8 +39,6 @@ 54DDB1B01EA54F7F0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */; }; 54DDB1BA1EA550550009DD99 /* ApolloSQLiteMac.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB1381EA543F80009DD99 /* ApolloSQLiteMac.framework */; }; 54DDB1C41EA5508A0009DD99 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54DDB1C21EA5508A0009DD99 /* Info.plist */; }; - 54DDB1C61EA551310009DD99 /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1C51EA551310009DD99 /* CachePersistenceTests.swift */; }; - 54DDB1C71EA5516B0009DD99 /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1C51EA551310009DD99 /* CachePersistenceTests.swift */; }; 54DDB1C81EA551E60009DD99 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */; }; 54DDB1C91EA551E60009DD99 /* CacheKeyForFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */; }; 54DDB1CA1EA551E60009DD99 /* DataLoaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1891EA54A820009DD99 /* DataLoaderTests.swift */; }; @@ -58,6 +56,7 @@ 54DDB1D61EA551E60009DD99 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1951EA54A820009DD99 /* Utilities.swift */; }; 54DDB1D71EA551E60009DD99 /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */; }; 54DDB1DA1EA552100009DD99 /* TestCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1D81EA552080009DD99 /* TestCacheProvider.swift */; }; + 54DDB1DC1EA558220009DD99 /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -199,8 +198,8 @@ 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCache.swift; sourceTree = ""; }; 54DDB1B51EA550540009DD99 /* ApolloSQLiteMacTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloSQLiteMacTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 54DDB1C21EA5508A0009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 54DDB1C51EA551310009DD99 /* CachePersistenceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CachePersistenceTests.swift; path = ../CachePersistenceTests.swift; sourceTree = ""; }; 54DDB1D81EA552080009DD99 /* TestCacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestCacheProvider.swift; sourceTree = ""; }; + 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachePersistenceTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -332,7 +331,7 @@ 54DDB1AA1EA54AD30009DD99 /* SharedTests */ = { isa = PBXGroup; children = ( - 54DDB1C51EA551310009DD99 /* CachePersistenceTests.swift */, + 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */, 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */, 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */, 54DDB1891EA54A820009DD99 /* DataLoaderTests.swift */, @@ -350,8 +349,7 @@ 54DDB1951EA54A820009DD99 /* Utilities.swift */, 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */, ); - name = SharedTests; - path = iOSTests; + path = SharedTests; sourceTree = ""; }; 54DDB1C01EA5508A0009DD99 /* MacTests */ = { @@ -671,7 +669,7 @@ 54DDB1A01EA54A820009DD99 /* NormalizeQueryResults.swift in Sources */, 54DDB1A11EA54A820009DD99 /* ParseQueryResponseTests.swift in Sources */, 54DDB1A21EA54A820009DD99 /* PromiseTests.swift in Sources */, - 54DDB1C61EA551310009DD99 /* CachePersistenceTests.swift in Sources */, + 54DDB1DC1EA558220009DD99 /* CachePersistenceTests.swift in Sources */, 54DDB1A31EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift in Sources */, 54DDB1A41EA54A820009DD99 /* StarWarsServerTests.swift in Sources */, 54DDB1A51EA54A820009DD99 /* StoreTransactionTests.swift in Sources */, @@ -695,7 +693,6 @@ 54DDB1D61EA551E60009DD99 /* Utilities.swift in Sources */, 54DDB1CD1EA551E60009DD99 /* GraphQLInputValueEncodingTests.swift in Sources */, 54DDB1CB1EA551E60009DD99 /* FetchQueryTests.swift in Sources */, - 54DDB1C71EA5516B0009DD99 /* CachePersistenceTests.swift in Sources */, 54DDB1D31EA551E60009DD99 /* StarWarsServerCachingRoundtripTests.swift in Sources */, 54DDB1C91EA551E60009DD99 /* CacheKeyForFieldTests.swift in Sources */, 54DDB1D01EA551E60009DD99 /* NormalizeQueryResults.swift in Sources */, diff --git a/ApolloSQLite/CachePersistenceTests.swift b/ApolloSQLite/SharedTests/CachePersistenceTests.swift similarity index 100% rename from ApolloSQLite/CachePersistenceTests.swift rename to ApolloSQLite/SharedTests/CachePersistenceTests.swift From cd130e56ca1421edd8866dd73f5649fd2fa8342d Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 14:23:53 -0700 Subject: [PATCH 43/76] =?UTF-8?q?(continued)=20Restructure=20project=20int?= =?UTF-8?q?o=20two=20separate=20projects=20(Apollo=20and=20ApolloSQLite)?= =?UTF-8?q?=20with=20shared=20=E2=80=9Cparameterized=E2=80=9D=20unit=20tes?= =?UTF-8?q?ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ApolloSQLite.xcodeproj/project.pbxproj | 54 +++++++++++-------- ApolloSQLite/MacTests/TestCacheProvider.swift | 2 +- ApolloSQLite/iOSTests/TestCacheProvider.swift | 2 +- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/ApolloSQLite.xcodeproj/project.pbxproj b/ApolloSQLite.xcodeproj/project.pbxproj index 4fdfd23c23..5a3830c013 100644 --- a/ApolloSQLite.xcodeproj/project.pbxproj +++ b/ApolloSQLite.xcodeproj/project.pbxproj @@ -7,15 +7,13 @@ objects = { /* Begin PBXBuildFile section */ + 5438068E1EA5699700F55B72 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0DA1EA156170009DD99 /* StarWarsAPI.framework */; }; 54DDB0F71EA157870009DD99 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0D41EA156170009DD99 /* Apollo.framework */; }; 54DDB1091EA53FD30009DD99 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0EA1EA1573C0009DD99 /* SQLite.framework */; }; - 54DDB1461EA544700009DD99 /* ApolloSQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = 54DDB1411EA544700009DD99 /* ApolloSQLite.h */; }; - 54DDB1471EA544700009DD99 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54DDB1421EA544700009DD99 /* Info.plist */; }; - 54DDB1481EA544700009DD99 /* ApolloSQLiteMac.h in Headers */ = {isa = PBXBuildFile; fileRef = 54DDB1441EA544700009DD99 /* ApolloSQLiteMac.h */; }; - 54DDB1491EA544700009DD99 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54DDB1451EA544700009DD99 /* Info.plist */; }; + 54DDB1461EA544700009DD99 /* ApolloSQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = 54DDB1411EA544700009DD99 /* ApolloSQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; 54DDB14B1EA545500009DD99 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0D41EA156170009DD99 /* Apollo.framework */; }; 54DDB14C1EA545560009DD99 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0EE1EA1573C0009DD99 /* SQLite.framework */; }; - 54DDB1561EA546840009DD99 /* ApolloSQLiteIOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0BE1EA1523E0009DD99 /* ApolloSQLiteIOS.framework */; }; + 54DDB1561EA546840009DD99 /* ApolloSQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0BE1EA1523E0009DD99 /* ApolloSQLite.framework */; }; 54DDB17E1EA548BC0009DD99 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0DA1EA156170009DD99 /* StarWarsAPI.framework */; }; 54DDB1851EA549ED0009DD99 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54DDB1841EA549ED0009DD99 /* Info.plist */; }; 54DDB1971EA54A820009DD99 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */; }; @@ -37,7 +35,7 @@ 54DDB1A91EA54ACE0009DD99 /* TestCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1A81EA54ACE0009DD99 /* TestCacheProvider.swift */; }; 54DDB1AF1EA54F7E0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */; }; 54DDB1B01EA54F7F0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */; }; - 54DDB1BA1EA550550009DD99 /* ApolloSQLiteMac.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB1381EA543F80009DD99 /* ApolloSQLiteMac.framework */; }; + 54DDB1BA1EA550550009DD99 /* ApolloSQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB1381EA543F80009DD99 /* ApolloSQLite.framework */; }; 54DDB1C41EA5508A0009DD99 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54DDB1C21EA5508A0009DD99 /* Info.plist */; }; 54DDB1C81EA551E60009DD99 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */; }; 54DDB1C91EA551E60009DD99 /* CacheKeyForFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */; }; @@ -60,6 +58,13 @@ /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 5438068F1EA569C500F55B72 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 9FCE2CF91E6C213D00E34457; + remoteInfo = StarWarsAPI; + }; 54DDB0D31EA156170009DD99 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */; @@ -168,10 +173,10 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 54DDB0BE1EA1523E0009DD99 /* ApolloSQLiteIOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ApolloSQLiteIOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54DDB0BE1EA1523E0009DD99 /* ApolloSQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ApolloSQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Apollo.xcodeproj; sourceTree = ""; }; 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SQLite.xcodeproj; path = Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj; sourceTree = ""; }; - 54DDB1381EA543F80009DD99 /* ApolloSQLiteMac.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ApolloSQLiteMac.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 54DDB1381EA543F80009DD99 /* ApolloSQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ApolloSQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 54DDB1411EA544700009DD99 /* ApolloSQLite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApolloSQLite.h; sourceTree = ""; }; 54DDB1421EA544700009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54DDB1441EA544700009DD99 /* ApolloSQLiteMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApolloSQLiteMac.h; sourceTree = ""; }; @@ -226,7 +231,7 @@ buildActionMask = 2147483647; files = ( 54DDB17E1EA548BC0009DD99 /* StarWarsAPI.framework in Frameworks */, - 54DDB1561EA546840009DD99 /* ApolloSQLiteIOS.framework in Frameworks */, + 54DDB1561EA546840009DD99 /* ApolloSQLite.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -234,7 +239,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 54DDB1BA1EA550550009DD99 /* ApolloSQLiteMac.framework in Frameworks */, + 5438068E1EA5699700F55B72 /* StarWarsAPI.framework in Frameworks */, + 54DDB1BA1EA550550009DD99 /* ApolloSQLite.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -254,8 +260,8 @@ 54DDB0BF1EA1523E0009DD99 /* Products */ = { isa = PBXGroup; children = ( - 54DDB0BE1EA1523E0009DD99 /* ApolloSQLiteIOS.framework */, - 54DDB1381EA543F80009DD99 /* ApolloSQLiteMac.framework */, + 54DDB0BE1EA1523E0009DD99 /* ApolloSQLite.framework */, + 54DDB1381EA543F80009DD99 /* ApolloSQLite.framework */, 54DDB1511EA546840009DD99 /* ApolloSQLiteIOSTests.xctest */, 54DDB1B51EA550540009DD99 /* ApolloSQLiteMacTests.xctest */, ); @@ -369,7 +375,6 @@ buildActionMask = 2147483647; files = ( 54DDB1461EA544700009DD99 /* ApolloSQLite.h in Headers */, - 54DDB1481EA544700009DD99 /* ApolloSQLiteMac.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -398,7 +403,7 @@ ); name = ApolloSQLiteIOS; productName = ApolloSQLite; - productReference = 54DDB0BE1EA1523E0009DD99 /* ApolloSQLiteIOS.framework */; + productReference = 54DDB0BE1EA1523E0009DD99 /* ApolloSQLite.framework */; productType = "com.apple.product-type.framework"; }; 54DDB1371EA543F80009DD99 /* ApolloSQLiteMac */ = { @@ -416,7 +421,7 @@ ); name = ApolloSQLiteMac; productName = ApolloSQLiteMac; - productReference = 54DDB1381EA543F80009DD99 /* ApolloSQLiteMac.framework */; + productReference = 54DDB1381EA543F80009DD99 /* ApolloSQLite.framework */; productType = "com.apple.product-type.framework"; }; 54DDB1501EA546840009DD99 /* ApolloSQLiteIOSTests */ = { @@ -449,6 +454,7 @@ buildRules = ( ); dependencies = ( + 543806901EA569C500F55B72 /* PBXTargetDependency */, 54DDB1BC1EA550550009DD99 /* PBXTargetDependency */, ); name = ApolloSQLiteMacTests; @@ -606,8 +612,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 54DDB1491EA544700009DD99 /* Info.plist in Resources */, - 54DDB1471EA544700009DD99 /* Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -705,6 +709,11 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 543806901EA569C500F55B72 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = StarWarsAPI; + targetProxy = 5438068F1EA569C500F55B72 /* PBXContainerItemProxy */; + }; 54DDB1581EA546840009DD99 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 54DDB0BD1EA1523E0009DD99 /* ApolloSQLiteIOS */; @@ -838,7 +847,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 10.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLite; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = ApolloSQLite; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 3.0; @@ -859,7 +868,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 10.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLite; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = ApolloSQLite; SKIP_INSTALL = YES; SWIFT_VERSION = 3.0; }; @@ -880,7 +889,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.12; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLite; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = ApolloSQLite; SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_VERSION = 3.0; @@ -902,7 +911,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MACOSX_DEPLOYMENT_TARGET = 10.12; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLite; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = ApolloSQLite; SDKROOT = macosx; SKIP_INSTALL = YES; SWIFT_VERSION = 3.0; @@ -991,6 +1000,7 @@ 54DDB13F1EA543F80009DD99 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 54DDB1591EA546840009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteIOSTests" */ = { isa = XCConfigurationList; @@ -999,6 +1009,7 @@ 54DDB15B1EA546840009DD99 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 54DDB1BD1EA550550009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteMacTests" */ = { isa = XCConfigurationList; @@ -1007,6 +1018,7 @@ 54DDB1BF1EA550550009DD99 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/ApolloSQLite/MacTests/TestCacheProvider.swift b/ApolloSQLite/MacTests/TestCacheProvider.swift index 509056c5ee..e955a5f58e 100644 --- a/ApolloSQLite/MacTests/TestCacheProvider.swift +++ b/ApolloSQLite/MacTests/TestCacheProvider.swift @@ -1,5 +1,5 @@ import Apollo -import ApolloSQLiteMac +import ApolloSQLite enum TestCacheProvider { diff --git a/ApolloSQLite/iOSTests/TestCacheProvider.swift b/ApolloSQLite/iOSTests/TestCacheProvider.swift index 68e73e6e2e..e955a5f58e 100644 --- a/ApolloSQLite/iOSTests/TestCacheProvider.swift +++ b/ApolloSQLite/iOSTests/TestCacheProvider.swift @@ -1,5 +1,5 @@ import Apollo -import ApolloSQLiteIOS +import ApolloSQLite enum TestCacheProvider { From 25a72bb46489add6ae3360af278f348e72c77029 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 14:39:44 -0700 Subject: [PATCH 44/76] =?UTF-8?q?(continued)=20Restructure=20project=20int?= =?UTF-8?q?o=20two=20separate=20projects=20(Apollo=20and=20ApolloSQLite)?= =?UTF-8?q?=20with=20shared=20=E2=80=9Cparameterized=E2=80=9D=20unit=20tes?= =?UTF-8?q?ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ApolloSQLite.xcodeproj/project.pbxproj | 277 +++++++++--------- .../TestCacheProvider.swift | 0 ApolloSQLite/iOSTests/TestCacheProvider.swift | 23 -- 3 files changed, 135 insertions(+), 165 deletions(-) rename ApolloSQLite/{MacTests => SharedTests}/TestCacheProvider.swift (100%) delete mode 100644 ApolloSQLite/iOSTests/TestCacheProvider.swift diff --git a/ApolloSQLite.xcodeproj/project.pbxproj b/ApolloSQLite.xcodeproj/project.pbxproj index 5a3830c013..ebb9cd8b28 100644 --- a/ApolloSQLite.xcodeproj/project.pbxproj +++ b/ApolloSQLite.xcodeproj/project.pbxproj @@ -8,35 +8,36 @@ /* Begin PBXBuildFile section */ 5438068E1EA5699700F55B72 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0DA1EA156170009DD99 /* StarWarsAPI.framework */; }; + 5438069A1EA56C2200F55B72 /* ApolloSQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0BE1EA1523E0009DD99 /* ApolloSQLite.framework */; }; + 543806A21EA56CE700F55B72 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0DA1EA156170009DD99 /* StarWarsAPI.framework */; }; + 543806A31EA56D1500F55B72 /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */; }; + 543806A41EA56D1500F55B72 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */; }; + 543806A51EA56D1500F55B72 /* CacheKeyForFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */; }; + 543806A61EA56D1500F55B72 /* DataLoaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1891EA54A820009DD99 /* DataLoaderTests.swift */; }; + 543806A71EA56D1500F55B72 /* FetchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18A1EA54A820009DD99 /* FetchQueryTests.swift */; }; + 543806A81EA56D1500F55B72 /* GraphQLExecutorFieldValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18B1EA54A820009DD99 /* GraphQLExecutorFieldValueTests.swift */; }; + 543806A91EA56D1500F55B72 /* GraphQLInputValueEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18C1EA54A820009DD99 /* GraphQLInputValueEncodingTests.swift */; }; + 543806AA1EA56D1500F55B72 /* LoadQueryFromStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18D1EA54A820009DD99 /* LoadQueryFromStoreTests.swift */; }; + 543806AB1EA56D1500F55B72 /* MockNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18E1EA54A820009DD99 /* MockNetworkTransport.swift */; }; + 543806AC1EA56D1500F55B72 /* NormalizeQueryResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18F1EA54A820009DD99 /* NormalizeQueryResults.swift */; }; + 543806AD1EA56D1500F55B72 /* ParseQueryResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1901EA54A820009DD99 /* ParseQueryResponseTests.swift */; }; + 543806AE1EA56D1500F55B72 /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1911EA54A820009DD99 /* PromiseTests.swift */; }; + 543806AF1EA56D1500F55B72 /* StarWarsServerCachingRoundtripTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1921EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift */; }; + 543806B01EA56D1500F55B72 /* StarWarsServerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1931EA54A820009DD99 /* StarWarsServerTests.swift */; }; + 543806B11EA56D1500F55B72 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1941EA54A820009DD99 /* StoreTransactionTests.swift */; }; + 543806B21EA56D1500F55B72 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1951EA54A820009DD99 /* Utilities.swift */; }; + 543806B31EA56D1500F55B72 /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */; }; + 543806B61EA56D5C00F55B72 /* TestCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 543806B41EA56D5600F55B72 /* TestCacheProvider.swift */; }; + 543806B71EA56D5C00F55B72 /* TestCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 543806B41EA56D5600F55B72 /* TestCacheProvider.swift */; }; + 543806B81EA56D8400F55B72 /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */; }; 54DDB0F71EA157870009DD99 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0D41EA156170009DD99 /* Apollo.framework */; }; 54DDB1091EA53FD30009DD99 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0EA1EA1573C0009DD99 /* SQLite.framework */; }; 54DDB1461EA544700009DD99 /* ApolloSQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = 54DDB1411EA544700009DD99 /* ApolloSQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; 54DDB14B1EA545500009DD99 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0D41EA156170009DD99 /* Apollo.framework */; }; 54DDB14C1EA545560009DD99 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0EE1EA1573C0009DD99 /* SQLite.framework */; }; - 54DDB1561EA546840009DD99 /* ApolloSQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0BE1EA1523E0009DD99 /* ApolloSQLite.framework */; }; - 54DDB17E1EA548BC0009DD99 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0DA1EA156170009DD99 /* StarWarsAPI.framework */; }; - 54DDB1851EA549ED0009DD99 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54DDB1841EA549ED0009DD99 /* Info.plist */; }; - 54DDB1971EA54A820009DD99 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */; }; - 54DDB1981EA54A820009DD99 /* CacheKeyForFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */; }; - 54DDB19A1EA54A820009DD99 /* DataLoaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1891EA54A820009DD99 /* DataLoaderTests.swift */; }; - 54DDB19B1EA54A820009DD99 /* FetchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18A1EA54A820009DD99 /* FetchQueryTests.swift */; }; - 54DDB19C1EA54A820009DD99 /* GraphQLExecutorFieldValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18B1EA54A820009DD99 /* GraphQLExecutorFieldValueTests.swift */; }; - 54DDB19D1EA54A820009DD99 /* GraphQLInputValueEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18C1EA54A820009DD99 /* GraphQLInputValueEncodingTests.swift */; }; - 54DDB19E1EA54A820009DD99 /* LoadQueryFromStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18D1EA54A820009DD99 /* LoadQueryFromStoreTests.swift */; }; - 54DDB19F1EA54A820009DD99 /* MockNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18E1EA54A820009DD99 /* MockNetworkTransport.swift */; }; - 54DDB1A01EA54A820009DD99 /* NormalizeQueryResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18F1EA54A820009DD99 /* NormalizeQueryResults.swift */; }; - 54DDB1A11EA54A820009DD99 /* ParseQueryResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1901EA54A820009DD99 /* ParseQueryResponseTests.swift */; }; - 54DDB1A21EA54A820009DD99 /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1911EA54A820009DD99 /* PromiseTests.swift */; }; - 54DDB1A31EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1921EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift */; }; - 54DDB1A41EA54A820009DD99 /* StarWarsServerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1931EA54A820009DD99 /* StarWarsServerTests.swift */; }; - 54DDB1A51EA54A820009DD99 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1941EA54A820009DD99 /* StoreTransactionTests.swift */; }; - 54DDB1A61EA54A820009DD99 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1951EA54A820009DD99 /* Utilities.swift */; }; - 54DDB1A71EA54A820009DD99 /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */; }; - 54DDB1A91EA54ACE0009DD99 /* TestCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1A81EA54ACE0009DD99 /* TestCacheProvider.swift */; }; 54DDB1AF1EA54F7E0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */; }; 54DDB1B01EA54F7F0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */; }; 54DDB1BA1EA550550009DD99 /* ApolloSQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB1381EA543F80009DD99 /* ApolloSQLite.framework */; }; - 54DDB1C41EA5508A0009DD99 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 54DDB1C21EA5508A0009DD99 /* Info.plist */; }; 54DDB1C81EA551E60009DD99 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */; }; 54DDB1C91EA551E60009DD99 /* CacheKeyForFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */; }; 54DDB1CA1EA551E60009DD99 /* DataLoaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1891EA54A820009DD99 /* DataLoaderTests.swift */; }; @@ -53,8 +54,6 @@ 54DDB1D51EA551E60009DD99 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1941EA54A820009DD99 /* StoreTransactionTests.swift */; }; 54DDB1D61EA551E60009DD99 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1951EA54A820009DD99 /* Utilities.swift */; }; 54DDB1D71EA551E60009DD99 /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */; }; - 54DDB1DA1EA552100009DD99 /* TestCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1D81EA552080009DD99 /* TestCacheProvider.swift */; }; - 54DDB1DC1EA558220009DD99 /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -65,6 +64,20 @@ remoteGlobalIDString = 9FCE2CF91E6C213D00E34457; remoteInfo = StarWarsAPI; }; + 5438069B1EA56C2200F55B72 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0B51EA1523E0009DD99 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 54DDB0BD1EA1523E0009DD99; + remoteInfo = ApolloSQLiteIOS; + }; + 543806A01EA56CE300F55B72 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 9FCE2CF91E6C213D00E34457; + remoteInfo = StarWarsAPI; + }; 54DDB0D31EA156170009DD99 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */; @@ -149,20 +162,6 @@ remoteGlobalIDString = A121AC451CA35C79005A31D1; remoteInfo = "SQLite watchOS"; }; - 54DDB1571EA546840009DD99 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 54DDB0B51EA1523E0009DD99 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 54DDB0BD1EA1523E0009DD99; - remoteInfo = ApolloSQLiteIOS; - }; - 54DDB17F1EA548C40009DD99 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 9FCE2CF91E6C213D00E34457; - remoteInfo = StarWarsAPI; - }; 54DDB1BB1EA550550009DD99 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 54DDB0B51EA1523E0009DD99 /* Project object */; @@ -173,6 +172,8 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 543806951EA56C2200F55B72 /* ApolloSQLiteIOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloSQLiteIOSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 543806B41EA56D5600F55B72 /* TestCacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestCacheProvider.swift; sourceTree = ""; }; 54DDB0BE1EA1523E0009DD99 /* ApolloSQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ApolloSQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Apollo.xcodeproj; sourceTree = ""; }; 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SQLite.xcodeproj; path = Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj; sourceTree = ""; }; @@ -181,7 +182,6 @@ 54DDB1421EA544700009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54DDB1441EA544700009DD99 /* ApolloSQLiteMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApolloSQLiteMac.h; sourceTree = ""; }; 54DDB1451EA544700009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 54DDB1511EA546840009DD99 /* ApolloSQLiteIOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloSQLiteIOSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 54DDB1841EA549ED0009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = BatchedLoadTests.swift; path = ../../Tests/ApolloTests/BatchedLoadTests.swift; sourceTree = ""; }; 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = CacheKeyForFieldTests.swift; path = ../../Tests/ApolloTests/CacheKeyForFieldTests.swift; sourceTree = ""; }; @@ -199,39 +199,37 @@ 54DDB1941EA54A820009DD99 /* StoreTransactionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = StoreTransactionTests.swift; path = ../../Tests/ApolloTests/StoreTransactionTests.swift; sourceTree = ""; }; 54DDB1951EA54A820009DD99 /* Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Utilities.swift; path = ../../Tests/ApolloTests/Utilities.swift; sourceTree = ""; }; 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = WatchQueryTests.swift; path = ../../Tests/ApolloTests/WatchQueryTests.swift; sourceTree = ""; }; - 54DDB1A81EA54ACE0009DD99 /* TestCacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestCacheProvider.swift; sourceTree = ""; }; 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCache.swift; sourceTree = ""; }; 54DDB1B51EA550540009DD99 /* ApolloSQLiteMacTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloSQLiteMacTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 54DDB1C21EA5508A0009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 54DDB1D81EA552080009DD99 /* TestCacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestCacheProvider.swift; sourceTree = ""; }; 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachePersistenceTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 54DDB0BA1EA1523E0009DD99 /* Frameworks */ = { + 543806921EA56C2200F55B72 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 54DDB1091EA53FD30009DD99 /* SQLite.framework in Frameworks */, - 54DDB0F71EA157870009DD99 /* Apollo.framework in Frameworks */, + 543806A21EA56CE700F55B72 /* StarWarsAPI.framework in Frameworks */, + 5438069A1EA56C2200F55B72 /* ApolloSQLite.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 54DDB1341EA543F80009DD99 /* Frameworks */ = { + 54DDB0BA1EA1523E0009DD99 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 54DDB14C1EA545560009DD99 /* SQLite.framework in Frameworks */, - 54DDB14B1EA545500009DD99 /* Apollo.framework in Frameworks */, + 54DDB1091EA53FD30009DD99 /* SQLite.framework in Frameworks */, + 54DDB0F71EA157870009DD99 /* Apollo.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 54DDB14E1EA546840009DD99 /* Frameworks */ = { + 54DDB1341EA543F80009DD99 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 54DDB17E1EA548BC0009DD99 /* StarWarsAPI.framework in Frameworks */, - 54DDB1561EA546840009DD99 /* ApolloSQLite.framework in Frameworks */, + 54DDB14C1EA545560009DD99 /* SQLite.framework in Frameworks */, + 54DDB14B1EA545500009DD99 /* Apollo.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -262,8 +260,8 @@ children = ( 54DDB0BE1EA1523E0009DD99 /* ApolloSQLite.framework */, 54DDB1381EA543F80009DD99 /* ApolloSQLite.framework */, - 54DDB1511EA546840009DD99 /* ApolloSQLiteIOSTests.xctest */, 54DDB1B51EA550540009DD99 /* ApolloSQLiteMacTests.xctest */, + 543806951EA56C2200F55B72 /* ApolloSQLiteIOSTests.xctest */, ); name = Products; sourceTree = ""; @@ -328,7 +326,6 @@ 54DDB1831EA549ED0009DD99 /* iOSTests */ = { isa = PBXGroup; children = ( - 54DDB1A81EA54ACE0009DD99 /* TestCacheProvider.swift */, 54DDB1841EA549ED0009DD99 /* Info.plist */, ); path = iOSTests; @@ -337,6 +334,7 @@ 54DDB1AA1EA54AD30009DD99 /* SharedTests */ = { isa = PBXGroup; children = ( + 543806B41EA56D5600F55B72 /* TestCacheProvider.swift */, 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */, 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */, 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */, @@ -361,7 +359,6 @@ 54DDB1C01EA5508A0009DD99 /* MacTests */ = { isa = PBXGroup; children = ( - 54DDB1D81EA552080009DD99 /* TestCacheProvider.swift */, 54DDB1C21EA5508A0009DD99 /* Info.plist */, ); path = MacTests; @@ -388,6 +385,25 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 543806941EA56C2200F55B72 /* ApolloSQLiteIOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5438069D1EA56C2200F55B72 /* Build configuration list for PBXNativeTarget "ApolloSQLiteIOSTests" */; + buildPhases = ( + 543806911EA56C2200F55B72 /* Sources */, + 543806921EA56C2200F55B72 /* Frameworks */, + 543806931EA56C2200F55B72 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 543806A11EA56CE300F55B72 /* PBXTargetDependency */, + 5438069C1EA56C2200F55B72 /* PBXTargetDependency */, + ); + name = ApolloSQLiteIOSTests; + productName = ApolloSQLiteIOSTests; + productReference = 543806951EA56C2200F55B72 /* ApolloSQLiteIOSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; 54DDB0BD1EA1523E0009DD99 /* ApolloSQLiteIOS */ = { isa = PBXNativeTarget; buildConfigurationList = 54DDB0C61EA1523E0009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteIOS" */; @@ -424,25 +440,6 @@ productReference = 54DDB1381EA543F80009DD99 /* ApolloSQLite.framework */; productType = "com.apple.product-type.framework"; }; - 54DDB1501EA546840009DD99 /* ApolloSQLiteIOSTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 54DDB1591EA546840009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteIOSTests" */; - buildPhases = ( - 54DDB14D1EA546840009DD99 /* Sources */, - 54DDB14E1EA546840009DD99 /* Frameworks */, - 54DDB14F1EA546840009DD99 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 54DDB1801EA548C40009DD99 /* PBXTargetDependency */, - 54DDB1581EA546840009DD99 /* PBXTargetDependency */, - ); - name = ApolloSQLiteIOSTests; - productName = ApolloSQLiteIOSTests; - productReference = 54DDB1511EA546840009DD99 /* ApolloSQLiteIOSTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; 54DDB1B41EA550540009DD99 /* ApolloSQLiteMacTests */ = { isa = PBXNativeTarget; buildConfigurationList = 54DDB1BD1EA550550009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteMacTests" */; @@ -471,16 +468,16 @@ LastSwiftUpdateCheck = 0830; LastUpgradeCheck = 0830; TargetAttributes = { - 54DDB0BD1EA1523E0009DD99 = { + 543806941EA56C2200F55B72 = { CreatedOnToolsVersion = 8.3.1; - LastSwiftMigration = 0830; ProvisioningStyle = Automatic; }; - 54DDB1371EA543F80009DD99 = { + 54DDB0BD1EA1523E0009DD99 = { CreatedOnToolsVersion = 8.3.1; + LastSwiftMigration = 0830; ProvisioningStyle = Automatic; }; - 54DDB1501EA546840009DD99 = { + 54DDB1371EA543F80009DD99 = { CreatedOnToolsVersion = 8.3.1; ProvisioningStyle = Automatic; }; @@ -514,8 +511,8 @@ targets = ( 54DDB0BD1EA1523E0009DD99 /* ApolloSQLiteIOS */, 54DDB1371EA543F80009DD99 /* ApolloSQLiteMac */, - 54DDB1501EA546840009DD99 /* ApolloSQLiteIOSTests */, 54DDB1B41EA550540009DD99 /* ApolloSQLiteMacTests */, + 543806941EA56C2200F55B72 /* ApolloSQLiteIOSTests */, ); }; /* End PBXProject section */ @@ -608,26 +605,24 @@ /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ - 54DDB0BC1EA1523E0009DD99 /* Resources */ = { + 543806931EA56C2200F55B72 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 54DDB1361EA543F80009DD99 /* Resources */ = { + 54DDB0BC1EA1523E0009DD99 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 54DDB14F1EA546840009DD99 /* Resources */ = { + 54DDB1361EA543F80009DD99 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 54DDB1C41EA5508A0009DD99 /* Info.plist in Resources */, - 54DDB1851EA549ED0009DD99 /* Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -641,44 +636,44 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 54DDB0B91EA1523E0009DD99 /* Sources */ = { + 543806911EA56C2200F55B72 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 54DDB1AF1EA54F7E0009DD99 /* SqliteNormalizedCache.swift in Sources */, + 543806A61EA56D1500F55B72 /* DataLoaderTests.swift in Sources */, + 543806B71EA56D5C00F55B72 /* TestCacheProvider.swift in Sources */, + 543806A81EA56D1500F55B72 /* GraphQLExecutorFieldValueTests.swift in Sources */, + 543806AD1EA56D1500F55B72 /* ParseQueryResponseTests.swift in Sources */, + 543806B01EA56D1500F55B72 /* StarWarsServerTests.swift in Sources */, + 543806AE1EA56D1500F55B72 /* PromiseTests.swift in Sources */, + 543806AA1EA56D1500F55B72 /* LoadQueryFromStoreTests.swift in Sources */, + 543806B31EA56D1500F55B72 /* WatchQueryTests.swift in Sources */, + 543806B21EA56D1500F55B72 /* Utilities.swift in Sources */, + 543806A91EA56D1500F55B72 /* GraphQLInputValueEncodingTests.swift in Sources */, + 543806A71EA56D1500F55B72 /* FetchQueryTests.swift in Sources */, + 543806A31EA56D1500F55B72 /* CachePersistenceTests.swift in Sources */, + 543806AF1EA56D1500F55B72 /* StarWarsServerCachingRoundtripTests.swift in Sources */, + 543806A51EA56D1500F55B72 /* CacheKeyForFieldTests.swift in Sources */, + 543806AC1EA56D1500F55B72 /* NormalizeQueryResults.swift in Sources */, + 543806A41EA56D1500F55B72 /* BatchedLoadTests.swift in Sources */, + 543806B11EA56D1500F55B72 /* StoreTransactionTests.swift in Sources */, + 543806AB1EA56D1500F55B72 /* MockNetworkTransport.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 54DDB1331EA543F80009DD99 /* Sources */ = { + 54DDB0B91EA1523E0009DD99 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 54DDB1B01EA54F7F0009DD99 /* SqliteNormalizedCache.swift in Sources */, + 54DDB1AF1EA54F7E0009DD99 /* SqliteNormalizedCache.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 54DDB14D1EA546840009DD99 /* Sources */ = { + 54DDB1331EA543F80009DD99 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 54DDB1971EA54A820009DD99 /* BatchedLoadTests.swift in Sources */, - 54DDB1A91EA54ACE0009DD99 /* TestCacheProvider.swift in Sources */, - 54DDB1981EA54A820009DD99 /* CacheKeyForFieldTests.swift in Sources */, - 54DDB19A1EA54A820009DD99 /* DataLoaderTests.swift in Sources */, - 54DDB19B1EA54A820009DD99 /* FetchQueryTests.swift in Sources */, - 54DDB19C1EA54A820009DD99 /* GraphQLExecutorFieldValueTests.swift in Sources */, - 54DDB19D1EA54A820009DD99 /* GraphQLInputValueEncodingTests.swift in Sources */, - 54DDB19E1EA54A820009DD99 /* LoadQueryFromStoreTests.swift in Sources */, - 54DDB19F1EA54A820009DD99 /* MockNetworkTransport.swift in Sources */, - 54DDB1A01EA54A820009DD99 /* NormalizeQueryResults.swift in Sources */, - 54DDB1A11EA54A820009DD99 /* ParseQueryResponseTests.swift in Sources */, - 54DDB1A21EA54A820009DD99 /* PromiseTests.swift in Sources */, - 54DDB1DC1EA558220009DD99 /* CachePersistenceTests.swift in Sources */, - 54DDB1A31EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift in Sources */, - 54DDB1A41EA54A820009DD99 /* StarWarsServerTests.swift in Sources */, - 54DDB1A51EA54A820009DD99 /* StoreTransactionTests.swift in Sources */, - 54DDB1A61EA54A820009DD99 /* Utilities.swift in Sources */, - 54DDB1A71EA54A820009DD99 /* WatchQueryTests.swift in Sources */, + 54DDB1B01EA54F7F0009DD99 /* SqliteNormalizedCache.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -687,7 +682,6 @@ buildActionMask = 2147483647; files = ( 54DDB1CA1EA551E60009DD99 /* DataLoaderTests.swift in Sources */, - 54DDB1DA1EA552100009DD99 /* TestCacheProvider.swift in Sources */, 54DDB1CC1EA551E60009DD99 /* GraphQLExecutorFieldValueTests.swift in Sources */, 54DDB1D11EA551E60009DD99 /* ParseQueryResponseTests.swift in Sources */, 54DDB1D41EA551E60009DD99 /* StarWarsServerTests.swift in Sources */, @@ -698,6 +692,8 @@ 54DDB1CD1EA551E60009DD99 /* GraphQLInputValueEncodingTests.swift in Sources */, 54DDB1CB1EA551E60009DD99 /* FetchQueryTests.swift in Sources */, 54DDB1D31EA551E60009DD99 /* StarWarsServerCachingRoundtripTests.swift in Sources */, + 543806B61EA56D5C00F55B72 /* TestCacheProvider.swift in Sources */, + 543806B81EA56D8400F55B72 /* CachePersistenceTests.swift in Sources */, 54DDB1C91EA551E60009DD99 /* CacheKeyForFieldTests.swift in Sources */, 54DDB1D01EA551E60009DD99 /* NormalizeQueryResults.swift in Sources */, 54DDB1C81EA551E60009DD99 /* BatchedLoadTests.swift in Sources */, @@ -714,15 +710,15 @@ name = StarWarsAPI; targetProxy = 5438068F1EA569C500F55B72 /* PBXContainerItemProxy */; }; - 54DDB1581EA546840009DD99 /* PBXTargetDependency */ = { + 5438069C1EA56C2200F55B72 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 54DDB0BD1EA1523E0009DD99 /* ApolloSQLiteIOS */; - targetProxy = 54DDB1571EA546840009DD99 /* PBXContainerItemProxy */; + targetProxy = 5438069B1EA56C2200F55B72 /* PBXContainerItemProxy */; }; - 54DDB1801EA548C40009DD99 /* PBXTargetDependency */ = { + 543806A11EA56CE300F55B72 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = StarWarsAPI; - targetProxy = 54DDB17F1EA548C40009DD99 /* PBXContainerItemProxy */; + targetProxy = 543806A01EA56CE300F55B72 /* PBXContainerItemProxy */; }; 54DDB1BC1EA550550009DD99 /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -732,6 +728,28 @@ /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ + 5438069E1EA56C2200F55B72 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = ApolloSQLite/iOSTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteIOSTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 5438069F1EA56C2200F55B72 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = ApolloSQLite/iOSTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteIOSTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; 54DDB0C41EA1523E0009DD99 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -918,30 +936,6 @@ }; name = Release; }; - 54DDB15A1EA546840009DD99 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - INFOPLIST_FILE = ApolloSQLite/iOSTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteIOSTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - 54DDB15B1EA546840009DD99 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - INFOPLIST_FILE = ApolloSQLite/iOSTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteIOSTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; 54DDB1BE1EA550550009DD99 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -975,6 +969,14 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 5438069D1EA56C2200F55B72 /* Build configuration list for PBXNativeTarget "ApolloSQLiteIOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5438069E1EA56C2200F55B72 /* Debug */, + 5438069F1EA56C2200F55B72 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; 54DDB0B81EA1523E0009DD99 /* Build configuration list for PBXProject "ApolloSQLite" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1002,15 +1004,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 54DDB1591EA546840009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteIOSTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 54DDB15A1EA546840009DD99 /* Debug */, - 54DDB15B1EA546840009DD99 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 54DDB1BD1EA550550009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteMacTests" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/ApolloSQLite/MacTests/TestCacheProvider.swift b/ApolloSQLite/SharedTests/TestCacheProvider.swift similarity index 100% rename from ApolloSQLite/MacTests/TestCacheProvider.swift rename to ApolloSQLite/SharedTests/TestCacheProvider.swift diff --git a/ApolloSQLite/iOSTests/TestCacheProvider.swift b/ApolloSQLite/iOSTests/TestCacheProvider.swift deleted file mode 100644 index e955a5f58e..0000000000 --- a/ApolloSQLite/iOSTests/TestCacheProvider.swift +++ /dev/null @@ -1,23 +0,0 @@ -import Apollo -import ApolloSQLite - -enum TestCacheProvider { - - /// Execute a test block rather than return a cache synchronously, since cache setup may be - /// asynchronous at some point. - static func withCache(initialRecords: RecordSet? = nil, clearCache: Bool = true, execute test: (NormalizedCache) -> ()) { - if clearCache { - try? FileManager.default.removeItem(at: sqliteFileURL) - } - let cache = try! SqliteNormalizedCache(fileURL: sqliteFileURL) - if let initialRecords = initialRecords { - _ = cache.merge(records: initialRecords) // This is synchronous - } - test(cache) - } - - private static var sqliteFileURL: URL { - let docDirURL = URL(fileURLWithPath:NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!) - return docDirURL.appendingPathComponent("db.sqlite3") - } -} From ded68d74facc07fe1e0fdaf35bbffedbb5e139cc Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 14:50:34 -0700 Subject: [PATCH 45/76] =?UTF-8?q?(continued)=20Restructure=20project=20int?= =?UTF-8?q?o=20two=20separate=20projects=20(Apollo=20and=20ApolloSQLite)?= =?UTF-8?q?=20with=20shared=20=E2=80=9Cparameterized=E2=80=9D=20unit=20tes?= =?UTF-8?q?ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ApolloSQLite.xcodeproj/project.pbxproj | 4 ++-- ApolloSQLite/Mac/{ApolloSQLiteMac.h => ApolloSQLite.h} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename ApolloSQLite/Mac/{ApolloSQLiteMac.h => ApolloSQLite.h} (100%) diff --git a/ApolloSQLite.xcodeproj/project.pbxproj b/ApolloSQLite.xcodeproj/project.pbxproj index ebb9cd8b28..d0d4a6ebb7 100644 --- a/ApolloSQLite.xcodeproj/project.pbxproj +++ b/ApolloSQLite.xcodeproj/project.pbxproj @@ -180,7 +180,7 @@ 54DDB1381EA543F80009DD99 /* ApolloSQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ApolloSQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 54DDB1411EA544700009DD99 /* ApolloSQLite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApolloSQLite.h; sourceTree = ""; }; 54DDB1421EA544700009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 54DDB1441EA544700009DD99 /* ApolloSQLiteMac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApolloSQLiteMac.h; sourceTree = ""; }; + 54DDB1441EA544700009DD99 /* ApolloSQLite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApolloSQLite.h; sourceTree = ""; }; 54DDB1451EA544700009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54DDB1841EA549ED0009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = BatchedLoadTests.swift; path = ../../Tests/ApolloTests/BatchedLoadTests.swift; sourceTree = ""; }; @@ -317,7 +317,7 @@ 54DDB1431EA544700009DD99 /* Mac */ = { isa = PBXGroup; children = ( - 54DDB1441EA544700009DD99 /* ApolloSQLiteMac.h */, + 54DDB1441EA544700009DD99 /* ApolloSQLite.h */, 54DDB1451EA544700009DD99 /* Info.plist */, ); path = Mac; diff --git a/ApolloSQLite/Mac/ApolloSQLiteMac.h b/ApolloSQLite/Mac/ApolloSQLite.h similarity index 100% rename from ApolloSQLite/Mac/ApolloSQLiteMac.h rename to ApolloSQLite/Mac/ApolloSQLite.h From 17f19db3db6b04fe60c5bf72a4a3837851ba5a2a Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 14:58:17 -0700 Subject: [PATCH 46/76] Revert "Split podspec into Apollo.podspec and ApolloSQLite.podspec" This reverts commit 2a6ec2d34f5a9fb45c7aa2a3a33fd2bcf9cbcfe5. --- Apollo.podspec | 19 ++++++++++++++----- ApolloSQLite.podspec | 18 ------------------ 2 files changed, 14 insertions(+), 23 deletions(-) delete mode 100644 ApolloSQLite.podspec diff --git a/Apollo.podspec b/Apollo.podspec index a0c0320fbf..1aa54cb857 100644 --- a/Apollo.podspec +++ b/Apollo.podspec @@ -11,9 +11,18 @@ Pod::Spec.new do |s| s.requires_arc = true - s.ios.deployment_target = '8.0' - s.osx.deployment_target = '10.10' - s.tvos.deployment_target = '9.0' - s.source_files = 'Sources/*.swift' - s.resource = 'scripts/check-and-run-apollo-codegen.sh' + s.subspec 'Core' do |ss| + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + ss.tvos.deployment_target = '9.0' + ss.source_files = 'Sources/*.swift' + ss.resource = 'scripts/check-and-run-apollo-codegen.sh' + end + + s.subspec 'SqliteNormalizedCache' do |ss| + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + ss.source_files = "Sources/SqliteNormalizedCache/*.swift" + ss.dependency 'SQLite.swift', '~> 0.11' + end end diff --git a/ApolloSQLite.podspec b/ApolloSQLite.podspec deleted file mode 100644 index ead5511302..0000000000 --- a/ApolloSQLite.podspec +++ /dev/null @@ -1,18 +0,0 @@ -Pod::Spec.new do |s| - s.name = 'ApolloSQLite' - s.version = `scripts/get-version.sh` - s.author = 'Meteor Development Group' - s.homepage = 'https://github.com/apollographql/apollo-ios' - s.license = { :type => 'MIT', :file => 'LICENSE' } - - s.summary = "A GraphQL client for iOS, written in Swift." - - s.source = { :git => 'https://github.com/apollographql/apollo-ios.git', :tag => s.version } - - s.requires_arc = true - - s.ios.deployment_target = '8.0' - s.osx.deployment_target = '10.10' - s.source_files = "Sources/SqliteNormalizedCache/*.swift" - s.dependency 'SQLite.swift', '~> 0.11' -end From 4dca165f3d4807a80a5e2f23cd460966c5131e38 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 16:40:41 -0700 Subject: [PATCH 47/76] Project version comes from a Version.xcconfig file, and set-version.sh and get-version.sh are updated to work with it --- Apollo.xcodeproj/project.pbxproj | 12 ++++++------ Framework.xcconfig | 2 ++ Sources/Info.plist | 2 +- Tests/ApolloPerformanceTests/Info.plist | 2 +- Tests/ApolloTests/Info.plist | 2 +- Tests/StarWarsAPI/Info.plist | 2 +- Tests/TestHost iOS/Info.plist | 2 +- Version.xcconfig | 1 + scripts/get-version.sh | 6 +++++- scripts/set-version.sh | 5 +++-- scripts/version-constants.sh | 2 ++ 11 files changed, 24 insertions(+), 14 deletions(-) create mode 100644 Version.xcconfig create mode 100644 scripts/version-constants.sh diff --git a/Apollo.xcodeproj/project.pbxproj b/Apollo.xcodeproj/project.pbxproj index 4bc5eb4b90..d4654658ae 100644 --- a/Apollo.xcodeproj/project.pbxproj +++ b/Apollo.xcodeproj/project.pbxproj @@ -957,7 +957,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0.5.6; + CURRENT_PROJECT_VERSION = ""; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -981,7 +981,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 3.0; - VERSIONING_SYSTEM = "apple-generic"; + VERSIONING_SYSTEM = ""; VERSION_INFO_PREFIX = ""; }; name = Debug; @@ -1009,7 +1009,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0.5.6; + CURRENT_PROJECT_VERSION = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -1026,7 +1026,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 3.0; VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; + VERSIONING_SYSTEM = ""; VERSION_INFO_PREFIX = ""; }; name = Release; @@ -1158,7 +1158,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0.5.6; + CURRENT_PROJECT_VERSION = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -1175,7 +1175,7 @@ SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 3.0; VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; + VERSIONING_SYSTEM = ""; VERSION_INFO_PREFIX = ""; }; name = PerformanceTesting; diff --git a/Framework.xcconfig b/Framework.xcconfig index acee497331..5e7c859aea 100644 --- a/Framework.xcconfig +++ b/Framework.xcconfig @@ -1,3 +1,5 @@ +#include "Version.xcconfig" + INSTALL_PATH = @rpath LD_DYLIB_INSTALL_NAME = @rpath/$(PRODUCT_NAME).$(WRAPPER_EXTENSION)/$(PRODUCT_NAME) SKIP_INSTALL = YES diff --git a/Sources/Info.plist b/Sources/Info.plist index 2fa3396467..0e600e67e7 100644 --- a/Sources/Info.plist +++ b/Sources/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.5.6 + $(CURRENT_PROJECT_VERSION) CFBundleSignature ???? CFBundleVersion diff --git a/Tests/ApolloPerformanceTests/Info.plist b/Tests/ApolloPerformanceTests/Info.plist index c0a23aa053..0eda3b1981 100644 --- a/Tests/ApolloPerformanceTests/Info.plist +++ b/Tests/ApolloPerformanceTests/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 0.5.6 + $(CURRENT_PROJECT_VERSION) CFBundleVersion $(CURRENT_PROJECT_VERSION) diff --git a/Tests/ApolloTests/Info.plist b/Tests/ApolloTests/Info.plist index 16e1cd3bbc..2cafdf8edb 100644 --- a/Tests/ApolloTests/Info.plist +++ b/Tests/ApolloTests/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 0.5.6 + $(CURRENT_PROJECT_VERSION) CFBundleSignature ???? CFBundleVersion diff --git a/Tests/StarWarsAPI/Info.plist b/Tests/StarWarsAPI/Info.plist index 9118c1cac1..09738dfd75 100644 --- a/Tests/StarWarsAPI/Info.plist +++ b/Tests/StarWarsAPI/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.5.6 + $(CURRENT_PROJECT_VERSION) CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass diff --git a/Tests/TestHost iOS/Info.plist b/Tests/TestHost iOS/Info.plist index 4190b7b906..8a540ea669 100644 --- a/Tests/TestHost iOS/Info.plist +++ b/Tests/TestHost iOS/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.5.6 + $(CURRENT_PROJECT_VERSION) CFBundleVersion $(CURRENT_PROJECT_VERSION) LSRequiresIPhoneOS diff --git a/Version.xcconfig b/Version.xcconfig new file mode 100644 index 0000000000..75fc6d90d5 --- /dev/null +++ b/Version.xcconfig @@ -0,0 +1 @@ +CURRENT_PROJECT_VERSION = 0.5.7 diff --git a/scripts/get-version.sh b/scripts/get-version.sh index 5beff4140c..8d25d4b492 100755 --- a/scripts/get-version.sh +++ b/scripts/get-version.sh @@ -1,3 +1,7 @@ #!/bin/bash - xcrun agvtool what-marketing-version -terse1 +source "$(dirname "$0")/version-constants.sh" + +prefix="$VERSION_CONFIG_VAR = " +version_config=$(cat $VERSION_CONFIG_FILE) +echo ${version_config:${#prefix}} diff --git a/scripts/set-version.sh b/scripts/set-version.sh index 5d51850d76..61bdfa2b32 100755 --- a/scripts/set-version.sh +++ b/scripts/set-version.sh @@ -1,5 +1,7 @@ #!/bin/bash +source "$(dirname "$0")/version-constants.sh" + NEW_VERSION="$1" if [[ -z "NEW_VERSION" ]]; then @@ -7,8 +9,7 @@ NEW_VERSION="$1" exit 1 fi -xcrun agvtool new-version $NEW_VERSION &> /dev/null -xcrun agvtool new-marketing-version $NEW_VERSION &> /dev/null +echo "$VERSION_CONFIG_VAR = $NEW_VERSION" > $VERSION_CONFIG_FILE git add -A && git commit -m "$NEW_VERSION" git tag "$NEW_VERSION" diff --git a/scripts/version-constants.sh b/scripts/version-constants.sh new file mode 100644 index 0000000000..e0769943ff --- /dev/null +++ b/scripts/version-constants.sh @@ -0,0 +1,2 @@ +VERSION_CONFIG_VAR="CURRENT_PROJECT_VERSION" +VERSION_CONFIG_FILE="Version.xcconfig" From ef49021db00d85921455929fdda8306ef1744040 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 16:56:00 -0700 Subject: [PATCH 48/76] =?UTF-8?q?Fix=20Apollo.podspec,=20and=20don?= =?UTF-8?q?=E2=80=99t=20let=20SQLite.swift=20get=20above=200.11.2=20since?= =?UTF-8?q?=200.11.3=20doesn=E2=80=99t=20support=20iOS=208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Apollo.podspec | 6 +++--- Cartfile | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Apollo.podspec b/Apollo.podspec index 1aa54cb857..ec76cf7628 100644 --- a/Apollo.podspec +++ b/Apollo.podspec @@ -19,10 +19,10 @@ Pod::Spec.new do |s| ss.resource = 'scripts/check-and-run-apollo-codegen.sh' end - s.subspec 'SqliteNormalizedCache' do |ss| + s.subspec 'SQLite' do |ss| ss.ios.deployment_target = '8.0' ss.osx.deployment_target = '10.10' - ss.source_files = "Sources/SqliteNormalizedCache/*.swift" - ss.dependency 'SQLite.swift', '~> 0.11' + ss.source_files = "ApolloSQLite/*.swift" + ss.dependency 'SQLite.swift', '0.11.2' # 0.11.3 doesn't support iOS < 9 end end diff --git a/Cartfile b/Cartfile index f0711ebc40..aab0b5592f 100644 --- a/Cartfile +++ b/Cartfile @@ -1 +1 @@ -github "stephencelis/SQLite.swift" ~> 0.11 \ No newline at end of file +github "stephencelis/SQLite.swift" == 0.11.2 # 0.11.3 doesn't support iOS < 9 \ No newline at end of file From 1c308419ff0570584de628904c050ef4a243b33e Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 17:41:00 -0700 Subject: [PATCH 49/76] Wrestling with submodules --- .gitmodules | 3 --- Cartfile.resolved | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index c5a63baefc..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "Carthage/Checkouts/SQLite.swift"] - path = Carthage/Checkouts/SQLite.swift - url = https://github.com/stephencelis/SQLite.swift.git diff --git a/Cartfile.resolved b/Cartfile.resolved index 7ae31ca1f9..148be8bbc2 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1 +1 @@ -github "stephencelis/SQLite.swift" "0.11.3" +github "stephencelis/SQLite.swift" "0.11.2" From 4853f4df4663460a70987c2ddd165789f901cdbc Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 17:44:32 -0700 Subject: [PATCH 50/76] Wrestling with submodules, continued --- ApolloSQLite.xcodeproj/project.pbxproj | 1 + .../Checkouts/SQLite.swift/.cocoadocs.yml | 2 + Carthage/Checkouts/SQLite.swift/.gitignore | 27 + Carthage/Checkouts/SQLite.swift/.gitmodules | 0 .../Checkouts/SQLite.swift/.swift-version | 1 + Carthage/Checkouts/SQLite.swift/.travis.yml | 26 + Carthage/Checkouts/SQLite.swift/CHANGELOG.md | 34 + .../Checkouts/SQLite.swift/CONTRIBUTING.md | 108 ++ .../CocoaPods/appletvos/module.modulemap | 4 + .../appletvsimulator/module.modulemap | 4 + .../CocoaPods/iphoneos-10.0/module.modulemap | 4 + .../CocoaPods/iphoneos/module.modulemap | 4 + .../iphonesimulator-10.0/module.modulemap | 4 + .../iphonesimulator/module.modulemap | 4 + .../CocoaPods/macosx-10.11/module.modulemap | 4 + .../CocoaPods/macosx-10.12/module.modulemap | 4 + .../CocoaPods/macosx/module.modulemap | 4 + .../CocoaPods/watchos/module.modulemap | 4 + .../CocoaPods/watchsimulator/module.modulemap | 4 + .../SQLite.swift/Documentation/Index.md | 1587 +++++++++++++++++ .../SQLite.swift/Documentation/Planning.md | 24 + .../Resources/installation@2x.png | Bin 0 -> 312530 bytes .../Documentation/Resources/playground@2x.png | Bin 0 -> 124729 bytes Carthage/Checkouts/SQLite.swift/LICENSE.txt | 21 + Carthage/Checkouts/SQLite.swift/Makefile | 60 + Carthage/Checkouts/SQLite.swift/Package.swift | 17 + Carthage/Checkouts/SQLite.swift/README.md | 263 +++ .../SQLite.playground/Contents.swift | 43 + .../SQLite.playground/contents.xcplayground | 4 + .../SQLite.swift/SQLite.swift.podspec | 70 + .../SQLite.xcodeproj/project.pbxproj | 1513 ++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcschemes/SQLite Mac.xcscheme | 100 ++ .../xcschemes/SQLite iOS.xcscheme | 100 ++ .../xcschemes/SQLite tvOS.xcscheme | 100 ++ .../xcschemes/SQLite watchOS.xcscheme | 80 + .../Sources/SQLite/Core/Blob.swift | 60 + .../Sources/SQLite/Core/Connection.swift | 756 ++++++++ .../Sources/SQLite/Core/Statement.swift | 297 +++ .../Sources/SQLite/Core/Value.swift | 132 ++ .../Sources/SQLite/Extensions/Cipher.swift | 61 + .../Sources/SQLite/Extensions/FTS4.swift | 346 ++++ .../Sources/SQLite/Extensions/FTS5.swift | 97 + .../Sources/SQLite/Extensions/RTree.swift | 37 + .../Sources/SQLite/Foundation.swift | 108 ++ .../SQLite.swift/Sources/SQLite/Helpers.swift | 130 ++ .../SQLite.swift/Sources/SQLite/Info.plist | 26 + .../SQLite.swift/Sources/SQLite/SQLite.h | 6 + .../SQLite/Typed/AggregateFunctions.swift | 251 +++ .../Sources/SQLite/Typed/Collation.swift | 69 + .../Sources/SQLite/Typed/CoreFunctions.swift | 683 +++++++ .../SQLite/Typed/CustomFunctions.swift | 136 ++ .../Sources/SQLite/Typed/Expression.swift | 147 ++ .../Sources/SQLite/Typed/Operators.swift | 541 ++++++ .../Sources/SQLite/Typed/Query.swift | 1162 ++++++++++++ .../Sources/SQLite/Typed/Schema.swift | 519 ++++++ .../Sources/SQLite/Typed/Setter.swift | 277 +++ .../Sources/SQLiteObjc/SQLite-Bridging.m | 138 ++ .../Sources/SQLiteObjc/fts3_tokenizer.h | 161 ++ .../SQLiteObjc/include/SQLite-Bridging.h | 37 + .../SQLite.swift/Tests/Carthage/.gitignore | 3 + .../SQLite.swift/Tests/Carthage/Makefile | 16 + .../SQLite.swift/Tests/CocoaPods/.gitignore | 1 + .../SQLite.swift/Tests/CocoaPods/Gemfile | 4 + .../SQLite.swift/Tests/CocoaPods/Gemfile.lock | 74 + .../SQLite.swift/Tests/CocoaPods/Makefile | 13 + .../Tests/CocoaPods/integration_test.rb | 43 + .../Tests/CocoaPods/test_running_validator.rb | 120 ++ .../SQLiteTests/AggregateFunctionsTests.swift | 68 + .../Tests/SQLiteTests/BlobTests.swift | 23 + .../Tests/SQLiteTests/CipherTests.swift | 98 + .../Tests/SQLiteTests/ConnectionTests.swift | 384 ++++ .../SQLiteTests/CoreFunctionsTests.swift | 136 ++ .../SQLiteTests/CustomFunctionsTests.swift | 6 + .../Tests/SQLiteTests/ExpressionTests.swift | 6 + .../Tests/SQLiteTests/FTS4Tests.swift | 208 +++ .../Tests/SQLiteTests/FTS5Tests.swift | 124 ++ .../Tests/SQLiteTests/Fixtures.swift | 8 + .../Tests/SQLiteTests/FoundationTests.swift | 16 + .../SQLite.swift/Tests/SQLiteTests/Info.plist | 24 + .../Tests/SQLiteTests/OperatorsTests.swift | 296 +++ .../Tests/SQLiteTests/QueryTests.swift | 365 ++++ .../Tests/SQLiteTests/RTreeTests.swift | 17 + .../Tests/SQLiteTests/SchemaTests.swift | 775 ++++++++ .../Tests/SQLiteTests/SetterTests.swift | 137 ++ .../Tests/SQLiteTests/StatementTests.swift | 26 + .../Tests/SQLiteTests/TestHelpers.swift | 115 ++ .../Tests/SQLiteTests/ValueTests.swift | 6 + .../SQLiteTests/fixtures/encrypted.sqlite | Bin 0 -> 2048 bytes Carthage/Checkouts/SQLite.swift/run-tests.sh | 15 + 90 files changed, 13536 insertions(+) create mode 100644 Carthage/Checkouts/SQLite.swift/.cocoadocs.yml create mode 100644 Carthage/Checkouts/SQLite.swift/.gitignore create mode 100644 Carthage/Checkouts/SQLite.swift/.gitmodules create mode 100644 Carthage/Checkouts/SQLite.swift/.swift-version create mode 100644 Carthage/Checkouts/SQLite.swift/.travis.yml create mode 100644 Carthage/Checkouts/SQLite.swift/CHANGELOG.md create mode 100644 Carthage/Checkouts/SQLite.swift/CONTRIBUTING.md create mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/appletvos/module.modulemap create mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap create mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap create mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos/module.modulemap create mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap create mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap create mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap create mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap create mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/macosx/module.modulemap create mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/watchos/module.modulemap create mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/watchsimulator/module.modulemap create mode 100644 Carthage/Checkouts/SQLite.swift/Documentation/Index.md create mode 100644 Carthage/Checkouts/SQLite.swift/Documentation/Planning.md create mode 100644 Carthage/Checkouts/SQLite.swift/Documentation/Resources/installation@2x.png create mode 100644 Carthage/Checkouts/SQLite.swift/Documentation/Resources/playground@2x.png create mode 100644 Carthage/Checkouts/SQLite.swift/LICENSE.txt create mode 100644 Carthage/Checkouts/SQLite.swift/Makefile create mode 100644 Carthage/Checkouts/SQLite.swift/Package.swift create mode 100644 Carthage/Checkouts/SQLite.swift/README.md create mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.playground/Contents.swift create mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.playground/contents.xcplayground create mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.swift.podspec create mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite Mac.xcscheme create mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite iOS.xcscheme create mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite tvOS.xcscheme create mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite watchOS.xcscheme create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Blob.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Connection.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Statement.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Value.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/Cipher.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/RTree.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Foundation.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Helpers.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Info.plist create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/SQLite.h create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Collation.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Expression.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Operators.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Query.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Schema.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Setter.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h create mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/Carthage/.gitignore create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/Carthage/Makefile create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/.gitignore create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile.lock create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Makefile create mode 100755 Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/integration_test.rb create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/test_running_validator.rb create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/AggregateFunctionsTests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/BlobTests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CipherTests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ConnectionTests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CoreFunctionsTests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CustomFunctionsTests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ExpressionTests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS4Tests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS5Tests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Fixtures.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FoundationTests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Info.plist create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/OperatorsTests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/QueryTests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/RTreeTests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SchemaTests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SetterTests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/StatementTests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/TestHelpers.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ValueTests.swift create mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/fixtures/encrypted.sqlite create mode 100755 Carthage/Checkouts/SQLite.swift/run-tests.sh diff --git a/ApolloSQLite.xcodeproj/project.pbxproj b/ApolloSQLite.xcodeproj/project.pbxproj index d0d4a6ebb7..24af992b62 100644 --- a/ApolloSQLite.xcodeproj/project.pbxproj +++ b/ApolloSQLite.xcodeproj/project.pbxproj @@ -976,6 +976,7 @@ 5438069F1EA56C2200F55B72 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; 54DDB0B81EA1523E0009DD99 /* Build configuration list for PBXProject "ApolloSQLite" */ = { isa = XCConfigurationList; diff --git a/Carthage/Checkouts/SQLite.swift/.cocoadocs.yml b/Carthage/Checkouts/SQLite.swift/.cocoadocs.yml new file mode 100644 index 0000000000..2784003281 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/.cocoadocs.yml @@ -0,0 +1,2 @@ +additional_guides: + - Documentation/Index.md diff --git a/Carthage/Checkouts/SQLite.swift/.gitignore b/Carthage/Checkouts/SQLite.swift/.gitignore new file mode 100644 index 0000000000..5882e0cb82 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/.gitignore @@ -0,0 +1,27 @@ +# OS X +.DS_Store + +# Xcode +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate + +# Carthage +/Carthage/ + +# Swift Package Manager +.build +Packages/ diff --git a/Carthage/Checkouts/SQLite.swift/.gitmodules b/Carthage/Checkouts/SQLite.swift/.gitmodules new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Carthage/Checkouts/SQLite.swift/.swift-version b/Carthage/Checkouts/SQLite.swift/.swift-version new file mode 100644 index 0000000000..9f55b2ccb5 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/.swift-version @@ -0,0 +1 @@ +3.0 diff --git a/Carthage/Checkouts/SQLite.swift/.travis.yml b/Carthage/Checkouts/SQLite.swift/.travis.yml new file mode 100644 index 0000000000..3747ac7b89 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/.travis.yml @@ -0,0 +1,26 @@ +language: objective-c +rvm: 2.2 +osx_image: xcode8.2 +env: + global: + - IOS_SIMULATOR="iPhone 6s" +matrix: + include: + - env: BUILD_SCHEME="SQLite iOS" + - env: BUILD_SCHEME="SQLite Mac" + - env: VALIDATOR_SUBSPEC="none" + - env: VALIDATOR_SUBSPEC="standard" + - env: VALIDATOR_SUBSPEC="standalone" + - env: VALIDATOR_SUBSPEC="SQLCipher" + - env: CARTHAGE_PLATFORM="iOS" + - env: CARTHAGE_PLATFORM="Mac" + - env: CARTHAGE_PLATFORM="watchOS" + - env: CARTHAGE_PLATFORM="tvOS" + - env: PACKAGE_MANAGER_COMMAND="test -Xlinker -lsqlite3" +before_install: + - gem update bundler + - gem install xcpretty --no-document + - brew update + - brew outdated carthage || brew upgrade carthage +script: + - ./run-tests.sh diff --git a/Carthage/Checkouts/SQLite.swift/CHANGELOG.md b/Carthage/Checkouts/SQLite.swift/CHANGELOG.md new file mode 100644 index 0000000000..f3298d68f9 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/CHANGELOG.md @@ -0,0 +1,34 @@ +0.11.2 (25-12-2016), [diff][diff-0.11.2] +======================================== + +* Fixed SQLCipher integration with read-only databases ([#559][]) +* Preliminary Swift Package Manager support ([#548][], [#560][]) +* Fixed null pointer when fetching an empty BLOB ([#561][]) +* Allow `where` as alias for `filter` ([#571][]) + +0.11.1 (06-12-2016), [diff][diff-0.11.1] +======================================== + +* Integrate SQLCipher via CocoaPods ([#546][], [#553][]) +* Made lastInsertRowid consistent with other SQLite wrappers ([#532][]) +* Fix for ~= operator used with Double ranges +* Various documentation updates + +0.11.0 (19-10-2016) +=================== + +* Swift3 migration ([diff][diff-0.11.0]) + + +[diff-0.11.0]: https://github.com/stephencelis/SQLite.swift/compare/0.10.1...0.11.0 +[diff-0.11.1]: https://github.com/stephencelis/SQLite.swift/compare/0.11.0...0.11.1 +[diff-0.11.2]: https://github.com/stephencelis/SQLite.swift/compare/0.11.1...0.11.2 + +[#532]: https://github.com/stephencelis/SQLite.swift/issues/532 +[#546]: https://github.com/stephencelis/SQLite.swift/issues/546 +[#548]: https://github.com/stephencelis/SQLite.swift/pull/548 +[#553]: https://github.com/stephencelis/SQLite.swift/pull/553 +[#559]: https://github.com/stephencelis/SQLite.swift/pull/559 +[#560]: https://github.com/stephencelis/SQLite.swift/pull/560 +[#561]: https://github.com/stephencelis/SQLite.swift/issues/561 +[#571]: https://github.com/stephencelis/SQLite.swift/issues/571 diff --git a/Carthage/Checkouts/SQLite.swift/CONTRIBUTING.md b/Carthage/Checkouts/SQLite.swift/CONTRIBUTING.md new file mode 100644 index 0000000000..60c1837048 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/CONTRIBUTING.md @@ -0,0 +1,108 @@ +# Contributing + +The where and when to open an [issue](#issues) or [pull +request](#pull-requests). + + +## Issues + +Issues are used to track **bugs** and **feature requests**. Need **help** or +have a **general question**? [Ask on Stack Overflow][] (tag `sqlite.swift`). + +Before reporting a bug or requesting a feature, [run a few searches][Search] to +see if a similar issue has already been opened and ensure you’re not submitting +a duplicate. + +If you find a similar issue, read the existing conversation and see if it +addresses everything. If it doesn’t, continue the conversation there. + +If your searches return empty, see the [bug](#bugs) or [feature +request](#feature-requests) guidelines below. + +[Ask on Stack Overflow]: http://stackoverflow.com/questions/tagged/sqlite.swift +[Search]: https://github.com/stephencelis/SQLite.swift/search?type=Issues + + +### Bugs + +Think you’ve discovered a new **bug**? Let’s try troubleshooting a few things +first. + + - **Is it an installation issue?** + + If this is your first time building SQLite.swift in your project, you may + encounter a build error, _e.g._: + + No such module 'SQLite' + + Please carefully re-read the [installation instructions][] to make sure + everything is in order. + + - **Have you read the documentation?** + + If you can’t seem to get something working, check + [the documentation][See Documentation] to see if the solution is there. + + - **Are you up-to-date?** + + If you’re perusing [the documentation][See Documentation] online and find + that an example is just not working, please upgrade to the latest version + of SQLite.swift and try again before continuing. + + - **Is it an unhelpful build error?** + + While Swift error messaging is improving with each release, complex + expressions still lend themselves to misleading errors. If you encounter an + error on a complex line, breaking it down into smaller pieces generally + yields a more understandable error. + + - **Is it an _even more_ unhelpful build error?** + + Have you updated Xcode recently? Did your project stop building out of the + blue? + + Hold down the **option** key and select **Clean Build Folder…** from the + **Product** menu (⌥⇧⌘K). + +Made it through everything above and still having trouble? Sorry! +[Open an issue][]! And _please_: + + - Be as descriptive as possible. + - Provide as much information needed to _reliably reproduce_ the issue. + - Attach screenshots if possible. + - Better yet: attach GIFs or link to video. + - Even better: link to a sample project exhibiting the issue. + - Include the SQLite.swift commit or branch experiencing the issue. + - Include devices and operating systems affected. + - Include build information: the Xcode and OS X versions affected. + +[installation instructions]: Documentation/Index.md#installation +[See Documentation]: Documentation/Index.md#sqliteswift-documentation +[Open an issue]: https://github.com/stephencelis/SQLite.swift/issues/new + + +### Feature Requests + +Have an innovative **feature request**? [Open an issue][]! Be thorough! Provide +context and examples. Be open to discussion. + + +## Pull Requests + +Interested in contributing but don’t know where to start? Try the [`help +wanted`][help wanted] label. + +Ready to submit a fix or a feature? [Submit a pull request][]! And _please_: + + - If code changes, run the tests and make sure everything still works. + - Write new tests for new functionality. + - Update documentation comments where applicable. + - Maintain the existing style. + - Don’t forget to have fun. + +While we cannot guarantee a merge to every pull request, we do read each one +and love your input. + + +[help wanted]: https://github.com/stephencelis/SQLite.swift/labels/help%20wanted +[Submit a pull request]: https://github.com/stephencelis/SQLite.swift/fork diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/appletvos/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/appletvos/module.modulemap new file mode 100644 index 0000000000..637d993582 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/CocoaPods/appletvos/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap new file mode 100644 index 0000000000..f8b9b671a7 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap new file mode 100644 index 0000000000..67a6c20309 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos/module.modulemap new file mode 100644 index 0000000000..043db6c484 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap new file mode 100644 index 0000000000..c8b84ab8f4 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.0.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap new file mode 100644 index 0000000000..a7b14cbb48 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap new file mode 100644 index 0000000000..9e0912979d --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap new file mode 100644 index 0000000000..8fc958e676 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx/module.modulemap new file mode 100644 index 0000000000..cc8370ec56 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/watchos/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/watchos/module.modulemap new file mode 100644 index 0000000000..62a6c4eef0 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/CocoaPods/watchos/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/watchsimulator/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/watchsimulator/module.modulemap new file mode 100644 index 0000000000..086fbab2de --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/CocoaPods/watchsimulator/module.modulemap @@ -0,0 +1,4 @@ +module CSQLite [system] { + header "/Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/usr/include/sqlite3.h" + export * +} diff --git a/Carthage/Checkouts/SQLite.swift/Documentation/Index.md b/Carthage/Checkouts/SQLite.swift/Documentation/Index.md new file mode 100644 index 0000000000..3e13ad4efe --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Documentation/Index.md @@ -0,0 +1,1587 @@ +# SQLite.swift Documentation + + - [Installation](#installation) + - [Carthage](#carthage) + - [CocoaPods](#cocoapods) + - [Swift Package Manager](#swift-package-manager) + - [Manual](#manual) + - [Getting Started](#getting-started) + - [Connecting to a Database](#connecting-to-a-database) + - [Read-Write Databases](#read-write-databases) + - [Read-Only Databases](#read-only-databases) + - [In-Memory Databases](#in-memory-databases) + - [Thread-Safety](#thread-safety) + - [Building Type-Safe SQL](#building-type-safe-sql) + - [Expressions](#expressions) + - [Compound Expressions](#compound-expressions) + - [Queries](#queries) + - [Creating a Table](#creating-a-table) + - [Create Table Options](#create-table-options) + - [Column Constraints](#column-constraints) + - [Table Constraints](#table-constraints) + - [Inserting Rows](#inserting-rows) + - [Setters](#setters) + - [Selecting Rows](#selecting-rows) + - [Iterating and Accessing Values](#iterating-and-accessing-values) + - [Plucking Rows](#plucking-rows) + - [Building Complex Queries](#building-complex-queries) + - [Selecting Columns](#selecting-columns) + - [Joining Other Tables](#joining-other-tables) + - [Column Namespacing](#column-namespacing) + - [Table Aliasing](#table-aliasing) + - [Filtering Rows](#filtering-rows) + - [Filter Operators and Functions](#filter-operators-and-functions) + - [Sorting Rows](#sorting-rows) + - [Limiting and Paging Results](#limiting-and-paging-results) + - [Aggregation](#aggregation) + - [Updating Rows](#updating-rows) + - [Deleting Rows](#deleting-rows) + - [Transactions and Savepoints](#transactions-and-savepoints) + - [Altering the Schema](#altering-the-schema) + - [Renaming Tables](#renaming-tables) + - [Adding Columns](#adding-columns) + - [Added Column Constraints](#added-column-constraints) + - [Indexes](#indexes) + - [Creating Indexes](#creating-indexes) + - [Dropping Indexes](#dropping-indexes) + - [Dropping Tables](#dropping-tables) + - [Migrations and Schema Versioning](#migrations-and-schema-versioning) + - [Custom Types](#custom-types) + - [Date-Time Values](#date-time-values) + - [Binary Data](#binary-data) + - [Custom Type Caveats](#custom-type-caveats) + - [Other Operators](#other-operators) + - [Core SQLite Functions](#core-sqlite-functions) + - [Aggregate SQLite Functions](#aggregate-sqlite-functions) + - [Custom SQL Functions](#custom-sql-functions) + - [Custom Collations](#custom-collations) + - [Full-text Search](#full-text-search) + - [Executing Arbitrary SQL](#executing-arbitrary-sql) + - [Logging](#logging) + + +[↩]: #sqliteswift-documentation + + +## Installation + +> _Note:_ SQLite.swift requires Swift 3 (and [Xcode 8](https://developer.apple.com/xcode/downloads/)) or greater. + + +### Carthage + +[Carthage][] is a simple, decentralized dependency manager for Cocoa. To +install SQLite.swift with Carthage: + + 1. Make sure Carthage is [installed][Carthage Installation]. + + 2. Update your Cartfile to include the following: + + ``` + github "stephencelis/SQLite.swift" ~> 0.11.2 + ``` + + 3. Run `carthage update` and [add the appropriate framework][Carthage Usage]. + + +[Carthage]: https://github.com/Carthage/Carthage +[Carthage Installation]: https://github.com/Carthage/Carthage#installing-carthage +[Carthage Usage]: https://github.com/Carthage/Carthage#adding-frameworks-to-an-application + + +### CocoaPods + +[CocoaPods][] is a dependency manager for Cocoa projects. To install SQLite.swift with CocoaPods: + + 1. Verify that your copy of Xcode is installed and active in the default location (`/Applications/Xcode.app`). + + ```sh + sudo xcode-select --switch /Applications/Xcode.app + ``` + + 2. Make sure CocoaPods is [installed][CocoaPods Installation] (SQLite.swift requires version 1.0.0 or greater). + + ``` sh + # Using the default Ruby install will require you to use sudo when + # installing and updating gems. + [sudo] gem install cocoapods + ``` + + 3. Update your Podfile to include the following: + + ``` ruby + use_frameworks! + + target 'YourAppTargetName' do + pod 'SQLite.swift', '~> 0.11.2' + end + ``` + + 4. Run `pod install --repo-update`. + + +#### Requiring a specific version of SQLite + + If you want to use a more recent version of SQLite than what is provided with the OS you can require the `standalone` subspec: + +``` ruby +target 'YourAppTargetName' do + pod 'SQLite.swift/standalone', '~> 0.11.2' +end +``` + +By default this will use the most recent version of SQLite without any extras. If you want you can further customize this by adding another dependency to sqlite3 or one of its subspecs: + +``` ruby +target 'YourAppTargetName' do + pod 'SQLite.swift/standalone', '~> 0.11.2' + pod 'sqlite3/fts5', '= 3.15.0' # SQLite 3.15.0 with FTS5 enabled +end +``` + +See the [sqlite3 podspec][sqlite3pod] for more details. + +#### Using SQLite.swift with SQLCipher + +If you want to use [SQLCipher][] with SQLite.swift you can require the `SQLCipher` +subspec in your Podfile: + +``` ruby +target 'YourAppTargetName' do + pod 'SQLite.swift/SQLCipher', '~> 0.11.2' +end +``` + +This will automatically add a dependency to the SQLCipher pod as well as extend +`Connection` with methods to change the database key: + +``` swift +import SQLite + +let db = try Connection("path/to/db.sqlite3") +try db.key("secret") +try db.rekey("another secret") +``` + +[CocoaPods]: https://cocoapods.org +[CocoaPods Installation]: https://guides.cocoapods.org/using/getting-started.html#getting-started +[sqlite3pod]: https://github.com/clemensg/sqlite3pod +[SQLCipher]: https://www.zetetic.net/sqlcipher/ + +### Swift Package Manager + +The [Swift Package Manager][] is a tool for managing the distribution of Swift code. +It’s integrated with the Swift build system to automate the process of +downloading, compiling, and linking dependencies. + +It is the recommended approach for using SQLite.swift in OSX CLI applications. + + 1. Add the following to your `Package.swift` file: + + ``` swift + dependencies: [ + .Package(url: "https://github.com/stephencelis/SQLite.swift.git", majorVersion: 0, minor: 11) + ] + ``` + + 2. Build your project: + + ``` sh + $ swift build -Xlinker -lsqlite3 + ``` + +[Swift Package Manager]: https://swift.org/package-manager + +### Manual + +To install SQLite.swift as an Xcode sub-project: + + 1. Drag the **SQLite.xcodeproj** file into your own project. ([Submodule](http://git-scm.com/book/en/Git-Tools-Submodules), clone, or [download](https://github.com/stephencelis/SQLite.swift/archive/master.zip) the project first.) + + ![Installation Screen Shot](Resources/installation@2x.png) + + 2. In your target’s **General** tab, click the **+** button under **Linked Frameworks and Libraries**. + + 3. Select the appropriate **SQLite.framework** for your platform. + + 4. **Add**. + +You should now be able to `import SQLite` from any of your target’s source files and begin using SQLite.swift. + +Some additional steps are required to install the application on an actual device: + + 5. In the **General** tab, click the **+** button under **Embedded Binaries**. + + 6. Select the appropriate **SQLite.framework** for your platform. + + 7. **Add**. + +## Getting Started + +To use SQLite.swift classes or structures in your target’s source file, first import the `SQLite` module. + +``` swift +import SQLite +``` + + +### Connecting to a Database + +Database connections are established using the `Connection` class. A connection is initialized with a path to a database. SQLite will attempt to create the database file if it does not already exist. + +``` swift +let db = try Connection("path/to/db.sqlite3") +``` + + +#### Read-Write Databases + +On iOS, you can create a writable database in your app’s **Documents** directory. + +``` swift +let path = NSSearchPathForDirectoriesInDomains( + .documentDirectory, .userDomainMask, true +).first! + +let db = try Connection("\(path)/db.sqlite3") +``` + +On OS X, you can use your app’s **Application Support** directory: + +``` swift +var path = NSSearchPathForDirectoriesInDomains( + .applicationSupportDirectory, .userDomainMask, true +).first! + Bundle.main.bundleIdentifier! + +// create parent directory iff it doesn’t exist +try FileManager.default.createDirectoryAtPath( + path, withIntermediateDirectories: true, attributes: nil +) + +let db = try Connection("\(path)/db.sqlite3") +``` + + +#### Read-Only Databases + +If you bundle a database with your app (_i.e._, you’ve copied a database file into your Xcode project and added it to your application target), you can establish a _read-only_ connection to it. + +``` swift +let path = Bundle.main.pathForResource("db", ofType: "sqlite3")! + +let db = try Connection(path, readonly: true) +``` + +> _Note:_ Signed applications cannot modify their bundle resources. If you bundle a database file with your app for the purpose of bootstrapping, copy it to a writable location _before_ establishing a connection (see [Read-Write Databases](#read-write-databases), above, for typical, writable locations). +> +> See these two Stack Overflow questions for more information about iOS apps with SQLite databases: [1](https://stackoverflow.com/questions/34609746/what-different-between-store-database-in-different-locations-in-ios), [2](https://stackoverflow.com/questions/34614968/ios-how-to-copy-pre-seeded-database-at-the-first-running-app-with-sqlite-swift). We welcome sample code to show how to successfully copy and use a bundled "seed" database for writing in an app. + +#### In-Memory Databases + +If you omit the path, SQLite.swift will provision an [in-memory database](https://www.sqlite.org/inmemorydb.html). + +``` swift +let db = try Connection() // equivalent to `Connection(.inMemory)` +``` + +To create a temporary, disk-backed database, pass an empty file name. + +``` swift +let db = try Connection(.temporary) +``` + +In-memory databases are automatically deleted when the database connection is closed. + + +#### Thread-Safety + +Every Connection comes equipped with its own serial queue for statement execution and can be safely accessed across threads. Threads that open transactions and savepoints will block other threads from executing statements while the transaction is open. + +If you maintain multiple connections for a single database, consider setting a timeout (in seconds) and/or a busy handler: + +```swift +db.busyTimeout = 5 + +db.busyHandler({ tries in + if tries >= 3 { + return false + } + return true +}) +``` + +> _Note:_ The default timeout is 0, so if you see `database is locked` errors, you may be trying to access the same database simultaneously from multiple connections. + + +## Building Type-Safe SQL + +SQLite.swift comes with a typed expression layer that directly maps [Swift types](https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibraryReference/) to their [SQLite counterparts](https://www.sqlite.org/datatype3.html). + +| Swift Type | SQLite Type | +| --------------- | ----------- | +| `Int64`* | `INTEGER` | +| `Double` | `REAL` | +| `String` | `TEXT` | +| `nil` | `NULL` | +| `SQLite.Blob`† | `BLOB` | + +> *While `Int64` is the basic, raw type (to preserve 64-bit integers on 32-bit platforms), `Int` and `Bool` work transparently. +> +> †SQLite.swift defines its own `Blob` structure, which safely wraps the underlying bytes. +> +> See [Custom Types](#custom-types) for more information about extending other classes and structures to work with SQLite.swift. +> +> See [Executing Arbitrary SQL](#executing-arbitrary-sql) to forego the typed layer and execute raw SQL, instead. + +These expressions (in the form of the structure, [`Expression`](#expressions)) build on one another and, with a query ([`QueryType`](#queries)), can create and execute SQL statements. + + +### Expressions + +Expressions are generic structures associated with a type ([built-in](#building-type-safe-sql) or [custom](#custom-types)), raw SQL, and (optionally) values to bind to that SQL. Typically, you will only explicitly create expressions to describe your columns, and typically only once per column. + +``` swift +let id = Expression("id") +let email = Expression("email") +let balance = Expression("balance") +let verified = Expression("verified") +``` + +Use optional generics for expressions that can evaluate to `NULL`. + +``` swift +let name = Expression("name") +``` + +> _Note:_ The default `Expression` initializer is for [quoted identifiers](https://www.sqlite.org/lang_keywords.html) (_i.e._, column names). To build a literal SQL expression, use `init(literal:)`. + + +### Compound Expressions + +Expressions can be combined with other expressions and types using [filter operators and functions](#filter-operators-and-functions) (as well as other [non-filter operators](#other-operators) and [functions](#core-sqlite-functions)). These building blocks can create complex SQLite statements. + + +### Queries + +Queries are structures that reference a database and table name, and can be used to build a variety of statements using expressions. We can create a query by initializing a `Table`, `View`, or `VirtualTable`. + +``` swift +let users = Table("users") +``` + +Assuming [the table exists](#creating-a-table), we can immediately [insert](#inserting-rows), [select](#selecting-rows), [update](#updating-rows), and [delete](#deleting-rows) rows. + + +## Creating a Table + +We can build [`CREATE TABLE` statements](https://www.sqlite.org/lang_createtable.html) by calling the `create` function on a `Table`. The following is a basic example of SQLite.swift code (using the [expressions](#expressions) and [query](#queries) above) and the corresponding SQL it generates. + +``` swift +try db.run(users.create { t in // CREATE TABLE "users" ( + t.column(id, primaryKey: true) // "id" INTEGER PRIMARY KEY NOT NULL, + t.column(email, unique: true) // "email" TEXT UNIQUE NOT NULL, + t.column(name) // "name" TEXT +}) // ) +``` + +> _Note:_ `Expression` structures (in this case, the `id` and `email` columns), generate `NOT NULL` constraints automatically, while `Expression` structures (`name`) do not. + + +### Create Table Options + +The `Table.create` function has several default parameters we can override. + + - `temporary` adds a `TEMPORARY` clause to the `CREATE TABLE` statement (to create a temporary table that will automatically drop when the database connection closes). Default: `false`. + + ``` swift + try db.run(users.create(temporary: true) { t in /* ... */ }) + // CREATE TEMPORARY TABLE "users" -- ... + ``` + + - `ifNotExists` adds an `IF NOT EXISTS` clause to the `CREATE TABLE` statement (which will bail out gracefully if the table already exists). Default: `false`. + + ``` swift + try db.run(users.create(ifNotExists: true) { t in /* ... */ }) + // CREATE TABLE "users" IF NOT EXISTS -- ... + ``` + +### Column Constraints + +The `column` function is used for a single column definition. It takes an [expression](#expressions) describing the column name and type, and accepts several parameters that map to various column constraints and clauses. + + - `primaryKey` adds a `PRIMARY KEY` constraint to a single column. + + ``` swift + t.column(id, primaryKey: true) + // "id" INTEGER PRIMARY KEY NOT NULL + + t.column(id, primaryKey: .autoincrement) + // "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL + ``` + + > _Note:_ The `primaryKey` parameter cannot be used alongside `references`. If you need to create a column that has a default value and is also a primary and/or foreign key, use the `primaryKey` and `foreignKey` functions mentioned under [Table Constraints](#table-constraints). + > + > Primary keys cannot be optional (_e.g._, `Expression`). + > + > Only an `INTEGER PRIMARY KEY` can take `.autoincrement`. + + - `unique` adds a `UNIQUE` constraint to the column. (See the `unique` function under [Table Constraints](#table-constraints) for uniqueness over multiple columns). + + ``` swift + t.column(email, unique: true) + // "email" TEXT UNIQUE NOT NULL + ``` + + - `check` attaches a `CHECK` constraint to a column definition in the form of a boolean expression (`Expression`). Boolean expressions can be easily built using [filter operators and functions](#filter-operators-and-functions). (See also the `check` function under [Table Constraints](#table-constraints).) + + ``` swift + t.column(email, check: email.like("%@%")) + // "email" TEXT NOT NULL CHECK ("email" LIKE '%@%') + ``` + + - `defaultValue` adds a `DEFAULT` clause to a column definition and _only_ accepts a value (or expression) matching the column’s type. This value is used if none is explicitly provided during [an `INSERT`](#inserting-rows). + + ``` swift + t.column(name, defaultValue: "Anonymous") + // "name" TEXT DEFAULT 'Anonymous' + ``` + + > _Note:_ The `defaultValue` parameter cannot be used alongside `primaryKey` and `references`. If you need to create a column that has a default value and is also a primary and/or foreign key, use the `primaryKey` and `foreignKey` functions mentioned under [Table Constraints](#table-constraints). + + - `collate` adds a `COLLATE` clause to `Expression` (and `Expression`) column definitions with [a collating sequence](https://www.sqlite.org/datatype3.html#collation) defined in the `Collation` enumeration. + + ``` swift + t.column(email, collate: .nocase) + // "email" TEXT NOT NULL COLLATE "NOCASE" + + t.column(name, collate: .rtrim) + // "name" TEXT COLLATE "RTRIM" + ``` + + - `references` adds a `REFERENCES` clause to `Expression` (and `Expression`) column definitions and accepts a table (`SchemaType`) or namespaced column expression. (See the `foreignKey` function under [Table Constraints](#table-constraints) for non-integer foreign key support.) + + ``` swift + t.column(user_id, references: users, id) + // "user_id" INTEGER REFERENCES "users" ("id") + + + + > _Note:_ The `references` parameter cannot be used alongside `primaryKey` and `defaultValue`. If you need to create a column that has a default value and is also a primary and/or foreign key, use the `primaryKey` and `foreignKey` functions mentioned under [Table Constraints](#table-constraints). + + +### Table Constraints + +Additional constraints may be provided outside the scope of a single column using the following functions. + + - `primaryKey` adds a `PRIMARY KEY` constraint to the table. Unlike [the column constraint, above](#column-constraints), it supports all SQLite types, [ascending and descending orders](#sorting-rows), and composite (multiple column) keys. + + ``` swift + t.primaryKey(email.asc, name) + // PRIMARY KEY("email" ASC, "name") + ``` + + - `unique` adds a `UNIQUE` constraint to the table. Unlike [the column constraint, above](#column-constraints), it supports composite (multiple column) constraints. + + ``` swift + t.unique(local, domain) + // UNIQUE("local", "domain") + ``` + + - `check` adds a `CHECK` constraint to the table in the form of a boolean expression (`Expression`). Boolean expressions can be easily built using [filter operators and functions](#filter-operators-and-functions). (See also the `check` parameter under [Column Constraints](#column-constraints).) + + ``` swift + t.check(balance >= 0) + // CHECK ("balance" >= 0.0) + ``` + + - `foreignKey` adds a `FOREIGN KEY` constraint to the table. Unlike [the `references` constraint, above](#column-constraints), it supports all SQLite types, both [`ON UPDATE` and `ON DELETE` actions](https://www.sqlite.org/foreignkeys.html#fk_actions), and composite (multiple column) keys. + + ``` swift + t.foreignKey(user_id, references: users, id, delete: .setNull) + // FOREIGN KEY("user_id") REFERENCES "users"("id") ON DELETE SET NULL + ``` + + + + +## Inserting Rows + +We can insert rows into a table by calling a [query’s](#queries) `insert` function with a list of [setters](#setters)—typically [typed column expressions](#expressions) and values (which can also be expressions)—each joined by the `<-` operator. + +``` swift +try db.run(users.insert(email <- "alice@mac.com", name <- "Alice")) +// INSERT INTO "users" ("email", "name") VALUES ('alice@mac.com', 'Alice') + +try db.run(users.insert(or: .replace, email <- "alice@mac.com", name <- "Alice B.")) +// INSERT OR REPLACE INTO "users" ("email", "name") VALUES ('alice@mac.com', 'Alice B.') +``` + +The `insert` function, when run successfully, returns an `Int64` representing the inserted row’s [`ROWID`][ROWID]. + +``` swift +do { + let rowid = try db.run(users.insert(email <- "alice@mac.com")) + print("inserted id: \(rowid)") +} catch { + print("insertion failed: \(error)") +} +``` + +The [`update`](#updating-rows) and [`delete`](#deleting-rows) functions follow similar patterns. + +> _Note:_ If `insert` is called without any arguments, the statement will run with a `DEFAULT VALUES` clause. The table must not have any constraints that aren’t fulfilled by default values. +> +> ``` swift +> try db.run(timestamps.insert()) +> // INSERT INTO "timestamps" DEFAULT VALUES +> ``` + + +### Setters + +SQLite.swift typically uses the `<-` operator to set values during [inserts](#inserting-rows) and [updates](#updating-rows). + +``` swift +try db.run(counter.update(count <- 0)) +// UPDATE "counters" SET "count" = 0 WHERE ("id" = 1) +``` + +There are also a number of convenience setters that take the existing value into account using native Swift operators. + +For example, to atomically increment a column, we can use `++`: + +``` swift +try db.run(counter.update(count++)) // equivalent to `counter.update(count -> count + 1)` +// UPDATE "counters" SET "count" = "count" + 1 WHERE ("id" = 1) +``` + +To take an amount and “move” it via transaction, we can use `-=` and `+=`: + +``` swift +let amount = 100.0 +try db.transaction { + try db.run(alice.update(balance -= amount)) + try db.run(betty.update(balance += amount)) +} +// BEGIN DEFERRED TRANSACTION +// UPDATE "users" SET "balance" = "balance" - 100.0 WHERE ("id" = 1) +// UPDATE "users" SET "balance" = "balance" + 100.0 WHERE ("id" = 2) +// COMMIT TRANSACTION +``` + + +###### Infix Setters + +| Operator | Types | +| -------- | ------------------ | +| `<-` | `Value -> Value` | +| `+=` | `Number -> Number` | +| `-=` | `Number -> Number` | +| `*=` | `Number -> Number` | +| `/=` | `Number -> Number` | +| `%=` | `Int -> Int` | +| `<<=` | `Int -> Int` | +| `>>=` | `Int -> Int` | +| `&=` | `Int -> Int` | +| `||=` | `Int -> Int` | +| `^=` | `Int -> Int` | +| `+=` | `String -> String` | + + +###### Postfix Setters + +| Operator | Types | +| -------- | ------------ | +| `++` | `Int -> Int` | +| `--` | `Int -> Int` | + + +## Selecting Rows + +[Query structures](#queries) are `SELECT` statements waiting to happen. They execute via [iteration](#iterating-and-accessing-values) and [other means](#plucking-values) of sequence access. + + +### Iterating and Accessing Values + +Prepared [queries](#queries) execute lazily upon iteration. Each row is returned as a `Row` object, which can be subscripted with a [column expression](#expressions) matching one of the columns returned. + +``` swift +for user in try db.prepare(users) { + print("id: \(user[id]), email: \(user[email]), name: \(user[name])") + // id: 1, email: alice@mac.com, name: Optional("Alice") +} +// SELECT * FROM "users" +``` + +`Expression` column values are _automatically unwrapped_ (we’ve made a promise to the compiler that they’ll never be `NULL`), while `Expression` values remain wrapped. + + +### Plucking Rows + +We can pluck the first row by passing a query to the `pluck` function on a database connection. + +``` swift +if let user = try db.pluck(users) { /* ... */ } // Row +// SELECT * FROM "users" LIMIT 1 +``` + +To collect all rows into an array, we can simply wrap the sequence (though this is not always the most memory-efficient idea). + +``` swift +let all = Array(try db.prepare(users)) +// SELECT * FROM "users" +``` + + +### Building Complex Queries + +[Queries](#queries) have a number of chainable functions that can be used (with [expressions](#expressions)) to add and modify [a number of clauses](https://www.sqlite.org/lang_select.html) to the underlying statement. + +``` swift +let query = users.select(email) // SELECT "email" FROM "users" + .filter(name != nil) // WHERE "name" IS NOT NULL + .order(email.desc, name) // ORDER BY "email" DESC, "name" + .limit(5, offset: 1) // LIMIT 5 OFFSET 1 +``` + + +#### Selecting Columns + +By default, [queries](#queries) select every column of the result set (using `SELECT *`). We can use the `select` function with a list of [expressions](#expressions) to return specific columns instead. + +``` swift +for user in try db.prepare(users.select(id, email)) { + print("id: \(user[id]), email: \(user[email])") + // id: 1, email: alice@mac.com +} +// SELECT "id", "email" FROM "users" +``` + +We can access the results of more complex expressions by holding onto a reference of the expression itself. + +``` swift +let sentence = name + " is " + cast(age) as Expression + " years old!" +for user in users.select(sentence) { + print(user[sentence]) + // Optional("Alice is 30 years old!") +} +// SELECT ((("name" || ' is ') || CAST ("age" AS TEXT)) || ' years old!') FROM "users" +``` + + +#### Joining Other Tables + +We can join tables using a [query’s](#queries) `join` function. + +``` swift +users.join(posts, on: user_id == users[id]) +// SELECT * FROM "users" INNER JOIN "posts" ON ("user_id" = "users"."id") +``` + +The `join` function takes a [query](#queries) object (for the table being joined on), a join condition (`on`), and is prefixed with an optional join type (default: `.inner`). Join conditions can be built using [filter operators and functions](#filter-operators-and-functions), generally require [namespacing](#column-namespacing), and sometimes require [aliasing](#table-aliasing). + + +##### Column Namespacing + +When joining tables, column names can become ambiguous. _E.g._, both tables may have an `id` column. + +``` swift +let query = users.join(posts, on: user_id == id) +// assertion failure: ambiguous column 'id' +``` + +We can disambiguate by namespacing `id`. + +``` swift +let query = users.join(posts, on: user_id == users[id]) +// SELECT * FROM "users" INNER JOIN "posts" ON ("user_id" = "users"."id") +``` + +Namespacing is achieved by subscripting a [query](#queries) with a [column expression](#expressions) (_e.g._, `users[id]` above becomes `users.id`). + +> _Note:_ We can namespace all of a table’s columns using `*`. +> +> ``` swift +> let query = users.select(users[*]) +> // SELECT "users".* FROM "users" +> ``` + + +##### Table Aliasing + +Occasionally, we need to join a table to itself, in which case we must alias the table with another name. We can achieve this using the [query’s](#queries) `alias` function. + +``` swift +let managers = users.alias("managers") + +let query = users.join(managers, on: managers[id] == users[managerId]) +// SELECT * FROM "users" +// INNER JOIN ("users") AS "managers" ON ("managers"."id" = "users"."manager_id") +``` + +If query results can have ambiguous column names, row values should be accessed with namespaced [column expressions](#expressions). In the above case, `SELECT *` immediately namespaces all columns of the result set. + +``` swift +let user = try db.pluck(query) +user[id] // fatal error: ambiguous column 'id' + // (please disambiguate: ["users"."id", "managers"."id"]) + +user[users[id]] // returns "users"."id" +user[managers[id]] // returns "managers"."id" +``` + + +#### Filtering Rows + +SQLite.swift filters rows using a [query’s](#queries) `filter` function with a boolean [expression](#expressions) (`Expression`). + +``` swift +users.filter(id == 1) +// SELECT * FROM "users" WHERE ("id" = 1) + +users.filter([1, 2, 3, 4, 5].contains(id)) +// SELECT * FROM "users" WHERE ("id" IN (1, 2, 3, 4, 5)) + +users.filter(email.like("%@mac.com")) +// SELECT * FROM "users" WHERE ("email" LIKE '%@mac.com') + +users.filter(verified && name.lowercaseString == "alice") +// SELECT * FROM "users" WHERE ("verified" AND (lower("name") == 'alice')) + +users.filter(verified || balance >= 10_000) +// SELECT * FROM "users" WHERE ("verified" OR ("balance" >= 10000.0)) +``` + +We can build our own boolean expressions by using one of the many [filter operators and functions](#filter-operators-and-functions). + +Instead of `filter` we can also use the `where` function which is an alias: + +``` swift +users.where(id == 1) +// SELECT * FROM "users" WHERE ("id" = 1) +``` + +##### Filter Operators and Functions + +SQLite.swift defines a number of operators for building filtering predicates. Operators and functions work together in a type-safe manner, so attempting to equate or compare different types will prevent compilation. + + +###### Infix Filter Operators + +| Swift | Types | SQLite | +| ----- | -------------------------------- | -------------- | +| `==` | `Equatable -> Bool` | `=`/`IS`* | +| `!=` | `Equatable -> Bool` | `!=`/`IS NOT`* | +| `>` | `Comparable -> Bool` | `>` | +| `>=` | `Comparable -> Bool` | `>=` | +| `<` | `Comparable -> Bool` | `<` | +| `<=` | `Comparable -> Bool` | `<=` | +| `~=` | `(Interval, Comparable) -> Bool` | `BETWEEN` | +| `&&` | `Bool -> Bool` | `AND` | +| `||` | `Bool -> Bool` | `OR` | + +> *When comparing against `nil`, SQLite.swift will use `IS` and `IS NOT` accordingly. + + +###### Prefix Filter Operators + +| Swift | Types | SQLite | +| ----- | ------------------ | ------ | +| `!` | `Bool -> Bool` | `NOT` | + + +###### Filtering Functions + +| Swift | Types | SQLite | +| ---------- | ----------------------- | ------- | +| `like` | `String -> Bool` | `LIKE` | +| `glob` | `String -> Bool` | `GLOB` | +| `match` | `String -> Bool` | `MATCH` | +| `contains` | `(Array, T) -> Bool` | `IN` | + + + + + +#### Sorting Rows + +We can pre-sort returned rows using the [query’s](#queries) `order` function. + +_E.g._, to return users sorted by `email`, then `name`, in ascending order: + +``` swift +users.order(email, name) +// SELECT * FROM "users" ORDER BY "email", "name" +``` + +The `order` function takes a list of [column expressions](#expressions). + +`Expression` objects have two computed properties to assist sorting: `asc` and `desc`. These properties append the expression with `ASC` and `DESC` to mark ascending and descending order respectively. + +``` swift +users.order(email.desc, name.asc) +// SELECT * FROM "users" ORDER BY "email" DESC, "name" ASC +``` + + +#### Limiting and Paging Results + +We can limit and skip returned rows using a [query’s](#queries) `limit` function (and its optional `offset` parameter). + +``` swift +users.limit(5) +// SELECT * FROM "users" LIMIT 5 + +users.limit(5, offset: 5) +// SELECT * FROM "users" LIMIT 5 OFFSET 5 +``` + + +#### Aggregation + +[Queries](#queries) come with a number of functions that quickly return aggregate scalar values from the table. These mirror the [core aggregate functions](#aggregate-sqlite-functions) and are executed immediately against the query. + +``` swift +let count = try db.scalar(users.count) +// SELECT count(*) FROM "users" +``` + +Filtered queries will appropriately filter aggregate values. + +``` swift +let count = try db.scalar(users.filter(name != nil).count) +// SELECT count(*) FROM "users" WHERE "name" IS NOT NULL +``` + + - `count` as a computed property on a query (see examples above) returns the total number of rows matching the query. + + `count` as a computed property on a column expression returns the total number of rows where that column is not `NULL`. + + ``` swift + let count = try db.scalar(users.select(name.count)) // -> Int + // SELECT count("name") FROM "users" + ``` + + - `max` takes a comparable column expression and returns the largest value if any exists. + + ``` swift + let max = try db.scalar(users.select(id.max)) // -> Int64? + // SELECT max("id") FROM "users" + ``` + + - `min` takes a comparable column expression and returns the smallest value if any exists. + + ``` swift + let min = try db.scalar(users.select(id.min)) // -> Int64? + // SELECT min("id") FROM "users" + ``` + + - `average` takes a numeric column expression and returns the average row value (as a `Double`) if any exists. + + ``` swift + let average = try db.scalar(users.select(balance.average)) // -> Double? + // SELECT avg("balance") FROM "users" + ``` + + - `sum` takes a numeric column expression and returns the sum total of all rows if any exist. + + ``` swift + let sum = try db.scalar(users.select(balance.sum)) // -> Double? + // SELECT sum("balance") FROM "users" + ``` + + - `total`, like `sum`, takes a numeric column expression and returns the sum total of all rows, but in this case always returns a `Double`, and returns `0.0` for an empty query. + + ``` swift + let total = try db.scalar(users.select(balance.total)) // -> Double + // SELECT total("balance") FROM "users" + ``` + +> _Note:_ Expressions can be prefixed with a `DISTINCT` clause by calling the `distinct` computed property. +> +> ``` swift +> let count = try db.scalar(users.select(name.distinct.count) // -> Int +> // SELECT count(DISTINCT "name") FROM "users" +> ``` + + +## Updating Rows + +We can update a table’s rows by calling a [query’s](#queries) `update` function with a list of [setters](#setters)—typically [typed column expressions](#expressions) and values (which can also be expressions)—each joined by the `<-` operator. + +When an unscoped query calls `update`, it will update _every_ row in the table. + +``` swift +try db.run(users.update(email <- "alice@me.com")) +// UPDATE "users" SET "email" = 'alice@me.com' +``` + +Be sure to scope `UPDATE` statements beforehand using [the `filter` function](#filtering-rows). + +``` swift +let alice = users.filter(id == 1) +try db.run(alice.update(email <- "alice@me.com")) +// UPDATE "users" SET "email" = 'alice@me.com' WHERE ("id" = 1) +``` + +The `update` function returns an `Int` representing the number of updated rows. + +``` swift +do { + if try db.run(alice.update(email <- "alice@me.com")) > 0 { + print("updated alice") + } else { + print("alice not found") + } +} catch { + print("update failed: \(error)") +} +``` + + +## Deleting Rows + +We can delete rows from a table by calling a [query’s](#queries) `delete` function. + +When an unscoped query calls `delete`, it will delete _every_ row in the table. + +``` swift +try db.run(users.delete()) +// DELETE FROM "users" +``` + +Be sure to scope `DELETE` statements beforehand using [the `filter` function](#filtering-rows). + +``` swift +let alice = users.filter(id == 1) +try db.run(alice.delete()) +// DELETE FROM "users" WHERE ("id" = 1) +``` + +The `delete` function returns an `Int` representing the number of deleted rows. + +``` swift +do { + if try db.run(alice.delete()) > 0 { + print("deleted alice") + } else { + print("alice not found") + } +} catch { + print("delete failed: \(error)") +} +``` + + +## Transactions and Savepoints + +Using the `transaction` and `savepoint` functions, we can run a series of statements in a transaction. If a single statement fails or the block throws an error, the changes will be rolled back. + +``` swift +try db.transaction { + let rowid = try db.run(users.insert(email <- "betty@icloud.com")) + try db.run(users.insert(email <- "cathy@icloud.com", managerId <- rowid)) +} +// BEGIN DEFERRED TRANSACTION +// INSERT INTO "users" ("email") VALUES ('betty@icloud.com') +// INSERT INTO "users" ("email", "manager_id") VALUES ('cathy@icloud.com', 2) +// COMMIT TRANSACTION +``` + +> _Note:_ Transactions run in a serial queue. + + +## Altering the Schema + +SQLite.swift comes with several functions (in addition to `Table.create`) for altering a database schema in a type-safe manner. + + +### Renaming Tables + +We can build an `ALTER TABLE … RENAME TO` statement by calling the `rename` function on a `Table` or `VirtualTable`. + +``` swift +try db.run(users.rename(Table("users_old")) +// ALTER TABLE "users" RENAME TO "users_old" +``` + + +### Adding Columns + +We can add columns to a table by calling `addColumn` function on a `Table`. SQLite.swift enforces [the same limited subset](https://www.sqlite.org/lang_altertable.html) of `ALTER TABLE` that SQLite supports. + +``` swift +try db.run(users.addColumn(suffix)) +// ALTER TABLE "users" ADD COLUMN "suffix" TEXT +``` + + +#### Added Column Constraints + +The `addColumn` function shares several of the same [`column` function parameters](#column-constraints) used when [creating tables](#creating-a-table). + + - `check` attaches a `CHECK` constraint to a column definition in the form of a boolean expression (`Expression`). (See also the `check` function under [Table Constraints](#table-constraints).) + + ``` swift + try db.run(users.addColumn(suffix, check: ["JR", "SR"].contains(suffix))) + // ALTER TABLE "users" ADD COLUMN "suffix" TEXT CHECK ("suffix" IN ('JR', 'SR')) + ``` + + - `defaultValue` adds a `DEFAULT` clause to a column definition and _only_ accepts a value matching the column’s type. This value is used if none is explicitly provided during [an `INSERT`](#inserting-rows). + + ``` swift + try db.run(users.addColumn(suffix, defaultValue: "SR")) + // ALTER TABLE "users" ADD COLUMN "suffix" TEXT DEFAULT 'SR' + ``` + + > _Note:_ Unlike the [`CREATE TABLE` constraint](#table-constraints), default values may not be expression structures (including `CURRENT_TIME`, `CURRENT_DATE`, or `CURRENT_TIMESTAMP`). + + - `collate` adds a `COLLATE` clause to `Expression` (and `Expression`) column definitions with [a collating sequence](https://www.sqlite.org/datatype3.html#collation) defined in the `Collation` enumeration. + + ``` swift + try db.run(users.addColumn(email, collate: .nocase)) + // ALTER TABLE "users" ADD COLUMN "email" TEXT NOT NULL COLLATE "NOCASE" + + try db.run(users.addColumn(name, collate: .rtrim)) + // ALTER TABLE "users" ADD COLUMN "name" TEXT COLLATE "RTRIM" + ``` + + - `references` adds a `REFERENCES` clause to `Int64` (and `Int64?`) column definitions and accepts a table or namespaced column expression. (See the `foreignKey` function under [Table Constraints](#table-constraints) for non-integer foreign key support.) + + ``` swift + try db.run(posts.addColumn(userId, references: users, id) + // ALTER TABLE "posts" ADD COLUMN "user_id" INTEGER REFERENCES "users" ("id") + ``` + + +### Indexes + + +#### Creating Indexes + +We can build [`CREATE INDEX` statements](https://www.sqlite.org/lang_createindex.html) by calling the `createIndex` function on a `SchemaType`. + +``` swift +try db.run(users.createIndex(email)) +// CREATE INDEX "index_users_on_email" ON "users" ("email") +``` + +The index name is generated automatically based on the table and column names. + +The `createIndex` function has a couple default parameters we can override. + + - `unique` adds a `UNIQUE` constraint to the index. Default: `false`. + + ``` swift + try db.run(users.createIndex(email, unique: true)) + // CREATE UNIQUE INDEX "index_users_on_email" ON "users" ("email") + ``` + + - `ifNotExists` adds an `IF NOT EXISTS` clause to the `CREATE TABLE` statement (which will bail out gracefully if the table already exists). Default: `false`. + + ``` swift + try db.run(users.createIndex(email, ifNotExists: true)) + // CREATE INDEX IF NOT EXISTS "index_users_on_email" ON "users" ("email") + ``` + + +#### Dropping Indexes + +We can build [`DROP INDEX` statements](https://www.sqlite.org/lang_dropindex.html) by calling the `dropIndex` function on a `SchemaType`. + +``` swift +try db.run(users.dropIndex(email)) +// DROP INDEX "index_users_on_email" +``` + +The `dropIndex` function has one additional parameter, `ifExists`, which (when `true`) adds an `IF EXISTS` clause to the statement. + +``` swift +try db.run(users.dropIndex(email, ifExists: true)) +// DROP INDEX IF EXISTS "index_users_on_email" +``` + + +### Dropping Tables + +We can build [`DROP TABLE` statements](https://www.sqlite.org/lang_droptable.html) by calling the `dropTable` function on a `SchemaType`. + +``` swift +try db.run(users.drop()) +// DROP TABLE "users" +``` + +The `drop` function has one additional parameter, `ifExists`, which (when `true`) adds an `IF EXISTS` clause to the statement. + +``` swift +try db.run(users.drop(ifExists: true)) +// DROP TABLE IF EXISTS "users" +``` + + +### Migrations and Schema Versioning + +You can add a convenience property on `Connection` to query and set the [`PRAGMA user_version`](https://sqlite.org/pragma.html#pragma_user_version). + +This is a great way to manage your schema’s version over migrations. + +``` swift +extension Connection { + public var userVersion: Int32 { + get { return Int32(try! scalar("PRAGMA user_version") as! Int64)} + set { try! run("PRAGMA user_version = \(newValue)") } + } +} +``` + +Then you can conditionally run your migrations along the lines of: + +```swift +if db.userVersion == 0 { + // handle first migration + db.userVersion = 1 +} +if db.userVersion == 1 { + // handle second migration + db.userVersion = 2 +} +``` + +For more complex migration requirements check out the schema management system +[SQLiteMigrationManager.swift][]. + +## Custom Types + +SQLite.swift supports serializing and deserializing any custom type as long as it conforms to the `Value` protocol. + +> ``` swift +> protocol Value { +> typealias Datatype: Binding +> class var declaredDatatype: String { get } +> class func fromDatatypeValue(datatypeValue: Datatype) -> Self +> var datatypeValue: Datatype { get } +> } +> ``` + +The `Datatype` must be one of the basic Swift types that values are bridged through before serialization and deserialization (see [Building Type-Safe SQL](#building-type-safe-sql) for a list of types). + +> _Note:_ `Binding` is a protocol that SQLite.swift uses internally to directly map SQLite types to Swift types. **Do _not_** conform custom types to the `Binding` protocol. + +Once extended, the type can be used [_almost_](#custom-type-caveats) wherever typed expressions can be. + + +### Date-Time Values + +In SQLite, `DATETIME` columns can be treated as strings or numbers, so we can transparently bridge `Date` objects through Swift’s `String` or `Int` types. + +To serialize `Date` objects as `TEXT` values (in ISO 8601), we’ll use `String`. + +``` swift +extension Date: Value { + class var declaredDatatype: String { + return String.declaredDatatype + } + class func fromDatatypeValue(stringValue: String) -> Date { + return SQLDateFormatter.dateFromString(stringValue)! + } + var datatypeValue: String { + return SQLDateFormatter.stringFromDate(self) + } +} + +let SQLDateFormatter: DateFormatter = { + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS" + formatter.locale = Locale(localeIdentifier: "en_US_POSIX") + formatter.timeZone = TimeZone(forSecondsFromGMT: 0) + return formatter +}() +``` + +We can also treat them as `INTEGER` values using `Int`. + +``` swift +extension Date: Value { + class var declaredDatatype: String { + return Int.declaredDatatype + } + class func fromDatatypeValue(intValue: Int) -> Self { + return self(timeIntervalSince1970: TimeInterval(intValue)) + } + var datatypeValue: Int { + return Int(timeIntervalSince1970) + } +} +``` + +> _Note:_ SQLite’s `CURRENT_DATE`, `CURRENT_TIME`, and `CURRENT_TIMESTAMP` helpers return `TEXT` values. Because of this (and the fact that Unix time is far less human-readable when we’re faced with the raw data), we recommend using the `TEXT` extension. + +Once defined, we can use these types directly in SQLite statements. + +``` swift +let published_at = Expression("published_at") + +let published = posts.filter(published_at <= Date()) +// extension where Datatype == String: +// SELECT * FROM "posts" WHERE "published_at" <= '2014-11-18 12:45:30' +// extension where Datatype == Int: +// SELECT * FROM "posts" WHERE "published_at" <= 1416314730 +``` + + +### Binary Data + +We can bridge any type that can be initialized from and encoded to `Data`. + +``` swift +extension UIImage: Value { + public class var declaredDatatype: String { + return Blob.declaredDatatype + } + public class func fromDatatypeValue(blobValue: Blob) -> UIImage { + return UIImage(data: Data.fromDatatypeValue(blobValue))! + } + public var datatypeValue: Blob { + return UIImagePNGRepresentation(self)!.datatypeValue + } + +} +``` + +> _Note:_ See the [Archives and Serializations Programming Guide](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Archiving/Archiving.html#//apple_ref/doc/uid/10000047i) for more information on encoding and decoding custom types. + + +### Custom Type Caveats + +Swift does _not_ currently support generic subscripting, which means we cannot, by default, subscript Expressions with custom types to: + + 1. **Namespace expressions**. Use the `namespace` function, instead: + + ``` swift + let avatar = Expression("avatar") + users[avatar] // fails to compile + users.namespace(avatar) // "users"."avatar" + ``` + + 2. **Access column data**. Use the `get` function, instead: + + ``` swift + let user = users.first! + user[avatar] // fails to compile + user.get(avatar) // UIImage? + ``` + +We can, of course, write extensions, but they’re rather wordy. + +``` swift +extension Query { + subscript(column: Expression) -> Expression { + return namespace(column) + } + subscript(column: Expression) -> Expression { + return namespace(column) + } +} + +extension Row { + subscript(column: Expression) -> UIImage { + return get(column) + } + subscript(column: Expression) -> UIImage? { + return get(column) + } +} +``` + + +## Other Operators + +In addition to [filter operators](#filtering-infix-operators), SQLite.swift defines a number of operators that can modify expression values with arithmetic, bitwise operations, and concatenation. + + +###### Other Infix Operators + +| Swift | Types | SQLite | +| ----- | -------------------------------- | -------- | +| `+` | `Number -> Number` | `+` | +| `-` | `Number -> Number` | `-` | +| `*` | `Number -> Number` | `*` | +| `/` | `Number -> Number` | `/` | +| `%` | `Int -> Int` | `%` | +| `<<` | `Int -> Int` | `<<` | +| `>>` | `Int -> Int` | `>>` | +| `&` | `Int -> Int` | `&` | +| `|` | `Int -> Int` | `|` | +| `+` | `String -> String` | `||` | + +> _Note:_ SQLite.swift also defines a bitwise XOR operator, `^`, which expands the expression `lhs ^ rhs` to `~(lhs & rhs) & (lhs | rhs)`. + + +###### Other Prefix Operators + +| Swift | Types | SQLite | +| ----- | ------------------ | ------ | +| `~` | `Int -> Int` | `~` | +| `-` | `Number -> Number` | `-` | + + +## Core SQLite Functions + +Many of SQLite’s [core functions](https://www.sqlite.org/lang_corefunc.html) have been surfaced in and type-audited for SQLite.swift. + +> _Note:_ SQLite.swift aliases the `??` operator to the `ifnull` function. +> +> ``` swift +> name ?? email // ifnull("name", "email") +> ``` + + +## Aggregate SQLite Functions + +Most of SQLite’s [aggregate functions](https://www.sqlite.org/lang_aggfunc.html) have been surfaced in and type-audited for SQLite.swift. + + +## Custom SQL Functions + +We can create custom SQL functions by calling `createFunction` on a database connection. + +For example, to give queries access to [`MobileCoreServices.UTTypeConformsTo`](https://developer.apple.com/library/ios/documentation/MobileCoreServices/Reference/UTTypeRef/index.html#//apple_ref/c/func/UTTypeConformsTo), we can write the following: + +``` swift +import MobileCoreServices + +let typeConformsTo: (Expression, String) -> Expression = ( + try db.createFunction("typeConformsTo", deterministic: true) { UTI, conformsToUTI in + return UTTypeConformsTo(UTI, conformsToUTI) + } +) +``` + +> _Note:_ The optional `deterministic` parameter is an optimization that causes the function to be created with [`SQLITE_DETERMINISTIC`](https://www.sqlite.org/c3ref/create_function.html). + +Note `typeConformsTo`’s signature: + +``` swift +(Expression, String) -> Expression +``` + +Because of this, `createFunction` expects a block with the following signature: + +``` swift +(String, String) -> Bool +``` + +Once assigned, the closure can be called wherever boolean expressions are accepted. + +``` swift +let attachments = Table("attachments") +let UTI = Expression("UTI") + +let images = attachments.filter(typeConformsTo(UTI, kUTTypeImage)) +// SELECT * FROM "attachments" WHERE "typeConformsTo"("UTI", 'public.image') +``` + +> _Note:_ The return type of a function must be [a core SQL type](#building-type-safe-sql) or [conform to `Value`](#custom-types). + +We can create loosely-typed functions by handling an array of raw arguments, instead. + +``` swift +db.createFunction("typeConformsTo", deterministic: true) { args in + guard let UTI = args[0] as? String, conformsToUTI = args[1] as? String else { return nil } + return UTTypeConformsTo(UTI, conformsToUTI) +} +``` + +Creating a loosely-typed function cannot return a closure and instead must be wrapped manually or executed [using raw SQL](#executing-arbitrary-sql). + +``` swift +let stmt = try db.prepare("SELECT * FROM attachments WHERE typeConformsTo(UTI, ?)") +for row in stmt.bind(kUTTypeImage) { /* ... */ } +``` + + +## Custom Collations + +We can create custom collating sequences by calling `createCollation` on a database connection. + +``` swift +try db.createCollation("NODIACRITIC") { lhs, rhs in + return lhs.compare(rhs, options: .diacriticInsensitiveSearch) +} +``` + +We can reference a custom collation using the `Custom` member of the `Collation` enumeration. + +``` swift +restaurants.order(collate(.custom("NODIACRITIC"), name)) +// SELECT * FROM "restaurants" ORDER BY "name" COLLATE "NODIACRITIC" +``` + + +## Full-text Search + +We can create a virtual table using the [FTS4 module](http://www.sqlite.org/fts3.html) by calling `create` on a `VirtualTable`. + +``` swift +let emails = VirtualTable("emails") +let subject = Expression("subject") +let body = Expression("body") + +try db.run(emails.create(.FTS4(subject, body))) +// CREATE VIRTUAL TABLE "emails" USING fts4("subject", "body") +``` + +We can specify a [tokenizer](http://www.sqlite.org/fts3.html#tokenizer) using the `tokenize` parameter. + +``` swift +try db.run(emails.create(.FTS4([subject, body], tokenize: .Porter))) +// CREATE VIRTUAL TABLE "emails" USING fts4("subject", "body", tokenize=porter) +``` + +We can set the full range of parameters by creating a `FTS4Config` object. + +``` swift +let emails = VirtualTable("emails") +let subject = Expression("subject") +let body = Expression("body") +let config = FTS4Config() + .column(subject) + .column(body, [.unindexed]) + .languageId("lid") + .order(.desc) + +try db.run(emails.create(.FTS4(config)) +// CREATE VIRTUAL TABLE "emails" USING fts4("subject", "body", notindexed="body", languageid="lid", order="desc") +``` + +Once we insert a few rows, we can search using the `match` function, which takes a table or column as its first argument and a query string as its second. + +``` swift +try db.run(emails.insert( + subject <- "Just Checking In", + body <- "Hey, I was just wondering...did you get my last email?" +)) + +let wonderfulEmails = emails.match("wonder*") +// SELECT * FROM "emails" WHERE "emails" MATCH 'wonder*' + +let replies = emails.filter(subject.match("Re:*")) +// SELECT * FROM "emails" WHERE "subject" MATCH 'Re:*' +``` + +### FTS5 + +When linking against a version of SQLite with [FTS5](http://www.sqlite.org/fts5.html) enabled we can create the virtual table +in a similar fashion. + +```swift +let emails = VirtualTable("emails") +let subject = Expression("subject") +let body = Expression("body") +let config = FTS5Config() + .column(subject) + .column(body, [.unindexed]) + +try db.run(emails.create(.FTS5(config)) +// CREATE VIRTUAL TABLE "emails" USING fts5("subject", "body" UNINDEXED) + +// Note that FTS5 uses a different syntax to select columns, so we need to rewrite +// the last FTS4 query above as: +let replies = emails.filter(emails.match("subject:\"Re:\"*)) +// SELECT * FROM "emails" WHERE "emails" MATCH 'subject:"Re:"*' + +// https://www.sqlite.org/fts5.html#_changes_to_select_statements_ +``` + +## Executing Arbitrary SQL + +Though we recommend you stick with SQLite.swift’s [type-safe system](#building-type-safe-sql) whenever possible, it is possible to simply and safely prepare and execute raw SQL statements via a `Database` connection using the following functions. + + - `execute` runs an arbitrary number of SQL statements as a convenience. + + ``` swift + try db.execute( + "BEGIN TRANSACTION;" + + "CREATE TABLE users (" + + "id INTEGER PRIMARY KEY NOT NULL," + + "email TEXT UNIQUE NOT NULL," + + "name TEXT" + + ");" + + "CREATE TABLE posts (" + + "id INTEGER PRIMARY KEY NOT NULL," + + "title TEXT NOT NULL," + + "body TEXT NOT NULL," + + "published_at DATETIME" + + ");" + + "PRAGMA user_version = 1;" + + "COMMIT TRANSACTION;" + ) + ``` + + - `prepare` prepares a single `Statement` object from a SQL string, optionally binds values to it (using the statement’s `bind` function), and returns the statement for deferred execution. + + ``` swift + let stmt = try db.prepare("INSERT INTO users (email) VALUES (?)") + ``` + + Once prepared, statements may be executed using `run`, binding any unbound parameters. + + ``` swift + try stmt.run("alice@mac.com") + db.changes // -> {Some 1} + ``` + + Statements with results may be iterated over, using the columnNames if useful. + + ``` swift + let stmt = try db.prepare("SELECT id, email FROM users") + for row in stmt { + for (index, name) in stmt.columnNames.enumerate() { + print ("\(name)=\(row[index]!)") + // id: Optional(1), email: Optional("alice@mac.com") + } + } + ``` + + - `run` prepares a single `Statement` object from a SQL string, optionally binds values to it (using the statement’s `bind` function), executes, and returns the statement. + + ``` swift + try db.run("INSERT INTO users (email) VALUES (?)", "alice@mac.com") + ``` + + - `scalar` prepares a single `Statement` object from a SQL string, optionally binds values to it (using the statement’s `bind` function), executes, and returns the first value of the first row. + + ``` swift + let count = try db.scalar("SELECT count(*) FROM users") as! Int64 + ``` + + Statements also have a `scalar` function, which can optionally re-bind values at execution. + + ``` swift + let stmt = try db.prepare("SELECT count (*) FROM users") + let count = try stmt.scalar() as! Int64 + ``` + + +## Logging + +We can log SQL using the database’s `trace` function. + +``` swift +#if DEBUG + db.trace(print) +#endif +``` + + +[ROWID]: https://sqlite.org/lang_createtable.html#rowid +[SQLiteMigrationManager.swift]: https://github.com/garriguv/SQLiteMigrationManager.swift diff --git a/Carthage/Checkouts/SQLite.swift/Documentation/Planning.md b/Carthage/Checkouts/SQLite.swift/Documentation/Planning.md new file mode 100644 index 0000000000..d814d26b06 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Documentation/Planning.md @@ -0,0 +1,24 @@ +# SQLite.swift Planning + +This document captures both near term steps (aka Roadmap) and feature requests. +The goal is to add some visibility and guidance for future additions and Pull Requests, as well as to keep the Issues list clear of enhancement requests so that bugs are more visible. + +## Roadmap + +_Lists agreed upon next steps in approximate priority order._ + +## Feature Requests + +_A gathering point for ideas for new features. In general, the corresponding issue will be closed once it is added here, with the assumption that it will be referred to when it comes time to add the corresponding feature._ + +### Features + + * encapsulate ATTACH DATABASE / DETACH DATABASE as methods, per [#30](https://github.com/stephencelis/SQLite.swift/issues/30) + * provide separate threads for update vs read, so updates don't block reads, per [#236](https://github.com/stephencelis/SQLite.swift/issues/236) + * expose triggers, per [#164](https://github.com/stephencelis/SQLite.swift/issues/164) + +## Suspended Feature Requests + +_Features that are not actively being considered, perhaps because of no clean type-safe way to implement them with the current Swift, or bugs, or just general uncertainty._ + + * provide a mechanism for INSERT INTO multiple values, per [#168](https://github.com/stephencelis/SQLite.swift/issues/168) diff --git a/Carthage/Checkouts/SQLite.swift/Documentation/Resources/installation@2x.png b/Carthage/Checkouts/SQLite.swift/Documentation/Resources/installation@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6b31f459348e97208dbc8b564884a0d065c803d2 GIT binary patch literal 312530 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 z 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 z°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�KM6= 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 Glm8Eh)%8XI literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/SQLite.swift/Documentation/Resources/playground@2x.png b/Carthage/Checkouts/SQLite.swift/Documentation/Resources/playground@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..32646d6aa411b7b5a7163fc692c7252fe8ee8cce GIT binary patch literal 124729 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

lbErWo0fYUhNnO45# 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%0A`zqOC=oLR_v5FR_8z+($29av1W18O7 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 CF|3yW literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/SQLite.swift/LICENSE.txt b/Carthage/Checkouts/SQLite.swift/LICENSE.txt new file mode 100644 index 0000000000..13303c1135 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/LICENSE.txt @@ -0,0 +1,21 @@ +(The MIT License) + +Copyright (c) 2014-2015 Stephen Celis () + +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. diff --git a/Carthage/Checkouts/SQLite.swift/Makefile b/Carthage/Checkouts/SQLite.swift/Makefile new file mode 100644 index 0000000000..d4f51d53e3 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Makefile @@ -0,0 +1,60 @@ +BUILD_TOOL = xcodebuild +BUILD_SCHEME = SQLite Mac +IOS_SIMULATOR = iPhone 6s +IOS_VERSION = 9.3 +ifeq ($(BUILD_SCHEME),SQLite iOS) + BUILD_ARGUMENTS = -scheme "$(BUILD_SCHEME)" -destination "platform=iOS Simulator,name=$(IOS_SIMULATOR),OS=$(IOS_VERSION)" +else + BUILD_ARGUMENTS = -scheme "$(BUILD_SCHEME)" +endif + +XCPRETTY := $(shell command -v xcpretty) +SWIFTCOV := $(shell command -v swiftcov) +GCOVR := $(shell command -v gcovr) +TEST_ACTIONS := clean build build-for-testing test-without-building + +default: test + +build: + $(BUILD_TOOL) $(BUILD_ARGUMENTS) + +test: +ifdef XCPRETTY + @set -o pipefail && $(BUILD_TOOL) $(BUILD_ARGUMENTS) $(TEST_ACTIONS) | $(XCPRETTY) -c +else + $(BUILD_TOOL) $(BUILD_ARGUMENTS) $(TEST_ACTIONS) +endif + +coverage: +ifdef SWIFTCOV + $(SWIFTCOV) generate --output coverage \ + $(BUILD_TOOL) $(BUILD_ARGUMENTS) -configuration Release test \ + -- ./SQLite/*.swift +ifdef GCOVR + $(GCOVR) \ + --root . \ + --use-gcov-files \ + --html \ + --html-details \ + --output coverage/index.html \ + --keep +else + @echo gcovr must be installed for HTML output: https://github.com/gcovr/gcovr +endif +else + @echo swiftcov must be installed for coverage: https://github.com/realm/SwiftCov + @exit 1 +endif + +clean: + $(BUILD_TOOL) $(BUILD_ARGUMENTS) clean + rm -r coverage + +repl: + @$(BUILD_TOOL) $(BUILD_ARGUMENTS) -derivedDataPath $(TMPDIR)/SQLite.swift > /dev/null && \ + swift -F '$(TMPDIR)/SQLite.swift/Build/Products/Debug' + +sloc: + @zsh -c "grep -vE '^ *//|^$$' SQLite/*/*.{swift,h,m} | wc -l" + +.PHONY: test coverage clean repl sloc diff --git a/Carthage/Checkouts/SQLite.swift/Package.swift b/Carthage/Checkouts/SQLite.swift/Package.swift new file mode 100644 index 0000000000..fc7c5a0ed9 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Package.swift @@ -0,0 +1,17 @@ +import PackageDescription + +let package = Package( + name: "SQLite", + targets: [ + Target( + name: "SQLite", + dependencies: [ + .Target(name: "SQLiteObjc") + ]), + Target(name: "SQLiteObjc") + ], + dependencies: [ + .Package(url: "https://github.com/stephencelis/CSQLite.git", majorVersion: 0) + ], + exclude: ["Tests/CocoaPods", "Tests/Carthage"] +) diff --git a/Carthage/Checkouts/SQLite.swift/README.md b/Carthage/Checkouts/SQLite.swift/README.md new file mode 100644 index 0000000000..89917b36b3 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/README.md @@ -0,0 +1,263 @@ +# SQLite.swift + +[![Build Status][Badge]][Travis] [![CocoaPods Version](https://cocoapod-badges.herokuapp.com/v/SQLite.swift/badge.png)](http://cocoadocs.org/docsets/SQLite.swift) [![Swift](https://img.shields.io/badge/swift-3-orange.svg?style=flat)](https://developer.apple.com/swift/) [![Platform](https://cocoapod-badges.herokuapp.com/p/SQLite.swift/badge.png)](http://cocoadocs.org/docsets/SQLite.swift) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Join the chat at https://gitter.im/stephencelis/SQLite.swift](https://badges.gitter.im/stephencelis/SQLite.swift.svg)](https://gitter.im/stephencelis/SQLite.swift) + +A type-safe, [Swift][]-language layer over [SQLite3][]. + +[SQLite.swift][] provides compile-time confidence in SQL statement +syntax _and_ intent. + +[Badge]: https://img.shields.io/travis/stephencelis/SQLite.swift/master.svg?style=flat +[Travis]: https://travis-ci.org/stephencelis/SQLite.swift +[Swift]: https://developer.apple.com/swift/ +[SQLite3]: http://www.sqlite.org +[SQLite.swift]: https://github.com/stephencelis/SQLite.swift + + +## Features + + - A pure-Swift interface + - A type-safe, optional-aware SQL expression builder + - A flexible, chainable, lazy-executing query layer + - Automatically-typed data access + - A lightweight, uncomplicated query and parameter binding interface + - Developer-friendly error handling and debugging + - [Full-text search][] support + - [Well-documented][See Documentation] + - Extensively tested + - SQLCipher support via CocoaPods + - Active support at [StackOverflow](http://stackoverflow.com/questions/tagged/sqlite.swift), and [Gitter Chat Room](https://gitter.im/stephencelis/SQLite.swift) (_experimental_) + +[Full-text search]: Documentation/Index.md#full-text-search +[See Documentation]: Documentation/Index.md#sqliteswift-documentation + + +## Usage + +``` swift +import SQLite + +let db = try Connection("path/to/db.sqlite3") + +let users = Table("users") +let id = Expression("id") +let name = Expression("name") +let email = Expression("email") + +try db.run(users.create { t in + t.column(id, primaryKey: true) + t.column(name) + t.column(email, unique: true) +}) +// CREATE TABLE "users" ( +// "id" INTEGER PRIMARY KEY NOT NULL, +// "name" TEXT, +// "email" TEXT NOT NULL UNIQUE +// ) + +let insert = users.insert(name <- "Alice", email <- "alice@mac.com") +let rowid = try db.run(insert) +// INSERT INTO "users" ("name", "email") VALUES ('Alice', 'alice@mac.com') + +for user in try db.prepare(users) { + print("id: \(user[id]), name: \(user[name]), email: \(user[email])") + // id: 1, name: Optional("Alice"), email: alice@mac.com +} +// SELECT * FROM "users" + +let alice = users.filter(id == rowid) + +try db.run(alice.update(email <- email.replace("mac.com", with: "me.com"))) +// UPDATE "users" SET "email" = replace("email", 'mac.com', 'me.com') +// WHERE ("id" = 1) + +try db.run(alice.delete()) +// DELETE FROM "users" WHERE ("id" = 1) + +db.scalar(users.count) // 0 +// SELECT count(*) FROM "users" +``` + +SQLite.swift also works as a lightweight, Swift-friendly wrapper over the C +API. + +``` swift +let stmt = try db.prepare("INSERT INTO users (email) VALUES (?)") +for email in ["betty@icloud.com", "cathy@icloud.com"] { + try stmt.run(email) +} + +db.totalChanges // 3 +db.changes // 1 +db.lastInsertRowid // 3 + +for row in try db.prepare("SELECT id, email FROM users") { + print("id: \(row[0]), email: \(row[1])") + // id: Optional(2), email: Optional("betty@icloud.com") + // id: Optional(3), email: Optional("cathy@icloud.com") +} + +db.scalar("SELECT count(*) FROM users") // 2 +``` + +[Read the documentation][See Documentation] or explore more, +interactively, from the Xcode project’s playground. + +![SQLite.playground Screen Shot](Documentation/Resources/playground@2x.png) + +For a more comprehensive example, see [this article](http://masteringswift.blogspot.com/2015/09/create-data-access-layer-with.html) and the [companion repository](https://github.com/hoffmanjon/SQLiteDataAccessLayer2/tree/master). + +## Installation + +> _Note:_ SQLite.swift requires Swift 3 (and [Xcode][] 8) or greater. If you absolutely +> need compatibility with Swift 2.3 you can use the [swift-2.3][] branch or older +> released versions. New development will happen exclusively on the master/Swift 3 branch. + +### Carthage + +[Carthage][] is a simple, decentralized dependency manager for Cocoa. To +install SQLite.swift with Carthage: + + 1. Make sure Carthage is [installed][Carthage Installation]. + + 2. Update your Cartfile to include the following: + + ``` + github "stephencelis/SQLite.swift" ~> 0.11.2 + ``` + + 3. Run `carthage update` and [add the appropriate framework][Carthage Usage]. + + +[Carthage]: https://github.com/Carthage/Carthage +[Carthage Installation]: https://github.com/Carthage/Carthage#installing-carthage +[Carthage Usage]: https://github.com/Carthage/Carthage#adding-frameworks-to-an-application + + +### CocoaPods + +[CocoaPods][] is a dependency manager for Cocoa projects. To install +SQLite.swift with CocoaPods: + + 1. Verify that your copy of Xcode is installed and active in the default location (`/Applications/Xcode.app`). + + ```sh + sudo xcode-select --switch /Applications/Xcode.app + ``` + + 2. Make sure CocoaPods is [installed][CocoaPods Installation]. (SQLite.swift requires version 1.0.0 or greater.) + + ``` sh + # Using the default Ruby install will require you to use sudo when + # installing and updating gems. + [sudo] gem install cocoapods + ``` + + 3. Update your Podfile to include the following: + + ``` ruby + use_frameworks! + + target 'YourAppTargetName' do + pod 'SQLite.swift', '~> 0.11.2' + end + ``` + + 4. Run `pod install --repo-update`. + +[CocoaPods]: https://cocoapods.org +[CocoaPods Installation]: https://guides.cocoapods.org/using/getting-started.html#getting-started + +### Swift Package Manager + +The [Swift Package Manager][] is a tool for managing the distribution of Swift code. + +1. Add the following to your `Package.swift` file: + +```swift +dependencies: [ + .Package(url: "https://github.com/stephencelis/SQLite.swift.git", majorVersion: 0, minor: 11) +] +``` + +[Swift Package Manager]: https://swift.org/package-manager + +### Manual + +To install SQLite.swift as an Xcode sub-project: + + 1. Drag the **SQLite.xcodeproj** file into your own project. + ([Submodule][], clone, or [download][] the project first.) + + ![Installation Screen Shot](Documentation/Resources/installation@2x.png) + + 2. In your target’s **General** tab, click the **+** button under **Linked + Frameworks and Libraries**. + + 3. Select the appropriate **SQLite.framework** for your platform. + + 4. **Add**. + +Some additional steps are required to install the application on an actual device: + + 5. In the **General** tab, click the **+** button under **Embedded Binaries**. + + 6. Select the appropriate **SQLite.framework** for your platform. + + 7. **Add**. + + +[Xcode]: https://developer.apple.com/xcode/downloads/ +[Submodule]: http://git-scm.com/book/en/Git-Tools-Submodules +[download]: https://github.com/stephencelis/SQLite.swift/archive/master.zip + + +## Communication + +[See the planning document] for a roadmap and existing feature requests. + +[Read the contributing guidelines][]. The _TL;DR_ (but please; _R_): + + - Need **help** or have a **general question**? [Ask on Stack + Overflow][] (tag `sqlite.swift`). + - Found a **bug** or have a **feature request**? [Open an issue][]. + - Want to **contribute**? [Submit a pull request][]. + +[See the planning document]: /Documentation/Planning.md +[Read the contributing guidelines]: ./CONTRIBUTING.md#contributing +[Ask on Stack Overflow]: http://stackoverflow.com/questions/tagged/sqlite.swift +[Open an issue]: https://github.com/stephencelis/SQLite.swift/issues/new +[Submit a pull request]: https://github.com/stephencelis/SQLite.swift/fork + + +## Author + + - [Stephen Celis](mailto:stephen@stephencelis.com) + ([@stephencelis](https://twitter.com/stephencelis)) + + +## License + +SQLite.swift is available under the MIT license. See [the LICENSE +file](./LICENSE.txt) for more information. + +## Related + +These projects enhance or use SQLite.swift: + + - [SQLiteMigrationManager.swift](https://github.com/garriguv/SQLiteMigrationManager.swift) (inspired by [FMDBMigrationManager](https://github.com/layerhq/FMDBMigrationManager)) + + +## Alternatives + +Looking for something else? Try another Swift wrapper (or [FMDB][]): + + - [Camembert](https://github.com/remirobert/Camembert) + - [GRDB](https://github.com/groue/GRDB.swift) + - [SQLiteDB](https://github.com/FahimF/SQLiteDB) + - [Squeal](https://github.com/nerdyc/Squeal) + - [SwiftData](https://github.com/ryanfowler/SwiftData) + - [SwiftSQLite](https://github.com/chrismsimpson/SwiftSQLite) + +[FMDB]: https://github.com/ccgus/fmdb +[swift-2.3]: https://github.com/stephencelis/SQLite.swift/tree/swift-2.3 diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.playground/Contents.swift b/Carthage/Checkouts/SQLite.swift/SQLite.playground/Contents.swift new file mode 100644 index 0000000000..11e13139f7 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/SQLite.playground/Contents.swift @@ -0,0 +1,43 @@ +import SQLite + +let db = try! Connection() + +db.trace { print($0) } + +let users = Table("users") + +let id = Expression("id") +let email = Expression("email") +let name = Expression("name") + +try! db.run(users.create { t in + t.column(id, primaryKey: true) + t.column(email, unique: true, check: email.like("%@%")) + t.column(name) +}) + +let rowid = try! db.run(users.insert(email <- "alice@mac.com")) +let alice = users.filter(id == rowid) + +for user in try! db.prepare(users) { + print("id: \(user[id]), email: \(user[email])") +} + +let emails = VirtualTable("emails") + +let subject = Expression("subject") +let body = Expression("body") + +try! db.run(emails.create(.FTS4(subject, body))) + +try! db.run(emails.insert( + subject <- "Hello, world!", + body <- "This is a hello world message." +)) + +let row = try! db.pluck(emails.match("hello")) + +let query = try! db.prepare(emails.match("hello")) +for row in query { + print(row[subject]) +} diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.playground/contents.xcplayground b/Carthage/Checkouts/SQLite.swift/SQLite.playground/contents.xcplayground new file mode 100644 index 0000000000..fd676d5b46 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/SQLite.playground/contents.xcplayground @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.swift.podspec b/Carthage/Checkouts/SQLite.swift/SQLite.swift.podspec new file mode 100644 index 0000000000..3c61aa1fe6 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/SQLite.swift.podspec @@ -0,0 +1,70 @@ +Pod::Spec.new do |s| + s.name = "SQLite.swift" + s.version = "0.11.2" + s.summary = "A type-safe, Swift-language layer over SQLite3 for iOS and OS X." + + s.description = <<-DESC + SQLite.swift provides compile-time confidence in SQL statement syntax and + intent. + DESC + + s.homepage = "https://github.com/stephencelis/SQLite.swift" + s.license = 'MIT' + s.author = { "Stephen Celis" => "stephen@stephencelis.com" } + s.source = { :git => "https://github.com/stephencelis/SQLite.swift.git", :tag => s.version.to_s } + s.social_media_url = 'https://twitter.com/stephencelis' + + s.module_name = 'SQLite' + s.ios.deployment_target = "8.0" + s.tvos.deployment_target = "9.0" + s.osx.deployment_target = "10.9" + s.watchos.deployment_target = "2.0" + s.default_subspec = 'standard' + s.pod_target_xcconfig = { + 'SWIFT_VERSION' => '3.0', + } + + s.subspec 'standard' do |ss| + ss.source_files = 'Sources/{SQLite,SQLiteObjc}/**/*.{c,h,m,swift}' + ss.exclude_files = 'Sources/**/Cipher.swift' + ss.private_header_files = 'Sources/SQLiteObjc/*.h' + + ss.library = 'sqlite3' + ss.preserve_paths = 'CocoaPods/**/*' + ss.pod_target_xcconfig = { + 'SWIFT_INCLUDE_PATHS[sdk=macosx*]' => '$(SRCROOT)/SQLite.swift/CocoaPods/macosx', + 'SWIFT_INCLUDE_PATHS[sdk=macosx10.11]' => '$(SRCROOT)/SQLite.swift/CocoaPods/macosx-10.11', + 'SWIFT_INCLUDE_PATHS[sdk=macosx10.12]' => '$(SRCROOT)/SQLite.swift/CocoaPods/macosx-10.12', + 'SWIFT_INCLUDE_PATHS[sdk=iphoneos*]' => '$(SRCROOT)/SQLite.swift/CocoaPods/iphoneos', + 'SWIFT_INCLUDE_PATHS[sdk=iphoneos10.0]' => '$(SRCROOT)/SQLite.swift/CocoaPods/iphoneos-10.0', + 'SWIFT_INCLUDE_PATHS[sdk=iphonesimulator*]' => '$(SRCROOT)/SQLite.swift/CocoaPods/iphonesimulator', + 'SWIFT_INCLUDE_PATHS[sdk=iphonesimulator10.0]' => '$(SRCROOT)/SQLite.swift/CocoaPods/iphonesimulator-10.0', + 'SWIFT_INCLUDE_PATHS[sdk=appletvos*]' => '$(SRCROOT)/SQLite.swift/CocoaPods/appletvos', + 'SWIFT_INCLUDE_PATHS[sdk=appletvsimulator*]' => '$(SRCROOT)/SQLite.swift/CocoaPods/appletvsimulator', + 'SWIFT_INCLUDE_PATHS[sdk=watchos*]' => '$(SRCROOT)/SQLite.swift/CocoaPods/watchos', + 'SWIFT_INCLUDE_PATHS[sdk=watchsimulator*]' => '$(SRCROOT)/SQLite.swift/CocoaPods/watchsimulator' + } + end + + s.subspec 'standalone' do |ss| + ss.source_files = 'Sources/{SQLite,SQLiteObjc}/**/*.{c,h,m,swift}' + ss.exclude_files = 'Sources/**/Cipher.swift' + ss.private_header_files = 'Sources/SQLiteObjc/*.h' + ss.xcconfig = { + 'OTHER_SWIFT_FLAGS' => '$(inherited) -DSQLITE_SWIFT_STANDALONE' + } + + ss.dependency 'sqlite3', '>= 3.14.0' + end + + s.subspec 'SQLCipher' do |ss| + ss.source_files = 'Sources/{SQLite,SQLiteObjc}/**/*.{c,h,m,swift}' + ss.private_header_files = 'Sources/SQLiteObjc/*.h' + ss.xcconfig = { + 'OTHER_SWIFT_FLAGS' => '$(inherited) -DSQLITE_SWIFT_SQLCIPHER', + 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) SQLITE_HAS_CODEC=1' + } + + ss.dependency 'SQLCipher', '>= 3.4.0' + end +end diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.pbxproj b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..153295ccd1 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.pbxproj @@ -0,0 +1,1513 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 03A65E641C6BB0F60062603F /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A65E5A1C6BB0F50062603F /* SQLite.framework */; }; + 03A65E711C6BB2CD0062603F /* usr/include/sqlite3.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808B1C46E34A0038162A /* usr/include/sqlite3.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 03A65E721C6BB2D30062603F /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AD61C3F04ED00AE3E12 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 03A65E731C6BB2D80062603F /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF71C3F06E900AE3E12 /* Foundation.swift */; }; + 03A65E741C6BB2DA0062603F /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF81C3F06E900AE3E12 /* Helpers.swift */; }; + 03A65E751C6BB2DF0062603F /* SQLite-Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808D1C46E5230038162A /* SQLite-Bridging.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 03A65E761C6BB2E60062603F /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEE1C3F06E900AE3E12 /* Blob.swift */; }; + 03A65E771C6BB2E60062603F /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEF1C3F06E900AE3E12 /* Connection.swift */; }; + 03A65E781C6BB2EA0062603F /* fts3_tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AF01C3F06E900AE3E12 /* fts3_tokenizer.h */; }; + 03A65E791C6BB2EF0062603F /* SQLite-Bridging.m in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF11C3F06E900AE3E12 /* SQLite-Bridging.m */; }; + 03A65E7A1C6BB2F70062603F /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF21C3F06E900AE3E12 /* Statement.swift */; }; + 03A65E7B1C6BB2F70062603F /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF31C3F06E900AE3E12 /* Value.swift */; }; + 03A65E7C1C6BB2F70062603F /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF51C3F06E900AE3E12 /* FTS4.swift */; }; + 03A65E7D1C6BB2F70062603F /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF61C3F06E900AE3E12 /* RTree.swift */; }; + 03A65E7E1C6BB2FB0062603F /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */; }; + 03A65E7F1C6BB2FB0062603F /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFB1C3F06E900AE3E12 /* Collation.swift */; }; + 03A65E801C6BB2FB0062603F /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */; }; + 03A65E811C6BB2FB0062603F /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */; }; + 03A65E821C6BB2FB0062603F /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFE1C3F06E900AE3E12 /* Expression.swift */; }; + 03A65E831C6BB2FB0062603F /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFF1C3F06E900AE3E12 /* Operators.swift */; }; + 03A65E841C6BB2FB0062603F /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B001C3F06E900AE3E12 /* Query.swift */; }; + 03A65E851C6BB2FB0062603F /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B011C3F06E900AE3E12 /* Schema.swift */; }; + 03A65E861C6BB2FB0062603F /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B021C3F06E900AE3E12 /* Setter.swift */; }; + 03A65E871C6BB3030062603F /* AggregateFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1A1C3F137700AE3E12 /* AggregateFunctionsTests.swift */; }; + 03A65E881C6BB3030062603F /* BlobTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1B1C3F137700AE3E12 /* BlobTests.swift */; }; + 03A65E891C6BB3030062603F /* ConnectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1D1C3F137700AE3E12 /* ConnectionTests.swift */; }; + 03A65E8A1C6BB3030062603F /* CoreFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1E1C3F137700AE3E12 /* CoreFunctionsTests.swift */; }; + 03A65E8B1C6BB3030062603F /* CustomFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1F1C3F137700AE3E12 /* CustomFunctionsTests.swift */; }; + 03A65E8C1C6BB3030062603F /* ExpressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B201C3F137700AE3E12 /* ExpressionTests.swift */; }; + 03A65E8D1C6BB3030062603F /* FTS4Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B211C3F137700AE3E12 /* FTS4Tests.swift */; }; + 03A65E8E1C6BB3030062603F /* OperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2A1C3F141E00AE3E12 /* OperatorsTests.swift */; }; + 03A65E8F1C6BB3030062603F /* QueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2B1C3F141E00AE3E12 /* QueryTests.swift */; }; + 03A65E901C6BB3030062603F /* RTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2C1C3F141E00AE3E12 /* RTreeTests.swift */; }; + 03A65E911C6BB3030062603F /* SchemaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2D1C3F141E00AE3E12 /* SchemaTests.swift */; }; + 03A65E921C6BB3030062603F /* SetterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B181C3F134A00AE3E12 /* SetterTests.swift */; }; + 03A65E931C6BB3030062603F /* StatementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B321C3F142E00AE3E12 /* StatementTests.swift */; }; + 03A65E941C6BB3030062603F /* ValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B331C3F142E00AE3E12 /* ValueTests.swift */; }; + 03A65E951C6BB3030062603F /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B161C3F127200AE3E12 /* TestHelpers.swift */; }; + 03A65E971C6BB3210062603F /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A65E961C6BB3210062603F /* libsqlite3.tbd */; }; + 19A1709C3E7A406E62293B2A /* Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B93B48B5560E6E51791 /* Fixtures.swift */; }; + 19A1717B10CC941ACB5533D6 /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1730E4390C775C25677D1 /* FTS5.swift */; }; + 19A171E6FA242F72A308C594 /* FTS5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1721B8984686B9963B45D /* FTS5Tests.swift */; }; + 19A171F12AB8B07F2FD7201A /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178A39ACA9667A62663CC /* Cipher.swift */; }; + 19A17254FBA7894891F7297B /* FTS5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1721B8984686B9963B45D /* FTS5Tests.swift */; }; + 19A17408007B182F884E3A53 /* Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B93B48B5560E6E51791 /* Fixtures.swift */; }; + 19A174D78559CD30679BCCCB /* FTS5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1721B8984686B9963B45D /* FTS5Tests.swift */; }; + 19A1750CEE9B05267995CF3D /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1730E4390C775C25677D1 /* FTS5.swift */; }; + 19A175DFF47B84757E547C62 /* fixtures in Resources */ = {isa = PBXBuildFile; fileRef = 19A17E2695737FAB5D6086E3 /* fixtures */; }; + 19A177CC33F2E6A24AF90B02 /* CipherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17399EA9E61235D5D77BF /* CipherTests.swift */; }; + 19A178072B371489E6A1E839 /* FoundationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */; }; + 19A17835FD5886FDC5A3228F /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178A39ACA9667A62663CC /* Cipher.swift */; }; + 19A179A0C45377CB09BB358C /* CipherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17399EA9E61235D5D77BF /* CipherTests.swift */; }; + 19A179CCF9671E345E5A9811 /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178A39ACA9667A62663CC /* Cipher.swift */; }; + 19A179E76EA6207669B60C1B /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178A39ACA9667A62663CC /* Cipher.swift */; }; + 19A17C4B951CB054EE48AB1C /* CipherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17399EA9E61235D5D77BF /* CipherTests.swift */; }; + 19A17E04C4C0956715C5676A /* FoundationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */; }; + 19A17EC0D68BA8C03288ADF7 /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1730E4390C775C25677D1 /* FTS5.swift */; }; + 19A17F3E1F7ACA33BD43E138 /* fixtures in Resources */ = {isa = PBXBuildFile; fileRef = 19A17E2695737FAB5D6086E3 /* fixtures */; }; + 19A17F60B685636D1F83C2DD /* Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B93B48B5560E6E51791 /* Fixtures.swift */; }; + 19A17FB80B94E882050AA908 /* FoundationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */; }; + 19A17FDA323BAFDEC627E76F /* fixtures in Resources */ = {isa = PBXBuildFile; fileRef = 19A17E2695737FAB5D6086E3 /* fixtures */; }; + 3D67B3E61DB2469200A4F4C6 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D67B3E51DB2469200A4F4C6 /* libsqlite3.tbd */; }; + 3D67B3E71DB246BA00A4F4C6 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEE1C3F06E900AE3E12 /* Blob.swift */; }; + 3D67B3E81DB246BA00A4F4C6 /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEF1C3F06E900AE3E12 /* Connection.swift */; }; + 3D67B3E91DB246D100A4F4C6 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF21C3F06E900AE3E12 /* Statement.swift */; }; + 3D67B3EA1DB246D100A4F4C6 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF31C3F06E900AE3E12 /* Value.swift */; }; + 3D67B3EB1DB246D100A4F4C6 /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF51C3F06E900AE3E12 /* FTS4.swift */; }; + 3D67B3EC1DB246D100A4F4C6 /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF61C3F06E900AE3E12 /* RTree.swift */; }; + 3D67B3ED1DB246D100A4F4C6 /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1730E4390C775C25677D1 /* FTS5.swift */; }; + 3D67B3EE1DB246D100A4F4C6 /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */; }; + 3D67B3EF1DB246D100A4F4C6 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFB1C3F06E900AE3E12 /* Collation.swift */; }; + 3D67B3F01DB246D100A4F4C6 /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */; }; + 3D67B3F11DB246D100A4F4C6 /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */; }; + 3D67B3F21DB246D100A4F4C6 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFE1C3F06E900AE3E12 /* Expression.swift */; }; + 3D67B3F31DB246D100A4F4C6 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFF1C3F06E900AE3E12 /* Operators.swift */; }; + 3D67B3F41DB246D100A4F4C6 /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B001C3F06E900AE3E12 /* Query.swift */; }; + 3D67B3F51DB246D100A4F4C6 /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B011C3F06E900AE3E12 /* Schema.swift */; }; + 3D67B3F61DB246D100A4F4C6 /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B021C3F06E900AE3E12 /* Setter.swift */; }; + 3D67B3F71DB246D700A4F4C6 /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF71C3F06E900AE3E12 /* Foundation.swift */; }; + 3D67B3F81DB246D700A4F4C6 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF81C3F06E900AE3E12 /* Helpers.swift */; }; + 3D67B3F91DB246E700A4F4C6 /* SQLite-Bridging.m in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF11C3F06E900AE3E12 /* SQLite-Bridging.m */; }; + 3D67B3FA1DB2470600A4F4C6 /* usr/include/sqlite3.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808B1C46E34A0038162A /* usr/include/sqlite3.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3D67B3FB1DB2470600A4F4C6 /* SQLite-Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808D1C46E5230038162A /* SQLite-Bridging.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3D67B3FC1DB2471B00A4F4C6 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AD61C3F04ED00AE3E12 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3D67B3FD1DB2472D00A4F4C6 /* fts3_tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AF01C3F06E900AE3E12 /* fts3_tokenizer.h */; }; + EE247AD71C3F04ED00AE3E12 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AD61C3F04ED00AE3E12 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE247ADE1C3F04ED00AE3E12 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE247AD31C3F04ED00AE3E12 /* SQLite.framework */; }; + EE247B031C3F06E900AE3E12 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEE1C3F06E900AE3E12 /* Blob.swift */; }; + EE247B041C3F06E900AE3E12 /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEF1C3F06E900AE3E12 /* Connection.swift */; }; + EE247B051C3F06E900AE3E12 /* fts3_tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AF01C3F06E900AE3E12 /* fts3_tokenizer.h */; }; + EE247B061C3F06E900AE3E12 /* SQLite-Bridging.m in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF11C3F06E900AE3E12 /* SQLite-Bridging.m */; }; + EE247B071C3F06E900AE3E12 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF21C3F06E900AE3E12 /* Statement.swift */; }; + EE247B081C3F06E900AE3E12 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF31C3F06E900AE3E12 /* Value.swift */; }; + EE247B091C3F06E900AE3E12 /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF51C3F06E900AE3E12 /* FTS4.swift */; }; + EE247B0A1C3F06E900AE3E12 /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF61C3F06E900AE3E12 /* RTree.swift */; }; + EE247B0B1C3F06E900AE3E12 /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF71C3F06E900AE3E12 /* Foundation.swift */; }; + EE247B0C1C3F06E900AE3E12 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF81C3F06E900AE3E12 /* Helpers.swift */; }; + EE247B0D1C3F06E900AE3E12 /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */; }; + EE247B0E1C3F06E900AE3E12 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFB1C3F06E900AE3E12 /* Collation.swift */; }; + EE247B0F1C3F06E900AE3E12 /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */; }; + EE247B101C3F06E900AE3E12 /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */; }; + EE247B111C3F06E900AE3E12 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFE1C3F06E900AE3E12 /* Expression.swift */; }; + EE247B121C3F06E900AE3E12 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFF1C3F06E900AE3E12 /* Operators.swift */; }; + EE247B131C3F06E900AE3E12 /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B001C3F06E900AE3E12 /* Query.swift */; }; + EE247B141C3F06E900AE3E12 /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B011C3F06E900AE3E12 /* Schema.swift */; }; + EE247B151C3F06E900AE3E12 /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B021C3F06E900AE3E12 /* Setter.swift */; }; + EE247B171C3F127200AE3E12 /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B161C3F127200AE3E12 /* TestHelpers.swift */; }; + EE247B191C3F134A00AE3E12 /* SetterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B181C3F134A00AE3E12 /* SetterTests.swift */; }; + EE247B221C3F137700AE3E12 /* AggregateFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1A1C3F137700AE3E12 /* AggregateFunctionsTests.swift */; }; + EE247B231C3F137700AE3E12 /* BlobTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1B1C3F137700AE3E12 /* BlobTests.swift */; }; + EE247B251C3F137700AE3E12 /* ConnectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1D1C3F137700AE3E12 /* ConnectionTests.swift */; }; + EE247B261C3F137700AE3E12 /* CoreFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1E1C3F137700AE3E12 /* CoreFunctionsTests.swift */; }; + EE247B271C3F137700AE3E12 /* CustomFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1F1C3F137700AE3E12 /* CustomFunctionsTests.swift */; }; + EE247B281C3F137700AE3E12 /* ExpressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B201C3F137700AE3E12 /* ExpressionTests.swift */; }; + EE247B291C3F137700AE3E12 /* FTS4Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B211C3F137700AE3E12 /* FTS4Tests.swift */; }; + EE247B2E1C3F141E00AE3E12 /* OperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2A1C3F141E00AE3E12 /* OperatorsTests.swift */; }; + EE247B2F1C3F141E00AE3E12 /* QueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2B1C3F141E00AE3E12 /* QueryTests.swift */; }; + EE247B301C3F141E00AE3E12 /* RTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2C1C3F141E00AE3E12 /* RTreeTests.swift */; }; + EE247B311C3F141E00AE3E12 /* SchemaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2D1C3F141E00AE3E12 /* SchemaTests.swift */; }; + EE247B341C3F142E00AE3E12 /* StatementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B321C3F142E00AE3E12 /* StatementTests.swift */; }; + EE247B351C3F142E00AE3E12 /* ValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B331C3F142E00AE3E12 /* ValueTests.swift */; }; + EE247B461C3F3ED000AE3E12 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE247B3C1C3F3ED000AE3E12 /* SQLite.framework */; }; + EE247B531C3F3FC700AE3E12 /* AggregateFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1A1C3F137700AE3E12 /* AggregateFunctionsTests.swift */; }; + EE247B541C3F3FC700AE3E12 /* BlobTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1B1C3F137700AE3E12 /* BlobTests.swift */; }; + EE247B551C3F3FC700AE3E12 /* ConnectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1D1C3F137700AE3E12 /* ConnectionTests.swift */; }; + EE247B561C3F3FC700AE3E12 /* CoreFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1E1C3F137700AE3E12 /* CoreFunctionsTests.swift */; }; + EE247B571C3F3FC700AE3E12 /* CustomFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1F1C3F137700AE3E12 /* CustomFunctionsTests.swift */; }; + EE247B581C3F3FC700AE3E12 /* ExpressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B201C3F137700AE3E12 /* ExpressionTests.swift */; }; + EE247B591C3F3FC700AE3E12 /* FTS4Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B211C3F137700AE3E12 /* FTS4Tests.swift */; }; + EE247B5A1C3F3FC700AE3E12 /* OperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2A1C3F141E00AE3E12 /* OperatorsTests.swift */; }; + EE247B5B1C3F3FC700AE3E12 /* QueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2B1C3F141E00AE3E12 /* QueryTests.swift */; }; + EE247B5C1C3F3FC700AE3E12 /* RTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2C1C3F141E00AE3E12 /* RTreeTests.swift */; }; + EE247B5D1C3F3FC700AE3E12 /* SchemaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2D1C3F141E00AE3E12 /* SchemaTests.swift */; }; + EE247B5E1C3F3FC700AE3E12 /* SetterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B181C3F134A00AE3E12 /* SetterTests.swift */; }; + EE247B5F1C3F3FC700AE3E12 /* StatementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B321C3F142E00AE3E12 /* StatementTests.swift */; }; + EE247B601C3F3FC700AE3E12 /* ValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B331C3F142E00AE3E12 /* ValueTests.swift */; }; + EE247B611C3F3FC700AE3E12 /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B161C3F127200AE3E12 /* TestHelpers.swift */; }; + EE247B621C3F3FDB00AE3E12 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AD61C3F04ED00AE3E12 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE247B631C3F3FDB00AE3E12 /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF71C3F06E900AE3E12 /* Foundation.swift */; }; + EE247B641C3F3FDB00AE3E12 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF81C3F06E900AE3E12 /* Helpers.swift */; }; + EE247B651C3F3FEC00AE3E12 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEE1C3F06E900AE3E12 /* Blob.swift */; }; + EE247B661C3F3FEC00AE3E12 /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEF1C3F06E900AE3E12 /* Connection.swift */; }; + EE247B671C3F3FEC00AE3E12 /* fts3_tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AF01C3F06E900AE3E12 /* fts3_tokenizer.h */; }; + EE247B681C3F3FEC00AE3E12 /* SQLite-Bridging.m in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF11C3F06E900AE3E12 /* SQLite-Bridging.m */; }; + EE247B691C3F3FEC00AE3E12 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF21C3F06E900AE3E12 /* Statement.swift */; }; + EE247B6A1C3F3FEC00AE3E12 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF31C3F06E900AE3E12 /* Value.swift */; }; + EE247B6B1C3F3FEC00AE3E12 /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF51C3F06E900AE3E12 /* FTS4.swift */; }; + EE247B6C1C3F3FEC00AE3E12 /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF61C3F06E900AE3E12 /* RTree.swift */; }; + EE247B6D1C3F3FEC00AE3E12 /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */; }; + EE247B6E1C3F3FEC00AE3E12 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFB1C3F06E900AE3E12 /* Collation.swift */; }; + EE247B6F1C3F3FEC00AE3E12 /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */; }; + EE247B701C3F3FEC00AE3E12 /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */; }; + EE247B711C3F3FEC00AE3E12 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFE1C3F06E900AE3E12 /* Expression.swift */; }; + EE247B721C3F3FEC00AE3E12 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFF1C3F06E900AE3E12 /* Operators.swift */; }; + EE247B731C3F3FEC00AE3E12 /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B001C3F06E900AE3E12 /* Query.swift */; }; + EE247B741C3F3FEC00AE3E12 /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B011C3F06E900AE3E12 /* Schema.swift */; }; + EE247B751C3F3FEC00AE3E12 /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B021C3F06E900AE3E12 /* Setter.swift */; }; + EE91808C1C46E34A0038162A /* usr/include/sqlite3.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808B1C46E34A0038162A /* usr/include/sqlite3.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE91808E1C46E5230038162A /* SQLite-Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808D1C46E5230038162A /* SQLite-Bridging.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE91808F1C46E76D0038162A /* SQLite-Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808D1C46E5230038162A /* SQLite-Bridging.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE9180901C46E8980038162A /* usr/include/sqlite3.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808B1C46E34A0038162A /* usr/include/sqlite3.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE9180941C46EA210038162A /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = EE9180931C46EA210038162A /* libsqlite3.tbd */; }; + EE9180951C46EBCC0038162A /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = EE9180911C46E9D30038162A /* libsqlite3.tbd */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 03A65E651C6BB0F60062603F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = EE247ACA1C3F04ED00AE3E12 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 03A65E591C6BB0F50062603F; + remoteInfo = "SQLite tvOS"; + }; + EE247ADF1C3F04ED00AE3E12 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = EE247ACA1C3F04ED00AE3E12 /* Project object */; + proxyType = 1; + remoteGlobalIDString = EE247AD21C3F04ED00AE3E12; + remoteInfo = SQLite; + }; + EE247B471C3F3ED000AE3E12 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = EE247ACA1C3F04ED00AE3E12 /* Project object */; + proxyType = 1; + remoteGlobalIDString = EE247B3B1C3F3ED000AE3E12; + remoteInfo = SQLite; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 03A65E5A1C6BB0F50062603F /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 03A65E631C6BB0F60062603F /* SQLiteTests tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SQLiteTests tvOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 03A65E961C6BB3210062603F /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/usr/lib/libsqlite3.tbd; sourceTree = DEVELOPER_DIR; }; + 19A1721B8984686B9963B45D /* FTS5Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FTS5Tests.swift; sourceTree = ""; }; + 19A1730E4390C775C25677D1 /* FTS5.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FTS5.swift; sourceTree = ""; }; + 19A17399EA9E61235D5D77BF /* CipherTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CipherTests.swift; sourceTree = ""; }; + 19A178A39ACA9667A62663CC /* Cipher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Cipher.swift; sourceTree = ""; }; + 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FoundationTests.swift; sourceTree = ""; }; + 19A17B93B48B5560E6E51791 /* Fixtures.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Fixtures.swift; sourceTree = ""; }; + 19A17E2695737FAB5D6086E3 /* fixtures */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; path = fixtures; sourceTree = ""; }; + 39548A631CA63C740003E3B5 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; + 39548A651CA63C740003E3B5 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; + 39548A671CA63C740003E3B5 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; + 39548A691CA63C740003E3B5 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; + 39548A6B1CA63C740003E3B5 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; + 39548A6D1CA63C740003E3B5 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; + 39548A6F1CA63C740003E3B5 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; + 3D67B3E51DB2469200A4F4C6 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS3.0.sdk/usr/lib/libsqlite3.tbd; sourceTree = DEVELOPER_DIR; }; + A121AC451CA35C79005A31D1 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EE247AD31C3F04ED00AE3E12 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EE247AD61C3F04ED00AE3E12 /* SQLite.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SQLite.h; sourceTree = ""; }; + EE247AD81C3F04ED00AE3E12 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + EE247ADD1C3F04ED00AE3E12 /* SQLiteTests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SQLiteTests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + EE247AE41C3F04ED00AE3E12 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + EE247AEE1C3F06E900AE3E12 /* Blob.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Blob.swift; sourceTree = ""; }; + EE247AEF1C3F06E900AE3E12 /* Connection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Connection.swift; sourceTree = ""; }; + EE247AF01C3F06E900AE3E12 /* fts3_tokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fts3_tokenizer.h; path = ../../SQLiteObjc/fts3_tokenizer.h; sourceTree = ""; }; + EE247AF11C3F06E900AE3E12 /* SQLite-Bridging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "SQLite-Bridging.m"; path = "../../SQLiteObjc/SQLite-Bridging.m"; sourceTree = ""; }; + EE247AF21C3F06E900AE3E12 /* Statement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Statement.swift; sourceTree = ""; }; + EE247AF31C3F06E900AE3E12 /* Value.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Value.swift; sourceTree = ""; }; + EE247AF51C3F06E900AE3E12 /* FTS4.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FTS4.swift; sourceTree = ""; }; + EE247AF61C3F06E900AE3E12 /* RTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RTree.swift; sourceTree = ""; }; + EE247AF71C3F06E900AE3E12 /* Foundation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Foundation.swift; sourceTree = ""; }; + EE247AF81C3F06E900AE3E12 /* Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = ""; }; + EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AggregateFunctions.swift; sourceTree = ""; }; + EE247AFB1C3F06E900AE3E12 /* Collation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Collation.swift; sourceTree = ""; }; + EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreFunctions.swift; sourceTree = ""; }; + EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomFunctions.swift; sourceTree = ""; }; + EE247AFE1C3F06E900AE3E12 /* Expression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Expression.swift; sourceTree = ""; }; + EE247AFF1C3F06E900AE3E12 /* Operators.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Operators.swift; sourceTree = ""; }; + EE247B001C3F06E900AE3E12 /* Query.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Query.swift; sourceTree = ""; }; + EE247B011C3F06E900AE3E12 /* Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Schema.swift; sourceTree = ""; }; + EE247B021C3F06E900AE3E12 /* Setter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Setter.swift; sourceTree = ""; }; + EE247B161C3F127200AE3E12 /* TestHelpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestHelpers.swift; sourceTree = ""; }; + EE247B181C3F134A00AE3E12 /* SetterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetterTests.swift; sourceTree = ""; }; + EE247B1A1C3F137700AE3E12 /* AggregateFunctionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AggregateFunctionsTests.swift; sourceTree = ""; }; + EE247B1B1C3F137700AE3E12 /* BlobTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlobTests.swift; sourceTree = ""; }; + EE247B1D1C3F137700AE3E12 /* ConnectionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectionTests.swift; sourceTree = ""; }; + EE247B1E1C3F137700AE3E12 /* CoreFunctionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreFunctionsTests.swift; sourceTree = ""; }; + EE247B1F1C3F137700AE3E12 /* CustomFunctionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomFunctionsTests.swift; sourceTree = ""; }; + EE247B201C3F137700AE3E12 /* ExpressionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExpressionTests.swift; sourceTree = ""; }; + EE247B211C3F137700AE3E12 /* FTS4Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FTS4Tests.swift; sourceTree = ""; }; + EE247B2A1C3F141E00AE3E12 /* OperatorsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OperatorsTests.swift; sourceTree = ""; }; + EE247B2B1C3F141E00AE3E12 /* QueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueryTests.swift; sourceTree = ""; }; + EE247B2C1C3F141E00AE3E12 /* RTreeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RTreeTests.swift; sourceTree = ""; }; + EE247B2D1C3F141E00AE3E12 /* SchemaTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SchemaTests.swift; sourceTree = ""; }; + EE247B321C3F142E00AE3E12 /* StatementTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatementTests.swift; sourceTree = ""; }; + EE247B331C3F142E00AE3E12 /* ValueTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueTests.swift; sourceTree = ""; }; + EE247B3C1C3F3ED000AE3E12 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EE247B451C3F3ED000AE3E12 /* SQLiteTests Mac.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SQLiteTests Mac.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + EE247B771C3F40D700AE3E12 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + EE247B8B1C3F820300AE3E12 /* CONTRIBUTING.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CONTRIBUTING.md; sourceTree = ""; }; + EE247B8C1C3F821200AE3E12 /* .travis.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .travis.yml; sourceTree = ""; }; + EE247B8D1C3F821200AE3E12 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; + EE247B8F1C3F822500AE3E12 /* Index.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = Index.md; sourceTree = ""; }; + EE247B911C3F822500AE3E12 /* installation@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "installation@2x.png"; sourceTree = ""; }; + EE247B921C3F822600AE3E12 /* playground@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "playground@2x.png"; sourceTree = ""; }; + EE247B931C3F826100AE3E12 /* SQLite.swift.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; path = SQLite.swift.podspec; sourceTree = ""; }; + EE91808B1C46E34A0038162A /* usr/include/sqlite3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = usr/include/sqlite3.h; sourceTree = SDKROOT; }; + EE91808D1C46E5230038162A /* SQLite-Bridging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "SQLite-Bridging.h"; path = "../../SQLiteObjc/include/SQLite-Bridging.h"; sourceTree = ""; }; + EE9180911C46E9D30038162A /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/lib/libsqlite3.tbd; sourceTree = DEVELOPER_DIR; }; + EE9180931C46EA210038162A /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 03A65E561C6BB0F50062603F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 03A65E971C6BB3210062603F /* libsqlite3.tbd in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 03A65E601C6BB0F60062603F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 03A65E641C6BB0F60062603F /* SQLite.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A121AC411CA35C79005A31D1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3D67B3E61DB2469200A4F4C6 /* libsqlite3.tbd in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE247ACF1C3F04ED00AE3E12 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + EE9180941C46EA210038162A /* libsqlite3.tbd in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE247ADA1C3F04ED00AE3E12 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + EE247ADE1C3F04ED00AE3E12 /* SQLite.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE247B381C3F3ED000AE3E12 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + EE9180951C46EBCC0038162A /* libsqlite3.tbd in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE247B421C3F3ED000AE3E12 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + EE247B461C3F3ED000AE3E12 /* SQLite.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 39548A611CA63C740003E3B5 /* CocoaPods */ = { + isa = PBXGroup; + children = ( + 39548A621CA63C740003E3B5 /* appletvos */, + 39548A641CA63C740003E3B5 /* appletvsimulator */, + 39548A661CA63C740003E3B5 /* iphoneos */, + 39548A681CA63C740003E3B5 /* iphonesimulator */, + 39548A6A1CA63C740003E3B5 /* macosx */, + 39548A6C1CA63C740003E3B5 /* watchos */, + 39548A6E1CA63C740003E3B5 /* watchsimulator */, + ); + path = CocoaPods; + sourceTree = ""; + }; + 39548A621CA63C740003E3B5 /* appletvos */ = { + isa = PBXGroup; + children = ( + 39548A631CA63C740003E3B5 /* module.modulemap */, + ); + path = appletvos; + sourceTree = ""; + }; + 39548A641CA63C740003E3B5 /* appletvsimulator */ = { + isa = PBXGroup; + children = ( + 39548A651CA63C740003E3B5 /* module.modulemap */, + ); + path = appletvsimulator; + sourceTree = ""; + }; + 39548A661CA63C740003E3B5 /* iphoneos */ = { + isa = PBXGroup; + children = ( + 39548A671CA63C740003E3B5 /* module.modulemap */, + ); + path = iphoneos; + sourceTree = ""; + }; + 39548A681CA63C740003E3B5 /* iphonesimulator */ = { + isa = PBXGroup; + children = ( + 39548A691CA63C740003E3B5 /* module.modulemap */, + ); + path = iphonesimulator; + sourceTree = ""; + }; + 39548A6A1CA63C740003E3B5 /* macosx */ = { + isa = PBXGroup; + children = ( + 39548A6B1CA63C740003E3B5 /* module.modulemap */, + ); + path = macosx; + sourceTree = ""; + }; + 39548A6C1CA63C740003E3B5 /* watchos */ = { + isa = PBXGroup; + children = ( + 39548A6D1CA63C740003E3B5 /* module.modulemap */, + ); + path = watchos; + sourceTree = ""; + }; + 39548A6E1CA63C740003E3B5 /* watchsimulator */ = { + isa = PBXGroup; + children = ( + 39548A6F1CA63C740003E3B5 /* module.modulemap */, + ); + path = watchsimulator; + sourceTree = ""; + }; + 3D67B3E41DB2469200A4F4C6 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 3D67B3E51DB2469200A4F4C6 /* libsqlite3.tbd */, + ); + name = Frameworks; + sourceTree = ""; + }; + EE247AC91C3F04ED00AE3E12 = { + isa = PBXGroup; + children = ( + EE247AD51C3F04ED00AE3E12 /* SQLite */, + EE247AE11C3F04ED00AE3E12 /* SQLiteTests */, + EE247B8A1C3F81D000AE3E12 /* Metadata */, + EE247AD41C3F04ED00AE3E12 /* Products */, + 3D67B3E41DB2469200A4F4C6 /* Frameworks */, + ); + indentWidth = 4; + sourceTree = ""; + tabWidth = 4; + }; + EE247AD41C3F04ED00AE3E12 /* Products */ = { + isa = PBXGroup; + children = ( + EE247AD31C3F04ED00AE3E12 /* SQLite.framework */, + EE247ADD1C3F04ED00AE3E12 /* SQLiteTests iOS.xctest */, + EE247B3C1C3F3ED000AE3E12 /* SQLite.framework */, + EE247B451C3F3ED000AE3E12 /* SQLiteTests Mac.xctest */, + 03A65E5A1C6BB0F50062603F /* SQLite.framework */, + 03A65E631C6BB0F60062603F /* SQLiteTests tvOS.xctest */, + A121AC451CA35C79005A31D1 /* SQLite.framework */, + ); + name = Products; + sourceTree = ""; + }; + EE247AD51C3F04ED00AE3E12 /* SQLite */ = { + isa = PBXGroup; + children = ( + EE91808B1C46E34A0038162A /* usr/include/sqlite3.h */, + EE247AD61C3F04ED00AE3E12 /* SQLite.h */, + EE247AF71C3F06E900AE3E12 /* Foundation.swift */, + EE247AF81C3F06E900AE3E12 /* Helpers.swift */, + EE247AD81C3F04ED00AE3E12 /* Info.plist */, + EE247AED1C3F06E900AE3E12 /* Core */, + EE247AF41C3F06E900AE3E12 /* Extensions */, + EE247AF91C3F06E900AE3E12 /* Typed */, + ); + name = SQLite; + path = Sources/SQLite; + sourceTree = ""; + }; + EE247AE11C3F04ED00AE3E12 /* SQLiteTests */ = { + isa = PBXGroup; + children = ( + 19A17E2695737FAB5D6086E3 /* fixtures */, + EE247B1A1C3F137700AE3E12 /* AggregateFunctionsTests.swift */, + EE247B1B1C3F137700AE3E12 /* BlobTests.swift */, + EE247B1D1C3F137700AE3E12 /* ConnectionTests.swift */, + EE247B1E1C3F137700AE3E12 /* CoreFunctionsTests.swift */, + EE247B1F1C3F137700AE3E12 /* CustomFunctionsTests.swift */, + EE247B201C3F137700AE3E12 /* ExpressionTests.swift */, + EE247B211C3F137700AE3E12 /* FTS4Tests.swift */, + EE247B2A1C3F141E00AE3E12 /* OperatorsTests.swift */, + EE247B2B1C3F141E00AE3E12 /* QueryTests.swift */, + EE247B2C1C3F141E00AE3E12 /* RTreeTests.swift */, + EE247B2D1C3F141E00AE3E12 /* SchemaTests.swift */, + EE247B181C3F134A00AE3E12 /* SetterTests.swift */, + EE247B321C3F142E00AE3E12 /* StatementTests.swift */, + EE247B331C3F142E00AE3E12 /* ValueTests.swift */, + EE247B161C3F127200AE3E12 /* TestHelpers.swift */, + EE247AE41C3F04ED00AE3E12 /* Info.plist */, + 19A1721B8984686B9963B45D /* FTS5Tests.swift */, + 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */, + 19A17399EA9E61235D5D77BF /* CipherTests.swift */, + 19A17B93B48B5560E6E51791 /* Fixtures.swift */, + ); + name = SQLiteTests; + path = Tests/SQLiteTests; + sourceTree = ""; + }; + EE247AED1C3F06E900AE3E12 /* Core */ = { + isa = PBXGroup; + children = ( + EE91808D1C46E5230038162A /* SQLite-Bridging.h */, + EE247AEE1C3F06E900AE3E12 /* Blob.swift */, + EE247AEF1C3F06E900AE3E12 /* Connection.swift */, + EE247AF01C3F06E900AE3E12 /* fts3_tokenizer.h */, + EE247AF11C3F06E900AE3E12 /* SQLite-Bridging.m */, + EE247AF21C3F06E900AE3E12 /* Statement.swift */, + EE247AF31C3F06E900AE3E12 /* Value.swift */, + ); + path = Core; + sourceTree = ""; + }; + EE247AF41C3F06E900AE3E12 /* Extensions */ = { + isa = PBXGroup; + children = ( + EE247AF51C3F06E900AE3E12 /* FTS4.swift */, + EE247AF61C3F06E900AE3E12 /* RTree.swift */, + 19A1730E4390C775C25677D1 /* FTS5.swift */, + 19A178A39ACA9667A62663CC /* Cipher.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + EE247AF91C3F06E900AE3E12 /* Typed */ = { + isa = PBXGroup; + children = ( + EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */, + EE247AFB1C3F06E900AE3E12 /* Collation.swift */, + EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */, + EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */, + EE247AFE1C3F06E900AE3E12 /* Expression.swift */, + EE247AFF1C3F06E900AE3E12 /* Operators.swift */, + EE247B001C3F06E900AE3E12 /* Query.swift */, + EE247B011C3F06E900AE3E12 /* Schema.swift */, + EE247B021C3F06E900AE3E12 /* Setter.swift */, + ); + path = Typed; + sourceTree = ""; + }; + EE247B8A1C3F81D000AE3E12 /* Metadata */ = { + isa = PBXGroup; + children = ( + 39548A611CA63C740003E3B5 /* CocoaPods */, + EE247B771C3F40D700AE3E12 /* README.md */, + EE247B8B1C3F820300AE3E12 /* CONTRIBUTING.md */, + EE247B931C3F826100AE3E12 /* SQLite.swift.podspec */, + EE247B8C1C3F821200AE3E12 /* .travis.yml */, + EE247B8D1C3F821200AE3E12 /* Makefile */, + EE9180931C46EA210038162A /* libsqlite3.tbd */, + EE9180911C46E9D30038162A /* libsqlite3.tbd */, + 03A65E961C6BB3210062603F /* libsqlite3.tbd */, + EE247B8E1C3F822500AE3E12 /* Documentation */, + ); + name = Metadata; + sourceTree = ""; + }; + EE247B8E1C3F822500AE3E12 /* Documentation */ = { + isa = PBXGroup; + children = ( + EE247B8F1C3F822500AE3E12 /* Index.md */, + EE247B901C3F822500AE3E12 /* Resources */, + ); + path = Documentation; + sourceTree = ""; + }; + EE247B901C3F822500AE3E12 /* Resources */ = { + isa = PBXGroup; + children = ( + EE247B911C3F822500AE3E12 /* installation@2x.png */, + EE247B921C3F822600AE3E12 /* playground@2x.png */, + ); + path = Resources; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 03A65E571C6BB0F50062603F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 03A65E781C6BB2EA0062603F /* fts3_tokenizer.h in Headers */, + 03A65E751C6BB2DF0062603F /* SQLite-Bridging.h in Headers */, + 03A65E711C6BB2CD0062603F /* usr/include/sqlite3.h in Headers */, + 03A65E721C6BB2D30062603F /* SQLite.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A121AC421CA35C79005A31D1 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 3D67B3FA1DB2470600A4F4C6 /* usr/include/sqlite3.h in Headers */, + 3D67B3FB1DB2470600A4F4C6 /* SQLite-Bridging.h in Headers */, + 3D67B3FC1DB2471B00A4F4C6 /* SQLite.h in Headers */, + 3D67B3FD1DB2472D00A4F4C6 /* fts3_tokenizer.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE247AD01C3F04ED00AE3E12 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + EE91808E1C46E5230038162A /* SQLite-Bridging.h in Headers */, + EE247B051C3F06E900AE3E12 /* fts3_tokenizer.h in Headers */, + EE91808C1C46E34A0038162A /* usr/include/sqlite3.h in Headers */, + EE247AD71C3F04ED00AE3E12 /* SQLite.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE247B391C3F3ED000AE3E12 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + EE9180901C46E8980038162A /* usr/include/sqlite3.h in Headers */, + EE247B671C3F3FEC00AE3E12 /* fts3_tokenizer.h in Headers */, + EE247B621C3F3FDB00AE3E12 /* SQLite.h in Headers */, + EE91808F1C46E76D0038162A /* SQLite-Bridging.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 03A65E591C6BB0F50062603F /* SQLite tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 03A65E6F1C6BB0F60062603F /* Build configuration list for PBXNativeTarget "SQLite tvOS" */; + buildPhases = ( + 03A65E551C6BB0F50062603F /* Sources */, + 03A65E561C6BB0F50062603F /* Frameworks */, + 03A65E571C6BB0F50062603F /* Headers */, + 03A65E581C6BB0F50062603F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "SQLite tvOS"; + productName = "SQLite tvOS"; + productReference = 03A65E5A1C6BB0F50062603F /* SQLite.framework */; + productType = "com.apple.product-type.framework"; + }; + 03A65E621C6BB0F60062603F /* SQLiteTests tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 03A65E701C6BB0F60062603F /* Build configuration list for PBXNativeTarget "SQLiteTests tvOS" */; + buildPhases = ( + 03A65E5F1C6BB0F60062603F /* Sources */, + 03A65E601C6BB0F60062603F /* Frameworks */, + 03A65E611C6BB0F60062603F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 03A65E661C6BB0F60062603F /* PBXTargetDependency */, + ); + name = "SQLiteTests tvOS"; + productName = "SQLite tvOSTests"; + productReference = 03A65E631C6BB0F60062603F /* SQLiteTests tvOS.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + A121AC441CA35C79005A31D1 /* SQLite watchOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = A121AC4C1CA35C79005A31D1 /* Build configuration list for PBXNativeTarget "SQLite watchOS" */; + buildPhases = ( + A121AC401CA35C79005A31D1 /* Sources */, + A121AC411CA35C79005A31D1 /* Frameworks */, + A121AC421CA35C79005A31D1 /* Headers */, + A121AC431CA35C79005A31D1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "SQLite watchOS"; + productName = "SQLite watchOS"; + productReference = A121AC451CA35C79005A31D1 /* SQLite.framework */; + productType = "com.apple.product-type.framework"; + }; + EE247AD21C3F04ED00AE3E12 /* SQLite iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = EE247AE71C3F04ED00AE3E12 /* Build configuration list for PBXNativeTarget "SQLite iOS" */; + buildPhases = ( + EE247ACE1C3F04ED00AE3E12 /* Sources */, + EE247ACF1C3F04ED00AE3E12 /* Frameworks */, + EE247AD01C3F04ED00AE3E12 /* Headers */, + EE247AD11C3F04ED00AE3E12 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "SQLite iOS"; + productName = SQLite; + productReference = EE247AD31C3F04ED00AE3E12 /* SQLite.framework */; + productType = "com.apple.product-type.framework"; + }; + EE247ADC1C3F04ED00AE3E12 /* SQLiteTests iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = EE247AEA1C3F04ED00AE3E12 /* Build configuration list for PBXNativeTarget "SQLiteTests iOS" */; + buildPhases = ( + EE247AD91C3F04ED00AE3E12 /* Sources */, + EE247ADA1C3F04ED00AE3E12 /* Frameworks */, + EE247ADB1C3F04ED00AE3E12 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + EE247AE01C3F04ED00AE3E12 /* PBXTargetDependency */, + ); + name = "SQLiteTests iOS"; + productName = SQLiteTests; + productReference = EE247ADD1C3F04ED00AE3E12 /* SQLiteTests iOS.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + EE247B3B1C3F3ED000AE3E12 /* SQLite Mac */ = { + isa = PBXNativeTarget; + buildConfigurationList = EE247B511C3F3ED000AE3E12 /* Build configuration list for PBXNativeTarget "SQLite Mac" */; + buildPhases = ( + EE247B371C3F3ED000AE3E12 /* Sources */, + EE247B381C3F3ED000AE3E12 /* Frameworks */, + EE247B391C3F3ED000AE3E12 /* Headers */, + EE247B3A1C3F3ED000AE3E12 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "SQLite Mac"; + productName = SQLite; + productReference = EE247B3C1C3F3ED000AE3E12 /* SQLite.framework */; + productType = "com.apple.product-type.framework"; + }; + EE247B441C3F3ED000AE3E12 /* SQLiteTests Mac */ = { + isa = PBXNativeTarget; + buildConfigurationList = EE247B521C3F3ED000AE3E12 /* Build configuration list for PBXNativeTarget "SQLiteTests Mac" */; + buildPhases = ( + EE247B411C3F3ED000AE3E12 /* Sources */, + EE247B421C3F3ED000AE3E12 /* Frameworks */, + EE247B431C3F3ED000AE3E12 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + EE247B481C3F3ED000AE3E12 /* PBXTargetDependency */, + ); + name = "SQLiteTests Mac"; + productName = SQLiteTests; + productReference = EE247B451C3F3ED000AE3E12 /* SQLiteTests Mac.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + EE247ACA1C3F04ED00AE3E12 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0720; + LastUpgradeCheck = 0800; + TargetAttributes = { + 03A65E591C6BB0F50062603F = { + CreatedOnToolsVersion = 7.2; + }; + 03A65E621C6BB0F60062603F = { + CreatedOnToolsVersion = 7.2; + }; + A121AC441CA35C79005A31D1 = { + CreatedOnToolsVersion = 7.3; + }; + EE247AD21C3F04ED00AE3E12 = { + CreatedOnToolsVersion = 7.2; + LastSwiftMigration = 0800; + }; + EE247ADC1C3F04ED00AE3E12 = { + CreatedOnToolsVersion = 7.2; + LastSwiftMigration = 0800; + }; + EE247B3B1C3F3ED000AE3E12 = { + CreatedOnToolsVersion = 7.2; + LastSwiftMigration = 0800; + }; + EE247B441C3F3ED000AE3E12 = { + CreatedOnToolsVersion = 7.2; + LastSwiftMigration = 0800; + }; + }; + }; + buildConfigurationList = EE247ACD1C3F04ED00AE3E12 /* Build configuration list for PBXProject "SQLite" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = EE247AC91C3F04ED00AE3E12; + productRefGroup = EE247AD41C3F04ED00AE3E12 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + EE247AD21C3F04ED00AE3E12 /* SQLite iOS */, + EE247ADC1C3F04ED00AE3E12 /* SQLiteTests iOS */, + EE247B3B1C3F3ED000AE3E12 /* SQLite Mac */, + EE247B441C3F3ED000AE3E12 /* SQLiteTests Mac */, + 03A65E591C6BB0F50062603F /* SQLite tvOS */, + 03A65E621C6BB0F60062603F /* SQLiteTests tvOS */, + A121AC441CA35C79005A31D1 /* SQLite watchOS */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 03A65E581C6BB0F50062603F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 03A65E611C6BB0F60062603F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 19A17F3E1F7ACA33BD43E138 /* fixtures in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A121AC431CA35C79005A31D1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE247AD11C3F04ED00AE3E12 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE247ADB1C3F04ED00AE3E12 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 19A17FDA323BAFDEC627E76F /* fixtures in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE247B3A1C3F3ED000AE3E12 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE247B431C3F3ED000AE3E12 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 19A175DFF47B84757E547C62 /* fixtures in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 03A65E551C6BB0F50062603F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 03A65E801C6BB2FB0062603F /* CoreFunctions.swift in Sources */, + 03A65E761C6BB2E60062603F /* Blob.swift in Sources */, + 03A65E7D1C6BB2F70062603F /* RTree.swift in Sources */, + 03A65E791C6BB2EF0062603F /* SQLite-Bridging.m in Sources */, + 03A65E7B1C6BB2F70062603F /* Value.swift in Sources */, + 03A65E821C6BB2FB0062603F /* Expression.swift in Sources */, + 03A65E731C6BB2D80062603F /* Foundation.swift in Sources */, + 03A65E7F1C6BB2FB0062603F /* Collation.swift in Sources */, + 03A65E861C6BB2FB0062603F /* Setter.swift in Sources */, + 03A65E811C6BB2FB0062603F /* CustomFunctions.swift in Sources */, + 03A65E7A1C6BB2F70062603F /* Statement.swift in Sources */, + 03A65E741C6BB2DA0062603F /* Helpers.swift in Sources */, + 03A65E831C6BB2FB0062603F /* Operators.swift in Sources */, + 03A65E851C6BB2FB0062603F /* Schema.swift in Sources */, + 03A65E841C6BB2FB0062603F /* Query.swift in Sources */, + 03A65E7C1C6BB2F70062603F /* FTS4.swift in Sources */, + 03A65E771C6BB2E60062603F /* Connection.swift in Sources */, + 03A65E7E1C6BB2FB0062603F /* AggregateFunctions.swift in Sources */, + 19A17EC0D68BA8C03288ADF7 /* FTS5.swift in Sources */, + 19A179E76EA6207669B60C1B /* Cipher.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 03A65E5F1C6BB0F60062603F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 03A65E881C6BB3030062603F /* BlobTests.swift in Sources */, + 03A65E901C6BB3030062603F /* RTreeTests.swift in Sources */, + 03A65E941C6BB3030062603F /* ValueTests.swift in Sources */, + 03A65E8F1C6BB3030062603F /* QueryTests.swift in Sources */, + 03A65E8B1C6BB3030062603F /* CustomFunctionsTests.swift in Sources */, + 03A65E871C6BB3030062603F /* AggregateFunctionsTests.swift in Sources */, + 03A65E921C6BB3030062603F /* SetterTests.swift in Sources */, + 03A65E891C6BB3030062603F /* ConnectionTests.swift in Sources */, + 03A65E8A1C6BB3030062603F /* CoreFunctionsTests.swift in Sources */, + 03A65E931C6BB3030062603F /* StatementTests.swift in Sources */, + 03A65E911C6BB3030062603F /* SchemaTests.swift in Sources */, + 03A65E8D1C6BB3030062603F /* FTS4Tests.swift in Sources */, + 03A65E8C1C6BB3030062603F /* ExpressionTests.swift in Sources */, + 03A65E8E1C6BB3030062603F /* OperatorsTests.swift in Sources */, + 03A65E951C6BB3030062603F /* TestHelpers.swift in Sources */, + 19A17254FBA7894891F7297B /* FTS5Tests.swift in Sources */, + 19A17E04C4C0956715C5676A /* FoundationTests.swift in Sources */, + 19A179A0C45377CB09BB358C /* CipherTests.swift in Sources */, + 19A17F60B685636D1F83C2DD /* Fixtures.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A121AC401CA35C79005A31D1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3D67B3F91DB246E700A4F4C6 /* SQLite-Bridging.m in Sources */, + 3D67B3F71DB246D700A4F4C6 /* Foundation.swift in Sources */, + 3D67B3F81DB246D700A4F4C6 /* Helpers.swift in Sources */, + 3D67B3E91DB246D100A4F4C6 /* Statement.swift in Sources */, + 3D67B3EA1DB246D100A4F4C6 /* Value.swift in Sources */, + 3D67B3EB1DB246D100A4F4C6 /* FTS4.swift in Sources */, + 3D67B3EC1DB246D100A4F4C6 /* RTree.swift in Sources */, + 3D67B3ED1DB246D100A4F4C6 /* FTS5.swift in Sources */, + 3D67B3EE1DB246D100A4F4C6 /* AggregateFunctions.swift in Sources */, + 3D67B3EF1DB246D100A4F4C6 /* Collation.swift in Sources */, + 3D67B3F01DB246D100A4F4C6 /* CoreFunctions.swift in Sources */, + 3D67B3F11DB246D100A4F4C6 /* CustomFunctions.swift in Sources */, + 3D67B3F21DB246D100A4F4C6 /* Expression.swift in Sources */, + 3D67B3F31DB246D100A4F4C6 /* Operators.swift in Sources */, + 3D67B3F41DB246D100A4F4C6 /* Query.swift in Sources */, + 3D67B3F51DB246D100A4F4C6 /* Schema.swift in Sources */, + 3D67B3F61DB246D100A4F4C6 /* Setter.swift in Sources */, + 3D67B3E71DB246BA00A4F4C6 /* Blob.swift in Sources */, + 3D67B3E81DB246BA00A4F4C6 /* Connection.swift in Sources */, + 19A179CCF9671E345E5A9811 /* Cipher.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE247ACE1C3F04ED00AE3E12 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EE247B0F1C3F06E900AE3E12 /* CoreFunctions.swift in Sources */, + EE247B0A1C3F06E900AE3E12 /* RTree.swift in Sources */, + EE247B031C3F06E900AE3E12 /* Blob.swift in Sources */, + EE247B0B1C3F06E900AE3E12 /* Foundation.swift in Sources */, + EE247B041C3F06E900AE3E12 /* Connection.swift in Sources */, + EE247B111C3F06E900AE3E12 /* Expression.swift in Sources */, + EE247B0C1C3F06E900AE3E12 /* Helpers.swift in Sources */, + EE247B0E1C3F06E900AE3E12 /* Collation.swift in Sources */, + EE247B151C3F06E900AE3E12 /* Setter.swift in Sources */, + EE247B101C3F06E900AE3E12 /* CustomFunctions.swift in Sources */, + EE247B091C3F06E900AE3E12 /* FTS4.swift in Sources */, + EE247B081C3F06E900AE3E12 /* Value.swift in Sources */, + EE247B121C3F06E900AE3E12 /* Operators.swift in Sources */, + EE247B141C3F06E900AE3E12 /* Schema.swift in Sources */, + EE247B131C3F06E900AE3E12 /* Query.swift in Sources */, + EE247B061C3F06E900AE3E12 /* SQLite-Bridging.m in Sources */, + EE247B071C3F06E900AE3E12 /* Statement.swift in Sources */, + EE247B0D1C3F06E900AE3E12 /* AggregateFunctions.swift in Sources */, + 19A1717B10CC941ACB5533D6 /* FTS5.swift in Sources */, + 19A171F12AB8B07F2FD7201A /* Cipher.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE247AD91C3F04ED00AE3E12 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EE247B261C3F137700AE3E12 /* CoreFunctionsTests.swift in Sources */, + EE247B291C3F137700AE3E12 /* FTS4Tests.swift in Sources */, + EE247B191C3F134A00AE3E12 /* SetterTests.swift in Sources */, + EE247B311C3F141E00AE3E12 /* SchemaTests.swift in Sources */, + EE247B171C3F127200AE3E12 /* TestHelpers.swift in Sources */, + EE247B281C3F137700AE3E12 /* ExpressionTests.swift in Sources */, + EE247B271C3F137700AE3E12 /* CustomFunctionsTests.swift in Sources */, + EE247B341C3F142E00AE3E12 /* StatementTests.swift in Sources */, + EE247B301C3F141E00AE3E12 /* RTreeTests.swift in Sources */, + EE247B231C3F137700AE3E12 /* BlobTests.swift in Sources */, + EE247B351C3F142E00AE3E12 /* ValueTests.swift in Sources */, + EE247B2F1C3F141E00AE3E12 /* QueryTests.swift in Sources */, + EE247B221C3F137700AE3E12 /* AggregateFunctionsTests.swift in Sources */, + EE247B2E1C3F141E00AE3E12 /* OperatorsTests.swift in Sources */, + EE247B251C3F137700AE3E12 /* ConnectionTests.swift in Sources */, + 19A171E6FA242F72A308C594 /* FTS5Tests.swift in Sources */, + 19A17FB80B94E882050AA908 /* FoundationTests.swift in Sources */, + 19A177CC33F2E6A24AF90B02 /* CipherTests.swift in Sources */, + 19A17408007B182F884E3A53 /* Fixtures.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE247B371C3F3ED000AE3E12 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EE247B6F1C3F3FEC00AE3E12 /* CoreFunctions.swift in Sources */, + EE247B651C3F3FEC00AE3E12 /* Blob.swift in Sources */, + EE247B6C1C3F3FEC00AE3E12 /* RTree.swift in Sources */, + EE247B681C3F3FEC00AE3E12 /* SQLite-Bridging.m in Sources */, + EE247B6A1C3F3FEC00AE3E12 /* Value.swift in Sources */, + EE247B711C3F3FEC00AE3E12 /* Expression.swift in Sources */, + EE247B631C3F3FDB00AE3E12 /* Foundation.swift in Sources */, + EE247B6E1C3F3FEC00AE3E12 /* Collation.swift in Sources */, + EE247B751C3F3FEC00AE3E12 /* Setter.swift in Sources */, + EE247B701C3F3FEC00AE3E12 /* CustomFunctions.swift in Sources */, + EE247B691C3F3FEC00AE3E12 /* Statement.swift in Sources */, + EE247B641C3F3FDB00AE3E12 /* Helpers.swift in Sources */, + EE247B721C3F3FEC00AE3E12 /* Operators.swift in Sources */, + EE247B741C3F3FEC00AE3E12 /* Schema.swift in Sources */, + EE247B731C3F3FEC00AE3E12 /* Query.swift in Sources */, + EE247B6B1C3F3FEC00AE3E12 /* FTS4.swift in Sources */, + EE247B661C3F3FEC00AE3E12 /* Connection.swift in Sources */, + EE247B6D1C3F3FEC00AE3E12 /* AggregateFunctions.swift in Sources */, + 19A1750CEE9B05267995CF3D /* FTS5.swift in Sources */, + 19A17835FD5886FDC5A3228F /* Cipher.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE247B411C3F3ED000AE3E12 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EE247B561C3F3FC700AE3E12 /* CoreFunctionsTests.swift in Sources */, + EE247B5A1C3F3FC700AE3E12 /* OperatorsTests.swift in Sources */, + EE247B541C3F3FC700AE3E12 /* BlobTests.swift in Sources */, + EE247B5D1C3F3FC700AE3E12 /* SchemaTests.swift in Sources */, + EE247B591C3F3FC700AE3E12 /* FTS4Tests.swift in Sources */, + EE247B531C3F3FC700AE3E12 /* AggregateFunctionsTests.swift in Sources */, + EE247B5F1C3F3FC700AE3E12 /* StatementTests.swift in Sources */, + EE247B5C1C3F3FC700AE3E12 /* RTreeTests.swift in Sources */, + EE247B571C3F3FC700AE3E12 /* CustomFunctionsTests.swift in Sources */, + EE247B601C3F3FC700AE3E12 /* ValueTests.swift in Sources */, + EE247B551C3F3FC700AE3E12 /* ConnectionTests.swift in Sources */, + EE247B611C3F3FC700AE3E12 /* TestHelpers.swift in Sources */, + EE247B581C3F3FC700AE3E12 /* ExpressionTests.swift in Sources */, + EE247B5E1C3F3FC700AE3E12 /* SetterTests.swift in Sources */, + EE247B5B1C3F3FC700AE3E12 /* QueryTests.swift in Sources */, + 19A174D78559CD30679BCCCB /* FTS5Tests.swift in Sources */, + 19A178072B371489E6A1E839 /* FoundationTests.swift in Sources */, + 19A17C4B951CB054EE48AB1C /* CipherTests.swift in Sources */, + 19A1709C3E7A406E62293B2A /* Fixtures.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 03A65E661C6BB0F60062603F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 03A65E591C6BB0F50062603F /* SQLite tvOS */; + targetProxy = 03A65E651C6BB0F60062603F /* PBXContainerItemProxy */; + }; + EE247AE01C3F04ED00AE3E12 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = EE247AD21C3F04ED00AE3E12 /* SQLite iOS */; + targetProxy = EE247ADF1C3F04ED00AE3E12 /* PBXContainerItemProxy */; + }; + EE247B481C3F3ED000AE3E12 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = EE247B3B1C3F3ED000AE3E12 /* SQLite Mac */; + targetProxy = EE247B471C3F3ED000AE3E12 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 03A65E6B1C6BB0F60062603F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; + PRODUCT_NAME = SQLite; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + "SWIFT_INCLUDE_PATHS[sdk=appletvos*]" = "$(SRCROOT)/CocoaPods/appletvos"; + "SWIFT_INCLUDE_PATHS[sdk=appletvsimulator*]" = "$(SRCROOT)/CocoaPods/appletvsimulator"; + SWIFT_VERSION = 3.0; + TVOS_DEPLOYMENT_TARGET = 9.1; + }; + name = Debug; + }; + 03A65E6C1C6BB0F60062603F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; + PRODUCT_NAME = SQLite; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + "SWIFT_INCLUDE_PATHS[sdk=appletvos*]" = "$(SRCROOT)/CocoaPods/appletvos"; + "SWIFT_INCLUDE_PATHS[sdk=appletvsimulator*]" = "$(SRCROOT)/CocoaPods/appletvsimulator"; + SWIFT_VERSION = 3.0; + TVOS_DEPLOYMENT_TARGET = 9.1; + }; + name = Release; + }; + 03A65E6D1C6BB0F60062603F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = Tests/SQLite/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + SWIFT_VERSION = 3.0; + TVOS_DEPLOYMENT_TARGET = 9.1; + }; + name = Debug; + }; + 03A65E6E1C6BB0F60062603F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = Tests/SQLite/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + SWIFT_VERSION = 3.0; + TVOS_DEPLOYMENT_TARGET = 9.1; + }; + name = Release; + }; + A121AC4A1CA35C79005A31D1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ANALYZER_NONNULL = YES; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; + PRODUCT_NAME = SQLite; + SDKROOT = watchos; + SKIP_INSTALL = YES; + "SWIFT_INCLUDE_PATHS[sdk=watchos*]" = "$(SRCROOT)/CocoaPods/watchos"; + "SWIFT_INCLUDE_PATHS[sdk=watchsimulator*]" = "$(SRCROOT)/CocoaPods/watchsimulator"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 2.2; + }; + name = Debug; + }; + A121AC4B1CA35C79005A31D1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ANALYZER_NONNULL = YES; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; + PRODUCT_NAME = SQLite; + SDKROOT = watchos; + SKIP_INSTALL = YES; + "SWIFT_INCLUDE_PATHS[sdk=watchos*]" = "$(SRCROOT)/CocoaPods/watchos"; + "SWIFT_INCLUDE_PATHS[sdk=watchsimulator*]" = "$(SRCROOT)/CocoaPods/watchsimulator"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 2.2; + }; + name = Release; + }; + EE247AE51C3F04ED00AE3E12 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.9; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = ""; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2,3"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + EE247AE61C3F04ED00AE3E12 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.9; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = ""; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2,3"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + EE247AE81C3F04ED00AE3E12 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; + PRODUCT_NAME = SQLite; + SKIP_INSTALL = YES; + "SWIFT_INCLUDE_PATHS[sdk=iphoneos*]" = "$(SRCROOT)/CocoaPods/iphoneos"; + "SWIFT_INCLUDE_PATHS[sdk=iphoneos10.0]" = "$(SRCROOT)/CocoaPods/iphoneos-10.0"; + "SWIFT_INCLUDE_PATHS[sdk=iphonesimulator*]" = "$(SRCROOT)/CocoaPods/iphonesimulator"; + "SWIFT_INCLUDE_PATHS[sdk=iphonesimulator10.0]" = "$(SRCROOT)/CocoaPods/iphonesimulator-10.0"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + EE247AE91C3F04ED00AE3E12 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; + PRODUCT_NAME = SQLite; + SKIP_INSTALL = YES; + "SWIFT_INCLUDE_PATHS[sdk=iphoneos*]" = "$(SRCROOT)/CocoaPods/iphoneos"; + "SWIFT_INCLUDE_PATHS[sdk=iphoneos10.0]" = "$(SRCROOT)/CocoaPods/iphoneos-10.0"; + "SWIFT_INCLUDE_PATHS[sdk=iphonesimulator*]" = "$(SRCROOT)/CocoaPods/iphonesimulator"; + "SWIFT_INCLUDE_PATHS[sdk=iphonesimulator10.0]" = "$(SRCROOT)/CocoaPods/iphonesimulator-10.0"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; + EE247AEB1C3F04ED00AE3E12 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = Tests/SQLiteTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + EE247AEC1C3F04ED00AE3E12 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = Tests/SQLiteTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; + EE247B4D1C3F3ED000AE3E12 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.9; + PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; + PRODUCT_NAME = SQLite; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_INCLUDE_PATHS = ""; + "SWIFT_INCLUDE_PATHS[sdk=macosx*]" = "$(SRCROOT)/CocoaPods/macosx"; + "SWIFT_INCLUDE_PATHS[sdk=macosx10.11]" = "$(SRCROOT)/CocoaPods/macosx-10.11"; + "SWIFT_INCLUDE_PATHS[sdk=macosx10.12]" = "$(SRCROOT)/CocoaPods/macosx-10.12"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + EE247B4E1C3F3ED000AE3E12 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CODE_SIGN_IDENTITY = ""; + COMBINE_HIDPI_IMAGES = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.9; + PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; + PRODUCT_NAME = SQLite; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_INCLUDE_PATHS = ""; + "SWIFT_INCLUDE_PATHS[sdk=macosx*]" = "$(SRCROOT)/CocoaPods/macosx"; + "SWIFT_INCLUDE_PATHS[sdk=macosx10.11]" = "$(SRCROOT)/CocoaPods/macosx-10.11"; + "SWIFT_INCLUDE_PATHS[sdk=macosx10.12]" = "$(SRCROOT)/CocoaPods/macosx-10.12"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; + EE247B4F1C3F3ED000AE3E12 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "-"; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Tests/SQLiteTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + EE247B501C3F3ED000AE3E12 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "-"; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Tests/SQLiteTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.11; + PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 03A65E6F1C6BB0F60062603F /* Build configuration list for PBXNativeTarget "SQLite tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 03A65E6B1C6BB0F60062603F /* Debug */, + 03A65E6C1C6BB0F60062603F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 03A65E701C6BB0F60062603F /* Build configuration list for PBXNativeTarget "SQLiteTests tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 03A65E6D1C6BB0F60062603F /* Debug */, + 03A65E6E1C6BB0F60062603F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A121AC4C1CA35C79005A31D1 /* Build configuration list for PBXNativeTarget "SQLite watchOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A121AC4A1CA35C79005A31D1 /* Debug */, + A121AC4B1CA35C79005A31D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EE247ACD1C3F04ED00AE3E12 /* Build configuration list for PBXProject "SQLite" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EE247AE51C3F04ED00AE3E12 /* Debug */, + EE247AE61C3F04ED00AE3E12 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EE247AE71C3F04ED00AE3E12 /* Build configuration list for PBXNativeTarget "SQLite iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EE247AE81C3F04ED00AE3E12 /* Debug */, + EE247AE91C3F04ED00AE3E12 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EE247AEA1C3F04ED00AE3E12 /* Build configuration list for PBXNativeTarget "SQLiteTests iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EE247AEB1C3F04ED00AE3E12 /* Debug */, + EE247AEC1C3F04ED00AE3E12 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EE247B511C3F3ED000AE3E12 /* Build configuration list for PBXNativeTarget "SQLite Mac" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EE247B4D1C3F3ED000AE3E12 /* Debug */, + EE247B4E1C3F3ED000AE3E12 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EE247B521C3F3ED000AE3E12 /* Build configuration list for PBXNativeTarget "SQLiteTests Mac" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EE247B4F1C3F3ED000AE3E12 /* Debug */, + EE247B501C3F3ED000AE3E12 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = EE247ACA1C3F04ED00AE3E12 /* Project object */; +} diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..cd11dc9dd6 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite Mac.xcscheme b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite Mac.xcscheme new file mode 100644 index 0000000000..606b5a10e5 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite Mac.xcscheme @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite iOS.xcscheme b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite iOS.xcscheme new file mode 100644 index 0000000000..64f32011c5 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite iOS.xcscheme @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite tvOS.xcscheme b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite tvOS.xcscheme new file mode 100644 index 0000000000..71ba5f163d --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite tvOS.xcscheme @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite watchOS.xcscheme b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite watchOS.xcscheme new file mode 100644 index 0000000000..d2088e817c --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite watchOS.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Blob.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Blob.swift new file mode 100644 index 0000000000..2f5d2a14f4 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Blob.swift @@ -0,0 +1,60 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +public struct Blob { + + public let bytes: [UInt8] + + public init(bytes: [UInt8]) { + self.bytes = bytes + } + + public init(bytes: UnsafeRawPointer, length: Int) { + let i8bufptr = UnsafeBufferPointer(start: bytes.assumingMemoryBound(to: UInt8.self), count: length) + self.init(bytes: [UInt8](i8bufptr)) + } + + public func toHex() -> String { + return bytes.map { + ($0 < 16 ? "0" : "") + String($0, radix: 16, uppercase: false) + }.joined(separator: "") + } + +} + +extension Blob : CustomStringConvertible { + + public var description: String { + return "x'\(toHex())'" + } + +} + +extension Blob : Equatable { + +} + +public func ==(lhs: Blob, rhs: Blob) -> Bool { + return lhs.bytes == rhs.bytes +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Connection.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Connection.swift new file mode 100644 index 0000000000..0661175664 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Connection.swift @@ -0,0 +1,756 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation.NSUUID +import Dispatch +#if SQLITE_SWIFT_STANDALONE +import sqlite3 +#elseif SQLITE_SWIFT_SQLCIPHER +import SQLCipher +#else +import CSQLite +#endif + +/// A connection to SQLite. +public final class Connection { + + /// The location of a SQLite database. + public enum Location { + + /// An in-memory database (equivalent to `.URI(":memory:")`). + /// + /// See: + case inMemory + + /// A temporary, file-backed database (equivalent to `.URI("")`). + /// + /// See: + case temporary + + /// A database located at the given URI filename (or path). + /// + /// See: + /// + /// - Parameter filename: A URI filename + case uri(String) + } + + /// An SQL operation passed to update callbacks. + public enum Operation { + + /// An INSERT operation. + case insert + + /// An UPDATE operation. + case update + + /// A DELETE operation. + case delete + + fileprivate init(rawValue:Int32) { + switch rawValue { + case SQLITE_INSERT: + self = .insert + case SQLITE_UPDATE: + self = .update + case SQLITE_DELETE: + self = .delete + default: + fatalError("unhandled operation code: \(rawValue)") + } + } + } + + public var handle: OpaquePointer { return _handle! } + + fileprivate var _handle: OpaquePointer? = nil + + /// Initializes a new SQLite connection. + /// + /// - Parameters: + /// + /// - location: The location of the database. Creates a new database if it + /// doesn’t already exist (unless in read-only mode). + /// + /// Default: `.InMemory`. + /// + /// - readonly: Whether or not to open the database in a read-only state. + /// + /// Default: `false`. + /// + /// - Returns: A new database connection. + public init(_ location: Location = .inMemory, readonly: Bool = false) throws { + let flags = readonly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE + try check(sqlite3_open_v2(location.description, &_handle, flags | SQLITE_OPEN_FULLMUTEX, nil)) + queue.setSpecific(key: Connection.queueKey, value: queueContext) + } + + /// Initializes a new connection to a database. + /// + /// - Parameters: + /// + /// - filename: The location of the database. Creates a new database if + /// it doesn’t already exist (unless in read-only mode). + /// + /// - readonly: Whether or not to open the database in a read-only state. + /// + /// Default: `false`. + /// + /// - Throws: `Result.Error` iff a connection cannot be established. + /// + /// - Returns: A new database connection. + public convenience init(_ filename: String, readonly: Bool = false) throws { + try self.init(.uri(filename), readonly: readonly) + } + + deinit { + sqlite3_close(handle) + } + + // MARK: - + + /// Whether or not the database was opened in a read-only state. + public var readonly: Bool { return sqlite3_db_readonly(handle, nil) == 1 } + + /// The last rowid inserted into the database via this connection. + public var lastInsertRowid: Int64 { + return sqlite3_last_insert_rowid(handle) + } + + /// The last number of changes (inserts, updates, or deletes) made to the + /// database via this connection. + public var changes: Int { + return Int(sqlite3_changes(handle)) + } + + /// The total number of changes (inserts, updates, or deletes) made to the + /// database via this connection. + public var totalChanges: Int { + return Int(sqlite3_total_changes(handle)) + } + + // MARK: - Execute + + /// Executes a batch of SQL statements. + /// + /// - Parameter SQL: A batch of zero or more semicolon-separated SQL + /// statements. + /// + /// - Throws: `Result.Error` if query execution fails. + public func execute(_ SQL: String) throws { + _ = try sync { try self.check(sqlite3_exec(self.handle, SQL, nil, nil, nil)) } + } + + // MARK: - Prepare + + /// Prepares a single SQL statement (with optional parameter bindings). + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A list of parameters to bind to the statement. + /// + /// - Returns: A prepared statement. + public func prepare(_ statement: String, _ bindings: Binding?...) throws -> Statement { + if !bindings.isEmpty { return try prepare(statement, bindings) } + return try Statement(self, statement) + } + + /// Prepares a single SQL statement and binds parameters to it. + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A list of parameters to bind to the statement. + /// + /// - Returns: A prepared statement. + public func prepare(_ statement: String, _ bindings: [Binding?]) throws -> Statement { + return try prepare(statement).bind(bindings) + } + + /// Prepares a single SQL statement and binds parameters to it. + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A dictionary of named parameters to bind to the statement. + /// + /// - Returns: A prepared statement. + public func prepare(_ statement: String, _ bindings: [String: Binding?]) throws -> Statement { + return try prepare(statement).bind(bindings) + } + + // MARK: - Run + + /// Runs a single SQL statement (with optional parameter bindings). + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A list of parameters to bind to the statement. + /// + /// - Throws: `Result.Error` if query execution fails. + /// + /// - Returns: The statement. + @discardableResult public func run(_ statement: String, _ bindings: Binding?...) throws -> Statement { + return try run(statement, bindings) + } + + /// Prepares, binds, and runs a single SQL statement. + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A list of parameters to bind to the statement. + /// + /// - Throws: `Result.Error` if query execution fails. + /// + /// - Returns: The statement. + @discardableResult public func run(_ statement: String, _ bindings: [Binding?]) throws -> Statement { + return try prepare(statement).run(bindings) + } + + /// Prepares, binds, and runs a single SQL statement. + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A dictionary of named parameters to bind to the statement. + /// + /// - Throws: `Result.Error` if query execution fails. + /// + /// - Returns: The statement. + @discardableResult public func run(_ statement: String, _ bindings: [String: Binding?]) throws -> Statement { + return try prepare(statement).run(bindings) + } + + // MARK: - Scalar + + /// Runs a single SQL statement (with optional parameter bindings), + /// returning the first value of the first row. + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A list of parameters to bind to the statement. + /// + /// - Returns: The first value of the first row returned. + public func scalar(_ statement: String, _ bindings: Binding?...) throws -> Binding? { + return try scalar(statement, bindings) + } + + /// Runs a single SQL statement (with optional parameter bindings), + /// returning the first value of the first row. + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A list of parameters to bind to the statement. + /// + /// - Returns: The first value of the first row returned. + public func scalar(_ statement: String, _ bindings: [Binding?]) throws -> Binding? { + return try prepare(statement).scalar(bindings) + } + + /// Runs a single SQL statement (with optional parameter bindings), + /// returning the first value of the first row. + /// + /// - Parameters: + /// + /// - statement: A single SQL statement. + /// + /// - bindings: A dictionary of named parameters to bind to the statement. + /// + /// - Returns: The first value of the first row returned. + public func scalar(_ statement: String, _ bindings: [String: Binding?]) throws -> Binding? { + return try prepare(statement).scalar(bindings) + } + + // MARK: - Transactions + + /// The mode in which a transaction acquires a lock. + public enum TransactionMode : String { + + /// Defers locking the database till the first read/write executes. + case deferred = "DEFERRED" + + /// Immediately acquires a reserved lock on the database. + case immediate = "IMMEDIATE" + + /// Immediately acquires an exclusive lock on all databases. + case exclusive = "EXCLUSIVE" + + } + + // TODO: Consider not requiring a throw to roll back? + /// Runs a transaction with the given mode. + /// + /// - Note: Transactions cannot be nested. To nest transactions, see + /// `savepoint()`, instead. + /// + /// - Parameters: + /// + /// - mode: The mode in which a transaction acquires a lock. + /// + /// Default: `.Deferred` + /// + /// - block: A closure to run SQL statements within the transaction. + /// The transaction will be committed when the block returns. The block + /// must throw to roll the transaction back. + /// + /// - Throws: `Result.Error`, and rethrows. + public func transaction(_ mode: TransactionMode = .deferred, block: @escaping () throws -> Void) throws { + try transaction("BEGIN \(mode.rawValue) TRANSACTION", block, "COMMIT TRANSACTION", or: "ROLLBACK TRANSACTION") + } + + // TODO: Consider not requiring a throw to roll back? + // TODO: Consider removing ability to set a name? + /// Runs a transaction with the given savepoint name (if omitted, it will + /// generate a UUID). + /// + /// - SeeAlso: `transaction()`. + /// + /// - Parameters: + /// + /// - savepointName: A unique identifier for the savepoint (optional). + /// + /// - block: A closure to run SQL statements within the transaction. + /// The savepoint will be released (committed) when the block returns. + /// The block must throw to roll the savepoint back. + /// + /// - Throws: `SQLite.Result.Error`, and rethrows. + public func savepoint(_ name: String = UUID().uuidString, block: @escaping () throws -> Void) throws { + let name = name.quote("'") + let savepoint = "SAVEPOINT \(name)" + + try transaction(savepoint, block, "RELEASE \(savepoint)", or: "ROLLBACK TO \(savepoint)") + } + + fileprivate func transaction(_ begin: String, _ block: @escaping () throws -> Void, _ commit: String, or rollback: String) throws { + return try sync { + try self.run(begin) + do { + try block() + } catch { + try self.run(rollback) + throw error + } + try self.run(commit) + } + } + + /// Interrupts any long-running queries. + public func interrupt() { + sqlite3_interrupt(handle) + } + + // MARK: - Handlers + + /// The number of seconds a connection will attempt to retry a statement + /// after encountering a busy signal (lock). + public var busyTimeout: Double = 0 { + didSet { + sqlite3_busy_timeout(handle, Int32(busyTimeout * 1_000)) + } + } + + /// Sets a handler to call after encountering a busy signal (lock). + /// + /// - Parameter callback: This block is executed during a lock in which a + /// busy error would otherwise be returned. It’s passed the number of + /// times it’s been called for this lock. If it returns `true`, it will + /// try again. If it returns `false`, no further attempts will be made. + public func busyHandler(_ callback: ((_ tries: Int) -> Bool)?) { + guard let callback = callback else { + sqlite3_busy_handler(handle, nil, nil) + busyHandler = nil + return + } + + let box: BusyHandler = { callback(Int($0)) ? 1 : 0 } + sqlite3_busy_handler(handle, { callback, tries in + unsafeBitCast(callback, to: BusyHandler.self)(tries) + }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) + busyHandler = box + } + fileprivate typealias BusyHandler = @convention(block) (Int32) -> Int32 + fileprivate var busyHandler: BusyHandler? + + /// Sets a handler to call when a statement is executed with the compiled + /// SQL. + /// + /// - Parameter callback: This block is invoked when a statement is executed + /// with the compiled SQL as its argument. + /// + /// db.trace { SQL in print(SQL) } + public func trace(_ callback: ((String) -> Void)?) { + #if SQLITE_SWIFT_SQLCIPHER + trace_v1(callback) + #else + if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) { + trace_v2(callback) + } else { + trace_v1(callback) + } + #endif + } + + fileprivate func trace_v1(_ callback: ((String) -> Void)?) { + guard let callback = callback else { + sqlite3_trace(handle, nil /* xCallback */, nil /* pCtx */) + trace = nil + return + } + let box: Trace = { (pointer: UnsafeRawPointer) in + callback(String(cString: pointer.assumingMemoryBound(to: UInt8.self))) + } + sqlite3_trace(handle, + { + (C: UnsafeMutableRawPointer?, SQL: UnsafePointer?) in + if let C = C, let SQL = SQL { + unsafeBitCast(C, to: Trace.self)(SQL) + } + }, + unsafeBitCast(box, to: UnsafeMutableRawPointer.self) + ) + trace = box + } + + + + + fileprivate typealias Trace = @convention(block) (UnsafeRawPointer) -> Void + fileprivate var trace: Trace? + + /// Registers a callback to be invoked whenever a row is inserted, updated, + /// or deleted in a rowid table. + /// + /// - Parameter callback: A callback invoked with the `Operation` (one of + /// `.Insert`, `.Update`, or `.Delete`), database name, table name, and + /// rowid. + public func updateHook(_ callback: ((_ operation: Operation, _ db: String, _ table: String, _ rowid: Int64) -> Void)?) { + guard let callback = callback else { + sqlite3_update_hook(handle, nil, nil) + updateHook = nil + return + } + + let box: UpdateHook = { + callback( + Operation(rawValue: $0), + String(cString: $1), + String(cString: $2), + $3 + ) + } + sqlite3_update_hook(handle, { callback, operation, db, table, rowid in + unsafeBitCast(callback, to: UpdateHook.self)(operation, db!, table!, rowid) + }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) + updateHook = box + } + fileprivate typealias UpdateHook = @convention(block) (Int32, UnsafePointer, UnsafePointer, Int64) -> Void + fileprivate var updateHook: UpdateHook? + + /// Registers a callback to be invoked whenever a transaction is committed. + /// + /// - Parameter callback: A callback invoked whenever a transaction is + /// committed. If this callback throws, the transaction will be rolled + /// back. + public func commitHook(_ callback: (() throws -> Void)?) { + guard let callback = callback else { + sqlite3_commit_hook(handle, nil, nil) + commitHook = nil + return + } + + let box: CommitHook = { + do { + try callback() + } catch { + return 1 + } + return 0 + } + sqlite3_commit_hook(handle, { callback in + unsafeBitCast(callback, to: CommitHook.self)() + }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) + commitHook = box + } + fileprivate typealias CommitHook = @convention(block) () -> Int32 + fileprivate var commitHook: CommitHook? + + /// Registers a callback to be invoked whenever a transaction rolls back. + /// + /// - Parameter callback: A callback invoked when a transaction is rolled + /// back. + public func rollbackHook(_ callback: (() -> Void)?) { + guard let callback = callback else { + sqlite3_rollback_hook(handle, nil, nil) + rollbackHook = nil + return + } + + let box: RollbackHook = { callback() } + sqlite3_rollback_hook(handle, { callback in + unsafeBitCast(callback, to: RollbackHook.self)() + }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) + rollbackHook = box + } + fileprivate typealias RollbackHook = @convention(block) () -> Void + fileprivate var rollbackHook: RollbackHook? + + /// Creates or redefines a custom SQL function. + /// + /// - Parameters: + /// + /// - function: The name of the function to create or redefine. + /// + /// - argumentCount: The number of arguments that the function takes. If + /// `nil`, the function may take any number of arguments. + /// + /// Default: `nil` + /// + /// - deterministic: Whether or not the function is deterministic (_i.e._ + /// the function always returns the same result for a given input). + /// + /// Default: `false` + /// + /// - block: A block of code to run when the function is called. The block + /// is called with an array of raw SQL values mapped to the function’s + /// parameters and should return a raw SQL value (or nil). + public func createFunction(_ function: String, argumentCount: UInt? = nil, deterministic: Bool = false, _ block: @escaping (_ args: [Binding?]) -> Binding?) { + let argc = argumentCount.map { Int($0) } ?? -1 + let box: Function = { context, argc, argv in + let arguments: [Binding?] = (0..?) -> Void + fileprivate var functions = [String: [Int: Function]]() + + /// Defines a new collating sequence. + /// + /// - Parameters: + /// + /// - collation: The name of the collation added. + /// + /// - block: A collation function that takes two strings and returns the + /// comparison result. + public func createCollation(_ collation: String, _ block: @escaping (_ lhs: String, _ rhs: String) -> ComparisonResult) throws { + let box: Collation = { (lhs: UnsafeRawPointer, rhs: UnsafeRawPointer) in + let lstr = String(cString: lhs.assumingMemoryBound(to: UInt8.self)) + let rstr = String(cString: rhs.assumingMemoryBound(to: UInt8.self)) + return Int32(block(lstr, rstr).rawValue) + } + try check(sqlite3_create_collation_v2(handle, collation, SQLITE_UTF8, + unsafeBitCast(box, to: UnsafeMutableRawPointer.self), + { (callback: UnsafeMutableRawPointer?, _, lhs: UnsafeRawPointer?, _, rhs: UnsafeRawPointer?) in /* xCompare */ + if let lhs = lhs, let rhs = rhs { + return unsafeBitCast(callback, to: Collation.self)(lhs, rhs) + } else { + fatalError("sqlite3_create_collation_v2 callback called with NULL pointer") + } + }, nil /* xDestroy */)) + collations[collation] = box + } + fileprivate typealias Collation = @convention(block) (UnsafeRawPointer, UnsafeRawPointer) -> Int32 + fileprivate var collations = [String: Collation]() + + // MARK: - Error Handling + + func sync(_ block: @escaping () throws -> T) rethrows -> T { + var success: T? + var failure: Error? + + let box: () -> Void = { + do { + success = try block() + } catch { + failure = error + } + } + + if DispatchQueue.getSpecific(key: Connection.queueKey) == queueContext { + box() + } else { + queue.sync(execute: box) // FIXME: rdar://problem/21389236 + } + + if let failure = failure { + try { () -> Void in throw failure }() + } + + return success! + } + + @discardableResult func check(_ resultCode: Int32, statement: Statement? = nil) throws -> Int32 { + guard let error = Result(errorCode: resultCode, connection: self, statement: statement) else { + return resultCode + } + + throw error + } + + fileprivate var queue = DispatchQueue(label: "SQLite.Database", attributes: []) + + fileprivate static let queueKey = DispatchSpecificKey() + + fileprivate lazy var queueContext: Int = unsafeBitCast(self, to: Int.self) + +} + +extension Connection : CustomStringConvertible { + + public var description: String { + return String(cString: sqlite3_db_filename(handle, nil)) + } + +} + +extension Connection.Location : CustomStringConvertible { + + public var description: String { + switch self { + case .inMemory: + return ":memory:" + case .temporary: + return "" + case .uri(let URI): + return URI + } + } + +} + +public enum Result : Error { + + fileprivate static let successCodes: Set = [SQLITE_OK, SQLITE_ROW, SQLITE_DONE] + + case error(message: String, code: Int32, statement: Statement?) + + init?(errorCode: Int32, connection: Connection, statement: Statement? = nil) { + guard !Result.successCodes.contains(errorCode) else { return nil } + + let message = String(cString: sqlite3_errmsg(connection.handle)) + self = .error(message: message, code: errorCode, statement: statement) + } + +} + +extension Result : CustomStringConvertible { + + public var description: String { + switch self { + case let .error(message, errorCode, statement): + if let statement = statement { + return "\(message) (\(statement)) (code: \(errorCode))" + } else { + return "\(message) (code: \(errorCode))" + } + } + } +} + +#if !SQLITE_SWIFT_SQLCIPHER +@available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) +extension Connection { + fileprivate func trace_v2(_ callback: ((String) -> Void)?) { + guard let callback = callback else { + // If the X callback is NULL or if the M mask is zero, then tracing is disabled. + sqlite3_trace_v2(handle, 0 /* mask */, nil /* xCallback */, nil /* pCtx */) + trace = nil + return + } + + let box: Trace = { (pointer: UnsafeRawPointer) in + callback(String(cString: pointer.assumingMemoryBound(to: UInt8.self))) + } + sqlite3_trace_v2(handle, + UInt32(SQLITE_TRACE_STMT) /* mask */, + { + // A trace callback is invoked with four arguments: callback(T,C,P,X). + // The T argument is one of the SQLITE_TRACE constants to indicate why the + // callback was invoked. The C argument is a copy of the context pointer. + // The P and X arguments are pointers whose meanings depend on T. + (T: UInt32, C: UnsafeMutableRawPointer?, P: UnsafeMutableRawPointer?, X: UnsafeMutableRawPointer?) in + if let P = P, + let expandedSQL = sqlite3_expanded_sql(OpaquePointer(P)) { + unsafeBitCast(C, to: Trace.self)(expandedSQL) + sqlite3_free(expandedSQL) + } + return Int32(0) // currently ignored + }, + unsafeBitCast(box, to: UnsafeMutableRawPointer.self) /* pCtx */ + ) + trace = box + } +} +#endif diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Statement.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Statement.swift new file mode 100644 index 0000000000..766bd15b1f --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Statement.swift @@ -0,0 +1,297 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +#if SQLITE_SWIFT_STANDALONE +import sqlite3 +#elseif SQLITE_SWIFT_SQLCIPHER +import SQLCipher +#else +import CSQLite +#endif + +/// A single SQL statement. +public final class Statement { + + fileprivate var handle: OpaquePointer? = nil + + fileprivate let connection: Connection + + init(_ connection: Connection, _ SQL: String) throws { + self.connection = connection + try connection.check(sqlite3_prepare_v2(connection.handle, SQL, -1, &handle, nil)) + } + + deinit { + sqlite3_finalize(handle) + } + + public lazy var columnCount: Int = Int(sqlite3_column_count(self.handle)) + + public lazy var columnNames: [String] = (0.. Statement { + return bind(values) + } + + /// Binds a list of parameters to a statement. + /// + /// - Parameter values: A list of parameters to bind to the statement. + /// + /// - Returns: The statement object (useful for chaining). + public func bind(_ values: [Binding?]) -> Statement { + if values.isEmpty { return self } + reset() + guard values.count == Int(sqlite3_bind_parameter_count(handle)) else { + fatalError("\(sqlite3_bind_parameter_count(handle)) values expected, \(values.count) passed") + } + for idx in 1...values.count { bind(values[idx - 1], atIndex: idx) } + return self + } + + /// Binds a dictionary of named parameters to a statement. + /// + /// - Parameter values: A dictionary of named parameters to bind to the + /// statement. + /// + /// - Returns: The statement object (useful for chaining). + public func bind(_ values: [String: Binding?]) -> Statement { + reset() + for (name, value) in values { + let idx = sqlite3_bind_parameter_index(handle, name) + guard idx > 0 else { + fatalError("parameter not found: \(name)") + } + bind(value, atIndex: Int(idx)) + } + return self + } + + fileprivate func bind(_ value: Binding?, atIndex idx: Int) { + if value == nil { + sqlite3_bind_null(handle, Int32(idx)) + } else if let value = value as? Blob { + sqlite3_bind_blob(handle, Int32(idx), value.bytes, Int32(value.bytes.count), SQLITE_TRANSIENT) + } else if let value = value as? Double { + sqlite3_bind_double(handle, Int32(idx), value) + } else if let value = value as? Int64 { + sqlite3_bind_int64(handle, Int32(idx), value) + } else if let value = value as? String { + sqlite3_bind_text(handle, Int32(idx), value, -1, SQLITE_TRANSIENT) + } else if let value = value as? Int { + self.bind(value.datatypeValue, atIndex: idx) + } else if let value = value as? Bool { + self.bind(value.datatypeValue, atIndex: idx) + } else if let value = value { + fatalError("tried to bind unexpected value \(value)") + } + } + + /// - Parameter bindings: A list of parameters to bind to the statement. + /// + /// - Throws: `Result.Error` if query execution fails. + /// + /// - Returns: The statement object (useful for chaining). + @discardableResult public func run(_ bindings: Binding?...) throws -> Statement { + guard bindings.isEmpty else { + return try run(bindings) + } + + reset(clearBindings: false) + repeat {} while try step() + return self + } + + /// - Parameter bindings: A list of parameters to bind to the statement. + /// + /// - Throws: `Result.Error` if query execution fails. + /// + /// - Returns: The statement object (useful for chaining). + @discardableResult public func run(_ bindings: [Binding?]) throws -> Statement { + return try bind(bindings).run() + } + + /// - Parameter bindings: A dictionary of named parameters to bind to the + /// statement. + /// + /// - Throws: `Result.Error` if query execution fails. + /// + /// - Returns: The statement object (useful for chaining). + @discardableResult public func run(_ bindings: [String: Binding?]) throws -> Statement { + return try bind(bindings).run() + } + + /// - Parameter bindings: A list of parameters to bind to the statement. + /// + /// - Returns: The first value of the first row returned. + public func scalar(_ bindings: Binding?...) throws -> Binding? { + guard bindings.isEmpty else { + return try scalar(bindings) + } + + reset(clearBindings: false) + _ = try step() + return row[0] + } + + /// - Parameter bindings: A list of parameters to bind to the statement. + /// + /// - Returns: The first value of the first row returned. + public func scalar(_ bindings: [Binding?]) throws -> Binding? { + return try bind(bindings).scalar() + } + + + /// - Parameter bindings: A dictionary of named parameters to bind to the + /// statement. + /// + /// - Returns: The first value of the first row returned. + public func scalar(_ bindings: [String: Binding?]) throws -> Binding? { + return try bind(bindings).scalar() + } + + public func step() throws -> Bool { + return try connection.sync { try self.connection.check(sqlite3_step(self.handle)) == SQLITE_ROW } + } + + fileprivate func reset(clearBindings shouldClear: Bool = true) { + sqlite3_reset(handle) + if (shouldClear) { sqlite3_clear_bindings(handle) } + } + +} + +extension Statement : Sequence { + + public func makeIterator() -> Statement { + reset(clearBindings: false) + return self + } + +} + +extension Statement : IteratorProtocol { + + public func next() -> [Binding?]? { + return try! step() ? Array(row) : nil + } + +} + +extension Statement : CustomStringConvertible { + + public var description: String { + return String(cString: sqlite3_sql(handle)) + } + +} + +public struct Cursor { + + fileprivate let handle: OpaquePointer + + fileprivate let columnCount: Int + + fileprivate init(_ statement: Statement) { + handle = statement.handle! + columnCount = statement.columnCount + } + + public subscript(idx: Int) -> Double { + return sqlite3_column_double(handle, Int32(idx)) + } + + public subscript(idx: Int) -> Int64 { + return sqlite3_column_int64(handle, Int32(idx)) + } + + public subscript(idx: Int) -> String { + return String(cString: UnsafePointer(sqlite3_column_text(handle, Int32(idx)))) + } + + public subscript(idx: Int) -> Blob { + if let pointer = sqlite3_column_blob(handle, Int32(idx)) { + let length = Int(sqlite3_column_bytes(handle, Int32(idx))) + return Blob(bytes: pointer, length: length) + } else { + // The return value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. + // https://www.sqlite.org/c3ref/column_blob.html + return Blob(bytes: []) + } + } + + // MARK: - + + public subscript(idx: Int) -> Bool { + return Bool.fromDatatypeValue(self[idx]) + } + + public subscript(idx: Int) -> Int { + return Int.fromDatatypeValue(self[idx]) + } + +} + +/// Cursors provide direct access to a statement’s current row. +extension Cursor : Sequence { + + public subscript(idx: Int) -> Binding? { + switch sqlite3_column_type(handle, Int32(idx)) { + case SQLITE_BLOB: + return self[idx] as Blob + case SQLITE_FLOAT: + return self[idx] as Double + case SQLITE_INTEGER: + return self[idx] as Int64 + case SQLITE_NULL: + return nil + case SQLITE_TEXT: + return self[idx] as String + case let type: + fatalError("unsupported column type: \(type)") + } + } + + public func makeIterator() -> AnyIterator { + var idx = 0 + return AnyIterator { + if idx >= self.columnCount { + return Optional.none + } else { + idx += 1 + return self[idx - 1] + } + } + } + +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Value.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Value.swift new file mode 100644 index 0000000000..608f0ce6fe --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Value.swift @@ -0,0 +1,132 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +/// - Warning: `Binding` is a protocol that SQLite.swift uses internally to +/// directly map SQLite types to Swift types. +/// +/// Do not conform custom types to the Binding protocol. See the `Value` +/// protocol, instead. +public protocol Binding {} + +public protocol Number : Binding {} + +public protocol Value : Expressible { // extensions cannot have inheritance clauses + + associatedtype ValueType = Self + + associatedtype Datatype : Binding + + static var declaredDatatype: String { get } + + static func fromDatatypeValue(_ datatypeValue: Datatype) -> ValueType + + var datatypeValue: Datatype { get } + +} + +extension Double : Number, Value { + + public static let declaredDatatype = "REAL" + + public static func fromDatatypeValue(_ datatypeValue: Double) -> Double { + return datatypeValue + } + + public var datatypeValue: Double { + return self + } + +} + +extension Int64 : Number, Value { + + public static let declaredDatatype = "INTEGER" + + public static func fromDatatypeValue(_ datatypeValue: Int64) -> Int64 { + return datatypeValue + } + + public var datatypeValue: Int64 { + return self + } + +} + +extension String : Binding, Value { + + public static let declaredDatatype = "TEXT" + + public static func fromDatatypeValue(_ datatypeValue: String) -> String { + return datatypeValue + } + + public var datatypeValue: String { + return self + } + +} + +extension Blob : Binding, Value { + + public static let declaredDatatype = "BLOB" + + public static func fromDatatypeValue(_ datatypeValue: Blob) -> Blob { + return datatypeValue + } + + public var datatypeValue: Blob { + return self + } + +} + +// MARK: - + +extension Bool : Binding, Value { + + public static var declaredDatatype = Int64.declaredDatatype + + public static func fromDatatypeValue(_ datatypeValue: Int64) -> Bool { + return datatypeValue != 0 + } + + public var datatypeValue: Int64 { + return self ? 1 : 0 + } + +} + +extension Int : Number, Value { + + public static var declaredDatatype = Int64.declaredDatatype + + public static func fromDatatypeValue(_ datatypeValue: Int64) -> Int { + return Int(datatypeValue) + } + + public var datatypeValue: Int64 { + return Int64(self) + } + +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/Cipher.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/Cipher.swift new file mode 100644 index 0000000000..6c0d465781 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/Cipher.swift @@ -0,0 +1,61 @@ +#if SQLITE_SWIFT_SQLCIPHER +import SQLCipher + + +/// Extension methods for [SQLCipher](https://www.zetetic.net/sqlcipher/). +/// @see [sqlcipher api](https://www.zetetic.net/sqlcipher/sqlcipher-api/) +extension Connection { + + /// Specify the key for an encrypted database. This routine should be + /// called right after sqlite3_open(). + /// + /// @param key The key to use.The key itself can be a passphrase, which is converted to a key + /// using [PBKDF2](https://en.wikipedia.org/wiki/PBKDF2) key derivation. The result + /// is used as the encryption key for the database. + /// + /// Alternatively, it is possible to specify an exact byte sequence using a blob literal. + /// With this method, it is the calling application's responsibility to ensure that the data + /// provided is a 64 character hex string, which will be converted directly to 32 bytes (256 bits) + /// of key data. + /// e.g. x'2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99' + /// @param db name of the database, defaults to 'main' + public func key(_ key: String, db: String = "main") throws { + try _key_v2(db: db, keyPointer: key, keySize: key.utf8.count) + } + + public func key(_ key: Blob, db: String = "main") throws { + try _key_v2(db: db, keyPointer: key.bytes, keySize: key.bytes.count) + } + + + /// Change the key on an open database. If the current database is not encrypted, this routine + /// will encrypt it. + /// To change the key on an existing encrypted database, it must first be unlocked with the + /// current encryption key. Once the database is readable and writeable, rekey can be used + /// to re-encrypt every page in the database with a new key. + public func rekey(_ key: String, db: String = "main") throws { + try _rekey_v2(db: db, keyPointer: key, keySize: key.utf8.count) + } + + public func rekey(_ key: Blob, db: String = "main") throws { + try _rekey_v2(db: db, keyPointer: key.bytes, keySize: key.bytes.count) + } + + // MARK: - private + private func _key_v2(db: String, keyPointer: UnsafePointer, keySize: Int) throws { + try check(sqlite3_key_v2(handle, db, keyPointer, Int32(keySize))) + try cipher_key_check() + } + + private func _rekey_v2(db: String, keyPointer: UnsafePointer, keySize: Int) throws { + try check(sqlite3_rekey_v2(handle, db, keyPointer, Int32(keySize))) + } + + // When opening an existing database, sqlite3_key_v2 will not immediately throw an error if + // the key provided is incorrect. To test that the database can be successfully opened with the + // provided key, it is necessary to perform some operation on the database (i.e. read from it). + private func cipher_key_check() throws { + try scalar("SELECT count(*) FROM sqlite_master;") + } +} +#endif diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift new file mode 100644 index 0000000000..152a29219e --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift @@ -0,0 +1,346 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +#if SWIFT_PACKAGE +import SQLiteObjc +#endif + +extension Module { + + public static func FTS4(_ column: Expressible, _ more: Expressible...) -> Module { + return FTS4([column] + more) + } + + public static func FTS4(_ columns: [Expressible] = [], tokenize tokenizer: Tokenizer? = nil) -> Module { + return FTS4(FTS4Config().columns(columns).tokenizer(tokenizer)) + } + + public static func FTS4(_ config: FTS4Config) -> Module { + return Module(name: "fts4", arguments: config.arguments()) + } +} + +extension VirtualTable { + + /// Builds an expression appended with a `MATCH` query against the given + /// pattern. + /// + /// let emails = VirtualTable("emails") + /// + /// emails.filter(emails.match("Hello")) + /// // SELECT * FROM "emails" WHERE "emails" MATCH 'Hello' + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: An expression appended with a `MATCH` query against the given + /// pattern. + public func match(_ pattern: String) -> Expression { + return "MATCH".infix(tableName(), pattern) + } + + public func match(_ pattern: Expression) -> Expression { + return "MATCH".infix(tableName(), pattern) + } + + public func match(_ pattern: Expression) -> Expression { + return "MATCH".infix(tableName(), pattern) + } + + /// Builds a copy of the query with a `WHERE … MATCH` clause. + /// + /// let emails = VirtualTable("emails") + /// + /// emails.match("Hello") + /// // SELECT * FROM "emails" WHERE "emails" MATCH 'Hello' + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A query with the given `WHERE … MATCH` clause applied. + public func match(_ pattern: String) -> QueryType { + return filter(match(pattern)) + } + + public func match(_ pattern: Expression) -> QueryType { + return filter(match(pattern)) + } + + public func match(_ pattern: Expression) -> QueryType { + return filter(match(pattern)) + } + +} + +public struct Tokenizer { + + public static let Simple = Tokenizer("simple") + + public static let Porter = Tokenizer("porter") + + public static func Unicode61(removeDiacritics: Bool? = nil, tokenchars: Set = [], separators: Set = []) -> Tokenizer { + var arguments = [String]() + + if let removeDiacritics = removeDiacritics { + arguments.append("removeDiacritics=\(removeDiacritics ? 1 : 0)".quote()) + } + + if !tokenchars.isEmpty { + let joined = tokenchars.map { String($0) }.joined(separator: "") + arguments.append("tokenchars=\(joined)".quote()) + } + + if !separators.isEmpty { + let joined = separators.map { String($0) }.joined(separator: "") + arguments.append("separators=\(joined)".quote()) + } + + return Tokenizer("unicode61", arguments) + } + + public static func Custom(_ name: String) -> Tokenizer { + return Tokenizer(Tokenizer.moduleName.quote(), [name.quote()]) + } + + public let name: String + + public let arguments: [String] + + fileprivate init(_ name: String, _ arguments: [String] = []) { + self.name = name + self.arguments = arguments + } + + fileprivate static let moduleName = "SQLite.swift" + +} + +extension Tokenizer : CustomStringConvertible { + + public var description: String { + return ([name] + arguments).joined(separator: " ") + } + +} + +extension Connection { + + public func registerTokenizer(_ submoduleName: String, next: @escaping (String) -> (String, Range)?) throws { + try check(_SQLiteRegisterTokenizer(handle, Tokenizer.moduleName, submoduleName) { input, offset, length in + let string = String(cString: input) + + guard let (token, range) = next(string) else { return nil } + + let view = string.utf8 + offset.pointee += string.substring(to: range.lowerBound).utf8.count + length.pointee = Int32(view.distance(from: range.lowerBound.samePosition(in: view), to: range.upperBound.samePosition(in: view))) + return token + }) + } + +} + +/// Configuration options shared between the [FTS4](https://www.sqlite.org/fts3.html) and +/// [FTS5](https://www.sqlite.org/fts5.html) extensions. +open class FTSConfig { + public enum ColumnOption { + /// [The notindexed= option](https://www.sqlite.org/fts3.html#section_6_5) + case unindexed + } + + typealias ColumnDefinition = (Expressible, options: [ColumnOption]) + var columnDefinitions = [ColumnDefinition]() + var tokenizer: Tokenizer? + var prefixes = [Int]() + var externalContentSchema: SchemaType? + var isContentless: Bool = false + + /// Adds a column definition + @discardableResult open func column(_ column: Expressible, _ options: [ColumnOption] = []) -> Self { + self.columnDefinitions.append((column, options)) + return self + } + + @discardableResult open func columns(_ columns: [Expressible]) -> Self { + for column in columns { + self.column(column) + } + return self + } + + /// [Tokenizers](https://www.sqlite.org/fts3.html#tokenizer) + open func tokenizer(_ tokenizer: Tokenizer?) -> Self { + self.tokenizer = tokenizer + return self + } + + /// [The prefix= option](https://www.sqlite.org/fts3.html#section_6_6) + open func prefix(_ prefix: [Int]) -> Self { + self.prefixes += prefix + return self + } + + /// [The content= option](https://www.sqlite.org/fts3.html#section_6_2) + open func externalContent(_ schema: SchemaType) -> Self { + self.externalContentSchema = schema + return self + } + + /// [Contentless FTS4 Tables](https://www.sqlite.org/fts3.html#section_6_2_1) + open func contentless() -> Self { + self.isContentless = true + return self + } + + func formatColumnDefinitions() -> [Expressible] { + return columnDefinitions.map { $0.0 } + } + + func arguments() -> [Expressible] { + return options().arguments + } + + func options() -> Options { + var options = Options() + options.append(formatColumnDefinitions()) + if let tokenizer = tokenizer { + options.append("tokenize", value: Expression(literal: tokenizer.description)) + } + options.appendCommaSeparated("prefix", values:prefixes.sorted().map { String($0) }) + if isContentless { + options.append("content", value: "") + } else if let externalContentSchema = externalContentSchema { + options.append("content", value: externalContentSchema.tableName()) + } + return options + } + + struct Options { + var arguments = [Expressible]() + + @discardableResult mutating func append(_ columns: [Expressible]) -> Options { + arguments.append(contentsOf: columns) + return self + } + + @discardableResult mutating func appendCommaSeparated(_ key: String, values: [String]) -> Options { + if values.isEmpty { + return self + } else { + return append(key, value: values.joined(separator: ",")) + } + } + + @discardableResult mutating func append(_ key: String, value: CustomStringConvertible?) -> Options { + return append(key, value: value?.description) + } + + @discardableResult mutating func append(_ key: String, value: String?) -> Options { + return append(key, value: value.map { Expression($0) }) + } + + @discardableResult mutating func append(_ key: String, value: Expressible?) -> Options { + if let value = value { + arguments.append("=".join([Expression(literal: key), value])) + } + return self + } + } +} + +/// Configuration for the [FTS4](https://www.sqlite.org/fts3.html) extension. +open class FTS4Config : FTSConfig { + /// [The matchinfo= option](https://www.sqlite.org/fts3.html#section_6_4) + public enum MatchInfo : CustomStringConvertible { + case fts3 + public var description: String { + return "fts3" + } + } + + /// [FTS4 options](https://www.sqlite.org/fts3.html#fts4_options) + public enum Order : CustomStringConvertible { + /// Data structures are optimized for returning results in ascending order by docid (default) + case asc + /// FTS4 stores its data in such a way as to optimize returning results in descending order by docid. + case desc + + public var description: String { + switch self { + case .asc: return "asc" + case .desc: return "desc" + } + } + } + + var compressFunction: String? + var uncompressFunction: String? + var languageId: String? + var matchInfo: MatchInfo? + var order: Order? + + override public init() { + } + + /// [The compress= and uncompress= options](https://www.sqlite.org/fts3.html#section_6_1) + open func compress(_ functionName: String) -> Self { + self.compressFunction = functionName + return self + } + + /// [The compress= and uncompress= options](https://www.sqlite.org/fts3.html#section_6_1) + open func uncompress(_ functionName: String) -> Self { + self.uncompressFunction = functionName + return self + } + + /// [The languageid= option](https://www.sqlite.org/fts3.html#section_6_3) + open func languageId(_ columnName: String) -> Self { + self.languageId = columnName + return self + } + + /// [The matchinfo= option](https://www.sqlite.org/fts3.html#section_6_4) + open func matchInfo(_ matchInfo: MatchInfo) -> Self { + self.matchInfo = matchInfo + return self + } + + /// [FTS4 options](https://www.sqlite.org/fts3.html#fts4_options) + open func order(_ order: Order) -> Self { + self.order = order + return self + } + + override func options() -> Options { + var options = super.options() + for (column, _) in (columnDefinitions.filter { $0.options.contains(.unindexed) }) { + options.append("notindexed", value: column) + } + options.append("languageid", value: languageId) + options.append("compress", value: compressFunction) + options.append("uncompress", value: uncompressFunction) + options.append("matchinfo", value: matchInfo) + options.append("order", value: order) + return options + } +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift new file mode 100644 index 0000000000..763927ff48 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift @@ -0,0 +1,97 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +extension Module { + public static func FTS5(_ config: FTS5Config) -> Module { + return Module(name: "fts5", arguments: config.arguments()) + } +} + +/// Configuration for the [FTS5](https://www.sqlite.org/fts5.html) extension. +/// +/// **Note:** this is currently only applicable when using SQLite.swift together with a FTS5-enabled version +/// of SQLite. +open class FTS5Config : FTSConfig { + public enum Detail : CustomStringConvertible { + /// store rowid, column number, term offset + case full + /// store rowid, column number + case column + /// store rowid + case none + + public var description: String { + switch self { + case .full: return "full" + case .column: return "column" + case .none: return "none" + } + } + } + + var detail: Detail? + var contentRowId: Expressible? + var columnSize: Int? + + override public init() { + } + + /// [External Content Tables](https://www.sqlite.org/fts5.html#section_4_4_2) + open func contentRowId(_ column: Expressible) -> Self { + self.contentRowId = column + return self + } + + /// [The Columnsize Option](https://www.sqlite.org/fts5.html#section_4_5) + open func columnSize(_ size: Int) -> Self { + self.columnSize = size + return self + } + + /// [The Detail Option](https://www.sqlite.org/fts5.html#section_4_6) + open func detail(_ detail: Detail) -> Self { + self.detail = detail + return self + } + + override func options() -> Options { + var options = super.options() + options.append("content_rowid", value: contentRowId) + if let columnSize = columnSize { + options.append("columnsize", value: Expression(value: columnSize)) + } + options.append("detail", value: detail) + return options + } + + override func formatColumnDefinitions() -> [Expressible] { + return columnDefinitions.map { definition in + if definition.options.contains(.unindexed) { + return " ".join([definition.0, Expression(literal: "UNINDEXED")]) + } else { + return definition.0 + } + } + } +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/RTree.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/RTree.swift new file mode 100644 index 0000000000..4fc1a23539 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/RTree.swift @@ -0,0 +1,37 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +extension Module { + + public static func RTree(_ primaryKey: Expression, _ pairs: (Expression, Expression)...) -> Module where T.Datatype == Int64, U.Datatype == Double { + var arguments: [Expressible] = [primaryKey] + + for pair in pairs { + arguments.append(contentsOf: [pair.0, pair.1] as [Expressible]) + } + + return Module(name: "rtree", arguments: arguments) + } + +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Foundation.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Foundation.swift new file mode 100644 index 0000000000..5e102297b9 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Foundation.swift @@ -0,0 +1,108 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +extension Data : Value { + + public static var declaredDatatype: String { + return Blob.declaredDatatype + } + + public static func fromDatatypeValue(_ dataValue: Blob) -> Data { + return Data(bytes: dataValue.bytes) + } + + public var datatypeValue: Blob { + return withUnsafeBytes { (pointer: UnsafePointer) -> Blob in + return Blob(bytes: pointer, length: count) + } + } + +} + +extension Date : Value { + + public static var declaredDatatype: String { + return String.declaredDatatype + } + + public static func fromDatatypeValue(_ stringValue: String) -> Date { + return dateFormatter.date(from: stringValue)! + } + + public var datatypeValue: String { + return dateFormatter.string(from: self) + } + +} + +/// A global date formatter used to serialize and deserialize `NSDate` objects. +/// If multiple date formats are used in an application’s database(s), use a +/// custom `Value` type per additional format. +public var dateFormatter: DateFormatter = { + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS" + formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.timeZone = TimeZone(secondsFromGMT: 0) + return formatter +}() + +// FIXME: rdar://problem/18673897 // subscript… + +extension QueryType { + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + +} + +extension Row { + + public subscript(column: Expression) -> Data { + return get(column) + } + public subscript(column: Expression) -> Data? { + return get(column) + } + + public subscript(column: Expression) -> Date { + return get(column) + } + public subscript(column: Expression) -> Date? { + return get(column) + } + +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Helpers.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Helpers.swift new file mode 100644 index 0000000000..81a7507ede --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Helpers.swift @@ -0,0 +1,130 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +#if SQLITE_SWIFT_STANDALONE +import sqlite3 +#elseif SQLITE_SWIFT_SQLCIPHER +import SQLCipher +#else +import CSQLite +#endif + +public typealias Star = (Expression?, Expression?) -> Expression + +public func *(_: Expression?, _: Expression?) -> Expression { + return Expression(literal: "*") +} + +public protocol _OptionalType { + + associatedtype WrappedType + +} + +extension Optional : _OptionalType { + + public typealias WrappedType = Wrapped + +} + +// let SQLITE_STATIC = unsafeBitCast(0, sqlite3_destructor_type.self) +let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) + +extension String { + + func quote(_ mark: Character = "\"") -> String { + let escaped = characters.reduce("") { string, character in + string + (character == mark ? "\(mark)\(mark)" : "\(character)") + } + return "\(mark)\(escaped)\(mark)" + } + + func join(_ expressions: [Expressible]) -> Expressible { + var (template, bindings) = ([String](), [Binding?]()) + for expressible in expressions { + let expression = expressible.expression + template.append(expression.template) + bindings.append(contentsOf: expression.bindings) + } + return Expression(template.joined(separator: self), bindings) + } + + func infix(_ lhs: Expressible, _ rhs: Expressible, wrap: Bool = true) -> Expression { + let expression = Expression(" \(self) ".join([lhs, rhs]).expression) + guard wrap else { + return expression + } + return "".wrap(expression) + } + + func prefix(_ expressions: Expressible) -> Expressible { + return "\(self) ".wrap(expressions) as Expression + } + + func prefix(_ expressions: [Expressible]) -> Expressible { + return "\(self) ".wrap(expressions) as Expression + } + + func wrap(_ expression: Expressible) -> Expression { + return Expression("\(self)(\(expression.expression.template))", expression.expression.bindings) + } + + func wrap(_ expressions: [Expressible]) -> Expression { + return wrap(", ".join(expressions)) + } + +} + +func infix(_ lhs: Expressible, _ rhs: Expressible, wrap: Bool = true, function: String = #function) -> Expression { + return function.infix(lhs, rhs, wrap: wrap) +} + +func wrap(_ expression: Expressible, function: String = #function) -> Expression { + return function.wrap(expression) +} + +func wrap(_ expressions: [Expressible], function: String = #function) -> Expression { + return function.wrap(", ".join(expressions)) +} + +func transcode(_ literal: Binding?) -> String { + guard let literal = literal else { return "NULL" } + + switch literal { + case let blob as Blob: + return blob.description + case let string as String: + return string.quote("'") + case let binding: + return "\(binding)" + } +} + +func value(_ v: Binding) -> A { + return A.fromDatatypeValue(v as! A.Datatype) as! A +} + +func value(_ v: Binding?) -> A { + return value(v!) +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Info.plist b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Info.plist new file mode 100644 index 0000000000..588139c437 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.11.2 + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/SQLite.h b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/SQLite.h new file mode 100644 index 0000000000..693ce323cf --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/SQLite.h @@ -0,0 +1,6 @@ +@import Foundation; + +FOUNDATION_EXPORT double SQLiteVersionNumber; +FOUNDATION_EXPORT const unsigned char SQLiteVersionString[]; + +#import diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift new file mode 100644 index 0000000000..249bbe60cd --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift @@ -0,0 +1,251 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +extension ExpressionType where UnderlyingType : Value { + + /// Builds a copy of the expression prefixed with the `DISTINCT` keyword. + /// + /// let name = Expression("name") + /// name.distinct + /// // DISTINCT "name" + /// + /// - Returns: A copy of the expression prefixed with the `DISTINCT` + /// keyword. + public var distinct: Expression { + return Expression("DISTINCT \(template)", bindings) + } + + /// Builds a copy of the expression wrapped with the `count` aggregate + /// function. + /// + /// let name = Expression("name") + /// name.count + /// // count("name") + /// name.distinct.count + /// // count(DISTINCT "name") + /// + /// - Returns: A copy of the expression wrapped with the `count` aggregate + /// function. + public var count: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value { + + /// Builds a copy of the expression prefixed with the `DISTINCT` keyword. + /// + /// let name = Expression("name") + /// name.distinct + /// // DISTINCT "name" + /// + /// - Returns: A copy of the expression prefixed with the `DISTINCT` + /// keyword. + public var distinct: Expression { + return Expression("DISTINCT \(template)", bindings) + } + + /// Builds a copy of the expression wrapped with the `count` aggregate + /// function. + /// + /// let name = Expression("name") + /// name.count + /// // count("name") + /// name.distinct.count + /// // count(DISTINCT "name") + /// + /// - Returns: A copy of the expression wrapped with the `count` aggregate + /// function. + public var count: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType : Value, UnderlyingType.Datatype : Comparable { + + /// Builds a copy of the expression wrapped with the `max` aggregate + /// function. + /// + /// let age = Expression("age") + /// age.max + /// // max("age") + /// + /// - Returns: A copy of the expression wrapped with the `max` aggregate + /// function. + public var max: Expression { + return wrap(self) + } + + /// Builds a copy of the expression wrapped with the `min` aggregate + /// function. + /// + /// let age = Expression("age") + /// age.min + /// // min("age") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var min: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value, UnderlyingType.WrappedType.Datatype : Comparable { + + /// Builds a copy of the expression wrapped with the `max` aggregate + /// function. + /// + /// let age = Expression("age") + /// age.max + /// // max("age") + /// + /// - Returns: A copy of the expression wrapped with the `max` aggregate + /// function. + public var max: Expression { + return wrap(self) + } + + /// Builds a copy of the expression wrapped with the `min` aggregate + /// function. + /// + /// let age = Expression("age") + /// age.min + /// // min("age") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var min: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType : Value, UnderlyingType.Datatype : Number { + + /// Builds a copy of the expression wrapped with the `avg` aggregate + /// function. + /// + /// let salary = Expression("salary") + /// salary.average + /// // avg("salary") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var average: Expression { + return "avg".wrap(self) + } + + /// Builds a copy of the expression wrapped with the `sum` aggregate + /// function. + /// + /// let salary = Expression("salary") + /// salary.sum + /// // sum("salary") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var sum: Expression { + return wrap(self) + } + + /// Builds a copy of the expression wrapped with the `total` aggregate + /// function. + /// + /// let salary = Expression("salary") + /// salary.total + /// // total("salary") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var total: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value, UnderlyingType.WrappedType.Datatype : Number { + + /// Builds a copy of the expression wrapped with the `avg` aggregate + /// function. + /// + /// let salary = Expression("salary") + /// salary.average + /// // avg("salary") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var average: Expression { + return "avg".wrap(self) + } + + /// Builds a copy of the expression wrapped with the `sum` aggregate + /// function. + /// + /// let salary = Expression("salary") + /// salary.sum + /// // sum("salary") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var sum: Expression { + return wrap(self) + } + + /// Builds a copy of the expression wrapped with the `total` aggregate + /// function. + /// + /// let salary = Expression("salary") + /// salary.total + /// // total("salary") + /// + /// - Returns: A copy of the expression wrapped with the `min` aggregate + /// function. + public var total: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType == Int { + + static func count(_ star: Star) -> Expression { + return wrap(star(nil, nil)) + } + +} + +/// Builds an expression representing `count(*)` (when called with the `*` +/// function literal). +/// +/// count(*) +/// // count(*) +/// +/// - Returns: An expression returning `count(*)` (when called with the `*` +/// function literal). +public func count(_ star: Star) -> Expression { + return Expression.count(star) +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Collation.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Collation.swift new file mode 100644 index 0000000000..e2ff9d1006 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Collation.swift @@ -0,0 +1,69 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +/// A collating function used to compare to strings. +/// +/// - SeeAlso: +public enum Collation { + + /// Compares string by raw data. + case binary + + /// Like binary, but folds uppercase ASCII letters into their lowercase + /// equivalents. + case nocase + + /// Like binary, but strips trailing space. + case rtrim + + /// A custom collating sequence identified by the given string, registered + /// using `Database.create(collation:…)` + case custom(String) + +} + +extension Collation : Expressible { + + public var expression: Expression { + return Expression(literal: description) + } + +} + +extension Collation : CustomStringConvertible { + + public var description : String { + switch self { + case .binary: + return "BINARY" + case .nocase: + return "NOCASE" + case .rtrim: + return "RTRIM" + case .custom(let collation): + return collation.quote() + } + } + +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift new file mode 100644 index 0000000000..9d17a326bc --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift @@ -0,0 +1,683 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation.NSData + + +extension ExpressionType where UnderlyingType : Number { + + /// Builds a copy of the expression wrapped with the `abs` function. + /// + /// let x = Expression("x") + /// x.absoluteValue + /// // abs("x") + /// + /// - Returns: A copy of the expression wrapped with the `abs` function. + public var absoluteValue : Expression { + return "abs".wrap(self) + } + +} + +extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Number { + + /// Builds a copy of the expression wrapped with the `abs` function. + /// + /// let x = Expression("x") + /// x.absoluteValue + /// // abs("x") + /// + /// - Returns: A copy of the expression wrapped with the `abs` function. + public var absoluteValue : Expression { + return "abs".wrap(self) + } + +} + +extension ExpressionType where UnderlyingType == Double { + + /// Builds a copy of the expression wrapped with the `round` function. + /// + /// let salary = Expression("salary") + /// salary.round() + /// // round("salary") + /// salary.round(2) + /// // round("salary", 2) + /// + /// - Returns: A copy of the expression wrapped with the `round` function. + public func round(_ precision: Int? = nil) -> Expression { + guard let precision = precision else { + return wrap([self]) + } + return wrap([self, Int(precision)]) + } + +} + +extension ExpressionType where UnderlyingType == Double? { + + /// Builds a copy of the expression wrapped with the `round` function. + /// + /// let salary = Expression("salary") + /// salary.round() + /// // round("salary") + /// salary.round(2) + /// // round("salary", 2) + /// + /// - Returns: A copy of the expression wrapped with the `round` function. + public func round(_ precision: Int? = nil) -> Expression { + guard let precision = precision else { + return wrap(self) + } + return wrap([self, Int(precision)]) + } + +} + +extension ExpressionType where UnderlyingType : Value, UnderlyingType.Datatype == Int64 { + + /// Builds an expression representing the `random` function. + /// + /// Expression.random() + /// // random() + /// + /// - Returns: An expression calling the `random` function. + public static func random() -> Expression { + return "random".wrap([]) + } + +} + +extension ExpressionType where UnderlyingType == Data { + + /// Builds an expression representing the `randomblob` function. + /// + /// Expression.random(16) + /// // randomblob(16) + /// + /// - Parameter length: Length in bytes. + /// + /// - Returns: An expression calling the `randomblob` function. + public static func random(_ length: Int) -> Expression { + return "randomblob".wrap([]) + } + + /// Builds an expression representing the `zeroblob` function. + /// + /// Expression.allZeros(16) + /// // zeroblob(16) + /// + /// - Parameter length: Length in bytes. + /// + /// - Returns: An expression calling the `zeroblob` function. + public static func allZeros(_ length: Int) -> Expression { + return "zeroblob".wrap([]) + } + + /// Builds a copy of the expression wrapped with the `length` function. + /// + /// let data = Expression("data") + /// data.length + /// // length("data") + /// + /// - Returns: A copy of the expression wrapped with the `length` function. + public var length: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType == Data? { + + /// Builds a copy of the expression wrapped with the `length` function. + /// + /// let data = Expression("data") + /// data.length + /// // length("data") + /// + /// - Returns: A copy of the expression wrapped with the `length` function. + public var length: Expression { + return wrap(self) + } + +} + +extension ExpressionType where UnderlyingType == String { + + /// Builds a copy of the expression wrapped with the `length` function. + /// + /// let name = Expression("name") + /// name.length + /// // length("name") + /// + /// - Returns: A copy of the expression wrapped with the `length` function. + public var length: Expression { + return wrap(self) + } + + /// Builds a copy of the expression wrapped with the `lower` function. + /// + /// let name = Expression("name") + /// name.lowercaseString + /// // lower("name") + /// + /// - Returns: A copy of the expression wrapped with the `lower` function. + public var lowercaseString: Expression { + return "lower".wrap(self) + } + + /// Builds a copy of the expression wrapped with the `upper` function. + /// + /// let name = Expression("name") + /// name.uppercaseString + /// // lower("name") + /// + /// - Returns: A copy of the expression wrapped with the `upper` function. + public var uppercaseString: Expression { + return "upper".wrap(self) + } + + /// Builds a copy of the expression appended with a `LIKE` query against the + /// given pattern. + /// + /// let email = Expression("email") + /// email.like("%@example.com") + /// // "email" LIKE '%@example.com' + /// email.like("99\\%@%", escape: "\\") + /// // "email" LIKE '99\%@%' ESCAPE '\' + /// + /// - Parameters: + /// + /// - pattern: A pattern to match. + /// + /// - escape: An (optional) character designated for escaping + /// pattern-matching characters (*i.e.*, the `%` and `_` characters). + /// + /// - Returns: A copy of the expression appended with a `LIKE` query against + /// the given pattern. + public func like(_ pattern: String, escape character: Character? = nil) -> Expression { + guard let character = character else { + return "LIKE".infix(self, pattern) + } + return Expression("(\(template) LIKE ? ESCAPE ?)", bindings + [pattern, String(character)]) + } + + /// Builds a copy of the expression appended with a `GLOB` query against the + /// given pattern. + /// + /// let path = Expression("path") + /// path.glob("*.png") + /// // "path" GLOB '*.png' + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression appended with a `GLOB` query against + /// the given pattern. + public func glob(_ pattern: String) -> Expression { + return "GLOB".infix(self, pattern) + } + + /// Builds a copy of the expression appended with a `MATCH` query against + /// the given pattern. + /// + /// let title = Expression("title") + /// title.match("swift AND programming") + /// // "title" MATCH 'swift AND programming' + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression appended with a `MATCH` query + /// against the given pattern. + public func match(_ pattern: String) -> Expression { + return "MATCH".infix(self, pattern) + } + + /// Builds a copy of the expression appended with a `REGEXP` query against + /// the given pattern. + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression appended with a `REGEXP` query + /// against the given pattern. + public func regexp(_ pattern: String) -> Expression { + return "REGEXP".infix(self, pattern) + } + + /// Builds a copy of the expression appended with a `COLLATE` clause with + /// the given sequence. + /// + /// let name = Expression("name") + /// name.collate(.Nocase) + /// // "name" COLLATE NOCASE + /// + /// - Parameter collation: A collating sequence. + /// + /// - Returns: A copy of the expression appended with a `COLLATE` clause + /// with the given sequence. + public func collate(_ collation: Collation) -> Expression { + return "COLLATE".infix(self, collation) + } + + /// Builds a copy of the expression wrapped with the `ltrim` function. + /// + /// let name = Expression("name") + /// name.ltrim() + /// // ltrim("name") + /// name.ltrim([" ", "\t"]) + /// // ltrim("name", ' \t') + /// + /// - Parameter characters: A set of characters to trim. + /// + /// - Returns: A copy of the expression wrapped with the `ltrim` function. + public func ltrim(_ characters: Set? = nil) -> Expression { + guard let characters = characters else { + return wrap(self) + } + return wrap([self, String(characters)]) + } + + /// Builds a copy of the expression wrapped with the `rtrim` function. + /// + /// let name = Expression("name") + /// name.rtrim() + /// // rtrim("name") + /// name.rtrim([" ", "\t"]) + /// // rtrim("name", ' \t') + /// + /// - Parameter characters: A set of characters to trim. + /// + /// - Returns: A copy of the expression wrapped with the `rtrim` function. + public func rtrim(_ characters: Set? = nil) -> Expression { + guard let characters = characters else { + return wrap(self) + } + return wrap([self, String(characters)]) + } + + /// Builds a copy of the expression wrapped with the `trim` function. + /// + /// let name = Expression("name") + /// name.trim() + /// // trim("name") + /// name.trim([" ", "\t"]) + /// // trim("name", ' \t') + /// + /// - Parameter characters: A set of characters to trim. + /// + /// - Returns: A copy of the expression wrapped with the `trim` function. + public func trim(_ characters: Set? = nil) -> Expression { + guard let characters = characters else { + return wrap([self]) + } + return wrap([self, String(characters)]) + } + + /// Builds a copy of the expression wrapped with the `replace` function. + /// + /// let email = Expression("email") + /// email.replace("@mac.com", with: "@icloud.com") + /// // replace("email", '@mac.com', '@icloud.com') + /// + /// - Parameters: + /// + /// - pattern: A pattern to match. + /// + /// - replacement: The replacement string. + /// + /// - Returns: A copy of the expression wrapped with the `replace` function. + public func replace(_ pattern: String, with replacement: String) -> Expression { + return "replace".wrap([self, pattern, replacement]) + } + + public func substring(_ location: Int, length: Int? = nil) -> Expression { + guard let length = length else { + return "substr".wrap([self, location]) + } + return "substr".wrap([self, location, length]) + } + + public subscript(range: Range) -> Expression { + return substring(range.lowerBound, length: range.upperBound - range.lowerBound) + } + +} + +extension ExpressionType where UnderlyingType == String? { + + /// Builds a copy of the expression wrapped with the `length` function. + /// + /// let name = Expression("name") + /// name.length + /// // length("name") + /// + /// - Returns: A copy of the expression wrapped with the `length` function. + public var length: Expression { + return wrap(self) + } + + /// Builds a copy of the expression wrapped with the `lower` function. + /// + /// let name = Expression("name") + /// name.lowercaseString + /// // lower("name") + /// + /// - Returns: A copy of the expression wrapped with the `lower` function. + public var lowercaseString: Expression { + return "lower".wrap(self) + } + + /// Builds a copy of the expression wrapped with the `upper` function. + /// + /// let name = Expression("name") + /// name.uppercaseString + /// // lower("name") + /// + /// - Returns: A copy of the expression wrapped with the `upper` function. + public var uppercaseString: Expression { + return "upper".wrap(self) + } + + /// Builds a copy of the expression appended with a `LIKE` query against the + /// given pattern. + /// + /// let email = Expression("email") + /// email.like("%@example.com") + /// // "email" LIKE '%@example.com' + /// email.like("99\\%@%", escape: "\\") + /// // "email" LIKE '99\%@%' ESCAPE '\' + /// + /// - Parameters: + /// + /// - pattern: A pattern to match. + /// + /// - escape: An (optional) character designated for escaping + /// pattern-matching characters (*i.e.*, the `%` and `_` characters). + /// + /// - Returns: A copy of the expression appended with a `LIKE` query against + /// the given pattern. + public func like(_ pattern: String, escape character: Character? = nil) -> Expression { + guard let character = character else { + return "LIKE".infix(self, pattern) + } + return Expression("(\(template) LIKE ? ESCAPE ?)", bindings + [pattern, String(character)]) + } + + /// Builds a copy of the expression appended with a `GLOB` query against the + /// given pattern. + /// + /// let path = Expression("path") + /// path.glob("*.png") + /// // "path" GLOB '*.png' + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression appended with a `GLOB` query against + /// the given pattern. + public func glob(_ pattern: String) -> Expression { + return "GLOB".infix(self, pattern) + } + + /// Builds a copy of the expression appended with a `MATCH` query against + /// the given pattern. + /// + /// let title = Expression("title") + /// title.match("swift AND programming") + /// // "title" MATCH 'swift AND programming' + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression appended with a `MATCH` query + /// against the given pattern. + public func match(_ pattern: String) -> Expression { + return "MATCH".infix(self, pattern) + } + + /// Builds a copy of the expression appended with a `REGEXP` query against + /// the given pattern. + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression appended with a `REGEXP` query + /// against the given pattern. + public func regexp(_ pattern: String) -> Expression { + return "REGEXP".infix(self, pattern) + } + + /// Builds a copy of the expression appended with a `COLLATE` clause with + /// the given sequence. + /// + /// let name = Expression("name") + /// name.collate(.Nocase) + /// // "name" COLLATE NOCASE + /// + /// - Parameter collation: A collating sequence. + /// + /// - Returns: A copy of the expression appended with a `COLLATE` clause + /// with the given sequence. + public func collate(_ collation: Collation) -> Expression { + return "COLLATE".infix(self, collation) + } + + /// Builds a copy of the expression wrapped with the `ltrim` function. + /// + /// let name = Expression("name") + /// name.ltrim() + /// // ltrim("name") + /// name.ltrim([" ", "\t"]) + /// // ltrim("name", ' \t') + /// + /// - Parameter characters: A set of characters to trim. + /// + /// - Returns: A copy of the expression wrapped with the `ltrim` function. + public func ltrim(_ characters: Set? = nil) -> Expression { + guard let characters = characters else { + return wrap(self) + } + return wrap([self, String(characters)]) + } + + /// Builds a copy of the expression wrapped with the `rtrim` function. + /// + /// let name = Expression("name") + /// name.rtrim() + /// // rtrim("name") + /// name.rtrim([" ", "\t"]) + /// // rtrim("name", ' \t') + /// + /// - Parameter characters: A set of characters to trim. + /// + /// - Returns: A copy of the expression wrapped with the `rtrim` function. + public func rtrim(_ characters: Set? = nil) -> Expression { + guard let characters = characters else { + return wrap(self) + } + return wrap([self, String(characters)]) + } + + /// Builds a copy of the expression wrapped with the `trim` function. + /// + /// let name = Expression("name") + /// name.trim() + /// // trim("name") + /// name.trim([" ", "\t"]) + /// // trim("name", ' \t') + /// + /// - Parameter characters: A set of characters to trim. + /// + /// - Returns: A copy of the expression wrapped with the `trim` function. + public func trim(_ characters: Set? = nil) -> Expression { + guard let characters = characters else { + return wrap(self) + } + return wrap([self, String(characters)]) + } + + /// Builds a copy of the expression wrapped with the `replace` function. + /// + /// let email = Expression("email") + /// email.replace("@mac.com", with: "@icloud.com") + /// // replace("email", '@mac.com', '@icloud.com') + /// + /// - Parameters: + /// + /// - pattern: A pattern to match. + /// + /// - replacement: The replacement string. + /// + /// - Returns: A copy of the expression wrapped with the `replace` function. + public func replace(_ pattern: String, with replacement: String) -> Expression { + return "replace".wrap([self, pattern, replacement]) + } + + /// Builds a copy of the expression wrapped with the `substr` function. + /// + /// let title = Expression("title") + /// title.substr(-100) + /// // substr("title", -100) + /// title.substr(0, length: 100) + /// // substr("title", 0, 100) + /// + /// - Parameters: + /// + /// - location: The substring’s start index. + /// + /// - length: An optional substring length. + /// + /// - Returns: A copy of the expression wrapped with the `substr` function. + public func substring(_ location: Int, length: Int? = nil) -> Expression { + guard let length = length else { + return "substr".wrap([self, location]) + } + return "substr".wrap([self, location, length]) + } + + /// Builds a copy of the expression wrapped with the `substr` function. + /// + /// let title = Expression("title") + /// title[0..<100] + /// // substr("title", 0, 100) + /// + /// - Parameter range: The character index range of the substring. + /// + /// - Returns: A copy of the expression wrapped with the `substr` function. + public subscript(range: Range) -> Expression { + return substring(range.lowerBound, length: range.upperBound - range.lowerBound) + } + +} + +extension Collection where Iterator.Element : Value, IndexDistance == Int { + + /// Builds a copy of the expression prepended with an `IN` check against the + /// collection. + /// + /// let name = Expression("name") + /// ["alice", "betty"].contains(name) + /// // "name" IN ('alice', 'betty') + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression prepended with an `IN` check against + /// the collection. + public func contains(_ expression: Expression) -> Expression { + let templates = [String](repeating: "?", count: count).joined(separator: ", ") + return "IN".infix(expression, Expression("(\(templates))", map { $0.datatypeValue })) + } + + /// Builds a copy of the expression prepended with an `IN` check against the + /// collection. + /// + /// let name = Expression("name") + /// ["alice", "betty"].contains(name) + /// // "name" IN ('alice', 'betty') + /// + /// - Parameter pattern: A pattern to match. + /// + /// - Returns: A copy of the expression prepended with an `IN` check against + /// the collection. + public func contains(_ expression: Expression) -> Expression { + let templates = [String](repeating: "?", count: count).joined(separator: ", ") + return "IN".infix(expression, Expression("(\(templates))", map { $0.datatypeValue })) + } + +} + +/// Builds a copy of the given expressions wrapped with the `ifnull` function. +/// +/// let name = Expression("name") +/// name ?? "An Anonymous Coward" +/// // ifnull("name", 'An Anonymous Coward') +/// +/// - Parameters: +/// +/// - optional: An optional expression. +/// +/// - defaultValue: A fallback value for when the optional expression is +/// `nil`. +/// +/// - Returns: A copy of the given expressions wrapped with the `ifnull` +/// function. +public func ??(optional: Expression, defaultValue: V) -> Expression { + return "ifnull".wrap([optional, defaultValue]) +} + +/// Builds a copy of the given expressions wrapped with the `ifnull` function. +/// +/// let nick = Expression("nick") +/// let name = Expression("name") +/// nick ?? name +/// // ifnull("nick", "name") +/// +/// - Parameters: +/// +/// - optional: An optional expression. +/// +/// - defaultValue: A fallback expression for when the optional expression is +/// `nil`. +/// +/// - Returns: A copy of the given expressions wrapped with the `ifnull` +/// function. +public func ??(optional: Expression, defaultValue: Expression) -> Expression { + return "ifnull".wrap([optional, defaultValue]) +} + +/// Builds a copy of the given expressions wrapped with the `ifnull` function. +/// +/// let nick = Expression("nick") +/// let name = Expression("name") +/// nick ?? name +/// // ifnull("nick", "name") +/// +/// - Parameters: +/// +/// - optional: An optional expression. +/// +/// - defaultValue: A fallback expression for when the optional expression is +/// `nil`. +/// +/// - Returns: A copy of the given expressions wrapped with the `ifnull` +/// function. +public func ??(optional: Expression, defaultValue: Expression) -> Expression { + return "ifnull".wrap([optional, defaultValue]) +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift new file mode 100644 index 0000000000..64b54edb75 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift @@ -0,0 +1,136 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +public extension Connection { + + /// Creates or redefines a custom SQL function. + /// + /// - Parameters: + /// + /// - function: The name of the function to create or redefine. + /// + /// - deterministic: Whether or not the function is deterministic (_i.e._ + /// the function always returns the same result for a given input). + /// + /// Default: `false` + /// + /// - block: A block of code to run when the function is called. + /// The assigned types must be explicit. + /// + /// - Returns: A closure returning an SQL expression to call the function. + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping () -> Z) throws -> (() -> Expression) { + let fn = try createFunction(function, 0, deterministic) { _ in block() } + return { fn([]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping () -> Z?) throws -> (() -> Expression) { + let fn = try createFunction(function, 0, deterministic) { _ in block() } + return { fn([]) } + } + + // MARK: - + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A) -> Z) throws -> ((Expression) -> Expression) { + let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0])) } + return { arg in fn([arg]) } + } + + public func createFunction(function: String, deterministic: Bool = false, _ block: @escaping (A?) -> Z) throws -> ((Expression) -> Expression) { + let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value)) } + return { arg in fn([arg]) } + } + + public func createFunction(function: String, deterministic: Bool = false, _ block: @escaping (A) -> Z?) throws -> ((Expression) -> Expression) { + let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0])) } + return { arg in fn([arg]) } + } + + public func createFunction(function: String, deterministic: Bool = false, _ block: @escaping (A?) -> Z?) throws -> ((Expression) -> Expression) { + let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value)) } + return { arg in fn([arg]) } + } + + // MARK: - + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B) -> Z) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), value(args[1])) } + return { a, b in fn([a, b]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B) -> Z) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), value(args[1])) } + return { a, b in fn([a, b]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B?) -> Z) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), args[1].map(value)) } + return { a, b in fn([a, b]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B) -> Z?) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), value(args[1])) } + return { a, b in fn([a, b]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B?) -> Z) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), args[1].map(value)) } + return { a, b in fn([a, b]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B) -> Z?) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), value(args[1])) } + return { a, b in fn([a, b]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B?) -> Z?) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), args[1].map(value)) } + return { a, b in fn([a, b]) } + } + + public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B?) -> Z?) throws -> (Expression, Expression) -> Expression { + let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), args[1].map(value)) } + return { a, b in fn([a, b]) } + } + + // MARK: - + + fileprivate func createFunction(_ function: String, _ argumentCount: UInt, _ deterministic: Bool, _ block: @escaping ([Binding?]) -> Z) throws -> (([Expressible]) -> Expression) { + createFunction(function, argumentCount: argumentCount, deterministic: deterministic) { arguments in + block(arguments).datatypeValue + } + return { arguments in + function.quote().wrap(", ".join(arguments)) + } + } + + fileprivate func createFunction(_ function: String, _ argumentCount: UInt, _ deterministic: Bool, _ block: @escaping ([Binding?]) -> Z?) throws -> (([Expressible]) -> Expression) { + createFunction(function, argumentCount: argumentCount, deterministic: deterministic) { arguments in + block(arguments)?.datatypeValue + } + return { arguments in + function.quote().wrap(", ".join(arguments)) + } + } + +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Expression.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Expression.swift new file mode 100644 index 0000000000..3198901c55 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Expression.swift @@ -0,0 +1,147 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +public protocol ExpressionType : Expressible { // extensions cannot have inheritance clauses + + associatedtype UnderlyingType = Void + + var template: String { get } + var bindings: [Binding?] { get } + + init(_ template: String, _ bindings: [Binding?]) + +} + +extension ExpressionType { + + public init(literal: String) { + self.init(literal, []) + } + + public init(_ identifier: String) { + self.init(literal: identifier.quote()) + } + + public init(_ expression: U) { + self.init(expression.template, expression.bindings) + } + +} + +/// An `Expression` represents a raw SQL fragment and any associated bindings. +public struct Expression : ExpressionType { + + public typealias UnderlyingType = Datatype + + public var template: String + public var bindings: [Binding?] + + public init(_ template: String, _ bindings: [Binding?]) { + self.template = template + self.bindings = bindings + } + +} + +public protocol Expressible { + + var expression: Expression { get } + +} + +extension Expressible { + + // naïve compiler for statements that can’t be bound, e.g., CREATE TABLE + // FIXME: use @testable and make internal + public func asSQL() -> String { + let expressed = expression + var idx = 0 + return expressed.template.characters.reduce("") { template, character in + let transcoded: String + + if character == "?" { + transcoded = transcode(expressed.bindings[idx]) + idx += 1 + } else { + transcoded = String(character) + } + return template + transcoded + } + } + +} + +extension ExpressionType { + + public var expression: Expression { + return Expression(template, bindings) + } + + public var asc: Expressible { + return " ".join([self, Expression(literal: "ASC")]) + } + + public var desc: Expressible { + return " ".join([self, Expression(literal: "DESC")]) + } + +} + +extension ExpressionType where UnderlyingType : Value { + + public init(value: UnderlyingType) { + self.init("?", [value.datatypeValue]) + } + +} + +extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value { + + public static var null: Self { + return self.init(value: nil) + } + + public init(value: UnderlyingType.WrappedType?) { + self.init("?", [value?.datatypeValue]) + } + +} + +extension Value { + + public var expression: Expression { + return Expression(value: self).expression + } + +} + +public let rowid = Expression("ROWID") + +public func cast(_ expression: Expression) -> Expression { + return Expression("CAST (\(expression.template) AS \(U.declaredDatatype))", expression.bindings) +} + +public func cast(_ expression: Expression) -> Expression { + return Expression("CAST (\(expression.template) AS \(U.declaredDatatype))", expression.bindings) +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Operators.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Operators.swift new file mode 100644 index 0000000000..fdd293be71 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Operators.swift @@ -0,0 +1,541 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +// TODO: use `@warn_unused_result` by the time operator functions support it + +public func +(lhs: Expression, rhs: Expression) -> Expression { + return "||".infix(lhs, rhs) +} + +public func +(lhs: Expression, rhs: Expression) -> Expression { + return "||".infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: Expression) -> Expression { + return "||".infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: Expression) -> Expression { + return "||".infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: String) -> Expression { + return "||".infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: String) -> Expression { + return "||".infix(lhs, rhs) +} +public func +(lhs: String, rhs: Expression) -> Expression { + return "||".infix(lhs, rhs) +} +public func +(lhs: String, rhs: Expression) -> Expression { + return "||".infix(lhs, rhs) +} + +// MARK: - + +public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func +(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func +(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func +(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} + +public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func -(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func -(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func -(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func -(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} + +public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func *(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func *(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func *(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func *(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} + +public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func /(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func /(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func /(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} +public func /(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { + return infix(lhs, rhs) +} + +public prefix func -(rhs: Expression) -> Expression where V.Datatype : Number { + return wrap(rhs) +} +public prefix func -(rhs: Expression) -> Expression where V.Datatype : Number { + return wrap(rhs) +} + +// MARK: - + +public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func %(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func %(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func %(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func %(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} + +public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func <<(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func <<(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func <<(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func <<(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} + +public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func >>(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func >>(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func >>(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func >>(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} + +public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func &(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func &(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func &(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func &(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} + +public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func |(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func |(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func |(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} +public func |(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return infix(lhs, rhs) +} + +public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} +public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} +public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} +public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} +public func ^(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} +public func ^(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} +public func ^(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} +public func ^(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { + return (~(lhs & rhs)) & (lhs | rhs) +} + +public prefix func ~(rhs: Expression) -> Expression where V.Datatype == Int64 { + return wrap(rhs) +} +public prefix func ~(rhs: Expression) -> Expression where V.Datatype == Int64 { + return wrap(rhs) +} + +// MARK: - + +public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return "=".infix(lhs, rhs) +} +public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return "=".infix(lhs, rhs) +} +public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return "=".infix(lhs, rhs) +} +public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return "=".infix(lhs, rhs) +} +public func ==(lhs: Expression, rhs: V) -> Expression where V.Datatype : Equatable { + return "=".infix(lhs, rhs) +} +public func ==(lhs: Expression, rhs: V?) -> Expression where V.Datatype : Equatable { + guard let rhs = rhs else { return "IS".infix(lhs, Expression(value: nil)) } + return "=".infix(lhs, rhs) +} +public func ==(lhs: V, rhs: Expression) -> Expression where V.Datatype : Equatable { + return "=".infix(lhs, rhs) +} +public func ==(lhs: V?, rhs: Expression) -> Expression where V.Datatype : Equatable { + guard let lhs = lhs else { return "IS".infix(Expression(value: nil), rhs) } + return "=".infix(lhs, rhs) +} + +public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return infix(lhs, rhs) +} +public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return infix(lhs, rhs) +} +public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return infix(lhs, rhs) +} +public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { + return infix(lhs, rhs) +} +public func !=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Equatable { + return infix(lhs, rhs) +} +public func !=(lhs: Expression, rhs: V?) -> Expression where V.Datatype : Equatable { + guard let rhs = rhs else { return "IS NOT".infix(lhs, Expression(value: nil)) } + return infix(lhs, rhs) +} +public func !=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Equatable { + return infix(lhs, rhs) +} +public func !=(lhs: V?, rhs: Expression) -> Expression where V.Datatype : Equatable { + guard let lhs = lhs else { return "IS NOT".infix(Expression(value: nil), rhs) } + return infix(lhs, rhs) +} + +public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} + +public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func >=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} + +public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} + +public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} +public func <=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { + return infix(lhs, rhs) +} + +public func ~=(lhs: ClosedRange, rhs: Expression) -> Expression where V.Datatype : Binding & Comparable { + return Expression("\(rhs.template) BETWEEN ? AND ?", rhs.bindings + [lhs.lowerBound as? Binding, lhs.upperBound as? Binding]) +} +public func ~=(lhs: ClosedRange, rhs: Expression) -> Expression where V.Datatype : Binding & Comparable { + return Expression("\(rhs.template) BETWEEN ? AND ?", rhs.bindings + [lhs.lowerBound as? Binding, lhs.upperBound as? Binding]) +} + +// MARK: - + +public func &&(lhs: Expression, rhs: Expression) -> Expression { + return "AND".infix(lhs, rhs) +} +public func &&(lhs: Expression, rhs: Expression) -> Expression { + return "AND".infix(lhs, rhs) +} +public func &&(lhs: Expression, rhs: Expression) -> Expression { + return "AND".infix(lhs, rhs) +} +public func &&(lhs: Expression, rhs: Expression) -> Expression { + return "AND".infix(lhs, rhs) +} +public func &&(lhs: Expression, rhs: Bool) -> Expression { + return "AND".infix(lhs, rhs) +} +public func &&(lhs: Expression, rhs: Bool) -> Expression { + return "AND".infix(lhs, rhs) +} +public func &&(lhs: Bool, rhs: Expression) -> Expression { + return "AND".infix(lhs, rhs) +} +public func &&(lhs: Bool, rhs: Expression) -> Expression { + return "AND".infix(lhs, rhs) +} + +public func ||(lhs: Expression, rhs: Expression) -> Expression { + return "OR".infix(lhs, rhs) +} +public func ||(lhs: Expression, rhs: Expression) -> Expression { + return "OR".infix(lhs, rhs) +} +public func ||(lhs: Expression, rhs: Expression) -> Expression { + return "OR".infix(lhs, rhs) +} +public func ||(lhs: Expression, rhs: Expression) -> Expression { + return "OR".infix(lhs, rhs) +} +public func ||(lhs: Expression, rhs: Bool) -> Expression { + return "OR".infix(lhs, rhs) +} +public func ||(lhs: Expression, rhs: Bool) -> Expression { + return "OR".infix(lhs, rhs) +} +public func ||(lhs: Bool, rhs: Expression) -> Expression { + return "OR".infix(lhs, rhs) +} +public func ||(lhs: Bool, rhs: Expression) -> Expression { + return "OR".infix(lhs, rhs) +} + +public prefix func !(rhs: Expression) -> Expression { + return "NOT ".wrap(rhs) +} +public prefix func !(rhs: Expression) -> Expression { + return "NOT ".wrap(rhs) +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Query.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Query.swift new file mode 100644 index 0000000000..c9d2ea9cc5 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Query.swift @@ -0,0 +1,1162 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +public protocol QueryType : Expressible { + + var clauses: QueryClauses { get set } + + init(_ name: String, database: String?) + +} + +public protocol SchemaType : QueryType { + + static var identifier: String { get } + +} + +extension SchemaType { + + /// Builds a copy of the query with the `SELECT` clause applied. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// let email = Expression("email") + /// + /// users.select(id, email) + /// // SELECT "id", "email" FROM "users" + /// + /// - Parameter all: A list of expressions to select. + /// + /// - Returns: A query with the given `SELECT` clause applied. + public func select(_ column1: Expressible, _ more: Expressible...) -> Self { + return select(false, [column1] + more) + } + + /// Builds a copy of the query with the `SELECT DISTINCT` clause applied. + /// + /// let users = Table("users") + /// let email = Expression("email") + /// + /// users.select(distinct: email) + /// // SELECT DISTINCT "email" FROM "users" + /// + /// - Parameter columns: A list of expressions to select. + /// + /// - Returns: A query with the given `SELECT DISTINCT` clause applied. + public func select(distinct column1: Expressible, _ more: Expressible...) -> Self { + return select(true, [column1] + more) + } + + /// Builds a copy of the query with the `SELECT` clause applied. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// let email = Expression("email") + /// + /// users.select([id, email]) + /// // SELECT "id", "email" FROM "users" + /// + /// - Parameter all: A list of expressions to select. + /// + /// - Returns: A query with the given `SELECT` clause applied. + public func select(_ all: [Expressible]) -> Self { + return select(false, all) + } + + /// Builds a copy of the query with the `SELECT DISTINCT` clause applied. + /// + /// let users = Table("users") + /// let email = Expression("email") + /// + /// users.select(distinct: [email]) + /// // SELECT DISTINCT "email" FROM "users" + /// + /// - Parameter columns: A list of expressions to select. + /// + /// - Returns: A query with the given `SELECT DISTINCT` clause applied. + public func select(distinct columns: [Expressible]) -> Self { + return select(true, columns) + } + + /// Builds a copy of the query with the `SELECT *` clause applied. + /// + /// let users = Table("users") + /// + /// users.select(*) + /// // SELECT * FROM "users" + /// + /// - Parameter star: A star literal. + /// + /// - Returns: A query with the given `SELECT *` clause applied. + public func select(_ star: Star) -> Self { + return select([star(nil, nil)]) + } + + /// Builds a copy of the query with the `SELECT DISTINCT *` clause applied. + /// + /// let users = Table("users") + /// + /// users.select(distinct: *) + /// // SELECT DISTINCT * FROM "users" + /// + /// - Parameter star: A star literal. + /// + /// - Returns: A query with the given `SELECT DISTINCT *` clause applied. + public func select(distinct star: Star) -> Self { + return select(distinct: [star(nil, nil)]) + } + + /// Builds a scalar copy of the query with the `SELECT` clause applied. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// + /// users.select(id) + /// // SELECT "id" FROM "users" + /// + /// - Parameter all: A list of expressions to select. + /// + /// - Returns: A query with the given `SELECT` clause applied. + public func select(_ column: Expression) -> ScalarQuery { + return select(false, [column]) + } + public func select(_ column: Expression) -> ScalarQuery { + return select(false, [column]) + } + + /// Builds a scalar copy of the query with the `SELECT DISTINCT` clause + /// applied. + /// + /// let users = Table("users") + /// let email = Expression("email") + /// + /// users.select(distinct: email) + /// // SELECT DISTINCT "email" FROM "users" + /// + /// - Parameter column: A list of expressions to select. + /// + /// - Returns: A query with the given `SELECT DISTINCT` clause applied. + public func select(distinct column: Expression) -> ScalarQuery { + return select(true, [column]) + } + public func select(distinct column: Expression) -> ScalarQuery { + return select(true, [column]) + } + + public var count: ScalarQuery { + return select(Expression.count(*)) + } + +} + +extension QueryType { + + fileprivate func select(_ distinct: Bool, _ columns: [Expressible]) -> Q { + var query = Q.init(clauses.from.name, database: clauses.from.database) + query.clauses = clauses + query.clauses.select = (distinct, columns) + return query + } + + // MARK: JOIN + + /// Adds a `JOIN` clause to the query. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// let posts = Table("posts") + /// let userId = Expression("user_id") + /// + /// users.join(posts, on: posts[userId] == users[id]) + /// // SELECT * FROM "users" INNER JOIN "posts" ON ("posts"."user_id" = "users"."id") + /// + /// - Parameters: + /// + /// - table: A query representing the other table. + /// + /// - condition: A boolean expression describing the join condition. + /// + /// - Returns: A query with the given `JOIN` clause applied. + public func join(_ table: QueryType, on condition: Expression) -> Self { + return join(table, on: Expression(condition)) + } + + /// Adds a `JOIN` clause to the query. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// let posts = Table("posts") + /// let userId = Expression("user_id") + /// + /// users.join(posts, on: posts[userId] == users[id]) + /// // SELECT * FROM "users" INNER JOIN "posts" ON ("posts"."user_id" = "users"."id") + /// + /// - Parameters: + /// + /// - table: A query representing the other table. + /// + /// - condition: A boolean expression describing the join condition. + /// + /// - Returns: A query with the given `JOIN` clause applied. + public func join(_ table: QueryType, on condition: Expression) -> Self { + return join(.inner, table, on: condition) + } + + /// Adds a `JOIN` clause to the query. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// let posts = Table("posts") + /// let userId = Expression("user_id") + /// + /// users.join(.LeftOuter, posts, on: posts[userId] == users[id]) + /// // SELECT * FROM "users" LEFT OUTER JOIN "posts" ON ("posts"."user_id" = "users"."id") + /// + /// - Parameters: + /// + /// - type: The `JOIN` operator. + /// + /// - table: A query representing the other table. + /// + /// - condition: A boolean expression describing the join condition. + /// + /// - Returns: A query with the given `JOIN` clause applied. + public func join(_ type: JoinType, _ table: QueryType, on condition: Expression) -> Self { + return join(type, table, on: Expression(condition)) + } + + /// Adds a `JOIN` clause to the query. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// let posts = Table("posts") + /// let userId = Expression("user_id") + /// + /// users.join(.LeftOuter, posts, on: posts[userId] == users[id]) + /// // SELECT * FROM "users" LEFT OUTER JOIN "posts" ON ("posts"."user_id" = "users"."id") + /// + /// - Parameters: + /// + /// - type: The `JOIN` operator. + /// + /// - table: A query representing the other table. + /// + /// - condition: A boolean expression describing the join condition. + /// + /// - Returns: A query with the given `JOIN` clause applied. + public func join(_ type: JoinType, _ table: QueryType, on condition: Expression) -> Self { + var query = self + query.clauses.join.append((type: type, query: table, condition: table.clauses.filters.map { condition && $0 } ?? condition as Expressible)) + return query + } + + // MARK: WHERE + + /// Adds a condition to the query’s `WHERE` clause. + /// + /// let users = Table("users") + /// let id = Expression("id") + /// + /// users.filter(id == 1) + /// // SELECT * FROM "users" WHERE ("id" = 1) + /// + /// - Parameter condition: A boolean expression to filter on. + /// + /// - Returns: A query with the given `WHERE` clause applied. + public func filter(_ predicate: Expression) -> Self { + return filter(Expression(predicate)) + } + + /// Adds a condition to the query’s `WHERE` clause. + /// + /// let users = Table("users") + /// let age = Expression("age") + /// + /// users.filter(age >= 35) + /// // SELECT * FROM "users" WHERE ("age" >= 35) + /// + /// - Parameter condition: A boolean expression to filter on. + /// + /// - Returns: A query with the given `WHERE` clause applied. + public func filter(_ predicate: Expression) -> Self { + var query = self + query.clauses.filters = query.clauses.filters.map { $0 && predicate } ?? predicate + return query + } + + /// Adds a condition to the query’s `WHERE` clause. + /// This is an alias for `filter(predicate)` + public func `where`(_ predicate: Expression) -> Self { + return `where`(Expression(predicate)) + } + + /// Adds a condition to the query’s `WHERE` clause. + /// This is an alias for `filter(predicate)` + public func `where`(_ predicate: Expression) -> Self { + return filter(predicate) + } + + // MARK: GROUP BY + + /// Sets a `GROUP BY` clause on the query. + /// + /// - Parameter by: A list of columns to group by. + /// + /// - Returns: A query with the given `GROUP BY` clause applied. + public func group(_ by: Expressible...) -> Self { + return group(by) + } + + /// Sets a `GROUP BY` clause on the query. + /// + /// - Parameter by: A list of columns to group by. + /// + /// - Returns: A query with the given `GROUP BY` clause applied. + public func group(_ by: [Expressible]) -> Self { + return group(by, nil) + } + + /// Sets a `GROUP BY`-`HAVING` clause on the query. + /// + /// - Parameters: + /// + /// - by: A column to group by. + /// + /// - having: A condition determining which groups are returned. + /// + /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. + public func group(_ by: Expressible, having: Expression) -> Self { + return group([by], having: having) + } + + /// Sets a `GROUP BY`-`HAVING` clause on the query. + /// + /// - Parameters: + /// + /// - by: A column to group by. + /// + /// - having: A condition determining which groups are returned. + /// + /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. + public func group(_ by: Expressible, having: Expression) -> Self { + return group([by], having: having) + } + + /// Sets a `GROUP BY`-`HAVING` clause on the query. + /// + /// - Parameters: + /// + /// - by: A list of columns to group by. + /// + /// - having: A condition determining which groups are returned. + /// + /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. + public func group(_ by: [Expressible], having: Expression) -> Self { + return group(by, Expression(having)) + } + + /// Sets a `GROUP BY`-`HAVING` clause on the query. + /// + /// - Parameters: + /// + /// - by: A list of columns to group by. + /// + /// - having: A condition determining which groups are returned. + /// + /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. + public func group(_ by: [Expressible], having: Expression) -> Self { + return group(by, having) + } + + fileprivate func group(_ by: [Expressible], _ having: Expression?) -> Self { + var query = self + query.clauses.group = (by, having) + return query + } + + // MARK: ORDER BY + + /// Sets an `ORDER BY` clause on the query. + /// + /// let users = Table("users") + /// let email = Expression("email") + /// let name = Expression("name") + /// + /// users.order(email.desc, name.asc) + /// // SELECT * FROM "users" ORDER BY "email" DESC, "name" ASC + /// + /// - Parameter by: An ordered list of columns and directions to sort by. + /// + /// - Returns: A query with the given `ORDER BY` clause applied. + public func order(_ by: Expressible...) -> Self { + return order(by) + } + + /// Sets an `ORDER BY` clause on the query. + /// + /// let users = Table("users") + /// let email = Expression("email") + /// let name = Expression("name") + /// + /// users.order([email.desc, name.asc]) + /// // SELECT * FROM "users" ORDER BY "email" DESC, "name" ASC + /// + /// - Parameter by: An ordered list of columns and directions to sort by. + /// + /// - Returns: A query with the given `ORDER BY` clause applied. + public func order(_ by: [Expressible]) -> Self { + var query = self + query.clauses.order = by + return query + } + + // MARK: LIMIT/OFFSET + + /// Sets the LIMIT clause (and resets any OFFSET clause) on the query. + /// + /// let users = Table("users") + /// + /// users.limit(20) + /// // SELECT * FROM "users" LIMIT 20 + /// + /// - Parameter length: The maximum number of rows to return (or `nil` to + /// return unlimited rows). + /// + /// - Returns: A query with the given LIMIT clause applied. + public func limit(_ length: Int?) -> Self { + return limit(length, nil) + } + + /// Sets LIMIT and OFFSET clauses on the query. + /// + /// let users = Table("users") + /// + /// users.limit(20, offset: 20) + /// // SELECT * FROM "users" LIMIT 20 OFFSET 20 + /// + /// - Parameters: + /// + /// - length: The maximum number of rows to return. + /// + /// - offset: The number of rows to skip. + /// + /// - Returns: A query with the given LIMIT and OFFSET clauses applied. + public func limit(_ length: Int, offset: Int) -> Self { + return limit(length, offset) + } + + // prevents limit(nil, offset: 5) + fileprivate func limit(_ length: Int?, _ offset: Int?) -> Self { + var query = self + query.clauses.limit = length.map { ($0, offset) } + return query + } + + // MARK: - Clauses + // + // MARK: SELECT + + // MARK: - + + fileprivate var selectClause: Expressible { + return " ".join([ + Expression(literal: clauses.select.distinct ? "SELECT DISTINCT" : "SELECT"), + ", ".join(clauses.select.columns), + Expression(literal: "FROM"), + tableName(alias: true) + ]) + } + + fileprivate var joinClause: Expressible? { + guard !clauses.join.isEmpty else { + return nil + } + + return " ".join(clauses.join.map { type, query, condition in + " ".join([ + Expression(literal: "\(type.rawValue) JOIN"), + query.tableName(alias: true), + Expression(literal: "ON"), + condition + ]) + }) + } + + fileprivate var whereClause: Expressible? { + guard let filters = clauses.filters else { + return nil + } + + return " ".join([ + Expression(literal: "WHERE"), + filters + ]) + } + + fileprivate var groupByClause: Expressible? { + guard let group = clauses.group else { + return nil + } + + let groupByClause = " ".join([ + Expression(literal: "GROUP BY"), + ", ".join(group.by) + ]) + + guard let having = group.having else { + return groupByClause + } + + return " ".join([ + groupByClause, + " ".join([ + Expression(literal: "HAVING"), + having + ]) + ]) + } + + fileprivate var orderClause: Expressible? { + guard !clauses.order.isEmpty else { + return nil + } + + return " ".join([ + Expression(literal: "ORDER BY"), + ", ".join(clauses.order) + ]) + } + + fileprivate var limitOffsetClause: Expressible? { + guard let limit = clauses.limit else { + return nil + } + + let limitClause = Expression(literal: "LIMIT \(limit.length)") + + guard let offset = limit.offset else { + return limitClause + } + + return " ".join([ + limitClause, + Expression(literal: "OFFSET \(offset)") + ]) + } + + // MARK: - + + public func alias(_ aliasName: String) -> Self { + var query = self + query.clauses.from = (clauses.from.name, aliasName, clauses.from.database) + return query + } + + // MARK: - Operations + // + // MARK: INSERT + + public func insert(_ value: Setter, _ more: Setter...) -> Insert { + return insert([value] + more) + } + + public func insert(_ values: [Setter]) -> Insert { + return insert(nil, values) + } + + public func insert(or onConflict: OnConflict, _ values: Setter...) -> Insert { + return insert(or: onConflict, values) + } + + public func insert(or onConflict: OnConflict, _ values: [Setter]) -> Insert { + return insert(onConflict, values) + } + + fileprivate func insert(_ or: OnConflict?, _ values: [Setter]) -> Insert { + let insert = values.reduce((columns: [Expressible](), values: [Expressible]())) { insert, setter in + (insert.columns + [setter.column], insert.values + [setter.value]) + } + + let clauses: [Expressible?] = [ + Expression(literal: "INSERT"), + or.map { Expression(literal: "OR \($0.rawValue)") }, + Expression(literal: "INTO"), + tableName(), + "".wrap(insert.columns) as Expression, + Expression(literal: "VALUES"), + "".wrap(insert.values) as Expression, + whereClause + ] + + return Insert(" ".join(clauses.flatMap { $0 }).expression) + } + + /// Runs an `INSERT` statement against the query with `DEFAULT VALUES`. + public func insert() -> Insert { + return Insert(" ".join([ + Expression(literal: "INSERT INTO"), + tableName(), + Expression(literal: "DEFAULT VALUES") + ]).expression) + } + + /// Runs an `INSERT` statement against the query with the results of another + /// query. + /// + /// - Parameter query: A query to `SELECT` results from. + /// + /// - Returns: The number of updated rows and statement. + public func insert(_ query: QueryType) -> Update { + return Update(" ".join([ + Expression(literal: "INSERT INTO"), + tableName(), + query.expression + ]).expression) + } + + // MARK: UPDATE + + public func update(_ values: Setter...) -> Update { + return update(values) + } + + public func update(_ values: [Setter]) -> Update { + let clauses: [Expressible?] = [ + Expression(literal: "UPDATE"), + tableName(), + Expression(literal: "SET"), + ", ".join(values.map { " = ".join([$0.column, $0.value]) }), + whereClause + ] + + return Update(" ".join(clauses.flatMap { $0 }).expression) + } + + // MARK: DELETE + + public func delete() -> Delete { + let clauses: [Expressible?] = [ + Expression(literal: "DELETE FROM"), + tableName(), + whereClause + ] + + return Delete(" ".join(clauses.flatMap { $0 }).expression) + } + + // MARK: EXISTS + + public var exists: Select { + return Select(" ".join([ + Expression(literal: "SELECT EXISTS"), + "".wrap(expression) as Expression + ]).expression) + } + + // MARK: - + + /// Prefixes a column expression with the query’s table name or alias. + /// + /// - Parameter column: A column expression. + /// + /// - Returns: A column expression namespaced with the query’s table name or + /// alias. + public func namespace(_ column: Expression) -> Expression { + return Expression(".".join([tableName(), column]).expression) + } + + // FIXME: rdar://problem/18673897 // subscript… + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + + public subscript(column: Expression) -> Expression { + return namespace(column) + } + public subscript(column: Expression) -> Expression { + return namespace(column) + } + + /// Prefixes a star with the query’s table name or alias. + /// + /// - Parameter star: A literal `*`. + /// + /// - Returns: A `*` expression namespaced with the query’s table name or + /// alias. + public subscript(star: Star) -> Expression { + return namespace(star(nil, nil)) + } + + // MARK: - + + // TODO: alias support + func tableName(alias aliased: Bool = false) -> Expressible { + guard let alias = clauses.from.alias , aliased else { + return database(namespace: clauses.from.alias ?? clauses.from.name) + } + + return " ".join([ + database(namespace: clauses.from.name), + Expression(literal: "AS"), + Expression(alias) + ]) + } + + func tableName(qualified: Bool) -> Expressible { + if qualified { + return tableName() + } + return Expression(clauses.from.alias ?? clauses.from.name) + } + + func database(namespace name: String) -> Expressible { + let name = Expression(name) + + guard let database = clauses.from.database else { + return name + } + + return ".".join([Expression(database), name]) + } + + public var expression: Expression { + let clauses: [Expressible?] = [ + selectClause, + joinClause, + whereClause, + groupByClause, + orderClause, + limitOffsetClause + ] + + return " ".join(clauses.flatMap { $0 }).expression + } + +} + +// TODO: decide: simplify the below with a boxed type instead + +/// Queries a collection of chainable helper functions and expressions to build +/// executable SQL statements. +public struct Table : SchemaType { + + public static let identifier = "TABLE" + + public var clauses: QueryClauses + + public init(_ name: String, database: String? = nil) { + clauses = QueryClauses(name, alias: nil, database: database) + } + +} + +public struct View : SchemaType { + + public static let identifier = "VIEW" + + public var clauses: QueryClauses + + public init(_ name: String, database: String? = nil) { + clauses = QueryClauses(name, alias: nil, database: database) + } + +} + +public struct VirtualTable : SchemaType { + + public static let identifier = "VIRTUAL TABLE" + + public var clauses: QueryClauses + + public init(_ name: String, database: String? = nil) { + clauses = QueryClauses(name, alias: nil, database: database) + } + +} + +// TODO: make `ScalarQuery` work in `QueryType.select()`, `.filter()`, etc. + +public struct ScalarQuery : QueryType { + + public var clauses: QueryClauses + + public init(_ name: String, database: String? = nil) { + clauses = QueryClauses(name, alias: nil, database: database) + } + +} + +// TODO: decide: simplify the below with a boxed type instead + +public struct Select : ExpressionType { + + public var template: String + public var bindings: [Binding?] + + public init(_ template: String, _ bindings: [Binding?]) { + self.template = template + self.bindings = bindings + } + +} + +public struct Insert : ExpressionType { + + public var template: String + public var bindings: [Binding?] + + public init(_ template: String, _ bindings: [Binding?]) { + self.template = template + self.bindings = bindings + } + +} + +public struct Update : ExpressionType { + + public var template: String + public var bindings: [Binding?] + + public init(_ template: String, _ bindings: [Binding?]) { + self.template = template + self.bindings = bindings + } + +} + +public struct Delete : ExpressionType { + + public var template: String + public var bindings: [Binding?] + + public init(_ template: String, _ bindings: [Binding?]) { + self.template = template + self.bindings = bindings + } + +} + +extension Connection { + + public func prepare(_ query: QueryType) throws -> AnySequence { + let expression = query.expression + let statement = try prepare(expression.template, expression.bindings) + + let columnNames: [String: Int] = try { + var (columnNames, idx) = ([String: Int](), 0) + column: for each in query.clauses.select.columns { + var names = each.expression.template.characters.split { $0 == "." }.map(String.init) + let column = names.removeLast() + let namespace = names.joined(separator: ".") + + func expandGlob(_ namespace: Bool) -> ((QueryType) throws -> Void) { + return { (query: QueryType) throws -> (Void) in + var q = type(of: query).init(query.clauses.from.name, database: query.clauses.from.database) + q.clauses.select = query.clauses.select + let e = q.expression + var names = try self.prepare(e.template, e.bindings).columnNames.map { $0.quote() } + if namespace { names = names.map { "\(query.tableName().expression.template).\($0)" } } + for name in names { columnNames[name] = idx; idx += 1 } + } + } + + if column == "*" { + var select = query + select.clauses.select = (false, [Expression(literal: "*") as Expressible]) + let queries = [select] + query.clauses.join.map { $0.query } + if !namespace.isEmpty { + for q in queries { + if q.tableName().expression.template == namespace { + try expandGlob(true)(q) + continue column + } + } + fatalError("no such table: \(namespace)") + } + for q in queries { + try expandGlob(query.clauses.join.count > 0)(q) + } + continue + } + + columnNames[each.expression.template] = idx + idx += 1 + } + return columnNames + }() + + return AnySequence { + AnyIterator { statement.next().map { Row(columnNames, $0) } } + } + } + + public func scalar(_ query: ScalarQuery) throws -> V { + let expression = query.expression + return value(try scalar(expression.template, expression.bindings)) + } + + public func scalar(_ query: ScalarQuery) throws -> V.ValueType? { + let expression = query.expression + guard let value = try scalar(expression.template, expression.bindings) as? V.Datatype else { return nil } + return V.fromDatatypeValue(value) + } + + public func scalar(_ query: Select) throws -> V { + let expression = query.expression + return value(try scalar(expression.template, expression.bindings)) + } + + public func scalar(_ query: Select) throws -> V.ValueType? { + let expression = query.expression + guard let value = try scalar(expression.template, expression.bindings) as? V.Datatype else { return nil } + return V.fromDatatypeValue(value) + } + + public func pluck(_ query: QueryType) throws -> Row? { + return try prepare(query.limit(1, query.clauses.limit?.offset)).makeIterator().next() + } + + /// Runs an `Insert` query. + /// + /// - SeeAlso: `QueryType.insert(value:_:)` + /// - SeeAlso: `QueryType.insert(values:)` + /// - SeeAlso: `QueryType.insert(or:_:)` + /// - SeeAlso: `QueryType.insert()` + /// + /// - Parameter query: An insert query. + /// + /// - Returns: The insert’s rowid. + @discardableResult public func run(_ query: Insert) throws -> Int64 { + let expression = query.expression + return try sync { + try self.run(expression.template, expression.bindings) + return self.lastInsertRowid + } + } + + /// Runs an `Update` query. + /// + /// - SeeAlso: `QueryType.insert(query:)` + /// - SeeAlso: `QueryType.update(values:)` + /// + /// - Parameter query: An update query. + /// + /// - Returns: The number of updated rows. + @discardableResult public func run(_ query: Update) throws -> Int { + let expression = query.expression + return try sync { + try self.run(expression.template, expression.bindings) + return self.changes + } + } + + /// Runs a `Delete` query. + /// + /// - SeeAlso: `QueryType.delete()` + /// + /// - Parameter query: A delete query. + /// + /// - Returns: The number of deleted rows. + @discardableResult public func run(_ query: Delete) throws -> Int { + let expression = query.expression + return try sync { + try self.run(expression.template, expression.bindings) + return self.changes + } + } + +} + +public struct Row { + + fileprivate let columnNames: [String: Int] + + fileprivate let values: [Binding?] + + fileprivate init(_ columnNames: [String: Int], _ values: [Binding?]) { + self.columnNames = columnNames + self.values = values + } + + /// Returns a row’s value for the given column. + /// + /// - Parameter column: An expression representing a column selected in a Query. + /// + /// - Returns: The value for the given column. + public func get(_ column: Expression) -> V { + return get(Expression(column))! + } + public func get(_ column: Expression) -> V? { + func valueAtIndex(_ idx: Int) -> V? { + guard let value = values[idx] as? V.Datatype else { return nil } + return (V.fromDatatypeValue(value) as? V)! + } + + guard let idx = columnNames[column.template] else { + let similar = Array(columnNames.keys).filter { $0.hasSuffix(".\(column.template)") } + + switch similar.count { + case 0: + fatalError("no such column '\(column.template)' in columns: \(columnNames.keys.sorted())") + case 1: + return valueAtIndex(columnNames[similar[0]]!) + default: + fatalError("ambiguous column '\(column.template)' (please disambiguate: \(similar))") + } + } + + return valueAtIndex(idx) + } + + // FIXME: rdar://problem/18673897 // subscript… + + public subscript(column: Expression) -> Blob { + return get(column) + } + public subscript(column: Expression) -> Blob? { + return get(column) + } + + public subscript(column: Expression) -> Bool { + return get(column) + } + public subscript(column: Expression) -> Bool? { + return get(column) + } + + public subscript(column: Expression) -> Double { + return get(column) + } + public subscript(column: Expression) -> Double? { + return get(column) + } + + public subscript(column: Expression) -> Int { + return get(column) + } + public subscript(column: Expression) -> Int? { + return get(column) + } + + public subscript(column: Expression) -> Int64 { + return get(column) + } + public subscript(column: Expression) -> Int64? { + return get(column) + } + + public subscript(column: Expression) -> String { + return get(column) + } + public subscript(column: Expression) -> String? { + return get(column) + } + +} + +/// Determines the join operator for a query’s `JOIN` clause. +public enum JoinType : String { + + /// A `CROSS` join. + case cross = "CROSS" + + /// An `INNER` join. + case inner = "INNER" + + /// A `LEFT OUTER` join. + case leftOuter = "LEFT OUTER" + +} + +/// ON CONFLICT resolutions. +public enum OnConflict: String { + + case replace = "REPLACE" + + case rollback = "ROLLBACK" + + case abort = "ABORT" + + case fail = "FAIL" + + case ignore = "IGNORE" + +} + +// MARK: - Private + +public struct QueryClauses { + + var select = (distinct: false, columns: [Expression(literal: "*") as Expressible]) + + var from: (name: String, alias: String?, database: String?) + + var join = [(type: JoinType, query: QueryType, condition: Expressible)]() + + var filters: Expression? + + var group: (by: [Expressible], having: Expression?)? + + var order = [Expressible]() + + var limit: (length: Int, offset: Int?)? + + fileprivate init(_ name: String, alias: String?, database: String?) { + self.from = (name, alias, database) + } + +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Schema.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Schema.swift new file mode 100644 index 0000000000..1388170e47 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Schema.swift @@ -0,0 +1,519 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +extension SchemaType { + + // MARK: - DROP TABLE / VIEW / VIRTUAL TABLE + + public func drop(ifExists: Bool = false) -> String { + return drop("TABLE", tableName(), ifExists) + } + +} + +extension Table { + + // MARK: - CREATE TABLE + + public func create(temporary: Bool = false, ifNotExists: Bool = false, block: (TableBuilder) -> Void) -> String { + let builder = TableBuilder() + + block(builder) + + let clauses: [Expressible?] = [ + create(Table.identifier, tableName(), temporary ? .Temporary : nil, ifNotExists), + "".wrap(builder.definitions) as Expression + ] + + return " ".join(clauses.flatMap { $0 }).asSQL() + } + + public func create(_ query: QueryType, temporary: Bool = false, ifNotExists: Bool = false) -> String { + let clauses: [Expressible?] = [ + create(Table.identifier, tableName(), temporary ? .Temporary : nil, ifNotExists), + Expression(literal: "AS"), + query + ] + + return " ".join(clauses.flatMap { $0 }).asSQL() + } + + // MARK: - ALTER TABLE … ADD COLUMN + + public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V) -> String { + return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, nil)) + } + + public func addColumn(_ name: Expression, check: Expression, defaultValue: V) -> String { + return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, nil)) + } + + public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V? = nil) -> String { + return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, nil)) + } + + public func addColumn(_ name: Expression, check: Expression, defaultValue: V? = nil) -> String { + return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, nil)) + } + + public func addColumn(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { + return addColumn(definition(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil)) + } + + public func addColumn(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { + return addColumn(definition(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil)) + } + + public func addColumn(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { + return addColumn(definition(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil)) + } + + public func addColumn(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { + return addColumn(definition(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil)) + } + + public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V, collate: Collation) -> String where V.Datatype == String { + return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, collate)) + } + + public func addColumn(_ name: Expression, check: Expression, defaultValue: V, collate: Collation) -> String where V.Datatype == String { + return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, collate)) + } + + public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V? = nil, collate: Collation) -> String where V.Datatype == String { + return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, collate)) + } + + public func addColumn(_ name: Expression, check: Expression, defaultValue: V? = nil, collate: Collation) -> String where V.Datatype == String { + return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, collate)) + } + + fileprivate func addColumn(_ expression: Expressible) -> String { + return " ".join([ + Expression(literal: "ALTER TABLE"), + tableName(), + Expression(literal: "ADD COLUMN"), + expression + ]).asSQL() + } + + // MARK: - ALTER TABLE … RENAME TO + + public func rename(_ to: Table) -> String { + return rename(to: to) + } + + // MARK: - CREATE INDEX + + public func createIndex(_ columns: Expressible...) -> String { + return createIndex(columns) + } + + public func createIndex(_ columns: [Expressible], unique: Bool = false, ifNotExists: Bool = false) -> String { + let clauses: [Expressible?] = [ + create("INDEX", indexName(columns), unique ? .Unique : nil, ifNotExists), + Expression(literal: "ON"), + tableName(qualified: false), + "".wrap(columns) as Expression + ] + + return " ".join(clauses.flatMap { $0 }).asSQL() + } + + // MARK: - DROP INDEX + + public func dropIndex(_ columns: Expressible...) -> String { + return dropIndex(columns) + } + + public func dropIndex(_ columns: [Expressible], ifExists: Bool = false) -> String { + return drop("INDEX", indexName(columns), ifExists) + } + + fileprivate func indexName(_ columns: [Expressible]) -> Expressible { + let string = (["index", clauses.from.name, "on"] + columns.map { $0.expression.template }).joined(separator: " ").lowercased() + + let index = string.characters.reduce("") { underscored, character in + guard character != "\"" else { + return underscored + } + guard "a"..."z" ~= character || "0"..."9" ~= character else { + return underscored + "_" + } + return underscored + String(character) + } + + return database(namespace: index) + } + +} + +extension View { + + // MARK: - CREATE VIEW + + public func create(_ query: QueryType, temporary: Bool = false, ifNotExists: Bool = false) -> String { + let clauses: [Expressible?] = [ + create(View.identifier, tableName(), temporary ? .Temporary : nil, ifNotExists), + Expression(literal: "AS"), + query + ] + + return " ".join(clauses.flatMap { $0 }).asSQL() + } + + // MARK: - DROP VIEW + + public func drop(ifExists: Bool = false) -> String { + return drop("VIEW", tableName(), ifExists) + } + +} + +extension VirtualTable { + + // MARK: - CREATE VIRTUAL TABLE + + public func create(_ using: Module, ifNotExists: Bool = false) -> String { + let clauses: [Expressible?] = [ + create(VirtualTable.identifier, tableName(), nil, ifNotExists), + Expression(literal: "USING"), + using + ] + + return " ".join(clauses.flatMap { $0 }).asSQL() + } + + // MARK: - ALTER TABLE … RENAME TO + + public func rename(_ to: VirtualTable) -> String { + return rename(to: to) + } + +} + +public final class TableBuilder { + + fileprivate var definitions = [Expressible]() + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil) { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V) { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil) { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V) { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil) { + column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression) { + column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V) { + column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil) { + column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression) { + column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V) { + column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, primaryKey: Bool, check: Expression? = nil, defaultValue: Expression? = nil) { + column(name, V.declaredDatatype, primaryKey ? .default : nil, false, false, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, primaryKey: Bool, check: Expression, defaultValue: Expression? = nil) { + column(name, V.declaredDatatype, primaryKey ? .default : nil, false, false, check, defaultValue, nil, nil) + } + + public func column(_ name: Expression, primaryKey: PrimaryKey, check: Expression? = nil) where V.Datatype == Int64 { + column(name, V.declaredDatatype, primaryKey, false, false, check, nil, nil, nil) + } + + public func column(_ name: Expression, primaryKey: PrimaryKey, check: Expression) where V.Datatype == Int64 { + column(name, V.declaredDatatype, primaryKey, false, false, check, nil, nil, nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { + column(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { + column(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { + column(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { + column(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V, collate: Collation) where V.Datatype == String { + column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) + } + + fileprivate func column(_ name: Expressible, _ datatype: String, _ primaryKey: PrimaryKey?, _ null: Bool, _ unique: Bool, _ check: Expressible?, _ defaultValue: Expressible?, _ references: (QueryType, Expressible)?, _ collate: Collation?) { + definitions.append(definition(name, datatype, primaryKey, null, unique, check, defaultValue, references, collate)) + } + + // MARK: - + + public func primaryKey(_ column: Expression) { + primaryKey([column]) + } + + public func primaryKey(_ compositeA: Expression, _ b: Expression) { + primaryKey([compositeA, b]) + } + + public func primaryKey(_ compositeA: Expression, _ b: Expression, _ c: Expression) { + primaryKey([compositeA, b, c]) + } + + fileprivate func primaryKey(_ composite: [Expressible]) { + definitions.append("PRIMARY KEY".prefix(composite)) + } + + public func unique(_ columns: Expressible...) { + unique(columns) + } + + public func unique(_ columns: [Expressible]) { + definitions.append("UNIQUE".prefix(columns)) + } + + public func check(_ condition: Expression) { + check(Expression(condition)) + } + + public func check(_ condition: Expression) { + definitions.append("CHECK".prefix(condition)) + } + + public enum Dependency: String { + + case noAction = "NO ACTION" + + case restrict = "RESTRICT" + + case setNull = "SET NULL" + + case setDefault = "SET DEFAULT" + + case cascade = "CASCADE" + + } + + public func foreignKey(_ column: Expression, references table: QueryType, _ other: Expression, update: Dependency? = nil, delete: Dependency? = nil) { + foreignKey(column, (table, other), update, delete) + } + + public func foreignKey(_ column: Expression, references table: QueryType, _ other: Expression, update: Dependency? = nil, delete: Dependency? = nil) { + foreignKey(column, (table, other), update, delete) + } + + public func foreignKey(_ composite: (Expression, Expression), references table: QueryType, _ other: (Expression, Expression), update: Dependency? = nil, delete: Dependency? = nil) { + let composite = ", ".join([composite.0, composite.1]) + let references = (table, ", ".join([other.0, other.1])) + + foreignKey(composite, references, update, delete) + } + + public func foreignKey(_ composite: (Expression, Expression, Expression), references table: QueryType, _ other: (Expression, Expression, Expression), update: Dependency? = nil, delete: Dependency? = nil) { + let composite = ", ".join([composite.0, composite.1, composite.2]) + let references = (table, ", ".join([other.0, other.1, other.2])) + + foreignKey(composite, references, update, delete) + } + + fileprivate func foreignKey(_ column: Expressible, _ references: (QueryType, Expressible), _ update: Dependency?, _ delete: Dependency?) { + let clauses: [Expressible?] = [ + "FOREIGN KEY".prefix(column), + reference(references), + update.map { Expression(literal: "ON UPDATE \($0.rawValue)") }, + delete.map { Expression(literal: "ON DELETE \($0.rawValue)") } + ] + + definitions.append(" ".join(clauses.flatMap { $0 })) + } + +} + +public enum PrimaryKey { + + case `default` + + case autoincrement + +} + +public struct Module { + + fileprivate let name: String + + fileprivate let arguments: [Expressible] + + public init(_ name: String, _ arguments: [Expressible]) { + self.init(name: name.quote(), arguments: arguments) + } + + init(name: String, arguments: [Expressible]) { + self.name = name + self.arguments = arguments + } + +} + +extension Module : Expressible { + + public var expression: Expression { + return name.wrap(arguments) + } + +} + +// MARK: - Private + +private extension QueryType { + + func create(_ identifier: String, _ name: Expressible, _ modifier: Modifier?, _ ifNotExists: Bool) -> Expressible { + let clauses: [Expressible?] = [ + Expression(literal: "CREATE"), + modifier.map { Expression(literal: $0.rawValue) }, + Expression(literal: identifier), + ifNotExists ? Expression(literal: "IF NOT EXISTS") : nil, + name + ] + + return " ".join(clauses.flatMap { $0 }) + } + + func rename(to: Self) -> String { + return " ".join([ + Expression(literal: "ALTER TABLE"), + tableName(), + Expression(literal: "RENAME TO"), + Expression(to.clauses.from.name) + ]).asSQL() + } + + func drop(_ identifier: String, _ name: Expressible, _ ifExists: Bool) -> String { + let clauses: [Expressible?] = [ + Expression(literal: "DROP \(identifier)"), + ifExists ? Expression(literal: "IF EXISTS") : nil, + name + ] + + return " ".join(clauses.flatMap { $0 }).asSQL() + } + +} + +private func definition(_ column: Expressible, _ datatype: String, _ primaryKey: PrimaryKey?, _ null: Bool, _ unique: Bool, _ check: Expressible?, _ defaultValue: Expressible?, _ references: (QueryType, Expressible)?, _ collate: Collation?) -> Expressible { + let clauses: [Expressible?] = [ + column, + Expression(literal: datatype), + primaryKey.map { Expression(literal: $0 == .autoincrement ? "PRIMARY KEY AUTOINCREMENT" : "PRIMARY KEY") }, + null ? nil : Expression(literal: "NOT NULL"), + unique ? Expression(literal: "UNIQUE") : nil, + check.map { " ".join([Expression(literal: "CHECK"), $0]) }, + defaultValue.map { "DEFAULT".prefix($0) }, + references.map(reference), + collate.map { " ".join([Expression(literal: "COLLATE"), $0]) } + ] + + return " ".join(clauses.flatMap { $0 }) +} + +private func reference(_ primary: (QueryType, Expressible)) -> Expressible { + return " ".join([ + Expression(literal: "REFERENCES"), + primary.0.tableName(qualified: false), + "".wrap(primary.1) as Expression + ]) +} + +private enum Modifier : String { + + case Unique = "UNIQUE" + + case Temporary = "TEMPORARY" + +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Setter.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Setter.swift new file mode 100644 index 0000000000..86f16fcae3 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Setter.swift @@ -0,0 +1,277 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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. +// + +precedencegroup ColumnAssignment { + associativity: left + assignment: true + lowerThan: AssignmentPrecedence +} + +infix operator <- : ColumnAssignment + +public struct Setter { + + let column: Expressible + let value: Expressible + + fileprivate init(column: Expression, value: Expression) { + self.column = column + self.value = value + } + + fileprivate init(column: Expression, value: V) { + self.column = column + self.value = value + } + + fileprivate init(column: Expression, value: Expression) { + self.column = column + self.value = value + } + + fileprivate init(column: Expression, value: Expression) { + self.column = column + self.value = value + } + + fileprivate init(column: Expression, value: V?) { + self.column = column + self.value = Expression(value: value) + } + +} + +extension Setter : Expressible { + + public var expression: Expression { + return "=".infix(column, value, wrap: false) + } + +} + +public func <-(column: Expression, value: Expression) -> Setter { + return Setter(column: column, value: value) +} +public func <-(column: Expression, value: V) -> Setter { + return Setter(column: column, value: value) +} +public func <-(column: Expression, value: Expression) -> Setter { + return Setter(column: column, value: value) +} +public func <-(column: Expression, value: Expression) -> Setter { + return Setter(column: column, value: value) +} +public func <-(column: Expression, value: V?) -> Setter { + return Setter(column: column, value: value) +} + +public func +=(column: Expression, value: Expression) -> Setter { + return column <- column + value +} +public func +=(column: Expression, value: String) -> Setter { + return column <- column + value +} +public func +=(column: Expression, value: Expression) -> Setter { + return column <- column + value +} +public func +=(column: Expression, value: Expression) -> Setter { + return column <- column + value +} +public func +=(column: Expression, value: String) -> Setter { + return column <- column + value +} + +public func +=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column + value +} +public func +=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column + value +} +public func +=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column + value +} +public func +=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column + value +} +public func +=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column + value +} + +public func -=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column - value +} +public func -=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column - value +} +public func -=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column - value +} +public func -=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column - value +} +public func -=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column - value +} + +public func *=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column * value +} +public func *=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column * value +} +public func *=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column * value +} +public func *=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column * value +} +public func *=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column * value +} + +public func /=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column / value +} +public func /=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column / value +} +public func /=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column / value +} +public func /=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { + return column <- column / value +} +public func /=(column: Expression, value: V) -> Setter where V.Datatype : Number { + return column <- column / value +} + +public func %=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column % value +} +public func %=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column % value +} +public func %=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column % value +} +public func %=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column % value +} +public func %=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column % value +} + +public func <<=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column << value +} +public func <<=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column << value +} +public func <<=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column << value +} +public func <<=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column << value +} +public func <<=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column << value +} + +public func >>=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column >> value +} +public func >>=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column >> value +} +public func >>=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column >> value +} +public func >>=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column >> value +} +public func >>=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column >> value +} + +public func &=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column & value +} +public func &=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column & value +} +public func &=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column & value +} +public func &=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column & value +} +public func &=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column & value +} + +public func |=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column | value +} +public func |=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column | value +} +public func |=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column | value +} +public func |=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column | value +} +public func |=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column | value +} + +public func ^=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column ^ value +} +public func ^=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column ^ value +} +public func ^=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column ^ value +} +public func ^=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { + return column <- column ^ value +} +public func ^=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { + return column <- column ^ value +} + +public postfix func ++(column: Expression) -> Setter where V.Datatype == Int64 { + return Expression(column) += 1 +} +public postfix func ++(column: Expression) -> Setter where V.Datatype == Int64 { + return Expression(column) += 1 +} + +public postfix func --(column: Expression) -> Setter where V.Datatype == Int64 { + return Expression(column) -= 1 +} +public postfix func --(column: Expression) -> Setter where V.Datatype == Int64 { + return Expression(column) -= 1 +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m b/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m new file mode 100644 index 0000000000..d8fe6b683c --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m @@ -0,0 +1,138 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// 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 "SQLite-Bridging.h" +#import "fts3_tokenizer.h" + +#pragma mark - FTS + +typedef struct __SQLiteTokenizer { + sqlite3_tokenizer base; + __unsafe_unretained _SQLiteTokenizerNextCallback callback; +} __SQLiteTokenizer; + +typedef struct __SQLiteTokenizerCursor { + void * base; + const char * input; + int inputOffset; + int inputLength; + int idx; +} __SQLiteTokenizerCursor; + +static NSMutableDictionary * __SQLiteTokenizerMap; + +static int __SQLiteTokenizerCreate(int argc, const char * const * argv, sqlite3_tokenizer ** ppTokenizer) { + __SQLiteTokenizer * tokenizer = (__SQLiteTokenizer *)sqlite3_malloc(sizeof(__SQLiteTokenizer)); + if (!tokenizer) { + return SQLITE_NOMEM; + } + memset(tokenizer, 0, sizeof(* tokenizer)); + + NSString * key = [NSString stringWithUTF8String:argv[0]]; + tokenizer->callback = [__SQLiteTokenizerMap objectForKey:key]; + if (!tokenizer->callback) { + return SQLITE_ERROR; + } + + *ppTokenizer = &tokenizer->base; + return SQLITE_OK; +} + +static int __SQLiteTokenizerDestroy(sqlite3_tokenizer * pTokenizer) { + sqlite3_free(pTokenizer); + return SQLITE_OK; +} + +static int __SQLiteTokenizerOpen(sqlite3_tokenizer * pTokenizer, const char * pInput, int nBytes, sqlite3_tokenizer_cursor ** ppCursor) { + __SQLiteTokenizerCursor * cursor = (__SQLiteTokenizerCursor *)sqlite3_malloc(sizeof(__SQLiteTokenizerCursor)); + if (!cursor) { + return SQLITE_NOMEM; + } + + cursor->input = pInput; + cursor->inputOffset = 0; + cursor->inputLength = 0; + cursor->idx = 0; + + *ppCursor = (sqlite3_tokenizer_cursor *)cursor; + return SQLITE_OK; +} + +static int __SQLiteTokenizerClose(sqlite3_tokenizer_cursor * pCursor) { + sqlite3_free(pCursor); + return SQLITE_OK; +} + +static int __SQLiteTokenizerNext(sqlite3_tokenizer_cursor * pCursor, const char ** ppToken, int * pnBytes, int * piStartOffset, int * piEndOffset, int * piPosition) { + __SQLiteTokenizerCursor * cursor = (__SQLiteTokenizerCursor *)pCursor; + __SQLiteTokenizer * tokenizer = (__SQLiteTokenizer *)cursor->base; + + cursor->inputOffset += cursor->inputLength; + const char * input = cursor->input + cursor->inputOffset; + const char * token = [tokenizer->callback(input, &cursor->inputOffset, &cursor->inputLength) cStringUsingEncoding:NSUTF8StringEncoding]; + if (!token) { + return SQLITE_DONE; + } + + *ppToken = token; + *pnBytes = (int)strlen(token); + *piStartOffset = cursor->inputOffset; + *piEndOffset = cursor->inputOffset + cursor->inputLength; + *piPosition = cursor->idx++; + return SQLITE_OK; +} + +static const sqlite3_tokenizer_module __SQLiteTokenizerModule = { + 0, + __SQLiteTokenizerCreate, + __SQLiteTokenizerDestroy, + __SQLiteTokenizerOpen, + __SQLiteTokenizerClose, + __SQLiteTokenizerNext +}; + +int _SQLiteRegisterTokenizer(SQLiteHandle * db, const char * moduleName, const char * submoduleName, _SQLiteTokenizerNextCallback callback) { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + __SQLiteTokenizerMap = [NSMutableDictionary new]; + }); + + sqlite3_stmt * stmt; + int status = sqlite3_prepare_v2((sqlite3 *)db, "SELECT fts3_tokenizer(?, ?)", -1, &stmt, 0); + if (status != SQLITE_OK ){ + return status; + } + const sqlite3_tokenizer_module * pModule = &__SQLiteTokenizerModule; + sqlite3_bind_text(stmt, 1, moduleName, -1, SQLITE_STATIC); + sqlite3_bind_blob(stmt, 2, &pModule, sizeof(pModule), SQLITE_STATIC); + sqlite3_step(stmt); + status = sqlite3_finalize(stmt); + if (status != SQLITE_OK ){ + return status; + } + + [__SQLiteTokenizerMap setObject:[callback copy] forKey:[NSString stringWithUTF8String:submoduleName]]; + + return SQLITE_OK; +} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h b/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h new file mode 100644 index 0000000000..d8a1e44b47 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h @@ -0,0 +1,161 @@ +/* +** 2006 July 10 +** +** The author disclaims copyright to this source code. +** +************************************************************************* +** Defines the interface to tokenizers used by fulltext-search. There +** are three basic components: +** +** sqlite3_tokenizer_module is a singleton defining the tokenizer +** interface functions. This is essentially the class structure for +** tokenizers. +** +** sqlite3_tokenizer is used to define a particular tokenizer, perhaps +** including customization information defined at creation time. +** +** sqlite3_tokenizer_cursor is generated by a tokenizer to generate +** tokens from a particular input. +*/ +#ifndef _FTS3_TOKENIZER_H_ +#define _FTS3_TOKENIZER_H_ + +/* TODO(shess) Only used for SQLITE_OK and SQLITE_DONE at this time. +** If tokenizers are to be allowed to call sqlite3_*() functions, then +** we will need a way to register the API consistently. +*/ +#import "sqlite3.h" + +/* +** Structures used by the tokenizer interface. When a new tokenizer +** implementation is registered, the caller provides a pointer to +** an sqlite3_tokenizer_module containing pointers to the callback +** functions that make up an implementation. +** +** When an fts3 table is created, it passes any arguments passed to +** the tokenizer clause of the CREATE VIRTUAL TABLE statement to the +** sqlite3_tokenizer_module.xCreate() function of the requested tokenizer +** implementation. The xCreate() function in turn returns an +** sqlite3_tokenizer structure representing the specific tokenizer to +** be used for the fts3 table (customized by the tokenizer clause arguments). +** +** To tokenize an input buffer, the sqlite3_tokenizer_module.xOpen() +** method is called. It returns an sqlite3_tokenizer_cursor object +** that may be used to tokenize a specific input buffer based on +** the tokenization rules supplied by a specific sqlite3_tokenizer +** object. +*/ +typedef struct sqlite3_tokenizer_module sqlite3_tokenizer_module; +typedef struct sqlite3_tokenizer sqlite3_tokenizer; +typedef struct sqlite3_tokenizer_cursor sqlite3_tokenizer_cursor; + +struct sqlite3_tokenizer_module { + + /* + ** Structure version. Should always be set to 0 or 1. + */ + int iVersion; + + /* + ** Create a new tokenizer. The values in the argv[] array are the + ** arguments passed to the "tokenizer" clause of the CREATE VIRTUAL + ** TABLE statement that created the fts3 table. For example, if + ** the following SQL is executed: + ** + ** CREATE .. USING fts3( ... , tokenizer arg1 arg2) + ** + ** then argc is set to 2, and the argv[] array contains pointers + ** to the strings "arg1" and "arg2". + ** + ** This method should return either SQLITE_OK (0), or an SQLite error + ** code. If SQLITE_OK is returned, then *ppTokenizer should be set + ** to point at the newly created tokenizer structure. The generic + ** sqlite3_tokenizer.pModule variable should not be initialized by + ** this callback. The caller will do so. + */ + int (*xCreate)( + int argc, /* Size of argv array */ + const char *const*argv, /* Tokenizer argument strings */ + sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ + ); + + /* + ** Destroy an existing tokenizer. The fts3 module calls this method + ** exactly once for each successful call to xCreate(). + */ + int (*xDestroy)(sqlite3_tokenizer *pTokenizer); + + /* + ** Create a tokenizer cursor to tokenize an input buffer. The caller + ** is responsible for ensuring that the input buffer remains valid + ** until the cursor is closed (using the xClose() method). + */ + int (*xOpen)( + sqlite3_tokenizer *pTokenizer, /* Tokenizer object */ + const char *pInput, int nBytes, /* Input buffer */ + sqlite3_tokenizer_cursor **ppCursor /* OUT: Created tokenizer cursor */ + ); + + /* + ** Destroy an existing tokenizer cursor. The fts3 module calls this + ** method exactly once for each successful call to xOpen(). + */ + int (*xClose)(sqlite3_tokenizer_cursor *pCursor); + + /* + ** Retrieve the next token from the tokenizer cursor pCursor. This + ** method should either return SQLITE_OK and set the values of the + ** "OUT" variables identified below, or SQLITE_DONE to indicate that + ** the end of the buffer has been reached, or an SQLite error code. + ** + ** *ppToken should be set to point at a buffer containing the + ** normalized version of the token (i.e. after any case-folding and/or + ** stemming has been performed). *pnBytes should be set to the length + ** of this buffer in bytes. The input text that generated the token is + ** identified by the byte offsets returned in *piStartOffset and + ** *piEndOffset. *piStartOffset should be set to the index of the first + ** byte of the token in the input buffer. *piEndOffset should be set + ** to the index of the first byte just past the end of the token in + ** the input buffer. + ** + ** The buffer *ppToken is set to point at is managed by the tokenizer + ** implementation. It is only required to be valid until the next call + ** to xNext() or xClose(). + */ + /* TODO(shess) current implementation requires pInput to be + ** nul-terminated. This should either be fixed, or pInput/nBytes + ** should be converted to zInput. + */ + int (*xNext)( + sqlite3_tokenizer_cursor *pCursor, /* Tokenizer cursor */ + const char **ppToken, int *pnBytes, /* OUT: Normalized text for token */ + int *piStartOffset, /* OUT: Byte offset of token in input buffer */ + int *piEndOffset, /* OUT: Byte offset of end of token in input buffer */ + int *piPosition /* OUT: Number of tokens returned before this one */ + ); + + /*********************************************************************** + ** Methods below this point are only available if iVersion>=1. + */ + + /* + ** Configure the language id of a tokenizer cursor. + */ + int (*xLanguageid)(sqlite3_tokenizer_cursor *pCsr, int iLangid); +}; + +struct sqlite3_tokenizer { + const sqlite3_tokenizer_module *pModule; /* The module for this tokenizer */ + /* Tokenizer implementations will typically add additional fields */ +}; + +struct sqlite3_tokenizer_cursor { + sqlite3_tokenizer *pTokenizer; /* Tokenizer for this cursor. */ + /* Tokenizer implementations will typically add additional fields */ +}; + +int fts3_global_term_cnt(int iTerm, int iCol); +int fts3_term_cnt(int iTerm, int iCol); + + +#endif /* _FTS3_TOKENIZER_H_ */ diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h b/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h new file mode 100644 index 0000000000..d15e8d56d6 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h @@ -0,0 +1,37 @@ +// +// SQLite.swift +// https://github.com/stephencelis/SQLite.swift +// Copyright © 2014-2015 Stephen Celis. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +@import Foundation; + +#ifndef COCOAPODS +#import "sqlite3.h" +#endif + +typedef struct SQLiteHandle SQLiteHandle; // CocoaPods workaround + +NS_ASSUME_NONNULL_BEGIN +typedef NSString * _Nullable (^_SQLiteTokenizerNextCallback)(const char * input, int * inputOffset, int * inputLength); +int _SQLiteRegisterTokenizer(SQLiteHandle * db, const char * module, const char * tokenizer, _Nullable _SQLiteTokenizerNextCallback callback); +NS_ASSUME_NONNULL_END + diff --git a/Carthage/Checkouts/SQLite.swift/Tests/Carthage/.gitignore b/Carthage/Checkouts/SQLite.swift/Tests/Carthage/.gitignore new file mode 100644 index 0000000000..2d43454a24 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/Carthage/.gitignore @@ -0,0 +1,3 @@ +Carthage/ +Cartfile +Cartfile.resolved diff --git a/Carthage/Checkouts/SQLite.swift/Tests/Carthage/Makefile b/Carthage/Checkouts/SQLite.swift/Tests/Carthage/Makefile new file mode 100644 index 0000000000..f28eb25b06 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/Carthage/Makefile @@ -0,0 +1,16 @@ +CARTHAGE := /usr/local/bin/carthage +CARTHAGE_PLATFORM := iOS +CARTHAGE_CONFIGURATION := Release +CARTHAGE_DIR := Carthage +CARTHAGE_ARGS := --no-use-binaries +CARTHAGE_TOOLCHAIN := com.apple.dt.toolchain.Swift_3_0 +CARTHAGE_CMDLINE := --configuration $(CARTHAGE_CONFIGURATION) --platform $(CARTHAGE_PLATFORM) --toolchain $(CARTHAGE_TOOLCHAIN) $(CARTHAGE_ARGS) + +test: $(CARTHAGE) Cartfile + $< bootstrap $(CARTHAGE_CMDLINE) + +Cartfile: + echo 'git "$(TRAVIS_BUILD_DIR)" "HEAD"' > $@ + +clean: + @rm -f Cartfile Cartfile.resolved diff --git a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/.gitignore b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/.gitignore new file mode 100644 index 0000000000..4cf24de2ce --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/.gitignore @@ -0,0 +1 @@ +gems/ diff --git a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile new file mode 100644 index 0000000000..94018f18bd --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile @@ -0,0 +1,4 @@ +source 'https://rubygems.org' + +gem 'cocoapods', '~> 1.1.0' +gem 'minitest' diff --git a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile.lock b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile.lock new file mode 100644 index 0000000000..e8879f13ca --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile.lock @@ -0,0 +1,74 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (2.3.3) + activesupport (4.2.7.1) + i18n (~> 0.7) + json (~> 1.7, >= 1.7.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + claide (1.0.1) + cocoapods (1.1.1) + activesupport (>= 4.0.2, < 5) + claide (>= 1.0.1, < 2.0) + cocoapods-core (= 1.1.1) + cocoapods-deintegrate (>= 1.0.1, < 2.0) + cocoapods-downloader (>= 1.1.2, < 2.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-stats (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.1.1, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored (~> 1.2) + escape (~> 0.0.4) + fourflusher (~> 2.0.1) + gh_inspector (~> 1.0) + molinillo (~> 0.5.1) + nap (~> 1.0) + xcodeproj (>= 1.3.3, < 2.0) + cocoapods-core (1.1.1) + activesupport (>= 4.0.2, < 5) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + cocoapods-deintegrate (1.0.1) + cocoapods-downloader (1.1.2) + cocoapods-plugins (1.0.0) + nap + cocoapods-search (1.0.0) + cocoapods-stats (1.0.0) + cocoapods-trunk (1.1.1) + nap (>= 0.8, < 2.0) + netrc (= 0.7.8) + cocoapods-try (1.1.0) + colored (1.2) + escape (0.0.4) + fourflusher (2.0.1) + fuzzy_match (2.0.4) + gh_inspector (1.0.2) + i18n (0.7.0) + json (1.8.3) + minitest (5.9.1) + molinillo (0.5.4) + nanaimo (0.2.2) + nap (1.1.0) + netrc (0.7.8) + thread_safe (0.3.5) + tzinfo (1.2.2) + thread_safe (~> 0.1) + xcodeproj (1.4.1) + CFPropertyList (~> 2.3.3) + activesupport (>= 3) + claide (>= 1.0.1, < 2.0) + colored (~> 1.2) + nanaimo (~> 0.2.0) + +PLATFORMS + ruby + +DEPENDENCIES + cocoapods (~> 1.1.0) + minitest + +BUNDLED WITH + 1.13.3 diff --git a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Makefile b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Makefile new file mode 100644 index 0000000000..26163fdbe1 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Makefile @@ -0,0 +1,13 @@ +test: install repo_update + @set -e; \ + for test in *_test.rb; do \ + bundle exec ./$$test; \ + done + +repo_update: + @bundle exec pod repo update --silent + +install: + @bundle install --path gems + +.PHONY: test install diff --git a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/integration_test.rb b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/integration_test.rb new file mode 100755 index 0000000000..192aff9032 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/integration_test.rb @@ -0,0 +1,43 @@ +#!/usr/bin/env ruby + +require 'minitest/autorun' +require_relative 'test_running_validator' + +class IntegrationTest < Minitest::Test + + def test_validate_project + assert validator.validate, "validation failed: #{validator.failure_reason}" + end + + private + + def validator + @validator ||= TestRunningValidator.new(podspec, []).tap do |validator| + validator.test_files = Dir["#{project_test_dir}/**/*.swift"] + validator.test_resources = Dir["#{project_test_dir}/fixtures"] + validator.config.verbose = true + validator.no_clean = true + validator.use_frameworks = true + validator.fail_fast = true + validator.local = true + validator.allow_warnings = true + subspec = ENV['VALIDATOR_SUBSPEC'] + if subspec == 'none' + validator.no_subspecs = true + else + validator.only_subspec = subspec + end + if ENV['IOS_SIMULATOR'] + validator.ios_simulator = ENV['IOS_SIMULATOR'] + end + end + end + + def podspec + File.expand_path(File.dirname(__FILE__) + '/../../SQLite.swift.podspec') + end + + def project_test_dir + File.expand_path(File.dirname(__FILE__) + '/../SQLiteTests') + end +end diff --git a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/test_running_validator.rb b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/test_running_validator.rb new file mode 100644 index 0000000000..fcfd3c28ef --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/test_running_validator.rb @@ -0,0 +1,120 @@ +require 'cocoapods' +require 'cocoapods/validator' +require 'fileutils' + +class TestRunningValidator < Pod::Validator + APP_TARGET = 'App' + TEST_TARGET = 'Tests' + + attr_accessor :test_files + attr_accessor :test_resources + attr_accessor :ios_simulator + attr_accessor :tvos_simulator + attr_accessor :watchos_simulator + + def initialize(spec_or_path, source_urls) + super(spec_or_path, source_urls) + self.test_files = [] + self.test_resources = [] + self.ios_simulator = :oldest + self.tvos_simulator = :oldest + self.watchos_simulator = :oldest + end + + def create_app_project + super + project = Xcodeproj::Project.open(validation_dir + "#{APP_TARGET}.xcodeproj") + create_test_target(project) + project.save + end + + def add_app_project_import + super + project = Xcodeproj::Project.open(validation_dir + 'App.xcodeproj') + group = project.new_group(TEST_TARGET) + test_target = project.targets.last + test_target.add_resources(test_resources.map { |resource| group.new_file(resource) }) + test_target.add_file_references(test_files.map { |file| group.new_file(file) }) + add_swift_version(test_target) + project.save + end + + def install_pod + super + if local? + FileUtils.ln_s file.dirname, validation_dir + "Pods/#{spec.name}" + end + end + + def podfile_from_spec(*args) + super(*args).tap do |pod_file| + add_test_target(pod_file) + end + end + + def build_pod + super + Pod::UI.message "\Testing with xcodebuild.\n".yellow do + run_tests + end + end + + private + def create_test_target(project) + test_target = project.new_target(:unit_test_bundle, TEST_TARGET, consumer.platform_name, deployment_target) + create_test_scheme(project, test_target) + end + + def create_test_scheme(project, test_target) + project.recreate_user_schemes + test_scheme = Xcodeproj::XCScheme.new(test_scheme_path(project)) + test_scheme.add_test_target(test_target) + test_scheme.save! + end + + def test_scheme_path(project) + Xcodeproj::XCScheme.user_data_dir(project.path) + "#{TEST_TARGET}.xcscheme" + end + + def add_test_target(pod_file) + app_target = pod_file.target_definitions[APP_TARGET] + Pod::Podfile::TargetDefinition.new(TEST_TARGET, app_target) + end + + def run_tests + command = [ + 'clean', 'build', 'build-for-testing', 'test-without-building', + '-workspace', File.join(validation_dir, "#{APP_TARGET}.xcworkspace"), + '-scheme', TEST_TARGET, + '-configuration', 'Debug' + ] + case consumer.platform_name + when :ios + command += %w(CODE_SIGN_IDENTITY=- -sdk iphonesimulator) + command += Fourflusher::SimControl.new.destination(ios_simulator, 'iOS', deployment_target) + when :osx + command += %w(LD_RUNPATH_SEARCH_PATHS=@loader_path/../Frameworks) + when :tvos + command += %w(CODE_SIGN_IDENTITY=- -sdk appletvsimulator) + command += Fourflusher::SimControl.new.destination(tvos_simulator, 'tvOS', deployment_target) + when :watchos + # there's no XCTest on watchOS (https://openradar.appspot.com/21760513) + return + else + return + end + + output, status = _xcodebuild(command) + + unless status.success? + message = 'Returned an unsuccessful exit code.' + if config.verbose? + message += "\nXcode output: \n#{output}\n" + else + message += ' You can use `--verbose` for more information.' + end + error('xcodebuild', message) + end + output + end +end diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/AggregateFunctionsTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/AggregateFunctionsTests.swift new file mode 100644 index 0000000000..6b583ccfa8 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/AggregateFunctionsTests.swift @@ -0,0 +1,68 @@ +import XCTest +import SQLite + +class AggregateFunctionsTests : XCTestCase { + + func test_distinct_prependsExpressionsWithDistinctKeyword() { + AssertSQL("DISTINCT \"int\"", int.distinct) + AssertSQL("DISTINCT \"intOptional\"", intOptional.distinct) + AssertSQL("DISTINCT \"double\"", double.distinct) + AssertSQL("DISTINCT \"doubleOptional\"", doubleOptional.distinct) + AssertSQL("DISTINCT \"string\"", string.distinct) + AssertSQL("DISTINCT \"stringOptional\"", stringOptional.distinct) + } + + func test_count_wrapsOptionalExpressionsWithCountFunction() { + AssertSQL("count(\"intOptional\")", intOptional.count) + AssertSQL("count(\"doubleOptional\")", doubleOptional.count) + AssertSQL("count(\"stringOptional\")", stringOptional.count) + } + + func test_max_wrapsComparableExpressionsWithMaxFunction() { + AssertSQL("max(\"int\")", int.max) + AssertSQL("max(\"intOptional\")", intOptional.max) + AssertSQL("max(\"double\")", double.max) + AssertSQL("max(\"doubleOptional\")", doubleOptional.max) + AssertSQL("max(\"string\")", string.max) + AssertSQL("max(\"stringOptional\")", stringOptional.max) + AssertSQL("max(\"date\")", date.max) + AssertSQL("max(\"dateOptional\")", dateOptional.max) + } + + func test_min_wrapsComparableExpressionsWithMinFunction() { + AssertSQL("min(\"int\")", int.min) + AssertSQL("min(\"intOptional\")", intOptional.min) + AssertSQL("min(\"double\")", double.min) + AssertSQL("min(\"doubleOptional\")", doubleOptional.min) + AssertSQL("min(\"string\")", string.min) + AssertSQL("min(\"stringOptional\")", stringOptional.min) + AssertSQL("min(\"date\")", date.min) + AssertSQL("min(\"dateOptional\")", dateOptional.min) + } + + func test_average_wrapsNumericExpressionsWithAvgFunction() { + AssertSQL("avg(\"int\")", int.average) + AssertSQL("avg(\"intOptional\")", intOptional.average) + AssertSQL("avg(\"double\")", double.average) + AssertSQL("avg(\"doubleOptional\")", doubleOptional.average) + } + + func test_sum_wrapsNumericExpressionsWithSumFunction() { + AssertSQL("sum(\"int\")", int.sum) + AssertSQL("sum(\"intOptional\")", intOptional.sum) + AssertSQL("sum(\"double\")", double.sum) + AssertSQL("sum(\"doubleOptional\")", doubleOptional.sum) + } + + func test_total_wrapsNumericExpressionsWithTotalFunction() { + AssertSQL("total(\"int\")", int.total) + AssertSQL("total(\"intOptional\")", intOptional.total) + AssertSQL("total(\"double\")", double.total) + AssertSQL("total(\"doubleOptional\")", doubleOptional.total) + } + + func test_count_withStar_wrapsStarWithCountFunction() { + AssertSQL("count(*)", count(*)) + } + +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/BlobTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/BlobTests.swift new file mode 100644 index 0000000000..fbcca9bcd9 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/BlobTests.swift @@ -0,0 +1,23 @@ +import XCTest +import SQLite + +class BlobTests : XCTestCase { + + func test_toHex() { + let blob = Blob(bytes: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 150, 250, 255]) + + XCTAssertEqual(blob.toHex(), "000a141e28323c46505a6496faff") + } + + func test_init_array() { + let blob = Blob(bytes: [42, 42, 42]) + XCTAssertEqual(blob.bytes, [42, 42, 42]) + } + + func test_init_unsafeRawPointer() { + let pointer = UnsafeMutablePointer.allocate(capacity: 3) + pointer.initialize(to: 42, count: 3) + let blob = Blob(bytes: pointer, length: 3) + XCTAssertEqual(blob.bytes, [42, 42, 42]) + } +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CipherTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CipherTests.swift new file mode 100644 index 0000000000..3ee0b13511 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CipherTests.swift @@ -0,0 +1,98 @@ +#if SQLITE_SWIFT_SQLCIPHER +import XCTest +import SQLite +import SQLCipher + +class CipherTests: XCTestCase { + + let db1 = try! Connection() + let db2 = try! Connection() + + override func setUp() { + // db + + try! db1.key("hello") + + try! db1.run("CREATE TABLE foo (bar TEXT)") + try! db1.run("INSERT INTO foo (bar) VALUES ('world')") + + // db2 + let key2 = keyData() + try! db2.key(Blob(bytes: key2.bytes, length: key2.length)) + + try! db2.run("CREATE TABLE foo (bar TEXT)") + try! db2.run("INSERT INTO foo (bar) VALUES ('world')") + + super.setUp() + } + + func test_key() { + XCTAssertEqual(1, try! db1.scalar("SELECT count(*) FROM foo") as? Int64) + } + + func test_key_blob_literal() { + let db = try! Connection() + try! db.key("x'2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99'") + } + + func test_rekey() { + try! db1.rekey("goodbye") + XCTAssertEqual(1, try! db1.scalar("SELECT count(*) FROM foo") as? Int64) + } + + func test_data_key() { + XCTAssertEqual(1, try! db2.scalar("SELECT count(*) FROM foo") as? Int64) + } + + func test_data_rekey() { + let newKey = keyData() + try! db2.rekey(Blob(bytes: newKey.bytes, length: newKey.length)) + XCTAssertEqual(1, try! db2.scalar("SELECT count(*) FROM foo") as? Int64) + } + + func test_keyFailure() { + let path = "\(NSTemporaryDirectory())/db.sqlite3" + _ = try? FileManager.default.removeItem(atPath: path) + + let connA = try! Connection(path) + defer { try! FileManager.default.removeItem(atPath: path) } + + try! connA.key("hello") + try! connA.run("CREATE TABLE foo (bar TEXT)") + + let connB = try! Connection(path, readonly: true) + + do { + try connB.key("world") + XCTFail("expected exception") + } catch Result.error(_, let code, _) { + XCTAssertEqual(SQLITE_NOTADB, code) + } catch { + XCTFail("unexpected error: \(error)") + } + } + + func test_open_db_encrypted_with_sqlcipher() { + // $ sqlcipher SQLiteTests/fixtures/encrypted.sqlite + // sqlite> pragma key = 'sqlcipher-test'; + // sqlite> CREATE TABLE foo (bar TEXT); + // sqlite> INSERT INTO foo (bar) VALUES ('world'); + let encryptedFile = fixture("encrypted", withExtension: "sqlite") + + try! FileManager.default.setAttributes([FileAttributeKey.immutable : 1], ofItemAtPath: encryptedFile) + XCTAssertFalse(FileManager.default.isWritableFile(atPath: encryptedFile)) + + let conn = try! Connection(encryptedFile) + try! conn.key("sqlcipher-test") + XCTAssertEqual(1, try! conn.scalar("SELECT count(*) FROM foo") as? Int64) + } + + private func keyData(length: Int = 64) -> NSMutableData { + let keyData = NSMutableData(length: length)! + let result = SecRandomCopyBytes(kSecRandomDefault, length, + keyData.mutableBytes.assumingMemoryBound(to: UInt8.self)) + XCTAssertEqual(0, result) + return keyData + } +} +#endif diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ConnectionTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ConnectionTests.swift new file mode 100644 index 0000000000..59514a25ca --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ConnectionTests.swift @@ -0,0 +1,384 @@ +import XCTest +@testable import SQLite + +#if SQLITE_SWIFT_STANDALONE +import sqlite3 +#elseif SQLITE_SWIFT_SQLCIPHER +import SQLCipher +#else +import CSQLite +#endif + +class ConnectionTests : SQLiteTestCase { + + override func setUp() { + super.setUp() + + CreateUsersTable() + } + + func test_init_withInMemory_returnsInMemoryConnection() { + let db = try! Connection(.inMemory) + XCTAssertEqual("", db.description) + } + + func test_init_returnsInMemoryByDefault() { + let db = try! Connection() + XCTAssertEqual("", db.description) + } + + func test_init_withTemporary_returnsTemporaryConnection() { + let db = try! Connection(.temporary) + XCTAssertEqual("", db.description) + } + + func test_init_withURI_returnsURIConnection() { + let db = try! Connection(.uri("\(NSTemporaryDirectory())/SQLite.swift Tests.sqlite3")) + XCTAssertEqual("\(NSTemporaryDirectory())/SQLite.swift Tests.sqlite3", db.description) + } + + func test_init_withString_returnsURIConnection() { + let db = try! Connection("\(NSTemporaryDirectory())/SQLite.swift Tests.sqlite3") + XCTAssertEqual("\(NSTemporaryDirectory())/SQLite.swift Tests.sqlite3", db.description) + } + + func test_readonly_returnsFalseOnReadWriteConnections() { + XCTAssertFalse(db.readonly) + } + + func test_readonly_returnsTrueOnReadOnlyConnections() { + let db = try! Connection(readonly: true) + XCTAssertTrue(db.readonly) + } + + func test_changes_returnsZeroOnNewConnections() { + XCTAssertEqual(0, db.changes) + } + + func test_lastInsertRowid_returnsLastIdAfterInserts() { + try! InsertUser("alice") + XCTAssertEqual(1, db.lastInsertRowid) + } + + func test_lastInsertRowid_doesNotResetAfterError() { + XCTAssert(db.lastInsertRowid == 0) + try! InsertUser("alice") + XCTAssertEqual(1, db.lastInsertRowid) + XCTAssertThrowsError( + try db.run("INSERT INTO \"users\" (email, age, admin) values ('invalid@example.com', 12, 'invalid')") + ) { error in + if case SQLite.Result.error(_, let code, _) = error { + XCTAssertEqual(SQLITE_CONSTRAINT, code) + } else { + XCTFail("expected error") + } + } + XCTAssertEqual(1, db.lastInsertRowid) + } + + func test_changes_returnsNumberOfChanges() { + try! InsertUser("alice") + XCTAssertEqual(1, db.changes) + try! InsertUser("betsy") + XCTAssertEqual(1, db.changes) + } + + func test_totalChanges_returnsTotalNumberOfChanges() { + XCTAssertEqual(0, db.totalChanges) + try! InsertUser("alice") + XCTAssertEqual(1, db.totalChanges) + try! InsertUser("betsy") + XCTAssertEqual(2, db.totalChanges) + } + + func test_prepare_preparesAndReturnsStatements() { + _ = try! db.prepare("SELECT * FROM users WHERE admin = 0") + _ = try! db.prepare("SELECT * FROM users WHERE admin = ?", 0) + _ = try! db.prepare("SELECT * FROM users WHERE admin = ?", [0]) + _ = try! db.prepare("SELECT * FROM users WHERE admin = $admin", ["$admin": 0]) + } + + func test_run_preparesRunsAndReturnsStatements() { + try! db.run("SELECT * FROM users WHERE admin = 0") + try! db.run("SELECT * FROM users WHERE admin = ?", 0) + try! db.run("SELECT * FROM users WHERE admin = ?", [0]) + try! db.run("SELECT * FROM users WHERE admin = $admin", ["$admin": 0]) + AssertSQL("SELECT * FROM users WHERE admin = 0", 4) + } + + func test_scalar_preparesRunsAndReturnsScalarValues() { + XCTAssertEqual(0, try! db.scalar("SELECT count(*) FROM users WHERE admin = 0") as? Int64) + XCTAssertEqual(0, try! db.scalar("SELECT count(*) FROM users WHERE admin = ?", 0) as? Int64) + XCTAssertEqual(0, try! db.scalar("SELECT count(*) FROM users WHERE admin = ?", [0]) as? Int64) + XCTAssertEqual(0, try! db.scalar("SELECT count(*) FROM users WHERE admin = $admin", ["$admin": 0]) as? Int64) + AssertSQL("SELECT count(*) FROM users WHERE admin = 0", 4) + } + + func test_execute_comment() { + try! db.run("-- this is a comment\nSELECT 1") + AssertSQL("-- this is a comment", 0) + AssertSQL("SELECT 1", 0) + } + + func test_transaction_executesBeginDeferred() { + try! db.transaction(.deferred) {} + + AssertSQL("BEGIN DEFERRED TRANSACTION") + } + + func test_transaction_executesBeginImmediate() { + try! db.transaction(.immediate) {} + + AssertSQL("BEGIN IMMEDIATE TRANSACTION") + } + + func test_transaction_executesBeginExclusive() { + try! db.transaction(.exclusive) {} + + AssertSQL("BEGIN EXCLUSIVE TRANSACTION") + } + + func test_transaction_beginsAndCommitsTransactions() { + let stmt = try! db.prepare("INSERT INTO users (email) VALUES (?)", "alice@example.com") + + try! db.transaction { + try stmt.run() + } + + AssertSQL("BEGIN DEFERRED TRANSACTION") + AssertSQL("INSERT INTO users (email) VALUES ('alice@example.com')") + AssertSQL("COMMIT TRANSACTION") + AssertSQL("ROLLBACK TRANSACTION", 0) + } + + func test_transaction_beginsAndRollsTransactionsBack() { + let stmt = try! db.prepare("INSERT INTO users (email) VALUES (?)", "alice@example.com") + + do { + try db.transaction { + try stmt.run() + try stmt.run() + } + } catch { + } + + AssertSQL("BEGIN DEFERRED TRANSACTION") + AssertSQL("INSERT INTO users (email) VALUES ('alice@example.com')", 2) + AssertSQL("ROLLBACK TRANSACTION") + AssertSQL("COMMIT TRANSACTION", 0) + } + + func test_savepoint_beginsAndCommitsSavepoints() { + let db = self.db + + try! db.savepoint("1") { + try db.savepoint("2") { + try db.run("INSERT INTO users (email) VALUES (?)", "alice@example.com") + } + } + + AssertSQL("SAVEPOINT '1'") + AssertSQL("SAVEPOINT '2'") + AssertSQL("INSERT INTO users (email) VALUES ('alice@example.com')") + AssertSQL("RELEASE SAVEPOINT '2'") + AssertSQL("RELEASE SAVEPOINT '1'") + AssertSQL("ROLLBACK TO SAVEPOINT '2'", 0) + AssertSQL("ROLLBACK TO SAVEPOINT '1'", 0) + } + + func test_savepoint_beginsAndRollsSavepointsBack() { + let db = self.db + let stmt = try! db.prepare("INSERT INTO users (email) VALUES (?)", "alice@example.com") + + do { + try db.savepoint("1") { + try db.savepoint("2") { + try stmt.run() + try stmt.run() + try stmt.run() + } + try db.savepoint("2") { + try stmt.run() + try stmt.run() + try stmt.run() + } + } + } catch { + } + + AssertSQL("SAVEPOINT '1'") + AssertSQL("SAVEPOINT '2'") + AssertSQL("INSERT INTO users (email) VALUES ('alice@example.com')", 2) + AssertSQL("ROLLBACK TO SAVEPOINT '2'") + AssertSQL("ROLLBACK TO SAVEPOINT '1'") + AssertSQL("RELEASE SAVEPOINT '2'", 0) + AssertSQL("RELEASE SAVEPOINT '1'", 0) + } + + func test_updateHook_setsUpdateHook_withInsert() { + async { done in + db.updateHook { operation, db, table, rowid in + XCTAssertEqual(Connection.Operation.insert, operation) + XCTAssertEqual("main", db) + XCTAssertEqual("users", table) + XCTAssertEqual(1, rowid) + done() + } + try! InsertUser("alice") + } + } + + func test_updateHook_setsUpdateHook_withUpdate() { + try! InsertUser("alice") + async { done in + db.updateHook { operation, db, table, rowid in + XCTAssertEqual(Connection.Operation.update, operation) + XCTAssertEqual("main", db) + XCTAssertEqual("users", table) + XCTAssertEqual(1, rowid) + done() + } + try! db.run("UPDATE users SET email = 'alice@example.com'") + } + } + + func test_updateHook_setsUpdateHook_withDelete() { + try! InsertUser("alice") + async { done in + db.updateHook { operation, db, table, rowid in + XCTAssertEqual(Connection.Operation.delete, operation) + XCTAssertEqual("main", db) + XCTAssertEqual("users", table) + XCTAssertEqual(1, rowid) + done() + } + try! db.run("DELETE FROM users WHERE id = 1") + } + } + + func test_commitHook_setsCommitHook() { + async { done in + db.commitHook { + done() + } + try! db.transaction { + try self.InsertUser("alice") + } + XCTAssertEqual(1, try! db.scalar("SELECT count(*) FROM users") as? Int64) + } + } + + func test_rollbackHook_setsRollbackHook() { + async { done in + db.rollbackHook(done) + do { + try db.transaction { + try self.InsertUser("alice") + try self.InsertUser("alice") // throw + } + } catch { + } + XCTAssertEqual(0, try! db.scalar("SELECT count(*) FROM users") as? Int64) + } + } + + func test_commitHook_withRollback_rollsBack() { + async { done in + db.commitHook { + throw NSError(domain: "com.stephencelis.SQLiteTests", code: 1, userInfo: nil) + } + db.rollbackHook(done) + do { + try db.transaction { + try self.InsertUser("alice") + } + } catch { + } + XCTAssertEqual(0, try! db.scalar("SELECT count(*) FROM users") as? Int64) + } + } + + func test_createFunction_withArrayArguments() { + db.createFunction("hello") { $0[0].map { "Hello, \($0)!" } } + + XCTAssertEqual("Hello, world!", try! db.scalar("SELECT hello('world')") as? String) + XCTAssert(try! db.scalar("SELECT hello(NULL)") == nil) + } + + func test_createFunction_createsQuotableFunction() { + db.createFunction("hello world") { $0[0].map { "Hello, \($0)!" } } + + XCTAssertEqual("Hello, world!", try! db.scalar("SELECT \"hello world\"('world')") as? String) + XCTAssert(try! db.scalar("SELECT \"hello world\"(NULL)") == nil) + } + + func test_createCollation_createsCollation() { + try! db.createCollation("NODIACRITIC") { lhs, rhs in + return lhs.compare(rhs, options: .diacriticInsensitive) + } + XCTAssertEqual(1, try! db.scalar("SELECT ? = ? COLLATE NODIACRITIC", "cafe", "café") as? Int64) + } + + func test_createCollation_createsQuotableCollation() { + try! db.createCollation("NO DIACRITIC") { lhs, rhs in + return lhs.compare(rhs, options: .diacriticInsensitive) + } + XCTAssertEqual(1, try! db.scalar("SELECT ? = ? COLLATE \"NO DIACRITIC\"", "cafe", "café") as? Int64) + } + + func test_interrupt_interruptsLongRunningQuery() { + try! InsertUsers("abcdefghijklmnopqrstuvwxyz".characters.map { String($0) }) + db.createFunction("sleep") { args in + usleep(UInt32((args[0] as? Double ?? Double(args[0] as? Int64 ?? 1)) * 1_000_000)) + return nil + } + + let stmt = try! db.prepare("SELECT *, sleep(?) FROM users", 0.1) + try! stmt.run() + + let deadline = DispatchTime.now() + Double(Int64(10 * NSEC_PER_MSEC)) / Double(NSEC_PER_SEC) + _ = DispatchQueue.global(priority: .background).asyncAfter(deadline: deadline, execute: db.interrupt) + AssertThrows(try stmt.run()) + } + +} + + +class ResultTests : XCTestCase { + let connection = try! Connection(.inMemory) + + func test_init_with_ok_code_returns_nil() { + XCTAssertNil(Result(errorCode: SQLITE_OK, connection: connection, statement: nil) as Result?) + } + + func test_init_with_row_code_returns_nil() { + XCTAssertNil(Result(errorCode: SQLITE_ROW, connection: connection, statement: nil) as Result?) + } + + func test_init_with_done_code_returns_nil() { + XCTAssertNil(Result(errorCode: SQLITE_DONE, connection: connection, statement: nil) as Result?) + } + + func test_init_with_other_code_returns_error() { + if case .some(.error(let message, let code, let statement)) = + Result(errorCode: SQLITE_MISUSE, connection: connection, statement: nil) { + XCTAssertEqual("not an error", message) + XCTAssertEqual(SQLITE_MISUSE, code) + XCTAssertNil(statement) + XCTAssert(self.connection === connection) + } else { + XCTFail() + } + } + + func test_description_contains_error_code() { + XCTAssertEqual("not an error (code: 21)", + Result(errorCode: SQLITE_MISUSE, connection: connection, statement: nil)?.description) + } + + func test_description_contains_statement_and_error_code() { + let statement = try! Statement(connection, "SELECT 1") + XCTAssertEqual("not an error (SELECT 1) (code: 21)", + Result(errorCode: SQLITE_MISUSE, connection: connection, statement: statement)?.description) + } +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CoreFunctionsTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CoreFunctionsTests.swift new file mode 100644 index 0000000000..db37ff7ff0 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CoreFunctionsTests.swift @@ -0,0 +1,136 @@ +import XCTest +import SQLite + +class CoreFunctionsTests : XCTestCase { + + func test_round_wrapsDoubleExpressionsWithRoundFunction() { + AssertSQL("round(\"double\")", double.round()) + AssertSQL("round(\"doubleOptional\")", doubleOptional.round()) + + AssertSQL("round(\"double\", 1)", double.round(1)) + AssertSQL("round(\"doubleOptional\", 2)", doubleOptional.round(2)) + } + + func test_random_generatesExpressionWithRandomFunction() { + AssertSQL("random()", Expression.random()) + AssertSQL("random()", Expression.random()) + } + + func test_length_wrapsStringExpressionWithLengthFunction() { + AssertSQL("length(\"string\")", string.length) + AssertSQL("length(\"stringOptional\")", stringOptional.length) + } + + func test_lowercaseString_wrapsStringExpressionWithLowerFunction() { + AssertSQL("lower(\"string\")", string.lowercaseString) + AssertSQL("lower(\"stringOptional\")", stringOptional.lowercaseString) + } + + func test_uppercaseString_wrapsStringExpressionWithUpperFunction() { + AssertSQL("upper(\"string\")", string.uppercaseString) + AssertSQL("upper(\"stringOptional\")", stringOptional.uppercaseString) + } + + func test_like_buildsExpressionWithLikeOperator() { + AssertSQL("(\"string\" LIKE 'a%')", string.like("a%")) + AssertSQL("(\"stringOptional\" LIKE 'b%')", stringOptional.like("b%")) + + AssertSQL("(\"string\" LIKE '%\\%' ESCAPE '\\')", string.like("%\\%", escape: "\\")) + AssertSQL("(\"stringOptional\" LIKE '_\\_' ESCAPE '\\')", stringOptional.like("_\\_", escape: "\\")) + } + + func test_glob_buildsExpressionWithGlobOperator() { + AssertSQL("(\"string\" GLOB 'a*')", string.glob("a*")) + AssertSQL("(\"stringOptional\" GLOB 'b*')", stringOptional.glob("b*")) + } + + func test_match_buildsExpressionWithMatchOperator() { + AssertSQL("(\"string\" MATCH 'a*')", string.match("a*")) + AssertSQL("(\"stringOptional\" MATCH 'b*')", stringOptional.match("b*")) + } + + func test_regexp_buildsExpressionWithRegexpOperator() { + AssertSQL("(\"string\" REGEXP '^.+@.+\\.com$')", string.regexp("^.+@.+\\.com$")) + AssertSQL("(\"stringOptional\" REGEXP '^.+@.+\\.net$')", stringOptional.regexp("^.+@.+\\.net$")) + } + + func test_collate_buildsExpressionWithCollateOperator() { + AssertSQL("(\"string\" COLLATE BINARY)", string.collate(.binary)) + AssertSQL("(\"string\" COLLATE NOCASE)", string.collate(.nocase)) + AssertSQL("(\"string\" COLLATE RTRIM)", string.collate(.rtrim)) + AssertSQL("(\"string\" COLLATE \"CUSTOM\")", string.collate(.custom("CUSTOM"))) + + AssertSQL("(\"stringOptional\" COLLATE BINARY)", stringOptional.collate(.binary)) + AssertSQL("(\"stringOptional\" COLLATE NOCASE)", stringOptional.collate(.nocase)) + AssertSQL("(\"stringOptional\" COLLATE RTRIM)", stringOptional.collate(.rtrim)) + AssertSQL("(\"stringOptional\" COLLATE \"CUSTOM\")", stringOptional.collate(.custom("CUSTOM"))) + } + + func test_ltrim_wrapsStringWithLtrimFunction() { + AssertSQL("ltrim(\"string\")", string.ltrim()) + AssertSQL("ltrim(\"stringOptional\")", stringOptional.ltrim()) + + AssertSQL("ltrim(\"string\", ' ')", string.ltrim([" "])) + AssertSQL("ltrim(\"stringOptional\", ' ')", stringOptional.ltrim([" "])) + } + + func test_ltrim_wrapsStringWithRtrimFunction() { + AssertSQL("rtrim(\"string\")", string.rtrim()) + AssertSQL("rtrim(\"stringOptional\")", stringOptional.rtrim()) + + AssertSQL("rtrim(\"string\", ' ')", string.rtrim([" "])) + AssertSQL("rtrim(\"stringOptional\", ' ')", stringOptional.rtrim([" "])) + } + + func test_ltrim_wrapsStringWithTrimFunction() { + AssertSQL("trim(\"string\")", string.trim()) + AssertSQL("trim(\"stringOptional\")", stringOptional.trim()) + + AssertSQL("trim(\"string\", ' ')", string.trim([" "])) + AssertSQL("trim(\"stringOptional\", ' ')", stringOptional.trim([" "])) + } + + func test_replace_wrapsStringWithReplaceFunction() { + AssertSQL("replace(\"string\", '@example.com', '@example.net')", string.replace("@example.com", with: "@example.net")) + AssertSQL("replace(\"stringOptional\", '@example.net', '@example.com')", stringOptional.replace("@example.net", with: "@example.com")) + } + + func test_substring_wrapsStringWithSubstrFunction() { + AssertSQL("substr(\"string\", 1, 2)", string.substring(1, length: 2)) + AssertSQL("substr(\"stringOptional\", 2, 1)", stringOptional.substring(2, length: 1)) + } + + func test_subscriptWithRange_wrapsStringWithSubstrFunction() { + AssertSQL("substr(\"string\", 1, 2)", string[1..<3]) + AssertSQL("substr(\"stringOptional\", 2, 1)", stringOptional[2..<3]) + } + + func test_nilCoalescingOperator_wrapsOptionalsWithIfnullFunction() { + AssertSQL("ifnull(\"intOptional\", 1)", intOptional ?? 1) + // AssertSQL("ifnull(\"doubleOptional\", 1.0)", doubleOptional ?? 1) // rdar://problem/21677256 + XCTAssertEqual("ifnull(\"doubleOptional\", 1.0)", (doubleOptional ?? 1).asSQL()) + AssertSQL("ifnull(\"stringOptional\", 'literal')", stringOptional ?? "literal") + + AssertSQL("ifnull(\"intOptional\", \"int\")", intOptional ?? int) + AssertSQL("ifnull(\"doubleOptional\", \"double\")", doubleOptional ?? double) + AssertSQL("ifnull(\"stringOptional\", \"string\")", stringOptional ?? string) + + AssertSQL("ifnull(\"intOptional\", \"intOptional\")", intOptional ?? intOptional) + AssertSQL("ifnull(\"doubleOptional\", \"doubleOptional\")", doubleOptional ?? doubleOptional) + AssertSQL("ifnull(\"stringOptional\", \"stringOptional\")", stringOptional ?? stringOptional) + } + + func test_absoluteValue_wrapsNumberWithAbsFucntion() { + AssertSQL("abs(\"int\")", int.absoluteValue) + AssertSQL("abs(\"intOptional\")", intOptional.absoluteValue) + + AssertSQL("abs(\"double\")", double.absoluteValue) + AssertSQL("abs(\"doubleOptional\")", doubleOptional.absoluteValue) + } + + func test_contains_buildsExpressionWithInOperator() { + AssertSQL("(\"string\" IN ('hello', 'world'))", ["hello", "world"].contains(string)) + AssertSQL("(\"stringOptional\" IN ('hello', 'world'))", ["hello", "world"].contains(stringOptional)) + } + +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CustomFunctionsTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CustomFunctionsTests.swift new file mode 100644 index 0000000000..67150ccf20 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CustomFunctionsTests.swift @@ -0,0 +1,6 @@ +import XCTest +import SQLite + +class CustomFunctionsTests : XCTestCase { + +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ExpressionTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ExpressionTests.swift new file mode 100644 index 0000000000..036e10ceb6 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ExpressionTests.swift @@ -0,0 +1,6 @@ +import XCTest +import SQLite + +class ExpressionTests : XCTestCase { + +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS4Tests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS4Tests.swift new file mode 100644 index 0000000000..4373bf8b0e --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS4Tests.swift @@ -0,0 +1,208 @@ +import XCTest +import SQLite + +class FTS4Tests : XCTestCase { + + func test_create_onVirtualTable_withFTS4_compilesCreateVirtualTableExpression() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4()", + virtualTable.create(.FTS4()) + ) + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"string\")", + virtualTable.create(.FTS4(string)) + ) + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=simple)", + virtualTable.create(.FTS4(tokenize: .Simple)) + ) + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"string\", tokenize=porter)", + virtualTable.create(.FTS4([string], tokenize: .Porter)) + ) + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=unicode61 \"removeDiacritics=0\")", + virtualTable.create(.FTS4(tokenize: .Unicode61(removeDiacritics: false))) + ) + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=unicode61 \"removeDiacritics=1\" \"tokenchars=.\" \"separators=X\")", + virtualTable.create(.FTS4(tokenize: .Unicode61(removeDiacritics: true, tokenchars: ["."], separators: ["X"]))) + ) + } + + func test_match_onVirtualTableAsExpression_compilesMatchExpression() { + AssertSQL("(\"virtual_table\" MATCH 'string')", virtualTable.match("string") as Expression) + AssertSQL("(\"virtual_table\" MATCH \"string\")", virtualTable.match(string) as Expression) + AssertSQL("(\"virtual_table\" MATCH \"stringOptional\")", virtualTable.match(stringOptional) as Expression) + } + + func test_match_onVirtualTableAsQueryType_compilesMatchExpression() { + AssertSQL("SELECT * FROM \"virtual_table\" WHERE (\"virtual_table\" MATCH 'string')", virtualTable.match("string") as QueryType) + AssertSQL("SELECT * FROM \"virtual_table\" WHERE (\"virtual_table\" MATCH \"string\")", virtualTable.match(string) as QueryType) + AssertSQL("SELECT * FROM \"virtual_table\" WHERE (\"virtual_table\" MATCH \"stringOptional\")", virtualTable.match(stringOptional) as QueryType) + } + +} + +class FTS4ConfigTests : XCTestCase { + var config: FTS4Config! + + override func setUp() { + super.setUp() + config = FTS4Config() + } + + func test_empty_config() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4()", + sql(config)) + } + + func test_config_column() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"string\")", + sql(config.column(string))) + } + + func test_config_columns() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"string\", \"int\")", + sql(config.columns([string, int]))) + } + + func test_config_unindexed_column() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"string\", notindexed=\"string\")", + sql(config.column(string, [.unindexed]))) + } + + func test_external_content_view() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(content=\"view\")", + sql(config.externalContent(_view ))) + } + + func test_external_content_virtual_table() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(content=\"virtual_table\")", + sql(config.externalContent(virtualTable))) + } + + func test_tokenizer_simple() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=simple)", + sql(config.tokenizer(.Simple))) + } + + func test_tokenizer_porter() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=porter)", + sql(config.tokenizer(.Porter))) + } + + func test_tokenizer_unicode61() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=unicode61)", + sql(config.tokenizer(.Unicode61()))) + } + + func test_tokenizer_unicode61_with_options() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=unicode61 \"removeDiacritics=1\" \"tokenchars=.\" \"separators=X\")", + sql(config.tokenizer(.Unicode61(removeDiacritics: true, tokenchars: ["."], separators: ["X"])))) + } + + func test_content_less() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(content=\"\")", + sql(config.contentless())) + } + + func test_config_matchinfo() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(matchinfo=\"fts3\")", + sql(config.matchInfo(.fts3))) + } + + func test_config_order_asc() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(order=\"asc\")", + sql(config.order(.asc))) + } + + func test_config_order_desc() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(order=\"desc\")", + sql(config.order(.desc))) + } + + func test_config_compress() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(compress=\"compress_foo\")", + sql(config.compress("compress_foo"))) + } + + func test_config_uncompress() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(uncompress=\"uncompress_foo\")", + sql(config.uncompress("uncompress_foo"))) + } + + func test_config_languageId() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(languageid=\"lid\")", + sql(config.languageId("lid"))) + } + + func test_config_all() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"int\", \"string\", \"date\", tokenize=porter, prefix=\"2,4\", content=\"table\", notindexed=\"string\", notindexed=\"date\", languageid=\"lid\", matchinfo=\"fts3\", order=\"desc\")", + sql(config + .tokenizer(.Porter) + .column(int) + .column(string, [.unindexed]) + .column(date, [.unindexed]) + .externalContent(table) + .matchInfo(.fts3) + .languageId("lid") + .order(.desc) + .prefix([2, 4])) + ) + } + + func sql(_ config: FTS4Config) -> String { + return virtualTable.create(.FTS4(config)) + } +} + +class FTS4IntegrationTests : SQLiteTestCase { +#if !SQLITE_SWIFT_STANDALONE && !SQLITE_SWIFT_SQLCIPHER + func test_registerTokenizer_registersTokenizer() { + let emails = VirtualTable("emails") + let subject = Expression("subject") + let body = Expression("body") + + let locale = CFLocaleCopyCurrent() + let tokenizerName = "tokenizer" + let tokenizer = CFStringTokenizerCreate(nil, "" as CFString!, CFRangeMake(0, 0), UInt(kCFStringTokenizerUnitWord), locale) + try! db.registerTokenizer(tokenizerName) { string in + CFStringTokenizerSetString(tokenizer, string as CFString, CFRangeMake(0, CFStringGetLength(string as CFString))) + if CFStringTokenizerAdvanceToNextToken(tokenizer).isEmpty { + return nil + } + let range = CFStringTokenizerGetCurrentTokenRange(tokenizer) + let input = CFStringCreateWithSubstring(kCFAllocatorDefault, string as CFString, range)! + let token = CFStringCreateMutableCopy(nil, range.length, input)! + CFStringLowercase(token, locale) + CFStringTransform(token, nil, kCFStringTransformStripDiacritics, false) + return (token as String, string.range(of: input as String)!) + } + + try! db.run(emails.create(.FTS4([subject, body], tokenize: .Custom(tokenizerName)))) + AssertSQL("CREATE VIRTUAL TABLE \"emails\" USING fts4(\"subject\", \"body\", tokenize=\"SQLite.swift\" \"tokenizer\")") + + try! _ = db.run(emails.insert(subject <- "Aún más cáfe!")) + XCTAssertEqual(1, try! db.scalar(emails.filter(emails.match("aun")).count)) + } +#endif +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS5Tests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS5Tests.swift new file mode 100644 index 0000000000..63d8dc4043 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS5Tests.swift @@ -0,0 +1,124 @@ +import XCTest +import SQLite + +class FTS5Tests: XCTestCase { + var config: FTS5Config! + + override func setUp() { + super.setUp() + config = FTS5Config() + } + + func test_empty_config() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5()", + sql(config)) + } + + func test_config_column() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(\"string\")", + sql(config.column(string))) + } + + func test_config_columns() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(\"string\", \"int\")", + sql(config.columns([string, int]))) + } + + func test_config_unindexed_column() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(\"string\" UNINDEXED)", + sql(config.column(string, [.unindexed]))) + } + + func test_external_content_table() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(content=\"table\")", + sql(config.externalContent(table))) + } + + func test_external_content_view() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(content=\"view\")", + sql(config.externalContent(_view))) + } + + func test_external_content_virtual_table() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(content=\"virtual_table\")", + sql(config.externalContent(virtualTable))) + } + + func test_content_less() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(content=\"\")", + sql(config.contentless())) + } + + func test_content_rowid() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(content_rowid=\"string\")", + sql(config.contentRowId(string))) + } + + func test_tokenizer_porter() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(tokenize=porter)", + sql(config.tokenizer(.Porter))) + } + + func test_tokenizer_unicode61() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(tokenize=unicode61)", + sql(config.tokenizer(.Unicode61()))) + } + + func test_tokenizer_unicode61_with_options() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(tokenize=unicode61 \"removeDiacritics=1\" \"tokenchars=.\" \"separators=X\")", + sql(config.tokenizer(.Unicode61(removeDiacritics: true, tokenchars: ["."], separators: ["X"])))) + } + + func test_column_size() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(columnsize=1)", + sql(config.columnSize(1))) + } + + func test_detail_full() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(detail=\"full\")", + sql(config.detail(.full))) + } + + func test_detail_column() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(detail=\"column\")", + sql(config.detail(.column))) + } + + func test_detail_none() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(detail=\"none\")", + sql(config.detail(.none))) + } + + func test_fts5_config_all() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(\"int\", \"string\" UNINDEXED, \"date\" UNINDEXED, tokenize=porter, prefix=\"2,4\", content=\"table\")", + sql(config + .tokenizer(.Porter) + .column(int) + .column(string, [.unindexed]) + .column(date, [.unindexed]) + .externalContent(table) + .prefix([2, 4])) + ) + } + + func sql(_ config: FTS5Config) -> String { + return virtualTable.create(.FTS5(config)) + } +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Fixtures.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Fixtures.swift new file mode 100644 index 0000000000..13f83f7715 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Fixtures.swift @@ -0,0 +1,8 @@ +import Foundation + +func fixture(_ name: String, withExtension: String?) -> String { + let testBundle = Bundle(for: SQLiteTestCase.self) + return testBundle.url( + forResource: URL(string: "fixtures")?.appendingPathComponent(name).path, + withExtension: withExtension)!.path +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FoundationTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FoundationTests.swift new file mode 100644 index 0000000000..0df746d9e5 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FoundationTests.swift @@ -0,0 +1,16 @@ +import XCTest +import SQLite + +class FoundationTests : XCTestCase { + func testDataFromBlob() { + let data = Data(bytes: [1, 2, 3]) + let blob = data.datatypeValue + XCTAssertEqual([1, 2, 3], blob.bytes) + } + + func testBlobToData() { + let blob = Blob(bytes: [1, 2, 3]) + let data = Data.fromDatatypeValue(blob) + XCTAssertEqual(Data(bytes: [1, 2, 3]), data) + } +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Info.plist b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Info.plist new file mode 100644 index 0000000000..ba72822e87 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/OperatorsTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/OperatorsTests.swift new file mode 100644 index 0000000000..f0e585cd70 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/OperatorsTests.swift @@ -0,0 +1,296 @@ +import XCTest +import SQLite + +class OperatorsTests : XCTestCase { + + func test_stringExpressionPlusStringExpression_buildsConcatenatingStringExpression() { + AssertSQL("(\"string\" || \"string\")", string + string) + AssertSQL("(\"string\" || \"stringOptional\")", string + stringOptional) + AssertSQL("(\"stringOptional\" || \"string\")", stringOptional + string) + AssertSQL("(\"stringOptional\" || \"stringOptional\")", stringOptional + stringOptional) + AssertSQL("(\"string\" || 'literal')", string + "literal") + AssertSQL("(\"stringOptional\" || 'literal')", stringOptional + "literal") + AssertSQL("('literal' || \"string\")", "literal" + string) + AssertSQL("('literal' || \"stringOptional\")", "literal" + stringOptional) + } + + func test_numberExpression_plusNumberExpression_buildsAdditiveNumberExpression() { + AssertSQL("(\"int\" + \"int\")", int + int) + AssertSQL("(\"int\" + \"intOptional\")", int + intOptional) + AssertSQL("(\"intOptional\" + \"int\")", intOptional + int) + AssertSQL("(\"intOptional\" + \"intOptional\")", intOptional + intOptional) + AssertSQL("(\"int\" + 1)", int + 1) + AssertSQL("(\"intOptional\" + 1)", intOptional + 1) + AssertSQL("(1 + \"int\")", 1 + int) + AssertSQL("(1 + \"intOptional\")", 1 + intOptional) + + AssertSQL("(\"double\" + \"double\")", double + double) + AssertSQL("(\"double\" + \"doubleOptional\")", double + doubleOptional) + AssertSQL("(\"doubleOptional\" + \"double\")", doubleOptional + double) + AssertSQL("(\"doubleOptional\" + \"doubleOptional\")", doubleOptional + doubleOptional) + AssertSQL("(\"double\" + 1.0)", double + 1) + AssertSQL("(\"doubleOptional\" + 1.0)", doubleOptional + 1) + AssertSQL("(1.0 + \"double\")", 1 + double) + AssertSQL("(1.0 + \"doubleOptional\")", 1 + doubleOptional) + } + + func test_numberExpression_minusNumberExpression_buildsSubtractiveNumberExpression() { + AssertSQL("(\"int\" - \"int\")", int - int) + AssertSQL("(\"int\" - \"intOptional\")", int - intOptional) + AssertSQL("(\"intOptional\" - \"int\")", intOptional - int) + AssertSQL("(\"intOptional\" - \"intOptional\")", intOptional - intOptional) + AssertSQL("(\"int\" - 1)", int - 1) + AssertSQL("(\"intOptional\" - 1)", intOptional - 1) + AssertSQL("(1 - \"int\")", 1 - int) + AssertSQL("(1 - \"intOptional\")", 1 - intOptional) + + AssertSQL("(\"double\" - \"double\")", double - double) + AssertSQL("(\"double\" - \"doubleOptional\")", double - doubleOptional) + AssertSQL("(\"doubleOptional\" - \"double\")", doubleOptional - double) + AssertSQL("(\"doubleOptional\" - \"doubleOptional\")", doubleOptional - doubleOptional) + AssertSQL("(\"double\" - 1.0)", double - 1) + AssertSQL("(\"doubleOptional\" - 1.0)", doubleOptional - 1) + AssertSQL("(1.0 - \"double\")", 1 - double) + AssertSQL("(1.0 - \"doubleOptional\")", 1 - doubleOptional) + } + + func test_numberExpression_timesNumberExpression_buildsMultiplicativeNumberExpression() { + AssertSQL("(\"int\" * \"int\")", int * int) + AssertSQL("(\"int\" * \"intOptional\")", int * intOptional) + AssertSQL("(\"intOptional\" * \"int\")", intOptional * int) + AssertSQL("(\"intOptional\" * \"intOptional\")", intOptional * intOptional) + AssertSQL("(\"int\" * 1)", int * 1) + AssertSQL("(\"intOptional\" * 1)", intOptional * 1) + AssertSQL("(1 * \"int\")", 1 * int) + AssertSQL("(1 * \"intOptional\")", 1 * intOptional) + + AssertSQL("(\"double\" * \"double\")", double * double) + AssertSQL("(\"double\" * \"doubleOptional\")", double * doubleOptional) + AssertSQL("(\"doubleOptional\" * \"double\")", doubleOptional * double) + AssertSQL("(\"doubleOptional\" * \"doubleOptional\")", doubleOptional * doubleOptional) + AssertSQL("(\"double\" * 1.0)", double * 1) + AssertSQL("(\"doubleOptional\" * 1.0)", doubleOptional * 1) + AssertSQL("(1.0 * \"double\")", 1 * double) + AssertSQL("(1.0 * \"doubleOptional\")", 1 * doubleOptional) + } + + func test_numberExpression_dividedByNumberExpression_buildsDivisiveNumberExpression() { + AssertSQL("(\"int\" / \"int\")", int / int) + AssertSQL("(\"int\" / \"intOptional\")", int / intOptional) + AssertSQL("(\"intOptional\" / \"int\")", intOptional / int) + AssertSQL("(\"intOptional\" / \"intOptional\")", intOptional / intOptional) + AssertSQL("(\"int\" / 1)", int / 1) + AssertSQL("(\"intOptional\" / 1)", intOptional / 1) + AssertSQL("(1 / \"int\")", 1 / int) + AssertSQL("(1 / \"intOptional\")", 1 / intOptional) + + AssertSQL("(\"double\" / \"double\")", double / double) + AssertSQL("(\"double\" / \"doubleOptional\")", double / doubleOptional) + AssertSQL("(\"doubleOptional\" / \"double\")", doubleOptional / double) + AssertSQL("(\"doubleOptional\" / \"doubleOptional\")", doubleOptional / doubleOptional) + AssertSQL("(\"double\" / 1.0)", double / 1) + AssertSQL("(\"doubleOptional\" / 1.0)", doubleOptional / 1) + AssertSQL("(1.0 / \"double\")", 1 / double) + AssertSQL("(1.0 / \"doubleOptional\")", 1 / doubleOptional) + } + + func test_numberExpression_prefixedWithMinus_buildsInvertedNumberExpression() { + AssertSQL("-(\"int\")", -int) + AssertSQL("-(\"intOptional\")", -intOptional) + + AssertSQL("-(\"double\")", -double) + AssertSQL("-(\"doubleOptional\")", -doubleOptional) + } + + func test_integerExpression_moduloIntegerExpression_buildsModuloIntegerExpression() { + AssertSQL("(\"int\" % \"int\")", int % int) + AssertSQL("(\"int\" % \"intOptional\")", int % intOptional) + AssertSQL("(\"intOptional\" % \"int\")", intOptional % int) + AssertSQL("(\"intOptional\" % \"intOptional\")", intOptional % intOptional) + AssertSQL("(\"int\" % 1)", int % 1) + AssertSQL("(\"intOptional\" % 1)", intOptional % 1) + AssertSQL("(1 % \"int\")", 1 % int) + AssertSQL("(1 % \"intOptional\")", 1 % intOptional) + } + + func test_integerExpression_bitShiftLeftIntegerExpression_buildsLeftShiftedIntegerExpression() { + AssertSQL("(\"int\" << \"int\")", int << int) + AssertSQL("(\"int\" << \"intOptional\")", int << intOptional) + AssertSQL("(\"intOptional\" << \"int\")", intOptional << int) + AssertSQL("(\"intOptional\" << \"intOptional\")", intOptional << intOptional) + AssertSQL("(\"int\" << 1)", int << 1) + AssertSQL("(\"intOptional\" << 1)", intOptional << 1) + AssertSQL("(1 << \"int\")", 1 << int) + AssertSQL("(1 << \"intOptional\")", 1 << intOptional) + } + + func test_integerExpression_bitShiftRightIntegerExpression_buildsRightShiftedIntegerExpression() { + AssertSQL("(\"int\" >> \"int\")", int >> int) + AssertSQL("(\"int\" >> \"intOptional\")", int >> intOptional) + AssertSQL("(\"intOptional\" >> \"int\")", intOptional >> int) + AssertSQL("(\"intOptional\" >> \"intOptional\")", intOptional >> intOptional) + AssertSQL("(\"int\" >> 1)", int >> 1) + AssertSQL("(\"intOptional\" >> 1)", intOptional >> 1) + AssertSQL("(1 >> \"int\")", 1 >> int) + AssertSQL("(1 >> \"intOptional\")", 1 >> intOptional) + } + + func test_integerExpression_bitwiseAndIntegerExpression_buildsAndedIntegerExpression() { + AssertSQL("(\"int\" & \"int\")", int & int) + AssertSQL("(\"int\" & \"intOptional\")", int & intOptional) + AssertSQL("(\"intOptional\" & \"int\")", intOptional & int) + AssertSQL("(\"intOptional\" & \"intOptional\")", intOptional & intOptional) + AssertSQL("(\"int\" & 1)", int & 1) + AssertSQL("(\"intOptional\" & 1)", intOptional & 1) + AssertSQL("(1 & \"int\")", 1 & int) + AssertSQL("(1 & \"intOptional\")", 1 & intOptional) + } + + func test_integerExpression_bitwiseOrIntegerExpression_buildsOredIntegerExpression() { + AssertSQL("(\"int\" | \"int\")", int | int) + AssertSQL("(\"int\" | \"intOptional\")", int | intOptional) + AssertSQL("(\"intOptional\" | \"int\")", intOptional | int) + AssertSQL("(\"intOptional\" | \"intOptional\")", intOptional | intOptional) + AssertSQL("(\"int\" | 1)", int | 1) + AssertSQL("(\"intOptional\" | 1)", intOptional | 1) + AssertSQL("(1 | \"int\")", 1 | int) + AssertSQL("(1 | \"intOptional\")", 1 | intOptional) + } + + func test_integerExpression_bitwiseExclusiveOrIntegerExpression_buildsOredIntegerExpression() { + AssertSQL("(~((\"int\" & \"int\")) & (\"int\" | \"int\"))", int ^ int) + AssertSQL("(~((\"int\" & \"intOptional\")) & (\"int\" | \"intOptional\"))", int ^ intOptional) + AssertSQL("(~((\"intOptional\" & \"int\")) & (\"intOptional\" | \"int\"))", intOptional ^ int) + AssertSQL("(~((\"intOptional\" & \"intOptional\")) & (\"intOptional\" | \"intOptional\"))", intOptional ^ intOptional) + AssertSQL("(~((\"int\" & 1)) & (\"int\" | 1))", int ^ 1) + AssertSQL("(~((\"intOptional\" & 1)) & (\"intOptional\" | 1))", intOptional ^ 1) + AssertSQL("(~((1 & \"int\")) & (1 | \"int\"))", 1 ^ int) + AssertSQL("(~((1 & \"intOptional\")) & (1 | \"intOptional\"))", 1 ^ intOptional) + } + + func test_bitwiseNot_integerExpression_buildsComplementIntegerExpression() { + AssertSQL("~(\"int\")", ~int) + AssertSQL("~(\"intOptional\")", ~intOptional) + } + + func test_equalityOperator_withEquatableExpressions_buildsBooleanExpression() { + AssertSQL("(\"bool\" = \"bool\")", bool == bool) + AssertSQL("(\"bool\" = \"boolOptional\")", bool == boolOptional) + AssertSQL("(\"boolOptional\" = \"bool\")", boolOptional == bool) + AssertSQL("(\"boolOptional\" = \"boolOptional\")", boolOptional == boolOptional) + AssertSQL("(\"bool\" = 1)", bool == true) + AssertSQL("(\"boolOptional\" = 1)", boolOptional == true) + AssertSQL("(1 = \"bool\")", true == bool) + AssertSQL("(1 = \"boolOptional\")", true == boolOptional) + + AssertSQL("(\"boolOptional\" IS NULL)", boolOptional == nil) + AssertSQL("(NULL IS \"boolOptional\")", nil == boolOptional) + } + + func test_inequalityOperator_withEquatableExpressions_buildsBooleanExpression() { + AssertSQL("(\"bool\" != \"bool\")", bool != bool) + AssertSQL("(\"bool\" != \"boolOptional\")", bool != boolOptional) + AssertSQL("(\"boolOptional\" != \"bool\")", boolOptional != bool) + AssertSQL("(\"boolOptional\" != \"boolOptional\")", boolOptional != boolOptional) + AssertSQL("(\"bool\" != 1)", bool != true) + AssertSQL("(\"boolOptional\" != 1)", boolOptional != true) + AssertSQL("(1 != \"bool\")", true != bool) + AssertSQL("(1 != \"boolOptional\")", true != boolOptional) + + AssertSQL("(\"boolOptional\" IS NOT NULL)", boolOptional != nil) + AssertSQL("(NULL IS NOT \"boolOptional\")", nil != boolOptional) + } + + func test_greaterThanOperator_withComparableExpressions_buildsBooleanExpression() { + AssertSQL("(\"bool\" > \"bool\")", bool > bool) + AssertSQL("(\"bool\" > \"boolOptional\")", bool > boolOptional) + AssertSQL("(\"boolOptional\" > \"bool\")", boolOptional > bool) + AssertSQL("(\"boolOptional\" > \"boolOptional\")", boolOptional > boolOptional) + AssertSQL("(\"bool\" > 1)", bool > true) + AssertSQL("(\"boolOptional\" > 1)", boolOptional > true) + AssertSQL("(1 > \"bool\")", true > bool) + AssertSQL("(1 > \"boolOptional\")", true > boolOptional) + } + + func test_greaterThanOrEqualToOperator_withComparableExpressions_buildsBooleanExpression() { + AssertSQL("(\"bool\" >= \"bool\")", bool >= bool) + AssertSQL("(\"bool\" >= \"boolOptional\")", bool >= boolOptional) + AssertSQL("(\"boolOptional\" >= \"bool\")", boolOptional >= bool) + AssertSQL("(\"boolOptional\" >= \"boolOptional\")", boolOptional >= boolOptional) + AssertSQL("(\"bool\" >= 1)", bool >= true) + AssertSQL("(\"boolOptional\" >= 1)", boolOptional >= true) + AssertSQL("(1 >= \"bool\")", true >= bool) + AssertSQL("(1 >= \"boolOptional\")", true >= boolOptional) + } + + func test_lessThanOperator_withComparableExpressions_buildsBooleanExpression() { + AssertSQL("(\"bool\" < \"bool\")", bool < bool) + AssertSQL("(\"bool\" < \"boolOptional\")", bool < boolOptional) + AssertSQL("(\"boolOptional\" < \"bool\")", boolOptional < bool) + AssertSQL("(\"boolOptional\" < \"boolOptional\")", boolOptional < boolOptional) + AssertSQL("(\"bool\" < 1)", bool < true) + AssertSQL("(\"boolOptional\" < 1)", boolOptional < true) + AssertSQL("(1 < \"bool\")", true < bool) + AssertSQL("(1 < \"boolOptional\")", true < boolOptional) + } + + func test_lessThanOrEqualToOperator_withComparableExpressions_buildsBooleanExpression() { + AssertSQL("(\"bool\" <= \"bool\")", bool <= bool) + AssertSQL("(\"bool\" <= \"boolOptional\")", bool <= boolOptional) + AssertSQL("(\"boolOptional\" <= \"bool\")", boolOptional <= bool) + AssertSQL("(\"boolOptional\" <= \"boolOptional\")", boolOptional <= boolOptional) + AssertSQL("(\"bool\" <= 1)", bool <= true) + AssertSQL("(\"boolOptional\" <= 1)", boolOptional <= true) + AssertSQL("(1 <= \"bool\")", true <= bool) + AssertSQL("(1 <= \"boolOptional\")", true <= boolOptional) + } + + func test_patternMatchingOperator_withComparableCountableClosedRange_buildsBetweenBooleanExpression() { + AssertSQL("\"int\" BETWEEN 0 AND 5", 0...5 ~= int) + AssertSQL("\"intOptional\" BETWEEN 0 AND 5", 0...5 ~= intOptional) + } + + func test_patternMatchingOperator_withComparableClosedRange_buildsBetweenBooleanExpression() { + AssertSQL("\"double\" BETWEEN 1.2 AND 4.5", 1.2...4.5 ~= double) + AssertSQL("\"doubleOptional\" BETWEEN 1.2 AND 4.5", 1.2...4.5 ~= doubleOptional) + } + + func test_patternMatchingOperator_withomparableClosedRangeString_buildsBetweenBooleanExpression() { + AssertSQL("\"string\" BETWEEN 'a' AND 'b'", "a"..."b" ~= string) + AssertSQL("\"stringOptional\" BETWEEN 'a' AND 'b'", "a"..."b" ~= stringOptional) + } + + func test_doubleAndOperator_withBooleanExpressions_buildsCompoundExpression() { + AssertSQL("(\"bool\" AND \"bool\")", bool && bool) + AssertSQL("(\"bool\" AND \"boolOptional\")", bool && boolOptional) + AssertSQL("(\"boolOptional\" AND \"bool\")", boolOptional && bool) + AssertSQL("(\"boolOptional\" AND \"boolOptional\")", boolOptional && boolOptional) + AssertSQL("(\"bool\" AND 1)", bool && true) + AssertSQL("(\"boolOptional\" AND 1)", boolOptional && true) + AssertSQL("(1 AND \"bool\")", true && bool) + AssertSQL("(1 AND \"boolOptional\")", true && boolOptional) + } + + func test_doubleOrOperator_withBooleanExpressions_buildsCompoundExpression() { + AssertSQL("(\"bool\" OR \"bool\")", bool || bool) + AssertSQL("(\"bool\" OR \"boolOptional\")", bool || boolOptional) + AssertSQL("(\"boolOptional\" OR \"bool\")", boolOptional || bool) + AssertSQL("(\"boolOptional\" OR \"boolOptional\")", boolOptional || boolOptional) + AssertSQL("(\"bool\" OR 1)", bool || true) + AssertSQL("(\"boolOptional\" OR 1)", boolOptional || true) + AssertSQL("(1 OR \"bool\")", true || bool) + AssertSQL("(1 OR \"boolOptional\")", true || boolOptional) + } + + func test_unaryNotOperator_withBooleanExpressions_buildsNotExpression() { + AssertSQL("NOT (\"bool\")", !bool) + AssertSQL("NOT (\"boolOptional\")", !boolOptional) + } + + func test_precedencePreserved() { + let n = Expression(value: 1) + AssertSQL("(((1 = 1) AND (1 = 1)) OR (1 = 1))", (n == n && n == n) || n == n) + AssertSQL("((1 = 1) AND ((1 = 1) OR (1 = 1)))", n == n && (n == n || n == n)) + } + +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/QueryTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/QueryTests.swift new file mode 100644 index 0000000000..2cf164c6d3 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/QueryTests.swift @@ -0,0 +1,365 @@ +import XCTest +import SQLite + +class QueryTests : XCTestCase { + + let users = Table("users") + let id = Expression("id") + let email = Expression("email") + let age = Expression("age") + let admin = Expression("admin") + let optionalAdmin = Expression("admin") + + let posts = Table("posts") + let userId = Expression("user_id") + let categoryId = Expression("category_id") + let published = Expression("published") + + let categories = Table("categories") + let tag = Expression("tag") + + func test_select_withExpression_compilesSelectClause() { + AssertSQL("SELECT \"email\" FROM \"users\"", users.select(email)) + } + + func test_select_withStarExpression_compilesSelectClause() { + AssertSQL("SELECT * FROM \"users\"", users.select(*)) + } + + func test_select_withNamespacedStarExpression_compilesSelectClause() { + AssertSQL("SELECT \"users\".* FROM \"users\"", users.select(users[*])) + } + + func test_select_withVariadicExpressions_compilesSelectClause() { + AssertSQL("SELECT \"email\", count(*) FROM \"users\"", users.select(email, count(*))) + } + + func test_select_withExpressions_compilesSelectClause() { + AssertSQL("SELECT \"email\", count(*) FROM \"users\"", users.select([email, count(*)])) + } + + func test_selectDistinct_withExpression_compilesSelectClause() { + AssertSQL("SELECT DISTINCT \"age\" FROM \"users\"", users.select(distinct: age)) + } + + func test_selectDistinct_withExpressions_compilesSelectClause() { + AssertSQL("SELECT DISTINCT \"age\", \"admin\" FROM \"users\"", users.select(distinct: [age, admin])) + } + + func test_selectDistinct_withStar_compilesSelectClause() { + AssertSQL("SELECT DISTINCT * FROM \"users\"", users.select(distinct: *)) + } + + func test_join_compilesJoinClause() { + AssertSQL( + "SELECT * FROM \"users\" INNER JOIN \"posts\" ON (\"posts\".\"user_id\" = \"users\".\"id\")", + users.join(posts, on: posts[userId] == users[id]) + ) + } + + func test_join_withExplicitType_compilesJoinClauseWithType() { + AssertSQL( + "SELECT * FROM \"users\" LEFT OUTER JOIN \"posts\" ON (\"posts\".\"user_id\" = \"users\".\"id\")", + users.join(.leftOuter, posts, on: posts[userId] == users[id]) + ) + + AssertSQL( + "SELECT * FROM \"users\" CROSS JOIN \"posts\" ON (\"posts\".\"user_id\" = \"users\".\"id\")", + users.join(.cross, posts, on: posts[userId] == users[id]) + ) + } + + func test_join_withTableCondition_compilesJoinClauseWithTableCondition() { + AssertSQL( + "SELECT * FROM \"users\" INNER JOIN \"posts\" ON ((\"posts\".\"user_id\" = \"users\".\"id\") AND \"published\")", + users.join(posts.filter(published), on: posts[userId] == users[id]) + ) + } + + func test_join_whenChained_compilesAggregateJoinClause() { + AssertSQL( + "SELECT * FROM \"users\" " + + "INNER JOIN \"posts\" ON (\"posts\".\"user_id\" = \"users\".\"id\") " + + "INNER JOIN \"categories\" ON (\"categories\".\"id\" = \"posts\".\"category_id\")", + users.join(posts, on: posts[userId] == users[id]).join(categories, on: categories[id] == posts[categoryId]) + ) + } + + func test_filter_compilesWhereClause() { + AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 1)", users.filter(admin == true)) + } + + func test_filter_compilesWhereClause_false() { + AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 0)", users.filter(admin == false)) + } + + func test_filter_compilesWhereClause_optional() { + AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 1)", users.filter(optionalAdmin == true)) + } + + func test_filter_compilesWhereClause_optional_false() { + AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 0)", users.filter(optionalAdmin == false)) + } + + func test_where_compilesWhereClause() { + AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 1)", users.where(admin == true)) + } + + func test_where_compilesWhereClause_false() { + AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 0)", users.where(admin == false)) + } + + func test_where_compilesWhereClause_optional() { + AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 1)", users.where(optionalAdmin == true)) + } + + func test_where_compilesWhereClause_optional_false() { + AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 0)", users.where(optionalAdmin == false)) + } + + func test_filter_whenChained_compilesAggregateWhereClause() { + AssertSQL( + "SELECT * FROM \"users\" WHERE ((\"age\" >= 35) AND \"admin\")", + users.filter(age >= 35).filter(admin) + ) + } + + func test_group_withSingleExpressionName_compilesGroupClause() { + AssertSQL("SELECT * FROM \"users\" GROUP BY \"age\"", + users.group(age)) + } + + func test_group_withVariadicExpressionNames_compilesGroupClause() { + AssertSQL("SELECT * FROM \"users\" GROUP BY \"age\", \"admin\"", users.group(age, admin)) + } + + func test_group_withExpressionNameAndHavingBindings_compilesGroupClause() { + AssertSQL("SELECT * FROM \"users\" GROUP BY \"age\" HAVING \"admin\"", users.group(age, having: admin)) + AssertSQL("SELECT * FROM \"users\" GROUP BY \"age\" HAVING (\"age\" >= 30)", users.group(age, having: age >= 30)) + } + + func test_group_withExpressionNamesAndHavingBindings_compilesGroupClause() { + AssertSQL( + "SELECT * FROM \"users\" GROUP BY \"age\", \"admin\" HAVING \"admin\"", + users.group([age, admin], having: admin) + ) + AssertSQL( + "SELECT * FROM \"users\" GROUP BY \"age\", \"admin\" HAVING (\"age\" >= 30)", + users.group([age, admin], having: age >= 30) + ) + } + + func test_order_withSingleExpressionName_compilesOrderClause() { + AssertSQL("SELECT * FROM \"users\" ORDER BY \"age\"", users.order(age)) + } + + func test_order_withVariadicExpressionNames_compilesOrderClause() { + AssertSQL("SELECT * FROM \"users\" ORDER BY \"age\", \"email\"", users.order(age, email)) + } + + func test_order_withArrayExpressionNames_compilesOrderClause() { + AssertSQL("SELECT * FROM \"users\" ORDER BY \"age\", \"email\"", users.order([age, email])) + } + + func test_order_withExpressionAndSortDirection_compilesOrderClause() { +// AssertSQL("SELECT * FROM \"users\" ORDER BY \"age\" DESC, \"email\" ASC", users.order(age.desc, email.asc)) + } + + func test_order_whenChained_resetsOrderClause() { + AssertSQL("SELECT * FROM \"users\" ORDER BY \"age\"", users.order(email).order(age)) + } + + func test_reverse_withoutOrder_ordersByRowIdDescending() { +// AssertSQL("SELECT * FROM \"users\" ORDER BY \"ROWID\" DESC", users.reverse()) + } + + func test_reverse_withOrder_reversesOrder() { +// AssertSQL("SELECT * FROM \"users\" ORDER BY \"age\" DESC, \"email\" ASC", users.order(age, email.desc).reverse()) + } + + func test_limit_compilesLimitClause() { + AssertSQL("SELECT * FROM \"users\" LIMIT 5", users.limit(5)) + } + + func test_limit_withOffset_compilesOffsetClause() { + AssertSQL("SELECT * FROM \"users\" LIMIT 5 OFFSET 5", users.limit(5, offset: 5)) + } + + func test_limit_whenChained_overridesLimit() { + let query = users.limit(5) + + AssertSQL("SELECT * FROM \"users\" LIMIT 10", query.limit(10)) + AssertSQL("SELECT * FROM \"users\"", query.limit(nil)) + } + + func test_limit_whenChained_withOffset_overridesOffset() { + let query = users.limit(5, offset: 5) + + AssertSQL("SELECT * FROM \"users\" LIMIT 10 OFFSET 20", query.limit(10, offset: 20)) + AssertSQL("SELECT * FROM \"users\"", query.limit(nil)) + } + + func test_alias_aliasesTable() { + let managerId = Expression("manager_id") + + let managers = users.alias("managers") + + AssertSQL( + "SELECT * FROM \"users\" " + + "INNER JOIN \"users\" AS \"managers\" ON (\"managers\".\"id\" = \"users\".\"manager_id\")", + users.join(managers, on: managers[id] == users[managerId]) + ) + } + + func test_insert_compilesInsertExpression() { + AssertSQL( + "INSERT INTO \"users\" (\"email\", \"age\") VALUES ('alice@example.com', 30)", + users.insert(email <- "alice@example.com", age <- 30) + ) + } + + func test_insert_withOnConflict_compilesInsertOrOnConflictExpression() { + AssertSQL( + "INSERT OR REPLACE INTO \"users\" (\"email\", \"age\") VALUES ('alice@example.com', 30)", + users.insert(or: .replace, email <- "alice@example.com", age <- 30) + ) + } + + func test_insert_compilesInsertExpressionWithDefaultValues() { + AssertSQL("INSERT INTO \"users\" DEFAULT VALUES", users.insert()) + } + + func test_insert_withQuery_compilesInsertExpressionWithSelectStatement() { + let emails = Table("emails") + + AssertSQL( + "INSERT INTO \"emails\" SELECT \"email\" FROM \"users\" WHERE \"admin\"", + emails.insert(users.select(email).filter(admin)) + ) + } + + func test_update_compilesUpdateExpression() { + AssertSQL( + "UPDATE \"users\" SET \"age\" = 30, \"admin\" = 1 WHERE (\"id\" = 1)", + users.filter(id == 1).update(age <- 30, admin <- true) + ) + } + + func test_delete_compilesDeleteExpression() { + AssertSQL( + "DELETE FROM \"users\" WHERE (\"id\" = 1)", + users.filter(id == 1).delete() + ) + } + + func test_delete_compilesExistsExpression() { + AssertSQL( + "SELECT EXISTS (SELECT * FROM \"users\")", + users.exists + ) + } + + func test_count_returnsCountExpression() { + AssertSQL("SELECT count(*) FROM \"users\"", users.count) + } + + func test_scalar_returnsScalarExpression() { + AssertSQL("SELECT \"int\" FROM \"table\"", table.select(int) as ScalarQuery) + AssertSQL("SELECT \"intOptional\" FROM \"table\"", table.select(intOptional) as ScalarQuery) + AssertSQL("SELECT DISTINCT \"int\" FROM \"table\"", table.select(distinct: int) as ScalarQuery) + AssertSQL("SELECT DISTINCT \"intOptional\" FROM \"table\"", table.select(distinct: intOptional) as ScalarQuery) + } + + func test_subscript_withExpression_returnsNamespacedExpression() { + let query = Table("query") + + AssertSQL("\"query\".\"blob\"", query[data]) + AssertSQL("\"query\".\"blobOptional\"", query[dataOptional]) + + AssertSQL("\"query\".\"bool\"", query[bool]) + AssertSQL("\"query\".\"boolOptional\"", query[boolOptional]) + + AssertSQL("\"query\".\"date\"", query[date]) + AssertSQL("\"query\".\"dateOptional\"", query[dateOptional]) + + AssertSQL("\"query\".\"double\"", query[double]) + AssertSQL("\"query\".\"doubleOptional\"", query[doubleOptional]) + + AssertSQL("\"query\".\"int\"", query[int]) + AssertSQL("\"query\".\"intOptional\"", query[intOptional]) + + AssertSQL("\"query\".\"int64\"", query[int64]) + AssertSQL("\"query\".\"int64Optional\"", query[int64Optional]) + + AssertSQL("\"query\".\"string\"", query[string]) + AssertSQL("\"query\".\"stringOptional\"", query[stringOptional]) + + AssertSQL("\"query\".*", query[*]) + } + + func test_tableNamespacedByDatabase() { + let table = Table("table", database: "attached") + + AssertSQL("SELECT * FROM \"attached\".\"table\"", table) + } + +} + +class QueryIntegrationTests : SQLiteTestCase { + + let id = Expression("id") + let email = Expression("email") + + override func setUp() { + super.setUp() + + CreateUsersTable() + } + + // MARK: - + + func test_select() { + for _ in try! db.prepare(users) { + // FIXME + } + + let managerId = Expression("manager_id") + let managers = users.alias("managers") + + let alice = try! db.run(users.insert(email <- "alice@example.com")) + _ = try! db.run(users.insert(email <- "betsy@example.com", managerId <- alice)) + + for user in try! db.prepare(users.join(managers, on: managers[id] == users[managerId])) { + _ = user[users[managerId]] + } + } + + func test_scalar() { + XCTAssertEqual(0, try! db.scalar(users.count)) + XCTAssertEqual(false, try! db.scalar(users.exists)) + + try! InsertUsers("alice") + XCTAssertEqual(1, try! db.scalar(users.select(id.average))) + } + + func test_pluck() { + let rowid = try! db.run(users.insert(email <- "alice@example.com")) + XCTAssertEqual(rowid, try! db.pluck(users)![id]) + } + + func test_insert() { + let id = try! db.run(users.insert(email <- "alice@example.com")) + XCTAssertEqual(1, id) + } + + func test_update() { + let changes = try! db.run(users.update(email <- "alice@example.com")) + XCTAssertEqual(0, changes) + } + + func test_delete() { + let changes = try! db.run(users.delete()) + XCTAssertEqual(0, changes) + } + +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/RTreeTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/RTreeTests.swift new file mode 100644 index 0000000000..7147533ecb --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/RTreeTests.swift @@ -0,0 +1,17 @@ +import XCTest +import SQLite + +class RTreeTests : XCTestCase { + + func test_create_onVirtualTable_withRTree_createVirtualTableExpression() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING rtree(\"int64\", \"double\", \"double\")", + virtualTable.create(.RTree(int64, (double, double))) + ) + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING rtree(\"int64\", \"double\", \"double\", \"double\", \"double\")", + virtualTable.create(.RTree(int64, (double, double), (double, double))) + ) + } + +} \ No newline at end of file diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SchemaTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SchemaTests.swift new file mode 100644 index 0000000000..371459c757 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SchemaTests.swift @@ -0,0 +1,775 @@ +import XCTest +import SQLite + +class SchemaTests : XCTestCase { + + func test_drop_compilesDropTableExpression() { + XCTAssertEqual("DROP TABLE \"table\"", table.drop()) + XCTAssertEqual("DROP TABLE IF EXISTS \"table\"", table.drop(ifExists: true)) + } + + func test_drop_compilesDropVirtualTableExpression() { + XCTAssertEqual("DROP TABLE \"virtual_table\"", virtualTable.drop()) + XCTAssertEqual("DROP TABLE IF EXISTS \"virtual_table\"", virtualTable.drop(ifExists: true)) + } + + func test_drop_compilesDropViewExpression() { + XCTAssertEqual("DROP VIEW \"view\"", _view.drop()) + XCTAssertEqual("DROP VIEW IF EXISTS \"view\"", _view.drop(ifExists: true)) + } + + func test_create_withBuilder_compilesCreateTableExpression() { + XCTAssertEqual( + "CREATE TABLE \"table\" (" + + "\"blob\" BLOB NOT NULL, " + + "\"blobOptional\" BLOB, " + + "\"double\" REAL NOT NULL, " + + "\"doubleOptional\" REAL, " + + "\"int64\" INTEGER NOT NULL, " + + "\"int64Optional\" INTEGER, " + + "\"string\" TEXT NOT NULL, " + + "\"stringOptional\" TEXT" + + ")", + table.create { t in + t.column(data) + t.column(dataOptional) + t.column(double) + t.column(doubleOptional) + t.column(int64) + t.column(int64Optional) + t.column(string) + t.column(stringOptional) + } + ) + XCTAssertEqual( + "CREATE TEMPORARY TABLE \"table\" (\"int64\" INTEGER NOT NULL)", + table.create(temporary: true) { $0.column(int64) } + ) + XCTAssertEqual( + "CREATE TABLE IF NOT EXISTS \"table\" (\"int64\" INTEGER NOT NULL)", + table.create(ifNotExists: true) { $0.column(int64) } + ) + XCTAssertEqual( + "CREATE TEMPORARY TABLE IF NOT EXISTS \"table\" (\"int64\" INTEGER NOT NULL)", + table.create(temporary: true, ifNotExists: true) { $0.column(int64) } + ) + } + + func test_create_withQuery_compilesCreateTableExpression() { + XCTAssertEqual( + "CREATE TABLE \"table\" AS SELECT \"int64\" FROM \"view\"", + table.create(_view.select(int64)) + ) + } + + // thoroughness test for ambiguity + func test_column_compilesColumnDefinitionExpression() { + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL)", + table.create { t in t.column(int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE)", + table.create { t in t.column(int64, unique: true) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64\" > 0))", + table.create { t in t.column(int64, check: int64 > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64Optional\" > 0))", + table.create { t in t.column(int64, check: int64Optional > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL DEFAULT (\"int64\"))", + table.create { t in t.column(int64, defaultValue: int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL DEFAULT (0))", + table.create { t in t.column(int64, defaultValue: 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64\" > 0))", + table.create { t in t.column(int64, unique: true, check: int64 > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64Optional\" > 0))", + table.create { t in t.column(int64, unique: true, check: int64Optional > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE DEFAULT (\"int64\"))", + table.create { t in t.column(int64, unique: true, defaultValue: int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE DEFAULT (0))", + table.create { t in t.column(int64, unique: true, defaultValue: 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64\" > 0))", + table.create { t in t.column(int64, unique: true, check: int64 > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64Optional\" > 0))", + table.create { t in t.column(int64, unique: true, check: int64Optional > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64\" > 0) DEFAULT (\"int64\"))", + table.create { t in t.column(int64, unique: true, check: int64 > 0, defaultValue: int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64Optional\" > 0) DEFAULT (\"int64\"))", + table.create { t in t.column(int64, unique: true, check: int64Optional > 0, defaultValue: int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64\" > 0) DEFAULT (0))", + table.create { t in t.column(int64, unique: true, check: int64 > 0, defaultValue: 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64Optional\" > 0) DEFAULT (0))", + table.create { t in t.column(int64, unique: true, check: int64Optional > 0, defaultValue: 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64\" > 0) DEFAULT (\"int64\"))", + table.create { t in t.column(int64, check: int64 > 0, defaultValue: int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64Optional\" > 0) DEFAULT (\"int64\"))", + table.create { t in t.column(int64, check: int64Optional > 0, defaultValue: int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64\" > 0) DEFAULT (0))", + table.create { t in t.column(int64, check: int64 > 0, defaultValue: 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64Optional\" > 0) DEFAULT (0))", + table.create { t in t.column(int64, check: int64Optional > 0, defaultValue: 0) } + ) + + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY NOT NULL CHECK (\"int64\" > 0))", + table.create { t in t.column(int64, primaryKey: true, check: int64 > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY NOT NULL CHECK (\"int64Optional\" > 0))", + table.create { t in t.column(int64, primaryKey: true, check: int64Optional > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY NOT NULL DEFAULT (\"int64\"))", + table.create { t in t.column(int64, primaryKey: true, defaultValue: int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY NOT NULL CHECK (\"int64\" > 0))", + table.create { t in t.column(int64, primaryKey: true, check: int64 > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY NOT NULL CHECK (\"int64Optional\" > 0))", + table.create { t in t.column(int64, primaryKey: true, check: int64Optional > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY NOT NULL CHECK (\"int64\" > 0) DEFAULT (\"int64\"))", + table.create { t in t.column(int64, primaryKey: true, check: int64 > 0, defaultValue: int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY NOT NULL CHECK (\"int64Optional\" > 0) DEFAULT (\"int64\"))", + table.create { t in t.column(int64, primaryKey: true, check: int64Optional > 0, defaultValue: int64) } + ) + + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER)", + table.create { t in t.column(int64Optional) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE)", + table.create { t in t.column(int64Optional, unique: true) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64\" > 0))", + table.create { t in t.column(int64Optional, check: int64 > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0))", + table.create { t in t.column(int64Optional, check: int64Optional > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER DEFAULT (\"int64\"))", + table.create { t in t.column(int64Optional, defaultValue: int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER DEFAULT (\"int64Optional\"))", + table.create { t in t.column(int64Optional, defaultValue: int64Optional) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER DEFAULT (0))", + table.create { t in t.column(int64Optional, defaultValue: 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64\" > 0))", + table.create { t in t.column(int64Optional, unique: true, check: int64 > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64Optional\" > 0))", + table.create { t in t.column(int64Optional, unique: true, check: int64Optional > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE DEFAULT (\"int64\"))", + table.create { t in t.column(int64Optional, unique: true, defaultValue: int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE DEFAULT (\"int64Optional\"))", + table.create { t in t.column(int64Optional, unique: true, defaultValue: int64Optional) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE DEFAULT (0))", + table.create { t in t.column(int64Optional, unique: true, defaultValue: 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64\" > 0))", + table.create { t in t.column(int64Optional, unique: true, check: int64 > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64Optional\" > 0))", + table.create { t in t.column(int64Optional, unique: true, check: int64Optional > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64\" > 0) DEFAULT (\"int64\"))", + table.create { t in t.column(int64Optional, unique: true, check: int64 > 0, defaultValue: int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64\" > 0) DEFAULT (\"int64Optional\"))", + table.create { t in t.column(int64Optional, unique: true, check: int64 > 0, defaultValue: int64Optional) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64Optional\" > 0) DEFAULT (\"int64\"))", + table.create { t in t.column(int64Optional, unique: true, check: int64Optional > 0, defaultValue: int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64Optional\" > 0) DEFAULT (\"int64Optional\"))", + table.create { t in t.column(int64Optional, unique: true, check: int64Optional > 0, defaultValue: int64Optional) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64\" > 0) DEFAULT (0))", + table.create { t in t.column(int64Optional, unique: true, check: int64 > 0, defaultValue: 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64Optional\" > 0) DEFAULT (0))", + table.create { t in t.column(int64Optional, unique: true, check: int64Optional > 0, defaultValue: 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64\" > 0) DEFAULT (\"int64\"))", + table.create { t in t.column(int64Optional, check: int64 > 0, defaultValue: int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0) DEFAULT (\"int64\"))", + table.create { t in t.column(int64Optional, check: int64Optional > 0, defaultValue: int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64\" > 0) DEFAULT (\"int64Optional\"))", + table.create { t in t.column(int64Optional, check: int64 > 0, defaultValue: int64Optional) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0) DEFAULT (\"int64Optional\"))", + table.create { t in t.column(int64Optional, check: int64Optional > 0, defaultValue: int64Optional) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64\" > 0) DEFAULT (0))", + table.create { t in t.column(int64Optional, check: int64 > 0, defaultValue: 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0) DEFAULT (0))", + table.create { t in t.column(int64Optional, check: int64Optional > 0, defaultValue: 0) } + ) + } + + func test_column_withIntegerExpression_compilesPrimaryKeyAutoincrementColumnDefinitionExpression() { + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", + table.create { t in t.column(int64, primaryKey: .autoincrement) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL CHECK (\"int64\" > 0))", + table.create { t in t.column(int64, primaryKey: .autoincrement, check: int64 > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL CHECK (\"int64Optional\" > 0))", + table.create { t in t.column(int64, primaryKey: .autoincrement, check: int64Optional > 0) } + ) + } + + func test_column_withIntegerExpression_compilesReferentialColumnDefinitionExpression() { + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL REFERENCES \"table\" (\"int64\"))", + table.create { t in t.column(int64, references: table, int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL REFERENCES \"table\" (\"int64\"))", + table.create { t in t.column(int64, references: qualifiedTable, int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE REFERENCES \"table\" (\"int64\"))", + table.create { t in t.column(int64, unique: true, references: table, int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\"))", + table.create { t in t.column(int64, check: int64 > 0, references: table, int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\"))", + table.create { t in t.column(int64, check: int64Optional > 0, references: table, int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\"))", + table.create { t in t.column(int64, unique: true, check: int64 > 0, references: table, int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\"))", + table.create { t in t.column(int64, unique: true, check: int64Optional > 0, references: table, int64) } + ) + + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER REFERENCES \"table\" (\"int64\"))", + table.create { t in t.column(int64Optional, references: table, int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE REFERENCES \"table\" (\"int64\"))", + table.create { t in t.column(int64Optional, unique: true, references: table, int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\"))", + table.create { t in t.column(int64Optional, check: int64 > 0, references: table, int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\"))", + table.create { t in t.column(int64Optional, check: int64Optional > 0, references: table, int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\"))", + table.create { t in t.column(int64Optional, unique: true, check: int64 > 0, references: table, int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\"))", + table.create { t in t.column(int64Optional, unique: true, check: int64Optional > 0, references: table, int64) } + ) + } + + func test_column_withStringExpression_compilesCollatedColumnDefinitionExpression() { + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL COLLATE RTRIM)", + table.create { t in t.column(string, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE COLLATE RTRIM)", + table.create { t in t.column(string, unique: true, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL CHECK (\"string\" != '') COLLATE RTRIM)", + table.create { t in t.column(string, check: string != "", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL CHECK (\"stringOptional\" != '') COLLATE RTRIM)", + table.create { t in t.column(string, check: stringOptional != "", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL DEFAULT (\"string\") COLLATE RTRIM)", + table.create { t in t.column(string, defaultValue: string, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL DEFAULT ('string') COLLATE RTRIM)", + table.create { t in t.column(string, defaultValue: "string", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE CHECK (\"string\" != '') COLLATE RTRIM)", + table.create { t in t.column(string, unique: true, check: string != "", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE CHECK (\"stringOptional\" != '') COLLATE RTRIM)", + table.create { t in t.column(string, unique: true, check: stringOptional != "", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE DEFAULT (\"string\") COLLATE RTRIM)", + table.create { t in t.column(string, unique: true, defaultValue: string, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE DEFAULT ('string') COLLATE RTRIM)", + table.create { t in t.column(string, unique: true, defaultValue: "string", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE CHECK (\"string\" != '') DEFAULT (\"string\") COLLATE RTRIM)", + table.create { t in t.column(string, unique: true, check: string != "", defaultValue: string, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE CHECK (\"stringOptional\" != '') DEFAULT (\"string\") COLLATE RTRIM)", + table.create { t in t.column(string, unique: true, check: stringOptional != "", defaultValue: string, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE CHECK (\"string\" != '') DEFAULT ('string') COLLATE RTRIM)", + table.create { t in t.column(string, unique: true, check: string != "", defaultValue: "string", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE CHECK (\"stringOptional\" != '') DEFAULT ('string') COLLATE RTRIM)", + table.create { t in t.column(string, unique: true, check: stringOptional != "", defaultValue: "string", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL CHECK (\"string\" != '') DEFAULT (\"string\") COLLATE RTRIM)", + table.create { t in t.column(string, check: string != "", defaultValue: string, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL CHECK (\"stringOptional\" != '') DEFAULT (\"string\") COLLATE RTRIM)", + table.create { t in t.column(string, check: stringOptional != "", defaultValue: string, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL CHECK (\"string\" != '') DEFAULT ('string') COLLATE RTRIM)", + table.create { t in t.column(string, check: string != "", defaultValue: "string", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL CHECK (\"stringOptional\" != '') DEFAULT ('string') COLLATE RTRIM)", + table.create { t in t.column(string, check: stringOptional != "", defaultValue: "string", collate: .rtrim) } + ) + + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL COLLATE RTRIM)", + table.create { t in t.column(stringOptional, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE COLLATE RTRIM)", + table.create { t in t.column(stringOptional, unique: true, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"string\" != '') COLLATE RTRIM)", + table.create { t in t.column(stringOptional, check: string != "", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"stringOptional\" != '') COLLATE RTRIM)", + table.create { t in t.column(stringOptional, check: stringOptional != "", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL DEFAULT (\"string\") COLLATE RTRIM)", + table.create { t in t.column(stringOptional, defaultValue: string, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL DEFAULT (\"stringOptional\") COLLATE RTRIM)", + table.create { t in t.column(stringOptional, defaultValue: stringOptional, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL DEFAULT ('string') COLLATE RTRIM)", + table.create { t in t.column(stringOptional, defaultValue: "string", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"string\" != '') COLLATE RTRIM)", + table.create { t in t.column(stringOptional, unique: true, check: string != "", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"stringOptional\" != '') COLLATE RTRIM)", + table.create { t in t.column(stringOptional, unique: true, check: stringOptional != "", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE DEFAULT (\"string\") COLLATE RTRIM)", + table.create { t in t.column(stringOptional, unique: true, defaultValue: string, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE DEFAULT (\"stringOptional\") COLLATE RTRIM)", + table.create { t in t.column(stringOptional, unique: true, defaultValue: stringOptional, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE DEFAULT ('string') COLLATE RTRIM)", + table.create { t in t.column(stringOptional, unique: true, defaultValue: "string", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"string\" != '') DEFAULT (\"string\") COLLATE RTRIM)", + table.create { t in t.column(stringOptional, unique: true, check: string != "", defaultValue: string, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"string\" != '') DEFAULT (\"stringOptional\") COLLATE RTRIM)", + table.create { t in t.column(stringOptional, unique: true, check: string != "", defaultValue: stringOptional, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"stringOptional\" != '') DEFAULT (\"string\") COLLATE RTRIM)", + table.create { t in t.column(stringOptional, unique: true, check: stringOptional != "", defaultValue: string, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"stringOptional\" != '') DEFAULT (\"stringOptional\") COLLATE RTRIM)", + table.create { t in t.column(stringOptional, unique: true, check: stringOptional != "", defaultValue: stringOptional, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"string\" != '') DEFAULT ('string') COLLATE RTRIM)", + table.create { t in t.column(stringOptional, unique: true, check: string != "", defaultValue: "string", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"stringOptional\" != '') DEFAULT ('string') COLLATE RTRIM)", + table.create { t in t.column(stringOptional, unique: true, check: stringOptional != "", defaultValue: "string", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"string\" != '') DEFAULT (\"string\") COLLATE RTRIM)", + table.create { t in t.column(stringOptional, check: string != "", defaultValue: string, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"stringOptional\" != '') DEFAULT (\"string\") COLLATE RTRIM)", + table.create { t in t.column(stringOptional, check: stringOptional != "", defaultValue: string, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"string\" != '') DEFAULT (\"stringOptional\") COLLATE RTRIM)", + table.create { t in t.column(stringOptional, check: string != "", defaultValue: stringOptional, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"stringOptional\" != '') DEFAULT (\"stringOptional\") COLLATE RTRIM)", + table.create { t in t.column(stringOptional, check: stringOptional != "", defaultValue: stringOptional, collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"string\" != '') DEFAULT ('string') COLLATE RTRIM)", + table.create { t in t.column(stringOptional, check: string != "", defaultValue: "string", collate: .rtrim) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"stringOptional\" != '') DEFAULT ('string') COLLATE RTRIM)", + table.create { t in t.column(stringOptional, check: stringOptional != "", defaultValue: "string", collate: .rtrim) } + ) + } + + func test_primaryKey_compilesPrimaryKeyExpression() { + XCTAssertEqual( + "CREATE TABLE \"table\" (PRIMARY KEY (\"int64\"))", + table.create { t in t.primaryKey(int64) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (PRIMARY KEY (\"int64\", \"string\"))", + table.create { t in t.primaryKey(int64, string) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (PRIMARY KEY (\"int64\", \"string\", \"double\"))", + table.create { t in t.primaryKey(int64, string, double) } + ) + } + + func test_unique_compilesUniqueExpression() { + XCTAssertEqual( + "CREATE TABLE \"table\" (UNIQUE (\"int64\"))", + table.create { t in t.unique(int64) } + ) + } + + func test_check_compilesCheckExpression() { + XCTAssertEqual( + "CREATE TABLE \"table\" (CHECK ((\"int64\" > 0)))", + table.create { t in t.check(int64 > 0) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (CHECK ((\"int64Optional\" > 0)))", + table.create { t in t.check(int64Optional > 0) } + ) + } + + func test_foreignKey_compilesForeignKeyExpression() { + XCTAssertEqual( + "CREATE TABLE \"table\" (FOREIGN KEY (\"string\") REFERENCES \"table\" (\"string\"))", + table.create { t in t.foreignKey(string, references: table, string) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (FOREIGN KEY (\"stringOptional\") REFERENCES \"table\" (\"string\"))", + table.create { t in t.foreignKey(stringOptional, references: table, string) } + ) + + XCTAssertEqual( + "CREATE TABLE \"table\" (FOREIGN KEY (\"string\") REFERENCES \"table\" (\"string\") ON UPDATE CASCADE ON DELETE SET NULL)", + table.create { t in t.foreignKey(string, references: table, string, update: .cascade, delete: .setNull) } + ) + + XCTAssertEqual( + "CREATE TABLE \"table\" (FOREIGN KEY (\"string\", \"string\") REFERENCES \"table\" (\"string\", \"string\"))", + table.create { t in t.foreignKey((string, string), references: table, (string, string)) } + ) + XCTAssertEqual( + "CREATE TABLE \"table\" (FOREIGN KEY (\"string\", \"string\", \"string\") REFERENCES \"table\" (\"string\", \"string\", \"string\"))", + table.create { t in t.foreignKey((string, string, string), references: table, (string, string, string)) } + ) + } + + func test_addColumn_compilesAlterTableExpression() { + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL DEFAULT (1)", + table.addColumn(int64, defaultValue: 1) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL CHECK (\"int64\" > 0) DEFAULT (1)", + table.addColumn(int64, check: int64 > 0, defaultValue: 1) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL CHECK (\"int64Optional\" > 0) DEFAULT (1)", + table.addColumn(int64, check: int64Optional > 0, defaultValue: 1) + ) + + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER", + table.addColumn(int64Optional) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER CHECK (\"int64\" > 0)", + table.addColumn(int64Optional, check: int64 > 0) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0)", + table.addColumn(int64Optional, check: int64Optional > 0) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER DEFAULT (1)", + table.addColumn(int64Optional, defaultValue: 1) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER CHECK (\"int64\" > 0) DEFAULT (1)", + table.addColumn(int64Optional, check: int64 > 0, defaultValue: 1) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0) DEFAULT (1)", + table.addColumn(int64Optional, check: int64Optional > 0, defaultValue: 1) + ) + } + + func test_addColumn_withIntegerExpression_compilesReferentialAlterTableExpression() { + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL REFERENCES \"table\" (\"int64\")", + table.addColumn(int64, references: table, int64) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL UNIQUE REFERENCES \"table\" (\"int64\")", + table.addColumn(int64, unique: true, references: table, int64) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\")", + table.addColumn(int64, check: int64 > 0, references: table, int64) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\")", + table.addColumn(int64, check: int64Optional > 0, references: table, int64) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\")", + table.addColumn(int64, unique: true, check: int64 > 0, references: table, int64) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\")", + table.addColumn(int64, unique: true, check: int64Optional > 0, references: table, int64) + ) + + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER REFERENCES \"table\" (\"int64\")", + table.addColumn(int64Optional, references: table, int64) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER UNIQUE REFERENCES \"table\" (\"int64\")", + table.addColumn(int64Optional, unique: true, references: table, int64) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\")", + table.addColumn(int64Optional, check: int64 > 0, references: table, int64) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\")", + table.addColumn(int64Optional, check: int64Optional > 0, references: table, int64) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER UNIQUE CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\")", + table.addColumn(int64Optional, unique: true, check: int64 > 0, references: table, int64) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER UNIQUE CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\")", + table.addColumn(int64Optional, unique: true, check: int64Optional > 0, references: table, int64) + ) + } + + func test_addColumn_withStringExpression_compilesCollatedAlterTableExpression() { + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"string\" TEXT NOT NULL DEFAULT ('string') COLLATE RTRIM", + table.addColumn(string, defaultValue: "string", collate: .rtrim) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"string\" TEXT NOT NULL CHECK (\"string\" != '') DEFAULT ('string') COLLATE RTRIM", + table.addColumn(string, check: string != "", defaultValue: "string", collate: .rtrim) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"string\" TEXT NOT NULL CHECK (\"stringOptional\" != '') DEFAULT ('string') COLLATE RTRIM", + table.addColumn(string, check: stringOptional != "", defaultValue: "string", collate: .rtrim) + ) + + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"stringOptional\" TEXT COLLATE RTRIM", + table.addColumn(stringOptional, collate: .rtrim) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"stringOptional\" TEXT CHECK (\"string\" != '') COLLATE RTRIM", + table.addColumn(stringOptional, check: string != "", collate: .rtrim) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"stringOptional\" TEXT CHECK (\"stringOptional\" != '') COLLATE RTRIM", + table.addColumn(stringOptional, check: stringOptional != "", collate: .rtrim) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"stringOptional\" TEXT CHECK (\"string\" != '') DEFAULT ('string') COLLATE RTRIM", + table.addColumn(stringOptional, check: string != "", defaultValue: "string", collate: .rtrim) + ) + XCTAssertEqual( + "ALTER TABLE \"table\" ADD COLUMN \"stringOptional\" TEXT CHECK (\"stringOptional\" != '') DEFAULT ('string') COLLATE RTRIM", + table.addColumn(stringOptional, check: stringOptional != "", defaultValue: "string", collate: .rtrim) + ) + } + + func test_rename_compilesAlterTableRenameToExpression() { + XCTAssertEqual("ALTER TABLE \"old\" RENAME TO \"table\"", Table("old").rename(table)) + } + + func test_createIndex_compilesCreateIndexExpression() { + XCTAssertEqual("CREATE INDEX \"index_table_on_int64\" ON \"table\" (\"int64\")", table.createIndex(int64)) + + XCTAssertEqual( + "CREATE UNIQUE INDEX \"index_table_on_int64\" ON \"table\" (\"int64\")", + table.createIndex([int64], unique: true) + ) + XCTAssertEqual( + "CREATE INDEX IF NOT EXISTS \"index_table_on_int64\" ON \"table\" (\"int64\")", + table.createIndex([int64], ifNotExists: true) + ) + XCTAssertEqual( + "CREATE UNIQUE INDEX IF NOT EXISTS \"index_table_on_int64\" ON \"table\" (\"int64\")", + table.createIndex([int64], unique: true, ifNotExists: true) + ) + XCTAssertEqual( + "CREATE UNIQUE INDEX IF NOT EXISTS \"main\".\"index_table_on_int64\" ON \"table\" (\"int64\")", + qualifiedTable.createIndex([int64], unique: true, ifNotExists: true) + ) + } + + func test_dropIndex_compilesCreateIndexExpression() { + XCTAssertEqual("DROP INDEX \"index_table_on_int64\"", table.dropIndex(int64)) + XCTAssertEqual("DROP INDEX IF EXISTS \"index_table_on_int64\"", table.dropIndex([int64], ifExists: true)) + } + + func test_create_onView_compilesCreateViewExpression() { + XCTAssertEqual( + "CREATE VIEW \"view\" AS SELECT \"int64\" FROM \"table\"", + _view.create(table.select(int64)) + ) + XCTAssertEqual( + "CREATE TEMPORARY VIEW \"view\" AS SELECT \"int64\" FROM \"table\"", + _view.create(table.select(int64), temporary: true) + ) + XCTAssertEqual( + "CREATE VIEW IF NOT EXISTS \"view\" AS SELECT \"int64\" FROM \"table\"", + _view.create(table.select(int64), ifNotExists: true) + ) + XCTAssertEqual( + "CREATE TEMPORARY VIEW IF NOT EXISTS \"view\" AS SELECT \"int64\" FROM \"table\"", + _view.create(table.select(int64), temporary: true, ifNotExists: true) + ) + } + + func test_create_onVirtualTable_compilesCreateVirtualTableExpression() { + XCTAssertEqual( + "CREATE VIRTUAL TABLE \"virtual_table\" USING \"custom\"('foo', 'bar')", + virtualTable.create(Module("custom", ["foo", "bar"])) + ) + } + + func test_rename_onVirtualTable_compilesAlterTableRenameToExpression() { + XCTAssertEqual( + "ALTER TABLE \"old\" RENAME TO \"virtual_table\"", + VirtualTable("old").rename(virtualTable) + ) + } + +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SetterTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SetterTests.swift new file mode 100644 index 0000000000..d4f189d7c5 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SetterTests.swift @@ -0,0 +1,137 @@ +import XCTest +import SQLite + +class SetterTests : XCTestCase { + + func test_setterAssignmentOperator_buildsSetter() { + AssertSQL("\"int\" = \"int\"", int <- int) + AssertSQL("\"int\" = 1", int <- 1) + AssertSQL("\"intOptional\" = \"int\"", intOptional <- int) + AssertSQL("\"intOptional\" = \"intOptional\"", intOptional <- intOptional) + AssertSQL("\"intOptional\" = 1", intOptional <- 1) + AssertSQL("\"intOptional\" = NULL", intOptional <- nil) + } + + func test_plusEquals_withStringExpression_buildsSetter() { + AssertSQL("\"string\" = (\"string\" || \"string\")", string += string) + AssertSQL("\"string\" = (\"string\" || 'literal')", string += "literal") + AssertSQL("\"stringOptional\" = (\"stringOptional\" || \"string\")", stringOptional += string) + AssertSQL("\"stringOptional\" = (\"stringOptional\" || \"stringOptional\")", stringOptional += stringOptional) + AssertSQL("\"stringOptional\" = (\"stringOptional\" || 'literal')", stringOptional += "literal") + } + + func test_plusEquals_withNumberExpression_buildsSetter() { + AssertSQL("\"int\" = (\"int\" + \"int\")", int += int) + AssertSQL("\"int\" = (\"int\" + 1)", int += 1) + AssertSQL("\"intOptional\" = (\"intOptional\" + \"int\")", intOptional += int) + AssertSQL("\"intOptional\" = (\"intOptional\" + \"intOptional\")", intOptional += intOptional) + AssertSQL("\"intOptional\" = (\"intOptional\" + 1)", intOptional += 1) + + AssertSQL("\"double\" = (\"double\" + \"double\")", double += double) + AssertSQL("\"double\" = (\"double\" + 1.0)", double += 1) + AssertSQL("\"doubleOptional\" = (\"doubleOptional\" + \"double\")", doubleOptional += double) + AssertSQL("\"doubleOptional\" = (\"doubleOptional\" + \"doubleOptional\")", doubleOptional += doubleOptional) + AssertSQL("\"doubleOptional\" = (\"doubleOptional\" + 1.0)", doubleOptional += 1) + } + + func test_minusEquals_withNumberExpression_buildsSetter() { + AssertSQL("\"int\" = (\"int\" - \"int\")", int -= int) + AssertSQL("\"int\" = (\"int\" - 1)", int -= 1) + AssertSQL("\"intOptional\" = (\"intOptional\" - \"int\")", intOptional -= int) + AssertSQL("\"intOptional\" = (\"intOptional\" - \"intOptional\")", intOptional -= intOptional) + AssertSQL("\"intOptional\" = (\"intOptional\" - 1)", intOptional -= 1) + + AssertSQL("\"double\" = (\"double\" - \"double\")", double -= double) + AssertSQL("\"double\" = (\"double\" - 1.0)", double -= 1) + AssertSQL("\"doubleOptional\" = (\"doubleOptional\" - \"double\")", doubleOptional -= double) + AssertSQL("\"doubleOptional\" = (\"doubleOptional\" - \"doubleOptional\")", doubleOptional -= doubleOptional) + AssertSQL("\"doubleOptional\" = (\"doubleOptional\" - 1.0)", doubleOptional -= 1) + } + + func test_timesEquals_withNumberExpression_buildsSetter() { + AssertSQL("\"int\" = (\"int\" * \"int\")", int *= int) + AssertSQL("\"int\" = (\"int\" * 1)", int *= 1) + AssertSQL("\"intOptional\" = (\"intOptional\" * \"int\")", intOptional *= int) + AssertSQL("\"intOptional\" = (\"intOptional\" * \"intOptional\")", intOptional *= intOptional) + AssertSQL("\"intOptional\" = (\"intOptional\" * 1)", intOptional *= 1) + + AssertSQL("\"double\" = (\"double\" * \"double\")", double *= double) + AssertSQL("\"double\" = (\"double\" * 1.0)", double *= 1) + AssertSQL("\"doubleOptional\" = (\"doubleOptional\" * \"double\")", doubleOptional *= double) + AssertSQL("\"doubleOptional\" = (\"doubleOptional\" * \"doubleOptional\")", doubleOptional *= doubleOptional) + AssertSQL("\"doubleOptional\" = (\"doubleOptional\" * 1.0)", doubleOptional *= 1) + } + + func test_dividedByEquals_withNumberExpression_buildsSetter() { + AssertSQL("\"int\" = (\"int\" / \"int\")", int /= int) + AssertSQL("\"int\" = (\"int\" / 1)", int /= 1) + AssertSQL("\"intOptional\" = (\"intOptional\" / \"int\")", intOptional /= int) + AssertSQL("\"intOptional\" = (\"intOptional\" / \"intOptional\")", intOptional /= intOptional) + AssertSQL("\"intOptional\" = (\"intOptional\" / 1)", intOptional /= 1) + + AssertSQL("\"double\" = (\"double\" / \"double\")", double /= double) + AssertSQL("\"double\" = (\"double\" / 1.0)", double /= 1) + AssertSQL("\"doubleOptional\" = (\"doubleOptional\" / \"double\")", doubleOptional /= double) + AssertSQL("\"doubleOptional\" = (\"doubleOptional\" / \"doubleOptional\")", doubleOptional /= doubleOptional) + AssertSQL("\"doubleOptional\" = (\"doubleOptional\" / 1.0)", doubleOptional /= 1) + } + + func test_moduloEquals_withIntegerExpression_buildsSetter() { + AssertSQL("\"int\" = (\"int\" % \"int\")", int %= int) + AssertSQL("\"int\" = (\"int\" % 1)", int %= 1) + AssertSQL("\"intOptional\" = (\"intOptional\" % \"int\")", intOptional %= int) + AssertSQL("\"intOptional\" = (\"intOptional\" % \"intOptional\")", intOptional %= intOptional) + AssertSQL("\"intOptional\" = (\"intOptional\" % 1)", intOptional %= 1) + } + + func test_leftShiftEquals_withIntegerExpression_buildsSetter() { + AssertSQL("\"int\" = (\"int\" << \"int\")", int <<= int) + AssertSQL("\"int\" = (\"int\" << 1)", int <<= 1) + AssertSQL("\"intOptional\" = (\"intOptional\" << \"int\")", intOptional <<= int) + AssertSQL("\"intOptional\" = (\"intOptional\" << \"intOptional\")", intOptional <<= intOptional) + AssertSQL("\"intOptional\" = (\"intOptional\" << 1)", intOptional <<= 1) + } + + func test_rightShiftEquals_withIntegerExpression_buildsSetter() { + AssertSQL("\"int\" = (\"int\" >> \"int\")", int >>= int) + AssertSQL("\"int\" = (\"int\" >> 1)", int >>= 1) + AssertSQL("\"intOptional\" = (\"intOptional\" >> \"int\")", intOptional >>= int) + AssertSQL("\"intOptional\" = (\"intOptional\" >> \"intOptional\")", intOptional >>= intOptional) + AssertSQL("\"intOptional\" = (\"intOptional\" >> 1)", intOptional >>= 1) + } + + func test_bitwiseAndEquals_withIntegerExpression_buildsSetter() { + AssertSQL("\"int\" = (\"int\" & \"int\")", int &= int) + AssertSQL("\"int\" = (\"int\" & 1)", int &= 1) + AssertSQL("\"intOptional\" = (\"intOptional\" & \"int\")", intOptional &= int) + AssertSQL("\"intOptional\" = (\"intOptional\" & \"intOptional\")", intOptional &= intOptional) + AssertSQL("\"intOptional\" = (\"intOptional\" & 1)", intOptional &= 1) + } + + func test_bitwiseOrEquals_withIntegerExpression_buildsSetter() { + AssertSQL("\"int\" = (\"int\" | \"int\")", int |= int) + AssertSQL("\"int\" = (\"int\" | 1)", int |= 1) + AssertSQL("\"intOptional\" = (\"intOptional\" | \"int\")", intOptional |= int) + AssertSQL("\"intOptional\" = (\"intOptional\" | \"intOptional\")", intOptional |= intOptional) + AssertSQL("\"intOptional\" = (\"intOptional\" | 1)", intOptional |= 1) + } + + func test_bitwiseExclusiveOrEquals_withIntegerExpression_buildsSetter() { + AssertSQL("\"int\" = (~((\"int\" & \"int\")) & (\"int\" | \"int\"))", int ^= int) + AssertSQL("\"int\" = (~((\"int\" & 1)) & (\"int\" | 1))", int ^= 1) + AssertSQL("\"intOptional\" = (~((\"intOptional\" & \"int\")) & (\"intOptional\" | \"int\"))", intOptional ^= int) + AssertSQL("\"intOptional\" = (~((\"intOptional\" & \"intOptional\")) & (\"intOptional\" | \"intOptional\"))", intOptional ^= intOptional) + AssertSQL("\"intOptional\" = (~((\"intOptional\" & 1)) & (\"intOptional\" | 1))", intOptional ^= 1) + } + + func test_postfixPlus_withIntegerValue_buildsSetter() { + AssertSQL("\"int\" = (\"int\" + 1)", int++) + AssertSQL("\"intOptional\" = (\"intOptional\" + 1)", intOptional++) + } + + func test_postfixMinus_withIntegerValue_buildsSetter() { + AssertSQL("\"int\" = (\"int\" - 1)", int--) + AssertSQL("\"intOptional\" = (\"intOptional\" - 1)", intOptional--) + } + +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/StatementTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/StatementTests.swift new file mode 100644 index 0000000000..326259b223 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/StatementTests.swift @@ -0,0 +1,26 @@ +import XCTest +import SQLite + +class StatementTests : SQLiteTestCase { + override func setUp() { + super.setUp() + CreateUsersTable() + } + + func test_cursor_to_blob() { + try! InsertUsers("alice") + let statement = try! db.prepare("SELECT email FROM users") + XCTAssert(try! statement.step()) + let blob = statement.row[0] as Blob + XCTAssertEqual("alice@example.com", String(bytes: blob.bytes, encoding: .utf8)!) + } + + func test_zero_sized_blob_returns_null() { + let blobs = Table("blobs") + let blobColumn = Expression("blob_column") + try! db.run(blobs.create { $0.column(blobColumn) }) + try! db.run(blobs.insert(blobColumn <- Blob(bytes: []))) + let blobValue = try! db.scalar(blobs.select(blobColumn).limit(1, offset: 0)) + XCTAssertEqual([], blobValue.bytes) + } +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/TestHelpers.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/TestHelpers.swift new file mode 100644 index 0000000000..8c33bf6a07 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/TestHelpers.swift @@ -0,0 +1,115 @@ +import XCTest +import SQLite + +class SQLiteTestCase : XCTestCase { + + var trace = [String: Int]() + + let db = try! Connection() + + let users = Table("users") + + override func setUp() { + super.setUp() + + db.trace { SQL in + print(SQL) + self.trace[SQL] = (self.trace[SQL] ?? 0) + 1 + } + } + + func CreateUsersTable() { + try! db.execute( + "CREATE TABLE \"users\" (" + + "id INTEGER PRIMARY KEY, " + + "email TEXT NOT NULL UNIQUE, " + + "age INTEGER, " + + "salary REAL, " + + "admin BOOLEAN NOT NULL DEFAULT 0 CHECK (admin IN (0, 1)), " + + "manager_id INTEGER, " + + "FOREIGN KEY(manager_id) REFERENCES users(id)" + + ")" + ) + } + + func InsertUsers(_ names: String...) throws { + try InsertUsers(names) + } + + func InsertUsers(_ names: [String]) throws { + for name in names { try InsertUser(name) } + } + + @discardableResult func InsertUser(_ name: String, age: Int? = nil, admin: Bool = false) throws -> Statement { + return try db.run( + "INSERT INTO \"users\" (email, age, admin) values (?, ?, ?)", + "\(name)@example.com", age?.datatypeValue, admin.datatypeValue + ) + } + + func AssertSQL(_ SQL: String, _ executions: Int = 1, _ message: String? = nil, file: StaticString = #file, line: UInt = #line) { + XCTAssertEqual( + executions, trace[SQL] ?? 0, + message ?? SQL, + file: file, line: line + ) + } + + func AssertSQL(_ SQL: String, _ statement: Statement, _ message: String? = nil, file: StaticString = #file, line: UInt = #line) { + try! statement.run() + AssertSQL(SQL, 1, message, file: file, line: line) + if let count = trace[SQL] { trace[SQL] = count - 1 } + } + +// func AssertSQL(SQL: String, _ query: Query, _ message: String? = nil, file: String = __FILE__, line: UInt = __LINE__) { +// for _ in query {} +// AssertSQL(SQL, 1, message, file: file, line: line) +// if let count = trace[SQL] { trace[SQL] = count - 1 } +// } + + func async(expect description: String = "async", timeout: Double = 5, block: (@escaping () -> Void) -> Void) { + let expectation = self.expectation(description: description) + block(expectation.fulfill) + waitForExpectations(timeout: timeout, handler: nil) + } + +} + +let bool = Expression("bool") +let boolOptional = Expression("boolOptional") + +let data = Expression("blob") +let dataOptional = Expression("blobOptional") + +let date = Expression("date") +let dateOptional = Expression("dateOptional") + +let double = Expression("double") +let doubleOptional = Expression("doubleOptional") + +let int = Expression("int") +let intOptional = Expression("intOptional") + +let int64 = Expression("int64") +let int64Optional = Expression("int64Optional") + +let string = Expression("string") +let stringOptional = Expression("stringOptional") + +func AssertSQL(_ expression1: @autoclosure () -> String, _ expression2: @autoclosure () -> Expressible, file: StaticString = #file, line: UInt = #line) { + XCTAssertEqual(expression1(), expression2().asSQL(), file: file, line: line) +} + +func AssertThrows(_ expression: @autoclosure () throws -> T, file: StaticString = #file, line: UInt = #line) { + do { + _ = try expression() + XCTFail("expression expected to throw", file: file, line: line) + } catch { + XCTAssert(true, file: file, line: line) + } +} + +let table = Table("table") +let qualifiedTable = Table("table", database: "main") +let virtualTable = VirtualTable("virtual_table") +let _view = View("view") // avoid Mac XCTestCase collision diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ValueTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ValueTests.swift new file mode 100644 index 0000000000..bda2b4b380 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ValueTests.swift @@ -0,0 +1,6 @@ +import XCTest +import SQLite + +class ValueTests : XCTestCase { + +} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/fixtures/encrypted.sqlite b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/fixtures/encrypted.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..4b3c4d0ec06c7224bbe23ca0e8bf3c5538a66ae9 GIT binary patch literal 2048 zcmV+b2>3)08a>;W-J5(;;@D*~Bq9FW90iNe-OU^w&-Fcb$F#j?3aO_f4=8pqB zwUCPy(GDu&{$YUF5!X#`@>&eL5Em+_AEBZn8MZu@THAj{8Bv!*evFKqdG{YKs^8#T zCpmB+qU86jKR*e(Y>tA*FEg$$J|-8+pg&N&8o;RU8`DsWc#tGE$f5ywo9kBc@QhiHX%2s8Quttn2V zuGP*8u0`77#)W$on++;OqGNNqzogAI?GX)H;H_#6^&_K^!wl`xO)Ih9&ymiuN4PcU zt&VfsB*ds2Vnzrm!$C#3&;=p#{3 zrr8mr`4MBBojX@#pxxmE%B{n8MdtZy-h_#mQ2k%uyFPR1{JfQ)0kAC{P-Ebs2tDq( zjPnghm6-cX?zC=zlxrpaU;H@eW4x~N=Oiwu29xA|y+f4@TDvQOM&;U7tN(l#eDucI zDa#1T?{pn)V=;L{nNvz7?GND8N`9Srs{URN;Jj{j{#nl}qrVi}5+wb#ncUl&RiVOQQ95zzU@4a#jWNnrZo5HlLAWh0 z_sW}l4KZD#Uyzy4xJ2G2WIpg5N*q$x`drk|^-<;W5$_PMhXz3{o+>X_OsN!Ei;d7d z$Wm=XO};b66?p);>yJa|$VMDf^2gn-!SqbLPm9G}XB?%<@Dm2SF^CnJubCMU!+62& z<6JqBo`kMu?=AVrJ9hSBuroR3ZAO^n82#F)IREa{RNaq8xtWqCL5rRO4rn1++A;T- zH|wXI{~2a3e_c{8?;lGUo#GaDY(ZT$7PzhbC~erD8UeZ>kbz;z#d#6wacoA|n|_cX zSRnz&3qql~%jFQ`->|)Z2u}zajj{Peubri}rg+)kAO==0#2J zt>7uOLj4yB^C;y}%`U+c{PM%I_Rr>nUr=Mbtw2ky-gayM)7tgQ(J$KJ%yNbw>C_P2 z@PxB}H>HPB-kS)kB)x|u_}grUH|bSTzi70Ifz^+Wo&Ok$phkHBS_M|*YGz>kH<^+% zx-ZFmvoy+=5@Qt898FL49?%td>4!+=>!ueg^$68NXD8gaNTCesCKyzD?22s(Dw0wO z131^t6@R1LR4IXd!cK|y9s{Y9(L7!VIO*oMa0i6M{Q_5-s~!tV#J$){OZ|vu#$c0k z<8lcG?@1BFroP|He3B|;P%W1^!JtSl+cdI|a@obN`_0ywi1IzfP)a6MtPdA7K4A#8 zB6cuIWSff|DQzNO*tyB#JhA8?I8{HJY+Fv?9>my=c@g?Gi4R#?5Ja27&diEbN}GeX zWgDS*ti#>3*OLoeHgn_|n_SW`rsh4luOh#lZ6eXmKMiU7qOhP1sZ_`}B>Fu4HAwl$ z&&+LFFHOBz2!Vw-sJei$;m@otCD5wYf!Gt3Rji(lK&1$#LTfAFZjBcR(ifwCZA+_q z%QA?z-s3I&?J5;rtYpsIp0UegCO^+prph0M*w9{@xHuo|ENOFE^a~&!y&!?@Qzy1(qN2noyyx? zqXw(T+H|8K@GXJ)|!Q%`oU#ql2yWN7hR(=l(1NRDA%uC7vS!T=Z0H zUv93_!4dz2nUOF^xy~i%Ui+`x`oHAOE$LrK5F4>0t%l~Ux=K3QJTYl7jYG&vDWUXh e@S*KLmc9i7F)WxTL6K?@Y7};KXset%z6Wp5kNblF literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/SQLite.swift/run-tests.sh b/Carthage/Checkouts/SQLite.swift/run-tests.sh new file mode 100755 index 0000000000..ddd7d67834 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift/run-tests.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -ev +if [ -n "$BUILD_SCHEME" ]; then + if [ -n "$IOS_SIMULATOR" ]; then + make test BUILD_SCHEME="$BUILD_SCHEME" IOS_SIMULATOR="$IOS_SIMULATOR" + else + make test BUILD_SCHEME="$BUILD_SCHEME" + fi +elif [ -n "$VALIDATOR_SUBSPEC" ]; then + cd Tests/CocoaPods && make test +elif [ -n "$CARTHAGE_PLATFORM" ]; then + cd Tests/Carthage && make test CARTHAGE_PLATFORM="$CARTHAGE_PLATFORM" +elif [ -n "${PACKAGE_MANAGER_COMMAND}" ]; then + swift ${PACKAGE_MANAGER_COMMAND} +fi From 4a517a713698ce03ce29af439991750ea1be5b9e Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 17:46:32 -0700 Subject: [PATCH 51/76] Prepare to try submodules again --- Cartfile.resolved | 1 - .../Checkouts/SQLite.swift/.cocoadocs.yml | 2 - Carthage/Checkouts/SQLite.swift/.gitignore | 27 - Carthage/Checkouts/SQLite.swift/.gitmodules | 0 .../Checkouts/SQLite.swift/.swift-version | 1 - Carthage/Checkouts/SQLite.swift/.travis.yml | 26 - Carthage/Checkouts/SQLite.swift/CHANGELOG.md | 34 - .../Checkouts/SQLite.swift/CONTRIBUTING.md | 108 -- .../CocoaPods/appletvos/module.modulemap | 4 - .../appletvsimulator/module.modulemap | 4 - .../CocoaPods/iphoneos-10.0/module.modulemap | 4 - .../CocoaPods/iphoneos/module.modulemap | 4 - .../iphonesimulator-10.0/module.modulemap | 4 - .../iphonesimulator/module.modulemap | 4 - .../CocoaPods/macosx-10.11/module.modulemap | 4 - .../CocoaPods/macosx-10.12/module.modulemap | 4 - .../CocoaPods/macosx/module.modulemap | 4 - .../CocoaPods/watchos/module.modulemap | 4 - .../CocoaPods/watchsimulator/module.modulemap | 4 - .../SQLite.swift/Documentation/Index.md | 1587 ----------------- .../SQLite.swift/Documentation/Planning.md | 24 - .../Resources/installation@2x.png | Bin 312530 -> 0 bytes .../Documentation/Resources/playground@2x.png | Bin 124729 -> 0 bytes Carthage/Checkouts/SQLite.swift/LICENSE.txt | 21 - Carthage/Checkouts/SQLite.swift/Makefile | 60 - Carthage/Checkouts/SQLite.swift/Package.swift | 17 - Carthage/Checkouts/SQLite.swift/README.md | 263 --- .../SQLite.playground/Contents.swift | 43 - .../SQLite.playground/contents.xcplayground | 4 - .../SQLite.swift/SQLite.swift.podspec | 70 - .../SQLite.xcodeproj/project.pbxproj | 1513 ---------------- .../contents.xcworkspacedata | 7 - .../xcschemes/SQLite Mac.xcscheme | 100 -- .../xcschemes/SQLite iOS.xcscheme | 100 -- .../xcschemes/SQLite tvOS.xcscheme | 100 -- .../xcschemes/SQLite watchOS.xcscheme | 80 - .../Sources/SQLite/Core/Blob.swift | 60 - .../Sources/SQLite/Core/Connection.swift | 756 -------- .../Sources/SQLite/Core/Statement.swift | 297 --- .../Sources/SQLite/Core/Value.swift | 132 -- .../Sources/SQLite/Extensions/Cipher.swift | 61 - .../Sources/SQLite/Extensions/FTS4.swift | 346 ---- .../Sources/SQLite/Extensions/FTS5.swift | 97 - .../Sources/SQLite/Extensions/RTree.swift | 37 - .../Sources/SQLite/Foundation.swift | 108 -- .../SQLite.swift/Sources/SQLite/Helpers.swift | 130 -- .../SQLite.swift/Sources/SQLite/Info.plist | 26 - .../SQLite.swift/Sources/SQLite/SQLite.h | 6 - .../SQLite/Typed/AggregateFunctions.swift | 251 --- .../Sources/SQLite/Typed/Collation.swift | 69 - .../Sources/SQLite/Typed/CoreFunctions.swift | 683 ------- .../SQLite/Typed/CustomFunctions.swift | 136 -- .../Sources/SQLite/Typed/Expression.swift | 147 -- .../Sources/SQLite/Typed/Operators.swift | 541 ------ .../Sources/SQLite/Typed/Query.swift | 1162 ------------ .../Sources/SQLite/Typed/Schema.swift | 519 ------ .../Sources/SQLite/Typed/Setter.swift | 277 --- .../Sources/SQLiteObjc/SQLite-Bridging.m | 138 -- .../Sources/SQLiteObjc/fts3_tokenizer.h | 161 -- .../SQLiteObjc/include/SQLite-Bridging.h | 37 - .../SQLite.swift/Tests/Carthage/.gitignore | 3 - .../SQLite.swift/Tests/Carthage/Makefile | 16 - .../SQLite.swift/Tests/CocoaPods/.gitignore | 1 - .../SQLite.swift/Tests/CocoaPods/Gemfile | 4 - .../SQLite.swift/Tests/CocoaPods/Gemfile.lock | 74 - .../SQLite.swift/Tests/CocoaPods/Makefile | 13 - .../Tests/CocoaPods/integration_test.rb | 43 - .../Tests/CocoaPods/test_running_validator.rb | 120 -- .../SQLiteTests/AggregateFunctionsTests.swift | 68 - .../Tests/SQLiteTests/BlobTests.swift | 23 - .../Tests/SQLiteTests/CipherTests.swift | 98 - .../Tests/SQLiteTests/ConnectionTests.swift | 384 ---- .../SQLiteTests/CoreFunctionsTests.swift | 136 -- .../SQLiteTests/CustomFunctionsTests.swift | 6 - .../Tests/SQLiteTests/ExpressionTests.swift | 6 - .../Tests/SQLiteTests/FTS4Tests.swift | 208 --- .../Tests/SQLiteTests/FTS5Tests.swift | 124 -- .../Tests/SQLiteTests/Fixtures.swift | 8 - .../Tests/SQLiteTests/FoundationTests.swift | 16 - .../SQLite.swift/Tests/SQLiteTests/Info.plist | 24 - .../Tests/SQLiteTests/OperatorsTests.swift | 296 --- .../Tests/SQLiteTests/QueryTests.swift | 365 ---- .../Tests/SQLiteTests/RTreeTests.swift | 17 - .../Tests/SQLiteTests/SchemaTests.swift | 775 -------- .../Tests/SQLiteTests/SetterTests.swift | 137 -- .../Tests/SQLiteTests/StatementTests.swift | 26 - .../Tests/SQLiteTests/TestHelpers.swift | 115 -- .../Tests/SQLiteTests/ValueTests.swift | 6 - .../SQLiteTests/fixtures/encrypted.sqlite | Bin 2048 -> 0 bytes Carthage/Checkouts/SQLite.swift/run-tests.sh | 15 - 90 files changed, 13536 deletions(-) delete mode 100644 Cartfile.resolved delete mode 100644 Carthage/Checkouts/SQLite.swift/.cocoadocs.yml delete mode 100644 Carthage/Checkouts/SQLite.swift/.gitignore delete mode 100644 Carthage/Checkouts/SQLite.swift/.gitmodules delete mode 100644 Carthage/Checkouts/SQLite.swift/.swift-version delete mode 100644 Carthage/Checkouts/SQLite.swift/.travis.yml delete mode 100644 Carthage/Checkouts/SQLite.swift/CHANGELOG.md delete mode 100644 Carthage/Checkouts/SQLite.swift/CONTRIBUTING.md delete mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/appletvos/module.modulemap delete mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap delete mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap delete mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos/module.modulemap delete mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap delete mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap delete mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap delete mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap delete mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/macosx/module.modulemap delete mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/watchos/module.modulemap delete mode 100644 Carthage/Checkouts/SQLite.swift/CocoaPods/watchsimulator/module.modulemap delete mode 100644 Carthage/Checkouts/SQLite.swift/Documentation/Index.md delete mode 100644 Carthage/Checkouts/SQLite.swift/Documentation/Planning.md delete mode 100644 Carthage/Checkouts/SQLite.swift/Documentation/Resources/installation@2x.png delete mode 100644 Carthage/Checkouts/SQLite.swift/Documentation/Resources/playground@2x.png delete mode 100644 Carthage/Checkouts/SQLite.swift/LICENSE.txt delete mode 100644 Carthage/Checkouts/SQLite.swift/Makefile delete mode 100644 Carthage/Checkouts/SQLite.swift/Package.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/README.md delete mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.playground/Contents.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.playground/contents.xcplayground delete mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.swift.podspec delete mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.pbxproj delete mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite Mac.xcscheme delete mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite iOS.xcscheme delete mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite tvOS.xcscheme delete mode 100644 Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite watchOS.xcscheme delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Blob.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Connection.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Statement.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Value.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/Cipher.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/RTree.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Foundation.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Helpers.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Info.plist delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/SQLite.h delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Collation.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Expression.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Operators.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Query.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Schema.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Setter.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h delete mode 100644 Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/Carthage/.gitignore delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/Carthage/Makefile delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/.gitignore delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile.lock delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Makefile delete mode 100755 Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/integration_test.rb delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/test_running_validator.rb delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/AggregateFunctionsTests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/BlobTests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CipherTests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ConnectionTests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CoreFunctionsTests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CustomFunctionsTests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ExpressionTests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS4Tests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS5Tests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Fixtures.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FoundationTests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Info.plist delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/OperatorsTests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/QueryTests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/RTreeTests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SchemaTests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SetterTests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/StatementTests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/TestHelpers.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ValueTests.swift delete mode 100644 Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/fixtures/encrypted.sqlite delete mode 100755 Carthage/Checkouts/SQLite.swift/run-tests.sh diff --git a/Cartfile.resolved b/Cartfile.resolved deleted file mode 100644 index 148be8bbc2..0000000000 --- a/Cartfile.resolved +++ /dev/null @@ -1 +0,0 @@ -github "stephencelis/SQLite.swift" "0.11.2" diff --git a/Carthage/Checkouts/SQLite.swift/.cocoadocs.yml b/Carthage/Checkouts/SQLite.swift/.cocoadocs.yml deleted file mode 100644 index 2784003281..0000000000 --- a/Carthage/Checkouts/SQLite.swift/.cocoadocs.yml +++ /dev/null @@ -1,2 +0,0 @@ -additional_guides: - - Documentation/Index.md diff --git a/Carthage/Checkouts/SQLite.swift/.gitignore b/Carthage/Checkouts/SQLite.swift/.gitignore deleted file mode 100644 index 5882e0cb82..0000000000 --- a/Carthage/Checkouts/SQLite.swift/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -# OS X -.DS_Store - -# Xcode -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate - -# Carthage -/Carthage/ - -# Swift Package Manager -.build -Packages/ diff --git a/Carthage/Checkouts/SQLite.swift/.gitmodules b/Carthage/Checkouts/SQLite.swift/.gitmodules deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/Carthage/Checkouts/SQLite.swift/.swift-version b/Carthage/Checkouts/SQLite.swift/.swift-version deleted file mode 100644 index 9f55b2ccb5..0000000000 --- a/Carthage/Checkouts/SQLite.swift/.swift-version +++ /dev/null @@ -1 +0,0 @@ -3.0 diff --git a/Carthage/Checkouts/SQLite.swift/.travis.yml b/Carthage/Checkouts/SQLite.swift/.travis.yml deleted file mode 100644 index 3747ac7b89..0000000000 --- a/Carthage/Checkouts/SQLite.swift/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: objective-c -rvm: 2.2 -osx_image: xcode8.2 -env: - global: - - IOS_SIMULATOR="iPhone 6s" -matrix: - include: - - env: BUILD_SCHEME="SQLite iOS" - - env: BUILD_SCHEME="SQLite Mac" - - env: VALIDATOR_SUBSPEC="none" - - env: VALIDATOR_SUBSPEC="standard" - - env: VALIDATOR_SUBSPEC="standalone" - - env: VALIDATOR_SUBSPEC="SQLCipher" - - env: CARTHAGE_PLATFORM="iOS" - - env: CARTHAGE_PLATFORM="Mac" - - env: CARTHAGE_PLATFORM="watchOS" - - env: CARTHAGE_PLATFORM="tvOS" - - env: PACKAGE_MANAGER_COMMAND="test -Xlinker -lsqlite3" -before_install: - - gem update bundler - - gem install xcpretty --no-document - - brew update - - brew outdated carthage || brew upgrade carthage -script: - - ./run-tests.sh diff --git a/Carthage/Checkouts/SQLite.swift/CHANGELOG.md b/Carthage/Checkouts/SQLite.swift/CHANGELOG.md deleted file mode 100644 index f3298d68f9..0000000000 --- a/Carthage/Checkouts/SQLite.swift/CHANGELOG.md +++ /dev/null @@ -1,34 +0,0 @@ -0.11.2 (25-12-2016), [diff][diff-0.11.2] -======================================== - -* Fixed SQLCipher integration with read-only databases ([#559][]) -* Preliminary Swift Package Manager support ([#548][], [#560][]) -* Fixed null pointer when fetching an empty BLOB ([#561][]) -* Allow `where` as alias for `filter` ([#571][]) - -0.11.1 (06-12-2016), [diff][diff-0.11.1] -======================================== - -* Integrate SQLCipher via CocoaPods ([#546][], [#553][]) -* Made lastInsertRowid consistent with other SQLite wrappers ([#532][]) -* Fix for ~= operator used with Double ranges -* Various documentation updates - -0.11.0 (19-10-2016) -=================== - -* Swift3 migration ([diff][diff-0.11.0]) - - -[diff-0.11.0]: https://github.com/stephencelis/SQLite.swift/compare/0.10.1...0.11.0 -[diff-0.11.1]: https://github.com/stephencelis/SQLite.swift/compare/0.11.0...0.11.1 -[diff-0.11.2]: https://github.com/stephencelis/SQLite.swift/compare/0.11.1...0.11.2 - -[#532]: https://github.com/stephencelis/SQLite.swift/issues/532 -[#546]: https://github.com/stephencelis/SQLite.swift/issues/546 -[#548]: https://github.com/stephencelis/SQLite.swift/pull/548 -[#553]: https://github.com/stephencelis/SQLite.swift/pull/553 -[#559]: https://github.com/stephencelis/SQLite.swift/pull/559 -[#560]: https://github.com/stephencelis/SQLite.swift/pull/560 -[#561]: https://github.com/stephencelis/SQLite.swift/issues/561 -[#571]: https://github.com/stephencelis/SQLite.swift/issues/571 diff --git a/Carthage/Checkouts/SQLite.swift/CONTRIBUTING.md b/Carthage/Checkouts/SQLite.swift/CONTRIBUTING.md deleted file mode 100644 index 60c1837048..0000000000 --- a/Carthage/Checkouts/SQLite.swift/CONTRIBUTING.md +++ /dev/null @@ -1,108 +0,0 @@ -# Contributing - -The where and when to open an [issue](#issues) or [pull -request](#pull-requests). - - -## Issues - -Issues are used to track **bugs** and **feature requests**. Need **help** or -have a **general question**? [Ask on Stack Overflow][] (tag `sqlite.swift`). - -Before reporting a bug or requesting a feature, [run a few searches][Search] to -see if a similar issue has already been opened and ensure you’re not submitting -a duplicate. - -If you find a similar issue, read the existing conversation and see if it -addresses everything. If it doesn’t, continue the conversation there. - -If your searches return empty, see the [bug](#bugs) or [feature -request](#feature-requests) guidelines below. - -[Ask on Stack Overflow]: http://stackoverflow.com/questions/tagged/sqlite.swift -[Search]: https://github.com/stephencelis/SQLite.swift/search?type=Issues - - -### Bugs - -Think you’ve discovered a new **bug**? Let’s try troubleshooting a few things -first. - - - **Is it an installation issue?** - - If this is your first time building SQLite.swift in your project, you may - encounter a build error, _e.g._: - - No such module 'SQLite' - - Please carefully re-read the [installation instructions][] to make sure - everything is in order. - - - **Have you read the documentation?** - - If you can’t seem to get something working, check - [the documentation][See Documentation] to see if the solution is there. - - - **Are you up-to-date?** - - If you’re perusing [the documentation][See Documentation] online and find - that an example is just not working, please upgrade to the latest version - of SQLite.swift and try again before continuing. - - - **Is it an unhelpful build error?** - - While Swift error messaging is improving with each release, complex - expressions still lend themselves to misleading errors. If you encounter an - error on a complex line, breaking it down into smaller pieces generally - yields a more understandable error. - - - **Is it an _even more_ unhelpful build error?** - - Have you updated Xcode recently? Did your project stop building out of the - blue? - - Hold down the **option** key and select **Clean Build Folder…** from the - **Product** menu (⌥⇧⌘K). - -Made it through everything above and still having trouble? Sorry! -[Open an issue][]! And _please_: - - - Be as descriptive as possible. - - Provide as much information needed to _reliably reproduce_ the issue. - - Attach screenshots if possible. - - Better yet: attach GIFs or link to video. - - Even better: link to a sample project exhibiting the issue. - - Include the SQLite.swift commit or branch experiencing the issue. - - Include devices and operating systems affected. - - Include build information: the Xcode and OS X versions affected. - -[installation instructions]: Documentation/Index.md#installation -[See Documentation]: Documentation/Index.md#sqliteswift-documentation -[Open an issue]: https://github.com/stephencelis/SQLite.swift/issues/new - - -### Feature Requests - -Have an innovative **feature request**? [Open an issue][]! Be thorough! Provide -context and examples. Be open to discussion. - - -## Pull Requests - -Interested in contributing but don’t know where to start? Try the [`help -wanted`][help wanted] label. - -Ready to submit a fix or a feature? [Submit a pull request][]! And _please_: - - - If code changes, run the tests and make sure everything still works. - - Write new tests for new functionality. - - Update documentation comments where applicable. - - Maintain the existing style. - - Don’t forget to have fun. - -While we cannot guarantee a merge to every pull request, we do read each one -and love your input. - - -[help wanted]: https://github.com/stephencelis/SQLite.swift/labels/help%20wanted -[Submit a pull request]: https://github.com/stephencelis/SQLite.swift/fork diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/appletvos/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/appletvos/module.modulemap deleted file mode 100644 index 637d993582..0000000000 --- a/Carthage/Checkouts/SQLite.swift/CocoaPods/appletvos/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap deleted file mode 100644 index f8b9b671a7..0000000000 --- a/Carthage/Checkouts/SQLite.swift/CocoaPods/appletvsimulator/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap deleted file mode 100644 index 67a6c20309..0000000000 --- a/Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos-10.0/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos/module.modulemap deleted file mode 100644 index 043db6c484..0000000000 --- a/Carthage/Checkouts/SQLite.swift/CocoaPods/iphoneos/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap deleted file mode 100644 index c8b84ab8f4..0000000000 --- a/Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator-10.0/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.0.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap deleted file mode 100644 index a7b14cbb48..0000000000 --- a/Carthage/Checkouts/SQLite.swift/CocoaPods/iphonesimulator/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap deleted file mode 100644 index 9e0912979d..0000000000 --- a/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.11/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap deleted file mode 100644 index 8fc958e676..0000000000 --- a/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx-10.12/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx/module.modulemap deleted file mode 100644 index cc8370ec56..0000000000 --- a/Carthage/Checkouts/SQLite.swift/CocoaPods/macosx/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/watchos/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/watchos/module.modulemap deleted file mode 100644 index 62a6c4eef0..0000000000 --- a/Carthage/Checkouts/SQLite.swift/CocoaPods/watchos/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Carthage/Checkouts/SQLite.swift/CocoaPods/watchsimulator/module.modulemap b/Carthage/Checkouts/SQLite.swift/CocoaPods/watchsimulator/module.modulemap deleted file mode 100644 index 086fbab2de..0000000000 --- a/Carthage/Checkouts/SQLite.swift/CocoaPods/watchsimulator/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module CSQLite [system] { - header "/Applications/Xcode.app/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator.sdk/usr/include/sqlite3.h" - export * -} diff --git a/Carthage/Checkouts/SQLite.swift/Documentation/Index.md b/Carthage/Checkouts/SQLite.swift/Documentation/Index.md deleted file mode 100644 index 3e13ad4efe..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Documentation/Index.md +++ /dev/null @@ -1,1587 +0,0 @@ -# SQLite.swift Documentation - - - [Installation](#installation) - - [Carthage](#carthage) - - [CocoaPods](#cocoapods) - - [Swift Package Manager](#swift-package-manager) - - [Manual](#manual) - - [Getting Started](#getting-started) - - [Connecting to a Database](#connecting-to-a-database) - - [Read-Write Databases](#read-write-databases) - - [Read-Only Databases](#read-only-databases) - - [In-Memory Databases](#in-memory-databases) - - [Thread-Safety](#thread-safety) - - [Building Type-Safe SQL](#building-type-safe-sql) - - [Expressions](#expressions) - - [Compound Expressions](#compound-expressions) - - [Queries](#queries) - - [Creating a Table](#creating-a-table) - - [Create Table Options](#create-table-options) - - [Column Constraints](#column-constraints) - - [Table Constraints](#table-constraints) - - [Inserting Rows](#inserting-rows) - - [Setters](#setters) - - [Selecting Rows](#selecting-rows) - - [Iterating and Accessing Values](#iterating-and-accessing-values) - - [Plucking Rows](#plucking-rows) - - [Building Complex Queries](#building-complex-queries) - - [Selecting Columns](#selecting-columns) - - [Joining Other Tables](#joining-other-tables) - - [Column Namespacing](#column-namespacing) - - [Table Aliasing](#table-aliasing) - - [Filtering Rows](#filtering-rows) - - [Filter Operators and Functions](#filter-operators-and-functions) - - [Sorting Rows](#sorting-rows) - - [Limiting and Paging Results](#limiting-and-paging-results) - - [Aggregation](#aggregation) - - [Updating Rows](#updating-rows) - - [Deleting Rows](#deleting-rows) - - [Transactions and Savepoints](#transactions-and-savepoints) - - [Altering the Schema](#altering-the-schema) - - [Renaming Tables](#renaming-tables) - - [Adding Columns](#adding-columns) - - [Added Column Constraints](#added-column-constraints) - - [Indexes](#indexes) - - [Creating Indexes](#creating-indexes) - - [Dropping Indexes](#dropping-indexes) - - [Dropping Tables](#dropping-tables) - - [Migrations and Schema Versioning](#migrations-and-schema-versioning) - - [Custom Types](#custom-types) - - [Date-Time Values](#date-time-values) - - [Binary Data](#binary-data) - - [Custom Type Caveats](#custom-type-caveats) - - [Other Operators](#other-operators) - - [Core SQLite Functions](#core-sqlite-functions) - - [Aggregate SQLite Functions](#aggregate-sqlite-functions) - - [Custom SQL Functions](#custom-sql-functions) - - [Custom Collations](#custom-collations) - - [Full-text Search](#full-text-search) - - [Executing Arbitrary SQL](#executing-arbitrary-sql) - - [Logging](#logging) - - -[↩]: #sqliteswift-documentation - - -## Installation - -> _Note:_ SQLite.swift requires Swift 3 (and [Xcode 8](https://developer.apple.com/xcode/downloads/)) or greater. - - -### Carthage - -[Carthage][] is a simple, decentralized dependency manager for Cocoa. To -install SQLite.swift with Carthage: - - 1. Make sure Carthage is [installed][Carthage Installation]. - - 2. Update your Cartfile to include the following: - - ``` - github "stephencelis/SQLite.swift" ~> 0.11.2 - ``` - - 3. Run `carthage update` and [add the appropriate framework][Carthage Usage]. - - -[Carthage]: https://github.com/Carthage/Carthage -[Carthage Installation]: https://github.com/Carthage/Carthage#installing-carthage -[Carthage Usage]: https://github.com/Carthage/Carthage#adding-frameworks-to-an-application - - -### CocoaPods - -[CocoaPods][] is a dependency manager for Cocoa projects. To install SQLite.swift with CocoaPods: - - 1. Verify that your copy of Xcode is installed and active in the default location (`/Applications/Xcode.app`). - - ```sh - sudo xcode-select --switch /Applications/Xcode.app - ``` - - 2. Make sure CocoaPods is [installed][CocoaPods Installation] (SQLite.swift requires version 1.0.0 or greater). - - ``` sh - # Using the default Ruby install will require you to use sudo when - # installing and updating gems. - [sudo] gem install cocoapods - ``` - - 3. Update your Podfile to include the following: - - ``` ruby - use_frameworks! - - target 'YourAppTargetName' do - pod 'SQLite.swift', '~> 0.11.2' - end - ``` - - 4. Run `pod install --repo-update`. - - -#### Requiring a specific version of SQLite - - If you want to use a more recent version of SQLite than what is provided with the OS you can require the `standalone` subspec: - -``` ruby -target 'YourAppTargetName' do - pod 'SQLite.swift/standalone', '~> 0.11.2' -end -``` - -By default this will use the most recent version of SQLite without any extras. If you want you can further customize this by adding another dependency to sqlite3 or one of its subspecs: - -``` ruby -target 'YourAppTargetName' do - pod 'SQLite.swift/standalone', '~> 0.11.2' - pod 'sqlite3/fts5', '= 3.15.0' # SQLite 3.15.0 with FTS5 enabled -end -``` - -See the [sqlite3 podspec][sqlite3pod] for more details. - -#### Using SQLite.swift with SQLCipher - -If you want to use [SQLCipher][] with SQLite.swift you can require the `SQLCipher` -subspec in your Podfile: - -``` ruby -target 'YourAppTargetName' do - pod 'SQLite.swift/SQLCipher', '~> 0.11.2' -end -``` - -This will automatically add a dependency to the SQLCipher pod as well as extend -`Connection` with methods to change the database key: - -``` swift -import SQLite - -let db = try Connection("path/to/db.sqlite3") -try db.key("secret") -try db.rekey("another secret") -``` - -[CocoaPods]: https://cocoapods.org -[CocoaPods Installation]: https://guides.cocoapods.org/using/getting-started.html#getting-started -[sqlite3pod]: https://github.com/clemensg/sqlite3pod -[SQLCipher]: https://www.zetetic.net/sqlcipher/ - -### Swift Package Manager - -The [Swift Package Manager][] is a tool for managing the distribution of Swift code. -It’s integrated with the Swift build system to automate the process of -downloading, compiling, and linking dependencies. - -It is the recommended approach for using SQLite.swift in OSX CLI applications. - - 1. Add the following to your `Package.swift` file: - - ``` swift - dependencies: [ - .Package(url: "https://github.com/stephencelis/SQLite.swift.git", majorVersion: 0, minor: 11) - ] - ``` - - 2. Build your project: - - ``` sh - $ swift build -Xlinker -lsqlite3 - ``` - -[Swift Package Manager]: https://swift.org/package-manager - -### Manual - -To install SQLite.swift as an Xcode sub-project: - - 1. Drag the **SQLite.xcodeproj** file into your own project. ([Submodule](http://git-scm.com/book/en/Git-Tools-Submodules), clone, or [download](https://github.com/stephencelis/SQLite.swift/archive/master.zip) the project first.) - - ![Installation Screen Shot](Resources/installation@2x.png) - - 2. In your target’s **General** tab, click the **+** button under **Linked Frameworks and Libraries**. - - 3. Select the appropriate **SQLite.framework** for your platform. - - 4. **Add**. - -You should now be able to `import SQLite` from any of your target’s source files and begin using SQLite.swift. - -Some additional steps are required to install the application on an actual device: - - 5. In the **General** tab, click the **+** button under **Embedded Binaries**. - - 6. Select the appropriate **SQLite.framework** for your platform. - - 7. **Add**. - -## Getting Started - -To use SQLite.swift classes or structures in your target’s source file, first import the `SQLite` module. - -``` swift -import SQLite -``` - - -### Connecting to a Database - -Database connections are established using the `Connection` class. A connection is initialized with a path to a database. SQLite will attempt to create the database file if it does not already exist. - -``` swift -let db = try Connection("path/to/db.sqlite3") -``` - - -#### Read-Write Databases - -On iOS, you can create a writable database in your app’s **Documents** directory. - -``` swift -let path = NSSearchPathForDirectoriesInDomains( - .documentDirectory, .userDomainMask, true -).first! - -let db = try Connection("\(path)/db.sqlite3") -``` - -On OS X, you can use your app’s **Application Support** directory: - -``` swift -var path = NSSearchPathForDirectoriesInDomains( - .applicationSupportDirectory, .userDomainMask, true -).first! + Bundle.main.bundleIdentifier! - -// create parent directory iff it doesn’t exist -try FileManager.default.createDirectoryAtPath( - path, withIntermediateDirectories: true, attributes: nil -) - -let db = try Connection("\(path)/db.sqlite3") -``` - - -#### Read-Only Databases - -If you bundle a database with your app (_i.e._, you’ve copied a database file into your Xcode project and added it to your application target), you can establish a _read-only_ connection to it. - -``` swift -let path = Bundle.main.pathForResource("db", ofType: "sqlite3")! - -let db = try Connection(path, readonly: true) -``` - -> _Note:_ Signed applications cannot modify their bundle resources. If you bundle a database file with your app for the purpose of bootstrapping, copy it to a writable location _before_ establishing a connection (see [Read-Write Databases](#read-write-databases), above, for typical, writable locations). -> -> See these two Stack Overflow questions for more information about iOS apps with SQLite databases: [1](https://stackoverflow.com/questions/34609746/what-different-between-store-database-in-different-locations-in-ios), [2](https://stackoverflow.com/questions/34614968/ios-how-to-copy-pre-seeded-database-at-the-first-running-app-with-sqlite-swift). We welcome sample code to show how to successfully copy and use a bundled "seed" database for writing in an app. - -#### In-Memory Databases - -If you omit the path, SQLite.swift will provision an [in-memory database](https://www.sqlite.org/inmemorydb.html). - -``` swift -let db = try Connection() // equivalent to `Connection(.inMemory)` -``` - -To create a temporary, disk-backed database, pass an empty file name. - -``` swift -let db = try Connection(.temporary) -``` - -In-memory databases are automatically deleted when the database connection is closed. - - -#### Thread-Safety - -Every Connection comes equipped with its own serial queue for statement execution and can be safely accessed across threads. Threads that open transactions and savepoints will block other threads from executing statements while the transaction is open. - -If you maintain multiple connections for a single database, consider setting a timeout (in seconds) and/or a busy handler: - -```swift -db.busyTimeout = 5 - -db.busyHandler({ tries in - if tries >= 3 { - return false - } - return true -}) -``` - -> _Note:_ The default timeout is 0, so if you see `database is locked` errors, you may be trying to access the same database simultaneously from multiple connections. - - -## Building Type-Safe SQL - -SQLite.swift comes with a typed expression layer that directly maps [Swift types](https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibraryReference/) to their [SQLite counterparts](https://www.sqlite.org/datatype3.html). - -| Swift Type | SQLite Type | -| --------------- | ----------- | -| `Int64`* | `INTEGER` | -| `Double` | `REAL` | -| `String` | `TEXT` | -| `nil` | `NULL` | -| `SQLite.Blob`† | `BLOB` | - -> *While `Int64` is the basic, raw type (to preserve 64-bit integers on 32-bit platforms), `Int` and `Bool` work transparently. -> -> †SQLite.swift defines its own `Blob` structure, which safely wraps the underlying bytes. -> -> See [Custom Types](#custom-types) for more information about extending other classes and structures to work with SQLite.swift. -> -> See [Executing Arbitrary SQL](#executing-arbitrary-sql) to forego the typed layer and execute raw SQL, instead. - -These expressions (in the form of the structure, [`Expression`](#expressions)) build on one another and, with a query ([`QueryType`](#queries)), can create and execute SQL statements. - - -### Expressions - -Expressions are generic structures associated with a type ([built-in](#building-type-safe-sql) or [custom](#custom-types)), raw SQL, and (optionally) values to bind to that SQL. Typically, you will only explicitly create expressions to describe your columns, and typically only once per column. - -``` swift -let id = Expression("id") -let email = Expression("email") -let balance = Expression("balance") -let verified = Expression("verified") -``` - -Use optional generics for expressions that can evaluate to `NULL`. - -``` swift -let name = Expression("name") -``` - -> _Note:_ The default `Expression` initializer is for [quoted identifiers](https://www.sqlite.org/lang_keywords.html) (_i.e._, column names). To build a literal SQL expression, use `init(literal:)`. - - -### Compound Expressions - -Expressions can be combined with other expressions and types using [filter operators and functions](#filter-operators-and-functions) (as well as other [non-filter operators](#other-operators) and [functions](#core-sqlite-functions)). These building blocks can create complex SQLite statements. - - -### Queries - -Queries are structures that reference a database and table name, and can be used to build a variety of statements using expressions. We can create a query by initializing a `Table`, `View`, or `VirtualTable`. - -``` swift -let users = Table("users") -``` - -Assuming [the table exists](#creating-a-table), we can immediately [insert](#inserting-rows), [select](#selecting-rows), [update](#updating-rows), and [delete](#deleting-rows) rows. - - -## Creating a Table - -We can build [`CREATE TABLE` statements](https://www.sqlite.org/lang_createtable.html) by calling the `create` function on a `Table`. The following is a basic example of SQLite.swift code (using the [expressions](#expressions) and [query](#queries) above) and the corresponding SQL it generates. - -``` swift -try db.run(users.create { t in // CREATE TABLE "users" ( - t.column(id, primaryKey: true) // "id" INTEGER PRIMARY KEY NOT NULL, - t.column(email, unique: true) // "email" TEXT UNIQUE NOT NULL, - t.column(name) // "name" TEXT -}) // ) -``` - -> _Note:_ `Expression` structures (in this case, the `id` and `email` columns), generate `NOT NULL` constraints automatically, while `Expression` structures (`name`) do not. - - -### Create Table Options - -The `Table.create` function has several default parameters we can override. - - - `temporary` adds a `TEMPORARY` clause to the `CREATE TABLE` statement (to create a temporary table that will automatically drop when the database connection closes). Default: `false`. - - ``` swift - try db.run(users.create(temporary: true) { t in /* ... */ }) - // CREATE TEMPORARY TABLE "users" -- ... - ``` - - - `ifNotExists` adds an `IF NOT EXISTS` clause to the `CREATE TABLE` statement (which will bail out gracefully if the table already exists). Default: `false`. - - ``` swift - try db.run(users.create(ifNotExists: true) { t in /* ... */ }) - // CREATE TABLE "users" IF NOT EXISTS -- ... - ``` - -### Column Constraints - -The `column` function is used for a single column definition. It takes an [expression](#expressions) describing the column name and type, and accepts several parameters that map to various column constraints and clauses. - - - `primaryKey` adds a `PRIMARY KEY` constraint to a single column. - - ``` swift - t.column(id, primaryKey: true) - // "id" INTEGER PRIMARY KEY NOT NULL - - t.column(id, primaryKey: .autoincrement) - // "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL - ``` - - > _Note:_ The `primaryKey` parameter cannot be used alongside `references`. If you need to create a column that has a default value and is also a primary and/or foreign key, use the `primaryKey` and `foreignKey` functions mentioned under [Table Constraints](#table-constraints). - > - > Primary keys cannot be optional (_e.g._, `Expression`). - > - > Only an `INTEGER PRIMARY KEY` can take `.autoincrement`. - - - `unique` adds a `UNIQUE` constraint to the column. (See the `unique` function under [Table Constraints](#table-constraints) for uniqueness over multiple columns). - - ``` swift - t.column(email, unique: true) - // "email" TEXT UNIQUE NOT NULL - ``` - - - `check` attaches a `CHECK` constraint to a column definition in the form of a boolean expression (`Expression`). Boolean expressions can be easily built using [filter operators and functions](#filter-operators-and-functions). (See also the `check` function under [Table Constraints](#table-constraints).) - - ``` swift - t.column(email, check: email.like("%@%")) - // "email" TEXT NOT NULL CHECK ("email" LIKE '%@%') - ``` - - - `defaultValue` adds a `DEFAULT` clause to a column definition and _only_ accepts a value (or expression) matching the column’s type. This value is used if none is explicitly provided during [an `INSERT`](#inserting-rows). - - ``` swift - t.column(name, defaultValue: "Anonymous") - // "name" TEXT DEFAULT 'Anonymous' - ``` - - > _Note:_ The `defaultValue` parameter cannot be used alongside `primaryKey` and `references`. If you need to create a column that has a default value and is also a primary and/or foreign key, use the `primaryKey` and `foreignKey` functions mentioned under [Table Constraints](#table-constraints). - - - `collate` adds a `COLLATE` clause to `Expression` (and `Expression`) column definitions with [a collating sequence](https://www.sqlite.org/datatype3.html#collation) defined in the `Collation` enumeration. - - ``` swift - t.column(email, collate: .nocase) - // "email" TEXT NOT NULL COLLATE "NOCASE" - - t.column(name, collate: .rtrim) - // "name" TEXT COLLATE "RTRIM" - ``` - - - `references` adds a `REFERENCES` clause to `Expression` (and `Expression`) column definitions and accepts a table (`SchemaType`) or namespaced column expression. (See the `foreignKey` function under [Table Constraints](#table-constraints) for non-integer foreign key support.) - - ``` swift - t.column(user_id, references: users, id) - // "user_id" INTEGER REFERENCES "users" ("id") - - - - > _Note:_ The `references` parameter cannot be used alongside `primaryKey` and `defaultValue`. If you need to create a column that has a default value and is also a primary and/or foreign key, use the `primaryKey` and `foreignKey` functions mentioned under [Table Constraints](#table-constraints). - - -### Table Constraints - -Additional constraints may be provided outside the scope of a single column using the following functions. - - - `primaryKey` adds a `PRIMARY KEY` constraint to the table. Unlike [the column constraint, above](#column-constraints), it supports all SQLite types, [ascending and descending orders](#sorting-rows), and composite (multiple column) keys. - - ``` swift - t.primaryKey(email.asc, name) - // PRIMARY KEY("email" ASC, "name") - ``` - - - `unique` adds a `UNIQUE` constraint to the table. Unlike [the column constraint, above](#column-constraints), it supports composite (multiple column) constraints. - - ``` swift - t.unique(local, domain) - // UNIQUE("local", "domain") - ``` - - - `check` adds a `CHECK` constraint to the table in the form of a boolean expression (`Expression`). Boolean expressions can be easily built using [filter operators and functions](#filter-operators-and-functions). (See also the `check` parameter under [Column Constraints](#column-constraints).) - - ``` swift - t.check(balance >= 0) - // CHECK ("balance" >= 0.0) - ``` - - - `foreignKey` adds a `FOREIGN KEY` constraint to the table. Unlike [the `references` constraint, above](#column-constraints), it supports all SQLite types, both [`ON UPDATE` and `ON DELETE` actions](https://www.sqlite.org/foreignkeys.html#fk_actions), and composite (multiple column) keys. - - ``` swift - t.foreignKey(user_id, references: users, id, delete: .setNull) - // FOREIGN KEY("user_id") REFERENCES "users"("id") ON DELETE SET NULL - ``` - - - - -## Inserting Rows - -We can insert rows into a table by calling a [query’s](#queries) `insert` function with a list of [setters](#setters)—typically [typed column expressions](#expressions) and values (which can also be expressions)—each joined by the `<-` operator. - -``` swift -try db.run(users.insert(email <- "alice@mac.com", name <- "Alice")) -// INSERT INTO "users" ("email", "name") VALUES ('alice@mac.com', 'Alice') - -try db.run(users.insert(or: .replace, email <- "alice@mac.com", name <- "Alice B.")) -// INSERT OR REPLACE INTO "users" ("email", "name") VALUES ('alice@mac.com', 'Alice B.') -``` - -The `insert` function, when run successfully, returns an `Int64` representing the inserted row’s [`ROWID`][ROWID]. - -``` swift -do { - let rowid = try db.run(users.insert(email <- "alice@mac.com")) - print("inserted id: \(rowid)") -} catch { - print("insertion failed: \(error)") -} -``` - -The [`update`](#updating-rows) and [`delete`](#deleting-rows) functions follow similar patterns. - -> _Note:_ If `insert` is called without any arguments, the statement will run with a `DEFAULT VALUES` clause. The table must not have any constraints that aren’t fulfilled by default values. -> -> ``` swift -> try db.run(timestamps.insert()) -> // INSERT INTO "timestamps" DEFAULT VALUES -> ``` - - -### Setters - -SQLite.swift typically uses the `<-` operator to set values during [inserts](#inserting-rows) and [updates](#updating-rows). - -``` swift -try db.run(counter.update(count <- 0)) -// UPDATE "counters" SET "count" = 0 WHERE ("id" = 1) -``` - -There are also a number of convenience setters that take the existing value into account using native Swift operators. - -For example, to atomically increment a column, we can use `++`: - -``` swift -try db.run(counter.update(count++)) // equivalent to `counter.update(count -> count + 1)` -// UPDATE "counters" SET "count" = "count" + 1 WHERE ("id" = 1) -``` - -To take an amount and “move” it via transaction, we can use `-=` and `+=`: - -``` swift -let amount = 100.0 -try db.transaction { - try db.run(alice.update(balance -= amount)) - try db.run(betty.update(balance += amount)) -} -// BEGIN DEFERRED TRANSACTION -// UPDATE "users" SET "balance" = "balance" - 100.0 WHERE ("id" = 1) -// UPDATE "users" SET "balance" = "balance" + 100.0 WHERE ("id" = 2) -// COMMIT TRANSACTION -``` - - -###### Infix Setters - -| Operator | Types | -| -------- | ------------------ | -| `<-` | `Value -> Value` | -| `+=` | `Number -> Number` | -| `-=` | `Number -> Number` | -| `*=` | `Number -> Number` | -| `/=` | `Number -> Number` | -| `%=` | `Int -> Int` | -| `<<=` | `Int -> Int` | -| `>>=` | `Int -> Int` | -| `&=` | `Int -> Int` | -| `||=` | `Int -> Int` | -| `^=` | `Int -> Int` | -| `+=` | `String -> String` | - - -###### Postfix Setters - -| Operator | Types | -| -------- | ------------ | -| `++` | `Int -> Int` | -| `--` | `Int -> Int` | - - -## Selecting Rows - -[Query structures](#queries) are `SELECT` statements waiting to happen. They execute via [iteration](#iterating-and-accessing-values) and [other means](#plucking-values) of sequence access. - - -### Iterating and Accessing Values - -Prepared [queries](#queries) execute lazily upon iteration. Each row is returned as a `Row` object, which can be subscripted with a [column expression](#expressions) matching one of the columns returned. - -``` swift -for user in try db.prepare(users) { - print("id: \(user[id]), email: \(user[email]), name: \(user[name])") - // id: 1, email: alice@mac.com, name: Optional("Alice") -} -// SELECT * FROM "users" -``` - -`Expression` column values are _automatically unwrapped_ (we’ve made a promise to the compiler that they’ll never be `NULL`), while `Expression` values remain wrapped. - - -### Plucking Rows - -We can pluck the first row by passing a query to the `pluck` function on a database connection. - -``` swift -if let user = try db.pluck(users) { /* ... */ } // Row -// SELECT * FROM "users" LIMIT 1 -``` - -To collect all rows into an array, we can simply wrap the sequence (though this is not always the most memory-efficient idea). - -``` swift -let all = Array(try db.prepare(users)) -// SELECT * FROM "users" -``` - - -### Building Complex Queries - -[Queries](#queries) have a number of chainable functions that can be used (with [expressions](#expressions)) to add and modify [a number of clauses](https://www.sqlite.org/lang_select.html) to the underlying statement. - -``` swift -let query = users.select(email) // SELECT "email" FROM "users" - .filter(name != nil) // WHERE "name" IS NOT NULL - .order(email.desc, name) // ORDER BY "email" DESC, "name" - .limit(5, offset: 1) // LIMIT 5 OFFSET 1 -``` - - -#### Selecting Columns - -By default, [queries](#queries) select every column of the result set (using `SELECT *`). We can use the `select` function with a list of [expressions](#expressions) to return specific columns instead. - -``` swift -for user in try db.prepare(users.select(id, email)) { - print("id: \(user[id]), email: \(user[email])") - // id: 1, email: alice@mac.com -} -// SELECT "id", "email" FROM "users" -``` - -We can access the results of more complex expressions by holding onto a reference of the expression itself. - -``` swift -let sentence = name + " is " + cast(age) as Expression + " years old!" -for user in users.select(sentence) { - print(user[sentence]) - // Optional("Alice is 30 years old!") -} -// SELECT ((("name" || ' is ') || CAST ("age" AS TEXT)) || ' years old!') FROM "users" -``` - - -#### Joining Other Tables - -We can join tables using a [query’s](#queries) `join` function. - -``` swift -users.join(posts, on: user_id == users[id]) -// SELECT * FROM "users" INNER JOIN "posts" ON ("user_id" = "users"."id") -``` - -The `join` function takes a [query](#queries) object (for the table being joined on), a join condition (`on`), and is prefixed with an optional join type (default: `.inner`). Join conditions can be built using [filter operators and functions](#filter-operators-and-functions), generally require [namespacing](#column-namespacing), and sometimes require [aliasing](#table-aliasing). - - -##### Column Namespacing - -When joining tables, column names can become ambiguous. _E.g._, both tables may have an `id` column. - -``` swift -let query = users.join(posts, on: user_id == id) -// assertion failure: ambiguous column 'id' -``` - -We can disambiguate by namespacing `id`. - -``` swift -let query = users.join(posts, on: user_id == users[id]) -// SELECT * FROM "users" INNER JOIN "posts" ON ("user_id" = "users"."id") -``` - -Namespacing is achieved by subscripting a [query](#queries) with a [column expression](#expressions) (_e.g._, `users[id]` above becomes `users.id`). - -> _Note:_ We can namespace all of a table’s columns using `*`. -> -> ``` swift -> let query = users.select(users[*]) -> // SELECT "users".* FROM "users" -> ``` - - -##### Table Aliasing - -Occasionally, we need to join a table to itself, in which case we must alias the table with another name. We can achieve this using the [query’s](#queries) `alias` function. - -``` swift -let managers = users.alias("managers") - -let query = users.join(managers, on: managers[id] == users[managerId]) -// SELECT * FROM "users" -// INNER JOIN ("users") AS "managers" ON ("managers"."id" = "users"."manager_id") -``` - -If query results can have ambiguous column names, row values should be accessed with namespaced [column expressions](#expressions). In the above case, `SELECT *` immediately namespaces all columns of the result set. - -``` swift -let user = try db.pluck(query) -user[id] // fatal error: ambiguous column 'id' - // (please disambiguate: ["users"."id", "managers"."id"]) - -user[users[id]] // returns "users"."id" -user[managers[id]] // returns "managers"."id" -``` - - -#### Filtering Rows - -SQLite.swift filters rows using a [query’s](#queries) `filter` function with a boolean [expression](#expressions) (`Expression`). - -``` swift -users.filter(id == 1) -// SELECT * FROM "users" WHERE ("id" = 1) - -users.filter([1, 2, 3, 4, 5].contains(id)) -// SELECT * FROM "users" WHERE ("id" IN (1, 2, 3, 4, 5)) - -users.filter(email.like("%@mac.com")) -// SELECT * FROM "users" WHERE ("email" LIKE '%@mac.com') - -users.filter(verified && name.lowercaseString == "alice") -// SELECT * FROM "users" WHERE ("verified" AND (lower("name") == 'alice')) - -users.filter(verified || balance >= 10_000) -// SELECT * FROM "users" WHERE ("verified" OR ("balance" >= 10000.0)) -``` - -We can build our own boolean expressions by using one of the many [filter operators and functions](#filter-operators-and-functions). - -Instead of `filter` we can also use the `where` function which is an alias: - -``` swift -users.where(id == 1) -// SELECT * FROM "users" WHERE ("id" = 1) -``` - -##### Filter Operators and Functions - -SQLite.swift defines a number of operators for building filtering predicates. Operators and functions work together in a type-safe manner, so attempting to equate or compare different types will prevent compilation. - - -###### Infix Filter Operators - -| Swift | Types | SQLite | -| ----- | -------------------------------- | -------------- | -| `==` | `Equatable -> Bool` | `=`/`IS`* | -| `!=` | `Equatable -> Bool` | `!=`/`IS NOT`* | -| `>` | `Comparable -> Bool` | `>` | -| `>=` | `Comparable -> Bool` | `>=` | -| `<` | `Comparable -> Bool` | `<` | -| `<=` | `Comparable -> Bool` | `<=` | -| `~=` | `(Interval, Comparable) -> Bool` | `BETWEEN` | -| `&&` | `Bool -> Bool` | `AND` | -| `||` | `Bool -> Bool` | `OR` | - -> *When comparing against `nil`, SQLite.swift will use `IS` and `IS NOT` accordingly. - - -###### Prefix Filter Operators - -| Swift | Types | SQLite | -| ----- | ------------------ | ------ | -| `!` | `Bool -> Bool` | `NOT` | - - -###### Filtering Functions - -| Swift | Types | SQLite | -| ---------- | ----------------------- | ------- | -| `like` | `String -> Bool` | `LIKE` | -| `glob` | `String -> Bool` | `GLOB` | -| `match` | `String -> Bool` | `MATCH` | -| `contains` | `(Array, T) -> Bool` | `IN` | - - - - - -#### Sorting Rows - -We can pre-sort returned rows using the [query’s](#queries) `order` function. - -_E.g._, to return users sorted by `email`, then `name`, in ascending order: - -``` swift -users.order(email, name) -// SELECT * FROM "users" ORDER BY "email", "name" -``` - -The `order` function takes a list of [column expressions](#expressions). - -`Expression` objects have two computed properties to assist sorting: `asc` and `desc`. These properties append the expression with `ASC` and `DESC` to mark ascending and descending order respectively. - -``` swift -users.order(email.desc, name.asc) -// SELECT * FROM "users" ORDER BY "email" DESC, "name" ASC -``` - - -#### Limiting and Paging Results - -We can limit and skip returned rows using a [query’s](#queries) `limit` function (and its optional `offset` parameter). - -``` swift -users.limit(5) -// SELECT * FROM "users" LIMIT 5 - -users.limit(5, offset: 5) -// SELECT * FROM "users" LIMIT 5 OFFSET 5 -``` - - -#### Aggregation - -[Queries](#queries) come with a number of functions that quickly return aggregate scalar values from the table. These mirror the [core aggregate functions](#aggregate-sqlite-functions) and are executed immediately against the query. - -``` swift -let count = try db.scalar(users.count) -// SELECT count(*) FROM "users" -``` - -Filtered queries will appropriately filter aggregate values. - -``` swift -let count = try db.scalar(users.filter(name != nil).count) -// SELECT count(*) FROM "users" WHERE "name" IS NOT NULL -``` - - - `count` as a computed property on a query (see examples above) returns the total number of rows matching the query. - - `count` as a computed property on a column expression returns the total number of rows where that column is not `NULL`. - - ``` swift - let count = try db.scalar(users.select(name.count)) // -> Int - // SELECT count("name") FROM "users" - ``` - - - `max` takes a comparable column expression and returns the largest value if any exists. - - ``` swift - let max = try db.scalar(users.select(id.max)) // -> Int64? - // SELECT max("id") FROM "users" - ``` - - - `min` takes a comparable column expression and returns the smallest value if any exists. - - ``` swift - let min = try db.scalar(users.select(id.min)) // -> Int64? - // SELECT min("id") FROM "users" - ``` - - - `average` takes a numeric column expression and returns the average row value (as a `Double`) if any exists. - - ``` swift - let average = try db.scalar(users.select(balance.average)) // -> Double? - // SELECT avg("balance") FROM "users" - ``` - - - `sum` takes a numeric column expression and returns the sum total of all rows if any exist. - - ``` swift - let sum = try db.scalar(users.select(balance.sum)) // -> Double? - // SELECT sum("balance") FROM "users" - ``` - - - `total`, like `sum`, takes a numeric column expression and returns the sum total of all rows, but in this case always returns a `Double`, and returns `0.0` for an empty query. - - ``` swift - let total = try db.scalar(users.select(balance.total)) // -> Double - // SELECT total("balance") FROM "users" - ``` - -> _Note:_ Expressions can be prefixed with a `DISTINCT` clause by calling the `distinct` computed property. -> -> ``` swift -> let count = try db.scalar(users.select(name.distinct.count) // -> Int -> // SELECT count(DISTINCT "name") FROM "users" -> ``` - - -## Updating Rows - -We can update a table’s rows by calling a [query’s](#queries) `update` function with a list of [setters](#setters)—typically [typed column expressions](#expressions) and values (which can also be expressions)—each joined by the `<-` operator. - -When an unscoped query calls `update`, it will update _every_ row in the table. - -``` swift -try db.run(users.update(email <- "alice@me.com")) -// UPDATE "users" SET "email" = 'alice@me.com' -``` - -Be sure to scope `UPDATE` statements beforehand using [the `filter` function](#filtering-rows). - -``` swift -let alice = users.filter(id == 1) -try db.run(alice.update(email <- "alice@me.com")) -// UPDATE "users" SET "email" = 'alice@me.com' WHERE ("id" = 1) -``` - -The `update` function returns an `Int` representing the number of updated rows. - -``` swift -do { - if try db.run(alice.update(email <- "alice@me.com")) > 0 { - print("updated alice") - } else { - print("alice not found") - } -} catch { - print("update failed: \(error)") -} -``` - - -## Deleting Rows - -We can delete rows from a table by calling a [query’s](#queries) `delete` function. - -When an unscoped query calls `delete`, it will delete _every_ row in the table. - -``` swift -try db.run(users.delete()) -// DELETE FROM "users" -``` - -Be sure to scope `DELETE` statements beforehand using [the `filter` function](#filtering-rows). - -``` swift -let alice = users.filter(id == 1) -try db.run(alice.delete()) -// DELETE FROM "users" WHERE ("id" = 1) -``` - -The `delete` function returns an `Int` representing the number of deleted rows. - -``` swift -do { - if try db.run(alice.delete()) > 0 { - print("deleted alice") - } else { - print("alice not found") - } -} catch { - print("delete failed: \(error)") -} -``` - - -## Transactions and Savepoints - -Using the `transaction` and `savepoint` functions, we can run a series of statements in a transaction. If a single statement fails or the block throws an error, the changes will be rolled back. - -``` swift -try db.transaction { - let rowid = try db.run(users.insert(email <- "betty@icloud.com")) - try db.run(users.insert(email <- "cathy@icloud.com", managerId <- rowid)) -} -// BEGIN DEFERRED TRANSACTION -// INSERT INTO "users" ("email") VALUES ('betty@icloud.com') -// INSERT INTO "users" ("email", "manager_id") VALUES ('cathy@icloud.com', 2) -// COMMIT TRANSACTION -``` - -> _Note:_ Transactions run in a serial queue. - - -## Altering the Schema - -SQLite.swift comes with several functions (in addition to `Table.create`) for altering a database schema in a type-safe manner. - - -### Renaming Tables - -We can build an `ALTER TABLE … RENAME TO` statement by calling the `rename` function on a `Table` or `VirtualTable`. - -``` swift -try db.run(users.rename(Table("users_old")) -// ALTER TABLE "users" RENAME TO "users_old" -``` - - -### Adding Columns - -We can add columns to a table by calling `addColumn` function on a `Table`. SQLite.swift enforces [the same limited subset](https://www.sqlite.org/lang_altertable.html) of `ALTER TABLE` that SQLite supports. - -``` swift -try db.run(users.addColumn(suffix)) -// ALTER TABLE "users" ADD COLUMN "suffix" TEXT -``` - - -#### Added Column Constraints - -The `addColumn` function shares several of the same [`column` function parameters](#column-constraints) used when [creating tables](#creating-a-table). - - - `check` attaches a `CHECK` constraint to a column definition in the form of a boolean expression (`Expression`). (See also the `check` function under [Table Constraints](#table-constraints).) - - ``` swift - try db.run(users.addColumn(suffix, check: ["JR", "SR"].contains(suffix))) - // ALTER TABLE "users" ADD COLUMN "suffix" TEXT CHECK ("suffix" IN ('JR', 'SR')) - ``` - - - `defaultValue` adds a `DEFAULT` clause to a column definition and _only_ accepts a value matching the column’s type. This value is used if none is explicitly provided during [an `INSERT`](#inserting-rows). - - ``` swift - try db.run(users.addColumn(suffix, defaultValue: "SR")) - // ALTER TABLE "users" ADD COLUMN "suffix" TEXT DEFAULT 'SR' - ``` - - > _Note:_ Unlike the [`CREATE TABLE` constraint](#table-constraints), default values may not be expression structures (including `CURRENT_TIME`, `CURRENT_DATE`, or `CURRENT_TIMESTAMP`). - - - `collate` adds a `COLLATE` clause to `Expression` (and `Expression`) column definitions with [a collating sequence](https://www.sqlite.org/datatype3.html#collation) defined in the `Collation` enumeration. - - ``` swift - try db.run(users.addColumn(email, collate: .nocase)) - // ALTER TABLE "users" ADD COLUMN "email" TEXT NOT NULL COLLATE "NOCASE" - - try db.run(users.addColumn(name, collate: .rtrim)) - // ALTER TABLE "users" ADD COLUMN "name" TEXT COLLATE "RTRIM" - ``` - - - `references` adds a `REFERENCES` clause to `Int64` (and `Int64?`) column definitions and accepts a table or namespaced column expression. (See the `foreignKey` function under [Table Constraints](#table-constraints) for non-integer foreign key support.) - - ``` swift - try db.run(posts.addColumn(userId, references: users, id) - // ALTER TABLE "posts" ADD COLUMN "user_id" INTEGER REFERENCES "users" ("id") - ``` - - -### Indexes - - -#### Creating Indexes - -We can build [`CREATE INDEX` statements](https://www.sqlite.org/lang_createindex.html) by calling the `createIndex` function on a `SchemaType`. - -``` swift -try db.run(users.createIndex(email)) -// CREATE INDEX "index_users_on_email" ON "users" ("email") -``` - -The index name is generated automatically based on the table and column names. - -The `createIndex` function has a couple default parameters we can override. - - - `unique` adds a `UNIQUE` constraint to the index. Default: `false`. - - ``` swift - try db.run(users.createIndex(email, unique: true)) - // CREATE UNIQUE INDEX "index_users_on_email" ON "users" ("email") - ``` - - - `ifNotExists` adds an `IF NOT EXISTS` clause to the `CREATE TABLE` statement (which will bail out gracefully if the table already exists). Default: `false`. - - ``` swift - try db.run(users.createIndex(email, ifNotExists: true)) - // CREATE INDEX IF NOT EXISTS "index_users_on_email" ON "users" ("email") - ``` - - -#### Dropping Indexes - -We can build [`DROP INDEX` statements](https://www.sqlite.org/lang_dropindex.html) by calling the `dropIndex` function on a `SchemaType`. - -``` swift -try db.run(users.dropIndex(email)) -// DROP INDEX "index_users_on_email" -``` - -The `dropIndex` function has one additional parameter, `ifExists`, which (when `true`) adds an `IF EXISTS` clause to the statement. - -``` swift -try db.run(users.dropIndex(email, ifExists: true)) -// DROP INDEX IF EXISTS "index_users_on_email" -``` - - -### Dropping Tables - -We can build [`DROP TABLE` statements](https://www.sqlite.org/lang_droptable.html) by calling the `dropTable` function on a `SchemaType`. - -``` swift -try db.run(users.drop()) -// DROP TABLE "users" -``` - -The `drop` function has one additional parameter, `ifExists`, which (when `true`) adds an `IF EXISTS` clause to the statement. - -``` swift -try db.run(users.drop(ifExists: true)) -// DROP TABLE IF EXISTS "users" -``` - - -### Migrations and Schema Versioning - -You can add a convenience property on `Connection` to query and set the [`PRAGMA user_version`](https://sqlite.org/pragma.html#pragma_user_version). - -This is a great way to manage your schema’s version over migrations. - -``` swift -extension Connection { - public var userVersion: Int32 { - get { return Int32(try! scalar("PRAGMA user_version") as! Int64)} - set { try! run("PRAGMA user_version = \(newValue)") } - } -} -``` - -Then you can conditionally run your migrations along the lines of: - -```swift -if db.userVersion == 0 { - // handle first migration - db.userVersion = 1 -} -if db.userVersion == 1 { - // handle second migration - db.userVersion = 2 -} -``` - -For more complex migration requirements check out the schema management system -[SQLiteMigrationManager.swift][]. - -## Custom Types - -SQLite.swift supports serializing and deserializing any custom type as long as it conforms to the `Value` protocol. - -> ``` swift -> protocol Value { -> typealias Datatype: Binding -> class var declaredDatatype: String { get } -> class func fromDatatypeValue(datatypeValue: Datatype) -> Self -> var datatypeValue: Datatype { get } -> } -> ``` - -The `Datatype` must be one of the basic Swift types that values are bridged through before serialization and deserialization (see [Building Type-Safe SQL](#building-type-safe-sql) for a list of types). - -> _Note:_ `Binding` is a protocol that SQLite.swift uses internally to directly map SQLite types to Swift types. **Do _not_** conform custom types to the `Binding` protocol. - -Once extended, the type can be used [_almost_](#custom-type-caveats) wherever typed expressions can be. - - -### Date-Time Values - -In SQLite, `DATETIME` columns can be treated as strings or numbers, so we can transparently bridge `Date` objects through Swift’s `String` or `Int` types. - -To serialize `Date` objects as `TEXT` values (in ISO 8601), we’ll use `String`. - -``` swift -extension Date: Value { - class var declaredDatatype: String { - return String.declaredDatatype - } - class func fromDatatypeValue(stringValue: String) -> Date { - return SQLDateFormatter.dateFromString(stringValue)! - } - var datatypeValue: String { - return SQLDateFormatter.stringFromDate(self) - } -} - -let SQLDateFormatter: DateFormatter = { - let formatter = DateFormatter() - formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS" - formatter.locale = Locale(localeIdentifier: "en_US_POSIX") - formatter.timeZone = TimeZone(forSecondsFromGMT: 0) - return formatter -}() -``` - -We can also treat them as `INTEGER` values using `Int`. - -``` swift -extension Date: Value { - class var declaredDatatype: String { - return Int.declaredDatatype - } - class func fromDatatypeValue(intValue: Int) -> Self { - return self(timeIntervalSince1970: TimeInterval(intValue)) - } - var datatypeValue: Int { - return Int(timeIntervalSince1970) - } -} -``` - -> _Note:_ SQLite’s `CURRENT_DATE`, `CURRENT_TIME`, and `CURRENT_TIMESTAMP` helpers return `TEXT` values. Because of this (and the fact that Unix time is far less human-readable when we’re faced with the raw data), we recommend using the `TEXT` extension. - -Once defined, we can use these types directly in SQLite statements. - -``` swift -let published_at = Expression("published_at") - -let published = posts.filter(published_at <= Date()) -// extension where Datatype == String: -// SELECT * FROM "posts" WHERE "published_at" <= '2014-11-18 12:45:30' -// extension where Datatype == Int: -// SELECT * FROM "posts" WHERE "published_at" <= 1416314730 -``` - - -### Binary Data - -We can bridge any type that can be initialized from and encoded to `Data`. - -``` swift -extension UIImage: Value { - public class var declaredDatatype: String { - return Blob.declaredDatatype - } - public class func fromDatatypeValue(blobValue: Blob) -> UIImage { - return UIImage(data: Data.fromDatatypeValue(blobValue))! - } - public var datatypeValue: Blob { - return UIImagePNGRepresentation(self)!.datatypeValue - } - -} -``` - -> _Note:_ See the [Archives and Serializations Programming Guide](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Archiving/Archiving.html#//apple_ref/doc/uid/10000047i) for more information on encoding and decoding custom types. - - -### Custom Type Caveats - -Swift does _not_ currently support generic subscripting, which means we cannot, by default, subscript Expressions with custom types to: - - 1. **Namespace expressions**. Use the `namespace` function, instead: - - ``` swift - let avatar = Expression("avatar") - users[avatar] // fails to compile - users.namespace(avatar) // "users"."avatar" - ``` - - 2. **Access column data**. Use the `get` function, instead: - - ``` swift - let user = users.first! - user[avatar] // fails to compile - user.get(avatar) // UIImage? - ``` - -We can, of course, write extensions, but they’re rather wordy. - -``` swift -extension Query { - subscript(column: Expression) -> Expression { - return namespace(column) - } - subscript(column: Expression) -> Expression { - return namespace(column) - } -} - -extension Row { - subscript(column: Expression) -> UIImage { - return get(column) - } - subscript(column: Expression) -> UIImage? { - return get(column) - } -} -``` - - -## Other Operators - -In addition to [filter operators](#filtering-infix-operators), SQLite.swift defines a number of operators that can modify expression values with arithmetic, bitwise operations, and concatenation. - - -###### Other Infix Operators - -| Swift | Types | SQLite | -| ----- | -------------------------------- | -------- | -| `+` | `Number -> Number` | `+` | -| `-` | `Number -> Number` | `-` | -| `*` | `Number -> Number` | `*` | -| `/` | `Number -> Number` | `/` | -| `%` | `Int -> Int` | `%` | -| `<<` | `Int -> Int` | `<<` | -| `>>` | `Int -> Int` | `>>` | -| `&` | `Int -> Int` | `&` | -| `|` | `Int -> Int` | `|` | -| `+` | `String -> String` | `||` | - -> _Note:_ SQLite.swift also defines a bitwise XOR operator, `^`, which expands the expression `lhs ^ rhs` to `~(lhs & rhs) & (lhs | rhs)`. - - -###### Other Prefix Operators - -| Swift | Types | SQLite | -| ----- | ------------------ | ------ | -| `~` | `Int -> Int` | `~` | -| `-` | `Number -> Number` | `-` | - - -## Core SQLite Functions - -Many of SQLite’s [core functions](https://www.sqlite.org/lang_corefunc.html) have been surfaced in and type-audited for SQLite.swift. - -> _Note:_ SQLite.swift aliases the `??` operator to the `ifnull` function. -> -> ``` swift -> name ?? email // ifnull("name", "email") -> ``` - - -## Aggregate SQLite Functions - -Most of SQLite’s [aggregate functions](https://www.sqlite.org/lang_aggfunc.html) have been surfaced in and type-audited for SQLite.swift. - - -## Custom SQL Functions - -We can create custom SQL functions by calling `createFunction` on a database connection. - -For example, to give queries access to [`MobileCoreServices.UTTypeConformsTo`](https://developer.apple.com/library/ios/documentation/MobileCoreServices/Reference/UTTypeRef/index.html#//apple_ref/c/func/UTTypeConformsTo), we can write the following: - -``` swift -import MobileCoreServices - -let typeConformsTo: (Expression, String) -> Expression = ( - try db.createFunction("typeConformsTo", deterministic: true) { UTI, conformsToUTI in - return UTTypeConformsTo(UTI, conformsToUTI) - } -) -``` - -> _Note:_ The optional `deterministic` parameter is an optimization that causes the function to be created with [`SQLITE_DETERMINISTIC`](https://www.sqlite.org/c3ref/create_function.html). - -Note `typeConformsTo`’s signature: - -``` swift -(Expression, String) -> Expression -``` - -Because of this, `createFunction` expects a block with the following signature: - -``` swift -(String, String) -> Bool -``` - -Once assigned, the closure can be called wherever boolean expressions are accepted. - -``` swift -let attachments = Table("attachments") -let UTI = Expression("UTI") - -let images = attachments.filter(typeConformsTo(UTI, kUTTypeImage)) -// SELECT * FROM "attachments" WHERE "typeConformsTo"("UTI", 'public.image') -``` - -> _Note:_ The return type of a function must be [a core SQL type](#building-type-safe-sql) or [conform to `Value`](#custom-types). - -We can create loosely-typed functions by handling an array of raw arguments, instead. - -``` swift -db.createFunction("typeConformsTo", deterministic: true) { args in - guard let UTI = args[0] as? String, conformsToUTI = args[1] as? String else { return nil } - return UTTypeConformsTo(UTI, conformsToUTI) -} -``` - -Creating a loosely-typed function cannot return a closure and instead must be wrapped manually or executed [using raw SQL](#executing-arbitrary-sql). - -``` swift -let stmt = try db.prepare("SELECT * FROM attachments WHERE typeConformsTo(UTI, ?)") -for row in stmt.bind(kUTTypeImage) { /* ... */ } -``` - - -## Custom Collations - -We can create custom collating sequences by calling `createCollation` on a database connection. - -``` swift -try db.createCollation("NODIACRITIC") { lhs, rhs in - return lhs.compare(rhs, options: .diacriticInsensitiveSearch) -} -``` - -We can reference a custom collation using the `Custom` member of the `Collation` enumeration. - -``` swift -restaurants.order(collate(.custom("NODIACRITIC"), name)) -// SELECT * FROM "restaurants" ORDER BY "name" COLLATE "NODIACRITIC" -``` - - -## Full-text Search - -We can create a virtual table using the [FTS4 module](http://www.sqlite.org/fts3.html) by calling `create` on a `VirtualTable`. - -``` swift -let emails = VirtualTable("emails") -let subject = Expression("subject") -let body = Expression("body") - -try db.run(emails.create(.FTS4(subject, body))) -// CREATE VIRTUAL TABLE "emails" USING fts4("subject", "body") -``` - -We can specify a [tokenizer](http://www.sqlite.org/fts3.html#tokenizer) using the `tokenize` parameter. - -``` swift -try db.run(emails.create(.FTS4([subject, body], tokenize: .Porter))) -// CREATE VIRTUAL TABLE "emails" USING fts4("subject", "body", tokenize=porter) -``` - -We can set the full range of parameters by creating a `FTS4Config` object. - -``` swift -let emails = VirtualTable("emails") -let subject = Expression("subject") -let body = Expression("body") -let config = FTS4Config() - .column(subject) - .column(body, [.unindexed]) - .languageId("lid") - .order(.desc) - -try db.run(emails.create(.FTS4(config)) -// CREATE VIRTUAL TABLE "emails" USING fts4("subject", "body", notindexed="body", languageid="lid", order="desc") -``` - -Once we insert a few rows, we can search using the `match` function, which takes a table or column as its first argument and a query string as its second. - -``` swift -try db.run(emails.insert( - subject <- "Just Checking In", - body <- "Hey, I was just wondering...did you get my last email?" -)) - -let wonderfulEmails = emails.match("wonder*") -// SELECT * FROM "emails" WHERE "emails" MATCH 'wonder*' - -let replies = emails.filter(subject.match("Re:*")) -// SELECT * FROM "emails" WHERE "subject" MATCH 'Re:*' -``` - -### FTS5 - -When linking against a version of SQLite with [FTS5](http://www.sqlite.org/fts5.html) enabled we can create the virtual table -in a similar fashion. - -```swift -let emails = VirtualTable("emails") -let subject = Expression("subject") -let body = Expression("body") -let config = FTS5Config() - .column(subject) - .column(body, [.unindexed]) - -try db.run(emails.create(.FTS5(config)) -// CREATE VIRTUAL TABLE "emails" USING fts5("subject", "body" UNINDEXED) - -// Note that FTS5 uses a different syntax to select columns, so we need to rewrite -// the last FTS4 query above as: -let replies = emails.filter(emails.match("subject:\"Re:\"*)) -// SELECT * FROM "emails" WHERE "emails" MATCH 'subject:"Re:"*' - -// https://www.sqlite.org/fts5.html#_changes_to_select_statements_ -``` - -## Executing Arbitrary SQL - -Though we recommend you stick with SQLite.swift’s [type-safe system](#building-type-safe-sql) whenever possible, it is possible to simply and safely prepare and execute raw SQL statements via a `Database` connection using the following functions. - - - `execute` runs an arbitrary number of SQL statements as a convenience. - - ``` swift - try db.execute( - "BEGIN TRANSACTION;" + - "CREATE TABLE users (" + - "id INTEGER PRIMARY KEY NOT NULL," + - "email TEXT UNIQUE NOT NULL," + - "name TEXT" + - ");" + - "CREATE TABLE posts (" + - "id INTEGER PRIMARY KEY NOT NULL," + - "title TEXT NOT NULL," + - "body TEXT NOT NULL," + - "published_at DATETIME" + - ");" + - "PRAGMA user_version = 1;" + - "COMMIT TRANSACTION;" - ) - ``` - - - `prepare` prepares a single `Statement` object from a SQL string, optionally binds values to it (using the statement’s `bind` function), and returns the statement for deferred execution. - - ``` swift - let stmt = try db.prepare("INSERT INTO users (email) VALUES (?)") - ``` - - Once prepared, statements may be executed using `run`, binding any unbound parameters. - - ``` swift - try stmt.run("alice@mac.com") - db.changes // -> {Some 1} - ``` - - Statements with results may be iterated over, using the columnNames if useful. - - ``` swift - let stmt = try db.prepare("SELECT id, email FROM users") - for row in stmt { - for (index, name) in stmt.columnNames.enumerate() { - print ("\(name)=\(row[index]!)") - // id: Optional(1), email: Optional("alice@mac.com") - } - } - ``` - - - `run` prepares a single `Statement` object from a SQL string, optionally binds values to it (using the statement’s `bind` function), executes, and returns the statement. - - ``` swift - try db.run("INSERT INTO users (email) VALUES (?)", "alice@mac.com") - ``` - - - `scalar` prepares a single `Statement` object from a SQL string, optionally binds values to it (using the statement’s `bind` function), executes, and returns the first value of the first row. - - ``` swift - let count = try db.scalar("SELECT count(*) FROM users") as! Int64 - ``` - - Statements also have a `scalar` function, which can optionally re-bind values at execution. - - ``` swift - let stmt = try db.prepare("SELECT count (*) FROM users") - let count = try stmt.scalar() as! Int64 - ``` - - -## Logging - -We can log SQL using the database’s `trace` function. - -``` swift -#if DEBUG - db.trace(print) -#endif -``` - - -[ROWID]: https://sqlite.org/lang_createtable.html#rowid -[SQLiteMigrationManager.swift]: https://github.com/garriguv/SQLiteMigrationManager.swift diff --git a/Carthage/Checkouts/SQLite.swift/Documentation/Planning.md b/Carthage/Checkouts/SQLite.swift/Documentation/Planning.md deleted file mode 100644 index d814d26b06..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Documentation/Planning.md +++ /dev/null @@ -1,24 +0,0 @@ -# SQLite.swift Planning - -This document captures both near term steps (aka Roadmap) and feature requests. -The goal is to add some visibility and guidance for future additions and Pull Requests, as well as to keep the Issues list clear of enhancement requests so that bugs are more visible. - -## Roadmap - -_Lists agreed upon next steps in approximate priority order._ - -## Feature Requests - -_A gathering point for ideas for new features. In general, the corresponding issue will be closed once it is added here, with the assumption that it will be referred to when it comes time to add the corresponding feature._ - -### Features - - * encapsulate ATTACH DATABASE / DETACH DATABASE as methods, per [#30](https://github.com/stephencelis/SQLite.swift/issues/30) - * provide separate threads for update vs read, so updates don't block reads, per [#236](https://github.com/stephencelis/SQLite.swift/issues/236) - * expose triggers, per [#164](https://github.com/stephencelis/SQLite.swift/issues/164) - -## Suspended Feature Requests - -_Features that are not actively being considered, perhaps because of no clean type-safe way to implement them with the current Swift, or bugs, or just general uncertainty._ - - * provide a mechanism for INSERT INTO multiple values, per [#168](https://github.com/stephencelis/SQLite.swift/issues/168) diff --git a/Carthage/Checkouts/SQLite.swift/Documentation/Resources/installation@2x.png b/Carthage/Checkouts/SQLite.swift/Documentation/Resources/installation@2x.png deleted file mode 100644 index 6b31f459348e97208dbc8b564884a0d065c803d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312530 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 z zfZbVBsZSt`mYwf>0A*zgLj;1$Sfr0v4{d|cj!dMuy#`K4QmutXlCsBJ>xJrlDpk

Ut~liU?b@moZ*S!?LZ`jdp)UeZbpK0$o-!CT{kPFPXFBX8V21q4K9O(i%&*zJQZ z)}@)RQ!NqS0=X=(SwrM|2pvh3d#u|L>wSAw5b=BukAPq%hL687mD&Jy;UmHT1PKx? zoRAfY)nh9D0u{OW`MbT#O72BYR_RWh*66q{TWcxTrjw51hsS&7i#6JvpM;jSk0U-& zt0m1$*sR_(>7PmPyY?YF{|Wy3_UWmCg`2OlbIpK1fw~wi_id0vG0;FKV7r4^#Ada> z@dQ|x^p>6yMM%NnI+tdMeENL<)L@B;xu+qmoooxvaDT`84y+h*`0?Y1>>}?_y>Wt~ zRYe3U8rs!SQ5G2)8K3)&c#fRs>+K?4u^zAM#pYazBF-5V9bFWVioLYe%G`Rf*r#+1S~NED;gvPog6HU$1QfTVf08qVyF=x()~u!5Bx zwNEw1=akz<1oXTGU-!PBRxz(J7uv8<=d0~$HYOjxN( zC@gh9azY+BlsM?szcGD%hl1F|K92Sq_?xb(`JGai{`F$bikbH|7{F$0s^JNvY zL}?{kf9DAaH;rPRVN)D}eCE*eOR-+cVkJwDp+^C(W|l4u#its~ayxV~P4A%^mmjI*6dVr)syeft z8QkIO{4|{AU82pUicLD6f=SiY3@|s{`loAOdwP1(krG9FaM%G_CkqwYByOH(;7oCu z*Yn-POywahEBT=_VL>IN@bzu@#?YUxGKR8fW91$t7XHTZP==QPfbvq; zdJ%K8kteYB)~&@r=^r zT(T;A30~@rtX9o-o-?6B^BV+V0CDbf6MpO!0>Y5>?)T|u5GmWe3byLV>&cC)%})#3 z(t+XzSlZ=yCV&JF2ni9}L3xk2+3j7Q&;I%f3ARGJ@8YAklDx@NgBa#bMfWImwFO?r zKt0XXFFW)7$TpPg@S|1uvm)o}XjJ}1{C(Oe*~IOlN<$kOvRU z1T5uvG+iHj$~rVPa~T=JE4a&~xZZMZm-7Q9f~r4-(?B%kbxQ0-u}4fy06@o&)oE5s zBU!UJyYFVG`Qki*dwBp;N4Yd8SovV#JPyM+^XDW1Q%ahuoU5aCfaRl{Tgp+>5|dq- z0xJ)Xn$A%XOA_1~Ie`G(JV)(yJ0W(GtMd6F4Msdu!qH@xJQe<$l+TUuPab0(<&Tz& zl{x6#Y4+;XT_}ZN=Q>^E`Ry7?N=|+BaV2>I_FRm|wj)0sc6iR zM_0S5!DOD^F~?}NMx&V1> zsyfiRTXM!^;%_MBY%1%H<(E%v9^uCY<<+P1(CqYHfQ6m4UUJ{k3LK@+@=2AB3zHFs{9Ueh?7aOyO-t1b@>@9MHkebAd~eDc|);xn#rNUwTz@ zO@T7-iQRtJ4yH1*t5_8)OK7Tfi4~C}s(1L^>}7i9^<^BhD+xKDaMfHS%S{4l0ge%9 z)(+Ko6`z3`o_ADSW#W9@G(kH8TO)p7d~se`E44Ook6GIf-;gUQ3Nt%|0pGvu$@v$wpmw$fTSP=)# zOg5LRbRDfyk$u6yh)*Qg#r?cZ&Fsj#PG7cc^dNdX;GgcVAOaWr`0LYypf0*AS<5xZ zWv$(f`QE#Dx{@WZgTwf=xIq&2>Dmffx3gEhXrcXeVu`;}`HqMDt#N-A_@VucXOI&n zal%#q$->*Wga7d?ZFs@eBfWJ$pwh7Eg7-F~-RDvX*s4{0GZ+Qe_v7MI#umBz2%`EAm z=sN1`mQUqFeJq{uHXip5+~@eKs$E4zvJNwPevO8kNa zm-qTB&#!AUrFQR)2z zsQ^2V#z_mjKM0XBeGyF?I?lp73O>7~y1z7eK-7alC&7V{(xO>-?eEU$neJbXGhMu% zf2#<^Qf1)yH12_#cFN!=`(TC^CsQx@D^$YJ63O0~>PxzoXC-HS;7=al!k&(Sq0_+Q zSk#$Q+KMkf-Hyu|+De&|S&BvQ*pS3zIv0H%m{xyB=(B(Qri-X^xow7A zjhHVtk$yvRV@DUExPMx-1%aIEqh78WXH!ic?nW_*02>&UGY#%YydvRw7U zin5qrfkm+Trvvhd&x~D)MU!j^uD}6$8XsqY3`Boz!Jh5FGWT*@kui+u^$|gOjR*Pf zU%zr#udsCbvwA(<93GmHlTnhBi{)v%d3ZG0YyewUFb&91jLI`HF$@-KyQT2`YbuH0 zoxA+qN0BmgzICAyJJ1Hw%9l6>0o#^ z1udboOA^y1aU4XH{_$ z{GG<)R9~&<>Z&4oYIp<`iIcl{Tu@2gS1}i{)~8!J^;!M*H_Yt*B>gs*WRKtR87)=0;$9LurUC+v zoWHE8ObBWi7A+Pg2MX2g&M-R{SIC^nydC+NcZjITViHy^TG@>sK z62p%w1tB+i{i8JyMVk+#`pr(}U!B6Hvy^HvO6&7xq-e!yZcswRw2J8L@X&=TT^+u! z83DFp#>6jM=lQ|)c(bi)VPWttprukJs`mDFULGE)g27EO5-!K%Z(lZ204b|YR^pt= zj@N^%PYxuc%LZp7;>#^c;p86?rXTFK|I~+RFJj3T0Xhi##E@|xMR|GisLRp_Yi?UH z%vpO){kyxn!AG;;Urg|=3MK81N3jmGaR~`~3Sj-YAupUyKP3NY%=hr=^@y4?XC)~e z{IM>ZYnRhi`<#3yWrHmpUMoD<(;nT~_9KhNI7xLD@0Tw$BsRC$P4Ab!RkO#T{eBW} zGtA;{J(r*Kzv1JD&L|v_^`|O*O+QB<$dZFh?nLVu*w*XThO$IGW*B~LUAwG}Ni5eI zkH%R(lQExE<`Uz-xz|Xs#%QXH7|6tjdAlgD1ia9eHSO|>KR-e`8@WAuT;KCm|5<(1 zK3#Hnr3?n}s&{x!SEV`7S?>Th9}R?Xn1iZ>V_OUm*+clBs?c5Rzt%=oyoETabGpn! z8IsC@=56d9Y-rB{WG$}lWqnx=E09 z`6Rm(k>BHJ6*s=$5nE^Ng7t)FvuZ9PeZ0(j-Sc68TDN)jozGRBAFEIKcUdKr{x~qq zJ!dV=Ga>GJ^K+BTt}pLB!eO?L(X5_`&!YW6bq}#{)Gi=e@7o(2}Z^_S+Jwjd?ZAXwx?% z2h(N|Pv7Jip@!`L|vu>rdfrL{6Rd!hzLr+z8hUx-oPTIkTH%QuXL5-SXs{;&ro6&38!SL6IBVUiXQ=&m=PRjJe} zk)uFELrYIf=5jjbak~OnKKJ+cC(rEQh4{~x;R1+`MJ}32DU_KV(auvU?6>HXhMEgH z2;@10sVXSE%Yk@r2g_BfP)nZ^i+t961990u3cl_Zf-ryFat-tw%|(`N9WAxNLvSEW zpyjBBi;wQl;nZ8aC3Bo(e48_vsck`M_4Joh35`vY&2a?XOMbPPzHS`H`z-hs{qsoP zV7Gaf34Zh&0XFSBrJG5UDvx~VXB+!m3Mv!-$a7$$U)FJIIZ*$!VAcyBqxQ3?1<~H( zTgJGweo||`M~D4FI7=%i7-m1;IkVI9AUN$j0-z*jK@$K-kBN-&81s!>{X+h!HV;_d zE$qhn`g(JT7G!GXXbt$tPK0#C?=7)YrPCe~hPh&RKRGFbvr)r#LY_TZTmv`jOv)Jd zHtyN!$L}GFbjWR|(W~keH?@Dg7_Q0gR1|*Ref&6G>sW(F+N5O{s~#KI3p%lWS7>`D=fp}SJqs3)ZAtUdO9l~ayzxbuZwku0*Uq2lMp z?Ge$odnEqr^@${{Qln!}q^?feJD`HD4)uxXaV0PZHNi%;KI;{La6 z3N1uTBGG;&NjF`~)BUwo_2$}cn!=MUbEcS)NQ0c8O`@0=V5 zbucM~#$Udut^B4L>Ab)xZ%(ZDT~BE>zW$xK)?PTXg7*%ZNlilvuADk%K+ifbp~HJT zp+s8(=n>-su#En-L*17gN}atcbsy0dYD=#uYzV2x>-|2yhKEbi#_b4yV>Ttgr>C## z=@ZT1@g}+5z3lD%NG)jVU?|lLHach+7*>`D)h(#tip>^Lv%`cNNjJB#lPGYNJve$z6tb)q%>9`a?HMpL@ghsCMS`*)wsy2=7>A$?6w1*1gwBUHC0GViKe7KooxQ z%;-k^Hk~I8MVB8y91n4!Qs$9`1Y>%acHYMw`AK$j44tA@-P`KojSnZ35>zNyhl$T7iZ0io6M+r&O_MZ4f5B0Y4~r!E<_jn4(3wt{7|NNn8i?d6XDdgau}#bQpB*>6WM&| zy#JBd0j+#N+*pz2FFFAz6L>qZml{QS-b{jRi09ENR?|`J`2$lTw7={Ld)EK0=jv7m z3#Wuvl~VuIDa(YED|afzSY=awK*8HPcQPJv(y-Cl_V!V98OdTJ^q240c$Euf)k~xl zl@nBnxk6*&%1cu6+!8}fTJDp%QBV-uJPwS7pve$Hr1wIWaQR~$@jw@p?&EcdHk!c% zx&A|2_WzLYRMji?XwJ`V|5>dR5z_6S{TiQX-T81-vBd73O>M9hPl%vC6y*i@1wdo6qFxP(5jCO9~&``P>abN@Gd7pAu47bl`$Kjppm0WrHf>43U0(MeVQqGr=Eul2(W~5&yabs4^DQP1x1E7>~YZ}g0o&L zF;qYK%Z0uKvgH~NF`KgUKit~|qM;dlyD+siVv zLsMnf=VUSE%0xAC zwfWyA2y6ED6miu&y>aAV_)eoBC%f#sJWC6YRuf2G_aPM< z(ZWon-(eFEg8Kx`aWG5^LJv#E6CN4)?(U9`o}N5VjZk;GxvkB^-F@ZGYm+YRp%}>38K@od_51Xf)Rs9nwzcSduG2i*e`z4m<=)3*)jQE zraLbbO48e2;*S0yvaMa%hm6!a>3-9FWJ4D*<&Ir2O_gjt)T0KV*Wg}W#izLM)tluI z5v)*-*7iW(RDH79rEuUnO`#Nif*{c6p=ogN&y&xB)MGO2P4T zZtF0gC6MdJX1|CeBu&W{)YDfX%W(aS6cv57cU4K1d-mm=S~qh4C_dS}UwUh)6Y#s5 zBns$blW6c5&b$9jtSjQ{#>+)CG0qi=$D#$_1?>~Fo4WaVMSVW~P}B=A(%FmcdIG9- z9&h{|t*q10QB$!c3|px4c(Ll2S^BtcSQ?2g!DpUS}2`j)vUKHRHBA|D#A@;^`R>Ny!$$Uu9ux zguFwKg~azdG4aQj2&GhSA{x{U{viKOmWH;IdJ8$+GotG%wF%^S$rP~a3RqG*iy93G z;rx&}eeN$zlr#!1Bmk##RXW^naj*ol1hd4mWMBkgp!VP(WVs15pu2j`Jr~~d`j%TK zqlTW7qF;A3Rz!q(c!Gj|Zne^iGIE!Ry*mb!w#$qEiNqB0(Yu3Yt)xOfM%w9}^J%nN zs@~f5n%EXRR^@G-^a$@d?e`oWGmxUSUNv#yim`T&`yV>kYZw2Pf2IFXyPg0 z?&sNEyLPQr3-5YM^_8Qotx{(1ug=ePK<<%sR4w`IKos7f5M25sE*4jz42}dp&>3q2 zE{fLdzGp4|F{MQO_A=}3Bv5(n%i~y6TivN8)J;%{hy_G61_-qkorEm2VPY)Wt2n*? z&g=bmMO84U)?nWWnT^?K+TuRx%^`5&+xg)|%Dw+8tmo(ZBbjA0iGHY30&0y9{2S1- zC_&oJ>|$A}PJiQxFMo^K=tih6XH(nrZ-|nkmZhX;$7b5)v|EcD`TUdRbVt`gJr7QA zbH-Kk2G*e7yM|JwNg++{WiV?-$F`-l8AZlT`0Bx6d#j(_`IS*fUugxb=Rj4Qk3zW z&{^kc_l@+zc(8_rnyFU3M8VP>LHuiTw8fHn$DUeiBkBdpL1+#%IRSuZ?tYn%`gL68p zs`njKoA|~}VFo4BE7QD>JZuM}dEP>Zj2$e!3=!%DZY6Gco4`Doa8?$nXrqTlueBPz z@jrjQw9*KBxh2@Sxx8;d;9_OX>vND5I}bL%DM)FEoD4`Sv$I^x*Un&sP~@We*nXf# zUi?zdgUGmv>g6%PLGspM;rc^G=pV`iwm-jB}G)s94HewEc03Yd>=@?w51NS9!8{wppioUEPcN3{VK=o zcWhipBT#>r^a(?+7L=eeb_AacbqxxS&X#IZb5z}{Kd8k3$}=!V8vYvFXm!wSkNP)1 zzb^PJah5tq`clmTOhp%rb#&p7kQm$}#di(=dGtq}m$Zw~=(}$cVuLO3W$5A2YZ&Zq^zxz-rv)Hsj zp@jl7c;oT*-~0cdu>rqVUdDMRthAD|U9u-RC4Opo+}OX15BFs#iE)KQ`37R2o{^M! zHcRZ1Ua&p9!k*J1^XRyoJ=MFm1a9=ajPZ8p>G>=yeJdytt`!;6_F%bD;xPcxh!65HyrYcEObtX9L~51k37G} zW1`>Bh{#vzK2$|Zj)V_N?H^IlZ;OU->FqoSl<}I6Mc32|a*aCkZ*S)d7|Yb1W78Wq4| zIeN?5U0x?)RME=jIw9NOY}{K-Zl z11_np7f;s>myEs^Gz_~++14lR{0LKL73Jv4?3wO6ldK%fTb&T9b1|^%CIN;zu5j)F zaPA4Mc9vwBT@bqunq430j3uO93*R_8cmmdO)(R`h)-L`_*Mo1gI$4}HPfSQdEJ_R{ zx(a`j=?;>vQ!z`GVXb-NnkCWIf|L=M^*oRd9p^+w>_MnHs>V4Ht2gh*5SVR%rx^Y( z0+g?ydO2N%OXXKDn2R#wGT#qzIg}=u8dGP}1aXq4JXvxO)MIvb*5mGI+a8`rGu3VP zA|7e)SWQlTN3B6RLl>`PJckm-0VW0(n3(%V*Qdm4Lmc!`0u^%D^V_#QdHosqn>(nx z#MNuKuAVhbj_yFCX7`vZtx^HCR0Y{$-C8R6EA$*vCfPutXJ|i^0@1xcZWNOghR7GY zmqae&ZaXu%>GFQSKvZ0UZs#GQu6~FguNp}#J6gRuG!rr!1mhd6?s~QA>gv8RX__>s zc?3{npfHAFLpr~a=siBgw=Y{=6Per|SWKo{ySqg3!^8mj62)8ygYxC=hZcG$xKsk@ z3}0w;+$NAbxNng&bN)vjT~|B=1hu&VrL99b;$Ckl-ClTji0#8(Z~HvPFEd=c4??P) zmc>6y);4vlqhm;THp(}43Qdt&kh*acdg-cZUWJ;&!n9|F!<<{Vuo% z@})mS@zkt!!9@NwF9>?)FQ3G^V%n;Q5FKOXku&J|7QZ_+gAXi>6sDdE+21$YjVR=Z zT9WQJ*yeEUJ81=B*#EQH689{0)*551o#Z&^pR4IpKN?^GxKJj@1D3Q_ZGmLfc-;YtXwcKvLaOB&UmG8c3rHdm=~FqT;V`j3tWPUIkeB~# zf1!o~-0LmdQ;M6=;Kn%Y9Op;$OlNUJfdwXrG);HtTW|V}MeJ}jcPzSGBtNTP=*x}O ze3TI7%HXk~6OyGMYlu~07fJr}ieJ9S5b*C&Wt3cwQI`k+a3~kT`^5n`uw+B6V9+V) zQhV&JnamRTpX%P}j4k+lVBt1@jHH|;PgJAQTcu4kf2M-RhHUk&iTR5%eV!=}kY6@X4W^^V_skff#P;6y)XYFE=`H zx!r#+|GNSwWC+9yfXm}~bbL$!6sHe21{Iu7;T};R@U@vXzEyExIR3NH0Q}#C{`(LA z`g%*c zxD5#P2Lmq(8f@Cj_mu^efw2mN$%Qce>9Z-2+ixwBBa4EDR#;Rd0P-~dX(1A2$`$`d zF9d;V@Gx}k9#jV+YU;f${qO(5Mp;>|Hjb~YsPttcqcQ1I*;1qStk&6K{vsS2wtY&Z zW$;fy{865V3xYYtV4QlI4T^r`!3*ju`Ip@Zo~84IRq3j&H&&>|56Nowx%LhQ(f`R`E!giF35na9Y*XA@kFB|O)QeaB135cLTIJ7pd>KyF9#v8l&7&^+@2LizZ2v3X8wNZeXB!&J&IM@Sh<6>b*B)<^^1{AFVi`hKSVgx73qBDo zi5xodWUPpPkPr+i4O~@UO$=J8S~4l8;VaB|I|tJ);|Zol%TO~TT8y6GIAoWxA)PW8 zA!$W?NK^&dWfVVP(KaFl{F<0NqnVtb?#wQX5p7PCt(VU7q*FAYo{(16twX}doMs1u1@^JYG) zaUvmGQ$j-tIEpgafuxl%RtOK&ZU;-zK#_Q4`lbN!Z&~~ARk4*i^a}&sraT!TS1~aW zrOiX>z0#tXZ&Sl&ugD0Pzd5e?E=#W%rzBN!1rOP$s&BZr3bkAP0*zLXrX~k7p3f>U zpb^4bMnKQHbCIuSsXvaX+Lv3WaE7Kti->?q-};35SR{W&$Zy<6G>}w^l-w_VFD0Ra zgaRqoB)M%tgBZD$`+b4IqSUdj9tueyP){(B(O{9dx&>LU=u}YHvMb=O4vr9n!vD`! z89260Uz(T>s$?QZxyaO3CB$?&3O%6XM2k%64LQ*&5|?D&95=D~cqrDj2i}k^t9|wD zMhdl{Pz{-nBo{$ReeM&D$P5oXC-|9-&j?^# zNy+9iClRg65B)+#;#Ys3B1uCa5(Ac2tS1npHpD?O>RLFK$uHQ^SmUaIQa`A%;-b)kXGxf5jbWdP}kTN3({Rrvt|5O~nE+sNo2oE{HU(_NA&t$C#iM zd=U&94VP3?q5k(`_+kr3teh#*ye-#*agUJWpQ-9no}fDhsd9&A;IgssT_V{F3Penl zAi6IP&l^C}(b}hUjW1J+3lh=o*wo?PI&czs{5N>#eSX4+VwWEEJcRsvdR$KW8$>F9 zL5aEQH$d)TDRLZX9Vv*0ObkQIaoCSx`+`)^D6ZfcgT_?~hFR@fJA7Ga36JvPcSKpN zAQ=*Oyzdw7boXARyy}md@0O(kGrWZys!&{C|Bn>PmB&@Nh8GsQjH?A8RMJP*7eIfOZWh1G>Bsf0FkgaIg>}zEnd}CfY)n-0{&vZz|fE2YP|8zDNh4J zzr7E8V_P(i$!%U?zdA8GX6xF&etg3bHbWaxu?}I^u## zU5GLaGlh{^RNM%B*}86?Un2Xp_nz9^_5U8U>&bK)m#m8) zpgUdy@ibAh`wWs&2d_Il156mnc`ZY(`iNIXe53$LQC58;*QoCHkY>Z@jgBrqHBHjk z-I_tFd7p$tTySk|k0Hf3WrmJZR4OF5zTS@lMW#iPQ?=sGt~MaYR6;@=A#Q|wU5ad= z5<~NA_)ICW1sW$qti|6sp>DL);r=oJjO8# zhXOuw#ox<#wA;4{J7zuJ+M8Ng7Onww2y)p0Du1@~Xo&UY_yJ%Q)4RVQS;tAySbrOu z{b?Ol(;KBRBsxSq?@HFtg-(;;IS3X6Q%a%GlWY^xUk%V#$VH)dLu;(%Ge1+6us+wk zI)!Se^Qf{@ScO37_;T^d;j&MCU*c^g5_PF0!uqWa{10^-?f=OBzdLLg6E7oUQ~UQY zBKCMDswkB{qNakg55|LnK$O$K+)q1YK8!lX46&sex3FjN*S{BEb1ow668s3o-OB(J zO9{`!3mRybz*9VgkOHpT?*j6gLPG3CN6lJ1APmNz=4u2lULzwlu~q4^ASYCD0=GR2 z_Wc62K^Lv9&a(|SN6DlCQke?H&|eggW{&s{q?E1VzEME|_m(zi&_?e_R)kBO%Mdo9 zgwm<~L*fEL@7YkbVn{@!7VFI;Mzw-ei<yc&EL<spvqCTIygzTJfwSbfJNH~L)i3Q9%}i9U#y@oIYr!Xb(2WE zx%Xh@M)?PERZ3D*a1j}68Wz0?72oz5Gp9_W&!OA<^a^K@GY)NiAy`Yzb+F3M41i)_ zsVHyei>_|?iSGcz_-gmtZzeT5whik%W#Z|LA^_KVcF-Q(`8X*!j9MxG(og!6QY3Up zG>LBhmt16)Sb&4G+`xGxKq)RnyqG?xrsO+4TJnRwj%uBEVqa~_iz60!V`2Bof?tSJ z(Ow3J=B&c@+QTu|w=lx3%W?@@9JB0Ua>^7clGa-CQ zZJY`hXz0l6cjR%bHhUSPg%$0@X#`FDtGa#<>7%&hG*xrA(&ro6mCt^7Zw^slM5N*fOU)AO4MqFRfeoHp}tl?+9j71=nPmoll#94A(CmOvQeFHeezh&6&!48@MJW%)`H9bN@ZHe|>(X{PvkY5#)7q zEh^6+DwlzmvEfrk=Tt0Fq}wf9gH}yNziwH)JAK~a1mCk{IhNI`y``Z5EJpB4sCvMO zZPGP)seG3ZuY8gFD(E-w08GIy2c~a&9-Vk_r(MHI)n4Grh|w-;w*{rI)R7RU_`CXr(3*@cM5c*MCp>7lhJpq6M|;i1hrP z3t^U|@vWF{{@N~?P^EqjyVX9;iAlFOw5pKhdawZ*%EuH9XjQI~T}%3Yh$=qXGB}qZD2u(jKdQKAM%YWX4tiIv&-JC-O641% zUGle1GN%o?hAF8OP#gOEmw7nYvgRv~6rY2W)`h3}#A^oius*j^6{4>SLsC9xYeI2DTU?C=W6-0MJjg19CY*QN|n|{NN?8guT zjh*5|)T<`}s$Qw2oW?Vjgl)jBHKLMe@_F_G)`tvg`sVg5<+$;xN}~z;u{ceK7vv%# zJDPMFi5Pd~-wjMgzW?H!{h!(W@^L#9;BgNRbq`+|n+7!NkpX6()Z=aEMMF=#hu`&C>3Gryi>h`+5{eS)1v`ZP5K1^XE*j%2h5Ln4 zcT#jdBO>-n(>a8xIBfz%+2pR@#p+>W`1oArgnufGy!71^y9q%ykr75h5?-P@gDaSl zhfMfs>U+VReIDKT`Ji(2F|Bp9@ts_&{*2!&C!vGjH-;F#Wv$E3Qtd^R9_L0P4w+%Q z&7Ixe>~Z7XEO*BvY5mBXl|`T!EoH6M=ht)KX)UbUCoWC1hhn~Xzer^X#Znh@I4xy7 z!_dyU`Q}R`e@TygFp1Fi5#q3^6-%Y+{bP<@#ty)3mC604y6NLpSKd`t?P6Hw;L~N$ zh&!X{zU@9QQ~cCIL)T~}&*8GOk+-YOsz2Dqi)gR*VRn-g{*=7L+^s?I@`z_79xP-? zS&9%>#*%Iwpc7M8DtJO=^IAyIdH?-7d(n`nJudIjNQ3RHJz(J*i{<^Km|lngLCxX7 zz(zxWl3leIg!YKs`wsm$L-QI;Qhs3~vFK7GpNl0s{ocXEoAmT_MvFWhGD-*~CEN`9 zX{Rl3Lg=gAS-b=tp;$i6q``?RNngiUs$$h|_y35z{TBFp;wV~SoK5g0dzw%)tFjLx zDpjo_-Xj4;)2{AgxzS6;PGsU+K0+{Zhe(aE-Z;Y_0;TfmVs8&JF6+SS20lgMuP494 z2o+tmekLVK7G2U~LFv&QgcN%T30hIpqH)5BmE`>ZsMTpy>C{+1!f_Xh=BTZz;O^Iv z@Ucq$s(0yTkm#T{hKR;%x#*2lobSvabFeu=ocw{7zT#BOZ(38c`znTsuEXA}z{IuW zWojP6@7u#s@Gx(DNz42BSh?0FqAvMuK{@UC{rWUoxNQFIcqLgHzT?^aVytBu(nh=P zJO|rdZ58{M>*B17&Z^7`9>=p>b0*0sA5J4n(h%l}*oZG_hP2EU6O~B1Qx9HB z&O&#_7_6=A>!HN0L5r54p>u!Z&OG_99cV>$*I-$Tbs)# z^h(F*%m)^4Mrd%qFjZy2R_T{9^Vx+`BsoNJa*yEc5H+)}%Y6-DhNj9Yj~%-ZXn;dX zRAKky;p&r;?8D)o#uf-Tg2v)*18R~V;$He{{D2}j93AfQ@6jitI?@x%RNNys#!wYn zy1HI>uHr~+@;aUFky|I^j~qCmreeL?*I$LjM!;+9)pg+S`BNi?_u+vDSa&{dr z!7QMd)UCz(i=C7>>D9(v&Hk;^3w0(ZJI6o%rmh{Y*SW`3e$hgc?z`w15+HUd33kad zx`j(;+sZuK3!KSj!U&D0A=k3#U1_kLh2UUs5Fp=4^QiUA)@~9 z=W0+?`{j6(jz_JG;cdbph|3onHmJC``02?tkUvL}a{JrA_SwHwckbN08K57?DJdyw zX=TL4&A|d0G~XUqH=T2FA3MI_%(0cQKNoQ9^O%STPkQfeut&?t+{x!F#6Dk|>`Y+m zSb6bCA*f?PPkMG5LSgZ|MY;`H>AyIfqEjzNyzpF;@>lk$7;Ubj+8-j3{ScmT-Psm7 z+~C5WIHjj-a{V$@ZcEl#s-#yOVM-mLBtc%4t2#T-XD*fq*a8bjur#E$tzSsWD;DX^C6}yUWIH(Qqa?R$EYx;}-Y+o0^iBT>WPR zEk4mD~>o`jTz9;46Ds4fvbuX^SwUVY{v6iU*WTxq$ux7GH zXE_6Lk7I&qLpO94&`%dL)jYKPN>k?9IXTn1REqNR!N9=CQJ?|e(Aoc`Z8mtmKuh=m zuyJrQfWUqky14lGs*idWNcTcH1G>3pwpz1o#y}%Vtf_h{&PT_| z2za7xQ{H=$wNyW7=^!zs2EL0)Q>4U2M5D*Oe(q(Sg|lW6Et2J2hq|hhjoBTkeuc^| zwuz2g`jUVY^*jWS02Fx$32JsBatC^hJv4kO*9^RuDK8*I9Bsr0lOpRgunL#I4d3B% zDw8|TcWM>EKucdDq2ed7Mu-8UZU|N@lW|uVU98?k41I!*KNLG{Hivg=SF%h>a7f^WJ9b;G_Ko31#1kva`;>Lb~Dp?WXsw&n{W4|8HL}em$)62v3GE z!)4LDbpf8Lg{58ExKYtXZ?nS(8?Ynw~A)2Y+-ciT60A<5R(8W*HU#WM=T0grE!ZAeB(%NaEg5Z?E6bXyy z=b}9g6{uixOZkmjjO(6-<5uc{kkI%f`=nwu%zk_Qo@`+A!R@0q=8l;tEljNYv7Wb+fn2p@w&aw||=py1B@_P&>lWNZU zm7AbfAWOlXkz;?w>)|2yWd8wY;*6Nbvt$WD57{YtU4@0C51w@_vX1SlHyZHL9+UY7 zid8-c9@?%ha<`1Cl+vnP)7ymz1AiI4-h{_eRqD$9VUP@UL}fOCSr#XPo+FPl07{cN zTMCVbawTR7lACdmO5+$=oJpySCt}+vB1A?EIH;IIn}?7x;ghW0^h(^^I<@SlL&lWQogRqX{05tX^qQekVgKMn=2;;LVbpp(kTgn&vUSA&$5jnprN7(2@8Qv zN0?%Q6Zn_<`qSDgL-|x9wgMZQTiH zN4GD770n41wam)4nqFb;wo(^S*BloX(t2D8Q-E~w#K}3keNGhJ@9zib*XuP(^`C@= zk3Lhhk*KO@YmW1(1iIO4jiMRhO;Rx9ONk0fo(9l0pfA)lKuyc(HT>MjwNBGnW2Y>i zBzpS@ts@~P;CGka8XYxlP}ktq_PicZ1La8%N_zEBzK*A?uZ{RP=d! zz||Mr2~Dpc^>5o*L|Qbsi@73Mg}K+Ec9qaXit0Fj;hD%o%9j`Zi7{{Wcw!*Z_@*5+ zd41g$iH%T#l!)!vx~Am=(+C!66~yhfnZaU#)#?ZHx#lGs&04X}{raL^U*AWQNat~n zCsOoqYRrO^>|;Hc_-@owYGa!HO~Du(Dxl;{#%K9@<9(Of>_W4loxfbku~=C9@MXL@ z1MeJe!9*C&Y^drd)!9M!c^7(O=-G~*kElV&uFKg;bBF2ZjM!3BL`}pBGL=I>W^MOP z+r9Y{r$KAvN!LLdP9jo077zZ|gfag0ho2qdW)eMha~EO5ic0Pk)GMW5T)NrU-;BF! z-91J-6aJuTXd@Lge*Vp41(uILu{0H21@M;!-jJous&`AY1=tmDcC`e)pJNfyP;_40 zFO$#LKiF6VZ@vAtd5;^e*#b`<+tlHzheO^S&iC6GE$iD3BEnu}N}s<<>9F7Swr4;} zonXZHl&arMpw5#VY=P<3+FiJAzrh(TkPw8pTbZA7#;d>7O&l{{(xSP1G&yMN1P6vl z&mMByt+HMc-0gPWl3oL84hNeu+q^!a7p8-_Tc3iPY#O;njXilgK6kOF$FnZnK<@dD zZ(ajpFhKKhx-Vg?O#5`CbcE%r6$V76hnTNQ0b6-SqDnCQq*S(>ucUei}#&zSsso-?|Sl&j|@3!8CSupF) zM4r4Wi&SxNb+@JUhHRn5jUdckCQ=)%bKBjt92r^X$fd+5XUU1LpS&#o?sqn(3vxG^ zil}MI@za##^IVs7_gqAik*tPDW!}Uh00$8v$lnkx`rZa=j_lc6Gqj5UYinH6iodE$mDpNhVG;=;?YLvT>4&_^ph1St&_Y z*#1=l)4b3#-evfNe*e{Ga(TGYbz{@>Ip>^Xl=}C~i@H&w)^)uC%yHebkpE(`p-OrX zW`67(Rm&$0Z`YZ=M3=e*?S9y2Ru;?DalGNqsgV%KD)BIWOytnNzZFAUp3fJHcMsvz z;7wnCh(c{$sT2GJQ1b0jrXp`mTRYf8)TKU26yMez98zAxTnxro3uX^RO zJEb7N5c)0gw>v2&ykGHbtBthKN~A!% z*XAv1H#M)n2(hu&ENE;*F%f}?3Xph{Rr8gN1gWDDsJH-$1`bz_pUQyM7s(v>=9zGc z7}zrxVi0J1EvTtMShN&`9g&U_$8a$4a9}V?3g0NWm0p0D!lrB6Zl*N6)avue5-U%2 zu5}w+ZD7f1t!r<^n0ica&gHYXZM&VyJ9~~@bhGF8nZ|g2VCJCnc9c&3W%ePN!@@Mo z>O0IQeC6{=B_^ZsSo`PT`0@iw6O{Ifv}`{UeR1uP6A9*4B_>pUN>kU5F)#mjg>{fP9OAOe-A zK7S7ctW=_OZX4`nG2#ZC?TlrE8e2scqmIggb*(4%Tc4u+Y0*zH=>1t{n;8)>R?6SE zJ+6ZF#?~RT^>)v*k^bL~@C%Ig7CqZbHQRdKHPLxJ7gL^n8ZW_7!)gcELvf2qYt=~Xu+b65xw`scuJhv;e~kf5u++sVtxMd z&@)-cd`}~{0B&x37>~mX<9xazQx;_y; zHdhDdEt1TwFrtTFMEW<}E}=fj-fR@;M?W4`ZC=Z0Kkm*D2#$*8G54b$JFM~E+}M0Z zZMv)`)}Kei<)_+)J?jq@P5L+wDJJ;6Usj-e z@ZR3a#eKY*WK|H)n{1#kzHYSu_o*F+er>!?W`1uYVWHNz^XbSHhIU32ZhyHMi>gH; z2WF{Ec=TqXySRIIoR-f?EvIeVTb~OW(F$^Qycn1S!AST&XVF!=8ZN1R&OPl?Eh1B0^pfBizz zRZ!r_ws=g2I|LItm_~*m?+bR$pm~&Z#?(=>s`^;Z6~M8;T(;9S?>k(DxgL%vr`#2l zcnS#4%5|a9cA}g7mHmt9IP-IjJ8EDl_dA(sg%JGfWd>AMS3~pPwan6x3mLA@qpdyF z!N!D+u&tHC^ifD@z>VGx$D?q4HlL?;VGtk}&+=*eg*HOc4a}Kde@_YA!@-a7w(w@~ z`-5VUIz4=4bQHlv8nBSs0V~ibhqL{&-lTQ@3fT=vTKxb!;MmA7)Hau7zfswBiKE@rk zS}EFfxwF&TjAZOs8UzF9@e$d}k%4w0bRMSn%9>NpJEzdf<;6rc)he72*!{Q=n&UeO zK$sQ60V2>>87x;6AsB14ei5)&XU?%9Q_KA8=Uz25Ry{H30*w5$vU8v1E6CME_H zS(Ehv`;z_K%`11q%4&8nOP>68ZSnYXAw7+0?Q!H z)#9%=BgI(0KS0+}uXp>9u1jHSluvMSYBAPLqMKdg_MTe{S5p{)4NHFLNoYIR!=nwk zZ2e4l9(FpHQnuXuIN%-whw$_G1hhRJ4-qs+EvY z(~VOE4o^9!5Ntu-_ZNBR?^Zjl2YWhk>Bs$D3!BWp-MI|ngt_e=7S96Gc;ZrqR;<#R z9%%SU``bqZd_3=(heI~w%}NNIsQxjQgz#@ioI5iyurSGZYiCsfRA<$3aC{L3cvKUP z7!J9MRNaVZEaw`Zf3M}(7I*}TB(88EHapGt&z*f2d2e3sqnBuKroTGyXmSs#=}}Sk zE4J)mLy)CaIy#NrN~pAGEXoS;+&Wo-jcSZQ{QCGCt}|8)C@Y>*a?rFj6%0||-g|88 zS!(&*tMbm0S63`$R5T!^Bc&|g2>Kd}{&iHU#E!aHG zp>WRQK$fcJjkWQOxmEORU?aH&q1#vd`cYF z_pIo`{-E_JJ#>tv)K}#<1;m>1^%?7dEqV{;;*Zv|L`jixY`J_L8Rn)+dUuefyJR%g zEvjyP9Y^!-o%8K}JD{f=kTewxkm~2kQt(+P@gUjU^x86+r`S;_yeCb$)#$M{gy<8h zVn0$^5$bbN%VWaCC$^u@4_VDQP&No_p7b5Ufa`N0IM0jWh+x;GI_qVCK9Lj-)hd=k zN*YGw-6R8>r`qd#1j0KPXIUK8~aR0Mee- zBL<4h1LH(P$F#kdZ{a(;y*37ZU3cAhUWeFlqtBPu8Nt0C22r^bVQ1rIFeN>;IDd-a zoKT8?_5u^$3jWJ@7U(ECp>Q-KLqj^) zSROtbo@Yxn<7uom>#g?-8a5epdi+{s_QG0Xa&~SFw(%;(-vsytm?>N3 z8h?1aY<-L>X=)y3ifvs)~6z;BtA8lhKM z+FgI)?8gPxdP#xv^q!6PTZhd#il^Ok!JQ1=#q*tby{T{$!FQ)7;<7iOf>O(qEDJqB zPp1xtc2baXc|wZhWPQD$U6JFy__3Sr-S$bBNAam97s&7(-8u=W0-QGbt)TK@o2Xmj zH>)@INp~Xk*+)sNG(h8LqVaLl#u;CzzRY3srX_9n;$`s6JhDbb_Wg-TpS@2PTVC2q zJE`xo8gUyDHaAxZfA7m7mh!Y(fl))gHs5;gh0GtkL2993SCF}BxjkErcyerI9Y3c3 z0iaT;3e;Eiez!Dq>KyKdB)zz(WJnu2gprS7M8v)(M*D;$7*e@ZDV+V9{rvk;DqD_Y z5JmA2qgQ^c%B}Pp?fUH5u>=&24GJ#OQqeS?C>^`@8 zejSXF7=OJ7jN;xT-sGm0^FAkCSg2lcGu?}=@V)erD$1J8n3L%~-qGkeI#0`V9uR4_ zWz)Y+lGzJ0#o6QZC?teMFLj+3#HI;o-MwWgqeA-#G&41I|6=-(00fR_@$#~=x(vk- zfJoxu;hWTixILe)nl`=L9FJ!}rSKpN{V6r{LvvtzES$udmofF~DYJtEVmk8NEwYT9 zqD)^dFv@@X>zCi(vss(FR;#fOe`Y=LCEgj$oHq@c5^9hI;=FaCR~TUuGu>whfHSg| z>(p&W?_bh#0|Knn*|Ij3Er(y7Tv4ntA0FF%ChoBeFO?g^h=o!cI$EVZvn{VO%2X<~ zx^|NK)1q$(KFi&sH@!W4R!^1%)Q#~lpAPEc-c2>`lV8tyPkV)}`Hx(s!E2Fp=C6gg z{7;|Vq*B%dNj+;F`~68Xs;#PEFuJE5{)DiKE@Si9^kdi7CT6+wNCiCFc z?;xjr5ZP>%__266-XpbO|07|2{A(Lq=v={j$DB1`W^X$V0+?G`;pIF3m>+BSC6&V; z_#3L>$iyZ3f6|ClD}7XQtv~ZpFK6MZ9-Z~6*f=%fsKhRtvqKO*in6lSia$B28IOeeU&_(;A&%}~ zo>p&Ebv7QgvvU;$BU1bp2~taGAe{sv|CLT-v6{&jixTm8IC~zUs%pO;zy^`Vf|y0u zV+eQv>@`J?Z)sZQnH6%d0(JnZ@_A*{jMZnG@$A@je~`D$C4}79gM#?w&j6p$3wrLE z`HF=FIuAXIrY{K$VNnl*GS5?;)!fy_uFYW+`o?SHll(zpLDkyb9YcV!=Zne1)hefO zpV$cl>zK#o{6gl<9O+%hxt({~V?!m|>D9pEWtWp3hdQIl@b!-%N9CqIY13^^#U^9c3N(khpq`oS_~wtQ}* z>Z{$u60eym=b>p~F*LoGY7DxG+C}i8VX{wjp-u9(kUvkEF2nonp+Vr0qM)@iQlYb8 zTmkFV)uKHR-Ecr`S5VCB2y+5Ns!GLK<#>9qzM_i=(Fem{@>Nu&^>99}NF>0nBB9UR z5*6`wtEPfK({ko!r}Dt`-1$?Hd-vjz631Msz1iUii1CH3)3jODtL$K8k3RW;crkeL^}?s(Qrv_8|^{bG$~RZ<=5M4!{z_Y_LYRjMXAA zm`BHNLkev>sQfXtnniH8!z>du0!qOrL~76N!@=OG5{jn3P%!T}6z%1e@5b!Ojym3t z(dx8a<-AP4T3opM$a9W9=9Qt_pu6b%VJJfVvni&4%p(&+Ls(3PzLGO>LUQt>lA_F1 z5T))+fyC?mX^|pj$4D;6XM&h>e}K#BIy;SGv(#~!gftGjZOdH9(%PLu1%yjjKqtsa zwvFoH62qkrNcU2C7`DH_QRY1lc(|MGVK5)Uzo&3m9uVdyx~u! zdsmy`>!c7M_n1I-Ly+`fd|Yl>S8x_~XKIRe*w*Y-{OQ*N3F{rz?1!wwlkD-4N{^g( zognG29L$w^-LUq`FvH!j=1S5ESjYtk5n&<9b}jh^i6l15PNG}SEPFz@{iqDk7EGp{ zp+6ry!TKnoWuvWw)Yo+HlcII3pUUHQ5uLiBJ zVthId?;^dU$Hi9Baf@a*KQe(8^yK8Y)K*H!^HN2KCZn#)g5OZc)P!1L;xj%Wp(y81HJ{(L*h ziy72%-nhzD?iCpH&w)Gn`G%93+#AMn%H$Mw3>iP};tW-|M*d9Elz8Re*N(jLbJnQ| zYYBN*{^sKo19m?vj;kst$;;voP?S!wFPZPCYAFGwxl~ltC<~Q~56fj(P2?2im3DWy zp~PL~vRm7Ub;b(nHGh2ne_VZIcxB7hbvj1Jwr$(CZQHgxHaoU$r;`pkw(X8>eY?-O z=R5bl^=Iv8W9^!=YF5>n7y}$ApfaG3MRK!o_i=9U;BCBy#QPLx&#TMcS$_Q0?4}yv ztHW^l>D)OPIkR$8h|TAvGrx4aEaf2@Acxgyk$iO@GXkjC<{=v=S-F|>PAzi9dnK5X zFD*`veDrnWmR}7p?^&UqWK;C?dpWw~BgK=6{A%&t*WpQI=(uskEcQ(6;m}v{XATPd z{TU)XpE}s!{W;;A|LsedAE!g?Wy#IkUM@ew+x5iefe3kwx3bJpC1!SxZbz#|`pA*( z$JsR>{M)|sapwl}&?BiX?EjTflT*!Rc$&sW;gEPo>k{`TXf1dyB?l|N_4 zs2>pzs4eP31gY?zc*ZzHh}IAiss0++IB#B=TNTvQF51>yJ5Vsns7Fo(tB60f3~RFP_s-Badr<*VI87pV(068ETA-WQ_}T{2$ny}nPhUvl#>Z7^{>OfIG_ zMWjR6L1~jlHUqrsgKSJ6K2jd>=cKl+0v6;O(5DFRuEWmmxkNIS2d?@nW#{uvu(=5Y zdR=CWDZF0-A4v}`d17L7>2aSW%QL;>dWs)xX6NZ!=tglLp70@Uy)0x#h2ao;`0o_q zo2Qj|?Y!EK&iLU9C*bwxb__iu=zSc{gfasN^?SKALo2p}fCJ2AR8<#7lE^zNtfJRC09e5KA;GGsC6=GntkImLY5mph8GDn-z5%FR=g9n4{HCg{s= zK_bnk3zfdrioSCCUMIg2ZbjMX*fDI^zJPF9jyDcSi?`yBEf7;N2#ukoO6BB~*9eQZ zK<7Q@Cd?hbHaOchOpCOfu2E~+zKWqN9+cXTjaS#Ccrg-Q2fw(g7%OZ-0R7-^%UDd+ zmhTGoT7Q(esbFtt_4AM)4SVF^547VyN)zYrd=_@O+YpSnEWqPc@alM8zMYawNIv_C z|KWBX83L7w;N|AjYHmAu`TPpeDqV{*u*L8Qb$9L!N!!u+S#X#P& zS@3am@}Doi%!O7qvs<4o@Gp?ojRs+JpFzF8U;bWzDXGyT;D`7#mjjT}h{Es9T$7jS zqsC@+9rG!buzwu|QDneD!A8l;$X%q*<|{8fG;5<9N+Y(wQI_D|F4dG&C)Hh(-;_dx zeN*iB)>w||PlD${7AYyrlpp+L8UpcN;iZFSv1QI7}@wO5BC$5SF}nIfzGH+S4O3f*#b zM0P2M3wzZP6`QCrs7xD~AnLVBMFbH~erTUm?=J#Ld28Wp-sBK*u62%x*hp9J<4^8k z%UxGPBB9mY{3nFk_L(4iz-e2U{3AGJ3NW|qND?cgl$!BMO8^>|r4rIAypq_)$e)zy zoIeYuWMCM1OQ%(up7_&SUMB{YRng-{drb* zeiW_b;!hfz-!WiP=q#X_S)O&~o~8fs>kH5ieTu>MOr)8X zK4?X71d|*zW@G);j<;s+YUA-&+V?B^PsEEXs@pf)lY+fdz6=`K&+&$!SF|^;k{8ve zrhwR9KjFhNyy`-3a*~5G<%JlWYs##QpEUAo=YoWmgibp5R@o= zlkj&KzFT9t=VO$uc1cC$m-rel1+G;Q^tAkb29EN6wK1b|CWT5Gz#`mUgj8esd2-CI zn%KD*rtdC~`;%Q=s?J=?IloN=LrHyy?V|wJ0`>ra^k%ftT^P+f@*;B2&{=3vKq6fWm$zUxFUPuGNq4yP;+-+|#JqK zNsHu!>W46m^?>ZnpnLxMJ-R7%4^>Y-RwFlm*TFI8FL}oTkx^EW740Wj1>zh;LfHtr zas>I6W@DmbQeVDA5}0mW$cxpqWthgi-NNFciFiK-Wp8R!9Vr9SY^c84EVcixlwRQs zRh1}YR8h4wLPjoV62e~76h7!pMMp=@NIq52F|jzW1c7wK8NS4MwNm>WPAlw#nX1h$ z-nlasHC^~dMGOZyXY~Y0Gp44ZlEvX@1n~8!SLUp>*kZHUXh=vvx^M!`L%e}~+>Ft0 zd7V~UT3R{*_`;dPN{-z(J%>B-Lr$o-y& zG+nN-D#{wSaD7hK2oDCSNG%xuj!y?#)$l#ewHkgQr*e7z)l#TFz*GK1j<>Tl;;RUbsA3t1`6nME3{{<~mDLdfspwZ!a`+2G zd2vVHZ!S?YSG~gGpYKObF<0CeD0BJlOQ1a@-y*3Y-0>+<{YXH(<1jGFLBH?=vDivU zOSjr>oK$m_V}xNJ7PPWWUsNSgQ`e!v@G~BeU@+V7Pdz$HAr9@=T^kL~ z9U%r!No$;`E;x}lEbrpTy)*+WgoBy$N`V2m%G(>vCa{*4f>Ky}xM;s~co*x*WwmIXQv2ZCP#}hWXM{rDEg07JAlE=W04>mrVv^EGc>^q|GAoFG4Jx8j!l; z=*ivuaMDhAs#I&+yaZ7@%^0w4(9l~5SJ%`!2=%4zPRi_*yc~ttQr~`pwm{sjb8t;R zTRs62JEs@kXF)~Vuly}38Kp#x^)e-^-z+6(NlKib5H-{otg7L$wINxN&n`Nx5PnqV)9WAe7Wo%t>@MHTS~;qTnpggD=F!u!nwYWg6M#y^-qqLCZYNA*&%Xp%?Th%Di+shWY)PKza&lvqXNP$P)Dl+ zm;UgO0a^y@Zg$>#Fp z0l`3N{@FzQ@Q3thcPonyy|3t-vu->WxhU2L9|63h?hg{@{stm$O6Uh1BdfNKv{m~P zrIHW^3WF~|(@s!v__Nh(2W%ilAbEe(A~fe>Wp$EDs|{e}o$dB^e@s}a)t~Z*!{L~2 z?P92ojj^Ay4-&4pN$k4iETu<-PLi&9+s@Bo1W5|dAKLe-cw67(Jz6JGRgF*bBWcu$ z-QKWZ_9X=mP8Lxi^ev$ms3p@_^Q>aK#S=R9k=LT@Kkg178XKtnT-1 z%iGx?sX`To=)|Fv!D3cFdz?wgR`{&bM91I$b$4PmqkdP40-q}{~XJH&)0mTV`4)%@@!dGr+ z1gTpQ8BoL09250b3KI)g4*d}GnL`yEsY-!TlsIs;ZStL~?QSjI{Uhj!KhJn;6KW?= ziD3B9e$D4s;TtryiWOs2ViyxOzPb?-O&Gyvvtv7XM%mO|9O_m7Tpc@tDkKMxVK6)7v&8T0e4B8`NEKtdr8I5mrL%u|9c&dT?OV{tn* zlqUR(>-RmW2qtMdcPYn5QwzOGP4ZD2%6gn$q-1SHIa(Zsw*ZLz*)##yfAtAyy5BGl z3Jd8Gi=hn>6}jD6=FkuohdmaHt*!?n{Jv(C!j@)31WVQSV7Mj;hRMkMUEZmbY$Q+S z0Vtu{Q-Jf@(BUu4nd!vutk!BqM!Ntu1;3{qh!18C4vlKHwB+RZc}S&v0LIX|>yoZ? z8r=qfF$KW-YCe@CJJ+;cj=v}(9!aI9(>Hkzq0H492L)qBA*ZgF>`L?QRLlVj1E~O0 zi@dXVU4ImJM5NMSzP7X3%`I-V&@r0GJPfBpfhr=)(V%PHmzhH1Mm5HxJzs81!FEEQ z%jfjw)84hKP>rmW&Fh7kKT5pzfc1J84x@ZJdcz!tSB?TNE*kd3;BO^Z>;ybjsS6B5z4Qv${<4a#ww8~HT{PRaNvF0y7V2r*11v`S_i*|$0HPCLK)}y7 zyI-gCg#o1P3kwTSP*CT99f`w%;B!Pgo!9#TAgph^LG#Hfd9B2ivV+5tTBgS80Lsj|zKc=+NS6#;eVW{P@BXSU6(QLHRV;!@ zu@yeXQn9d}p;-=|;{oPti}|wI4Ba@(n#;kh6f}Fk!{2ZR7Ciw^CnpBo7SWlWsM(f| zBRaOjH9ZKIFu|w!rx_--+g`^fl`}MLp)Oh=i@+lFe`_HIBt?odqr^AKKvBlx zawk}>xHOl#tce>11#_#|It-zBuooyPi;HP{zHiSw$_h*(nX1B8DJ|BvNMba8AdojE zEH102X+RNl2wF*IzICNwKJF+b415W-Vm&cpT7i-n~Ww&$gR(n&; zioAhj3Y)zrAY(1)62q#$d&8nH;NyCq&}bB`EBTkL zsyh_egFKVEvq^K^tGG1A-QPc?g~=t=NQXO__jVwc)7Mi|{OJTZa;TLBH}zSC?%Bj! zE!5jrK2*uoqT?7SHfdEi+~(k7Wb=5)IK{{fPm#ikp%f|J1}Yj4X$?n6V)C#JntB?o zJ;vHjE&RR{V}x%Ov&{@`Sev%)1- zKT2!5u0kq&G=Y?D3^<_+u|O)77{rK~m=ah88=H0{F@lW*Zv{`rz?pt%q}gDV69hal zLbcVLRKo~F|AF;lp+kx8H({Pmgd4e-4H zG*M>+easlKlKt0##X*Vyf>?r}gsVz&t*M$xe)r>Gs>78Z@ymyA##=Q-uba<4djWyER<{+%baVUrSXfs1-0Z6#!Ezv;+{!0smD41Z2^1 zr5rUnDitFJBKt?597+Iv8Z`&|^7t-Ps1l3Ee1(Ink;dhSMaC=Aj81;L#3Predy)r- z$;6{>{^q9QCpaR_+Aj7bDETX`?6qdBD2@_^Y>dHlV|srGvXs~yOBC__s%4*Iwk$lz zz@`Om<=l1L<<~+p40hLKBSNw2)V0NynDV*fE-q{f#`qFdh4qlNK$ZtNf}EcY%J_fw z+8+yKJVaf9{2wy1Z)kzwe@&pgSPVb~;NpEKk6apSSw}-5#wi&Qut8fQN!M$d zkc9Ue<(2ghUJ?^mjBcRsM-*fx#{PzBj;DT zkgU$%-q_hXk$F2T-N?`V<5I@g_PWZhk3mnn=)1`5ctzl;p6u>V-GX}d(oCo4!J`b_ z*Wmd-gM5_=C>R9vb$omra7M9a!TM%c2if!$@CgvmCT~+@9gViCYD!8$`; zpZCSP(De~pca}4iMV@jiakb@we zBeFfS(o|_@ssv{{eem{Q5`N#`-#Eu$;m8E`@g2A724a=k?CvAn!kLlR;$n;jsctV z53&_VO_{Hb4uMB3Qlm=A%N~R(gy~DpVLiFWnQ+9T3ZA0f zNdE4nOg>DkTKb` z4sv~iMRY&gw*2ZWfhz^!{+E3+kBp1}d`)0rV1WIc731qRG|Zpj0kSv55X)BpND7cw zL{wBT_|Kbk{!H;W!8Urd6G-qKKz27=05Y|9=cAYV(i8^)`HE|+E3sS=(!AdDCO_*T4KWJeDQ51+4|H4q@ z=`lt~Wi21wHYFb0p{9Fq%uJjxk2L^JgMWyM!x4$QlY z?Dp-q9aVNSIDiY@fNJ;V@A2U-(uIuP2r_1eSzLhxhoC*`gj?3iV4^eFyoAQV;i3GkS+h3wAS1$a z(~UGwwyKg+gHp&=LQ-Df0Y+p#BkemIBzN)^H=$(F6Tr(Vp#m+|$AE&i2>Dd|rr1wN zqlI2%K}ePuqKz?!Qmp`84kbhb4=N%Ce)XwFw^`H38~?myfAmxZOtdEElxh}r#>Jz@ z(_v{|;;LIoRdggKgGRJfzP2A1nK}v5<+JQ%9YRf;q|PJYR`@aWsS; zPt;X&bDLagd{? zh)^YzZ_Ll>dpK)V5QvO@JXVr#Av!(Z`;XPU9`{kuhzEmo;^7R;5nN4alMlc{v0k8h zDQ$s4dvjR*lJhEsVMKt>D@kb?MPmF8Znxq%Xd zIGvpe7^rqor<*STzJ6t8rNz-!=>Qa!S}IY35(8Q}s7NZ2_j<<%@}~ix$cxl>f4(P& zkIJT>{!*n1i65yRsnK4iMqYZ%lmYa@_x7i=wE4whOEzdBG>Yu8mo@XMnuF%xvR!IV zu+&=K+leEK`0kclL%@W!5y)QOg(?8RlCba(*z6n<@z$g<9c;;;8Sl3xKD$Mz5ms;F z^pJm+7ihVR>&2jtAZxmt;o3EqmI);)mDb&g( z-9?t0(qy_Q^GRN(@ndUFH8vE($v>m{0!5Zom%qOGs=Fky*^X)9w`H*Hx=u5$XE(_h zlM3rRHKE%qO?zexs`RXdsVc1QH#5TI8zY7Qu(6Kl{{wm(K=xC$NnqDXcfo8V#qf6^ z2*h{>YoqV03A-icSFvItg%+e@1(D){7_p>%$*X|DX`eij38XVrCmNW_8w%f-UorTbvzk z^7RJfB_?48oCwW1Ub0=1^i@Vnk+MeLnf#wG*5pb2o@BXv@A1QMqY%&$P0$mkrQ^$H zj;3_ywKX53zAmj=(J8ME=mCb?Wmm@!8Kb)8BiIMi;^MuX6}GvigeX3~8W$`PmH(?a zr}0ls{Q#anNW%ZN05Qp*QMFwfgtAgn8Jy0C0M^lS9DUCI1~H-Vl?t0`5olu}#dIW4 zC5WV|!d7%t}ANJblq! zlAbP6;uyGOyYK?AgRbWeW8OYiBhx^D7sXsyRY+fa=r_plHO1O#wCn9p;fg9rTz{J= zy@x9{!oe!iVgQ!_4g#*~%H*Vm(N?Bp(UQn37>UtUdNf>4K3TO8fx$Z$=CYFd(x9av z2h+*5Q0VYn$+skV5rv5>nMwQz8_DpM>3U=WxNwJt*yG3-F* zGZawtSmA^+T9bT@;Sh`!bp~Z*8O9pqG8hkw5`X4+v=;VUS;6Z)AC3ST? zPc`O+tL+&e-@1RWF4W<$RB6IwqrACQ1zX^LIBF_wfoZ6@f&y910F}^OTT+MlEF6-} zMJR2s>Wmz}^xKFn0#>-+{Fw!s>15c@u;P6C&?`fz)2RLSpWmorUJ^s}0Htvxc@@pt%0d1Vhzo&5$o zD@8WEM7O6$I>jjwiT~Wx@DqY@S|(l&+hz%_kfveC7UUeE)O3bTH;o=vkqEbSv*7;N^kSJ%j#CU-2nu0Q+D`u|cs=_>a;6kzzXXW)|D!7izKm zJv&U(@_MKJm~J5obaH6z&OT$}=f+7~POn&b@{bon+u}A=^N$UJ3SnJ$Vf@YvBOER+ zSq1UJxN2S%tJCDD)!ST%tyT9Ljo}lg#?Ng3PwMYRSGMk7)z`?J&Q43WGwdC$?kZZqFHfgnl%@SIo4#W=<7F7SKrJ=+wQZh__}w zh*n2mAlRIN$2++VegQDC3-xS7eWxS%-9~lQ5nLVTt*$E+9=~2bP?}`wL?K zzr=$LDy#YEAH6!Ac*pIp}1PkGvit{^%x ztmHWz)VP0G@E1uZlDo{t(3Euzkao$J=bL~?j;c=DcT-L5b`7U*>A>Wl}qg_Z<{||gGOpD3}bdx z+fml{IPFWQt_B7coA7$RB@bgRP>U!A*SWcC)$66->_D&;>%JNsHrA@l7`EtmyIGs!^EXwW{ zmP`~>+Qdc(RLf?_=1C^DSwfK36)~aEHuRx()LI@P#i4eTd}sw}5R)4RP@1&Tv?K$w zOKNmD7wGCwnX*Fwunds@sY8c`yn25%hSYfn+hLJe>Lh1ivsj=IXx!sfnhUa8NO z#VuY`haKd6c&`egqM>rb>O?G5;X5`aKD!kxbhE7|Ogq7-dsI?XR?Aoepkm*w4qAK) z-DyL8akyiUW_hTDusoUBbv}Pdf)D(0b^LcTt4Vws?NZ?OyxHd}AxKcyP{b+~3rEY+ zQUstu-H?AfyaVr_W)Y|8n?v0Ju>><_sS6T9!w-rlWwMn7_(MrE^$`=5=wTIHtbV>0 zY?aqZE|F0t)JiX*6~m=&8O{ghTS<~fJ7?k`qfkXuXB|duuyHsd4`RX++!M8V>O>Xc z8MCV>W>$lKo9E?{DBbTnajDwljZ$QepcvIi@qo9_31^3=cQ>3NGs) zqEg9LPiS=sZJ|w8I_RcfG)w)Ryn#Md6%z#-;0Kfu8iuPEjLuq&U*Py}QGuohEU!ds zy)=K4<{KjRm!`5}Q5GUnr+_a?FtW^^)&~iuSM29Fd(ZC}6WbsBGN*RTg6i5mU zF3pW1OI2C^t4yPJsr_c(zLobq`&r_xQ2F&Kr|!$buV{&i32snBoh3XXzJ(3XmbO^q zg8H!F_ont<4qlWLCZpA=?@MlRj1bA6Oh=2CQ?rx1 z;I1e97bV}>;bp$M@VL3X?zW=8W$hv0@t%l{Mp!p%wYR4_Q~rtE{Buf8L4X^)^d~mn*TZjM-(}1|KD?KE&el_fSHL z{SQv&be9F(rHwL*s?5+iM_Xb()pKoDLZL+@LXapYEMun=VSyBqKV$@4jSCmCtRW>C z(%FsShlq?JU&fszCGhc;HW7t8UY*Ym1zn3(V%!Vw_vd+s(W4><0f(a&#OLQg#(cax zaH3Tgcu0zf-zcaCsk#Z@(BBZ~g|ZhGT{YfS4^Mv4VrAABJ#C z22s@dvI>|q;*4#PECvTic1YeK!6lJ0X{kb;=gA6wtI)mF>uVE z*KI;N#kXyVl#;;f;+4 zqQOgnV@1_Z#STngkklslimkqn5otwa z`)hF;*@NW-f$n6WtJ)yn)xpr*rJN+R%=ha-@;%MDOK`5234inqm0=@1kK1AuT1I?m zu(81ZUI+wkg*T-SW4xO&jAiD&_O?^j_`pj~2owbKy5ic=HCqSixb~r1MxSpNN5itm za4X}A0oTU{m=+1VDW!@nDV~Ex?e37qqQS09mnQwvT;Wl3B7JHeg3=xi=$ho1H;j4 zIJtq18+z6{QyV!aGS;OCL%n$OYn^-}{rv&YmyuqE^tj+tzxA2?{cRh4wmxYs?xcjI zJb|l47JF=kw7UO^WWWzP+51)4*npmjA`=+=xP2BQ@ zi7=*cwrHfK{8LKG;MYr~iJB7CUV9rq40E-e%Jo{Q=h9@dsr_d{lD1)!9~%1YQu1&aAXGRio;*?R*b@3uh=6BBQTtr#c*2j;qc#a)q!! z)}yM+y}wLKchcOHh6|+Vs%PteJQVaBs01ralxJ&Cs?9%a>?ct6_l`=xPSiBUi%D{i z$@PU0yUZlBvc2e>jUsn0X4Sz&VfuP&=^%7uCBV5W{ZBXIBV?{q#OZ1L@*Qc5^?bo- z{F}nI?_ln#Go}e_c>1XTK0o~V!BXVFKtESa_RmYaIWgRk>&X zhe^<$2qXV(=FUtO+c~!GHtoC=X#kfYcy@2I!G500KkzPtz` zD$lm1;FmyPqA-Zj>i{D4FZl-);t6Pw(`=RvowvCwfY7q+T9NE5Q12zVEP12z)EVRL z+VgwKy?tM&Pc_SP3y8=6KKBXSw-NOasjlBAhv|r)_Ad#kGL*}{g`cihv(DoSt1l2c z&mx!-FB!lmoZfWoCM=RH8AmnYzMQ1P_0@!QncijA#+_NbBCgZqC-?|$1gIK0b~KNw z=+N~*!_P0ahn$1+UAGP}%*?Q*Agn0XH!s{BYEL&b!0M?%fm8mEO6LWtcd3=SOQUWg ztUaJomPxsnbn2;Fd}t5*Pihh2mewzyxbR5uDqt6#3&i2#S&vP5Ui4}}tn|F8g$VeKv+?K!*y1X=~^@U2aAFT7Al}JHD z%2#WuUPMcnPt&J*0hqH-l1g`wH_HO62^Gil1!g)UxuEvkOiBcO= z0x=J+|F(Z1JBPLt`1S?_DJs7cscvKkJskPuSdTUtzW$|W&z5Pwr)w$L?)7ky_a_?) z1oQT!iWIV?+_Ol6uot!G`R2I@7<&Yk@%uq?5iya|dqYKNR)EKztg=Izs_FJhF=jOR z#&PY?9Ip|=lHVfTml=6d`{n8hzEMs;zkZPiUjH7>Wi)|7n68 z8xAGnFiD#U4WG{YD7eXb-^P1>2c*-<368VD|1;mGQLATPv3r#IW{VPj^7X(Wfg19R^>Q)v7QXBQoBydd244jdGdTlguL|@Pt^0btU^EBB z%;#1_3DVW&^Yu1{ZHh<#u=j8SeW^>k89^5he-`e4A9oyrm0cfE>(`11CyM|GQp34z zjlGqI1P{8XunnridnxU3KR%Xg_;5f_nH<-*_A;dsUgj6nkG{KM>I*H`5_5HBFqPYzOHRtb+P;4WQ-!~QB*Sl`(U ztnR$MEugI^S@ezm5f1Zh9pg1ld2A6EeJttnWx5Og^WA`&JmUB@HmBq1w$#pTeuaF1 z=Y24&5UG&r2z$+c$UJu)@1Sd0&ap~bpt2L~?XmlgYD8)E-q*!$=H-kMn? z5UWk{pWgpXAGbv@zLbJmd|ghskYG&v>}*4BIz1lprNAT@^rQ1_x{2v;R=VxBhhQ$^KAC}?;vYU zV`&sDHrpRy$=W5DpdXZ1JX0xwj4j+M>@h*O3jV9T=PEA%szac*v6F>Lu%*MT8t}dv z(!=J{R_bpZZ>|$lzXi6Iou+rQ((IqbWxx5a3~*_j?u2ZR%9FVp10KV81t50DobiktpifJr*7 z?EmM^|GD~wZ^wv4SR2-1_f-a+Ba%wa>S)e)v?GEcksymO7=2Sf2_`QI>T1MKwfMlq zSzW$u?!Qo9LzmUAov)7@i}hV}=?P)caN|>h_BeOb$(|?IyL_z>!1_0O`R9KEdVjE5 zTomEKlpG+6&QuJl+cr>tH|`|n5Tz6H2bY#D5b@bbN~{cZr8jULBpJoxaBRgZ!pl8{ zd#nt7uLtfqBQwJGJiv!PJQETc$cKbo?4RTt$c_ucK3L^_tT`R~U!4Ih(FlPYNYD3< zt5(j=&I$<&pC+YRO=3l0SRx{slJymA0h{5&EPm6_b_NR_T9Sex1sBu`w4Ln7h-wHo zDVkZu>a#**42u{a9lGs871skj44d$d)fAXwEfQoZ}4$89Qw3^larHN zF6;Mdv$c{^qF7%{Def^~&fIa&WivvAow6^%A=vUkL+0 z9O)4Fse!L`aj^xI^R_VKiC|Npt|hE6MAQJ1{BQ*)+`kFsrv=-xidRfdch!zkou^u~ zttXRO`~5K;?h(z%g7S~VKklWn2h|s7Q;gDtS7Rdz+FVZ;0fkg0#l?VR?gd(W$watI z@@!B?lID~`-{Xep%(aM7pOlnqq^7iCn66Im+bgOKIWA&ox!swnXAgHPl7l z+QftPhi20mT5bPdbnT7C@oAe3q=vZSG*3mnvYvT)on6+O`*E#=NW6}Vm6G{wGB;!* zp@!@b0@W`QF8!`H?qMFkS<2;W2C!2I?(M$xp5yPXLktN28NzMtDm7~H$Wc@EJG1eb zVYgV`6$q&W@EU?k{~sjy;VQYXp{|-{>3AP@B9gM;>J1LaGaVZnla`b; z>;P?Em0DQ>62qCgO(X%c05zMDTA3$>1b!dFIYiuHToWcmjNn>kA4Zlb6HX5QVH_wv zA0}o34QjgPMp^wMEww}Cz*xVAJ8iQDszyc2aV;`>R8X|B{#P_YEqjQHjhAQ=o)A}e zpPe3+_j}~cx!lw5m+WU;51Z2xLR54h88KtT z*)U9C)&Ug{hF2K{k@%6S2-`U+d*zj~D7)E#O;$oiS=4+bgT2F;!k{dv?eXW~xa?jd z(I5n@)h^fQ{0xTDNqx$ELn5rfA(1rn5gijg_luy}=MtFEp~{e-T-}>}b*UpB7xUkH zWr$`$MTc7K^3ip0p|8sFSPCK1NZ~agROPuRZePu9cm6uC-?=Aj_>XM@wlSuuo755PQt>K)VXn0V zhrt1I42On?iPM_g>&uW55QdxftwH-Le$|v^zA&^WQ#fhK@LDp&4r`z>z)})oDQ(A7 zMDdt4PzNd(TuG3*w2UiJH%on~QHlJtyvH}jJ4f32O|JW4e6To*_588Q`B=~HUmRAKB#q*Bz^s4 zJt-~(Aoo6Pe1F_f={=D$cfaJ(`qkP?B((HbzT%&e>CBae`GERuC(6JQz*6zP>Im zF9#3KSA$AbO$L*bhE&`t+-Hni;X#8*mn`zgNh3wdL!9@ll<58qV9X;TMw1cAN*!s6 zCt5Gaq3H;)K#`=Xu09h~R4l5SZgQGQozVq9PF|_knlHpoJ(_WX5E}-~Z?#v#Dv;GGb!e8X!F#cUk*277#XV1&+K5=BKXO{Sc(RtL z9qJP9)KocMomDR_<5Of*3@uGJ_${=kzV~UU`E>Eip;(Xs&ZK#4BArJU3LOJC6dL;Y z3~&b?lm{$j+#<7HP0H%PwL`?{}@IjyUpg1xKDdFZ=!nKUA8dwAv}igfX!f1a3zivABw9Krv+W6G3J!e8Es_`lE~`Mi)ra+b z;Rk%l#@y_bT<$jnHAH=tKo$v9-SIdbY}~_%27^cA;N?F@`L>66lVcCK1kx3vQLRAb zsx_wWtvl^hTlqv_`k6u=d0&JnM*kp_9OddYDlZ7sGk~?u@eS+NYgMZbsxKofAtvZT znqN+c!tGM8B)0O7^y%elTe$qY+;dTxQGu{YACDZlvQU?L=}mG%HxQlgtTbMC7FiP zPp!BNx-pCZNo2is(}b&9air|7rqU)FXfr+c(;~8c6vPd-vF$K-CCj8`$9M21!N-_o z2BTezfa&?9EnT{DlN&>dXR%s@AvO-K^Ep`d*Z){*$Wo$X-^;9a=UXY9ovg@HRNlf$ z!I9SG%sk@%q#H9m#*VtwyzyYE(dERiUg~FOUOv<9Iry$Qb#I9t81F&gJSlzaFSy`;<@wSO3wo>)7wVb5O)zjjX;y7i#S5hlR z;&xK7GGf@0rg3oVt)63KyX^Zm?hkkI%SYS?}_mxnExGnU}ii zhFw{8;PLq-=5B~M124P6gVc`n?6QIb-~t zrkbvdga~1KdndZ7r{0gZ@W&u4eKnmLDw*qaPubvPx98`qc&B}!DE(N@Uw1@K+!e}u z{QsT^9+;!`%(k~{rUHwN9^bY8Q2m2LHFjjP(D)TJYPl2%OHeLT(?lxO2a)&kI0A#} zg5SchB|`7V@(Y5!3lv!${?ZYu(wPc%?bp@55U0OE+e}tgeIM%59?d?+4;K`FUR)Hh zqH{MTPunW^qh0QM+Y`B@A`|Kvrsf4sTh({4S zmU5$UuG?dU;BVy$&l1zUr1R`?Oa+};`N!6J^VDngRNYw@fTnI)q+G=r`+0_?8;bHR zso<{?NtnD_Kn-8Irs~rsSk87f$qIKFYQx(s7)lZY)uXqhL=qEhdR1qyidNT3rt`(! zQ!hh54|HhZlOKC&I$y_QyN7O`4$rd1R|>sL@f_i>z^X-`SG+M-#ACCVGb&{4$A|ib z3L{9JnzxgYZX_J7Q;V1$d;&Pe#kN;Ug1b7uo(mvX5G}~oDz84d*o?+BQ zG9hzFo~e#DRI9gG7Lkm&u~#+*h$cjImi1CyD1jJ1$dR>Z><0kpO(b-um)CHpYYR29 z=FRBBlT~Zgy^dF~iVyuiw%#(T&8=JiuFwLdSb;#%;_mLn-QC??gHxXT0kR86zJUx!1gx%z6E;xw4pG^M%>&#rDIf*a-&@C()U?$cMn} z#w!VdWNw9_0vqxN3aw(0-CD0{=mnkyp3S?Ir!s;C<)pf=%Z>F1Q#NPzbv}G_I*s@9 z^H+E4k|O)(^C$!DO1PNp`tq0Q$z}=`eIb^e>9@ejta%bLm+wdZEADmIl2x^fD!O{( z{9elUUxP#Ugw^Xv>Gte}vC_wgy)N1$KrSQV&)`1>5R#IbKpAGbpQnrU)Den8Z%kKI8FfkF{3%Lms0&I`d)i3Cl6Yro zVHHP=z#}cRwLhq*IN#RVLcpA)pMDvWNHIx`5=qXO%&`zsetOmnmOCC|B?GGJ%}}jg zKKgK}Rq^tsy{u)2Av=dDyE@0?uEh4>4)JoqHNZpiWt`TMYx$NKM|X<1%=p;n!HHI< z?BlXpuAsdy55VRsgF}rzdi#SMyBMMLIC8U<)YrQt)`I2p^HZ}`;`xzYaP>T(+M15R zwExdWI^L9;^r~fnoSr&eB+d(!H zOTElkjci5sYfrC(SRf9rzs~*TFSP<+?Jf@6%a_{KlzBFo2Cx5|OytF2e5t}?w^g}b z>!^{1U8P1;sx(Q+MkFA`_$JF!dj#-E^^ZAjMRbh!qq~Z z1grC(@}3O21rD1+_*6N&`>SW#gFw!F;2J7&gf-5I`j265`Mat=5=Pvwo*TAYa;r55 zQ?#W?X3k-8KDUug9cD{b7oUlH2MWWr2HG)_@7fBkB`&cOFHwHOz(IrT4(+P>8On`` z8bL|T&mZ3-Y74zlh;gU;9<3Iy)ks=nn4iGgcqvS@$aL5cW4HoXC|{CiN@1dB$KI=OHqFK`KlS ztDR$j%`7}Ll#0eUet3bwZlpSek6MN4^_F-TQ*{-{%myc6Ll&=?1n~ zy-~b|%}Ct#*Re|8>C7Soy4KBXSC*YRS}V=J=daK%tnz_~%R_AzRWaEWfX8qT8Rf;!0ydx1uvJ4xds*TznrlTLFMc^hIx2{qCZ6 z%cF1^-TW}zKfS}ajpHQQW|x-LEINwMdm}Az0CC@2DQ?umWn(}6YprhD-Gb^XUwp6= zsUw)zE8^Ly#JN#pXMNSS@ zjtO_E+fq;aN((K$epym&JPAorW!bqp;t-9tLEg-#K~q?@YFldknaq&Rl1AGw2j`39 zP}w8ig}%_p^T7(GU_ME5lC??F^PM*bmxr%NrGA$;r-mW0&aKT~Q%lnBZ8E4@KkYHy z#P(4Gyz2D(Hr#lGm?F!n5EFrv!SZcPVH29ebL|E{D1(c^f)C5P_E3kqftWrBUysQUO?R z)I2A~TPVNeuy-g(W}J;I>6IDNcpgWy+u!gtj>FHH_;s=cvLt- zlaQXbCwK$|r-ljAr&H2WJ(7p@cHD z^JM_pVJOyb)_yk6@q2H)sSAOeQ;+r4g11PBYR-R3^R-ZJI|y#Hy=tt4HH>Nm3HV&` zNtNfh<7@5cxxb*JcIhhCfB19ZIGzag*l$z5=-bi=UF;k@tNO&NH2UBpyj2kVhnRDJ zh?1Vgr3|lv>z*1ILXkcrWxD8w8+xY~Y>a_S)8CX|P(rBMmK3sZW>2uQIh;!&n+OGQj#T zWXN286T{KT$qEh)6I1Ol7c5Nz+KQr~9zRP9Hhvh5^JMn^C~f5zZnDi^18X#eW1{%o zx7d#r`=-2YTXb5Tb&8MlYq@TO+$pcec2}=Fo!R5*w36fjD#T&2?u6n{4KmJsL3SO! zO|#H?JGD$?C#R4RI@&?IAV^M1vR)B69Cy0WS+F0w#>mITR~rS~d02@7(x=J0Z6QOhUz|aZ;Gci~D9i!P;!Z&5j519Hc@^^^;7E@8A&tP-E zd8Ul8;hj93xTR0exVk53x*CY^<>M&v#v+J08+)uB$*Ist#bPCz6<*`s*a$B_O^#|l zif7d<&Ww{>;e5P~mVr>QnqN>4i1FUnhCrYczGO6$V6kw}LA{9Yg^ ztXfblUP=g{E^t!uGc%x3&1n%~!z0rK$(ZbWg&t2SuI|CQoAS{dU3JtHAuN0KY2H&0%i4tmZbZiNXYJE4d$tgMk35u-x` z7Jn_K>MB>&D0Qi_)#80<7_yPyQSfqJ8!Bydt+9T5CXy*IyVcsuE|P6zhNx@Lb}8kF z91Zcps{2a-d#k(EFCEeG0(i-m5AQzW^iKf!e{)|3=$-Gs=j^M|iNLpT5K}bTP3>g! zxf$L}!@Ut-Gdc1tM0Bd7Ck-qzHIzZf_zF~KMO$L(&$3%A2o2KcmR@CZyb5W*TumAW zW(qcq{3)jsWt6s}V%pJbv1Ch?q6oT|d}yG|X;+lk`pE%q>fe}`2xC4@>AgfIP1}uDlLwZcSthH=IRdWNG_Ka?y3BW&xvxwp?uf;Z zQdeJ@*#3ltbAr9#xlpDzlet)D5MsdEXS0%PH~m!B-R2FO#1=FEcExC#D*<=uDVHg~ z%~LtO9jcWkfrO{a6asB5vie4=&E4_G zAa}M>rO`tVo!`@c&>ibMY$yKOn|L3jlt~a>hWR_*ABriq#+0i>k)h%z=-e-b@}HaU z2VdE zE+-1g89#0#ktiAbWF%7kZAm_8=9iZz!@;;povqX}Yl`Dx!-1#WOc!juOp63p3h~iG z=Ii&%j)qhY;T%sFi*BSKptuboEw|00*SC($9R_AE5kp(M@jT&PblR6(HiMBRAFZRXxSV2KR0Q!umT-5q-YrIW%{p%^OQ}o=iLi`bw)+$O=&7P? zhk}8s$w*gd7mp<(i(zPb(I7=}-F&gzzhF1Ms-k|J)~8!MTfM|3ZI((-0kzxKG8!NI1gJ+ zZrH-Bgm<#_JvNE@Uu)N`xUB5h*cjMxTaxq@inV$S#-o!cD4WOz#;w&1PrsphOJZ80 zDj%*tQ3zBC770)ykRThLV)yJ;%dkm`O!3za^9Wk+J%JB%Lc-&<|DzvW|R4)`r z#f%`g?><&b_R5B`6D_4W^Q`%@p9}PzSxR;FTf5DhyTSfr@^5CvKwJbc^zL2zIyM`q1W=$r9u&(?I=dBZqTx4uxC__e`BhyY^Z0TsCl)Ka_LKvtU(I+R8X7 z2>hm=(i6)1SjxJ|QvNGkda?OJ-*_3i1Nxa*EeqOX2^2;VwoTrU=_D?t(sJ1Qx18WF z°_t)IOu$Rx=D`WA|2G?@;)H_S6Byo1_=rTpq$GRyBN1fyLqJzn~7D(#?7dmeRU zNOq_cHL=kSti7HPKX5AXL25B`L{2da<)m%%%2_@JcIx+uQ7bd~1j&Dg@Hz2^J>8Wj z^Y6w%um8?%hZ_T8F3n%C=S+&UvqtZ-Li5x1A{i|$}@c) zlYy%*&K*qWNQz9G{)^HYS7UPoUNzR_p2x}&l0<0uo)@R@V+|{KC*o3J4^x|9a}r>? zuZKon<4_(7HHFpA8fNG=qyDbOyP-sgLerF|@ziRn7lj#DQPh<7BQ51JcX`8=93U|^ z4fM_A8@rn?IJ|ijNXjSXSk$)NP7MqP>9W@j=RVkToL^~qdhyh+hxF9;$5S6j7l8tO zF2@l}pi2$N&Nk&QTdBIQpvj;~S97^a@T_R}chXrzX9?Ju@&@57hWRTF;t^$=n?s)QgEGriSztI=$2kIv@cG z^P~oV)PNGAWLbXa^+XKG;zgdzOiJ%fn?+O-$jfp$eR>UlV4RBO_(@weJUoUZWy+}Y z&-|&0eNka&w7@aOt)|xsb6m{-YrrY(>L_PDjx(x^*?yTxr11;fff6iJ%z#f`!xX)8tX+4ba@7*v4MFTweB( zL&v~K9u3|@RPcDKqR=6JMru_HdcRxN_E=I~q|8E0$T5tv$&$O?bQMoMRZ1=TJ-1il z)aUWGw0~2P?EUmUqKD45-}KEGBf%8;Z@(mHytSMSoL$DJ2dMytww~W>&n`p zz(F%-q`PD3Xz^-~={k1R-{AcG{H~BhIvC3apc(BZIWI3B??rysqol2#j>7|hu?R_@ zQ_X{_Mlwv;Ak!>dFO?yPug~cS+ZH4GAi?;c_+&H&qgBnC8=zQ^KxHw>kfRK_p_U1w z8#3RZ)3(=S{Iayw&~zbG&VBpcSZX0VZppgemea<%RdzDrz2Hqw{=iS^YDk1Jq`D94 zo9Ak?)XO^Al9$ltEm#It=pK3HzL>`;MdjnNnZ!f@gsUA}=nO5@Qy!v!3T@w|GbK|+ zGdEA3POIP3yQB9C=(^id|{!hwf|+SZHr8qb`2P7~0au>L`H9 zHC=}{LVl>0D8)39O2xKX4`poNp+P_z?w)MXm$=W4n1xC*g9Nx17{qT{cC0zDlWNGKs6(Wr4kMrIpvTj= z1sejXyzG7FoHseGh^*JJNfm!(A+YWFmmZQ1$RaZ;6E`^i>O>LJ4~Fe7sUni29sqcqy42K_m zD-RmU5bpRyrg~}gjG2!{fvxFcC|A{mQf_p)Y6^~mv`Mv9i>P}&#B?R0bUR_d!pKf; z@?=8EO)sqV%nLuDjVlK9j}j1w%6wOv?M;x?zrt=fXoq^NnCKf?>W z2zoy5i8)!P710)S(5AG)WI9$}kAeF=$l$gsEO6DqP@|^LWhJ=oBjyb>t9sILHpwsQ zj0pH0e+diL$x8|mks+coje73mUrTs-p8p{WJyZ?=Pr-%KyyBM%&zlQgU7984oSlz} zc4N<4w+U_a=HrWUx>{Fa`MX#60b)Ke^=Thd*z4qd3VH13>9(=Z|H=wWP zmDW6A90iJMFJb;@@NXt=T5E8bAcc zwHo~CqY#Nq7YflNX9{U&~r0a1!|F|bT*Tzu@2Z46t*zY$cpld{DdZDw>T!jwQD@=A} zdZT9Y!^gs;=1KElsxU=@b%?M=$u~*WD_AB*3`I86Vgqw%!JD%{C+fIY(Wj=o0h)1% zJ{GOAOd@jGiw>`8P*D4Ro8h1xq@$F6A}-otorlz{q$YOk6+MK^pLp}=>%*wZA^~{^ zrZdvTadPX;c`vx%z*$*o&iD+zp?w6&>7I4d1=c3C zy}V&YlaeO0W=4CwD{7)@ZG|2S%VUO?%plUMt}VBAex}OuYx&dPLNOyY)YQ zT5G!ANU6Z~`==hzuROZQTf476&|~$D3V2&(7(uN*s~vM{3?Lki^GqRw!+)hXE<*BV z3VeZXY_z5up<8qk&kZltlIxODIi`VIoHJv!T=n%IR832+P!vCFCy#y^H(Va>mdeIQz52?IkAj<{iYUr*O6uTan4|5TvjIRSd)(2G(6LPL zj3pwpO9P(q#R7k}a0&&b0jd06=g@@j0erV<8 z<>B(U$-6XRD8z-R21uLIeeZF#D^|6h5yGwYhOoSyq;8}!%1HbG`YBeT`(4E~2&IO9 zkeUiMS!iNFo?8a3MI_rM2=4k|0X&&~<_fG6zyT3?4d6AZdZEdSd)f*ZKf0feFUhO> zbcEpZI7|`)fi<4y0X?W(V%@AMR6w){(2T6qQSnFQRKDH$c?m6Px7%HUljh5S-ro)M z&%oKaQ{NirL`yQ&pPdMMHvLHO-t_^f z3_;5(pyvU8J~mFaH?sehd=Ea3jf@wJI)iig6UsE47;)uMaRvRfKz) zJqH;2u?5hu0e~-GHgmcu)Rx3pFp@s_NUGu1aDjYsg%yb*nGqlW zhJ}VA5%4Wn>UDf922uI8-0!3w0(jZkF)0hGv?CR@wY_ZD5ZL=Z>VuS<5Ekh=zYy`% z+EN>7{g9ls3E8x(O(Z3RUn*b1A7*Xbd(yS9x@G$iBGOMp@~!skS1R5!PnuuQ%v_6p z0N6iy-W!2jM#nWx`1AOkp>&nv7iMO6DKmVJLQ0IU5p_i(rqd+D@>cnKBtLgFgz}|D z`VCEI0Ur(!ySUy~{8h>NahpNMGx!q`2Wp90Id}L$U>$ugFOoW7?Bxh)CL+#6i2Fe9 zu@Ntc4QfO)9XnI1Hpf!@O~nV=@BQ$a7w4+r3lyTp!cqrIf9Hv!Zzr^fdra7sEcv!~ z<$Qs4wDPkHagowxaMPnXAB}$CTLxXq(#ju``k-E=t;{>I+lNDnAT#rP!uiR9pU3Nc zizPoYP87+ z3(W9QH^ixzYSPY+WBL5UswphO68@Hr9|Q&0SG!4lxw~}+<0=#++`j6`*--4d2;h4;yPKh$($7x8{7abi@xg}bwYNz$D zba;KSyLqq>zcj}s-*gDefxQH%mf|p)Z~eo>)^{1h(R-*OIE+wYrYY}6Uw2=1v(LeQ z1*Q9bZJp#rpL!TWgWLhwHj|6RzITyOq^wOgf9^$#iSotudv98J)C7$qR(zahZfbp# z8{O;CLhWb@tCNmDX-YB`slab|!Sd{=tkT>T(!a&T&>!{kVZb5bhmR++nWH$goC291 z2yxNs%RZ1=cURV=Dmm~TE?*iR*7_tV{6K5&ACQvgl+j>&$S=%xh>qpPnWGbjWUTg| zxzXOL5}}*?fzX_X4Q&5%AybW0GBL=?h}M2n2+5;C>y*bs zr4wvJNv|`&ql(~|P9f^tx;k8XUz0;7fBZ&!12hQWS|~kiyD82bM;)TlkcuX;K*3(3 zYpPAc#KAcXg(+oWH@eHSD-t@m-&`DOFG0AOt32i5vZ8kB4NqeQI&%XL9Zk2w2h5mD zMTl2*c?yIWpf5;Me>UcPLAfpRr&IlU%@D|Kaa77_D%O-S;>Y*TVBMv1m9;|5TW{?C ze-YQYw}@AuhVkhF_nJDF7&Eszi**c1Uo23)D71P5cas!PvDueEIHxstZ^P!2n}DYU zBYTz-Wil&RQ#M$HE`d?aiW6&W;PM{OwfNh7hghP9234aWC5(T(ohOU(A@#-3*_mbh zl699zv%Dl=?MY{L&66~U6Vc?!VB<8DNhpve=TU|6C8auG=etfRb8Wx#-iLIAH=XrJ z?JYlpf}rkZLp4WT#!$ImM8T{S`+sKR&F^(LSuc?%B6zvEpgWqvlrF^IQ7&>H<}`JW zYIjI%<69N&kDkGd*v(#vhIxtmzg^7|v^3kg?&~%3y zp34tJj;7FG+BA}C#!Eic!tJ0A5K0Gr%QnjM89lGH=??Yy83^;?L$f6eLgw8=p^=2p zRtY}k=t|v@*9xnKgs;swkDXR1?LynbI&-`2tibKNH}*C{^yU8VSpF3E%->e{c(HxNh|eD|uzLDO528&PRwNUu^1OtTW36p%oj(J!(e-FZ zg;LL1l4zWScZ|Csa1e10Wum8Yr_xc;73d-w!d-$HIi{C-+N-q;_Hw}Bzcdk5h%Z++ zjCSlivS0sQfFZK2<756@ajA02fT=^*=A{v#?6$f7B1A5W%LTQssgCtRK(HxJML;@U z_1zRkLR2T|cKde+{cE1Qex0tFUHwXb)4SV8=zGC`qtY8|LZ(aM zRDLX^4T2@^w(9HFZE4Y-N*4_#p>C~&OF-FFfvCZil2sY{H`kJ0bV*T=Vjo^kn4l)I z5-j~8AzUtOK7%B$Z*GRw&=`G4blmpQZuMOzhR2AgML*SOSda8Gy&V9{(g&n!u2_a!kS2|>pof0g3@>X4|WnLR>YclA&892q#Hh5LBxCzUB zae0>=P2Yi5uH!{F_tBd&yJQ5 z8j-=De`EBo4}3o^Wovr3JUtE+LQ9sM+ceX#t&Yd&K4}jCZbVYIEcxaT=lhVZ|J(~O zoa^hV+_tzI(J+i!%?}l{q*#4_s;@kBu(?FAq)+H^KPYrLV^mF6S*AkOAey#`PFf<0 z<&^M}W{`v%c#F%W8z|cEsOllE%Ae$8EO?r6#{^GBOY7o(8xK|>=6!B_f~--8lsK}} zacAS&Efnz-4}#h?DM1lSAQiYa?|?}^JVowBWBtBgzAy1EWiOzN;~0-?gT@Ecp*=n`74H-BXlkL zpW*c*3<_3C0F+lIerkUtRSDgn=vJoBC@w#7vBWyErQ`eKu~xtFE%H1jujHZ2k2gNK z@gssm3W6%%937UsHb5GCQ)#?(A%bGyi;1d1!=t3=6){9T&Y{sBH(Q8DwDN?I3;$I` zdNI&3{feau`?J)S90KeK5`-9%W-2g|%>a)hed{T{M$>WHmfutTlO6>`44S8?y)Boo| zKtG)-1>BYFte}CoX|Uh@nlwO8{ZJB)Bh|iI^Jzy6VR)|KXjtX#kDA26-1{bXQ^LmE zY8C0x_gj4*-b%1G-|Zvu%yAK@0kqhDFn(Xlgk*jHO;yWQB|b<*jQ2~Vp*b|Ku{*#w zCK7vsK-76gkm%jnxY=MQ7R^xL&q8*7>aLv0ae%+EhASt#Qm)oR!J)-n&grb_l6M$# znZ|fa&UsZUm*uD$UN^$ZNo&}(@{z9 zMk(_ZJCvzYpz%3bp(EKBmb;$f9wX(6MDX?d)3)N^*53#D@wb83?)$mXIw_?m3B35p zx58hjrH4vnIQ!1d{)+>4!%^{48Q4~%r<-bN;W%pAJaR9gIaO8Y+es!pED?*BkLM+x5jR8kY9zrbUsM z>}He>zn96W7~;)UDmt95i5C-@nR+^mF}ce0IxNbodJ|SGXa@s4$Q?`wWwYfjen?w} z`XyY&PEB&bl=AtSl=JuYR^pu;;*>r(x3l9>Iu@+S#;MW@j}QEUCU?zwN!mXk*iixS z%|vUX3KvHtXnES=q|^45 z%bt}?j6%J`wBFmwoGT9_v3BE^`m6Punc#?ky#M&U-OwbS%RQSndOkRLQ*=7mx79#kH719$cMOx!|fT(1h!kEM;@M`p3r zs84(e`|1J=r|q0MUaM3SJ0>d{~3nE%*N|8 zP=uDe27qb`Pr#&b*`+B|UEEhV(92~16)XUB5CJsH*hQUOOPpPGz3a~C`(<-`-d>t` zT#nVq;M8+2rlhIXGHykMj9waIK|?~A%{35}XQ?491^Md;@Wx~mp{tUfOPu#vJHMw+X}?S0(p+P^O58eQ2 zP%g|{m8xLt+xVa?wVRlXiM=sX?P76RJrU*`l&?mhZ(mVCLgM|Az1cq1!98xh<0hVg z@PPc5x&s@b$%&ui_NyhMzqpRITvL#Gv<8+jbY%3w?v+=fnKaybS4$^t4a=rbX$-cP z7J@Es%HyMEffNcW7&y{NruoafPYgiwg6Oa`d))pYtQcgY{L6_xi>WW5K^W=C;PoAG z51w2^tk@^vJfN3oljEkZi1mQ0a^73f|3Y}zZI+=P!-@Xu552%fVJNHVOwxI!6V-2y zVS<#aSc(Nrufj`s<#DdRM4fSjw=3grc45t{(e4msplPELB>3O8xt=5hH>vX|jz4_S zbB(>6Z!!?8isYImkkvwwnL$-BT&uwd!^&q9T}jDW@VkqqMJkuH!>9SI;r$U7es4v{ z*yEj#dxwp^)}Iz_@wx7=hT*A8t{r;m3XVy79C{U<7IRu(%S zG(S%+%WwGoSYq>Csh)%FU*JV5dr?&Y24e?ZFgX5KK-g`C9+!r?0=08JJXtfuVn}2r z*vnG^ETHN-a|;^)af59@O8pn3%|6u#gaAoC%I1f}!muq}Du&{W!fRq-; zMOSmzO}MVGIc@xMIE`!}AtX$aQ8mW5t) zDt^@<{Zb&3Dwj>(s3>QO7KUGg@*qPK_^@syveyQ`LLk)bd_^(E9vpSNj!Tx!2WeH_D}SqV@-SQ<@RXjWBwqzuC6`&94y#CVwp_`C7hzL^=e|96 zzoKuTS@{e}VXGSeG3oAH`q4VLKqp0DrJrl)+N{xQ0O>~?zg)2`Uum3@fPehe{}VE9 z1R`E4w?TK7?^`LT)axx(G&MD$wq#l%)Qj+t_|l;onoy!IjFVJh(M$v24y_sm2mu)HJ#w zD+|q1vCCXVkWioy?O zJXR#+f_ut`q8_Cg*-FVswrU;4RS@JI7YQqhZtpDwM;SkVRxQ5QiQzne-Hn=hp|y>p z6`$S7>Bie0rf*owDjH{_)f*%;e;i;gzUX`{_5jsJ|Kx{^4CE>^5cll`4pN7Usv_Bo|n6!BDy)!f1O{v{95$4 zH)izaFnygI9ia_7C!jsp^YTa{vK-8QDFsFS2S~Ptb}=N*@Ube!xg=EFV%VlAbTb@k z09Y_jk}m4inhgzy;z$(bt&g|ak@T<#paNB>G|!{$@ZB8XUBp*1G@dIZMa6~#G8R~@ zHer{Fa_@i7?eN8|+X|)M8T8j)zGQ)}<^T~gaOD-W%NG^Rb2r}4)6?7cs8D4CV|ED} zl{4pKX|+-U@s~%a*Jg-;wmWy+{XBGPz+vev=B|!dyVYH$bWABC>8tV@6slsJA(Y?^6mFy9Qy}XPQa{rBlHj1AFS|8D7AXt6I6I-S;hwycxT>o z99QRT64k;Jwi8O89=W{p>RQZuKI2TjMc1KY(~=R-jr=s#^W(qom_OIg(V?p2VuXOe zVAaD}S}i0~v%-H^Xi}-}5k0(BIT8uF`j|I}32+Me>Q|}9jf%hFg7Gn6u(9BIE(>8{ zGUC-1oJ^=W)EX+o{(_+k`q13S=~I<_|3;w?4Nw2TRUBBd5hl)h*Y-6~SYoW$P+)ss zPU^709_Y54?#>7DUC*_uS`}c`0Y_H2 za(y-O`BdB!eX!&=&B%7HO?bfdO+skr)X!>#m7W1H zh{~4Qv;)Q@Ns+)mhCqdD{TGnb7^&n2@AGbnK~*aW@18uDFfEB%=P~dJPjtHM?L7tQ+@l^ z8VHrUTg4355KjSu;dt}<1xHpx0+ZRzP)Wl?c0#nJyw8U0e7ItG+H_`&NX2|KRrZV{ zqpeE&dOd6(7vH5SmpMZgk2Y8F0uJhbhp!xxE4K5a4!=hkkW(K(Mc~`FL$if%fwb<( zytv^IO`w^zr=W*I9V-RnJhdvtBV4LY@QTiTIR)|Jxmuz%M{o9?WE6#m5xkC1j7w~A z0L8$>78lzsO)mUaX92JS12l2qinN(lPbPZ9+cJj4n4EB=v!Q2kQnL{Yra3HAl`ABl z<)uYU)^3Flp3mbV`LFl)4Wej!pW4ANxhuQB69|txAu%x#Dr zt=ycS$DTmNqg453EtWJ1QC<33(VsvBJX$#jeWvL6Q!N(a+g=eO6dcniMT7BV^l@jW?&fD!qkG=3UeUhJ{sxdF`rXYQ*Rd zT?u}@ExE&Mi$n_n;wZD|P#rcQ`TFjzNn9_$V4$S@W@$|= znf^7DFC0B(cpwqrz|&vz!$KT>BI?~QVU0hGu{!W+UxLJ#qDe#YRW0M4XX*oppX97w zurAFL;l%j&F9@g`RcG^nKD)~Ut9LeI*z-ATZpXowl-(YNxX$qWXiA@qJ_h4 z89Tlmj^+um)ztztdLiJl`hX!#d717 zcs-Vy0BzghZTY!~w|s_ZK8OX)sNK=k`5g6(6F3p-U)F_uwLmkl{?Ae4@4tv)HQ#oO zb!MQQLg?uRup|1RawRDC4u#*TT3{STO{zj`IxXM{)luiqk_M!0z5y6w#m{-@rAWRL z55hQLg-lBcvXDfhB9IZuLX0)VQEe6E06O1ULP_Fh8*nHos6x>JDXMgfOf8UaVhfWK z5s=Hhj?SW_^~=If^EgjQQF}_*A>j1a$_feZYR zgV?V>PQaXNNb_<%_Y3x9sYCPcFchgDHG2B{rLTn#!hOOR8B}>71PwjjCuB$tPz*Z` zpg^nX(EK&Fkb2`?ZjQV_HaxNR*-SWmA2S$hinDuw_;fQP{8u4;#dPi6RSPBo53|!y zX-SH(ARVo{&*r95s9#OzyzKdf-}}O1CrI~xC5#V)&37pqH>JP}$QCS-ayMJf0&$Kd z(X17Zr_Z{lh_MQW9745tgvAEe^q4OO{A|7SJiD577Lrat^|#*$ya!d%4e$gG@z1?% z+o2|phrv3-B_|L=FbisUdxMGm@BM4I{p{BNJvBdYkgmOLUo}+Ak@===Z_4tuPuR7_KJQJ905YO#55YX&ArltAp=>i}7y^x@MRV2IKWH;@ z*@A(zomD3r;b=nr!j=B_+b-8bRZrDQ!(W=qo?8FIHLE@)Oj)@tg^rq7RsYCSI0Z8> zk-CXLlN2&y#)S9~Ec+5a<)oEM< zYD~x3sNH-8CFcedZNB}#X!DEFN#Gbul9$ivuu>hhc%+zaCQlO@6tYddy^7@rIBMwG z(qJ=yy&vi@dgy39oJVQ|`3%>?>EqPV_vrzsDg+98kl$86CUj4WDhhTA)I+B0t6VDa zY&-eRO)C(!>9Z7p`ndS`;Om4}opukE987QanKy>6QyW5pg55nv4E?_|{`d5}S=WH! zrx20}`e;d3FyZp{ac{EXRr! z^fP;nB?)_;Y`I%qP&h(GDcXj>X-n$?Y1X@SSh>b}bd}F!GZx~h`Z}^Y8j0@#ENm`6D9u(#x_im5!{ z-P~IGba&S-TVvhE^KsY{J51GT%dwW9Y`6}09M{F1ZGuD5nLcy|tyuVv|kE#ZNNp zQ;+COZjrF^x<8dDi4WKM3cT(bmvZfZ@?Nd2ophq)6bz645op|hHAh42i_(52i~n0>nClPnaoLM zr`HjruJ=Q7&W4Z8Ro%-zU(ngtTD-1jlXAQd5o_Ao%#@D}Gc2#{>iuZ=h9&AEt$#C9xX?GN>Q`Ob~! ze$=C5*}=4+VIsARrPUbD2hf)Dr?dZKbM6y-+NXvwH*BS4i2;+%we1JmS1*rI?V&cU z;0Txa{)Rp@hN?#KbJ`i)P+Co<)A=9P#YTODYt z57!#CK0zr|?2Fs@%x7?nyJ)@mKJXPP#BV4keC84>n{&Id_vjVdE@RBJGR#CFd(jYY zjPOyxL~D)3bPZO}>S@aSyB@o&uTBHl$`9K`_(ZSA1i(y83awzXnJ7CvUdb}~chzW< z!RuA4uNd0Y^lxq}!hs&;Q&O<;@pY}l72=eWV~IdDHg$@1oI|)`zQZwr7^HrCuM6DB zon$4iejPyIf<$b?zJJ4aNP$VcHM()}p#1mf^7Zcy)O0XkH+w^J_)%f+Fy$4#BB8`Z z46o*n04SV)$Fo^D0#AK`5=$&HOC&N&=wJdt5BJ;t+lW@rQ}0u6f=C7#C09~Fzdu3) zY<(#>s)-zcs(sYF-Za@~paL&r#T9X2~d~I7$Inal#C_@ZYhKK$>6Y`&R0{DLWr7-b(Y(`x=zZ;b=9x*$Em(taOy{-l$|&spMDPfH>tnpN;HLyaV+YT3d|>N1r-J$pWIMt1 zcpqoekt)(*&=`S-TWntgZz_4eGk_QTa2xr4uD}J+A>sIL;d5M(Q^M}mM!=?pj5wT% zDJyDW`cTz{rh78N5NG2!&C6%Ri6tFtRfQ=b9Z3i&Nlmvcof)!JSZA;<>7|K(JBzfq zFp1!Pu$+f=zf<(g@mDnTrSpoR?p?}M&f6zw<9pBDOLS&{3@hkxLQzLV{R{fi#$R6# zUA*<>Wv%dxfBP)_7B#zKJxduYSQHTmYh7w*g^ul>mrDE5X@K3h~L zz!fk36=y|#s-@n1-jB5V?kz-w8IdQ9C4cd^gJb^kP))CFi5iz=&AV1$auX%yeh%6c_3L7U$DdVHV8}A1mndB3Ir4JB zCXAf#(^Dp7voKe$jKhRhDtLV9`SJmmv4KK}^O@v&4YQ+=gBw@-*1NzN#loJZG}N4I zVV3&E>byjW&ixOws}FcH4XeCb1&y_$LZ)dGH%kFRB9U<{^(yWJB0T+*VAr8@b1c^? ztw?fT-0J&sUzj;}S}k5^LM0TIM_8+eMJ1A$Xy=q?7|W9yW|Lnm_15>r{du+I{R6Dx zePPO*`Z%xc-RBgWqaBYc4$@7CP9d3oq1+pRwkJ1T4~!@M{VfryzXIOgNM2pN$#iC1 zi_Ip6@uI;-%SGm7vPC7#R3>%L+2fM|XxqKp2_01wjt8Qpp%taNRA=$DBjYRdmnQX} zF-;W*T;)w(yR!X%OubWloYD3_Tm+5nG`4LtwlQ%U+je8yZfs7>#_MX(P&Ehz=bJ?>EM81NUg!b40^I{x|Kv7bcs6R@ z`ipz-$0lyP6PZc&2r1t$vOs;$6PdtKwdRf2t5F+8`tZWv@%}E!EQ)HG(?ZmD>Lj{) zR16GFD-%W8y}fwnwgWqU#J}~ zoGIc{<=uf z(QW{mz-7SD)jr+6|7{zDs3Z3wCE^*cH|8l9Sq8z4}3tNq-1(@U`n*DdC{E zf+3vU^!BuOQ;BNsS*r!m>bhcrM`u6HR+3{F6V<%~u}=6M?#t8eyT4WJaytLnrPJkU z#M$AcK8Vx|RhBeFPgL42ZPAI2ilnab!$hV_CF-TT;JYCps&Pp2T3jdn4V^k>{Y7<& zq}}SS9=c>NA+*zPyM+p=^Vdl=v<3TT#k{t^IqnbK;8ag=qvd+}j5%l4#Q1nv$hS_% zC&lNvGTZ^IWw7w7pG&L&K?FrI47`juB>U7!ndJ2mA}fuCrA8kcRpUZNn$eeD^>A>? zL}?+KMhKdJQU-rl9S*J(e#X9&?w4K)$XYrA9q+d_TxhcQ!Xrdv&gr|(J`{3)|5uIn3Nih zac7fnOSkeHT`1Y-cANGpr?P(lwZ=f#^`orlg;_QVwxXtr-C$J(CC`yd6Hg@mb2wkN zgOq1;zQOW3*Gb-lO{7zKd!90_35_NLRde%Oxw-~akRURC#?#eJV_#yBIn(VBc@QZl zAc6R2^1d^qgbOKnh6>&9i4iah2S$a&s|5-p{vo-_2^BuHB!uVsFA`Q88vpX#WkPwx zXkWHh!$W5~lSWcH;J2~`PM`3IVVG*gGA_6Cs4;DaEnQ;H9xQDK8oAP-8J5sYM1)?o zsfQM>g1kQe_W>5O7ONN8^f6T@`#=n~j_Xwi=Jk)Yb&rGVhfXHX-oq*4jpwrnO#~-@ zn@~KB_vyi@Jh2GxgYv{G|NlXkn!2u@#yCHuQ~LY*?#@;gezUuNH*%ZMBQ)pqM}?@& zfE<8jsUk~wOd=7huB%TxJZIS?;vsEWc{};0AKJtr6(&%m)FL7MTwum&e@9QOz2Af~ zFsi}ZFCxD;_|zHYNbV?Gsohf9=)$t7%>bWXYk2lG(FA*EGZeonUF|xaIuw`!-T77` z@)e&kRXX>Kr=qL4fI6Y*l6hdhcx^JU%!YoD6%B~qYZ?KOxe_p2!<*&aI8f(T9u8m{ zRmB-0auUxoX4FGV4=^zd*3+n(tg!1H@rDef_K+er}b^^ zxzlX7?}xY&2R6oW6OsE?5|&m7US{0hI=cS;^5YXS8X9;Y$afW&*It+qKt@J3iR!fV z3Lak&V!{~~JA_upz_#SD`J-_>)4{&BM=*jdtBB;rH-yR~0=fGJH`AL+3LE9c+$_21Ll@SCsDxPavX*SmG?BumIS{|qG`Pl7XUG$zX! zAT76+h-L2>!E|htVMerqDI9bKd158Aa&7|^y}y=8#0-{2D`BxCL}H~zY$8NnEf;@8 zoSs&43j?&j!j?qj>;(9xQ%{Nds1r71Nx3%CRgCibriGA-u(@l8>=^94SNuPaI1ZFh z^;YAZPYSI_=CX@vdJ2I-3aIyMVq#L}gpEZza{^nETq$qg%*d0mg;Yo>$wG4I8iV{& zW&=wOOB?WUMXOO;6qU{4-R6|eHW$%|7$;$lV>NOyC2F2M`eoS!EIkt)7Q&*l2uymXT(j?;(2{wlRua%Gx&Z?Ru`f1mkk+9ff-V98JR?CNnHb+I-QT5ieelCH*%KdCBih;B+dZ-8= z=VqG^g*IG7z)X90&5B-<)@V^uLSn(Dq`Dkf22L}=P&(PqI0yef7~(fXPZiy{7fGZ8 z9tLS;=><o8)-0G%cfiLBh(Q`S7lds% zNM50Gw5W;qa5$jLcPwDWe#CDj@?l0t`ZbAr70`~4!(5_}o4=~Q-DnXyJD;dFkSJ*W zHowj8E0F&0&h{C+E4SIUSqt5qg~aLj^=`UqL#KN49V-5L)l&($Z+Eub$nSbNne!H` zhJ%5OT`ErzvzZwW3#AxhBB7&mK1U4zNs&k4@-DOG$Q;-x-aTR}w;xQQjnxI2AUfYp3| zLxmI6n%X+rG0rFCIZk{k-7ukFv7m;-Sa#di1d0YE`Zz>^<@Ka@xSr+J7iU=7AjsHK zLB;{irnq6)ah>2f4!0T$;jFcvZ#G@z#xpCDQf@=7ptJt2~XkBm`Cko{Dd;2y*g^K?m@KiJT>!G1P+~$lRDem zu}{RzGB->jsd9G#+BbF%&ZA$IHK$#oHAZW(V?0n`!iC`OJx$A}$)% zT8RO9RP}e{`g1ha$j0_6_2(MzsgxDcy znZS^HlSaqM9UESr-}R;;7k^5Vb+pq0C-(zKf*#yBWo55YgH@$k%5>s&J-l6s;*!w4 zo*(Pr)MwXi*wEGq>4LWI{a7MasKy!+j{;#Xw9N$B41yL?ml zRwCN|I3IwQ+kJZN%gU^)O*B~jI+X7HJUO6R$5IOL`knUtxjePP0Zj5{D&6)k( zB#qoQZsh>srv&6|uaDI99U-u;`zm*r`{~SYMP3gBCA&4b=EuhkRi`awkA%?^EmfTY zLE%;3pB$g1d`uL?lD#}P=cBojbah1%LMO(&a!tw*dzqxc?{ERt8j z{Vs_zv1mL?^Kq*?Az>yNX44?P*OsrbWS2S(Bt`jVaNXx1@atCp>$J}tI7uOkho|gIjR)y;)-%LEmnw_x1@^GqFDjhAirOp z6}CNWe)5-&kU@&OT;!(j3&~urn_E#FDZ;*46?3q*MjIz!Z=wFIk^DFgDR|{+xu6|t zL4RxLf>viyY>CbWr)h>y%0N|C+=Sm_vp*MXH&$OTybyHNB1uq0K z+SWEk=a63k+D&+8up*s(nrUfKffy=!JBX|&+j4`s5K6z*hr#rojJ&WD7qQXgmuadCjr?p5BLt2@p9G+XzNDfNAJ+uilm%=R@? z?vI1%@fuQSvYcAjZv}*o=hLhKX-OjJYuuE6m5Ovm(#$oEqlK%t8DGNt6iH$d>ClMv zH<|vWE)Wm%*Fg50^9Fg!iM0XVwg+7ZMr9LvZ;z8QtP@LS+L?HJUB+<*OdPbTbh~`g-+SzzyRQ>=IP9-WKof*{4VsSmE(7d% z(f*L?!$R0RVJgz@6rhF`o2IRr;SKs#XoW_j>0IfgVJ*6*vSgxQNer{Sv|d_LNqr#h z#LGd6&FQQb;9M`lPF|Qo00XHuEDTp;VQ(lj)0l28I>v1vjo!H&=?yb49x|%qU_D)P z$sZMMKSZHVI7o4CbX#G0Upw!qEJ$j|9t2RvG0GvHA!%l{yZF> zI&n<4TEkCzJ`dXPOGrfLrzZO>pnNMtM_f*=f7 z%R?y8)s@h+L^o~f2wfmZmOO%)wi7DY)yp0#HPO^!aZriJ3zFieQL?LFPPr#Gp+B+T zoZx4_SZzLWOfpTPKiSUOyEtF6-wu?+Kc;-8VGJQJLrkdGC_RRsosG*Ht;f-$Mh0!P z0@)*;RThu=)==5g?WXs8tV=#oMzRwuvDPM=1qoZR7<%F`S z@shsmYH!ldFr|`No{1|=X6QiKir68{Fk{oSTr-Wb88md%3_g!i32795o>q`xfXStv z?EIzc$=nQv$efgIb;~RxMZ?Y@<^RngPN%HGF=%8NcScUUxmi2Jq*&pn#Rwh2b$Pbi z_9cFeNGz%BLFZ3i8Y}+sKY$(}H64DcQ=qCd$sJeb{cE!WxsvP^4JAV=M^u>|Ke5Bp zar-zt2Ada9?AVTkEUYEtb(WVOrhLO9c6?YlNOefaq?1GWIWc`Aj5l<#7mTvBXT*p5 z1b1#-Wy4S<)m3?gP4Q0xJpkXySx)_K+te4yCaYf6i1_L-nOc_9Z4=u00jYY=1UFX!R(5_EG^?3op>v5kXu3aE4ZXYTdFns61D(M^c(^RwAc2#8@)?B9J4a zpDuz^uOm55Aq7kRlpp{qLyE?=2FEcBf0X_XA-ftQx|1~hd%SdX*=6vN%o+nl*+Ze= z;5bw5k@X5es16Zh=05qWv2;xi>IszbenR*wObca6=_&g(^o#v&UX2purVMXR+OscW zlc0MJLoS!&srZcJm{IHN$t%|5Rnfo$<8b+l&x_}M+*f@cfhn6G)RDF^UYi3|oqTk- zxZ_z@r@Y#%u)`A^*Kf6R-=HMKg2d$@+<<)k${UspN-rJm_g3cjLSHqho4P+#+aA_i zs8z@-LcTLFxnGrr-=-#3jf&9o*a0x$sCb%h1{RXSDD5RAYObj^+G>b#hH7g;|ewL|4`+A0u`8Ims_P9oVb*U-pPf zq?M6VuE81lOp>DAk6Vvdevam&g^MPd#?W+*wVlj-g||XbKzK3V^VdW3L(NiizqrL; z?JtD0VYWRi_BcO179~w|IXwZtDCgRIZs3ACdGEa)fUJkQCh_KW8Q0}3XkQM7wFkh{ zx;?zrlWQ4$J7KtPK6w(K^X{XS)J=uynu(w41Q-)#gdSv2+}pQV@@aOjC`GL z4$JP<7dB~KD%=Y-CXWH+38ndn^t)>xg!WXj{*U?m#JzD|o_FKq2j1T9u01YO4v&Gh z0T&LJ5W#022N#QrER~!g6ugtxot-hx$LS!fXiHnZKBp{qmryT3#oEv$AZAj8gEQdx z&SNweNM2g~IB@tm2z1IFsVN`lyU$}(SG9l9HZJjG2d0CvbJ{7&emIkPSK4nDfRrgV{@} z##xjfgBOs)`!lvvX;uf}?UJ(zcCQDdH|LoRJis=O_pR*y2%ntXb4h8^o9w`e=$D^2 z;5KQL2SO0d;XaW*wxS}S!gjw)g+9W=+Xk-=8??Ww7_lP*MT`xa>|UbI`i#RBE3K!? zmt@*)#)rl>8XSV>e}035IhiMI)^5EIpa=P6RcO?!QlSat5K>i~4_+BiQWnX87e<^) zZ|U%w-|{vh;GO!OOOkn)7}8bR2RYyWX-uzuoJkF(Dq_zPjL-J6SxQ09ge$P-+*tw7 zi%aLm!^k~{Ml#s`%8b#$z|p~?EI$%EvhLBQ#WTDM8dJ!bj;qq5eV@ANsnWquK-@m1 ztXrGp%%;P~uA*F+fl3-0KB*LKzrOGB%FDo2Zj?@Ge@x|*b_)Ep8wbo~VcYvt)S1Ft zP&K?1O=Ucp08o{LDaG|==|bz9>?b9cY@h4@x{OKUB9iwxd|!?hfEsDz29mng$%QF5 z_)qEm3*wVf<4|+-JG}|O=-u}X)E zpH&gi$_bD=*CNfetbGIKh;>Egrf8On6OTsp*!1Xq;HUj59keO z^YfIEmyb^=l+jNU9_Y{Lv^}?fHWIW|HBK5*o~#rKKId(*V8P=BzlAaYRNHi) zYGF)tb+zh~E7Xc-5C*EnOqtq-hE3OJFx;#`m6NhB^oGrwu|iao>W2wjebv!q{F9Jw zqz8^^kRK}$I6%`RSt5KG6JU1J>At9F%9Pso$m%ZS78uW`H+?)8PgSTUEe7ZP3>1hC z`Aqxm2v!u%zf?x{_gg!DdB;M17#Ey}d*7y*y$qS^aDLZsC#>2Atf&3s*h+;dflM9E z_WnLblCAp%)m7`^F|@E*LxEVu*apoS2)h5`+D$QuIkJV^*$9t)zm)VdkMUh_tMt(P z+`VCG-Z({n);XQLw@@x7`LSC(!10PidCx?(t<;wCNK3zHfK;k5hZ3Dv`SuK-knUS} z_t=-cZtTOHp^!_g+kU+@Z+Qgh?Xj7Vn2(K93PKk00q0(@v2zP6sCXu}vTscpRyz9F z{=k!hMq+njF90>xGU*!%IlsK$dJXq-(&i63dp{|Ns)vMJRgK~w z1sTj;Pvd`Ju>w0sgz6r8Y@{XFnoeyC!e`wwySiao={Ot#!ZQzN^jTKaM(JbRkMpxw zA1S>Wd9v?b^Y$K^le(ZR?CP&Y2e9xPFDkrBnJ#sr)u>-;GYZ$p3A302;oyn=2{}mj zcAqys4kw%Q_$b5$7>`l`>^4i~%B7=$`{ix8^@7~4kJZLwX-`H#>c%|g3IXLB(|Q$G z1?-5qjko$B`&QOrp5z}Tj1;Wv5|QfoUsYqp{5P^}=P>>!TK+kd{J3m6laJIph4)TF z@YKpOA050*04ipgGAjt)m&O$t()muLvN4Tn$r~DSU6J+l>Y769gcOZqA)JYctL0YA zI`3xy$r-#tADacPx*at2%O8Al+~{huigYawLiL+GwhIp4yY>CV@ysJf2+@-Bj_vNBu1JeF^fTEQI-u&1Gmnv$j1ax3XILrmIIhKzca<>NCxR7TTN zO%oPTR;*0S^kEnyvL9zY@qAZ-AcTkSWpNY^sC?9PoC^;*89SCZ<7B_ji4C&DUn|m;eQ?4q-)=^;d@K+ngw0>;$SS zJ-2K~P4+G9xkQ(H5-%MjHGbOAM>V_M7E|Be1!-1WnA~P=)wl5cik#Us4|W8rl`>Wr zEsco8`uhn71V=N~p&l98u)7n$ z1uE+T8b)$6Ds@^!HWSbA%95arIEwH%xA{<=-4YH?GGRX4#bTv_V&gbe==XFn^S|hi zO=|XsW=%PkpMBXS?sd8Qbh}nteMip?mSc_7E#o|r_pj6_}F~wwYWGg3!H{C z&aq4NZ1@M4`~)8BWpZ6v|NH+YyB}u+W5shvB$fOqK)F*p+yS)?8}!UzWw0w@7Bn(h zGf5j@I#7w;$B2!$a6a&b)aW#tMmcZg(!yzTxhfFH7n>&GY9NhAaUmJAa_<)jgEh%Q zFcr*8$vHMA;Gts7){<-5<)_~zjZ{bd3I_RoSZ9g0&v*KixMByKO67Lt3^)4|-&sYM z%9RS|uUA1*53u12C#)hvOwzs7U{SL`$c-?QmAt2Cuq5S`J>SE?LHvFxb$qHwaAoZj~C9>f2 zup-1hV(4%)doZ&mabnrlXBnid^7(*yLq#3M@HyAw(+&pn0#DmaRPRh#mRZ5rCl4yW zStY~#E!6@SECMI;={x5)E!~WzmiZd-Fh{%?T%uR2RRi%Egomu;Rkl}eLrHyv#?Nad z$pPYN#L=>vp0Qc;%4bXp8XlZDrj`_c_)tQE8l5;@xVkI#1@jXED2cJb-^sr6P@ zURd*qFrr<2x1jyOm#0_)VqkGO9UC&GGBGnN$rhzROZWB7S2GycC)0`MDdbK4+WzZo z@bCHEaVhJyhmq$tUak!+wAtto5D=&&7rzrsfbO~B8L18F6OTe13CE_{O7Gep2;1Y* zR65pBJ%8x~a3cBbMsN^QMu@0qiSWb?eGmKztWD_-z?dmCOCu#@dt&gim3sMIzde{( zuSRtW=%z?K4@X5o03J{Vny__T9pM)*ZKlpVQ^sZ!Bd}CMf|L`W+VTgT)cWYqdF_7e zK8kKQQvDcOy`7;9$X^q?>|oy?wTYmC_B{3+I?Ao^!S%=$(<}(aP&#S z!K-L72Gw`t%LAR9<(kkL2uVrf4FY zd!t_SFIN?7XDRBTx5EJ4IVq;ljARFq9ygSmE*$bpccT_Ze_d4gq?8Fry3iqNGD^lk z%`Ow&C|XgYn-rHA9?dAT?eZ(eEm6-TS^)*m-P+<2^;$?#NW0T*ekgIAR1tMer_{6_ zQ_bddYyxV6*N|XHt!e_Nr9fq99vVbuDISh#X6J?E7pC)13n_^Fv$Q3)egrP*opT>J zlj}I*B=53GzyDAtwFI=*SyY5ly`{QsW=k(zFE;L(3apT@-+$$f@ILA|-&&BZNP9SP z7BdSH6T=#@zLs=Ktu$M^?!1u0CNt}DbfJIrMhr)l+`oOGZ?Ai;L!DmiJuKxqww?K9 zZMFCAC4EAi?u^3c6}%cPzuwm_wUJT3stx?zwm+nv3=76=(@4A9%nx( zY(K{vEoE{$<8r%$tgbsi=CtRE#B(CT98uhMYLENjR>FimxP;EMNtd*hjd3xI;v6Fk zAv=gd;pg2@LFg!P^IDvW`PD*r;%9A+V#-D zhmR*D?v<82#V%&neUmO{Wnuo6uSXjGhUk)Mj0LIYm5h2)rd#SOqJ zw$&W_W6v5clYCb{?!CtS`oGO=@3#hXm9?yKWC=&0POXkJpik8DGqm zNtkYxrkWcx9A*ghurl&|?Yi!txiBxp$oqMt=nX$7KEBYnGV2KZu&3!V0)#0HYtHuGsgScGKio~x&j_5Jc^}w zHA&I>c?kv!JVYTdAfQheytRb0fq*^P0OYdy^wu~E!erqxVZzc0Sb`rF;T}N*iizSl z)lNg#rqBQ?jU`Am6EYK(eo&OtU{r9j^PVXNrJ{8Q^|FN{UE9Cm&=Y^g25gdIP}pz% zqJhB;sh^HX80#}}wx+1T#ayxZ`EqDl6hGAn2fOxhz*_P<`ooDJ&+FoHcpFL*leKV2 zZiHUkouKUks6xK+eQnsg^dKK2-8#jgqxYbJ^rnH95)M#Em-hUlGmNW5Xk^{hJ+*9S zb7_M&Zg2j^s*!OQ z%Fbon$D(=MjoFOPK^y_HpgRFzNx^fF|C@xfVbTMyI?AM}6Fj zKkrOuT+h!Y+Kg$`kQcF_8MR6PMVm?=;NLbJ1O>xn=_ml&I$8?wq zluSb%x(Z3FeCqa79L8AiZwE)kY|y6nU>^9{?&qWpF$f&CW*%UCcE6hVe7KSaGhB2w zcgG@$Io+l)96ZH-=PfM?`T})$_=To9h=c$hQ@wg%Pw3S{CN{_=mTTpZyU9%E=<2LJ zz2#B5>4@yM$UtT;yYrQ~{-Jspz>5{c?|gB6#J}j1p>cn;&W%pC1W*DerGGp9CJ|=6@fWEX=azB2D&)6@V0Ar*%ELoMrc>cVaNoVn}>oa_gGKJnRFVlZ_EC3J8Jn zAG~>7xx> zDZS{&E9{&`Z~42(KUn2ec$*|qSvvT#B%0OQ+;$K4_bZbS;WPY|(TDr5Vf!Xi8mPT` zzd}O|I7gz&%>Z5qzPWBgt1OX%!a^ITk|3;76>+P98d85hJ&abx2Xf;?M)9i1+B`aL zGxMkSx*95=g>k8p_xSnn9lR9bt2f`or6`G5>bIJDkZ>n;a9uRQ-~qgUIZdv5n`39q zS|Pb+;@;owcwm8<#}|{i+)Wd#Ns3GIv4-OUQdKtz;!7mqRce_I{APlgzHgTWlLF)k z!0XSZN=N{+SHx!1+9|P#BAb?0ax>4BkQ&KtzkW@8v@qA-Cgj?629EG!&x}R7i_e%( zp2`7uSScE2`#8NDn^>;^5)dP%t2a|s8{Xv}DC{R?`mK=}A9K+zUDMQm$03N5+H)qi z?6^(iU)@=(uUKiTAi00HmY!+t{6R+kyI#LO2`f4wPOuA%z5>JX5 zDNDo8XDIAbQA+9VX0I(P1j}D5uior-*oFYubN1Qske>Slp7I6S1o~}Bu?-*#GBS4-ENML7$*;01~R58I>_r4j~dPhM<0dW1T&$+@~bkPrHz7Dpq&V652sGq~=;u zC1BnOPUWrLPHA?N|95}>wTgvM-X~iK`5g(6u3kQNKT)YY5QTTEod0Yc%y1g#%8$L(B-kFt03OMMB3d$r5+!)i z-kH|NV+d&qF`-tayvr^1YpBi#r!_Fcy!VjlYh08zkK z3erV82Hg!dTYOn!QUqMUzb2+V6if7=@owtdqd2uM!j|88f;)QsZTWnXUr_#lXw=QR zJ$D53$^^GvpVJcNA9u8A8wHXistiq252O)B?MOxU@i3EMm-hNgY&sZtMMFtHl17S@!f|W+_&z3S_sSnd9*%Jp3XygyFvjyk`8{|Y zgQv{WsUv!%!{_PQX>Ik_gtny^oeL9cUNJds^;=-@ zSH6`dRTzITVIw_P1FXNl726X3R46qpu^m5U@Ncp5>!gHy?)MJZ+FWF2D@0)z^p7>Pd(BafU(l3@LF<2`^oiw@IlwE> zV*V;BJp5#)NKV|=ww_Nt33!r0;*=m{Lqco5O)2>}CG0Asr^qLWCv`(-&StL$6nYjdYc!2-}C!H_b{E&D$=e!Im%q z=kI2$u?aD9*^+P?;m>zcPZ55=a+Kocymv3onI1q)2$~9w2jsUG4tM8g^OA}ni~-!2Oq>V3Mz-2v8Z8%9;Ws z48xtT)?U7sip*CgCx3@QzfSy^ecH5bITLAz<2kK7O__}t&D+Ocoqv~9SyQad!PQsu zY?{x@on)BXVX4l!RhG$C`pk53*c!F2i=F?C^(QbyWm2#9Fns#)h5V{N4AKwhYanK< z>4Nr_A@E{T?2sm$&Us1Tr)NP-VYZ|mqx|ZlFYm3@JDak?YiLym5 zgVG8~7=jv_e^_hLk^uz7ku}($358i1S8;C%s%hZOkWEnq@L!KT9F!Z`xLnTzsgq7o zX3X&L$%-i4^6sIwTPle+UTudpjE7<-RzBW>w31D&RDqao^Q3lA>zjk~ z9}j>ef45xMRm+5Hq_i+fv}nkj`vX(qN$I6c%;^>4?JfJg4p*7?8=}$T69~vu_?vhv(5#*Xh6Hi8g{Y`H)A|3#6BX zt&HJD<>#TtH3&lYB!Uj#fF?t)DU5+t@lICE8C z7~i*Ls@m(xXggz!Zse?9jF&A=hQoVrak)f?d$s`No$nJ%xac*U$q1gD2Z=q30leIO zi*HBzEB#@S1Wr!~D?sSpK=m&mGUMfc$c!r_&8UWW+Rf6-U&4h0N{>xHDQ+lzz!@fJ zlYtkL9vfkv^o`2Hv6e6h{$q@!#kAbr^hotzq-0yR*yr|La-#8mi|VHA^52xX#Qnw; z|0y(bwrCL!dm|W5e&3h9_tM6Z<5yn~yT*TFyTNdm=C1Ct_LJfEXl9^KnbQv|ttVGRAULgbHhM11G;NY)pW{mNnX>dUz(Cm5Od+`} zlOCgF@woq6K+1Q%g0*JJHKEqk59y7w3#)OFCGLH`j=WxVEvCZ5tKQv8!ut&*UUC_U zN2ejA=6LpPLwDZ<$+@N#ZSAR~wQsts^}99NQdHE`UITU$2y1uu%Z`RiZ~Ze5oY~v) zcvy(kF2cpI^((YI?e}Yx77BwgOS-&^B}2c4w3DPU;ue9|^>);;k|LwVmNp{oc;8o~ zWm$LE51d$PiR-g4RxhOx*)NlPsa<>}{+)Hj=9|Bol14WSs@61)nQkPD8g<-_)=%9I z=nuxniq?Xb0W=oatFHS}c_34P`sSzTgccu++V_MrbiA3*nI?Gk2t>is@8|0Nc;FCt zd`|i&G%vB(!UyqEj%N{+oU;NK7b8@^9RW>A1N(`>7zF~#pPPlXZQP5+DRq-6C#(J) zMlKBA7kkPW^Yy@C25Ar|7Ss~nwQrsXUFOJ5$P;8%9EOT!7(ouQqY?j&SW_F41J#W> z5IRhSMf-^11n`4wJ%=U~PIfdm!?w#P#@}`=4O?Yoio6AMDYL`ITKFTi`1u(z0Z=|k zXBQ<0G(2rUW>-$ogmYLf&K4D}W^L}uuv@-A1d)R5DvfPQl&%jsqwmDqFG@&-NvXA6 zefR7p=(B*P=Qut^Xxy)qnmo7HJxLe38t%PhCX%E^?!1>vuZMDckB&mdsi!qP_?b-i z4N=3>8N)kxJ};pz>pGqsQgx`s4cw)gV`>eXE75!}c8#V6^3&RchSHvgQ^6PFVNeO) z_jmmEB&-ukRtXFpvIDztvH(aSqQ4oSIKs8oBLB=+d{4qkQ*=Y^_(|~=hj2h)-7A}K z92=)hXd6w-j!`5L4$L*H2rX<4s!u&xcDwCm9n&KGB3G>KF-vQmbVNwKQJd1dUh=*V zYc=mUKb$cu-B*SwBP-{pc;pcBTg2V_4tUyii%Paf^K29RR)oUGfAVA0klm zQ3!X>s_)58*!K-xNo6YX&>!ENa(=l~ZU{qiqoVa2ZGJoM_sU7^3e2@^g1Y|Nm&=yY zi=NP8tKuC#E&0I3$Wc&YoIF3L zDn^Ovn^)duz-qvj2Fk$BxHWKbdBrLe0Yq^{%!_k-fwY6HgxF{p#Qsx%l;fZqQtWB` zTm#FASft6zh+6zs%LUOHBf5W1GR_rf(i~r5x*R3B)`kRq#VUxSyhux@PD3z6#rBuo z3w~#8i&9r9QMPWFPS@{&quW?Wt%D;0d}QztdLm#kfmQNmaKja9~7V-TGIWOf5lGY>hoZz3&699xIjd*g> z=c;cQMis+FVu#Dt5@?yHCjaaOJk=Fen`*ChJXBs~dGJn}M{?V$zV@TeYWq*KX}9x} zw#{CFoMXiu7Ls%w>n}f4r>H3crAYj_cY<45%$^P&QVU-(b~EPFA9BtGiXSceH{s6d zxzfRDGs3vVv5%R3jCmbJXBlcp$KK`P_TSEgN{i85)qMtx?v9b2O8hE*34{l2!0}il~V=rkR3(HFYens48ltS!P9gW~t`X{~t~7z+lPN zG>x`x+t##g+qP}nw%yaVZQHhOPg`F<=e;+7LDjCcaz`Q}h!;_CuEhgi-{K=r6dDWTaa)a}y6L0##f^4d_#2*&w*%zj%+2dr%R2Te|^3 zSD7!LC~2o={+D|B^^q)ih!!X1`#th6_3SUw^$wcih=R?DBjeJST9yCxt7>8*NC)-L;tCnal z3wSv#S~PLMMbfJ@3bK}>RmytEkNIAvdDa0*srFdWFrS#+xb8kIBW8k=XU&nDhlna% zyp40+=a`&uyHiJ%C#LQ;HTv3!&n)RZ6nW=1Et_}FS#5yF?3;a* z$4vbA1*aX#h9``(3DL^t)`3OweMetMlX$dX^vfAP_Pp$ef&CP6pI6%uOkQou9nfqVY~iTn&k ztU;-e{^sJ&hcaQHm2^Ccnoo__9^G&@LE1e{n^E5`PkZ3S?*HMJz8ImhV+biHb&Dsj zsR4o^a}LLmoOh}+O4q3j&BzuTGCOUQRgIzZc^@Bn$F|qNjWS;~weQpP+3VFx=b2=w zO}&5PbWemFCpJfaZ`=*Z9ga#Ykv?_fDqp@2hmX7PqWJjd%e zb2FGMs|7f#Lu2E2J2Szm3**JA9B7aD`%V__GE`0D0kG!~{Y4vni+zn*a#I9l9u+p|x?MSNHp?*hp zP@B2Wzz3D;M@qj}ZJDH)_4lTp)x1hCUf3*=V-_SNw%LEm>m}1*Ehj(Wm1jR2%#$aQ z3hjiN!rM!a8t0CE7*<*mCqQc8t;6o_svuyAJTLIJt#+v^7@E%%ny?OCylKXDEa-T+ z%)Z%hz1egsTS@x0i25Woth7DZJ)Dr{-VE~G4aLTO+;#HQ#J;UYeca)5jp1``okXF0 zv~Y%ndi@V0*%$V`GSJ2S?O2A_Djl49s=C)pIYOvSx#}y3&pal7D z3Hh=|_2N^?#)6ZA@inxYCoDiOi(ms=7V&4GzX>r$mMSP$%u9zCmM2@=r>JJu;4OMf< zu8Ytv9b`a)Y$BMQd~=3}RH;n4TZpp9@;PPeXla|`SIGopyoFE;Gn<%-H64dEg|CIU zwK16IwE=`~IyYOlq~DplOKou{kDC4}$+~6t(P3*yBtBX(QDVoCHzAR->Cx&sE9|$p z24i88tcy<~P>o%OstY%Ho@$Tru&5Uw%V`Uw1v6BskA-)bZk{QRbv`HMkcQwC3?6Dp zG+T(Ct5s7sPGCw{S@GYKhH&>JDUX3}T^J?%+Q=-+2Z0UjD31py0jd-#-HGN)F zN1bNj(*8)(d3<7bS$3>FG*6?%v_@sA9c$fv;o?+VY`TRsK0ZA+GbQ6xzs7yqgViQ3 z3BEt~FMdYRM61g>hR-c4vV*8jJ^SG?iC;qFxa5al#w2CrW ziRZ_mr#djJ0GyzcrQpr_5erLLyfb4OkDgW-cH8I1hU!ZR4mb8{oRuB|gx8w7GGAw* z@nY+sK91b*`RMD2xWC#N`In1zTu@DU`S~BRpm-9(C|BzU#nN;n1#)j?T~)&nG%a3O zcp^W~;1-p`U@{n;M37lRCU{O@}h-Sc1gpnNQ1g=0R{Hl&;6NXec9m1DK-dnbkUn9`mSNEd#J8Eib}G-w(t3)p zJ|1-NKMJS0KD{kC;SHC0%KjmWbxg~Q;U_}#uLzea z22XO9;Rps(v@|{niIMlx-98pN!oy&8lbD1WUqtK|>Fg8S{StU6P({#*9xs%l8K$Fo zowy5cgx+xFWyAkioc>^8^PckMVlbQ`zl zO_Wx{hoJ=|q#gg%o`KBMe;`Or^z%|3peSy@DJ<&y zdSDZ`vvqjZ4PB~!UGNfpfiwMi`tF~Wd>gxH(=3aU8(bakPv>4airB>}PU7N=i6cq$ z%KE6*=_7CZnQ65s-Uu~$e#t`k<4{Exc|*{)>;1?-8nv;;Q7$MCN6A+mADj^G25-V! zVb6R7)2%~ohyw!m&y>$NRjO+)yJLjU4fFc=Q62quGLsN*wU+|DZ*sJUtnNvux7e(z zO*K^Z&7Mju8;Qx;$yAP7=E%CB~M#*LPgE~~2}a$la6kpi+&J$1zy=^c3sa)y%Bt*Dln~>}2y6Ti22F^hPzmAwAoNuKE@}V?> zYpv7>{xm~Jr|;J|{p}Jeo0^%G!9#q^&Wdafl8Z&uoPLk6tPRYjJ4b+KY7k@~XqLq) zg|EMTAHEM2K+mIJx-c*j;o<4RmX3L>4&#vz+2I7ytC=6f|H3R|9%&7di$=2^Ymrl~ zlvs~qTVm139q-^ZOp@6oYDyY}%Wa2@ma|V70X%{wuR#CYr;G9Bt8DXa8)GYEIZ3~1 z+4qK)oQTY3_n%(Z`5M#U!GqWTUo;WDHcx{z;$RKHHesdv*Plf-ql!fl>%7F#G9j3R z)(N2xhPoP5gm& zSiKDlx}=35FS=AiG-11mxX)}~CYD4Wyx(e8DDV)=6dy;yHMFv8L?I2<^zE5(1-(K^ zqzv{kIa25VM_1N)S9R5vt*he4iYrsjV1_g{F0wCKm~zLMioZD6V<#otQH9BomHF{c zR6U~Pav!u3@jUk(y+z?bj&{eBFPdfb}7_W zzq{VT>|v>})wMJdZzlNjU|aZP3>-#)q ze(2%FXf(07euaq%EzbfIj=E#_OKeN}t@-X)EH#AQ!NlrI2jJa!j|<0!agnBI6K;{s zrLO8K-CcLW6IIo+Y_1q3FGDZ%VAloC29F`$zZJ^?If*cH7T~5t3@7-3l?=mL{IR!Yb zuNS{7O<0GEPkad`Y`3V%^h(6=mP2omgl9)tvTSzlF%3Z8kC1MhaB-i()OyamSpVHG z{U#)426ugmmq1t$8gSk<|Ar`{Zlxf8)t0I)8b5a|z9(lVYk##E5`4M*%84*hvtaZJ zp&{*~s78dQ3xFT`rmuIZIkW~|kgQb5hl~kuc;LsT4m2%q4|qOtZhJU47ntZ?Lb#n6 z5C40$(Dq~&^zv$#{>AM5bn&q|?Q6|~T6MVKBO4(kRx}BxvW?rDV;q@>j3AUhan+nq zH(x?gaww1--CSiRdcx^D-`9jy0lBMi!bJ8|%Hp@FFy;+Ikq?E}>{yabN3DqXx# zig5GO%=!~PMRe9cQr_4vRprO~Cp^T6aS?cUFl8NXB!uvHEqpGjVjBw4Ps8CSlz9fH ztu#WcM5@wY@J*q#pzcxMUSL^J*X=&p=B~#<*~lJ@D@x~{k0n`z`lFT2941hvoh$Vr z8#4?#)Zqt7-=P5Ca^s>Me?iqX8=rIbAK;h^FnnCPD&bb#if*IaFRh%-z}7dzr?gIH zvG}g|2WATlLhWVc^v_YcQL%Lcei>atm%$GX z8#V2W{mG{Ze2QWfz;7N@}n)@>l+2T%x4h92jyg(hS~~!S|xEqcl4g zMh>2>uF!i!dIHq5(Wkqvzn$Le63eq;{lGpV<8n*WoxoelGN!Lrqq$`9C&bw_D`&@iVj;O&qe?kcg3&xeDa8KQEn}$m7lX zch}gU7Lb>SPycuiwWJ5>czu*|I(1Wy-ixly+nqp5l!#!VKzeg!(D%M@gQ;~GoilvS z8yuaV88@5&ZR^`9!#=g|SR(RdGRhwsJdq*ix8(Q@$zP{21Rz{#*m~*Ok|AAV6+Lvs zK2~cD#emOJGGkd4uGi-+ho7KO&6);9zATG;THo@S0-NM6;qfnSRXe7E@UbqIvc+20 z{!T9w!cAd9p1K{@Qi#fx`LZ!t58D2-Dv63*(;W5AWy*WkZqoAG_1~#pT0?NRB}2F% zU5vffcs?ZkW9pIt^wj{VyX55YCTsC|4AIsr3cu@#oo-owL;K`nIAWIRh zU(Arn|Ckn(4tHl|&?-!J3Eg-WPNrP+LLgrm%(qdn6M0lY|5}?-aC3q8_KH8!s-bf) zQl}USk>yxP6~D}VbHKZJpd|Pxa|4bZWwT*g_Wo}4k23}*4vPMNp$Uq`a4J9-mIeqe z7;c~uSy07VId1&B397QJlAr_Qjqs3Hton9x?=^r))!z2musQfcwG^o8ld(Aq57zeyACCue3=jfRB}fZ zX|-q>6Y#$vj6K2}*|%4(RxO-Y*U{0@(9lp&FhCH{s>H|&a8YL;31A1yQ+aDCVpdYwK;_@y`EC-CLPE%2QZ$V!SxoQPOYtq96etl(;?2VuDL;y ziH2hN7Q-F{$=K0hTG+K3lK7iy)!cD#cd}ggPQgHGl%ouK7M%|3w_B)X_~gCFg8Vr? z)dC|!CeeTLF9nx|E9;MwH)RG7Of1r@_|$$4q2ut?u8i$I;2Y>6Vv+L?*6A8Xo)HFf zLD&~0dWC6j=lSVOD)lCWFWbVG>|C%sB)x$T&8=wTQoa&Oq`j(=9BB$nNUqk7l9Nxp z=Zqp2^}oV#_}L4LZMi(@f@e{0yfQ%T9AZdIZ5V9E$JAE?U`H6b(c?dE_|KLEWWbsNfM{O>8wAv~Xg zm0MgD$%*mq{tv*SiQjf1OmV-p(@i=slls@tq~&l`PW4umQ>bCVICiEO2Qwg1C(TpE z5EBJP#@3fKnQ*!#hz(N+$A5;GBMG!Vs%VG1i)3HJ_$U9aj5C9Px>idmXE`E&hMjDw#xUe9qKg6;*$$C>MDXC?ZmB*^k0*egZKp9s* z5IXgY9r8);tPP9f={qNN?t&#G#!wIv00zjA0D>6I{iH!c00So&xPs#7D&~K5Ocgh& zl89(Ygsb#w;W+l|8Z)Vn6+F^#a5o$v85W56${a=>A|eHuFP&cRTnKnTi-ebgd*c%r zuAAa^?QYu#KIxFr2&VU0tPWWNA!HU;v(?$x1T>F~`?jwG1P`r&3MJ~af}u~sMp6yx zZ7ZSy=z6(P|x>@i8Skp=9kZ!MDFAyrH%MOf4#WcMAEQa9T5+a#$t0g>_McjC|J>qHns5J znDyfq$;Y2RcyppIA=q6&j$n|{?vXc~^73xpQ>^iWs7=-?p^IYz+a5P7@TXvhtCkJ7 z)fGmKk)f4@t+bDGSDG_9Ur<88syIPCUryWeu&5ht&2j)QB^!0prMccTG>9tw5W$R^ z=%&S#_yFTf`gY0*RP@N-94t2cXj)4BjC{kOG#{!76F=V#{o*Q{(u0scI1^L=``qOQ zm!qO6lnVT6!8OY5MgPoEf{9S%tdFr&T#l6a%2uRzGf{;XT=o|hirnGKXsph254?DU zU)qmPC)C?=7l6}MH+l9h#z+jf%*giVi$4WolqH|#t5=FF6h9cJVAfTXM737J%`@y( zfx@hSrHOd}W;Ww+b7O=m!Vk(z7G_i@jeycguFaW~PN}crJ6rYW!3T;hgjD^muRaa_ z?~IwV#D@^T2b+i1KRRtkI=*A5z5o~-~5<`T-I*gwg~NvrPNux&OsEriW+3wyXQxALhTX z1NI=%sJ=2W8M?_a5Q85@LHCf6P*ld2-x<;6?XyQix!%(=Ib|8=I;`DXcI{HZmK#$6 zp|s0Joa7i1+lps4ptX0S^Ai{Y4|UGT3>$WI*ya7+?Wmn$OLOf!jcEP;T9INxZUIXT zdrND`h~s`AQ>&Hhs;Lf>lL^QjO@{Dkz|Z>%yc}&qS?i_7$OJ3G)h3f>`03L0!sNFQ zQN}ElF6F3&Q-=ZNlAIi|M%LP%Y~Gmm;@3X9swX_=Iv1hZXbqc%2Oh5o6{DNW3JSrm zg$^sJA!7Te2^R!~LkarE79wGG~Q%1sZ*r-e=n$(P`156Zk zTxg`{pkj05X~#+C0(nHuhlv)?pjqI6Hv8r-0(zfg%7AiW?AJcdxHB$J;*5!|MkT2& z64ZbItAYaI-HPhd6)-0+8VKO&yL*-$&*hx{Je=L=(j1RddoKCk!_)kEQ^=41d|x;q zdUhINJ?#8mGylV(dN1sv ztOWLn%L%eE&uz?4x*myR-7`R|T9hj20aNvx@myU&3pVL(*w7td9JoR#_;j)OcEb92 z4Z6*}g*@BPhdo^S3~>n;27OcRVvGcdcC7=ps^9*Z##@1Rs}L|I4j$tF?-WF@1d?Uc z7Tq$xo!3;KMVgMLE+P9#>Z%41cU3WapQ5?W#y;G1SByrhk&=}wQ(;PYvKZ#fRC4t) z055OUWCK&C*xx_W&g5#v5q|fQUig8 z?XVBva7i#Z%M8TKtPD=0dZ#+OY@N1TdY!w*F%l%Hmg3_z0&S@P4hG1So{y=X<`viY zU;%PWF|7CqYq!;*NhtkMW}*rNg3SpGB&)no4Ai6;X_Pq~7xd5<{DITyj(yq`w}Dr7w;~fx$CHW7aO8 zqdmHV z7Jzq4r8nl@$jVlb8A*eM5kzT%5k?(oVA3*}DIhY9W6~a^AV$oo6Bfl|x0D`98xP!m#Oo9QIU;bvjV-)%b@2`XQXNkx$Ob2l zG?P|&LNLL-O~KCc0ZW`z;w>&%x-R~6jX(W8&$V0e4Q-Q$-jdL4ax8RQ4Q4oNl zDjUNj9em7_&y*LB&?as@H%0Ph8`VyBw4ee~D&~%3qGOW;~8A3B%tJadvIlW?$gChlFK^xZ$64#8`R z@KhWfIK=eJ-{CI`xK)>h$$?aag*|${$_Ze_xV{?2;C*k1z^jF7!dGf1-{puQeV*0u z=c_miE$PaW$EeIN`1majm`B-Ep*4mX zG(&yt-wb6ct^O5vcN9GGvam8avaye@tA+yp|ATlefqPKBdZl8q)Va1hIsVN{$y%*h z-f1at(rS0gle6ZG;HPit6!W@yl@ivW94OA*3ajejk5L?a>G7tt2AKIn9ddO+<> zIHNE0Z+GyMj#z+8lw^&3fR5l4e1Q+XpgDe_3HD)=^0j?vm~sr3jVtYar~&^&WqA)0 z1{2M5x9YJNUx5*k%LN?6?mr4>8@AJocw$C@O`+Dg{jH)HbonIU9kLAO=-9$M30nq) zSEhV=7)e>6i21xp{$Xe8W2uL@ED(urn_Q)bLNL+ZZBYm}j1pn|pZ(;|&RbGF%romj zVl!sj;ktf_T$1PDC>~Pj6Czr&tjZ>CK1jM;P(5oSIDbU$4D)5mQo3xX&TjPSb~1hx z_cyxIc#PPr9!PYfw{n3*JTfv0Q(d#Wu?C@r#Xb4Ir=`-j@@*8l8yT^>ZiHvC&x@oM z@PF3##`9V@;iz9d8?+iSW%K`XY@Dfv#0u(tI2RZ}32nWdapBeDf zh9!aUR4FZ=?{nRd=~gTcnqk+5>Eu^gFshMyheh2uuI)1+?~gL=JxZJqJgUmz7`S|W zjmejqYtYQt=D`O+Z#bPR#|$~@D~j2RdE=%L4eo7Ux9g&?x*7cMz-u#s81*2Tk%tSx zOsC6`{SHW;^}KO(HSiAdT}?zbR&&>%uNX6;KbNrDVR{P&F3WhbZcWNAo{0W$PEdE| zvtRlenUoIy`{(Y*AkL+e;cmT|`0vJVz}s4V)7-fZ_2=}i(&vwLQ8ie978N~oD*fIm z`w+*p8eAALLv#k0JZ}{bOg(5+Sv^w(IA{c6PQ@)|B2$eQCa8G-bR^1^mcKKHvCC;V zKoL;%wI;Kl`c809_+dFRyf~0JLExRDMhcjT1oRx^b@yWiY0g!*IGlZ+8IboA8oQ__ zD~qDo(m-a7ZVWFE5s%n&I?~%T{USR{;}87?5uG{GzN5wbx_iL|&j7I@YQ}liW#lwW@d575~LNu+Dvh9Ib~HJk}ao z@sPh@Ap?71(9RCDaWv6xnw7*UCc|$$r}AQ=GgQ-aTs|6$1_v_t0xeTC6y&wJgvjaE zO|{64##^UKe3Lz1SqYK%`0u0(ye`LSwsj4Mn%lhNyl&?YtlPMSeWZBYk8hDfcIGi< zE*lQ-vRs!9+s_|z`dx_mh4Ll;H|l^U7L|dybiZM>&^q!CdI6Wm?z?srt3)6e$pGpb z7c7OyIQH1dtc%sN(ZJ!=8r28%-NBx<;T@?FK(r$A0k+c>iEqNtx=z?wOYn{1RSBse^=@eG#4^cfPp^Ql-0~IUdn4_?*SR$Q z$OlErE6tnPo7mUWfQjuirs`L0M%8R#kYGXXwAoA$zD$dh4#mYqZY`^W^OJ)A1pjUa zjRah}ME6~H0Qmp@w2-*8s<1bZZH2|j`M5|wM#Q@vQJO1pz68KEUGQ)#?Z2LVvWV;C z&zCTV2#F@*?3L)BFBk$AMI-FAX^gd;rR{qaVd%8_sm^Hs=nwegUIG5y$uF{_K8opk zvNy+B`^vfJPCERl4MXmVn#=W=A-m*5lU}SpCmD6yTrSO7U^hd25id}3>vm+qNB~ka zyiB&=n|qGbVAx_;opw&gnuQvcx$ zsPtS&*rYKdWu*R#vb=KR%T>i!otG9$NfmaN22Oady43yJ&fN*2K$ws}p;WY>ie!?7 ztwRt@*H7XP>%gZ4i_9{S(@Fw+2FA^_BL`O5HRpz?IRkpjhbj-!cH5n$>Mt@ zbE2BlKd1FvzrC`Zoj1`8&Om}=STRJDD>ZR?JwgN8k6*VZdv+YR9gowkfKNG2>a+w1 zSOF9PBmluCk!9E}{Z4mqYLr{SV(@M{S4zU*JRq_%3I@&sD_)ShdawD`-T(vW;BJ+0 zdzlgOKKz?JR=Z^Ml`G7~7l?N%n4M(}_PFyBuP$u&En*Lgw?i+ZOP@e-XRNAg<=omd z7;47DE=85A&u~3n^8#-K{T6S7H?~SHHyoQYh*C13yk*&rUx5kg)`t{m1thZrBg>O` zg~%Her7|SVX)FIa&0i}e_DZ8UIq-fR3vV)G%iZwS_jd%Sl(Y;>fAm@0%F3~$bNvP{ z5#5=H3X{DGr@eN-M6SRu_gJiOU4|)-ezwR+cTAUI;)mqjZe*+B`6D^wr?LflTmu^1$jTQA zN_`Y+v8XCtE{vhGHI&jd*VH}##?Z0*>b$ZO`K+1u;Ni!2>vVmKN6Z{f0hdIfPorpJ zE^9u--0tE$6MyDz);8WbzRC=VZ83CujfrSB-J@g5zH}xt3b5+&xixq(=zIUPb`763 z#N|Kb>@h27mdpSsZ5JOGJ1O*Zw177`G9PNCdw?T!WUF#{LY0YS`aD9tXW5s2k;jVM z;)Tvad1)g?;5NTFgS@nrvgTI07ci5_4{ISaDJ{zW$aD1_rAm)SS6-Xje29K>rN@E^ z<2RG``n$FU#ZnOl>+b^cPx#j~rC2VFS7e6D2bB5&SDHcP5E1emggCRUbGK)#R}y@k z;qb8}YQ`LQMY+`>LiR#72)G3hu=vg=n&z#si}^#GLj2dc2zRoiZY-F6xbCoDYRu)=JGE* z|5uA*OvBjO@%_1fk4H)RYhYeD9^PVY+3WMDl6lWL+7HpZTOYFdkTq{y@zjsCQf>R7 zWg}4g2?3XV2%|cL|2aO%2Ze5RlCST6mwOvB=DJ+P0BZnzy&9O>U@#q^P+LszrwN<) z;gIrfzeqV`&e;;*oqMI6>g~Z~3JL}`qG!COVAZMF%W87iQOTJ|4&eEE@T+e4l~E6R z6%@kWKP;)f3XJ|oSG&b}oo&}U31ei3b&u**f4PU5Fdi|yd*ble9@KNss;+fylGdsI z_~XyI8)mEAtKUY*&Ki6L2L5_E%5^#?ue!RQ2p4;6JKpF@3}TCom=-j*l`KWyht>Q9 zQ(v`xDCG=m_h-_LzCSBsxy>H@8H32`?+|<>K?0i&A_SH3%-kBdG;W1-B4X z4OOb_LID;o=6(tP!mssfR)QY(cLN@6_uBw$nrz=^o|W@=;E!boiV}5~l3_{@R;M9^hLaJD@$G1XTmZDY#$NIT? z^H58>#U~f=okNU)iLHj(!jnL!-w}*c+$$abo`1RRX`!(NO}7Y{OQ2CSu1eXI&RjFi zY~UfkE)i-+=xzg1;mmB*BY{_7tQsE z!Z^y@u+Xo&**5TMpq=ZTz6#4!G9;T3b8_W~1B-!h-a@7oegrNJPJUh*pu_V)BiG@b zd{8=nN6Y80wtBK+Qi9{x2<X5FNtophx>HzkeYqtZpwZND)Uw^NEW)n8_Fz!|) zQmdGMc#w0b!9c}*4U}7)=nnWV*Z(QAWNF>VXK@hX;yO?(Nd!b zJ|&Y=gU3X}t09I25_}!BwGHdlmkl?;Nv?kAkTu@`0O_7qkO)+!O4&CsfC>TX@Ppc5 zendqY_1=3$O-_k>s5Hn(p>71^3Q|jC@L&BdP7P3J3137g_q0`qy2=4L624TxnI0@$ z+3cV#ALuvjy}i=-zWo=I^K)Y-X4JnK5+^!Jx?AiMp>z%iHnIy0ev78c@&0lfr-2Cc zbjhok>bvq?4T`|6%zmDYtl%{eWTJ5%Y=F_Yo}H7!G{pwSVLz<2;oS>~=k^ULffUr4sTsV4w1hKVe*(h2o}4=ItFM$B#0d;KyocL5V< zXAQAw86Z)(DuyRz(x!gWr@QNoEOQC2Wf>@?E;!uLDWL$pUjCDJHbIHg%FFsNbMBE6 z^lUguUu;yPmCAtx10Ay2dmhED2nFTcvXcyY+~wZehhK~3z5J{qn(i$!ItFMaGPy4g z-Oq=Z4ylBiT^3G)sj*no)kVxzW)jgs-@c&ll%19{8@whSAtal#mxGZcdpp9;gn$^4 zSkkvd=EjQ`o~#x8dLWPF4V}(DllO>cTV$M1kJH7V+eV5fIqdlK%Q0fD#+{%}+@k=BF7(j?nEj_T>k_HQy zzqdVcKbyZk=2pDclT%Yy8_ibg>gm#C#KQ3;5=#Jr>Rv=S&;utx=VsTtoB_e^5(vLl ze4&JTuWvU^Um6OZP0PCViIZ8U?amxGldi+xa8BzTdsZ^lmF`l}>JvS@#;}0{%VeEB zC({}BsmzE7P=h<84G#PAEKefBCP9n_F>KtzYE%hM+8@({M;OPc;4ZS7h5)-b#|-p< zkQ$lLT}8j?;WBv>V#U(5$lBUBWs7 zgqD~`#4IbafOoR1CxwI8tWRNu->>dk?|k$^|C?d66eV=s|0{Rx{ob-B_5jK&byDRn zk)e{hkfUl2{8jzjz7*UXjzZscKZN~0n&G)es7T@F4Fa)-hx?Sg@UK(nTHWBjOy#rj70QvNRM(KNY3UDs75 zjw4LTT%c-N9>-c&LC0My0%Rb`_6Fn59k(KUqj_iH(jO=9w@cFj9|Y+vR()t*tX|TL zDR7`EM`aucTT6mjQ>CVrF;Z>^tYTgQ3$;)egj3B6LTxr?-EjpS0*DYv1at5(?L8A{ z+(i%;W0JqSN#M6%INuNdhWiqSux_Q;3u6PccqDHWIT2XMu>9ti1p_O0%2dKy&90{H z1++N2y!ZN>g=f0`bk`w&_RAJR=o;99RW8cwv`n^NbVjcQgi9vi2LEpyXx;Zfm>fdm4GwbrkIRsC*u zD_(1N!ZX~WokUeSbtgjF2EBpAK_^(6#G7}g^Z`cZL-T%v@qUkDU#Fh^ooHS{ipLb= z%K^@+%kSjrzv%@Gx?UADnaZ6QLR(#qCB^+9WNoixf0V^jHqN0BA>P@*7E-gZ`Zlur zO!p<1D_a-|hlvEP-|}0=H?8DHvnSTl(8he+Y?|VYS8}|UFXr-MelwCJNwi~uyumi0 zh{WTU&1SLvVMe2AuZu68>kw1=-QP>l9Sbamtyd%gx9G+PT-hDq6UN~~jMv#t2$v4{ zZdCP*sQj{x5589efjQPkZ}}w{ii2vlXjXKAnPX`{yW3#jXdW*GFAyu6>+oi$0r}H; z_xtRzBHIui%{S*WOHuFAED0Uhts+X0zRz<0tqsHjqg98Ww0yx8#%Uu{wfb)W6^+od z3M4VqP_=HTV7-fEP-f|i^d>0PYL;0#ojiUF)gOnx#fcMp0qL3xSo+9cEaA>17J|I3 z*cU$&-a@}ynfw|2T)k*|ZzbRW7Fm=IHqg^TeAtxpv@x}nm;&}1o?2N^6T5UN;R^)g zQ_J*$2co*(2d&j#?noo<$DrK^nUe#mhYKE7gHRhQqBaf--GYKQU|NP{DG>-#3uQpz z%%RVvI_*_|wWLL^*KNQ*+a3~;s~wxoEL@*=wCHx|N!)P1tM(jDU<5$nR#$rEs|gev ziI56N1#>knn!?B!2ok@k5o1sM+hJ@AG{8t27q;HWtE@8rUf^P%DEX_`%j|S=uiyOqVr$Nr^%Dq zx%6Fm2sJ7nQZIAai=P+-qRXsCXqO)| z$d=?%J2@>@VfTC7FUry%I5;-a-!0Z_@g3V%>_0jeZGN-O1qQbFGdU82)ep`Yl3;Y1e~!#wnV<`QD8JX0g8E1L4UhC6HE@)4%>N3DYCPDi+M=8SVpp4_#;N9l z#6Oz7R#~JB64lBR$Bw;8G#~*eAsRO}@iUN8Lm)r+QdG?T{yLujxV4By+eR1n~S_r%BkCog?{(TuF^GwzZ>5W}BR;M+7wK7B>rJIXC z|7;-JBjZ_2X=&Nm+}0aR@2(L!w0{;&GNm<|Oy@frZnf(t8um7EB9Tuq&0MW4Zrs=XV^3vJCJ3xW6- z&!2a~KLGgJ8;{~Eh=fEU7C*i(>3g(XY$lhXs-&yXUq=IF{l_X& zxuo^kTXj5o3)m^y+y}}*?FN*<{4I6Hi?n`sVe^>-5CG6i1{v{$v#mKc`$>nu@N#Gl zZb!~7JD^Aj?j?ua;fYWZcq^{M=QddyK^BL?<ljZZ8|}S z(SYw@4_qQaVd6BEzqziw*yg@~3~|CClQ@hvV%#!CQ#8>RtXf<<3azC~_z4UXLJ}R3 zfB;$=4oy(MH2nxJC-Tp6s+#hUu-Ib;+gZ@lHp4%)ty?JgK~0?BD@q+30Qwb}S+Va5 zLu#h~=(wH+j8>69*z2WQ4GLX*!~%yI`m@uhA246R;jI5Lam$p^68DIXi(6X5`8mH9 z*g$#>BL?-NLTbib4B^vTCKm9dBj*q(7Y+Mj?TpI7mg=|eF#4F0bQ4ipI`*~{VzM-o znbU-aRqEuCGg%s=#M|*pAKedk7eNPIOOv~A-)53uRhvu(KuT5D;~w-(&7uK5UUCBq zCQ81AQ^AsK52v^N@V(UJN=1Z;Rs~Bnp+$=_{LxK>^(2vl!>7#URZ88de1>u>j(>k6 zH(h)el`jy!8XL&z6>A|*!GbV}shkOcMlYfWblY+m-3ovLDCNU4-xdWdB%Hqy{&X7S%eK5Gd53hY^GO{%PG-y;8!T;7qHNs zTKBBuAl4+6FF%dIiPLLEfFqTjhP%)KKPqV!^z4F?AW-^w_;DOyq?Q1TK18QyBg~+s z{feY;(W>)~5U8-;9hL)}d458*YJ&)()w|jr1(;D4lvF$a940cx=N0wZuL9hF4TjB*#%l?(_sQ`&C zYyP-S(qCw~{b6R7?T`>^%V32UdGy26$=kXqDymG7Ildjt`iIk=l$y@Mm21vde`rjl zm`jJ0T(H&FLXaImY(=kLJB^vU=W+?UZQsnZ8dA#ua{gYN?yi6R&5X5vP^|KCPIHHWVsn0gS z;;Bez|SZn%!NV3_$Avqj(FGbf-96#BoJ++jt)-NQjO z2ZA7q2#2IpVNB>ASncmsD$PASZ6$2dx!)VFOG9}iAuP2@d8yM^tYSeUOa=bzFFmep z!!^Y6P)}y0lEuWVjg?RxZUO8#doqa(dZzbHoRts|_ZBAmc&0eL`vRnv=nEl!5=(92 z>MEl3!|}=AhL1v0GWrsEn?0-A`Ie^2eVuz0eCJDR`LOmCG-f|%xwmQ^x%MSP1FL)O z`Ur6q(-TMNn)-}s_|8Q9G>wbY=9b)~syJ!R&_3k28+d+FsA&fKf+mn0)+6>6F*kC6 zuq~L|-HtEw)f?SKmON?;c)jT81Or0QaJl$_%b7XeSP_|MaOrd~GEu*2mx6!J+x+`o zKM!l=2C?08s@^SzP{URt2GyfRW9E3DuGzC|p16Z3w0!{E!=U`ISm3vN*c2dxjk_*8 z^>e4X_=8&qQOdb}0QXlfM6&!t#%ZJGO7+xB7`5`pUE_1BBlsYwBixK+6LoSu=RE?0 zmHPV59rJf~Z%!Id1g;qsSx^zU2_GkJRh#Y=R@QR${IbI!hc$`+3Hf_Xdnr0?>#QG| zMCTSmsN(2PoT7o5ueGY7(doLr-!G|EtIP`zPvDe|n?%?n_m*)F^qbUMn(OA7x}y7rBcDiK^Y&D@7fqHEF)nR!T#Pfx8;ch{Ru0T0JRVq3wqk&*c<8n@B!{h@S*G)i zfB7DKo@S!!%n3SwNc?S|)CN6n0oniizV2u%!pYa!D)c6dnw2F-%x5-WX-FuwyrSU!$BZ6*31PTaYWwD%SV9#|*!v2t+ z?=EFlj-7prN<0+{vc%YDIuENJ$r)NZ0q__8+%4@{cLU&tuV%>nw?7bAq#%$6gFLtURBBQ8@-jEOa7}P zK9}ZY6kN&F-B#l%v)oBv8WcSCuvAC*Y3ZsPrI26MEHU21Jh$^rakc8X;_mtVi=jjR z?-9_~Sg~!Loc#;=Ebw;4u|RI#QarmF3U&1VsCuU`NxPs~v~5n?wrx+_wr$(C?P=S# zt!dk~d)j^K`}f{wpOY8$)Wv&ISWm9Z$czYi8+qQSD`8Z{OwL*RVe1C-H>$KoE)gWxtQ(|B>^v@pFrb^tFxHHX++D z`rd|>@7L)OL-p6Yx(^LaFx*PKI(YA!cWKbR)0qTu94t@a&!`ZfW8=|)fF}Jo0ZgF8 z{Q|}R1rH>LYw0L0Fv&ejz@sD5*<=R5gyE9c7D+e&4f3ieiQb5@`5+ z()_(eSJ;K5fRwXl>mnr_VwZ#IQGZr!NcWSn-FWybV-w-bTYLw$I)9}ssD)Nfi&!_D zEDd-L72PLg+B%(Hgjl@RHJT&iW3wbCc2*&fp@zCXw2Tgi6tdWDK;dDL@0Bbla2}?= zv3kaA5%ma?FG=2Z>c>w>4If;_=wG8QzhWH0xqAGdcON z0db{w3Xm#PaR&D8M^!NeiqKcY3ard0f+5KAP;+7qz!G8Gi@8%BUMSc%`nCDv#>oeVk6(ttJ_z!(p>Mm8y6Mj`t&0jQag7HW zA&=H5h?#hh4bS?^pk}k`R3E46hl`S3XAKr^3Kv4`5@@P% zP@v*%p#O@3BH&jR{RTK|ch13@Gy|3v`V9Bf@#Dw|ch1*}3V}vZ zbDCDO2{|p5qmcSQX0pg5uyK}PVVaDz-?iPO?|L1+I1n?xF-4Wf$8NGcA@X-iLaRdG z-1Jg8HYjgOp3&yDe!&PqhyJm|M&lw<1#iDNRrfSz07D&_`Dryd#=F1W0z38a6Nm>{ z$91_u!UK?edLT$kkNiu;pw;@cA$|i}EK(X=)0I&IZi-&RugywYgeUV}y2s+>KIw#z zc|KM=BUAxg*323^u?+l*N=IGRT|Cw_)h;GdCMmzw1gM%{dH|oV{MM6H&wr*Q(40iN zEX_rw)8i+q^O_TI~}zM+EA=25r;--ZVhFD(zq5_q0ss#*HJ1m16Fe0$MBmzqJfon)GPANq7BNS9c6p-UdxY z#<>-phaUsfS+r5H3$^w@dJ@# zCfYuedxP$eqq`|ASt6g_?c)ByiUi|crn z5z)wlHW&Nrc<13CGv7Ly4gQOXRQF^DFH=p~OU1q7(9R@>k{&5(Klg)AmyV0+2bR%C zQ^hRX-t6ZOw}bLgeOr`njl~yF#R=m4b*F*vPh1G&y;Ml)AT`~E@au9`!b@Cg5r zzG>}C&HKy|tZ7>5OKzVW>N}DsJ9HFLIoa|KPw2B9nDyUZ&ac{-1E|s*lL43gl2cHF5yQxG316~30}L_w64RYsIqNdquVWW+kgB^mg5$;Y{y*ApF#Tv(-H zMb#qfos2{Y`jVoqDIUKRV6ox)j>l%?0JCNV6x2qd~a5Ti{?a^)@2$J89FJ%DYeZn zDL&$(gM@)7SpZH_14cU)e}u($Z1E{g!5np#d4ua>3YXg2YWlq<|MMww$b1yJFL{tv zFS1+|&)?~CuGFJ<`&=tm#*!)HgA68g7wj3&3G@F}PXE2Bf&HFVhXN*&Ay^G+ZQqOB zH$TYP)!0y46BNtAu$HheCJfqoWgiCpm^a?;$0Ctg43Yp}(}xqM2wF7f0)zTRjGl-D z6UGoGKl3)-H+|ByMK?BWFB6-WhF_&ho%g2S0-*aoGc{HrF_Y1ZG1w!o`K@pRzIWA8 z^~<01)b$MkVu&6WDm8{FpW>P9%#q#eR5gNJwfw+B-7%9knIC)8R7np~Hnsac$RxE{ z`J7KbKgALO;u<%%`yVNRb}GY_fWnQx5&7HsU_kEM%-NSlAGgw*BcS!)#rq@6%R#{@ zXZp{h(`%qVV7~g)qBp}p2Kk?Up{Q(3G9rG?@&}(pOh8QdJb|{py|y9VdC_BHW_+ne zjgK?8W^VA^ai5w_CWGJRk-?s$km@S;*HA?5-XVVXl)fv<(7}2%)oiU?ltN3rog{%2 zd&{m6db9wtmCUBT1rB(Be0b&VmWcruQMhDJvybUN{=+m8z?~hcq)pN#tF-|} zc(f1ABI-H;d#Wk4sQpG)i8E_Ib=uiI&ih(~_2~qMLSNwYR9?^j;N1m87@MhwrvysV z9P)R6lFZ>1II%hH!Hm0Ew+uC0=N(_; zW{WQnofl~3j%Zz&iqxU53Lu3YUa?k}qD@E;s%u`~GBH=AuQtq+luOmv%DyU=v_GuN zmH?Ogh9Hptjuo(y0zdfXYa;JFi|*GPhEAQr<*E`v_v&k6w}m3?qz{|L-#_%aow%G1 zdspjCpK}7DG1zRA-roS%6LKqC-` zR$Lhh3c}w%ItjU zcdV4g#`Iaic}+UsOP>*>>R6LvPs_cJUHDXA!^~lBjEj@>xpo!CJR1iou#TFuCF6=QV5qU!G+Y_xY{VKN>=Jj#K(- z?S3Xnr4>LSaN)B0gGuzSi>QW&`d04^XQOOH-Ug{=+w^KDzaM8LI2+}^QoKVAfJY;! z*SYjkq_B8JuT)J|-Vmh5Xxun;>-&hQxax-eesY;(G*kHO(@8;!iq0Ya1xy>`og;Mo z<=kA`_rt@YP2Jrtu zkpA~ek*Tm2ns_gwU`uiTJ*v?AYs`XV{ar2<1!jx}`mk013yq*8Pz`QQb(k~HkSdpf zKJr=$A|?XgB8o1?5JK!JLTX{O7*RvLE_%}Ud(O@1`*t07T@3c!#c>-mP1Ti7qh6~= z3jbpwyLftOkF#}*@Qs*zr5-uv2Im6CCfWEg$fGw!Q?K=wN_wQ;wW=WyZ`a0ALqqb= zfbB%n<-Zp9 z^m1_NhsF2J3_`@C^xIjwiB5&y!@oO1$}S2R5HX{4Rg*5Zo%!?}HCSeGlKi{A2trtAr$K6o+B#jHhoi<={Dd1XVZ`U32*is`ZDn77Oztqda(bM1WG{ zdlDZ+?cXHOIvfODCX&`9BI&X#-Mq?kg(fgC#J13d;$jrOpA8@YD7>~u7nwwufdws(QA(2W>0(LjG2*(`Z0B(=bn|S}9b9Tr8{A+j&sSwvC73(=d-DawY z7%HQhT#A-780uc=%p9CUP2>pYs|K8fR;y!moB)RFDy6*JRq(ah<@#*a5Hb%o`_r%B zOp%l~PhGZ*ln{z51Y1wJo(;3Sf?pJvLAXo|8iI(YDhAGdT;fbCF^U$c)Uu|I5Q08V3fh9ebp9v9p1{CJem&b0kW#7$CXALglvo_ z#OOGMG*!qpOV8@oKrsIq!a(?izec@PVZbhv1_9We2sqDwIGBI@98>KkQJz$^T}(Bn z3+0kMWC!x}m0#V?hsF-_vv*+B^2p1;IL5b-ILB9^la!;$-E} z=iF_XmdO*meQ9?SRIym(oLtLUyLF8(wOILeKGU_j7NZYWn|Na6OT{MxYz|D|UnjRq z>r{4ID6i>P-L3u32l@2Wyf_2=hYDTM8|Psw=h|3ZTnr3zw>qlAdktA`Bc1Xog5 zAnu5uM?a)#M;4m^0I}FL;3@iKaLh&f=?o@@-q(Y>{UKX+oP2%~663qQfoyi$1N$$c zLh*R~h6Vr>DSbkN{~0L^cFwL3g@D6h_xZZ}0~RFjzpW5U8iKXxE8oj*I*CgAe`aj| zQ~J$7{G8Abl9(<_sZKHJt5&Ie#-t#b74c()V~IJC8F1e1WBp}-F&PHV0vAQ!FRO<{ z7RDU{N{du%%y<8bAa_!$qLs%*NdkqHGJ#B}fxdhyb^XM_27*V05TOz!R`zf;ce{^AoQ=P*Z1+%%UbsnB=-S8}+^2doe;%|*Bw`1S~G{f+4EpC z1^u`eLa7d#p>Fj>i<~>#7Wi!#o8V&@&p^QJsk*nz42F}eU;lukVE6Yncy*~AEkLM> z>S?*nxBv(nm8}l5#X`og4_`nVS_0g;;Uap5io(bY{M!Z%>f<$`6jAH#DI;#PZ|YN7 zV8Y)Elnkqb%Q)65&}~Yd;%uyQ>I!1W+jUk(qQ1yFV0*ly?N=9jI39-tV^Z$6HRrjF zy=iCp!qwaI9AxeiwEIrVFWK0mK0vU3aa@IsQ@A8M@KAqa`V>P13*H6w|>s3<9n`%U{kq7WDu7zA8SM$d<%hzO|gAtA*Sr3z9}iCK*W z$wTT_fSy(!XX2P+j&MOa&ayIUe!=|=N5k9yr7r=J9M}GwkLa(#u^0$jOhzm%s1Ar& zHTqF<+zoChF#+@^+soc~8x>LqtF9C`vA@npJAV^hWo#79XcT z5}>1mocpdnJgjKd{Fjb3fov8b{Y|^+F23Y!vS{c(@+tk6c=xc7E^8p_QFy(BEeYr=oV05mYj_8+7Y#JH7B3tg zv{0JPtq`UGfvwRhObS-*=3c=`(LgA=3tCpCtFYxP!P2*eN*@$ZwYZw@Tb_3)37XKc z0#fGv)cm!wnC`#z<^yD$N1IL+fyky8bY$;nUV8rf`4I|UoDjUXPp&$y;`3sEJONu{ zt6x0tyl%7h!OEcdPf3D8o2A{31>zyq?r>PJ{UgF-T6I$!Qtj^I6D&NFrDfwNsHA_+ z<{q#D0s+HT!VWU5A=f{h%;k_new&j&Eq(tGnk;=SB$>m`L74PSO-%0mX{f1ZbGVe% z)JDtXWn^%fjD}yXHxco9$9K7XUhfh~#K~o|P|?xN*t5}KLUrgVtOz^w*fxTm_kt07 zKOd&>G4wt5Lv_2{3=94*+Y&Ifk$cTvy;s&tRno*l+jbhSiHlLAPGwd)F`r38yH;n7 z)_@3|7#J|RyU0)I8*dy8(|{Y(H@EDHZOwQaW=_IfR$J!KED>Vguq&g=D)_p-n5RLu z3Kf-Oz>%lJt;py3eR?@Sb2D(zyGfz}w%ajJcbBV!u*$n|5-vKw!0g`j+f=@1+JdG; zxY6v4q8t+>B^Vvfs}_l^C!J8_&(6U0Q7E+c3a>Nr%K{_txp_4DwLbjL&4xW=FD#X)# z;~CU7wqD%oxL)4q@P$k`5Rd*&HO%||?`fc5IU+Uen9T#n}^`n_a%=fukYy)D13? zgPU7wjb1!1RcVnuA)@Yo@>m(S07#{4Z^%uRf*i0u^}G&_^WTn6v)DMGYm!pM!@+pk zlzUo9lJDvLrhEGgon<8>izS>uLK#XPMmbTwUi$r6RbD9s z0$dgVOFs-zMXee&r=Ekyl&Rw+TNz=65a0LnvbJ5nkN!Z={|?Ts+emQV`0fG9-Nfs# zM(6*x`^o}7SehLRYKfjiIsnxjh75| zm5+^wQTNtIi^G7Yb_-vmG-_xZtHc5-LXWH7T#6{2*Vd-)A`j`~6Q7XZ>Fec4?DP0R zBzj&H>=#R{h3~lz3GI8FbTR!p0^n87;b-00PP`5u6281Y|6qrDom*!-Uq*^hh=;bf zVpeikA5*V4cbr>@d1F4EExXk19UySFymSapda}Ebnk=gGem?q0T(!HaF&>uwS>9rm zGm@z#mO5!SIjr1!wb_)2{t)e4Qs%EoUnkP(lgwvn46rrpW=d$-lnr}Lp#IJmTPL9? zb#x*QD1Ek1w|c#YP?*zLNcn|B))hNL@Xl;1gaq_8qrd}{WswfU>u53UQGaAt#W0_e;G4n(9qDnzrPXro)k<>NRv+bfdMc^EEyYbd^2zsoBI=kh4a7R zP*8}t4#B|UT7t5XR$&4E#ow#}N0woehBc7hfXgx!=nx`q+oq|?1K18Je@+?Gbp)?# zlIVf`D(JG=ea`Vp;(VSE!>0)JCRz~DE<@z@9Sb8x;G3wZs8ZSNR-=)q@J+E_V3w>F zv0e+~ZOj^SqaSnR#y=)W@7SRI_U@<*SU3(xHT{9RsHtiju0lJwwK2%`cIi76OKRqv zwwePIKVs9^djus%J#8f+jzHX5rEh$_Rz6DOZ~rP-&7D*%JLG(QFIc`}=A+q1AUAZY zR#Cj2T;qR(b+7dum5HFOJYEOAO_4)@G~Trx+H5X(jl#^CT-Y3bP!(TsK#U_6W1OHX zQ|xN_n)iDrLh7NA`d7D>YJR$(D@!J+&V|8!$(2wuX;DzC$&^rbivDCdvtUNlaIh8` zfBo>pe7)^155irOhNX)bGOM(I@D?y?>mfLnx7*^WZ>&02w8Xu$ zpLRQVFuKwyR^?&bPzDCsX5q8mWeZo4IjpVe*M&ClP7R>@uzU2foOltBM-$RL#o<_6 zyU}M?w|#A{hBkj?lh(wQfXFk9o@Q6`8_)crBV)eIlV{J+*%y=^_|L3SOeW_7*4JxT)%oKYSO)AD;IN& zz%-MM`YeeG3tAi-G_4C4Bw!#ZQ2v6nUdq$A&}fWUETN$xO<61;F<*z7#FDNWL4|o- zlrLNKySL;!3N&&61uc-UJELi5U|^V=o8!QQ`xO~-zZf*;)ze#9S;-TdlY{H=FdT^j z$f&Xafe8`NR~n%q%UOi-ZeLpOTW23TNd=HQXtqAQ(>Jp~?_`WVxRio^4(vT{gUen~ zB%odzInuy`P0h8QiAS-ZGt|eb=1=x^ZwH^ec@C>_Y)gwP>VMI0$=3#=KHrr!{I&cSc_b){t!NooXY1<&<7bi z+quLKPnzAYR7UbBK)c-}XVUM4&!w%i`zcW%+ zs@bm|SsH0`hPhE9z-fB(^BX8AfZ?bqsrnPsya2SBM~4)F_AMj?(-58JZjSGv`aZX7 zqXLY?_ZnK}ElTJu_&?zQ^Uqqp0Su&9hPr2;05!?IYTdL43yCsS3fzak%ZwK(+8Rt$ z2U!J(1!W*ctR}fRCLjFSk#tLj(~wy)Bz)c?L}V9WFwUUg>*F9}qRB;0#3lv-phS?0wdHAnnDX$5sQi(Y`i zwK5f!QV5Vq*0s^<{)a!L-rZ7JzrBgv1o1kHO{nFRfUVA(NsEv=wBKC&Vb0y8b*{On z9!68V$ z=S8mWPA!d5a)cmX$n8n+rK@6sqIrM#>~4G-A}ev9n?S7Vs#C>|gyKE^Noik6-NcCA z&r4B9r}J#%niomb9oSG9TS12La6gw{|A_11t!j7$_>_>Zvu>*5ID#__d^T&We6L;w ze!H%8$#lFwUjv13sRe2x%a@UkQ>u4P7SIT(UsiSETx&*3#CK>xrGIc3FMCY<3&{%c zNz-`1jWo7VZG7pQW$_a!Im*pGZ$fC&i+w;%yo z03=Y5Jb4=q8n!o6ugscFIqz^LYv_6#Lz$8>5D03T<+@av0=}=B)XsESByW08figz< zmd31w8X>%B*=lNXQieQPgZAX!;|@+Ti55M&pw7tHI5|1_=ljDxR!mt@(eZdPwY$6f z&mThi^yov*+QQ%(2YHla^4W~x^^cI(Xz2~Ii`uAFO7?0mJQJ*4f3?$#-L4`Y8bOkzZ3Yp;a$;*3ly9*S}p&reeeE^z`36L$uoo6qG>LQ zmAM}y-@Kvd$R~o2QUCmF^DzO{k~;7An%DripR?7G3FgzLPF2l{^z-VtYtAA+-VGhD z+)f#DREZ;yIQJ`f2ENA^*q^ET@#@=mu);d4K^3nLCou@my5u-gaE;uL4Ue~F0t{RF z)=$fr>&2uqn(G@f{aorX?s$LO-`%c+r9JKDm$S*4Vjsnm?ffXCa8HMvR)6*m@?`yU ztM_f_FW7ws|I+WfnSQ-4R~X5xIBsoGZ1CJRB%-Y{U?}zQD4#6bxN7idkp{Oa*&jp~ z^R{waNKXL~5R2%0^=Jn;&jt{xTngysNp53&C-3ASlbEnI4qEd+cWWGr1wbBf*-v^2 zB{w(^ysIc>Jgj8LYv1C^4vf@ff6r34{qSa9?z%6n1wzNgy9k$Uba@_DRKtWn4&J3i z9)^cSR>^85_jnIvDFeOAWN`2RET^{F-p;2l+BxL)7hj_Ohz_!)V&}{xN4>@xAwvC6 z)F9oA(m1@19X=E*Ns76|FbQN!ubAhd2so8rGzh_CEJYYrp1CcT7Q|#LLGQr@Se?#W& z8*y6=JpB~n_`Q?lIyNP#ZH@+)(_4_YqWYjsovybRIVdgSg9ap{r)`6ybZe1yB115w zEfUnKJ6^Srp{zHv{0vy4atQKog96^#%Vg>3bpNKLr*?KR@itTZPNrJ$3`R|!v5rKR zMo9Z|DX%v3oijfV^K<_QHwUHl#Qym(pBKPb2IbBapK84*?}QGq2VHR_0cD0VI}}(ZZ}$*LVb}t4ukMLu5(XkFK(of;Z7tRYG7bGJIbA zXj0jCeMFT6K5wJn=mrhI*^r#VNkbItI&g;y3^3C~{lw1@1$xBA&_l5ql87=|0XXII zL>f5+brB&~Q>zGD-7sRFeXcIAZg@cMKp-F>!oGP#n4_nUzCJ#+BNUh{_Dd}k_8N^) zcGYsZOqtUgRrV6{-*z9vFZ}!hr`%J`%Ks24)w;PAnhihIf}+7I}Pw_NqU__|SokcM)l9lCeCWuyAF5UuN!U z$MUrj!)#WpDI@4*1iFp&7pWX#lvU3L65F3&vsI}8&G0{5O~%VL-H9w>WKC6ceJhZE zXe*pwLyg}8P|}e`FnitpFllwtS4sT z-fFmQIGEZl%(TVulB&i8pNy^|Uzj;&H5QB6=j&m7d~-DI5vi4w6dVL7uC#NbyRvs(dMp(*7`ZjuU?*H(p^E+%$hiGC2bBHPMHxuMWjAsbbUw%aTX@g(Rh zzwuGLRuGE6kSJ1uyoC)`Rj>X1MbYw*za*s|TN2xEskX!q6ZtT@2c#pegEc*h?;!YNW^D+H5#2{*Z zN%e?eqxD854PjAl&8vLz2{=*aAV;K%b}O}f^R6Md^Y?tKWxK20PZ*y0-j}kE<0dx2 zh>5h9yiVi>Le@hsi*V)?QIEF%^++<;&@Yl)uojjaK9^Z;DFcqi!R;PcPP%uI7OfFy zfVI(YwttqK52yGf+k*4HqcK3I6J-c=Ho9InjrCM^nB;@f|HJykGOwCiT*7|49N}GWQjF)TLd{I6G6ceC@4#n z%o%A7txR@~*qmv-+3aLSj*(KKSmm7dyykFe!chD;K|M_v zOD6R|Gpc8BuGs_Z`^DEmO4;%1Pmw6HH+Xj+T-hUq-C!Iu8q%=IX<)TMHHr8$LEd)a zu2PYnJn{+*8x^%&Di%}Y*fQDyNZCJ7`t{M5nWa)WGE7NbXB&Tr1~%(&23d= zW(KmYlN0%<9pL#6DF9vHmM|o+c8yG|zsTokz`zBjK{IC2BSs}ko<)Ev`m5{BoyY_{S1J4QS8kR{y@n`IbH#E7W@Ow%Qw03Qi#;P4(`j#^b&dE~@Zjlf&CY!wXv z7owwO$&*#6L%EFc+nZFjdWjQ&a%VqWL)HhUbH7vEL*uyQ-hbS`t5F4WX0<^`_oDF(Is&DF%k`FtJMJp#Gioa)>0 zemm0EArPEcS4}>V6DCYmtg9v0DtVvI@=57-CM7Z3qWuMp)G^|rWlgKFJKAC!Xdo8H zUTck2I#X-ob}hM|ZRjacaB5H~Ua5%XUdSnsR9902ANF%1QqxRH*H$nB8O#{gxZH>v ztvu+?;YlS&2`71ig-1++#T!=34p5?p6wLJ|0k~xSngH2ohBm7uuTn{0fc+DJTR_as zK1fA%UP`>dOzj-G#qLvBQCU3+#_6^ZpjsY;K9s&WVMaaPsizVJ3M@|g2#<(}zNFB; zF|0UA)?Yk3Q%HswVTVEM$b?`LRnMBBjM;2;*i!|NSDVlw(zpJb^;9fDU3dk}p`vCL z@K=0tY^fwPR1}SKFI-$4hORA3(wTwc2fwEjQU3<#h@u5ns&rMw%8@W#s$i)yCrFBq z9_b@2j5@PQQr1yS4*8jKUwVin`0}?qx|tcvD8JRl8d!%Wb|9_Ic(J)^e)TxGU}{=0 zVuZ=!aDSdiOjAc+%?}K2MB6#Di=M_FqJToP&`tp#7l147)%%3J6eEV1!D-VjRMVwi zT2KSRFZ+aT0AvQPwOR0>7Z;_5s(plkPJQalD>kSiK8GgCk9wx@y$xFytt(}{kb+iu zW9fiPt&YF9M!&)v_0UwY47@kAwaOt;Q4T7qsGYhED~JQ3O^*hwQ#DxzKg7W*Z0Y7# zxXPkz>Ch^8a(G*X`e0y}s;crGX9%QgwH%D@xRdh2URT$x?(r`VAF|c$k_f7ZI@*rV z@B>+1AjhJmGeRz&w`fkg_maKei3R4_aDS;M-`xWPA{7$2&=uukIAL#hAtWAb=pKT({81!7y3EjnfFGx%sfQ2~xp=2}EKtKr=j zNz<4(iJK7{_}UkI35_j`L+r3XBpefhhM5=yU8PV7I2gF7Pq#+XP8+<#2F&9}pF$C= zC#a(eM!R-D!Oq_bmmAFb0t5%++iA8c7}Wu_i)rS*3_)u0b~1Y_HPr6+Rw_@CT|H=; z^3oC)adQ?9W`8}zuHv78Oh9Kz$ol;l7e{b*c}Zix`SRQAHK04k4EgZ41t%&{)PVbT za#(Li+o_&;!PaO%`3La0DN!4b1R+pWBb#lo&a_^>i;MqI1U&Lvr? zNUs519Q2&B)l^g^KdI7WZs`s65t@$zy-sCHsF-tb6U^?l#^@E;jJL8lHNB4H;zWxgR9sKnkKw(b#XsJC z^zsGiv&0h%U(%=kZDY0G@8dBH`kuTysyF8Txo`I`PAA72PG{MYE-@3x1l7I`(N_nZ zT(|aAq~Lh?=T7#wj^ymYcReka2AUz{|Kg8#Yq=6Evs3lcPkVj*n+0n0b)4U3%64Z! zHEtV>Y1r*MZFEbQZ}-6kre8WaQVb>E1$KSvuNqfM*(Tf={9a}wNS)6- zs*WTuI3 zhJsw{?+d$J7Xh;pz9o!NJ^}ZfqtV*iw&D#H7LTRrQyy@SNyGC>3oDR_5#sP{zSoIU z3X@a|uwKRKVV|A*FPVAAq0w~*b@VC3vxg;Pb^oo@<0vwx(8(BGSpPmC&I$Wo7H0Rc ze>eUZbxb#7do))T`71%Zx#X2dwAkX6Z#Q zMY~w(V2CiYUrkwVkxfy{wo4W(4e(`A4YP;(c*qQGTfsNYSvResTdZWb#4POc@59fQ z%6?Ztvfo<~4J>(bcgHJ**i*N~dbX{K6X3-LJ!F{MoA~704a3OiEAZi>Pd_A>EZ^wA%T|UhY#t`MqtES@H*|A+Yqp#bNSz+; zV3{LSX=M5uUBCB?uzOLMMl#6Y;8BT*`~m|+$OrDUb!v43@N}ai7cM6)fF(PAo8Xf@ zW$lG*SkT5pDgyim6Bl9ZOCf2lS9(W8M0u&{p&&(?n$>$66UPrwDlu)}d7xeDsC|Wycvg?b@;(*A> z7=_aEHm4q0@_?m7RsXZ50za=|;3)2>O~jGGS-rpe52EEdQr5qQ%{zGD|6%}z@g6id zI2g9ejbRTqOAkoH!cfYcGN5Wa(1iiK$xBCbAP2Y^5epaO?#%~xtf{G~PN&1^bQTYR zPdLyM1`H&Fu1P_yM!zF*REHhXVdO-X5WMUHtTAEM|1GU62f&`6$bw@&Cn;jeBpmh zP4>&Sy1#2>ryhNRulYe4E}xl zI&USzxs$16$%9-yoYsA5nE)hzwUFT+3 zh05ycbT@oHYV%`sRw@dt-3&wIJ#*%t|j+-ZKAn> z5hhIF*;>2vj|?dAI7jYOG~KT)hcIoTdf3Y!fvq_T93PV*R^8%!nkn?Bp6MLS^kz;5 zJkjD~VX>(0{|!B)s~D}2nOgmRS*B}RJE50@zlbSw0>=LxgN1Ru=GClV>z*oaqH{W% zyD3hcA+T)9Dj+QObaQseYW_0|is_$5tSX6jl_$H-MpgKt6UlchqAF?g!bn2%LaTk& z-zZpot=;9LuXfFWQ9~e;ot0&Ox+;n3ET{AYx6}=~8IrH@QKNI)I^vk-C+_zKTfZ5^s;2NVx&C@65mXibBADcJZ|yo>NL)Z9(aJcUGTVGlt9pk zt&}{P3jJ@4xYtS%FhJj&pRaFWauhhbJ(|N!ZZU`yR8Qeg$VEoX{0j!~ggyH5xg>cl zVg8)?`-=@b4!#B#-I~DZy$77TDvhtIYkIj7ux#wJ&pKw0SFO206Odj}n;>SzbZ#l) z?XyLf=@<);+sEIzCd98T`s4kb9&ggNcw3a}diip>E(aVlc~Vz6M`X-|5!e`L5~auW zw^jRd!Swfr#OpDi*VD6w76$&Vl8hS6mjQ;wE)D-qXOrcy?4>(Kuh*-8`k17rM(;^9 zQ#+rxfktW@8)O*xx;eDY#2O!w`9E(dk8o988bJv5KA%=~ocacZ{NlqjbG2O3GaF%W zd2I%6{!AmZ=(ZmxGx_o9jm(Jpb(l8_e-k|Q=Pn3Du%-Wfz3!5ovFvE5uB1wLgzYzLr@jv+W=}sbwf!qWm%TiZrz90;Ym^{t24SUUNsx%yeXM1Il3kSsdw zVeiF2{d1z85khW#pRyWnS@DD-@cC9T>u0A`b6v!;<6V4^Ux!g@#b`L@XwN^tBS~y` zcNb~QE&2wO1G4~-r)*tvlETTU-(kt~TZ@lRd_VB#`0}BZ4p%L<`OZF`Me+KO#V0<*)GVDlb>pY21NG<(AMhLBW7yHrS8%* z2E4d_6sG0f+w)jVdL#0v@AWwIU|oo2ey%meyC*v_ioDGTsC}l@4#33Q%il5qkZU`z z!}Pxl%>Jhp!Yh%%>X7`K%U-=_pU9I+6MNy1A=j^$G0(huseYXClL~2fuQ3f&!qiCm z=lk$9f4myJE!!&JhZXIdN4kDECw!#0Y?mHIcofszIKIZSVj)?9a$Y|?c01x>tSPtV z&2&_->N>TmfLhdE> z!@kNJIJ#TK6(q(!q4h9h9Mx+8Lzs=s?07g^3fHW_=Iw-YCaVwQ|IA1h0yge!Ip9Dgn2SYV3(F@MV=305PRz|ap zk6U%UU9q=J;QWS1Gi|*2%IiQl{P)jSyE}YHkJ0^^OTl)aoX#gQO^9j|^#dkOhr!?$9M$UHM%wuxkKqRL zqk*+T)lgVS4g@xbR*dj}Y2l&=EZU$n4+|P6QAr7vg8I)mo%WHOK7K#6==IacsjETe zqN8n2NArusUNkRVbT1|hq5qdigS-LSsue2OzkVHLXSB1B*HU>u@E9NXCMOxpD+Fi- zQMP+7HfT674jwy&3KxWg$&ec(>|yce&$a7$q6#FC{IQ^3SdeXrA-x+_fze)hE3(&v zZ+nViQTq8Zoi}&Z_cB~kR_@z&SX)UC#o`Vb5$iZ98E%+JsX|e!oM+n$7KS@y`qp^C zli!~2dr^i@=X}n#3_jMW6d3*|o5l9imvX1Eqc84snNiTFz_p^tI%oh9Wk3dvsdR7X^Y9^uB+*N?5`y%Xuh|cWWG!e^JPOZP^ZO6edc0C zvc}GGwrZaGZ>-hi-iv88G&ZU@bv?c`dv+oj_Zw_kv0tJbfD1FJULNLHy`a}|4`{mw z|L&y>&RsMzo%dww2S-NxV&0g8+Lr7e-sel%+&^`gj<`_ms zb;2BnO&^xQKU5}v{_A)OVj9Fb3|8FYlwIy%Dw*mgYBI3S=k?rjf_T!&Nxm4%hCZ!@ zfUlJ1d7peV(aqO}@UR?h$=(Ez7dkC8Zz=E#AzkM=P+!xoNE_G12Tnr<;$~MT0-^}S(nv{$VfFEUl>dL4M9{2wu>U^ zA~SiPLoxI+W);MnXVH4X5erM0_nxq9XV+aeZm9vTjd1SZ$VjXI*2j!0p0W1(sq9Fm&g9fPwK0*?{W-` z)ib|J$Omo3N0g)9RWQ0alN>$LAq&D-ERWt6(>l~Ht%V)Z=|~u`hS1J1@O0$s>q|mR zTwCU{S)wT5$I}Kqxs8S`RO%8OI#^f$q|w7)H9(1o`OEFW5HaVz-H4yO37%#AQ?qV5 z@B%+A7oNC~lL&_7IQW>I@9N^xK|x`9rpGkOP6UE#=G6M@P7;^zwQEKfz;^Ju+8ZFL z;AolFw7m~}*8lk!E0|O3&L(|S@yp$*7OQO&P$q^0U$s+GE+r+{n(Q)dte2ogCx;|N z4A5?q28yVZH|MC9Ulj~5Hwe08zoz_u*!t$^TDot`IJx1yv8|gE+qP}nxv_2AwrxAP zv2ELS=lg!IU%&3r`;R?pj5E%uUAtD*S$poe=EPA%<&f-SFZw&8H$Rv97MVkYC!|t;Z4;{CQC_&R3L${Sn+3CcM@@3 zYz|M;8R;J1izP(JUflF(iNbBJR4NVoO5|s%RA&6$mxtKJu>8oTIb*DAw#IJVFMZ*Ol%Z0zO~xo0MVQPKM;{Q zB!ewd<<;^sFAIvR7rA=$@bAA%LPHiWoUxz?2h6+q1Fv>hz2hc3QR}DGkRLH`l*}MF z*Vi}nT*`EAb?ziqX#oM^;tVXmD977`n)x)p1Ub;Mb0)daWjLzM7KqYiY8qXeXctkBr=V!_pB= z%GV5%uLYkvx-ltXrklE^d!m|g6VIO?D;Rs z_opcY2z$zMkx~`nz)> zm)UBYFdnObG&^=oO_!ML&KW=O#$g^d4!ZHZ4`mPg4j&W#Je%&lT&_8j~)b{CPGf?gF9bQOmJzaxx5PA zH+e}E-~Q|v$~>g>sKeI{opca#kFrF4<0WL=D&dliQove+iP4qKqx1xi;vB?38vd$ zcqg;jN@W?~SaT1whKX!`nu0yoL`4aYI%>=`)j)y0!=YDm%nFl$fI8Ox&KsTuW1|b| zBCXGad32joqkOokUpd6APNb^Lfv+(Fr|JAt!e9ml5qJl9V5Qz97V%Q0X2r5r6&o8H z*8LU($dcRM+)!HCpu)6#xTc$MHEsjXe5nfO`)sS%)zh?h>?D+HJZHYLTOr3$t&%Mi zxLlyF4qRW8nI5$<56k4QO490^S1B8StQVNa4<^>-Ce&_~3W}YOU~avrJmDTWe+W&k zZ|`PK?62)*KAAyyY&N@s&RA`LFT$!IbSIbqeF{XIc7-E+^Q(X_BbA^P7JGIcQ(b4jK58<9K>=A>jwqa>@{R; z8C6xyMJKVxJ+75qmpdh8`OB2{859?G4B}CRop@yZj zk;$_sR(@eng-6?n4<23@0x?{~O%Xv$gKCUdo4tyP}FG)?Jt1&Kd);>>%X0f*(`N zZ3UGq_`u2lqeRukRuoOk->vh_0&9^=PEWU(H82k+O8x<+h`g;rTU&LS5Li1Nph0O4TRA8oQw}`hU z8`9eonsH-6!v4=IjgTI)n5fF7hnwV0Ow`4aMVEu^?1rGV&bI4JzL~>m*Onc-!yD(j zv>L*^rr*DH1t^ld9`|>~)KN>%S7wq2AtYsc0mCv`9aV!lFk?uKHw+cp7DpI&586Hldu% z`N!fs5K`Jq`QB>deN5n0d-o?J6-<;HPzcgxArZqLeXGq#1zPi<6&?ICwZ2|@z1#XE zJ^$JM5~PxqLcd$`_+&tFkV$#I#metZ)f!*@E~H~mOv=Ia$9le1K#B~@%Nk|o)rYqD)VE*eC+9|@X6A2v{emkNF5vSc z=t*w1TZf;+0rjFS7dWRSWEW3u*9V_k?HlKg&iux?Q6#-3V(pKQ7J_eg_||KZhn<1n zoC+0?aQm1E^l7Fr{_b-l!-)%XzPuBY1SK{7lUVY)Y|A$PHihvg`2qLC8Vv_&_V-Kl zzBPxDU3G+;9_g3pfkwOnNIb`I-}p{Qv-W!85?PcU-pzKeKTY?$owat>H*vcZ+Lw|*mM->lD2z(G(Vi8t$z@txSE=lIJW|> zOnrnp<90SXYWb>_+sZ?Mm+Ehk%J;YL9HJ9FIS|^#pBW>yx&{hpDuL{ZK&<;9p?_V@;FgNjgCZrJ6efO?cf|czusJN zFDHt%I@P*Zk#%$X#Jz7`w%WXJk%h}lr#hj>pzCHQ=2YP_jYGb(dop?U?g}|b=5^ij zJoUe7`qh;3pX^j(d4D`CA+aq?Vhm9%RB|R(b;0!-<>AHcaOIUBJ=Hf^jobzOcGLca z+HAE{#p#1msan&9?lbL`c`&U_C)C_U2V}bB{hIHC{(W zXa9AosD2yLggc{Rs4CBqTCubaPLz<~lB&U@X?Gr#+aQ2^AI7@x^&u-=0d(D++hleLLHoF4|OO z57ah0s6R@KN+p{gtG7hN0B5UQ5uFw*}>|SzqJ+m6tf%;UK0UF z2)vHzbkcV?@<40DLLCNA5Mh$YF~sEJ+#rY5@e@!8%!E3{3wZ3 z@RY0rN{56PJd(b&|A?Ig^944}Z=pujWxMO@qy575N16Bada77T&Jv}Wmb-f_3iAV; z@npT+p_Hi-(hK$qitGEsCFk86U!|fTWjkrXHqL@iz2Q) z{jGVguwbzSJ#dm3M4Gy4ZO~d>+Hsx>?oh3<3ui=ikF#IXJ@xqtOI~2Oz|1X zEhbfKzqviMNu@IzsiXi(XqKPO=V&G}A7+=MKTETpqU2;`n)Q>LaVO_fC55e4QmJ&h zY9Bk2(^lrfdJ=Hli&bgPmWa~WOxHT29}I)NGAqtvZdUINpo;CwwZF_^EODq3-rt)7 zZQlR*o`$_dVq+euP1Cy3(VAk#qj{}IU3Oo5m`{FUcdA%rZj`bJG#z}tU%Zx=L1Pb( zDXFkfsi#VOWz2WORNLY)g+2agIFvM#NVe)s&=RC-1ivoJOK(@9VpkNEnS6T@n@GZA zbNIPOR=m<~{yEfdmguISyEOA*20fsv`Ii>3^MPmkM`(6^Vyx4XV+l8vjRI}%Mlpe3 z{9`F9V+@eHo^p zpSpLY=L$J>fbnO&pjz_nsd-`e)@tsWzpe0DRt+V4v&Q@hyaX@9Qmyz_ zlm1vY+Lc*}`%e~Ao6NPlkFxxGn)Mil$G5aSGWVl!(HBiofI<$!Z@*Kv4_rW52IDS^+F`58J2f%zI_8KsTs>--#} z_ZKMW?X~(x1p(y414X_zV0f=qwW0{`rVo(>F*G~-?&`3vzMkjn{q9@5m%_hP#%5HJ zf>**6NvP&?ZWuxIoi|LIAl<>J=oL$#Ub=E#rFBAq+K&U2(89Z)zCEJdPx zX+x{qZKJX?T=y(Fj;AiUrKp%ofJYSG{Ij`J`fQ5=XbDt2Irv3DbL%#p(>Ba z^$w}-T`m?fa9mE$yNx210(Hy+Jg+(D-FQ|l(9sAL@B2OC!vt8HMvv_>1M}p9?XTW8 zRaLf0|6wz5B#yG+qxu@5Ct*_#T3@+37iE^XBqt9! z(!QA=UvBDiKbjPxD8>@+nd>@O6B}0p5fyHkdy>Fmk*(ikq5@XmA37#<+D$2urWc+H zf>C^-E~gcKNXzQsk63H1rTL%Rt~p%6En??mDlJ#rw@h^AyF7Z^OOL<97x6S5#v52z zmY;szw#%e;QfEM)%;Oqm@}zyO7qBe#p=xrvdp!p^8wg!qViqfm6Psn-v#bErvRKb= z#+IBnr-7{w4^g&OFYxY-_8T+750-Ei6E1q!!7q7B$s#b$N*;uBH=k_DMzd1xg;puBdS$CL4iYGmD%-I$;jD9g zh)tXOb0N~rKs_=7lSX5(OO2}Y?0ys29f&jB`6B2J8_&gja)ZV5kq?Y-we{NI>9qLy z_t{q(Er1~bnLaWEWpgg308G)?M3Gj;CywGd1d*LMCa)&o-{+GGrD8Rxkh=TW*6hs z552ldt+wQcV~njri{XKSmJ}yF0s`n(5Mvky6XA}?BPm{Xtns(Ex2Y_yx7UZW<_rQZ zF3*?SgL#m7>?m*18bV?)GAJZ?XE3p!^Cf6(Jo95o>WdlDcY{Cf_p=;|^#`;X|HRYV zfOW<;3eP&EeoLWZ{<9+j;>SVDJ}3x+5uEiLU*BC_BU-28x1QzCE#$EOELQdiFT ziG!*Und*M41k}T`Ble6W2^8NuaE<6f(9z-f_PDdNLo2YB4Zj`Xe(uFcEEy{p63!<+^8|kyCvdXS%3` z9MRD@?o8njiXTDs$NkPcuv7Ane!SFIZ!8{k^Mh$(D}@yN;9UPTjXuL#&;9Qb#UD#m zf^>tiG0>yGrXD$Y46kQpbWU{@MCcv1O}0Ge)7cH2ocdVxjYodhTKTZT4|~WTe-?xfvDKJb&8>~{P)LHJYPj4Hio0TLW#IPj7|(@^qu3< z`OZXCD@kn6m#a-43urj%uT`EtO)P6;;xfr<#*zRzIHH1)0CF6rWHtk7>=~mn$)fWZsV@D9tS#RQB1376t;3V)VkB{@{?s<71`3%NU z7v=kHf2B3dOLC#nV%9=U^HZn24Dcl2t7EgCrWLBA@qU`9&@YkM_M|iy-5W10ViWo< za3KUZUf>KI*!h+m^)J981xt|O3vs?8^W?mZiwXF(Fb`cJJ>54H=an)n3=Q2#WHFh@ z>&JBdfFzMgc~Rc_lY2Ckou>3C2y_(G%UF(Y*@tBliLuPKyrolme{&;83XlGExc`kL zyqYcug}3+={?=OIOs9@eNH+ae<<3rH($kG88M;$OUUxokIEfxyJ-CX$-sPY{2vKMo zt(4dLaA9t42VkMxSbgoQ-jDAFMY>v>#)Mehb>uW+%w8<0A?YVNeZwXR-=x)YWxt79 z2t8X#Noh6ymV|HRR*CbW5_RMqKuIdlL->F2gv%1Ex5tZ2gFTCk;>|7Gu3phN##Bl6 zPVMpqWkva%N2NsbM&bO0(+9U_K-AtiYij=v)U!wIcNJ^6A>!`<*iV|+5J5s0TvFXy zY?GO@8$w6>&>7PT`SPp81Vz(%0g>p*k&)1_u)N@ERbAcf2n>cz&nK-Eh(&OF>@EFq zTt6XiS?I3{ir+IyNqyos*m?Q753%b2Er{wTj?*#omh>MbVhs%em+}%Zz_uz+Od&(& zJWIk-iyO}f+EYGnJN?1=5CXg|K(>$PYAsi*jR1L}e!f+jr*9j{4Gq3dTqr*_Qd3m~ z{6DV@zoC{htIEpSygpuI2n0H)$yn-$gyG}l!%ju6T(BqPBzasRST zxZeYs0qCjoWgUKqk-%jMM2Z1H!DE5e>_A0?iDeDnI+6ME3AyjDT$eMHUyjTlcG-jM*|rU~Qx=B9nu&7wdK#0vpnjdCE7v7cLPKj>)F?P^>U-NI9XX4v{%* z5$Jti-nkF60W&fSQJg&XmQA~&E*ONhY4Tz%kySPzK!T0gTBfamM91nkWX|2Qipap& zS%s1c)oj4D;wGR?LwHJ~*616i5l?Mj(@{{?RL@D|*)aHk8^#}CYYExw*8YbPgWNem<;0ncy<_iGPs$tmm}3ytu0B?f;Yc)p0&C38P`s0(Mng zq>4}wumUHL#9jM_O6<5Q{AdrWbz0j})K93479(=K82yD#!x5^sMk-`T(eBRj7mP`& zC|9q;6JA~2-op3!2sM(V>AY^Yx10+xr0{vV8GDDPU|8U$*jNV9#9j#hVK@2sTW z9eYNGN*xMnp&Il84e8agf#mwo{0uLN7W%z9YDg%0%ERC(&^$?%la0-J*6z0R`!n8EEb<)mWiw@b*8n%N+p^43>ap{yXu0ah&<7xxe9*YBp2RZ%8)@> z1;kLWVm&`D*Kh&!cuG>zph5i^99IT)42wZ*&GM)=2*#c`8v$$uYN-#G1H*)DI!*im{8(a zxVYb*1l8Y3O?yMZ{&BCr3XL`_H0*cKd*DuCj!$ErfY<-$`^!cS7BGddJpP zPrLQNL-y7HNyNc`2>hR4{BAB-jS-uoXC35=`$*}LXAwqKu-F0Jcat1*MN$9&6<3Rm z&SE4MA26^T9$r{io>m3=u6XoWWRGZ!Fp@E$Xolf0Vffs`ZPqc~6j;(ERbFTp;wem6 zv}IU_^sG4ZeUMH|NU75F!@`P=Nfa)hb(F=wQkrWAf(q-1Qn@0t9Lxd#M%{GT&#zf) zIqRws!`rGk^t)dgfBw+U(t?2WeZcE2#m=>JswbsaQ!Ld#^HxLVg_MxDhWIP`|NB*+ zY4noLc)5vQMwkv6{aDE&$)s;T@|~*Bje0UN1_s{Jdj;}+Ztid8hq0X=L3Vx(A>~B< zz}EBe_VaIWv^J`exh|3xv@4W`)X2+)7k#EFl1^F=I>xTRBgsdq`sTO=Icd1jvF`h3(SyX*C|{6RGIpV3Xn z{SpB^`Dd>pm(KvIi<4eG>i$2Y_L&AV#o78BL;UA0lvwS~CSCVII!>*X#1DT|Tms>I zW9*NLI1f*&BA$74O6jFb;;+a7cpgND5N_a4=uuVY{l<`t*Z#oL%pz(mV> zE{b(cBAgs6!R0@Hf}l$218bm`Q)|n?-RImkfhIL`Rh=gznGQrb)~{AJgMhMM!@wD0 zWBRrba{m5l(Mz@9v&uA2nw~wOzdQq(IAAx(xv*c(Df91T{MV5G_sIXu^XoL`U`UDZ z2i>1znk4qo8h=m(wX=74d-GXa`^cYEE7Gr{P?mrIq=@8Y{yZvOi+abkBdX}<=y@xUp&V|O!DtS;Q#9Q z`**Al+Xg3C;}^X#nPnvW`*#!*5({y8vr}UPZ}5gJIfT> zI0T^Ne&0ZL_Gmq+{ARZV0}=9HQoKVko6Q}EbvsGInyo-`$*80qGhn!GZol9b0W*I_ z(to8iGr00*mTC55p3$(gvl9^H78DGa(Lc{El&ho;WEF!|8NjAFup@cw*@0m@b5BW9 z^!$Q4MO#jOgeZSnaP(1=ZSD*w{R#TdBk@1m4tLPrxxBsPYy5*))I!#%5+ZzX|DGMV zN0)TI-0N!{8@3DV)K7G;v4k5)6Gs$f2uVg3Azewi01{m+K6{k_SM~L%?z$kvg5T5z z%zu}8KN-8s%>&4xr(sdk2g^i+c;_np59$a)NDYksE?#i%I#RjTjHB$RBPIE7g}{g=9@1v1Hqp!q{1~+x0wGcC!d-iI>B1AQtKpcE6a8x; z$Yd=XOU8Hcw8b+;#It3my$aDL(X5O@WzVuJTF}SZ{6A>&fA;~9VDlc>i*EqZbERA@dHBidnvoeRJ zx1#V1Je3PYJ%*bW_?gk$QS(VYKR?OE znX+Bhmub!gk+AwR_MX!#f{{~IXDsY(33Eq`vF{CqKUNn1=bu(hl?Y@jRuTN0$ zZ@s3f*^~(3JDB6^qHor{eBwv_Vadz1Zkc=ID10T)1op+USCbryX=RiK%$!@T;Kzd_ zQnu@1YH0nWa;`ht{|tuj;~hReP=hxYekR?A&YE7k)|Bvrnib+?fPQU>QmHArR1x9E zhUfMa;bJBx!*}T?Fid|7Wo`t3NGxw%)tc~u*epGwp&NRtzs?Ec%LUOrZSb~tyAd0H zog=mhc+xPd9IV`%NFHBZ)vyCKaA+QOMi&?}bA#`UYJ-JWYUS_i#OK9UMU_lb7H zn_A!2a=Z*O4E+V=%qe*-+H-81%TOkHU}1-f+ue+?T5}tcL55j5(k6lLXnFNuzb^SvcCw& zG!caSeK8UGH3FgACvsQFvGsML==g`{>vFEk!=|A7VCt-U%G3VCitzG9 zh^A)q?TRA(kEgE!_uK6VycfJ(S_byYJf;1U$k)?GW7#Pr1O}bmPV(I9%CqqXTlY@< zllNGYC#CTH*LnUDJH-mG_f2Bxm-ABGb^3}-zjr`?*YiiAVB0{46bz4!J?m7{K$k+7 z%h`yaq3M4x`v22c;$%&EHQTY^xZluWUiTQ%E1d$UF=dkLC4R&a12tNs=xJ|^whbjd z$RNg~_+5zrq6)VGnMJlOsE`9VvVY{V%jV9cSSMRN7G#DCSQccz#;5rO9$LIJm;yyC zy7h<`p$b`$L)!UyOE`#ufsxJXACmLo6_pOVs8;T;Vu2T?z`6&#{7ZrbUYq9igJ-4qUw!Lu{8_$fs;EQnvJP&8FgBJ| z+VSDYvuqV!kvmo7r5L4`@9&c^7Bng@+B;!@v+T6?fu#1lEZo+$!*4xCrEutZmBkLz zohrh;cnmn**5FOg&o$04guQ@87wMpMoQhHAiA=r2Dq^{jkzeE0B3_?U!|u>AjsKNX z|0lEl?i-w3Sb;a?TgoB8sT;aeh{cei(j|)!wMK-LDTDyA#P!AS$Bwnzn{K*XHt9bc zv+zqJ8_q9S4*B77xge!W8K;;?`P zv~7LVPD$ekZ*;IMW{@|0@HO5Qk6mX+$w*(|5teaNN#j2JJm7V-T`M)W{*i#Q;`HN_ z==7<;(Xl*ytr>K+ytEx*d-(o>k4x{;k}K{&{HNU0QL^=Fm)*$d#TlARM6tMGVYRk% zU4bzF2m{_njpxT`;+Zq$%M{XhX=Jt~*+TZGxJt)ZM_{*A@%8X~GQ`Z&S}V!f zY>J@S*JW{B2&Bi$S+>OCm(9p14$r$Y`9}mt%U&A9H4@KemqGtg{;@|Mx2DX&?E{1D zeD)Ky%|x!>&0}h~Lx$G|9t4F= z#f{*{B9C@ftDuM+%>WzA<*Nh}LLs8$4i@H&+%94((ups>qV}Gsi70M8|IH6C{$$xh z*1D&8JY%QAfEmj*Z-omntA|v`Cq=nDX`S1d9(3bQfb@G!D;`4e?f6<V9;3gd`4PoWXc8*p33~2UxXc-SLkf z^eq4HyHy!prl_}*_Gr@&3Mrf%j1N6hxG|Ta-vzGty++fTG~ZRms>SM=Yu1o(-0T>% zr5TsiFpuP(Me+o~|C{B7*Z`x#K&Ps00S&Uj(0H7BPi>);Jd5>BuPU>>`n`bOfRtDF zlhc2Z7z*=Ml7%;x#oH)FC2SUFwI$Fk&nazrA=qYm6(g3_?B@iP(gjCsf5r%#*c-|( zP>2RJ29wK-4STpW+?CJJ-osOW{w%-`4n1;PGzfhCzRh_ z4*Uo@YYw>|!6Gw|!jU3L+9_WCpDKPzhlX1X_#Al8v){gu&cE9t_KsvaB^ismJr5JX zz417+wN$M^GIB~%Qc}qAn#=9$Na)ix%G9~5ykGwSpbfWE9`Si+(qv;nslvZCjO(1Y;_hVjag6Dlwxlc$4# ztG8*aI+!q>eb^M3#TA*wk>dQ}=1=Qz-s(Kca^G@)+K9KWlFeVBKdGafFKlvKt%7_n zy_%T3ER29qqCu}ZM@6)d4C_0~VED9bwwn|7eTRtpvG#{4()Q*m;2pfvQ*I}4%Q}W- zR}9IGus}W)mv=P@akp;d+1Eh5B{%L4(wcApHj9&3H93cKXDWZc61%SulwLF1y5 zcAUgVqUHO(70k$Lv}^ZptPB!y3gg~=&_Z#kmDdJDC#%`(SS2M^Zoo|VW{7qJTP*qR zdDnxCl4BoVg?tR;*^T|(a3h2FhUDcrqrQ7#>fMWtNFu*&sB&682? ztKqMG&~W&e`CEx8HFoT`vgu2Eb{fueQRXhb?Ucs(_paPPXxKnz{Dg~*%Bwj5`k194 zA1K$(sd3*50#3k|C;kR>F#gS8Y4GB`U^bgYuEx?@%KA+|Ty6Su8ek?SRw#mIT1J^pQym+Lv!?%KFP zT*M!IzL=q~!%#+M$t8^y9i8iyrA5KjJp3!7SRaetTL>j2mF~e_1|drvqFQNB&+ngb zX9(Q9s;igvCtO1fH68`zC40vh17})|d5jmAD^dWK^?2RXH+b$0#JMm?PdFeTi34 z^Fu`&*uK)AzUGbU`7`7x6zjyK_(7T}RdebS^}6l!FrWsEXo20B+)sj!JE!g_qNTY# zw(A9g?Nq8x>CM;07N3~qOVam>i!f7gH#1H1ND zJXIR&uLEO{%;hsmyWDeDc3Y!4Zs2528-z`!98y^fdOkODBrlLM!xHF_Umcv~XF&ZN zAC(UrxbQCp6rwqdwl*FF1Q58#){OYNn(H2{jxQk;XET}p?RTXJT~(46WhYx@Foa;n z8LM6nw<7-OC(ROgnQv$E?1)X6Ol|2{?~;QMjv2ArcW{>+c$H?ss?ZWAVGU z7(#t8`5Ui zy%n5grfpjPR1J=^aBH;f!&J$;T15u0RMS1up4 zwF9S|H3<8s|fQWYL2nTQ0wypz(RC5vvNRc~nbGLWSxWlUUGvA^?Q zjLfj_k5~}{Mb03C3RlR#<^v=XO_p;msC_%lF_uch@OVTgs0oQ`p*27F`_tXSmzl^^ z3^`k}KMSA;nA4}6Z6Dymp?;-#zRHr%hZyy;7W{7SGCYl2gL1!|u;IZx++F|<73UHa zpQMo|VAj9m>QfJTYrn%$YGeF(R^h=O0)_N=+?;mns@l6(?B+h;{QvAIL>D27k^ z8-gsjGY0yB+DFbcH%(|$b*!$LclPKpd*9!77y#?X%lcdpS<+LF%uq8U1D&(e*lxWB zEX#9ew+n1_)9UxT%JJmQXl?c)(=|F!ZSFmuXBTrkBA6Ir*CPPlr|Iz0y)5Rt$64_y?3cC+ z!0UV*>=*w~alnB)1Ozun72RJBT|I?8UWM+xy4OlF#n|5+XMOxAT%abVBO-;rK(tg`970JRNU<1BMvJgk=*O== z|GeO|8!wV>O(%sj7YZ#%NLDFn1wm{7h)5`m-u2$fBxb%*MQb=?F?YyT{!UUfmil&w zF~I31DJyxRU0`O_H?S9*8&{;|wZ8~`gq9#E6pL{1D5 zeRgb-FoV>upEU6o6JWg}!8*A-Jh4ZxpBzEB0p?WNSQp)K-kb<@qvvao9+5#IHzL?cZN*ZF_Z_DyScz>iyjolGr*uwR*jt*qv+K zQ+dMIh3KrYEr0qpZ^rASnX`dCxt|?pt9Gc=>;iZ!$6bMSSFSvZw1Lg7Rk25=ydB=_ z^+KGg*BI}x=vcL7$$Tyf=FEwg%NQ)3zgrue7aHzjd6HkwxlXRxL>(hSb;1Jy)r;C& z+phnl@Rro{AH`dD63x0li1?c{&Z+OyN*rdeC8^__Ye$%HbwQO7GPqCkikG?mc~}`2 zsbLJEIPnRPuGFYGRJA@>4wj@s2^T~9rCj6u(04ZSrAAj?{0UMjS8ARpi#$VwIY>rW zu@sV(D2#4){)XgiM8_3Gv%=gS?%B5fHF2+VpGdgBPgI+MTz@?|Lt>-peH45JDNBlH zU$}N(BEErN>xT1#6z3(gNvjc$v(=-eOYf~igU&5*w-qAG}_(7L)f4aSx_KaN%YsiGl}xB zS46HqrL4MOgR-~UVtXEXp&SUa#1hUHz9l*nTl>+yHx_PA>!w!3c`@F0QLG3-m?!=t zUV5;|xcm8X{}TI7NW;_0aOn*+-_ z)dbkT5lr9wsC2=)4j77pJtGGV(u0NYcQGL>N}sLwAz==?4^~RcKOShq*>?u5rciuX zpuNQxZnf2$C%vUT#k*1Q*G$ZkB#0+Zpv0{o6ITichpCn#OHm`5V7T&MP|dsBiKLO% zB|5>HYP*20uU%s&=Gta$+1cCO8&0*feh(??>P|5yvRw(ANDHhPUVwMLY_h{Ci;Ujw!LKa>b?I>N^8lcj6XSu%Fem`5*pv~ zrLT^PMi#j4FO*taWuCIaXS;crx|}*8LG*s;y5LX7pFlto2?xZbOi=cHg?@jN{;v0D zyokqjL^o;eXwy)BdZ;@3 zg%$)T5ofP-8aiUzZb-8|KiFk2NKnjafGSMyFs$k|V|uvfYj3Q6mQFeaHoF@FRbc;b6~#%n7H1KZAKU9kQw2b-YB9GC$uogu1T?VD(5zCY5fv|6P} z1R;qtw-GLp(L0*4Uk>?%Gohe&8!Xb4d0T9us4x>5e>#geA!pW3Zxz+zuVOghxug7! z>MY}Vr?$1Y_@=P3B>8XbO)q0m@q52n^_WeyeOnqs3>nyZ8UZ6bKLIQP&&rFP3;P^7 z$~GTBOyLkQJbK{j^SWv2lDcQJ4@L_nj2~4d-nrMIGj$WMqMCKtmIVH)ktPf=g$(FL z0>W|7zO@3-tQ(7J+*pf&ie;1R3`rU<6P8-^;6p-#V-fZ#v;Ic9sL_f3Y;6sV(ZCri z5Vz;Wypw3Jak1XiZ3F@8X#;;HapP5caI8wO?EJnq zrMu}jiWct945?WwzA6)GCa$tkU+~vyUN7_lT{`9Ap}9IKcAh#AdQ5$^a5;XnshkvC zZq#YwLT{q_4RJ@#ucFT^2Tp1*v&gP z`x{tXoLKbuaMEP&*00^!9xMwaH39>5gn)s2Q5J>xsPJpp5J&8U?8lsSTVfvEFm9hZ7ef75zWwe zAG!2bw^2J(Cox4RE5nCatNMigO(%%I)FM#6xX9+^C6pKgu54lZE3*x5jz*|@oI8Lm zI3|7Y2`UBzt7!kzOvTxZACid z@tomv(OF*n7f%>WR}a$KuXd~x?XX(t`^|d&z4E(te_l=9s+R;Rb;QG_BPu}X*r-9M zZ`8`jDRVj3lnxFKQ0NN;*}+fOayw|blI4*Vwo#CeCz;sM zxpZ{4@5V+mTLlwoh(q3jVyuOOgj5=1{|1ir0mS7M?p&)l1N~+wDMM@)v-*jdWJxEf z$>R_wNFDATpP2Usjns6@j8ZSDK?-7zjOD1#Fwpg>@sP}@Scd(keWZAB@fBlDroU4h z$4V(>4F9fG^N4({$S zxVyV<{(qgl_FCsT`#k$*&sERGS6_EeO?7p>Rc{edOw5g~uczrNpoZ;3Wl!@d~>s>jH8D!}F6XnfNpVuO-aWA|QESdAbfdn{n#!c3|$I0W|NlI>j>S+jz7 zhWcC6k{T0`BwQvCz2BVu0>?Q@k%)nz=(VaTEE>dI72T-9(0ZMxv9XW}B$MQ>i_@Yg zS??BsZJ_>=JTcQuh*TpWSK=_yTG=0x!syv?8!?{A+1SzgphNHq zuFaVdloEV}?)DS_S5v3f{M>Z849QY{vtb*$c<8bQvRbQ}zb?#fw=BB(31k2~yUGWv ztwpRU$Lz4Ij6q_lmEjVU-&R&0&$gQQEFX51W)>wAEh^P{5bskuPDZNbI||CTeXOz; zUqJPjuxTD^4|aW$r~F9jRhZT6HQ+FaIw)8~6e{zu043T)$zLiasqR=%C1$mWqP z$-``gsYB~RIa-m9x}8SOmZoXF?KWh;R&;{a=wIafUUy)bpVsPX{aI-pU?58$6Ky5K zOotlZd=N5=vYK1v<@U(kS+l0ASbw{gYQ1g;cen)Pje zQr3Z^dH$M7T@75R5zr=c`1H1(S8TpYXK~eQ{;XY1h*s_GVsf|=1(oms#y=M2{b69v zt{2$^kFGsUU6kB7O8Y?`fC@b@QgH%yZEKn2h#C%|X{D;r2JA5*#M8vm2R?`Q<9~Z#-XW)TyfAiuvr6!nSkP-%|`f!tY#8RM(o702MFD*JgB&)ElaPGc*|PC-`Pt z+os?nHt%8oiMZ<_0P!=u{A*Wu&N5Ou&spE=t(5Mu)ib?}fix5JM~ zM#`FK9(F*^t&=V;=9pNp73oUp^NmmXqTo30CjoRmL0hBu-xEhUginX(!hRSH4`a{c zu1X7L^YCTXOWuRO)$CZ>ff%J@i?Ui))@t%E%c*|580@+auUT)v9~=X>E0b0}9QE~v zvGg2@l=$s0Z`rYAONIz(9!`Eppr<>KzLX`A@x}7FAQnNBUiVHPg`6SeWgBouxORkAc62GRKuYaTTm@YohHqMQjL2!y=n{aclS*7INg7%QUv9aS7F!!=b`B$Z zOz8=yd{1RY*+oS;NM0@YQOR);ngoe-h?w#o5v7qZT1HLFHI3#rbItU>O%>mNdJ5+- zX(y>0nenAMqK61)TY5B4sz5-v9Ca$;NMY(BIx=Q{{k%GqR7&~HjRf-Y>L-czHKSgV zw}dD~LFCrw(i)NvY=#q1q{76m63qW{IPef|m+SN4!p~k$2(Ght2fe8$$_62YY5JO7+Ys=v` z_VD=jy3^3#2jwF_aq(at{fj(gbrTko zx191%L#eoeMP&3#Q7Th&8#O-&f~PX20~Q)4G_Wg~7+zo2+Vf6BHK@afYcJMC7^AW+ zRq}8h>RVsu+<6gbEKBO=k$XIH++s?<_|oXrNVScA({3c{vPUXTVy@<20~nO?`P}WM8U)cj0s1UK^tL1$WIjU4Hddu_w|N4ezf&(9O8ly`$>-RjqD;^PPhZu3P(rlk5x7tiZpFK+J z^1CuJ)5!kraD~x-oVIZ=&^}qbT#bQfeTm}j+91K72Zgom&0u#|UZyRLElUZ^s zkD;(EfHqwl7S=2t@>i>}L+r}R9jicm>WQNpfzh(iQbma;A>&nlRq$R?%B~e?BWT!4 zGJU8n{q}GZ`05-z2XzeKXq0$5dT!XI*!(v?hGYkpS$^H-Z> z(_tr&Ke>CW?qLmb>eQ=U`oNcZolI5Mn3K|eiCXs*WoaM16xwKZJk^&4N2%v^u}g)! zDP%{esTvjujb0R{iAow&v!5Uj%XnZBq(POo%9tt6E8^jmsrQ{YDMI6NFS63|8`;|( zEOFR=bOSCRDXF?G{pkA5h7d6cF0XJlSH5042Buhwbaw)+`|jKkpFTrC$dbo;l#^i% z^%j6ru%}gD?TIO%O-okY>Su3%yJ+UVm0<@#icHv!O6m zzy6N1GC*502RmCR|I+yZJ5XsD&A}X&;`m+-{p**23GL!C(zSf{p zo1TYl_rWQ*iQxxRR}>~~3sfXK*6Y`wUE{ad1lsN^2ikqwRVHt@y+dthlfAp_^;Ki` z7qI2Khc(4D5WY9-$?<3a0`SEGa4u6iT$UCOjD)w+@ocl`mt@ij-9d}f&hO8}U(9a{ z67nlD9^YKKQ-D|dAgQAh!|XXg+ryr*-^iOuMbt6+ULe~? zRv&+}6H#^iEG%u&LRw|pMql3r!X?NZ$emTvIsENj>x?VcJ$iHMG!Vp5VGdux0D4*2 zBW*D(@_?02S**>cj7-XS^z1qO1EU}~94)E6{$Vy` z0@pp&$^JG-yR%de2!L^G#U-SYm82!5gnvnUp8tv+-F1gx)59uJJ$-^tZl({uvXAe| z?ek8_YS+>730OeZ{1(T46^YB@s2YxlsF*15biKbGXQ;Xs@UTO0O)Bz5O&QnnlNpY> zBCD-N$@{XnVL^;rc$z@d_a%Fl%I}MA(GG&`HRr+;Q3EY_S)e!h9!iwsp9qTaZN}Rb z=ol2Bl#7EtC;G=P=ASr*Y1|(CAv1yv3>u51(d&D^gJmlky89rwj?esZ4koe|E@cQ;1^pRx=vikX4e9kmqqw#K^Zrt_QHjmIzG zKO8rou)qC#q{7TADx#%*;n-fw#Le1vuOZFG`jr7T<3ur@HN_B-!r3YnI;HQ1o?$ z*o@87$`zsQ5tsb$T*0S#h+VE;-`j8(kM@s5ed#02F*MYuIufoAkOKnWNpsFb>C4K^ zU9s&Rqfl~1MiTIOTnuqxdYl#o?VVg}2f4%feQHKK?V$}=lJo`xloM7RbE4K2{zEi8 z+!JbufWNQnwARiX{>xn$2QLME|1OKjAs*R%rd6xlRTqp6Hhw6> zsmAI^APo@zJ8T3k=-Fy5NfROVZaU-i{aG|zt~JFP#q?Yf;xLC164o8nNU1u z=&zUZ+&FJdAtw)Mf5pm>Qa${x+3< zd7o|k(GJDMGN=Sj##PEf!k4EGb_J}}nC*GH6}()ahWlUi1g)kRv?bo(lq6S|w-s@P zo;!nTe&E9wV!zh#bTx*zT?b4BN=+F&z9!cMW!p-v%7_yQbH8mIZaag0c3aM`6pChL zn5vac9E@WG^GgjQmF#0v)3?(~HQckap{O6>b#cn-j;uy(rqg;WiO8@@P|z94(cIM| zBr4W6AyqVPtqa58`T8IklHCiHCxmDqlgVH@PT#tPguHIU?Y|LC6PgK|2#M6E8yu1` z6$_4}vCZp;HIK^VnzQ$+H+fweseQ``{p9gv!={P^RplG$t(xZVSnUMb4t2Vy; zllPI?*UA%Uhge<5hW@SJY%iO{vx=_3m^J#RpIz@s_`uP{UK7Y_@1r|L5|hUUihJvt z6qobcY;kQ!ltWkc&Q@G?>HF*TO_HG3^4i>TA+(4{emSE3#VVk5wD~?bov^R@z;;jH zF@HCpt8)c)Sopx!3H7HgGG3>>cJfX76pIQm;}?{-U3H4?KP+eqrO9_=kFe!?Q_a@3 z4^4c}y=Uu{ni;*wN2_xay{CRyE9n|Pelt)H(KDz}p|e2QRzxo8OpI}Y5YLXYucOt(a(RRfBD4MF>KW4N?vE)l|zf@Mv63T|T zuN)rocyhQQ=LMX-!o@$iMID=>7f;i=d3e1|#o6^Im^TNC_NLwhVr0EooK;3q^(@}( z3PxC-A9{CeF1JLeB*fO2tY{41(s<~g{Awh~p>#M$bKSmxE@LD8RWVn&kA{Pxo)9>M zMMUH?8ND6v+?! zGLmgvt(=fWU0|S-d(vhRp^%%EL39KNjaJn-YckCngvZ7eKWziX$y8_L;z44y@9da`GY7@;B&6Tbt6jr(G80`SR?~j%b z4+F)JB*~+-Bp~DH|Dlo%S9~yzJvLX`xp7Cusktl%3=vvb$(lhM6E0}bAKK|HV%NLN z-5&!Tg;|$*`!=jZn-qE1s%J>?+&ckk-B`8MjyxjJs}VCi3>>)&c6%e=Vn-=Pv{SUs z5V)~F5$8U{k9){se}AhtAS%6jC9hTtL^kMu3rv!VdUTVs*jojFg0q~ zv?hlhiOP+*%R9j{a}O!O#0X(m{j7b9ui+lE`NNCeZ~?HmVu}WMv+HivrtxOd8M9=Z zGsA{M10d~7&zz<^9Lw5#z}KPSW!+@4Klh2YYEhMBYrlGWV$lX2Gu7`8-qM*Yw~JS5 zvCe>ORBXFP(t5cI*HaEUqH5GQjbBmj?pfY+$pf38TsNr@m3SKGDDwEOQTb0J8^g_x z&yqWeSZEL{&Wi%Lm+PUNR7FP1Tq<5e%TstIMe>n*nfSRM5K$ zMK+PJERIWlX0Sm`O$T**??Jr;ei<31{Rt~z*_GXoEHPT*2Bxawk1&z8-;slajY+~= znB+1O0f5&PT$U0ZntJjG6D;?kh`)G3UZEpMF&6m%;W3sARsV4!Om^6Ku9e!Chz}lo zG#HX5_FG$mUkrflh;CsceX^gL<1rvhHJ}hTlM`9!lX=vqHldj9r=Z0__V~7SCvv8$ zveL57oSZ5#!2_fV9V8MWPOqcGR)~qV3i}+8y(kV`e`UqePxm^u90$8hbGXSk+kB4y zRpE&E9~03RkvI-)l*sJQ&J2mqJK~Aa6WA;zW>VHHxbt56I=>5q;D9seq4r^_-PyVM zPmom#foGZZb{KexvOjvg#Zh0yA~gixS9A4Xug!i2UIk#{>$VnkHkI-9=N{t>Go!-7 z;?=85S917o8;S(v(Phe?`j5NgBOXnHvjDm^^*K3eT&H1*)cY9#?v{kalia7B_7>mi zqO?huq!nU4-muVcuL59`4?*qrS{EuoZ(LSmaGb}{PZ@p=1hc7jyioU1skXS%&}O@0 z_)Q=`uS?kC)Y^gn!_nLq!yA4*QoWm_@@sARg+&Ao(^VS-*XPyux8~y!+io}h!W1M2 zdR;e{ASXP0+*Qis2}eMz0d}G*rwYdR-o2oJW{Nesf!^ZglDBNwV|r6IT(@Ql{G>$1 zL?Izn`;Isn-A3<3D+|S6r4qXszhUz*KlwLj_bT`k6ztriAUme-vD1|N&h9h`9l}kE zGxRzB5iusu?wLJ2@%JTVg^!=Rp}u}KNnmW(QV@S=wzzK$4Cusca{X*~zQS1kI*EHv zMLT<2^sjmpsT`Sgm|39xGCj*ViG;?w-aYW*N=v=fbNC zi{)yDs9w$avo`L2S!p#ElZ8c_5`sC``2D+yk&?g?a2q_y{oD2F0WIQp-OmOEa}(M* znk>GY`7txJ9m7@eIo-oZlzhNmC6`k7@8!3pO8SnBwWTipINBRg7wT@78ALhS-24&* zyBcboHvT3hOm0ddkkg5adh>9uBk0XCB8Qa4MaWY9GS*6&sI0Ecw+_|~2Ig}F& zd;VG}eXVIAJM4UFBEtZ?Z@ny#ng_=QCG26A)CE%DOPkK?muOW~R77GlG5lfwk0|3D z+Kz@mjHKtq=Zm`f^3z|WuJJ#XD%!wEDLgd&0r@jtH0J}~Ljn?`4B^{fmRyPvTJ3o~ zO^)vZn<>^Mie>x$ah`s7UP-k&9el6)1eIM{8kSV3f+(~YT|*3vg~&51s&A6WCD*!v z+sg2mA`Eu6O9})Q3LLBrp_tKsw5!pWwhOi}@h$}w1_hOdA%5@y*l-EkJ`MWZrBGj} zJLxohH#Db?aAAPr#|U%NUuTq?dC~hw#SHAQEJoqvwrmpv7s>SCJ``UzAE&B2JBO4Kbp%K z<5VXBV*nw}1u%pgAEDph&FN6B_zkphg-hx&d83$QI_-e!fhvI-*@7L!+)B)R&8Ql>JpY@lVkY|8gG=3X){yC}7aZf{hwtNdkjq#eit|u3p zJ)HJr!RnO7&Wv7mK|H45H#~|Zv-)N+WDONm6?pP3Tl#bmP7p&Lj+KkcCf|3fY0bf! z4#RTPCWZ%x6KObCX>NQ;&LHBNQN&gm19_1^(ARB!a{zcj>ggh+V$<@bfwr9HRm!q~ z*6eMVlrQ;D<%`yfn%`0Uil7~dqJEMd`v)A^eN{5jq^=yBM4zZ)Xq5VozCj#i@kCsw zv!R79Y;Wd4W5!W$Txy6gWD*bvXsywU(2Gfk*3pD)&@A=ZKo8iKD@%gRi)CA!)BS-1 zNF5~XcEw*s5}dxvGt(`SPJ(AwF6)Zv!ej` zO-k+JU~qh2cwLkNWMsrzRm10TfHpn3WQfk)bOk;Z`x-CTF0^r|^0|t~ElZK$FlPDzQ{|HxUmtElf;5{&atj1UI48 z=J9xiR$S5e=^p1NcyZXOuX4qWEH{}g(LDZYwAGl?t2V?5`TA^)b2dkw>HH>g{hi!Q zOwR6hvY$Wx7RLE>Z8h+=t_)-GO;Ui@WO5RdVoa#PK;$ul)vIjTExkiH5akr>hxF{? z?7Xs0MG9MsHp-3`C|Z+(oX1{#Z*1|r(NMLpI?^+%kdcqFvEt?RAOVj0UWRb7&dE7P zGjxvZO#StPibAmBaZeAKI_)EgFsgLkYWZp=6p1o^@896t4?nrW4W9@OjkH@|-G7SY zZSb++KgC0a;wyhJL1gzauAv2K*fuM7Q!BIlc?zf;RP_lA)4)L=>P+EF->1Dlq&}Vx zT^JsjnF06o%=GjG*tP31i!*((4@NfsAjG%K-IO^FwaAMwC&RP~+mN2G3DAcpL6}!0 zte=pUr~I_HF>PDL{|{L1?Weo-;la=KKpk5r*je z+1oqdJN5Eo9OtDmqEd(izHUyL-M=GigYI+QV#*#T^Ccw&v|5fCE+2Oi-!oS9o(2mJ zS>9)+=u0t3-fzQ1K+51@oQK2A$JJ4Z-9x+|Fc2P1Zku%eaEzs!Xhd<0{uA$j8D*Zx%L}hue7fFwBUeR%G zs;ZhOJfn$LtD?tv2sdXBU%c|I>`aE#=Br;y9g9PF85n2 zguQ#}o8_{UhkCqwA6V3PYX$z&*Zt$k?7RI%4+Ky-7ee$!*mP9;kG&n^nIFxJL zTQ_^G)&*~V`0P--d%cZc2ph5!UMaYv@Q5We>y@pV#LV{;)VnuPiw73>iF;YfmQXl% z(xSN?RniKz8+FhvHSK>p3`q2#VR(!`bo_*Z%Tlgg6hbqrw%=&UtzB+#_Ygo>&mO!{ zxDZ~-J9V=QkAc6^az#&@T zipPOZN3KqLJ>5XafTKO~^=!esKN^0f!*qq}6ZQVqd^+n25jID@;D8?5@dRT;g<<*E z#k)I}cn+q$xumcXPBDzGRV`p2QN>?rOHJCn)MCRZ%u&)}+@IHgj@CatnuY!LK4>fZ z^~Bs@d)_aWCv{P6&WfD3I$!%imiIK8mV#Qg<<2=u{lQgYGHuFb8j zh%S5_VTSWgN=d`>Cw>8VhQMfwB+1O@Zgrv$#ZIL&ZKS0@Ji)aFl|26 zT8pmikHx`a_m-+%%x5QdJHHKVVM;{2$FrBDmOs3{oCob=S)jFv118|b#==Kul-TTk zL3e}O)cQ;C{eY{=2uamQ)2`q-4tUMs6))1(g6$(s17k!Rg#-Ka0_xeT;js|XClGR^ zhzRgv7B(suSLDH9)V_!<`J3^Hj1BYGEJ-S|KQ>pD^e)K{DNbh=%8tPzjmYS_m<m23n#0l5d?eYN!l+SY4~1=9&~9UA=#`3*8B+_~?ESMvTAj_@7j4S@6Cz6(>FADLI(RWh3v3J^lkS>E9SX8+-i;qDdF3kY=Bm%_st z?0nfgVumYME>$R1lE{~0U`+ZwJUk*fGAuD7F)~8F%QA%K2!y3&%~F&brc1C##|=z% z8Pzpkf=cN8b$V8LgE$5IY}5A9Pb)1fEUlFGlH}{>0FPlO5uI-wlky4WPUu!W#K~xY zu4ZMzFl5!p)6fXL+hW+OjvDp2Ce{kbdjT;L{_^Z+HVglpPcz`sQzGut78?nuo%@Vmrj`+pnTM5k;JTk zyu2p=3Lz{cW%Wa~z6tKbaO{p0cu)ET2`YS^`SQb?hg5M$)lVR5fnJ=*PxJ zsbi@_<_#|Sq5S+-A2H9aj(k^Ewysz(sOiCsb!y`=N?Dea(okdlbZYPFSOX@)<;q2K z!F^lR;gpkeq2EIM7yVTEoSkF(T)u~{45Wy#q)(^}?RtPFb*xdrb}5Ywj1P2Y%xByJ zPRD7 z2oxoyO(LdHpos}9&=mJ&S?l8Ouq>-5c`8AiOml4K%~C0Dx8 z;D3GPr!&9p$|iIs$J}~3K*2)VRvgQor9zE6KO-puh?ITYh7IFG5JN-uiik!~-Jamw zT6rqUEv+f?+uEQgC4@X=kL{I55bS#udTmiIIlsM~y|KGnC!(F!T=->+RwEt%s+Ju( z*jlXCF9$SYh6vx>e20t^XN2hfyHK^@^;eMesPMw=pz`UyU;odL~jY}GR*m<*7yJ#p|uzJa%D5`&zS;WDOomT0Fa>gWke_R=5 z8le#loRvOGe|GCX(d156NJ;F;HYM-5VoxYv&o2t@Q2;hU>$zeQjJF+I$hD;bVphF5 zB$bwr@@HpS{fA47;`o$U;WI~0z!Gu8HZjf5jbEVaa-GJnpwPsKHAy7 zQiie3ojh6V$qto-F)4Ya;_7pCUlKzH6#%;Zm$ZL__pk!P7z=rF5&OOR3K8H9B zY?Nk%W{Qjw0rY?KoMeEZb~;+)$?g3|%!JdvBBFks*m?4yWBJ{mKQ`&3B_2gwOam=c zLg*V3T}md4l5vy-fGc(`!@OVuH#Z%Lp?9>fNY_qyduxRrD>)DiBy0n|}YbVWPNKFZ+NmT!%l z!-7`CYgR0_EvllNpWH7b`Mdu7Qy|Fa$;DOhQ?XHJ>R5-lP8~L|nz}XKdxCOI83RKi zL84q4?Y&+d$+9D7wPX<;pCfIAJVLqGYm0WIvu{zEJ0?P@K~qF^_qqv5jjiR-KH~>= z8OjbBlO+GF4?m2vMvzS?EFG7)F4ENYzx7;Ic&?_0l^{}4OOziUd4t>)jTSh_pTBsO z=8IVJ{rRhFeqlDBIl*`vezVuL!U@5~zT)A#bQ0v@#mSHkLV_IOKPty5`Ob^HTg*g8 zJ2pr)w_5NC^4EZDuqo_3?Z;|1Oxs?$`34F*eMP|e$?Ein8hx7=N;DB4M!MK$*)HJN z7j7EWT1|>V^ic;jM9qRDmxYWW7kQf-Ob_8=c_*OT|e|O z%nV+2@PIsKT=AS)vj#(Z0Z029M+U6?&_Mt$5|*7qaM7T;sqMf)8}*Y8x7r_A4dRnJ zjua&?#jCg;iIBNrLst&yno$-3H|3wCXA}g@Iti{GTffg z$2;jmIrNB^Ekxd$rloM7{CW%*B*YqegRSkth)oYDq~ z3uzZC{t@)QJ|-SjsiA+7%vG7$HLg))V1(+5 zl3He}FzG18!b*#Oh$UEobU)Wpdogu#sZISaasQ5P!|fvwkte=dfAZbrknrOz5th{9 z*z*AlHxIeg&c^*+4y-7gKQ!y5znL+fZ$6}kg9c;#cM%a-`#gyo5$v)-OK}%&jMbt{ zrD)sr`{BH049f+x%|{?iBwFwK0;M))yy{L^eKl_O_Wv#b0+(4PDr}Do5p!+QceCDw zi95e{xyque`&en^=}`HWYDdwatNWBU2v5s!#!p_@ihrP!{SX%o$ zO1s{ipAi!ymgcK+iAS-U6w%E{kxaT+UbZ0GxvSxzZdbVJINj*!@4_36q!SB|?r4q` z|C5{GUzu{wRM!csahu6VaNO>(b&;ZFPYyk9JanqJh-;mzBi?~EI!bd19ENjNz15XNIsz+6t=k%8 zOe1r(CVF0r65ob3ytU%ja@~clnhLMYh-+cfkp z=A2RSLNtY;0ROLvZ&3X{r)_;HKFJ2Ab6mh8kp-(|sC*Brtw>F_HFX?p2+Xf5OIkma zk(|r3HS;oeAuLmOQ{LvE!kydAq1NrY%?q68oZe-vQ1UDTU0hszxIvg07%9@CCoS&x z3>k}0@kM*ser5qbrB`g#_!9FmC=dSx_iZmVGLY{g8Qo7cYq>BoxiYxb`TQfi zMKatsoEpDtxciK9!kJb;Lhkh9o6!q5b{&T7xmZZim6@*f*k6L!8?+Hp3Up(io_8}O zeD@f?R|!EuQ$9&u7F9(_Z38`@ic~LY>36Jg)N06iU3s&-p}2UIMRzjiU( z)#p@#>4LWuj|C+Hrm^^2<9~!v!JqK5L+>cVx?F;Cdimz zwuQg!M?IEK0@XwI*Z@A2CsFw(uOglQS>>=m7qV=>BPvWcLCW-+fhcWFw5ifO+(dlf zBZwL^S}=$qv5xox8{;jeYbZeiPMt1NqIrV89?dMxXV0g3G=An@70X|~GfPO1Y?t!l z!S<@}8273f_FYyeE;;NvS-|B1tz>^oI)BvZF0Jg~F?Ro!4*y@L9FdOe1=MJ@_6t~T zkmX+Bx5?sHvQbAafKyM3`7Ti<{H0K(q zCGs)gnFFjywgL6(3N&*>2H242Yat*qC28Qfi5?KV)>R1Az zMl`;wzyBkm^ay0oCKHF-A!ja#D*ghhcRWOW4~Q6 z9%ju#uwfP+=H3m0o}(oP<&(~4y`gCoOzB~oYDt+gMa+g-t&XlVKm2;FIYAFDA9Uvw zQzU*1|LZL>gD74;=Ut|JG8tXl-Hf?*I++073wH+y)D=l-OaZD6eBeE~&aiKtel#G6 z93xTZ-5XPaw(oeM={Q)_{%r3S#a08UL`I+blEvmv!Jv6)XL7kGsU-C1(K7b5R~sXc zpnZO>RYk=Cz~g>>Uck=sY^xup34AdEK8__LYsn~tFOO0}Bjw|(J*^X-iGKm2ePgj3 z)Q*xu?3n@Hz|9{$fQE0Q&H1~ajqYHFk9xR8z@I1kDzR|f8qEqxiT ztOW$Mo6V_{YSJ6(I8o(OGx{2KeEPD`eu4Xpp)5#APp7c!Qq@8bA%w=xAl%WBS8cf7 zU{6s{62EP0I{PNKUSf1*wm=#FWb>j|BERLY|Hr-I5G-R19k(XvnrdMwf4)!JdWZ94 zZ8;8wEL2)T<+@nlVjx!JBNv`3d`;fwaeqNz5l~NoRiA@F`nYg!0>+?br=N?{7H~an z1RLH~Hr4P}$6=PS)@jD@^KEx_i%Xs<7uOg}_;NZ@P|2(Q`2*j6d&2mx=EN5C(CNf^ z=SrFib#DN$CHesQpwc)j-EQYp^!0MiS6fw9okV_EkU61#4mJ?ho5cQ~2IB|6j*?Bf z`ql=wy~3=Il`8TOf^#rRqJ3mdv2RnZ0`7S~UYcz!0gRo|S3yNEM&N?nLg9k+kknYZ z@)AY4h)tteZw8m%(Q&!5*Dc(3*Ik(FFC_dDI~2nWArs5 zLNEyh(4AcOBs|FURBlSbKLDY%)}Cj)x^7nouFKhx?6fueaL0L4t4h z1JQy;kF%v)c3zqter+9FnwY?Q;Co^PeDV2vyVX=68hmSmmGQJJD>Y$pH~4vaXb$8C zYCg(EjoHBz*(-3h-@3+0YQ&HGl1U)oCjN2|n^7qnGG^=+@#qE~m6#}5Mn)G}fblLo zcPpEV-+N1IarXs|1lZFXbzCk@lWW@~44a$tjS}=Jkw6Acco@FijcE%@3Qk*FGwU`2 zIuWt`mYQhGm8rf)4Y*NA!g&`$Mks`E;qS33v;F(Kcq7T8x*)BeX3>{B#x}7)t_>>p zlr&QL%3z>yA_=Kf;ud!;D)NthHsr!b+7Lkm~^Li^fkrYeu@&ckQj>1zmC zrOpns)A1cH60NUaoXj1W{I-%U>-YJKXS~G^P&H%2NQ;7%jkeJ({_EC#(w+Vm^uiUz z&3z#SQlEpf*|R|Oi3zWSd=)=l4- zV*$KMFoT(Z;qF3|c50S)m7n{>*nuv(wM}QCpv*}Qt4Y9}n`h6;DED!tUJW!Qfpp5O zf~vK8>2GewKR=aS?^^O-dmK_t`8~R7%AUhejEwugkEhQwBnPmWVQA(z$kRKDUHKXV zL5~4^)RH@jroMVL;tMQfOoQt!(2x)=Zd4NjSxy$XNt!$Bn9VRpRym0Lit?M`_147a zKXz~;*${e}uqRCGgNJ@$fk|zhXq371H-DoOl;Z&sjB;NT(O8r+b^RJzKi!oWI%LxT zUx?USe~W4b|Nl{$FuPwW(W0C6*683*$7^b{I1X9*^WX0^5+WfwUqp*5y%14zgMJ4r z29Mpto8z3Fk30W4oW9xCezn0y!M|8?|K)nicM|`Bc ze1%`iK|KcZsR+y&I*FvUM!wA`|7a$DAT;pPewnM*3YGIfqAw>bqB1m=KOoENbm)tM zDr4;&CS5ImF7wUQQ?EK=B6sehXW_-CQd9V1gWKiXt5`xgFA-H&w`I}TCxBZq;4djcX!qBGd_7HlgB2sCkjd`}I|i)GpJOc3no+oNQdbo7v7F1F z1@3%TT+Bz_W(1NsIlL|1G^Ih;Q@k;(Il!sFb;?lQS5Kv*Mxpt(7t&X%&|)K7nYW7XT5Watt# zwA8Q_4{vtzaP2za*vpc*sCjO@9;^oO>{_L=6=9IaDrjkC?;&WMaKuqb6861!@QPd1 z92EW41j*+<*XgNKEw^A|3XW4n>*^J^2moXfoebvgB=dI0g6L9~%L@!-83wHQq(t|f zPFYO5g5kvwE-ofZ7KPIZUpI4f*_}-y$}|de?KD1VG{yd-wm-_bC<6UnuiK2GddCV~ zKdykkz5dQAQ&94iZbnY5``8lD@A`5|xr2RYa^UCte3fLm0Aq<)&c5GEQPrzD4d&|P zi9kO3-5eUy`Wi31#9l(y+J9U&8}W7`T&Ddq;fwziz#UjfCR{>GjuSS8d}VdHiXJwN zy7Cu{ifyzzSv%8i)D*_J;c(M_*#zkC_a^Twj*i^GRS{?8$ZK#U-f^i!s2{??XlWH( zqjgVKbS&3-^uK;#KEhV0&)C+;7?QLr2E|5XwOLYUFu6_PO@(n#exsf^19&+RHji=U z4Qx=yQQRRo5BoqsunFaHH*#6^I$klyxwzYaiCw4T+JqYn_E4cmwO*q)qz69 zIYP-iecGOGUi0o^utZgFhZ-AXqx(^-Tk&s9Lua+9c6`ygto%7PdwQ=lcO0 zVq)Jf8{Vr%@jxD4ojC@3%^NKgj?Yy(>}1FvJevfFnAjDW-57_KFR(%L`^xBc3GGx)?*oPK;{bDaELEHx@=d3TAOE{lcg| zs6%RB;YQE4z|Uy@0I=ZPQpJU`H64J9tpq2m>`(t;#s}Ce{ZqAT`O)0>9{8|5l0%+t9Skk%h|3;AJJUCEgEpHVi|x zLX?xX_>#^Y&by2=wpQ&TD-#Dd^ZZkZudI46-VD04t_2<*r@a+^D#0_N9@ihfb`(y+ zVfkgI8MDrwo_)V9$4KUYK?L7pqXam?yw|%}zs21)gjF>q&f|8YBiEHi>g{5%LGjHY z!i=V6O3{smx%?D@6|swE8qJ!EH_=)-ribDIl1#Q-Unmd9CL@Z z=d;e{_}tw45-&ud*Vt%(JUeTsyGLM=wADEOKKBIo{aW1h zh<)UCV9i(cs#abTeVZ^}!?w(kmzY$HMKtau|ba zr<6A516Zc>Cb1qdG{k5M`D8l_$!2cI&v3y?U&R=BEJhcc-g?eI(IEEdD%COK9VYs0iTU zA;x1c7wGP}jQPCb+D7MZVHr*76iKBw#8F~_k`j&eIzv7zR!OV#NW4-J?Bl28)hl*G z5w&LLx*cbc80!&^a>H-6F~Ksnrakk=bs6I4FHOBoCfRIEW;d*az5Z|ef_QI2y-R{J z==FH`R%$$!Kh)GPuI^BxgR5(HhW`gwZy6O=u&fOe5`qPX!6A5X3l2kYcXxO9;O_43 z7G!YO;O;WGySvLr&Ry%f@45TOtXU(yt9MsbS9euEPa?lrjAAZwe{bVu!{s2de7aoX zYLi!)e0YJE7l@byR8(ifY9?H-ObUO&w{+BY%yv#$KMkn1>KXNq``7?YTON2P&9)3^ ztgKU40?Fz5JA5;Sh87JOj(chAZdE4@m9R9a6I39Zm}u83nF|w)+qe)7=lOdu9ZTcm z5v06tG*$RqZ@S7E!GWuSp*2cFdI}JOG*}i=^SoLp$*hSOUZMEwNGWQiq?QN>9aT>% z=f_xl=J`BoIRnt{RJWH2ZWEO6%o!YHsC3IL*6UOQ=uNNO%2AiG6slCna=C<&Wr^3z zYxoy-$R90DmQYh;h;E%9iz%*C)6tbo5={&)n2MeL>{OOZ(~uQEwcI(xMn=auv1qtc zkIa)V5%|=xGbo~#prNXke|?1rhm?#x-=#2Extk=b!R`7aEF8>1x(e7|F?@RHeT?V& zf>nNb6^_N|DLm!AzDuN-5LNtd1-A|l zE%P6}t$1DME!vO?xe3epr|j-I9+@kdVZY`ROBop%MM9RucKP-@|DhS9&BG^4_$m?r z{X0zyohu~InUE+%tqTi{QB^VsNPwo=X%s(Gjvw1QrH4;c3*D-*VOXu{hR~s$rVNKWNJ4;% zj$=VaAm?>f2G-S&GI7efTrP-lMUg+Ru7;W8qq;pl1_uq7-=W2O{Xjs3t#5r-dp)a6 zS})VBI1F=7groV+T^QFw_WcxRauSOFsX67U_9r|05B6W;S-+f-NfTx@3T3tAW4vYf z0K_+Uh_Fb35DFjBR*o3S7PpA?=Yr8Ivfq?_kIiN)q!=_7hm79Rw&ViIaI|$s6)2={ zyNs$KY!t29GF$bWe>)NMZvL80>DY{do?a5kZeD-r9c}zr9{L)yJPe4XJ?}*dSgQ|tyd)T6kg`l#%eCM`oW)Q zrs13vXS{I%QTxevW9O(HyiTZcA3rzJ>eVdJX}W3h5QaC+Nsy}{c-wLAMOb@7bWPZp zl=WgS!0L1wP#0}4{RV5bj30}EiMLkey;Me`fgP=4Lb&YAiRs#y`JhWr7*Gl~jxRbQ zvNn}3?0B7b*MAj#3_RP5SHDI@-PdRyC}JfU`?GKVYm1iruYq z44cuCt=mP1RE!JbVd-98UZz2PPYY%vCSmJt76PmDYV3ydt%QJW$VwD z#Y4F<1H2EW9s}Rw0hWI)GqguJrT1CSYqKd978p*3vnCoe|LA3uw>7vgzMqooFtkb&lkOnuP8}gtc;=wTQ!_GU-FlR^tjkC4%oNUdZr6Tj;czh-|>g>GX>8 zoVM%3@2AXKLF1+QsKFDWhs#Tol4&cmGlh!cVqi0*x_Z1K@hxGba8>sz2(!xd(&-V8 zz#<_DWc?)===&^|6@%@)d~!MA=}!v#h@nWOHcw}jZ=%eLdJ@xalkw5m>XDIM{YePn z(JF?)V6KRY5RB~wZikybJO9f!(O z!8l#5q60OJPq5eR&#v{-FHgi--EUcJNA4-DaXvg4Pn-39ip1-;U@0CQ9h`5cYo%bdI=} zABVfBIE6eH^7*Jk5~Kk0&bVGeC^J1z3Zu?=YoIU?Z|~QeAp;Eh?^s0HS(-(hr#EG{ z`<=>kdaJ}{ZOot!m+2JMR=A}*nsgtV{ooRn$vRyv54UaJ1zf7JYoXN#B{4f)-}0@z zlgmWKrC;iH>Lcs$FgPp(BlP$|M(@?D2hvW?r`Pn}wa>yF_~SXCVU7;7wG$-kX|sOd zrBAfOII1v`q#56;c(mtRFW6ffG%YW*!u`JNK>ud*Q7?>pzt1={OmD3waJ4vXls;2- zU~{H)MU4x7@0XN=!amwtZl)+iA9i{5I592>i|W*M`RAx$RpTkpiK-hnCq{5xp=G_j z_y)OP#D+R`cV@bu2p?k;q=m_fCa$h3M#4suMpw*pyJBxhY3xqR=w0@d(s;r@FFWBg z=>Cd!4nkfD;~K5;6+?SgM;f+b+1SjwiM-#7Tt-yVw6tfthGB{}D%`UD)~WmVVXY{c zur@|a^v?VGC{CvmXI*)v2#Uk=9ahX&`D=;b>=68HU_vle!)Q2jKFhMiwf46xKblKs5y1iTR53N#%VPu} z-kRqOmw!$3YH^tmjCC4j@1N_O4D`4hh*OuU?^;3;6a{t3)V(T}`4G>BkG_ zSTyg3BuiI0??UqG%cgH`9kd^paKW>9W`vnsuJHYfQ`C^-;=Lv+4qn@5p;`G>f;()m!GZwJ-VGtxm^D z$W~2&(h*ZvD3RM^JVTcK80#P%+C=nKCqr&Qt^AazE0pJlbgr0}iDhKHAnLnHbu%KU zSVO#r&E?Nv1fJ5Ov{;$ExYlR&P8X}}uA9g&LvyC5$;}9M#8J-T6m<%(*?noh+cbwD%c3 zi-m~OX6W3qc_B$jXJ@W*m_nzA>p{`9>1jtLkjY%7A7_Xe(c@)KCrFU8?l9dx@! zc2mh~UhFy2521k>qOEgtJZuxWgyGSNV%rD}S>H9SnbWo&{)p?!E(IG%m1=Zjer6LPea?;Vh<#Cm6bQ zc9;({1te&Dzo`WpjqXLnJFnFaka!%d0L!#VwcPdw*ot36JUnDE3YX<(=w7qEN1HyS z=uz@-WxvyAMB0u%rvuMN&py^lXGo=I2W4R~{MN3TqTlh4L%DJx4v$u^ZgHp_$_`1M zfs@X2p%x)ci7n20M@tPn!5=%c#TNXn^Ll_K87JWe2T4 zU`!@Zb+mL_njWP2lOf5Y$n<@!W$P4y0y*~mdaXQbX1SKNH7Y6|(Eebn!;~s&=$b5( za<|zaQqEO84ycr-?|jx=fB0Td$TX>xwQL)eW@^piF?AK_-$t2OXE-nr4$f+#804_8 z*Uu0-BmsbaJImtDuW((AS?FNhaacUhLRUr{EkJI&a{=9AxnpHtGc`g5USOQ-(dr2o zFf-YSn>-k0c%l%?N~L+z#<)kU@kOaqvjv~fw(}gtanNs0lE3E}Gc`U$x+lLH#2M6&!UaGT%ff*Uy3z6 zwQ7^T;h#`MhulV&{;Uof(2u-zv}iZq3+rz0nf>9rr_ z{hxr!B7JduGQcSz-xtHLg|u}JaVLMBIA~KmTZvgnseri#{L3jRwyAxk7Q^Xm)PK&k zb3qyls#vn$5fQHkTz3T@LHsP@wwBKvZZWgQ3oC5F>Mpv6kE_MIHXm0}?laU#y4$`O@^W7ttJiSFLg9DJTR3XytT&JV zMvr~DJwf9B{2#0fg%Z@2XE~5dG4DG<@LaRXF_E7d=weo8c~Wso*~O0eu8R@AA)`DU z`L!RjVfn57?6;x5^6bpc+vn>Ro^WFi<;Fj(z+bGnv?V7Fb3PsM=sN2APhH4aKaWJX z9>Mqy>0mEyEY$)_g@e&vQ>^QemYTr{TymPS)P$WEqVvf!^~KljkhD$E*?PF>=nnz% z)?cCO#iOG9Kp>IU9#SY{1tRGkV!;v_!=(Q7M43np(U$p&K)d<%k7j${H1EVnEF({c zqNLRU5e12S!xzsn$N1!ubC0VRm>Eif>`jOF^Va=%TJpS`%UWeR4P*oRUM};U<>L-) zRC89f4SX)Iky0{}WpFs^MX2jZB>g-OudHDo5^C9TNeC$`FNW~9SL4-ZlI3&|7;Vnz zWw}f_x_tHPH`jVk&+TEe_U%-cx-WsYqKy=5k56;4PDfe~DVW+>35I7{$`p_gww)`n z?LSh7AF#@`zVi?4M~?@3t*$*jG!HIOoY&WNcD&#CV`gRWT*kU)TXO2-ymzfYkSz5r z%onyTI~8{Ohq%Kfq8V`cUFZ_$jb^iz8Z0BpNBi`;5>5~jd@mvw;PK}Kww|yI|0ec+ zp5mT&uF=1s&SqM|$n$c#e4ubB(bdm0UiTe^3s0y`Y8SRpQABgjtkZ3aFlQ*#<6&zs zX8wZUefz5BZ-{E=iO^r+5Ml6VFqzlgMArizg~{;y&1v09{O(AycbBP(BH~s|_4WQ_ zaTyJu)RN`p)&#n5$_z4i^nwRS4$yer$4w1ZB*nD%Vpo^vJ#L3u3F+3`-aQJ3`UWE;UV2VX zKxCm2xkB_pQc?z$`nZUSI_y$V%bQ95Sy_`KDuR_a2ZYI24}wcqS7?WUPULwp045oe ziuDKB>yIvy);tF^`yXr;vTlz`)&BLyTd}zdAoyzFw?!eD1OE0M-5lS-KQc-Jt5a7p z8bU_y^Abj4Cu^0~M1}rzd)hWdO+;`RlZ>H!=Stk&IU2=uTAxupHmk$k$s#-e*!6Ml zxy$ZzP<{S6lzI{FpP6W*=~o7?F27hkZO9@*#1tS&78T4YZElZzAZqFH;K>;|8G7m+ zVE*eu%dZ5LnQN4GoSpb+xg`uID0h(vH+$*wg>rvNhY3b1a7?p<*~bXwp8hRCa>`*H z1~u7sh<^U`4;bNB{0riKg&!^P$dCNzPePL`nowVeI+XbzESlECKFEUUT>fVE^B~p+7DSeELlZKr z5yk7ONXSY#amLevlI6bu*lD03%;4=94 zp`s%GYKoRvZvl<6HkdDh5d4oYt4&Urxme@EL|FoahZYTEO0$#Iu@)2iB>eeRFzw<; z3+npQ=Dw?6>zA7Ao9v8{urm%47ExZ^>*`WC@53ymtiBhNQ&G35l*pH$lU@eIce15qw_w`vg4~kmPw9;0x z&vt4k9O|=(V6rApalsY#LNnCdVpzqr!_(6n<&beFAM6>2Ylz`HQQ^kPW1iXREA9=h z-T7p?3}~V#uv+cho2A468QQa_(v#mdGyXO$kC^j@%K10pOcg;5#SH;gb_ZMdkBJe5 zBMmS?^f``Jvha^s;(}j4m{uy^_^dvwv|&#V7VIb0O|&F$ra)U7ob?s+a$nTe?E`kM#LtRiw}PD*XDEBz zZZ2h3`IGX>7$vX(>+_03@xlYo`8W3J&33aJQCi!o%f<7qUv7_ZQ?t}%?KU0H79LEg zu%tcT23@a?x@e!BFOqjGMl;SauyBO5LXL)OrayLOBgK{S71kLS0pkluB+z&9sXsG* zA+z4rH)h&$6*bQIz2l9_vbX+q!q0shZbv&`M4F0(V5SbVb;5c2xkB{0|p+nDq-m;LNaBmVy??zTEx1x?18OvuBkLcAzHIgT4lOK z#Ytk0clWYiK)TKLJOXFWi2{p$zx@C5jb(*pc#g2jJxfCsM{MfSa``<~P+eVJ-d|ms zFp6GW-rw`R(M%8NZy9>D`ZcuhDYU&9A%w~#*piu#hJLJG9N=~n1NW$*&*;r~-wTaK zlH0F!M`~%9AEkgBkC<8SZ~md}v;sd*L6PDipIZ^JWZroE>&S$_^hIZH*4sp67`{p={EpSO$$xAQ0-Y-HP!29eH{+9#fOc`)H#?vQ)tI%Ik^j zG_tu}6fH%6*x`EaPi78Gg=2tJ@3-a!TKDoK6Ks7HfX zkwT}WGzG^L(MsDL=Ig&~;jio5l9Qv2l${>yehjuo2AVhYayK2P45g}tq_y96Fs*gh zEJ#oi6U_*Nfy4lBH~=J65oN=-zn@q*G$=YRJgo%!Xe1Ap9@^?ehbnUG1y9FkCO?{8 zaS4DH>T@190IXi+P&`Fh-L!eO{?#DHVu>YC+*pcb(%TiI{2s#}?EI2Lort-L;Tr8# zwZvW|Pd%BKPvcUJ5*SdAdnejTghpPj{_x_}{Ok9bVwRgJF4B2##ij;)7}TQoehHzu z3Gsqyy}EH9YXtRKl6=Dl@%zo5jUn<>iT59q$X(`=A|)DTGYyOV-SEJm%p@F<*CBT+ zgi|?ho9pO=jFhqE9!{Hy2$c@w{#jMPA|1oub)CKKSl0)^TzFil`omRtt9ByER?Px2 zPWLCeZrXURA&*`jql286m1b_I3GYFF(aB10&C{m8%GB&TPBWD$$ywgp_fmufzgut8 z04;~w#NQHx?s2eJ9dx_Sb;^fikp%pl$=6bn zv!=y+`s1#P#yxnQwmF-WR1okKpE2(BPi-rrg>p3Mc=yoh=u-4fm842~ zf|dxU)1h^di?;8ESVmL^n}W#DgN1}bk6+jL{rz5bCq59PKk_isbp*00&`|I!WehYT z7&J+b;E_;&r7w?)Rkmnnt{Iyletm_uLbG&42Tj;g;IX?3C|MIt$6`xXMHLmcWXt+t z_j;*>i{2VGH+JUty+bf1r=a%HYImdW;@n^5Oizzte^m9~-HD$d{=Po^?ZIN?&82w9 zfRB+?v15L3_@$BC6j`_6@hvR&mrqI#q9jskFTbLHtaSeH$jHn*@?5>IraFF}^F5j> zewQ-gYTKc_nUv}Dj+mIS#V%}t)e|Z7*}9mzf`>}r((jz4%S%%gMq;|xEcKfs81rcA z_NS+31#MB1V4E%^kJ>%Tt;+LM{2(`HtG;Fj82b058#hOue(uNN1sE<$jRrHRrHGK) zWtoIF_NKzZ_{(-eZSAUOWvO)7b8m+B_^~ax8k@4)qNC)qwa9D7Q$PRDj|}M)bcAcd zDy^pu)XCqNEhhsVk0dxKv?pBj@ zxxOs7#=Do4vBB=%4H=xE<+JjX;-#W2z!d1I`8B~Q6a}5I|ITe&E04C|brFMTTt))d zMvS`TW~BLtPta8eq44WRUNILwG2{oQa|dY)o0HQ43luI;Q{q&PT+HKXSM1#j|@S*lWP<=7ykB=KXR+7<)YCVepNs^QnJN;UJScssj zT!}EDUg<<4=1R`-?*9G&sB3((Stol{EjTm`e!s?`QYXi6jsN+sT*pXD>5fvJGmb1O zjgc{QF))0m1)R)Vl&F5wgR9mDc#Ub>nBye9xiGCu8~)g!gK6^@=xfpx(CkRyYVj1A z(PXCIODVd6zbFR4_R1lRrO}aW;4*!v@}wm)k%hW1E};>kWPXkG(aUT(GulRq3{<%1 z8zQADp3DOmmPWD5~`hj5U~T}Tdz=NXm%S0r@Ek{uF}pr--#eda>e zN{jptVRc#_RpeP7R7QNezBUr1V_4E|)8Ef|;UK5QF#qOQqUo89>bYj}f}(?CUF;aXe`{tT^l zu48}bWn3i9mu(ecWXr?zUq%b*Rx=n%LQwazs)nlD0RErlh9M-+z4NfRU>D1=ef^J; zY-dQjbOIjk>G4F5Mh~9bpM(pMS@}qkILM7o+mVsf%JBr?0kQ#CTzgZDb^Kh%8VuI6 zj<L-%m)&NrUB8U=wKw9kWs_$+N+FnDJ(OJb z;*=jiuL51!2sx%H3pm6=z@&<-DT8Ya+asL8Tx8ufHV&j#-zqA3YB=Esg`i@W>U2vY zn-h0|gZ%=bnot47{i|)w9P>~tsxQ0#&4Tm#OKe~Q_Bx0varn?`*;X}K_1d#rFiNXO zk~Fg45T9dO4kU2v+UNJ;4;}U-4PSOli{VWO^eh&}oNx9{Rt7@yslI#VatzpzSoPm8 zFSlLfq^|q{W1cQwHU^!1Hs3MYFP8i`(2d51`OVyb+xE2A&bWC9!Up9z$;hCJ*@`0S zU}@%ER=s&|BAac-zax*6-@fNU?S_eiN(Pub)nRkta)BVaz;n_ zk^dAO{iU8C09a$z;lcOtS0GnwHpk=?`UU=07oAjt8mYE78w$|fHD=pHgc_l9d#iEI z_X}LX3JUzyTjS3AfO)avFu_tLQkRVMn7In=M)6^=A~0B)Ll@ElIUQCKd4{{WZ{{pa zY6ud#USXkWWaznir`K+Ru>7BIT9#sQh;rV(%;#0Y5Eo3?QuT)YS-d}ycnG8*I07sW zOB8^9v^@2O4-BU^ybUpTF7qg?;rZ7sB) z^pT;;PJOxB67$?{7g`#QYZF*jsa#Cu!(4ZMN@2azATd}iBRpJFWhlz0C3^z4DFuME5>f;ZkPP3{1DG^_P z9dqY>8Jm;!aXJ;ue7+Ujmu9m0dKYS>U3WM~Xw}x$cJ{L>TrTh0l*hKs@>aTeb&ioGXf7fH%Vk)So{NIYO8*gvdJdK&&wh~ zzhRt|$k?LJpI#jqwd`%HDmSU32zY4pPrD!k(7h`(lGxadB+nm`c*qer@A=HDf057| z&-;br{bZ8XcgCPT+u2{eYFLO9^Y4qD(wm3eM<_$5dgpKhb}9`d0SO2Q$fJfI?`qcx z-EVvskh726p^D!g9v_@AT&1%Yyhev&KZ^w77o#VKg>xmZwld##y~+8man{!`a9K^< zb%q^&r&2rTD+>QWtzy3&$abVed+KxjzPsz6{+<&EI03gdettHqW?2YrxIUia1)fIJ z^axF}F1m52j^`X;zItvcr@!T{X(t9Izb~}WPMpBURXNyK`ahb5{8)M!3JQ(pnPr?V zE+yr148WdttEwxtdKo-!cD`A&wB^svC=3omq+6eGoBlmJ4la=b4bp*49OcVp zznEMPtiualy7Hj#TH zynOJE({Mc)uJm|3OtL>}m^`mH338p4fFSvIzTfA*nK9{5llSuY!di7uh&Txsou+rp zqqCkn#9L+%%AK&erZN3M*bNhW>!noXBYgYS_TLey3;JInQoGc9uvjzlpq|-0zW~rc z-e1c$(z{=|+HU4WX$;G%7s&;6B#Ad${% zAI663cfqHbM$Em^`e0pmTi@SH|bo3N9j5;>*P8n1Z!!o3s*ot65+9*urqp^ zxwPzWuW8%2;s6=#8*^y1zPDr9gsJB~T0aV>xxR>$yh zHqX%gE<-D>xu|AW4VBN1tE}ON!Psf$}fr@Qg0XWmF@S9#D*SqTN(@w7CmTRgo96z zoCzG$tm3aLU-xq2*#ojlE8IVhqZBWZ?QuB7c>J@84WQ5W7*QWbZeB1Hft-x@ z>uFnT=q>LNyZ+jK`rGo<#0jq2y%}MJn}e}Ns8el-y=&x4CEQ>=VOjZFY}A=R*i+h`4j`&5^oeD0vV0fF9x zh;|w)_Y`-M?2=XQ4H>hWE0&~@v~U)GJa-^}58p%(;!O`y)eyeyc{b-TqyP!^yJIy>Z1S6eO0^OshaQwW zH^)ue>$^xopw*HtXMmz%TT9?7d53Bx;gbt4<86KO>%s_offyyTNU(SxIVLLgXG@*$ zKT5$Q;rlXYIJg+7s9Wdfgs5|NSGD2&w^b`-Q~65M4inN=6wJr=Z@HoI`@93aawq{h z&(aatL?8U4o`1QDB+66nlmsOx`DSJQDKp1T${0LAtZhQ4v{SSVE#WRfbb?R11N^^5% zDj n@LBS&HNvwSqGE3YHY)A;MTgsl;WA6Hy&g-obvR(3!k;PwlDvRG@fEqg6M|n z+sb6)L6mV{f<%PBik@(9){_Yd-BVHjOsL;VngYSy(|S96CWEbWI{+!wwmNL1fRqd8 zh+_vO41vBCN{LEJvDx2aRet$IuikPh3b9?CQ&kD($x)Hf=93r!^`DKjS1!8KHEcF= zhH$}S7s5-WHB^bpfr7vqh+>ryr@xkGB~;V`#EOOdxit{la2p`!rK2M%1oCSU?YB<| zEZMD7lvEg^A+zQ?xEs`t0*~UZc4E!q0&5w8Ssk?e0-ijlntd(qS8-uS=B0BnKiFw@ z#)qWRqZFQ<9-XpZy4mThi#apZiv{>|g9GdG6;!CuXT<~fk#uxQ@I~enlK|_KByDX! z=cwpAb0#N$J!_9Gz3vv(${7dz}n0>x{p0qxvNV9m=?IYp|H z?%3j4l`SI2ZL(EIVNCD04?KapQ%?^MLE=~+;UDO5=0q^v4}Pvvkx-JlYdG&9TzcfH z@edXxABB^p`m)$b_-h1x+t2D$Y>tQGtH6+5;#Yze{@rE zhnDUA+``$cODYek{37_y&=FlvO#>{r?5}D512+VrjqDm+Z;ji}=_IOZ7$Rn_HoO(s zH-fZ2x3SD7Zrg|~ZQOeVuM)Ja{pk}8_~P2WKweq=3KnL=GF}9FbdR8hc((K9RCP$> zRB%l)M5%VcQsKvKAs``Md{wDK5I{g?kjW_vz%h;E)Lp2PGfJmZG?#O=!)E>Z!eJo8 zvpHR zG6WmyTz==x10oc^Nu!sibF_EDs1DIYB6Z3fw`YZav)3370a$T^R=2MP-H&8M z6FX?mP``@Z;=4$#zOz;hKBO?#t#Biy>TPLniC2!z1+z-!whBG*`CCYDX=?>6*byyx z_8+7Y1jK+`QgY=xEG*6wq~NUkiGF^K(Nj2&?_w1tk?dyzV*%T;C{!_5*|t&my^c>g z&6|X%lmMOhfG79v+hs#!C`V7XsJ#I~7fcJ7f{%<5H5+$pfnGiZZ^kU#>_3#FoK)V! z2fDvd*PuumNQVzG9non3i~2ipa7)1`g)l1-7&Lyna1rws6Z1k9z2=b-4XhUUBi1KI z*Jbb?YX4TPKEji4L!Q%Z+#uzVQ*CrC1E!v;DuxRNT>T*Wm7g9&51$~?NH*KaJLln7 zCU;_l$!ULsp4+!Hgj|LN*R)IF5?w?EB?V)UHUEKB{q)wX%Ll>lMKKn`0qlh}woYm2 z&}l|PckwuL7b#W07@M`x-b9KX)wC>^pvZKo(g6(4q9Mp-t3Lhk(3dkFe^oyVuMFUvCC! z+Z*mCy1zlTc7JJyFFQ}eX~tX$aQG+K|9h;_JHRFVO|{p`H&`r*&C0fz7rM_h{vxRIPbvQQx}fhLTVA{@zPWh+HT zLMB#cst7hj|gwj(@ zA+*t#hTjxGVoub1llrLZr$&)DKMP~KOoy1j#Qms@{omXFd-sBi@{`h{>N%;+V)FZF zPmp{h5UQ4qz@hDca2-W!%wn62hYhTYhR|<+iR$;V`o$7srta)N0Q~Q>GIF|3_>0YMLV!{Ck zS*Dk13$Q6wBTl7=zCfeXK-*i(!vO?s{?8zv2i3M$+Fnmpvsa;UWguBg!r~c+kD<1D z*yB0a3D+uAWuR53Y1YG>ctu~OJJg~^{@VQS-fRGc|GGxe%~!8DwU_}jiXDIOSZi`) zIBWGS7Td^Hn;F9a%)B-h|k(6t{vejEwFI#^7?@riqL4NEN?S3%Uv*T-c4!w~^ z&9ITH!#fyL1Rvm1bv{z64$7gFiK+Cp!vXfLhx`8=TKVnHkN$U8AXWkgp^Q`|t57`v zeC&3do4sZ!w}%T|ei`G~%MwAE=15*g(-#5Uz9zMO<*5(mvGv5 zHd>M86NxVat7%{^$@n|w4-uhFf2KXxn`3Q1*+jnMaEccRJM~eeo!S{#Y>x(g0d( z*x5$!u5l6rwY=$^9~?11hQHyotArxc@(U}ZbZtZzlQOD;_k8K!+|2;~K(=FPfj{pK!6G3-2-~m(q3foedY=p|}bKr)P~NnK#jH%6;JPEDsJ3 zx9F4^vpfwyEdBg=Y4O5JVtfko$d&y82M?b+@jo)y!gKUqU0ubAe*{f2p*6%hvq&v9 zFpW%}77x}4Qys)y~_r(o;jnX%G5 z?9~v!HBPp$+pX{okok=(9m4|C7QIN{lahy(Q58ll=o3pa1kFrX>)x~hDH&p>fj1$| z8;)P&#*gk344YP&=3VKJXk_w>-Q{_M=9AC9={faYpmG_gw6rC<5$=Dynk{B*Y;1LP zH4q3SjtvQI((kU)J^wdDH5zzYFGj|yrW~6xoM;Mug{IJ_%NJsBDOn)xK3n?|V)O+` z&W4)O^STKl@>m)*0&XYmIBI$FPZ9cOk*30A)?H%NM<~DA{~lFS{RQ|)Q#ge*Ys~5l zj@S5DBgCHW@{h?+!hGtX{I_h??<4hFr-Y(X-Nhp~MJzynzzBa@6KZwHvv@G$ ziv7ddml2jmHC51mOXg!N(t|s*QG`yo(H7OG_ERZerWbGDh8lNNtDQY+-+l!y_y(g4 zP8kiYnqeetRtG(n;%1E5!J=c+1DfY#4{=lTF-Pmajdv0crAj=ogyBmB-orNTz7S1v zX5fc-3=?13#t+-R>T;Cm=8}`@bF9!*pj2nLNXM)3$LL<}%f2l@v9SQfAx`1`OGF=I zIQU06u)D8n<_;wO@p`##^Fky|eoLBkP8Ka?-zqUc1L^Qs42dqhcdO_0&(McE`4bhW zb_%)Qfs6BBEq!Dx1qH4!8lID&Ji=8M@VV6O6fzv(0LCs6$&ocp3RMsAf6W=FT|!jx z>b_PI1J=`Z57W0ieQXOBR|<6Xyr}+sOx z##5}q6FqxD^@|(_iD`Wq)A*QBkANGxij?LbD!gE|iuQjbQxjz6-E?D}Ng?!R{M1yP z%GS-gve2T+IIXU2dE}=>psS~rXEjjWfWW1WBCMm=Xog#uzd?=?Fr6|Is>Um;yRG?F zT4Zvnos`v>XMDNnvbYu4h5lXiC<}65~jX|?hX98o{ z2;zuQu3E)~-fP2vRaptJOqf%3;m}3+qWe!Fq+lcLT+NDFb}$*KW{z$kAxl`)k*Y{|>l69I^e@Dtx!CUpWDSh%Q|7h69*jG3oWuuhyG|a;f_J9xh zQ8^DDaZ+j5Q$dSzzfBV)UI=ym88J_x%;|l8`qRN5S>8YY(c+8X5Gmpw$6`AQ+z(OT2^@)x4@Zwa8I~MfkIaMJS5G9$VW#RTVfOXJ!uE5C;UIVTwCC8Lr zbFd77f(}BEl&vi>qPux)beYz|F(cTp`lv>G32JStT7+TEa3>!BS(*iiYY#Jlb z#Cs_#=yU6+S3zYk7Y+)`j%rUtyX*lG`jtLZs;2(x)*ihg*3vPZB|#8 z-sYySGydpe;-9i%&F9NK;sE{N39mXEbniwSwv}u4%Kr@NPwEBF%#z09*h4&~%9$Kv z3kXhHeHOaUNhTkPt=DbLAJMeD8dmFi8ia|xvk=rDN`2?jZ{Mf)lF?lM$kmNthlaJAr{VvFl&+>qbI-4JkeR>Er%Z9~6lwj`fc{8i= z=@liH`NY%g_n=uUBFQHnzy6f4MPeNieEGy3jMoj^n+j3GM;@4McN0WSauLpeqlLp! zC@aoKaHKc7YdY_{?Mx_txPl*=!rE^uVO*V&U~{Fjp-P~-YgmcUHN8K3`HyVeImspq1H&9>>cfLT#DKY@5^Tj95~knH4kqJ3PE4OX-?_es@}n; z#ly4?N#v2~oGtDJheUm2o+E4-!h_yNd4ZR}dCw5LzB!4$y0$cjU1KLfjee@kJo#KS zw+C?^Tn&ZQdbH&RyuqqJ38X*mx_4kN`Se>0YpHYc3jP#)QAwQBJy}v#K6~EFpRunI zygZ=L5jWS?3Ia8ljT_T-1!r>PC%JQc|_V!%Kd?6aJ8SngRU#Bq6B>WpPcYW+GFHPe>98h zaQPu4N7My=;phMUXVUcN?Jl(+%n4i3z&L`p!9;HR_VFIIg>_-a%}tnxMfC1;1c)B! zcF9||CWBa+ep@!QeEr~{Lv67>Ol&v@Wq$-ZT6%g1Dm@$}PuxXTog&R;zq_A=qopl5 zkjR>KXo?{hno$F2Cq3%DRGY>Qg{H@gv)@#umk%*eFmqdyXene~j&Bze&)=I0@^yN8 z*fN=(Ve+-adg9z0?{7onP^GLH@@gM=<+I-|w>`lY>tTiR)xxdtwxetD;4veN@BN8DxBD^D7YD`%k1(rip_r4)A?N-FVHf*{{Dp8=Mr*hj7U{+ zs?ot1d9%GE6wdkZQ-7me^7V3C(V$S2t4}mHcT^EzV)?e!e=v|OW=>YE#HnF^Olj{* zef$ky)8RqTc-lX+yr|@1-!f`5Z`)|@r$ExyR~-FyD)FBG$&v&Vxq^)r7c-8iXxfVD zxGxWnJ`2|?9nsGv%%~(4?HnX2xlnM&PR}`(@t;)+nmGplNXQZaD#US$H<@<0HR3et zfy}KB_&+oUVuMa~PzB)dXTg|iM;vA3P#)KgN(L?oO#((=L}I@RE>fxBH<$>AwnBD> z$dOdp0l!8Ma)w{?dYXGQ!OU+v!xic8|HsughDW+|YY&1+GMTVr+qP}nwr$MBwr!_l zYhv4;*tWl(z2EnobA9!v`&T{ds#;aGbl*!LhvBah@?n34{L$`yQ=~HL@<5g=CzfS! zGHa2zuqp|v?zx;g0t3U25Qd)%^Q%V|?pK70(TV2bGHVIL<26EoLY6BBH<0o%VuQiQ zUWmK)bMA~|~-;z2XtR__yuAL`JVXJ(bl|vJBa(v1m1B{dNA^ zL#U`top1X=T?qE~>s3+j*V+8Aa1It_$a5e4ghi9mHuFOM(o|y#Yg|TCK%%R7T+DU+ z2xvJ)W#oeM$ERCoK(5pWb;BsActdJ?ZO*xYaet=3K0eqvI`^yZ9P0$`TKx&tk?T_+ zHs*+Bal()#0ViV%Ke{ov=VJtxymW>9kOi-Kw+55wc#9 z8Pyg4ujbgnoRS>Z4C96eco~|*Sl(2a^t*eE88La& z>=*2PTht2jz@f2ddnZg&@>J^rZ}~IuPxCqH^q)U}78DTOA9>y#3uhU;T*-a|7s%8h zMF~x*`6*KjfEJ#s9sVMK$0r~_h5}uRS}#J37f|0POwtR+---Vr#8ELDPnf(iNS3;> zAtqZ+L0HNVB$JzgZJFBes1fOXm)v9m!rg>26|C16Zgy~V!df3LUo@Gb4~V6;-&&2N zEL)suJnc41?fuONrvIuAMU~SH2gk{Jgh>$v)Q%`P#94_o*$f#1dWvHrC7b z4Qt1#t(>GysB(J)G9J;>KrxQu_P1@lkq%~37ad?Duh%Sj;&G22ux=7=3rFT_I##pq0jqFxvTyW zLu$IWi&Bbx;n2^{nhKH1<_i)<{`~$gB?&~Gu#~(AaAJz7r51$BP#T*6=p$H5u} zuw)T&88QWp4U5@%8tJRqSr|}BZ8HHp`YvBkEu>u$Rk9+<#)(aFSGzVR!|zKiUL6Ue zpcr{_q7lYSPP=Bm1m-l!%80^>+03zDErwM;l(BK*?bWeoztf18vHvehq3N0%;)Q3& zXY`iLROoe3*fj#O(uI9AD^*zKBdeF6iNo31*&KcSig|92udzU2a3dlJ%da8Pi8g0K zd4|*yFo%98IDYDuC2U%^EI-~B1~RFlX$YI@6;4XZZ`1NloIJ%52Y5M{rWdOXiba)@ zW1}OXO+8K-5{=$1ud}@8jXcD}T46R)-y|$BMM45il z{1z`+NG~zic-m^wy3h_7md=}=OV?H|QONDTFDkd^{p&%t@5smqh7>wHJReD8wn%U) zc4f5~(ToKMc7#y~^(|MXidYB?=}7n+RIZNDH~7>HsnENSS0%Ax1n5IWu-z%)s#(RB z(gv1;{Sn#^x|2%nCC8ot-F^4?eC)eBX-uG8m(4X+tCNqzo2>$fI0oH8uN%J*&#8r=*;@Yvi2?C8YFNQp|Cpx zLI{f;iW)9-KGrJoA<3k_i^`xccHg==j1(jWFA{98l#Z1}ty|k<7Al(fwpi8mT*}m# z-W7WejU7f>b0sY6(tfmH@4&r(nu_q=))tUB_BnP6icDs>Z zFvAU_qAW0tac=w)OYEzc#Y@~@`ZRJiqp{^&#AP6-o0GaUO#Q9q5f$glI zV9_LNBi=gWKO`TtfJbG~?MrlWZ%xcilmCwp1e4}3Aqd1G!6=Uduy)Z**RdR!!DT~9 zRd%_ZYwe4bnC?w=c5|5#d*(lmLHuz#fa{umCuKhrLOvTWeJqSyZ?3ivq-E7DF@o3} zv3yZ^x6M8}wt!93-^33*c&I4ujfij|lFlGv>pZH@IK01f+*yUJzG?^NPM8$ur@18F zdq0y+WR5XjDH~ORa@533SmBB%+**p(%|E=UeWRvoUkXZfo|uOiDaK%~Jc%jbeD3Vi zdj9aej1Lw`vVME9ls;I~p3Ad1t&-SZW90N%O1DXp5-CbgkkWCAa{13I@k$fFFQk^x zTgc=z)QyE9F)2!|wJ&}8Y}8<4=p)q-w(;Z>m~J`*L-Kf1g5|Mf;P!(;}Zo?yhlP?HI!k*Pxl4+Uj0&Ua1yXeGFyT*_*vm?Ho(kJPQhtAmOc z@hM2WMD(GO5naXK43x_q(Nk{z+ z(V0ZpImg0Lpb~4ZLaefE92go80e7SAUJ&m%Gn|l;QH5?Nhh}M2Lp%^a>TI=pbEL_Y zf2lrMw;&}&ukw~7ID7q>kujU*j+M-F#BV3tr=e?RtwYEh1M~#Jnz0qJ-QGN?j=LB~z}b5KuDKX<+6cE8p|gyrmFw zE|65kwj2;S6b*|lYJZ$e3%6bYV^Q$hZX>HbX{2B-@&5WW`?hHDpgA)=(j-vcFumEw za~DXnAEsv7`-w-qsMrZCh2xJSTtBIx??VY<4E0p^1>- zyT3?%uzQa&x#k(bBq!qA6qCJde<%_A)Imwt$tdpi6Q3x2kWwB*59vkKR^MMaP=>0e zYbmoKJYF`?32jvCt?O+x2aHH=2C;1q>b@0P38DVI(?7ZXX(d(kS1be*ePZ=6r3(In zxwL!cRE^M>T9o^Vbu88zD>#k*D_hT2lC$A&C=n?tBvKLhQyOsK*#V<(@}OSsK%jn$ zo+FQ-D!$e{@EgHDK^GDUDrp&+s7xm7m3sWyrO9B8?{XoxDe&-fGO7_wfhE{=CB=B| zU?k5bgGJ(D2|amWU0QmyM+v)8c8sGc25!$I=oGJRucOb01FP7lkr#G)6sY7 zI9?(jQ(1`_V)<4`Nbr%}GXnH^|3YA)B$2+OX&WQD@Zq}kP}?X7`EWK{DfzO*@;MG7 zdo4>}UZ;f5(efcTPd!r#obfJ_@g?z#;_8_E`cS*@J8iRJhOkxS&u=y$$kpf6zz)B_ zxaKFxWEGutesEK~kKu3>41W`;hR&%hLtLDNepMmn?*kx!dPZR|;mqfFQ`jTEVKG+* zIO`=ZrC(Fa)V@yADJUd#n4~08nVB<$(3X^wR+=4?)i=^ZAxDbwJAQOPw(Hr&(nV!4 z&-`i($j7DYM5C#AStofs-c)=r{QnRP2msVeH-TcXp<%LzDN`&YBw8j27Desub$%EX zfsHo!jXWNJ5dYp+dmVOppK`fKL@unehcpN-are^)#oIUx{d`mI4CEbIkB605YD_p& zf;_Xu&M{ORDY_a)0yPlFgluV5apVkj*D;9jmeE=$C7DlGyV~_Fh^ZxsjJxAQAUXla zaP!M}sksHtHM-!m<#};HH%eQyM4&l6`T9xNDMl6#GvFmkA{#Yvy)vP z@XSo7!mL%M<+a9*tHfJyDT=YIbQ%k$QexeV*t3G;DgQ5$OjT z{hvTcqHj-)*fn}OaJxq*l4=)L)NI+#RwTM?(^^TvuOa z@xdp}DJBV0d#L+3jk<~!;-4YytTtJ%axnBP#@pQ`F3H{0oXjLOr9l+UtLa$EYzkwS zerZ)qm->e$A;G;_#AkQ0VK)=Bv_6j-Rnyj(^Z(ju4O6+ZKo-cDUZ{ z^+FjYOczlGqwnSp;;OTbOZgeK%S={7#A#n$GHbW4(WrLERMgrZI8S?C=>p{b`mNFl z{QeM7U@WHHL(vd$IBS<^Ur&Y-A_#~Pp}&1DRH8@P-qpVjkrN6zf|4Ua|LUGWp62x{ zW(&E8ZjeIn2gf6w4JM|AB?_u|9*5}68xp&61bCiVtCQ1J>La`b?Jp{BtSd?{qU z!{1QD_DWz7{Ev5@c0}IQTunJEQIQ+Ja<{f}2iWa%WnWL(^CLfl5xb{~y4Y&o%#&XD zG<)5=-xS4)NEN>J_F7E_NfH>EO-srv`qLj|6>y0Rs(nx8OkMz%Os@XOc$R}Ko2Q`3 zpv`lA*4HQH6bhA{#6jN|*2UXE$j{0c7OL0c@#z*A!J<2%*J#Uwj>cukrNsWoRiQ_a zKZYr;Qb6S&<(HK`>_0W%-TDWP{~Yiaj=!J!6s<|uNA91?z)NnM&9BkjtN4X@Nd=uUb!O$w#zYv{g#b;`X#!ojg%_zvvq6 zTJd@>T8{FjX+yMT!qptqShHYjS;%M)=THN8ey))MwT}dc`M!^kRr`6?v@e{zYJ<9E zQ2F17M5hMP+nAou?&{*D1)8FIY;dAF*lq-ZWecU5zD0k~q1==yILN+pJz4!bdbja} z3JDJzG@OAxqseM7Mq6aOKT4Y!64jiSL3MM-aP@f!SeFVP(chBSsoQVgz8$W&Jq*W_ zR{BWz2$AT;N2?SUgOPGGuS*5$K*h=fW>4;lpi^U{it?jk2GLt!rab`s`O}BoTqULK z5j8p&kG8g_r$(~0dB#x>m!>@DJUnk|$5(T`qP2TLfzuL>KPuh!rg8^2JS`W3*qvS(HYGdjat#;RW}Apxnhx#7PWf&CzrP?t4ql86 z&A~6HUdL9R?AAX5r=1N6bA`fUzT^(sbv;8i+^<=Kn;XqIO0Jk{OLTc{DX8e2jd)=Q z@0V()9?;0>vN1+EbMZ@C>xG5<@i8;LL_;JLp04ET$c+<#>q)L~B_`N?u#ihhsoORP zzGH>$NBTzK;e0jTCKt-YZ1UbOZ{2f}*Yd50mZqEbEki$$yJKIbQ|q^ycll$IOl7&W zNQ_7_AyKkwn(_W34}QuWmRlqXS*|W}Yh3V1bSA|iT}IlCDxjc{oUHEUR`OEmKs{sY zFRq*#q7+C)SqW5`FHvIVxWgvaZ!rBK4NcFzQM*Ve`H|gm^D{b6>f`anM!dE(J?7J| zfDL510`eSWasxqdS>cau{VlobpJ!Aduot_xLQ_aew_pIJOEVP?3Hi_bUuL?&zQyr< zF_)}uyYMw(S+?3Fzp!GteDO)5<9z9y)HHQ5@p<90mF4lKEXL^O*nR94ocV6KS(U%Y zUVTNJ-17Qu{;s`9u&phb&`PB|X}36jB>IcwB*MTb zah>Xd4|G7NDOu@BiGoI%U2>$MoZ}>fhEfW-Vp0*) zTXxMvloEx%{Q_Frff+K}G9;(0bFX^3V*4w$EHEF8$q9RQWC>M=otx2#uHrJ^AN7yq zRe$n>$Y`oUY|O`7zqcv6MV3=gb2aIAu0%J`;C|kM zF~v=3Z}CH1?NlzmZ@C|I!KQCLI!~2!MbuF5N4xSau#~bT62azjZ|?(YI=Qtyr0F** zOy~O*7HD*=pOQ&eOH9gHuDO0Og{x5<4{RVWeIr)=Mk|0N94LBkyiQPfJ+VL=z9~BFHQzvu(O{wQt2Q^uocWz8ZpDwRiq#U_EDR(WMCphqZ=Xfr=@_jfs!tm=trhRfq*NB_3qu(~h2ZJT z50vbLKS&3RK>egtfQoz~_vFRYf`e3%QR4+=JCNl5dYjPwg{4xfvq=v5@n&IibLr`# z17jejl?UyCLFQ;>(T?gQk@rBWOp#nq z#}oDDxph~CKR%~EvFHR{qG&^_{G5g<5eqDFC_tvVf+IXAf>Q}eRc0-wjpl%?A6LR2 zj~EdzRp};x|7%4b{#>@gq0{>f>igq;55pN4y{l%obVf5CTC+mSPW~Owk^97vEdZ5K zyj%x8a*o&lYB-SlM{$byqbXCXj}pOoX{SN#n-fdTQ{b|ZK29#D3l{ovuHbK`!TVPl z@7y9&Q?MU&W-?N?o5neptu}jIxS2FO7OzLi?YYvcV3czyF2e;+x;RUX`Zo)2q}Gki zyAal`TGLI6z5SDGcx!F_4L92B5(G5m!YIoQLyfM!SozlUY^v12(XgKi!dZVlvA z)5}^@T?giF_ql_aE;b&9J~q-i>M~~9wV#yN>&B8$sN+~|X>$W1Z^|Luc;sBz$`;KG zDk=)J){r*y3WbBy=5JHj>(m+RbRU#rA%?dr-KDvsaXI9jg_G2K`x`cgmaG+S#*)zT zx9ttcQ>_)od=h~cQ%v%PP4#URRqmsz%JbyqEglP9=dZSayDngA1civ;jw${^~!IvX%?(e>Z z4V^9*BNy}4?q}bt+6ZHP2S>OT+_HsFj@CdM_6b>6_44W5bzSP%Nk4bFSu439giK9H zg<(Kc)*u5wW&QTM{vlrkJp6J>^~+#kL6#!bGxD!*VQOn|AAg`x%Hif0eXBKp=NF0x2_=(+9xUWraV zBMMz+UH8^5YMPjmFCOK#vrr^B z`xAW}YP*%Q-frij_ZEFKu5EX@#i zmu&#hOs-K{E1r~_znw*q`o*LpIM+hRolR?sT|87+N2I0ASn>r8cK7 zbaKa;&T+gLkX*!JeQiBjWT}J`-yj=*b{kZ1+#*}=5=V@j;r!8Y6NCdK_67Sf(D8P) zAAfE{UW&dw#&t6|4Q+}Ut}01MNf|ngW;j>h7d>VHhOKLkGsF0DkHSgQxUkTt-s~z1 zh%}mXEFiKyxsD7DCC9mp`j1x}qd5gW;=l z=odqA*FQAN-i74X&hSUj)2p3=N{9G5eiqjS04L+r$0gek3a$0pJ%0+%AQQ&o8WbJW zPqV>ha5x95Hk4TTHV*ZaNcPNB=@s(~cIw(*S%HNM1fqaLl==Zmm zHq{bDmVhQ`ASIFbh*^nCx&yhIi2vh+l|fH1#8%rx^zIG}@v#KN@w{qcA@b&e&vW08^ zd|vt&>XbUWa8aI@k>~>n@5TGt`wZXc&Fa*G;ORBxlMaEBy|>p6%kI1glG0Y)Rfg5v zaZN`D2OqWi)|4kL2xXL4auI67q$Fv?KKha764j#H?q3)CHe*QG+TZsp%BvEQbHXw& zI&L;dHzhbIN86hlqFoRL=XmyRcW9N|-5VCB1=AN<>e@?FyyPa{sDuc{tW}!oH8C1G)3xj_pf(E=n$F{%vhron3O}H7-j$MO#bvtLOE-Q{gVOtsh~@Jub*8e5jn(+=iP?)Z5D-Q( z#ob0utvV3?vs(o{x?8hoj(6ahv*Lzhc{IdUaz~Z&Bf@=VO7pCoCh;kJ)qFzWlHIhd z8gSk@(YNCs7H1KfIBuSfHnG}eE2V4WvjcC&3qb^>5UNp~D|dYv1uo5Fd$e^X$Gx_+ zYi{jIUTl_4iD&Ap7r9WNJQS)>nOXlT(x#dsRnn}v z(1pnM&Q#r?%9{J&lITEm$5Wtf!85#JucWOFp$*Q9#mHPgXMuNP_JLGdgKz{DVAj{I z7;NIfd%uE4d%HhtSo2|;wA>{rgWHl?nX+{> zwi>(VR**NKM@Ce512|u|PxbNyO6RO(>3aLx*zgo&kLH8Qu~%oimOYvUER@uzV?n6O zOyYihLZY1!9`!8`(uaKW8<)N8QYWRXu~iPw0aTj1`o$Qa#20Z4+VffET9-fTM<1MW zcswYm7PZImsiQtiWJ)iS3_lh#L(e=LS=-L~9?s@@>^MZ7sTy8&S+Tek_wCriZW<>& zZ@OAGN)6I(53>lk8$R6MgEy^_MATDKUwqV`kDht^Q&ZPj6#2zO=w~wB_}<@p7upr` zZjw$dz|N+Ev^^vhCwz?dcsE{+Zh+jLK5tuHRk9zYF=Z!DKjW!;h?<(G8lGpfh%czM z8s3arnkTaJYqzHsE;ipUMHiv+#e0n&zDLi+qM1G3rp#DGGdGyZr%Kc5%t=097d~Z6 zr`K^`)cdo^pq{GVZ;=8W$HC7S@=c-t#$E8IjE!|$x}V(=1f0tXCWT@4u!Ljmv?VC4 zYI9(&N{(4aIE{by`Mgz4ck+7lBStKJ&S}_~-vVn{jD3MtYcQmyQ35Uw7vOl{9if>1 zEtvcx5sky`a<;O!B9}0YN9}0LQddUd-~Bs6WZzCM8BDl985jXkjLaL;VnpGJf!`rN z*ZQq6k2mR7MGIQ;Hrhbufj|wv1hI;PXq>QUIUg59O?JDB-Sd*a*>(HpAq$W|F|!jG zjpH;3U?RCoxs~e*?q>#4bY|a7UK~7XoV%Sc3Z@T2P_i}-|A7+R@4E7)Z?Jwp=$q~{ zzy~nHY_rk&zAfhh(^*$T1%VwwnS&DO@hEL!ZAZ%otZ#RP-T}amKg*arm+fqAUL#97 zVICV>ZzO-7DHBL^nU9Y<7`v!RcYjC2Y(7rk^giM@!McQs{Hhz>M34Hh7;)Tuv7Wg% zr_<~>ossFIDwOKFHZywmDR%zgyenbid7D&zV5!bzD~q}BAn2ztEcX27CM)nb7##QQ zk1wHj_hs?N%&=p0hsny+l98%YRgbl<^yYoyUS1cM&kndiG;GIPTE~Si;qB4{;Kl`b zIc9<5F#74i|9JoHyra|YdFG5bAmO9dYJzsuE4*|2p7Sm1bTLUsvi}$Oh4f83V@-XB ziQXuYFt^ni+ie+kTi2>(zNw4Pb(AVxUB$1jmVR;cD(LkXxuhv<$uqPknH{E;w?m!s z(czeAUyE2t8e1w7uiE^h!rHS4{ z$^?1h{ETrs8zKtUIIg@uUO1a;G)9NW`jj~Mjg%lN;$!93-RbJF>7v+jq+M{{D9Pi&4rl~|n04V+ih=mYAXjj(7&_)TH)#KHnnZKF( zu(Ujj(cy$1FPQodXN$jzY?fN?$ck+JJXc1`Uq1AKmx)yc0hQ8W77LD zjZ_2O-B)XL=I#wCdiJ@|DTPSbY`l^*JpI%K(fjksR7?X8Iyx(!!nLyl^_ifYG z0{3Mrdb@2;+O=8s^+`$IjvMWGlXeHsgP6ed=jimeSMIm+#0ZSDGXBL?6R&%P0*_2(j6j>9jO(#nyg+&XWUfjmb#s0I@Yy&IQ9Xc&qal)rNpSNP_T53b8Y?lkGi z8ucfk;5Ikt*GGAO&oqyo!SSw9t|C&jO{;YbWcU=s7 zt`K=dPJpYvoxP`5iNUcTQHF8l-=&V_ez{fO=`bF0%P%#d0$C#n`9K>iUG0dr`VAXuEFi@bbDX?#J9u7N1-^ZVA_E!@iPV zXI!{_>8rXvqkXaK+@4x1XN#*dQ7J1lVJ)|fqP9ny8|9N@?&Ck?8-@tVzQitKXc+i~mSjCmZRwCSAm&189t z5{egf`~sW37L_QwWGKC(&IHepj+Z4a^5gi>n?$_D=(19FeVtU~4*73FivUKu)yaHt z;jCw)uLbc$Ih3qApNzH;W1QiFiAn1VPh}1RqWrlxpgutkSg({nN8cZ$ z;wXpuF>n&!FQUDnWIvh9EMXgPW_ZL^PLX@ZbzRq;AN|1oa2buF*w1Hxd^2HjZxmXc zcHa*lVfB@IbH`p-))LAI7rUs!JMHtP_+(Tb-jZL>wzLA* z!=?1ubCf?t{(H=yf_bQtMOrho`1`gQOsqcs@&+mqA6~uD*4<4gC@6_?C1nk__MAg0 z_ri4>(xQU>N(~L_+)gve@Mv64k6H<3@MLFY|m^cc__^3(-0y?#*urLQs!YB#E_!MN@vhL4v`lixPZAKu9!Jb*SqL!GRT%~u+iH(BzZB23| zQ5$x%#r4)K)W3jb*o8Ke_`KoF%ksEqcKbKClQ(2}SQZ@1GJ%x)@US0Jzf16v?yxy} z8f;oeL=UKGcypMA{=B zm+Hw6NO#Yy)kO3rlo1lBjoZnCL4ASx^68lJ?fH(=>#vM7Q2EdW6|AI09m-2F87s=v7_DT4Jk<&`y<1e5s zm+Ll$RFuu=5z*$A4GRsCnOzOJA+K@^{op@W6Gy$iANVu>A zcSzOfkwJX{t2K$ITSVzmq$0P1CS(+r2A8jAXl4eF&X|SwO1%ojkpG{h#{xC=4nTf^ zJP%s|v|5}2TjoID!4AE=y#+ibv1O;dWoOrQZUKhQgQ&9T{`h-|9GffiAf>$j`AIQSvKm}^`kusZQ5q%`%BCsQV{ee44KE9;}h8xn0?$sNuI^kartpWZ$c!V zvJQaS+Tj>mJpSc#FW?QCN}B_e@;F7lN<07=YHPnO8bFN5j=e#!470i(M}-0?4Tab` z*HcY8oF!GuUN6M`tJpI6v*P1L6m7F+h0Vt+J9a&&U+8Zg~QqSA9|c>S?NJM|9s;vrmz0Fgdo!!>P^9o~Av+fi4OU za>8!lQ*myY`ur8Svr5X6a$Y0l)@w_w*Ml(>omH&8>ZLUT1@m*w^aa{o@F2Yd6(ie>0o`=7-g*&$sH0rDe^fI`Pp|n=R68cDf49#~T{Hsch|7R&UUK^|t5)K0Vs^#2Wvm z3mpr*Jt62CvQvEnDZXL#ToRUi%U;01pc#?rqEry43>%qXY*})r`#Z%ig2SX|q)2_b>b#<3(XOCrR`%H3QxG%Ltuf30Vx%e-O zgpY13(w3B!U8{>xf#qiIkrn!>m(Q0OmwkdCM;lWo#PPv;gI`x`g~gn`E8AWpd@7#A zFc@C0BkEKSM_FjqVErL^^O3JnwT{rU-V z^oGqDcQ#bZC`fcAz7rvpX3({-Rr}qRA0y0Q7b}sT^Qff(_-Vnz!8Q4*D3r0;-=j3F zkL5vpAR#0gl2~kZctU9^l^RgybIDsvAA7rzz;Q@i_nl6Ho9$_sKGvJfmpxv>m!bs{ zra>k`p}4AhDfG93Dp2lKYdG$Htg9{4Dbd=ciWd}pes}~t9nD)K`OtWr5QKYWTMgd3 zN5kT9opPbO=1-@@#UbM2UN~{Er!k{_H>q1T3kd%DDTgMvW?{dw^6;PP-k)@?c5BoO zUCB824MqpLNv9n2=-G@wX*sK3r5B*~7S&`p_OcnT2h=-UG0%T)Q5fL5>we)H)%`t^i&Pzt0#{|vkL9N|s_9N$FaokA0Hk!x*Zq}tUgfGEOMfa|grc>4-pbe88r%WhZh`0PZJ-p} z%LS?nG_E;=^=Rsg1km#4T%45^`NNjp;Cbp;Hd*>(D}_+5@iQ$iQvt{KrkZj8Ivp2Z zc%&W7%$IA`cbf-?97d?NB@}Ydy6OiF z+vxNmQzfFHB}W-}D0KpnsYttQg5Z)^$VzQx1R`FBDI-3=x5aYaMZPu=U?aU>TwhD(re{;bbl^fwIgcl^A8oWD+_;e9ein9G~nGq_H}JE$8X zQ)_3Uq_Ld6Jrqf6p4FVxefa3^W?uwrO~U`mdRIAHWx5piJRCxwY_dPE zY^-FUW{{mr8e`F>`{&5~l_`Ta_&!&2$a0(9c%D?9E8iLb$C#JNcYBEXlYX1@%D$Dcsw11e!yJa07zOkViuw8 zsm!IMp+|!VVg4O|UipC!%6ReEfaP;@j9}3BHdwfU30XR!9mXfWnA5#Kk?NYG-%Lv+$#JN)SNe?`#2~Jw`|OQ zH8|PoeJN-6a@!l5X3jqKx;WWyU?xlPuYh0!L0rc3(tI=(KU=@qJljit{YBL3r zBgUbe`C5({XSY5yS?k4W&-X>#r~FsmPZPLOWsX5^@FUvO1{UKCd&+UTDDkloPdvOo zF8S3sM_{%s`l>`zPT!Rh6h`3{l|xg4j*jE>zh@M&?ky2M{~?j0@w+0k_V;6x^;HfCC+az)mg!ub8iy4M-;IQLw^0-?Cjl z3U)`AqT=Rh9Yj;gUfV^hI%{Lp4eim5{a0SxgSMM-dw=R$-_=<6{t*6M!T&kdpAMiP zxFZ<2zmC(xx&sOi5~&!@6|o}e&~b+jWs6Ekm5Ed`=*0@}oO%s34osQc$K0OvI z`^A6Oe!5;>{2JPp@!U6`gB0v#uCDs{ci@1@$HQdTKgh6uR+LSa?$9Drc-c=}Dp+Bz zSbyYHNUED4w-?9b7G}11^)3_ei=;3~{dmrnnTqCaM?#xS&3V=VCDNpHKOqZ|$?vbl z4Wh%YUnL)3t!Xv!ytaOO^+POxZMmpAXSH;}x_Q2Al#RyG;T&+3-85amS@#meTP%NQ z#MXY9(B*#Mx;j4||L7zU+WjrmRGo;vqk~J?InNit^Plbhc>|_s6gEu=pT?0cA!uq3 zwMJT~&!jaGB8)(^ayF-?|N4cx42Lk$of!6Lcq>!KVsH#h;%lm;|lh@O>4@`i2*F><2GTVVz9?9 z$_lAoPbtf$7hdJK-cyk0LS9NtPD3Mp`_uT_&i|n014w@78}7f& zKy?b2ROgF&+||6G!4Yy4#9B&hd?LdjLHWh!_lrTu6OaF_VfU9TGQUP~qJAs(J(Y)M zPmK^4AE*pFG2kwQLKyeIx8^4cs0$i}=mM&u8wSaU;6^1}098vSxn|#ttrYW~a%Y7q zA3=d$>|X}~0$~(=%cG7=LsH6fK6Neib0kQvNBH;zKCwX<&bWJN!`}WsEUW~(JutM$ zGo-0fhaCT1CO(9b^TKsmzPlfEVuVJ&0;RB=zzHIMfu(+*okkIk8M$yruM>)Xj9j~> z&|09x!%FVS^T4IkvXA81QN*Rtb&_XPyOuGH{Q(@T-O2N4Ceh?VOPOJXb< z7tJ2oPlxIv{`YgApyi$-v@bsSuTWFg!V?+GeI3D0Ptlr{kO(b+OUldfWxy;Ae!y&M zR|qouMuav#*_y%61eZ*T5*^})Fs*d_v?Ek>q7L#G{&yUIp`jt*C{u5Ds=&)05=U=_ z_Mi^zXVNU0Wx^pZ&A>O}f>a7_r$GoWrJ+`cy*ie0wF^>8F$z<|_Y4&g=rfp}Yjdvq zl62n-dTRc6H0w|Gmf$EPxgbb7@-wJr%B$F@8An_lrncU8L#xW8Ts`Fw&??dz*xU6Q zconnRW^C;e<4mY2J^Tovm=6*@x0|}Efc@X;K7F#FKh*xTbDZ8k2^&r>j&+Mv)U4%x zW)P-{U1K_-5%`^%zQ9;Uj0U0PQneZIVzv>1N=jj-=Jn``?5uE z>MbQBHu>lxCH29Z07o%D%b*>~<&K4@@^rtR*gO#wvsjC}G|Byqll{;5lOdA&pxg(d zd5LXTkigglP#9A6{4}r^~s|`Z8VW7+s$PG*3g{lepBb;{{ zaA7w-hN>Y9ZO`Euu)9|T^(XY1M0~#nRQ&V?0C?0mTrrr)|2yN~-*1uPDin*eDj2s& z+ZQ^0k6b!GbQmVv@f8(50HtPRl1efs>_m1|o5J%C)O)ca=E0-2N7j<-OnPOtC1gWK zm0#PG&_(8V=Z(p}Vii7b6V2uD=f|#-GUXulP1IcaecwU^t?|!qS9goLlU`@&`n_BA zZLS!w+t{;9gGE}7dH0lJj9 zU(9yi0D;nXLfQ0b7a!f)1PO8V0RGyTVr#jF;)MO0WU7VQ)ukVnZCZl zf(WV+7cM@dwfhsze&4S5Vdj{tb!D|N{Zj)hqFB_`p>iSqp_>TFEv4rAjLPf26q(_~ z3fTPcZZMLQ$SGQ=l2Er;r9YqoH&6Srl+!&@0QN6?j32$tT611r9xpdMsQ6_1FT2p+ z0k1DbapT@+jYIw+4KH%Vtib)&Lq;;4^`KzMm}GJ+r!Crvr}-h(|a%i-CyRv zL|z?G5 zRanY^sD9#@96!SV;Xpq?DsL#1EeXN`xI^uOw zUKOm2_ZCB~ZupjZF2|q0RoXmp5#LBy(B&Ea=iL6J&GXuOvTL%z zou+Wcl2>(9j^fP4@f%gD4v7f#DA^_uDAMor5nNfXPPoNM+!l4vajO6dQ5Aj>`G!vs z&=t#Bg>NvZgiOYm%UNK9TyY~%?e`T_9Q*SoDlY#7jusbS$us{b5I0l*{9Fi7xP7MD#jV7A_)Z$sCpMZ*d?4a+LJ~sZwrqV_7*a*S8yflUTu zW73gSO5JYC`-pwJ$i^NynOmOmpXx49QK;|&wqT~2#@1d5UUaU5SM#%4{>)riDlx8`4Doh(TdWU_)tEx6hoh3)p!s$^POx5OA>n7Y@rBE8Yths!KZR?U?P5qf0%6cFlS$xv%jD6%Q?x(<>QEB%Do zLe;3C7rM)k+S7&ovj=)ifwbJnLN9P?u6=MI>%$Jmet$`(&0h{1XB)-@e5X`@m-1y& zva@^{_-Jvq@vF&|Cp)+ovG-_XP(^`AXGRUj?L07dyyn|~ILHoubnj6H>Ok9g;l?T~ zr<$h_C4fKw3~G`FGzzqtD%cIuQOt&5WlH^eBq|nId5-zOP?eZnjKIyONNywuQx#GS z8UR#g+^KiRA@Rx;r3?Z*fD~#z4TWhOe@`77DVrk`DNXE>)hqR1>2hb;CQjAb3uoR6 z+kL0YUSl&EzCJ-IC+=Tx+x5__m8r*JFb~VfGC|gw^19f$^2hq8NDaecnwXk^wO5r> zOl-ac8;vB)l_-xog^$6Yuh#g#z(^473`=X8Xm&_80#K9V0w7diKtSkGZkG`mDr=5L zNxGI3-IRyHY+{$TVI%V?rnZ{-?bN1%?MYtQu=(mt4rMKQi3t#5J5StX+9y*^#bols zSv%KlozQ9aXvV;wo2AqKO2$)Bz5MrmT99)oPuEaXPaJkM^Rkl+nc? zOjdGqV&XQIx$u-|okA&x%C#ziyG4IADHT{&JM+4EkA*~GUR%&;vq&YQkE?^Ze^PfUK?1CfAzj%|c*wo>Mg(}+%___(6ArXn3Q6*yz4=#zM0eLEY zGxM;cx_$};%Vw^<9K7Du0*&G|et^ILv#*2>c?W!dA3Qr9I}+dY2JD&_>bG8GAJ}K# zmVv?;B+sV6iNudlS9gQgKpe%QI}gL2+n&1eh0~{#p&#TMr6Vfsyv74FnOSWs-*Gt2 z*W}7YOHF@Nq&$z^VgqpQLM%N$3W|eWByP-}bo;d!R z1%c^=eRu5G%UJMi`*FE-kc923J(;D!xdUuq{5G0$d(|eO!!G>thivm|>TD8KC0e5U zHdrKFea0s1VJp*qj}xbB2R*l!6Bf_Lfm`1xv$jj3l@OCqQtA;O=gN4({&mnh@OGCCFfdyA#~q-GaM2d_!{b z-gAE5{4)da`TUqB z-pnPy?{D={|F%-((UKX2E86zPx;@oZ zzipye5AJnOm1%3EcGA~DZf>6lz&C`&=R;n6PvdNtgfZKLXRZ2qU;CGIq!4>7LpwKg z9`lGL8h0~%{=(M?<+4!fK|#gbH3IN>lazh(7ZQe%A}J8EVVr@lU=IVHXO^u{V)SHa zK`L3pFqLr_3Oe7|QsckQtPV1}0} zg6{o5sk7S(E!vR#1$wPhTzdM^{A{boR$7FYs#46s?;2N#nN6-(Q+0fTW?Z@1a)omw zG`)7CYGLxB=V?TA8|lVtI!4C3oKuKKctd9JV%)JauA#;IAzYl@a5y>S{g`yXywhYp zk$|fzDZNR?PCtdI~+4;qo5anHSXaKJU!WR@6Iv zyRu#+(t7W_H!U?@vK8Js!JWISIyJGeGmj_|c3+oRZj-$c65zyacNCjBTJmRL`A`Y9 za__hn;Z{jOn{A}9)hX}qsei*Tx46dLh>*jRS*J+#pL>AEzxCEg`c8#WjxCuaW*=`?YKWg909u2 z-bcK=aV76)Sf3xKINg~s#_<MoFb>J@XToASt%ii*2fFFDMSJtoPI)gKG0s5yX?krZG9`oawnX?l_8ZV^OIwIQoq8ncZJTpu|T>Z8CRGW?EZU=%x{D*Dm(&t95;Jq+Ph`@XF+0 zXHqGzUv0s|Qe>(=oQd%%IP#=L+VlJ!kOT{&KwWU0ydd*utqGjaU%SZLf&t-cop5`oAg#EVE7z(~l)U}3evmrz$UeiD*;j|9s1um2Ab(} zn>14suaNb>hg(|8da7fzWkTlDt39Y(Ho06qyfLJl1VL}Q#su=GCDleUauh^^l_`ZLn3 z+@R&dGOJds14j7(2V%;}h0d7a-t2f>eHo!a|UvnRmWxBiqH5v9aa1?fO@cYL)XEy4Q<^eNqKx_ zUPBetcmFj1r6p~(l)`aV_Za?>(Bl~qGs(Sga@iVqGPuWhyj2Q<1vCXS%e*4k{Y{$p zlAEl=&7O1=Gj!~?!1m|xXwCfy#g#;bh3OR%ib>Tn=NOZIJJ)LqQ@5go+#aAcFPWKg z$u9kRkhf+AE$MQFNz6>Ll~?u#DM31}>g_T1p&4q`OAb-US#avwCX@HdqoH6QX!#29 z>l^~YAW=C0kI_ssJYNP^oQ;=;20FG_4~>DDmz8?WD9{!kAx<^6Gziq*Cz7@xU(FbA z*FzL$rDC_xJAySJp3lD=d*a+NzC0UgjO$7IZso3!GR@!2qI38ZQXAhSfkxg|Mos`? zj1i5Lv^-b{zbJBd=)InOq`u$QqTtmujq1kUs^#m{a*tLk)u%$?55BNTq#Xg`B`lq> z)9ym7=S4I?F#3aocZRNQ*0a))m-w$8ry2MpJUgH7EbazRniX0RrF_VDlf+tR@ z0!=T$&;pE$0Xu3gy$5D8ZkJ9^&Bieec>D8p(8`h$C2v%BU?vj3Nfu3|` zCN?q=JlC2jYxLaYLzr&&-#`;H<3#ND1F2~!aBZS_$!N#TY!IBucG(H{^3=W~^KZ)2 zZzdxAq5HD*?_E2%o+g<6aiSijRKhn`P4n;VX>8wY5=W}a>@nsmO4pj~f0FLVYzf3h z4mnYvb=|bf`-wknFW9C2`;?Mqa}7F6}v%B zyVYwb+#~l3?b646KOCG#!inAlKV`0m-i~L_O@GOhTMv0O>W~GZ?H$$-V@@wF_xMPa z3Uf)&$&fi)+3%T{nJY6L12jW#i6C_rNq9N8TT^-$NLuy9Uq}~w5p#e>DXdxuBTNC!2FX}GkFRnF~es^(|jvt|2zZ9|9_bF>E*Hp16%61dD0 zM3v=JJ+aktZ+D;dQiuk3>d0du%eMx@`G?bs@_O|u>+_{#mB=`K2&Gh>00V)BaM2g& zd=ID)axEE2+c)cqK1FQ=b8?wX~&wQCKwaapRTXqZ+AW2Zb!Wf(cOW^ zOW5U~Zeo&^Kl&oM#Q{Ly%3vVT@YGMbXDF&jJ-8#tw;$aqZ3RDF)mmy*bl$6dL#KXR zlP$$r=(X_C93v4_+8)5^Nxz(Pzp{v#rXUDY=Wss8mV7uXCpFELP55GL-&%hjlvH9a zAD_NNJCz(AosL;)Jmjxmu>h(tA(>Tfa#&GUFPus%VzHE`nGPlGyKhlX>e+ZB=_RP9 zIUhsKWw4kUqdm2ekO4rR&R5>P5VF5^sHm_Rh+phKYK7$t${g9$-S$`21R{FfoFrfj z;x6-G8UM{*i&ULhry`ffN?uJz)rkd6mvp`RxFaJZlFxT&CDS7EaMp_`CI&eRBa4-i zr~VY!2sM!{3k*OfS-}c%w&1p$VD+#>6GApn+${*y7IxhKE(UxBtMSsK)!Mn z>Nn;rNZA{MYfZfHSB#t9D2*fX1)-R5dTjjJv2t~z3^;wNBA6AZN=y9)2Yh|8a*P^24ddMP&!*`Km@A zm^4>a&atK7X{m^%#&dCFx=Z@!Z>S}a%+{D>V1Ha|&)Z%8JiM0UmG+0nol^{TPp)do ziq~X+eZxp;HZ6*V#3;0AYv!w`dgEXx#5__H8KTxNxotkl@4P%g#f6GPZ2pA^$KpH5 z#CMp=o@_VN0BO}?UZoukfMx{UA-sZL;~}7nsKbE^f2#QFJJlC2k*u4rZlqVOLB1=N z`0+GJtEI|frD4!c^ya)N%5@0cC*AjYUr~%uNvL%@#Je({;P)b1w-bba&{1IUI5u}S zw`=R`6ldw&C*zJ^p5W?tFFPzrS8F&=EIqRd6;1V#@P4Ld?PS`Yly+ERFFUEUG^|eG z8ZK-e39s9nR=4)Fio!gnId6x}i9fj4IR%W!U(q}?Ms7{7J#(q-qDpB_io+4tI&L*- z7#CA?2Tyz6&h_AXH=RZ>z6Q_dcq;F{KkZ>(`R#VZTWOpYxxYcj8s~SQ#aJ%ZWuUE; ztqJ{EqhfRg+()uDH#`qSvm6;2;MCH{v_nY@l-x9R5qGY2B5^qL@%vCeNPi1YpQ!G* zk1lA^=3eTlC?+=1lAuz+2f1H%9!Z}5`11N1dCy`397Ze;qd%{OJ&|UQ@ljBNlbaH8 z_?a)%XUAfpP&c$l{T?ALg@oncx?f?Yo^;$k!b9bkjp|7$)w6DzKoQW=jyK_YF$FPyg)-8{u>4}gm?Mne+mNiCe7!G@R-L8| zWD-KS;7~MO3W50kAYL*GmKIEmA!sn4>R-5!4Q@{5Y zLVY&f3iof6ycm=j$;k$|PNdoU{;Lfi>#mT9_Z@D`=gsF5&2`@DyAtaIah!h9cW{ls zhSAy6#U%w6JT^nJD}|mK&yxp6+ROb4$qK*L@}c)(y(osEZ!@^>*Yj|KsR|1zgYA`C zcuj|oA(1k*RzpJY9S*nBtP+QhwhuSXcHwa!Q%ImbU;xri?nE=ZPP;GyM&7k}1ewlV z-#MHL*mV>IEI%2ECZ!>{&wU?)CF446h}=I%3lO}vnwo=Aer(ln{$*4Pi*|3g296kd zoTAee=%JPNdj`-vdn|qblr@p)lXYmmTxWc6bL!o=Ut|5u1~x*N4U)d|9tkc*M2nj} zyo&k2(!z2zHk8V>A9shrwu&PTWeYCW#@G&5YW9u}T29ha7vcf7W5 zp7vMN6oewYo(CUS?i24Mr7!9!Gt6m{-L~x!tvyUc2nbe2Jg)AO((%>sT+VWR_ozb6 zM)D}jXUuS>cIR7F;)n8oLcwZf)U961ZbVLhRR}E;y>8|?V7VAjxxwu+qNNp+XK$ zpwG?0Jnr|rsnuL1Vp646s(gG)w2^pWkHdxU6K_j-ZeqH|^El+FVve`4-{wwd$tMsV z{%qsie7?!)yu!fRCQ6uW zh~L*@*`uH?2OJ^I%CFZAKq;#`K3T0pcyvVBaI$!Xsj*D;y>HBlr1u}Co!;;4^_q)* zZYse{_~ZWPqlra{`ObFnz(X^2T2ixt5F=PUmRxFn%4x{|R}z~NVe_4I)Lhdg)B zC1b?KXFsTzQm6ZAOq@%v^A2Ty2Z?j3sh=B{bWM!Mchgq3#8xN1*BPyOtzC>!B<{W3 zBVH`GX4iS2IHaE{?jJH^w0%*&GJJ=){ewA zeLtV2uomXlPxVW4-)beD3gFvDB$&&F=pypEcq(U;zqRBkbDMlg`~siS=-g~CU)nYBt&7ZgxLeZF3w?)ogTv_NHq(X?No$U*Wa41q15C3vIMxm=^I`-)&)59B(Ir zbD#POa<9hMa#U!xbb^8J zFOVP!^@s>^Av*^l-Z6W}a*x|H1Y8bcQqp88(jUHKCQOrj6pq$)HK1*j>N-fUg&SAn zPfSBdWOI9k;lLY>ql(CDtA>?5b84jjp{DKhbicR4j{S4lw0VW$T(E#Ec-wnMV%-GG+YWfZ5wt15=+z+c3#%|cp)%}oZ+Ege~5Pn>o4WHajmL1oy(uV1=`RJ%$>xw z0e_4nukw#;MKXD}8ja!z757!#AikMO{=>UZbZMa`>M{dqw2G>VhPMK8knmxhkW1Fx|g>;_C?RsHY@lWUl%Cd zPGQ=k$YHBjrnELt*l>HSnv`~uLM4jpRgh232@JtbI>qGy#wZu4T5K;6B8KlVvt#yn z-QNDtiF2iz98=$?ZE#TP;_II}Anz965&6<6+rHp-8y{qqgJ4tiJ_9A7(VMIa9z44@ z3RrTHyw?H^Yv~3lXX(?C*InFE=D-(|n3cYSJ{#33#QNuh6rTijMZcv*NW;Y150;9!a1&rNY z_Xn+*wiU=u%4O=9a`o*@a^9J$7Fh-VJy`!odR#9&9wt3SNOmCT7nFc5ZLW9fuP-7d ziM@`6X6@xQ9`DF_AswF1E+vXA+2&xNvB7k=dhFlj$xPi{+pPh>*Nw2({MkQ{g9;9PIs4BuE60Jp>BjzKWN^qO3fMx&^6x&ps`n z;ASwFy`9VCh|7`*NhJND3o#Hd${=RYL|nVDyKmP(a`T%ZFHdEjo z!*z7eDQ%!aB4JS#R?z;_6Mr5^a*)YuH&c$eVpyJEs6p_lmp-fcOV*qWIDA|-t2rcb zh4b08O>sKr#I_^LZiqp;SwfLQrA?>^N!11K7xH%s@~G&qQK$tdekg?hgNE63|IFCk znJmZrq%8sO2NCRRWyx1r3dG?4}U3t zCz!K6jbj#}o@Zt#reqrnRVH&=FCsUmWg5Ced@gL%CGg+vUkxL8VQd};mYkyLSidod;hx7zC9|iaphuMt8bFhIn@Fo!Ow0+SH;GL8KdF#EekqcH z8Zt)48(4Of%E*E7BnSGY{e6HyCgu$JW1dkkX{^GwSa8syVQ=DrET#={T{Qhh;O_yo4X)KNF3w^Xru5Y5K?y3f>=-QuNj|VgUYF zQR%usm8v`Y+;T{3R_rVqgLUCYk$B;Q!3;uEtQ!8Qzb=%^gxI6{CHfA_@;K7v9V(@P zL7i1@#Vl`jUpAS6PPu@z27S?ziQUkkAlu`jq9P_tIOAM^pU1x?8P$oz4P3)imi3h7 z&;3FdlC0umrxYJ-6Y_D!>UaG3{aduxk1k?*fVPRo!w=Yd-PFcn;pFzr(_Qb4W0gq>Ji91@e6NkG96}ybI7bKb zedPC(og;A>jNx$X@VWlewUPh-NhEq<<7x-B&mns;RM8bk8@k_j%A;c{V!!+03vbXe z+K&3WOo|Iq^HXL|F%{9l>qisxyD|(Ymj%`ag5=twfhATj=&-q}XF(HU)kTb=lY{i^ zz%zDIADqrJWymicc2AtJ5wEs@fqoS&9iNgM>Y(Wx~cW}gM zm45ytxipaOaBS^3uuYMqEdK);_uoFigI?J6@rE`W?WvCj7$>RA(B3vcS>;z2f_3Up zzP^e8A|M&dpQT@cDrbuayXcXlma_pQ*SGzFrD)V?nP!z=r{EKmu?mISd|p)Vsz=W6 zox6?!(XM0}=9b7DrsAik)I_Jq)X&_HucMb^bE-)ZaOhn$j@Z&VF-2LN2>nD6$78a| z5QvH!mAyC9c_aWu^(3W~#a*lH;?noMh2NKqDnG?g3>&nY_->mFHvsqTBt8aNE}n<4 zEp3bvdBr}Kuj4be7)pNtB-=3G{WUG6>iafWp1C5ZZ6k8l*BSUle}-tg{upFD9(gH$ z2-PA?P2A849ebIdb`lbY;qY|h`Li85R3Be{t^muLMz+OA*dXu)N7_C322ys~9OZNW zO`Ru_sRda;Y={NaG;BA!j>UJi4rP$Yqi7ey8hHuY7Lhx6WJaXC3+7~`FV+vj#Ndz< zsJ&PvERfWVIxtm-q^ls%GJr?T2Qo=VPt37m4Td0kY=AE5z&->ZF5X;a^?>}??7rVcUKEXr+ zfl5WMHj%lv$iY2dYxsjElgJx5unttkuh@7(-mt7#UFAJ_<*HolyG`ZaD&6e8IZYLp zABo9D+X&AV%N*p(Ch;{KKXXK&_?76d#ZSu1NrauFWqpL~P}rWyIj_{EU?9$o(DsaG z&bnC#D0tMt;O+%@xU@Qh`~D$XvYqS@7Tji2orzidq95D;11E*m{DYGm#Q#4yY3N;Z zCI)@>zn|b<4Ss#Juh>Ty`y)^|ZZ4<^M`?$tfB%!&CSKP3cX5TT{EQierAsaad_D$) zvFfFgIsyiUuS@amFkqc18^U-znD|`bvWq?v&PF|`5d6v7XbnI%qfi>;br{B=PS#OfSw6YmzGGI$4AjOwl)`|I@dx zhDBYvH6lF9_%9KY3rIPmoI7CBL~;v>$;|MzWWr1+4MLY6k7l;IyQI((Joqb^Kd9ISx{#;m;il54!{3$`qg5@b5s?z6l)bz8l z6ZNwE?$h#8s|oO_7m)Ow%cxM|{2Gr<7sG0bT0AV-Adf8h?OY{3XIF zFVz7t&mSzPdhVbmI+*vFi-M)cX;0Bsn1Wprr8o%B$r6%t36M&GL76&Trs^aje^OGB z5I1-3t*K0|mH#n}S5wWRtcMhGv`cPC8ZQnKC|vvz5JGuy3a?%}B;~M8(>uUvyBC_4 zxIQsnQOW4pDWNP;MU5>}<<f#vQ^hpD#0>vRgx0dgqq#%r(+M5d7KQj{koIUe zXt6#gXn|>GArNWAo70I_a!}8PCIp4UEc!~Z*X_$*t`ClLTY!W+ov~F zD`h2>qT^~b8%l2tKZsmUE41jkS1_Vp+N}o@J=h zd!S2zWzMl$QbM-nG8xw8=xx;EHBUE+K}* z04cz^Vf-RQp``MlsM-QG*HEvLW_W!}2|c9{sKZ@CJP5z)5y1V- z$${*dcW4QGC`Id3>|w+?Q7&s!--ub@9#D9K6QYBHKpM8t)w%B=OE}Um;qhcMqTRc^ zxpZf;P^OhSpzLvTMk^RfU-%raxvN+cl$Y1Yas|nAwwS zkcHX#AWDlIaZAyihXTs8>S^1w6h+Aw|^cY;+}d8^h*rI z(>xq68LzC+Navrdx$QbV-jWEg=$uB<-WLsX&mVv1}`LuySKp*#)uf%G{zg-b2slgqqIr%F1z&Zl!00|A*b_ftZO#(dmt_SDewX#_Mr#^eRW7X89Xb$2RxJm28P*!6cR z$tI71B6jd=Hnugb{Ftt{@ilSOS&p5y=UZ(fTqqU_)EUJaqZ#E1u#epR4l*^vJf7Y{ zlIy>epIZ9CQuNgF1WnsLJC-6&8?JR z!Xr%BnC5t|QQ-p4gJZ|TWGbe0rwYIt$mu?B%=`X}fC3C5pOgA~V zU|m6oV<81b42iBTCtT*optUfXtOCD@jO515K)in#P39I%URzx0!+8q;enS=5#`^5# z5wCN2;5=Y|ghc7o7PyT8PnYa|oCXUURxks2I!-J((tr$Mkn0Am_hwoECn)GhDPU&U zG`MM(4H9W9m6_$viqO|3WgoFWCKcNJdFX8d8 z972)}gGhHOR2BWtMaX_uDsnqNKu>}Cj`C4DWKl>*{!9=u>k~>(O}0yJQEft9HT1&f*wX@8BmXpMuNi0`RgI zKv75|SA^@dbbmq^5_xJVU-^VF;BtV!!O0woQJlnB;&w7tBhRZe4;Cho&>xKEj2yXB z+lhNSBz_!OM!DU@@Qp|7nJ`HioJQ}vgdMr0~u2Zc=6_|C;IVM zn}_q-dvk}^EvH#Inn9O)To&yUKZG+X^(B=X7JJ7RuA}W9qhqv59*)W9s-MIz4_T@$ zA2m_f(xBW~gL0`8oJW-C<)7e7NomuSwg9d7y2{+5EpY$2{WcXAbFa(-{WnOPe~)2W zpo5yT6BTlU=rV9NJ8U$+b_{~?U zOeF^frm=kRT3*b7mED(OTG)~*$)PBRF#o}!TqM^;dK zOFuVP%y{ggvsVFBN7%%e3!s6!^>2So2fQmCmF#a==4;USmw1_edY!p$SWLf_&`SV3;d4<_D$j6Kaywa+B(t zj8Ym+H={vuEv2Rf&88rw`GxiLU^O4LpY?j*#VBF=SlYjCdte}#`F3~jC6Zcy zy||rvp2}!{oVLO>^4A`r{PvDxmbBRJRYRrJp|--Us4G>Gpnoq0i<`yBxKo2e|hy;>u$+#yob^ zN)9+{wn&M6VNX@-Pjhu7o58O;;gf&Mt0eEBM83#HIw*M9^?cIs(R{k@`|#nE5~v`* zn>0@|S0t-2%9=LexCO<}%6h@tVttE(f@Cr^t?BopL1s`C?$Hsw&ZvHIJF1quqQ3|5 zGI`TdwLxdi|FIvzxpr*%Fcp?3oniWiszk^9GJ5URMS&-UcjSi>-Ue2`h1spE1rDg^ z+v7uaPG@{C(6%F)g7*dsOC1q?^tjzE(Pm8)i7HvAW4(&T0*yEh^{L5iBF*RPgwit#+WVL+ps(z$v+F^fXq(7aQ5>Vy`mZMjWW2xm+FW>SP}+ z2OKD+IB-!YwT#QjYXGK8saqpc?B(!1v{$nF2hzv&>|Bh$HM%LZJQu86SOZjBmro_W zrLUBoE6T611!?aa|Qia-LiKT}9DU$POY$!9i zAj9*}Z62{=SqOZy-X5CUOPbl^Js%C~f(jox?Dp-v`u@9OVtJrQysjlHes;l%#9ZbU zl(QY{xOhDv+>T8`BIJ8RCK5?gUr>+)3i7tW2`aHqVABpmmB!&d-Jhzw`>+B3_h?b# zaiJ_kRUHwoBSBccXNMWDp&&5&K|vvH@fV%EBw_sf%L>X&{xpicIvcd9egY{I)iB{z z^Ibs%Rf3qj5Yov37BS=D3WxnpW#X#(*JM{o9+?$c<-@Z7<>{dBhqrR=8^?V$;MXdhFJQ)GG3n=o(J!1wy%;u{ueF}|`^;a8b zD|l=cvftKjceM(_GMyhdHO!KRjIw5MF5Ju*9e;}Xa&R*UGYYn4m3juM}t$vVS|Cvwd7L zD1IZ_TcA9XE^p1tRYAY)q<8q$ZvBQlBH@I;JSfP(5r#Xt!C6!-C|sC$>2t|Bk%xR+ zb>4*Y@sfLvZzHt1t2-4BpTv=vYw9BO1W$@=mBZx0;cbH;6)8=Gr?V_))8-$=@hdL; z2*wN?eF@H?kguQ|^?)Xy36oRgQ<_qvaUz)^DC*`e;-_EWp)t#elfw%ieCbFf6$2?aqER+Wi(eNLXj!IL2Wy8-k+|qRtu6na4 z0q(pS!p8vtTyr7TQ+}76jKPkt=}&QQzGTFhx3ZbkE=E-!%yvFS@LbL6$F#DyHHS8w zzRx7PU|m=X!LPlByHj} z(NW%PX*G2gme8Fc9&?vm%rIoJ7`Is96D!4@P549X!5k!&DlP?xA!bv?ze7I|-S}^A zYF40C{x&dtOes0A(-&G2W4~eY^c=M z=ARwS^VSFkyb>6pOKRkToFz0DlE_6>dN|iVQm8T?>krpX*X6MByT$UzFVhiZZ>anG zJ7F^_I~?>mD)5T&gw%4qDCJjm<71k(G)Dan)VuG^ft`A4>iTMv`L}gn4?7vx-y#o~ zHv$v0f&+rY!BSM#V&(S56e`Sj^m$9$fBw7B%F{uBE$)OoJ4a#Qe8f@W*mh%AUT*;a zhB-m>oU+d)@_L=)o-){`8Gd1ATrE$?<5Das>QIthI@mb<(3{bSb0HpV+j0)m2vV0^ zi*2zQASlTl_Qd;Cf<8ftm{h<0TNt)ngUjA#Zjx2#a{tO{sIK)pJ@=jHxep}E0x96x z!`Vw*RaM;UE+_~yrg%5tV4T&dGeBiEwx*J|s*lX{9ISM-ogJ)?dfSoHz`y!8Gw%*_=wDsi$f3&+k_zYbdT)x}>#_*j&RS-fzSuR<3wd z{hpBFO?x_PiXD8@5(^@?93aE7bG3%tJcWT!Ws$+_a1%nu!)x*@!dp{GzS1wz?>WNi z=}A%R^~?$^+4UgqQz>d#*7VzCXEejirDw0*4*c<8Y7aU(#~)ENMp4p$zV-Q~%_R^Bq1+bx8__^;1W)_7FA zUV4TrBL2;fdD6xht!UHA8YN*`&Qj((CiAQ+U{Su%t-slCEkXi338^&EY8>a{=+7wZ z1*E`XCh3Zg5|{PUs_)P|ghrD&B=k5Gij-a!U+=F7V6U=MLdOg%C5>^rUe?u2@72!d z60?W5V){Sg2%r{hBZRmUE`@I zaJ*F6dY_W4u#Cq#+XlE_YcBaT6A0s_cedY(;LaH`I!U*Tb>a7;Z9C(Da(Rha>@!!* zLdosI`L5q@tnBDRca%h?y}1SKz|xe(W!5MQ83HEvk#RZq_=eWs`5%KR?KSMHi`4o~ z{N+5Nx!pXL>$X3dvm91JSqkcBV9q~Hfj-m$hA=OQ>9NIwXgd4nH|Os4UGIxlh36 zF6-T0SHfX*O=o3~0t#}_;>ZSw8EVmv2T1BNi#sb1)58YB47_ronouOsy;u~^xXzow zP7_;Pk2eEU&=jg)%>b2C)>Sa=P(*)LP@ViKo@ZARw;9IJ!ms><<8{p%ekJoHbQWfq zj>3lXl3N?{T|Ykt#eV0@dD2mR6bX|AgeWs~{M-VnCiGFt_mWgaz7lX9g?*?#Ja_p* zm@hu^pO_LsTB7})u9QO~T%^62QJ#&p4yvou?s%xl(O%?WU&LQ-M=RC{$5?AN71qVN8r%*Q}fB)M;W8bV8mLwsny&Mc{FO5Iw2BR!Yh^s<7T;p_o0cmn_zBA>D@Pa zWYkGs%2jC^1}3)$RqQfdA8cgaUZ4qR^Vwi}J0!NYX203CUiHNIRp^D}>X|W?jc0K@ z*@JT@mG&tAY?8fdlH!E6V!zW)*WCk?bV?52SS{K#+8&Qvf>^M_C!09?r8#X;?6Qq? zO}y+;DbpnaTGIczq0ehVvtz}>-XwbTbwt4aB^pjxI?H>lnT>3ciKAfq$m!(eN%Qe` zl537V%Z6T@7+=}qUx3=4dHLsE6RB-0ADp+1%P608R_rKTiFI4tp7H^BGX5SUOG|bY@Vv|v^;A&n7+EX!J^>3| z94+CHiM=Y}mse1zZ^h+s_(nC^feC)9II|{Mlmt&v^3=j8@~n~5(P3n$P{+5ow-bqm zUmVO;DmB>Ooai1Mhp{fZ2qX4)vswj(jZo8_JKg0h*Cs(9TLtd~%}H@3QVx#LR3SAl>oEA4M5cAKI$ zO>kmTQ4G>CoFBr|C&BSZywRiWXJsszAg+t*+ljeXRHqB1??f#!WF-zmg}kAqC)2aMuU=TY)pMsHYHc;b-u1%l&YdU-=^b z7qj$EncJCn%T~h8f@$#b+IQbgV-El!dR2Q1XwbPHQOt4xI`SwaBImB$PdQFqiFZmt zO8Fv{V}g4ErArBk!m?n*PeDQN&?fV9qt1B9iDwj@dH!HLKe4q|p--xOg)i@Z?EknObj{&b*8ta~A#xPARG zMI%9yLQXh$^7gwas=KYSzAu1@ray<-Ex?u7#i8zC0 z^c6iGV3|QnTP&5zGNt@&&^A#uG#HX8>(#6DlkHNtH$F?tZvtyS#&SH<2Dmm>mc`q5 zM~%MtGG9uS&_LBY$HNo_S8XJPAt?&kra%Kt(FHxceUSW{Z>SD!q9j4S7EzAUozdDv zj%2Ky^O+@E?}+xGC`&C%Vj$!}q}ZtFSPZsGq$+%S*^5Ny*oX6xvuBjFTAVLxhq3*X zaWwam^l2SXJ@C4QC;#9alfZ7(YH*7Q=ty!BZZcD#Q0_R8PPix;v4b$W3Px=xji*#G zS=yK;Kr<;yMJT;ch&xoE+Jxrbb23-VtrQT~54=XD&Z35s6rkDT)$+*HK@NOjhrdzH z!#z`wGfwE0n>34!36qM<<{{s-Fl=5NwUUX*aWZwgPTa#c(?r6!C<8^75IRi1cd zE@Y}SxJ9`K>>1b4AyVtH(5xqncZUj*NEUN~iBH}8jgb!lI3^Vd`K8G!+p*F7+z1lB zKx)*HF@JsY_YC{$Rmn#O?1jottOxkC1Cv~X`YBWMrz+{StQxq9A`#B#1zuttUB&4-#xAHt=MAN`%>G)2m0%^)W2f9+o{5L-K4*M4NHzag zWNXK!q?m^({UDy#JrK!WN}J*he@Aq6*3PVi{17K$D{*lWt+`IHscLr3#E;wjZ%kvu zg%y6xKXvF=yr{*B11M_$2N6<6PwrPnX+bZ!3yzmyB!ATP4y+lnu@*Z0Ucp3`t0`F( z-EN}9YjC^H_)N9LaD+KRjkvOlt8%v4fW5N{HLvf@n>;^ zo7suAf|zk=S6_g2h0CGy61QDUG=pXo316Z<`wM%J>&Z#OO~(gznHlUP)uy`a`Hib7 zl>Kf+j3ZZx_AJ(FJM)|G{G#`-cVFa|d{!J#Rt&NtZWjvcKTk5e&lkDmRMr@8Hc~mE<}xd*lJ- zx!YKlz8}KU71(aGISg=;RGK}MqBe2rxaYe)$f(pW^8QnPO@)8au2&cB$E`xg?%!() z1VO%j-rgccMxIG*$b5u31(1>ReX=?f4Sg-|>)KJR2^YuW?!eZAohO_L|b zHneh`ei}OX_Hil&`H(z^83XGr)WgVCcq$P7XVhg`qbRh;I3^vo_A-al7t|DMM&s}c zX5NC7<*p^<<5;RS*TM3g^479H{E8A4ktNSBYZu{>^s#+)#h1X-!ub>4BZ1Sq_KeAO(ZspQSYf^k^b@nsc9+LEEoLrOuRdM5!;(OaOT8x9H3Elll)Sv83$ zGWfj^vkXmUI$|l(a|s-jB!!ZIW3*s&>Jo`%WYyibGalj18z|iujaXva^89q)WxukT z9;;3hhx6$0fID$=%6Q!R>{a)d3x`-FLaCHn&c1}PdB;d;cz8>qc><~SIn9n&uo$)8 zD`0PD%DL8)1aZ;yG-iOz0Ts!Vs@OT5DS^Vjg;WbL%40)h7(xmHud@aTjHJ?^!PJd% zWn5Jf={_KVv1pJEasnax)RSki%`jsp@MSGWCvv+xsj1~onZbYjn7^o^rdBwyOFNVf zfBW~H2x$+>655oS*|m+^?&g9jzA)NXcxu_L$~}+rakQw)L6mcTbI&r;cs3Ztj&Leg z!v#5ga|il}(q98&1U|y*Z54mxB47!k5qN1tWH zPjTCIkRnkPSkX{HSk9H#8WRr}+2C<5!7(jOkW2VJq!-bb&}u)r96LVb{Z}loj9iA- zXM*=H+R>)N`{_Ib7jg$1w;M4dqxt>S;S{V?22V32j}a~>X^quVuK7#}B$4!wiN6!$ z)vp>T|JB_AzB5Cc=tOA zm)S?T9K3A*v{RL^+Qrn=Wf+R_A+b3sHmf}HPfFioI6vf&t90srOQ4SR)9nM61(v?$ z$b7Nw*VRz;0-o$ACcZym;H-%4u@3OIp`{bMzCZ1@NRvoUxNWwUgl#F z2Y2_R&9h6Z1wUQS1CAeD3X6IIXO1k9H3Cwt$`fhOw;N^I@nl8Dv{P2pZivk1J;!J7 z;q2%@5_V2j%c+^-P#(Lh5KE%v$1`19f==||E3Bke82 z+S;Oa?RK|Nv{;cAEACL-p}4zCkWjoh1cw%PcXtWy4#kT*6xZOvT~FG*_bW%P?_B3w zf5NXd6XslF&h?CYJi`K0CbM>fM-$ewDEte4lc8n^1>1JZCwl5X&$*g3@|dZ|3U9s6 zx&7?)v?zMTgIrvU&JnJIJK^>- zu2uSzzc<_y40alQDJd`YTxtaP7~^Dc&1cB3C<-8R@~MKT5k}~*Ku(O+9t}V*sk$+d z_+_+aH3cIjXJS^MwE1NOGx$^V$LNnhW*cMj96l5o7_3!`(4C_!U`O)1jLM7}vtMfStbWJq|!{!x={r;Uzs5Anqp?;6hg^&`1g#>-W=?o$R2s7@15 zW0Sd&QU3JmhqAcZ&STlV#lAx4<|ow^|IzHsCprs_(>8cY0PZXpTR5~l@AmJ|QBG;` zxjm+xKDwn%;2Ah0!IL0egXCsS1!Oj-fN0Nx=NNsef)Zpji{Dl0@>W`l0hOdy6v^0K zGyFpA5#6|=LhcXk$yu~a+O{$C!ZiJT+22(KeIb;wL&rOh_Mtd1!h^+vM%qTl?Wp`T zMPiSg(PT(ipldWtT`zwgxN6<<79>7+a_OpD19`98+@$AjqsWk(2q*`}V?R8dCnBpu zw=<6Quk75$=1)7Do2S-%miUfr4DQ!iB~}8R|8Y&M3p(B^p*!n;80I82pnXRV7mg8; zqdFz(gETlaLM>T~JMiU=i#hhPnh0sa7K^M%aA?!d7m_onPW*xS7x@-Xl1i0edb5kS ziP&Mi;4-b9DKvDrxhf~J^zE7g5 zd1YXTJKpsOa{|A+n=Dn#|F(&@BN39$lb~flB9y%z9iA&EjteJ)bRJ57hoFK`_0HJj zAz1^6Xz?q@ST)G1<5spW_#6%*T7iaYwa}V8pvJ$QrlPgOi0xq9h2O^(TDp^y@X%3H zJ(i%^NErwq#>YC`$C*MWBEkTYV#AVT#3$0oQ;WH{P!jUzuU=Xnl_DRtwG2nAVt445 zM!*xlvJ7kbD05}dB$258Vjfrl6!YPOV)Qw65yl#I zi3s%zxK&F(xh(!F%Oheew4l_`aL~P#^Z6v6{*IoMq#Z0RKDjF*(;TE0FR3WsCZLP- zd-G~EX^e9ipAOLkmrZwn5hu||OhdUGXfk@kPaI!!Tu3kA(Y`r+9kU$?h;ny5xXK+v z`Kq$I9+Ja$9@cyGiN$u;zry+YAW5)td ztR1JFG<2C(#QXEf$?kKEE;dbVtcalmTvprPK;bL!`2u~{?#2sQ@>iVu8E+1bmx=iWk4?KUw=0r~@IUGyq;|M&PQ+7P z&_6`0W%6O`uGgmdEAVB??#lV@jO^o6O@w1JaFSnGcpIwpe#WONd*GW;lkUY5Y=30Z ziy@y)4e;ha5a1VZ{Ie9k@pwe%uUp*v#LW|>Bq^_AazkihIS9@ehK@oTM2eu<<4{aw z8D_dRJsOHS+RYriSSxAc)wZLVKFU}}dWYv^qq;p!mX$E=*6uQ-73d081Z3&lX_faUd>DlO1M{R_%SNMzS#Qt#lJu{SZKmtUZx^s72Ed%F zn#o6bxSBmLvM#I^X(@_=+#c$Y-)Qi&8&>%)byfVVJB3hD=HsgAia$Eo-XhzSTx?QJU=;tK7Xr8uyZ*!%wC+R zihjv~wpHeFS}e^@LCPcS5%YLnT`1v|U=#cP_p*?$nJR~u2dD#DHV}}k_fHngwx0ao zxZ7<*hKa@7>VzFBL(OmqN#5n{Xvh)PADKl%E#lF{a&TkBptPhpq->Vg)pnlu0(52? zeS_h92P;}>9`)7OdT;1hj!Zh;7P3n*?QC36PuqNm#F-w>`tw6x)@2CR>YKSL3&%Nf zs@E>1)fX%0eVK66Ao&hjnE4UUdhGv?al~})tr|sH_pIvb>1_B5gzeN%^c(k*^vYzN znyR^dtU8(sBU{&G(!xFO5)8p;xTf)?uORHj+9AR=*#O2INUJ!|bu_dHg)W-~6LBzY zBW3G_D5(%^is$J4cS`-a^SI_*TZkzj>c!#@j(M#M#Vgu<_}8|ox5@mg8QUFa$IB&z zBmsGP!Ip`H)XPtgRqIk^KD6>f-d2Ei=EM$r#IJ$|M?o;Rz$p#gPNt@1VT9rm9blk3bJJ-8}9J>H&oO&nWOHUkc(0^5GI zw_iRS0}FZ3TphYZ9(eR-H-^P>#qHZ90qyy_-?Oj&n(#MzqvCDkahRI%?)h;pPX2Ug|Rg|APw}&d04v$?#NoU1tZ^lNq2W> z>KG+H0MUEU+V@Vv0f2Z{G^VqjA*{bFC{V9#HyH^#UbgN8;6)H`7gG~O6$gjP%=xsSs;YC#ptxb88MfwuB!_h z`@=HKq`OnjY1^5<%XNOl2d?}WQjIqiTI5!12IVJ-@V0NpznZO*;p8=P&R;`Ajx|He$J#mb z(pwg~-CJ24#?vvxy_G=JJoQ$oAGi2;y_-J6pYw^%>EDC~QrF`ZBf6oWskB{4id)_ z&F*g1$66)a*Ksm?%|F8``|Fq8Ly|k`gFlROM8OhY-{=$pE+xcu=CH9;Aro`fA2)0Q zN&B$eK^n8S=S&hkR8-2|n@{kdc6RZ?Sg82y*9RYSfDY$0mIO2;YV9M)ZK#C|L>^Ae&#tyMrb-M>MxNP8G z=L6%@z}^Lxn0jz8xPHefm2E>z=q1bBl-q%Ce({EkQ!`wH>nTafW5gd~+v%<5t;kq4S98Adq_Afi6HC^uuHAWBL z{KL_i1=SC{s)(0SD*$MyQJ%$Q9w}J-o?oLgQ{N4dB2YqGe4ac8i-x+m5MnZBJdS~% z(p<|lTQE1|qK0m;m5M6QT6dQs-5?$gy0V_*lOKCofTasoxhPOMG4#>(fj!jagri$H zX?DW|ji(-|J5TJUM``As_|RChFMuP$-2Sj9$61kvUM?t&gR`XZ3%M(_RYrzYr&|`1 z?_0JOG|up|>AK!)U9Y52A2g+u+7%mJ!)i{j=Gw8eTFTFi?UabT;cb2+RqJk@Otmv* z6SJjLjBEkQGEI*|8{YPQ&oaO9C=rFlEBw?(S7~WPc2g=QS3#{t>!3qh=g617M3&fn z`n)$Y2V8f1pjdT+HCc*^XD(NMeR5KssvV=qx4R1q1KP2H`p+lHsU>x+D!W#zuwbEauI0y>&`t3Dk+q&-^Zol{fT9y*d*E?#YL4?Z1#)pV6P4=fFQ;eVE_iJ6#KWxzERRYJo3|h}p2O z_Ac?7uwm`9!?{kx5cj0U1~Hy3rAzDA(39xKM2wkcCcU-8*Bj_w;BWM(XneXd#Kw4tMoEeZasL#spDIj zS}6C#u%GI-e1P4z@k7PRd$Miso1Gn3r}U1(%$q zbbB8?6c(45%*x8jkZ2yw5H+MM|KQu?(0ZWa;cB)^GP+IO9{p035X%5_JNa?_0HFuM7m7p_AH=somR(9DdC#-1v}ck=LOYTssgL$ z>?I>v7#Y)-oi4M@$gL+l=5hU4MHPFPx`XK(MID)fW{O)W9&pEO%@^gMESc3`ZfUm0 zs6mchgWvCGo+(GI&0}$O<*}TN9h=bK&Rdio5DR`#UT6^h2+$o%q~!N*NK%j9jEqvL zDCf^#Y2WH(S+Y0n8pQG@;EsxsoobvT91EqCxX|8O2R9mZ50OscCM7YP;M zFFQ;b*|e{0ZtU)?KvvL)^fQR=VO3Dsn%RFQ_Jx@*C9EDp`)MK8yv+-xr1R=009{7T zJNdA;dFx87q_;dTE^h`#zpHO4n}rP2kX2EzfS9F_?aV7fi`l6o(q}d;G_l27BVU(s zyl-vI?qRRWV+!qU6DwoCWbUo}@cS_=`2gNjm|j{92_)W|&RM%&UR_ye{f0Jx$+>?E zeGpMdir9TXINzk8KMIaN6MQ_FpxoJQw{fed+rA2cwF|wT8==+Q@m|cJgjty5aXhTA zplM9puahWTZRj`|K8}U~0iR=2H*ddK1*(^Gt7|)*F?BeumB_hX!5d+2_>bm!-gV?& zEqXt%YBWv49KW30*Trq;LWo(Q4f;IIo2(H|?*5h4IdPdB9*>uEG|9bP@}8QiB?4ro ze0ZG=3{1zE`U0%}bSIYz#T#dUCvla7o;QWwWSlHq$e4k*-oz?^GFE-T01+z}n!dCex|qnYm>{7!#K?J~MJ=LT zXCw6s@>qgfv9mapFY>jw;RVa`?spDEW)jrnv`cLpLv5l=zU|m^6pgq)6a5)qbx`A7 z$6Q4t)8s{}et~}wMPa2dM(9jXuHUw~jecm10B+TmIY8DOV@TxXwh%0L^xm-vHpiOW zAU!eq?P6ZAz+)cFs>95;F2YmxcUaKaDvOjyD8wW(j&rndeQJ{5jY*aWf*cMI)&$6LAGvg*k3Wp+i9a>3jhj{s>$Na-z^bjc z9>(ZkO}fa`m=MiY)TZr0&-eLg-ja0HCv-~bvRb^LuGWh7yZxaN?=xK5eAA9wvw^}) zFP=w;D@`)ogJD8WEkov4^uJnjJ_I;;GZE-^W8Yll?$roB*GWp+JMZbYo#k0M2 z4qI+InaeD+ua=*eoNuox!Ry-_g&|! z-w50%nyMsJ!wE`hvNvOyjBf5zhZ8za;GbR2x5L|o8F&KQz3Y*(_nkRkm9>JXJqec| z9*bN5Drd%(KT76((5LyZOeyo89^=`B)2SY?tF?)#gG8d}CB$$X)KF&F3wsl=uEkE= z6Tc1${m$O}*hCX~vVhlC>9xhHLw{5IPwf6ySHULU9p*#p;5wi%PsN-5QK@-6;$b`3 zb$XgUH(zVO!au#HuNW{S?Zv!p5>6fL8CSi9ZI@X*b_rU?b4HYZhvzsUM|(+43L^kc zTR$d1p(Ix0MUK&uZsI}$D4}lVrXwEpzgL+CtyigVdo{1Q{%TQe+WhDx%$V0VA`5ZceAb-hPHdzehe`aC9$p>)hRF4v2jN9Z=v_~dVi7OmzUptli3YtYw};ci#; z@S^g}rZ$1~sT@0d{rY-Rk^??U4k=|`xoYU_nY6tSLlow&s5xhQJYux(3->0DZ_!q^QIj{so;8OKxzwl%!Tj6 z*TZp=KE^ER9DM%Tr2!>qrrUWjS!B8Foc>CU?KbCx%3Xb@#NRKriinfS_pjAW4?oRA zj3t2cbG;rOK^3e>V7kLJ3Hik^D_Ls~%veBlwIYK;8BqG{UJ6PX`yoJ#Tnrdor8qsM z8NHGhZ<7JLVid{ihCXK)A z9AhX$CoV*^DEwXvvYijvq187qjjvY~4{f7CGT%SaaR$`yKi{@&Vv>Ow-z1UPO~z1+ zIj;@9-lcoZ14iRORPedO)BhgSz|I?ITXIZ35#N7`>Q3D=&`g5_k<8ADU9 z8aq|9M^xE<;cXm$(plnBSvBg4S#PthUUi&1;anx4Reh&eMe#970n!gMdW63F_-x=? z$@~){?rW7B*NJKFAc4E?Z8WEos%9OwXWOt_bmY8pc(bS`W$ieB7EGD(mR?Tm0EZ&x>Ougi0iB|E}FSoT-*8^CkiG++CNx(f>V>+h2 zH@e;(*wg`o;Wn}Psqt4EDL4dbT4kT$P%o8#2!11YW?##gH?1=-YNB2p4$2<~nxU^# z=Wr<{Whz|cRgPm$a0zRvhsSh1kg{g(jo<;1ICl9HCIXXW%R@DXZ*ToQ5Jf6!dW!s! z>HTm0b?1gnfFYmuW^hU{zUGSi;3tO(G)W||XtrN)z@*qZ4ct@?D~qWDIZ4SNy^1-+ zo7>yHuZq%inL%T>mM?jG663u~%5kaNSztLgHIM6M=lu%#=zzhUawQuHEol)Fl+cM3 zu##{B-@ZK}IXKxMTJjkjCwI)jOb zY14$mk9(3Kqv+x8@}3+l+i4#!UkPT2(@I~7o!$5Mco_H{0AH*E5jajenMm}I1Cnln zvZBx-YVSp4`_N~MFW^=Dgj8^M^PS`>R$j3SS_lx*>%098XM9T$5AlGs)}lp41R&uQ z6Jp3*<*4kZLanMu3#xJS=|jc%f;Gcb-I1kK3xoXPtH}4*hGoK%s?{oVkCaUmg~T#= zHL*x>HfI3o*Juj8q&QB-x*CAaYMW1|vtL*L-mRSoy`Q!|pdW7Q^@Enh{h#rixDr(& zsXQ#XO$n~0|9p8EIY{9)=WK9vG)!x~`VECG%w}A=C#J*zQGc4QLOVQ2tW}I%ikfLo zK*?xc&9pdW7K{>03Ody%%JKJr2_?u;%IE=Ne8dp2UxgU`V9*Sxa&(IKCnU=SKQ39ZfUh)72^()Mq+l!4JK;HTxAoC0QoTjeAbv36QA%aUcE63J6ou$tOaWCX zim&p{`Sb?b?z|rtM6oK|o8AKJ=BaWyWTlu@Z9tz>9HCZ*YMrl-&0&14ou82V@jlb% zop(qq4(7F;$v(yB5(zk&xM*@Z@#;-2K>nMp4DDirAK^jyC9~wE8L)idns(vHNv01A zD+5kwy`|EpJ}zG+C8hsF_avQek%Z&WiY-YK9zM~Ze)ivc?TOU|(MC~hy-B!0rz6#2 zJbTwsU7PTe@B5?PT7DUMQdu7cM2 zyIww5+^V2vE?Rv$!$IdJX@gy?<)Js0p23YOg@@SmIpml!@I(tgtU!rM@H4=SCxp)P-j&b3U^@P|#{qFl9^lBy0x3u^ z>%5ho!FIKNVT6Rw)O)MG*ll>m4BK1$40KJMlEiotM^1hbrH9n~vxxrwxIt=b?#?zS z7K@dnm%|~BB`#9MhUPWm()!-yZ4IhS$&HXzf!TkEkmJ-r4L($uK~@-4+dchdGzU<+ zNoi*X&nEOR3O`d9;?XA>*9IV66}Nf*JGS3+(}dKQMWIhUTU$ zg(ooOlSqTb)Lqk=tx2o?>mXV3S%Jv=Z}-Wn*mTuos@ZpLNZ^L#%qKBg+=?v?MV-VZ zTef}in6yVIRn#jQ;p5jR8{jOgh3GjMPM0t!+elmFLdb@L9wbW_5V~Wg;ceu6e%EOK z$5n*2HZ;g10WCMqujOa#3V0`>QoN6FUcDO~7?OlGc+c`R)D3Vj6q>8rqs@%!%uG!0 z0rA2t(K?e>Cr=3cM6XY^S7YN_diEbTg#Do?@%cgxAlhA5S|ko737PGg%wuMWC<7;i zq#(ra$u&V$Yggh;P|>l_l>0MUXx5s-y3{JzLRYK969SO+n>0^DU0`S`j3Q}$8#TlD z8oWWhulsFUmOLR9zLD(sfST=~E7CnZ(q!wcx+aF~1-~ZA#9^~0}aLcE%vZ@qoyi0() zZm9sI^(x^2{-@^lp!%r95KxMVey(6g$j)j|J@6Q(C#KmCJJv!G%2*&YmxrQw8K1wz z5DF=8Rp-(w2>bW8zdt`Ozn;)=`cRfraEKZ*4SXG654AJ=E^VKg$f$a6k~v?hMC>TH z$X=V2!ZNv$85F?%3Q%y9yMk&_Ib;`56xMUbw+UtfL0C|RL|n@%$251F{#&m{MV*g# z;PP${6Ln9%gnA4>N{w*FTBi&>U&$cd&I&){nQaslOHiK*nRJ_gZ?!1 zL%4mqKgJ#N^mSLZu2Z$Xm^yWq?d~6Ig%Nt|r2mXt#9U5$J6Omvrnbskpd>ETFRt86 zqDFhKQ^q`PSCg8XbSMp}S1FGWW3Mh2-JO*0Ijfut-Bul`RS>1;ybFi%sv+HFAjT7( zaRKZqycRdXKW(rEhBNqi85pK4>fm3$R<)*QV3^r+Of(q__zzz$_5rmdzNi8E!y_eA z_x}BWgFKfy#*4Ws=4llkp@LRrIDmTHW1vg{fPc=sU5xEkPUrbD_R@>X$zVA&Ha#~Cm8TI$fmMuC$ z7o2`o8ruF=+J0X*A4)x);5NxHWGt5>7VOW8SxVGQ0ZgwUKtgIYHP-$o%U=?xxJ%$N zM<3DfAjlM8*pNr@_V_JL8%XE##GpmIq2~CXxLB;AJA3ABUvJ`ZYX(VJZUF}J@tQBh zz5kw{f4>vh#7A2h_gaZ#D_BC^gO99gH+~RW1?xs6xNi+U_x-mu;AfqW`mU`_ZI}tZ zhV4p~K?x>wv+2sjVfnH+XVXI4)y0gUPc4swdGz4)bI9FynhDh+m3;yIAkAuas%;Jn zSs9E_Hya|Qs{MGTSwY{3-|U7WW}qs8=}07e7?GPt!r?Y6LEeG zA0Z|=HN4r{Wj$k`uXw)F8&h!3xD-av_tgOikEc%-&m?{jc)o` zd_c%3JFHzqrk|mjw#jJfJN7Yub1fV`hF1{vep2aJ(m|e(0eUIbK&z%|5$JUzW)tJ2g);_;98N5)|cHswF12V2V%~&>lozNL!0IV zkP;N)jNPq|Q!J@eC5JGP4gGJ3xhb}xqyr0mjvfH`KZ{{qZq5tSnhjvcN#^UYO^ z*+S?1^ z?Ld2Jy&kz)p%(BC}&uV=h zf~kGV)D*q%%lNw638%sRC-;odaV+oBt)IPk9KXS!V->u(m! zuw`gm*1y5`+9~4h#tcp#BmFsu&7|Ume;anf$ zQ%?N{rjFX)9_0M3Gi9Ow)L<#PCsjv%9b#T)#LZMG$|m<939k4>-VhnbRUdlWC5Ty= z;B(a`xUvt#ep0#>zq?U2N+RW8WKR&mYH_m7gz34kR`DvnL zcr=Zsp5VN%Y4Y9wwSRyFM+C=vz&mnJh_WonBv**!40Uh9a3IWLTt88V7j;x4_ zi)c`=>NLTG=MOptS(`|`+Q6uXnp@-3&bQyqjQzR$;4q=qr_f2>M+ zh2!8wBKQi0GS&t-LoX(lkoJn#{uTr2lAWVD8aj)R|fnWotSm&&f<^#(s&qwGn!zLObGV$uWsyh`oW0&nR`jV zZPo(E_L=4gPdSuDn^r7QI=^UPjtS`aj$);kh_;O%+dcU}H)5vsh@v%8js2Ue9kN4q zB+cl1YAM|>5pYG$mamK9elMhJ-9c_M3o&|}xgFg-)&Ci}>$UGsKBgEUZuxk9HVc)= zeE+MUy&JLl{~ftwA^BgCJ7A%CMbmNXI9P8c;n1^W#mzx2;So-0YILd)R(bd-3*33W zs@--U=DElt$nMld22In^-ESo!ZT`MC(!~<`sJUfzYc|>y9(X9j(dO{8w8~Q!q4{G&E!p?7HA{EN;aNWE*WqfaE0|cx0V+$Jxz3x3Ow(7iD zMT9G^a5>btM!3u&JHgpJmUi27&#pGT^|4p8A8Nht(gz+%{fX2fOm-xQnrgR8Y6tc0 z*c;uCHk2;C@4x;^wS+z-o$TjGNrC2R0B)so=f`2K9pROnJF5zU9pRIy@MEbnobpRL zai=3#MjG}CL}}G$^HTs&;PO_qFRPf=WKEFO#_IZK=oGgrR@ zeYu;aRzYUQ%^M9qluq(rJ%YmBQnp-(8$_s*k|J|x)*4ZYVNCP{#t7vsy)ad1ZVv3wm!z?5%~6OLzI0kG2*s0D6>&B)h3t<;>ry@7`0ewj(N zDV24;v&s=e(UXGpqEYq4|x=X?&cCO^@RE19U+*$V~rca1NSW>F`uEGKd4uY zm_$#V`1vNhlg_(s*NJF$67SC*@Qn_BRa9T8r6Vt3>z#JsWuA5;w===_lv34mH+D9< zF@|Xw_n=f!5RpmF(hcqYD_nEzu>6m?Sw2o+K4_hPqbuuf)TNT}&%}dzjnKQCl@G^p zCsD=kh2WIpEfRkI5uv4##cYqe@R$D)?;tqU%0t#bu#|##%r@rU}0cO;nI!Yh?{QpDeakrOvc50wDG8{n;Y5u z09RhOIeokq?b+RSqVmcQ7r*{Y<6Qt_4NiCj+75Psptl~^-SUWNgQe$PCGO%}L&h`U zP<4mIM&2bzzkf(Ot;uX!vK+T~sNo&|r)fQpM%zP!eVedI&#Bmrj^~9MFQ>D;p`|PN zZV6SlkM27gbv~Uxt`wM(#w)6#t7FpYko9z$cq2_JT)n3VRonnfZArdUA*?tkw;J|{ z$1C4e5>d_Oen>bBGf}UP*vvgU*bYpow3C(2=Z)cz2Q=SwQnQkWWj-lWjh^FJf0lF= z+7D6HIR|ewnpQLZ(GFF(X5H)UwJL_T#O4nAtSenqcoiBR#?m8ZA8(M{9{5d2x z`ZR(uC8R?9n-UD_-cj_$p`=eAQ72>VLnUo6u`vf-bn7MW8mU81)vcg;`ONhh!pjv9!0E!N~sI9WS;A;NR zNc+|2pw01!W9gd@yrAHnxqEXj2_^wxP{HHz4{jX{hrw&!Thi~&9fHYo<&8TpFM)x> zfT&%U4@?5}bXtu?yBwg5EWjzD<;3OubwI6yhPz9ohRNGz)~;P93wW{qdMhkZAJZKL z+*-O7Vd2cGitDhAjP&_RF@*B!cZp|pc-CPySb7+QPLJtiI31kMM@!ckvTG^>TJ*+U zCPu0CWwb{OzQBOCXX5gn`{Qc|q_idvGw8)YY@vf}hQM_$BnQ-+^48<2{g*V_;RC7G z$q#;F`E4xs!>I1%ws0MU&}_%7)kQe@Lp8MP&c zS7&W`8UDVMf6%4|li}OrUudE*oH5#a>(v-4j&Sj?{5)goh0A6y@1`G%p)>zuEuI@_ zDhl^F+~%iEo*`No9_4U(X*U&;SpU%-2>CkmvLO3dV6J;>%$@!d-%~Gl1^XtGQce5v zz?-+?wepw|3yB%sXqK*>>swRUtJsR?PlB(VX5F5C>8*tKF$Ry&QpVWMO+n+6VLy$t z!s^+X@(SIgyL`(Cj%eGEA@ZLUg88GF3T&Vu&ue*eZ+SbTM10lT7S!vJBo$+EK#{qx z83O&3XenNdQ}uwOD-8nw~po7ytqvJ>a*I=~cLW6{wOMC$)-B>Tr9*EDyditI7TCUY^LU3C9 zzY&5YaS?qhtAc|o+VXeDT`vK5&Q8CG9OgtumeTf*_d&6~{$%}r&*6D%V=DbtX@fba zU9USHoJQ$ut6o-U>aKL$1ml``H?Uu-%4hiR=B6~jnxZsOfBy{#)+YRa0fLi{{{Vts z1GH{yep!i*UPs?0dC?RQy6)2r9<+brf`Fd;Pu*^Lh?z>`n6Gj`>) zIGSy-Eu)OM^m9yMZ|{6Dw)3^$ZCHIv@Dn4So(h$|Smyw|vKMaHmDOO5q3&r!1Bqv{ z+)EbpEAIVkptuzL@|i9&#qX@J`j+0?%aAjOn*lBFd|lUd&%Fi#RpG;(M+3F+*zs+; zzAE$~dKz;@el8V%A54kKi5*J{)%o@DG`c110sU|>bJLJ$7Q*~{_jvKb={3Kut(;P~ z6r8a-71PVS!*;H%CP$^0y3d~5!+mVSocJl=ni&ibFVcbEi z$G8%ET?KcLchDO6OZ`jik;DG3rgj<6cBpDB?AAYKdXkrXSR;~Oac0<@FLi7Wr?ZyX zmJ{8O< zQan42t0Hn+s9*inGoqp_UBu1nI&eSGWi0w7u*Dq(??SWW(-TiugWgIiLJiC}(WcgN3jv+}bkd=GblV@tZ13(9fzd$GZxoEXi=bqyW&ZtBF^Ff+Jc zSTn!297~I%i%hpthY(}cOG9Exu{H)}>C2(v1w70cGP<(yG7_8}g7=Scy2l-iP9NmZ z@af7Qho6Ip&KElzhrJRxCA(NZ%wE+u))gv1Wo~`>Y#%4uXqNgo8dhg%V49ZA*nHFd z2_1h0Z}J^}LschXaE>jteBQoF^yIiWDjv6-G*T!9d-dChzn|M8{OKSMf8*kPJa#7F zfKsKTT##mu75}h$m|NM5+BMkxm9l%DY!9jZY|ELprV+-_X&sX&y%sW%rd(1Bfcc=+ z#D#Ni<|mDBY%w*xzx&5-N%4RUHPYP9p@5k9QuHsMn~oNBxD0-Go?k^R*Cgx1KfgLN zPWKvr`(N0>V7OAhIGosS-d9UAsb`N0*rt{agLjt^8u=Fw0qKP?cYUsA^}WjbC)FF? z-aD+kbPVh=JXMSIcvzT=Z(@ez-I;1A*WHBDk!(2aX3kdYtrj!VS~(%2!Q%_lRwc>} zM{Z67t$E_#mjY7n6#(<6YXx$P&c`bbq={$?gRmk#3%$WH2|X>g(pcYR<$eN}yZ;Mz z5L88X5XlO2@i~~A9d1p#?S>t6Lz9&>MQhXz3+^t-g#U`LUiB0oO0C}YV+?;)5`GP# zWT53Ca$hX_0)>^fU8Ge<+aGx~9uWB&8+^4AMAix#VuNao}({>>Kt(ttc(tBhPAAUX=Yl1m`ZD@Gyjg{8$ z4CQas^mGw0P2)}MNpi2pBC!bNp8apF<*;%bJd-u_(&}B^iJUXod#*o3P3O^y4`mWO z8)}`I1McoJ&xtKCEQ(fxqUePq2nI+H-|`Fw16mIC17;&hVYYHS{4Gg!NMIh%#2py* zr=e_ebMmt<4enp}H@f;W4DSDTfKa69dquAYSIakcmgz{l&F^Wk!ZAD`fXFN7Hqzpx zWiCqD`>(v%Qjz%IpnQWO1dArsrb;L*&14 z0}mb$GF5G%dl$>@*F-eyj2=2GD}!GIqj&eP=JRLOU#dBbX}hV*p16qA*0O!e_*XLM zc4_Ih)BFmjo8NF+r=f5kB&u?^2skl`0Bwd*8&)FAmnhXjYP-n-_Fa7yj>($*;Oh-4YsNsK*EX0B9 zIDWdC-G=j!OlVXZv)Lhb>v9y`kw_wDGPF}DjeFkHkL2K%xb~c?0Wddcc%0}oby%x+ z@;onIv90Sq^i-~+U3)c#te~N}R^zUMkq?|r-W~jvvP3XesLoq!KT%33FvL!R4&#t_)o}H*S86AvjaTk%$aguN2=P<-| zXIpuy94Z?}R=P=O=NDI+a?QMhYN@NNTRCb-I^kK;K2}+Ax|IN-5gsxEQVeMP$8s1# zNX(di>|PI0*znBW3eOt-VZqdq+fcEIZBZzDF3*hmm4}E?YEZe<$Xrb`WSC5<#*j85 zz6F3>7xojoN>ziZ`&<@Gs1vRyxN3Rp09ynvin4Wx)6wNA_y(!>rq3Q6(kI=QTv8Oq zsH_Xs;BErj_qnGqI$lh+$!)JOO1Rb4XwzU2x6bC1@ytzVYy&L4wiK#S@5p<(o^3xJ zCRj80I~+GN1R^jm&ED&+BiXIqtUIW%oFi1F@i!UGR?_qnjxD?#IX*Pr>VODd%+uA( z9St$j(a~`~pNE)F&3=(|6#0B!o+Dp*zslr!BcdJcuOGbsWpJSiYuod3Mnm8FDHh=+ z+kZE?d-^1!w2+{{f$&mK3Dq?o($&eX`&~gWMd1EiKh#guK5;a^LhrUrQEJoHS0o?z z>F!)rewGHGMrTgW4YUhyn9nFu(ugjAAiD}#Z_jzthd@-RNsr5_f)j?vU_tVq1Y$PL ze9B$FZfX#Xo2@MJ6)awEgoaLzo#blS3K&5T ztIiX=N5gM26KM;}pSDMX;{%=A+Wc?GuVxwJ@v)j$fJGe9SKen#UbG2uwhV%mUQai@ zZ+f}C^)1b{Uhx03!8ayEC-b3~XaZ&`wP)UY#tkbP>Ivy{sLik2^LB0FQVu5C#UzxD zji9I`a44S7lm(TF)$0~W<$X}4x&-VsPGiUO^}H6Of~^+Yk&S-ZExMN2jmvQ9q4$}p zQO&$63&rvtNS!Yxe;MS<3&LgloLa7%ezn$}z(;H~QJuL26@%8mO`4#j|P0o<6AM1?!O8$?4Vv5M;LoAWS zj^>LO?1jVsn&vhC{9~He^jvYkOm4S#^G;Z$BkA@AR~G}egMz*DrcS zP~yj)TWMFI@q-^MJOBLS`F)3urtnxrGN<(jA9pT|m62~xq26J_L+2H&TJSU+1D~+K z?0)^(G|`utmW0OVaJ~CRv;S??Wl#9ihz(R$o&0>$_;8^-xmz@a*=-ELi3ja|^jgWvGTy#(+u8Z+n$Bu%B|yT(rG@2F5vSB%<`^FRMok0G!54 zB9a**Il(wJVaXE_)((Pe1NZyC2#Hdgzdk8GB~NtN8<~|nWp?l~GIudzr2Ws-A`UJM z((FC=4898>GBQE7g>F>H(%em@LJB!?$r8)JdY9GdO6D=wf5|O=LCs?<8@U6INm`{j zOWnqU<2t&B%PuhsfPoWza+v2|v9#J{GE>n$uv>kMF@YEvmQ=q#H1RyPlKz8J>EiiS zrc^A4m9Ufya-4EpLasC&f*7P70|TQoGekhIC@AM+(T&T;zj7jj&Jc+Bh>E`XAU$BX zD007!mZ1r%Ke3I=VNmoFmO=ZlKz_cuoM(RY6~t+^;I&er-Hqns&P8Cyc=r6KPys{(srIWf6uXJ?ddu%*nbu2 zKxYVyY}xicoyejiXhENUOT{9rvK#^|$EQcx`MKcSqHIH_uNrpZT_)2TcyMz`FP>`` zVJu$z;o&I_aWDF<2qO7g7pwJQy@wBF6*a}`i|XQcdc}k+5LigrKX#-fjSUdEnABjk zwtsk22EHkAM}X4i?4Vwq=j2$qUE)d;O*A;9+9t+$-|VGjL(_xz_6!m;rzk7 z0A1C9hL&LuWx|3yh|6EgmZg@LKRMgCX&>FS^^>#7E~bsQx)0N`TuE$01nYa#kL#(s zY2o%|NFO@2dLqWg#>!g6tjSl4f}jOoU`mRG0T)J4+_JQ^)T2`miiy5AG&C%;N>F1T`JIPI4fBicbg5cBAM2mKci7omN7k)4-{?c|~Gcu5Vt_;NS>1QN2H2Bg+LU9s5aW*{Y&xt{>pukvAohVT9`%^X^p zzk!bVpmYVhZGU`^&Rbn*yJJ08Ea$bpXQ<84D1`H}HG=W%$LR%1ZM-tG+(l7`#!^`< z{NrjTR|lk`$NuX6C3H-QVE*E4MB_&&AfGqP%Qhfn#Mnp=8!h2HghZo-8jqyj(MVK( zz*=`qA(Ofy#=1h!j_+s}q78OKMf0#Wyesg9N_z;QS-`2r+Gj5D@|^N@C$#ybvHEsq z)0;6kc_sbpUHCd;_Ymg(;_)$3EM%b8PZ|Bt8Wt*sUBQ8(CX63GI>uBZlu#UHEd^WK z;oL|14bJG1XKY@+kot=Nxqvkn8>2at1=Lb=xY`Biqa}7T3eBIBrL2%?M`d?J#lvY2 zt1_#W7(zP*dci)v-Vb(E^cYWxg)LmQ7Dwq8NL;SwB~Q|-i23vja2akV(o)4xcI}gb zNV_=`>3@R=g~N~z0PG>66c@vG&!A6v@!UxH57LY|MSiYOTgu{x5)~LNG1;6YH6b(H zk9p8EB_`$<-oKG)g_!6|%%EIuIf4R@er^JVTQgb`fM)r)HieK@`>V?VEo>Z(?cVZ$#wHfH)DGJEI?f$4K0V;;3g7!kV!hF2 zi>3Iv9$e{^sT8jzne`C1&HrD{2nI$to#)8YU{`tjw^bjYmRo}VO2vx|LzRi9N-wWw2ZzjGjB>fbshY>-XXyfVckq`4L|*`MXlXDMd9w2WolM zh-TgY=~6h;6P^uTr)P|4r7vVFeNU3Wh=XQJCA-STdz3|M5TW&DK-gAqBTU|jY%Fn7 zNtBep7R-9s`E#Uy=qfda$42Wy=1~cbGY__&*s+t9bOgfCadmBLreZK#SH7d3o}LFdb9rKqtv+tVnY~il(V$ zIj6QjZXfnG6d!47&!amZta!@tW<2G{g}! zQ2Vv;x6OqqKW4ptpq~b*UgN-c$<`r#QF4~k9=w5h{lzoK7%hDl*)zT|DYkiUl8 zqPDdL++xS~E!XGaOcCIb4HqkHvzF%2bg)^7pz z|GZ_aJi3B^VY4e!uu*qiGxAB#0M4NNjWGV51Se8(LDd=?K~y3iYA^q3woMNK)hm45 z`?mN#EamKel8-^k!mcV_a0aH?^!NMPkQU3@xA2Iq9}>L86ZiWgKc6a7>_Y#{DC<}T z=Pw*TG}wTmwmmvQk;S9_&^AbvFuC!cT0f zS4BSCVl2gyYE>cgcI!WL3tk!_xQpFC6R(lecmFOeMXQGPDoO+y((g7#|7(`6rOv)z`@{_svm2N;?X z-Aa|hZmkxMMc?K+b+pXfXt&k1Hxw;i_-}*Xr?&}wMwi$8<};V;yw+3Tva4ZKjd7@j z^+{WCW~o5AW15=+`4(EkeH$xM*$j^cu!M7`N`5ee^porBu^|)g`5WWBw=hEa?Sc&{ zj9B25=R1OX_I4NYXivANaol<`8d}g)^i_+h2t{b#k9GcL#z!|7u}7!-yAfBf4K_n! z)xg~UXs{+=8a$NAWkV3VuW~R8*fJGD3|0^@#<{RQtx$|rx)eA&fBw|($PJ5LeV!xt z{eU@(+$owohbzhHd^nqDY;7fp2nYIZmjI>Y&%sV}-k;JC>8mMaF>Hu_D;qnFJbuLH zliNj?{DHvyC3MshgTJHrn{{FO&jQ8a|I&NQ5MttnEOb2r|T z#`8IPtzH^F)WUs(KcBV1;-V@deamz28AH{dD4m0j0&n4O-{;D&V`reHVHN)7v$#{s zck{#VKtRoeORAJ`MjtYYYf{=xOTf)1CEevg*CP!R?=B#aBPJMIpDG~Dr5pEw&MRa+ z)0NhBMsaeGowZqLkecwNlyOeNPeKM6q*0ZAQZGViDWxyY$d(&{=vJQ&BMQJ=!JvZ0lZ&u=akmW z-B$G5x3YPC0V88_l8xs;Uzd}k2sPyW0Nk}3x-%x@HXCQo zunXhGARxaQPLh_9@ZTLpsB`Ts3T{PkK&KW-r0!ZD zk@xEkSbFx}wT!sVKg9=$y7(#|MJ5 z2aU6*e9ms2fc!J{&hNN%$FjSe21aU9(#^d%y2^nChtit*)qInX@|u=gPcdCPrl0d< zE(f6>bZ7spi#d8%gk5Fwkk8$le4(O{AO$O0w)a!;PS(RJxkY^`PC-4bZ6bq;c;;wh zkV8F3_}L2e_urs)t%Zq{91&Y8JaR9F7lSs#4UXUr?Oe6BZ;4*j15jT4<3=WfrQM)2 zutS@~EBe%VOL|Y-42Nw!xb^Dc0s>m?R{M-zcdVa{tp6zN*ivSg(Ku}XshMqXmh?4> z^7<;-9Hss3P0Zif#fGNWtA58aj()nD{jRh4w zTbc(OPZD4G{H2(1(*YXgfGFOWli9L8Bo78vy^Cy7%%YM*>T~NbD<0_S?p`=Fv?Sli zI6e-&;dOM8w9rPnbMWc`Wj8~n=7`-2Xe`szf;c&f7wiSLBaZ7Uk?s4z$YI>nZy5KwS< z(BjuR1nK^X76Qe@H&JtY-u?nsBHX{mOnIZ!UpT#P7{4aK1}6KiyX^n2EtMsh)1bNO zdRmIWd}df)68YI?_heE0Dn9O3tDzBMiFH~RzW9=rQYvUmzUpH0V!Idqc#R?6sIy9ONvfR?gF##R*x7abU8X+ z3b|vqI_rMwC-NKCSAjaOu8-V;%M2?l#-8mM*4?IS143U0J2^}Xa(PmnyJgY^8crW& z+vN~XNsAd@lx`OGlb5nd0)Rp;JH>$@NJ9+m$gL@nnMk_}^68Tsob@;Gcm?!9zsOZ}(-xYxPz=-GYK@JN68k;N?`Oi?*gf<(0I%w$8Ow z)i2R&%6Isn`-a#V>1=mHDea2uM%Z*08e(I&v6>j2DT2Do@!RxXJ(#%q@2&Jd=VPJ$pF zPyQQTYo}~GkWLqjtiL(MLK2F(2v#4n5Q91Jrb|t7XYzgss(cklMAtA@LJfwUO^>0D zm63UCsZMm$Opj=m>TNpd=ZLO3++YZOPglFV%SI8EF(N1L^A|p4{)U7`QM75G54^CE zJsoEGwj}2Tn0Of((pFYc(n41rr)*wEi2EJNh3_Z+=K>1Q$ZT}%k zp1~@vWK;%s%X@_4H8t;Wj^5rYOkmaI&sFM$e%IFDa};vl%YhD$uWSyV7!={-7w^C*h0Bsye4!r-%R$BQEGxePE%PF#?m` zdsojhVIb>lUOpU{-ZGvw-llIgUKUknuic~;9DBL^zWDm86iJVi_T)X_8IPfoBiAzJ zyJdZ|?L>8#Vw81nb$bSABfgrkb}&gpN9mNS^3EW+o5klY*0H!QbIUSPcVJ-UdqcdZ3r>z*Y;um-$o8J=Ne3=S~=lHFXl?EVvKl^Lw3r7}v&U=7$;vdf> z{bOr|MvAa_WTjrW?PeX(x>e7|Loo|9t3#%2O^g7I*RL+*erf)r7^QxqbtXYU41>{P>CaOJm^VQ3BR+d(Z5zY zt_9^|c>D~h^ZpFE+XH+-eDu}9nYpWSpW0lY3{y)wWN!&n#3&7d8ois(aTTeD z)d6q%(>RVt;haq<$4jbayoXB!1!ZH}a}dvAB71&#l7JVmtoOgW?b6(*#MhH%YevF{ zqb}T2cIx)p^uHwZx=Qh+ciul@3+|Ys zta+RK6ffSW?T>}{80$DHV@|6wA(#HgCdw z_h_17jT{g3K>U)wcx_1YJfwFgp7XGrX!5bS8nA~};R$5(*)44H4!R~Vw^;P`<<-vY zPifsT7m)1#$5rpJPk7zYEq>qO2Fs+yTT0()D}ySyX!(K!A=*aw@$r;Vt`kzFxL5S* z`5cSrIJ)Ay%DcFXNmU5!gAlsXcZZJ&{t!^w{dt4tu;;lDsKPG!I@G~g5ePP1Kru99 z-kZ`tuaFxQ*L;v6#TbhgV>|isvP;T-zh2$ubl>5Av-x6D#qKg-nZ@C#<7;SJCYAhLPyjF&jG>Eo zz+Ss5@(k{Wqiq+wnU7p#u&pH!iz4cEjcl{u&S~6Idz`7%rhTwmL7mE`=&yQkER4>$ z_KP{YZKHQj#FE-$^`LU}y?A*^ab_CJ*l0g{1|KK)Ee2+IcRO{HdFU>Q6)F{|RsK{w z+fQmPH&zGzJ*dIJkd!;15Qd01ZpY3uKUmerhK9$DY+V2wq|{KJ38U#DxyNl>j3(x6|*76?u96X?vpIhOe{M0Y2)F zfoc4yx9jd*Q%QG2kW5tC2M1(97~S$2vPuksQe)4kj zB|J*)drVnE0m>eF>5c7BJKr|@!|%GulWBXArtAu7zHvaJ zdV@kKz8XStj>lk)U!Qnox#V#+Rg@}ktb96rF5}aZ=1xNK{l(x5%33pH^=$8QE5E1Q z4QnL-4V?N;qPFiuy*(`=3b^+pndhw}McCrWVYHd7&Lu{(!G*`xEO-8=zoKQoVir<9 zwhT^dZr@o3IU&Zb4OlIn;gVU@Sl+=KC{EE2_!DRbzK%cdK|klbWI)9l7lq<)G<} zi>_y!YWYTeq|Kb^e&_mBe_37cdd60__EUBxx6Yyoq%OG&_;^>-AM%U#D+9;s3&178F%>5nwL|V%akAp^BlNS$<>uTl1q|e5!&UhsONgt9;g0Ln6AlP3B zg73>q5Ki2y*-|%bZ^D|q>I`<;US2uxHJT9gwRPGw3}kPwBB%x8j(JTQs7|A1&hlX^ zWaGa-BR=+gc)suI+U|txtDkXcFg2>~&(Kw^)D#G)58RkmDO9K-IyqJ#p7Xl?cPqm^ zG^Zfpi2M|QQl=sk$}NH_+z_g)$Q>hesH#L$I82<>z?7J+j!U6(rCI%Uvd8o75Em_` zYg9>c#>^kFK)kO0We)14{lKfvED5*I5YM6OkZy=TX}Ah*Ta4Y%CpxQ(HV!0@^4IxY7<0lo$L9o9@&vJ~iHFc&tlR&aVnZfW;TDyrB{ofiN2u z)h7XlNP#Nj0uXY0%9W9$6uFiKY9qTmAhRcF#D9r6H-8 z{s=52VukR~3ZBgBxHs3=GRcv$w&paMy%qn6$JWFH&VKC| zRL_jb_Wj`{Ej)=P-5kouAHQ907vJR6eOt&4;RS0S%8f>YmMhi8dr@hY{eNhAGdY1a z7hBh}&pljgv$$Zb8|N~syORM6RPcb|Q6!dwx3MN|g=`dQ-O!mf|!fzg&Z*%VKZ7Vvd zW17_62}BPj2@Xd+=RSPQ?mv5R>r))U^aX>ySO?Lk@l53Xw7)_q7EZc&@f9Y~e48zY zxmjdGPB$hj3TAEezxL|gf12wL7v-Y0i$kvh_)PU60dUHk6f)}7bn{aG9deRDSVEF@1 zZrAsv`vBd|Zlf8kF22roinXq0T9xvQ`CE>s!xueIp8)&W=uYr_F#zY{&0o9eGl|y$ zO0<2?v8Pu}y4FSz@;Z%6_+xZx-eE2sDr=;0mVz{ZiKxoCD>W zJSGMITDE6_`Tcge{B_@r=F(i+dvJ7{S!$_-1{ZEZ8pr_H_r1DN<7@5fWi11yqWgun z>3Z$8=c{td$}pjgPPhBO&xchCv<4suC z7tc@du_VsGH8IV2ehPBdR2l4R7HmEaZeg}RW` z+f7%^14`TIgCSOR+0^?*&MmK-J80ofYIey?57n(S%~jI|>^7l5(MDjr8h1Lsg ziL;}qRib$&QpEsr^mt2VbmYv9HC0#bKmh1(WCD&Khj04J!4P_Zn>`ZgDt>8umxm+5 zKW|s0PK10(Z*oP}4gB9AfdENbhrfQ)#k@oMT3ELN4ZE>@H5|w4a(tNYs1q$rz4Ax! zAkbYQIq63w!I9IlqMt9s=EP)iH5PatbL9qOSGo9m4zx#-VPhrw7*Aaqx0f+gY^6L4 zi8(^?&Dk#fjLIT_>!gokadY%(4dq6${0V1j_FkFMUYxIu&TiYBoNE`?Ss2`@WBC^` z(-@o7fUMP*k@$AOPs)6FN;f(hXs?vl(ZIixrNO z39%<+jV#;{!`o$qyg9pb+}De$vYTghzPo=AP>VH1R=g?-*bX<7seoAxH8D`BHNDlA zVP?twy{Qee==Wt7>3T25F1ECXNpqeiD%DGRbG-g0MB8if&9*l9JSrpA3p9YYuAQI- zPt>hiHf?WrP%pQ&))Y=+7$^K6za<>?k@rD*uQz5%2w=c12j8Ovs$*kcZ+us|!CE*M zPLwe{go$M!SozOA1MA0uj|K@z^w47nS!Z9qNG0i^fe#iIfZ*Wcmhn~ohelA!cH0-b zPhoN1Ox=EH8{(yiBja!4HKJk=_T1{zX1)H@UZ5%_PBlv%u`G%f|LO z>#nmvD*0!N#b1jk%!D@2!RB4=c3ND`I8`oq=+kj5E*BZWarhS~4WaLfe8I0d{cy8kIb7AJCW z4qs6{Dg#{LWCLeTf7sSzDQtV*u3OrCPB+TKp1gSVt3=EE+`q_4K!)LQ+mc8YXLZD3 z;TJqq#83e>SEg&UXvQ)yQISyHs$5-6hxy?p+6=`4pkf!A86>CwFvA3J)3(aqTtqnY z)Q$5tO}BkldB;(*#XboYE48h(Y5QIuViy8wU{06%wU+bl@kmwO^x5D-OS5fCGXAM4u_>*1m+NTdPh+oFa>VvA zig3p#8i)Dq61NapgWZVA+$f zzu+<_rZ!CM-r^C#kA+QT2sn3zSrds6taYd=2}ghu0!?*D8y5|x+oQX$hT@8gs(E^h z?DSucJ9%t}2291`V@vKFK6Dzh+!StQeHlYFa~q2&M0Jhiz#SVKrHKe&W9~ohKso6F zh|Tx^#b*+71!XAnCBL?59smAbcA9#mg+uCpE&A6pJnRY|KL6#X7VH>fyV@HVVWFdS z-5;wB)a>l4)l20IR*A%PbTX=uN>=(c4A7EIRvM57h>M%t@8S>`n7Ru6ZbDGoZ~lh~%UuoE;Imwu9KJeE< zM@!gG&3wCk_UMIj{)?6iQ^V)@!cDYd>~_yTJWzbfH3=@ezFcO?`or6!!bLHrx9V>e z>rG-kzMCl2CF_>|8E=@oH@)iUOd>VJ+i+^rZ}rA)1j9J3;0?9mdoc0rn^byzQqSPa zLn4HdAFMuc^CvcFRxp7uq3fX%p0Fyp4&d%^#G@N3B*v_Dlb8JkQ;N=v;l=|D6e{zY zyiw^J`=RvrM__t>T_&=H7<@b8kfp_Y8!3=OtoAFH0IvWiZb_XWO5eN=}3n zFlf5*LeE5lIlH?9Q{BWgzWTpP)&T7F;!XI1P6Sk+nqtb0%1-Pi*sK$=aNU`kj58Ji zOyVkQw`GeCfq;B15%C=EKl?R|Pz{L}1?~s*0FP;*M4S9sJZ~Y2t7gQLlvz8G;8C~4 z;V<;lz~3J|{Q8TNr%6!zK0t$o#xXoQ!6hAh@goIiI-et$8TtYO0-m&4)lqyL2ezqR zD3zhBgO}ZvNCWxbc9meV^r^$`-zI3U zwREnh!(8(4b}SVb79fK*b`YuRgBH1t95;BBBK-NK0wCXj+DiKeDO3awOZ}BHk9iVZe|6CRUXkAKZ zZH5cc@#OU0#KlQLuR6k`K@16B8r$S#6^{$D3r#v9QoJ`N; zi+?$z4=&zRzc(HF^8vEexZhM??=6&0mdh51DQ+cZ3KA*T!D~0OtEzt!QvS5#4zX7~?E8D#5cboM(aCSZqe6LbS)>~1 z2(s@OJ3F+nSf#R3RuN0O)0AGyMf3uG!`7DEdTGdhkdZOY-<_1pp@Q3c|5j+Y?7+8K zwH!o`FyU>g%akf(YHEt?R`#a`?60=CgoK2+xV)v)1*^u!p~S{7Scg!Qsl;jVGI0n{ z<`$ob^oj0(R%Krb&wz3iYowAqOfFnB@oUo2J*}?*=M49>P&K|;q^n}9r#S-bct=6* zBs@M)`z5%}g18t@x9(3X{$4r1uV$VRm~prjJe}2mF7q~#0Wt};Z&X_OV~EYBtUQnu z11CeGkD@%GRS<$i2QDT_kQ0-Hdf)Jl2Bk2dSVDJU4f^u|Y ztKp?K46^OwJ-)YEq)b62!4os3Ro-8;^vxOeM;CiiQ|sUhEyyoqGR$ zDj1kE@+oi8s|E}_7|`+u#9oFI%AisUamLbbbTm}7MHZZNqH&KhLhn{}a~$aK3^LV+ zYMGXynvegv<^`>A*V;sCm`cOMk9sJZpYX=@yz~Tm)=^8#iLojhPsMwn8IrB;EC0B= zs>E(QR@VJ9^yEZ9js_I@?=4^y^h@?_F3ugkmcPD%u~QeO7sIgF_RQ}>5r4&;Jo#Gq zVDv04mU=Fpx)CZRZ`wJsEBh}N@#h97h>d6XUaq7)VEOkiv&1=L!S3>9|7?czenQH= z@qFA$lG;Q}yo(|u#YJZ0+-1!on#R4&AW3X--9kpPll-4YfZ||{b=dD~b;|s5gzBHsieM0arysVj1H&|&i$j0amMju zxyE8MeBE!wsID4G`D!bLl8@E=;c};h^zX0y(#n^32n!=@4By5rbqdVk05_)$I&jSc zJSe-gN*>D9m{rWI)%X}N6`B^@XSLR<6JC|rG`>{_d9*@rFTn&&7_O+`3m-ryB(&An z)YL3hDwR5%6otOBf36&kQY-K16s)mA4j6DAIzx?C>ukp1yiwg2_GkHV5h7TO*znyO z=USL(QDOR>4J@eFnHYmgj*f=rY3&V&su`XAU)D)sY~H!qI<=Es;`?!1fPhBVB(q9> zTsb*ce&38igBe!9?>jI>{u@)MlBYlCMfUzTIR9xR=7IU?^=6G0GkKn%h$sSO=>K?qz-}u4!e~M@rKdlEvsuop?&-nAA~iWajjVVbogu3k zZCwNkp({!w2iUmZje0Udr4EUIyUo3U`s6&sO_=rR9+*L=yl2)f=MsdV%iB~|GjSEQ zi)^Ajhw>09bkUU-Ph0)#tFwq}z}aa$@S)AJSEvl(`#>8rZlp-LYW}}tA%rK|CC9X~ zw#!ZPOJBt&yJ0mnVYH(xwID|3*GBH!(0>#)KhjbSi}-7<{Xx!z$W%P60NLpm;nO-6 z?(CLn7SF^Pc#HdKYgd0hjr)Iry$6aB}4@Z(`bn+}KudMm5XX#2wh>V?H;AZ9ysP2!pJa%$+2`aKb)LQl_bYPn-gkG^g=k>d>NLog zDEUnFHBBVu6G4oBs7+`;4x7|p?t8|*O^?gR0je?N~!J?SvJvOMLC9US+ zcuZjY58P|lswWd?-cADE4I6t3#8U3iVxI`Q6R2)7~xW#(n;h&pN zSW7FIIS1R@9FN{2tR7Y`5VXK|k)$k_e;b%ixy-*M;uDj2`tPc024OSG}0tq}(w zYAs;WLsIv`-p>j~P;VfIOW-xi9}4+84&p#J7$_4ZXKH=dZ=oV!{wMUiWjRivxph(A z;QJO(@mOo{L(8vtlMi#i{967+*O2sNIE6NT?TF9Im=!BySWw$Bv}B=nVvT%&^Qz(d z-tl^dQ=u7y?9ZP@YvlfO)(3;EzS+$TS%T_1W{QfHdg>S>=<(e|n5F~CvLe<@Ey0MI z1Fhf1Zz4o0RXHVPY^|Zj=a;1Pd4~`D%!z=5S4|beFsrOtfp7XRZO1x3uPcZYI(H%i zgOn5$7901chBt1`4!Ewn3m*QPtvrFBK0mTr*hlT9j*iK~cH1!ShnN2s*_cEtjnx*8 zuWf0GI7)L6*Y#i!1m418g#L(~Z7S3=_I|vbIrCF0TPVv%1KIhH#XK%%VvE+!__wUX;`$ax>yv@}AL%4s!P1r53F5;w#_f}&% z_+!>{P{4jfA_y6=@gv0AcE$VOh=%Lwg#ciS|4?32!R>L#Mw}2QeRZBWvXBK>{#aeT z?7Zq=TJ5Qy>hj!pFDQSm`}$Nqc0(X8DtE?ynpoV%hFZ-%OSUzUcGXjhFvRv9(0Sz+ zObNz=p2H|NU!-!+4JPSRo`^w^%O2J)_qy_7u;^Ea*|ne=X3)m&d1(}Y@(MX7hCt)=kkvfi?{hK*_$p?#)z$fB#d-EyH959r;Mhu zjum;5UYNDZYstPI)oOb1z7WUjvGU0pvrb!}i`l~9-n|O{P$$2Q$?dE;p-!T*a!13= z)I>*j@gAqkmihg76^O|Dl&W_YP@R#8Z%cqS+j2O-n{-%G8Mw59=hf5eNw^_tQT%bs z!$yVIPw58K>m9s}JbH;hmNKJ;kFtMTLX!A5(1>jssv)I2a)Hf6H_W&D_N_K=Rd2|FLD~(HBuMY>6lt#oqcrH0;4dIOy9S>?+=~29m^3`rsmf)gQKtpK8n!mlK_ z*&54I<>ez`(8XaLFgfO{*XjSPFES-yInw#m$l)|r&dDW;h(r5iHM-ZdtZJg9rIqLW z0?k+)2LrPg55l1}#J~%fi!qX?E|!&h57D;J?JXjBbELdMWA4AC1L;?`_$~um7h|(B?tlEl?e0&MyOo|N;RJE3m(&7%U4jn_Ob4E-|miFuD!-Dvzw;f^jBBvzRK7D%>_r>$k#f0!eGcX%#Pe*BqCX8Gp zeVR?i1)e$^BNyPRWvuSt&}6mR=yp<~h>BQSF7Z5iwqQrM`qF(;?Vs zgw~U593j**tz5_oQu!I88>!1&d8= z_-7SD!)aVZmiD}KArq0^=#j#o4Yca4qOjtZ4$V(pBC$}-pB7Nx{awct^t}3)`=F`ItM#>&eeRh=*9{=P_r^x zY84uRH}nUbf(3iuDFv^Io>n)jy_vY_lYl690C_~J?#|Q_mx>8Oh{#e=1SZ|fQZiUj z$>cbGGlQqZn2w~Vq7hO5$>d9}CeYhq+y6?pFK<@=#pQh99nl7-F~6bYTr&M|NYhKc zSob5XBWaMp<6yqOaw}t=IckN6&mj6mzz^+~+eIHn6<3@($uIoQqXhiOcx7rg`dal% zRcIG(ag-CjHVOz^2Y?^gENj^M*l zQlTrL$xGy9ekxoI9+@%k)EluV(iT@zQ?#cHc8YOBRYbnh%Un4d_j~nEn$~|w6GvDk z&FHn)w~%0`vlF>@12)uuCV@n88Q?(tGjfiep5--5!8l-Dm(X>{Pnij8Jl};!W(oK@ zUr3eoeC2VhAnI)gRehZ{C~fpg8GSw0c#*Vhdhb2;2flds;V*m*X?y%#^J9M6ptXm z*+)0Ye<6lyw?7br2-icO91-_HAc>b?`rK*L{Leh4HAj0mp@%8`E;)#sbskzfv}_#9 zVPx_L#AYf_SA1$`87$t1R&Ed|JbZqcj9h(#JDql@J$t-SEa+ikPAuw_aU862+=kse zvCt{DISd5!`hqf>3Y$Kkt?3LeErg`EyIC?_s1_)|YtG)(6G>o+fy2+;<~qLzbm><- zv&wJa6n|24!Qs~9GQ~#0Z@6DWcQT`noI09tU0r*AW}Z}B&zO0V!KtvU&n`czC?{)a zh5s)KzBirfC0A62lUg@an#+(TMTbkQ(#u<+Nf(T=E6L z`25Ofc^f$rMVn^2EuzpUvfPyWO+pyOped z^7vfwd??F1AgyCJFKad749Pu5w1+M4#;$%r~>gx*Sz`PHLi+#|q- zB{I$-UXk?w0}N>$sNLVta_ds#@MW{!^~-L7by|8(n#7Gn>&n%bvCRIK#^u z7=8a>`|jhGGbEG1=wa$!8XGYn0F!7cg)}z|e8>oTrMXyjkdmch=)a7I>)Xj15K#1xj%#ijNh48?0w{*7-;7-acbPO8qeXNp@tMGtHIOq zH6}q>j1a#1CluWCkv3ztXNx!1bNkb;!ag-UU7gj8Za~3DOkNZ$85>M@ws7l6y3#4t zE3Z`A(aLyhiUzh86H|*BnFrt6nX~GBzupY|Q{m^y4YYr2_ldHlgsNOgVCASWa+vyS z=sD&4R9VA+qr@90!@S0>hsESo#YA3ACpaAalLJV}+$1~7?r!K+O@&T40NJeN+XZ&Z zpOC8d*Rd`6y$pL`8!w6!7r$+U1jdX??@v$dY~H80?tEPP zSjFsgt_6tJ_psfVqVkBaGS_vUNKsF65v;MCYtn6Z0ershv_z0MWALTDDejx{X6m8> znQNRiGSWl9pi1rL^YvCL)?(pd!>z@GXP@<}sp!p<8PYtS_n%X_HEAMZf`yLGo8y_mR01u)2ir|J z4BP}q3wL2G+^G*dA+K5%V6ubeM#`(Tc%TEe`4`;~qICA>CH*;QMf}x_!&*i?ZEC$_ z%O)|}KvDA%Lo(fsON+*ewoKs#>Rn-bXvZE5xgzZze_1S%NNL@l0(Ywx#Yy{OU^u-B znTQmUnn8($;Q*XO$_O2^ejU^Cu`yQNqJss3RvELrnNNAwUYICKa3`d|1|RTVQlF9Feq-ajk+vh=!ljs&3u zDEc8q9<%O;s6(F?er(MB*A9;vsxQ$PX^@F~4E|R}c8)Fz67!J4wf^KR$(Z?fgRZZR zz{|*Ii0dLckm)I-@Y?Ql+nJeJQGkQ(51w(W{vSMJRh;ENbOu^0=&}GBGWPDMsxcBj z3^iGp!dy>{?0gL3*a>T35S2ReKVmIEUuX2ToP?l2l3L@<9DH3*2V6I#&o}-TurZ@K z71Ct+Mfe(?+pFbQ0jKkL$#x5q4oQ1ntC|Wt@5bW^qCcaI57d1)`T$rCvmBwVixNl$xN@Yt3MHFJ}-�KM6= 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 Glm8Eh)%8XI diff --git a/Carthage/Checkouts/SQLite.swift/Documentation/Resources/playground@2x.png b/Carthage/Checkouts/SQLite.swift/Documentation/Resources/playground@2x.png deleted file mode 100644 index 32646d6aa411b7b5a7163fc692c7252fe8ee8cce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124729 zcma&OXIK-=5-5yak)om^9YjGvK)NJ!q={gmNf$`y5L)O7q7+de6anedODNJI5KvJ< zhtL9{iAYQ69YV;B?|JcjKfZIHyAKa!H#4)dyR);iJ2Qko)lsLXWu>K|p`q8*c=()# z<{UQ-&8ds$&r(~?etX45{lns^`odEeV&my;=?Ee?UAPS+&g;r>I>(h36gl)Fjg^glyzcKu7%#pB;; zqE48IkEN@KsPO$iLplc3*8abPIy?V`_V9cT{x84(zl1&Xd|kmJ&%quLsJk_F;cR&S zbma26TZ(hXyC$0#U z8IeCr`~O+$<0h*7{Q3A-aH*BQq7QbV%DX#Nus__O&8ImrgVcPer00WQnm8B0wmnUu z?6z;1ueViHrm42w3|1a#Sn8`VG(j~@Y>gc~q6i6PTL2b6eMqSJaGkblNp4K>JiWN0 z%9WEw5x08WuV8e3jg*&=rqV*eCb88*qh<4_EEhcw#^>dCW3o2KGJ09^?EmcWe@pCF zRi@+5G&CC5Pip+Prl~@6;ct!G{yg`IzqMQRCvN?%yvpHub^32DTH zHO2l*iYNcpG+6&%JBtLegxm;K(z5!Lse9^Q{4C4<(>I=S;2$??HQ1|x&Yx8H_X|a- zj;bjL)7z}6%ZgUqfo;bf-XFQO(ct$@>(-eQxBAzE&K&b0W+7oj!*l!KAx-!TdA;M- zFF%J3(-jpjoYauNaok1|%V)}Dc&kSES+ROy{vdCN$n3kKHH3AJVk)&L0Yp6&2G$nu^;ETNvrf)xb>fQbW#Bq z>HNRnC>Ec!I&TANm%s9m@4^X?`_%nGN7o^if4_YN(%RacwYk2Mos_xF`!<5<1c=hO ze@-h+tls>XG~Gk&k@;j-AHdcMeg3BPLz<*y>E)M2j3;=HAx87drdCr}o{EUK;NNkJ zJvtrT?$67x<#$QqcvbHE1b3e4f)~9>;&E0!&vNEu+uqd6Q}qmIF$~9?eCTYw-?@-a zZu@XQ790JH`&9&4TjEk}?_kAoH#rs+a4r{{5%@=Yym{ccnBZv3ONx0r^cjU?Hmrun zP-mm;0x2##y09(@C(IJYi~sFX5RKT8w7rzG_vfgbznjSH;6Sb^DQ`LX?zmdu87eXA z(q;z^fXBQdPmCD6L9ZM$wiHi)B0eS$#b$qJY$?Bn_wCgaAPY!=(^#IUBAzdiY!cZ%jc@zE2u zs8eG~9LgwPYn$1f2s+5AlWO>5HpPZs(uMXzmoXr7qUfk42=%5-N$xiBB|UfKy@>=- z8lw0m!tu!4I7c`9!Q!Xzw{+Dc_{6)22yXYjkmxs}uexg1ux-&~$+IKn$3n&(_hS?2 zAx;myAE%d)^pd6hy!r(m-S6EglGe4>TQfV6_gwss37d>FWJbK`S`4FSp(En z7>X|Scc%!?)L^;3T1!R7c71m~)*8|G3K7?BZq>49l*?m~9;o7Vo9CG?rvPs~H~E%#op0EW&%Na2k%=ZA z>(d2=q${^_9S(*bs%U0sm?tjS>8Ppjz2rU@ox~}h$Lqsxm(4ri>vT;2tr`Gs>zr3t zYV&&bqrIOQ>WzkS+k<-F%6#-@AIy+ls)#Gt0zn}G9u({INTlG?OLJ0&=Q(o=>J8!5%Bz)DU0T$mn<(Q(}i2zw~Cn?U5ehc>FKlsKAqHQkzkr)Zdurs z#k75?AbDK1<~#kN@PY8@uz%5CeeLRcwb6C8c+7%$yFbt7I>-EoRC>gcD-Cr~*yZ^= z&`uZm2iy+De8-M4f_l69oo)TvMlyoHs3=JDb{Ys2W_n7jQ4g^vUg4VNS)~Q&JeFtf z_}G1*vv~NJ)QnFF%Pb08%-lVQ3@@Fr5V?knji^5Sid(M?IGq!t1kUr9$d2I|(;QyE zU(q;qJSUf;l5USZ+G)dpimmg?g~O{dl4i+yj@c2fy3V)LE%aZO-ND&uWOL!!j`@2W z9WmvcqKQvnX>rUp!#(~6SeNJO1QfEc1SFB(@=%md$Amn|!-beahZ%STEuD zpj9jabu83-n&o37KAUIp-X!@;fQAvlpwpm@9DxT~&^5bYqq&U<_W%WYRfapd^?~a( z5HX7kd)V<|5WU}Z!nD@&Ok`%dG)x)+C2oXHa$ao@uFkN?2iEW@xFWoukoI0f^D1Bx{zIGJK|Sm4;Hd7t~PG=#1C)q z5r-Wn0E0lM_tI}44_EV8qlG~NrMyY{JRm8vQ|_O_5bI|VM{DH|q@}(0V7n8$NxqwN zX-}U&7i*EPIZCk*i~1|ziuYbu-Xb+oYHWMcXUiHlIy~kx0*{ud#iS&Ew@5IUj@jX% zKdjx(f~kA6yp(zMU{Sbi_iSto2SY!N*tKcvzzDyp(P``UyZNbN+jz$^a>v%pnqv<5ubl+Y-2Sg)Jj!+U0$f8$uGoXri zs{)SdphX8MT~V}YX~XCRBe3^s%ZPS}fMTO6JFLFfUR@vs{#yN59-}3fQtyh0^j_dW z$jp7@s;#Ys#CqS#;kT=P@un?^T{$nSvGjFZw0Qkl6E2;v2e6R$Y7xDv4dYE2juRcr z_J)kIYhO0;c>MYQ+5!gUmGr=w&y@_o&Cl24J5z$Tx>T>U>u14q9`*dJdWh?FSW&7f zBVU%!bErpmF(57qH?DoN_n7aI`wF){-e@!+K_Kz7IO3v6qwBQX?)YYM888_LlHIXL<7$rnR#}Tr%&&{i9t}u zs&SpvFxvzpRXLAIjpCRQTV@04e3&MKu&#iLCd-_`=NNAN<|6*7(MB}SNGuu60?#NqZDTKB1GVsymXjLc_Iv~f%nDNKl z)nFx&W=qW)KrmcHT{_3(gO-lDIhzuTX7iz;A)QM}ad9dt|BTYgCc_p#8V0RxLrE41 z{=9gtPL*~0V?D0{3UYauEbvY#|po65lH$BAK}kElKn12Pj7sis@>O3MZ`>v%4NA$QHyu@3&p4> z^7l2-bR6Fmd9{Y9v_s~6g5pQ60Pf8a>EA~6%IPI3U@1voX;X7y+**vgc8aidk15Lx zW>-snalG0Xe-tYVOf2%~4HMgi><){R8Oz+B`CXJMq|cR^$`eP*g|99fl~9%f^dT$8 zMU1=7eLFj9w!To8kk)Ha!(UZwhy@)j64jtThLu>jg2s{~t3HM6+o-~FwA;vMOFY`Y zHt%s#mOj!zCYxvZRk*>8N!Xzg2>hUmD zgA03DkkT5ESl%*8U;Q5a(29y9Y>L& z6aMiY3zywt8>TGQ{o-uJ`MzngL>I&P1b%%p%c7A&i*$X3DUmh+u;gGFXO4uAvC+>) zJTNOo^|t97Bqkh`OjhdDI@jqUR(*6z-<`~d?<}04h^#GPX?EV8Y=Eb?8l)LPU&~7$ zh-nKKQm;Wu+GszJN4ZtG-aUU*64kK!RQp-bxJt+EM8OS3YZ9||LvmGNuKtRaywFT=-1CE= znbEZZydhbwI-WEuED|>@RxJJca-K!9m|PwpIa$A1{7Jp;kzpxzQ`flpT&-*=oBSRc zkDL$?6fx9sB_*K|R{2BlZf)(3iOI~>2ue{8iyI%Mh=%4Be3p?LS7MSsgHVts#9g5j zv~Lq}j#~@Zphc4@KcbLrJ;x(H@!+j0rvd-f;{IewVikByc-bT2y2D7pWmYrqR}86A z&*Jw>?{wk|C6NY;Xm7(a@we$&q#jxGa}+G<@;lhs=PcTpR9Oz4B~sF!>%{YEvkMyz zlFE%7<()okgxZaNXPssI)KulsV(dJMp2Am)Ccn`AmLmAR+R4{~YsE=lXHi3&)$B5q z^5-G!$}?SEj}P0{)r}`Wy;D_!T{Awo3$^#sXR-3sEmU|fd#oOQQ_Pum_%SV)uH=R& z3-QLINeyf%!*<^(0oaCRyn(((NXTRe+)uEswop|KF}`RF9jdWFmctU|6%NFXz*PIwsO3m!Cgb(c z>_+RA9Sw~X4vsAse;rBI?yJRxsd@VED1I^P zr70a^v8`!J9Cu7=l2+D4f6ah$`gCM^MV=;c$TP4xY`+`7^ws+9ZYIkXT;xubxg(Sx z88Nrv&VtGKIQV9Ebg!;sY0YiKHA!Yg@qxp~re`=gbtTrk%|`pWMkNqDbJN%eEHSU& zCMi(QOV2fVki#U;zy&a^_ag1T!JH4n_)e}J^_PD7^u>2sgzc!PW1JRdwYPX!Nj(V; zLdYCH0^c88bboq2DI=ro;J}YRz{%Me3db+Gy3e#m7L}A}a|dtPZ4XE<);=jF)>L_I zfQDX7DWyoE^M%z?vB}P zMslUf@}>C2(iRmP6x6Qh{}|?LlPyirSmVqAiOK>=2vQ_`&>0-GJ@{#34e6}dUVrYD8!XOlmWhJ+z3^DMSSq<@zi zKz)(+=$hh+=fIK*_ec5d`cgc1w@n&$Pm!0%DSC1!Jez#7+&7FXbSo@J=b^)cvXasQ zua0E%fLDCi5%U>WX=tLo)=x)&b#QP<#o=-28g*s7LP|`6Wel&BAh*8BNfSmTCpVZU-J9pe*Hj}#XeTqI(EGb9 z(=!nRBDhg?9o$-f>9f#fAz(FO+ja|cu95dvr1le{x->H(e@a&V(gQEb$`TsVdZniR zy+ol+tcUc}EMambRPb|}L#<$^a>ggA5oYTY?o$fPet~M#`KGbIlp6k#090IJY04E0 zUJ?XFNCkHlT#g8LXZ*#$M%-+t<6`o4dRWhe_1`-YdG9W5vX`XZ-pJ-bX_F%xYtwF{ zLU2{b=T5vsd?Dlz;!fE8%28D4kVyLog$UR>=Wp{7ac;iE!Sf=I{?nK7Lj@%UNy$*N z=SALQt-vAkG^Ch6UjND4HEfY%FHw(Gr=i|2B>Id2i$BsNRV)xN>u}^tl?s;W(I1^# zxk$*+Txi~cd0+XH^r(a{-qi%^quS1F{=y7~Ju5Gd?;10+i3Qt5YtA$EGi2|RyXx#D zNwa{ZL382;2+6UdnsnE9w{NT$pc-V2YTQ z8*zN63yh|_tc>T~7YKa-b~xhC5w&J2N*`_1nM=UL1AT*~zh7jQS4*|57YwelZW`w? zAR8zM_ttfSJ`CN~YnJrKEtW4|l(6a;>Eq=hPiK$HeW@l|wc$d)^5j&nTtdPTCB~mR z9Yuz7egUZSn4?>8Ihtzig9GFBu65HfPvYuPw1YiS*C%{%H(`t7^NuZ{^!Q3!gt$JE zk{pA@2`M}+%bt&9RG{s=QJO6et4nW~0J^VN4*@-YjaW^^HEg#IAWX`(L;acN15IqZ zIa%Ev8ZHLUY>~C3h!}6*PXEOkoae?@+X4YQE;8@o5(OiHFGH&Wy=yxd*t7&Ykc&;a*5NKhwFU36we$omhUCGJnlRMRR5vUG31CF+p%kD z-Nxe==-Vb#uN85KtEp(Y5A|2+_VBsW>KU0|wHh#4GwAmD2- z0EU#}nZ6}ChLuAxdSuBnZLnqlbfqRr@2TuV)u4D(0%`2W#SWg^Zw__sUfl@k(D-)dJ(l`B8+u91I`66W zhm<3>8eUALY_6p>f)q+&et2PdD+N-3Y8-63^W>@b3U7d?fv9p=bPpuOR3`~oT+xla zV4iP7veMT_f$Hd1xjQwcvzvwJc)w#pMS>+7!K2`nstzeFrj*d_AFYPJO9h@sO~5%- zugUvm>;}{EET@vSk2*B;PDp3P5-sqekJ4f~DSVv@3e_>oFDv)tIFg}Xs)p+y%H8b-2 zuryLe9^h9980GSELKm?5^VMjZQaZ3aW>xnRJuKc5ub6N*!v;Fvuitr3S2B=%h=(p9B9f# z>Tqz4%&C{jXIe~>SNohj+voK+4l=gBC$l?_%`Y-fDHtD}7ju;@hM_lXGY0ecU9e^% z&g=S~6#{|V^pU-_gwYz+_nb}IjC&cx`X_NwIGl)_uC9Q8YG|!RpPrSI^o%S zk;g*X`^Z)Ton3;n{qx`&%@?%K@P<KAw_(BOf;!Ryrs*5zOHzL3m%-w%JfF5Rbo2DRvbtI+MI!>83J2w5kc^Ykl{l#P z;r4 z-4hfXI3kmngkk$C&4U~l4eV^S{1=$gHo^hxA9OuC?qVFQz~(P~Th0ld+65v$=9lk3 zOJ_!@EqvY=KglRPxT>QgK6@HtH+dQEds`(d5N3krJQ{{twy2L?+&xrlrtF>*)kjvA z2)g=Be^noP%CvI7xup4M>ygmpXAwe$_dVDhtG$J*4f`zQ!{Nl)lr}?s@h5$l!)(Vy zbPmE;IW6C(YGt|hBqA!wobAQY(QA{IP(+XXB$=5%z_TgNa9&`KHdkil-Iu1x?FMAS zH_S^Ru7w_oH*91L>${&k58WJU9*ixKJ7^YEKjJkXoMg$PKufZ}^>rpH?2$fCXD?@_ z9OcAo%aQyWCjAfRsf^F3&SS@*q&UGn4eFzoVqnIL*4X&(z&*ji8P`s$2Ru>8Vi3qy zEs#^zJJd7v-hPSZcp6q?!$XtpguTm{L)w?Qb0QZ~bG$Ed`Jc596=`7Lyucz$c6TY2 z^%}h}+*|4WMlXR`4{;s`qpN?TBs4cTwEIB%N%}HdYGLq|@+N4uJJOG`4DDSjpLe4@ z%xw<51w!yB)1JIN)4JUIoZ6hWT57x`#D+eD7ptO>)E4z+` zj?-cJ(uMpsYM4*LtS8S{U@?qE1DE`DMr*DQmBBTo#}Dc@Qysf$o$b@+Im{L~OH`gD z7vL!99=}BgbW@QMv=WIjM8V!n8rS_WshOwK=87jec~6BhZ>6X=oRsiS$?q=F^@T?n zd$|k>G9H;Cgc;wl??M$qzhdkL_@=lRbO6fpJt=uH*YsKECi8JCdm-k#8RjX~0E%En zKRdGIojahq^2kiix244RmuXy;c_0NF$Lc>Y%1WRGte6R1J0LTU=f5U0XO(eywBw+^ zmfVJqW{pX;2E9l7YO8J)HRN9vLI7^N;MpcW zRd8dR{+;;S1Ag_HKMSFMjw^|9iIZY@EMh$(;=?a4jwJhKoCwsD@l{mff?s>8RdpHE z>cWj|W0C2*FH%x+W2f5{#AJpqlWohmpG=v8

lbErWo0fYUhNnO45# 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%0A`zqOC=oLR_v5FR_8z+($29av1W18O7 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 CF|3yW diff --git a/Carthage/Checkouts/SQLite.swift/LICENSE.txt b/Carthage/Checkouts/SQLite.swift/LICENSE.txt deleted file mode 100644 index 13303c1135..0000000000 --- a/Carthage/Checkouts/SQLite.swift/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -(The MIT License) - -Copyright (c) 2014-2015 Stephen Celis () - -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. diff --git a/Carthage/Checkouts/SQLite.swift/Makefile b/Carthage/Checkouts/SQLite.swift/Makefile deleted file mode 100644 index d4f51d53e3..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Makefile +++ /dev/null @@ -1,60 +0,0 @@ -BUILD_TOOL = xcodebuild -BUILD_SCHEME = SQLite Mac -IOS_SIMULATOR = iPhone 6s -IOS_VERSION = 9.3 -ifeq ($(BUILD_SCHEME),SQLite iOS) - BUILD_ARGUMENTS = -scheme "$(BUILD_SCHEME)" -destination "platform=iOS Simulator,name=$(IOS_SIMULATOR),OS=$(IOS_VERSION)" -else - BUILD_ARGUMENTS = -scheme "$(BUILD_SCHEME)" -endif - -XCPRETTY := $(shell command -v xcpretty) -SWIFTCOV := $(shell command -v swiftcov) -GCOVR := $(shell command -v gcovr) -TEST_ACTIONS := clean build build-for-testing test-without-building - -default: test - -build: - $(BUILD_TOOL) $(BUILD_ARGUMENTS) - -test: -ifdef XCPRETTY - @set -o pipefail && $(BUILD_TOOL) $(BUILD_ARGUMENTS) $(TEST_ACTIONS) | $(XCPRETTY) -c -else - $(BUILD_TOOL) $(BUILD_ARGUMENTS) $(TEST_ACTIONS) -endif - -coverage: -ifdef SWIFTCOV - $(SWIFTCOV) generate --output coverage \ - $(BUILD_TOOL) $(BUILD_ARGUMENTS) -configuration Release test \ - -- ./SQLite/*.swift -ifdef GCOVR - $(GCOVR) \ - --root . \ - --use-gcov-files \ - --html \ - --html-details \ - --output coverage/index.html \ - --keep -else - @echo gcovr must be installed for HTML output: https://github.com/gcovr/gcovr -endif -else - @echo swiftcov must be installed for coverage: https://github.com/realm/SwiftCov - @exit 1 -endif - -clean: - $(BUILD_TOOL) $(BUILD_ARGUMENTS) clean - rm -r coverage - -repl: - @$(BUILD_TOOL) $(BUILD_ARGUMENTS) -derivedDataPath $(TMPDIR)/SQLite.swift > /dev/null && \ - swift -F '$(TMPDIR)/SQLite.swift/Build/Products/Debug' - -sloc: - @zsh -c "grep -vE '^ *//|^$$' SQLite/*/*.{swift,h,m} | wc -l" - -.PHONY: test coverage clean repl sloc diff --git a/Carthage/Checkouts/SQLite.swift/Package.swift b/Carthage/Checkouts/SQLite.swift/Package.swift deleted file mode 100644 index fc7c5a0ed9..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Package.swift +++ /dev/null @@ -1,17 +0,0 @@ -import PackageDescription - -let package = Package( - name: "SQLite", - targets: [ - Target( - name: "SQLite", - dependencies: [ - .Target(name: "SQLiteObjc") - ]), - Target(name: "SQLiteObjc") - ], - dependencies: [ - .Package(url: "https://github.com/stephencelis/CSQLite.git", majorVersion: 0) - ], - exclude: ["Tests/CocoaPods", "Tests/Carthage"] -) diff --git a/Carthage/Checkouts/SQLite.swift/README.md b/Carthage/Checkouts/SQLite.swift/README.md deleted file mode 100644 index 89917b36b3..0000000000 --- a/Carthage/Checkouts/SQLite.swift/README.md +++ /dev/null @@ -1,263 +0,0 @@ -# SQLite.swift - -[![Build Status][Badge]][Travis] [![CocoaPods Version](https://cocoapod-badges.herokuapp.com/v/SQLite.swift/badge.png)](http://cocoadocs.org/docsets/SQLite.swift) [![Swift](https://img.shields.io/badge/swift-3-orange.svg?style=flat)](https://developer.apple.com/swift/) [![Platform](https://cocoapod-badges.herokuapp.com/p/SQLite.swift/badge.png)](http://cocoadocs.org/docsets/SQLite.swift) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Join the chat at https://gitter.im/stephencelis/SQLite.swift](https://badges.gitter.im/stephencelis/SQLite.swift.svg)](https://gitter.im/stephencelis/SQLite.swift) - -A type-safe, [Swift][]-language layer over [SQLite3][]. - -[SQLite.swift][] provides compile-time confidence in SQL statement -syntax _and_ intent. - -[Badge]: https://img.shields.io/travis/stephencelis/SQLite.swift/master.svg?style=flat -[Travis]: https://travis-ci.org/stephencelis/SQLite.swift -[Swift]: https://developer.apple.com/swift/ -[SQLite3]: http://www.sqlite.org -[SQLite.swift]: https://github.com/stephencelis/SQLite.swift - - -## Features - - - A pure-Swift interface - - A type-safe, optional-aware SQL expression builder - - A flexible, chainable, lazy-executing query layer - - Automatically-typed data access - - A lightweight, uncomplicated query and parameter binding interface - - Developer-friendly error handling and debugging - - [Full-text search][] support - - [Well-documented][See Documentation] - - Extensively tested - - SQLCipher support via CocoaPods - - Active support at [StackOverflow](http://stackoverflow.com/questions/tagged/sqlite.swift), and [Gitter Chat Room](https://gitter.im/stephencelis/SQLite.swift) (_experimental_) - -[Full-text search]: Documentation/Index.md#full-text-search -[See Documentation]: Documentation/Index.md#sqliteswift-documentation - - -## Usage - -``` swift -import SQLite - -let db = try Connection("path/to/db.sqlite3") - -let users = Table("users") -let id = Expression("id") -let name = Expression("name") -let email = Expression("email") - -try db.run(users.create { t in - t.column(id, primaryKey: true) - t.column(name) - t.column(email, unique: true) -}) -// CREATE TABLE "users" ( -// "id" INTEGER PRIMARY KEY NOT NULL, -// "name" TEXT, -// "email" TEXT NOT NULL UNIQUE -// ) - -let insert = users.insert(name <- "Alice", email <- "alice@mac.com") -let rowid = try db.run(insert) -// INSERT INTO "users" ("name", "email") VALUES ('Alice', 'alice@mac.com') - -for user in try db.prepare(users) { - print("id: \(user[id]), name: \(user[name]), email: \(user[email])") - // id: 1, name: Optional("Alice"), email: alice@mac.com -} -// SELECT * FROM "users" - -let alice = users.filter(id == rowid) - -try db.run(alice.update(email <- email.replace("mac.com", with: "me.com"))) -// UPDATE "users" SET "email" = replace("email", 'mac.com', 'me.com') -// WHERE ("id" = 1) - -try db.run(alice.delete()) -// DELETE FROM "users" WHERE ("id" = 1) - -db.scalar(users.count) // 0 -// SELECT count(*) FROM "users" -``` - -SQLite.swift also works as a lightweight, Swift-friendly wrapper over the C -API. - -``` swift -let stmt = try db.prepare("INSERT INTO users (email) VALUES (?)") -for email in ["betty@icloud.com", "cathy@icloud.com"] { - try stmt.run(email) -} - -db.totalChanges // 3 -db.changes // 1 -db.lastInsertRowid // 3 - -for row in try db.prepare("SELECT id, email FROM users") { - print("id: \(row[0]), email: \(row[1])") - // id: Optional(2), email: Optional("betty@icloud.com") - // id: Optional(3), email: Optional("cathy@icloud.com") -} - -db.scalar("SELECT count(*) FROM users") // 2 -``` - -[Read the documentation][See Documentation] or explore more, -interactively, from the Xcode project’s playground. - -![SQLite.playground Screen Shot](Documentation/Resources/playground@2x.png) - -For a more comprehensive example, see [this article](http://masteringswift.blogspot.com/2015/09/create-data-access-layer-with.html) and the [companion repository](https://github.com/hoffmanjon/SQLiteDataAccessLayer2/tree/master). - -## Installation - -> _Note:_ SQLite.swift requires Swift 3 (and [Xcode][] 8) or greater. If you absolutely -> need compatibility with Swift 2.3 you can use the [swift-2.3][] branch or older -> released versions. New development will happen exclusively on the master/Swift 3 branch. - -### Carthage - -[Carthage][] is a simple, decentralized dependency manager for Cocoa. To -install SQLite.swift with Carthage: - - 1. Make sure Carthage is [installed][Carthage Installation]. - - 2. Update your Cartfile to include the following: - - ``` - github "stephencelis/SQLite.swift" ~> 0.11.2 - ``` - - 3. Run `carthage update` and [add the appropriate framework][Carthage Usage]. - - -[Carthage]: https://github.com/Carthage/Carthage -[Carthage Installation]: https://github.com/Carthage/Carthage#installing-carthage -[Carthage Usage]: https://github.com/Carthage/Carthage#adding-frameworks-to-an-application - - -### CocoaPods - -[CocoaPods][] is a dependency manager for Cocoa projects. To install -SQLite.swift with CocoaPods: - - 1. Verify that your copy of Xcode is installed and active in the default location (`/Applications/Xcode.app`). - - ```sh - sudo xcode-select --switch /Applications/Xcode.app - ``` - - 2. Make sure CocoaPods is [installed][CocoaPods Installation]. (SQLite.swift requires version 1.0.0 or greater.) - - ``` sh - # Using the default Ruby install will require you to use sudo when - # installing and updating gems. - [sudo] gem install cocoapods - ``` - - 3. Update your Podfile to include the following: - - ``` ruby - use_frameworks! - - target 'YourAppTargetName' do - pod 'SQLite.swift', '~> 0.11.2' - end - ``` - - 4. Run `pod install --repo-update`. - -[CocoaPods]: https://cocoapods.org -[CocoaPods Installation]: https://guides.cocoapods.org/using/getting-started.html#getting-started - -### Swift Package Manager - -The [Swift Package Manager][] is a tool for managing the distribution of Swift code. - -1. Add the following to your `Package.swift` file: - -```swift -dependencies: [ - .Package(url: "https://github.com/stephencelis/SQLite.swift.git", majorVersion: 0, minor: 11) -] -``` - -[Swift Package Manager]: https://swift.org/package-manager - -### Manual - -To install SQLite.swift as an Xcode sub-project: - - 1. Drag the **SQLite.xcodeproj** file into your own project. - ([Submodule][], clone, or [download][] the project first.) - - ![Installation Screen Shot](Documentation/Resources/installation@2x.png) - - 2. In your target’s **General** tab, click the **+** button under **Linked - Frameworks and Libraries**. - - 3. Select the appropriate **SQLite.framework** for your platform. - - 4. **Add**. - -Some additional steps are required to install the application on an actual device: - - 5. In the **General** tab, click the **+** button under **Embedded Binaries**. - - 6. Select the appropriate **SQLite.framework** for your platform. - - 7. **Add**. - - -[Xcode]: https://developer.apple.com/xcode/downloads/ -[Submodule]: http://git-scm.com/book/en/Git-Tools-Submodules -[download]: https://github.com/stephencelis/SQLite.swift/archive/master.zip - - -## Communication - -[See the planning document] for a roadmap and existing feature requests. - -[Read the contributing guidelines][]. The _TL;DR_ (but please; _R_): - - - Need **help** or have a **general question**? [Ask on Stack - Overflow][] (tag `sqlite.swift`). - - Found a **bug** or have a **feature request**? [Open an issue][]. - - Want to **contribute**? [Submit a pull request][]. - -[See the planning document]: /Documentation/Planning.md -[Read the contributing guidelines]: ./CONTRIBUTING.md#contributing -[Ask on Stack Overflow]: http://stackoverflow.com/questions/tagged/sqlite.swift -[Open an issue]: https://github.com/stephencelis/SQLite.swift/issues/new -[Submit a pull request]: https://github.com/stephencelis/SQLite.swift/fork - - -## Author - - - [Stephen Celis](mailto:stephen@stephencelis.com) - ([@stephencelis](https://twitter.com/stephencelis)) - - -## License - -SQLite.swift is available under the MIT license. See [the LICENSE -file](./LICENSE.txt) for more information. - -## Related - -These projects enhance or use SQLite.swift: - - - [SQLiteMigrationManager.swift](https://github.com/garriguv/SQLiteMigrationManager.swift) (inspired by [FMDBMigrationManager](https://github.com/layerhq/FMDBMigrationManager)) - - -## Alternatives - -Looking for something else? Try another Swift wrapper (or [FMDB][]): - - - [Camembert](https://github.com/remirobert/Camembert) - - [GRDB](https://github.com/groue/GRDB.swift) - - [SQLiteDB](https://github.com/FahimF/SQLiteDB) - - [Squeal](https://github.com/nerdyc/Squeal) - - [SwiftData](https://github.com/ryanfowler/SwiftData) - - [SwiftSQLite](https://github.com/chrismsimpson/SwiftSQLite) - -[FMDB]: https://github.com/ccgus/fmdb -[swift-2.3]: https://github.com/stephencelis/SQLite.swift/tree/swift-2.3 diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.playground/Contents.swift b/Carthage/Checkouts/SQLite.swift/SQLite.playground/Contents.swift deleted file mode 100644 index 11e13139f7..0000000000 --- a/Carthage/Checkouts/SQLite.swift/SQLite.playground/Contents.swift +++ /dev/null @@ -1,43 +0,0 @@ -import SQLite - -let db = try! Connection() - -db.trace { print($0) } - -let users = Table("users") - -let id = Expression("id") -let email = Expression("email") -let name = Expression("name") - -try! db.run(users.create { t in - t.column(id, primaryKey: true) - t.column(email, unique: true, check: email.like("%@%")) - t.column(name) -}) - -let rowid = try! db.run(users.insert(email <- "alice@mac.com")) -let alice = users.filter(id == rowid) - -for user in try! db.prepare(users) { - print("id: \(user[id]), email: \(user[email])") -} - -let emails = VirtualTable("emails") - -let subject = Expression("subject") -let body = Expression("body") - -try! db.run(emails.create(.FTS4(subject, body))) - -try! db.run(emails.insert( - subject <- "Hello, world!", - body <- "This is a hello world message." -)) - -let row = try! db.pluck(emails.match("hello")) - -let query = try! db.prepare(emails.match("hello")) -for row in query { - print(row[subject]) -} diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.playground/contents.xcplayground b/Carthage/Checkouts/SQLite.swift/SQLite.playground/contents.xcplayground deleted file mode 100644 index fd676d5b46..0000000000 --- a/Carthage/Checkouts/SQLite.swift/SQLite.playground/contents.xcplayground +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.swift.podspec b/Carthage/Checkouts/SQLite.swift/SQLite.swift.podspec deleted file mode 100644 index 3c61aa1fe6..0000000000 --- a/Carthage/Checkouts/SQLite.swift/SQLite.swift.podspec +++ /dev/null @@ -1,70 +0,0 @@ -Pod::Spec.new do |s| - s.name = "SQLite.swift" - s.version = "0.11.2" - s.summary = "A type-safe, Swift-language layer over SQLite3 for iOS and OS X." - - s.description = <<-DESC - SQLite.swift provides compile-time confidence in SQL statement syntax and - intent. - DESC - - s.homepage = "https://github.com/stephencelis/SQLite.swift" - s.license = 'MIT' - s.author = { "Stephen Celis" => "stephen@stephencelis.com" } - s.source = { :git => "https://github.com/stephencelis/SQLite.swift.git", :tag => s.version.to_s } - s.social_media_url = 'https://twitter.com/stephencelis' - - s.module_name = 'SQLite' - s.ios.deployment_target = "8.0" - s.tvos.deployment_target = "9.0" - s.osx.deployment_target = "10.9" - s.watchos.deployment_target = "2.0" - s.default_subspec = 'standard' - s.pod_target_xcconfig = { - 'SWIFT_VERSION' => '3.0', - } - - s.subspec 'standard' do |ss| - ss.source_files = 'Sources/{SQLite,SQLiteObjc}/**/*.{c,h,m,swift}' - ss.exclude_files = 'Sources/**/Cipher.swift' - ss.private_header_files = 'Sources/SQLiteObjc/*.h' - - ss.library = 'sqlite3' - ss.preserve_paths = 'CocoaPods/**/*' - ss.pod_target_xcconfig = { - 'SWIFT_INCLUDE_PATHS[sdk=macosx*]' => '$(SRCROOT)/SQLite.swift/CocoaPods/macosx', - 'SWIFT_INCLUDE_PATHS[sdk=macosx10.11]' => '$(SRCROOT)/SQLite.swift/CocoaPods/macosx-10.11', - 'SWIFT_INCLUDE_PATHS[sdk=macosx10.12]' => '$(SRCROOT)/SQLite.swift/CocoaPods/macosx-10.12', - 'SWIFT_INCLUDE_PATHS[sdk=iphoneos*]' => '$(SRCROOT)/SQLite.swift/CocoaPods/iphoneos', - 'SWIFT_INCLUDE_PATHS[sdk=iphoneos10.0]' => '$(SRCROOT)/SQLite.swift/CocoaPods/iphoneos-10.0', - 'SWIFT_INCLUDE_PATHS[sdk=iphonesimulator*]' => '$(SRCROOT)/SQLite.swift/CocoaPods/iphonesimulator', - 'SWIFT_INCLUDE_PATHS[sdk=iphonesimulator10.0]' => '$(SRCROOT)/SQLite.swift/CocoaPods/iphonesimulator-10.0', - 'SWIFT_INCLUDE_PATHS[sdk=appletvos*]' => '$(SRCROOT)/SQLite.swift/CocoaPods/appletvos', - 'SWIFT_INCLUDE_PATHS[sdk=appletvsimulator*]' => '$(SRCROOT)/SQLite.swift/CocoaPods/appletvsimulator', - 'SWIFT_INCLUDE_PATHS[sdk=watchos*]' => '$(SRCROOT)/SQLite.swift/CocoaPods/watchos', - 'SWIFT_INCLUDE_PATHS[sdk=watchsimulator*]' => '$(SRCROOT)/SQLite.swift/CocoaPods/watchsimulator' - } - end - - s.subspec 'standalone' do |ss| - ss.source_files = 'Sources/{SQLite,SQLiteObjc}/**/*.{c,h,m,swift}' - ss.exclude_files = 'Sources/**/Cipher.swift' - ss.private_header_files = 'Sources/SQLiteObjc/*.h' - ss.xcconfig = { - 'OTHER_SWIFT_FLAGS' => '$(inherited) -DSQLITE_SWIFT_STANDALONE' - } - - ss.dependency 'sqlite3', '>= 3.14.0' - end - - s.subspec 'SQLCipher' do |ss| - ss.source_files = 'Sources/{SQLite,SQLiteObjc}/**/*.{c,h,m,swift}' - ss.private_header_files = 'Sources/SQLiteObjc/*.h' - ss.xcconfig = { - 'OTHER_SWIFT_FLAGS' => '$(inherited) -DSQLITE_SWIFT_SQLCIPHER', - 'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) SQLITE_HAS_CODEC=1' - } - - ss.dependency 'SQLCipher', '>= 3.4.0' - end -end diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.pbxproj b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.pbxproj deleted file mode 100644 index 153295ccd1..0000000000 --- a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1513 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 03A65E641C6BB0F60062603F /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A65E5A1C6BB0F50062603F /* SQLite.framework */; }; - 03A65E711C6BB2CD0062603F /* usr/include/sqlite3.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808B1C46E34A0038162A /* usr/include/sqlite3.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 03A65E721C6BB2D30062603F /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AD61C3F04ED00AE3E12 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 03A65E731C6BB2D80062603F /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF71C3F06E900AE3E12 /* Foundation.swift */; }; - 03A65E741C6BB2DA0062603F /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF81C3F06E900AE3E12 /* Helpers.swift */; }; - 03A65E751C6BB2DF0062603F /* SQLite-Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808D1C46E5230038162A /* SQLite-Bridging.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 03A65E761C6BB2E60062603F /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEE1C3F06E900AE3E12 /* Blob.swift */; }; - 03A65E771C6BB2E60062603F /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEF1C3F06E900AE3E12 /* Connection.swift */; }; - 03A65E781C6BB2EA0062603F /* fts3_tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AF01C3F06E900AE3E12 /* fts3_tokenizer.h */; }; - 03A65E791C6BB2EF0062603F /* SQLite-Bridging.m in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF11C3F06E900AE3E12 /* SQLite-Bridging.m */; }; - 03A65E7A1C6BB2F70062603F /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF21C3F06E900AE3E12 /* Statement.swift */; }; - 03A65E7B1C6BB2F70062603F /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF31C3F06E900AE3E12 /* Value.swift */; }; - 03A65E7C1C6BB2F70062603F /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF51C3F06E900AE3E12 /* FTS4.swift */; }; - 03A65E7D1C6BB2F70062603F /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF61C3F06E900AE3E12 /* RTree.swift */; }; - 03A65E7E1C6BB2FB0062603F /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */; }; - 03A65E7F1C6BB2FB0062603F /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFB1C3F06E900AE3E12 /* Collation.swift */; }; - 03A65E801C6BB2FB0062603F /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */; }; - 03A65E811C6BB2FB0062603F /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */; }; - 03A65E821C6BB2FB0062603F /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFE1C3F06E900AE3E12 /* Expression.swift */; }; - 03A65E831C6BB2FB0062603F /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFF1C3F06E900AE3E12 /* Operators.swift */; }; - 03A65E841C6BB2FB0062603F /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B001C3F06E900AE3E12 /* Query.swift */; }; - 03A65E851C6BB2FB0062603F /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B011C3F06E900AE3E12 /* Schema.swift */; }; - 03A65E861C6BB2FB0062603F /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B021C3F06E900AE3E12 /* Setter.swift */; }; - 03A65E871C6BB3030062603F /* AggregateFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1A1C3F137700AE3E12 /* AggregateFunctionsTests.swift */; }; - 03A65E881C6BB3030062603F /* BlobTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1B1C3F137700AE3E12 /* BlobTests.swift */; }; - 03A65E891C6BB3030062603F /* ConnectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1D1C3F137700AE3E12 /* ConnectionTests.swift */; }; - 03A65E8A1C6BB3030062603F /* CoreFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1E1C3F137700AE3E12 /* CoreFunctionsTests.swift */; }; - 03A65E8B1C6BB3030062603F /* CustomFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1F1C3F137700AE3E12 /* CustomFunctionsTests.swift */; }; - 03A65E8C1C6BB3030062603F /* ExpressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B201C3F137700AE3E12 /* ExpressionTests.swift */; }; - 03A65E8D1C6BB3030062603F /* FTS4Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B211C3F137700AE3E12 /* FTS4Tests.swift */; }; - 03A65E8E1C6BB3030062603F /* OperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2A1C3F141E00AE3E12 /* OperatorsTests.swift */; }; - 03A65E8F1C6BB3030062603F /* QueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2B1C3F141E00AE3E12 /* QueryTests.swift */; }; - 03A65E901C6BB3030062603F /* RTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2C1C3F141E00AE3E12 /* RTreeTests.swift */; }; - 03A65E911C6BB3030062603F /* SchemaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2D1C3F141E00AE3E12 /* SchemaTests.swift */; }; - 03A65E921C6BB3030062603F /* SetterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B181C3F134A00AE3E12 /* SetterTests.swift */; }; - 03A65E931C6BB3030062603F /* StatementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B321C3F142E00AE3E12 /* StatementTests.swift */; }; - 03A65E941C6BB3030062603F /* ValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B331C3F142E00AE3E12 /* ValueTests.swift */; }; - 03A65E951C6BB3030062603F /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B161C3F127200AE3E12 /* TestHelpers.swift */; }; - 03A65E971C6BB3210062603F /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 03A65E961C6BB3210062603F /* libsqlite3.tbd */; }; - 19A1709C3E7A406E62293B2A /* Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B93B48B5560E6E51791 /* Fixtures.swift */; }; - 19A1717B10CC941ACB5533D6 /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1730E4390C775C25677D1 /* FTS5.swift */; }; - 19A171E6FA242F72A308C594 /* FTS5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1721B8984686B9963B45D /* FTS5Tests.swift */; }; - 19A171F12AB8B07F2FD7201A /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178A39ACA9667A62663CC /* Cipher.swift */; }; - 19A17254FBA7894891F7297B /* FTS5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1721B8984686B9963B45D /* FTS5Tests.swift */; }; - 19A17408007B182F884E3A53 /* Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B93B48B5560E6E51791 /* Fixtures.swift */; }; - 19A174D78559CD30679BCCCB /* FTS5Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1721B8984686B9963B45D /* FTS5Tests.swift */; }; - 19A1750CEE9B05267995CF3D /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1730E4390C775C25677D1 /* FTS5.swift */; }; - 19A175DFF47B84757E547C62 /* fixtures in Resources */ = {isa = PBXBuildFile; fileRef = 19A17E2695737FAB5D6086E3 /* fixtures */; }; - 19A177CC33F2E6A24AF90B02 /* CipherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17399EA9E61235D5D77BF /* CipherTests.swift */; }; - 19A178072B371489E6A1E839 /* FoundationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */; }; - 19A17835FD5886FDC5A3228F /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178A39ACA9667A62663CC /* Cipher.swift */; }; - 19A179A0C45377CB09BB358C /* CipherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17399EA9E61235D5D77BF /* CipherTests.swift */; }; - 19A179CCF9671E345E5A9811 /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178A39ACA9667A62663CC /* Cipher.swift */; }; - 19A179E76EA6207669B60C1B /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A178A39ACA9667A62663CC /* Cipher.swift */; }; - 19A17C4B951CB054EE48AB1C /* CipherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17399EA9E61235D5D77BF /* CipherTests.swift */; }; - 19A17E04C4C0956715C5676A /* FoundationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */; }; - 19A17EC0D68BA8C03288ADF7 /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1730E4390C775C25677D1 /* FTS5.swift */; }; - 19A17F3E1F7ACA33BD43E138 /* fixtures in Resources */ = {isa = PBXBuildFile; fileRef = 19A17E2695737FAB5D6086E3 /* fixtures */; }; - 19A17F60B685636D1F83C2DD /* Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A17B93B48B5560E6E51791 /* Fixtures.swift */; }; - 19A17FB80B94E882050AA908 /* FoundationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */; }; - 19A17FDA323BAFDEC627E76F /* fixtures in Resources */ = {isa = PBXBuildFile; fileRef = 19A17E2695737FAB5D6086E3 /* fixtures */; }; - 3D67B3E61DB2469200A4F4C6 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D67B3E51DB2469200A4F4C6 /* libsqlite3.tbd */; }; - 3D67B3E71DB246BA00A4F4C6 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEE1C3F06E900AE3E12 /* Blob.swift */; }; - 3D67B3E81DB246BA00A4F4C6 /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEF1C3F06E900AE3E12 /* Connection.swift */; }; - 3D67B3E91DB246D100A4F4C6 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF21C3F06E900AE3E12 /* Statement.swift */; }; - 3D67B3EA1DB246D100A4F4C6 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF31C3F06E900AE3E12 /* Value.swift */; }; - 3D67B3EB1DB246D100A4F4C6 /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF51C3F06E900AE3E12 /* FTS4.swift */; }; - 3D67B3EC1DB246D100A4F4C6 /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF61C3F06E900AE3E12 /* RTree.swift */; }; - 3D67B3ED1DB246D100A4F4C6 /* FTS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A1730E4390C775C25677D1 /* FTS5.swift */; }; - 3D67B3EE1DB246D100A4F4C6 /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */; }; - 3D67B3EF1DB246D100A4F4C6 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFB1C3F06E900AE3E12 /* Collation.swift */; }; - 3D67B3F01DB246D100A4F4C6 /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */; }; - 3D67B3F11DB246D100A4F4C6 /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */; }; - 3D67B3F21DB246D100A4F4C6 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFE1C3F06E900AE3E12 /* Expression.swift */; }; - 3D67B3F31DB246D100A4F4C6 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFF1C3F06E900AE3E12 /* Operators.swift */; }; - 3D67B3F41DB246D100A4F4C6 /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B001C3F06E900AE3E12 /* Query.swift */; }; - 3D67B3F51DB246D100A4F4C6 /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B011C3F06E900AE3E12 /* Schema.swift */; }; - 3D67B3F61DB246D100A4F4C6 /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B021C3F06E900AE3E12 /* Setter.swift */; }; - 3D67B3F71DB246D700A4F4C6 /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF71C3F06E900AE3E12 /* Foundation.swift */; }; - 3D67B3F81DB246D700A4F4C6 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF81C3F06E900AE3E12 /* Helpers.swift */; }; - 3D67B3F91DB246E700A4F4C6 /* SQLite-Bridging.m in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF11C3F06E900AE3E12 /* SQLite-Bridging.m */; }; - 3D67B3FA1DB2470600A4F4C6 /* usr/include/sqlite3.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808B1C46E34A0038162A /* usr/include/sqlite3.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3D67B3FB1DB2470600A4F4C6 /* SQLite-Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808D1C46E5230038162A /* SQLite-Bridging.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3D67B3FC1DB2471B00A4F4C6 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AD61C3F04ED00AE3E12 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3D67B3FD1DB2472D00A4F4C6 /* fts3_tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AF01C3F06E900AE3E12 /* fts3_tokenizer.h */; }; - EE247AD71C3F04ED00AE3E12 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AD61C3F04ED00AE3E12 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE247ADE1C3F04ED00AE3E12 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE247AD31C3F04ED00AE3E12 /* SQLite.framework */; }; - EE247B031C3F06E900AE3E12 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEE1C3F06E900AE3E12 /* Blob.swift */; }; - EE247B041C3F06E900AE3E12 /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEF1C3F06E900AE3E12 /* Connection.swift */; }; - EE247B051C3F06E900AE3E12 /* fts3_tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AF01C3F06E900AE3E12 /* fts3_tokenizer.h */; }; - EE247B061C3F06E900AE3E12 /* SQLite-Bridging.m in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF11C3F06E900AE3E12 /* SQLite-Bridging.m */; }; - EE247B071C3F06E900AE3E12 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF21C3F06E900AE3E12 /* Statement.swift */; }; - EE247B081C3F06E900AE3E12 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF31C3F06E900AE3E12 /* Value.swift */; }; - EE247B091C3F06E900AE3E12 /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF51C3F06E900AE3E12 /* FTS4.swift */; }; - EE247B0A1C3F06E900AE3E12 /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF61C3F06E900AE3E12 /* RTree.swift */; }; - EE247B0B1C3F06E900AE3E12 /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF71C3F06E900AE3E12 /* Foundation.swift */; }; - EE247B0C1C3F06E900AE3E12 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF81C3F06E900AE3E12 /* Helpers.swift */; }; - EE247B0D1C3F06E900AE3E12 /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */; }; - EE247B0E1C3F06E900AE3E12 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFB1C3F06E900AE3E12 /* Collation.swift */; }; - EE247B0F1C3F06E900AE3E12 /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */; }; - EE247B101C3F06E900AE3E12 /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */; }; - EE247B111C3F06E900AE3E12 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFE1C3F06E900AE3E12 /* Expression.swift */; }; - EE247B121C3F06E900AE3E12 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFF1C3F06E900AE3E12 /* Operators.swift */; }; - EE247B131C3F06E900AE3E12 /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B001C3F06E900AE3E12 /* Query.swift */; }; - EE247B141C3F06E900AE3E12 /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B011C3F06E900AE3E12 /* Schema.swift */; }; - EE247B151C3F06E900AE3E12 /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B021C3F06E900AE3E12 /* Setter.swift */; }; - EE247B171C3F127200AE3E12 /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B161C3F127200AE3E12 /* TestHelpers.swift */; }; - EE247B191C3F134A00AE3E12 /* SetterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B181C3F134A00AE3E12 /* SetterTests.swift */; }; - EE247B221C3F137700AE3E12 /* AggregateFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1A1C3F137700AE3E12 /* AggregateFunctionsTests.swift */; }; - EE247B231C3F137700AE3E12 /* BlobTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1B1C3F137700AE3E12 /* BlobTests.swift */; }; - EE247B251C3F137700AE3E12 /* ConnectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1D1C3F137700AE3E12 /* ConnectionTests.swift */; }; - EE247B261C3F137700AE3E12 /* CoreFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1E1C3F137700AE3E12 /* CoreFunctionsTests.swift */; }; - EE247B271C3F137700AE3E12 /* CustomFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1F1C3F137700AE3E12 /* CustomFunctionsTests.swift */; }; - EE247B281C3F137700AE3E12 /* ExpressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B201C3F137700AE3E12 /* ExpressionTests.swift */; }; - EE247B291C3F137700AE3E12 /* FTS4Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B211C3F137700AE3E12 /* FTS4Tests.swift */; }; - EE247B2E1C3F141E00AE3E12 /* OperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2A1C3F141E00AE3E12 /* OperatorsTests.swift */; }; - EE247B2F1C3F141E00AE3E12 /* QueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2B1C3F141E00AE3E12 /* QueryTests.swift */; }; - EE247B301C3F141E00AE3E12 /* RTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2C1C3F141E00AE3E12 /* RTreeTests.swift */; }; - EE247B311C3F141E00AE3E12 /* SchemaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2D1C3F141E00AE3E12 /* SchemaTests.swift */; }; - EE247B341C3F142E00AE3E12 /* StatementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B321C3F142E00AE3E12 /* StatementTests.swift */; }; - EE247B351C3F142E00AE3E12 /* ValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B331C3F142E00AE3E12 /* ValueTests.swift */; }; - EE247B461C3F3ED000AE3E12 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE247B3C1C3F3ED000AE3E12 /* SQLite.framework */; }; - EE247B531C3F3FC700AE3E12 /* AggregateFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1A1C3F137700AE3E12 /* AggregateFunctionsTests.swift */; }; - EE247B541C3F3FC700AE3E12 /* BlobTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1B1C3F137700AE3E12 /* BlobTests.swift */; }; - EE247B551C3F3FC700AE3E12 /* ConnectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1D1C3F137700AE3E12 /* ConnectionTests.swift */; }; - EE247B561C3F3FC700AE3E12 /* CoreFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1E1C3F137700AE3E12 /* CoreFunctionsTests.swift */; }; - EE247B571C3F3FC700AE3E12 /* CustomFunctionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B1F1C3F137700AE3E12 /* CustomFunctionsTests.swift */; }; - EE247B581C3F3FC700AE3E12 /* ExpressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B201C3F137700AE3E12 /* ExpressionTests.swift */; }; - EE247B591C3F3FC700AE3E12 /* FTS4Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B211C3F137700AE3E12 /* FTS4Tests.swift */; }; - EE247B5A1C3F3FC700AE3E12 /* OperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2A1C3F141E00AE3E12 /* OperatorsTests.swift */; }; - EE247B5B1C3F3FC700AE3E12 /* QueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2B1C3F141E00AE3E12 /* QueryTests.swift */; }; - EE247B5C1C3F3FC700AE3E12 /* RTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2C1C3F141E00AE3E12 /* RTreeTests.swift */; }; - EE247B5D1C3F3FC700AE3E12 /* SchemaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B2D1C3F141E00AE3E12 /* SchemaTests.swift */; }; - EE247B5E1C3F3FC700AE3E12 /* SetterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B181C3F134A00AE3E12 /* SetterTests.swift */; }; - EE247B5F1C3F3FC700AE3E12 /* StatementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B321C3F142E00AE3E12 /* StatementTests.swift */; }; - EE247B601C3F3FC700AE3E12 /* ValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B331C3F142E00AE3E12 /* ValueTests.swift */; }; - EE247B611C3F3FC700AE3E12 /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B161C3F127200AE3E12 /* TestHelpers.swift */; }; - EE247B621C3F3FDB00AE3E12 /* SQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AD61C3F04ED00AE3E12 /* SQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE247B631C3F3FDB00AE3E12 /* Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF71C3F06E900AE3E12 /* Foundation.swift */; }; - EE247B641C3F3FDB00AE3E12 /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF81C3F06E900AE3E12 /* Helpers.swift */; }; - EE247B651C3F3FEC00AE3E12 /* Blob.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEE1C3F06E900AE3E12 /* Blob.swift */; }; - EE247B661C3F3FEC00AE3E12 /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AEF1C3F06E900AE3E12 /* Connection.swift */; }; - EE247B671C3F3FEC00AE3E12 /* fts3_tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = EE247AF01C3F06E900AE3E12 /* fts3_tokenizer.h */; }; - EE247B681C3F3FEC00AE3E12 /* SQLite-Bridging.m in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF11C3F06E900AE3E12 /* SQLite-Bridging.m */; }; - EE247B691C3F3FEC00AE3E12 /* Statement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF21C3F06E900AE3E12 /* Statement.swift */; }; - EE247B6A1C3F3FEC00AE3E12 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF31C3F06E900AE3E12 /* Value.swift */; }; - EE247B6B1C3F3FEC00AE3E12 /* FTS4.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF51C3F06E900AE3E12 /* FTS4.swift */; }; - EE247B6C1C3F3FEC00AE3E12 /* RTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AF61C3F06E900AE3E12 /* RTree.swift */; }; - EE247B6D1C3F3FEC00AE3E12 /* AggregateFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */; }; - EE247B6E1C3F3FEC00AE3E12 /* Collation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFB1C3F06E900AE3E12 /* Collation.swift */; }; - EE247B6F1C3F3FEC00AE3E12 /* CoreFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */; }; - EE247B701C3F3FEC00AE3E12 /* CustomFunctions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */; }; - EE247B711C3F3FEC00AE3E12 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFE1C3F06E900AE3E12 /* Expression.swift */; }; - EE247B721C3F3FEC00AE3E12 /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247AFF1C3F06E900AE3E12 /* Operators.swift */; }; - EE247B731C3F3FEC00AE3E12 /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B001C3F06E900AE3E12 /* Query.swift */; }; - EE247B741C3F3FEC00AE3E12 /* Schema.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B011C3F06E900AE3E12 /* Schema.swift */; }; - EE247B751C3F3FEC00AE3E12 /* Setter.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE247B021C3F06E900AE3E12 /* Setter.swift */; }; - EE91808C1C46E34A0038162A /* usr/include/sqlite3.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808B1C46E34A0038162A /* usr/include/sqlite3.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE91808E1C46E5230038162A /* SQLite-Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808D1C46E5230038162A /* SQLite-Bridging.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE91808F1C46E76D0038162A /* SQLite-Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808D1C46E5230038162A /* SQLite-Bridging.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE9180901C46E8980038162A /* usr/include/sqlite3.h in Headers */ = {isa = PBXBuildFile; fileRef = EE91808B1C46E34A0038162A /* usr/include/sqlite3.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE9180941C46EA210038162A /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = EE9180931C46EA210038162A /* libsqlite3.tbd */; }; - EE9180951C46EBCC0038162A /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = EE9180911C46E9D30038162A /* libsqlite3.tbd */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 03A65E651C6BB0F60062603F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = EE247ACA1C3F04ED00AE3E12 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 03A65E591C6BB0F50062603F; - remoteInfo = "SQLite tvOS"; - }; - EE247ADF1C3F04ED00AE3E12 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = EE247ACA1C3F04ED00AE3E12 /* Project object */; - proxyType = 1; - remoteGlobalIDString = EE247AD21C3F04ED00AE3E12; - remoteInfo = SQLite; - }; - EE247B471C3F3ED000AE3E12 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = EE247ACA1C3F04ED00AE3E12 /* Project object */; - proxyType = 1; - remoteGlobalIDString = EE247B3B1C3F3ED000AE3E12; - remoteInfo = SQLite; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 03A65E5A1C6BB0F50062603F /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 03A65E631C6BB0F60062603F /* SQLiteTests tvOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SQLiteTests tvOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - 03A65E961C6BB3210062603F /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS.sdk/usr/lib/libsqlite3.tbd; sourceTree = DEVELOPER_DIR; }; - 19A1721B8984686B9963B45D /* FTS5Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FTS5Tests.swift; sourceTree = ""; }; - 19A1730E4390C775C25677D1 /* FTS5.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FTS5.swift; sourceTree = ""; }; - 19A17399EA9E61235D5D77BF /* CipherTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CipherTests.swift; sourceTree = ""; }; - 19A178A39ACA9667A62663CC /* Cipher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Cipher.swift; sourceTree = ""; }; - 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FoundationTests.swift; sourceTree = ""; }; - 19A17B93B48B5560E6E51791 /* Fixtures.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Fixtures.swift; sourceTree = ""; }; - 19A17E2695737FAB5D6086E3 /* fixtures */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; path = fixtures; sourceTree = ""; }; - 39548A631CA63C740003E3B5 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; - 39548A651CA63C740003E3B5 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; - 39548A671CA63C740003E3B5 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; - 39548A691CA63C740003E3B5 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; - 39548A6B1CA63C740003E3B5 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; - 39548A6D1CA63C740003E3B5 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; - 39548A6F1CA63C740003E3B5 /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; - 3D67B3E51DB2469200A4F4C6 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS3.0.sdk/usr/lib/libsqlite3.tbd; sourceTree = DEVELOPER_DIR; }; - A121AC451CA35C79005A31D1 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - EE247AD31C3F04ED00AE3E12 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - EE247AD61C3F04ED00AE3E12 /* SQLite.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SQLite.h; sourceTree = ""; }; - EE247AD81C3F04ED00AE3E12 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - EE247ADD1C3F04ED00AE3E12 /* SQLiteTests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SQLiteTests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - EE247AE41C3F04ED00AE3E12 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - EE247AEE1C3F06E900AE3E12 /* Blob.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Blob.swift; sourceTree = ""; }; - EE247AEF1C3F06E900AE3E12 /* Connection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Connection.swift; sourceTree = ""; }; - EE247AF01C3F06E900AE3E12 /* fts3_tokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fts3_tokenizer.h; path = ../../SQLiteObjc/fts3_tokenizer.h; sourceTree = ""; }; - EE247AF11C3F06E900AE3E12 /* SQLite-Bridging.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "SQLite-Bridging.m"; path = "../../SQLiteObjc/SQLite-Bridging.m"; sourceTree = ""; }; - EE247AF21C3F06E900AE3E12 /* Statement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Statement.swift; sourceTree = ""; }; - EE247AF31C3F06E900AE3E12 /* Value.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Value.swift; sourceTree = ""; }; - EE247AF51C3F06E900AE3E12 /* FTS4.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FTS4.swift; sourceTree = ""; }; - EE247AF61C3F06E900AE3E12 /* RTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RTree.swift; sourceTree = ""; }; - EE247AF71C3F06E900AE3E12 /* Foundation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Foundation.swift; sourceTree = ""; }; - EE247AF81C3F06E900AE3E12 /* Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = ""; }; - EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AggregateFunctions.swift; sourceTree = ""; }; - EE247AFB1C3F06E900AE3E12 /* Collation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Collation.swift; sourceTree = ""; }; - EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreFunctions.swift; sourceTree = ""; }; - EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomFunctions.swift; sourceTree = ""; }; - EE247AFE1C3F06E900AE3E12 /* Expression.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Expression.swift; sourceTree = ""; }; - EE247AFF1C3F06E900AE3E12 /* Operators.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Operators.swift; sourceTree = ""; }; - EE247B001C3F06E900AE3E12 /* Query.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Query.swift; sourceTree = ""; }; - EE247B011C3F06E900AE3E12 /* Schema.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Schema.swift; sourceTree = ""; }; - EE247B021C3F06E900AE3E12 /* Setter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Setter.swift; sourceTree = ""; }; - EE247B161C3F127200AE3E12 /* TestHelpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestHelpers.swift; sourceTree = ""; }; - EE247B181C3F134A00AE3E12 /* SetterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetterTests.swift; sourceTree = ""; }; - EE247B1A1C3F137700AE3E12 /* AggregateFunctionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AggregateFunctionsTests.swift; sourceTree = ""; }; - EE247B1B1C3F137700AE3E12 /* BlobTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlobTests.swift; sourceTree = ""; }; - EE247B1D1C3F137700AE3E12 /* ConnectionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectionTests.swift; sourceTree = ""; }; - EE247B1E1C3F137700AE3E12 /* CoreFunctionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreFunctionsTests.swift; sourceTree = ""; }; - EE247B1F1C3F137700AE3E12 /* CustomFunctionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomFunctionsTests.swift; sourceTree = ""; }; - EE247B201C3F137700AE3E12 /* ExpressionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExpressionTests.swift; sourceTree = ""; }; - EE247B211C3F137700AE3E12 /* FTS4Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FTS4Tests.swift; sourceTree = ""; }; - EE247B2A1C3F141E00AE3E12 /* OperatorsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OperatorsTests.swift; sourceTree = ""; }; - EE247B2B1C3F141E00AE3E12 /* QueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueryTests.swift; sourceTree = ""; }; - EE247B2C1C3F141E00AE3E12 /* RTreeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RTreeTests.swift; sourceTree = ""; }; - EE247B2D1C3F141E00AE3E12 /* SchemaTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SchemaTests.swift; sourceTree = ""; }; - EE247B321C3F142E00AE3E12 /* StatementTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatementTests.swift; sourceTree = ""; }; - EE247B331C3F142E00AE3E12 /* ValueTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueTests.swift; sourceTree = ""; }; - EE247B3C1C3F3ED000AE3E12 /* SQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - EE247B451C3F3ED000AE3E12 /* SQLiteTests Mac.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SQLiteTests Mac.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; - EE247B771C3F40D700AE3E12 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - EE247B8B1C3F820300AE3E12 /* CONTRIBUTING.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CONTRIBUTING.md; sourceTree = ""; }; - EE247B8C1C3F821200AE3E12 /* .travis.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .travis.yml; sourceTree = ""; }; - EE247B8D1C3F821200AE3E12 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; - EE247B8F1C3F822500AE3E12 /* Index.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = Index.md; sourceTree = ""; }; - EE247B911C3F822500AE3E12 /* installation@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "installation@2x.png"; sourceTree = ""; }; - EE247B921C3F822600AE3E12 /* playground@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "playground@2x.png"; sourceTree = ""; }; - EE247B931C3F826100AE3E12 /* SQLite.swift.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; path = SQLite.swift.podspec; sourceTree = ""; }; - EE91808B1C46E34A0038162A /* usr/include/sqlite3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = usr/include/sqlite3.h; sourceTree = SDKROOT; }; - EE91808D1C46E5230038162A /* SQLite-Bridging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "SQLite-Bridging.h"; path = "../../SQLiteObjc/include/SQLite-Bridging.h"; sourceTree = ""; }; - EE9180911C46E9D30038162A /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/lib/libsqlite3.tbd; sourceTree = DEVELOPER_DIR; }; - EE9180931C46EA210038162A /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 03A65E561C6BB0F50062603F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 03A65E971C6BB3210062603F /* libsqlite3.tbd in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 03A65E601C6BB0F60062603F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 03A65E641C6BB0F60062603F /* SQLite.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A121AC411CA35C79005A31D1 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D67B3E61DB2469200A4F4C6 /* libsqlite3.tbd in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EE247ACF1C3F04ED00AE3E12 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - EE9180941C46EA210038162A /* libsqlite3.tbd in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EE247ADA1C3F04ED00AE3E12 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - EE247ADE1C3F04ED00AE3E12 /* SQLite.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EE247B381C3F3ED000AE3E12 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - EE9180951C46EBCC0038162A /* libsqlite3.tbd in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EE247B421C3F3ED000AE3E12 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - EE247B461C3F3ED000AE3E12 /* SQLite.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 39548A611CA63C740003E3B5 /* CocoaPods */ = { - isa = PBXGroup; - children = ( - 39548A621CA63C740003E3B5 /* appletvos */, - 39548A641CA63C740003E3B5 /* appletvsimulator */, - 39548A661CA63C740003E3B5 /* iphoneos */, - 39548A681CA63C740003E3B5 /* iphonesimulator */, - 39548A6A1CA63C740003E3B5 /* macosx */, - 39548A6C1CA63C740003E3B5 /* watchos */, - 39548A6E1CA63C740003E3B5 /* watchsimulator */, - ); - path = CocoaPods; - sourceTree = ""; - }; - 39548A621CA63C740003E3B5 /* appletvos */ = { - isa = PBXGroup; - children = ( - 39548A631CA63C740003E3B5 /* module.modulemap */, - ); - path = appletvos; - sourceTree = ""; - }; - 39548A641CA63C740003E3B5 /* appletvsimulator */ = { - isa = PBXGroup; - children = ( - 39548A651CA63C740003E3B5 /* module.modulemap */, - ); - path = appletvsimulator; - sourceTree = ""; - }; - 39548A661CA63C740003E3B5 /* iphoneos */ = { - isa = PBXGroup; - children = ( - 39548A671CA63C740003E3B5 /* module.modulemap */, - ); - path = iphoneos; - sourceTree = ""; - }; - 39548A681CA63C740003E3B5 /* iphonesimulator */ = { - isa = PBXGroup; - children = ( - 39548A691CA63C740003E3B5 /* module.modulemap */, - ); - path = iphonesimulator; - sourceTree = ""; - }; - 39548A6A1CA63C740003E3B5 /* macosx */ = { - isa = PBXGroup; - children = ( - 39548A6B1CA63C740003E3B5 /* module.modulemap */, - ); - path = macosx; - sourceTree = ""; - }; - 39548A6C1CA63C740003E3B5 /* watchos */ = { - isa = PBXGroup; - children = ( - 39548A6D1CA63C740003E3B5 /* module.modulemap */, - ); - path = watchos; - sourceTree = ""; - }; - 39548A6E1CA63C740003E3B5 /* watchsimulator */ = { - isa = PBXGroup; - children = ( - 39548A6F1CA63C740003E3B5 /* module.modulemap */, - ); - path = watchsimulator; - sourceTree = ""; - }; - 3D67B3E41DB2469200A4F4C6 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 3D67B3E51DB2469200A4F4C6 /* libsqlite3.tbd */, - ); - name = Frameworks; - sourceTree = ""; - }; - EE247AC91C3F04ED00AE3E12 = { - isa = PBXGroup; - children = ( - EE247AD51C3F04ED00AE3E12 /* SQLite */, - EE247AE11C3F04ED00AE3E12 /* SQLiteTests */, - EE247B8A1C3F81D000AE3E12 /* Metadata */, - EE247AD41C3F04ED00AE3E12 /* Products */, - 3D67B3E41DB2469200A4F4C6 /* Frameworks */, - ); - indentWidth = 4; - sourceTree = ""; - tabWidth = 4; - }; - EE247AD41C3F04ED00AE3E12 /* Products */ = { - isa = PBXGroup; - children = ( - EE247AD31C3F04ED00AE3E12 /* SQLite.framework */, - EE247ADD1C3F04ED00AE3E12 /* SQLiteTests iOS.xctest */, - EE247B3C1C3F3ED000AE3E12 /* SQLite.framework */, - EE247B451C3F3ED000AE3E12 /* SQLiteTests Mac.xctest */, - 03A65E5A1C6BB0F50062603F /* SQLite.framework */, - 03A65E631C6BB0F60062603F /* SQLiteTests tvOS.xctest */, - A121AC451CA35C79005A31D1 /* SQLite.framework */, - ); - name = Products; - sourceTree = ""; - }; - EE247AD51C3F04ED00AE3E12 /* SQLite */ = { - isa = PBXGroup; - children = ( - EE91808B1C46E34A0038162A /* usr/include/sqlite3.h */, - EE247AD61C3F04ED00AE3E12 /* SQLite.h */, - EE247AF71C3F06E900AE3E12 /* Foundation.swift */, - EE247AF81C3F06E900AE3E12 /* Helpers.swift */, - EE247AD81C3F04ED00AE3E12 /* Info.plist */, - EE247AED1C3F06E900AE3E12 /* Core */, - EE247AF41C3F06E900AE3E12 /* Extensions */, - EE247AF91C3F06E900AE3E12 /* Typed */, - ); - name = SQLite; - path = Sources/SQLite; - sourceTree = ""; - }; - EE247AE11C3F04ED00AE3E12 /* SQLiteTests */ = { - isa = PBXGroup; - children = ( - 19A17E2695737FAB5D6086E3 /* fixtures */, - EE247B1A1C3F137700AE3E12 /* AggregateFunctionsTests.swift */, - EE247B1B1C3F137700AE3E12 /* BlobTests.swift */, - EE247B1D1C3F137700AE3E12 /* ConnectionTests.swift */, - EE247B1E1C3F137700AE3E12 /* CoreFunctionsTests.swift */, - EE247B1F1C3F137700AE3E12 /* CustomFunctionsTests.swift */, - EE247B201C3F137700AE3E12 /* ExpressionTests.swift */, - EE247B211C3F137700AE3E12 /* FTS4Tests.swift */, - EE247B2A1C3F141E00AE3E12 /* OperatorsTests.swift */, - EE247B2B1C3F141E00AE3E12 /* QueryTests.swift */, - EE247B2C1C3F141E00AE3E12 /* RTreeTests.swift */, - EE247B2D1C3F141E00AE3E12 /* SchemaTests.swift */, - EE247B181C3F134A00AE3E12 /* SetterTests.swift */, - EE247B321C3F142E00AE3E12 /* StatementTests.swift */, - EE247B331C3F142E00AE3E12 /* ValueTests.swift */, - EE247B161C3F127200AE3E12 /* TestHelpers.swift */, - EE247AE41C3F04ED00AE3E12 /* Info.plist */, - 19A1721B8984686B9963B45D /* FTS5Tests.swift */, - 19A1794CC4D7827E997E32A7 /* FoundationTests.swift */, - 19A17399EA9E61235D5D77BF /* CipherTests.swift */, - 19A17B93B48B5560E6E51791 /* Fixtures.swift */, - ); - name = SQLiteTests; - path = Tests/SQLiteTests; - sourceTree = ""; - }; - EE247AED1C3F06E900AE3E12 /* Core */ = { - isa = PBXGroup; - children = ( - EE91808D1C46E5230038162A /* SQLite-Bridging.h */, - EE247AEE1C3F06E900AE3E12 /* Blob.swift */, - EE247AEF1C3F06E900AE3E12 /* Connection.swift */, - EE247AF01C3F06E900AE3E12 /* fts3_tokenizer.h */, - EE247AF11C3F06E900AE3E12 /* SQLite-Bridging.m */, - EE247AF21C3F06E900AE3E12 /* Statement.swift */, - EE247AF31C3F06E900AE3E12 /* Value.swift */, - ); - path = Core; - sourceTree = ""; - }; - EE247AF41C3F06E900AE3E12 /* Extensions */ = { - isa = PBXGroup; - children = ( - EE247AF51C3F06E900AE3E12 /* FTS4.swift */, - EE247AF61C3F06E900AE3E12 /* RTree.swift */, - 19A1730E4390C775C25677D1 /* FTS5.swift */, - 19A178A39ACA9667A62663CC /* Cipher.swift */, - ); - path = Extensions; - sourceTree = ""; - }; - EE247AF91C3F06E900AE3E12 /* Typed */ = { - isa = PBXGroup; - children = ( - EE247AFA1C3F06E900AE3E12 /* AggregateFunctions.swift */, - EE247AFB1C3F06E900AE3E12 /* Collation.swift */, - EE247AFC1C3F06E900AE3E12 /* CoreFunctions.swift */, - EE247AFD1C3F06E900AE3E12 /* CustomFunctions.swift */, - EE247AFE1C3F06E900AE3E12 /* Expression.swift */, - EE247AFF1C3F06E900AE3E12 /* Operators.swift */, - EE247B001C3F06E900AE3E12 /* Query.swift */, - EE247B011C3F06E900AE3E12 /* Schema.swift */, - EE247B021C3F06E900AE3E12 /* Setter.swift */, - ); - path = Typed; - sourceTree = ""; - }; - EE247B8A1C3F81D000AE3E12 /* Metadata */ = { - isa = PBXGroup; - children = ( - 39548A611CA63C740003E3B5 /* CocoaPods */, - EE247B771C3F40D700AE3E12 /* README.md */, - EE247B8B1C3F820300AE3E12 /* CONTRIBUTING.md */, - EE247B931C3F826100AE3E12 /* SQLite.swift.podspec */, - EE247B8C1C3F821200AE3E12 /* .travis.yml */, - EE247B8D1C3F821200AE3E12 /* Makefile */, - EE9180931C46EA210038162A /* libsqlite3.tbd */, - EE9180911C46E9D30038162A /* libsqlite3.tbd */, - 03A65E961C6BB3210062603F /* libsqlite3.tbd */, - EE247B8E1C3F822500AE3E12 /* Documentation */, - ); - name = Metadata; - sourceTree = ""; - }; - EE247B8E1C3F822500AE3E12 /* Documentation */ = { - isa = PBXGroup; - children = ( - EE247B8F1C3F822500AE3E12 /* Index.md */, - EE247B901C3F822500AE3E12 /* Resources */, - ); - path = Documentation; - sourceTree = ""; - }; - EE247B901C3F822500AE3E12 /* Resources */ = { - isa = PBXGroup; - children = ( - EE247B911C3F822500AE3E12 /* installation@2x.png */, - EE247B921C3F822600AE3E12 /* playground@2x.png */, - ); - path = Resources; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 03A65E571C6BB0F50062603F /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 03A65E781C6BB2EA0062603F /* fts3_tokenizer.h in Headers */, - 03A65E751C6BB2DF0062603F /* SQLite-Bridging.h in Headers */, - 03A65E711C6BB2CD0062603F /* usr/include/sqlite3.h in Headers */, - 03A65E721C6BB2D30062603F /* SQLite.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A121AC421CA35C79005A31D1 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D67B3FA1DB2470600A4F4C6 /* usr/include/sqlite3.h in Headers */, - 3D67B3FB1DB2470600A4F4C6 /* SQLite-Bridging.h in Headers */, - 3D67B3FC1DB2471B00A4F4C6 /* SQLite.h in Headers */, - 3D67B3FD1DB2472D00A4F4C6 /* fts3_tokenizer.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EE247AD01C3F04ED00AE3E12 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - EE91808E1C46E5230038162A /* SQLite-Bridging.h in Headers */, - EE247B051C3F06E900AE3E12 /* fts3_tokenizer.h in Headers */, - EE91808C1C46E34A0038162A /* usr/include/sqlite3.h in Headers */, - EE247AD71C3F04ED00AE3E12 /* SQLite.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EE247B391C3F3ED000AE3E12 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - EE9180901C46E8980038162A /* usr/include/sqlite3.h in Headers */, - EE247B671C3F3FEC00AE3E12 /* fts3_tokenizer.h in Headers */, - EE247B621C3F3FDB00AE3E12 /* SQLite.h in Headers */, - EE91808F1C46E76D0038162A /* SQLite-Bridging.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 03A65E591C6BB0F50062603F /* SQLite tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 03A65E6F1C6BB0F60062603F /* Build configuration list for PBXNativeTarget "SQLite tvOS" */; - buildPhases = ( - 03A65E551C6BB0F50062603F /* Sources */, - 03A65E561C6BB0F50062603F /* Frameworks */, - 03A65E571C6BB0F50062603F /* Headers */, - 03A65E581C6BB0F50062603F /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "SQLite tvOS"; - productName = "SQLite tvOS"; - productReference = 03A65E5A1C6BB0F50062603F /* SQLite.framework */; - productType = "com.apple.product-type.framework"; - }; - 03A65E621C6BB0F60062603F /* SQLiteTests tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 03A65E701C6BB0F60062603F /* Build configuration list for PBXNativeTarget "SQLiteTests tvOS" */; - buildPhases = ( - 03A65E5F1C6BB0F60062603F /* Sources */, - 03A65E601C6BB0F60062603F /* Frameworks */, - 03A65E611C6BB0F60062603F /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 03A65E661C6BB0F60062603F /* PBXTargetDependency */, - ); - name = "SQLiteTests tvOS"; - productName = "SQLite tvOSTests"; - productReference = 03A65E631C6BB0F60062603F /* SQLiteTests tvOS.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - A121AC441CA35C79005A31D1 /* SQLite watchOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = A121AC4C1CA35C79005A31D1 /* Build configuration list for PBXNativeTarget "SQLite watchOS" */; - buildPhases = ( - A121AC401CA35C79005A31D1 /* Sources */, - A121AC411CA35C79005A31D1 /* Frameworks */, - A121AC421CA35C79005A31D1 /* Headers */, - A121AC431CA35C79005A31D1 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "SQLite watchOS"; - productName = "SQLite watchOS"; - productReference = A121AC451CA35C79005A31D1 /* SQLite.framework */; - productType = "com.apple.product-type.framework"; - }; - EE247AD21C3F04ED00AE3E12 /* SQLite iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = EE247AE71C3F04ED00AE3E12 /* Build configuration list for PBXNativeTarget "SQLite iOS" */; - buildPhases = ( - EE247ACE1C3F04ED00AE3E12 /* Sources */, - EE247ACF1C3F04ED00AE3E12 /* Frameworks */, - EE247AD01C3F04ED00AE3E12 /* Headers */, - EE247AD11C3F04ED00AE3E12 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "SQLite iOS"; - productName = SQLite; - productReference = EE247AD31C3F04ED00AE3E12 /* SQLite.framework */; - productType = "com.apple.product-type.framework"; - }; - EE247ADC1C3F04ED00AE3E12 /* SQLiteTests iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = EE247AEA1C3F04ED00AE3E12 /* Build configuration list for PBXNativeTarget "SQLiteTests iOS" */; - buildPhases = ( - EE247AD91C3F04ED00AE3E12 /* Sources */, - EE247ADA1C3F04ED00AE3E12 /* Frameworks */, - EE247ADB1C3F04ED00AE3E12 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - EE247AE01C3F04ED00AE3E12 /* PBXTargetDependency */, - ); - name = "SQLiteTests iOS"; - productName = SQLiteTests; - productReference = EE247ADD1C3F04ED00AE3E12 /* SQLiteTests iOS.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - EE247B3B1C3F3ED000AE3E12 /* SQLite Mac */ = { - isa = PBXNativeTarget; - buildConfigurationList = EE247B511C3F3ED000AE3E12 /* Build configuration list for PBXNativeTarget "SQLite Mac" */; - buildPhases = ( - EE247B371C3F3ED000AE3E12 /* Sources */, - EE247B381C3F3ED000AE3E12 /* Frameworks */, - EE247B391C3F3ED000AE3E12 /* Headers */, - EE247B3A1C3F3ED000AE3E12 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "SQLite Mac"; - productName = SQLite; - productReference = EE247B3C1C3F3ED000AE3E12 /* SQLite.framework */; - productType = "com.apple.product-type.framework"; - }; - EE247B441C3F3ED000AE3E12 /* SQLiteTests Mac */ = { - isa = PBXNativeTarget; - buildConfigurationList = EE247B521C3F3ED000AE3E12 /* Build configuration list for PBXNativeTarget "SQLiteTests Mac" */; - buildPhases = ( - EE247B411C3F3ED000AE3E12 /* Sources */, - EE247B421C3F3ED000AE3E12 /* Frameworks */, - EE247B431C3F3ED000AE3E12 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - EE247B481C3F3ED000AE3E12 /* PBXTargetDependency */, - ); - name = "SQLiteTests Mac"; - productName = SQLiteTests; - productReference = EE247B451C3F3ED000AE3E12 /* SQLiteTests Mac.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - EE247ACA1C3F04ED00AE3E12 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0800; - TargetAttributes = { - 03A65E591C6BB0F50062603F = { - CreatedOnToolsVersion = 7.2; - }; - 03A65E621C6BB0F60062603F = { - CreatedOnToolsVersion = 7.2; - }; - A121AC441CA35C79005A31D1 = { - CreatedOnToolsVersion = 7.3; - }; - EE247AD21C3F04ED00AE3E12 = { - CreatedOnToolsVersion = 7.2; - LastSwiftMigration = 0800; - }; - EE247ADC1C3F04ED00AE3E12 = { - CreatedOnToolsVersion = 7.2; - LastSwiftMigration = 0800; - }; - EE247B3B1C3F3ED000AE3E12 = { - CreatedOnToolsVersion = 7.2; - LastSwiftMigration = 0800; - }; - EE247B441C3F3ED000AE3E12 = { - CreatedOnToolsVersion = 7.2; - LastSwiftMigration = 0800; - }; - }; - }; - buildConfigurationList = EE247ACD1C3F04ED00AE3E12 /* Build configuration list for PBXProject "SQLite" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = EE247AC91C3F04ED00AE3E12; - productRefGroup = EE247AD41C3F04ED00AE3E12 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - EE247AD21C3F04ED00AE3E12 /* SQLite iOS */, - EE247ADC1C3F04ED00AE3E12 /* SQLiteTests iOS */, - EE247B3B1C3F3ED000AE3E12 /* SQLite Mac */, - EE247B441C3F3ED000AE3E12 /* SQLiteTests Mac */, - 03A65E591C6BB0F50062603F /* SQLite tvOS */, - 03A65E621C6BB0F60062603F /* SQLiteTests tvOS */, - A121AC441CA35C79005A31D1 /* SQLite watchOS */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 03A65E581C6BB0F50062603F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 03A65E611C6BB0F60062603F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 19A17F3E1F7ACA33BD43E138 /* fixtures in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A121AC431CA35C79005A31D1 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EE247AD11C3F04ED00AE3E12 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EE247ADB1C3F04ED00AE3E12 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 19A17FDA323BAFDEC627E76F /* fixtures in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EE247B3A1C3F3ED000AE3E12 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EE247B431C3F3ED000AE3E12 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 19A175DFF47B84757E547C62 /* fixtures in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 03A65E551C6BB0F50062603F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 03A65E801C6BB2FB0062603F /* CoreFunctions.swift in Sources */, - 03A65E761C6BB2E60062603F /* Blob.swift in Sources */, - 03A65E7D1C6BB2F70062603F /* RTree.swift in Sources */, - 03A65E791C6BB2EF0062603F /* SQLite-Bridging.m in Sources */, - 03A65E7B1C6BB2F70062603F /* Value.swift in Sources */, - 03A65E821C6BB2FB0062603F /* Expression.swift in Sources */, - 03A65E731C6BB2D80062603F /* Foundation.swift in Sources */, - 03A65E7F1C6BB2FB0062603F /* Collation.swift in Sources */, - 03A65E861C6BB2FB0062603F /* Setter.swift in Sources */, - 03A65E811C6BB2FB0062603F /* CustomFunctions.swift in Sources */, - 03A65E7A1C6BB2F70062603F /* Statement.swift in Sources */, - 03A65E741C6BB2DA0062603F /* Helpers.swift in Sources */, - 03A65E831C6BB2FB0062603F /* Operators.swift in Sources */, - 03A65E851C6BB2FB0062603F /* Schema.swift in Sources */, - 03A65E841C6BB2FB0062603F /* Query.swift in Sources */, - 03A65E7C1C6BB2F70062603F /* FTS4.swift in Sources */, - 03A65E771C6BB2E60062603F /* Connection.swift in Sources */, - 03A65E7E1C6BB2FB0062603F /* AggregateFunctions.swift in Sources */, - 19A17EC0D68BA8C03288ADF7 /* FTS5.swift in Sources */, - 19A179E76EA6207669B60C1B /* Cipher.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 03A65E5F1C6BB0F60062603F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 03A65E881C6BB3030062603F /* BlobTests.swift in Sources */, - 03A65E901C6BB3030062603F /* RTreeTests.swift in Sources */, - 03A65E941C6BB3030062603F /* ValueTests.swift in Sources */, - 03A65E8F1C6BB3030062603F /* QueryTests.swift in Sources */, - 03A65E8B1C6BB3030062603F /* CustomFunctionsTests.swift in Sources */, - 03A65E871C6BB3030062603F /* AggregateFunctionsTests.swift in Sources */, - 03A65E921C6BB3030062603F /* SetterTests.swift in Sources */, - 03A65E891C6BB3030062603F /* ConnectionTests.swift in Sources */, - 03A65E8A1C6BB3030062603F /* CoreFunctionsTests.swift in Sources */, - 03A65E931C6BB3030062603F /* StatementTests.swift in Sources */, - 03A65E911C6BB3030062603F /* SchemaTests.swift in Sources */, - 03A65E8D1C6BB3030062603F /* FTS4Tests.swift in Sources */, - 03A65E8C1C6BB3030062603F /* ExpressionTests.swift in Sources */, - 03A65E8E1C6BB3030062603F /* OperatorsTests.swift in Sources */, - 03A65E951C6BB3030062603F /* TestHelpers.swift in Sources */, - 19A17254FBA7894891F7297B /* FTS5Tests.swift in Sources */, - 19A17E04C4C0956715C5676A /* FoundationTests.swift in Sources */, - 19A179A0C45377CB09BB358C /* CipherTests.swift in Sources */, - 19A17F60B685636D1F83C2DD /* Fixtures.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A121AC401CA35C79005A31D1 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D67B3F91DB246E700A4F4C6 /* SQLite-Bridging.m in Sources */, - 3D67B3F71DB246D700A4F4C6 /* Foundation.swift in Sources */, - 3D67B3F81DB246D700A4F4C6 /* Helpers.swift in Sources */, - 3D67B3E91DB246D100A4F4C6 /* Statement.swift in Sources */, - 3D67B3EA1DB246D100A4F4C6 /* Value.swift in Sources */, - 3D67B3EB1DB246D100A4F4C6 /* FTS4.swift in Sources */, - 3D67B3EC1DB246D100A4F4C6 /* RTree.swift in Sources */, - 3D67B3ED1DB246D100A4F4C6 /* FTS5.swift in Sources */, - 3D67B3EE1DB246D100A4F4C6 /* AggregateFunctions.swift in Sources */, - 3D67B3EF1DB246D100A4F4C6 /* Collation.swift in Sources */, - 3D67B3F01DB246D100A4F4C6 /* CoreFunctions.swift in Sources */, - 3D67B3F11DB246D100A4F4C6 /* CustomFunctions.swift in Sources */, - 3D67B3F21DB246D100A4F4C6 /* Expression.swift in Sources */, - 3D67B3F31DB246D100A4F4C6 /* Operators.swift in Sources */, - 3D67B3F41DB246D100A4F4C6 /* Query.swift in Sources */, - 3D67B3F51DB246D100A4F4C6 /* Schema.swift in Sources */, - 3D67B3F61DB246D100A4F4C6 /* Setter.swift in Sources */, - 3D67B3E71DB246BA00A4F4C6 /* Blob.swift in Sources */, - 3D67B3E81DB246BA00A4F4C6 /* Connection.swift in Sources */, - 19A179CCF9671E345E5A9811 /* Cipher.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EE247ACE1C3F04ED00AE3E12 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - EE247B0F1C3F06E900AE3E12 /* CoreFunctions.swift in Sources */, - EE247B0A1C3F06E900AE3E12 /* RTree.swift in Sources */, - EE247B031C3F06E900AE3E12 /* Blob.swift in Sources */, - EE247B0B1C3F06E900AE3E12 /* Foundation.swift in Sources */, - EE247B041C3F06E900AE3E12 /* Connection.swift in Sources */, - EE247B111C3F06E900AE3E12 /* Expression.swift in Sources */, - EE247B0C1C3F06E900AE3E12 /* Helpers.swift in Sources */, - EE247B0E1C3F06E900AE3E12 /* Collation.swift in Sources */, - EE247B151C3F06E900AE3E12 /* Setter.swift in Sources */, - EE247B101C3F06E900AE3E12 /* CustomFunctions.swift in Sources */, - EE247B091C3F06E900AE3E12 /* FTS4.swift in Sources */, - EE247B081C3F06E900AE3E12 /* Value.swift in Sources */, - EE247B121C3F06E900AE3E12 /* Operators.swift in Sources */, - EE247B141C3F06E900AE3E12 /* Schema.swift in Sources */, - EE247B131C3F06E900AE3E12 /* Query.swift in Sources */, - EE247B061C3F06E900AE3E12 /* SQLite-Bridging.m in Sources */, - EE247B071C3F06E900AE3E12 /* Statement.swift in Sources */, - EE247B0D1C3F06E900AE3E12 /* AggregateFunctions.swift in Sources */, - 19A1717B10CC941ACB5533D6 /* FTS5.swift in Sources */, - 19A171F12AB8B07F2FD7201A /* Cipher.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EE247AD91C3F04ED00AE3E12 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - EE247B261C3F137700AE3E12 /* CoreFunctionsTests.swift in Sources */, - EE247B291C3F137700AE3E12 /* FTS4Tests.swift in Sources */, - EE247B191C3F134A00AE3E12 /* SetterTests.swift in Sources */, - EE247B311C3F141E00AE3E12 /* SchemaTests.swift in Sources */, - EE247B171C3F127200AE3E12 /* TestHelpers.swift in Sources */, - EE247B281C3F137700AE3E12 /* ExpressionTests.swift in Sources */, - EE247B271C3F137700AE3E12 /* CustomFunctionsTests.swift in Sources */, - EE247B341C3F142E00AE3E12 /* StatementTests.swift in Sources */, - EE247B301C3F141E00AE3E12 /* RTreeTests.swift in Sources */, - EE247B231C3F137700AE3E12 /* BlobTests.swift in Sources */, - EE247B351C3F142E00AE3E12 /* ValueTests.swift in Sources */, - EE247B2F1C3F141E00AE3E12 /* QueryTests.swift in Sources */, - EE247B221C3F137700AE3E12 /* AggregateFunctionsTests.swift in Sources */, - EE247B2E1C3F141E00AE3E12 /* OperatorsTests.swift in Sources */, - EE247B251C3F137700AE3E12 /* ConnectionTests.swift in Sources */, - 19A171E6FA242F72A308C594 /* FTS5Tests.swift in Sources */, - 19A17FB80B94E882050AA908 /* FoundationTests.swift in Sources */, - 19A177CC33F2E6A24AF90B02 /* CipherTests.swift in Sources */, - 19A17408007B182F884E3A53 /* Fixtures.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EE247B371C3F3ED000AE3E12 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - EE247B6F1C3F3FEC00AE3E12 /* CoreFunctions.swift in Sources */, - EE247B651C3F3FEC00AE3E12 /* Blob.swift in Sources */, - EE247B6C1C3F3FEC00AE3E12 /* RTree.swift in Sources */, - EE247B681C3F3FEC00AE3E12 /* SQLite-Bridging.m in Sources */, - EE247B6A1C3F3FEC00AE3E12 /* Value.swift in Sources */, - EE247B711C3F3FEC00AE3E12 /* Expression.swift in Sources */, - EE247B631C3F3FDB00AE3E12 /* Foundation.swift in Sources */, - EE247B6E1C3F3FEC00AE3E12 /* Collation.swift in Sources */, - EE247B751C3F3FEC00AE3E12 /* Setter.swift in Sources */, - EE247B701C3F3FEC00AE3E12 /* CustomFunctions.swift in Sources */, - EE247B691C3F3FEC00AE3E12 /* Statement.swift in Sources */, - EE247B641C3F3FDB00AE3E12 /* Helpers.swift in Sources */, - EE247B721C3F3FEC00AE3E12 /* Operators.swift in Sources */, - EE247B741C3F3FEC00AE3E12 /* Schema.swift in Sources */, - EE247B731C3F3FEC00AE3E12 /* Query.swift in Sources */, - EE247B6B1C3F3FEC00AE3E12 /* FTS4.swift in Sources */, - EE247B661C3F3FEC00AE3E12 /* Connection.swift in Sources */, - EE247B6D1C3F3FEC00AE3E12 /* AggregateFunctions.swift in Sources */, - 19A1750CEE9B05267995CF3D /* FTS5.swift in Sources */, - 19A17835FD5886FDC5A3228F /* Cipher.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - EE247B411C3F3ED000AE3E12 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - EE247B561C3F3FC700AE3E12 /* CoreFunctionsTests.swift in Sources */, - EE247B5A1C3F3FC700AE3E12 /* OperatorsTests.swift in Sources */, - EE247B541C3F3FC700AE3E12 /* BlobTests.swift in Sources */, - EE247B5D1C3F3FC700AE3E12 /* SchemaTests.swift in Sources */, - EE247B591C3F3FC700AE3E12 /* FTS4Tests.swift in Sources */, - EE247B531C3F3FC700AE3E12 /* AggregateFunctionsTests.swift in Sources */, - EE247B5F1C3F3FC700AE3E12 /* StatementTests.swift in Sources */, - EE247B5C1C3F3FC700AE3E12 /* RTreeTests.swift in Sources */, - EE247B571C3F3FC700AE3E12 /* CustomFunctionsTests.swift in Sources */, - EE247B601C3F3FC700AE3E12 /* ValueTests.swift in Sources */, - EE247B551C3F3FC700AE3E12 /* ConnectionTests.swift in Sources */, - EE247B611C3F3FC700AE3E12 /* TestHelpers.swift in Sources */, - EE247B581C3F3FC700AE3E12 /* ExpressionTests.swift in Sources */, - EE247B5E1C3F3FC700AE3E12 /* SetterTests.swift in Sources */, - EE247B5B1C3F3FC700AE3E12 /* QueryTests.swift in Sources */, - 19A174D78559CD30679BCCCB /* FTS5Tests.swift in Sources */, - 19A178072B371489E6A1E839 /* FoundationTests.swift in Sources */, - 19A17C4B951CB054EE48AB1C /* CipherTests.swift in Sources */, - 19A1709C3E7A406E62293B2A /* Fixtures.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 03A65E661C6BB0F60062603F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 03A65E591C6BB0F50062603F /* SQLite tvOS */; - targetProxy = 03A65E651C6BB0F60062603F /* PBXContainerItemProxy */; - }; - EE247AE01C3F04ED00AE3E12 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = EE247AD21C3F04ED00AE3E12 /* SQLite iOS */; - targetProxy = EE247ADF1C3F04ED00AE3E12 /* PBXContainerItemProxy */; - }; - EE247B481C3F3ED000AE3E12 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = EE247B3B1C3F3ED000AE3E12 /* SQLite Mac */; - targetProxy = EE247B471C3F3ED000AE3E12 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 03A65E6B1C6BB0F60062603F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; - PRODUCT_NAME = SQLite; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - "SWIFT_INCLUDE_PATHS[sdk=appletvos*]" = "$(SRCROOT)/CocoaPods/appletvos"; - "SWIFT_INCLUDE_PATHS[sdk=appletvsimulator*]" = "$(SRCROOT)/CocoaPods/appletvsimulator"; - SWIFT_VERSION = 3.0; - TVOS_DEPLOYMENT_TARGET = 9.1; - }; - name = Debug; - }; - 03A65E6C1C6BB0F60062603F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; - PRODUCT_NAME = SQLite; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - "SWIFT_INCLUDE_PATHS[sdk=appletvos*]" = "$(SRCROOT)/CocoaPods/appletvos"; - "SWIFT_INCLUDE_PATHS[sdk=appletvsimulator*]" = "$(SRCROOT)/CocoaPods/appletvsimulator"; - SWIFT_VERSION = 3.0; - TVOS_DEPLOYMENT_TARGET = 9.1; - }; - name = Release; - }; - 03A65E6D1C6BB0F60062603F /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = Tests/SQLite/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_VERSION = 3.0; - TVOS_DEPLOYMENT_TARGET = 9.1; - }; - name = Debug; - }; - 03A65E6E1C6BB0F60062603F /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = Tests/SQLite/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = appletvos; - SWIFT_VERSION = 3.0; - TVOS_DEPLOYMENT_TARGET = 9.1; - }; - name = Release; - }; - A121AC4A1CA35C79005A31D1 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; - PRODUCT_NAME = SQLite; - SDKROOT = watchos; - SKIP_INSTALL = YES; - "SWIFT_INCLUDE_PATHS[sdk=watchos*]" = "$(SRCROOT)/CocoaPods/watchos"; - "SWIFT_INCLUDE_PATHS[sdk=watchsimulator*]" = "$(SRCROOT)/CocoaPods/watchsimulator"; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 2.2; - }; - name = Debug; - }; - A121AC4B1CA35C79005A31D1 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ANALYZER_NONNULL = YES; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; - PRODUCT_NAME = SQLite; - SDKROOT = watchos; - SKIP_INSTALL = YES; - "SWIFT_INCLUDE_PATHS[sdk=watchos*]" = "$(SRCROOT)/CocoaPods/watchos"; - "SWIFT_INCLUDE_PATHS[sdk=watchsimulator*]" = "$(SRCROOT)/CocoaPods/watchsimulator"; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 2.2; - }; - name = Release; - }; - EE247AE51C3F04ED00AE3E12 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.9; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = ""; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2,3"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - EE247AE61C3F04ED00AE3E12 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACOSX_DEPLOYMENT_TARGET = 10.9; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = ""; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2,3"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - EE247AE81C3F04ED00AE3E12 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ENABLE_MODULES = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; - PRODUCT_NAME = SQLite; - SKIP_INSTALL = YES; - "SWIFT_INCLUDE_PATHS[sdk=iphoneos*]" = "$(SRCROOT)/CocoaPods/iphoneos"; - "SWIFT_INCLUDE_PATHS[sdk=iphoneos10.0]" = "$(SRCROOT)/CocoaPods/iphoneos-10.0"; - "SWIFT_INCLUDE_PATHS[sdk=iphonesimulator*]" = "$(SRCROOT)/CocoaPods/iphonesimulator"; - "SWIFT_INCLUDE_PATHS[sdk=iphonesimulator10.0]" = "$(SRCROOT)/CocoaPods/iphonesimulator-10.0"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - EE247AE91C3F04ED00AE3E12 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ENABLE_MODULES = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; - PRODUCT_NAME = SQLite; - SKIP_INSTALL = YES; - "SWIFT_INCLUDE_PATHS[sdk=iphoneos*]" = "$(SRCROOT)/CocoaPods/iphoneos"; - "SWIFT_INCLUDE_PATHS[sdk=iphoneos10.0]" = "$(SRCROOT)/CocoaPods/iphoneos-10.0"; - "SWIFT_INCLUDE_PATHS[sdk=iphonesimulator*]" = "$(SRCROOT)/CocoaPods/iphonesimulator"; - "SWIFT_INCLUDE_PATHS[sdk=iphonesimulator10.0]" = "$(SRCROOT)/CocoaPods/iphonesimulator-10.0"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; - EE247AEB1C3F04ED00AE3E12 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = Tests/SQLiteTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - EE247AEC1C3F04ED00AE3E12 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = Tests/SQLiteTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; - EE247B4D1C3F3ED000AE3E12 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = ""; - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_VERSION = A; - INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.9; - PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; - PRODUCT_NAME = SQLite; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_INCLUDE_PATHS = ""; - "SWIFT_INCLUDE_PATHS[sdk=macosx*]" = "$(SRCROOT)/CocoaPods/macosx"; - "SWIFT_INCLUDE_PATHS[sdk=macosx10.11]" = "$(SRCROOT)/CocoaPods/macosx-10.11"; - "SWIFT_INCLUDE_PATHS[sdk=macosx10.12]" = "$(SRCROOT)/CocoaPods/macosx-10.12"; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - EE247B4E1C3F3ED000AE3E12 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CODE_SIGN_IDENTITY = ""; - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_VERSION = A; - INFOPLIST_FILE = "$(SRCROOT)/Sources/SQLite/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.9; - PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLite; - PRODUCT_NAME = SQLite; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_INCLUDE_PATHS = ""; - "SWIFT_INCLUDE_PATHS[sdk=macosx*]" = "$(SRCROOT)/CocoaPods/macosx"; - "SWIFT_INCLUDE_PATHS[sdk=macosx10.11]" = "$(SRCROOT)/CocoaPods/macosx-10.11"; - "SWIFT_INCLUDE_PATHS[sdk=macosx10.12]" = "$(SRCROOT)/CocoaPods/macosx-10.12"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; - EE247B4F1C3F3ED000AE3E12 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Tests/SQLiteTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.11; - PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - EE247B501C3F3ED000AE3E12 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Tests/SQLiteTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.11; - PRODUCT_BUNDLE_IDENTIFIER = com.stephencelis.SQLiteTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 03A65E6F1C6BB0F60062603F /* Build configuration list for PBXNativeTarget "SQLite tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 03A65E6B1C6BB0F60062603F /* Debug */, - 03A65E6C1C6BB0F60062603F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 03A65E701C6BB0F60062603F /* Build configuration list for PBXNativeTarget "SQLiteTests tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 03A65E6D1C6BB0F60062603F /* Debug */, - 03A65E6E1C6BB0F60062603F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - A121AC4C1CA35C79005A31D1 /* Build configuration list for PBXNativeTarget "SQLite watchOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - A121AC4A1CA35C79005A31D1 /* Debug */, - A121AC4B1CA35C79005A31D1 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - EE247ACD1C3F04ED00AE3E12 /* Build configuration list for PBXProject "SQLite" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - EE247AE51C3F04ED00AE3E12 /* Debug */, - EE247AE61C3F04ED00AE3E12 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - EE247AE71C3F04ED00AE3E12 /* Build configuration list for PBXNativeTarget "SQLite iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - EE247AE81C3F04ED00AE3E12 /* Debug */, - EE247AE91C3F04ED00AE3E12 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - EE247AEA1C3F04ED00AE3E12 /* Build configuration list for PBXNativeTarget "SQLiteTests iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - EE247AEB1C3F04ED00AE3E12 /* Debug */, - EE247AEC1C3F04ED00AE3E12 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - EE247B511C3F3ED000AE3E12 /* Build configuration list for PBXNativeTarget "SQLite Mac" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - EE247B4D1C3F3ED000AE3E12 /* Debug */, - EE247B4E1C3F3ED000AE3E12 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - EE247B521C3F3ED000AE3E12 /* Build configuration list for PBXNativeTarget "SQLiteTests Mac" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - EE247B4F1C3F3ED000AE3E12 /* Debug */, - EE247B501C3F3ED000AE3E12 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = EE247ACA1C3F04ED00AE3E12 /* Project object */; -} diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index cd11dc9dd6..0000000000 --- a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite Mac.xcscheme b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite Mac.xcscheme deleted file mode 100644 index 606b5a10e5..0000000000 --- a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite Mac.xcscheme +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite iOS.xcscheme b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite iOS.xcscheme deleted file mode 100644 index 64f32011c5..0000000000 --- a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite iOS.xcscheme +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite tvOS.xcscheme b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite tvOS.xcscheme deleted file mode 100644 index 71ba5f163d..0000000000 --- a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite tvOS.xcscheme +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite watchOS.xcscheme b/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite watchOS.xcscheme deleted file mode 100644 index d2088e817c..0000000000 --- a/Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj/xcshareddata/xcschemes/SQLite watchOS.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Blob.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Blob.swift deleted file mode 100644 index 2f5d2a14f4..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Blob.swift +++ /dev/null @@ -1,60 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -public struct Blob { - - public let bytes: [UInt8] - - public init(bytes: [UInt8]) { - self.bytes = bytes - } - - public init(bytes: UnsafeRawPointer, length: Int) { - let i8bufptr = UnsafeBufferPointer(start: bytes.assumingMemoryBound(to: UInt8.self), count: length) - self.init(bytes: [UInt8](i8bufptr)) - } - - public func toHex() -> String { - return bytes.map { - ($0 < 16 ? "0" : "") + String($0, radix: 16, uppercase: false) - }.joined(separator: "") - } - -} - -extension Blob : CustomStringConvertible { - - public var description: String { - return "x'\(toHex())'" - } - -} - -extension Blob : Equatable { - -} - -public func ==(lhs: Blob, rhs: Blob) -> Bool { - return lhs.bytes == rhs.bytes -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Connection.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Connection.swift deleted file mode 100644 index 0661175664..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Connection.swift +++ /dev/null @@ -1,756 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -import Foundation.NSUUID -import Dispatch -#if SQLITE_SWIFT_STANDALONE -import sqlite3 -#elseif SQLITE_SWIFT_SQLCIPHER -import SQLCipher -#else -import CSQLite -#endif - -/// A connection to SQLite. -public final class Connection { - - /// The location of a SQLite database. - public enum Location { - - /// An in-memory database (equivalent to `.URI(":memory:")`). - /// - /// See: - case inMemory - - /// A temporary, file-backed database (equivalent to `.URI("")`). - /// - /// See: - case temporary - - /// A database located at the given URI filename (or path). - /// - /// See: - /// - /// - Parameter filename: A URI filename - case uri(String) - } - - /// An SQL operation passed to update callbacks. - public enum Operation { - - /// An INSERT operation. - case insert - - /// An UPDATE operation. - case update - - /// A DELETE operation. - case delete - - fileprivate init(rawValue:Int32) { - switch rawValue { - case SQLITE_INSERT: - self = .insert - case SQLITE_UPDATE: - self = .update - case SQLITE_DELETE: - self = .delete - default: - fatalError("unhandled operation code: \(rawValue)") - } - } - } - - public var handle: OpaquePointer { return _handle! } - - fileprivate var _handle: OpaquePointer? = nil - - /// Initializes a new SQLite connection. - /// - /// - Parameters: - /// - /// - location: The location of the database. Creates a new database if it - /// doesn’t already exist (unless in read-only mode). - /// - /// Default: `.InMemory`. - /// - /// - readonly: Whether or not to open the database in a read-only state. - /// - /// Default: `false`. - /// - /// - Returns: A new database connection. - public init(_ location: Location = .inMemory, readonly: Bool = false) throws { - let flags = readonly ? SQLITE_OPEN_READONLY : SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE - try check(sqlite3_open_v2(location.description, &_handle, flags | SQLITE_OPEN_FULLMUTEX, nil)) - queue.setSpecific(key: Connection.queueKey, value: queueContext) - } - - /// Initializes a new connection to a database. - /// - /// - Parameters: - /// - /// - filename: The location of the database. Creates a new database if - /// it doesn’t already exist (unless in read-only mode). - /// - /// - readonly: Whether or not to open the database in a read-only state. - /// - /// Default: `false`. - /// - /// - Throws: `Result.Error` iff a connection cannot be established. - /// - /// - Returns: A new database connection. - public convenience init(_ filename: String, readonly: Bool = false) throws { - try self.init(.uri(filename), readonly: readonly) - } - - deinit { - sqlite3_close(handle) - } - - // MARK: - - - /// Whether or not the database was opened in a read-only state. - public var readonly: Bool { return sqlite3_db_readonly(handle, nil) == 1 } - - /// The last rowid inserted into the database via this connection. - public var lastInsertRowid: Int64 { - return sqlite3_last_insert_rowid(handle) - } - - /// The last number of changes (inserts, updates, or deletes) made to the - /// database via this connection. - public var changes: Int { - return Int(sqlite3_changes(handle)) - } - - /// The total number of changes (inserts, updates, or deletes) made to the - /// database via this connection. - public var totalChanges: Int { - return Int(sqlite3_total_changes(handle)) - } - - // MARK: - Execute - - /// Executes a batch of SQL statements. - /// - /// - Parameter SQL: A batch of zero or more semicolon-separated SQL - /// statements. - /// - /// - Throws: `Result.Error` if query execution fails. - public func execute(_ SQL: String) throws { - _ = try sync { try self.check(sqlite3_exec(self.handle, SQL, nil, nil, nil)) } - } - - // MARK: - Prepare - - /// Prepares a single SQL statement (with optional parameter bindings). - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A list of parameters to bind to the statement. - /// - /// - Returns: A prepared statement. - public func prepare(_ statement: String, _ bindings: Binding?...) throws -> Statement { - if !bindings.isEmpty { return try prepare(statement, bindings) } - return try Statement(self, statement) - } - - /// Prepares a single SQL statement and binds parameters to it. - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A list of parameters to bind to the statement. - /// - /// - Returns: A prepared statement. - public func prepare(_ statement: String, _ bindings: [Binding?]) throws -> Statement { - return try prepare(statement).bind(bindings) - } - - /// Prepares a single SQL statement and binds parameters to it. - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A dictionary of named parameters to bind to the statement. - /// - /// - Returns: A prepared statement. - public func prepare(_ statement: String, _ bindings: [String: Binding?]) throws -> Statement { - return try prepare(statement).bind(bindings) - } - - // MARK: - Run - - /// Runs a single SQL statement (with optional parameter bindings). - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A list of parameters to bind to the statement. - /// - /// - Throws: `Result.Error` if query execution fails. - /// - /// - Returns: The statement. - @discardableResult public func run(_ statement: String, _ bindings: Binding?...) throws -> Statement { - return try run(statement, bindings) - } - - /// Prepares, binds, and runs a single SQL statement. - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A list of parameters to bind to the statement. - /// - /// - Throws: `Result.Error` if query execution fails. - /// - /// - Returns: The statement. - @discardableResult public func run(_ statement: String, _ bindings: [Binding?]) throws -> Statement { - return try prepare(statement).run(bindings) - } - - /// Prepares, binds, and runs a single SQL statement. - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A dictionary of named parameters to bind to the statement. - /// - /// - Throws: `Result.Error` if query execution fails. - /// - /// - Returns: The statement. - @discardableResult public func run(_ statement: String, _ bindings: [String: Binding?]) throws -> Statement { - return try prepare(statement).run(bindings) - } - - // MARK: - Scalar - - /// Runs a single SQL statement (with optional parameter bindings), - /// returning the first value of the first row. - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A list of parameters to bind to the statement. - /// - /// - Returns: The first value of the first row returned. - public func scalar(_ statement: String, _ bindings: Binding?...) throws -> Binding? { - return try scalar(statement, bindings) - } - - /// Runs a single SQL statement (with optional parameter bindings), - /// returning the first value of the first row. - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A list of parameters to bind to the statement. - /// - /// - Returns: The first value of the first row returned. - public func scalar(_ statement: String, _ bindings: [Binding?]) throws -> Binding? { - return try prepare(statement).scalar(bindings) - } - - /// Runs a single SQL statement (with optional parameter bindings), - /// returning the first value of the first row. - /// - /// - Parameters: - /// - /// - statement: A single SQL statement. - /// - /// - bindings: A dictionary of named parameters to bind to the statement. - /// - /// - Returns: The first value of the first row returned. - public func scalar(_ statement: String, _ bindings: [String: Binding?]) throws -> Binding? { - return try prepare(statement).scalar(bindings) - } - - // MARK: - Transactions - - /// The mode in which a transaction acquires a lock. - public enum TransactionMode : String { - - /// Defers locking the database till the first read/write executes. - case deferred = "DEFERRED" - - /// Immediately acquires a reserved lock on the database. - case immediate = "IMMEDIATE" - - /// Immediately acquires an exclusive lock on all databases. - case exclusive = "EXCLUSIVE" - - } - - // TODO: Consider not requiring a throw to roll back? - /// Runs a transaction with the given mode. - /// - /// - Note: Transactions cannot be nested. To nest transactions, see - /// `savepoint()`, instead. - /// - /// - Parameters: - /// - /// - mode: The mode in which a transaction acquires a lock. - /// - /// Default: `.Deferred` - /// - /// - block: A closure to run SQL statements within the transaction. - /// The transaction will be committed when the block returns. The block - /// must throw to roll the transaction back. - /// - /// - Throws: `Result.Error`, and rethrows. - public func transaction(_ mode: TransactionMode = .deferred, block: @escaping () throws -> Void) throws { - try transaction("BEGIN \(mode.rawValue) TRANSACTION", block, "COMMIT TRANSACTION", or: "ROLLBACK TRANSACTION") - } - - // TODO: Consider not requiring a throw to roll back? - // TODO: Consider removing ability to set a name? - /// Runs a transaction with the given savepoint name (if omitted, it will - /// generate a UUID). - /// - /// - SeeAlso: `transaction()`. - /// - /// - Parameters: - /// - /// - savepointName: A unique identifier for the savepoint (optional). - /// - /// - block: A closure to run SQL statements within the transaction. - /// The savepoint will be released (committed) when the block returns. - /// The block must throw to roll the savepoint back. - /// - /// - Throws: `SQLite.Result.Error`, and rethrows. - public func savepoint(_ name: String = UUID().uuidString, block: @escaping () throws -> Void) throws { - let name = name.quote("'") - let savepoint = "SAVEPOINT \(name)" - - try transaction(savepoint, block, "RELEASE \(savepoint)", or: "ROLLBACK TO \(savepoint)") - } - - fileprivate func transaction(_ begin: String, _ block: @escaping () throws -> Void, _ commit: String, or rollback: String) throws { - return try sync { - try self.run(begin) - do { - try block() - } catch { - try self.run(rollback) - throw error - } - try self.run(commit) - } - } - - /// Interrupts any long-running queries. - public func interrupt() { - sqlite3_interrupt(handle) - } - - // MARK: - Handlers - - /// The number of seconds a connection will attempt to retry a statement - /// after encountering a busy signal (lock). - public var busyTimeout: Double = 0 { - didSet { - sqlite3_busy_timeout(handle, Int32(busyTimeout * 1_000)) - } - } - - /// Sets a handler to call after encountering a busy signal (lock). - /// - /// - Parameter callback: This block is executed during a lock in which a - /// busy error would otherwise be returned. It’s passed the number of - /// times it’s been called for this lock. If it returns `true`, it will - /// try again. If it returns `false`, no further attempts will be made. - public func busyHandler(_ callback: ((_ tries: Int) -> Bool)?) { - guard let callback = callback else { - sqlite3_busy_handler(handle, nil, nil) - busyHandler = nil - return - } - - let box: BusyHandler = { callback(Int($0)) ? 1 : 0 } - sqlite3_busy_handler(handle, { callback, tries in - unsafeBitCast(callback, to: BusyHandler.self)(tries) - }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) - busyHandler = box - } - fileprivate typealias BusyHandler = @convention(block) (Int32) -> Int32 - fileprivate var busyHandler: BusyHandler? - - /// Sets a handler to call when a statement is executed with the compiled - /// SQL. - /// - /// - Parameter callback: This block is invoked when a statement is executed - /// with the compiled SQL as its argument. - /// - /// db.trace { SQL in print(SQL) } - public func trace(_ callback: ((String) -> Void)?) { - #if SQLITE_SWIFT_SQLCIPHER - trace_v1(callback) - #else - if #available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) { - trace_v2(callback) - } else { - trace_v1(callback) - } - #endif - } - - fileprivate func trace_v1(_ callback: ((String) -> Void)?) { - guard let callback = callback else { - sqlite3_trace(handle, nil /* xCallback */, nil /* pCtx */) - trace = nil - return - } - let box: Trace = { (pointer: UnsafeRawPointer) in - callback(String(cString: pointer.assumingMemoryBound(to: UInt8.self))) - } - sqlite3_trace(handle, - { - (C: UnsafeMutableRawPointer?, SQL: UnsafePointer?) in - if let C = C, let SQL = SQL { - unsafeBitCast(C, to: Trace.self)(SQL) - } - }, - unsafeBitCast(box, to: UnsafeMutableRawPointer.self) - ) - trace = box - } - - - - - fileprivate typealias Trace = @convention(block) (UnsafeRawPointer) -> Void - fileprivate var trace: Trace? - - /// Registers a callback to be invoked whenever a row is inserted, updated, - /// or deleted in a rowid table. - /// - /// - Parameter callback: A callback invoked with the `Operation` (one of - /// `.Insert`, `.Update`, or `.Delete`), database name, table name, and - /// rowid. - public func updateHook(_ callback: ((_ operation: Operation, _ db: String, _ table: String, _ rowid: Int64) -> Void)?) { - guard let callback = callback else { - sqlite3_update_hook(handle, nil, nil) - updateHook = nil - return - } - - let box: UpdateHook = { - callback( - Operation(rawValue: $0), - String(cString: $1), - String(cString: $2), - $3 - ) - } - sqlite3_update_hook(handle, { callback, operation, db, table, rowid in - unsafeBitCast(callback, to: UpdateHook.self)(operation, db!, table!, rowid) - }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) - updateHook = box - } - fileprivate typealias UpdateHook = @convention(block) (Int32, UnsafePointer, UnsafePointer, Int64) -> Void - fileprivate var updateHook: UpdateHook? - - /// Registers a callback to be invoked whenever a transaction is committed. - /// - /// - Parameter callback: A callback invoked whenever a transaction is - /// committed. If this callback throws, the transaction will be rolled - /// back. - public func commitHook(_ callback: (() throws -> Void)?) { - guard let callback = callback else { - sqlite3_commit_hook(handle, nil, nil) - commitHook = nil - return - } - - let box: CommitHook = { - do { - try callback() - } catch { - return 1 - } - return 0 - } - sqlite3_commit_hook(handle, { callback in - unsafeBitCast(callback, to: CommitHook.self)() - }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) - commitHook = box - } - fileprivate typealias CommitHook = @convention(block) () -> Int32 - fileprivate var commitHook: CommitHook? - - /// Registers a callback to be invoked whenever a transaction rolls back. - /// - /// - Parameter callback: A callback invoked when a transaction is rolled - /// back. - public func rollbackHook(_ callback: (() -> Void)?) { - guard let callback = callback else { - sqlite3_rollback_hook(handle, nil, nil) - rollbackHook = nil - return - } - - let box: RollbackHook = { callback() } - sqlite3_rollback_hook(handle, { callback in - unsafeBitCast(callback, to: RollbackHook.self)() - }, unsafeBitCast(box, to: UnsafeMutableRawPointer.self)) - rollbackHook = box - } - fileprivate typealias RollbackHook = @convention(block) () -> Void - fileprivate var rollbackHook: RollbackHook? - - /// Creates or redefines a custom SQL function. - /// - /// - Parameters: - /// - /// - function: The name of the function to create or redefine. - /// - /// - argumentCount: The number of arguments that the function takes. If - /// `nil`, the function may take any number of arguments. - /// - /// Default: `nil` - /// - /// - deterministic: Whether or not the function is deterministic (_i.e._ - /// the function always returns the same result for a given input). - /// - /// Default: `false` - /// - /// - block: A block of code to run when the function is called. The block - /// is called with an array of raw SQL values mapped to the function’s - /// parameters and should return a raw SQL value (or nil). - public func createFunction(_ function: String, argumentCount: UInt? = nil, deterministic: Bool = false, _ block: @escaping (_ args: [Binding?]) -> Binding?) { - let argc = argumentCount.map { Int($0) } ?? -1 - let box: Function = { context, argc, argv in - let arguments: [Binding?] = (0..?) -> Void - fileprivate var functions = [String: [Int: Function]]() - - /// Defines a new collating sequence. - /// - /// - Parameters: - /// - /// - collation: The name of the collation added. - /// - /// - block: A collation function that takes two strings and returns the - /// comparison result. - public func createCollation(_ collation: String, _ block: @escaping (_ lhs: String, _ rhs: String) -> ComparisonResult) throws { - let box: Collation = { (lhs: UnsafeRawPointer, rhs: UnsafeRawPointer) in - let lstr = String(cString: lhs.assumingMemoryBound(to: UInt8.self)) - let rstr = String(cString: rhs.assumingMemoryBound(to: UInt8.self)) - return Int32(block(lstr, rstr).rawValue) - } - try check(sqlite3_create_collation_v2(handle, collation, SQLITE_UTF8, - unsafeBitCast(box, to: UnsafeMutableRawPointer.self), - { (callback: UnsafeMutableRawPointer?, _, lhs: UnsafeRawPointer?, _, rhs: UnsafeRawPointer?) in /* xCompare */ - if let lhs = lhs, let rhs = rhs { - return unsafeBitCast(callback, to: Collation.self)(lhs, rhs) - } else { - fatalError("sqlite3_create_collation_v2 callback called with NULL pointer") - } - }, nil /* xDestroy */)) - collations[collation] = box - } - fileprivate typealias Collation = @convention(block) (UnsafeRawPointer, UnsafeRawPointer) -> Int32 - fileprivate var collations = [String: Collation]() - - // MARK: - Error Handling - - func sync(_ block: @escaping () throws -> T) rethrows -> T { - var success: T? - var failure: Error? - - let box: () -> Void = { - do { - success = try block() - } catch { - failure = error - } - } - - if DispatchQueue.getSpecific(key: Connection.queueKey) == queueContext { - box() - } else { - queue.sync(execute: box) // FIXME: rdar://problem/21389236 - } - - if let failure = failure { - try { () -> Void in throw failure }() - } - - return success! - } - - @discardableResult func check(_ resultCode: Int32, statement: Statement? = nil) throws -> Int32 { - guard let error = Result(errorCode: resultCode, connection: self, statement: statement) else { - return resultCode - } - - throw error - } - - fileprivate var queue = DispatchQueue(label: "SQLite.Database", attributes: []) - - fileprivate static let queueKey = DispatchSpecificKey() - - fileprivate lazy var queueContext: Int = unsafeBitCast(self, to: Int.self) - -} - -extension Connection : CustomStringConvertible { - - public var description: String { - return String(cString: sqlite3_db_filename(handle, nil)) - } - -} - -extension Connection.Location : CustomStringConvertible { - - public var description: String { - switch self { - case .inMemory: - return ":memory:" - case .temporary: - return "" - case .uri(let URI): - return URI - } - } - -} - -public enum Result : Error { - - fileprivate static let successCodes: Set = [SQLITE_OK, SQLITE_ROW, SQLITE_DONE] - - case error(message: String, code: Int32, statement: Statement?) - - init?(errorCode: Int32, connection: Connection, statement: Statement? = nil) { - guard !Result.successCodes.contains(errorCode) else { return nil } - - let message = String(cString: sqlite3_errmsg(connection.handle)) - self = .error(message: message, code: errorCode, statement: statement) - } - -} - -extension Result : CustomStringConvertible { - - public var description: String { - switch self { - case let .error(message, errorCode, statement): - if let statement = statement { - return "\(message) (\(statement)) (code: \(errorCode))" - } else { - return "\(message) (code: \(errorCode))" - } - } - } -} - -#if !SQLITE_SWIFT_SQLCIPHER -@available(iOS 10.0, OSX 10.12, tvOS 10.0, watchOS 3.0, *) -extension Connection { - fileprivate func trace_v2(_ callback: ((String) -> Void)?) { - guard let callback = callback else { - // If the X callback is NULL or if the M mask is zero, then tracing is disabled. - sqlite3_trace_v2(handle, 0 /* mask */, nil /* xCallback */, nil /* pCtx */) - trace = nil - return - } - - let box: Trace = { (pointer: UnsafeRawPointer) in - callback(String(cString: pointer.assumingMemoryBound(to: UInt8.self))) - } - sqlite3_trace_v2(handle, - UInt32(SQLITE_TRACE_STMT) /* mask */, - { - // A trace callback is invoked with four arguments: callback(T,C,P,X). - // The T argument is one of the SQLITE_TRACE constants to indicate why the - // callback was invoked. The C argument is a copy of the context pointer. - // The P and X arguments are pointers whose meanings depend on T. - (T: UInt32, C: UnsafeMutableRawPointer?, P: UnsafeMutableRawPointer?, X: UnsafeMutableRawPointer?) in - if let P = P, - let expandedSQL = sqlite3_expanded_sql(OpaquePointer(P)) { - unsafeBitCast(C, to: Trace.self)(expandedSQL) - sqlite3_free(expandedSQL) - } - return Int32(0) // currently ignored - }, - unsafeBitCast(box, to: UnsafeMutableRawPointer.self) /* pCtx */ - ) - trace = box - } -} -#endif diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Statement.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Statement.swift deleted file mode 100644 index 766bd15b1f..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Statement.swift +++ /dev/null @@ -1,297 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -#if SQLITE_SWIFT_STANDALONE -import sqlite3 -#elseif SQLITE_SWIFT_SQLCIPHER -import SQLCipher -#else -import CSQLite -#endif - -/// A single SQL statement. -public final class Statement { - - fileprivate var handle: OpaquePointer? = nil - - fileprivate let connection: Connection - - init(_ connection: Connection, _ SQL: String) throws { - self.connection = connection - try connection.check(sqlite3_prepare_v2(connection.handle, SQL, -1, &handle, nil)) - } - - deinit { - sqlite3_finalize(handle) - } - - public lazy var columnCount: Int = Int(sqlite3_column_count(self.handle)) - - public lazy var columnNames: [String] = (0.. Statement { - return bind(values) - } - - /// Binds a list of parameters to a statement. - /// - /// - Parameter values: A list of parameters to bind to the statement. - /// - /// - Returns: The statement object (useful for chaining). - public func bind(_ values: [Binding?]) -> Statement { - if values.isEmpty { return self } - reset() - guard values.count == Int(sqlite3_bind_parameter_count(handle)) else { - fatalError("\(sqlite3_bind_parameter_count(handle)) values expected, \(values.count) passed") - } - for idx in 1...values.count { bind(values[idx - 1], atIndex: idx) } - return self - } - - /// Binds a dictionary of named parameters to a statement. - /// - /// - Parameter values: A dictionary of named parameters to bind to the - /// statement. - /// - /// - Returns: The statement object (useful for chaining). - public func bind(_ values: [String: Binding?]) -> Statement { - reset() - for (name, value) in values { - let idx = sqlite3_bind_parameter_index(handle, name) - guard idx > 0 else { - fatalError("parameter not found: \(name)") - } - bind(value, atIndex: Int(idx)) - } - return self - } - - fileprivate func bind(_ value: Binding?, atIndex idx: Int) { - if value == nil { - sqlite3_bind_null(handle, Int32(idx)) - } else if let value = value as? Blob { - sqlite3_bind_blob(handle, Int32(idx), value.bytes, Int32(value.bytes.count), SQLITE_TRANSIENT) - } else if let value = value as? Double { - sqlite3_bind_double(handle, Int32(idx), value) - } else if let value = value as? Int64 { - sqlite3_bind_int64(handle, Int32(idx), value) - } else if let value = value as? String { - sqlite3_bind_text(handle, Int32(idx), value, -1, SQLITE_TRANSIENT) - } else if let value = value as? Int { - self.bind(value.datatypeValue, atIndex: idx) - } else if let value = value as? Bool { - self.bind(value.datatypeValue, atIndex: idx) - } else if let value = value { - fatalError("tried to bind unexpected value \(value)") - } - } - - /// - Parameter bindings: A list of parameters to bind to the statement. - /// - /// - Throws: `Result.Error` if query execution fails. - /// - /// - Returns: The statement object (useful for chaining). - @discardableResult public func run(_ bindings: Binding?...) throws -> Statement { - guard bindings.isEmpty else { - return try run(bindings) - } - - reset(clearBindings: false) - repeat {} while try step() - return self - } - - /// - Parameter bindings: A list of parameters to bind to the statement. - /// - /// - Throws: `Result.Error` if query execution fails. - /// - /// - Returns: The statement object (useful for chaining). - @discardableResult public func run(_ bindings: [Binding?]) throws -> Statement { - return try bind(bindings).run() - } - - /// - Parameter bindings: A dictionary of named parameters to bind to the - /// statement. - /// - /// - Throws: `Result.Error` if query execution fails. - /// - /// - Returns: The statement object (useful for chaining). - @discardableResult public func run(_ bindings: [String: Binding?]) throws -> Statement { - return try bind(bindings).run() - } - - /// - Parameter bindings: A list of parameters to bind to the statement. - /// - /// - Returns: The first value of the first row returned. - public func scalar(_ bindings: Binding?...) throws -> Binding? { - guard bindings.isEmpty else { - return try scalar(bindings) - } - - reset(clearBindings: false) - _ = try step() - return row[0] - } - - /// - Parameter bindings: A list of parameters to bind to the statement. - /// - /// - Returns: The first value of the first row returned. - public func scalar(_ bindings: [Binding?]) throws -> Binding? { - return try bind(bindings).scalar() - } - - - /// - Parameter bindings: A dictionary of named parameters to bind to the - /// statement. - /// - /// - Returns: The first value of the first row returned. - public func scalar(_ bindings: [String: Binding?]) throws -> Binding? { - return try bind(bindings).scalar() - } - - public func step() throws -> Bool { - return try connection.sync { try self.connection.check(sqlite3_step(self.handle)) == SQLITE_ROW } - } - - fileprivate func reset(clearBindings shouldClear: Bool = true) { - sqlite3_reset(handle) - if (shouldClear) { sqlite3_clear_bindings(handle) } - } - -} - -extension Statement : Sequence { - - public func makeIterator() -> Statement { - reset(clearBindings: false) - return self - } - -} - -extension Statement : IteratorProtocol { - - public func next() -> [Binding?]? { - return try! step() ? Array(row) : nil - } - -} - -extension Statement : CustomStringConvertible { - - public var description: String { - return String(cString: sqlite3_sql(handle)) - } - -} - -public struct Cursor { - - fileprivate let handle: OpaquePointer - - fileprivate let columnCount: Int - - fileprivate init(_ statement: Statement) { - handle = statement.handle! - columnCount = statement.columnCount - } - - public subscript(idx: Int) -> Double { - return sqlite3_column_double(handle, Int32(idx)) - } - - public subscript(idx: Int) -> Int64 { - return sqlite3_column_int64(handle, Int32(idx)) - } - - public subscript(idx: Int) -> String { - return String(cString: UnsafePointer(sqlite3_column_text(handle, Int32(idx)))) - } - - public subscript(idx: Int) -> Blob { - if let pointer = sqlite3_column_blob(handle, Int32(idx)) { - let length = Int(sqlite3_column_bytes(handle, Int32(idx))) - return Blob(bytes: pointer, length: length) - } else { - // The return value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. - // https://www.sqlite.org/c3ref/column_blob.html - return Blob(bytes: []) - } - } - - // MARK: - - - public subscript(idx: Int) -> Bool { - return Bool.fromDatatypeValue(self[idx]) - } - - public subscript(idx: Int) -> Int { - return Int.fromDatatypeValue(self[idx]) - } - -} - -/// Cursors provide direct access to a statement’s current row. -extension Cursor : Sequence { - - public subscript(idx: Int) -> Binding? { - switch sqlite3_column_type(handle, Int32(idx)) { - case SQLITE_BLOB: - return self[idx] as Blob - case SQLITE_FLOAT: - return self[idx] as Double - case SQLITE_INTEGER: - return self[idx] as Int64 - case SQLITE_NULL: - return nil - case SQLITE_TEXT: - return self[idx] as String - case let type: - fatalError("unsupported column type: \(type)") - } - } - - public func makeIterator() -> AnyIterator { - var idx = 0 - return AnyIterator { - if idx >= self.columnCount { - return Optional.none - } else { - idx += 1 - return self[idx - 1] - } - } - } - -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Value.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Value.swift deleted file mode 100644 index 608f0ce6fe..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Core/Value.swift +++ /dev/null @@ -1,132 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -/// - Warning: `Binding` is a protocol that SQLite.swift uses internally to -/// directly map SQLite types to Swift types. -/// -/// Do not conform custom types to the Binding protocol. See the `Value` -/// protocol, instead. -public protocol Binding {} - -public protocol Number : Binding {} - -public protocol Value : Expressible { // extensions cannot have inheritance clauses - - associatedtype ValueType = Self - - associatedtype Datatype : Binding - - static var declaredDatatype: String { get } - - static func fromDatatypeValue(_ datatypeValue: Datatype) -> ValueType - - var datatypeValue: Datatype { get } - -} - -extension Double : Number, Value { - - public static let declaredDatatype = "REAL" - - public static func fromDatatypeValue(_ datatypeValue: Double) -> Double { - return datatypeValue - } - - public var datatypeValue: Double { - return self - } - -} - -extension Int64 : Number, Value { - - public static let declaredDatatype = "INTEGER" - - public static func fromDatatypeValue(_ datatypeValue: Int64) -> Int64 { - return datatypeValue - } - - public var datatypeValue: Int64 { - return self - } - -} - -extension String : Binding, Value { - - public static let declaredDatatype = "TEXT" - - public static func fromDatatypeValue(_ datatypeValue: String) -> String { - return datatypeValue - } - - public var datatypeValue: String { - return self - } - -} - -extension Blob : Binding, Value { - - public static let declaredDatatype = "BLOB" - - public static func fromDatatypeValue(_ datatypeValue: Blob) -> Blob { - return datatypeValue - } - - public var datatypeValue: Blob { - return self - } - -} - -// MARK: - - -extension Bool : Binding, Value { - - public static var declaredDatatype = Int64.declaredDatatype - - public static func fromDatatypeValue(_ datatypeValue: Int64) -> Bool { - return datatypeValue != 0 - } - - public var datatypeValue: Int64 { - return self ? 1 : 0 - } - -} - -extension Int : Number, Value { - - public static var declaredDatatype = Int64.declaredDatatype - - public static func fromDatatypeValue(_ datatypeValue: Int64) -> Int { - return Int(datatypeValue) - } - - public var datatypeValue: Int64 { - return Int64(self) - } - -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/Cipher.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/Cipher.swift deleted file mode 100644 index 6c0d465781..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/Cipher.swift +++ /dev/null @@ -1,61 +0,0 @@ -#if SQLITE_SWIFT_SQLCIPHER -import SQLCipher - - -/// Extension methods for [SQLCipher](https://www.zetetic.net/sqlcipher/). -/// @see [sqlcipher api](https://www.zetetic.net/sqlcipher/sqlcipher-api/) -extension Connection { - - /// Specify the key for an encrypted database. This routine should be - /// called right after sqlite3_open(). - /// - /// @param key The key to use.The key itself can be a passphrase, which is converted to a key - /// using [PBKDF2](https://en.wikipedia.org/wiki/PBKDF2) key derivation. The result - /// is used as the encryption key for the database. - /// - /// Alternatively, it is possible to specify an exact byte sequence using a blob literal. - /// With this method, it is the calling application's responsibility to ensure that the data - /// provided is a 64 character hex string, which will be converted directly to 32 bytes (256 bits) - /// of key data. - /// e.g. x'2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99' - /// @param db name of the database, defaults to 'main' - public func key(_ key: String, db: String = "main") throws { - try _key_v2(db: db, keyPointer: key, keySize: key.utf8.count) - } - - public func key(_ key: Blob, db: String = "main") throws { - try _key_v2(db: db, keyPointer: key.bytes, keySize: key.bytes.count) - } - - - /// Change the key on an open database. If the current database is not encrypted, this routine - /// will encrypt it. - /// To change the key on an existing encrypted database, it must first be unlocked with the - /// current encryption key. Once the database is readable and writeable, rekey can be used - /// to re-encrypt every page in the database with a new key. - public func rekey(_ key: String, db: String = "main") throws { - try _rekey_v2(db: db, keyPointer: key, keySize: key.utf8.count) - } - - public func rekey(_ key: Blob, db: String = "main") throws { - try _rekey_v2(db: db, keyPointer: key.bytes, keySize: key.bytes.count) - } - - // MARK: - private - private func _key_v2(db: String, keyPointer: UnsafePointer, keySize: Int) throws { - try check(sqlite3_key_v2(handle, db, keyPointer, Int32(keySize))) - try cipher_key_check() - } - - private func _rekey_v2(db: String, keyPointer: UnsafePointer, keySize: Int) throws { - try check(sqlite3_rekey_v2(handle, db, keyPointer, Int32(keySize))) - } - - // When opening an existing database, sqlite3_key_v2 will not immediately throw an error if - // the key provided is incorrect. To test that the database can be successfully opened with the - // provided key, it is necessary to perform some operation on the database (i.e. read from it). - private func cipher_key_check() throws { - try scalar("SELECT count(*) FROM sqlite_master;") - } -} -#endif diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift deleted file mode 100644 index 152a29219e..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS4.swift +++ /dev/null @@ -1,346 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -#if SWIFT_PACKAGE -import SQLiteObjc -#endif - -extension Module { - - public static func FTS4(_ column: Expressible, _ more: Expressible...) -> Module { - return FTS4([column] + more) - } - - public static func FTS4(_ columns: [Expressible] = [], tokenize tokenizer: Tokenizer? = nil) -> Module { - return FTS4(FTS4Config().columns(columns).tokenizer(tokenizer)) - } - - public static func FTS4(_ config: FTS4Config) -> Module { - return Module(name: "fts4", arguments: config.arguments()) - } -} - -extension VirtualTable { - - /// Builds an expression appended with a `MATCH` query against the given - /// pattern. - /// - /// let emails = VirtualTable("emails") - /// - /// emails.filter(emails.match("Hello")) - /// // SELECT * FROM "emails" WHERE "emails" MATCH 'Hello' - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: An expression appended with a `MATCH` query against the given - /// pattern. - public func match(_ pattern: String) -> Expression { - return "MATCH".infix(tableName(), pattern) - } - - public func match(_ pattern: Expression) -> Expression { - return "MATCH".infix(tableName(), pattern) - } - - public func match(_ pattern: Expression) -> Expression { - return "MATCH".infix(tableName(), pattern) - } - - /// Builds a copy of the query with a `WHERE … MATCH` clause. - /// - /// let emails = VirtualTable("emails") - /// - /// emails.match("Hello") - /// // SELECT * FROM "emails" WHERE "emails" MATCH 'Hello' - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A query with the given `WHERE … MATCH` clause applied. - public func match(_ pattern: String) -> QueryType { - return filter(match(pattern)) - } - - public func match(_ pattern: Expression) -> QueryType { - return filter(match(pattern)) - } - - public func match(_ pattern: Expression) -> QueryType { - return filter(match(pattern)) - } - -} - -public struct Tokenizer { - - public static let Simple = Tokenizer("simple") - - public static let Porter = Tokenizer("porter") - - public static func Unicode61(removeDiacritics: Bool? = nil, tokenchars: Set = [], separators: Set = []) -> Tokenizer { - var arguments = [String]() - - if let removeDiacritics = removeDiacritics { - arguments.append("removeDiacritics=\(removeDiacritics ? 1 : 0)".quote()) - } - - if !tokenchars.isEmpty { - let joined = tokenchars.map { String($0) }.joined(separator: "") - arguments.append("tokenchars=\(joined)".quote()) - } - - if !separators.isEmpty { - let joined = separators.map { String($0) }.joined(separator: "") - arguments.append("separators=\(joined)".quote()) - } - - return Tokenizer("unicode61", arguments) - } - - public static func Custom(_ name: String) -> Tokenizer { - return Tokenizer(Tokenizer.moduleName.quote(), [name.quote()]) - } - - public let name: String - - public let arguments: [String] - - fileprivate init(_ name: String, _ arguments: [String] = []) { - self.name = name - self.arguments = arguments - } - - fileprivate static let moduleName = "SQLite.swift" - -} - -extension Tokenizer : CustomStringConvertible { - - public var description: String { - return ([name] + arguments).joined(separator: " ") - } - -} - -extension Connection { - - public func registerTokenizer(_ submoduleName: String, next: @escaping (String) -> (String, Range)?) throws { - try check(_SQLiteRegisterTokenizer(handle, Tokenizer.moduleName, submoduleName) { input, offset, length in - let string = String(cString: input) - - guard let (token, range) = next(string) else { return nil } - - let view = string.utf8 - offset.pointee += string.substring(to: range.lowerBound).utf8.count - length.pointee = Int32(view.distance(from: range.lowerBound.samePosition(in: view), to: range.upperBound.samePosition(in: view))) - return token - }) - } - -} - -/// Configuration options shared between the [FTS4](https://www.sqlite.org/fts3.html) and -/// [FTS5](https://www.sqlite.org/fts5.html) extensions. -open class FTSConfig { - public enum ColumnOption { - /// [The notindexed= option](https://www.sqlite.org/fts3.html#section_6_5) - case unindexed - } - - typealias ColumnDefinition = (Expressible, options: [ColumnOption]) - var columnDefinitions = [ColumnDefinition]() - var tokenizer: Tokenizer? - var prefixes = [Int]() - var externalContentSchema: SchemaType? - var isContentless: Bool = false - - /// Adds a column definition - @discardableResult open func column(_ column: Expressible, _ options: [ColumnOption] = []) -> Self { - self.columnDefinitions.append((column, options)) - return self - } - - @discardableResult open func columns(_ columns: [Expressible]) -> Self { - for column in columns { - self.column(column) - } - return self - } - - /// [Tokenizers](https://www.sqlite.org/fts3.html#tokenizer) - open func tokenizer(_ tokenizer: Tokenizer?) -> Self { - self.tokenizer = tokenizer - return self - } - - /// [The prefix= option](https://www.sqlite.org/fts3.html#section_6_6) - open func prefix(_ prefix: [Int]) -> Self { - self.prefixes += prefix - return self - } - - /// [The content= option](https://www.sqlite.org/fts3.html#section_6_2) - open func externalContent(_ schema: SchemaType) -> Self { - self.externalContentSchema = schema - return self - } - - /// [Contentless FTS4 Tables](https://www.sqlite.org/fts3.html#section_6_2_1) - open func contentless() -> Self { - self.isContentless = true - return self - } - - func formatColumnDefinitions() -> [Expressible] { - return columnDefinitions.map { $0.0 } - } - - func arguments() -> [Expressible] { - return options().arguments - } - - func options() -> Options { - var options = Options() - options.append(formatColumnDefinitions()) - if let tokenizer = tokenizer { - options.append("tokenize", value: Expression(literal: tokenizer.description)) - } - options.appendCommaSeparated("prefix", values:prefixes.sorted().map { String($0) }) - if isContentless { - options.append("content", value: "") - } else if let externalContentSchema = externalContentSchema { - options.append("content", value: externalContentSchema.tableName()) - } - return options - } - - struct Options { - var arguments = [Expressible]() - - @discardableResult mutating func append(_ columns: [Expressible]) -> Options { - arguments.append(contentsOf: columns) - return self - } - - @discardableResult mutating func appendCommaSeparated(_ key: String, values: [String]) -> Options { - if values.isEmpty { - return self - } else { - return append(key, value: values.joined(separator: ",")) - } - } - - @discardableResult mutating func append(_ key: String, value: CustomStringConvertible?) -> Options { - return append(key, value: value?.description) - } - - @discardableResult mutating func append(_ key: String, value: String?) -> Options { - return append(key, value: value.map { Expression($0) }) - } - - @discardableResult mutating func append(_ key: String, value: Expressible?) -> Options { - if let value = value { - arguments.append("=".join([Expression(literal: key), value])) - } - return self - } - } -} - -/// Configuration for the [FTS4](https://www.sqlite.org/fts3.html) extension. -open class FTS4Config : FTSConfig { - /// [The matchinfo= option](https://www.sqlite.org/fts3.html#section_6_4) - public enum MatchInfo : CustomStringConvertible { - case fts3 - public var description: String { - return "fts3" - } - } - - /// [FTS4 options](https://www.sqlite.org/fts3.html#fts4_options) - public enum Order : CustomStringConvertible { - /// Data structures are optimized for returning results in ascending order by docid (default) - case asc - /// FTS4 stores its data in such a way as to optimize returning results in descending order by docid. - case desc - - public var description: String { - switch self { - case .asc: return "asc" - case .desc: return "desc" - } - } - } - - var compressFunction: String? - var uncompressFunction: String? - var languageId: String? - var matchInfo: MatchInfo? - var order: Order? - - override public init() { - } - - /// [The compress= and uncompress= options](https://www.sqlite.org/fts3.html#section_6_1) - open func compress(_ functionName: String) -> Self { - self.compressFunction = functionName - return self - } - - /// [The compress= and uncompress= options](https://www.sqlite.org/fts3.html#section_6_1) - open func uncompress(_ functionName: String) -> Self { - self.uncompressFunction = functionName - return self - } - - /// [The languageid= option](https://www.sqlite.org/fts3.html#section_6_3) - open func languageId(_ columnName: String) -> Self { - self.languageId = columnName - return self - } - - /// [The matchinfo= option](https://www.sqlite.org/fts3.html#section_6_4) - open func matchInfo(_ matchInfo: MatchInfo) -> Self { - self.matchInfo = matchInfo - return self - } - - /// [FTS4 options](https://www.sqlite.org/fts3.html#fts4_options) - open func order(_ order: Order) -> Self { - self.order = order - return self - } - - override func options() -> Options { - var options = super.options() - for (column, _) in (columnDefinitions.filter { $0.options.contains(.unindexed) }) { - options.append("notindexed", value: column) - } - options.append("languageid", value: languageId) - options.append("compress", value: compressFunction) - options.append("uncompress", value: uncompressFunction) - options.append("matchinfo", value: matchInfo) - options.append("order", value: order) - return options - } -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift deleted file mode 100644 index 763927ff48..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/FTS5.swift +++ /dev/null @@ -1,97 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -extension Module { - public static func FTS5(_ config: FTS5Config) -> Module { - return Module(name: "fts5", arguments: config.arguments()) - } -} - -/// Configuration for the [FTS5](https://www.sqlite.org/fts5.html) extension. -/// -/// **Note:** this is currently only applicable when using SQLite.swift together with a FTS5-enabled version -/// of SQLite. -open class FTS5Config : FTSConfig { - public enum Detail : CustomStringConvertible { - /// store rowid, column number, term offset - case full - /// store rowid, column number - case column - /// store rowid - case none - - public var description: String { - switch self { - case .full: return "full" - case .column: return "column" - case .none: return "none" - } - } - } - - var detail: Detail? - var contentRowId: Expressible? - var columnSize: Int? - - override public init() { - } - - /// [External Content Tables](https://www.sqlite.org/fts5.html#section_4_4_2) - open func contentRowId(_ column: Expressible) -> Self { - self.contentRowId = column - return self - } - - /// [The Columnsize Option](https://www.sqlite.org/fts5.html#section_4_5) - open func columnSize(_ size: Int) -> Self { - self.columnSize = size - return self - } - - /// [The Detail Option](https://www.sqlite.org/fts5.html#section_4_6) - open func detail(_ detail: Detail) -> Self { - self.detail = detail - return self - } - - override func options() -> Options { - var options = super.options() - options.append("content_rowid", value: contentRowId) - if let columnSize = columnSize { - options.append("columnsize", value: Expression(value: columnSize)) - } - options.append("detail", value: detail) - return options - } - - override func formatColumnDefinitions() -> [Expressible] { - return columnDefinitions.map { definition in - if definition.options.contains(.unindexed) { - return " ".join([definition.0, Expression(literal: "UNINDEXED")]) - } else { - return definition.0 - } - } - } -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/RTree.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/RTree.swift deleted file mode 100644 index 4fc1a23539..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Extensions/RTree.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -extension Module { - - public static func RTree(_ primaryKey: Expression, _ pairs: (Expression, Expression)...) -> Module where T.Datatype == Int64, U.Datatype == Double { - var arguments: [Expressible] = [primaryKey] - - for pair in pairs { - arguments.append(contentsOf: [pair.0, pair.1] as [Expressible]) - } - - return Module(name: "rtree", arguments: arguments) - } - -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Foundation.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Foundation.swift deleted file mode 100644 index 5e102297b9..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Foundation.swift +++ /dev/null @@ -1,108 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -import Foundation - -extension Data : Value { - - public static var declaredDatatype: String { - return Blob.declaredDatatype - } - - public static func fromDatatypeValue(_ dataValue: Blob) -> Data { - return Data(bytes: dataValue.bytes) - } - - public var datatypeValue: Blob { - return withUnsafeBytes { (pointer: UnsafePointer) -> Blob in - return Blob(bytes: pointer, length: count) - } - } - -} - -extension Date : Value { - - public static var declaredDatatype: String { - return String.declaredDatatype - } - - public static func fromDatatypeValue(_ stringValue: String) -> Date { - return dateFormatter.date(from: stringValue)! - } - - public var datatypeValue: String { - return dateFormatter.string(from: self) - } - -} - -/// A global date formatter used to serialize and deserialize `NSDate` objects. -/// If multiple date formats are used in an application’s database(s), use a -/// custom `Value` type per additional format. -public var dateFormatter: DateFormatter = { - let formatter = DateFormatter() - formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS" - formatter.locale = Locale(identifier: "en_US_POSIX") - formatter.timeZone = TimeZone(secondsFromGMT: 0) - return formatter -}() - -// FIXME: rdar://problem/18673897 // subscript… - -extension QueryType { - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - -} - -extension Row { - - public subscript(column: Expression) -> Data { - return get(column) - } - public subscript(column: Expression) -> Data? { - return get(column) - } - - public subscript(column: Expression) -> Date { - return get(column) - } - public subscript(column: Expression) -> Date? { - return get(column) - } - -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Helpers.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Helpers.swift deleted file mode 100644 index 81a7507ede..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Helpers.swift +++ /dev/null @@ -1,130 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -#if SQLITE_SWIFT_STANDALONE -import sqlite3 -#elseif SQLITE_SWIFT_SQLCIPHER -import SQLCipher -#else -import CSQLite -#endif - -public typealias Star = (Expression?, Expression?) -> Expression - -public func *(_: Expression?, _: Expression?) -> Expression { - return Expression(literal: "*") -} - -public protocol _OptionalType { - - associatedtype WrappedType - -} - -extension Optional : _OptionalType { - - public typealias WrappedType = Wrapped - -} - -// let SQLITE_STATIC = unsafeBitCast(0, sqlite3_destructor_type.self) -let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self) - -extension String { - - func quote(_ mark: Character = "\"") -> String { - let escaped = characters.reduce("") { string, character in - string + (character == mark ? "\(mark)\(mark)" : "\(character)") - } - return "\(mark)\(escaped)\(mark)" - } - - func join(_ expressions: [Expressible]) -> Expressible { - var (template, bindings) = ([String](), [Binding?]()) - for expressible in expressions { - let expression = expressible.expression - template.append(expression.template) - bindings.append(contentsOf: expression.bindings) - } - return Expression(template.joined(separator: self), bindings) - } - - func infix(_ lhs: Expressible, _ rhs: Expressible, wrap: Bool = true) -> Expression { - let expression = Expression(" \(self) ".join([lhs, rhs]).expression) - guard wrap else { - return expression - } - return "".wrap(expression) - } - - func prefix(_ expressions: Expressible) -> Expressible { - return "\(self) ".wrap(expressions) as Expression - } - - func prefix(_ expressions: [Expressible]) -> Expressible { - return "\(self) ".wrap(expressions) as Expression - } - - func wrap(_ expression: Expressible) -> Expression { - return Expression("\(self)(\(expression.expression.template))", expression.expression.bindings) - } - - func wrap(_ expressions: [Expressible]) -> Expression { - return wrap(", ".join(expressions)) - } - -} - -func infix(_ lhs: Expressible, _ rhs: Expressible, wrap: Bool = true, function: String = #function) -> Expression { - return function.infix(lhs, rhs, wrap: wrap) -} - -func wrap(_ expression: Expressible, function: String = #function) -> Expression { - return function.wrap(expression) -} - -func wrap(_ expressions: [Expressible], function: String = #function) -> Expression { - return function.wrap(", ".join(expressions)) -} - -func transcode(_ literal: Binding?) -> String { - guard let literal = literal else { return "NULL" } - - switch literal { - case let blob as Blob: - return blob.description - case let string as String: - return string.quote("'") - case let binding: - return "\(binding)" - } -} - -func value(_ v: Binding) -> A { - return A.fromDatatypeValue(v as! A.Datatype) as! A -} - -func value(_ v: Binding?) -> A { - return value(v!) -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Info.plist b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Info.plist deleted file mode 100644 index 588139c437..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 0.11.2 - CFBundleSignature - ???? - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSPrincipalClass - - - diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/SQLite.h b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/SQLite.h deleted file mode 100644 index 693ce323cf..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/SQLite.h +++ /dev/null @@ -1,6 +0,0 @@ -@import Foundation; - -FOUNDATION_EXPORT double SQLiteVersionNumber; -FOUNDATION_EXPORT const unsigned char SQLiteVersionString[]; - -#import diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift deleted file mode 100644 index 249bbe60cd..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/AggregateFunctions.swift +++ /dev/null @@ -1,251 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -extension ExpressionType where UnderlyingType : Value { - - /// Builds a copy of the expression prefixed with the `DISTINCT` keyword. - /// - /// let name = Expression("name") - /// name.distinct - /// // DISTINCT "name" - /// - /// - Returns: A copy of the expression prefixed with the `DISTINCT` - /// keyword. - public var distinct: Expression { - return Expression("DISTINCT \(template)", bindings) - } - - /// Builds a copy of the expression wrapped with the `count` aggregate - /// function. - /// - /// let name = Expression("name") - /// name.count - /// // count("name") - /// name.distinct.count - /// // count(DISTINCT "name") - /// - /// - Returns: A copy of the expression wrapped with the `count` aggregate - /// function. - public var count: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value { - - /// Builds a copy of the expression prefixed with the `DISTINCT` keyword. - /// - /// let name = Expression("name") - /// name.distinct - /// // DISTINCT "name" - /// - /// - Returns: A copy of the expression prefixed with the `DISTINCT` - /// keyword. - public var distinct: Expression { - return Expression("DISTINCT \(template)", bindings) - } - - /// Builds a copy of the expression wrapped with the `count` aggregate - /// function. - /// - /// let name = Expression("name") - /// name.count - /// // count("name") - /// name.distinct.count - /// // count(DISTINCT "name") - /// - /// - Returns: A copy of the expression wrapped with the `count` aggregate - /// function. - public var count: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType : Value, UnderlyingType.Datatype : Comparable { - - /// Builds a copy of the expression wrapped with the `max` aggregate - /// function. - /// - /// let age = Expression("age") - /// age.max - /// // max("age") - /// - /// - Returns: A copy of the expression wrapped with the `max` aggregate - /// function. - public var max: Expression { - return wrap(self) - } - - /// Builds a copy of the expression wrapped with the `min` aggregate - /// function. - /// - /// let age = Expression("age") - /// age.min - /// // min("age") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var min: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value, UnderlyingType.WrappedType.Datatype : Comparable { - - /// Builds a copy of the expression wrapped with the `max` aggregate - /// function. - /// - /// let age = Expression("age") - /// age.max - /// // max("age") - /// - /// - Returns: A copy of the expression wrapped with the `max` aggregate - /// function. - public var max: Expression { - return wrap(self) - } - - /// Builds a copy of the expression wrapped with the `min` aggregate - /// function. - /// - /// let age = Expression("age") - /// age.min - /// // min("age") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var min: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType : Value, UnderlyingType.Datatype : Number { - - /// Builds a copy of the expression wrapped with the `avg` aggregate - /// function. - /// - /// let salary = Expression("salary") - /// salary.average - /// // avg("salary") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var average: Expression { - return "avg".wrap(self) - } - - /// Builds a copy of the expression wrapped with the `sum` aggregate - /// function. - /// - /// let salary = Expression("salary") - /// salary.sum - /// // sum("salary") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var sum: Expression { - return wrap(self) - } - - /// Builds a copy of the expression wrapped with the `total` aggregate - /// function. - /// - /// let salary = Expression("salary") - /// salary.total - /// // total("salary") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var total: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value, UnderlyingType.WrappedType.Datatype : Number { - - /// Builds a copy of the expression wrapped with the `avg` aggregate - /// function. - /// - /// let salary = Expression("salary") - /// salary.average - /// // avg("salary") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var average: Expression { - return "avg".wrap(self) - } - - /// Builds a copy of the expression wrapped with the `sum` aggregate - /// function. - /// - /// let salary = Expression("salary") - /// salary.sum - /// // sum("salary") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var sum: Expression { - return wrap(self) - } - - /// Builds a copy of the expression wrapped with the `total` aggregate - /// function. - /// - /// let salary = Expression("salary") - /// salary.total - /// // total("salary") - /// - /// - Returns: A copy of the expression wrapped with the `min` aggregate - /// function. - public var total: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType == Int { - - static func count(_ star: Star) -> Expression { - return wrap(star(nil, nil)) - } - -} - -/// Builds an expression representing `count(*)` (when called with the `*` -/// function literal). -/// -/// count(*) -/// // count(*) -/// -/// - Returns: An expression returning `count(*)` (when called with the `*` -/// function literal). -public func count(_ star: Star) -> Expression { - return Expression.count(star) -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Collation.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Collation.swift deleted file mode 100644 index e2ff9d1006..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Collation.swift +++ /dev/null @@ -1,69 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -/// A collating function used to compare to strings. -/// -/// - SeeAlso: -public enum Collation { - - /// Compares string by raw data. - case binary - - /// Like binary, but folds uppercase ASCII letters into their lowercase - /// equivalents. - case nocase - - /// Like binary, but strips trailing space. - case rtrim - - /// A custom collating sequence identified by the given string, registered - /// using `Database.create(collation:…)` - case custom(String) - -} - -extension Collation : Expressible { - - public var expression: Expression { - return Expression(literal: description) - } - -} - -extension Collation : CustomStringConvertible { - - public var description : String { - switch self { - case .binary: - return "BINARY" - case .nocase: - return "NOCASE" - case .rtrim: - return "RTRIM" - case .custom(let collation): - return collation.quote() - } - } - -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift deleted file mode 100644 index 9d17a326bc..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CoreFunctions.swift +++ /dev/null @@ -1,683 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -import Foundation.NSData - - -extension ExpressionType where UnderlyingType : Number { - - /// Builds a copy of the expression wrapped with the `abs` function. - /// - /// let x = Expression("x") - /// x.absoluteValue - /// // abs("x") - /// - /// - Returns: A copy of the expression wrapped with the `abs` function. - public var absoluteValue : Expression { - return "abs".wrap(self) - } - -} - -extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Number { - - /// Builds a copy of the expression wrapped with the `abs` function. - /// - /// let x = Expression("x") - /// x.absoluteValue - /// // abs("x") - /// - /// - Returns: A copy of the expression wrapped with the `abs` function. - public var absoluteValue : Expression { - return "abs".wrap(self) - } - -} - -extension ExpressionType where UnderlyingType == Double { - - /// Builds a copy of the expression wrapped with the `round` function. - /// - /// let salary = Expression("salary") - /// salary.round() - /// // round("salary") - /// salary.round(2) - /// // round("salary", 2) - /// - /// - Returns: A copy of the expression wrapped with the `round` function. - public func round(_ precision: Int? = nil) -> Expression { - guard let precision = precision else { - return wrap([self]) - } - return wrap([self, Int(precision)]) - } - -} - -extension ExpressionType where UnderlyingType == Double? { - - /// Builds a copy of the expression wrapped with the `round` function. - /// - /// let salary = Expression("salary") - /// salary.round() - /// // round("salary") - /// salary.round(2) - /// // round("salary", 2) - /// - /// - Returns: A copy of the expression wrapped with the `round` function. - public func round(_ precision: Int? = nil) -> Expression { - guard let precision = precision else { - return wrap(self) - } - return wrap([self, Int(precision)]) - } - -} - -extension ExpressionType where UnderlyingType : Value, UnderlyingType.Datatype == Int64 { - - /// Builds an expression representing the `random` function. - /// - /// Expression.random() - /// // random() - /// - /// - Returns: An expression calling the `random` function. - public static func random() -> Expression { - return "random".wrap([]) - } - -} - -extension ExpressionType where UnderlyingType == Data { - - /// Builds an expression representing the `randomblob` function. - /// - /// Expression.random(16) - /// // randomblob(16) - /// - /// - Parameter length: Length in bytes. - /// - /// - Returns: An expression calling the `randomblob` function. - public static func random(_ length: Int) -> Expression { - return "randomblob".wrap([]) - } - - /// Builds an expression representing the `zeroblob` function. - /// - /// Expression.allZeros(16) - /// // zeroblob(16) - /// - /// - Parameter length: Length in bytes. - /// - /// - Returns: An expression calling the `zeroblob` function. - public static func allZeros(_ length: Int) -> Expression { - return "zeroblob".wrap([]) - } - - /// Builds a copy of the expression wrapped with the `length` function. - /// - /// let data = Expression("data") - /// data.length - /// // length("data") - /// - /// - Returns: A copy of the expression wrapped with the `length` function. - public var length: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType == Data? { - - /// Builds a copy of the expression wrapped with the `length` function. - /// - /// let data = Expression("data") - /// data.length - /// // length("data") - /// - /// - Returns: A copy of the expression wrapped with the `length` function. - public var length: Expression { - return wrap(self) - } - -} - -extension ExpressionType where UnderlyingType == String { - - /// Builds a copy of the expression wrapped with the `length` function. - /// - /// let name = Expression("name") - /// name.length - /// // length("name") - /// - /// - Returns: A copy of the expression wrapped with the `length` function. - public var length: Expression { - return wrap(self) - } - - /// Builds a copy of the expression wrapped with the `lower` function. - /// - /// let name = Expression("name") - /// name.lowercaseString - /// // lower("name") - /// - /// - Returns: A copy of the expression wrapped with the `lower` function. - public var lowercaseString: Expression { - return "lower".wrap(self) - } - - /// Builds a copy of the expression wrapped with the `upper` function. - /// - /// let name = Expression("name") - /// name.uppercaseString - /// // lower("name") - /// - /// - Returns: A copy of the expression wrapped with the `upper` function. - public var uppercaseString: Expression { - return "upper".wrap(self) - } - - /// Builds a copy of the expression appended with a `LIKE` query against the - /// given pattern. - /// - /// let email = Expression("email") - /// email.like("%@example.com") - /// // "email" LIKE '%@example.com' - /// email.like("99\\%@%", escape: "\\") - /// // "email" LIKE '99\%@%' ESCAPE '\' - /// - /// - Parameters: - /// - /// - pattern: A pattern to match. - /// - /// - escape: An (optional) character designated for escaping - /// pattern-matching characters (*i.e.*, the `%` and `_` characters). - /// - /// - Returns: A copy of the expression appended with a `LIKE` query against - /// the given pattern. - public func like(_ pattern: String, escape character: Character? = nil) -> Expression { - guard let character = character else { - return "LIKE".infix(self, pattern) - } - return Expression("(\(template) LIKE ? ESCAPE ?)", bindings + [pattern, String(character)]) - } - - /// Builds a copy of the expression appended with a `GLOB` query against the - /// given pattern. - /// - /// let path = Expression("path") - /// path.glob("*.png") - /// // "path" GLOB '*.png' - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression appended with a `GLOB` query against - /// the given pattern. - public func glob(_ pattern: String) -> Expression { - return "GLOB".infix(self, pattern) - } - - /// Builds a copy of the expression appended with a `MATCH` query against - /// the given pattern. - /// - /// let title = Expression("title") - /// title.match("swift AND programming") - /// // "title" MATCH 'swift AND programming' - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression appended with a `MATCH` query - /// against the given pattern. - public func match(_ pattern: String) -> Expression { - return "MATCH".infix(self, pattern) - } - - /// Builds a copy of the expression appended with a `REGEXP` query against - /// the given pattern. - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression appended with a `REGEXP` query - /// against the given pattern. - public func regexp(_ pattern: String) -> Expression { - return "REGEXP".infix(self, pattern) - } - - /// Builds a copy of the expression appended with a `COLLATE` clause with - /// the given sequence. - /// - /// let name = Expression("name") - /// name.collate(.Nocase) - /// // "name" COLLATE NOCASE - /// - /// - Parameter collation: A collating sequence. - /// - /// - Returns: A copy of the expression appended with a `COLLATE` clause - /// with the given sequence. - public func collate(_ collation: Collation) -> Expression { - return "COLLATE".infix(self, collation) - } - - /// Builds a copy of the expression wrapped with the `ltrim` function. - /// - /// let name = Expression("name") - /// name.ltrim() - /// // ltrim("name") - /// name.ltrim([" ", "\t"]) - /// // ltrim("name", ' \t') - /// - /// - Parameter characters: A set of characters to trim. - /// - /// - Returns: A copy of the expression wrapped with the `ltrim` function. - public func ltrim(_ characters: Set? = nil) -> Expression { - guard let characters = characters else { - return wrap(self) - } - return wrap([self, String(characters)]) - } - - /// Builds a copy of the expression wrapped with the `rtrim` function. - /// - /// let name = Expression("name") - /// name.rtrim() - /// // rtrim("name") - /// name.rtrim([" ", "\t"]) - /// // rtrim("name", ' \t') - /// - /// - Parameter characters: A set of characters to trim. - /// - /// - Returns: A copy of the expression wrapped with the `rtrim` function. - public func rtrim(_ characters: Set? = nil) -> Expression { - guard let characters = characters else { - return wrap(self) - } - return wrap([self, String(characters)]) - } - - /// Builds a copy of the expression wrapped with the `trim` function. - /// - /// let name = Expression("name") - /// name.trim() - /// // trim("name") - /// name.trim([" ", "\t"]) - /// // trim("name", ' \t') - /// - /// - Parameter characters: A set of characters to trim. - /// - /// - Returns: A copy of the expression wrapped with the `trim` function. - public func trim(_ characters: Set? = nil) -> Expression { - guard let characters = characters else { - return wrap([self]) - } - return wrap([self, String(characters)]) - } - - /// Builds a copy of the expression wrapped with the `replace` function. - /// - /// let email = Expression("email") - /// email.replace("@mac.com", with: "@icloud.com") - /// // replace("email", '@mac.com', '@icloud.com') - /// - /// - Parameters: - /// - /// - pattern: A pattern to match. - /// - /// - replacement: The replacement string. - /// - /// - Returns: A copy of the expression wrapped with the `replace` function. - public func replace(_ pattern: String, with replacement: String) -> Expression { - return "replace".wrap([self, pattern, replacement]) - } - - public func substring(_ location: Int, length: Int? = nil) -> Expression { - guard let length = length else { - return "substr".wrap([self, location]) - } - return "substr".wrap([self, location, length]) - } - - public subscript(range: Range) -> Expression { - return substring(range.lowerBound, length: range.upperBound - range.lowerBound) - } - -} - -extension ExpressionType where UnderlyingType == String? { - - /// Builds a copy of the expression wrapped with the `length` function. - /// - /// let name = Expression("name") - /// name.length - /// // length("name") - /// - /// - Returns: A copy of the expression wrapped with the `length` function. - public var length: Expression { - return wrap(self) - } - - /// Builds a copy of the expression wrapped with the `lower` function. - /// - /// let name = Expression("name") - /// name.lowercaseString - /// // lower("name") - /// - /// - Returns: A copy of the expression wrapped with the `lower` function. - public var lowercaseString: Expression { - return "lower".wrap(self) - } - - /// Builds a copy of the expression wrapped with the `upper` function. - /// - /// let name = Expression("name") - /// name.uppercaseString - /// // lower("name") - /// - /// - Returns: A copy of the expression wrapped with the `upper` function. - public var uppercaseString: Expression { - return "upper".wrap(self) - } - - /// Builds a copy of the expression appended with a `LIKE` query against the - /// given pattern. - /// - /// let email = Expression("email") - /// email.like("%@example.com") - /// // "email" LIKE '%@example.com' - /// email.like("99\\%@%", escape: "\\") - /// // "email" LIKE '99\%@%' ESCAPE '\' - /// - /// - Parameters: - /// - /// - pattern: A pattern to match. - /// - /// - escape: An (optional) character designated for escaping - /// pattern-matching characters (*i.e.*, the `%` and `_` characters). - /// - /// - Returns: A copy of the expression appended with a `LIKE` query against - /// the given pattern. - public func like(_ pattern: String, escape character: Character? = nil) -> Expression { - guard let character = character else { - return "LIKE".infix(self, pattern) - } - return Expression("(\(template) LIKE ? ESCAPE ?)", bindings + [pattern, String(character)]) - } - - /// Builds a copy of the expression appended with a `GLOB` query against the - /// given pattern. - /// - /// let path = Expression("path") - /// path.glob("*.png") - /// // "path" GLOB '*.png' - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression appended with a `GLOB` query against - /// the given pattern. - public func glob(_ pattern: String) -> Expression { - return "GLOB".infix(self, pattern) - } - - /// Builds a copy of the expression appended with a `MATCH` query against - /// the given pattern. - /// - /// let title = Expression("title") - /// title.match("swift AND programming") - /// // "title" MATCH 'swift AND programming' - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression appended with a `MATCH` query - /// against the given pattern. - public func match(_ pattern: String) -> Expression { - return "MATCH".infix(self, pattern) - } - - /// Builds a copy of the expression appended with a `REGEXP` query against - /// the given pattern. - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression appended with a `REGEXP` query - /// against the given pattern. - public func regexp(_ pattern: String) -> Expression { - return "REGEXP".infix(self, pattern) - } - - /// Builds a copy of the expression appended with a `COLLATE` clause with - /// the given sequence. - /// - /// let name = Expression("name") - /// name.collate(.Nocase) - /// // "name" COLLATE NOCASE - /// - /// - Parameter collation: A collating sequence. - /// - /// - Returns: A copy of the expression appended with a `COLLATE` clause - /// with the given sequence. - public func collate(_ collation: Collation) -> Expression { - return "COLLATE".infix(self, collation) - } - - /// Builds a copy of the expression wrapped with the `ltrim` function. - /// - /// let name = Expression("name") - /// name.ltrim() - /// // ltrim("name") - /// name.ltrim([" ", "\t"]) - /// // ltrim("name", ' \t') - /// - /// - Parameter characters: A set of characters to trim. - /// - /// - Returns: A copy of the expression wrapped with the `ltrim` function. - public func ltrim(_ characters: Set? = nil) -> Expression { - guard let characters = characters else { - return wrap(self) - } - return wrap([self, String(characters)]) - } - - /// Builds a copy of the expression wrapped with the `rtrim` function. - /// - /// let name = Expression("name") - /// name.rtrim() - /// // rtrim("name") - /// name.rtrim([" ", "\t"]) - /// // rtrim("name", ' \t') - /// - /// - Parameter characters: A set of characters to trim. - /// - /// - Returns: A copy of the expression wrapped with the `rtrim` function. - public func rtrim(_ characters: Set? = nil) -> Expression { - guard let characters = characters else { - return wrap(self) - } - return wrap([self, String(characters)]) - } - - /// Builds a copy of the expression wrapped with the `trim` function. - /// - /// let name = Expression("name") - /// name.trim() - /// // trim("name") - /// name.trim([" ", "\t"]) - /// // trim("name", ' \t') - /// - /// - Parameter characters: A set of characters to trim. - /// - /// - Returns: A copy of the expression wrapped with the `trim` function. - public func trim(_ characters: Set? = nil) -> Expression { - guard let characters = characters else { - return wrap(self) - } - return wrap([self, String(characters)]) - } - - /// Builds a copy of the expression wrapped with the `replace` function. - /// - /// let email = Expression("email") - /// email.replace("@mac.com", with: "@icloud.com") - /// // replace("email", '@mac.com', '@icloud.com') - /// - /// - Parameters: - /// - /// - pattern: A pattern to match. - /// - /// - replacement: The replacement string. - /// - /// - Returns: A copy of the expression wrapped with the `replace` function. - public func replace(_ pattern: String, with replacement: String) -> Expression { - return "replace".wrap([self, pattern, replacement]) - } - - /// Builds a copy of the expression wrapped with the `substr` function. - /// - /// let title = Expression("title") - /// title.substr(-100) - /// // substr("title", -100) - /// title.substr(0, length: 100) - /// // substr("title", 0, 100) - /// - /// - Parameters: - /// - /// - location: The substring’s start index. - /// - /// - length: An optional substring length. - /// - /// - Returns: A copy of the expression wrapped with the `substr` function. - public func substring(_ location: Int, length: Int? = nil) -> Expression { - guard let length = length else { - return "substr".wrap([self, location]) - } - return "substr".wrap([self, location, length]) - } - - /// Builds a copy of the expression wrapped with the `substr` function. - /// - /// let title = Expression("title") - /// title[0..<100] - /// // substr("title", 0, 100) - /// - /// - Parameter range: The character index range of the substring. - /// - /// - Returns: A copy of the expression wrapped with the `substr` function. - public subscript(range: Range) -> Expression { - return substring(range.lowerBound, length: range.upperBound - range.lowerBound) - } - -} - -extension Collection where Iterator.Element : Value, IndexDistance == Int { - - /// Builds a copy of the expression prepended with an `IN` check against the - /// collection. - /// - /// let name = Expression("name") - /// ["alice", "betty"].contains(name) - /// // "name" IN ('alice', 'betty') - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression prepended with an `IN` check against - /// the collection. - public func contains(_ expression: Expression) -> Expression { - let templates = [String](repeating: "?", count: count).joined(separator: ", ") - return "IN".infix(expression, Expression("(\(templates))", map { $0.datatypeValue })) - } - - /// Builds a copy of the expression prepended with an `IN` check against the - /// collection. - /// - /// let name = Expression("name") - /// ["alice", "betty"].contains(name) - /// // "name" IN ('alice', 'betty') - /// - /// - Parameter pattern: A pattern to match. - /// - /// - Returns: A copy of the expression prepended with an `IN` check against - /// the collection. - public func contains(_ expression: Expression) -> Expression { - let templates = [String](repeating: "?", count: count).joined(separator: ", ") - return "IN".infix(expression, Expression("(\(templates))", map { $0.datatypeValue })) - } - -} - -/// Builds a copy of the given expressions wrapped with the `ifnull` function. -/// -/// let name = Expression("name") -/// name ?? "An Anonymous Coward" -/// // ifnull("name", 'An Anonymous Coward') -/// -/// - Parameters: -/// -/// - optional: An optional expression. -/// -/// - defaultValue: A fallback value for when the optional expression is -/// `nil`. -/// -/// - Returns: A copy of the given expressions wrapped with the `ifnull` -/// function. -public func ??(optional: Expression, defaultValue: V) -> Expression { - return "ifnull".wrap([optional, defaultValue]) -} - -/// Builds a copy of the given expressions wrapped with the `ifnull` function. -/// -/// let nick = Expression("nick") -/// let name = Expression("name") -/// nick ?? name -/// // ifnull("nick", "name") -/// -/// - Parameters: -/// -/// - optional: An optional expression. -/// -/// - defaultValue: A fallback expression for when the optional expression is -/// `nil`. -/// -/// - Returns: A copy of the given expressions wrapped with the `ifnull` -/// function. -public func ??(optional: Expression, defaultValue: Expression) -> Expression { - return "ifnull".wrap([optional, defaultValue]) -} - -/// Builds a copy of the given expressions wrapped with the `ifnull` function. -/// -/// let nick = Expression("nick") -/// let name = Expression("name") -/// nick ?? name -/// // ifnull("nick", "name") -/// -/// - Parameters: -/// -/// - optional: An optional expression. -/// -/// - defaultValue: A fallback expression for when the optional expression is -/// `nil`. -/// -/// - Returns: A copy of the given expressions wrapped with the `ifnull` -/// function. -public func ??(optional: Expression, defaultValue: Expression) -> Expression { - return "ifnull".wrap([optional, defaultValue]) -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift deleted file mode 100644 index 64b54edb75..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/CustomFunctions.swift +++ /dev/null @@ -1,136 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -public extension Connection { - - /// Creates or redefines a custom SQL function. - /// - /// - Parameters: - /// - /// - function: The name of the function to create or redefine. - /// - /// - deterministic: Whether or not the function is deterministic (_i.e._ - /// the function always returns the same result for a given input). - /// - /// Default: `false` - /// - /// - block: A block of code to run when the function is called. - /// The assigned types must be explicit. - /// - /// - Returns: A closure returning an SQL expression to call the function. - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping () -> Z) throws -> (() -> Expression) { - let fn = try createFunction(function, 0, deterministic) { _ in block() } - return { fn([]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping () -> Z?) throws -> (() -> Expression) { - let fn = try createFunction(function, 0, deterministic) { _ in block() } - return { fn([]) } - } - - // MARK: - - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A) -> Z) throws -> ((Expression) -> Expression) { - let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0])) } - return { arg in fn([arg]) } - } - - public func createFunction(function: String, deterministic: Bool = false, _ block: @escaping (A?) -> Z) throws -> ((Expression) -> Expression) { - let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value)) } - return { arg in fn([arg]) } - } - - public func createFunction(function: String, deterministic: Bool = false, _ block: @escaping (A) -> Z?) throws -> ((Expression) -> Expression) { - let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0])) } - return { arg in fn([arg]) } - } - - public func createFunction(function: String, deterministic: Bool = false, _ block: @escaping (A?) -> Z?) throws -> ((Expression) -> Expression) { - let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value)) } - return { arg in fn([arg]) } - } - - // MARK: - - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B) -> Z) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), value(args[1])) } - return { a, b in fn([a, b]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B) -> Z) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), value(args[1])) } - return { a, b in fn([a, b]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B?) -> Z) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), args[1].map(value)) } - return { a, b in fn([a, b]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B) -> Z?) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), value(args[1])) } - return { a, b in fn([a, b]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B?) -> Z) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), args[1].map(value)) } - return { a, b in fn([a, b]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B) -> Z?) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), value(args[1])) } - return { a, b in fn([a, b]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A, B?) -> Z?) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(value(args[0]), args[1].map(value)) } - return { a, b in fn([a, b]) } - } - - public func createFunction(_ function: String, deterministic: Bool = false, _ block: @escaping (A?, B?) -> Z?) throws -> (Expression, Expression) -> Expression { - let fn = try createFunction(function, 1, deterministic) { args in block(args[0].map(value), args[1].map(value)) } - return { a, b in fn([a, b]) } - } - - // MARK: - - - fileprivate func createFunction(_ function: String, _ argumentCount: UInt, _ deterministic: Bool, _ block: @escaping ([Binding?]) -> Z) throws -> (([Expressible]) -> Expression) { - createFunction(function, argumentCount: argumentCount, deterministic: deterministic) { arguments in - block(arguments).datatypeValue - } - return { arguments in - function.quote().wrap(", ".join(arguments)) - } - } - - fileprivate func createFunction(_ function: String, _ argumentCount: UInt, _ deterministic: Bool, _ block: @escaping ([Binding?]) -> Z?) throws -> (([Expressible]) -> Expression) { - createFunction(function, argumentCount: argumentCount, deterministic: deterministic) { arguments in - block(arguments)?.datatypeValue - } - return { arguments in - function.quote().wrap(", ".join(arguments)) - } - } - -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Expression.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Expression.swift deleted file mode 100644 index 3198901c55..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Expression.swift +++ /dev/null @@ -1,147 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -public protocol ExpressionType : Expressible { // extensions cannot have inheritance clauses - - associatedtype UnderlyingType = Void - - var template: String { get } - var bindings: [Binding?] { get } - - init(_ template: String, _ bindings: [Binding?]) - -} - -extension ExpressionType { - - public init(literal: String) { - self.init(literal, []) - } - - public init(_ identifier: String) { - self.init(literal: identifier.quote()) - } - - public init(_ expression: U) { - self.init(expression.template, expression.bindings) - } - -} - -/// An `Expression` represents a raw SQL fragment and any associated bindings. -public struct Expression : ExpressionType { - - public typealias UnderlyingType = Datatype - - public var template: String - public var bindings: [Binding?] - - public init(_ template: String, _ bindings: [Binding?]) { - self.template = template - self.bindings = bindings - } - -} - -public protocol Expressible { - - var expression: Expression { get } - -} - -extension Expressible { - - // naïve compiler for statements that can’t be bound, e.g., CREATE TABLE - // FIXME: use @testable and make internal - public func asSQL() -> String { - let expressed = expression - var idx = 0 - return expressed.template.characters.reduce("") { template, character in - let transcoded: String - - if character == "?" { - transcoded = transcode(expressed.bindings[idx]) - idx += 1 - } else { - transcoded = String(character) - } - return template + transcoded - } - } - -} - -extension ExpressionType { - - public var expression: Expression { - return Expression(template, bindings) - } - - public var asc: Expressible { - return " ".join([self, Expression(literal: "ASC")]) - } - - public var desc: Expressible { - return " ".join([self, Expression(literal: "DESC")]) - } - -} - -extension ExpressionType where UnderlyingType : Value { - - public init(value: UnderlyingType) { - self.init("?", [value.datatypeValue]) - } - -} - -extension ExpressionType where UnderlyingType : _OptionalType, UnderlyingType.WrappedType : Value { - - public static var null: Self { - return self.init(value: nil) - } - - public init(value: UnderlyingType.WrappedType?) { - self.init("?", [value?.datatypeValue]) - } - -} - -extension Value { - - public var expression: Expression { - return Expression(value: self).expression - } - -} - -public let rowid = Expression("ROWID") - -public func cast(_ expression: Expression) -> Expression { - return Expression("CAST (\(expression.template) AS \(U.declaredDatatype))", expression.bindings) -} - -public func cast(_ expression: Expression) -> Expression { - return Expression("CAST (\(expression.template) AS \(U.declaredDatatype))", expression.bindings) -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Operators.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Operators.swift deleted file mode 100644 index fdd293be71..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Operators.swift +++ /dev/null @@ -1,541 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -// TODO: use `@warn_unused_result` by the time operator functions support it - -public func +(lhs: Expression, rhs: Expression) -> Expression { - return "||".infix(lhs, rhs) -} - -public func +(lhs: Expression, rhs: Expression) -> Expression { - return "||".infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: Expression) -> Expression { - return "||".infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: Expression) -> Expression { - return "||".infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: String) -> Expression { - return "||".infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: String) -> Expression { - return "||".infix(lhs, rhs) -} -public func +(lhs: String, rhs: Expression) -> Expression { - return "||".infix(lhs, rhs) -} -public func +(lhs: String, rhs: Expression) -> Expression { - return "||".infix(lhs, rhs) -} - -// MARK: - - -public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func +(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func +(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func +(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} - -public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func -(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func -(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func -(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func -(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func -(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} - -public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func *(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func *(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func *(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func *(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func *(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} - -public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func /(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func /(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func /(lhs: Expression, rhs: V) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func /(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} -public func /(lhs: V, rhs: Expression) -> Expression where V.Datatype : Number { - return infix(lhs, rhs) -} - -public prefix func -(rhs: Expression) -> Expression where V.Datatype : Number { - return wrap(rhs) -} -public prefix func -(rhs: Expression) -> Expression where V.Datatype : Number { - return wrap(rhs) -} - -// MARK: - - -public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func %(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func %(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func %(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func %(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func %(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} - -public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func <<(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func <<(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func <<(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func <<(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func <<(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} - -public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func >>(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func >>(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func >>(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func >>(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func >>(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} - -public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func &(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func &(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func &(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func &(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func &(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} - -public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func |(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func |(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func |(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func |(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} -public func |(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return infix(lhs, rhs) -} - -public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} -public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} -public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} -public func ^(lhs: Expression, rhs: Expression) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} -public func ^(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} -public func ^(lhs: Expression, rhs: V) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} -public func ^(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} -public func ^(lhs: V, rhs: Expression) -> Expression where V.Datatype == Int64 { - return (~(lhs & rhs)) & (lhs | rhs) -} - -public prefix func ~(rhs: Expression) -> Expression where V.Datatype == Int64 { - return wrap(rhs) -} -public prefix func ~(rhs: Expression) -> Expression where V.Datatype == Int64 { - return wrap(rhs) -} - -// MARK: - - -public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return "=".infix(lhs, rhs) -} -public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return "=".infix(lhs, rhs) -} -public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return "=".infix(lhs, rhs) -} -public func ==(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return "=".infix(lhs, rhs) -} -public func ==(lhs: Expression, rhs: V) -> Expression where V.Datatype : Equatable { - return "=".infix(lhs, rhs) -} -public func ==(lhs: Expression, rhs: V?) -> Expression where V.Datatype : Equatable { - guard let rhs = rhs else { return "IS".infix(lhs, Expression(value: nil)) } - return "=".infix(lhs, rhs) -} -public func ==(lhs: V, rhs: Expression) -> Expression where V.Datatype : Equatable { - return "=".infix(lhs, rhs) -} -public func ==(lhs: V?, rhs: Expression) -> Expression where V.Datatype : Equatable { - guard let lhs = lhs else { return "IS".infix(Expression(value: nil), rhs) } - return "=".infix(lhs, rhs) -} - -public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return infix(lhs, rhs) -} -public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return infix(lhs, rhs) -} -public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return infix(lhs, rhs) -} -public func !=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Equatable { - return infix(lhs, rhs) -} -public func !=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Equatable { - return infix(lhs, rhs) -} -public func !=(lhs: Expression, rhs: V?) -> Expression where V.Datatype : Equatable { - guard let rhs = rhs else { return "IS NOT".infix(lhs, Expression(value: nil)) } - return infix(lhs, rhs) -} -public func !=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Equatable { - return infix(lhs, rhs) -} -public func !=(lhs: V?, rhs: Expression) -> Expression where V.Datatype : Equatable { - guard let lhs = lhs else { return "IS NOT".infix(Expression(value: nil), rhs) } - return infix(lhs, rhs) -} - -public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} - -public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func >=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} - -public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} - -public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <=(lhs: Expression, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <=(lhs: Expression, rhs: V) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} -public func <=(lhs: V, rhs: Expression) -> Expression where V.Datatype : Comparable { - return infix(lhs, rhs) -} - -public func ~=(lhs: ClosedRange, rhs: Expression) -> Expression where V.Datatype : Binding & Comparable { - return Expression("\(rhs.template) BETWEEN ? AND ?", rhs.bindings + [lhs.lowerBound as? Binding, lhs.upperBound as? Binding]) -} -public func ~=(lhs: ClosedRange, rhs: Expression) -> Expression where V.Datatype : Binding & Comparable { - return Expression("\(rhs.template) BETWEEN ? AND ?", rhs.bindings + [lhs.lowerBound as? Binding, lhs.upperBound as? Binding]) -} - -// MARK: - - -public func &&(lhs: Expression, rhs: Expression) -> Expression { - return "AND".infix(lhs, rhs) -} -public func &&(lhs: Expression, rhs: Expression) -> Expression { - return "AND".infix(lhs, rhs) -} -public func &&(lhs: Expression, rhs: Expression) -> Expression { - return "AND".infix(lhs, rhs) -} -public func &&(lhs: Expression, rhs: Expression) -> Expression { - return "AND".infix(lhs, rhs) -} -public func &&(lhs: Expression, rhs: Bool) -> Expression { - return "AND".infix(lhs, rhs) -} -public func &&(lhs: Expression, rhs: Bool) -> Expression { - return "AND".infix(lhs, rhs) -} -public func &&(lhs: Bool, rhs: Expression) -> Expression { - return "AND".infix(lhs, rhs) -} -public func &&(lhs: Bool, rhs: Expression) -> Expression { - return "AND".infix(lhs, rhs) -} - -public func ||(lhs: Expression, rhs: Expression) -> Expression { - return "OR".infix(lhs, rhs) -} -public func ||(lhs: Expression, rhs: Expression) -> Expression { - return "OR".infix(lhs, rhs) -} -public func ||(lhs: Expression, rhs: Expression) -> Expression { - return "OR".infix(lhs, rhs) -} -public func ||(lhs: Expression, rhs: Expression) -> Expression { - return "OR".infix(lhs, rhs) -} -public func ||(lhs: Expression, rhs: Bool) -> Expression { - return "OR".infix(lhs, rhs) -} -public func ||(lhs: Expression, rhs: Bool) -> Expression { - return "OR".infix(lhs, rhs) -} -public func ||(lhs: Bool, rhs: Expression) -> Expression { - return "OR".infix(lhs, rhs) -} -public func ||(lhs: Bool, rhs: Expression) -> Expression { - return "OR".infix(lhs, rhs) -} - -public prefix func !(rhs: Expression) -> Expression { - return "NOT ".wrap(rhs) -} -public prefix func !(rhs: Expression) -> Expression { - return "NOT ".wrap(rhs) -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Query.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Query.swift deleted file mode 100644 index c9d2ea9cc5..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Query.swift +++ /dev/null @@ -1,1162 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -public protocol QueryType : Expressible { - - var clauses: QueryClauses { get set } - - init(_ name: String, database: String?) - -} - -public protocol SchemaType : QueryType { - - static var identifier: String { get } - -} - -extension SchemaType { - - /// Builds a copy of the query with the `SELECT` clause applied. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// let email = Expression("email") - /// - /// users.select(id, email) - /// // SELECT "id", "email" FROM "users" - /// - /// - Parameter all: A list of expressions to select. - /// - /// - Returns: A query with the given `SELECT` clause applied. - public func select(_ column1: Expressible, _ more: Expressible...) -> Self { - return select(false, [column1] + more) - } - - /// Builds a copy of the query with the `SELECT DISTINCT` clause applied. - /// - /// let users = Table("users") - /// let email = Expression("email") - /// - /// users.select(distinct: email) - /// // SELECT DISTINCT "email" FROM "users" - /// - /// - Parameter columns: A list of expressions to select. - /// - /// - Returns: A query with the given `SELECT DISTINCT` clause applied. - public func select(distinct column1: Expressible, _ more: Expressible...) -> Self { - return select(true, [column1] + more) - } - - /// Builds a copy of the query with the `SELECT` clause applied. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// let email = Expression("email") - /// - /// users.select([id, email]) - /// // SELECT "id", "email" FROM "users" - /// - /// - Parameter all: A list of expressions to select. - /// - /// - Returns: A query with the given `SELECT` clause applied. - public func select(_ all: [Expressible]) -> Self { - return select(false, all) - } - - /// Builds a copy of the query with the `SELECT DISTINCT` clause applied. - /// - /// let users = Table("users") - /// let email = Expression("email") - /// - /// users.select(distinct: [email]) - /// // SELECT DISTINCT "email" FROM "users" - /// - /// - Parameter columns: A list of expressions to select. - /// - /// - Returns: A query with the given `SELECT DISTINCT` clause applied. - public func select(distinct columns: [Expressible]) -> Self { - return select(true, columns) - } - - /// Builds a copy of the query with the `SELECT *` clause applied. - /// - /// let users = Table("users") - /// - /// users.select(*) - /// // SELECT * FROM "users" - /// - /// - Parameter star: A star literal. - /// - /// - Returns: A query with the given `SELECT *` clause applied. - public func select(_ star: Star) -> Self { - return select([star(nil, nil)]) - } - - /// Builds a copy of the query with the `SELECT DISTINCT *` clause applied. - /// - /// let users = Table("users") - /// - /// users.select(distinct: *) - /// // SELECT DISTINCT * FROM "users" - /// - /// - Parameter star: A star literal. - /// - /// - Returns: A query with the given `SELECT DISTINCT *` clause applied. - public func select(distinct star: Star) -> Self { - return select(distinct: [star(nil, nil)]) - } - - /// Builds a scalar copy of the query with the `SELECT` clause applied. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// - /// users.select(id) - /// // SELECT "id" FROM "users" - /// - /// - Parameter all: A list of expressions to select. - /// - /// - Returns: A query with the given `SELECT` clause applied. - public func select(_ column: Expression) -> ScalarQuery { - return select(false, [column]) - } - public func select(_ column: Expression) -> ScalarQuery { - return select(false, [column]) - } - - /// Builds a scalar copy of the query with the `SELECT DISTINCT` clause - /// applied. - /// - /// let users = Table("users") - /// let email = Expression("email") - /// - /// users.select(distinct: email) - /// // SELECT DISTINCT "email" FROM "users" - /// - /// - Parameter column: A list of expressions to select. - /// - /// - Returns: A query with the given `SELECT DISTINCT` clause applied. - public func select(distinct column: Expression) -> ScalarQuery { - return select(true, [column]) - } - public func select(distinct column: Expression) -> ScalarQuery { - return select(true, [column]) - } - - public var count: ScalarQuery { - return select(Expression.count(*)) - } - -} - -extension QueryType { - - fileprivate func select(_ distinct: Bool, _ columns: [Expressible]) -> Q { - var query = Q.init(clauses.from.name, database: clauses.from.database) - query.clauses = clauses - query.clauses.select = (distinct, columns) - return query - } - - // MARK: JOIN - - /// Adds a `JOIN` clause to the query. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// let posts = Table("posts") - /// let userId = Expression("user_id") - /// - /// users.join(posts, on: posts[userId] == users[id]) - /// // SELECT * FROM "users" INNER JOIN "posts" ON ("posts"."user_id" = "users"."id") - /// - /// - Parameters: - /// - /// - table: A query representing the other table. - /// - /// - condition: A boolean expression describing the join condition. - /// - /// - Returns: A query with the given `JOIN` clause applied. - public func join(_ table: QueryType, on condition: Expression) -> Self { - return join(table, on: Expression(condition)) - } - - /// Adds a `JOIN` clause to the query. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// let posts = Table("posts") - /// let userId = Expression("user_id") - /// - /// users.join(posts, on: posts[userId] == users[id]) - /// // SELECT * FROM "users" INNER JOIN "posts" ON ("posts"."user_id" = "users"."id") - /// - /// - Parameters: - /// - /// - table: A query representing the other table. - /// - /// - condition: A boolean expression describing the join condition. - /// - /// - Returns: A query with the given `JOIN` clause applied. - public func join(_ table: QueryType, on condition: Expression) -> Self { - return join(.inner, table, on: condition) - } - - /// Adds a `JOIN` clause to the query. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// let posts = Table("posts") - /// let userId = Expression("user_id") - /// - /// users.join(.LeftOuter, posts, on: posts[userId] == users[id]) - /// // SELECT * FROM "users" LEFT OUTER JOIN "posts" ON ("posts"."user_id" = "users"."id") - /// - /// - Parameters: - /// - /// - type: The `JOIN` operator. - /// - /// - table: A query representing the other table. - /// - /// - condition: A boolean expression describing the join condition. - /// - /// - Returns: A query with the given `JOIN` clause applied. - public func join(_ type: JoinType, _ table: QueryType, on condition: Expression) -> Self { - return join(type, table, on: Expression(condition)) - } - - /// Adds a `JOIN` clause to the query. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// let posts = Table("posts") - /// let userId = Expression("user_id") - /// - /// users.join(.LeftOuter, posts, on: posts[userId] == users[id]) - /// // SELECT * FROM "users" LEFT OUTER JOIN "posts" ON ("posts"."user_id" = "users"."id") - /// - /// - Parameters: - /// - /// - type: The `JOIN` operator. - /// - /// - table: A query representing the other table. - /// - /// - condition: A boolean expression describing the join condition. - /// - /// - Returns: A query with the given `JOIN` clause applied. - public func join(_ type: JoinType, _ table: QueryType, on condition: Expression) -> Self { - var query = self - query.clauses.join.append((type: type, query: table, condition: table.clauses.filters.map { condition && $0 } ?? condition as Expressible)) - return query - } - - // MARK: WHERE - - /// Adds a condition to the query’s `WHERE` clause. - /// - /// let users = Table("users") - /// let id = Expression("id") - /// - /// users.filter(id == 1) - /// // SELECT * FROM "users" WHERE ("id" = 1) - /// - /// - Parameter condition: A boolean expression to filter on. - /// - /// - Returns: A query with the given `WHERE` clause applied. - public func filter(_ predicate: Expression) -> Self { - return filter(Expression(predicate)) - } - - /// Adds a condition to the query’s `WHERE` clause. - /// - /// let users = Table("users") - /// let age = Expression("age") - /// - /// users.filter(age >= 35) - /// // SELECT * FROM "users" WHERE ("age" >= 35) - /// - /// - Parameter condition: A boolean expression to filter on. - /// - /// - Returns: A query with the given `WHERE` clause applied. - public func filter(_ predicate: Expression) -> Self { - var query = self - query.clauses.filters = query.clauses.filters.map { $0 && predicate } ?? predicate - return query - } - - /// Adds a condition to the query’s `WHERE` clause. - /// This is an alias for `filter(predicate)` - public func `where`(_ predicate: Expression) -> Self { - return `where`(Expression(predicate)) - } - - /// Adds a condition to the query’s `WHERE` clause. - /// This is an alias for `filter(predicate)` - public func `where`(_ predicate: Expression) -> Self { - return filter(predicate) - } - - // MARK: GROUP BY - - /// Sets a `GROUP BY` clause on the query. - /// - /// - Parameter by: A list of columns to group by. - /// - /// - Returns: A query with the given `GROUP BY` clause applied. - public func group(_ by: Expressible...) -> Self { - return group(by) - } - - /// Sets a `GROUP BY` clause on the query. - /// - /// - Parameter by: A list of columns to group by. - /// - /// - Returns: A query with the given `GROUP BY` clause applied. - public func group(_ by: [Expressible]) -> Self { - return group(by, nil) - } - - /// Sets a `GROUP BY`-`HAVING` clause on the query. - /// - /// - Parameters: - /// - /// - by: A column to group by. - /// - /// - having: A condition determining which groups are returned. - /// - /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. - public func group(_ by: Expressible, having: Expression) -> Self { - return group([by], having: having) - } - - /// Sets a `GROUP BY`-`HAVING` clause on the query. - /// - /// - Parameters: - /// - /// - by: A column to group by. - /// - /// - having: A condition determining which groups are returned. - /// - /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. - public func group(_ by: Expressible, having: Expression) -> Self { - return group([by], having: having) - } - - /// Sets a `GROUP BY`-`HAVING` clause on the query. - /// - /// - Parameters: - /// - /// - by: A list of columns to group by. - /// - /// - having: A condition determining which groups are returned. - /// - /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. - public func group(_ by: [Expressible], having: Expression) -> Self { - return group(by, Expression(having)) - } - - /// Sets a `GROUP BY`-`HAVING` clause on the query. - /// - /// - Parameters: - /// - /// - by: A list of columns to group by. - /// - /// - having: A condition determining which groups are returned. - /// - /// - Returns: A query with the given `GROUP BY`–`HAVING` clause applied. - public func group(_ by: [Expressible], having: Expression) -> Self { - return group(by, having) - } - - fileprivate func group(_ by: [Expressible], _ having: Expression?) -> Self { - var query = self - query.clauses.group = (by, having) - return query - } - - // MARK: ORDER BY - - /// Sets an `ORDER BY` clause on the query. - /// - /// let users = Table("users") - /// let email = Expression("email") - /// let name = Expression("name") - /// - /// users.order(email.desc, name.asc) - /// // SELECT * FROM "users" ORDER BY "email" DESC, "name" ASC - /// - /// - Parameter by: An ordered list of columns and directions to sort by. - /// - /// - Returns: A query with the given `ORDER BY` clause applied. - public func order(_ by: Expressible...) -> Self { - return order(by) - } - - /// Sets an `ORDER BY` clause on the query. - /// - /// let users = Table("users") - /// let email = Expression("email") - /// let name = Expression("name") - /// - /// users.order([email.desc, name.asc]) - /// // SELECT * FROM "users" ORDER BY "email" DESC, "name" ASC - /// - /// - Parameter by: An ordered list of columns and directions to sort by. - /// - /// - Returns: A query with the given `ORDER BY` clause applied. - public func order(_ by: [Expressible]) -> Self { - var query = self - query.clauses.order = by - return query - } - - // MARK: LIMIT/OFFSET - - /// Sets the LIMIT clause (and resets any OFFSET clause) on the query. - /// - /// let users = Table("users") - /// - /// users.limit(20) - /// // SELECT * FROM "users" LIMIT 20 - /// - /// - Parameter length: The maximum number of rows to return (or `nil` to - /// return unlimited rows). - /// - /// - Returns: A query with the given LIMIT clause applied. - public func limit(_ length: Int?) -> Self { - return limit(length, nil) - } - - /// Sets LIMIT and OFFSET clauses on the query. - /// - /// let users = Table("users") - /// - /// users.limit(20, offset: 20) - /// // SELECT * FROM "users" LIMIT 20 OFFSET 20 - /// - /// - Parameters: - /// - /// - length: The maximum number of rows to return. - /// - /// - offset: The number of rows to skip. - /// - /// - Returns: A query with the given LIMIT and OFFSET clauses applied. - public func limit(_ length: Int, offset: Int) -> Self { - return limit(length, offset) - } - - // prevents limit(nil, offset: 5) - fileprivate func limit(_ length: Int?, _ offset: Int?) -> Self { - var query = self - query.clauses.limit = length.map { ($0, offset) } - return query - } - - // MARK: - Clauses - // - // MARK: SELECT - - // MARK: - - - fileprivate var selectClause: Expressible { - return " ".join([ - Expression(literal: clauses.select.distinct ? "SELECT DISTINCT" : "SELECT"), - ", ".join(clauses.select.columns), - Expression(literal: "FROM"), - tableName(alias: true) - ]) - } - - fileprivate var joinClause: Expressible? { - guard !clauses.join.isEmpty else { - return nil - } - - return " ".join(clauses.join.map { type, query, condition in - " ".join([ - Expression(literal: "\(type.rawValue) JOIN"), - query.tableName(alias: true), - Expression(literal: "ON"), - condition - ]) - }) - } - - fileprivate var whereClause: Expressible? { - guard let filters = clauses.filters else { - return nil - } - - return " ".join([ - Expression(literal: "WHERE"), - filters - ]) - } - - fileprivate var groupByClause: Expressible? { - guard let group = clauses.group else { - return nil - } - - let groupByClause = " ".join([ - Expression(literal: "GROUP BY"), - ", ".join(group.by) - ]) - - guard let having = group.having else { - return groupByClause - } - - return " ".join([ - groupByClause, - " ".join([ - Expression(literal: "HAVING"), - having - ]) - ]) - } - - fileprivate var orderClause: Expressible? { - guard !clauses.order.isEmpty else { - return nil - } - - return " ".join([ - Expression(literal: "ORDER BY"), - ", ".join(clauses.order) - ]) - } - - fileprivate var limitOffsetClause: Expressible? { - guard let limit = clauses.limit else { - return nil - } - - let limitClause = Expression(literal: "LIMIT \(limit.length)") - - guard let offset = limit.offset else { - return limitClause - } - - return " ".join([ - limitClause, - Expression(literal: "OFFSET \(offset)") - ]) - } - - // MARK: - - - public func alias(_ aliasName: String) -> Self { - var query = self - query.clauses.from = (clauses.from.name, aliasName, clauses.from.database) - return query - } - - // MARK: - Operations - // - // MARK: INSERT - - public func insert(_ value: Setter, _ more: Setter...) -> Insert { - return insert([value] + more) - } - - public func insert(_ values: [Setter]) -> Insert { - return insert(nil, values) - } - - public func insert(or onConflict: OnConflict, _ values: Setter...) -> Insert { - return insert(or: onConflict, values) - } - - public func insert(or onConflict: OnConflict, _ values: [Setter]) -> Insert { - return insert(onConflict, values) - } - - fileprivate func insert(_ or: OnConflict?, _ values: [Setter]) -> Insert { - let insert = values.reduce((columns: [Expressible](), values: [Expressible]())) { insert, setter in - (insert.columns + [setter.column], insert.values + [setter.value]) - } - - let clauses: [Expressible?] = [ - Expression(literal: "INSERT"), - or.map { Expression(literal: "OR \($0.rawValue)") }, - Expression(literal: "INTO"), - tableName(), - "".wrap(insert.columns) as Expression, - Expression(literal: "VALUES"), - "".wrap(insert.values) as Expression, - whereClause - ] - - return Insert(" ".join(clauses.flatMap { $0 }).expression) - } - - /// Runs an `INSERT` statement against the query with `DEFAULT VALUES`. - public func insert() -> Insert { - return Insert(" ".join([ - Expression(literal: "INSERT INTO"), - tableName(), - Expression(literal: "DEFAULT VALUES") - ]).expression) - } - - /// Runs an `INSERT` statement against the query with the results of another - /// query. - /// - /// - Parameter query: A query to `SELECT` results from. - /// - /// - Returns: The number of updated rows and statement. - public func insert(_ query: QueryType) -> Update { - return Update(" ".join([ - Expression(literal: "INSERT INTO"), - tableName(), - query.expression - ]).expression) - } - - // MARK: UPDATE - - public func update(_ values: Setter...) -> Update { - return update(values) - } - - public func update(_ values: [Setter]) -> Update { - let clauses: [Expressible?] = [ - Expression(literal: "UPDATE"), - tableName(), - Expression(literal: "SET"), - ", ".join(values.map { " = ".join([$0.column, $0.value]) }), - whereClause - ] - - return Update(" ".join(clauses.flatMap { $0 }).expression) - } - - // MARK: DELETE - - public func delete() -> Delete { - let clauses: [Expressible?] = [ - Expression(literal: "DELETE FROM"), - tableName(), - whereClause - ] - - return Delete(" ".join(clauses.flatMap { $0 }).expression) - } - - // MARK: EXISTS - - public var exists: Select { - return Select(" ".join([ - Expression(literal: "SELECT EXISTS"), - "".wrap(expression) as Expression - ]).expression) - } - - // MARK: - - - /// Prefixes a column expression with the query’s table name or alias. - /// - /// - Parameter column: A column expression. - /// - /// - Returns: A column expression namespaced with the query’s table name or - /// alias. - public func namespace(_ column: Expression) -> Expression { - return Expression(".".join([tableName(), column]).expression) - } - - // FIXME: rdar://problem/18673897 // subscript… - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - - public subscript(column: Expression) -> Expression { - return namespace(column) - } - public subscript(column: Expression) -> Expression { - return namespace(column) - } - - /// Prefixes a star with the query’s table name or alias. - /// - /// - Parameter star: A literal `*`. - /// - /// - Returns: A `*` expression namespaced with the query’s table name or - /// alias. - public subscript(star: Star) -> Expression { - return namespace(star(nil, nil)) - } - - // MARK: - - - // TODO: alias support - func tableName(alias aliased: Bool = false) -> Expressible { - guard let alias = clauses.from.alias , aliased else { - return database(namespace: clauses.from.alias ?? clauses.from.name) - } - - return " ".join([ - database(namespace: clauses.from.name), - Expression(literal: "AS"), - Expression(alias) - ]) - } - - func tableName(qualified: Bool) -> Expressible { - if qualified { - return tableName() - } - return Expression(clauses.from.alias ?? clauses.from.name) - } - - func database(namespace name: String) -> Expressible { - let name = Expression(name) - - guard let database = clauses.from.database else { - return name - } - - return ".".join([Expression(database), name]) - } - - public var expression: Expression { - let clauses: [Expressible?] = [ - selectClause, - joinClause, - whereClause, - groupByClause, - orderClause, - limitOffsetClause - ] - - return " ".join(clauses.flatMap { $0 }).expression - } - -} - -// TODO: decide: simplify the below with a boxed type instead - -/// Queries a collection of chainable helper functions and expressions to build -/// executable SQL statements. -public struct Table : SchemaType { - - public static let identifier = "TABLE" - - public var clauses: QueryClauses - - public init(_ name: String, database: String? = nil) { - clauses = QueryClauses(name, alias: nil, database: database) - } - -} - -public struct View : SchemaType { - - public static let identifier = "VIEW" - - public var clauses: QueryClauses - - public init(_ name: String, database: String? = nil) { - clauses = QueryClauses(name, alias: nil, database: database) - } - -} - -public struct VirtualTable : SchemaType { - - public static let identifier = "VIRTUAL TABLE" - - public var clauses: QueryClauses - - public init(_ name: String, database: String? = nil) { - clauses = QueryClauses(name, alias: nil, database: database) - } - -} - -// TODO: make `ScalarQuery` work in `QueryType.select()`, `.filter()`, etc. - -public struct ScalarQuery : QueryType { - - public var clauses: QueryClauses - - public init(_ name: String, database: String? = nil) { - clauses = QueryClauses(name, alias: nil, database: database) - } - -} - -// TODO: decide: simplify the below with a boxed type instead - -public struct Select : ExpressionType { - - public var template: String - public var bindings: [Binding?] - - public init(_ template: String, _ bindings: [Binding?]) { - self.template = template - self.bindings = bindings - } - -} - -public struct Insert : ExpressionType { - - public var template: String - public var bindings: [Binding?] - - public init(_ template: String, _ bindings: [Binding?]) { - self.template = template - self.bindings = bindings - } - -} - -public struct Update : ExpressionType { - - public var template: String - public var bindings: [Binding?] - - public init(_ template: String, _ bindings: [Binding?]) { - self.template = template - self.bindings = bindings - } - -} - -public struct Delete : ExpressionType { - - public var template: String - public var bindings: [Binding?] - - public init(_ template: String, _ bindings: [Binding?]) { - self.template = template - self.bindings = bindings - } - -} - -extension Connection { - - public func prepare(_ query: QueryType) throws -> AnySequence { - let expression = query.expression - let statement = try prepare(expression.template, expression.bindings) - - let columnNames: [String: Int] = try { - var (columnNames, idx) = ([String: Int](), 0) - column: for each in query.clauses.select.columns { - var names = each.expression.template.characters.split { $0 == "." }.map(String.init) - let column = names.removeLast() - let namespace = names.joined(separator: ".") - - func expandGlob(_ namespace: Bool) -> ((QueryType) throws -> Void) { - return { (query: QueryType) throws -> (Void) in - var q = type(of: query).init(query.clauses.from.name, database: query.clauses.from.database) - q.clauses.select = query.clauses.select - let e = q.expression - var names = try self.prepare(e.template, e.bindings).columnNames.map { $0.quote() } - if namespace { names = names.map { "\(query.tableName().expression.template).\($0)" } } - for name in names { columnNames[name] = idx; idx += 1 } - } - } - - if column == "*" { - var select = query - select.clauses.select = (false, [Expression(literal: "*") as Expressible]) - let queries = [select] + query.clauses.join.map { $0.query } - if !namespace.isEmpty { - for q in queries { - if q.tableName().expression.template == namespace { - try expandGlob(true)(q) - continue column - } - } - fatalError("no such table: \(namespace)") - } - for q in queries { - try expandGlob(query.clauses.join.count > 0)(q) - } - continue - } - - columnNames[each.expression.template] = idx - idx += 1 - } - return columnNames - }() - - return AnySequence { - AnyIterator { statement.next().map { Row(columnNames, $0) } } - } - } - - public func scalar(_ query: ScalarQuery) throws -> V { - let expression = query.expression - return value(try scalar(expression.template, expression.bindings)) - } - - public func scalar(_ query: ScalarQuery) throws -> V.ValueType? { - let expression = query.expression - guard let value = try scalar(expression.template, expression.bindings) as? V.Datatype else { return nil } - return V.fromDatatypeValue(value) - } - - public func scalar(_ query: Select) throws -> V { - let expression = query.expression - return value(try scalar(expression.template, expression.bindings)) - } - - public func scalar(_ query: Select) throws -> V.ValueType? { - let expression = query.expression - guard let value = try scalar(expression.template, expression.bindings) as? V.Datatype else { return nil } - return V.fromDatatypeValue(value) - } - - public func pluck(_ query: QueryType) throws -> Row? { - return try prepare(query.limit(1, query.clauses.limit?.offset)).makeIterator().next() - } - - /// Runs an `Insert` query. - /// - /// - SeeAlso: `QueryType.insert(value:_:)` - /// - SeeAlso: `QueryType.insert(values:)` - /// - SeeAlso: `QueryType.insert(or:_:)` - /// - SeeAlso: `QueryType.insert()` - /// - /// - Parameter query: An insert query. - /// - /// - Returns: The insert’s rowid. - @discardableResult public func run(_ query: Insert) throws -> Int64 { - let expression = query.expression - return try sync { - try self.run(expression.template, expression.bindings) - return self.lastInsertRowid - } - } - - /// Runs an `Update` query. - /// - /// - SeeAlso: `QueryType.insert(query:)` - /// - SeeAlso: `QueryType.update(values:)` - /// - /// - Parameter query: An update query. - /// - /// - Returns: The number of updated rows. - @discardableResult public func run(_ query: Update) throws -> Int { - let expression = query.expression - return try sync { - try self.run(expression.template, expression.bindings) - return self.changes - } - } - - /// Runs a `Delete` query. - /// - /// - SeeAlso: `QueryType.delete()` - /// - /// - Parameter query: A delete query. - /// - /// - Returns: The number of deleted rows. - @discardableResult public func run(_ query: Delete) throws -> Int { - let expression = query.expression - return try sync { - try self.run(expression.template, expression.bindings) - return self.changes - } - } - -} - -public struct Row { - - fileprivate let columnNames: [String: Int] - - fileprivate let values: [Binding?] - - fileprivate init(_ columnNames: [String: Int], _ values: [Binding?]) { - self.columnNames = columnNames - self.values = values - } - - /// Returns a row’s value for the given column. - /// - /// - Parameter column: An expression representing a column selected in a Query. - /// - /// - Returns: The value for the given column. - public func get(_ column: Expression) -> V { - return get(Expression(column))! - } - public func get(_ column: Expression) -> V? { - func valueAtIndex(_ idx: Int) -> V? { - guard let value = values[idx] as? V.Datatype else { return nil } - return (V.fromDatatypeValue(value) as? V)! - } - - guard let idx = columnNames[column.template] else { - let similar = Array(columnNames.keys).filter { $0.hasSuffix(".\(column.template)") } - - switch similar.count { - case 0: - fatalError("no such column '\(column.template)' in columns: \(columnNames.keys.sorted())") - case 1: - return valueAtIndex(columnNames[similar[0]]!) - default: - fatalError("ambiguous column '\(column.template)' (please disambiguate: \(similar))") - } - } - - return valueAtIndex(idx) - } - - // FIXME: rdar://problem/18673897 // subscript… - - public subscript(column: Expression) -> Blob { - return get(column) - } - public subscript(column: Expression) -> Blob? { - return get(column) - } - - public subscript(column: Expression) -> Bool { - return get(column) - } - public subscript(column: Expression) -> Bool? { - return get(column) - } - - public subscript(column: Expression) -> Double { - return get(column) - } - public subscript(column: Expression) -> Double? { - return get(column) - } - - public subscript(column: Expression) -> Int { - return get(column) - } - public subscript(column: Expression) -> Int? { - return get(column) - } - - public subscript(column: Expression) -> Int64 { - return get(column) - } - public subscript(column: Expression) -> Int64? { - return get(column) - } - - public subscript(column: Expression) -> String { - return get(column) - } - public subscript(column: Expression) -> String? { - return get(column) - } - -} - -/// Determines the join operator for a query’s `JOIN` clause. -public enum JoinType : String { - - /// A `CROSS` join. - case cross = "CROSS" - - /// An `INNER` join. - case inner = "INNER" - - /// A `LEFT OUTER` join. - case leftOuter = "LEFT OUTER" - -} - -/// ON CONFLICT resolutions. -public enum OnConflict: String { - - case replace = "REPLACE" - - case rollback = "ROLLBACK" - - case abort = "ABORT" - - case fail = "FAIL" - - case ignore = "IGNORE" - -} - -// MARK: - Private - -public struct QueryClauses { - - var select = (distinct: false, columns: [Expression(literal: "*") as Expressible]) - - var from: (name: String, alias: String?, database: String?) - - var join = [(type: JoinType, query: QueryType, condition: Expressible)]() - - var filters: Expression? - - var group: (by: [Expressible], having: Expression?)? - - var order = [Expressible]() - - var limit: (length: Int, offset: Int?)? - - fileprivate init(_ name: String, alias: String?, database: String?) { - self.from = (name, alias, database) - } - -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Schema.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Schema.swift deleted file mode 100644 index 1388170e47..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Schema.swift +++ /dev/null @@ -1,519 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -extension SchemaType { - - // MARK: - DROP TABLE / VIEW / VIRTUAL TABLE - - public func drop(ifExists: Bool = false) -> String { - return drop("TABLE", tableName(), ifExists) - } - -} - -extension Table { - - // MARK: - CREATE TABLE - - public func create(temporary: Bool = false, ifNotExists: Bool = false, block: (TableBuilder) -> Void) -> String { - let builder = TableBuilder() - - block(builder) - - let clauses: [Expressible?] = [ - create(Table.identifier, tableName(), temporary ? .Temporary : nil, ifNotExists), - "".wrap(builder.definitions) as Expression - ] - - return " ".join(clauses.flatMap { $0 }).asSQL() - } - - public func create(_ query: QueryType, temporary: Bool = false, ifNotExists: Bool = false) -> String { - let clauses: [Expressible?] = [ - create(Table.identifier, tableName(), temporary ? .Temporary : nil, ifNotExists), - Expression(literal: "AS"), - query - ] - - return " ".join(clauses.flatMap { $0 }).asSQL() - } - - // MARK: - ALTER TABLE … ADD COLUMN - - public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V) -> String { - return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, nil)) - } - - public func addColumn(_ name: Expression, check: Expression, defaultValue: V) -> String { - return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, nil)) - } - - public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V? = nil) -> String { - return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, nil)) - } - - public func addColumn(_ name: Expression, check: Expression, defaultValue: V? = nil) -> String { - return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, nil)) - } - - public func addColumn(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { - return addColumn(definition(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil)) - } - - public func addColumn(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { - return addColumn(definition(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil)) - } - - public func addColumn(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { - return addColumn(definition(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil)) - } - - public func addColumn(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) -> String where V.Datatype == Int64 { - return addColumn(definition(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil)) - } - - public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V, collate: Collation) -> String where V.Datatype == String { - return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, collate)) - } - - public func addColumn(_ name: Expression, check: Expression, defaultValue: V, collate: Collation) -> String where V.Datatype == String { - return addColumn(definition(name, V.declaredDatatype, nil, false, false, check, defaultValue, nil, collate)) - } - - public func addColumn(_ name: Expression, check: Expression? = nil, defaultValue: V? = nil, collate: Collation) -> String where V.Datatype == String { - return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, collate)) - } - - public func addColumn(_ name: Expression, check: Expression, defaultValue: V? = nil, collate: Collation) -> String where V.Datatype == String { - return addColumn(definition(name, V.declaredDatatype, nil, true, false, check, defaultValue, nil, collate)) - } - - fileprivate func addColumn(_ expression: Expressible) -> String { - return " ".join([ - Expression(literal: "ALTER TABLE"), - tableName(), - Expression(literal: "ADD COLUMN"), - expression - ]).asSQL() - } - - // MARK: - ALTER TABLE … RENAME TO - - public func rename(_ to: Table) -> String { - return rename(to: to) - } - - // MARK: - CREATE INDEX - - public func createIndex(_ columns: Expressible...) -> String { - return createIndex(columns) - } - - public func createIndex(_ columns: [Expressible], unique: Bool = false, ifNotExists: Bool = false) -> String { - let clauses: [Expressible?] = [ - create("INDEX", indexName(columns), unique ? .Unique : nil, ifNotExists), - Expression(literal: "ON"), - tableName(qualified: false), - "".wrap(columns) as Expression - ] - - return " ".join(clauses.flatMap { $0 }).asSQL() - } - - // MARK: - DROP INDEX - - public func dropIndex(_ columns: Expressible...) -> String { - return dropIndex(columns) - } - - public func dropIndex(_ columns: [Expressible], ifExists: Bool = false) -> String { - return drop("INDEX", indexName(columns), ifExists) - } - - fileprivate func indexName(_ columns: [Expressible]) -> Expressible { - let string = (["index", clauses.from.name, "on"] + columns.map { $0.expression.template }).joined(separator: " ").lowercased() - - let index = string.characters.reduce("") { underscored, character in - guard character != "\"" else { - return underscored - } - guard "a"..."z" ~= character || "0"..."9" ~= character else { - return underscored + "_" - } - return underscored + String(character) - } - - return database(namespace: index) - } - -} - -extension View { - - // MARK: - CREATE VIEW - - public func create(_ query: QueryType, temporary: Bool = false, ifNotExists: Bool = false) -> String { - let clauses: [Expressible?] = [ - create(View.identifier, tableName(), temporary ? .Temporary : nil, ifNotExists), - Expression(literal: "AS"), - query - ] - - return " ".join(clauses.flatMap { $0 }).asSQL() - } - - // MARK: - DROP VIEW - - public func drop(ifExists: Bool = false) -> String { - return drop("VIEW", tableName(), ifExists) - } - -} - -extension VirtualTable { - - // MARK: - CREATE VIRTUAL TABLE - - public func create(_ using: Module, ifNotExists: Bool = false) -> String { - let clauses: [Expressible?] = [ - create(VirtualTable.identifier, tableName(), nil, ifNotExists), - Expression(literal: "USING"), - using - ] - - return " ".join(clauses.flatMap { $0 }).asSQL() - } - - // MARK: - ALTER TABLE … RENAME TO - - public func rename(_ to: VirtualTable) -> String { - return rename(to: to) - } - -} - -public final class TableBuilder { - - fileprivate var definitions = [Expressible]() - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil) { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V) { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil) { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V) { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil) { - column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression) { - column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V) { - column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil) { - column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression) { - column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V) { - column(name, V.declaredDatatype, nil, true, unique, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, primaryKey: Bool, check: Expression? = nil, defaultValue: Expression? = nil) { - column(name, V.declaredDatatype, primaryKey ? .default : nil, false, false, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, primaryKey: Bool, check: Expression, defaultValue: Expression? = nil) { - column(name, V.declaredDatatype, primaryKey ? .default : nil, false, false, check, defaultValue, nil, nil) - } - - public func column(_ name: Expression, primaryKey: PrimaryKey, check: Expression? = nil) where V.Datatype == Int64 { - column(name, V.declaredDatatype, primaryKey, false, false, check, nil, nil, nil) - } - - public func column(_ name: Expression, primaryKey: PrimaryKey, check: Expression) where V.Datatype == Int64 { - column(name, V.declaredDatatype, primaryKey, false, false, check, nil, nil, nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { - column(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { - column(name, V.declaredDatatype, nil, false, unique, check, nil, (table, other), nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { - column(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, references table: QueryType, _ other: Expression) where V.Datatype == Int64 { - column(name, V.declaredDatatype, nil, true, unique, check, nil, (table, other), nil) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: Expression, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression? = nil, defaultValue: V, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression? = nil, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: Expression, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - public func column(_ name: Expression, unique: Bool = false, check: Expression, defaultValue: V, collate: Collation) where V.Datatype == String { - column(name, V.declaredDatatype, nil, false, unique, check, defaultValue, nil, collate) - } - - fileprivate func column(_ name: Expressible, _ datatype: String, _ primaryKey: PrimaryKey?, _ null: Bool, _ unique: Bool, _ check: Expressible?, _ defaultValue: Expressible?, _ references: (QueryType, Expressible)?, _ collate: Collation?) { - definitions.append(definition(name, datatype, primaryKey, null, unique, check, defaultValue, references, collate)) - } - - // MARK: - - - public func primaryKey(_ column: Expression) { - primaryKey([column]) - } - - public func primaryKey(_ compositeA: Expression, _ b: Expression) { - primaryKey([compositeA, b]) - } - - public func primaryKey(_ compositeA: Expression, _ b: Expression, _ c: Expression) { - primaryKey([compositeA, b, c]) - } - - fileprivate func primaryKey(_ composite: [Expressible]) { - definitions.append("PRIMARY KEY".prefix(composite)) - } - - public func unique(_ columns: Expressible...) { - unique(columns) - } - - public func unique(_ columns: [Expressible]) { - definitions.append("UNIQUE".prefix(columns)) - } - - public func check(_ condition: Expression) { - check(Expression(condition)) - } - - public func check(_ condition: Expression) { - definitions.append("CHECK".prefix(condition)) - } - - public enum Dependency: String { - - case noAction = "NO ACTION" - - case restrict = "RESTRICT" - - case setNull = "SET NULL" - - case setDefault = "SET DEFAULT" - - case cascade = "CASCADE" - - } - - public func foreignKey(_ column: Expression, references table: QueryType, _ other: Expression, update: Dependency? = nil, delete: Dependency? = nil) { - foreignKey(column, (table, other), update, delete) - } - - public func foreignKey(_ column: Expression, references table: QueryType, _ other: Expression, update: Dependency? = nil, delete: Dependency? = nil) { - foreignKey(column, (table, other), update, delete) - } - - public func foreignKey(_ composite: (Expression, Expression), references table: QueryType, _ other: (Expression, Expression), update: Dependency? = nil, delete: Dependency? = nil) { - let composite = ", ".join([composite.0, composite.1]) - let references = (table, ", ".join([other.0, other.1])) - - foreignKey(composite, references, update, delete) - } - - public func foreignKey(_ composite: (Expression, Expression, Expression), references table: QueryType, _ other: (Expression, Expression, Expression), update: Dependency? = nil, delete: Dependency? = nil) { - let composite = ", ".join([composite.0, composite.1, composite.2]) - let references = (table, ", ".join([other.0, other.1, other.2])) - - foreignKey(composite, references, update, delete) - } - - fileprivate func foreignKey(_ column: Expressible, _ references: (QueryType, Expressible), _ update: Dependency?, _ delete: Dependency?) { - let clauses: [Expressible?] = [ - "FOREIGN KEY".prefix(column), - reference(references), - update.map { Expression(literal: "ON UPDATE \($0.rawValue)") }, - delete.map { Expression(literal: "ON DELETE \($0.rawValue)") } - ] - - definitions.append(" ".join(clauses.flatMap { $0 })) - } - -} - -public enum PrimaryKey { - - case `default` - - case autoincrement - -} - -public struct Module { - - fileprivate let name: String - - fileprivate let arguments: [Expressible] - - public init(_ name: String, _ arguments: [Expressible]) { - self.init(name: name.quote(), arguments: arguments) - } - - init(name: String, arguments: [Expressible]) { - self.name = name - self.arguments = arguments - } - -} - -extension Module : Expressible { - - public var expression: Expression { - return name.wrap(arguments) - } - -} - -// MARK: - Private - -private extension QueryType { - - func create(_ identifier: String, _ name: Expressible, _ modifier: Modifier?, _ ifNotExists: Bool) -> Expressible { - let clauses: [Expressible?] = [ - Expression(literal: "CREATE"), - modifier.map { Expression(literal: $0.rawValue) }, - Expression(literal: identifier), - ifNotExists ? Expression(literal: "IF NOT EXISTS") : nil, - name - ] - - return " ".join(clauses.flatMap { $0 }) - } - - func rename(to: Self) -> String { - return " ".join([ - Expression(literal: "ALTER TABLE"), - tableName(), - Expression(literal: "RENAME TO"), - Expression(to.clauses.from.name) - ]).asSQL() - } - - func drop(_ identifier: String, _ name: Expressible, _ ifExists: Bool) -> String { - let clauses: [Expressible?] = [ - Expression(literal: "DROP \(identifier)"), - ifExists ? Expression(literal: "IF EXISTS") : nil, - name - ] - - return " ".join(clauses.flatMap { $0 }).asSQL() - } - -} - -private func definition(_ column: Expressible, _ datatype: String, _ primaryKey: PrimaryKey?, _ null: Bool, _ unique: Bool, _ check: Expressible?, _ defaultValue: Expressible?, _ references: (QueryType, Expressible)?, _ collate: Collation?) -> Expressible { - let clauses: [Expressible?] = [ - column, - Expression(literal: datatype), - primaryKey.map { Expression(literal: $0 == .autoincrement ? "PRIMARY KEY AUTOINCREMENT" : "PRIMARY KEY") }, - null ? nil : Expression(literal: "NOT NULL"), - unique ? Expression(literal: "UNIQUE") : nil, - check.map { " ".join([Expression(literal: "CHECK"), $0]) }, - defaultValue.map { "DEFAULT".prefix($0) }, - references.map(reference), - collate.map { " ".join([Expression(literal: "COLLATE"), $0]) } - ] - - return " ".join(clauses.flatMap { $0 }) -} - -private func reference(_ primary: (QueryType, Expressible)) -> Expressible { - return " ".join([ - Expression(literal: "REFERENCES"), - primary.0.tableName(qualified: false), - "".wrap(primary.1) as Expression - ]) -} - -private enum Modifier : String { - - case Unique = "UNIQUE" - - case Temporary = "TEMPORARY" - -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Setter.swift b/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Setter.swift deleted file mode 100644 index 86f16fcae3..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLite/Typed/Setter.swift +++ /dev/null @@ -1,277 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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. -// - -precedencegroup ColumnAssignment { - associativity: left - assignment: true - lowerThan: AssignmentPrecedence -} - -infix operator <- : ColumnAssignment - -public struct Setter { - - let column: Expressible - let value: Expressible - - fileprivate init(column: Expression, value: Expression) { - self.column = column - self.value = value - } - - fileprivate init(column: Expression, value: V) { - self.column = column - self.value = value - } - - fileprivate init(column: Expression, value: Expression) { - self.column = column - self.value = value - } - - fileprivate init(column: Expression, value: Expression) { - self.column = column - self.value = value - } - - fileprivate init(column: Expression, value: V?) { - self.column = column - self.value = Expression(value: value) - } - -} - -extension Setter : Expressible { - - public var expression: Expression { - return "=".infix(column, value, wrap: false) - } - -} - -public func <-(column: Expression, value: Expression) -> Setter { - return Setter(column: column, value: value) -} -public func <-(column: Expression, value: V) -> Setter { - return Setter(column: column, value: value) -} -public func <-(column: Expression, value: Expression) -> Setter { - return Setter(column: column, value: value) -} -public func <-(column: Expression, value: Expression) -> Setter { - return Setter(column: column, value: value) -} -public func <-(column: Expression, value: V?) -> Setter { - return Setter(column: column, value: value) -} - -public func +=(column: Expression, value: Expression) -> Setter { - return column <- column + value -} -public func +=(column: Expression, value: String) -> Setter { - return column <- column + value -} -public func +=(column: Expression, value: Expression) -> Setter { - return column <- column + value -} -public func +=(column: Expression, value: Expression) -> Setter { - return column <- column + value -} -public func +=(column: Expression, value: String) -> Setter { - return column <- column + value -} - -public func +=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column + value -} -public func +=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column + value -} -public func +=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column + value -} -public func +=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column + value -} -public func +=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column + value -} - -public func -=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column - value -} -public func -=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column - value -} -public func -=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column - value -} -public func -=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column - value -} -public func -=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column - value -} - -public func *=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column * value -} -public func *=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column * value -} -public func *=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column * value -} -public func *=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column * value -} -public func *=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column * value -} - -public func /=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column / value -} -public func /=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column / value -} -public func /=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column / value -} -public func /=(column: Expression, value: Expression) -> Setter where V.Datatype : Number { - return column <- column / value -} -public func /=(column: Expression, value: V) -> Setter where V.Datatype : Number { - return column <- column / value -} - -public func %=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column % value -} -public func %=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column % value -} -public func %=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column % value -} -public func %=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column % value -} -public func %=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column % value -} - -public func <<=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column << value -} -public func <<=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column << value -} -public func <<=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column << value -} -public func <<=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column << value -} -public func <<=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column << value -} - -public func >>=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column >> value -} -public func >>=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column >> value -} -public func >>=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column >> value -} -public func >>=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column >> value -} -public func >>=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column >> value -} - -public func &=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column & value -} -public func &=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column & value -} -public func &=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column & value -} -public func &=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column & value -} -public func &=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column & value -} - -public func |=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column | value -} -public func |=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column | value -} -public func |=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column | value -} -public func |=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column | value -} -public func |=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column | value -} - -public func ^=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column ^ value -} -public func ^=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column ^ value -} -public func ^=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column ^ value -} -public func ^=(column: Expression, value: Expression) -> Setter where V.Datatype == Int64 { - return column <- column ^ value -} -public func ^=(column: Expression, value: V) -> Setter where V.Datatype == Int64 { - return column <- column ^ value -} - -public postfix func ++(column: Expression) -> Setter where V.Datatype == Int64 { - return Expression(column) += 1 -} -public postfix func ++(column: Expression) -> Setter where V.Datatype == Int64 { - return Expression(column) += 1 -} - -public postfix func --(column: Expression) -> Setter where V.Datatype == Int64 { - return Expression(column) -= 1 -} -public postfix func --(column: Expression) -> Setter where V.Datatype == Int64 { - return Expression(column) -= 1 -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m b/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m deleted file mode 100644 index d8fe6b683c..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/SQLite-Bridging.m +++ /dev/null @@ -1,138 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// 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 "SQLite-Bridging.h" -#import "fts3_tokenizer.h" - -#pragma mark - FTS - -typedef struct __SQLiteTokenizer { - sqlite3_tokenizer base; - __unsafe_unretained _SQLiteTokenizerNextCallback callback; -} __SQLiteTokenizer; - -typedef struct __SQLiteTokenizerCursor { - void * base; - const char * input; - int inputOffset; - int inputLength; - int idx; -} __SQLiteTokenizerCursor; - -static NSMutableDictionary * __SQLiteTokenizerMap; - -static int __SQLiteTokenizerCreate(int argc, const char * const * argv, sqlite3_tokenizer ** ppTokenizer) { - __SQLiteTokenizer * tokenizer = (__SQLiteTokenizer *)sqlite3_malloc(sizeof(__SQLiteTokenizer)); - if (!tokenizer) { - return SQLITE_NOMEM; - } - memset(tokenizer, 0, sizeof(* tokenizer)); - - NSString * key = [NSString stringWithUTF8String:argv[0]]; - tokenizer->callback = [__SQLiteTokenizerMap objectForKey:key]; - if (!tokenizer->callback) { - return SQLITE_ERROR; - } - - *ppTokenizer = &tokenizer->base; - return SQLITE_OK; -} - -static int __SQLiteTokenizerDestroy(sqlite3_tokenizer * pTokenizer) { - sqlite3_free(pTokenizer); - return SQLITE_OK; -} - -static int __SQLiteTokenizerOpen(sqlite3_tokenizer * pTokenizer, const char * pInput, int nBytes, sqlite3_tokenizer_cursor ** ppCursor) { - __SQLiteTokenizerCursor * cursor = (__SQLiteTokenizerCursor *)sqlite3_malloc(sizeof(__SQLiteTokenizerCursor)); - if (!cursor) { - return SQLITE_NOMEM; - } - - cursor->input = pInput; - cursor->inputOffset = 0; - cursor->inputLength = 0; - cursor->idx = 0; - - *ppCursor = (sqlite3_tokenizer_cursor *)cursor; - return SQLITE_OK; -} - -static int __SQLiteTokenizerClose(sqlite3_tokenizer_cursor * pCursor) { - sqlite3_free(pCursor); - return SQLITE_OK; -} - -static int __SQLiteTokenizerNext(sqlite3_tokenizer_cursor * pCursor, const char ** ppToken, int * pnBytes, int * piStartOffset, int * piEndOffset, int * piPosition) { - __SQLiteTokenizerCursor * cursor = (__SQLiteTokenizerCursor *)pCursor; - __SQLiteTokenizer * tokenizer = (__SQLiteTokenizer *)cursor->base; - - cursor->inputOffset += cursor->inputLength; - const char * input = cursor->input + cursor->inputOffset; - const char * token = [tokenizer->callback(input, &cursor->inputOffset, &cursor->inputLength) cStringUsingEncoding:NSUTF8StringEncoding]; - if (!token) { - return SQLITE_DONE; - } - - *ppToken = token; - *pnBytes = (int)strlen(token); - *piStartOffset = cursor->inputOffset; - *piEndOffset = cursor->inputOffset + cursor->inputLength; - *piPosition = cursor->idx++; - return SQLITE_OK; -} - -static const sqlite3_tokenizer_module __SQLiteTokenizerModule = { - 0, - __SQLiteTokenizerCreate, - __SQLiteTokenizerDestroy, - __SQLiteTokenizerOpen, - __SQLiteTokenizerClose, - __SQLiteTokenizerNext -}; - -int _SQLiteRegisterTokenizer(SQLiteHandle * db, const char * moduleName, const char * submoduleName, _SQLiteTokenizerNextCallback callback) { - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - __SQLiteTokenizerMap = [NSMutableDictionary new]; - }); - - sqlite3_stmt * stmt; - int status = sqlite3_prepare_v2((sqlite3 *)db, "SELECT fts3_tokenizer(?, ?)", -1, &stmt, 0); - if (status != SQLITE_OK ){ - return status; - } - const sqlite3_tokenizer_module * pModule = &__SQLiteTokenizerModule; - sqlite3_bind_text(stmt, 1, moduleName, -1, SQLITE_STATIC); - sqlite3_bind_blob(stmt, 2, &pModule, sizeof(pModule), SQLITE_STATIC); - sqlite3_step(stmt); - status = sqlite3_finalize(stmt); - if (status != SQLITE_OK ){ - return status; - } - - [__SQLiteTokenizerMap setObject:[callback copy] forKey:[NSString stringWithUTF8String:submoduleName]]; - - return SQLITE_OK; -} diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h b/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h deleted file mode 100644 index d8a1e44b47..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/fts3_tokenizer.h +++ /dev/null @@ -1,161 +0,0 @@ -/* -** 2006 July 10 -** -** The author disclaims copyright to this source code. -** -************************************************************************* -** Defines the interface to tokenizers used by fulltext-search. There -** are three basic components: -** -** sqlite3_tokenizer_module is a singleton defining the tokenizer -** interface functions. This is essentially the class structure for -** tokenizers. -** -** sqlite3_tokenizer is used to define a particular tokenizer, perhaps -** including customization information defined at creation time. -** -** sqlite3_tokenizer_cursor is generated by a tokenizer to generate -** tokens from a particular input. -*/ -#ifndef _FTS3_TOKENIZER_H_ -#define _FTS3_TOKENIZER_H_ - -/* TODO(shess) Only used for SQLITE_OK and SQLITE_DONE at this time. -** If tokenizers are to be allowed to call sqlite3_*() functions, then -** we will need a way to register the API consistently. -*/ -#import "sqlite3.h" - -/* -** Structures used by the tokenizer interface. When a new tokenizer -** implementation is registered, the caller provides a pointer to -** an sqlite3_tokenizer_module containing pointers to the callback -** functions that make up an implementation. -** -** When an fts3 table is created, it passes any arguments passed to -** the tokenizer clause of the CREATE VIRTUAL TABLE statement to the -** sqlite3_tokenizer_module.xCreate() function of the requested tokenizer -** implementation. The xCreate() function in turn returns an -** sqlite3_tokenizer structure representing the specific tokenizer to -** be used for the fts3 table (customized by the tokenizer clause arguments). -** -** To tokenize an input buffer, the sqlite3_tokenizer_module.xOpen() -** method is called. It returns an sqlite3_tokenizer_cursor object -** that may be used to tokenize a specific input buffer based on -** the tokenization rules supplied by a specific sqlite3_tokenizer -** object. -*/ -typedef struct sqlite3_tokenizer_module sqlite3_tokenizer_module; -typedef struct sqlite3_tokenizer sqlite3_tokenizer; -typedef struct sqlite3_tokenizer_cursor sqlite3_tokenizer_cursor; - -struct sqlite3_tokenizer_module { - - /* - ** Structure version. Should always be set to 0 or 1. - */ - int iVersion; - - /* - ** Create a new tokenizer. The values in the argv[] array are the - ** arguments passed to the "tokenizer" clause of the CREATE VIRTUAL - ** TABLE statement that created the fts3 table. For example, if - ** the following SQL is executed: - ** - ** CREATE .. USING fts3( ... , tokenizer arg1 arg2) - ** - ** then argc is set to 2, and the argv[] array contains pointers - ** to the strings "arg1" and "arg2". - ** - ** This method should return either SQLITE_OK (0), or an SQLite error - ** code. If SQLITE_OK is returned, then *ppTokenizer should be set - ** to point at the newly created tokenizer structure. The generic - ** sqlite3_tokenizer.pModule variable should not be initialized by - ** this callback. The caller will do so. - */ - int (*xCreate)( - int argc, /* Size of argv array */ - const char *const*argv, /* Tokenizer argument strings */ - sqlite3_tokenizer **ppTokenizer /* OUT: Created tokenizer */ - ); - - /* - ** Destroy an existing tokenizer. The fts3 module calls this method - ** exactly once for each successful call to xCreate(). - */ - int (*xDestroy)(sqlite3_tokenizer *pTokenizer); - - /* - ** Create a tokenizer cursor to tokenize an input buffer. The caller - ** is responsible for ensuring that the input buffer remains valid - ** until the cursor is closed (using the xClose() method). - */ - int (*xOpen)( - sqlite3_tokenizer *pTokenizer, /* Tokenizer object */ - const char *pInput, int nBytes, /* Input buffer */ - sqlite3_tokenizer_cursor **ppCursor /* OUT: Created tokenizer cursor */ - ); - - /* - ** Destroy an existing tokenizer cursor. The fts3 module calls this - ** method exactly once for each successful call to xOpen(). - */ - int (*xClose)(sqlite3_tokenizer_cursor *pCursor); - - /* - ** Retrieve the next token from the tokenizer cursor pCursor. This - ** method should either return SQLITE_OK and set the values of the - ** "OUT" variables identified below, or SQLITE_DONE to indicate that - ** the end of the buffer has been reached, or an SQLite error code. - ** - ** *ppToken should be set to point at a buffer containing the - ** normalized version of the token (i.e. after any case-folding and/or - ** stemming has been performed). *pnBytes should be set to the length - ** of this buffer in bytes. The input text that generated the token is - ** identified by the byte offsets returned in *piStartOffset and - ** *piEndOffset. *piStartOffset should be set to the index of the first - ** byte of the token in the input buffer. *piEndOffset should be set - ** to the index of the first byte just past the end of the token in - ** the input buffer. - ** - ** The buffer *ppToken is set to point at is managed by the tokenizer - ** implementation. It is only required to be valid until the next call - ** to xNext() or xClose(). - */ - /* TODO(shess) current implementation requires pInput to be - ** nul-terminated. This should either be fixed, or pInput/nBytes - ** should be converted to zInput. - */ - int (*xNext)( - sqlite3_tokenizer_cursor *pCursor, /* Tokenizer cursor */ - const char **ppToken, int *pnBytes, /* OUT: Normalized text for token */ - int *piStartOffset, /* OUT: Byte offset of token in input buffer */ - int *piEndOffset, /* OUT: Byte offset of end of token in input buffer */ - int *piPosition /* OUT: Number of tokens returned before this one */ - ); - - /*********************************************************************** - ** Methods below this point are only available if iVersion>=1. - */ - - /* - ** Configure the language id of a tokenizer cursor. - */ - int (*xLanguageid)(sqlite3_tokenizer_cursor *pCsr, int iLangid); -}; - -struct sqlite3_tokenizer { - const sqlite3_tokenizer_module *pModule; /* The module for this tokenizer */ - /* Tokenizer implementations will typically add additional fields */ -}; - -struct sqlite3_tokenizer_cursor { - sqlite3_tokenizer *pTokenizer; /* Tokenizer for this cursor. */ - /* Tokenizer implementations will typically add additional fields */ -}; - -int fts3_global_term_cnt(int iTerm, int iCol); -int fts3_term_cnt(int iTerm, int iCol); - - -#endif /* _FTS3_TOKENIZER_H_ */ diff --git a/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h b/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h deleted file mode 100644 index d15e8d56d6..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Sources/SQLiteObjc/include/SQLite-Bridging.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// SQLite.swift -// https://github.com/stephencelis/SQLite.swift -// Copyright © 2014-2015 Stephen Celis. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -@import Foundation; - -#ifndef COCOAPODS -#import "sqlite3.h" -#endif - -typedef struct SQLiteHandle SQLiteHandle; // CocoaPods workaround - -NS_ASSUME_NONNULL_BEGIN -typedef NSString * _Nullable (^_SQLiteTokenizerNextCallback)(const char * input, int * inputOffset, int * inputLength); -int _SQLiteRegisterTokenizer(SQLiteHandle * db, const char * module, const char * tokenizer, _Nullable _SQLiteTokenizerNextCallback callback); -NS_ASSUME_NONNULL_END - diff --git a/Carthage/Checkouts/SQLite.swift/Tests/Carthage/.gitignore b/Carthage/Checkouts/SQLite.swift/Tests/Carthage/.gitignore deleted file mode 100644 index 2d43454a24..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/Carthage/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -Carthage/ -Cartfile -Cartfile.resolved diff --git a/Carthage/Checkouts/SQLite.swift/Tests/Carthage/Makefile b/Carthage/Checkouts/SQLite.swift/Tests/Carthage/Makefile deleted file mode 100644 index f28eb25b06..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/Carthage/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -CARTHAGE := /usr/local/bin/carthage -CARTHAGE_PLATFORM := iOS -CARTHAGE_CONFIGURATION := Release -CARTHAGE_DIR := Carthage -CARTHAGE_ARGS := --no-use-binaries -CARTHAGE_TOOLCHAIN := com.apple.dt.toolchain.Swift_3_0 -CARTHAGE_CMDLINE := --configuration $(CARTHAGE_CONFIGURATION) --platform $(CARTHAGE_PLATFORM) --toolchain $(CARTHAGE_TOOLCHAIN) $(CARTHAGE_ARGS) - -test: $(CARTHAGE) Cartfile - $< bootstrap $(CARTHAGE_CMDLINE) - -Cartfile: - echo 'git "$(TRAVIS_BUILD_DIR)" "HEAD"' > $@ - -clean: - @rm -f Cartfile Cartfile.resolved diff --git a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/.gitignore b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/.gitignore deleted file mode 100644 index 4cf24de2ce..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/.gitignore +++ /dev/null @@ -1 +0,0 @@ -gems/ diff --git a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile deleted file mode 100644 index 94018f18bd..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -source 'https://rubygems.org' - -gem 'cocoapods', '~> 1.1.0' -gem 'minitest' diff --git a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile.lock b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile.lock deleted file mode 100644 index e8879f13ca..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Gemfile.lock +++ /dev/null @@ -1,74 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - CFPropertyList (2.3.3) - activesupport (4.2.7.1) - i18n (~> 0.7) - json (~> 1.7, >= 1.7.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - claide (1.0.1) - cocoapods (1.1.1) - activesupport (>= 4.0.2, < 5) - claide (>= 1.0.1, < 2.0) - cocoapods-core (= 1.1.1) - cocoapods-deintegrate (>= 1.0.1, < 2.0) - cocoapods-downloader (>= 1.1.2, < 2.0) - cocoapods-plugins (>= 1.0.0, < 2.0) - cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-stats (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.1.1, < 2.0) - cocoapods-try (>= 1.1.0, < 2.0) - colored (~> 1.2) - escape (~> 0.0.4) - fourflusher (~> 2.0.1) - gh_inspector (~> 1.0) - molinillo (~> 0.5.1) - nap (~> 1.0) - xcodeproj (>= 1.3.3, < 2.0) - cocoapods-core (1.1.1) - activesupport (>= 4.0.2, < 5) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - cocoapods-deintegrate (1.0.1) - cocoapods-downloader (1.1.2) - cocoapods-plugins (1.0.0) - nap - cocoapods-search (1.0.0) - cocoapods-stats (1.0.0) - cocoapods-trunk (1.1.1) - nap (>= 0.8, < 2.0) - netrc (= 0.7.8) - cocoapods-try (1.1.0) - colored (1.2) - escape (0.0.4) - fourflusher (2.0.1) - fuzzy_match (2.0.4) - gh_inspector (1.0.2) - i18n (0.7.0) - json (1.8.3) - minitest (5.9.1) - molinillo (0.5.4) - nanaimo (0.2.2) - nap (1.1.0) - netrc (0.7.8) - thread_safe (0.3.5) - tzinfo (1.2.2) - thread_safe (~> 0.1) - xcodeproj (1.4.1) - CFPropertyList (~> 2.3.3) - activesupport (>= 3) - claide (>= 1.0.1, < 2.0) - colored (~> 1.2) - nanaimo (~> 0.2.0) - -PLATFORMS - ruby - -DEPENDENCIES - cocoapods (~> 1.1.0) - minitest - -BUNDLED WITH - 1.13.3 diff --git a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Makefile b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Makefile deleted file mode 100644 index 26163fdbe1..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -test: install repo_update - @set -e; \ - for test in *_test.rb; do \ - bundle exec ./$$test; \ - done - -repo_update: - @bundle exec pod repo update --silent - -install: - @bundle install --path gems - -.PHONY: test install diff --git a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/integration_test.rb b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/integration_test.rb deleted file mode 100755 index 192aff9032..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/integration_test.rb +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env ruby - -require 'minitest/autorun' -require_relative 'test_running_validator' - -class IntegrationTest < Minitest::Test - - def test_validate_project - assert validator.validate, "validation failed: #{validator.failure_reason}" - end - - private - - def validator - @validator ||= TestRunningValidator.new(podspec, []).tap do |validator| - validator.test_files = Dir["#{project_test_dir}/**/*.swift"] - validator.test_resources = Dir["#{project_test_dir}/fixtures"] - validator.config.verbose = true - validator.no_clean = true - validator.use_frameworks = true - validator.fail_fast = true - validator.local = true - validator.allow_warnings = true - subspec = ENV['VALIDATOR_SUBSPEC'] - if subspec == 'none' - validator.no_subspecs = true - else - validator.only_subspec = subspec - end - if ENV['IOS_SIMULATOR'] - validator.ios_simulator = ENV['IOS_SIMULATOR'] - end - end - end - - def podspec - File.expand_path(File.dirname(__FILE__) + '/../../SQLite.swift.podspec') - end - - def project_test_dir - File.expand_path(File.dirname(__FILE__) + '/../SQLiteTests') - end -end diff --git a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/test_running_validator.rb b/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/test_running_validator.rb deleted file mode 100644 index fcfd3c28ef..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/CocoaPods/test_running_validator.rb +++ /dev/null @@ -1,120 +0,0 @@ -require 'cocoapods' -require 'cocoapods/validator' -require 'fileutils' - -class TestRunningValidator < Pod::Validator - APP_TARGET = 'App' - TEST_TARGET = 'Tests' - - attr_accessor :test_files - attr_accessor :test_resources - attr_accessor :ios_simulator - attr_accessor :tvos_simulator - attr_accessor :watchos_simulator - - def initialize(spec_or_path, source_urls) - super(spec_or_path, source_urls) - self.test_files = [] - self.test_resources = [] - self.ios_simulator = :oldest - self.tvos_simulator = :oldest - self.watchos_simulator = :oldest - end - - def create_app_project - super - project = Xcodeproj::Project.open(validation_dir + "#{APP_TARGET}.xcodeproj") - create_test_target(project) - project.save - end - - def add_app_project_import - super - project = Xcodeproj::Project.open(validation_dir + 'App.xcodeproj') - group = project.new_group(TEST_TARGET) - test_target = project.targets.last - test_target.add_resources(test_resources.map { |resource| group.new_file(resource) }) - test_target.add_file_references(test_files.map { |file| group.new_file(file) }) - add_swift_version(test_target) - project.save - end - - def install_pod - super - if local? - FileUtils.ln_s file.dirname, validation_dir + "Pods/#{spec.name}" - end - end - - def podfile_from_spec(*args) - super(*args).tap do |pod_file| - add_test_target(pod_file) - end - end - - def build_pod - super - Pod::UI.message "\Testing with xcodebuild.\n".yellow do - run_tests - end - end - - private - def create_test_target(project) - test_target = project.new_target(:unit_test_bundle, TEST_TARGET, consumer.platform_name, deployment_target) - create_test_scheme(project, test_target) - end - - def create_test_scheme(project, test_target) - project.recreate_user_schemes - test_scheme = Xcodeproj::XCScheme.new(test_scheme_path(project)) - test_scheme.add_test_target(test_target) - test_scheme.save! - end - - def test_scheme_path(project) - Xcodeproj::XCScheme.user_data_dir(project.path) + "#{TEST_TARGET}.xcscheme" - end - - def add_test_target(pod_file) - app_target = pod_file.target_definitions[APP_TARGET] - Pod::Podfile::TargetDefinition.new(TEST_TARGET, app_target) - end - - def run_tests - command = [ - 'clean', 'build', 'build-for-testing', 'test-without-building', - '-workspace', File.join(validation_dir, "#{APP_TARGET}.xcworkspace"), - '-scheme', TEST_TARGET, - '-configuration', 'Debug' - ] - case consumer.platform_name - when :ios - command += %w(CODE_SIGN_IDENTITY=- -sdk iphonesimulator) - command += Fourflusher::SimControl.new.destination(ios_simulator, 'iOS', deployment_target) - when :osx - command += %w(LD_RUNPATH_SEARCH_PATHS=@loader_path/../Frameworks) - when :tvos - command += %w(CODE_SIGN_IDENTITY=- -sdk appletvsimulator) - command += Fourflusher::SimControl.new.destination(tvos_simulator, 'tvOS', deployment_target) - when :watchos - # there's no XCTest on watchOS (https://openradar.appspot.com/21760513) - return - else - return - end - - output, status = _xcodebuild(command) - - unless status.success? - message = 'Returned an unsuccessful exit code.' - if config.verbose? - message += "\nXcode output: \n#{output}\n" - else - message += ' You can use `--verbose` for more information.' - end - error('xcodebuild', message) - end - output - end -end diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/AggregateFunctionsTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/AggregateFunctionsTests.swift deleted file mode 100644 index 6b583ccfa8..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/AggregateFunctionsTests.swift +++ /dev/null @@ -1,68 +0,0 @@ -import XCTest -import SQLite - -class AggregateFunctionsTests : XCTestCase { - - func test_distinct_prependsExpressionsWithDistinctKeyword() { - AssertSQL("DISTINCT \"int\"", int.distinct) - AssertSQL("DISTINCT \"intOptional\"", intOptional.distinct) - AssertSQL("DISTINCT \"double\"", double.distinct) - AssertSQL("DISTINCT \"doubleOptional\"", doubleOptional.distinct) - AssertSQL("DISTINCT \"string\"", string.distinct) - AssertSQL("DISTINCT \"stringOptional\"", stringOptional.distinct) - } - - func test_count_wrapsOptionalExpressionsWithCountFunction() { - AssertSQL("count(\"intOptional\")", intOptional.count) - AssertSQL("count(\"doubleOptional\")", doubleOptional.count) - AssertSQL("count(\"stringOptional\")", stringOptional.count) - } - - func test_max_wrapsComparableExpressionsWithMaxFunction() { - AssertSQL("max(\"int\")", int.max) - AssertSQL("max(\"intOptional\")", intOptional.max) - AssertSQL("max(\"double\")", double.max) - AssertSQL("max(\"doubleOptional\")", doubleOptional.max) - AssertSQL("max(\"string\")", string.max) - AssertSQL("max(\"stringOptional\")", stringOptional.max) - AssertSQL("max(\"date\")", date.max) - AssertSQL("max(\"dateOptional\")", dateOptional.max) - } - - func test_min_wrapsComparableExpressionsWithMinFunction() { - AssertSQL("min(\"int\")", int.min) - AssertSQL("min(\"intOptional\")", intOptional.min) - AssertSQL("min(\"double\")", double.min) - AssertSQL("min(\"doubleOptional\")", doubleOptional.min) - AssertSQL("min(\"string\")", string.min) - AssertSQL("min(\"stringOptional\")", stringOptional.min) - AssertSQL("min(\"date\")", date.min) - AssertSQL("min(\"dateOptional\")", dateOptional.min) - } - - func test_average_wrapsNumericExpressionsWithAvgFunction() { - AssertSQL("avg(\"int\")", int.average) - AssertSQL("avg(\"intOptional\")", intOptional.average) - AssertSQL("avg(\"double\")", double.average) - AssertSQL("avg(\"doubleOptional\")", doubleOptional.average) - } - - func test_sum_wrapsNumericExpressionsWithSumFunction() { - AssertSQL("sum(\"int\")", int.sum) - AssertSQL("sum(\"intOptional\")", intOptional.sum) - AssertSQL("sum(\"double\")", double.sum) - AssertSQL("sum(\"doubleOptional\")", doubleOptional.sum) - } - - func test_total_wrapsNumericExpressionsWithTotalFunction() { - AssertSQL("total(\"int\")", int.total) - AssertSQL("total(\"intOptional\")", intOptional.total) - AssertSQL("total(\"double\")", double.total) - AssertSQL("total(\"doubleOptional\")", doubleOptional.total) - } - - func test_count_withStar_wrapsStarWithCountFunction() { - AssertSQL("count(*)", count(*)) - } - -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/BlobTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/BlobTests.swift deleted file mode 100644 index fbcca9bcd9..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/BlobTests.swift +++ /dev/null @@ -1,23 +0,0 @@ -import XCTest -import SQLite - -class BlobTests : XCTestCase { - - func test_toHex() { - let blob = Blob(bytes: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 150, 250, 255]) - - XCTAssertEqual(blob.toHex(), "000a141e28323c46505a6496faff") - } - - func test_init_array() { - let blob = Blob(bytes: [42, 42, 42]) - XCTAssertEqual(blob.bytes, [42, 42, 42]) - } - - func test_init_unsafeRawPointer() { - let pointer = UnsafeMutablePointer.allocate(capacity: 3) - pointer.initialize(to: 42, count: 3) - let blob = Blob(bytes: pointer, length: 3) - XCTAssertEqual(blob.bytes, [42, 42, 42]) - } -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CipherTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CipherTests.swift deleted file mode 100644 index 3ee0b13511..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CipherTests.swift +++ /dev/null @@ -1,98 +0,0 @@ -#if SQLITE_SWIFT_SQLCIPHER -import XCTest -import SQLite -import SQLCipher - -class CipherTests: XCTestCase { - - let db1 = try! Connection() - let db2 = try! Connection() - - override func setUp() { - // db - - try! db1.key("hello") - - try! db1.run("CREATE TABLE foo (bar TEXT)") - try! db1.run("INSERT INTO foo (bar) VALUES ('world')") - - // db2 - let key2 = keyData() - try! db2.key(Blob(bytes: key2.bytes, length: key2.length)) - - try! db2.run("CREATE TABLE foo (bar TEXT)") - try! db2.run("INSERT INTO foo (bar) VALUES ('world')") - - super.setUp() - } - - func test_key() { - XCTAssertEqual(1, try! db1.scalar("SELECT count(*) FROM foo") as? Int64) - } - - func test_key_blob_literal() { - let db = try! Connection() - try! db.key("x'2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99'") - } - - func test_rekey() { - try! db1.rekey("goodbye") - XCTAssertEqual(1, try! db1.scalar("SELECT count(*) FROM foo") as? Int64) - } - - func test_data_key() { - XCTAssertEqual(1, try! db2.scalar("SELECT count(*) FROM foo") as? Int64) - } - - func test_data_rekey() { - let newKey = keyData() - try! db2.rekey(Blob(bytes: newKey.bytes, length: newKey.length)) - XCTAssertEqual(1, try! db2.scalar("SELECT count(*) FROM foo") as? Int64) - } - - func test_keyFailure() { - let path = "\(NSTemporaryDirectory())/db.sqlite3" - _ = try? FileManager.default.removeItem(atPath: path) - - let connA = try! Connection(path) - defer { try! FileManager.default.removeItem(atPath: path) } - - try! connA.key("hello") - try! connA.run("CREATE TABLE foo (bar TEXT)") - - let connB = try! Connection(path, readonly: true) - - do { - try connB.key("world") - XCTFail("expected exception") - } catch Result.error(_, let code, _) { - XCTAssertEqual(SQLITE_NOTADB, code) - } catch { - XCTFail("unexpected error: \(error)") - } - } - - func test_open_db_encrypted_with_sqlcipher() { - // $ sqlcipher SQLiteTests/fixtures/encrypted.sqlite - // sqlite> pragma key = 'sqlcipher-test'; - // sqlite> CREATE TABLE foo (bar TEXT); - // sqlite> INSERT INTO foo (bar) VALUES ('world'); - let encryptedFile = fixture("encrypted", withExtension: "sqlite") - - try! FileManager.default.setAttributes([FileAttributeKey.immutable : 1], ofItemAtPath: encryptedFile) - XCTAssertFalse(FileManager.default.isWritableFile(atPath: encryptedFile)) - - let conn = try! Connection(encryptedFile) - try! conn.key("sqlcipher-test") - XCTAssertEqual(1, try! conn.scalar("SELECT count(*) FROM foo") as? Int64) - } - - private func keyData(length: Int = 64) -> NSMutableData { - let keyData = NSMutableData(length: length)! - let result = SecRandomCopyBytes(kSecRandomDefault, length, - keyData.mutableBytes.assumingMemoryBound(to: UInt8.self)) - XCTAssertEqual(0, result) - return keyData - } -} -#endif diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ConnectionTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ConnectionTests.swift deleted file mode 100644 index 59514a25ca..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ConnectionTests.swift +++ /dev/null @@ -1,384 +0,0 @@ -import XCTest -@testable import SQLite - -#if SQLITE_SWIFT_STANDALONE -import sqlite3 -#elseif SQLITE_SWIFT_SQLCIPHER -import SQLCipher -#else -import CSQLite -#endif - -class ConnectionTests : SQLiteTestCase { - - override func setUp() { - super.setUp() - - CreateUsersTable() - } - - func test_init_withInMemory_returnsInMemoryConnection() { - let db = try! Connection(.inMemory) - XCTAssertEqual("", db.description) - } - - func test_init_returnsInMemoryByDefault() { - let db = try! Connection() - XCTAssertEqual("", db.description) - } - - func test_init_withTemporary_returnsTemporaryConnection() { - let db = try! Connection(.temporary) - XCTAssertEqual("", db.description) - } - - func test_init_withURI_returnsURIConnection() { - let db = try! Connection(.uri("\(NSTemporaryDirectory())/SQLite.swift Tests.sqlite3")) - XCTAssertEqual("\(NSTemporaryDirectory())/SQLite.swift Tests.sqlite3", db.description) - } - - func test_init_withString_returnsURIConnection() { - let db = try! Connection("\(NSTemporaryDirectory())/SQLite.swift Tests.sqlite3") - XCTAssertEqual("\(NSTemporaryDirectory())/SQLite.swift Tests.sqlite3", db.description) - } - - func test_readonly_returnsFalseOnReadWriteConnections() { - XCTAssertFalse(db.readonly) - } - - func test_readonly_returnsTrueOnReadOnlyConnections() { - let db = try! Connection(readonly: true) - XCTAssertTrue(db.readonly) - } - - func test_changes_returnsZeroOnNewConnections() { - XCTAssertEqual(0, db.changes) - } - - func test_lastInsertRowid_returnsLastIdAfterInserts() { - try! InsertUser("alice") - XCTAssertEqual(1, db.lastInsertRowid) - } - - func test_lastInsertRowid_doesNotResetAfterError() { - XCTAssert(db.lastInsertRowid == 0) - try! InsertUser("alice") - XCTAssertEqual(1, db.lastInsertRowid) - XCTAssertThrowsError( - try db.run("INSERT INTO \"users\" (email, age, admin) values ('invalid@example.com', 12, 'invalid')") - ) { error in - if case SQLite.Result.error(_, let code, _) = error { - XCTAssertEqual(SQLITE_CONSTRAINT, code) - } else { - XCTFail("expected error") - } - } - XCTAssertEqual(1, db.lastInsertRowid) - } - - func test_changes_returnsNumberOfChanges() { - try! InsertUser("alice") - XCTAssertEqual(1, db.changes) - try! InsertUser("betsy") - XCTAssertEqual(1, db.changes) - } - - func test_totalChanges_returnsTotalNumberOfChanges() { - XCTAssertEqual(0, db.totalChanges) - try! InsertUser("alice") - XCTAssertEqual(1, db.totalChanges) - try! InsertUser("betsy") - XCTAssertEqual(2, db.totalChanges) - } - - func test_prepare_preparesAndReturnsStatements() { - _ = try! db.prepare("SELECT * FROM users WHERE admin = 0") - _ = try! db.prepare("SELECT * FROM users WHERE admin = ?", 0) - _ = try! db.prepare("SELECT * FROM users WHERE admin = ?", [0]) - _ = try! db.prepare("SELECT * FROM users WHERE admin = $admin", ["$admin": 0]) - } - - func test_run_preparesRunsAndReturnsStatements() { - try! db.run("SELECT * FROM users WHERE admin = 0") - try! db.run("SELECT * FROM users WHERE admin = ?", 0) - try! db.run("SELECT * FROM users WHERE admin = ?", [0]) - try! db.run("SELECT * FROM users WHERE admin = $admin", ["$admin": 0]) - AssertSQL("SELECT * FROM users WHERE admin = 0", 4) - } - - func test_scalar_preparesRunsAndReturnsScalarValues() { - XCTAssertEqual(0, try! db.scalar("SELECT count(*) FROM users WHERE admin = 0") as? Int64) - XCTAssertEqual(0, try! db.scalar("SELECT count(*) FROM users WHERE admin = ?", 0) as? Int64) - XCTAssertEqual(0, try! db.scalar("SELECT count(*) FROM users WHERE admin = ?", [0]) as? Int64) - XCTAssertEqual(0, try! db.scalar("SELECT count(*) FROM users WHERE admin = $admin", ["$admin": 0]) as? Int64) - AssertSQL("SELECT count(*) FROM users WHERE admin = 0", 4) - } - - func test_execute_comment() { - try! db.run("-- this is a comment\nSELECT 1") - AssertSQL("-- this is a comment", 0) - AssertSQL("SELECT 1", 0) - } - - func test_transaction_executesBeginDeferred() { - try! db.transaction(.deferred) {} - - AssertSQL("BEGIN DEFERRED TRANSACTION") - } - - func test_transaction_executesBeginImmediate() { - try! db.transaction(.immediate) {} - - AssertSQL("BEGIN IMMEDIATE TRANSACTION") - } - - func test_transaction_executesBeginExclusive() { - try! db.transaction(.exclusive) {} - - AssertSQL("BEGIN EXCLUSIVE TRANSACTION") - } - - func test_transaction_beginsAndCommitsTransactions() { - let stmt = try! db.prepare("INSERT INTO users (email) VALUES (?)", "alice@example.com") - - try! db.transaction { - try stmt.run() - } - - AssertSQL("BEGIN DEFERRED TRANSACTION") - AssertSQL("INSERT INTO users (email) VALUES ('alice@example.com')") - AssertSQL("COMMIT TRANSACTION") - AssertSQL("ROLLBACK TRANSACTION", 0) - } - - func test_transaction_beginsAndRollsTransactionsBack() { - let stmt = try! db.prepare("INSERT INTO users (email) VALUES (?)", "alice@example.com") - - do { - try db.transaction { - try stmt.run() - try stmt.run() - } - } catch { - } - - AssertSQL("BEGIN DEFERRED TRANSACTION") - AssertSQL("INSERT INTO users (email) VALUES ('alice@example.com')", 2) - AssertSQL("ROLLBACK TRANSACTION") - AssertSQL("COMMIT TRANSACTION", 0) - } - - func test_savepoint_beginsAndCommitsSavepoints() { - let db = self.db - - try! db.savepoint("1") { - try db.savepoint("2") { - try db.run("INSERT INTO users (email) VALUES (?)", "alice@example.com") - } - } - - AssertSQL("SAVEPOINT '1'") - AssertSQL("SAVEPOINT '2'") - AssertSQL("INSERT INTO users (email) VALUES ('alice@example.com')") - AssertSQL("RELEASE SAVEPOINT '2'") - AssertSQL("RELEASE SAVEPOINT '1'") - AssertSQL("ROLLBACK TO SAVEPOINT '2'", 0) - AssertSQL("ROLLBACK TO SAVEPOINT '1'", 0) - } - - func test_savepoint_beginsAndRollsSavepointsBack() { - let db = self.db - let stmt = try! db.prepare("INSERT INTO users (email) VALUES (?)", "alice@example.com") - - do { - try db.savepoint("1") { - try db.savepoint("2") { - try stmt.run() - try stmt.run() - try stmt.run() - } - try db.savepoint("2") { - try stmt.run() - try stmt.run() - try stmt.run() - } - } - } catch { - } - - AssertSQL("SAVEPOINT '1'") - AssertSQL("SAVEPOINT '2'") - AssertSQL("INSERT INTO users (email) VALUES ('alice@example.com')", 2) - AssertSQL("ROLLBACK TO SAVEPOINT '2'") - AssertSQL("ROLLBACK TO SAVEPOINT '1'") - AssertSQL("RELEASE SAVEPOINT '2'", 0) - AssertSQL("RELEASE SAVEPOINT '1'", 0) - } - - func test_updateHook_setsUpdateHook_withInsert() { - async { done in - db.updateHook { operation, db, table, rowid in - XCTAssertEqual(Connection.Operation.insert, operation) - XCTAssertEqual("main", db) - XCTAssertEqual("users", table) - XCTAssertEqual(1, rowid) - done() - } - try! InsertUser("alice") - } - } - - func test_updateHook_setsUpdateHook_withUpdate() { - try! InsertUser("alice") - async { done in - db.updateHook { operation, db, table, rowid in - XCTAssertEqual(Connection.Operation.update, operation) - XCTAssertEqual("main", db) - XCTAssertEqual("users", table) - XCTAssertEqual(1, rowid) - done() - } - try! db.run("UPDATE users SET email = 'alice@example.com'") - } - } - - func test_updateHook_setsUpdateHook_withDelete() { - try! InsertUser("alice") - async { done in - db.updateHook { operation, db, table, rowid in - XCTAssertEqual(Connection.Operation.delete, operation) - XCTAssertEqual("main", db) - XCTAssertEqual("users", table) - XCTAssertEqual(1, rowid) - done() - } - try! db.run("DELETE FROM users WHERE id = 1") - } - } - - func test_commitHook_setsCommitHook() { - async { done in - db.commitHook { - done() - } - try! db.transaction { - try self.InsertUser("alice") - } - XCTAssertEqual(1, try! db.scalar("SELECT count(*) FROM users") as? Int64) - } - } - - func test_rollbackHook_setsRollbackHook() { - async { done in - db.rollbackHook(done) - do { - try db.transaction { - try self.InsertUser("alice") - try self.InsertUser("alice") // throw - } - } catch { - } - XCTAssertEqual(0, try! db.scalar("SELECT count(*) FROM users") as? Int64) - } - } - - func test_commitHook_withRollback_rollsBack() { - async { done in - db.commitHook { - throw NSError(domain: "com.stephencelis.SQLiteTests", code: 1, userInfo: nil) - } - db.rollbackHook(done) - do { - try db.transaction { - try self.InsertUser("alice") - } - } catch { - } - XCTAssertEqual(0, try! db.scalar("SELECT count(*) FROM users") as? Int64) - } - } - - func test_createFunction_withArrayArguments() { - db.createFunction("hello") { $0[0].map { "Hello, \($0)!" } } - - XCTAssertEqual("Hello, world!", try! db.scalar("SELECT hello('world')") as? String) - XCTAssert(try! db.scalar("SELECT hello(NULL)") == nil) - } - - func test_createFunction_createsQuotableFunction() { - db.createFunction("hello world") { $0[0].map { "Hello, \($0)!" } } - - XCTAssertEqual("Hello, world!", try! db.scalar("SELECT \"hello world\"('world')") as? String) - XCTAssert(try! db.scalar("SELECT \"hello world\"(NULL)") == nil) - } - - func test_createCollation_createsCollation() { - try! db.createCollation("NODIACRITIC") { lhs, rhs in - return lhs.compare(rhs, options: .diacriticInsensitive) - } - XCTAssertEqual(1, try! db.scalar("SELECT ? = ? COLLATE NODIACRITIC", "cafe", "café") as? Int64) - } - - func test_createCollation_createsQuotableCollation() { - try! db.createCollation("NO DIACRITIC") { lhs, rhs in - return lhs.compare(rhs, options: .diacriticInsensitive) - } - XCTAssertEqual(1, try! db.scalar("SELECT ? = ? COLLATE \"NO DIACRITIC\"", "cafe", "café") as? Int64) - } - - func test_interrupt_interruptsLongRunningQuery() { - try! InsertUsers("abcdefghijklmnopqrstuvwxyz".characters.map { String($0) }) - db.createFunction("sleep") { args in - usleep(UInt32((args[0] as? Double ?? Double(args[0] as? Int64 ?? 1)) * 1_000_000)) - return nil - } - - let stmt = try! db.prepare("SELECT *, sleep(?) FROM users", 0.1) - try! stmt.run() - - let deadline = DispatchTime.now() + Double(Int64(10 * NSEC_PER_MSEC)) / Double(NSEC_PER_SEC) - _ = DispatchQueue.global(priority: .background).asyncAfter(deadline: deadline, execute: db.interrupt) - AssertThrows(try stmt.run()) - } - -} - - -class ResultTests : XCTestCase { - let connection = try! Connection(.inMemory) - - func test_init_with_ok_code_returns_nil() { - XCTAssertNil(Result(errorCode: SQLITE_OK, connection: connection, statement: nil) as Result?) - } - - func test_init_with_row_code_returns_nil() { - XCTAssertNil(Result(errorCode: SQLITE_ROW, connection: connection, statement: nil) as Result?) - } - - func test_init_with_done_code_returns_nil() { - XCTAssertNil(Result(errorCode: SQLITE_DONE, connection: connection, statement: nil) as Result?) - } - - func test_init_with_other_code_returns_error() { - if case .some(.error(let message, let code, let statement)) = - Result(errorCode: SQLITE_MISUSE, connection: connection, statement: nil) { - XCTAssertEqual("not an error", message) - XCTAssertEqual(SQLITE_MISUSE, code) - XCTAssertNil(statement) - XCTAssert(self.connection === connection) - } else { - XCTFail() - } - } - - func test_description_contains_error_code() { - XCTAssertEqual("not an error (code: 21)", - Result(errorCode: SQLITE_MISUSE, connection: connection, statement: nil)?.description) - } - - func test_description_contains_statement_and_error_code() { - let statement = try! Statement(connection, "SELECT 1") - XCTAssertEqual("not an error (SELECT 1) (code: 21)", - Result(errorCode: SQLITE_MISUSE, connection: connection, statement: statement)?.description) - } -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CoreFunctionsTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CoreFunctionsTests.swift deleted file mode 100644 index db37ff7ff0..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CoreFunctionsTests.swift +++ /dev/null @@ -1,136 +0,0 @@ -import XCTest -import SQLite - -class CoreFunctionsTests : XCTestCase { - - func test_round_wrapsDoubleExpressionsWithRoundFunction() { - AssertSQL("round(\"double\")", double.round()) - AssertSQL("round(\"doubleOptional\")", doubleOptional.round()) - - AssertSQL("round(\"double\", 1)", double.round(1)) - AssertSQL("round(\"doubleOptional\", 2)", doubleOptional.round(2)) - } - - func test_random_generatesExpressionWithRandomFunction() { - AssertSQL("random()", Expression.random()) - AssertSQL("random()", Expression.random()) - } - - func test_length_wrapsStringExpressionWithLengthFunction() { - AssertSQL("length(\"string\")", string.length) - AssertSQL("length(\"stringOptional\")", stringOptional.length) - } - - func test_lowercaseString_wrapsStringExpressionWithLowerFunction() { - AssertSQL("lower(\"string\")", string.lowercaseString) - AssertSQL("lower(\"stringOptional\")", stringOptional.lowercaseString) - } - - func test_uppercaseString_wrapsStringExpressionWithUpperFunction() { - AssertSQL("upper(\"string\")", string.uppercaseString) - AssertSQL("upper(\"stringOptional\")", stringOptional.uppercaseString) - } - - func test_like_buildsExpressionWithLikeOperator() { - AssertSQL("(\"string\" LIKE 'a%')", string.like("a%")) - AssertSQL("(\"stringOptional\" LIKE 'b%')", stringOptional.like("b%")) - - AssertSQL("(\"string\" LIKE '%\\%' ESCAPE '\\')", string.like("%\\%", escape: "\\")) - AssertSQL("(\"stringOptional\" LIKE '_\\_' ESCAPE '\\')", stringOptional.like("_\\_", escape: "\\")) - } - - func test_glob_buildsExpressionWithGlobOperator() { - AssertSQL("(\"string\" GLOB 'a*')", string.glob("a*")) - AssertSQL("(\"stringOptional\" GLOB 'b*')", stringOptional.glob("b*")) - } - - func test_match_buildsExpressionWithMatchOperator() { - AssertSQL("(\"string\" MATCH 'a*')", string.match("a*")) - AssertSQL("(\"stringOptional\" MATCH 'b*')", stringOptional.match("b*")) - } - - func test_regexp_buildsExpressionWithRegexpOperator() { - AssertSQL("(\"string\" REGEXP '^.+@.+\\.com$')", string.regexp("^.+@.+\\.com$")) - AssertSQL("(\"stringOptional\" REGEXP '^.+@.+\\.net$')", stringOptional.regexp("^.+@.+\\.net$")) - } - - func test_collate_buildsExpressionWithCollateOperator() { - AssertSQL("(\"string\" COLLATE BINARY)", string.collate(.binary)) - AssertSQL("(\"string\" COLLATE NOCASE)", string.collate(.nocase)) - AssertSQL("(\"string\" COLLATE RTRIM)", string.collate(.rtrim)) - AssertSQL("(\"string\" COLLATE \"CUSTOM\")", string.collate(.custom("CUSTOM"))) - - AssertSQL("(\"stringOptional\" COLLATE BINARY)", stringOptional.collate(.binary)) - AssertSQL("(\"stringOptional\" COLLATE NOCASE)", stringOptional.collate(.nocase)) - AssertSQL("(\"stringOptional\" COLLATE RTRIM)", stringOptional.collate(.rtrim)) - AssertSQL("(\"stringOptional\" COLLATE \"CUSTOM\")", stringOptional.collate(.custom("CUSTOM"))) - } - - func test_ltrim_wrapsStringWithLtrimFunction() { - AssertSQL("ltrim(\"string\")", string.ltrim()) - AssertSQL("ltrim(\"stringOptional\")", stringOptional.ltrim()) - - AssertSQL("ltrim(\"string\", ' ')", string.ltrim([" "])) - AssertSQL("ltrim(\"stringOptional\", ' ')", stringOptional.ltrim([" "])) - } - - func test_ltrim_wrapsStringWithRtrimFunction() { - AssertSQL("rtrim(\"string\")", string.rtrim()) - AssertSQL("rtrim(\"stringOptional\")", stringOptional.rtrim()) - - AssertSQL("rtrim(\"string\", ' ')", string.rtrim([" "])) - AssertSQL("rtrim(\"stringOptional\", ' ')", stringOptional.rtrim([" "])) - } - - func test_ltrim_wrapsStringWithTrimFunction() { - AssertSQL("trim(\"string\")", string.trim()) - AssertSQL("trim(\"stringOptional\")", stringOptional.trim()) - - AssertSQL("trim(\"string\", ' ')", string.trim([" "])) - AssertSQL("trim(\"stringOptional\", ' ')", stringOptional.trim([" "])) - } - - func test_replace_wrapsStringWithReplaceFunction() { - AssertSQL("replace(\"string\", '@example.com', '@example.net')", string.replace("@example.com", with: "@example.net")) - AssertSQL("replace(\"stringOptional\", '@example.net', '@example.com')", stringOptional.replace("@example.net", with: "@example.com")) - } - - func test_substring_wrapsStringWithSubstrFunction() { - AssertSQL("substr(\"string\", 1, 2)", string.substring(1, length: 2)) - AssertSQL("substr(\"stringOptional\", 2, 1)", stringOptional.substring(2, length: 1)) - } - - func test_subscriptWithRange_wrapsStringWithSubstrFunction() { - AssertSQL("substr(\"string\", 1, 2)", string[1..<3]) - AssertSQL("substr(\"stringOptional\", 2, 1)", stringOptional[2..<3]) - } - - func test_nilCoalescingOperator_wrapsOptionalsWithIfnullFunction() { - AssertSQL("ifnull(\"intOptional\", 1)", intOptional ?? 1) - // AssertSQL("ifnull(\"doubleOptional\", 1.0)", doubleOptional ?? 1) // rdar://problem/21677256 - XCTAssertEqual("ifnull(\"doubleOptional\", 1.0)", (doubleOptional ?? 1).asSQL()) - AssertSQL("ifnull(\"stringOptional\", 'literal')", stringOptional ?? "literal") - - AssertSQL("ifnull(\"intOptional\", \"int\")", intOptional ?? int) - AssertSQL("ifnull(\"doubleOptional\", \"double\")", doubleOptional ?? double) - AssertSQL("ifnull(\"stringOptional\", \"string\")", stringOptional ?? string) - - AssertSQL("ifnull(\"intOptional\", \"intOptional\")", intOptional ?? intOptional) - AssertSQL("ifnull(\"doubleOptional\", \"doubleOptional\")", doubleOptional ?? doubleOptional) - AssertSQL("ifnull(\"stringOptional\", \"stringOptional\")", stringOptional ?? stringOptional) - } - - func test_absoluteValue_wrapsNumberWithAbsFucntion() { - AssertSQL("abs(\"int\")", int.absoluteValue) - AssertSQL("abs(\"intOptional\")", intOptional.absoluteValue) - - AssertSQL("abs(\"double\")", double.absoluteValue) - AssertSQL("abs(\"doubleOptional\")", doubleOptional.absoluteValue) - } - - func test_contains_buildsExpressionWithInOperator() { - AssertSQL("(\"string\" IN ('hello', 'world'))", ["hello", "world"].contains(string)) - AssertSQL("(\"stringOptional\" IN ('hello', 'world'))", ["hello", "world"].contains(stringOptional)) - } - -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CustomFunctionsTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CustomFunctionsTests.swift deleted file mode 100644 index 67150ccf20..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/CustomFunctionsTests.swift +++ /dev/null @@ -1,6 +0,0 @@ -import XCTest -import SQLite - -class CustomFunctionsTests : XCTestCase { - -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ExpressionTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ExpressionTests.swift deleted file mode 100644 index 036e10ceb6..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ExpressionTests.swift +++ /dev/null @@ -1,6 +0,0 @@ -import XCTest -import SQLite - -class ExpressionTests : XCTestCase { - -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS4Tests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS4Tests.swift deleted file mode 100644 index 4373bf8b0e..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS4Tests.swift +++ /dev/null @@ -1,208 +0,0 @@ -import XCTest -import SQLite - -class FTS4Tests : XCTestCase { - - func test_create_onVirtualTable_withFTS4_compilesCreateVirtualTableExpression() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4()", - virtualTable.create(.FTS4()) - ) - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"string\")", - virtualTable.create(.FTS4(string)) - ) - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=simple)", - virtualTable.create(.FTS4(tokenize: .Simple)) - ) - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"string\", tokenize=porter)", - virtualTable.create(.FTS4([string], tokenize: .Porter)) - ) - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=unicode61 \"removeDiacritics=0\")", - virtualTable.create(.FTS4(tokenize: .Unicode61(removeDiacritics: false))) - ) - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=unicode61 \"removeDiacritics=1\" \"tokenchars=.\" \"separators=X\")", - virtualTable.create(.FTS4(tokenize: .Unicode61(removeDiacritics: true, tokenchars: ["."], separators: ["X"]))) - ) - } - - func test_match_onVirtualTableAsExpression_compilesMatchExpression() { - AssertSQL("(\"virtual_table\" MATCH 'string')", virtualTable.match("string") as Expression) - AssertSQL("(\"virtual_table\" MATCH \"string\")", virtualTable.match(string) as Expression) - AssertSQL("(\"virtual_table\" MATCH \"stringOptional\")", virtualTable.match(stringOptional) as Expression) - } - - func test_match_onVirtualTableAsQueryType_compilesMatchExpression() { - AssertSQL("SELECT * FROM \"virtual_table\" WHERE (\"virtual_table\" MATCH 'string')", virtualTable.match("string") as QueryType) - AssertSQL("SELECT * FROM \"virtual_table\" WHERE (\"virtual_table\" MATCH \"string\")", virtualTable.match(string) as QueryType) - AssertSQL("SELECT * FROM \"virtual_table\" WHERE (\"virtual_table\" MATCH \"stringOptional\")", virtualTable.match(stringOptional) as QueryType) - } - -} - -class FTS4ConfigTests : XCTestCase { - var config: FTS4Config! - - override func setUp() { - super.setUp() - config = FTS4Config() - } - - func test_empty_config() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4()", - sql(config)) - } - - func test_config_column() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"string\")", - sql(config.column(string))) - } - - func test_config_columns() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"string\", \"int\")", - sql(config.columns([string, int]))) - } - - func test_config_unindexed_column() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"string\", notindexed=\"string\")", - sql(config.column(string, [.unindexed]))) - } - - func test_external_content_view() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(content=\"view\")", - sql(config.externalContent(_view ))) - } - - func test_external_content_virtual_table() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(content=\"virtual_table\")", - sql(config.externalContent(virtualTable))) - } - - func test_tokenizer_simple() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=simple)", - sql(config.tokenizer(.Simple))) - } - - func test_tokenizer_porter() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=porter)", - sql(config.tokenizer(.Porter))) - } - - func test_tokenizer_unicode61() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=unicode61)", - sql(config.tokenizer(.Unicode61()))) - } - - func test_tokenizer_unicode61_with_options() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=unicode61 \"removeDiacritics=1\" \"tokenchars=.\" \"separators=X\")", - sql(config.tokenizer(.Unicode61(removeDiacritics: true, tokenchars: ["."], separators: ["X"])))) - } - - func test_content_less() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(content=\"\")", - sql(config.contentless())) - } - - func test_config_matchinfo() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(matchinfo=\"fts3\")", - sql(config.matchInfo(.fts3))) - } - - func test_config_order_asc() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(order=\"asc\")", - sql(config.order(.asc))) - } - - func test_config_order_desc() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(order=\"desc\")", - sql(config.order(.desc))) - } - - func test_config_compress() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(compress=\"compress_foo\")", - sql(config.compress("compress_foo"))) - } - - func test_config_uncompress() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(uncompress=\"uncompress_foo\")", - sql(config.uncompress("uncompress_foo"))) - } - - func test_config_languageId() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(languageid=\"lid\")", - sql(config.languageId("lid"))) - } - - func test_config_all() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"int\", \"string\", \"date\", tokenize=porter, prefix=\"2,4\", content=\"table\", notindexed=\"string\", notindexed=\"date\", languageid=\"lid\", matchinfo=\"fts3\", order=\"desc\")", - sql(config - .tokenizer(.Porter) - .column(int) - .column(string, [.unindexed]) - .column(date, [.unindexed]) - .externalContent(table) - .matchInfo(.fts3) - .languageId("lid") - .order(.desc) - .prefix([2, 4])) - ) - } - - func sql(_ config: FTS4Config) -> String { - return virtualTable.create(.FTS4(config)) - } -} - -class FTS4IntegrationTests : SQLiteTestCase { -#if !SQLITE_SWIFT_STANDALONE && !SQLITE_SWIFT_SQLCIPHER - func test_registerTokenizer_registersTokenizer() { - let emails = VirtualTable("emails") - let subject = Expression("subject") - let body = Expression("body") - - let locale = CFLocaleCopyCurrent() - let tokenizerName = "tokenizer" - let tokenizer = CFStringTokenizerCreate(nil, "" as CFString!, CFRangeMake(0, 0), UInt(kCFStringTokenizerUnitWord), locale) - try! db.registerTokenizer(tokenizerName) { string in - CFStringTokenizerSetString(tokenizer, string as CFString, CFRangeMake(0, CFStringGetLength(string as CFString))) - if CFStringTokenizerAdvanceToNextToken(tokenizer).isEmpty { - return nil - } - let range = CFStringTokenizerGetCurrentTokenRange(tokenizer) - let input = CFStringCreateWithSubstring(kCFAllocatorDefault, string as CFString, range)! - let token = CFStringCreateMutableCopy(nil, range.length, input)! - CFStringLowercase(token, locale) - CFStringTransform(token, nil, kCFStringTransformStripDiacritics, false) - return (token as String, string.range(of: input as String)!) - } - - try! db.run(emails.create(.FTS4([subject, body], tokenize: .Custom(tokenizerName)))) - AssertSQL("CREATE VIRTUAL TABLE \"emails\" USING fts4(\"subject\", \"body\", tokenize=\"SQLite.swift\" \"tokenizer\")") - - try! _ = db.run(emails.insert(subject <- "Aún más cáfe!")) - XCTAssertEqual(1, try! db.scalar(emails.filter(emails.match("aun")).count)) - } -#endif -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS5Tests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS5Tests.swift deleted file mode 100644 index 63d8dc4043..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FTS5Tests.swift +++ /dev/null @@ -1,124 +0,0 @@ -import XCTest -import SQLite - -class FTS5Tests: XCTestCase { - var config: FTS5Config! - - override func setUp() { - super.setUp() - config = FTS5Config() - } - - func test_empty_config() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5()", - sql(config)) - } - - func test_config_column() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(\"string\")", - sql(config.column(string))) - } - - func test_config_columns() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(\"string\", \"int\")", - sql(config.columns([string, int]))) - } - - func test_config_unindexed_column() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(\"string\" UNINDEXED)", - sql(config.column(string, [.unindexed]))) - } - - func test_external_content_table() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(content=\"table\")", - sql(config.externalContent(table))) - } - - func test_external_content_view() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(content=\"view\")", - sql(config.externalContent(_view))) - } - - func test_external_content_virtual_table() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(content=\"virtual_table\")", - sql(config.externalContent(virtualTable))) - } - - func test_content_less() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(content=\"\")", - sql(config.contentless())) - } - - func test_content_rowid() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(content_rowid=\"string\")", - sql(config.contentRowId(string))) - } - - func test_tokenizer_porter() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(tokenize=porter)", - sql(config.tokenizer(.Porter))) - } - - func test_tokenizer_unicode61() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(tokenize=unicode61)", - sql(config.tokenizer(.Unicode61()))) - } - - func test_tokenizer_unicode61_with_options() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(tokenize=unicode61 \"removeDiacritics=1\" \"tokenchars=.\" \"separators=X\")", - sql(config.tokenizer(.Unicode61(removeDiacritics: true, tokenchars: ["."], separators: ["X"])))) - } - - func test_column_size() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(columnsize=1)", - sql(config.columnSize(1))) - } - - func test_detail_full() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(detail=\"full\")", - sql(config.detail(.full))) - } - - func test_detail_column() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(detail=\"column\")", - sql(config.detail(.column))) - } - - func test_detail_none() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(detail=\"none\")", - sql(config.detail(.none))) - } - - func test_fts5_config_all() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING fts5(\"int\", \"string\" UNINDEXED, \"date\" UNINDEXED, tokenize=porter, prefix=\"2,4\", content=\"table\")", - sql(config - .tokenizer(.Porter) - .column(int) - .column(string, [.unindexed]) - .column(date, [.unindexed]) - .externalContent(table) - .prefix([2, 4])) - ) - } - - func sql(_ config: FTS5Config) -> String { - return virtualTable.create(.FTS5(config)) - } -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Fixtures.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Fixtures.swift deleted file mode 100644 index 13f83f7715..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Fixtures.swift +++ /dev/null @@ -1,8 +0,0 @@ -import Foundation - -func fixture(_ name: String, withExtension: String?) -> String { - let testBundle = Bundle(for: SQLiteTestCase.self) - return testBundle.url( - forResource: URL(string: "fixtures")?.appendingPathComponent(name).path, - withExtension: withExtension)!.path -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FoundationTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FoundationTests.swift deleted file mode 100644 index 0df746d9e5..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/FoundationTests.swift +++ /dev/null @@ -1,16 +0,0 @@ -import XCTest -import SQLite - -class FoundationTests : XCTestCase { - func testDataFromBlob() { - let data = Data(bytes: [1, 2, 3]) - let blob = data.datatypeValue - XCTAssertEqual([1, 2, 3], blob.bytes) - } - - func testBlobToData() { - let blob = Blob(bytes: [1, 2, 3]) - let data = Data.fromDatatypeValue(blob) - XCTAssertEqual(Data(bytes: [1, 2, 3]), data) - } -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Info.plist b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Info.plist deleted file mode 100644 index ba72822e87..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/OperatorsTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/OperatorsTests.swift deleted file mode 100644 index f0e585cd70..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/OperatorsTests.swift +++ /dev/null @@ -1,296 +0,0 @@ -import XCTest -import SQLite - -class OperatorsTests : XCTestCase { - - func test_stringExpressionPlusStringExpression_buildsConcatenatingStringExpression() { - AssertSQL("(\"string\" || \"string\")", string + string) - AssertSQL("(\"string\" || \"stringOptional\")", string + stringOptional) - AssertSQL("(\"stringOptional\" || \"string\")", stringOptional + string) - AssertSQL("(\"stringOptional\" || \"stringOptional\")", stringOptional + stringOptional) - AssertSQL("(\"string\" || 'literal')", string + "literal") - AssertSQL("(\"stringOptional\" || 'literal')", stringOptional + "literal") - AssertSQL("('literal' || \"string\")", "literal" + string) - AssertSQL("('literal' || \"stringOptional\")", "literal" + stringOptional) - } - - func test_numberExpression_plusNumberExpression_buildsAdditiveNumberExpression() { - AssertSQL("(\"int\" + \"int\")", int + int) - AssertSQL("(\"int\" + \"intOptional\")", int + intOptional) - AssertSQL("(\"intOptional\" + \"int\")", intOptional + int) - AssertSQL("(\"intOptional\" + \"intOptional\")", intOptional + intOptional) - AssertSQL("(\"int\" + 1)", int + 1) - AssertSQL("(\"intOptional\" + 1)", intOptional + 1) - AssertSQL("(1 + \"int\")", 1 + int) - AssertSQL("(1 + \"intOptional\")", 1 + intOptional) - - AssertSQL("(\"double\" + \"double\")", double + double) - AssertSQL("(\"double\" + \"doubleOptional\")", double + doubleOptional) - AssertSQL("(\"doubleOptional\" + \"double\")", doubleOptional + double) - AssertSQL("(\"doubleOptional\" + \"doubleOptional\")", doubleOptional + doubleOptional) - AssertSQL("(\"double\" + 1.0)", double + 1) - AssertSQL("(\"doubleOptional\" + 1.0)", doubleOptional + 1) - AssertSQL("(1.0 + \"double\")", 1 + double) - AssertSQL("(1.0 + \"doubleOptional\")", 1 + doubleOptional) - } - - func test_numberExpression_minusNumberExpression_buildsSubtractiveNumberExpression() { - AssertSQL("(\"int\" - \"int\")", int - int) - AssertSQL("(\"int\" - \"intOptional\")", int - intOptional) - AssertSQL("(\"intOptional\" - \"int\")", intOptional - int) - AssertSQL("(\"intOptional\" - \"intOptional\")", intOptional - intOptional) - AssertSQL("(\"int\" - 1)", int - 1) - AssertSQL("(\"intOptional\" - 1)", intOptional - 1) - AssertSQL("(1 - \"int\")", 1 - int) - AssertSQL("(1 - \"intOptional\")", 1 - intOptional) - - AssertSQL("(\"double\" - \"double\")", double - double) - AssertSQL("(\"double\" - \"doubleOptional\")", double - doubleOptional) - AssertSQL("(\"doubleOptional\" - \"double\")", doubleOptional - double) - AssertSQL("(\"doubleOptional\" - \"doubleOptional\")", doubleOptional - doubleOptional) - AssertSQL("(\"double\" - 1.0)", double - 1) - AssertSQL("(\"doubleOptional\" - 1.0)", doubleOptional - 1) - AssertSQL("(1.0 - \"double\")", 1 - double) - AssertSQL("(1.0 - \"doubleOptional\")", 1 - doubleOptional) - } - - func test_numberExpression_timesNumberExpression_buildsMultiplicativeNumberExpression() { - AssertSQL("(\"int\" * \"int\")", int * int) - AssertSQL("(\"int\" * \"intOptional\")", int * intOptional) - AssertSQL("(\"intOptional\" * \"int\")", intOptional * int) - AssertSQL("(\"intOptional\" * \"intOptional\")", intOptional * intOptional) - AssertSQL("(\"int\" * 1)", int * 1) - AssertSQL("(\"intOptional\" * 1)", intOptional * 1) - AssertSQL("(1 * \"int\")", 1 * int) - AssertSQL("(1 * \"intOptional\")", 1 * intOptional) - - AssertSQL("(\"double\" * \"double\")", double * double) - AssertSQL("(\"double\" * \"doubleOptional\")", double * doubleOptional) - AssertSQL("(\"doubleOptional\" * \"double\")", doubleOptional * double) - AssertSQL("(\"doubleOptional\" * \"doubleOptional\")", doubleOptional * doubleOptional) - AssertSQL("(\"double\" * 1.0)", double * 1) - AssertSQL("(\"doubleOptional\" * 1.0)", doubleOptional * 1) - AssertSQL("(1.0 * \"double\")", 1 * double) - AssertSQL("(1.0 * \"doubleOptional\")", 1 * doubleOptional) - } - - func test_numberExpression_dividedByNumberExpression_buildsDivisiveNumberExpression() { - AssertSQL("(\"int\" / \"int\")", int / int) - AssertSQL("(\"int\" / \"intOptional\")", int / intOptional) - AssertSQL("(\"intOptional\" / \"int\")", intOptional / int) - AssertSQL("(\"intOptional\" / \"intOptional\")", intOptional / intOptional) - AssertSQL("(\"int\" / 1)", int / 1) - AssertSQL("(\"intOptional\" / 1)", intOptional / 1) - AssertSQL("(1 / \"int\")", 1 / int) - AssertSQL("(1 / \"intOptional\")", 1 / intOptional) - - AssertSQL("(\"double\" / \"double\")", double / double) - AssertSQL("(\"double\" / \"doubleOptional\")", double / doubleOptional) - AssertSQL("(\"doubleOptional\" / \"double\")", doubleOptional / double) - AssertSQL("(\"doubleOptional\" / \"doubleOptional\")", doubleOptional / doubleOptional) - AssertSQL("(\"double\" / 1.0)", double / 1) - AssertSQL("(\"doubleOptional\" / 1.0)", doubleOptional / 1) - AssertSQL("(1.0 / \"double\")", 1 / double) - AssertSQL("(1.0 / \"doubleOptional\")", 1 / doubleOptional) - } - - func test_numberExpression_prefixedWithMinus_buildsInvertedNumberExpression() { - AssertSQL("-(\"int\")", -int) - AssertSQL("-(\"intOptional\")", -intOptional) - - AssertSQL("-(\"double\")", -double) - AssertSQL("-(\"doubleOptional\")", -doubleOptional) - } - - func test_integerExpression_moduloIntegerExpression_buildsModuloIntegerExpression() { - AssertSQL("(\"int\" % \"int\")", int % int) - AssertSQL("(\"int\" % \"intOptional\")", int % intOptional) - AssertSQL("(\"intOptional\" % \"int\")", intOptional % int) - AssertSQL("(\"intOptional\" % \"intOptional\")", intOptional % intOptional) - AssertSQL("(\"int\" % 1)", int % 1) - AssertSQL("(\"intOptional\" % 1)", intOptional % 1) - AssertSQL("(1 % \"int\")", 1 % int) - AssertSQL("(1 % \"intOptional\")", 1 % intOptional) - } - - func test_integerExpression_bitShiftLeftIntegerExpression_buildsLeftShiftedIntegerExpression() { - AssertSQL("(\"int\" << \"int\")", int << int) - AssertSQL("(\"int\" << \"intOptional\")", int << intOptional) - AssertSQL("(\"intOptional\" << \"int\")", intOptional << int) - AssertSQL("(\"intOptional\" << \"intOptional\")", intOptional << intOptional) - AssertSQL("(\"int\" << 1)", int << 1) - AssertSQL("(\"intOptional\" << 1)", intOptional << 1) - AssertSQL("(1 << \"int\")", 1 << int) - AssertSQL("(1 << \"intOptional\")", 1 << intOptional) - } - - func test_integerExpression_bitShiftRightIntegerExpression_buildsRightShiftedIntegerExpression() { - AssertSQL("(\"int\" >> \"int\")", int >> int) - AssertSQL("(\"int\" >> \"intOptional\")", int >> intOptional) - AssertSQL("(\"intOptional\" >> \"int\")", intOptional >> int) - AssertSQL("(\"intOptional\" >> \"intOptional\")", intOptional >> intOptional) - AssertSQL("(\"int\" >> 1)", int >> 1) - AssertSQL("(\"intOptional\" >> 1)", intOptional >> 1) - AssertSQL("(1 >> \"int\")", 1 >> int) - AssertSQL("(1 >> \"intOptional\")", 1 >> intOptional) - } - - func test_integerExpression_bitwiseAndIntegerExpression_buildsAndedIntegerExpression() { - AssertSQL("(\"int\" & \"int\")", int & int) - AssertSQL("(\"int\" & \"intOptional\")", int & intOptional) - AssertSQL("(\"intOptional\" & \"int\")", intOptional & int) - AssertSQL("(\"intOptional\" & \"intOptional\")", intOptional & intOptional) - AssertSQL("(\"int\" & 1)", int & 1) - AssertSQL("(\"intOptional\" & 1)", intOptional & 1) - AssertSQL("(1 & \"int\")", 1 & int) - AssertSQL("(1 & \"intOptional\")", 1 & intOptional) - } - - func test_integerExpression_bitwiseOrIntegerExpression_buildsOredIntegerExpression() { - AssertSQL("(\"int\" | \"int\")", int | int) - AssertSQL("(\"int\" | \"intOptional\")", int | intOptional) - AssertSQL("(\"intOptional\" | \"int\")", intOptional | int) - AssertSQL("(\"intOptional\" | \"intOptional\")", intOptional | intOptional) - AssertSQL("(\"int\" | 1)", int | 1) - AssertSQL("(\"intOptional\" | 1)", intOptional | 1) - AssertSQL("(1 | \"int\")", 1 | int) - AssertSQL("(1 | \"intOptional\")", 1 | intOptional) - } - - func test_integerExpression_bitwiseExclusiveOrIntegerExpression_buildsOredIntegerExpression() { - AssertSQL("(~((\"int\" & \"int\")) & (\"int\" | \"int\"))", int ^ int) - AssertSQL("(~((\"int\" & \"intOptional\")) & (\"int\" | \"intOptional\"))", int ^ intOptional) - AssertSQL("(~((\"intOptional\" & \"int\")) & (\"intOptional\" | \"int\"))", intOptional ^ int) - AssertSQL("(~((\"intOptional\" & \"intOptional\")) & (\"intOptional\" | \"intOptional\"))", intOptional ^ intOptional) - AssertSQL("(~((\"int\" & 1)) & (\"int\" | 1))", int ^ 1) - AssertSQL("(~((\"intOptional\" & 1)) & (\"intOptional\" | 1))", intOptional ^ 1) - AssertSQL("(~((1 & \"int\")) & (1 | \"int\"))", 1 ^ int) - AssertSQL("(~((1 & \"intOptional\")) & (1 | \"intOptional\"))", 1 ^ intOptional) - } - - func test_bitwiseNot_integerExpression_buildsComplementIntegerExpression() { - AssertSQL("~(\"int\")", ~int) - AssertSQL("~(\"intOptional\")", ~intOptional) - } - - func test_equalityOperator_withEquatableExpressions_buildsBooleanExpression() { - AssertSQL("(\"bool\" = \"bool\")", bool == bool) - AssertSQL("(\"bool\" = \"boolOptional\")", bool == boolOptional) - AssertSQL("(\"boolOptional\" = \"bool\")", boolOptional == bool) - AssertSQL("(\"boolOptional\" = \"boolOptional\")", boolOptional == boolOptional) - AssertSQL("(\"bool\" = 1)", bool == true) - AssertSQL("(\"boolOptional\" = 1)", boolOptional == true) - AssertSQL("(1 = \"bool\")", true == bool) - AssertSQL("(1 = \"boolOptional\")", true == boolOptional) - - AssertSQL("(\"boolOptional\" IS NULL)", boolOptional == nil) - AssertSQL("(NULL IS \"boolOptional\")", nil == boolOptional) - } - - func test_inequalityOperator_withEquatableExpressions_buildsBooleanExpression() { - AssertSQL("(\"bool\" != \"bool\")", bool != bool) - AssertSQL("(\"bool\" != \"boolOptional\")", bool != boolOptional) - AssertSQL("(\"boolOptional\" != \"bool\")", boolOptional != bool) - AssertSQL("(\"boolOptional\" != \"boolOptional\")", boolOptional != boolOptional) - AssertSQL("(\"bool\" != 1)", bool != true) - AssertSQL("(\"boolOptional\" != 1)", boolOptional != true) - AssertSQL("(1 != \"bool\")", true != bool) - AssertSQL("(1 != \"boolOptional\")", true != boolOptional) - - AssertSQL("(\"boolOptional\" IS NOT NULL)", boolOptional != nil) - AssertSQL("(NULL IS NOT \"boolOptional\")", nil != boolOptional) - } - - func test_greaterThanOperator_withComparableExpressions_buildsBooleanExpression() { - AssertSQL("(\"bool\" > \"bool\")", bool > bool) - AssertSQL("(\"bool\" > \"boolOptional\")", bool > boolOptional) - AssertSQL("(\"boolOptional\" > \"bool\")", boolOptional > bool) - AssertSQL("(\"boolOptional\" > \"boolOptional\")", boolOptional > boolOptional) - AssertSQL("(\"bool\" > 1)", bool > true) - AssertSQL("(\"boolOptional\" > 1)", boolOptional > true) - AssertSQL("(1 > \"bool\")", true > bool) - AssertSQL("(1 > \"boolOptional\")", true > boolOptional) - } - - func test_greaterThanOrEqualToOperator_withComparableExpressions_buildsBooleanExpression() { - AssertSQL("(\"bool\" >= \"bool\")", bool >= bool) - AssertSQL("(\"bool\" >= \"boolOptional\")", bool >= boolOptional) - AssertSQL("(\"boolOptional\" >= \"bool\")", boolOptional >= bool) - AssertSQL("(\"boolOptional\" >= \"boolOptional\")", boolOptional >= boolOptional) - AssertSQL("(\"bool\" >= 1)", bool >= true) - AssertSQL("(\"boolOptional\" >= 1)", boolOptional >= true) - AssertSQL("(1 >= \"bool\")", true >= bool) - AssertSQL("(1 >= \"boolOptional\")", true >= boolOptional) - } - - func test_lessThanOperator_withComparableExpressions_buildsBooleanExpression() { - AssertSQL("(\"bool\" < \"bool\")", bool < bool) - AssertSQL("(\"bool\" < \"boolOptional\")", bool < boolOptional) - AssertSQL("(\"boolOptional\" < \"bool\")", boolOptional < bool) - AssertSQL("(\"boolOptional\" < \"boolOptional\")", boolOptional < boolOptional) - AssertSQL("(\"bool\" < 1)", bool < true) - AssertSQL("(\"boolOptional\" < 1)", boolOptional < true) - AssertSQL("(1 < \"bool\")", true < bool) - AssertSQL("(1 < \"boolOptional\")", true < boolOptional) - } - - func test_lessThanOrEqualToOperator_withComparableExpressions_buildsBooleanExpression() { - AssertSQL("(\"bool\" <= \"bool\")", bool <= bool) - AssertSQL("(\"bool\" <= \"boolOptional\")", bool <= boolOptional) - AssertSQL("(\"boolOptional\" <= \"bool\")", boolOptional <= bool) - AssertSQL("(\"boolOptional\" <= \"boolOptional\")", boolOptional <= boolOptional) - AssertSQL("(\"bool\" <= 1)", bool <= true) - AssertSQL("(\"boolOptional\" <= 1)", boolOptional <= true) - AssertSQL("(1 <= \"bool\")", true <= bool) - AssertSQL("(1 <= \"boolOptional\")", true <= boolOptional) - } - - func test_patternMatchingOperator_withComparableCountableClosedRange_buildsBetweenBooleanExpression() { - AssertSQL("\"int\" BETWEEN 0 AND 5", 0...5 ~= int) - AssertSQL("\"intOptional\" BETWEEN 0 AND 5", 0...5 ~= intOptional) - } - - func test_patternMatchingOperator_withComparableClosedRange_buildsBetweenBooleanExpression() { - AssertSQL("\"double\" BETWEEN 1.2 AND 4.5", 1.2...4.5 ~= double) - AssertSQL("\"doubleOptional\" BETWEEN 1.2 AND 4.5", 1.2...4.5 ~= doubleOptional) - } - - func test_patternMatchingOperator_withomparableClosedRangeString_buildsBetweenBooleanExpression() { - AssertSQL("\"string\" BETWEEN 'a' AND 'b'", "a"..."b" ~= string) - AssertSQL("\"stringOptional\" BETWEEN 'a' AND 'b'", "a"..."b" ~= stringOptional) - } - - func test_doubleAndOperator_withBooleanExpressions_buildsCompoundExpression() { - AssertSQL("(\"bool\" AND \"bool\")", bool && bool) - AssertSQL("(\"bool\" AND \"boolOptional\")", bool && boolOptional) - AssertSQL("(\"boolOptional\" AND \"bool\")", boolOptional && bool) - AssertSQL("(\"boolOptional\" AND \"boolOptional\")", boolOptional && boolOptional) - AssertSQL("(\"bool\" AND 1)", bool && true) - AssertSQL("(\"boolOptional\" AND 1)", boolOptional && true) - AssertSQL("(1 AND \"bool\")", true && bool) - AssertSQL("(1 AND \"boolOptional\")", true && boolOptional) - } - - func test_doubleOrOperator_withBooleanExpressions_buildsCompoundExpression() { - AssertSQL("(\"bool\" OR \"bool\")", bool || bool) - AssertSQL("(\"bool\" OR \"boolOptional\")", bool || boolOptional) - AssertSQL("(\"boolOptional\" OR \"bool\")", boolOptional || bool) - AssertSQL("(\"boolOptional\" OR \"boolOptional\")", boolOptional || boolOptional) - AssertSQL("(\"bool\" OR 1)", bool || true) - AssertSQL("(\"boolOptional\" OR 1)", boolOptional || true) - AssertSQL("(1 OR \"bool\")", true || bool) - AssertSQL("(1 OR \"boolOptional\")", true || boolOptional) - } - - func test_unaryNotOperator_withBooleanExpressions_buildsNotExpression() { - AssertSQL("NOT (\"bool\")", !bool) - AssertSQL("NOT (\"boolOptional\")", !boolOptional) - } - - func test_precedencePreserved() { - let n = Expression(value: 1) - AssertSQL("(((1 = 1) AND (1 = 1)) OR (1 = 1))", (n == n && n == n) || n == n) - AssertSQL("((1 = 1) AND ((1 = 1) OR (1 = 1)))", n == n && (n == n || n == n)) - } - -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/QueryTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/QueryTests.swift deleted file mode 100644 index 2cf164c6d3..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/QueryTests.swift +++ /dev/null @@ -1,365 +0,0 @@ -import XCTest -import SQLite - -class QueryTests : XCTestCase { - - let users = Table("users") - let id = Expression("id") - let email = Expression("email") - let age = Expression("age") - let admin = Expression("admin") - let optionalAdmin = Expression("admin") - - let posts = Table("posts") - let userId = Expression("user_id") - let categoryId = Expression("category_id") - let published = Expression("published") - - let categories = Table("categories") - let tag = Expression("tag") - - func test_select_withExpression_compilesSelectClause() { - AssertSQL("SELECT \"email\" FROM \"users\"", users.select(email)) - } - - func test_select_withStarExpression_compilesSelectClause() { - AssertSQL("SELECT * FROM \"users\"", users.select(*)) - } - - func test_select_withNamespacedStarExpression_compilesSelectClause() { - AssertSQL("SELECT \"users\".* FROM \"users\"", users.select(users[*])) - } - - func test_select_withVariadicExpressions_compilesSelectClause() { - AssertSQL("SELECT \"email\", count(*) FROM \"users\"", users.select(email, count(*))) - } - - func test_select_withExpressions_compilesSelectClause() { - AssertSQL("SELECT \"email\", count(*) FROM \"users\"", users.select([email, count(*)])) - } - - func test_selectDistinct_withExpression_compilesSelectClause() { - AssertSQL("SELECT DISTINCT \"age\" FROM \"users\"", users.select(distinct: age)) - } - - func test_selectDistinct_withExpressions_compilesSelectClause() { - AssertSQL("SELECT DISTINCT \"age\", \"admin\" FROM \"users\"", users.select(distinct: [age, admin])) - } - - func test_selectDistinct_withStar_compilesSelectClause() { - AssertSQL("SELECT DISTINCT * FROM \"users\"", users.select(distinct: *)) - } - - func test_join_compilesJoinClause() { - AssertSQL( - "SELECT * FROM \"users\" INNER JOIN \"posts\" ON (\"posts\".\"user_id\" = \"users\".\"id\")", - users.join(posts, on: posts[userId] == users[id]) - ) - } - - func test_join_withExplicitType_compilesJoinClauseWithType() { - AssertSQL( - "SELECT * FROM \"users\" LEFT OUTER JOIN \"posts\" ON (\"posts\".\"user_id\" = \"users\".\"id\")", - users.join(.leftOuter, posts, on: posts[userId] == users[id]) - ) - - AssertSQL( - "SELECT * FROM \"users\" CROSS JOIN \"posts\" ON (\"posts\".\"user_id\" = \"users\".\"id\")", - users.join(.cross, posts, on: posts[userId] == users[id]) - ) - } - - func test_join_withTableCondition_compilesJoinClauseWithTableCondition() { - AssertSQL( - "SELECT * FROM \"users\" INNER JOIN \"posts\" ON ((\"posts\".\"user_id\" = \"users\".\"id\") AND \"published\")", - users.join(posts.filter(published), on: posts[userId] == users[id]) - ) - } - - func test_join_whenChained_compilesAggregateJoinClause() { - AssertSQL( - "SELECT * FROM \"users\" " + - "INNER JOIN \"posts\" ON (\"posts\".\"user_id\" = \"users\".\"id\") " + - "INNER JOIN \"categories\" ON (\"categories\".\"id\" = \"posts\".\"category_id\")", - users.join(posts, on: posts[userId] == users[id]).join(categories, on: categories[id] == posts[categoryId]) - ) - } - - func test_filter_compilesWhereClause() { - AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 1)", users.filter(admin == true)) - } - - func test_filter_compilesWhereClause_false() { - AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 0)", users.filter(admin == false)) - } - - func test_filter_compilesWhereClause_optional() { - AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 1)", users.filter(optionalAdmin == true)) - } - - func test_filter_compilesWhereClause_optional_false() { - AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 0)", users.filter(optionalAdmin == false)) - } - - func test_where_compilesWhereClause() { - AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 1)", users.where(admin == true)) - } - - func test_where_compilesWhereClause_false() { - AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 0)", users.where(admin == false)) - } - - func test_where_compilesWhereClause_optional() { - AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 1)", users.where(optionalAdmin == true)) - } - - func test_where_compilesWhereClause_optional_false() { - AssertSQL("SELECT * FROM \"users\" WHERE (\"admin\" = 0)", users.where(optionalAdmin == false)) - } - - func test_filter_whenChained_compilesAggregateWhereClause() { - AssertSQL( - "SELECT * FROM \"users\" WHERE ((\"age\" >= 35) AND \"admin\")", - users.filter(age >= 35).filter(admin) - ) - } - - func test_group_withSingleExpressionName_compilesGroupClause() { - AssertSQL("SELECT * FROM \"users\" GROUP BY \"age\"", - users.group(age)) - } - - func test_group_withVariadicExpressionNames_compilesGroupClause() { - AssertSQL("SELECT * FROM \"users\" GROUP BY \"age\", \"admin\"", users.group(age, admin)) - } - - func test_group_withExpressionNameAndHavingBindings_compilesGroupClause() { - AssertSQL("SELECT * FROM \"users\" GROUP BY \"age\" HAVING \"admin\"", users.group(age, having: admin)) - AssertSQL("SELECT * FROM \"users\" GROUP BY \"age\" HAVING (\"age\" >= 30)", users.group(age, having: age >= 30)) - } - - func test_group_withExpressionNamesAndHavingBindings_compilesGroupClause() { - AssertSQL( - "SELECT * FROM \"users\" GROUP BY \"age\", \"admin\" HAVING \"admin\"", - users.group([age, admin], having: admin) - ) - AssertSQL( - "SELECT * FROM \"users\" GROUP BY \"age\", \"admin\" HAVING (\"age\" >= 30)", - users.group([age, admin], having: age >= 30) - ) - } - - func test_order_withSingleExpressionName_compilesOrderClause() { - AssertSQL("SELECT * FROM \"users\" ORDER BY \"age\"", users.order(age)) - } - - func test_order_withVariadicExpressionNames_compilesOrderClause() { - AssertSQL("SELECT * FROM \"users\" ORDER BY \"age\", \"email\"", users.order(age, email)) - } - - func test_order_withArrayExpressionNames_compilesOrderClause() { - AssertSQL("SELECT * FROM \"users\" ORDER BY \"age\", \"email\"", users.order([age, email])) - } - - func test_order_withExpressionAndSortDirection_compilesOrderClause() { -// AssertSQL("SELECT * FROM \"users\" ORDER BY \"age\" DESC, \"email\" ASC", users.order(age.desc, email.asc)) - } - - func test_order_whenChained_resetsOrderClause() { - AssertSQL("SELECT * FROM \"users\" ORDER BY \"age\"", users.order(email).order(age)) - } - - func test_reverse_withoutOrder_ordersByRowIdDescending() { -// AssertSQL("SELECT * FROM \"users\" ORDER BY \"ROWID\" DESC", users.reverse()) - } - - func test_reverse_withOrder_reversesOrder() { -// AssertSQL("SELECT * FROM \"users\" ORDER BY \"age\" DESC, \"email\" ASC", users.order(age, email.desc).reverse()) - } - - func test_limit_compilesLimitClause() { - AssertSQL("SELECT * FROM \"users\" LIMIT 5", users.limit(5)) - } - - func test_limit_withOffset_compilesOffsetClause() { - AssertSQL("SELECT * FROM \"users\" LIMIT 5 OFFSET 5", users.limit(5, offset: 5)) - } - - func test_limit_whenChained_overridesLimit() { - let query = users.limit(5) - - AssertSQL("SELECT * FROM \"users\" LIMIT 10", query.limit(10)) - AssertSQL("SELECT * FROM \"users\"", query.limit(nil)) - } - - func test_limit_whenChained_withOffset_overridesOffset() { - let query = users.limit(5, offset: 5) - - AssertSQL("SELECT * FROM \"users\" LIMIT 10 OFFSET 20", query.limit(10, offset: 20)) - AssertSQL("SELECT * FROM \"users\"", query.limit(nil)) - } - - func test_alias_aliasesTable() { - let managerId = Expression("manager_id") - - let managers = users.alias("managers") - - AssertSQL( - "SELECT * FROM \"users\" " + - "INNER JOIN \"users\" AS \"managers\" ON (\"managers\".\"id\" = \"users\".\"manager_id\")", - users.join(managers, on: managers[id] == users[managerId]) - ) - } - - func test_insert_compilesInsertExpression() { - AssertSQL( - "INSERT INTO \"users\" (\"email\", \"age\") VALUES ('alice@example.com', 30)", - users.insert(email <- "alice@example.com", age <- 30) - ) - } - - func test_insert_withOnConflict_compilesInsertOrOnConflictExpression() { - AssertSQL( - "INSERT OR REPLACE INTO \"users\" (\"email\", \"age\") VALUES ('alice@example.com', 30)", - users.insert(or: .replace, email <- "alice@example.com", age <- 30) - ) - } - - func test_insert_compilesInsertExpressionWithDefaultValues() { - AssertSQL("INSERT INTO \"users\" DEFAULT VALUES", users.insert()) - } - - func test_insert_withQuery_compilesInsertExpressionWithSelectStatement() { - let emails = Table("emails") - - AssertSQL( - "INSERT INTO \"emails\" SELECT \"email\" FROM \"users\" WHERE \"admin\"", - emails.insert(users.select(email).filter(admin)) - ) - } - - func test_update_compilesUpdateExpression() { - AssertSQL( - "UPDATE \"users\" SET \"age\" = 30, \"admin\" = 1 WHERE (\"id\" = 1)", - users.filter(id == 1).update(age <- 30, admin <- true) - ) - } - - func test_delete_compilesDeleteExpression() { - AssertSQL( - "DELETE FROM \"users\" WHERE (\"id\" = 1)", - users.filter(id == 1).delete() - ) - } - - func test_delete_compilesExistsExpression() { - AssertSQL( - "SELECT EXISTS (SELECT * FROM \"users\")", - users.exists - ) - } - - func test_count_returnsCountExpression() { - AssertSQL("SELECT count(*) FROM \"users\"", users.count) - } - - func test_scalar_returnsScalarExpression() { - AssertSQL("SELECT \"int\" FROM \"table\"", table.select(int) as ScalarQuery) - AssertSQL("SELECT \"intOptional\" FROM \"table\"", table.select(intOptional) as ScalarQuery) - AssertSQL("SELECT DISTINCT \"int\" FROM \"table\"", table.select(distinct: int) as ScalarQuery) - AssertSQL("SELECT DISTINCT \"intOptional\" FROM \"table\"", table.select(distinct: intOptional) as ScalarQuery) - } - - func test_subscript_withExpression_returnsNamespacedExpression() { - let query = Table("query") - - AssertSQL("\"query\".\"blob\"", query[data]) - AssertSQL("\"query\".\"blobOptional\"", query[dataOptional]) - - AssertSQL("\"query\".\"bool\"", query[bool]) - AssertSQL("\"query\".\"boolOptional\"", query[boolOptional]) - - AssertSQL("\"query\".\"date\"", query[date]) - AssertSQL("\"query\".\"dateOptional\"", query[dateOptional]) - - AssertSQL("\"query\".\"double\"", query[double]) - AssertSQL("\"query\".\"doubleOptional\"", query[doubleOptional]) - - AssertSQL("\"query\".\"int\"", query[int]) - AssertSQL("\"query\".\"intOptional\"", query[intOptional]) - - AssertSQL("\"query\".\"int64\"", query[int64]) - AssertSQL("\"query\".\"int64Optional\"", query[int64Optional]) - - AssertSQL("\"query\".\"string\"", query[string]) - AssertSQL("\"query\".\"stringOptional\"", query[stringOptional]) - - AssertSQL("\"query\".*", query[*]) - } - - func test_tableNamespacedByDatabase() { - let table = Table("table", database: "attached") - - AssertSQL("SELECT * FROM \"attached\".\"table\"", table) - } - -} - -class QueryIntegrationTests : SQLiteTestCase { - - let id = Expression("id") - let email = Expression("email") - - override func setUp() { - super.setUp() - - CreateUsersTable() - } - - // MARK: - - - func test_select() { - for _ in try! db.prepare(users) { - // FIXME - } - - let managerId = Expression("manager_id") - let managers = users.alias("managers") - - let alice = try! db.run(users.insert(email <- "alice@example.com")) - _ = try! db.run(users.insert(email <- "betsy@example.com", managerId <- alice)) - - for user in try! db.prepare(users.join(managers, on: managers[id] == users[managerId])) { - _ = user[users[managerId]] - } - } - - func test_scalar() { - XCTAssertEqual(0, try! db.scalar(users.count)) - XCTAssertEqual(false, try! db.scalar(users.exists)) - - try! InsertUsers("alice") - XCTAssertEqual(1, try! db.scalar(users.select(id.average))) - } - - func test_pluck() { - let rowid = try! db.run(users.insert(email <- "alice@example.com")) - XCTAssertEqual(rowid, try! db.pluck(users)![id]) - } - - func test_insert() { - let id = try! db.run(users.insert(email <- "alice@example.com")) - XCTAssertEqual(1, id) - } - - func test_update() { - let changes = try! db.run(users.update(email <- "alice@example.com")) - XCTAssertEqual(0, changes) - } - - func test_delete() { - let changes = try! db.run(users.delete()) - XCTAssertEqual(0, changes) - } - -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/RTreeTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/RTreeTests.swift deleted file mode 100644 index 7147533ecb..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/RTreeTests.swift +++ /dev/null @@ -1,17 +0,0 @@ -import XCTest -import SQLite - -class RTreeTests : XCTestCase { - - func test_create_onVirtualTable_withRTree_createVirtualTableExpression() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING rtree(\"int64\", \"double\", \"double\")", - virtualTable.create(.RTree(int64, (double, double))) - ) - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING rtree(\"int64\", \"double\", \"double\", \"double\", \"double\")", - virtualTable.create(.RTree(int64, (double, double), (double, double))) - ) - } - -} \ No newline at end of file diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SchemaTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SchemaTests.swift deleted file mode 100644 index 371459c757..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SchemaTests.swift +++ /dev/null @@ -1,775 +0,0 @@ -import XCTest -import SQLite - -class SchemaTests : XCTestCase { - - func test_drop_compilesDropTableExpression() { - XCTAssertEqual("DROP TABLE \"table\"", table.drop()) - XCTAssertEqual("DROP TABLE IF EXISTS \"table\"", table.drop(ifExists: true)) - } - - func test_drop_compilesDropVirtualTableExpression() { - XCTAssertEqual("DROP TABLE \"virtual_table\"", virtualTable.drop()) - XCTAssertEqual("DROP TABLE IF EXISTS \"virtual_table\"", virtualTable.drop(ifExists: true)) - } - - func test_drop_compilesDropViewExpression() { - XCTAssertEqual("DROP VIEW \"view\"", _view.drop()) - XCTAssertEqual("DROP VIEW IF EXISTS \"view\"", _view.drop(ifExists: true)) - } - - func test_create_withBuilder_compilesCreateTableExpression() { - XCTAssertEqual( - "CREATE TABLE \"table\" (" + - "\"blob\" BLOB NOT NULL, " + - "\"blobOptional\" BLOB, " + - "\"double\" REAL NOT NULL, " + - "\"doubleOptional\" REAL, " + - "\"int64\" INTEGER NOT NULL, " + - "\"int64Optional\" INTEGER, " + - "\"string\" TEXT NOT NULL, " + - "\"stringOptional\" TEXT" + - ")", - table.create { t in - t.column(data) - t.column(dataOptional) - t.column(double) - t.column(doubleOptional) - t.column(int64) - t.column(int64Optional) - t.column(string) - t.column(stringOptional) - } - ) - XCTAssertEqual( - "CREATE TEMPORARY TABLE \"table\" (\"int64\" INTEGER NOT NULL)", - table.create(temporary: true) { $0.column(int64) } - ) - XCTAssertEqual( - "CREATE TABLE IF NOT EXISTS \"table\" (\"int64\" INTEGER NOT NULL)", - table.create(ifNotExists: true) { $0.column(int64) } - ) - XCTAssertEqual( - "CREATE TEMPORARY TABLE IF NOT EXISTS \"table\" (\"int64\" INTEGER NOT NULL)", - table.create(temporary: true, ifNotExists: true) { $0.column(int64) } - ) - } - - func test_create_withQuery_compilesCreateTableExpression() { - XCTAssertEqual( - "CREATE TABLE \"table\" AS SELECT \"int64\" FROM \"view\"", - table.create(_view.select(int64)) - ) - } - - // thoroughness test for ambiguity - func test_column_compilesColumnDefinitionExpression() { - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL)", - table.create { t in t.column(int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE)", - table.create { t in t.column(int64, unique: true) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64\" > 0))", - table.create { t in t.column(int64, check: int64 > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64Optional\" > 0))", - table.create { t in t.column(int64, check: int64Optional > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL DEFAULT (\"int64\"))", - table.create { t in t.column(int64, defaultValue: int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL DEFAULT (0))", - table.create { t in t.column(int64, defaultValue: 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64\" > 0))", - table.create { t in t.column(int64, unique: true, check: int64 > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64Optional\" > 0))", - table.create { t in t.column(int64, unique: true, check: int64Optional > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE DEFAULT (\"int64\"))", - table.create { t in t.column(int64, unique: true, defaultValue: int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE DEFAULT (0))", - table.create { t in t.column(int64, unique: true, defaultValue: 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64\" > 0))", - table.create { t in t.column(int64, unique: true, check: int64 > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64Optional\" > 0))", - table.create { t in t.column(int64, unique: true, check: int64Optional > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64\" > 0) DEFAULT (\"int64\"))", - table.create { t in t.column(int64, unique: true, check: int64 > 0, defaultValue: int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64Optional\" > 0) DEFAULT (\"int64\"))", - table.create { t in t.column(int64, unique: true, check: int64Optional > 0, defaultValue: int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64\" > 0) DEFAULT (0))", - table.create { t in t.column(int64, unique: true, check: int64 > 0, defaultValue: 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64Optional\" > 0) DEFAULT (0))", - table.create { t in t.column(int64, unique: true, check: int64Optional > 0, defaultValue: 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64\" > 0) DEFAULT (\"int64\"))", - table.create { t in t.column(int64, check: int64 > 0, defaultValue: int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64Optional\" > 0) DEFAULT (\"int64\"))", - table.create { t in t.column(int64, check: int64Optional > 0, defaultValue: int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64\" > 0) DEFAULT (0))", - table.create { t in t.column(int64, check: int64 > 0, defaultValue: 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64Optional\" > 0) DEFAULT (0))", - table.create { t in t.column(int64, check: int64Optional > 0, defaultValue: 0) } - ) - - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY NOT NULL CHECK (\"int64\" > 0))", - table.create { t in t.column(int64, primaryKey: true, check: int64 > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY NOT NULL CHECK (\"int64Optional\" > 0))", - table.create { t in t.column(int64, primaryKey: true, check: int64Optional > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY NOT NULL DEFAULT (\"int64\"))", - table.create { t in t.column(int64, primaryKey: true, defaultValue: int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY NOT NULL CHECK (\"int64\" > 0))", - table.create { t in t.column(int64, primaryKey: true, check: int64 > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY NOT NULL CHECK (\"int64Optional\" > 0))", - table.create { t in t.column(int64, primaryKey: true, check: int64Optional > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY NOT NULL CHECK (\"int64\" > 0) DEFAULT (\"int64\"))", - table.create { t in t.column(int64, primaryKey: true, check: int64 > 0, defaultValue: int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY NOT NULL CHECK (\"int64Optional\" > 0) DEFAULT (\"int64\"))", - table.create { t in t.column(int64, primaryKey: true, check: int64Optional > 0, defaultValue: int64) } - ) - - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER)", - table.create { t in t.column(int64Optional) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE)", - table.create { t in t.column(int64Optional, unique: true) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64\" > 0))", - table.create { t in t.column(int64Optional, check: int64 > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0))", - table.create { t in t.column(int64Optional, check: int64Optional > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER DEFAULT (\"int64\"))", - table.create { t in t.column(int64Optional, defaultValue: int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER DEFAULT (\"int64Optional\"))", - table.create { t in t.column(int64Optional, defaultValue: int64Optional) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER DEFAULT (0))", - table.create { t in t.column(int64Optional, defaultValue: 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64\" > 0))", - table.create { t in t.column(int64Optional, unique: true, check: int64 > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64Optional\" > 0))", - table.create { t in t.column(int64Optional, unique: true, check: int64Optional > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE DEFAULT (\"int64\"))", - table.create { t in t.column(int64Optional, unique: true, defaultValue: int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE DEFAULT (\"int64Optional\"))", - table.create { t in t.column(int64Optional, unique: true, defaultValue: int64Optional) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE DEFAULT (0))", - table.create { t in t.column(int64Optional, unique: true, defaultValue: 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64\" > 0))", - table.create { t in t.column(int64Optional, unique: true, check: int64 > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64Optional\" > 0))", - table.create { t in t.column(int64Optional, unique: true, check: int64Optional > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64\" > 0) DEFAULT (\"int64\"))", - table.create { t in t.column(int64Optional, unique: true, check: int64 > 0, defaultValue: int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64\" > 0) DEFAULT (\"int64Optional\"))", - table.create { t in t.column(int64Optional, unique: true, check: int64 > 0, defaultValue: int64Optional) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64Optional\" > 0) DEFAULT (\"int64\"))", - table.create { t in t.column(int64Optional, unique: true, check: int64Optional > 0, defaultValue: int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64Optional\" > 0) DEFAULT (\"int64Optional\"))", - table.create { t in t.column(int64Optional, unique: true, check: int64Optional > 0, defaultValue: int64Optional) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64\" > 0) DEFAULT (0))", - table.create { t in t.column(int64Optional, unique: true, check: int64 > 0, defaultValue: 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64Optional\" > 0) DEFAULT (0))", - table.create { t in t.column(int64Optional, unique: true, check: int64Optional > 0, defaultValue: 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64\" > 0) DEFAULT (\"int64\"))", - table.create { t in t.column(int64Optional, check: int64 > 0, defaultValue: int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0) DEFAULT (\"int64\"))", - table.create { t in t.column(int64Optional, check: int64Optional > 0, defaultValue: int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64\" > 0) DEFAULT (\"int64Optional\"))", - table.create { t in t.column(int64Optional, check: int64 > 0, defaultValue: int64Optional) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0) DEFAULT (\"int64Optional\"))", - table.create { t in t.column(int64Optional, check: int64Optional > 0, defaultValue: int64Optional) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64\" > 0) DEFAULT (0))", - table.create { t in t.column(int64Optional, check: int64 > 0, defaultValue: 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0) DEFAULT (0))", - table.create { t in t.column(int64Optional, check: int64Optional > 0, defaultValue: 0) } - ) - } - - func test_column_withIntegerExpression_compilesPrimaryKeyAutoincrementColumnDefinitionExpression() { - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)", - table.create { t in t.column(int64, primaryKey: .autoincrement) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL CHECK (\"int64\" > 0))", - table.create { t in t.column(int64, primaryKey: .autoincrement, check: int64 > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL CHECK (\"int64Optional\" > 0))", - table.create { t in t.column(int64, primaryKey: .autoincrement, check: int64Optional > 0) } - ) - } - - func test_column_withIntegerExpression_compilesReferentialColumnDefinitionExpression() { - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL REFERENCES \"table\" (\"int64\"))", - table.create { t in t.column(int64, references: table, int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL REFERENCES \"table\" (\"int64\"))", - table.create { t in t.column(int64, references: qualifiedTable, int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE REFERENCES \"table\" (\"int64\"))", - table.create { t in t.column(int64, unique: true, references: table, int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\"))", - table.create { t in t.column(int64, check: int64 > 0, references: table, int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\"))", - table.create { t in t.column(int64, check: int64Optional > 0, references: table, int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\"))", - table.create { t in t.column(int64, unique: true, check: int64 > 0, references: table, int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\"))", - table.create { t in t.column(int64, unique: true, check: int64Optional > 0, references: table, int64) } - ) - - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER REFERENCES \"table\" (\"int64\"))", - table.create { t in t.column(int64Optional, references: table, int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE REFERENCES \"table\" (\"int64\"))", - table.create { t in t.column(int64Optional, unique: true, references: table, int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\"))", - table.create { t in t.column(int64Optional, check: int64 > 0, references: table, int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\"))", - table.create { t in t.column(int64Optional, check: int64Optional > 0, references: table, int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\"))", - table.create { t in t.column(int64Optional, unique: true, check: int64 > 0, references: table, int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"int64Optional\" INTEGER UNIQUE CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\"))", - table.create { t in t.column(int64Optional, unique: true, check: int64Optional > 0, references: table, int64) } - ) - } - - func test_column_withStringExpression_compilesCollatedColumnDefinitionExpression() { - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL COLLATE RTRIM)", - table.create { t in t.column(string, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE COLLATE RTRIM)", - table.create { t in t.column(string, unique: true, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL CHECK (\"string\" != '') COLLATE RTRIM)", - table.create { t in t.column(string, check: string != "", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL CHECK (\"stringOptional\" != '') COLLATE RTRIM)", - table.create { t in t.column(string, check: stringOptional != "", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL DEFAULT (\"string\") COLLATE RTRIM)", - table.create { t in t.column(string, defaultValue: string, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL DEFAULT ('string') COLLATE RTRIM)", - table.create { t in t.column(string, defaultValue: "string", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE CHECK (\"string\" != '') COLLATE RTRIM)", - table.create { t in t.column(string, unique: true, check: string != "", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE CHECK (\"stringOptional\" != '') COLLATE RTRIM)", - table.create { t in t.column(string, unique: true, check: stringOptional != "", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE DEFAULT (\"string\") COLLATE RTRIM)", - table.create { t in t.column(string, unique: true, defaultValue: string, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE DEFAULT ('string') COLLATE RTRIM)", - table.create { t in t.column(string, unique: true, defaultValue: "string", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE CHECK (\"string\" != '') DEFAULT (\"string\") COLLATE RTRIM)", - table.create { t in t.column(string, unique: true, check: string != "", defaultValue: string, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE CHECK (\"stringOptional\" != '') DEFAULT (\"string\") COLLATE RTRIM)", - table.create { t in t.column(string, unique: true, check: stringOptional != "", defaultValue: string, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE CHECK (\"string\" != '') DEFAULT ('string') COLLATE RTRIM)", - table.create { t in t.column(string, unique: true, check: string != "", defaultValue: "string", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL UNIQUE CHECK (\"stringOptional\" != '') DEFAULT ('string') COLLATE RTRIM)", - table.create { t in t.column(string, unique: true, check: stringOptional != "", defaultValue: "string", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL CHECK (\"string\" != '') DEFAULT (\"string\") COLLATE RTRIM)", - table.create { t in t.column(string, check: string != "", defaultValue: string, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL CHECK (\"stringOptional\" != '') DEFAULT (\"string\") COLLATE RTRIM)", - table.create { t in t.column(string, check: stringOptional != "", defaultValue: string, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL CHECK (\"string\" != '') DEFAULT ('string') COLLATE RTRIM)", - table.create { t in t.column(string, check: string != "", defaultValue: "string", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"string\" TEXT NOT NULL CHECK (\"stringOptional\" != '') DEFAULT ('string') COLLATE RTRIM)", - table.create { t in t.column(string, check: stringOptional != "", defaultValue: "string", collate: .rtrim) } - ) - - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL COLLATE RTRIM)", - table.create { t in t.column(stringOptional, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE COLLATE RTRIM)", - table.create { t in t.column(stringOptional, unique: true, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"string\" != '') COLLATE RTRIM)", - table.create { t in t.column(stringOptional, check: string != "", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"stringOptional\" != '') COLLATE RTRIM)", - table.create { t in t.column(stringOptional, check: stringOptional != "", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL DEFAULT (\"string\") COLLATE RTRIM)", - table.create { t in t.column(stringOptional, defaultValue: string, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL DEFAULT (\"stringOptional\") COLLATE RTRIM)", - table.create { t in t.column(stringOptional, defaultValue: stringOptional, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL DEFAULT ('string') COLLATE RTRIM)", - table.create { t in t.column(stringOptional, defaultValue: "string", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"string\" != '') COLLATE RTRIM)", - table.create { t in t.column(stringOptional, unique: true, check: string != "", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"stringOptional\" != '') COLLATE RTRIM)", - table.create { t in t.column(stringOptional, unique: true, check: stringOptional != "", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE DEFAULT (\"string\") COLLATE RTRIM)", - table.create { t in t.column(stringOptional, unique: true, defaultValue: string, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE DEFAULT (\"stringOptional\") COLLATE RTRIM)", - table.create { t in t.column(stringOptional, unique: true, defaultValue: stringOptional, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE DEFAULT ('string') COLLATE RTRIM)", - table.create { t in t.column(stringOptional, unique: true, defaultValue: "string", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"string\" != '') DEFAULT (\"string\") COLLATE RTRIM)", - table.create { t in t.column(stringOptional, unique: true, check: string != "", defaultValue: string, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"string\" != '') DEFAULT (\"stringOptional\") COLLATE RTRIM)", - table.create { t in t.column(stringOptional, unique: true, check: string != "", defaultValue: stringOptional, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"stringOptional\" != '') DEFAULT (\"string\") COLLATE RTRIM)", - table.create { t in t.column(stringOptional, unique: true, check: stringOptional != "", defaultValue: string, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"stringOptional\" != '') DEFAULT (\"stringOptional\") COLLATE RTRIM)", - table.create { t in t.column(stringOptional, unique: true, check: stringOptional != "", defaultValue: stringOptional, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"string\" != '') DEFAULT ('string') COLLATE RTRIM)", - table.create { t in t.column(stringOptional, unique: true, check: string != "", defaultValue: "string", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL UNIQUE CHECK (\"stringOptional\" != '') DEFAULT ('string') COLLATE RTRIM)", - table.create { t in t.column(stringOptional, unique: true, check: stringOptional != "", defaultValue: "string", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"string\" != '') DEFAULT (\"string\") COLLATE RTRIM)", - table.create { t in t.column(stringOptional, check: string != "", defaultValue: string, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"stringOptional\" != '') DEFAULT (\"string\") COLLATE RTRIM)", - table.create { t in t.column(stringOptional, check: stringOptional != "", defaultValue: string, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"string\" != '') DEFAULT (\"stringOptional\") COLLATE RTRIM)", - table.create { t in t.column(stringOptional, check: string != "", defaultValue: stringOptional, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"stringOptional\" != '') DEFAULT (\"stringOptional\") COLLATE RTRIM)", - table.create { t in t.column(stringOptional, check: stringOptional != "", defaultValue: stringOptional, collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"string\" != '') DEFAULT ('string') COLLATE RTRIM)", - table.create { t in t.column(stringOptional, check: string != "", defaultValue: "string", collate: .rtrim) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (\"stringOptional\" TEXT NOT NULL CHECK (\"stringOptional\" != '') DEFAULT ('string') COLLATE RTRIM)", - table.create { t in t.column(stringOptional, check: stringOptional != "", defaultValue: "string", collate: .rtrim) } - ) - } - - func test_primaryKey_compilesPrimaryKeyExpression() { - XCTAssertEqual( - "CREATE TABLE \"table\" (PRIMARY KEY (\"int64\"))", - table.create { t in t.primaryKey(int64) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (PRIMARY KEY (\"int64\", \"string\"))", - table.create { t in t.primaryKey(int64, string) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (PRIMARY KEY (\"int64\", \"string\", \"double\"))", - table.create { t in t.primaryKey(int64, string, double) } - ) - } - - func test_unique_compilesUniqueExpression() { - XCTAssertEqual( - "CREATE TABLE \"table\" (UNIQUE (\"int64\"))", - table.create { t in t.unique(int64) } - ) - } - - func test_check_compilesCheckExpression() { - XCTAssertEqual( - "CREATE TABLE \"table\" (CHECK ((\"int64\" > 0)))", - table.create { t in t.check(int64 > 0) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (CHECK ((\"int64Optional\" > 0)))", - table.create { t in t.check(int64Optional > 0) } - ) - } - - func test_foreignKey_compilesForeignKeyExpression() { - XCTAssertEqual( - "CREATE TABLE \"table\" (FOREIGN KEY (\"string\") REFERENCES \"table\" (\"string\"))", - table.create { t in t.foreignKey(string, references: table, string) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (FOREIGN KEY (\"stringOptional\") REFERENCES \"table\" (\"string\"))", - table.create { t in t.foreignKey(stringOptional, references: table, string) } - ) - - XCTAssertEqual( - "CREATE TABLE \"table\" (FOREIGN KEY (\"string\") REFERENCES \"table\" (\"string\") ON UPDATE CASCADE ON DELETE SET NULL)", - table.create { t in t.foreignKey(string, references: table, string, update: .cascade, delete: .setNull) } - ) - - XCTAssertEqual( - "CREATE TABLE \"table\" (FOREIGN KEY (\"string\", \"string\") REFERENCES \"table\" (\"string\", \"string\"))", - table.create { t in t.foreignKey((string, string), references: table, (string, string)) } - ) - XCTAssertEqual( - "CREATE TABLE \"table\" (FOREIGN KEY (\"string\", \"string\", \"string\") REFERENCES \"table\" (\"string\", \"string\", \"string\"))", - table.create { t in t.foreignKey((string, string, string), references: table, (string, string, string)) } - ) - } - - func test_addColumn_compilesAlterTableExpression() { - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL DEFAULT (1)", - table.addColumn(int64, defaultValue: 1) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL CHECK (\"int64\" > 0) DEFAULT (1)", - table.addColumn(int64, check: int64 > 0, defaultValue: 1) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL CHECK (\"int64Optional\" > 0) DEFAULT (1)", - table.addColumn(int64, check: int64Optional > 0, defaultValue: 1) - ) - - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER", - table.addColumn(int64Optional) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER CHECK (\"int64\" > 0)", - table.addColumn(int64Optional, check: int64 > 0) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0)", - table.addColumn(int64Optional, check: int64Optional > 0) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER DEFAULT (1)", - table.addColumn(int64Optional, defaultValue: 1) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER CHECK (\"int64\" > 0) DEFAULT (1)", - table.addColumn(int64Optional, check: int64 > 0, defaultValue: 1) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0) DEFAULT (1)", - table.addColumn(int64Optional, check: int64Optional > 0, defaultValue: 1) - ) - } - - func test_addColumn_withIntegerExpression_compilesReferentialAlterTableExpression() { - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL REFERENCES \"table\" (\"int64\")", - table.addColumn(int64, references: table, int64) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL UNIQUE REFERENCES \"table\" (\"int64\")", - table.addColumn(int64, unique: true, references: table, int64) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\")", - table.addColumn(int64, check: int64 > 0, references: table, int64) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\")", - table.addColumn(int64, check: int64Optional > 0, references: table, int64) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\")", - table.addColumn(int64, unique: true, check: int64 > 0, references: table, int64) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64\" INTEGER NOT NULL UNIQUE CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\")", - table.addColumn(int64, unique: true, check: int64Optional > 0, references: table, int64) - ) - - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER REFERENCES \"table\" (\"int64\")", - table.addColumn(int64Optional, references: table, int64) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER UNIQUE REFERENCES \"table\" (\"int64\")", - table.addColumn(int64Optional, unique: true, references: table, int64) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\")", - table.addColumn(int64Optional, check: int64 > 0, references: table, int64) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\")", - table.addColumn(int64Optional, check: int64Optional > 0, references: table, int64) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER UNIQUE CHECK (\"int64\" > 0) REFERENCES \"table\" (\"int64\")", - table.addColumn(int64Optional, unique: true, check: int64 > 0, references: table, int64) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"int64Optional\" INTEGER UNIQUE CHECK (\"int64Optional\" > 0) REFERENCES \"table\" (\"int64\")", - table.addColumn(int64Optional, unique: true, check: int64Optional > 0, references: table, int64) - ) - } - - func test_addColumn_withStringExpression_compilesCollatedAlterTableExpression() { - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"string\" TEXT NOT NULL DEFAULT ('string') COLLATE RTRIM", - table.addColumn(string, defaultValue: "string", collate: .rtrim) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"string\" TEXT NOT NULL CHECK (\"string\" != '') DEFAULT ('string') COLLATE RTRIM", - table.addColumn(string, check: string != "", defaultValue: "string", collate: .rtrim) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"string\" TEXT NOT NULL CHECK (\"stringOptional\" != '') DEFAULT ('string') COLLATE RTRIM", - table.addColumn(string, check: stringOptional != "", defaultValue: "string", collate: .rtrim) - ) - - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"stringOptional\" TEXT COLLATE RTRIM", - table.addColumn(stringOptional, collate: .rtrim) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"stringOptional\" TEXT CHECK (\"string\" != '') COLLATE RTRIM", - table.addColumn(stringOptional, check: string != "", collate: .rtrim) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"stringOptional\" TEXT CHECK (\"stringOptional\" != '') COLLATE RTRIM", - table.addColumn(stringOptional, check: stringOptional != "", collate: .rtrim) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"stringOptional\" TEXT CHECK (\"string\" != '') DEFAULT ('string') COLLATE RTRIM", - table.addColumn(stringOptional, check: string != "", defaultValue: "string", collate: .rtrim) - ) - XCTAssertEqual( - "ALTER TABLE \"table\" ADD COLUMN \"stringOptional\" TEXT CHECK (\"stringOptional\" != '') DEFAULT ('string') COLLATE RTRIM", - table.addColumn(stringOptional, check: stringOptional != "", defaultValue: "string", collate: .rtrim) - ) - } - - func test_rename_compilesAlterTableRenameToExpression() { - XCTAssertEqual("ALTER TABLE \"old\" RENAME TO \"table\"", Table("old").rename(table)) - } - - func test_createIndex_compilesCreateIndexExpression() { - XCTAssertEqual("CREATE INDEX \"index_table_on_int64\" ON \"table\" (\"int64\")", table.createIndex(int64)) - - XCTAssertEqual( - "CREATE UNIQUE INDEX \"index_table_on_int64\" ON \"table\" (\"int64\")", - table.createIndex([int64], unique: true) - ) - XCTAssertEqual( - "CREATE INDEX IF NOT EXISTS \"index_table_on_int64\" ON \"table\" (\"int64\")", - table.createIndex([int64], ifNotExists: true) - ) - XCTAssertEqual( - "CREATE UNIQUE INDEX IF NOT EXISTS \"index_table_on_int64\" ON \"table\" (\"int64\")", - table.createIndex([int64], unique: true, ifNotExists: true) - ) - XCTAssertEqual( - "CREATE UNIQUE INDEX IF NOT EXISTS \"main\".\"index_table_on_int64\" ON \"table\" (\"int64\")", - qualifiedTable.createIndex([int64], unique: true, ifNotExists: true) - ) - } - - func test_dropIndex_compilesCreateIndexExpression() { - XCTAssertEqual("DROP INDEX \"index_table_on_int64\"", table.dropIndex(int64)) - XCTAssertEqual("DROP INDEX IF EXISTS \"index_table_on_int64\"", table.dropIndex([int64], ifExists: true)) - } - - func test_create_onView_compilesCreateViewExpression() { - XCTAssertEqual( - "CREATE VIEW \"view\" AS SELECT \"int64\" FROM \"table\"", - _view.create(table.select(int64)) - ) - XCTAssertEqual( - "CREATE TEMPORARY VIEW \"view\" AS SELECT \"int64\" FROM \"table\"", - _view.create(table.select(int64), temporary: true) - ) - XCTAssertEqual( - "CREATE VIEW IF NOT EXISTS \"view\" AS SELECT \"int64\" FROM \"table\"", - _view.create(table.select(int64), ifNotExists: true) - ) - XCTAssertEqual( - "CREATE TEMPORARY VIEW IF NOT EXISTS \"view\" AS SELECT \"int64\" FROM \"table\"", - _view.create(table.select(int64), temporary: true, ifNotExists: true) - ) - } - - func test_create_onVirtualTable_compilesCreateVirtualTableExpression() { - XCTAssertEqual( - "CREATE VIRTUAL TABLE \"virtual_table\" USING \"custom\"('foo', 'bar')", - virtualTable.create(Module("custom", ["foo", "bar"])) - ) - } - - func test_rename_onVirtualTable_compilesAlterTableRenameToExpression() { - XCTAssertEqual( - "ALTER TABLE \"old\" RENAME TO \"virtual_table\"", - VirtualTable("old").rename(virtualTable) - ) - } - -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SetterTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SetterTests.swift deleted file mode 100644 index d4f189d7c5..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/SetterTests.swift +++ /dev/null @@ -1,137 +0,0 @@ -import XCTest -import SQLite - -class SetterTests : XCTestCase { - - func test_setterAssignmentOperator_buildsSetter() { - AssertSQL("\"int\" = \"int\"", int <- int) - AssertSQL("\"int\" = 1", int <- 1) - AssertSQL("\"intOptional\" = \"int\"", intOptional <- int) - AssertSQL("\"intOptional\" = \"intOptional\"", intOptional <- intOptional) - AssertSQL("\"intOptional\" = 1", intOptional <- 1) - AssertSQL("\"intOptional\" = NULL", intOptional <- nil) - } - - func test_plusEquals_withStringExpression_buildsSetter() { - AssertSQL("\"string\" = (\"string\" || \"string\")", string += string) - AssertSQL("\"string\" = (\"string\" || 'literal')", string += "literal") - AssertSQL("\"stringOptional\" = (\"stringOptional\" || \"string\")", stringOptional += string) - AssertSQL("\"stringOptional\" = (\"stringOptional\" || \"stringOptional\")", stringOptional += stringOptional) - AssertSQL("\"stringOptional\" = (\"stringOptional\" || 'literal')", stringOptional += "literal") - } - - func test_plusEquals_withNumberExpression_buildsSetter() { - AssertSQL("\"int\" = (\"int\" + \"int\")", int += int) - AssertSQL("\"int\" = (\"int\" + 1)", int += 1) - AssertSQL("\"intOptional\" = (\"intOptional\" + \"int\")", intOptional += int) - AssertSQL("\"intOptional\" = (\"intOptional\" + \"intOptional\")", intOptional += intOptional) - AssertSQL("\"intOptional\" = (\"intOptional\" + 1)", intOptional += 1) - - AssertSQL("\"double\" = (\"double\" + \"double\")", double += double) - AssertSQL("\"double\" = (\"double\" + 1.0)", double += 1) - AssertSQL("\"doubleOptional\" = (\"doubleOptional\" + \"double\")", doubleOptional += double) - AssertSQL("\"doubleOptional\" = (\"doubleOptional\" + \"doubleOptional\")", doubleOptional += doubleOptional) - AssertSQL("\"doubleOptional\" = (\"doubleOptional\" + 1.0)", doubleOptional += 1) - } - - func test_minusEquals_withNumberExpression_buildsSetter() { - AssertSQL("\"int\" = (\"int\" - \"int\")", int -= int) - AssertSQL("\"int\" = (\"int\" - 1)", int -= 1) - AssertSQL("\"intOptional\" = (\"intOptional\" - \"int\")", intOptional -= int) - AssertSQL("\"intOptional\" = (\"intOptional\" - \"intOptional\")", intOptional -= intOptional) - AssertSQL("\"intOptional\" = (\"intOptional\" - 1)", intOptional -= 1) - - AssertSQL("\"double\" = (\"double\" - \"double\")", double -= double) - AssertSQL("\"double\" = (\"double\" - 1.0)", double -= 1) - AssertSQL("\"doubleOptional\" = (\"doubleOptional\" - \"double\")", doubleOptional -= double) - AssertSQL("\"doubleOptional\" = (\"doubleOptional\" - \"doubleOptional\")", doubleOptional -= doubleOptional) - AssertSQL("\"doubleOptional\" = (\"doubleOptional\" - 1.0)", doubleOptional -= 1) - } - - func test_timesEquals_withNumberExpression_buildsSetter() { - AssertSQL("\"int\" = (\"int\" * \"int\")", int *= int) - AssertSQL("\"int\" = (\"int\" * 1)", int *= 1) - AssertSQL("\"intOptional\" = (\"intOptional\" * \"int\")", intOptional *= int) - AssertSQL("\"intOptional\" = (\"intOptional\" * \"intOptional\")", intOptional *= intOptional) - AssertSQL("\"intOptional\" = (\"intOptional\" * 1)", intOptional *= 1) - - AssertSQL("\"double\" = (\"double\" * \"double\")", double *= double) - AssertSQL("\"double\" = (\"double\" * 1.0)", double *= 1) - AssertSQL("\"doubleOptional\" = (\"doubleOptional\" * \"double\")", doubleOptional *= double) - AssertSQL("\"doubleOptional\" = (\"doubleOptional\" * \"doubleOptional\")", doubleOptional *= doubleOptional) - AssertSQL("\"doubleOptional\" = (\"doubleOptional\" * 1.0)", doubleOptional *= 1) - } - - func test_dividedByEquals_withNumberExpression_buildsSetter() { - AssertSQL("\"int\" = (\"int\" / \"int\")", int /= int) - AssertSQL("\"int\" = (\"int\" / 1)", int /= 1) - AssertSQL("\"intOptional\" = (\"intOptional\" / \"int\")", intOptional /= int) - AssertSQL("\"intOptional\" = (\"intOptional\" / \"intOptional\")", intOptional /= intOptional) - AssertSQL("\"intOptional\" = (\"intOptional\" / 1)", intOptional /= 1) - - AssertSQL("\"double\" = (\"double\" / \"double\")", double /= double) - AssertSQL("\"double\" = (\"double\" / 1.0)", double /= 1) - AssertSQL("\"doubleOptional\" = (\"doubleOptional\" / \"double\")", doubleOptional /= double) - AssertSQL("\"doubleOptional\" = (\"doubleOptional\" / \"doubleOptional\")", doubleOptional /= doubleOptional) - AssertSQL("\"doubleOptional\" = (\"doubleOptional\" / 1.0)", doubleOptional /= 1) - } - - func test_moduloEquals_withIntegerExpression_buildsSetter() { - AssertSQL("\"int\" = (\"int\" % \"int\")", int %= int) - AssertSQL("\"int\" = (\"int\" % 1)", int %= 1) - AssertSQL("\"intOptional\" = (\"intOptional\" % \"int\")", intOptional %= int) - AssertSQL("\"intOptional\" = (\"intOptional\" % \"intOptional\")", intOptional %= intOptional) - AssertSQL("\"intOptional\" = (\"intOptional\" % 1)", intOptional %= 1) - } - - func test_leftShiftEquals_withIntegerExpression_buildsSetter() { - AssertSQL("\"int\" = (\"int\" << \"int\")", int <<= int) - AssertSQL("\"int\" = (\"int\" << 1)", int <<= 1) - AssertSQL("\"intOptional\" = (\"intOptional\" << \"int\")", intOptional <<= int) - AssertSQL("\"intOptional\" = (\"intOptional\" << \"intOptional\")", intOptional <<= intOptional) - AssertSQL("\"intOptional\" = (\"intOptional\" << 1)", intOptional <<= 1) - } - - func test_rightShiftEquals_withIntegerExpression_buildsSetter() { - AssertSQL("\"int\" = (\"int\" >> \"int\")", int >>= int) - AssertSQL("\"int\" = (\"int\" >> 1)", int >>= 1) - AssertSQL("\"intOptional\" = (\"intOptional\" >> \"int\")", intOptional >>= int) - AssertSQL("\"intOptional\" = (\"intOptional\" >> \"intOptional\")", intOptional >>= intOptional) - AssertSQL("\"intOptional\" = (\"intOptional\" >> 1)", intOptional >>= 1) - } - - func test_bitwiseAndEquals_withIntegerExpression_buildsSetter() { - AssertSQL("\"int\" = (\"int\" & \"int\")", int &= int) - AssertSQL("\"int\" = (\"int\" & 1)", int &= 1) - AssertSQL("\"intOptional\" = (\"intOptional\" & \"int\")", intOptional &= int) - AssertSQL("\"intOptional\" = (\"intOptional\" & \"intOptional\")", intOptional &= intOptional) - AssertSQL("\"intOptional\" = (\"intOptional\" & 1)", intOptional &= 1) - } - - func test_bitwiseOrEquals_withIntegerExpression_buildsSetter() { - AssertSQL("\"int\" = (\"int\" | \"int\")", int |= int) - AssertSQL("\"int\" = (\"int\" | 1)", int |= 1) - AssertSQL("\"intOptional\" = (\"intOptional\" | \"int\")", intOptional |= int) - AssertSQL("\"intOptional\" = (\"intOptional\" | \"intOptional\")", intOptional |= intOptional) - AssertSQL("\"intOptional\" = (\"intOptional\" | 1)", intOptional |= 1) - } - - func test_bitwiseExclusiveOrEquals_withIntegerExpression_buildsSetter() { - AssertSQL("\"int\" = (~((\"int\" & \"int\")) & (\"int\" | \"int\"))", int ^= int) - AssertSQL("\"int\" = (~((\"int\" & 1)) & (\"int\" | 1))", int ^= 1) - AssertSQL("\"intOptional\" = (~((\"intOptional\" & \"int\")) & (\"intOptional\" | \"int\"))", intOptional ^= int) - AssertSQL("\"intOptional\" = (~((\"intOptional\" & \"intOptional\")) & (\"intOptional\" | \"intOptional\"))", intOptional ^= intOptional) - AssertSQL("\"intOptional\" = (~((\"intOptional\" & 1)) & (\"intOptional\" | 1))", intOptional ^= 1) - } - - func test_postfixPlus_withIntegerValue_buildsSetter() { - AssertSQL("\"int\" = (\"int\" + 1)", int++) - AssertSQL("\"intOptional\" = (\"intOptional\" + 1)", intOptional++) - } - - func test_postfixMinus_withIntegerValue_buildsSetter() { - AssertSQL("\"int\" = (\"int\" - 1)", int--) - AssertSQL("\"intOptional\" = (\"intOptional\" - 1)", intOptional--) - } - -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/StatementTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/StatementTests.swift deleted file mode 100644 index 326259b223..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/StatementTests.swift +++ /dev/null @@ -1,26 +0,0 @@ -import XCTest -import SQLite - -class StatementTests : SQLiteTestCase { - override func setUp() { - super.setUp() - CreateUsersTable() - } - - func test_cursor_to_blob() { - try! InsertUsers("alice") - let statement = try! db.prepare("SELECT email FROM users") - XCTAssert(try! statement.step()) - let blob = statement.row[0] as Blob - XCTAssertEqual("alice@example.com", String(bytes: blob.bytes, encoding: .utf8)!) - } - - func test_zero_sized_blob_returns_null() { - let blobs = Table("blobs") - let blobColumn = Expression("blob_column") - try! db.run(blobs.create { $0.column(blobColumn) }) - try! db.run(blobs.insert(blobColumn <- Blob(bytes: []))) - let blobValue = try! db.scalar(blobs.select(blobColumn).limit(1, offset: 0)) - XCTAssertEqual([], blobValue.bytes) - } -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/TestHelpers.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/TestHelpers.swift deleted file mode 100644 index 8c33bf6a07..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/TestHelpers.swift +++ /dev/null @@ -1,115 +0,0 @@ -import XCTest -import SQLite - -class SQLiteTestCase : XCTestCase { - - var trace = [String: Int]() - - let db = try! Connection() - - let users = Table("users") - - override func setUp() { - super.setUp() - - db.trace { SQL in - print(SQL) - self.trace[SQL] = (self.trace[SQL] ?? 0) + 1 - } - } - - func CreateUsersTable() { - try! db.execute( - "CREATE TABLE \"users\" (" + - "id INTEGER PRIMARY KEY, " + - "email TEXT NOT NULL UNIQUE, " + - "age INTEGER, " + - "salary REAL, " + - "admin BOOLEAN NOT NULL DEFAULT 0 CHECK (admin IN (0, 1)), " + - "manager_id INTEGER, " + - "FOREIGN KEY(manager_id) REFERENCES users(id)" + - ")" - ) - } - - func InsertUsers(_ names: String...) throws { - try InsertUsers(names) - } - - func InsertUsers(_ names: [String]) throws { - for name in names { try InsertUser(name) } - } - - @discardableResult func InsertUser(_ name: String, age: Int? = nil, admin: Bool = false) throws -> Statement { - return try db.run( - "INSERT INTO \"users\" (email, age, admin) values (?, ?, ?)", - "\(name)@example.com", age?.datatypeValue, admin.datatypeValue - ) - } - - func AssertSQL(_ SQL: String, _ executions: Int = 1, _ message: String? = nil, file: StaticString = #file, line: UInt = #line) { - XCTAssertEqual( - executions, trace[SQL] ?? 0, - message ?? SQL, - file: file, line: line - ) - } - - func AssertSQL(_ SQL: String, _ statement: Statement, _ message: String? = nil, file: StaticString = #file, line: UInt = #line) { - try! statement.run() - AssertSQL(SQL, 1, message, file: file, line: line) - if let count = trace[SQL] { trace[SQL] = count - 1 } - } - -// func AssertSQL(SQL: String, _ query: Query, _ message: String? = nil, file: String = __FILE__, line: UInt = __LINE__) { -// for _ in query {} -// AssertSQL(SQL, 1, message, file: file, line: line) -// if let count = trace[SQL] { trace[SQL] = count - 1 } -// } - - func async(expect description: String = "async", timeout: Double = 5, block: (@escaping () -> Void) -> Void) { - let expectation = self.expectation(description: description) - block(expectation.fulfill) - waitForExpectations(timeout: timeout, handler: nil) - } - -} - -let bool = Expression("bool") -let boolOptional = Expression("boolOptional") - -let data = Expression("blob") -let dataOptional = Expression("blobOptional") - -let date = Expression("date") -let dateOptional = Expression("dateOptional") - -let double = Expression("double") -let doubleOptional = Expression("doubleOptional") - -let int = Expression("int") -let intOptional = Expression("intOptional") - -let int64 = Expression("int64") -let int64Optional = Expression("int64Optional") - -let string = Expression("string") -let stringOptional = Expression("stringOptional") - -func AssertSQL(_ expression1: @autoclosure () -> String, _ expression2: @autoclosure () -> Expressible, file: StaticString = #file, line: UInt = #line) { - XCTAssertEqual(expression1(), expression2().asSQL(), file: file, line: line) -} - -func AssertThrows(_ expression: @autoclosure () throws -> T, file: StaticString = #file, line: UInt = #line) { - do { - _ = try expression() - XCTFail("expression expected to throw", file: file, line: line) - } catch { - XCTAssert(true, file: file, line: line) - } -} - -let table = Table("table") -let qualifiedTable = Table("table", database: "main") -let virtualTable = VirtualTable("virtual_table") -let _view = View("view") // avoid Mac XCTestCase collision diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ValueTests.swift b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ValueTests.swift deleted file mode 100644 index bda2b4b380..0000000000 --- a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/ValueTests.swift +++ /dev/null @@ -1,6 +0,0 @@ -import XCTest -import SQLite - -class ValueTests : XCTestCase { - -} diff --git a/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/fixtures/encrypted.sqlite b/Carthage/Checkouts/SQLite.swift/Tests/SQLiteTests/fixtures/encrypted.sqlite deleted file mode 100644 index 4b3c4d0ec06c7224bbe23ca0e8bf3c5538a66ae9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2048 zcmV+b2>3)08a>;W-J5(;;@D*~Bq9FW90iNe-OU^w&-Fcb$F#j?3aO_f4=8pqB zwUCPy(GDu&{$YUF5!X#`@>&eL5Em+_AEBZn8MZu@THAj{8Bv!*evFKqdG{YKs^8#T zCpmB+qU86jKR*e(Y>tA*FEg$$J|-8+pg&N&8o;RU8`DsWc#tGE$f5ywo9kBc@QhiHX%2s8Quttn2V zuGP*8u0`77#)W$on++;OqGNNqzogAI?GX)H;H_#6^&_K^!wl`xO)Ih9&ymiuN4PcU zt&VfsB*ds2Vnzrm!$C#3&;=p#{3 zrr8mr`4MBBojX@#pxxmE%B{n8MdtZy-h_#mQ2k%uyFPR1{JfQ)0kAC{P-Ebs2tDq( zjPnghm6-cX?zC=zlxrpaU;H@eW4x~N=Oiwu29xA|y+f4@TDvQOM&;U7tN(l#eDucI zDa#1T?{pn)V=;L{nNvz7?GND8N`9Srs{URN;Jj{j{#nl}qrVi}5+wb#ncUl&RiVOQQ95zzU@4a#jWNnrZo5HlLAWh0 z_sW}l4KZD#Uyzy4xJ2G2WIpg5N*q$x`drk|^-<;W5$_PMhXz3{o+>X_OsN!Ei;d7d z$Wm=XO};b66?p);>yJa|$VMDf^2gn-!SqbLPm9G}XB?%<@Dm2SF^CnJubCMU!+62& z<6JqBo`kMu?=AVrJ9hSBuroR3ZAO^n82#F)IREa{RNaq8xtWqCL5rRO4rn1++A;T- zH|wXI{~2a3e_c{8?;lGUo#GaDY(ZT$7PzhbC~erD8UeZ>kbz;z#d#6wacoA|n|_cX zSRnz&3qql~%jFQ`->|)Z2u}zajj{Peubri}rg+)kAO==0#2J zt>7uOLj4yB^C;y}%`U+c{PM%I_Rr>nUr=Mbtw2ky-gayM)7tgQ(J$KJ%yNbw>C_P2 z@PxB}H>HPB-kS)kB)x|u_}grUH|bSTzi70Ifz^+Wo&Ok$phkHBS_M|*YGz>kH<^+% zx-ZFmvoy+=5@Qt898FL49?%td>4!+=>!ueg^$68NXD8gaNTCesCKyzD?22s(Dw0wO z131^t6@R1LR4IXd!cK|y9s{Y9(L7!VIO*oMa0i6M{Q_5-s~!tV#J$){OZ|vu#$c0k z<8lcG?@1BFroP|He3B|;P%W1^!JtSl+cdI|a@obN`_0ywi1IzfP)a6MtPdA7K4A#8 zB6cuIWSff|DQzNO*tyB#JhA8?I8{HJY+Fv?9>my=c@g?Gi4R#?5Ja27&diEbN}GeX zWgDS*ti#>3*OLoeHgn_|n_SW`rsh4luOh#lZ6eXmKMiU7qOhP1sZ_`}B>Fu4HAwl$ z&&+LFFHOBz2!Vw-sJei$;m@otCD5wYf!Gt3Rji(lK&1$#LTfAFZjBcR(ifwCZA+_q z%QA?z-s3I&?J5;rtYpsIp0UegCO^+prph0M*w9{@xHuo|ENOFE^a~&!y&!?@Qzy1(qN2noyyx? zqXw(T+H|8K@GXJ)|!Q%`oU#ql2yWN7hR(=l(1NRDA%uC7vS!T=Z0H zUv93_!4dz2nUOF^xy~i%Ui+`x`oHAOE$LrK5F4>0t%l~Ux=K3QJTYl7jYG&vDWUXh e@S*KLmc9i7F)WxTL6K?@Y7};KXset%z6Wp5kNblF diff --git a/Carthage/Checkouts/SQLite.swift/run-tests.sh b/Carthage/Checkouts/SQLite.swift/run-tests.sh deleted file mode 100755 index ddd7d67834..0000000000 --- a/Carthage/Checkouts/SQLite.swift/run-tests.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -set -ev -if [ -n "$BUILD_SCHEME" ]; then - if [ -n "$IOS_SIMULATOR" ]; then - make test BUILD_SCHEME="$BUILD_SCHEME" IOS_SIMULATOR="$IOS_SIMULATOR" - else - make test BUILD_SCHEME="$BUILD_SCHEME" - fi -elif [ -n "$VALIDATOR_SUBSPEC" ]; then - cd Tests/CocoaPods && make test -elif [ -n "$CARTHAGE_PLATFORM" ]; then - cd Tests/Carthage && make test CARTHAGE_PLATFORM="$CARTHAGE_PLATFORM" -elif [ -n "${PACKAGE_MANAGER_COMMAND}" ]; then - swift ${PACKAGE_MANAGER_COMMAND} -fi From 41b02d0ca75428c9c2dd677e7240ab038dc244b4 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 17:48:44 -0700 Subject: [PATCH 52/76] Prepare to try submodules again, continued --- .gitmodules | 3 +++ Cartfile.resolved | 1 + Carthage/Checkouts/SQLite.swift | 1 + 3 files changed, 5 insertions(+) create mode 100644 .gitmodules create mode 100644 Cartfile.resolved create mode 160000 Carthage/Checkouts/SQLite.swift diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..c5a63baefc --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "Carthage/Checkouts/SQLite.swift"] + path = Carthage/Checkouts/SQLite.swift + url = https://github.com/stephencelis/SQLite.swift.git diff --git a/Cartfile.resolved b/Cartfile.resolved new file mode 100644 index 0000000000..148be8bbc2 --- /dev/null +++ b/Cartfile.resolved @@ -0,0 +1 @@ +github "stephencelis/SQLite.swift" "0.11.2" diff --git a/Carthage/Checkouts/SQLite.swift b/Carthage/Checkouts/SQLite.swift new file mode 160000 index 0000000000..6075168860 --- /dev/null +++ b/Carthage/Checkouts/SQLite.swift @@ -0,0 +1 @@ +Subproject commit 6075168860d1812ed3772585c631583955da40f3 From 9931574f135db7b9aaa19da257ff2f7334327e39 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 18:01:44 -0700 Subject: [PATCH 53/76] Some Apollo xcodeproj cleanup --- Apollo.xcodeproj/project.pbxproj | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/Apollo.xcodeproj/project.pbxproj b/Apollo.xcodeproj/project.pbxproj index d4654658ae..12f813bc80 100644 --- a/Apollo.xcodeproj/project.pbxproj +++ b/Apollo.xcodeproj/project.pbxproj @@ -149,10 +149,6 @@ /* Begin PBXFileReference section */ 54DDB0911EA045870009DD99 /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; 54DDB0931EA13C1B0009DD99 /* TestCacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestCacheProvider.swift; sourceTree = ""; }; - 54DDB1111EA5402C0009DD99 /* ApolloSQLite.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ApolloSQLite.h; sourceTree = ""; }; - 54DDB1121EA5402C0009DD99 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 54DDB11F1EA541150009DD99 /* ApolloSQLiteMac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ApolloSQLiteMac.h; sourceTree = ""; }; - 54DDB1201EA541150009DD99 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9F0F98D31E7AC17D00BF0371 /* StoreTransactionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreTransactionTests.swift; sourceTree = ""; }; 9F0F98E01E7BCC3400BF0371 /* Dictionary+KeyPath.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Dictionary+KeyPath.swift"; sourceTree = ""; }; 9F27D4631D40379500715680 /* JSONStandardTypeConversions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSONStandardTypeConversions.swift; sourceTree = ""; }; @@ -284,24 +280,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 54DDB1101EA5402C0009DD99 /* ApolloSQLite */ = { - isa = PBXGroup; - children = ( - 54DDB1111EA5402C0009DD99 /* ApolloSQLite.h */, - 54DDB1121EA5402C0009DD99 /* Info.plist */, - ); - path = ApolloSQLite; - sourceTree = ""; - }; - 54DDB11E1EA541150009DD99 /* ApolloSQLiteMac */ = { - isa = PBXGroup; - children = ( - 54DDB11F1EA541150009DD99 /* ApolloSQLiteMac.h */, - 54DDB1201EA541150009DD99 /* Info.plist */, - ); - path = ApolloSQLiteMac; - sourceTree = ""; - }; 9F17BC471DAF055A00138496 /* Supporting Files */ = { isa = PBXGroup; children = ( @@ -351,8 +329,6 @@ children = ( 9FC750461D2A532C00458D91 /* Apollo */, 9FCE2CF41E6C20E000E34457 /* Tests */, - 54DDB1101EA5402C0009DD99 /* ApolloSQLite */, - 54DDB11E1EA541150009DD99 /* ApolloSQLiteMac */, 9FC750451D2A532C00458D91 /* Products */, ); sourceTree = ""; From d536c171c5fdbdfde82d34048e294939bff2aed7 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 18:04:07 -0700 Subject: [PATCH 54/76] =?UTF-8?q?Naming=20tweak:=20=E2=80=9CSqlite?= =?UTF-8?q?=E2=80=9D=20=E2=80=94>=20=E2=80=9CSQLite=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ApolloSQLite.xcodeproj/project.pbxproj | 12 ++++++------ ...edCache.swift => SQLiteNormalizedCache.swift} | 16 ++++++++-------- ApolloSQLite/SharedTests/TestCacheProvider.swift | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) rename ApolloSQLite/{SqliteNormalizedCache.swift => SQLiteNormalizedCache.swift} (90%) diff --git a/ApolloSQLite.xcodeproj/project.pbxproj b/ApolloSQLite.xcodeproj/project.pbxproj index 24af992b62..db94130d8a 100644 --- a/ApolloSQLite.xcodeproj/project.pbxproj +++ b/ApolloSQLite.xcodeproj/project.pbxproj @@ -35,8 +35,8 @@ 54DDB1461EA544700009DD99 /* ApolloSQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = 54DDB1411EA544700009DD99 /* ApolloSQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; 54DDB14B1EA545500009DD99 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0D41EA156170009DD99 /* Apollo.framework */; }; 54DDB14C1EA545560009DD99 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0EE1EA1573C0009DD99 /* SQLite.framework */; }; - 54DDB1AF1EA54F7E0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */; }; - 54DDB1B01EA54F7F0009DD99 /* SqliteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */; }; + 54DDB1AF1EA54F7E0009DD99 /* SQLiteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SQLiteNormalizedCache.swift */; }; + 54DDB1B01EA54F7F0009DD99 /* SQLiteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SQLiteNormalizedCache.swift */; }; 54DDB1BA1EA550550009DD99 /* ApolloSQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB1381EA543F80009DD99 /* ApolloSQLite.framework */; }; 54DDB1C81EA551E60009DD99 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */; }; 54DDB1C91EA551E60009DD99 /* CacheKeyForFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */; }; @@ -199,7 +199,7 @@ 54DDB1941EA54A820009DD99 /* StoreTransactionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = StoreTransactionTests.swift; path = ../../Tests/ApolloTests/StoreTransactionTests.swift; sourceTree = ""; }; 54DDB1951EA54A820009DD99 /* Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Utilities.swift; path = ../../Tests/ApolloTests/Utilities.swift; sourceTree = ""; }; 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = WatchQueryTests.swift; path = ../../Tests/ApolloTests/WatchQueryTests.swift; sourceTree = ""; }; - 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SqliteNormalizedCache.swift; sourceTree = ""; }; + 54DDB1AD1EA54F770009DD99 /* SQLiteNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLiteNormalizedCache.swift; sourceTree = ""; }; 54DDB1B51EA550540009DD99 /* ApolloSQLiteMacTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloSQLiteMacTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 54DDB1C21EA5508A0009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachePersistenceTests.swift; sourceTree = ""; }; @@ -269,7 +269,7 @@ 54DDB0C01EA1523E0009DD99 /* ApolloSQLite */ = { isa = PBXGroup; children = ( - 54DDB1AD1EA54F770009DD99 /* SqliteNormalizedCache.swift */, + 54DDB1AD1EA54F770009DD99 /* SQLiteNormalizedCache.swift */, 54DDB1401EA544700009DD99 /* iOS */, 54DDB1831EA549ED0009DD99 /* iOSTests */, 54DDB1431EA544700009DD99 /* Mac */, @@ -665,7 +665,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 54DDB1AF1EA54F7E0009DD99 /* SqliteNormalizedCache.swift in Sources */, + 54DDB1AF1EA54F7E0009DD99 /* SQLiteNormalizedCache.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -673,7 +673,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 54DDB1B01EA54F7F0009DD99 /* SqliteNormalizedCache.swift in Sources */, + 54DDB1B01EA54F7F0009DD99 /* SQLiteNormalizedCache.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ApolloSQLite/SqliteNormalizedCache.swift b/ApolloSQLite/SQLiteNormalizedCache.swift similarity index 90% rename from ApolloSQLite/SqliteNormalizedCache.swift rename to ApolloSQLite/SQLiteNormalizedCache.swift index 18b7f0dbaa..5c652da230 100644 --- a/ApolloSQLite/SqliteNormalizedCache.swift +++ b/ApolloSQLite/SQLiteNormalizedCache.swift @@ -1,13 +1,13 @@ import Apollo import SQLite -public enum SqliteNormalizedCacheError: Error { +public enum SQLiteNormalizedCacheError: Error { case invalidRecordEncoding(record: String) case invalidRecordShape(object: Any) case invalidRecordValue(value: Any) } -public final class SqliteNormalizedCache: NormalizedCache { +public final class SQLiteNormalizedCache: NormalizedCache { public init(fileURL: URL) throws { db = try Connection(.uri(fileURL.absoluteString), readonly: false) @@ -66,7 +66,7 @@ public final class SqliteNormalizedCache: NormalizedCache { let changedRecordKeys = changedFieldKeys.map { recordCacheKey(forFieldCacheKey: $0) } for recordKey in Set(changedRecordKeys) { if let recordFields = recordSet[recordKey]?.fields { - let recordData = try SqliteSerialization.serialize(fields: recordFields) + let recordData = try SQLiteSerialization.serialize(fields: recordFields) guard let recordString = String(data: recordData, encoding: .utf8) else { assertionFailure("Serialization should yield UTF-8 data") continue @@ -86,17 +86,17 @@ public final class SqliteNormalizedCache: NormalizedCache { let record = row[self.record] guard let recordData = record.data(using: .utf8) else { - throw SqliteNormalizedCacheError.invalidRecordEncoding(record: record) + throw SQLiteNormalizedCacheError.invalidRecordEncoding(record: record) } - let recordJSON = try SqliteSerialization.deserialize(data: recordData) + let recordJSON = try SQLiteSerialization.deserialize(data: recordData) return Record(key: row[key], recordJSON) } } private let serializedReferenceKey = "reference" -final class SqliteSerialization { +final class SQLiteSerialization { static func serialize(fields: JSONObject) throws -> Data { var objectToSerialize = JSONObject() for (key, value) in fields { @@ -108,7 +108,7 @@ final class SqliteSerialization { static func deserialize(data: Data) throws -> JSONObject { let object = try JSONSerializationFormat.deserialize(data: data) guard let jsonObject = object as? JSONObject else { - throw SqliteNormalizedCacheError.invalidRecordShape(object: object) + throw SQLiteNormalizedCacheError.invalidRecordShape(object: object) } var deserializedObject = JSONObject() for (key, value) in jsonObject { @@ -121,7 +121,7 @@ final class SqliteSerialization { switch valueJSON { case let dictionary as JSONObject: guard let reference = dictionary[serializedReferenceKey] as? String else { - throw SqliteNormalizedCacheError.invalidRecordValue(value: valueJSON) + throw SQLiteNormalizedCacheError.invalidRecordValue(value: valueJSON) } return Reference(key: reference) case let array as NSArray: diff --git a/ApolloSQLite/SharedTests/TestCacheProvider.swift b/ApolloSQLite/SharedTests/TestCacheProvider.swift index e955a5f58e..1d86596e34 100644 --- a/ApolloSQLite/SharedTests/TestCacheProvider.swift +++ b/ApolloSQLite/SharedTests/TestCacheProvider.swift @@ -9,7 +9,7 @@ enum TestCacheProvider { if clearCache { try? FileManager.default.removeItem(at: sqliteFileURL) } - let cache = try! SqliteNormalizedCache(fileURL: sqliteFileURL) + let cache = try! SQLiteNormalizedCache(fileURL: sqliteFileURL) if let initialRecords = initialRecords { _ = cache.merge(records: initialRecords) // This is synchronous } From f14048c91c9b3ca70a04c0613b9bafe9c7c45678 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 18:19:54 -0700 Subject: [PATCH 55/76] Explanatory coments for NormalizedCache methods --- Sources/NormalizedCache.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Sources/NormalizedCache.swift b/Sources/NormalizedCache.swift index 28ddc641e9..fbc7d5ff13 100644 --- a/Sources/NormalizedCache.swift +++ b/Sources/NormalizedCache.swift @@ -1,5 +1,13 @@ public protocol NormalizedCache { - // When no records are found for the given keys, this should fulfill with [nil] + + /// Loads records corresponding to the given keys. + /// - returns: A promise that fulfills with an array, with each index containing either the + /// record corresponding to the key at that index or nil if not found. func loadRecords(forKeys keys: [CacheKey]) -> Promise<[Record?]> + + /// Merges a set of records into the cache. + /// - returns: A promise that fulfills with a set of keys corresponding to *fields* that have + /// changed (i.e. QUERY_ROOT.Foo.myField). These are the same type of keys as are + /// returned by RecordSet.merge(records:). func merge(records: RecordSet) -> Promise> } From 4a07f40de5f4ba91646ef9d26a53946d0fe2783f Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Mon, 17 Apr 2017 18:30:15 -0700 Subject: [PATCH 56/76] =?UTF-8?q?Make=20SQLiteNormalizedCache=E2=80=99s=20?= =?UTF-8?q?loadRecords(forKeys:)=20adhere=20to=20the=20contract=20required?= =?UTF-8?q?=20by=20NormalizedCache?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ApolloSQLite/SQLiteNormalizedCache.swift | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ApolloSQLite/SQLiteNormalizedCache.swift b/ApolloSQLite/SQLiteNormalizedCache.swift index 5c652da230..68d7d59205 100644 --- a/ApolloSQLite/SQLiteNormalizedCache.swift +++ b/ApolloSQLite/SQLiteNormalizedCache.swift @@ -29,7 +29,13 @@ public final class SQLiteNormalizedCache: NormalizedCache { return Promise<[Record?]> { fulfill, reject in do { let records = try selectRecords(forKeys: keys) - fulfill(records.count == 0 ? [nil] : records) + let recordsOrNil: [Record?] = keys.map { key in + if let recordIndex = records.index(where: { $0.key == key }) { + return records[recordIndex] + } + return nil + } + fulfill(recordsOrNil) } catch { reject(error) From aa12af997dab6437b43eedd698029ab0415e9869 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Tue, 18 Apr 2017 10:17:02 -0700 Subject: [PATCH 57/76] Revert bumping version to 0.5.7 --- Version.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Version.xcconfig b/Version.xcconfig index 75fc6d90d5..0b8d252d19 100644 --- a/Version.xcconfig +++ b/Version.xcconfig @@ -1 +1 @@ -CURRENT_PROJECT_VERSION = 0.5.7 +CURRENT_PROJECT_VERSION = 0.5.6 From 69d124d98c79f333eeded72015b513c21deb8690 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Tue, 18 Apr 2017 11:52:44 -0700 Subject: [PATCH 58/76] Add comment to Apollo.podspec explaining reasoning behind including SQLite as a subspec --- Apollo.podspec | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Apollo.podspec b/Apollo.podspec index ec76cf7628..a531ca5e82 100644 --- a/Apollo.podspec +++ b/Apollo.podspec @@ -19,6 +19,8 @@ Pod::Spec.new do |s| ss.resource = 'scripts/check-and-run-apollo-codegen.sh' end + # Apollo provides exactly one persistent cache out-of-the-box, as a reasonable default choice for + # those who require cache persistence. Third-party caches may use different storage mechanisms. s.subspec 'SQLite' do |ss| ss.ios.deployment_target = '8.0' ss.osx.deployment_target = '10.10' From ca6209dd3e5a7c5d11705c7d1bc44085e23835ff Mon Sep 17 00:00:00 2001 From: Martijn Walraven Date: Wed, 19 Apr 2017 16:46:37 +0200 Subject: [PATCH 59/76] Remove separate test schemes and share framework schemes in ApolloSQLite --- .../xcschemes/xcschememanagement.plist | 5 + .../xcschemes/ApolloSQLiteIOS.xcscheme | 99 +++++++++++++++++++ .../xcschemes/ApolloSQLiteMac.xcscheme | 80 +++++++++++++++ 3 files changed, 184 insertions(+) create mode 100644 ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLiteIOS.xcscheme create mode 100644 ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLiteMac.xcscheme diff --git a/Apollo.xcodeproj/xcuserdata/martijnwalraven.xcuserdatad/xcschemes/xcschememanagement.plist b/Apollo.xcodeproj/xcuserdata/martijnwalraven.xcuserdatad/xcschemes/xcschememanagement.plist index 34bc87734e..15049aa886 100644 --- a/Apollo.xcodeproj/xcuserdata/martijnwalraven.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Apollo.xcodeproj/xcuserdata/martijnwalraven.xcuserdatad/xcschemes/xcschememanagement.plist @@ -24,6 +24,11 @@ orderHint 5 + TestHost iOS.xcscheme_^#shared#^_ + + orderHint + 1 + SuppressBuildableAutocreation diff --git a/ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLiteIOS.xcscheme b/ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLiteIOS.xcscheme new file mode 100644 index 0000000000..f5c3729e2a --- /dev/null +++ b/ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLiteIOS.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLiteMac.xcscheme b/ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLiteMac.xcscheme new file mode 100644 index 0000000000..67bb0a9065 --- /dev/null +++ b/ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLiteMac.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From ec80581fcc6ef67302fe5c81718719c7a0ad13b1 Mon Sep 17 00:00:00 2001 From: Martijn Walraven Date: Wed, 19 Apr 2017 17:21:31 +0200 Subject: [PATCH 60/76] Convert ApolloSQLite to universal framework --- ApolloSQLite.xcodeproj/project.pbxproj | 385 +++--------------- ...LiteIOS.xcscheme => ApolloSQLite.xcscheme} | 12 +- .../xcschemes/ApolloSQLiteMac.xcscheme | 80 ---- ApolloSQLite/{iOS => }/Info.plist | 0 ApolloSQLite/Mac/ApolloSQLite.h | 19 - ApolloSQLite/Mac/Info.plist | 24 -- .../CachePersistenceTests.swift | 0 ApolloSQLite/{MacTests => Tests}/Info.plist | 0 .../TestCacheProvider.swift | 0 ApolloSQLite/iOS/ApolloSQLite.h | 11 - ApolloSQLite/iOSTests/Info.plist | 22 - 11 files changed, 65 insertions(+), 488 deletions(-) rename ApolloSQLite.xcodeproj/xcshareddata/xcschemes/{ApolloSQLiteIOS.xcscheme => ApolloSQLite.xcscheme} (91%) delete mode 100644 ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLiteMac.xcscheme rename ApolloSQLite/{iOS => }/Info.plist (100%) delete mode 100644 ApolloSQLite/Mac/ApolloSQLite.h delete mode 100644 ApolloSQLite/Mac/Info.plist rename ApolloSQLite/{SharedTests => Tests}/CachePersistenceTests.swift (100%) rename ApolloSQLite/{MacTests => Tests}/Info.plist (100%) rename ApolloSQLite/{SharedTests => Tests}/TestCacheProvider.swift (100%) delete mode 100644 ApolloSQLite/iOS/ApolloSQLite.h delete mode 100644 ApolloSQLite/iOSTests/Info.plist diff --git a/ApolloSQLite.xcodeproj/project.pbxproj b/ApolloSQLite.xcodeproj/project.pbxproj index db94130d8a..c605d2a96a 100644 --- a/ApolloSQLite.xcodeproj/project.pbxproj +++ b/ApolloSQLite.xcodeproj/project.pbxproj @@ -7,7 +7,6 @@ objects = { /* Begin PBXBuildFile section */ - 5438068E1EA5699700F55B72 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0DA1EA156170009DD99 /* StarWarsAPI.framework */; }; 5438069A1EA56C2200F55B72 /* ApolloSQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0BE1EA1523E0009DD99 /* ApolloSQLite.framework */; }; 543806A21EA56CE700F55B72 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0DA1EA156170009DD99 /* StarWarsAPI.framework */; }; 543806A31EA56D1500F55B72 /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */; }; @@ -27,43 +26,13 @@ 543806B11EA56D1500F55B72 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1941EA54A820009DD99 /* StoreTransactionTests.swift */; }; 543806B21EA56D1500F55B72 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1951EA54A820009DD99 /* Utilities.swift */; }; 543806B31EA56D1500F55B72 /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */; }; - 543806B61EA56D5C00F55B72 /* TestCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 543806B41EA56D5600F55B72 /* TestCacheProvider.swift */; }; 543806B71EA56D5C00F55B72 /* TestCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 543806B41EA56D5600F55B72 /* TestCacheProvider.swift */; }; - 543806B81EA56D8400F55B72 /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */; }; 54DDB0F71EA157870009DD99 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0D41EA156170009DD99 /* Apollo.framework */; }; 54DDB1091EA53FD30009DD99 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0EA1EA1573C0009DD99 /* SQLite.framework */; }; - 54DDB1461EA544700009DD99 /* ApolloSQLite.h in Headers */ = {isa = PBXBuildFile; fileRef = 54DDB1411EA544700009DD99 /* ApolloSQLite.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 54DDB14B1EA545500009DD99 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0D41EA156170009DD99 /* Apollo.framework */; }; - 54DDB14C1EA545560009DD99 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0EE1EA1573C0009DD99 /* SQLite.framework */; }; 54DDB1AF1EA54F7E0009DD99 /* SQLiteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SQLiteNormalizedCache.swift */; }; - 54DDB1B01EA54F7F0009DD99 /* SQLiteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SQLiteNormalizedCache.swift */; }; - 54DDB1BA1EA550550009DD99 /* ApolloSQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB1381EA543F80009DD99 /* ApolloSQLite.framework */; }; - 54DDB1C81EA551E60009DD99 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */; }; - 54DDB1C91EA551E60009DD99 /* CacheKeyForFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */; }; - 54DDB1CA1EA551E60009DD99 /* DataLoaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1891EA54A820009DD99 /* DataLoaderTests.swift */; }; - 54DDB1CB1EA551E60009DD99 /* FetchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18A1EA54A820009DD99 /* FetchQueryTests.swift */; }; - 54DDB1CC1EA551E60009DD99 /* GraphQLExecutorFieldValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18B1EA54A820009DD99 /* GraphQLExecutorFieldValueTests.swift */; }; - 54DDB1CD1EA551E60009DD99 /* GraphQLInputValueEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18C1EA54A820009DD99 /* GraphQLInputValueEncodingTests.swift */; }; - 54DDB1CE1EA551E60009DD99 /* LoadQueryFromStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18D1EA54A820009DD99 /* LoadQueryFromStoreTests.swift */; }; - 54DDB1CF1EA551E60009DD99 /* MockNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18E1EA54A820009DD99 /* MockNetworkTransport.swift */; }; - 54DDB1D01EA551E60009DD99 /* NormalizeQueryResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18F1EA54A820009DD99 /* NormalizeQueryResults.swift */; }; - 54DDB1D11EA551E60009DD99 /* ParseQueryResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1901EA54A820009DD99 /* ParseQueryResponseTests.swift */; }; - 54DDB1D21EA551E60009DD99 /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1911EA54A820009DD99 /* PromiseTests.swift */; }; - 54DDB1D31EA551E60009DD99 /* StarWarsServerCachingRoundtripTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1921EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift */; }; - 54DDB1D41EA551E60009DD99 /* StarWarsServerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1931EA54A820009DD99 /* StarWarsServerTests.swift */; }; - 54DDB1D51EA551E60009DD99 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1941EA54A820009DD99 /* StoreTransactionTests.swift */; }; - 54DDB1D61EA551E60009DD99 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1951EA54A820009DD99 /* Utilities.swift */; }; - 54DDB1D71EA551E60009DD99 /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 5438068F1EA569C500F55B72 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */; - proxyType = 1; - remoteGlobalIDString = 9FCE2CF91E6C213D00E34457; - remoteInfo = StarWarsAPI; - }; 5438069B1EA56C2200F55B72 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 54DDB0B51EA1523E0009DD99 /* Project object */; @@ -162,27 +131,14 @@ remoteGlobalIDString = A121AC451CA35C79005A31D1; remoteInfo = "SQLite watchOS"; }; - 54DDB1BB1EA550550009DD99 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 54DDB0B51EA1523E0009DD99 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 54DDB1371EA543F80009DD99; - remoteInfo = ApolloSQLiteMac; - }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 543806951EA56C2200F55B72 /* ApolloSQLiteIOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloSQLiteIOSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 543806951EA56C2200F55B72 /* ApolloSQLiteTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloSQLiteTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 543806B41EA56D5600F55B72 /* TestCacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestCacheProvider.swift; sourceTree = ""; }; 54DDB0BE1EA1523E0009DD99 /* ApolloSQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ApolloSQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Apollo.xcodeproj; sourceTree = ""; }; 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SQLite.xcodeproj; path = Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj; sourceTree = ""; }; - 54DDB1381EA543F80009DD99 /* ApolloSQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ApolloSQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 54DDB1411EA544700009DD99 /* ApolloSQLite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApolloSQLite.h; sourceTree = ""; }; - 54DDB1421EA544700009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 54DDB1441EA544700009DD99 /* ApolloSQLite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApolloSQLite.h; sourceTree = ""; }; - 54DDB1451EA544700009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 54DDB1841EA549ED0009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = BatchedLoadTests.swift; path = ../../Tests/ApolloTests/BatchedLoadTests.swift; sourceTree = ""; }; 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = CacheKeyForFieldTests.swift; path = ../../Tests/ApolloTests/CacheKeyForFieldTests.swift; sourceTree = ""; }; 54DDB1891EA54A820009DD99 /* DataLoaderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = DataLoaderTests.swift; path = ../../Tests/ApolloTests/DataLoaderTests.swift; sourceTree = ""; }; @@ -200,9 +156,10 @@ 54DDB1951EA54A820009DD99 /* Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Utilities.swift; path = ../../Tests/ApolloTests/Utilities.swift; sourceTree = ""; }; 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = WatchQueryTests.swift; path = ../../Tests/ApolloTests/WatchQueryTests.swift; sourceTree = ""; }; 54DDB1AD1EA54F770009DD99 /* SQLiteNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLiteNormalizedCache.swift; sourceTree = ""; }; - 54DDB1B51EA550540009DD99 /* ApolloSQLiteMacTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloSQLiteMacTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 54DDB1C21EA5508A0009DD99 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachePersistenceTests.swift; sourceTree = ""; }; + 9FA4FD6A1EA7B35200635987 /* Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Framework.xcconfig; sourceTree = SOURCE_ROOT; }; + 9FA86C5A1EA7B6D40073E1ED /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9FA86C5C1EA7B6EE0073E1ED /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -224,33 +181,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 54DDB1341EA543F80009DD99 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 54DDB14C1EA545560009DD99 /* SQLite.framework in Frameworks */, - 54DDB14B1EA545500009DD99 /* Apollo.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54DDB1B21EA550540009DD99 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5438068E1EA5699700F55B72 /* StarWarsAPI.framework in Frameworks */, - 54DDB1BA1EA550550009DD99 /* ApolloSQLite.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 54DDB0B41EA1523E0009DD99 = { isa = PBXGroup; children = ( - 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */, - 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */, 54DDB0C01EA1523E0009DD99 /* ApolloSQLite */, + 54DDB1AA1EA54AD30009DD99 /* Tests */, + 9FA86C581EA7B6780073E1ED /* Frameworks */, + 9FA86C571EA7B6320073E1ED /* Configuration */, 54DDB0BF1EA1523E0009DD99 /* Products */, ); sourceTree = ""; @@ -259,9 +199,7 @@ isa = PBXGroup; children = ( 54DDB0BE1EA1523E0009DD99 /* ApolloSQLite.framework */, - 54DDB1381EA543F80009DD99 /* ApolloSQLite.framework */, - 54DDB1B51EA550540009DD99 /* ApolloSQLiteMacTests.xctest */, - 543806951EA56C2200F55B72 /* ApolloSQLiteIOSTests.xctest */, + 543806951EA56C2200F55B72 /* ApolloSQLiteTests.xctest */, ); name = Products; sourceTree = ""; @@ -269,12 +207,8 @@ 54DDB0C01EA1523E0009DD99 /* ApolloSQLite */ = { isa = PBXGroup; children = ( + 9FA86C591EA7B68B0073E1ED /* Supporting Files */, 54DDB1AD1EA54F770009DD99 /* SQLiteNormalizedCache.swift */, - 54DDB1401EA544700009DD99 /* iOS */, - 54DDB1831EA549ED0009DD99 /* iOSTests */, - 54DDB1431EA544700009DD99 /* Mac */, - 54DDB1C01EA5508A0009DD99 /* MacTests */, - 54DDB1AA1EA54AD30009DD99 /* SharedTests */, ); path = ApolloSQLite; sourceTree = ""; @@ -305,35 +239,10 @@ name = Products; sourceTree = ""; }; - 54DDB1401EA544700009DD99 /* iOS */ = { - isa = PBXGroup; - children = ( - 54DDB1411EA544700009DD99 /* ApolloSQLite.h */, - 54DDB1421EA544700009DD99 /* Info.plist */, - ); - path = iOS; - sourceTree = ""; - }; - 54DDB1431EA544700009DD99 /* Mac */ = { - isa = PBXGroup; - children = ( - 54DDB1441EA544700009DD99 /* ApolloSQLite.h */, - 54DDB1451EA544700009DD99 /* Info.plist */, - ); - path = Mac; - sourceTree = ""; - }; - 54DDB1831EA549ED0009DD99 /* iOSTests */ = { - isa = PBXGroup; - children = ( - 54DDB1841EA549ED0009DD99 /* Info.plist */, - ); - path = iOSTests; - sourceTree = ""; - }; - 54DDB1AA1EA54AD30009DD99 /* SharedTests */ = { + 54DDB1AA1EA54AD30009DD99 /* Tests */ = { isa = PBXGroup; children = ( + 9FA86C5B1EA7B6D90073E1ED /* Supporting Files */, 543806B41EA56D5600F55B72 /* TestCacheProvider.swift */, 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */, 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */, @@ -353,29 +262,47 @@ 54DDB1951EA54A820009DD99 /* Utilities.swift */, 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */, ); - path = SharedTests; + name = Tests; + path = ApolloSQLite/Tests; sourceTree = ""; }; - 54DDB1C01EA5508A0009DD99 /* MacTests */ = { + 9FA86C571EA7B6320073E1ED /* Configuration */ = { isa = PBXGroup; children = ( - 54DDB1C21EA5508A0009DD99 /* Info.plist */, + 9FA4FD6A1EA7B35200635987 /* Framework.xcconfig */, ); - path = MacTests; + name = Configuration; + sourceTree = ""; + }; + 9FA86C581EA7B6780073E1ED /* Frameworks */ = { + isa = PBXGroup; + children = ( + 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */, + 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9FA86C591EA7B68B0073E1ED /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 9FA86C5A1EA7B6D40073E1ED /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 9FA86C5B1EA7B6D90073E1ED /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 9FA86C5C1EA7B6EE0073E1ED /* Info.plist */, + ); + name = "Supporting Files"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 54DDB0BB1EA1523E0009DD99 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 54DDB1461EA544700009DD99 /* ApolloSQLite.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54DDB1351EA543F80009DD99 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( @@ -385,9 +312,9 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 543806941EA56C2200F55B72 /* ApolloSQLiteIOSTests */ = { + 543806941EA56C2200F55B72 /* ApolloSQLiteTests */ = { isa = PBXNativeTarget; - buildConfigurationList = 5438069D1EA56C2200F55B72 /* Build configuration list for PBXNativeTarget "ApolloSQLiteIOSTests" */; + buildConfigurationList = 5438069D1EA56C2200F55B72 /* Build configuration list for PBXNativeTarget "ApolloSQLiteTests" */; buildPhases = ( 543806911EA56C2200F55B72 /* Sources */, 543806921EA56C2200F55B72 /* Frameworks */, @@ -399,14 +326,14 @@ 543806A11EA56CE300F55B72 /* PBXTargetDependency */, 5438069C1EA56C2200F55B72 /* PBXTargetDependency */, ); - name = ApolloSQLiteIOSTests; + name = ApolloSQLiteTests; productName = ApolloSQLiteIOSTests; - productReference = 543806951EA56C2200F55B72 /* ApolloSQLiteIOSTests.xctest */; + productReference = 543806951EA56C2200F55B72 /* ApolloSQLiteTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - 54DDB0BD1EA1523E0009DD99 /* ApolloSQLiteIOS */ = { + 54DDB0BD1EA1523E0009DD99 /* ApolloSQLite */ = { isa = PBXNativeTarget; - buildConfigurationList = 54DDB0C61EA1523E0009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteIOS" */; + buildConfigurationList = 54DDB0C61EA1523E0009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLite" */; buildPhases = ( 54DDB0B91EA1523E0009DD99 /* Sources */, 54DDB0BA1EA1523E0009DD99 /* Frameworks */, @@ -417,48 +344,11 @@ ); dependencies = ( ); - name = ApolloSQLiteIOS; + name = ApolloSQLite; productName = ApolloSQLite; productReference = 54DDB0BE1EA1523E0009DD99 /* ApolloSQLite.framework */; productType = "com.apple.product-type.framework"; }; - 54DDB1371EA543F80009DD99 /* ApolloSQLiteMac */ = { - isa = PBXNativeTarget; - buildConfigurationList = 54DDB13D1EA543F80009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteMac" */; - buildPhases = ( - 54DDB1331EA543F80009DD99 /* Sources */, - 54DDB1341EA543F80009DD99 /* Frameworks */, - 54DDB1351EA543F80009DD99 /* Headers */, - 54DDB1361EA543F80009DD99 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ApolloSQLiteMac; - productName = ApolloSQLiteMac; - productReference = 54DDB1381EA543F80009DD99 /* ApolloSQLite.framework */; - productType = "com.apple.product-type.framework"; - }; - 54DDB1B41EA550540009DD99 /* ApolloSQLiteMacTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 54DDB1BD1EA550550009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteMacTests" */; - buildPhases = ( - 54DDB1B11EA550540009DD99 /* Sources */, - 54DDB1B21EA550540009DD99 /* Frameworks */, - 54DDB1B31EA550540009DD99 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 543806901EA569C500F55B72 /* PBXTargetDependency */, - 54DDB1BC1EA550550009DD99 /* PBXTargetDependency */, - ); - name = ApolloSQLiteMacTests; - productName = ApolloSQLiteMacTests; - productReference = 54DDB1B51EA550540009DD99 /* ApolloSQLiteMacTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -477,14 +367,6 @@ LastSwiftMigration = 0830; ProvisioningStyle = Automatic; }; - 54DDB1371EA543F80009DD99 = { - CreatedOnToolsVersion = 8.3.1; - ProvisioningStyle = Automatic; - }; - 54DDB1B41EA550540009DD99 = { - CreatedOnToolsVersion = 8.3.1; - ProvisioningStyle = Automatic; - }; }; }; buildConfigurationList = 54DDB0B81EA1523E0009DD99 /* Build configuration list for PBXProject "ApolloSQLite" */; @@ -509,10 +391,8 @@ ); projectRoot = ""; targets = ( - 54DDB0BD1EA1523E0009DD99 /* ApolloSQLiteIOS */, - 54DDB1371EA543F80009DD99 /* ApolloSQLiteMac */, - 54DDB1B41EA550540009DD99 /* ApolloSQLiteMacTests */, - 543806941EA56C2200F55B72 /* ApolloSQLiteIOSTests */, + 54DDB0BD1EA1523E0009DD99 /* ApolloSQLite */, + 543806941EA56C2200F55B72 /* ApolloSQLiteTests */, ); }; /* End PBXProject section */ @@ -619,20 +499,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 54DDB1361EA543F80009DD99 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54DDB1B31EA550540009DD99 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -669,50 +535,12 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 54DDB1331EA543F80009DD99 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 54DDB1B01EA54F7F0009DD99 /* SQLiteNormalizedCache.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 54DDB1B11EA550540009DD99 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 54DDB1CA1EA551E60009DD99 /* DataLoaderTests.swift in Sources */, - 54DDB1CC1EA551E60009DD99 /* GraphQLExecutorFieldValueTests.swift in Sources */, - 54DDB1D11EA551E60009DD99 /* ParseQueryResponseTests.swift in Sources */, - 54DDB1D41EA551E60009DD99 /* StarWarsServerTests.swift in Sources */, - 54DDB1D21EA551E60009DD99 /* PromiseTests.swift in Sources */, - 54DDB1CE1EA551E60009DD99 /* LoadQueryFromStoreTests.swift in Sources */, - 54DDB1D71EA551E60009DD99 /* WatchQueryTests.swift in Sources */, - 54DDB1D61EA551E60009DD99 /* Utilities.swift in Sources */, - 54DDB1CD1EA551E60009DD99 /* GraphQLInputValueEncodingTests.swift in Sources */, - 54DDB1CB1EA551E60009DD99 /* FetchQueryTests.swift in Sources */, - 54DDB1D31EA551E60009DD99 /* StarWarsServerCachingRoundtripTests.swift in Sources */, - 543806B61EA56D5C00F55B72 /* TestCacheProvider.swift in Sources */, - 543806B81EA56D8400F55B72 /* CachePersistenceTests.swift in Sources */, - 54DDB1C91EA551E60009DD99 /* CacheKeyForFieldTests.swift in Sources */, - 54DDB1D01EA551E60009DD99 /* NormalizeQueryResults.swift in Sources */, - 54DDB1C81EA551E60009DD99 /* BatchedLoadTests.swift in Sources */, - 54DDB1D51EA551E60009DD99 /* StoreTransactionTests.swift in Sources */, - 54DDB1CF1EA551E60009DD99 /* MockNetworkTransport.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 543806901EA569C500F55B72 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = StarWarsAPI; - targetProxy = 5438068F1EA569C500F55B72 /* PBXContainerItemProxy */; - }; 5438069C1EA56C2200F55B72 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 54DDB0BD1EA1523E0009DD99 /* ApolloSQLiteIOS */; + target = 54DDB0BD1EA1523E0009DD99 /* ApolloSQLite */; targetProxy = 5438069B1EA56C2200F55B72 /* PBXContainerItemProxy */; }; 543806A11EA56CE300F55B72 /* PBXTargetDependency */ = { @@ -720,18 +548,13 @@ name = StarWarsAPI; targetProxy = 543806A01EA56CE300F55B72 /* PBXContainerItemProxy */; }; - 54DDB1BC1EA550550009DD99 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 54DDB1371EA543F80009DD99 /* ApolloSQLiteMac */; - targetProxy = 54DDB1BB1EA550550009DD99 /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 5438069E1EA56C2200F55B72 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - INFOPLIST_FILE = ApolloSQLite/iOSTests/Info.plist; + INFOPLIST_FILE = ApolloSQLite/Tests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteIOSTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -742,7 +565,7 @@ 5438069F1EA56C2200F55B72 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - INFOPLIST_FILE = ApolloSQLite/iOSTests/Info.plist; + INFOPLIST_FILE = ApolloSQLite/Tests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteIOSTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -752,6 +575,7 @@ }; 54DDB0C41EA1523E0009DD99 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 9FA4FD6A1EA7B35200635987 /* Framework.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -806,6 +630,7 @@ }; 54DDB0C51EA1523E0009DD99 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 9FA4FD6A1EA7B35200635987 /* Framework.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -860,7 +685,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "$(SRCROOT)/ApolloSQLite/iOS/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/ApolloSQLite/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 10.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -881,7 +706,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "$(SRCROOT)/ApolloSQLite/iOS/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/ApolloSQLite/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 10.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -892,84 +717,10 @@ }; name = Release; }; - 54DDB13E1EA543F80009DD99 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_VERSION = A; - INFOPLIST_FILE = "$(SRCROOT)/ApolloSQLite/Mac/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLite; - PRODUCT_NAME = ApolloSQLite; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - 54DDB13F1EA543F80009DD99 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_VERSION = A; - INFOPLIST_FILE = "$(SRCROOT)/ApolloSQLite/Mac/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLite; - PRODUCT_NAME = ApolloSQLite; - SDKROOT = macosx; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; - 54DDB1BE1EA550550009DD99 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = ApolloSQLite/MacTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteMacTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - 54DDB1BF1EA550550009DD99 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_IDENTITY = "-"; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = ApolloSQLite/MacTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - MACOSX_DEPLOYMENT_TARGET = 10.12; - PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLiteMacTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SDKROOT = macosx; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 5438069D1EA56C2200F55B72 /* Build configuration list for PBXNativeTarget "ApolloSQLiteIOSTests" */ = { + 5438069D1EA56C2200F55B72 /* Build configuration list for PBXNativeTarget "ApolloSQLiteTests" */ = { isa = XCConfigurationList; buildConfigurations = ( 5438069E1EA56C2200F55B72 /* Debug */, @@ -987,7 +738,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 54DDB0C61EA1523E0009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteIOS" */ = { + 54DDB0C61EA1523E0009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLite" */ = { isa = XCConfigurationList; buildConfigurations = ( 54DDB0C71EA1523E0009DD99 /* Debug */, @@ -996,24 +747,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 54DDB13D1EA543F80009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteMac" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 54DDB13E1EA543F80009DD99 /* Debug */, - 54DDB13F1EA543F80009DD99 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 54DDB1BD1EA550550009DD99 /* Build configuration list for PBXNativeTarget "ApolloSQLiteMacTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 54DDB1BE1EA550550009DD99 /* Debug */, - 54DDB1BF1EA550550009DD99 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = 54DDB0B51EA1523E0009DD99 /* Project object */; diff --git a/ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLiteIOS.xcscheme b/ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLite.xcscheme similarity index 91% rename from ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLiteIOS.xcscheme rename to ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLite.xcscheme index f5c3729e2a..9ff5b135d2 100644 --- a/ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLiteIOS.xcscheme +++ b/ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLite.xcscheme @@ -16,7 +16,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "54DDB0BD1EA1523E0009DD99" BuildableName = "ApolloSQLite.framework" - BlueprintName = "ApolloSQLiteIOS" + BlueprintName = "ApolloSQLite" ReferencedContainer = "container:ApolloSQLite.xcodeproj"> @@ -33,8 +33,8 @@ @@ -44,7 +44,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "54DDB0BD1EA1523E0009DD99" BuildableName = "ApolloSQLite.framework" - BlueprintName = "ApolloSQLiteIOS" + BlueprintName = "ApolloSQLite" ReferencedContainer = "container:ApolloSQLite.xcodeproj"> @@ -66,7 +66,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "54DDB0BD1EA1523E0009DD99" BuildableName = "ApolloSQLite.framework" - BlueprintName = "ApolloSQLiteIOS" + BlueprintName = "ApolloSQLite" ReferencedContainer = "container:ApolloSQLite.xcodeproj"> @@ -84,7 +84,7 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "54DDB0BD1EA1523E0009DD99" BuildableName = "ApolloSQLite.framework" - BlueprintName = "ApolloSQLiteIOS" + BlueprintName = "ApolloSQLite" ReferencedContainer = "container:ApolloSQLite.xcodeproj"> diff --git a/ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLiteMac.xcscheme b/ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLiteMac.xcscheme deleted file mode 100644 index 67bb0a9065..0000000000 --- a/ApolloSQLite.xcodeproj/xcshareddata/xcschemes/ApolloSQLiteMac.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ApolloSQLite/iOS/Info.plist b/ApolloSQLite/Info.plist similarity index 100% rename from ApolloSQLite/iOS/Info.plist rename to ApolloSQLite/Info.plist diff --git a/ApolloSQLite/Mac/ApolloSQLite.h b/ApolloSQLite/Mac/ApolloSQLite.h deleted file mode 100644 index abe2a69254..0000000000 --- a/ApolloSQLite/Mac/ApolloSQLite.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// ApolloSQLiteMac.h -// ApolloSQLiteMac -// -// Created by paul_kompfner on 4/17/17. -// -// - -#import - -//! Project version number for ApolloSQLiteMac. -FOUNDATION_EXPORT double ApolloSQLiteMacVersionNumber; - -//! Project version string for ApolloSQLiteMac. -FOUNDATION_EXPORT const unsigned char ApolloSQLiteMacVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/ApolloSQLite/Mac/Info.plist b/ApolloSQLite/Mac/Info.plist deleted file mode 100644 index fbe1e6b314..0000000000 --- a/ApolloSQLite/Mac/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSPrincipalClass - - - diff --git a/ApolloSQLite/SharedTests/CachePersistenceTests.swift b/ApolloSQLite/Tests/CachePersistenceTests.swift similarity index 100% rename from ApolloSQLite/SharedTests/CachePersistenceTests.swift rename to ApolloSQLite/Tests/CachePersistenceTests.swift diff --git a/ApolloSQLite/MacTests/Info.plist b/ApolloSQLite/Tests/Info.plist similarity index 100% rename from ApolloSQLite/MacTests/Info.plist rename to ApolloSQLite/Tests/Info.plist diff --git a/ApolloSQLite/SharedTests/TestCacheProvider.swift b/ApolloSQLite/Tests/TestCacheProvider.swift similarity index 100% rename from ApolloSQLite/SharedTests/TestCacheProvider.swift rename to ApolloSQLite/Tests/TestCacheProvider.swift diff --git a/ApolloSQLite/iOS/ApolloSQLite.h b/ApolloSQLite/iOS/ApolloSQLite.h deleted file mode 100644 index ee73917d5c..0000000000 --- a/ApolloSQLite/iOS/ApolloSQLite.h +++ /dev/null @@ -1,11 +0,0 @@ -#import - -//! Project version number for ApolloSQLite. -FOUNDATION_EXPORT double ApolloSQLiteVersionNumber; - -//! Project version string for ApolloSQLite. -FOUNDATION_EXPORT const unsigned char ApolloSQLiteVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/ApolloSQLite/iOSTests/Info.plist b/ApolloSQLite/iOSTests/Info.plist deleted file mode 100644 index 6c6c23c43a..0000000000 --- a/ApolloSQLite/iOSTests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - From 51184699d69cdc42831256438086bfb97103bfc0 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Wed, 19 Apr 2017 11:51:07 -0700 Subject: [PATCH 61/76] Update README.md with concise installation instructions for Cocoapods and Carthage --- README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/README.md b/README.md index 1a7eb63f2f..d230f3753c 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,32 @@ This combination of immutable models, one way data flow, and automatic consisten Documentation can be found [here](http://dev.apollodata.com/ios/). +## Installation + +### Cocoapods + +Include the following in your `Podfile`: + +```ruby +pod 'Apollo' +``` + +This will come with both an in-memory cache and a SQLite-based persistent cache. If you only need the in-memory cache, you can exclude `ApolloSQLite` by using the following: + +```ruby +pod 'Apollo/Core' +``` + +### Carthage + +Include the following in your `Cartfile`: + +``` +github "https://github.com/apollographql/apollo-ios.git" +``` + +This will come with both an in-memory cache and a SQLite-based persistent cache. If you only need the in-memory cache, only drag `Apollo` into your project, avoiding `ApolloSQLite` and `SQLite.swift`. + ## Contributing [![Build status](https://travis-ci.org/apollographql/apollo-ios.svg?branch=master)](https://travis-ci.org/apollographql/apollo-ios) From 97b6ce567a16ba68d40ae022f2c9714ca8fe7f2f Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Wed, 19 Apr 2017 13:33:56 -0700 Subject: [PATCH 62/76] Avoid overwriting xcconfig-specified deployment targets in ApolloSQLite project --- ApolloSQLite.xcodeproj/project.pbxproj | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ApolloSQLite.xcodeproj/project.pbxproj b/ApolloSQLite.xcodeproj/project.pbxproj index c605d2a96a..7bc92070b9 100644 --- a/ApolloSQLite.xcodeproj/project.pbxproj +++ b/ApolloSQLite.xcodeproj/project.pbxproj @@ -616,7 +616,6 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.3; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -665,7 +664,6 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.3; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -687,7 +685,6 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "$(SRCROOT)/ApolloSQLite/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLite; PRODUCT_NAME = ApolloSQLite; @@ -708,7 +705,6 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "$(SRCROOT)/ApolloSQLite/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.3; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloSQLite; PRODUCT_NAME = ApolloSQLite; From 92fb642953d5368b06d3112044233a57c3ecf91e Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Wed, 19 Apr 2017 14:40:05 -0700 Subject: [PATCH 63/76] Better organize directory structure --- Apollo.podspec | 2 +- Apollo.xcodeproj/project.pbxproj | 126 ++++++++++-------- {Sources => Apollo}/Apollo.h | 0 {Sources => Apollo}/ApolloClient.swift | 0 {Sources => Apollo}/ApolloStore.swift | 0 .../AsynchronousOperation.swift | 0 {Sources => Apollo}/Collections.swift | 0 {Sources => Apollo}/DataLoader.swift | 0 {Sources => Apollo}/Dictionary+KeyPath.swift | 0 .../GraphQLDependencyTracker.swift | 0 {Sources => Apollo}/GraphQLError.swift | 0 {Sources => Apollo}/GraphQLExecutor.swift | 0 {Sources => Apollo}/GraphQLOperation.swift | 0 {Sources => Apollo}/GraphQLOutputType.swift | 0 {Sources => Apollo}/GraphQLQueryWatcher.swift | 0 {Sources => Apollo}/GraphQLResponse.swift | 0 .../GraphQLResponseGenerator.swift | 0 {Sources => Apollo}/GraphQLResult.swift | 0 .../GraphQLResultAccumulator.swift | 0 {Sources => Apollo}/GraphQLResultMapper.swift | 0 .../GraphQLResultNormalizer.swift | 0 {Sources => Apollo}/GraphQLValues.swift | 0 .../HTTPNetworkTransport.swift | 0 .../InMemoryNormalizedCache.swift | 0 {Sources => Apollo}/Info.plist | 0 {Sources => Apollo}/JSON.swift | 0 .../JSONSerializationFormat.swift | 0 .../JSONStandardTypeConversions.swift | 0 {Sources => Apollo}/Locking.swift | 0 {Sources => Apollo}/NetworkTransport.swift | 0 {Sources => Apollo}/NormalizedCache.swift | 0 {Sources => Apollo}/Promise.swift | 0 {Sources => Apollo}/Record.swift | 0 {Sources => Apollo}/RecordSet.swift | 0 {Sources => Apollo}/Result.swift | 0 {Sources => Apollo}/Selections.swift | 0 .../Tests}/ApolloPerformanceTests/Info.plist | 0 .../NormalizedCachingTests.swift | 0 .../ApolloPerformanceTests/PromiseTests.swift | 0 .../Tests}/ApolloTests/BatchedLoadTests.swift | 0 .../ApolloTests/CacheKeyForFieldTests.swift | 0 .../Tests}/ApolloTests/DataLoaderTests.swift | 0 .../GraphQLExecutorFieldValueTests.swift | 0 .../GraphQLInputValueEncodingTests.swift | 0 .../Tests}/ApolloTests/Info.plist | 0 .../ApolloTests/NormalizeQueryResults.swift | 0 .../ApolloTests/ParseQueryResponseTests.swift | 0 .../Tests}/ApolloTests/PromiseTests.swift | 0 {Tests => Apollo/Tests}/StarWarsAPI/API.swift | 0 .../CreateReviewForEpisode.graphql | 0 .../StarWarsAPI/HeroAndFriendsNames.graphql | 0 .../Tests}/StarWarsAPI/HeroAppearsIn.graphql | 0 .../Tests}/StarWarsAPI/HeroDetails.graphql | 0 .../HeroDetailsWithFragment.graphql | 0 .../Tests}/StarWarsAPI/HeroName.graphql | 0 .../StarWarsAPI/HeroNameConditional.graphql | 0 .../HeroParentTypeDependentField.graphql | 0 .../HeroTypeDependentAliasedField.graphql | 0 .../StarWarsAPI/HumanWithNullMass.graphql | 0 .../Tests}/StarWarsAPI/Info.plist | 0 .../Tests}/StarWarsAPI/SameHeroTwice.graphql | 0 .../Tests}/StarWarsAPI/StarWarsAPI.h | 0 .../Tests}/StarWarsAPI/Starship.graphql | 0 .../Tests}/StarWarsAPI/TwoHeroes.graphql | 0 .../Tests}/StarWarsAPI/schema.json | 0 .../Tests}/TestCacheProvider.swift | 0 .../Tests}/TestHost iOS/AppDelegate.swift | 0 .../AppIcon.appiconset/Contents.json | 0 .../Base.lproj/LaunchScreen.storyboard | 0 .../TestHost iOS/Base.lproj/Main.storyboard | 0 .../Tests}/TestHost iOS/Info.plist | 0 .../Tests}/TestHost iOS/ViewController.swift | 0 {Sources => Apollo}/Utilities.swift | 0 ApolloSQLite.xcodeproj/project.pbxproj | 112 +++++++--------- .../FetchQueryTests.swift | 0 .../StarWarsServerCachingRoundtripTests.swift | 0 .../Integration}/StarWarsServerTests.swift | 0 .../LoadQueryFromStoreTests.swift | 0 .../MockNetworkTransport.swift | 0 .../StoreTransactionTests.swift | 0 .../Utilities.swift | 0 .../WatchQueryTests.swift | 0 82 files changed, 116 insertions(+), 124 deletions(-) rename {Sources => Apollo}/Apollo.h (100%) rename {Sources => Apollo}/ApolloClient.swift (100%) rename {Sources => Apollo}/ApolloStore.swift (100%) rename {Sources => Apollo}/AsynchronousOperation.swift (100%) rename {Sources => Apollo}/Collections.swift (100%) rename {Sources => Apollo}/DataLoader.swift (100%) rename {Sources => Apollo}/Dictionary+KeyPath.swift (100%) rename {Sources => Apollo}/GraphQLDependencyTracker.swift (100%) rename {Sources => Apollo}/GraphQLError.swift (100%) rename {Sources => Apollo}/GraphQLExecutor.swift (100%) rename {Sources => Apollo}/GraphQLOperation.swift (100%) rename {Sources => Apollo}/GraphQLOutputType.swift (100%) rename {Sources => Apollo}/GraphQLQueryWatcher.swift (100%) rename {Sources => Apollo}/GraphQLResponse.swift (100%) rename {Sources => Apollo}/GraphQLResponseGenerator.swift (100%) rename {Sources => Apollo}/GraphQLResult.swift (100%) rename {Sources => Apollo}/GraphQLResultAccumulator.swift (100%) rename {Sources => Apollo}/GraphQLResultMapper.swift (100%) rename {Sources => Apollo}/GraphQLResultNormalizer.swift (100%) rename {Sources => Apollo}/GraphQLValues.swift (100%) rename {Sources => Apollo}/HTTPNetworkTransport.swift (100%) rename {Sources => Apollo}/InMemoryNormalizedCache.swift (100%) rename {Sources => Apollo}/Info.plist (100%) rename {Sources => Apollo}/JSON.swift (100%) rename {Sources => Apollo}/JSONSerializationFormat.swift (100%) rename {Sources => Apollo}/JSONStandardTypeConversions.swift (100%) rename {Sources => Apollo}/Locking.swift (100%) rename {Sources => Apollo}/NetworkTransport.swift (100%) rename {Sources => Apollo}/NormalizedCache.swift (100%) rename {Sources => Apollo}/Promise.swift (100%) rename {Sources => Apollo}/Record.swift (100%) rename {Sources => Apollo}/RecordSet.swift (100%) rename {Sources => Apollo}/Result.swift (100%) rename {Sources => Apollo}/Selections.swift (100%) rename {Tests => Apollo/Tests}/ApolloPerformanceTests/Info.plist (100%) rename {Tests => Apollo/Tests}/ApolloPerformanceTests/NormalizedCachingTests.swift (100%) rename {Tests => Apollo/Tests}/ApolloPerformanceTests/PromiseTests.swift (100%) rename {Tests => Apollo/Tests}/ApolloTests/BatchedLoadTests.swift (100%) rename {Tests => Apollo/Tests}/ApolloTests/CacheKeyForFieldTests.swift (100%) rename {Tests => Apollo/Tests}/ApolloTests/DataLoaderTests.swift (100%) rename {Tests => Apollo/Tests}/ApolloTests/GraphQLExecutorFieldValueTests.swift (100%) rename {Tests => Apollo/Tests}/ApolloTests/GraphQLInputValueEncodingTests.swift (100%) rename {Tests => Apollo/Tests}/ApolloTests/Info.plist (100%) rename {Tests => Apollo/Tests}/ApolloTests/NormalizeQueryResults.swift (100%) rename {Tests => Apollo/Tests}/ApolloTests/ParseQueryResponseTests.swift (100%) rename {Tests => Apollo/Tests}/ApolloTests/PromiseTests.swift (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/API.swift (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/CreateReviewForEpisode.graphql (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/HeroAndFriendsNames.graphql (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/HeroAppearsIn.graphql (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/HeroDetails.graphql (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/HeroDetailsWithFragment.graphql (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/HeroName.graphql (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/HeroNameConditional.graphql (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/HeroParentTypeDependentField.graphql (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/HeroTypeDependentAliasedField.graphql (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/HumanWithNullMass.graphql (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/Info.plist (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/SameHeroTwice.graphql (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/StarWarsAPI.h (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/Starship.graphql (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/TwoHeroes.graphql (100%) rename {Tests => Apollo/Tests}/StarWarsAPI/schema.json (100%) rename {Tests => Apollo/Tests}/TestCacheProvider.swift (100%) rename {Tests => Apollo/Tests}/TestHost iOS/AppDelegate.swift (100%) rename {Tests => Apollo/Tests}/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename {Tests => Apollo/Tests}/TestHost iOS/Base.lproj/LaunchScreen.storyboard (100%) rename {Tests => Apollo/Tests}/TestHost iOS/Base.lproj/Main.storyboard (100%) rename {Tests => Apollo/Tests}/TestHost iOS/Info.plist (100%) rename {Tests => Apollo/Tests}/TestHost iOS/ViewController.swift (100%) rename {Sources => Apollo}/Utilities.swift (100%) rename {Tests/ApolloTests => SharedTests}/FetchQueryTests.swift (100%) rename {Tests/ApolloTests => SharedTests/Integration}/StarWarsServerCachingRoundtripTests.swift (100%) rename {Tests/ApolloTests => SharedTests/Integration}/StarWarsServerTests.swift (100%) rename {Tests/ApolloTests => SharedTests}/LoadQueryFromStoreTests.swift (100%) rename {Tests/ApolloTests => SharedTests}/MockNetworkTransport.swift (100%) rename {Tests/ApolloTests => SharedTests}/StoreTransactionTests.swift (100%) rename {Tests/ApolloTests => SharedTests}/Utilities.swift (100%) rename {Tests/ApolloTests => SharedTests}/WatchQueryTests.swift (100%) diff --git a/Apollo.podspec b/Apollo.podspec index a531ca5e82..41f208b03a 100644 --- a/Apollo.podspec +++ b/Apollo.podspec @@ -15,7 +15,7 @@ Pod::Spec.new do |s| ss.ios.deployment_target = '8.0' ss.osx.deployment_target = '10.10' ss.tvos.deployment_target = '9.0' - ss.source_files = 'Sources/*.swift' + ss.source_files = 'Apollo/*.swift' ss.resource = 'scripts/check-and-run-apollo-codegen.sh' end diff --git a/Apollo.xcodeproj/project.pbxproj b/Apollo.xcodeproj/project.pbxproj index 12f813bc80..a9c6617e09 100644 --- a/Apollo.xcodeproj/project.pbxproj +++ b/Apollo.xcodeproj/project.pbxproj @@ -7,22 +7,25 @@ objects = { /* Begin PBXBuildFile section */ + 546D3A301EA811D300B84670 /* FetchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 546D3A241EA811B300B84670 /* FetchQueryTests.swift */; }; + 546D3A311EA811D300B84670 /* LoadQueryFromStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 546D3A251EA811B300B84670 /* LoadQueryFromStoreTests.swift */; }; + 546D3A341EA811D300B84670 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 546D3A281EA811B300B84670 /* StoreTransactionTests.swift */; }; + 546D3A351EA811D300B84670 /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 546D3A291EA811B300B84670 /* WatchQueryTests.swift */; }; + 546D3A3F1EA8123D00B84670 /* StarWarsServerCachingRoundtripTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 546D3A3B1EA8123400B84670 /* StarWarsServerCachingRoundtripTests.swift */; }; + 546D3A401EA8123D00B84670 /* StarWarsServerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 546D3A3C1EA8123400B84670 /* StarWarsServerTests.swift */; }; + 54C0D10B1EA815800004943B /* MockNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54C0D1071EA815400004943B /* MockNetworkTransport.swift */; }; + 54C0D10C1EA815840004943B /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54C0D1081EA815400004943B /* Utilities.swift */; }; 54DDB0921EA045870009DD99 /* InMemoryNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB0911EA045870009DD99 /* InMemoryNormalizedCache.swift */; }; 54DDB0951EA13C700009DD99 /* TestCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB0931EA13C1B0009DD99 /* TestCacheProvider.swift */; }; - 9F0F98D41E7AC17D00BF0371 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F0F98D31E7AC17D00BF0371 /* StoreTransactionTests.swift */; }; 9F0F98E11E7BCC3400BF0371 /* Dictionary+KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F0F98E01E7BCC3400BF0371 /* Dictionary+KeyPath.swift */; }; 9F27D4641D40379500715680 /* JSONStandardTypeConversions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F27D4631D40379500715680 /* JSONStandardTypeConversions.swift */; }; - 9F295E2D1E27419800A24949 /* StarWarsServerCachingRoundtripTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F295E2B1E27418F00A24949 /* StarWarsServerCachingRoundtripTests.swift */; }; 9F295E311E27534800A24949 /* NormalizeQueryResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F295E301E27534800A24949 /* NormalizeQueryResults.swift */; }; 9F295E381E277B2A00A24949 /* GraphQLResultNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F295E371E277B2A00A24949 /* GraphQLResultNormalizer.swift */; }; 9F438D071E6C2FD9007BDC1A /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FC750441D2A532C00458D91 /* Apollo.framework */; }; 9F438D081E6C30B1007BDC1A /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */; }; 9F533AB31E6C4A4200CBE097 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F438D0B1E6C494C007BDC1A /* BatchedLoadTests.swift */; }; 9F55347B1DE1DB2100E54264 /* ApolloStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F55347A1DE1DB2100E54264 /* ApolloStore.swift */; }; - 9F55347E1DE1DB3500E54264 /* LoadQueryFromStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F55347D1DE1DB3500E54264 /* LoadQueryFromStoreTests.swift */; }; 9F578D901D8D2CB300C0EA36 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F578D8F1D8D2CB300C0EA36 /* Utilities.swift */; }; - 9F6291C71E39775000CDA57B /* MockNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDFD2E1E3579B6007519DC /* MockNetworkTransport.swift */; }; - 9F69FFA71D4271F400E000B1 /* StarWarsServerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F69FFA61D4271F400E000B1 /* StarWarsServerTests.swift */; }; 9F69FFA91D42855900E000B1 /* NetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F69FFA81D42855900E000B1 /* NetworkTransport.swift */; }; 9F86B68B1E6438D700B885FF /* GraphQLResultMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F86B68A1E6438D700B885FF /* GraphQLResultMapper.swift */; }; 9F86B6901E65533D00B885FF /* GraphQLResponseGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F86B68F1E65533D00B885FF /* GraphQLResponseGenerator.swift */; }; @@ -45,10 +48,8 @@ 9FC9A9C81E2EFE6E0023C4D5 /* CacheKeyForFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9C71E2EFE6E0023C4D5 /* CacheKeyForFieldTests.swift */; }; 9FC9A9CC1E2FD0760023C4D5 /* Record.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9CB1E2FD0760023C4D5 /* Record.swift */; }; 9FC9A9D31E2FD48B0023C4D5 /* GraphQLError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FC9A9D21E2FD48B0023C4D5 /* GraphQLError.swift */; }; - 9FCDFD1F1E32EABB007519DC /* FetchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDFD1E1E32EABB007519DC /* FetchQueryTests.swift */; }; 9FCDFD231E33A0D8007519DC /* AsynchronousOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDFD221E33A0D8007519DC /* AsynchronousOperation.swift */; }; 9FCDFD291E33D0CE007519DC /* GraphQLQueryWatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDFD281E33D0CE007519DC /* GraphQLQueryWatcher.swift */; }; - 9FCDFD2C1E35784B007519DC /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDFD2B1E35784B007519DC /* WatchQueryTests.swift */; }; 9FCE2CEC1E6BDAD100E34457 /* NormalizedCachingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCE2CEB1E6BDAD100E34457 /* NormalizedCachingTests.swift */; }; 9FCE2CEE1E6BE2D900E34457 /* NormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FCE2CED1E6BE2D800E34457 /* NormalizedCache.swift */; }; 9FCE2CFE1E6C213D00E34457 /* StarWarsAPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FCE2CFC1E6C213D00E34457 /* StarWarsAPI.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -76,7 +77,6 @@ 9FF90A6F1DDDEB420034C3B6 /* GraphQLInputValueEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A6A1DDDEB420034C3B6 /* GraphQLInputValueEncodingTests.swift */; }; 9FF90A711DDDEB420034C3B6 /* GraphQLExecutorFieldValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A6B1DDDEB420034C3B6 /* GraphQLExecutorFieldValueTests.swift */; }; 9FF90A731DDDEB420034C3B6 /* ParseQueryResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A6C1DDDEB420034C3B6 /* ParseQueryResponseTests.swift */; }; - 9FF90A761DDDEB4C0034C3B6 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FF90A751DDDEB4C0034C3B6 /* Utilities.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -147,21 +147,25 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 546D3A241EA811B300B84670 /* FetchQueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchQueryTests.swift; sourceTree = ""; }; + 546D3A251EA811B300B84670 /* LoadQueryFromStoreTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadQueryFromStoreTests.swift; sourceTree = ""; }; + 546D3A281EA811B300B84670 /* StoreTransactionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreTransactionTests.swift; sourceTree = ""; }; + 546D3A291EA811B300B84670 /* WatchQueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchQueryTests.swift; sourceTree = ""; }; + 546D3A3B1EA8123400B84670 /* StarWarsServerCachingRoundtripTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StarWarsServerCachingRoundtripTests.swift; sourceTree = ""; }; + 546D3A3C1EA8123400B84670 /* StarWarsServerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StarWarsServerTests.swift; sourceTree = ""; }; + 54C0D1071EA815400004943B /* MockNetworkTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockNetworkTransport.swift; sourceTree = ""; }; + 54C0D1081EA815400004943B /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; 54DDB0911EA045870009DD99 /* InMemoryNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InMemoryNormalizedCache.swift; sourceTree = ""; }; 54DDB0931EA13C1B0009DD99 /* TestCacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestCacheProvider.swift; sourceTree = ""; }; - 9F0F98D31E7AC17D00BF0371 /* StoreTransactionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreTransactionTests.swift; sourceTree = ""; }; 9F0F98E01E7BCC3400BF0371 /* Dictionary+KeyPath.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Dictionary+KeyPath.swift"; sourceTree = ""; }; 9F27D4631D40379500715680 /* JSONStandardTypeConversions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSONStandardTypeConversions.swift; sourceTree = ""; }; - 9F295E2B1E27418F00A24949 /* StarWarsServerCachingRoundtripTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StarWarsServerCachingRoundtripTests.swift; sourceTree = ""; }; 9F295E301E27534800A24949 /* NormalizeQueryResults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NormalizeQueryResults.swift; sourceTree = ""; }; 9F295E371E277B2A00A24949 /* GraphQLResultNormalizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResultNormalizer.swift; sourceTree = ""; }; 9F438D0B1E6C494C007BDC1A /* BatchedLoadTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BatchedLoadTests.swift; sourceTree = ""; }; 9F4DAF2D1E48B84B00EBFF0B /* HTTPNetworkTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPNetworkTransport.swift; sourceTree = ""; }; 9F55347A1DE1DB2100E54264 /* ApolloStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApolloStore.swift; sourceTree = ""; }; - 9F55347D1DE1DB3500E54264 /* LoadQueryFromStoreTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadQueryFromStoreTests.swift; sourceTree = ""; }; 9F578D8F1D8D2CB300C0EA36 /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Framework.xcconfig; path = ../Framework.xcconfig; sourceTree = ""; }; - 9F69FFA61D4271F400E000B1 /* StarWarsServerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StarWarsServerTests.swift; sourceTree = ""; }; 9F69FFA81D42855900E000B1 /* NetworkTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkTransport.swift; sourceTree = ""; }; 9F86B68A1E6438D700B885FF /* GraphQLResultMapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResultMapper.swift; sourceTree = ""; }; 9F86B68F1E65533D00B885FF /* GraphQLResponseGenerator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLResponseGenerator.swift; sourceTree = ""; }; @@ -188,11 +192,8 @@ 9FC9A9C71E2EFE6E0023C4D5 /* CacheKeyForFieldTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CacheKeyForFieldTests.swift; sourceTree = ""; }; 9FC9A9CB1E2FD0760023C4D5 /* Record.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Record.swift; sourceTree = ""; }; 9FC9A9D21E2FD48B0023C4D5 /* GraphQLError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLError.swift; sourceTree = ""; }; - 9FCDFD1E1E32EABB007519DC /* FetchQueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchQueryTests.swift; sourceTree = ""; }; 9FCDFD221E33A0D8007519DC /* AsynchronousOperation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsynchronousOperation.swift; sourceTree = ""; }; 9FCDFD281E33D0CE007519DC /* GraphQLQueryWatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLQueryWatcher.swift; sourceTree = ""; }; - 9FCDFD2B1E35784B007519DC /* WatchQueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchQueryTests.swift; sourceTree = ""; }; - 9FCDFD2E1E3579B6007519DC /* MockNetworkTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockNetworkTransport.swift; sourceTree = ""; }; 9FCE2CEB1E6BDAD100E34457 /* NormalizedCachingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NormalizedCachingTests.swift; sourceTree = ""; }; 9FCE2CED1E6BE2D800E34457 /* NormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NormalizedCache.swift; sourceTree = ""; }; 9FCE2CFA1E6C213D00E34457 /* StarWarsAPI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = StarWarsAPI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -231,7 +232,6 @@ 9FF90A6A1DDDEB420034C3B6 /* GraphQLInputValueEncodingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLInputValueEncodingTests.swift; sourceTree = ""; }; 9FF90A6B1DDDEB420034C3B6 /* GraphQLExecutorFieldValueTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphQLExecutorFieldValueTests.swift; sourceTree = ""; }; 9FF90A6C1DDDEB420034C3B6 /* ParseQueryResponseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParseQueryResponseTests.swift; sourceTree = ""; }; - 9FF90A751DDDEB4C0034C3B6 /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -280,6 +280,29 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 546D3A231EA811B300B84670 /* SharedTests */ = { + isa = PBXGroup; + children = ( + 546D3A3A1EA8123400B84670 /* Integration */, + 546D3A241EA811B300B84670 /* FetchQueryTests.swift */, + 546D3A251EA811B300B84670 /* LoadQueryFromStoreTests.swift */, + 54C0D1071EA815400004943B /* MockNetworkTransport.swift */, + 546D3A281EA811B300B84670 /* StoreTransactionTests.swift */, + 54C0D1081EA815400004943B /* Utilities.swift */, + 546D3A291EA811B300B84670 /* WatchQueryTests.swift */, + ); + path = SharedTests; + sourceTree = SOURCE_ROOT; + }; + 546D3A3A1EA8123400B84670 /* Integration */ = { + isa = PBXGroup; + children = ( + 546D3A3B1EA8123400B84670 /* StarWarsServerCachingRoundtripTests.swift */, + 546D3A3C1EA8123400B84670 /* StarWarsServerTests.swift */, + ); + path = Integration; + sourceTree = ""; + }; 9F17BC471DAF055A00138496 /* Supporting Files */ = { isa = PBXGroup; children = ( @@ -360,28 +383,21 @@ 9FCDFD211E33A09F007519DC /* Utilities */, 9FE3F3961DADBD0D0072078F /* Supporting Files */, ); - name = Apollo; - path = Sources; + path = Apollo; sourceTree = ""; }; 9FC750521D2A532D00458D91 /* ApolloTests */ = { isa = PBXGroup; children = ( - 9FCDFD1E1E32EABB007519DC /* FetchQueryTests.swift */, - 9FCDFD2B1E35784B007519DC /* WatchQueryTests.swift */, + 546D3A231EA811B300B84670 /* SharedTests */, 9FF90A6C1DDDEB420034C3B6 /* ParseQueryResponseTests.swift */, 9F295E301E27534800A24949 /* NormalizeQueryResults.swift */, - 9F55347D1DE1DB3500E54264 /* LoadQueryFromStoreTests.swift */, - 9F0F98D31E7AC17D00BF0371 /* StoreTransactionTests.swift */, 9F438D0B1E6C494C007BDC1A /* BatchedLoadTests.swift */, 9FF90A6A1DDDEB420034C3B6 /* GraphQLInputValueEncodingTests.swift */, 9FF90A6B1DDDEB420034C3B6 /* GraphQLExecutorFieldValueTests.swift */, 9FC9A9C71E2EFE6E0023C4D5 /* CacheKeyForFieldTests.swift */, 9FE1C6E61E634C8D00C02284 /* PromiseTests.swift */, 9FADC8531E6B86D900C677E6 /* DataLoaderTests.swift */, - 9FCDFD2E1E3579B6007519DC /* MockNetworkTransport.swift */, - 9FF90A751DDDEB4C0034C3B6 /* Utilities.swift */, - 9FC9A9D51E2FD5690023C4D5 /* Integration */, 9F17BC471DAF055A00138496 /* Supporting Files */, ); path = ApolloTests; @@ -410,15 +426,6 @@ name = Network; sourceTree = ""; }; - 9FC9A9D51E2FD5690023C4D5 /* Integration */ = { - isa = PBXGroup; - children = ( - 9F69FFA61D4271F400E000B1 /* StarWarsServerTests.swift */, - 9F295E2B1E27418F00A24949 /* StarWarsServerCachingRoundtripTests.swift */, - ); - name = Integration; - sourceTree = ""; - }; 9FCDFD211E33A09F007519DC /* Utilities */ = { isa = PBXGroup; children = ( @@ -442,7 +449,8 @@ 9FD637E21E6ACF88001EDBC8 /* TestHost iOS */, 54DDB0931EA13C1B0009DD99 /* TestCacheProvider.swift */, ); - path = Tests; + name = Tests; + path = Apollo/Tests; sourceTree = ""; }; 9FCE2CFB1E6C213D00E34457 /* StarWarsAPI */ = { @@ -729,7 +737,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "APOLLO_FRAMEWORK_PATH=$(eval find $FRAMEWORK_SEARCH_PATHS -name \"Apollo.framework\" -maxdepth 1)\n\nif [ -z \"$APOLLO_FRAMEWORK_PATH\" ]; then\necho \"error: Couldn't find Apollo.framework in FRAMEWORK_SEARCH_PATHS; make sure to add the framework to your project.\"\nexit 1\nfi\n\ncd ${SRCROOT}/Tests/StarWarsAPI\n$(find $APOLLO_FRAMEWORK_PATH -name 'check-and-run-apollo-codegen.sh') generate $(find . -name '*.graphql') --schema schema.json --output API.swift"; + shellScript = "APOLLO_FRAMEWORK_PATH=$(eval find $FRAMEWORK_SEARCH_PATHS -name \"Apollo.framework\" -maxdepth 1)\n\nif [ -z \"$APOLLO_FRAMEWORK_PATH\" ]; then\necho \"error: Couldn't find Apollo.framework in FRAMEWORK_SEARCH_PATHS; make sure to add the framework to your project.\"\nexit 1\nfi\n\ncd ${SRCROOT}/Apollo/Tests/StarWarsAPI\n$(find $APOLLO_FRAMEWORK_PATH -name 'check-and-run-apollo-codegen.sh') generate $(find . -name '*.graphql') --schema schema.json --output API.swift"; }; /* End PBXShellScriptBuildPhase section */ @@ -789,20 +797,20 @@ files = ( 9FC9A9C81E2EFE6E0023C4D5 /* CacheKeyForFieldTests.swift in Sources */, 9F533AB31E6C4A4200CBE097 /* BatchedLoadTests.swift in Sources */, - 9F69FFA71D4271F400E000B1 /* StarWarsServerTests.swift in Sources */, - 9F295E2D1E27419800A24949 /* StarWarsServerCachingRoundtripTests.swift in Sources */, + 546D3A351EA811D300B84670 /* WatchQueryTests.swift in Sources */, 9FF90A6F1DDDEB420034C3B6 /* GraphQLInputValueEncodingTests.swift in Sources */, - 9FF90A761DDDEB4C0034C3B6 /* Utilities.swift in Sources */, - 9F55347E1DE1DB3500E54264 /* LoadQueryFromStoreTests.swift in Sources */, - 9F6291C71E39775000CDA57B /* MockNetworkTransport.swift in Sources */, + 546D3A301EA811D300B84670 /* FetchQueryTests.swift in Sources */, + 546D3A401EA8123D00B84670 /* StarWarsServerTests.swift in Sources */, + 54C0D10B1EA815800004943B /* MockNetworkTransport.swift in Sources */, 9FE1C6E71E634C8D00C02284 /* PromiseTests.swift in Sources */, - 9FCDFD1F1E32EABB007519DC /* FetchQueryTests.swift in Sources */, 9FADC8541E6B86D900C677E6 /* DataLoaderTests.swift in Sources */, + 546D3A3F1EA8123D00B84670 /* StarWarsServerCachingRoundtripTests.swift in Sources */, + 54C0D10C1EA815840004943B /* Utilities.swift in Sources */, 54DDB0951EA13C700009DD99 /* TestCacheProvider.swift in Sources */, + 546D3A311EA811D300B84670 /* LoadQueryFromStoreTests.swift in Sources */, 9FF90A711DDDEB420034C3B6 /* GraphQLExecutorFieldValueTests.swift in Sources */, - 9F0F98D41E7AC17D00BF0371 /* StoreTransactionTests.swift in Sources */, - 9FCDFD2C1E35784B007519DC /* WatchQueryTests.swift in Sources */, 9F295E311E27534800A24949 /* NormalizeQueryResults.swift in Sources */, + 546D3A341EA811D300B84670 /* StoreTransactionTests.swift in Sources */, 9FF90A731DDDEB420034C3B6 /* ParseQueryResponseTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -888,7 +896,7 @@ isa = XCBuildConfiguration; buildSettings = { DEVELOPMENT_TEAM = 5TL236FN6U; - INFOPLIST_FILE = Tests/ApolloPerformanceTests/Info.plist; + INFOPLIST_FILE = Apollo/Tests/ApolloPerformanceTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloPerformanceTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -901,7 +909,7 @@ isa = XCBuildConfiguration; buildSettings = { DEVELOPMENT_TEAM = 5TL236FN6U; - INFOPLIST_FILE = Tests/ApolloPerformanceTests/Info.plist; + INFOPLIST_FILE = Apollo/Tests/ApolloPerformanceTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloPerformanceTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1013,7 +1021,7 @@ buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; DEFINES_MODULE = YES; - INFOPLIST_FILE = Sources/Info.plist; + INFOPLIST_FILE = Apollo/Info.plist; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.Apollo; PRODUCT_NAME = Apollo; }; @@ -1025,7 +1033,7 @@ buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; DEFINES_MODULE = YES; - INFOPLIST_FILE = Sources/Info.plist; + INFOPLIST_FILE = Apollo/Info.plist; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.Apollo; PRODUCT_NAME = Apollo; }; @@ -1037,7 +1045,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = Tests/ApolloTests/Info.plist; + INFOPLIST_FILE = Apollo/Tests/ApolloTests/Info.plist; PRODUCT_BUNDLE_IDENTIFIER = com.apollostack.ApolloTests; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -1049,7 +1057,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = Tests/ApolloTests/Info.plist; + INFOPLIST_FILE = Apollo/Tests/ApolloTests/Info.plist; PRODUCT_BUNDLE_IDENTIFIER = com.apollostack.ApolloTests; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -1060,7 +1068,7 @@ baseConfigurationReference = 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */; buildSettings = { DEFINES_MODULE = YES; - INFOPLIST_FILE = Tests/StarWarsAPI/Info.plist; + INFOPLIST_FILE = Apollo/Tests/StarWarsAPI/Info.plist; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.StarWarsAPI; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -1071,7 +1079,7 @@ baseConfigurationReference = 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */; buildSettings = { DEFINES_MODULE = YES; - INFOPLIST_FILE = Tests/StarWarsAPI/Info.plist; + INFOPLIST_FILE = Apollo/Tests/StarWarsAPI/Info.plist; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.StarWarsAPI; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -1083,7 +1091,7 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = 5TL236FN6U; - INFOPLIST_FILE = "Tests/TestHost iOS/Info.plist"; + INFOPLIST_FILE = "Apollo/Tests/TestHost iOS/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.TestHost; @@ -1100,7 +1108,7 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = 5TL236FN6U; - INFOPLIST_FILE = "Tests/TestHost iOS/Info.plist"; + INFOPLIST_FILE = "Apollo/Tests/TestHost iOS/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.TestHost; @@ -1163,7 +1171,7 @@ APPLICATION_EXTENSION_API_ONLY = YES; DEFINES_MODULE = YES; ENABLE_TESTABILITY = YES; - INFOPLIST_FILE = Sources/Info.plist; + INFOPLIST_FILE = Apollo/Info.plist; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.Apollo; PRODUCT_NAME = Apollo; }; @@ -1173,7 +1181,7 @@ isa = XCBuildConfiguration; buildSettings = { DEVELOPMENT_TEAM = 5TL236FN6U; - INFOPLIST_FILE = Tests/ApolloPerformanceTests/Info.plist; + INFOPLIST_FILE = Apollo/Tests/ApolloPerformanceTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.ApolloPerformanceTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1188,7 +1196,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = Tests/ApolloTests/Info.plist; + INFOPLIST_FILE = Apollo/Tests/ApolloTests/Info.plist; PRODUCT_BUNDLE_IDENTIFIER = com.apollostack.ApolloTests; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -1199,7 +1207,7 @@ baseConfigurationReference = 9F64D5681E6D691E00F12B14 /* Framework.xcconfig */; buildSettings = { DEFINES_MODULE = YES; - INFOPLIST_FILE = Tests/StarWarsAPI/Info.plist; + INFOPLIST_FILE = Apollo/Tests/StarWarsAPI/Info.plist; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.StarWarsAPI; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -1211,7 +1219,7 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = 5TL236FN6U; - INFOPLIST_FILE = "Tests/TestHost iOS/Info.plist"; + INFOPLIST_FILE = "Apollo/Tests/TestHost iOS/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.apollographql.TestHost; diff --git a/Sources/Apollo.h b/Apollo/Apollo.h similarity index 100% rename from Sources/Apollo.h rename to Apollo/Apollo.h diff --git a/Sources/ApolloClient.swift b/Apollo/ApolloClient.swift similarity index 100% rename from Sources/ApolloClient.swift rename to Apollo/ApolloClient.swift diff --git a/Sources/ApolloStore.swift b/Apollo/ApolloStore.swift similarity index 100% rename from Sources/ApolloStore.swift rename to Apollo/ApolloStore.swift diff --git a/Sources/AsynchronousOperation.swift b/Apollo/AsynchronousOperation.swift similarity index 100% rename from Sources/AsynchronousOperation.swift rename to Apollo/AsynchronousOperation.swift diff --git a/Sources/Collections.swift b/Apollo/Collections.swift similarity index 100% rename from Sources/Collections.swift rename to Apollo/Collections.swift diff --git a/Sources/DataLoader.swift b/Apollo/DataLoader.swift similarity index 100% rename from Sources/DataLoader.swift rename to Apollo/DataLoader.swift diff --git a/Sources/Dictionary+KeyPath.swift b/Apollo/Dictionary+KeyPath.swift similarity index 100% rename from Sources/Dictionary+KeyPath.swift rename to Apollo/Dictionary+KeyPath.swift diff --git a/Sources/GraphQLDependencyTracker.swift b/Apollo/GraphQLDependencyTracker.swift similarity index 100% rename from Sources/GraphQLDependencyTracker.swift rename to Apollo/GraphQLDependencyTracker.swift diff --git a/Sources/GraphQLError.swift b/Apollo/GraphQLError.swift similarity index 100% rename from Sources/GraphQLError.swift rename to Apollo/GraphQLError.swift diff --git a/Sources/GraphQLExecutor.swift b/Apollo/GraphQLExecutor.swift similarity index 100% rename from Sources/GraphQLExecutor.swift rename to Apollo/GraphQLExecutor.swift diff --git a/Sources/GraphQLOperation.swift b/Apollo/GraphQLOperation.swift similarity index 100% rename from Sources/GraphQLOperation.swift rename to Apollo/GraphQLOperation.swift diff --git a/Sources/GraphQLOutputType.swift b/Apollo/GraphQLOutputType.swift similarity index 100% rename from Sources/GraphQLOutputType.swift rename to Apollo/GraphQLOutputType.swift diff --git a/Sources/GraphQLQueryWatcher.swift b/Apollo/GraphQLQueryWatcher.swift similarity index 100% rename from Sources/GraphQLQueryWatcher.swift rename to Apollo/GraphQLQueryWatcher.swift diff --git a/Sources/GraphQLResponse.swift b/Apollo/GraphQLResponse.swift similarity index 100% rename from Sources/GraphQLResponse.swift rename to Apollo/GraphQLResponse.swift diff --git a/Sources/GraphQLResponseGenerator.swift b/Apollo/GraphQLResponseGenerator.swift similarity index 100% rename from Sources/GraphQLResponseGenerator.swift rename to Apollo/GraphQLResponseGenerator.swift diff --git a/Sources/GraphQLResult.swift b/Apollo/GraphQLResult.swift similarity index 100% rename from Sources/GraphQLResult.swift rename to Apollo/GraphQLResult.swift diff --git a/Sources/GraphQLResultAccumulator.swift b/Apollo/GraphQLResultAccumulator.swift similarity index 100% rename from Sources/GraphQLResultAccumulator.swift rename to Apollo/GraphQLResultAccumulator.swift diff --git a/Sources/GraphQLResultMapper.swift b/Apollo/GraphQLResultMapper.swift similarity index 100% rename from Sources/GraphQLResultMapper.swift rename to Apollo/GraphQLResultMapper.swift diff --git a/Sources/GraphQLResultNormalizer.swift b/Apollo/GraphQLResultNormalizer.swift similarity index 100% rename from Sources/GraphQLResultNormalizer.swift rename to Apollo/GraphQLResultNormalizer.swift diff --git a/Sources/GraphQLValues.swift b/Apollo/GraphQLValues.swift similarity index 100% rename from Sources/GraphQLValues.swift rename to Apollo/GraphQLValues.swift diff --git a/Sources/HTTPNetworkTransport.swift b/Apollo/HTTPNetworkTransport.swift similarity index 100% rename from Sources/HTTPNetworkTransport.swift rename to Apollo/HTTPNetworkTransport.swift diff --git a/Sources/InMemoryNormalizedCache.swift b/Apollo/InMemoryNormalizedCache.swift similarity index 100% rename from Sources/InMemoryNormalizedCache.swift rename to Apollo/InMemoryNormalizedCache.swift diff --git a/Sources/Info.plist b/Apollo/Info.plist similarity index 100% rename from Sources/Info.plist rename to Apollo/Info.plist diff --git a/Sources/JSON.swift b/Apollo/JSON.swift similarity index 100% rename from Sources/JSON.swift rename to Apollo/JSON.swift diff --git a/Sources/JSONSerializationFormat.swift b/Apollo/JSONSerializationFormat.swift similarity index 100% rename from Sources/JSONSerializationFormat.swift rename to Apollo/JSONSerializationFormat.swift diff --git a/Sources/JSONStandardTypeConversions.swift b/Apollo/JSONStandardTypeConversions.swift similarity index 100% rename from Sources/JSONStandardTypeConversions.swift rename to Apollo/JSONStandardTypeConversions.swift diff --git a/Sources/Locking.swift b/Apollo/Locking.swift similarity index 100% rename from Sources/Locking.swift rename to Apollo/Locking.swift diff --git a/Sources/NetworkTransport.swift b/Apollo/NetworkTransport.swift similarity index 100% rename from Sources/NetworkTransport.swift rename to Apollo/NetworkTransport.swift diff --git a/Sources/NormalizedCache.swift b/Apollo/NormalizedCache.swift similarity index 100% rename from Sources/NormalizedCache.swift rename to Apollo/NormalizedCache.swift diff --git a/Sources/Promise.swift b/Apollo/Promise.swift similarity index 100% rename from Sources/Promise.swift rename to Apollo/Promise.swift diff --git a/Sources/Record.swift b/Apollo/Record.swift similarity index 100% rename from Sources/Record.swift rename to Apollo/Record.swift diff --git a/Sources/RecordSet.swift b/Apollo/RecordSet.swift similarity index 100% rename from Sources/RecordSet.swift rename to Apollo/RecordSet.swift diff --git a/Sources/Result.swift b/Apollo/Result.swift similarity index 100% rename from Sources/Result.swift rename to Apollo/Result.swift diff --git a/Sources/Selections.swift b/Apollo/Selections.swift similarity index 100% rename from Sources/Selections.swift rename to Apollo/Selections.swift diff --git a/Tests/ApolloPerformanceTests/Info.plist b/Apollo/Tests/ApolloPerformanceTests/Info.plist similarity index 100% rename from Tests/ApolloPerformanceTests/Info.plist rename to Apollo/Tests/ApolloPerformanceTests/Info.plist diff --git a/Tests/ApolloPerformanceTests/NormalizedCachingTests.swift b/Apollo/Tests/ApolloPerformanceTests/NormalizedCachingTests.swift similarity index 100% rename from Tests/ApolloPerformanceTests/NormalizedCachingTests.swift rename to Apollo/Tests/ApolloPerformanceTests/NormalizedCachingTests.swift diff --git a/Tests/ApolloPerformanceTests/PromiseTests.swift b/Apollo/Tests/ApolloPerformanceTests/PromiseTests.swift similarity index 100% rename from Tests/ApolloPerformanceTests/PromiseTests.swift rename to Apollo/Tests/ApolloPerformanceTests/PromiseTests.swift diff --git a/Tests/ApolloTests/BatchedLoadTests.swift b/Apollo/Tests/ApolloTests/BatchedLoadTests.swift similarity index 100% rename from Tests/ApolloTests/BatchedLoadTests.swift rename to Apollo/Tests/ApolloTests/BatchedLoadTests.swift diff --git a/Tests/ApolloTests/CacheKeyForFieldTests.swift b/Apollo/Tests/ApolloTests/CacheKeyForFieldTests.swift similarity index 100% rename from Tests/ApolloTests/CacheKeyForFieldTests.swift rename to Apollo/Tests/ApolloTests/CacheKeyForFieldTests.swift diff --git a/Tests/ApolloTests/DataLoaderTests.swift b/Apollo/Tests/ApolloTests/DataLoaderTests.swift similarity index 100% rename from Tests/ApolloTests/DataLoaderTests.swift rename to Apollo/Tests/ApolloTests/DataLoaderTests.swift diff --git a/Tests/ApolloTests/GraphQLExecutorFieldValueTests.swift b/Apollo/Tests/ApolloTests/GraphQLExecutorFieldValueTests.swift similarity index 100% rename from Tests/ApolloTests/GraphQLExecutorFieldValueTests.swift rename to Apollo/Tests/ApolloTests/GraphQLExecutorFieldValueTests.swift diff --git a/Tests/ApolloTests/GraphQLInputValueEncodingTests.swift b/Apollo/Tests/ApolloTests/GraphQLInputValueEncodingTests.swift similarity index 100% rename from Tests/ApolloTests/GraphQLInputValueEncodingTests.swift rename to Apollo/Tests/ApolloTests/GraphQLInputValueEncodingTests.swift diff --git a/Tests/ApolloTests/Info.plist b/Apollo/Tests/ApolloTests/Info.plist similarity index 100% rename from Tests/ApolloTests/Info.plist rename to Apollo/Tests/ApolloTests/Info.plist diff --git a/Tests/ApolloTests/NormalizeQueryResults.swift b/Apollo/Tests/ApolloTests/NormalizeQueryResults.swift similarity index 100% rename from Tests/ApolloTests/NormalizeQueryResults.swift rename to Apollo/Tests/ApolloTests/NormalizeQueryResults.swift diff --git a/Tests/ApolloTests/ParseQueryResponseTests.swift b/Apollo/Tests/ApolloTests/ParseQueryResponseTests.swift similarity index 100% rename from Tests/ApolloTests/ParseQueryResponseTests.swift rename to Apollo/Tests/ApolloTests/ParseQueryResponseTests.swift diff --git a/Tests/ApolloTests/PromiseTests.swift b/Apollo/Tests/ApolloTests/PromiseTests.swift similarity index 100% rename from Tests/ApolloTests/PromiseTests.swift rename to Apollo/Tests/ApolloTests/PromiseTests.swift diff --git a/Tests/StarWarsAPI/API.swift b/Apollo/Tests/StarWarsAPI/API.swift similarity index 100% rename from Tests/StarWarsAPI/API.swift rename to Apollo/Tests/StarWarsAPI/API.swift diff --git a/Tests/StarWarsAPI/CreateReviewForEpisode.graphql b/Apollo/Tests/StarWarsAPI/CreateReviewForEpisode.graphql similarity index 100% rename from Tests/StarWarsAPI/CreateReviewForEpisode.graphql rename to Apollo/Tests/StarWarsAPI/CreateReviewForEpisode.graphql diff --git a/Tests/StarWarsAPI/HeroAndFriendsNames.graphql b/Apollo/Tests/StarWarsAPI/HeroAndFriendsNames.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroAndFriendsNames.graphql rename to Apollo/Tests/StarWarsAPI/HeroAndFriendsNames.graphql diff --git a/Tests/StarWarsAPI/HeroAppearsIn.graphql b/Apollo/Tests/StarWarsAPI/HeroAppearsIn.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroAppearsIn.graphql rename to Apollo/Tests/StarWarsAPI/HeroAppearsIn.graphql diff --git a/Tests/StarWarsAPI/HeroDetails.graphql b/Apollo/Tests/StarWarsAPI/HeroDetails.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroDetails.graphql rename to Apollo/Tests/StarWarsAPI/HeroDetails.graphql diff --git a/Tests/StarWarsAPI/HeroDetailsWithFragment.graphql b/Apollo/Tests/StarWarsAPI/HeroDetailsWithFragment.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroDetailsWithFragment.graphql rename to Apollo/Tests/StarWarsAPI/HeroDetailsWithFragment.graphql diff --git a/Tests/StarWarsAPI/HeroName.graphql b/Apollo/Tests/StarWarsAPI/HeroName.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroName.graphql rename to Apollo/Tests/StarWarsAPI/HeroName.graphql diff --git a/Tests/StarWarsAPI/HeroNameConditional.graphql b/Apollo/Tests/StarWarsAPI/HeroNameConditional.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroNameConditional.graphql rename to Apollo/Tests/StarWarsAPI/HeroNameConditional.graphql diff --git a/Tests/StarWarsAPI/HeroParentTypeDependentField.graphql b/Apollo/Tests/StarWarsAPI/HeroParentTypeDependentField.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroParentTypeDependentField.graphql rename to Apollo/Tests/StarWarsAPI/HeroParentTypeDependentField.graphql diff --git a/Tests/StarWarsAPI/HeroTypeDependentAliasedField.graphql b/Apollo/Tests/StarWarsAPI/HeroTypeDependentAliasedField.graphql similarity index 100% rename from Tests/StarWarsAPI/HeroTypeDependentAliasedField.graphql rename to Apollo/Tests/StarWarsAPI/HeroTypeDependentAliasedField.graphql diff --git a/Tests/StarWarsAPI/HumanWithNullMass.graphql b/Apollo/Tests/StarWarsAPI/HumanWithNullMass.graphql similarity index 100% rename from Tests/StarWarsAPI/HumanWithNullMass.graphql rename to Apollo/Tests/StarWarsAPI/HumanWithNullMass.graphql diff --git a/Tests/StarWarsAPI/Info.plist b/Apollo/Tests/StarWarsAPI/Info.plist similarity index 100% rename from Tests/StarWarsAPI/Info.plist rename to Apollo/Tests/StarWarsAPI/Info.plist diff --git a/Tests/StarWarsAPI/SameHeroTwice.graphql b/Apollo/Tests/StarWarsAPI/SameHeroTwice.graphql similarity index 100% rename from Tests/StarWarsAPI/SameHeroTwice.graphql rename to Apollo/Tests/StarWarsAPI/SameHeroTwice.graphql diff --git a/Tests/StarWarsAPI/StarWarsAPI.h b/Apollo/Tests/StarWarsAPI/StarWarsAPI.h similarity index 100% rename from Tests/StarWarsAPI/StarWarsAPI.h rename to Apollo/Tests/StarWarsAPI/StarWarsAPI.h diff --git a/Tests/StarWarsAPI/Starship.graphql b/Apollo/Tests/StarWarsAPI/Starship.graphql similarity index 100% rename from Tests/StarWarsAPI/Starship.graphql rename to Apollo/Tests/StarWarsAPI/Starship.graphql diff --git a/Tests/StarWarsAPI/TwoHeroes.graphql b/Apollo/Tests/StarWarsAPI/TwoHeroes.graphql similarity index 100% rename from Tests/StarWarsAPI/TwoHeroes.graphql rename to Apollo/Tests/StarWarsAPI/TwoHeroes.graphql diff --git a/Tests/StarWarsAPI/schema.json b/Apollo/Tests/StarWarsAPI/schema.json similarity index 100% rename from Tests/StarWarsAPI/schema.json rename to Apollo/Tests/StarWarsAPI/schema.json diff --git a/Tests/TestCacheProvider.swift b/Apollo/Tests/TestCacheProvider.swift similarity index 100% rename from Tests/TestCacheProvider.swift rename to Apollo/Tests/TestCacheProvider.swift diff --git a/Tests/TestHost iOS/AppDelegate.swift b/Apollo/Tests/TestHost iOS/AppDelegate.swift similarity index 100% rename from Tests/TestHost iOS/AppDelegate.swift rename to Apollo/Tests/TestHost iOS/AppDelegate.swift diff --git a/Tests/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/Apollo/Tests/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Tests/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Apollo/Tests/TestHost iOS/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Tests/TestHost iOS/Base.lproj/LaunchScreen.storyboard b/Apollo/Tests/TestHost iOS/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from Tests/TestHost iOS/Base.lproj/LaunchScreen.storyboard rename to Apollo/Tests/TestHost iOS/Base.lproj/LaunchScreen.storyboard diff --git a/Tests/TestHost iOS/Base.lproj/Main.storyboard b/Apollo/Tests/TestHost iOS/Base.lproj/Main.storyboard similarity index 100% rename from Tests/TestHost iOS/Base.lproj/Main.storyboard rename to Apollo/Tests/TestHost iOS/Base.lproj/Main.storyboard diff --git a/Tests/TestHost iOS/Info.plist b/Apollo/Tests/TestHost iOS/Info.plist similarity index 100% rename from Tests/TestHost iOS/Info.plist rename to Apollo/Tests/TestHost iOS/Info.plist diff --git a/Tests/TestHost iOS/ViewController.swift b/Apollo/Tests/TestHost iOS/ViewController.swift similarity index 100% rename from Tests/TestHost iOS/ViewController.swift rename to Apollo/Tests/TestHost iOS/ViewController.swift diff --git a/Sources/Utilities.swift b/Apollo/Utilities.swift similarity index 100% rename from Sources/Utilities.swift rename to Apollo/Utilities.swift diff --git a/ApolloSQLite.xcodeproj/project.pbxproj b/ApolloSQLite.xcodeproj/project.pbxproj index 7bc92070b9..40001b0302 100644 --- a/ApolloSQLite.xcodeproj/project.pbxproj +++ b/ApolloSQLite.xcodeproj/project.pbxproj @@ -10,23 +10,15 @@ 5438069A1EA56C2200F55B72 /* ApolloSQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0BE1EA1523E0009DD99 /* ApolloSQLite.framework */; }; 543806A21EA56CE700F55B72 /* StarWarsAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0DA1EA156170009DD99 /* StarWarsAPI.framework */; }; 543806A31EA56D1500F55B72 /* CachePersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */; }; - 543806A41EA56D1500F55B72 /* BatchedLoadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */; }; - 543806A51EA56D1500F55B72 /* CacheKeyForFieldTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */; }; - 543806A61EA56D1500F55B72 /* DataLoaderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1891EA54A820009DD99 /* DataLoaderTests.swift */; }; - 543806A71EA56D1500F55B72 /* FetchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18A1EA54A820009DD99 /* FetchQueryTests.swift */; }; - 543806A81EA56D1500F55B72 /* GraphQLExecutorFieldValueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18B1EA54A820009DD99 /* GraphQLExecutorFieldValueTests.swift */; }; - 543806A91EA56D1500F55B72 /* GraphQLInputValueEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18C1EA54A820009DD99 /* GraphQLInputValueEncodingTests.swift */; }; - 543806AA1EA56D1500F55B72 /* LoadQueryFromStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18D1EA54A820009DD99 /* LoadQueryFromStoreTests.swift */; }; - 543806AB1EA56D1500F55B72 /* MockNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18E1EA54A820009DD99 /* MockNetworkTransport.swift */; }; - 543806AC1EA56D1500F55B72 /* NormalizeQueryResults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB18F1EA54A820009DD99 /* NormalizeQueryResults.swift */; }; - 543806AD1EA56D1500F55B72 /* ParseQueryResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1901EA54A820009DD99 /* ParseQueryResponseTests.swift */; }; - 543806AE1EA56D1500F55B72 /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1911EA54A820009DD99 /* PromiseTests.swift */; }; - 543806AF1EA56D1500F55B72 /* StarWarsServerCachingRoundtripTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1921EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift */; }; - 543806B01EA56D1500F55B72 /* StarWarsServerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1931EA54A820009DD99 /* StarWarsServerTests.swift */; }; - 543806B11EA56D1500F55B72 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1941EA54A820009DD99 /* StoreTransactionTests.swift */; }; - 543806B21EA56D1500F55B72 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1951EA54A820009DD99 /* Utilities.swift */; }; - 543806B31EA56D1500F55B72 /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */; }; 543806B71EA56D5C00F55B72 /* TestCacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 543806B41EA56D5600F55B72 /* TestCacheProvider.swift */; }; + 546D3A5C1EA812B700B84670 /* FetchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 546D3A4F1EA812AB00B84670 /* FetchQueryTests.swift */; }; + 546D3A5D1EA812B700B84670 /* LoadQueryFromStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 546D3A531EA812AB00B84670 /* LoadQueryFromStoreTests.swift */; }; + 546D3A5E1EA812B700B84670 /* StoreTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 546D3A541EA812AB00B84670 /* StoreTransactionTests.swift */; }; + 546D3A5F1EA812B700B84670 /* WatchQueryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 546D3A551EA812AB00B84670 /* WatchQueryTests.swift */; }; + 546D3A601EA812BF00B84670 /* StarWarsServerCachingRoundtripTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 546D3A511EA812AB00B84670 /* StarWarsServerCachingRoundtripTests.swift */; }; + 546D3A611EA812BF00B84670 /* StarWarsServerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 546D3A521EA812AB00B84670 /* StarWarsServerTests.swift */; }; + 546D3A731EA8141100B84670 /* MockNetworkTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 546D3A711EA8140E00B84670 /* MockNetworkTransport.swift */; }; + 54C0D1061EA814B30004943B /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54C0D1041EA814B00004943B /* Utilities.swift */; }; 54DDB0F71EA157870009DD99 /* Apollo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0D41EA156170009DD99 /* Apollo.framework */; }; 54DDB1091EA53FD30009DD99 /* SQLite.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54DDB0EA1EA1573C0009DD99 /* SQLite.framework */; }; 54DDB1AF1EA54F7E0009DD99 /* SQLiteNormalizedCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54DDB1AD1EA54F770009DD99 /* SQLiteNormalizedCache.swift */; }; @@ -136,25 +128,17 @@ /* Begin PBXFileReference section */ 543806951EA56C2200F55B72 /* ApolloSQLiteTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApolloSQLiteTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 543806B41EA56D5600F55B72 /* TestCacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestCacheProvider.swift; sourceTree = ""; }; + 546D3A4F1EA812AB00B84670 /* FetchQueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetchQueryTests.swift; sourceTree = ""; }; + 546D3A511EA812AB00B84670 /* StarWarsServerCachingRoundtripTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StarWarsServerCachingRoundtripTests.swift; sourceTree = ""; }; + 546D3A521EA812AB00B84670 /* StarWarsServerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StarWarsServerTests.swift; sourceTree = ""; }; + 546D3A531EA812AB00B84670 /* LoadQueryFromStoreTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadQueryFromStoreTests.swift; sourceTree = ""; }; + 546D3A541EA812AB00B84670 /* StoreTransactionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreTransactionTests.swift; sourceTree = ""; }; + 546D3A551EA812AB00B84670 /* WatchQueryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WatchQueryTests.swift; sourceTree = ""; }; + 546D3A711EA8140E00B84670 /* MockNetworkTransport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockNetworkTransport.swift; sourceTree = ""; }; + 54C0D1041EA814B00004943B /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; 54DDB0BE1EA1523E0009DD99 /* ApolloSQLite.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ApolloSQLite.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 54DDB0CB1EA156170009DD99 /* Apollo.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Apollo.xcodeproj; sourceTree = ""; }; 54DDB0DF1EA1573C0009DD99 /* SQLite.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SQLite.xcodeproj; path = Carthage/Checkouts/SQLite.swift/SQLite.xcodeproj; sourceTree = ""; }; - 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = BatchedLoadTests.swift; path = ../../Tests/ApolloTests/BatchedLoadTests.swift; sourceTree = ""; }; - 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = CacheKeyForFieldTests.swift; path = ../../Tests/ApolloTests/CacheKeyForFieldTests.swift; sourceTree = ""; }; - 54DDB1891EA54A820009DD99 /* DataLoaderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = DataLoaderTests.swift; path = ../../Tests/ApolloTests/DataLoaderTests.swift; sourceTree = ""; }; - 54DDB18A1EA54A820009DD99 /* FetchQueryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = FetchQueryTests.swift; path = ../../Tests/ApolloTests/FetchQueryTests.swift; sourceTree = ""; }; - 54DDB18B1EA54A820009DD99 /* GraphQLExecutorFieldValueTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = GraphQLExecutorFieldValueTests.swift; path = ../../Tests/ApolloTests/GraphQLExecutorFieldValueTests.swift; sourceTree = ""; }; - 54DDB18C1EA54A820009DD99 /* GraphQLInputValueEncodingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = GraphQLInputValueEncodingTests.swift; path = ../../Tests/ApolloTests/GraphQLInputValueEncodingTests.swift; sourceTree = ""; }; - 54DDB18D1EA54A820009DD99 /* LoadQueryFromStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = LoadQueryFromStoreTests.swift; path = ../../Tests/ApolloTests/LoadQueryFromStoreTests.swift; sourceTree = ""; }; - 54DDB18E1EA54A820009DD99 /* MockNetworkTransport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MockNetworkTransport.swift; path = ../../Tests/ApolloTests/MockNetworkTransport.swift; sourceTree = ""; }; - 54DDB18F1EA54A820009DD99 /* NormalizeQueryResults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = NormalizeQueryResults.swift; path = ../../Tests/ApolloTests/NormalizeQueryResults.swift; sourceTree = ""; }; - 54DDB1901EA54A820009DD99 /* ParseQueryResponseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ParseQueryResponseTests.swift; path = ../../Tests/ApolloTests/ParseQueryResponseTests.swift; sourceTree = ""; }; - 54DDB1911EA54A820009DD99 /* PromiseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = PromiseTests.swift; path = ../../Tests/ApolloTests/PromiseTests.swift; sourceTree = ""; }; - 54DDB1921EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = StarWarsServerCachingRoundtripTests.swift; path = ../../Tests/ApolloTests/StarWarsServerCachingRoundtripTests.swift; sourceTree = ""; }; - 54DDB1931EA54A820009DD99 /* StarWarsServerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = StarWarsServerTests.swift; path = ../../Tests/ApolloTests/StarWarsServerTests.swift; sourceTree = ""; }; - 54DDB1941EA54A820009DD99 /* StoreTransactionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = StoreTransactionTests.swift; path = ../../Tests/ApolloTests/StoreTransactionTests.swift; sourceTree = ""; }; - 54DDB1951EA54A820009DD99 /* Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Utilities.swift; path = ../../Tests/ApolloTests/Utilities.swift; sourceTree = ""; }; - 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = WatchQueryTests.swift; path = ../../Tests/ApolloTests/WatchQueryTests.swift; sourceTree = ""; }; 54DDB1AD1EA54F770009DD99 /* SQLiteNormalizedCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SQLiteNormalizedCache.swift; sourceTree = ""; }; 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CachePersistenceTests.swift; sourceTree = ""; }; 9FA4FD6A1EA7B35200635987 /* Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Framework.xcconfig; sourceTree = SOURCE_ROOT; }; @@ -184,6 +168,29 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 546D3A4E1EA812AB00B84670 /* SharedTests */ = { + isa = PBXGroup; + children = ( + 546D3A501EA812AB00B84670 /* Integration */, + 546D3A4F1EA812AB00B84670 /* FetchQueryTests.swift */, + 546D3A531EA812AB00B84670 /* LoadQueryFromStoreTests.swift */, + 546D3A711EA8140E00B84670 /* MockNetworkTransport.swift */, + 546D3A541EA812AB00B84670 /* StoreTransactionTests.swift */, + 54C0D1041EA814B00004943B /* Utilities.swift */, + 546D3A551EA812AB00B84670 /* WatchQueryTests.swift */, + ); + path = SharedTests; + sourceTree = SOURCE_ROOT; + }; + 546D3A501EA812AB00B84670 /* Integration */ = { + isa = PBXGroup; + children = ( + 546D3A511EA812AB00B84670 /* StarWarsServerCachingRoundtripTests.swift */, + 546D3A521EA812AB00B84670 /* StarWarsServerTests.swift */, + ); + path = Integration; + sourceTree = ""; + }; 54DDB0B41EA1523E0009DD99 = { isa = PBXGroup; children = ( @@ -242,25 +249,10 @@ 54DDB1AA1EA54AD30009DD99 /* Tests */ = { isa = PBXGroup; children = ( + 546D3A4E1EA812AB00B84670 /* SharedTests */, 9FA86C5B1EA7B6D90073E1ED /* Supporting Files */, 543806B41EA56D5600F55B72 /* TestCacheProvider.swift */, 54DDB1DB1EA558220009DD99 /* CachePersistenceTests.swift */, - 54DDB1861EA54A820009DD99 /* BatchedLoadTests.swift */, - 54DDB1871EA54A820009DD99 /* CacheKeyForFieldTests.swift */, - 54DDB1891EA54A820009DD99 /* DataLoaderTests.swift */, - 54DDB18A1EA54A820009DD99 /* FetchQueryTests.swift */, - 54DDB18B1EA54A820009DD99 /* GraphQLExecutorFieldValueTests.swift */, - 54DDB18C1EA54A820009DD99 /* GraphQLInputValueEncodingTests.swift */, - 54DDB18D1EA54A820009DD99 /* LoadQueryFromStoreTests.swift */, - 54DDB18E1EA54A820009DD99 /* MockNetworkTransport.swift */, - 54DDB18F1EA54A820009DD99 /* NormalizeQueryResults.swift */, - 54DDB1901EA54A820009DD99 /* ParseQueryResponseTests.swift */, - 54DDB1911EA54A820009DD99 /* PromiseTests.swift */, - 54DDB1921EA54A820009DD99 /* StarWarsServerCachingRoundtripTests.swift */, - 54DDB1931EA54A820009DD99 /* StarWarsServerTests.swift */, - 54DDB1941EA54A820009DD99 /* StoreTransactionTests.swift */, - 54DDB1951EA54A820009DD99 /* Utilities.swift */, - 54DDB1961EA54A820009DD99 /* WatchQueryTests.swift */, ); name = Tests; path = ApolloSQLite/Tests; @@ -506,24 +498,16 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 543806A61EA56D1500F55B72 /* DataLoaderTests.swift in Sources */, + 546D3A5C1EA812B700B84670 /* FetchQueryTests.swift in Sources */, 543806B71EA56D5C00F55B72 /* TestCacheProvider.swift in Sources */, - 543806A81EA56D1500F55B72 /* GraphQLExecutorFieldValueTests.swift in Sources */, - 543806AD1EA56D1500F55B72 /* ParseQueryResponseTests.swift in Sources */, - 543806B01EA56D1500F55B72 /* StarWarsServerTests.swift in Sources */, - 543806AE1EA56D1500F55B72 /* PromiseTests.swift in Sources */, - 543806AA1EA56D1500F55B72 /* LoadQueryFromStoreTests.swift in Sources */, - 543806B31EA56D1500F55B72 /* WatchQueryTests.swift in Sources */, - 543806B21EA56D1500F55B72 /* Utilities.swift in Sources */, - 543806A91EA56D1500F55B72 /* GraphQLInputValueEncodingTests.swift in Sources */, - 543806A71EA56D1500F55B72 /* FetchQueryTests.swift in Sources */, + 546D3A5F1EA812B700B84670 /* WatchQueryTests.swift in Sources */, + 546D3A5D1EA812B700B84670 /* LoadQueryFromStoreTests.swift in Sources */, + 546D3A601EA812BF00B84670 /* StarWarsServerCachingRoundtripTests.swift in Sources */, + 546D3A611EA812BF00B84670 /* StarWarsServerTests.swift in Sources */, + 546D3A5E1EA812B700B84670 /* StoreTransactionTests.swift in Sources */, 543806A31EA56D1500F55B72 /* CachePersistenceTests.swift in Sources */, - 543806AF1EA56D1500F55B72 /* StarWarsServerCachingRoundtripTests.swift in Sources */, - 543806A51EA56D1500F55B72 /* CacheKeyForFieldTests.swift in Sources */, - 543806AC1EA56D1500F55B72 /* NormalizeQueryResults.swift in Sources */, - 543806A41EA56D1500F55B72 /* BatchedLoadTests.swift in Sources */, - 543806B11EA56D1500F55B72 /* StoreTransactionTests.swift in Sources */, - 543806AB1EA56D1500F55B72 /* MockNetworkTransport.swift in Sources */, + 54C0D1061EA814B30004943B /* Utilities.swift in Sources */, + 546D3A731EA8141100B84670 /* MockNetworkTransport.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Tests/ApolloTests/FetchQueryTests.swift b/SharedTests/FetchQueryTests.swift similarity index 100% rename from Tests/ApolloTests/FetchQueryTests.swift rename to SharedTests/FetchQueryTests.swift diff --git a/Tests/ApolloTests/StarWarsServerCachingRoundtripTests.swift b/SharedTests/Integration/StarWarsServerCachingRoundtripTests.swift similarity index 100% rename from Tests/ApolloTests/StarWarsServerCachingRoundtripTests.swift rename to SharedTests/Integration/StarWarsServerCachingRoundtripTests.swift diff --git a/Tests/ApolloTests/StarWarsServerTests.swift b/SharedTests/Integration/StarWarsServerTests.swift similarity index 100% rename from Tests/ApolloTests/StarWarsServerTests.swift rename to SharedTests/Integration/StarWarsServerTests.swift diff --git a/Tests/ApolloTests/LoadQueryFromStoreTests.swift b/SharedTests/LoadQueryFromStoreTests.swift similarity index 100% rename from Tests/ApolloTests/LoadQueryFromStoreTests.swift rename to SharedTests/LoadQueryFromStoreTests.swift diff --git a/Tests/ApolloTests/MockNetworkTransport.swift b/SharedTests/MockNetworkTransport.swift similarity index 100% rename from Tests/ApolloTests/MockNetworkTransport.swift rename to SharedTests/MockNetworkTransport.swift diff --git a/Tests/ApolloTests/StoreTransactionTests.swift b/SharedTests/StoreTransactionTests.swift similarity index 100% rename from Tests/ApolloTests/StoreTransactionTests.swift rename to SharedTests/StoreTransactionTests.swift diff --git a/Tests/ApolloTests/Utilities.swift b/SharedTests/Utilities.swift similarity index 100% rename from Tests/ApolloTests/Utilities.swift rename to SharedTests/Utilities.swift diff --git a/Tests/ApolloTests/WatchQueryTests.swift b/SharedTests/WatchQueryTests.swift similarity index 100% rename from Tests/ApolloTests/WatchQueryTests.swift rename to SharedTests/WatchQueryTests.swift From 31ad83d134def848ed06bdcac54aaf22dc6163e0 Mon Sep 17 00:00:00 2001 From: Martijn Walraven Date: Thu, 20 Apr 2017 11:09:08 +0200 Subject: [PATCH 64/76] Replace TestHost iOS scheme with ApolloPerformanceTests --- .../xcschemes/TestHost iOS.xcscheme | 101 ------------------ .../xcschemes/xcschememanagement.plist | 10 -- 2 files changed, 111 deletions(-) delete mode 100644 Apollo.xcodeproj/xcshareddata/xcschemes/TestHost iOS.xcscheme diff --git a/Apollo.xcodeproj/xcshareddata/xcschemes/TestHost iOS.xcscheme b/Apollo.xcodeproj/xcshareddata/xcschemes/TestHost iOS.xcscheme deleted file mode 100644 index 4fee9e2e79..0000000000 --- a/Apollo.xcodeproj/xcshareddata/xcschemes/TestHost iOS.xcscheme +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Apollo.xcodeproj/xcuserdata/martijnwalraven.xcuserdatad/xcschemes/xcschememanagement.plist b/Apollo.xcodeproj/xcuserdata/martijnwalraven.xcuserdatad/xcschemes/xcschememanagement.plist index 15049aa886..9f290d6d1f 100644 --- a/Apollo.xcodeproj/xcuserdata/martijnwalraven.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Apollo.xcodeproj/xcuserdata/martijnwalraven.xcuserdatad/xcschemes/xcschememanagement.plist @@ -19,16 +19,6 @@ orderHint 6 - TestHost iOS.xcscheme - - orderHint - 5 - - TestHost iOS.xcscheme_^#shared#^_ - - orderHint - 1 - SuppressBuildableAutocreation From e5dac42d5ac2d2574e53ab4ef9596f6c8b95e30b Mon Sep 17 00:00:00 2001 From: Martijn Walraven Date: Thu, 20 Apr 2017 11:15:38 +0200 Subject: [PATCH 65/76] Clean up Promise construction in SQLiteNormalizedCache --- ApolloSQLite/SQLiteNormalizedCache.swift | 28 +++++++----------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/ApolloSQLite/SQLiteNormalizedCache.swift b/ApolloSQLite/SQLiteNormalizedCache.swift index 68d7d59205..9ed38bf12e 100644 --- a/ApolloSQLite/SQLiteNormalizedCache.swift +++ b/ApolloSQLite/SQLiteNormalizedCache.swift @@ -15,31 +15,19 @@ public final class SQLiteNormalizedCache: NormalizedCache { } public func merge(records: RecordSet) -> Promise> { - return Promise> { fulfill, reject in - do { - fulfill(try mergeRecords(records: records)) - } - catch { - reject(error) - } - } + return Promise { try mergeRecords(records: records) } } public func loadRecords(forKeys keys: [CacheKey]) -> Promise<[Record?]> { - return Promise<[Record?]> { fulfill, reject in - do { - let records = try selectRecords(forKeys: keys) - let recordsOrNil: [Record?] = keys.map { key in - if let recordIndex = records.index(where: { $0.key == key }) { - return records[recordIndex] - } - return nil + return Promise { + let records = try selectRecords(forKeys: keys) + let recordsOrNil: [Record?] = keys.map { key in + if let recordIndex = records.index(where: { $0.key == key }) { + return records[recordIndex] } - fulfill(recordsOrNil) - } - catch { - reject(error) + return nil } + return recordsOrNil } } From 1f344e075cc4959dfee54b37a5218e9e67b82338 Mon Sep 17 00:00:00 2001 From: Martijn Walraven Date: Thu, 20 Apr 2017 12:30:42 +0200 Subject: [PATCH 66/76] Avoid JSONSerializationFormat in SQLiteNormalizedCache and clarify typing JSONSerializationFormat is meant to convert from/to GraphQL types, but the fields in a record already contain JSON values or Reference. --- Apollo/JSONStandardTypeConversions.swift | 7 ++- Apollo/Record.swift | 9 ++-- Apollo/RecordSet.swift | 2 +- ApolloSQLite/SQLiteNormalizedCache.swift | 56 +++++++++++------------- 4 files changed, 36 insertions(+), 38 deletions(-) diff --git a/Apollo/JSONStandardTypeConversions.swift b/Apollo/JSONStandardTypeConversions.swift index 5caf1243d6..f28612d766 100644 --- a/Apollo/JSONStandardTypeConversions.swift +++ b/Apollo/JSONStandardTypeConversions.swift @@ -117,14 +117,13 @@ extension Dictionary: JSONEncodable { public var jsonObject: JSONObject { var jsonObject = JSONObject(minimumCapacity: count) for (key, value) in self { + print("key: \(key), \(type(of: key))") + print("value: \(value), \(type(of: value))") if case let (key as String, value as JSONEncodable) = (key, value) { if !isNil(value) { jsonObject[key] = value.jsonValue } - } - else { - print("key: \(type(of: key))") - print("value: \(type(of: value))") + } else { fatalError("Dictionary is only JSONEncodable if Value is (and if Key is String)") } } diff --git a/Apollo/Record.swift b/Apollo/Record.swift index 59b20be729..f73971806a 100644 --- a/Apollo/Record.swift +++ b/Apollo/Record.swift @@ -4,14 +4,17 @@ public typealias CacheKey = String /// A cache record. public struct Record { public let key: CacheKey - public private(set) var fields: JSONObject - public init(key: CacheKey, _ fields: JSONObject = [:]) { + public typealias Value = Any + public typealias Fields = [CacheKey: Value] + public private(set) var fields: Fields + + public init(key: CacheKey, _ fields: Fields = [:]) { self.key = key self.fields = fields } - public subscript(key: CacheKey) -> JSONValue? { + public subscript(key: CacheKey) -> Value? { get { return fields[key] } diff --git a/Apollo/RecordSet.swift b/Apollo/RecordSet.swift index d7545ff6e7..da515b0d1b 100644 --- a/Apollo/RecordSet.swift +++ b/Apollo/RecordSet.swift @@ -59,7 +59,7 @@ public struct RecordSet { } extension RecordSet: ExpressibleByDictionaryLiteral { - public init(dictionaryLiteral elements: (CacheKey, JSONObject)...) { + public init(dictionaryLiteral elements: (CacheKey, Record.Fields)...) { self.init(records: elements.map { Record(key: $0.0, $0.1) }) } } diff --git a/ApolloSQLite/SQLiteNormalizedCache.swift b/ApolloSQLite/SQLiteNormalizedCache.swift index 9ed38bf12e..84e46570fe 100644 --- a/ApolloSQLite/SQLiteNormalizedCache.swift +++ b/ApolloSQLite/SQLiteNormalizedCache.swift @@ -83,60 +83,56 @@ public final class SQLiteNormalizedCache: NormalizedCache { throw SQLiteNormalizedCacheError.invalidRecordEncoding(record: record) } - let recordJSON = try SQLiteSerialization.deserialize(data: recordData) - return Record(key: row[key], recordJSON) + let fields = try SQLiteSerialization.deserialize(data: recordData) + return Record(key: row[key], fields) } } private let serializedReferenceKey = "reference" final class SQLiteSerialization { - static func serialize(fields: JSONObject) throws -> Data { + static func serialize(fields: Record.Fields) throws -> Data { var objectToSerialize = JSONObject() for (key, value) in fields { objectToSerialize[key] = try serialize(value: value) } - return try JSONSerializationFormat.serialize(value: objectToSerialize) + return try JSONSerialization.data(withJSONObject: objectToSerialize, options: []) + } + + private static func serialize(value: Record.Value) throws -> JSONValue { + switch value { + case let reference as Reference: + return [serializedReferenceKey: reference.key] + case let array as [Record.Value]: + return try array.map { try serialize(value: $0) } + default: + return value + } } - static func deserialize(data: Data) throws -> JSONObject { - let object = try JSONSerializationFormat.deserialize(data: data) + static func deserialize(data: Data) throws -> Record.Fields { + let object = try JSONSerialization.jsonObject(with: data, options: []) guard let jsonObject = object as? JSONObject else { throw SQLiteNormalizedCacheError.invalidRecordShape(object: object) } - var deserializedObject = JSONObject() + var fields = Record.Fields() for (key, value) in jsonObject { - deserializedObject[key] = try deserialize(valueJSON: value) + fields[key] = try deserialize(jsonValue: value) } - return deserializedObject + return fields } - private static func deserialize(valueJSON: Any) throws -> Any { - switch valueJSON { + private static func deserialize(jsonValue: JSONValue) throws -> Record.Value { + switch jsonValue { case let dictionary as JSONObject: guard let reference = dictionary[serializedReferenceKey] as? String else { - throw SQLiteNormalizedCacheError.invalidRecordValue(value: valueJSON) + throw SQLiteNormalizedCacheError.invalidRecordValue(value: jsonValue) } return Reference(key: reference) - case let array as NSArray: - return try array.map { try deserialize(valueJSON: $0) } + case let array as [JSONValue]: + return try array.map { try deserialize(jsonValue: $0) } default: - return valueJSON - } - } - - private static func serialize(value: Any) throws -> Any { - switch value { - case let reference as Reference: - return [serializedReferenceKey: reference.key] - case let array as NSArray: - return try array.map { try serialize(value: $0) } - case let string as NSString: - return string as String - case let number as NSNumber: - return number.doubleValue - default: - return value + return jsonValue } } } From eb67621c824aa027649e5c9a1ff8bbbdaca6274b Mon Sep 17 00:00:00 2001 From: Martijn Walraven Date: Thu, 20 Apr 2017 13:07:38 +0200 Subject: [PATCH 67/76] Use $reference when serializing Reference to avoid conflicts with user fields --- ApolloSQLite/SQLiteNormalizedCache.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ApolloSQLite/SQLiteNormalizedCache.swift b/ApolloSQLite/SQLiteNormalizedCache.swift index 84e46570fe..b1805182ad 100644 --- a/ApolloSQLite/SQLiteNormalizedCache.swift +++ b/ApolloSQLite/SQLiteNormalizedCache.swift @@ -88,7 +88,7 @@ public final class SQLiteNormalizedCache: NormalizedCache { } } -private let serializedReferenceKey = "reference" +private let serializedReferenceKey = "$reference" final class SQLiteSerialization { static func serialize(fields: Record.Fields) throws -> Data { From 6ee21ba89435331a7296c2346f945434edbd34cf Mon Sep 17 00:00:00 2001 From: Martijn Walraven Date: Thu, 20 Apr 2017 13:35:13 +0200 Subject: [PATCH 68/76] Add ApolloSQLite jobs to .travis.yml --- .travis.yml | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index d199368e1b..42c2736f31 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,22 +2,36 @@ language: objective-c osx_image: xcode8.3 -xcode_project: Apollo.xcodeproj - matrix: include: - - xcode_scheme: Apollo + - xcode_project: Apollo.xcodeproj + xcode_scheme: Apollo xcode_sdk: iphonesimulator10.3 env: DESTINATION="platform=iOS Simulator,OS=10.3,name=iPhone 7" - - xcode_scheme: Apollo + - xcode_project: Apollo.xcodeproj + xcode_scheme: Apollo xcode_sdk: iphonesimulator10.3 env: DESTINATION="platform=iOS Simulator,OS=9.3,name=iPhone 6s" - - xcode_scheme: Apollo + - xcode_project: Apollo.xcodeproj + xcode_scheme: Apollo xcode_sdk: macosx10.12 env: DESTINATION="platform=macOS,arch=x86_64" - - xcode_scheme: Apollo + - xcode_project: Apollo.xcodeproj + xcode_scheme: Apollo xcode_sdk: appletvsimulator10.2 env: DESTINATION="platform=tvOS Simulator,OS=10.2,name=Apple TV 1080p" + - xcode_project: ApolloSQLite.xcodeproj + xcode_scheme: ApolloSQLite + xcode_sdk: iphonesimulator10.3 + env: DESTINATION="platform=iOS Simulator,OS=10.3,name=iPhone 7" + - xcode_project: ApolloSQLite.xcodeproj + xcode_scheme: ApolloSQLite + xcode_sdk: iphonesimulator10.3 + env: DESTINATION="platform=iOS Simulator,OS=9.3,name=iPhone 6s" + - xcode_project: ApolloSQLite.xcodeproj + xcode_scheme: ApolloSQLite + xcode_sdk: macosx10.12 + env: DESTINATION="platform=macOS,arch=x86_64" cache: directories: From 9f9d17fa3920b1c2ee891dfb6e724ab4616d3734 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Thu, 20 Apr 2017 10:29:48 -0700 Subject: [PATCH 69/76] Minor cleanup and clarity fixes --- Apollo/JSONStandardTypeConversions.swift | 2 -- ApolloSQLite/SQLiteNormalizedCache.swift | 24 ++++++++++++------------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/Apollo/JSONStandardTypeConversions.swift b/Apollo/JSONStandardTypeConversions.swift index f28612d766..9b3b577fa6 100644 --- a/Apollo/JSONStandardTypeConversions.swift +++ b/Apollo/JSONStandardTypeConversions.swift @@ -117,8 +117,6 @@ extension Dictionary: JSONEncodable { public var jsonObject: JSONObject { var jsonObject = JSONObject(minimumCapacity: count) for (key, value) in self { - print("key: \(key), \(type(of: key))") - print("value: \(value), \(type(of: value))") if case let (key as String, value as JSONEncodable) = (key, value) { if !isNil(value) { jsonObject[key] = value.jsonValue diff --git a/ApolloSQLite/SQLiteNormalizedCache.swift b/ApolloSQLite/SQLiteNormalizedCache.swift index b1805182ad..2aaa1da7c4 100644 --- a/ApolloSQLite/SQLiteNormalizedCache.swift +++ b/ApolloSQLite/SQLiteNormalizedCache.swift @@ -90,23 +90,23 @@ public final class SQLiteNormalizedCache: NormalizedCache { private let serializedReferenceKey = "$reference" -final class SQLiteSerialization { +private final class SQLiteSerialization { static func serialize(fields: Record.Fields) throws -> Data { var objectToSerialize = JSONObject() for (key, value) in fields { - objectToSerialize[key] = try serialize(value: value) + objectToSerialize[key] = try serialize(fieldValue: value) } return try JSONSerialization.data(withJSONObject: objectToSerialize, options: []) } - private static func serialize(value: Record.Value) throws -> JSONValue { - switch value { + private static func serialize(fieldValue: Record.Value) throws -> JSONValue { + switch fieldValue { case let reference as Reference: return [serializedReferenceKey: reference.key] case let array as [Record.Value]: - return try array.map { try serialize(value: $0) } + return try array.map { try serialize(fieldValue: $0) } default: - return value + return fieldValue } } @@ -117,22 +117,22 @@ final class SQLiteSerialization { } var fields = Record.Fields() for (key, value) in jsonObject { - fields[key] = try deserialize(jsonValue: value) + fields[key] = try deserialize(fieldJSONValue: value) } return fields } - private static func deserialize(jsonValue: JSONValue) throws -> Record.Value { - switch jsonValue { + private static func deserialize(fieldJSONValue: JSONValue) throws -> Record.Value { + switch fieldJSONValue { case let dictionary as JSONObject: guard let reference = dictionary[serializedReferenceKey] as? String else { - throw SQLiteNormalizedCacheError.invalidRecordValue(value: jsonValue) + throw SQLiteNormalizedCacheError.invalidRecordValue(value: fieldJSONValue) } return Reference(key: reference) case let array as [JSONValue]: - return try array.map { try deserialize(jsonValue: $0) } + return try array.map { try deserialize(fieldJSONValue: $0) } default: - return jsonValue + return fieldJSONValue } } } From c029a4820b6b936e200d6c2aff8738de2fe65dcf Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Fri, 21 Apr 2017 10:05:13 -0700 Subject: [PATCH 70/76] Write SQLite database to recommended MacOS directory to hopefully avoid CI-only crash --- ApolloSQLite/Tests/TestCacheProvider.swift | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ApolloSQLite/Tests/TestCacheProvider.swift b/ApolloSQLite/Tests/TestCacheProvider.swift index 1d86596e34..aaaaac8784 100644 --- a/ApolloSQLite/Tests/TestCacheProvider.swift +++ b/ApolloSQLite/Tests/TestCacheProvider.swift @@ -17,7 +17,19 @@ enum TestCacheProvider { } private static var sqliteFileURL: URL { - let docDirURL = URL(fileURLWithPath:NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!) - return docDirURL.appendingPathComponent("db.sqlite3") + let appSupportPath = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).first! + let appSupportURL = URL(fileURLWithPath: appSupportPath) + let directoryURL: URL + if let bundleIdentifier = Bundle.main.bundleIdentifier { + directoryURL = appSupportURL.appendingPathComponent(bundleIdentifier) + } + else { + directoryURL = appSupportURL + } + try! FileManager.default.createDirectory( + atPath: directoryURL.path, + withIntermediateDirectories: true, + attributes: nil) + return directoryURL.appendingPathComponent("db.sqlite3") } } From 28feedf81158ad6f2cbb014f9aabed8b502f158b Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Fri, 21 Apr 2017 10:07:55 -0700 Subject: [PATCH 71/76] Temporarily disable all tests except ApolloSQLite, for the purpose of debuggin CI-only crash --- .travis.yml | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/.travis.yml b/.travis.yml index 42c2736f31..eb5b38d409 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,30 +4,30 @@ osx_image: xcode8.3 matrix: include: - - xcode_project: Apollo.xcodeproj - xcode_scheme: Apollo - xcode_sdk: iphonesimulator10.3 - env: DESTINATION="platform=iOS Simulator,OS=10.3,name=iPhone 7" - - xcode_project: Apollo.xcodeproj - xcode_scheme: Apollo - xcode_sdk: iphonesimulator10.3 - env: DESTINATION="platform=iOS Simulator,OS=9.3,name=iPhone 6s" - - xcode_project: Apollo.xcodeproj - xcode_scheme: Apollo - xcode_sdk: macosx10.12 - env: DESTINATION="platform=macOS,arch=x86_64" - - xcode_project: Apollo.xcodeproj - xcode_scheme: Apollo - xcode_sdk: appletvsimulator10.2 - env: DESTINATION="platform=tvOS Simulator,OS=10.2,name=Apple TV 1080p" + # - xcode_project: Apollo.xcodeproj + # xcode_scheme: Apollo + # xcode_sdk: iphonesimulator10.3 + # env: DESTINATION="platform=iOS Simulator,OS=10.3,name=iPhone 7" + # - xcode_project: Apollo.xcodeproj + # xcode_scheme: Apollo + # xcode_sdk: iphonesimulator10.3 + # env: DESTINATION="platform=iOS Simulator,OS=9.3,name=iPhone 6s" + # - xcode_project: Apollo.xcodeproj + # xcode_scheme: Apollo + # xcode_sdk: macosx10.12 + # env: DESTINATION="platform=macOS,arch=x86_64" + # - xcode_project: Apollo.xcodeproj + # xcode_scheme: Apollo + # xcode_sdk: appletvsimulator10.2 + # env: DESTINATION="platform=tvOS Simulator,OS=10.2,name=Apple TV 1080p" - xcode_project: ApolloSQLite.xcodeproj xcode_scheme: ApolloSQLite xcode_sdk: iphonesimulator10.3 env: DESTINATION="platform=iOS Simulator,OS=10.3,name=iPhone 7" - - xcode_project: ApolloSQLite.xcodeproj - xcode_scheme: ApolloSQLite - xcode_sdk: iphonesimulator10.3 - env: DESTINATION="platform=iOS Simulator,OS=9.3,name=iPhone 6s" + # - xcode_project: ApolloSQLite.xcodeproj + # xcode_scheme: ApolloSQLite + # xcode_sdk: iphonesimulator10.3 + # env: DESTINATION="platform=iOS Simulator,OS=9.3,name=iPhone 6s" - xcode_project: ApolloSQLite.xcodeproj xcode_scheme: ApolloSQLite xcode_sdk: macosx10.12 From 76de54559788e19272ca06b79d9e57ff59a39549 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Fri, 21 Apr 2017 10:32:20 -0700 Subject: [PATCH 72/76] Keep trying things to prevent CI crash --- ApolloSQLite/Tests/TestCacheProvider.swift | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/ApolloSQLite/Tests/TestCacheProvider.swift b/ApolloSQLite/Tests/TestCacheProvider.swift index aaaaac8784..68ea850e0e 100644 --- a/ApolloSQLite/Tests/TestCacheProvider.swift +++ b/ApolloSQLite/Tests/TestCacheProvider.swift @@ -19,17 +19,6 @@ enum TestCacheProvider { private static var sqliteFileURL: URL { let appSupportPath = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).first! let appSupportURL = URL(fileURLWithPath: appSupportPath) - let directoryURL: URL - if let bundleIdentifier = Bundle.main.bundleIdentifier { - directoryURL = appSupportURL.appendingPathComponent(bundleIdentifier) - } - else { - directoryURL = appSupportURL - } - try! FileManager.default.createDirectory( - atPath: directoryURL.path, - withIntermediateDirectories: true, - attributes: nil) - return directoryURL.appendingPathComponent("db.sqlite3") + return appSupportURL.appendingPathComponent("db.sqlite3") } } From cab7b64b1c2efa709300c9d2814136054d000b8c Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Fri, 21 Apr 2017 10:46:59 -0700 Subject: [PATCH 73/76] Keep trying things to prevent CI crash --- ApolloSQLite/Tests/TestCacheProvider.swift | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ApolloSQLite/Tests/TestCacheProvider.swift b/ApolloSQLite/Tests/TestCacheProvider.swift index 68ea850e0e..039f1abb78 100644 --- a/ApolloSQLite/Tests/TestCacheProvider.swift +++ b/ApolloSQLite/Tests/TestCacheProvider.swift @@ -17,8 +17,12 @@ enum TestCacheProvider { } private static var sqliteFileURL: URL { - let appSupportPath = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).first! - let appSupportURL = URL(fileURLWithPath: appSupportPath) - return appSupportURL.appendingPathComponent("db.sqlite3") + #if os(OSX) + let directoryPath = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).first! + #else + let directoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! + #endif + let directoryURL = URL(fileURLWithPath: directoryPath) + return directoryURL.appendingPathComponent("db.sqlite3") } } From 95cd1afb9e6db99aaa8bad16dd51b1f77e131ab2 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Fri, 21 Apr 2017 12:06:20 -0700 Subject: [PATCH 74/76] Keep trying things to prevent CI crash --- .../Tests/CachePersistenceTests.swift | 5 ++-- ApolloSQLite/Tests/TestCacheProvider.swift | 25 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/ApolloSQLite/Tests/CachePersistenceTests.swift b/ApolloSQLite/Tests/CachePersistenceTests.swift index b91aba3ebc..f51c4a763d 100644 --- a/ApolloSQLite/Tests/CachePersistenceTests.swift +++ b/ApolloSQLite/Tests/CachePersistenceTests.swift @@ -6,8 +6,9 @@ class CachePersistenceTests: XCTestCase { func testFetchAndPersist() { let query = HeroNameQuery() + let sqliteFileURL = TestCacheProvider.temporarySQLiteFileURL() - TestCacheProvider.withCache { (cache) in + TestCacheProvider.withCache(fileURL: sqliteFileURL) { (cache) in let store = ApolloStore(cache: cache) let networkTransport = MockNetworkTransport(body: [ "data": [ @@ -29,7 +30,7 @@ class CachePersistenceTests: XCTestCase { // Do another fetch from cache to ensure that data is cached before creating new cache client.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in - TestCacheProvider.withCache(clearCache: false) { (cache) in + TestCacheProvider.withCache(fileURL: sqliteFileURL) { (cache) in let newStore = ApolloStore(cache: cache) let newClient = ApolloClient(networkTransport: networkTransport, store: newStore) newClient.fetch(query: query, cachePolicy: .returnCacheDataDontFetch) { (result, error) in diff --git a/ApolloSQLite/Tests/TestCacheProvider.swift b/ApolloSQLite/Tests/TestCacheProvider.swift index 039f1abb78..71611ad24d 100644 --- a/ApolloSQLite/Tests/TestCacheProvider.swift +++ b/ApolloSQLite/Tests/TestCacheProvider.swift @@ -5,24 +5,23 @@ enum TestCacheProvider { /// Execute a test block rather than return a cache synchronously, since cache setup may be /// asynchronous at some point. - static func withCache(initialRecords: RecordSet? = nil, clearCache: Bool = true, execute test: (NormalizedCache) -> ()) { - if clearCache { - try? FileManager.default.removeItem(at: sqliteFileURL) - } - let cache = try! SQLiteNormalizedCache(fileURL: sqliteFileURL) + static func withCache(initialRecords: RecordSet? = nil, fileURL: URL? = nil, execute test: (NormalizedCache) -> ()) { + let fileURL = fileURL ?? temporarySQLiteFileURL() + let cache = try! SQLiteNormalizedCache(fileURL: fileURL) if let initialRecords = initialRecords { _ = cache.merge(records: initialRecords) // This is synchronous } test(cache) } - private static var sqliteFileURL: URL { - #if os(OSX) - let directoryPath = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).first! - #else - let directoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first! - #endif - let directoryURL = URL(fileURLWithPath: directoryPath) - return directoryURL.appendingPathComponent("db.sqlite3") + static func temporarySQLiteFileURL() -> URL { + let applicationSupportPath = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).first! + let applicationSupportURL = URL(fileURLWithPath: applicationSupportPath) + let temporaryDirectoryURL = try! FileManager.default.url( + for: .itemReplacementDirectory, + in: .userDomainMask, + appropriateFor: applicationSupportURL, + create: true) + return temporaryDirectoryURL.appendingPathComponent("db.sqlite3") } } From 5e4e3b509ce05a0ca3c06741f9fc73eba4a272a9 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Fri, 21 Apr 2017 12:53:06 -0700 Subject: [PATCH 75/76] Revert "Temporarily disable all tests except ApolloSQLite, for the purpose of debuggin CI-only crash" This reverts commit 28feedf81158ad6f2cbb014f9aabed8b502f158b. --- .travis.yml | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/.travis.yml b/.travis.yml index eb5b38d409..42c2736f31 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,30 +4,30 @@ osx_image: xcode8.3 matrix: include: - # - xcode_project: Apollo.xcodeproj - # xcode_scheme: Apollo - # xcode_sdk: iphonesimulator10.3 - # env: DESTINATION="platform=iOS Simulator,OS=10.3,name=iPhone 7" - # - xcode_project: Apollo.xcodeproj - # xcode_scheme: Apollo - # xcode_sdk: iphonesimulator10.3 - # env: DESTINATION="platform=iOS Simulator,OS=9.3,name=iPhone 6s" - # - xcode_project: Apollo.xcodeproj - # xcode_scheme: Apollo - # xcode_sdk: macosx10.12 - # env: DESTINATION="platform=macOS,arch=x86_64" - # - xcode_project: Apollo.xcodeproj - # xcode_scheme: Apollo - # xcode_sdk: appletvsimulator10.2 - # env: DESTINATION="platform=tvOS Simulator,OS=10.2,name=Apple TV 1080p" + - xcode_project: Apollo.xcodeproj + xcode_scheme: Apollo + xcode_sdk: iphonesimulator10.3 + env: DESTINATION="platform=iOS Simulator,OS=10.3,name=iPhone 7" + - xcode_project: Apollo.xcodeproj + xcode_scheme: Apollo + xcode_sdk: iphonesimulator10.3 + env: DESTINATION="platform=iOS Simulator,OS=9.3,name=iPhone 6s" + - xcode_project: Apollo.xcodeproj + xcode_scheme: Apollo + xcode_sdk: macosx10.12 + env: DESTINATION="platform=macOS,arch=x86_64" + - xcode_project: Apollo.xcodeproj + xcode_scheme: Apollo + xcode_sdk: appletvsimulator10.2 + env: DESTINATION="platform=tvOS Simulator,OS=10.2,name=Apple TV 1080p" - xcode_project: ApolloSQLite.xcodeproj xcode_scheme: ApolloSQLite xcode_sdk: iphonesimulator10.3 env: DESTINATION="platform=iOS Simulator,OS=10.3,name=iPhone 7" - # - xcode_project: ApolloSQLite.xcodeproj - # xcode_scheme: ApolloSQLite - # xcode_sdk: iphonesimulator10.3 - # env: DESTINATION="platform=iOS Simulator,OS=9.3,name=iPhone 6s" + - xcode_project: ApolloSQLite.xcodeproj + xcode_scheme: ApolloSQLite + xcode_sdk: iphonesimulator10.3 + env: DESTINATION="platform=iOS Simulator,OS=9.3,name=iPhone 6s" - xcode_project: ApolloSQLite.xcodeproj xcode_scheme: ApolloSQLite xcode_sdk: macosx10.12 From 998c1d27beb8291423a2d1f40d576cf1385c4513 Mon Sep 17 00:00:00 2001 From: Paul Kompfner Date: Fri, 21 Apr 2017 12:54:40 -0700 Subject: [PATCH 76/76] =?UTF-8?q?Disable=20unit=20tests=20on=20iOS=209.3?= =?UTF-8?q?=20for=20now,=20since=20that=20simulator=20doesn=E2=80=99t=20se?= =?UTF-8?q?em=20to=20be=20available=20on=20Travis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 42c2736f31..1dc7befd9b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,10 +8,10 @@ matrix: xcode_scheme: Apollo xcode_sdk: iphonesimulator10.3 env: DESTINATION="platform=iOS Simulator,OS=10.3,name=iPhone 7" - - xcode_project: Apollo.xcodeproj - xcode_scheme: Apollo - xcode_sdk: iphonesimulator10.3 - env: DESTINATION="platform=iOS Simulator,OS=9.3,name=iPhone 6s" + # - xcode_project: Apollo.xcodeproj + # xcode_scheme: Apollo + # xcode_sdk: iphonesimulator10.3 + # env: DESTINATION="platform=iOS Simulator,OS=9.3,name=iPhone 6s" - xcode_project: Apollo.xcodeproj xcode_scheme: Apollo xcode_sdk: macosx10.12 @@ -24,10 +24,10 @@ matrix: xcode_scheme: ApolloSQLite xcode_sdk: iphonesimulator10.3 env: DESTINATION="platform=iOS Simulator,OS=10.3,name=iPhone 7" - - xcode_project: ApolloSQLite.xcodeproj - xcode_scheme: ApolloSQLite - xcode_sdk: iphonesimulator10.3 - env: DESTINATION="platform=iOS Simulator,OS=9.3,name=iPhone 6s" + # - xcode_project: ApolloSQLite.xcodeproj + # xcode_scheme: ApolloSQLite + # xcode_sdk: iphonesimulator10.3 + # env: DESTINATION="platform=iOS Simulator,OS=9.3,name=iPhone 6s" - xcode_project: ApolloSQLite.xcodeproj xcode_scheme: ApolloSQLite xcode_sdk: macosx10.12