diff --git a/.fastlane/Fastfile b/.fastlane/Fastfile index ef3b9c3..ef789f7 100644 --- a/.fastlane/Fastfile +++ b/.fastlane/Fastfile @@ -6,15 +6,15 @@ platform :ios do desc "Runs all the tests" lane :test do - + scan( - scheme: 'YapDatabaseExtensions', + scheme: 'YapDatabaseExtensions', output_directory: ".ci/xcodebuild-data", - destination: "platform=iOS Simulator,OS=10.1,name=iPhone 7" + destination: "platform=iOS Simulator,OS=11.1,name=iPhone 7" ) end - + end platform :mac do @@ -25,13 +25,13 @@ platform :mac do desc "Runs all the tests" lane :test do - + scan( - scheme: 'YapDatabaseExtensions', + scheme: 'YapDatabaseExtensions', output_directory: ".ci/xcodebuild-data", destination: "platform=OS X" ) end - + end diff --git a/.ruby-version b/.ruby-version new file mode 100644 index 0000000..197c4d5 --- /dev/null +++ b/.ruby-version @@ -0,0 +1 @@ +2.4.0 diff --git a/.swift-version b/.swift-version index c0943d3..5186d07 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -2.3 \ No newline at end of file +4.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index db04f93..17448b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# 4.0.0 +1. Updated for Swift 4.0 + +# 3.0.0 +1. Separated Metadata from Objects (removed `metadata` from `Persistable`) +2. Updated for Swift 3.0 +4. Use `map` instead of `flatMap` when reading multiple objects so the order of the output corresponds to the order of the input. + # 2.6.0 Updated for Swift 2.3 - sorry it's taken so long! @@ -50,7 +58,7 @@ Thanks a lot to Ryan ([@aranasaurus](https://github.com/aranasaurus)) for helpin # 2.1.0 1. [[YDB-42](https://github.com/danthorpe/YapDatabaseExtensions/pull/42)]: Refactors read & write API, correctly supporting metadata. 2. [[YDB-43](https://github.com/danthorpe/YapDatabaseExtensions/pull/43)]: Makes project cross-platform (iOS & Mac OS) -3. [[YDB-44](https://github.com/danthorpe/YapDatabaseExtensions/pull/44)]: Enables code coverage reporting with CodeCov.io, see reports [here](https://codecov.io/github/danthorpe/YapDatabaseExtensions). +3. [[YDB-44](https://github.com/danthorpe/YapDatabaseExtensions/pull/44)]: Enables code coverage reporting with CodeCov.io, see reports [here](https://codecov.io/github/danthorpe/YapDatabaseExtensions). 4. [[YDB-45](https://github.com/danthorpe/YapDatabaseExtensions/pull/45)]: Adds back functional API. 5. [[YDB-47](https://github.com/danthorpe/YapDatabaseExtensions/pull/47)]: Updates README. 6. [[YDB-48](https://github.com/danthorpe/YapDatabaseExtensions/pull/48)]: Removes `Saveable`, created [ValueCoding](https://github.com/danthorpe/ValueCoding) as a standalone project and new dependency. @@ -72,7 +80,7 @@ Thanks a lot to Ryan ([@aranasaurus](https://github.com/aranasaurus)) for helpin 4. [[YDB-29](https://github.com/danthorpe/YapDatabaseExtensions/pull/29)]: Adds support to `YapDatabaseConnection` for writeBlockOperation (`NSBlockOperation`), write and remove APIs. This is great if you want to perform a number of writes of different types in the same transaction inside of an `NSOperation` based architecture, as you can do: ```swift -queue.addOperation(connection.writeBlockOperation { transaction in +queue.addOperation(connection.writeBlockOperation { transaction in transaction.write(foo) transaction.write(bar) transaction.remove(bat) @@ -81,7 +89,7 @@ queue.addOperation(connection.writeBlockOperation { transaction in If you're using my `Operations` framework, as these operations are `NSBlockOperation`s, use `ComposedOperation` to attach conditions or observers. E.g. ```swift -let write = ComposedOperation(connection.writeBlockOperation { transaction in +let write = ComposedOperation(connection.writeBlockOperation { transaction in transaction.write(foo) transaction.write(bar) transaction.remove(bat) @@ -120,7 +128,7 @@ queue.addOperation(write) # 1.1.1 -1. [[YDB-11](https://github.com/danthorpe/YapDatabaseExtensions/pull/11)]: Renames `YapDatabase.Index` to `YapDB.Index`. +1. [[YDB-11](https://github.com/danthorpe/YapDatabaseExtensions/pull/11)]: Renames `YapDatabase.Index` to `YapDB.Index`. # 1.1.0 diff --git a/Cartfile b/Cartfile index 034481a..c533da3 100644 --- a/Cartfile +++ b/Cartfile @@ -1,3 +1,2 @@ -github "danthorpe/ValueCoding" "1.5.0" -github "CocoaLumberjack/CocoaLumberjack" "2.4.0" -github "yapstudios/YapDatabase" "2.9.2" \ No newline at end of file +github "danthorpe/ValueCoding" ~> 3.0.0 +github "yapstudios/YapDatabase" ~> 3.0.0 diff --git a/Cartfile.resolved b/Cartfile.resolved index 8ae8b91..f4c9ab0 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,4 +1,3 @@ -github "CocoaLumberjack/CocoaLumberjack" "2.4.0" -github "tonymillion/Reachability" "c4d225a479379f9998dbd5b55070427373d20574" -github "danthorpe/ValueCoding" "1.5.0" -github "yapstudios/YapDatabase" "2.9.2" +github "CocoaLumberjack/CocoaLumberjack" "3.3.0" +github "danthorpe/ValueCoding" "3.0.0" +github "yapstudios/YapDatabase" "3.0.2" diff --git a/Gemfile.lock b/Gemfile.lock index b7cdf05..c887d2e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,296 +1,202 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (2.3.4) + CFPropertyList (2.3.5) RubyInline (3.12.4) ZenTest (~> 4.3) ZenTest (4.11.1) - activesupport (4.2.7.1) + activesupport (4.2.10) i18n (~> 0.7) - json (~> 1.7, >= 1.7.7) minitest (~> 5.1) thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) - addressable (2.5.0) - public_suffix (~> 2.0, >= 2.0.2) + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) babosa (1.0.2) - cert (1.4.4) - fastlane_core (>= 0.55.0, < 1.0.0) - spaceship (>= 0.37.0, < 1.0.0) - claide (1.0.1) + claide (1.0.2) clamp (0.6.5) - cocoapods (1.1.1) + cocoapods (1.3.1) activesupport (>= 4.0.2, < 5) - claide (>= 1.0.1, < 2.0) - cocoapods-core (= 1.1.1) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.3.1) cocoapods-deintegrate (>= 1.0.1, < 2.0) - cocoapods-downloader (>= 1.1.2, < 2.0) + cocoapods-downloader (>= 1.1.3, < 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-trunk (>= 1.2.0, < 2.0) cocoapods-try (>= 1.1.0, < 2.0) - colored (~> 1.2) + colored2 (~> 3.1) escape (~> 0.0.4) fourflusher (~> 2.0.1) gh_inspector (~> 1.0) - molinillo (~> 0.5.1) + molinillo (~> 0.5.7) nap (~> 1.0) - xcodeproj (>= 1.3.3, < 2.0) - cocoapods-core (1.1.1) - activesupport (>= 4.0.2, < 5) + ruby-macho (~> 1.1) + xcodeproj (>= 1.5.1, < 2.0) + cocoapods-core (1.3.1) + activesupport (>= 4.0.2, < 6) fuzzy_match (~> 2.0.4) nap (~> 1.0) cocoapods-deintegrate (1.0.1) - cocoapods-downloader (1.1.2) - cocoapods-keys (1.7.0) + cocoapods-downloader (1.1.3) + cocoapods-keys (2.0.0) dotenv osx_keychain cocoapods-plugins (1.0.0) nap cocoapods-search (1.0.0) cocoapods-stats (1.0.0) - cocoapods-trunk (1.1.1) + cocoapods-trunk (1.3.0) nap (>= 0.8, < 2.0) - netrc (= 0.7.8) + netrc (~> 0.11) cocoapods-try (1.1.0) colored (1.2) - commander (4.4.1) + colored2 (3.1.2) + commander-fastlane (4.4.5) highline (~> 1.7.2) - credentials_manager (0.16.2) - colored - commander (>= 4.3.5) - highline (>= 1.7.1) - security - deliver (1.16.1) - credentials_manager (>= 0.16.2, < 1.0.0) - fastimage (~> 1.6) - fastlane_core (>= 0.58.0, < 1.0.0) - plist (>= 3.1.0, < 4.0.0) - spaceship (>= 0.38.5, < 1.0.0) - domain_name (0.5.20161129) + concurrent-ruby (1.0.5) + declarative (0.0.10) + declarative-option (0.1.0) + domain_name (0.5.20170404) unf (>= 0.0.5, < 1.0.0) - dotenv (2.1.1) + dotenv (2.2.1) escape (0.0.4) - excon (0.54.0) - faraday (0.10.0) + excon (0.59.0) + faraday (0.13.1) multipart-post (>= 1.2, < 3) faraday-cookie_jar (0.0.6) faraday (>= 0.7.4) http-cookie (~> 1.0.0) - faraday_middleware (0.10.1) + faraday_middleware (0.12.2) faraday (>= 0.7.4, < 1.0) - fastimage (1.6.8) - addressable (~> 2.3, >= 2.3.5) - fastlane (1.111.0) - activesupport (< 5) + fastimage (2.1.0) + fastlane (2.64.0) + CFPropertyList (>= 2.3, < 3.0.0) addressable (>= 2.3, < 3.0.0) - bundler (~> 1.12) - cert (>= 1.4.4, < 2.0.0) - credentials_manager (>= 0.16.2, < 1.0.0) - deliver (>= 1.15.1, < 2.0.0) - fastlane_core (>= 0.57.1, < 1.0.0) - frameit (>= 3.0.0, < 4.0.0) - gym (>= 1.12.1, < 2.0.0) - krausefx-shenzhen (>= 0.14.11, < 1.0.0) - match (>= 0.11.0, < 1.0.0) + babosa (>= 1.0.2, < 2.0.0) + bundler (>= 1.12.0, < 2.0.0) + colored + commander-fastlane (>= 4.4.5, < 5.0.0) + dotenv (>= 2.1.1, < 3.0.0) + excon (>= 0.45.0, < 1.0.0) + faraday (~> 0.9) + faraday-cookie_jar (~> 0.0.6) + faraday_middleware (~> 0.9) + fastimage (>= 2.1.0, < 3.0.0) + gh_inspector (>= 1.0.1, < 2.0.0) + google-api-client (>= 0.13.1, < 0.14.0) + highline (>= 1.7.2, < 2.0.0) + json (< 3.0.0) + mini_magick (~> 4.5.1) + multi_json + multi_xml (~> 0.5) multipart-post (~> 2.0.0) - pem (>= 1.4.0, < 2.0.0) - pilot (>= 1.12.1, < 2.0.0) plist (>= 3.1.0, < 4.0.0) - produce (>= 1.3.1, < 2.0.0) - scan (>= 0.14.2, < 1.0.0) - screengrab (>= 0.5.2, < 1.0.0) - sigh (>= 1.11.2, < 2.0.0) + public_suffix (~> 2.0.0) + rubyzip (>= 1.1.0, < 2.0.0) + security (= 0.1.3) slack-notifier (>= 1.3, < 2.0.0) - snapshot (>= 1.16.4, < 2.0.0) - spaceship (>= 0.38.1, < 1.0.0) - supply (>= 0.8.0, < 1.0.0) terminal-notifier (>= 1.6.2, < 2.0.0) terminal-table (>= 1.4.5, < 2.0.0) + tty-screen (~> 0.5.0) word_wrap (~> 1.0.0) - xcode-install (~> 2.0.0) - xcodeproj (>= 0.20, < 2.0.0) + xcodeproj (>= 1.5.0, < 2.0.0) xcpretty (>= 0.2.4, < 1.0.0) - fastlane_core (0.58.0) - colored - commander (>= 4.4.0, <= 5.0.0) - credentials_manager (>= 0.16.2, < 1.0.0) - excon (>= 0.45.0, < 1.0) - gh_inspector (>= 1.0.1, < 2.0.0) - highline (>= 1.7.2) - json - multi_json - plist (>= 3.1.0, < 4.0.0) - rubyzip (~> 1.1.6) - terminal-table (>= 1.4.5, < 2.0.0) + xcpretty-travis-formatter (>= 0.0.3) fourflusher (2.0.1) - frameit (3.0.0) - deliver (> 0.3) - fastimage (~> 1.6.3) - fastlane_core (>= 0.53.0, < 1.0.0) - mini_magick (~> 4.5.1) fuzzy_match (2.0.4) - gh_inspector (1.0.2) - google-api-client (0.9.20) - addressable (~> 2.3) + gh_inspector (1.0.3) + google-api-client (0.13.6) + addressable (~> 2.5, >= 2.5.1) googleauth (~> 0.5) - httpclient (~> 2.7) - hurley (~> 0.1) - memoist (~> 0.11) - mime-types (>= 1.6) - representable (~> 2.3.0) - retriable (~> 2.0) - googleauth (0.5.1) - faraday (~> 0.9) - jwt (~> 1.4) + httpclient (>= 2.8.1, < 3.0) + mime-types (~> 3.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.0) + googleauth (0.6.1) + faraday (~> 0.12) + jwt (>= 1.4, < 3.0) logging (~> 2.0) memoist (~> 0.12) multi_json (~> 1.11) os (~> 0.9) signet (~> 0.7) - gym (1.12.1) - fastlane_core (>= 0.57.0, < 1.0.0) - plist (>= 3.1.0, < 4.0.0) - rubyzip (>= 1.1.7) - terminal-table (>= 1.4.5, < 2.0.0) - xcpretty (>= 0.2.4, < 1.0.0) highline (1.7.8) http-cookie (1.0.3) domain_name (~> 0.5) - httpclient (2.8.2.4) - hurley (0.2) - i18n (0.7.0) - json (1.8.3) - jwt (1.5.6) - krausefx-shenzhen (0.14.11) - commander (>= 4.3, < 5.0) - dotenv (>= 0.7) - faraday (~> 0.9) - faraday_middleware (~> 0.9) - highline (>= 1.7.2) - json (~> 1.8) - net-sftp (~> 2.1.2) - plist (>= 3.1.0, < 4.0.0) - rubyzip (~> 1.1) - security (~> 0.1.3) - terminal-table (~> 1.4.5) + httpclient (2.8.3) + i18n (0.9.1) + concurrent-ruby (~> 1.0) + json (2.1.0) + jwt (2.1.0) little-plugger (1.1.4) - logging (2.1.0) + logging (2.2.2) little-plugger (~> 1.1) multi_json (~> 1.10) - match (0.11.1) - cert (>= 1.4.4, < 2.0.0) - credentials_manager (>= 0.16.2, < 1.0.0) - fastlane_core (>= 0.58.0, < 1.0.0) - security - sigh (>= 1.12.1, < 2.0.0) - spaceship (>= 0.38.5, < 1.0.0) - memoist (0.15.0) + memoist (0.16.0) mime-types (3.1) mime-types-data (~> 3.2015) mime-types-data (3.2016.0521) mini_magick (4.5.1) mini_portile2 (2.1.0) - minitest (5.10.1) - molinillo (0.5.4) - multi_json (1.12.1) + minitest (5.10.3) + molinillo (0.5.7) + multi_json (1.12.2) multi_xml (0.6.0) multipart-post (2.0.0) nanaimo (0.2.3) nap (1.1.0) - net-sftp (2.1.2) - net-ssh (>= 2.6.5) - net-ssh (3.2.0) - netrc (0.7.8) + netrc (0.11.0) nokogiri (1.6.8.1) mini_portile2 (~> 2.1.0) os (0.9.6) osx_keychain (1.0.1) RubyInline (~> 3) - pem (1.4.1) - fastlane_core (>= 0.58.0, < 1.0.0) - spaceship (>= 0.38.5, < 1.0.0) - pilot (1.12.1) - credentials_manager (>= 0.16.0) - fastlane_core (>= 0.56.0, < 1.0.0) - spaceship (>= 0.37.0, < 1.0.0) - terminal-table (>= 1.4.5, < 2.0.0) - plist (3.2.0) - produce (1.3.2) - fastlane_core (>= 0.57.2, < 1.0.0) - spaceship (>= 0.38.4, < 1.0.0) - public_suffix (2.0.4) - representable (2.3.0) - uber (~> 0.0.7) - retriable (2.1.0) - rouge (1.11.1) - rubyzip (1.1.7) - scan (0.14.2) - fastlane_core (>= 0.57.0, < 1.0.0) - slack-notifier (~> 1.3) - terminal-table (>= 1.4.5, < 2.0.0) - xcpretty (>= 0.2.4, < 1.0.0) - xcpretty-travis-formatter (>= 0.0.3) - screengrab (0.5.6) - fastlane_core (>= 0.55.0, < 1.0.0) + plist (3.3.0) + public_suffix (2.0.5) + representable (3.0.4) + declarative (< 0.1.0) + declarative-option (< 0.2.0) + uber (< 0.2.0) + retriable (3.1.1) + rouge (2.0.7) + ruby-macho (1.1.0) + rubyzip (1.2.1) security (0.1.3) - sigh (1.12.1) - fastlane_core (>= 0.57.2, < 1.0.0) - plist (>= 3.1.0, < 4.0.0) - spaceship (>= 0.38.4, < 1.0.0) - signet (0.7.3) + signet (0.8.1) addressable (~> 2.3) faraday (~> 0.9) - jwt (~> 1.5) + jwt (>= 1.5, < 3.0) multi_json (~> 1.10) slack-notifier (1.5.1) - slather (2.3.0) + slather (2.4.3) + CFPropertyList (~> 2.2) activesupport (>= 4.0.2, < 5) clamp (~> 0.6) - nokogiri (~> 1.6.3) - xcodeproj (>= 0.20, < 2.0.0) - snapshot (1.16.4) - fastimage (~> 1.6.3) - fastlane_core (>= 0.57.0, < 1.0.0) - plist (>= 3.1.0, < 4.0.0) - xcpretty (>= 0.2.4, < 1.0.0) - spaceship (0.38.5) - babosa (= 1.0.2) - colored - credentials_manager (>= 0.16.0) - faraday (~> 0.9) - faraday-cookie_jar (~> 0.0.6) - faraday_middleware (~> 0.9) - fastimage (~> 1.6) - multi_xml (~> 0.5) - plist (>= 3.1.0, < 4.0.0) - supply (0.8.0) - credentials_manager (>= 0.16.0) - fastlane_core (>= 0.52.0) - google-api-client (~> 0.9.1) - terminal-notifier (1.7.1) - terminal-table (1.4.5) - thread_safe (0.3.5) - tzinfo (1.2.2) + nokogiri (>= 1.6, < 1.7) + xcodeproj (~> 1.4) + terminal-notifier (1.8.0) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + thread_safe (0.3.6) + tty-screen (0.5.1) + tzinfo (1.2.4) thread_safe (~> 0.1) - uber (0.0.15) + uber (0.1.0) unf (0.1.4) unf_ext - unf_ext (0.0.7.2) + unf_ext (0.0.7.4) + unicode-display_width (1.3.0) word_wrap (1.0.0) - xcode-install (2.0.9) - claide (>= 0.9.1, < 1.1.0) - spaceship (>= 0.25.1, < 1.0.0) - xcodeproj (1.4.1) + xcodeproj (1.5.3) CFPropertyList (~> 2.3.3) - activesupport (>= 3) - claide (>= 1.0.1, < 2.0) - colored (~> 1.2) - nanaimo (~> 0.2.0) - xcpretty (0.2.4) - rouge (~> 1.8) - xcpretty-travis-formatter (0.0.4) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.2.3) + xcpretty (0.2.8) + rouge (~> 2.0.7) + xcpretty-travis-formatter (1.0.0) xcpretty (~> 0.2, >= 0.0.7) PLATFORMS @@ -304,4 +210,4 @@ DEPENDENCIES xcpretty BUNDLED WITH - 1.13.6 + 1.15.4 diff --git a/README.md b/README.md index 9292a00..bfad29e 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ public protocol Persistable: Identifiable { static var collection: String { get } var metadata: MetadataType? { get set } } -``` +``` The `identifier` property allows the type to support an identifier type such as `NSUUID` or `Int`. @@ -89,7 +89,7 @@ The following “functional” APIs are available directly on the `YapDatabase` let connection = db.newConnection() // Write a single item -connection.write(item) +connection.write(item) // Write an array of items, using one transaction. connection.write(items) @@ -101,13 +101,13 @@ connection.asyncWrite(items) { print(“did finish writing”) } // Create a write transaction block for multiple writes. connection.write { transaction in transaction.write(item) - transaction.write(items) + transaction.write(items) } // Write many items asynchronously connection.asyncWrite({ transaction in transaction.write(item) - transaction.write(items) + transaction.write(items) }, completion: { print(“did finish writing”) }) ``` @@ -160,7 +160,7 @@ item.asyncWrite(connection) { written in // Return an NSOperation which will perform an sync write on a YapDatabaseConnection. let write: NSOperation = item.write(connection) -``` +``` Reading items from the database is a little different. @@ -187,7 +187,7 @@ if let allItems = Item.read(transaction).all() { // Get the Items which exist for the given keys, and return the [String] keys which are missing. let (items, missingKeys) = Item.read(transaction).filterExisting(someKeys) -``` +``` Similarly, to work directly on a `YapDatabaseConnection`, use the following: diff --git a/Sources/Curried_ObjectWithNoMetadata.swift b/Sources/Curried_ObjectWithNoMetadata.swift index 55d7062..6429cb5 100644 --- a/Sources/Curried_ObjectWithNoMetadata.swift +++ b/Sources/Curried_ObjectWithNoMetadata.swift @@ -12,8 +12,7 @@ import ValueCoding // MARK: - Persistable extension Persistable where - Self: NSCoding, - Self.MetadataType == Void { + Self: NSCoding { /** Returns a closure which, given a read transaction will return @@ -23,8 +22,8 @@ extension Persistable where - returns: a (ReadTransaction) -> Self? closure. */ public static func readAtIndex< - ReadTransaction where - ReadTransaction: ReadTransactionType>(index: YapDB.Index) -> ReadTransaction -> Self? { + ReadTransaction>(_ index: YapDB.Index) -> (ReadTransaction) -> Self? where + ReadTransaction: ReadTransactionType { return { $0.readAtIndex(index) } } @@ -36,10 +35,10 @@ extension Persistable where - returns: a (ReadTransaction) -> [Self] closure. */ public static func readAtIndexes< - Indexes, ReadTransaction where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ReadTransaction: ReadTransactionType>(indexes: Indexes) -> ReadTransaction -> [Self] { + Indexes, ReadTransaction>(_ indexes: Indexes) -> (ReadTransaction) -> [Self?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + ReadTransaction: ReadTransactionType { return { $0.readAtIndexes(indexes) } } @@ -51,8 +50,8 @@ extension Persistable where - returns: a (ReadTransaction) -> Self? closure. */ public static func readByKey< - ReadTransaction where - ReadTransaction: ReadTransactionType>(key: String) -> ReadTransaction -> Self? { + ReadTransaction>(_ key: String) -> (ReadTransaction) -> Self? where + ReadTransaction: ReadTransactionType { return { $0.readByKey(key) } } @@ -64,10 +63,10 @@ extension Persistable where - returns: a (ReadTransaction) -> [Self] closure. */ public static func readByKeys< - Keys, ReadTransaction where - Keys: SequenceType, - Keys.Generator.Element == String, - ReadTransaction: ReadTransactionType>(keys: Keys) -> ReadTransaction -> [Self] { + Keys, ReadTransaction>(_ keys: Keys) -> (ReadTransaction) -> [Self?] where + Keys: Sequence, + Keys.Iterator.Element == String, + ReadTransaction: ReadTransactionType { return { $0.readAtIndexes(Self.indexesWithKeys(keys)) } } @@ -78,7 +77,7 @@ extension Persistable where - warning: Be aware that this will capure `self`. - returns: a (WriteTransaction) -> Self closure */ - public func write() -> WriteTransaction -> Self { + public func write() -> (WriteTransaction) -> Self { return { $0.write(self) } } } diff --git a/Sources/Curried_ObjectWithObjectMetadata.swift b/Sources/Curried_ObjectWithObjectMetadata.swift index d763a90..9ea47fe 100644 --- a/Sources/Curried_ObjectWithObjectMetadata.swift +++ b/Sources/Curried_ObjectWithObjectMetadata.swift @@ -12,8 +12,7 @@ import ValueCoding // MARK: - Persistable extension Persistable where - Self: NSCoding, - Self.MetadataType: NSCoding { + Self: NSCoding { /** Returns a closure which, given a read transaction will return @@ -22,10 +21,11 @@ extension Persistable where - parameter index: a YapDB.Index - returns: a (ReadTransaction) -> Self? closure. */ - public static func readAtIndex< - ReadTransaction where - ReadTransaction: ReadTransactionType>(index: YapDB.Index) -> ReadTransaction -> Self? { - return { $0.readAtIndex(index) } + public static func readWithMetadataAtIndex< + ReadTransaction, Metadata>(_ index: YapDB.Index) -> (ReadTransaction) -> YapItem? where + ReadTransaction: ReadTransactionType, + Metadata: NSCoding { + return { $0.readWithMetadataAtIndex(index) } } /** @@ -35,12 +35,13 @@ extension Persistable where - parameter indexes: a SequenceType of YapDB.Index values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readAtIndexes< - Indexes, ReadTransaction where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ReadTransaction: ReadTransactionType>(indexes: Indexes) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(indexes) } + public static func readWithMetadataAtIndexes< + Indexes, ReadTransaction, Metadata>(_ indexes: Indexes) -> (ReadTransaction) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + ReadTransaction: ReadTransactionType, + Metadata: NSCoding { + return { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -50,10 +51,11 @@ extension Persistable where - parameter key: a String - returns: a (ReadTransaction) -> Self? closure. */ - public static func readByKey< - ReadTransaction where - ReadTransaction: ReadTransactionType>(key: String) -> ReadTransaction -> Self? { - return { $0.readByKey(key) } + public static func readWithMetadataByKey< + ReadTransaction, Metadata>(_ key: String) -> (ReadTransaction) -> YapItem? where + ReadTransaction: ReadTransactionType, + Metadata: NSCoding { + return { $0.readWithMetadataByKey(key) } } /** @@ -63,12 +65,13 @@ extension Persistable where - parameter keys: a SequenceType of String values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readByKeys< - Keys, ReadTransaction where - Keys: SequenceType, - Keys.Generator.Element == String, - ReadTransaction: ReadTransactionType>(keys: Keys) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(Self.indexesWithKeys(keys)) } + public static func readWithMetadataByKeys< + Keys, ReadTransaction, Metadata>(_ keys: Keys) -> (ReadTransaction) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + ReadTransaction: ReadTransactionType, + Metadata: NSCoding { + return { $0.readWithMetadataAtIndexes(Self.indexesWithKeys(keys)) } } /** @@ -78,7 +81,10 @@ extension Persistable where - warning: Be aware that this will capure `self`. - returns: a (WriteTransaction) -> Self closure */ - public func write() -> WriteTransaction -> Self { - return { $0.write(self) } + public func writeWithMetadata< + WriteTransaction, Metadata>(_ metadata: Metadata? = nil) -> (WriteTransaction) -> YapItem where + WriteTransaction: WriteTransactionType, + Metadata: NSCoding { + return { $0.writeWithMetadata(YapItem(self, metadata)) } } } diff --git a/Sources/Curried_ObjectWithValueMetadata.swift b/Sources/Curried_ObjectWithValueMetadata.swift index 6690f2f..be14cda 100644 --- a/Sources/Curried_ObjectWithValueMetadata.swift +++ b/Sources/Curried_ObjectWithValueMetadata.swift @@ -12,10 +12,7 @@ import ValueCoding // MARK: - Persistable extension Persistable where - Self: NSCoding, - Self.MetadataType: ValueCoding, - Self.MetadataType.Coder: NSCoding, - Self.MetadataType.Coder.ValueType == Self.MetadataType { + Self: NSCoding { /** Returns a closure which, given a read transaction will return @@ -24,10 +21,13 @@ extension Persistable where - parameter index: a YapDB.Index - returns: a (ReadTransaction) -> Self? closure. */ - public static func readAtIndex< - ReadTransaction where - ReadTransaction: ReadTransactionType>(index: YapDB.Index) -> ReadTransaction -> Self? { - return { $0.readAtIndex(index) } + public static func readWithMetadataAtIndex< + ReadTransaction, Metadata>(_ index: YapDB.Index) -> (ReadTransaction) -> YapItem? where + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { $0.readWithMetadataAtIndex(index) } } /** @@ -37,12 +37,15 @@ extension Persistable where - parameter indexes: a SequenceType of YapDB.Index values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readAtIndexes< - Indexes, ReadTransaction where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ReadTransaction: ReadTransactionType>(indexes: Indexes) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(indexes) } + public static func readWithMetadataAtIndexes< + Indexes, ReadTransaction, Metadata>(_ indexes: Indexes) -> (ReadTransaction) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -52,10 +55,13 @@ extension Persistable where - parameter key: a String - returns: a (ReadTransaction) -> Self? closure. */ - public static func readByKey< - ReadTransaction where - ReadTransaction: ReadTransactionType>(key: String) -> ReadTransaction -> Self? { - return { $0.readByKey(key) } + public static func readWithMetadataByKey< + ReadTransaction, Metadata>(_ key: String) -> (ReadTransaction) -> YapItem? where + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { $0.readWithMetadataByKey(key) } } /** @@ -65,12 +71,15 @@ extension Persistable where - parameter keys: a SequenceType of String values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readByKeys< - Keys, ReadTransaction where - Keys: SequenceType, - Keys.Generator.Element == String, - ReadTransaction: ReadTransactionType>(keys: Keys) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(Self.indexesWithKeys(keys)) } + public static func readWithMetadataByKeys< + Keys, ReadTransaction, Metadata>(_ keys: Keys) -> (ReadTransaction) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { $0.readWithMetadataAtIndexes(Self.indexesWithKeys(keys)) } } /** @@ -80,7 +89,12 @@ extension Persistable where - warning: Be aware that this will capure `self`. - returns: a (WriteTransaction) -> Self closure */ - public func write() -> WriteTransaction -> Self { - return { $0.write(self) } + public func writeWithMetadata< + WriteTransaction, Metadata>(_ metadata: Metadata? = nil) -> (WriteTransaction) -> YapItem where + WriteTransaction: WriteTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { $0.writeWithMetadata(YapItem(self, metadata)) } } } diff --git a/Sources/Curried_ValueWithNoMetadata.swift b/Sources/Curried_ValueWithNoMetadata.swift index 3fc1df7..cf5eab8 100644 --- a/Sources/Curried_ValueWithNoMetadata.swift +++ b/Sources/Curried_ValueWithNoMetadata.swift @@ -14,8 +14,7 @@ import ValueCoding extension Persistable where Self: ValueCoding, Self.Coder: NSCoding, - Self.Coder.ValueType == Self, - Self.MetadataType == Void { + Self.Coder.Value == Self { /** Returns a closure which, given a read transaction will return @@ -25,8 +24,8 @@ extension Persistable where - returns: a (ReadTransaction) -> Self? closure. */ public static func readAtIndex< - ReadTransaction where - ReadTransaction: ReadTransactionType>(index: YapDB.Index) -> ReadTransaction -> Self? { + ReadTransaction>(_ index: YapDB.Index) -> (ReadTransaction) -> Self? where + ReadTransaction: ReadTransactionType { return { $0.readAtIndex(index) } } @@ -38,10 +37,10 @@ extension Persistable where - returns: a (ReadTransaction) -> [Self] closure. */ public static func readAtIndexes< - Indexes, ReadTransaction where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ReadTransaction: ReadTransactionType>(indexes: Indexes) -> ReadTransaction -> [Self] { + Indexes, ReadTransaction>(_ indexes: Indexes) -> (ReadTransaction) -> [Self?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + ReadTransaction: ReadTransactionType { return { $0.readAtIndexes(indexes) } } @@ -53,8 +52,8 @@ extension Persistable where - returns: a (ReadTransaction) -> Self? closure. */ public static func readByKey< - ReadTransaction where - ReadTransaction: ReadTransactionType>(key: String) -> ReadTransaction -> Self? { + ReadTransaction>(_ key: String) -> (ReadTransaction) -> Self? where + ReadTransaction: ReadTransactionType { return { $0.readByKey(key) } } @@ -66,10 +65,10 @@ extension Persistable where - returns: a (ReadTransaction) -> [Self] closure. */ public static func readByKeys< - Keys, ReadTransaction where - Keys: SequenceType, - Keys.Generator.Element == String, - ReadTransaction: ReadTransactionType>(keys: Keys) -> ReadTransaction -> [Self] { + Keys, ReadTransaction>(_ keys: Keys) -> (ReadTransaction) -> [Self?] where + Keys: Sequence, + Keys.Iterator.Element == String, + ReadTransaction: ReadTransactionType { return { $0.readAtIndexes(Self.indexesWithKeys(keys)) } } @@ -80,7 +79,7 @@ extension Persistable where - warning: Be aware that this will capure `self`. - returns: a (WriteTransaction) -> Self closure */ - public func write() -> WriteTransaction -> Self { + public func write() -> (WriteTransaction) -> Self { return { $0.write(self) } } } diff --git a/Sources/Curried_ValueWithObjectMetadata.swift b/Sources/Curried_ValueWithObjectMetadata.swift index 6245a38..26ce801 100644 --- a/Sources/Curried_ValueWithObjectMetadata.swift +++ b/Sources/Curried_ValueWithObjectMetadata.swift @@ -14,8 +14,7 @@ import ValueCoding extension Persistable where Self: ValueCoding, Self.Coder: NSCoding, - Self.Coder.ValueType == Self, - Self.MetadataType: NSCoding { + Self.Coder.Value == Self { /** Returns a closure which, given a read transaction will return @@ -24,10 +23,11 @@ extension Persistable where - parameter index: a YapDB.Index - returns: a (ReadTransaction) -> Self? closure. */ - public static func readAtIndex< - ReadTransaction where - ReadTransaction: ReadTransactionType>(index: YapDB.Index) -> ReadTransaction -> Self? { - return { $0.readAtIndex(index) } + public static func readWithMetadataAtIndex< + ReadTransaction, Metadata>(_ index: YapDB.Index) -> (ReadTransaction) -> YapItem? where + ReadTransaction: ReadTransactionType, + Metadata: NSCoding { + return { $0.readWithMetadataAtIndex(index) } } /** @@ -37,12 +37,13 @@ extension Persistable where - parameter indexes: a SequenceType of YapDB.Index values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readAtIndexes< - Indexes, ReadTransaction where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ReadTransaction: ReadTransactionType>(indexes: Indexes) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(indexes) } + public static func readWithMetadataAtIndexes< + Indexes, ReadTransaction, Metadata>(_ indexes: Indexes) -> (ReadTransaction) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + ReadTransaction: ReadTransactionType, + Metadata: NSCoding { + return { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -52,10 +53,11 @@ extension Persistable where - parameter key: a String - returns: a (ReadTransaction) -> Self? closure. */ - public static func readByKey< - ReadTransaction where - ReadTransaction: ReadTransactionType>(key: String) -> ReadTransaction -> Self? { - return { $0.readByKey(key) } + public static func readWithMetadataByKey< + ReadTransaction, Metadata>(_ key: String) -> (ReadTransaction) -> YapItem? where + ReadTransaction: ReadTransactionType, + Metadata: NSCoding { + return { $0.readWithMetadataByKey(key) } } /** @@ -65,12 +67,13 @@ extension Persistable where - parameter keys: a SequenceType of String values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readByKeys< - Keys, ReadTransaction where - Keys: SequenceType, - Keys.Generator.Element == String, - ReadTransaction: ReadTransactionType>(keys: Keys) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(Self.indexesWithKeys(keys)) } + public static func readWithMetadataByKeys< + Keys, ReadTransaction, Metadata>(_ keys: Keys) -> (ReadTransaction) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + ReadTransaction: ReadTransactionType, + Metadata: NSCoding { + return { $0.readWithMetadataAtIndexes(Self.indexesWithKeys(keys)) } } /** @@ -80,7 +83,10 @@ extension Persistable where - warning: Be aware that this will capure `self`. - returns: a (WriteTransaction) -> Self closure */ - public func write() -> WriteTransaction -> Self { - return { $0.write(self) } + public func writeWithMetadata< + WriteTransaction, Metadata>(_ metadata: Metadata? = nil) -> (WriteTransaction) -> YapItem where + WriteTransaction: WriteTransactionType, + Metadata: NSCoding { + return { $0.writeWithMetadata(YapItem(self, metadata)) } } } diff --git a/Sources/Curried_ValueWithValueMetadata.swift b/Sources/Curried_ValueWithValueMetadata.swift index c59f580..8043070 100644 --- a/Sources/Curried_ValueWithValueMetadata.swift +++ b/Sources/Curried_ValueWithValueMetadata.swift @@ -14,10 +14,7 @@ import ValueCoding extension Persistable where Self: ValueCoding, Self.Coder: NSCoding, - Self.Coder.ValueType == Self, - Self.MetadataType: ValueCoding, - Self.MetadataType.Coder: NSCoding, - Self.MetadataType.Coder.ValueType == Self.MetadataType { + Self.Coder.Value == Self { /** Returns a closure which, given a read transaction will return @@ -26,10 +23,13 @@ extension Persistable where - parameter index: a YapDB.Index - returns: a (ReadTransaction) -> Self? closure. */ - public static func readAtIndex< - ReadTransaction where - ReadTransaction: ReadTransactionType>(index: YapDB.Index) -> ReadTransaction -> Self? { - return { $0.readAtIndex(index) } + public static func readWithMetadataAtIndex< + ReadTransaction, Metadata>(_ index: YapDB.Index) -> (ReadTransaction) -> YapItem? where + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { $0.readWithMetadataAtIndex(index) } } /** @@ -39,12 +39,15 @@ extension Persistable where - parameter indexes: a SequenceType of YapDB.Index values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readAtIndexes< - Indexes, ReadTransaction where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ReadTransaction: ReadTransactionType>(indexes: Indexes) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(indexes) } + public static func readWithMetadataAtIndexes< + Indexes, ReadTransaction, Metadata>(_ indexes: Indexes) -> (ReadTransaction) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -54,10 +57,13 @@ extension Persistable where - parameter key: a String - returns: a (ReadTransaction) -> Self? closure. */ - public static func readByKey< - ReadTransaction where - ReadTransaction: ReadTransactionType>(key: String) -> ReadTransaction -> Self? { - return { $0.readByKey(key) } + public static func readWithMetadataByKey< + ReadTransaction, Metadata>(_ key: String) -> (ReadTransaction) -> YapItem? where + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { $0.readWithMetadataByKey(key) } } /** @@ -67,12 +73,15 @@ extension Persistable where - parameter keys: a SequenceType of String values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readByKeys< - Keys, ReadTransaction where - Keys: SequenceType, - Keys.Generator.Element == String, - ReadTransaction: ReadTransactionType>(keys: Keys) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(Self.indexesWithKeys(keys)) } + public static func readWithMetadataByKeys< + Keys, ReadTransaction, Metadata>(_ keys: Keys) -> (ReadTransaction) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { $0.readWithMetadataAtIndexes(Self.indexesWithKeys(keys)) } } /** @@ -82,7 +91,12 @@ extension Persistable where - warning: Be aware that this will capure `self`. - returns: a (WriteTransaction) -> Self closure */ - public func write() -> WriteTransaction -> Self { - return { $0.write(self) } + public func writeWithMetadata< + WriteTransaction, Metadata>(_ metadata: Metadata? = nil) -> (WriteTransaction) -> YapItem where + WriteTransaction: WriteTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { $0.writeWithMetadata(YapItem(self, metadata)) } } } diff --git a/Sources/Functional_AnyWithObjectMetadata.swift b/Sources/Functional_AnyWithObjectMetadata.swift index 1b905b4..367ef22 100644 --- a/Sources/Functional_AnyWithObjectMetadata.swift +++ b/Sources/Functional_AnyWithObjectMetadata.swift @@ -21,7 +21,7 @@ extension ReadTransactionType { - returns: an optional `MetadataType` */ public func readMetadataAtIndex< - MetadataType: NSCoding>(index: YapDB.Index) -> MetadataType? { + MetadataType: NSCoding>(_ index: YapDB.Index) -> MetadataType? { return readMetadataAtIndex(index) as? MetadataType } @@ -32,11 +32,11 @@ extension ReadTransactionType { - returns: an array of `MetadataType` */ public func readMetadataAtIndexes< - Indexes, MetadataType where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - MetadataType: NSCoding>(indexes: Indexes) -> [MetadataType] { - return indexes.flatMap(readMetadataAtIndex) + Indexes, MetadataType>(_ indexes: Indexes) -> [MetadataType?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + MetadataType: NSCoding { + return indexes.map(readMetadataAtIndex) } } @@ -49,7 +49,7 @@ extension ConnectionType { - returns: an optional `MetadataType` */ public func readMetadataAtIndex< - MetadataType: NSCoding>(index: YapDB.Index) -> MetadataType? { + MetadataType: NSCoding>(_ index: YapDB.Index) -> MetadataType? { return read { $0.readMetadataAtIndex(index) } } @@ -60,10 +60,10 @@ extension ConnectionType { - returns: an array of `MetadataType` */ public func readMetadataAtIndexes< - Indexes, MetadataType where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - MetadataType: NSCoding>(indexes: Indexes) -> [MetadataType] { + Indexes, MetadataType>(_ indexes: Indexes) -> [MetadataType?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + MetadataType: NSCoding { return read { $0.readMetadataAtIndexes(indexes) } } } diff --git a/Sources/Functional_AnyWithValueMetadata.swift b/Sources/Functional_AnyWithValueMetadata.swift index 1e91339..fe210ef 100644 --- a/Sources/Functional_AnyWithValueMetadata.swift +++ b/Sources/Functional_AnyWithValueMetadata.swift @@ -21,11 +21,11 @@ extension ReadTransactionType { - returns: an optional `MetadataType` */ public func readMetadataAtIndex< - MetadataType where + MetadataType>(_ index: YapDB.Index) -> MetadataType? where MetadataType: ValueCoding, MetadataType.Coder: NSCoding, - MetadataType.Coder.ValueType == MetadataType>(index: YapDB.Index) -> MetadataType? { - return MetadataType.decode(readMetadataAtIndex(index)) + MetadataType.Coder.Value == MetadataType { + return MetadataType.decode(readMetadataAtIndex(index) as Any?) } /** @@ -35,13 +35,13 @@ extension ReadTransactionType { - returns: an array of `MetadataType` */ public func readMetadataAtIndexes< - Indexes, MetadataType where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, + Indexes, MetadataType>(_ indexes: Indexes) -> [MetadataType?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, MetadataType: ValueCoding, MetadataType.Coder: NSCoding, - MetadataType.Coder.ValueType == MetadataType>(indexes: Indexes) -> [MetadataType] { - return indexes.flatMap(readMetadataAtIndex) + MetadataType.Coder.Value == MetadataType { + return indexes.map(readMetadataAtIndex) } } @@ -54,10 +54,10 @@ extension ConnectionType { - returns: an optional `MetadataType` */ public func readMetadataAtIndex< - MetadataType where + MetadataType>(_ index: YapDB.Index) -> MetadataType? where MetadataType: ValueCoding, MetadataType.Coder: NSCoding, - MetadataType.Coder.ValueType == MetadataType>(index: YapDB.Index) -> MetadataType? { + MetadataType.Coder.Value == MetadataType { return read { $0.readMetadataAtIndex(index) } } @@ -68,12 +68,12 @@ extension ConnectionType { - returns: an array of `MetadataType` */ public func readMetadataAtIndexes< - Indexes, MetadataType where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, + Indexes, MetadataType>(_ indexes: Indexes) -> [MetadataType?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, MetadataType: ValueCoding, MetadataType.Coder: NSCoding, - MetadataType.Coder.ValueType == MetadataType>(indexes: Indexes) -> [MetadataType] { + MetadataType.Coder.Value == MetadataType { return read { $0.readMetadataAtIndexes(indexes) } } } diff --git a/Sources/Functional_ObjectWithNoMetadata.swift b/Sources/Functional_ObjectWithNoMetadata.swift index 5100354..f67317a 100644 --- a/Sources/Functional_ObjectWithNoMetadata.swift +++ b/Sources/Functional_ObjectWithNoMetadata.swift @@ -21,11 +21,10 @@ extension ReadTransactionType { - returns: an optional `ItemType` */ public func readAtIndex< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(index: YapDB.Index) -> ObjectWithNoMetadata? { - return readAtIndex(index) as? ObjectWithNoMetadata + Object>(_ index: YapDB.Index) -> Object? where + Object: Persistable, + Object: NSCoding { + return readAtIndex(index) as? Object } /** @@ -35,13 +34,12 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ public func readAtIndexes< - Indexes, ObjectWithNoMetadata where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(indexes: Indexes) -> [ObjectWithNoMetadata] { - return indexes.flatMap(readAtIndex) + Indexes, Object>(_ indexes: Indexes) -> [Object?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Object: Persistable, + Object: NSCoding { + return indexes.map(readAtIndex) } /** @@ -51,11 +49,10 @@ extension ReadTransactionType { - returns: an optional `ItemType` */ public func readByKey< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(key: String) -> ObjectWithNoMetadata? { - return readAtIndex(ObjectWithNoMetadata.indexWithKey(key)) + Object>(_ key: String) -> Object? where + Object: Persistable, + Object: NSCoding { + return readAtIndex(Object.indexWithKey(key)) } /** @@ -65,13 +62,12 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ public func readByKeys< - Keys, ObjectWithNoMetadata where - Keys: SequenceType, - Keys.Generator.Element == String, - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(keys: Keys) -> [ObjectWithNoMetadata] { - return readAtIndexes(ObjectWithNoMetadata.indexesWithKeys(keys)) + Keys, Object>(_ keys: Keys) -> [Object?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Object: Persistable, + Object: NSCoding { + return readAtIndexes(Object.indexesWithKeys(keys)) } /** @@ -80,11 +76,10 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ public func readAll< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>() -> [ObjectWithNoMetadata] { - return readByKeys(keysInCollection(ObjectWithNoMetadata.collection)) + Object>() -> [Object?] where + Object: Persistable, + Object: NSCoding { + return readByKeys(keysInCollection(Object.collection)) } } @@ -97,10 +92,9 @@ extension ConnectionType { - returns: an optional `ItemType` */ public func readAtIndex< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(index: YapDB.Index) -> ObjectWithNoMetadata? { + Object>(_ index: YapDB.Index) -> Object? where + Object: Persistable, + Object: NSCoding { return read { $0.readAtIndex(index) } } @@ -111,12 +105,11 @@ extension ConnectionType { - returns: an array of `ItemType` */ public func readAtIndexes< - Indexes, ObjectWithNoMetadata where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(indexes: Indexes) -> [ObjectWithNoMetadata] { + Indexes, Object>(_ indexes: Indexes) -> [Object?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Object: Persistable, + Object: NSCoding { return read { $0.readAtIndexes(indexes) } } @@ -127,11 +120,10 @@ extension ConnectionType { - returns: an optional `ItemType` */ public func readByKey< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(key: String) -> ObjectWithNoMetadata? { - return readAtIndex(ObjectWithNoMetadata.indexWithKey(key)) + Object>(_ key: String) -> Object? where + Object: Persistable, + Object: NSCoding { + return readAtIndex(Object.indexWithKey(key)) } /** @@ -141,13 +133,12 @@ extension ConnectionType { - returns: an array of `ItemType` */ public func readByKeys< - Keys, ObjectWithNoMetadata where - Keys: SequenceType, - Keys.Generator.Element == String, - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(keys: Keys) -> [ObjectWithNoMetadata] { - return readAtIndexes(ObjectWithNoMetadata.indexesWithKeys(keys)) + Keys, Object>(_ keys: Keys) -> [Object?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Object: Persistable, + Object: NSCoding { + return readAtIndexes(Object.indexesWithKeys(keys)) } /** @@ -156,10 +147,9 @@ extension ConnectionType { - returns: an array of `ItemType` */ public func readAll< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>() -> [ObjectWithNoMetadata] { + Object>() -> [Object?] where + Object: Persistable, + Object: NSCoding { return read { $0.readAll() } } } @@ -175,11 +165,10 @@ extension WriteTransactionType { - returns: the same item */ public func write< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(item: ObjectWithNoMetadata) -> ObjectWithNoMetadata { - writeAtIndex(item.index, object: item, metadata: .None) + Object>(_ item: Object) -> Object where + Object: Persistable, + Object: NSCoding { + writeAtIndex(item.index, object: item, metadata: .none) return item } @@ -190,12 +179,11 @@ extension WriteTransactionType { - returns: the same items, in an array. */ public func write< - Items, ObjectWithNoMetadata where - Items: SequenceType, - Items.Generator.Element == ObjectWithNoMetadata, - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(items: Items) -> [ObjectWithNoMetadata] { + Items, Object>(_ items: Items) -> [Object] where + Items: Sequence, + Items.Iterator.Element == Object, + Object: Persistable, + Object: NSCoding { return items.map(write) } } @@ -209,10 +197,9 @@ extension ConnectionType { - returns: the same item */ public func write< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(item: ObjectWithNoMetadata) -> ObjectWithNoMetadata { + Object>(_ item: Object) -> Object where + Object: Persistable, + Object: NSCoding { return write { $0.write(item) } } @@ -223,12 +210,11 @@ extension ConnectionType { - returns: the same items, in an array. */ public func write< - Items, ObjectWithNoMetadata where - Items: SequenceType, - Items.Generator.Element == ObjectWithNoMetadata, - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(items: Items) -> [ObjectWithNoMetadata] { + Items, Object>(_ items: Items) -> [Object] where + Items: Sequence, + Items.Iterator.Element == Object, + Object: Persistable, + Object: NSCoding { return write { $0.write(items) } } @@ -240,10 +226,9 @@ extension ConnectionType { - parameter completion: a dispatch_block_t for completion. */ public func asyncWrite< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(item: ObjectWithNoMetadata, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (ObjectWithNoMetadata -> Void)? = .None) { + Object>(_ item: Object, queue: DispatchQueue = DispatchQueue.main, completion: ((Object) -> Void)? = .none) where + Object: Persistable, + Object: NSCoding { asyncWrite({ $0.write(item) }, queue: queue, completion: completion) } @@ -255,12 +240,11 @@ extension ConnectionType { - parameter completion: a dispatch_block_t for completion. */ public func asyncWrite< - Items, ObjectWithNoMetadata where - Items: SequenceType, - Items.Generator.Element == ObjectWithNoMetadata, - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([ObjectWithNoMetadata] -> Void)? = .None) { + Items, Object>(_ items: Items, queue: DispatchQueue = DispatchQueue.main, completion: (([Object]) -> Void)? = .none) where + Items: Sequence, + Items.Iterator.Element == Object, + Object: Persistable, + Object: NSCoding { asyncWrite({ $0.write(items) }, queue: queue, completion: completion) } } diff --git a/Sources/Functional_ObjectWithObjectMetadata.swift b/Sources/Functional_ObjectWithObjectMetadata.swift index baeb3c9..70e2d60 100644 --- a/Sources/Functional_ObjectWithObjectMetadata.swift +++ b/Sources/Functional_ObjectWithObjectMetadata.swift @@ -20,16 +20,14 @@ extension ReadTransactionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(index: YapDB.Index) -> ObjectWithObjectMetadata? { - if var item = readAtIndex(index) as? ObjectWithObjectMetadata { - item.metadata = readMetadataAtIndex(index) - return item - } - return .None + public func readWithMetadataAtIndex< + Object, Metadata>(_ index: YapDB.Index) -> YapItem? where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + guard let item: Object = readAtIndex(index) else { return nil } + let metadata: Metadata? = readMetadataAtIndex(index) + return YapItem(item, metadata) } /** @@ -38,14 +36,14 @@ extension ReadTransactionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ObjectWithObjectMetadata where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(indexes: Indexes) -> [ObjectWithObjectMetadata] { - return indexes.flatMap(readAtIndex) + public func readWithMetadataAtIndexes< + Indexes, Object, Metadata>(_ indexes: Indexes) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + return indexes.map(readWithMetadataAtIndex) } /** @@ -54,12 +52,12 @@ extension ReadTransactionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(key: String) -> ObjectWithObjectMetadata? { - return readAtIndex(ObjectWithObjectMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Object, Metadata>(_ key: String) -> YapItem? where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + return readWithMetadataAtIndex(Object.indexWithKey(key)) } /** @@ -68,14 +66,14 @@ extension ReadTransactionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ObjectWithObjectMetadata where - Keys: SequenceType, - Keys.Generator.Element == String, - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(keys: Keys) -> [ObjectWithObjectMetadata] { - return readAtIndexes(ObjectWithObjectMetadata.indexesWithKeys(keys)) + public func readWithMetadataByKeys< + Keys, Object, Metadata>(_ keys: Keys) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + return readWithMetadataAtIndexes(Object.indexesWithKeys(keys)) } /** @@ -83,12 +81,12 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ - public func readAll< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>() -> [ObjectWithObjectMetadata] { - return readByKeys(keysInCollection(ObjectWithObjectMetadata.collection)) + public func readWithMetadataAll< + Object, Metadata>() -> [YapItem?] where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + return readWithMetadataByKeys(keysInCollection(Object.collection)) } } @@ -100,12 +98,12 @@ extension ConnectionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(index: YapDB.Index) -> ObjectWithObjectMetadata? { - return read { $0.readAtIndex(index) } + public func readWithMetadataAtIndex< + Object, Metadata>(_ index: YapDB.Index) -> YapItem? where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + return read { $0.readWithMetadataAtIndex(index) } } /** @@ -114,14 +112,14 @@ extension ConnectionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ObjectWithObjectMetadata where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(indexes: Indexes) -> [ObjectWithObjectMetadata] { - return read { $0.readAtIndexes(indexes) } + public func readWithMetadataAtIndexes< + Indexes, Object, Metadata>(_ indexes: Indexes) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + return read { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -130,12 +128,12 @@ extension ConnectionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(key: String) -> ObjectWithObjectMetadata? { - return readAtIndex(ObjectWithObjectMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Object, Metadata>(_ key: String) -> YapItem? where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + return readWithMetadataAtIndex(Object.indexWithKey(key)) } /** @@ -144,14 +142,14 @@ extension ConnectionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ObjectWithObjectMetadata where - Keys: SequenceType, - Keys.Generator.Element == String, - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(keys: Keys) -> [ObjectWithObjectMetadata] { - return readAtIndexes(ObjectWithObjectMetadata.indexesWithKeys(keys)) + public func readWithMetadataByKeys< + Keys, Object, Metadata>(_ keys: Keys) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + return readWithMetadataAtIndexes(Object.indexesWithKeys(keys)) } /** @@ -159,12 +157,12 @@ extension ConnectionType { - returns: an array of `ItemType` */ - public func readAll< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>() -> [ObjectWithObjectMetadata] { - return read { $0.readAll() } + public func readWithMetadataAll< + Object, Metadata>() -> [YapItem?] where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + return read { $0.readWithMetadataAll() } } } @@ -177,12 +175,12 @@ extension WriteTransactionType { - parameter item: the item to store. */ - public func write< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(item: ObjectWithObjectMetadata) -> ObjectWithObjectMetadata { - writeAtIndex(item.index, object: item, metadata: item.metadata) + public func writeWithMetadata< + Object, Metadata>(_ item: YapItem) -> YapItem where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + writeAtIndex(item.value.index, object: item.value, metadata: item.metadata) return item } @@ -191,14 +189,14 @@ extension WriteTransactionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ObjectWithObjectMetadata where - Items: SequenceType, - Items.Generator.Element == ObjectWithObjectMetadata, - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(items: Items) -> [ObjectWithObjectMetadata] { - return items.map(write) + public func writeWithMetadata< + Items, Object, Metadata>(_ items: Items) -> [YapItem] where + Items: Sequence, + Items.Iterator.Element == YapItem, + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + return items.map(writeWithMetadata) } } @@ -209,12 +207,12 @@ extension ConnectionType { - parameter item: the item to store. */ - public func write< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(item: ObjectWithObjectMetadata) -> ObjectWithObjectMetadata { - return write { $0.write(item) } + public func writeWithMetadata< + Object, Metadata>(_ item: YapItem) -> YapItem where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + return write { $0.writeWithMetadata(item) } } /** @@ -222,14 +220,14 @@ extension ConnectionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ObjectWithObjectMetadata where - Items: SequenceType, - Items.Generator.Element == ObjectWithObjectMetadata, - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(items: Items) -> [ObjectWithObjectMetadata] { - return write { $0.write(items) } + public func writeWithMetadata< + Items, Object, Metadata>(_ items: Items) -> [YapItem] where + Items: Sequence, + Items.Iterator.Element == YapItem, + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + return write { $0.writeWithMetadata(items) } } /** @@ -239,12 +237,12 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(item: ObjectWithObjectMetadata, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (ObjectWithObjectMetadata -> Void)? = .None) { - asyncWrite({ $0.write(item) }, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Object, Metadata>(_ item: YapItem, queue: DispatchQueue = DispatchQueue.main, completion: ((YapItem) -> Void)? = .none) where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + asyncWrite({ $0.writeWithMetadata(item) }, queue: queue, completion: completion) } /** @@ -254,14 +252,14 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - Items, ObjectWithObjectMetadata where - Items: SequenceType, - Items.Generator.Element == ObjectWithObjectMetadata, - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([ObjectWithObjectMetadata] -> Void)? = .None) { - asyncWrite({ $0.write(items) }, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Items, Object, Metadata>(_ items: Items, queue: DispatchQueue = DispatchQueue.main, completion: (([YapItem]) -> Void)? = .none) where + Items: Sequence, + Items.Iterator.Element == YapItem, + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding { + asyncWrite({ $0.writeWithMetadata(items) }, queue: queue, completion: completion) } } diff --git a/Sources/Functional_ObjectWithValueMetadata.swift b/Sources/Functional_ObjectWithValueMetadata.swift index 30ee717..8c9906c 100644 --- a/Sources/Functional_ObjectWithValueMetadata.swift +++ b/Sources/Functional_ObjectWithValueMetadata.swift @@ -20,18 +20,16 @@ extension ReadTransactionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(index: YapDB.Index) -> ObjectWithValueMetadata? { - if var item = readAtIndex(index) as? ObjectWithValueMetadata { - item.metadata = readMetadataAtIndex(index) - return item - } - return .None + public func readWithMetadataAtIndex< + Object, Metadata>(_ index: YapDB.Index) -> YapItem? where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + guard let item: Object = readAtIndex(index) else { return nil } + let metadata: Metadata? = readMetadataAtIndex(index) + return YapItem(item, metadata) } /** @@ -40,16 +38,16 @@ extension ReadTransactionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ObjectWithValueMetadata where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(indexes: Indexes) -> [ObjectWithValueMetadata] { - return indexes.flatMap(readAtIndex) + public func readWithMetadataAtIndexes< + Indexes, Object, Metadata>(_ indexes: Indexes) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return indexes.map(readWithMetadataAtIndex) } /** @@ -58,14 +56,14 @@ extension ReadTransactionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(key: String) -> ObjectWithValueMetadata? { - return readAtIndex(ObjectWithValueMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Object, Metadata>(_ key: String) -> YapItem? where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return readWithMetadataAtIndex(Object.indexWithKey(key)) } /** @@ -74,16 +72,16 @@ extension ReadTransactionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ObjectWithValueMetadata where - Keys: SequenceType, - Keys.Generator.Element == String, - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(keys: Keys) -> [ObjectWithValueMetadata] { - return readAtIndexes(ObjectWithValueMetadata.indexesWithKeys(keys)) + public func readWithMetadataByKeys< + Keys, Object, Metadata>(_ keys: Keys) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return readWithMetadataAtIndexes(Object.indexesWithKeys(keys)) } /** @@ -91,14 +89,14 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ - public func readAll< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>() -> [ObjectWithValueMetadata] { - return readByKeys(keysInCollection(ObjectWithValueMetadata.collection)) + public func readWithMetadataAll< + Object, Metadata>() -> [YapItem?] where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return readWithMetadataByKeys(keysInCollection(Object.collection)) } } @@ -110,14 +108,14 @@ extension ConnectionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(index: YapDB.Index) -> ObjectWithValueMetadata? { - return read { $0.readAtIndex(index) } + public func readWithMetadataAtIndex< + Object, Metadata>(_ index: YapDB.Index) -> YapItem? where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return read { $0.readWithMetadataAtIndex(index) } } /** @@ -126,16 +124,16 @@ extension ConnectionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ObjectWithValueMetadata where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(indexes: Indexes) -> [ObjectWithValueMetadata] { - return read { $0.readAtIndexes(indexes) } + public func readWithMetadataAtIndexes< + Indexes, Object, Metadata>(_ indexes: Indexes) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return read { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -144,14 +142,14 @@ extension ConnectionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(key: String) -> ObjectWithValueMetadata? { - return readAtIndex(ObjectWithValueMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Object, Metadata>(_ key: String) -> YapItem? where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return readWithMetadataAtIndex(Object.indexWithKey(key)) } /** @@ -160,16 +158,16 @@ extension ConnectionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ObjectWithValueMetadata where - Keys: SequenceType, - Keys.Generator.Element == String, - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(keys: Keys) -> [ObjectWithValueMetadata] { - return readAtIndexes(ObjectWithValueMetadata.indexesWithKeys(keys)) + public func readWithMetadataByKeys< + Keys, Object, Metadata>(_ keys: Keys) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return readWithMetadataAtIndexes(Object.indexesWithKeys(keys)) } /** @@ -177,14 +175,14 @@ extension ConnectionType { - returns: an array of `ItemType` */ - public func readAll< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>() -> [ObjectWithValueMetadata] { - return read { $0.readAll() } + public func readWithMetadataAll< + Object, Metadata>() -> [YapItem?] where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return read { $0.readWithMetadataAll() } } } @@ -197,14 +195,14 @@ extension WriteTransactionType { - parameter item: the item to store. */ - public func write< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(item: ObjectWithValueMetadata) -> ObjectWithValueMetadata { - writeAtIndex(item.index, object: item, metadata: item.metadata?.encoded) + public func writeWithMetadata< + Object, Metadata>(_ item: YapItem) -> YapItem where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + writeAtIndex(item.value.index, object: item.value, metadata: item.metadata?.encoded) return item } @@ -213,16 +211,16 @@ extension WriteTransactionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ObjectWithValueMetadata where - Items: SequenceType, - Items.Generator.Element == ObjectWithValueMetadata, - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(items: Items) -> [ObjectWithValueMetadata] { - return items.map(write) + public func writeWithMetadata< + Items, Object, Metadata>(_ items: Items) -> [YapItem] where + Items: Sequence, + Items.Iterator.Element == YapItem, + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return items.map(writeWithMetadata) } } @@ -233,14 +231,14 @@ extension ConnectionType { - parameter item: the item to store. */ - public func write< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(item: ObjectWithValueMetadata) -> ObjectWithValueMetadata { - return write { $0.write(item) } + public func writeWithMetadata< + Object, Metadata>(_ item: YapItem) -> YapItem where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return write { $0.writeWithMetadata(item) } } /** @@ -248,16 +246,16 @@ extension ConnectionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ObjectWithValueMetadata where - Items: SequenceType, - Items.Generator.Element == ObjectWithValueMetadata, - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(items: Items) -> [ObjectWithValueMetadata] { - return write { $0.write(items) } + public func writeWithMetadata< + Items, Object, Metadata>(_ items: Items) -> [YapItem] where + Items: Sequence, + Items.Iterator.Element == YapItem, + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return write { $0.writeWithMetadata(items) } } /** @@ -267,14 +265,14 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(item: ObjectWithValueMetadata, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (ObjectWithValueMetadata -> Void)? = .None) { - asyncWrite({ $0.write(item) }, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Object, Metadata>(_ item: YapItem, queue: DispatchQueue = DispatchQueue.main, completion: ((YapItem) -> Void)? = .none) where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + asyncWrite({ $0.writeWithMetadata(item) }, queue: queue, completion: completion) } /** @@ -284,16 +282,16 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - Items, ObjectWithValueMetadata where - Items: SequenceType, - Items.Generator.Element == ObjectWithValueMetadata, - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([ObjectWithValueMetadata] -> Void)? = .None) { - asyncWrite({ $0.write(items) }, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Items, Object, Metadata>(_ items: Items, queue: DispatchQueue = DispatchQueue.main, completion: (([YapItem]) -> Void)? = .none) where + Items: Sequence, + Items.Iterator.Element == YapItem, + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + asyncWrite({ $0.writeWithMetadata(items) }, queue: queue, completion: completion) } } diff --git a/Sources/Functional_Remove.swift b/Sources/Functional_Remove.swift index b45fc28..7074c6e 100644 --- a/Sources/Functional_Remove.swift +++ b/Sources/Functional_Remove.swift @@ -15,7 +15,7 @@ extension WriteTransactionType { - parameter item: a `Persistable` item */ - public func remove(item: Item) { + public func remove(_ item: Item) { removeAtIndexes([item.index]) } @@ -25,10 +25,10 @@ extension WriteTransactionType { - parameter items: a sequence of `Persistable` items */ public func remove< - Items, Item where - Items: SequenceType, - Items.Generator.Element == Item, - Item: Persistable>(items: Items) { + Items, Item>(_ items: Items) where + Items: Sequence, + Items.Iterator.Element == Item, + Item: Persistable { removeAtIndexes(items.map { $0.index }) } } @@ -41,7 +41,7 @@ extension ConnectionType { - parameter item: a `Persistable` item */ - public func remove(item: Item) { + public func remove(_ item: Item) { write { $0.remove(item) } } @@ -52,10 +52,10 @@ extension ConnectionType { - parameter items: a sequence of `Persistable` items */ public func remove< - Items, Item where - Items: SequenceType, - Items.Generator.Element == Item, - Item: Persistable>(items: Items) { + Items, Item>(_ items: Items) where + Items: Sequence, + Items.Iterator.Element == Item, + Item: Persistable { write { $0.remove(items) } } @@ -65,7 +65,7 @@ extension ConnectionType { - parameter item: a `Persistable` item */ - public func asyncRemove(item: Item, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: dispatch_block_t? = .None) { + public func asyncRemove(_ item: Item, queue: DispatchQueue = DispatchQueue.main, completion: (()->())? = .none) { asyncWrite({ $0.remove(item) }, queue: queue, completion: { _ in completion?() }) } @@ -76,10 +76,10 @@ extension ConnectionType { - parameter items: a sequence of `Persistable` items */ public func asyncRemove< - Items, Item where - Items: SequenceType, - Items.Generator.Element == Item, - Item: Persistable>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: dispatch_block_t? = .None) { + Items, Item>(_ items: Items, queue: DispatchQueue = DispatchQueue.main, completion: (()->())? = .none) where + Items: Sequence, + Items.Iterator.Element == Item, + Item: Persistable { asyncWrite({ $0.remove(items) }, queue: queue, completion: { _ in completion?() }) } } diff --git a/Sources/Functional_ValueWIthObjectMetadata.swift b/Sources/Functional_ValueWIthObjectMetadata.swift index 4a09f50..9e416fe 100644 --- a/Sources/Functional_ValueWIthObjectMetadata.swift +++ b/Sources/Functional_ValueWIthObjectMetadata.swift @@ -20,18 +20,16 @@ extension ReadTransactionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(index: YapDB.Index) -> ValueWithObjectMetadata? { - if var item = ValueWithObjectMetadata.decode(readAtIndex(index)) { - item.metadata = readMetadataAtIndex(index) - return item - } - return .None + public func readWithMetadataAtIndex< + Value, Metadata>(_ index: YapDB.Index) -> YapItem? where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + guard let item: Value = Value.decode(readAtIndex(index)) else { return nil } + let metadata: Metadata? = readMetadataAtIndex(index) + return YapItem(item, metadata) } /** @@ -40,16 +38,16 @@ extension ReadTransactionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ValueWithObjectMetadata where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(indexes: Indexes) -> [ValueWithObjectMetadata] { - return indexes.flatMap(readAtIndex) + public func readWithMetadataAtIndexes< + Indexes, Value, Metadata>(_ indexes: Indexes) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + return indexes.map(readWithMetadataAtIndex) } /** @@ -58,14 +56,14 @@ extension ReadTransactionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(key: String) -> ValueWithObjectMetadata? { - return readAtIndex(ValueWithObjectMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Value, Metadata>(_ key: String) -> YapItem? where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + return readWithMetadataAtIndex(Value.indexWithKey(key)) } /** @@ -74,16 +72,16 @@ extension ReadTransactionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ValueWithObjectMetadata where - Keys: SequenceType, - Keys.Generator.Element == String, - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(keys: Keys) -> [ValueWithObjectMetadata] { - return readAtIndexes(ValueWithObjectMetadata.indexesWithKeys(keys)) + public func readWithMetadataByKeys< + Keys, Value, Metadata>(_ keys: Keys) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + return readWithMetadataAtIndexes(Value.indexesWithKeys(keys)) } /** @@ -91,14 +89,14 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ - public func readAll< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>() -> [ValueWithObjectMetadata] { - return readByKeys(keysInCollection(ValueWithObjectMetadata.collection)) + public func readWithMetadataAll< + Value, Metadata>() -> [YapItem?] where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + return readWithMetadataByKeys(keysInCollection(Value.collection)) } } @@ -110,14 +108,14 @@ extension ConnectionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(index: YapDB.Index) -> ValueWithObjectMetadata? { - return read { $0.readAtIndex(index) } + public func readWithMetadataAtIndex< + Value, Metadata>(_ index: YapDB.Index) -> YapItem? where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + return read { $0.readWithMetadataAtIndex(index) } } /** @@ -126,16 +124,16 @@ extension ConnectionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ValueWithObjectMetadata where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(indexes: Indexes) -> [ValueWithObjectMetadata] { - return read { $0.readAtIndexes(indexes) } + public func readWithMetadataAtIndexes< + Indexes, Value, Metadata>(_ indexes: Indexes) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + return read { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -144,14 +142,14 @@ extension ConnectionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(key: String) -> ValueWithObjectMetadata? { - return readAtIndex(ValueWithObjectMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Value, Metadata>(_ key: String) -> YapItem? where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + return readWithMetadataAtIndex(Value.indexWithKey(key)) } /** @@ -160,16 +158,16 @@ extension ConnectionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ValueWithObjectMetadata where - Keys: SequenceType, - Keys.Generator.Element == String, - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(keys: Keys) -> [ValueWithObjectMetadata] { - return readAtIndexes(ValueWithObjectMetadata.indexesWithKeys(keys)) + public func readWithMetadataByKeys< + Keys, Value, Metadata>(_ keys: Keys) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + return readWithMetadataAtIndexes(Value.indexesWithKeys(keys)) } /** @@ -177,14 +175,14 @@ extension ConnectionType { - returns: an array of `ItemType` */ - public func readAll< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>() -> [ValueWithObjectMetadata] { - return read { $0.readAll() } + public func readWithMetadataAll< + Value, Metadata>() -> [YapItem?] where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + return read { $0.readWithMetadataAll() } } } @@ -197,14 +195,14 @@ extension WriteTransactionType { - parameter item: the item to store. */ - public func write< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(item: ValueWithObjectMetadata) -> ValueWithObjectMetadata { - writeAtIndex(item.index, object: item.encoded, metadata: item.metadata) + public func writeWithMetadata< + Value, Metadata>(_ item: YapItem) -> YapItem where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + writeAtIndex(item.value.index, object: item.value.encoded, metadata: item.metadata) return item } @@ -213,16 +211,16 @@ extension WriteTransactionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ValueWithObjectMetadata where - Items: SequenceType, - Items.Generator.Element == ValueWithObjectMetadata, - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(items: Items) -> [ValueWithObjectMetadata] { - return items.map(write) + public func writeWithMetadata< + Items, Value, Metadata>(_ items: Items) -> [YapItem] where + Items: Sequence, + Items.Iterator.Element == YapItem, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + return items.map(writeWithMetadata) } } @@ -233,14 +231,14 @@ extension ConnectionType { - parameter item: the item to store. */ - public func write< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(item: ValueWithObjectMetadata) -> ValueWithObjectMetadata { - return write { $0.write(item) } + public func writeWithMetadata< + Value, Metadata>(_ item: YapItem) -> YapItem where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + return write { $0.writeWithMetadata(item) } } /** @@ -248,16 +246,16 @@ extension ConnectionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ValueWithObjectMetadata where - Items: SequenceType, - Items.Generator.Element == ValueWithObjectMetadata, - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(items: Items) -> [ValueWithObjectMetadata] { - return write { $0.write(items) } + public func writeWithMetadata< + Items, Value, Metadata>(_ items: Items) -> [YapItem] where + Items: Sequence, + Items.Iterator.Element == YapItem, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + return write { $0.writeWithMetadata(items) } } /** @@ -267,14 +265,14 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(item: ValueWithObjectMetadata, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (ValueWithObjectMetadata -> Void)? = .None) { - asyncWrite({ $0.write(item) }, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Value, Metadata>(_ item: YapItem, queue: DispatchQueue = DispatchQueue.main, completion: ((YapItem) -> Void)? = .none) where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + asyncWrite({ $0.writeWithMetadata(item) }, queue: queue, completion: completion) } /** @@ -284,16 +282,16 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - Items, ValueWithObjectMetadata where - Items: SequenceType, - Items.Generator.Element == ValueWithObjectMetadata, - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([ValueWithObjectMetadata] -> Void)? = .None) { - asyncWrite({ $0.write(items) }, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Items, Value, Metadata>(_ items: Items, queue: DispatchQueue = DispatchQueue.main, completion: (([YapItem]) -> Void)? = .none) where + Items: Sequence, + Items.Iterator.Element == YapItem, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: NSCoding { + asyncWrite({ $0.writeWithMetadata(items) }, queue: queue, completion: completion) } } diff --git a/Sources/Functional_ValueWIthValueMetadata.swift b/Sources/Functional_ValueWIthValueMetadata.swift index 66bf836..2147f6f 100644 --- a/Sources/Functional_ValueWIthValueMetadata.swift +++ b/Sources/Functional_ValueWIthValueMetadata.swift @@ -20,20 +20,18 @@ extension ReadTransactionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(index: YapDB.Index) -> ValueWithValueMetadata? { - if var item = ValueWithValueMetadata.decode(readAtIndex(index)) { - item.metadata = readMetadataAtIndex(index) - return item - } - return .None + public func readWithMetadataAtIndex< + Value, Metadata>(_ index: YapDB.Index) -> YapItem? where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + guard let item: Value = Value.decode(readAtIndex(index)) else { return nil } + let metadata: Metadata? = readMetadataAtIndex(index) + return YapItem(item, metadata) } /** @@ -42,18 +40,18 @@ extension ReadTransactionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ValueWithValueMetadata where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(indexes: Indexes) -> [ValueWithValueMetadata] { - return indexes.flatMap(readAtIndex) + public func readWithMetadataAtIndexes< + Indexes, Value, Metadata>(_ indexes: Indexes) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return indexes.map(readWithMetadataAtIndex) } /** @@ -62,16 +60,16 @@ extension ReadTransactionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(key: String) -> ValueWithValueMetadata? { - return readAtIndex(ValueWithValueMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Value, Metadata>(_ key: String) -> YapItem? where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return readWithMetadataAtIndex(Value.indexWithKey(key)) } /** @@ -80,18 +78,18 @@ extension ReadTransactionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ValueWithValueMetadata where - Keys: SequenceType, - Keys.Generator.Element == String, - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(keys: Keys) -> [ValueWithValueMetadata] { - return readAtIndexes(ValueWithValueMetadata.indexesWithKeys(keys)) + public func readWithMetadataByKeys< + Keys, Value, Metadata>(_ keys: Keys) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return readWithMetadataAtIndexes(Value.indexesWithKeys(keys)) } /** @@ -99,16 +97,16 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ - public func readAll< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>() -> [ValueWithValueMetadata] { - return readByKeys(keysInCollection(ValueWithValueMetadata.collection)) + public func readWithMetadataAll< + Value, Metadata>() -> [YapItem?] where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return readWithMetadataByKeys(keysInCollection(Value.collection)) } } @@ -120,16 +118,16 @@ extension ConnectionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(index: YapDB.Index) -> ValueWithValueMetadata? { - return read { $0.readAtIndex(index) } + public func readWithMetadataAtIndex< + Value, Metadata>(_ index: YapDB.Index) -> YapItem? where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return read { $0.readWithMetadataAtIndex(index) } } /** @@ -138,18 +136,18 @@ extension ConnectionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ValueWithValueMetadata where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(indexes: Indexes) -> [ValueWithValueMetadata] { - return read { $0.readAtIndexes(indexes) } + public func readWithMetadataAtIndexes< + Indexes, Value, Metadata>(_ indexes: Indexes) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return read { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -158,16 +156,16 @@ extension ConnectionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(key: String) -> ValueWithValueMetadata? { - return readAtIndex(ValueWithValueMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Value, Metadata>(_ key: String) -> YapItem? where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return readWithMetadataAtIndex(Value.indexWithKey(key)) } /** @@ -176,18 +174,18 @@ extension ConnectionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ValueWithValueMetadata where - Keys: SequenceType, - Keys.Generator.Element == String, - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(keys: Keys) -> [ValueWithValueMetadata] { - return readAtIndexes(ValueWithValueMetadata.indexesWithKeys(keys)) + public func readWithMetadataByKeys< + Keys, Value, Metadata>(_ keys: Keys) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return readWithMetadataAtIndexes(Value.indexesWithKeys(keys)) } /** @@ -195,16 +193,16 @@ extension ConnectionType { - returns: an array of `ItemType` */ - public func readAll< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>() -> [ValueWithValueMetadata] { - return read { $0.readAll() } + public func readWithMetadataAll< + Value, Metadata>() -> [YapItem?] where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return read { $0.readWithMetadataAll() } } } @@ -217,16 +215,16 @@ extension WriteTransactionType { - parameter item: the item to store. */ - public func write< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(item: ValueWithValueMetadata) -> ValueWithValueMetadata { - writeAtIndex(item.index, object: item.encoded, metadata: item.metadata?.encoded) + public func writeWithMetadata< + Value, Metadata>(_ item: YapItem) -> YapItem where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + writeAtIndex(item.value.index, object: item.value.encoded, metadata: item.metadata?.encoded) return item } @@ -235,18 +233,18 @@ extension WriteTransactionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ValueWithValueMetadata where - Items: SequenceType, - Items.Generator.Element == ValueWithValueMetadata, - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(items: Items) -> [ValueWithValueMetadata] { - return items.map(write) + public func writeWithMetadata< + Items, Value, Metadata>(_ items: Items) -> [YapItem] where + Items: Sequence, + Items.Iterator.Element == YapItem, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return items.map(writeWithMetadata) } } @@ -257,16 +255,16 @@ extension ConnectionType { - parameter item: the item to store. */ - public func write< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(item: ValueWithValueMetadata) -> ValueWithValueMetadata { - return write { $0.write(item) } + public func writeWithMetadata< + Value, Metadata>(_ item: YapItem) -> YapItem where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return write { $0.writeWithMetadata(item) } } /** @@ -274,18 +272,18 @@ extension ConnectionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ValueWithValueMetadata where - Items: SequenceType, - Items.Generator.Element == ValueWithValueMetadata, - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(items: Items) -> [ValueWithValueMetadata] { - return write { $0.write(items) } + public func writeWithMetadata< + Items, Value, Metadata>(_ items: Items) -> [YapItem] where + Items: Sequence, + Items.Iterator.Element == YapItem, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return write { $0.writeWithMetadata(items) } } /** @@ -295,16 +293,16 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(item: ValueWithValueMetadata, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (ValueWithValueMetadata -> Void)? = .None) { - asyncWrite({ $0.write(item) }, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Value, Metadata>(_ item: YapItem, queue: DispatchQueue = DispatchQueue.main, completion: ((YapItem) -> Void)? = .none) where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + asyncWrite({ $0.writeWithMetadata(item) }, queue: queue, completion: completion) } /** @@ -314,18 +312,18 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - Items, ValueWithValueMetadata where - Items: SequenceType, - Items.Generator.Element == ValueWithValueMetadata, - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([ValueWithValueMetadata] -> Void)? = .None) { - asyncWrite({ $0.write(items) }, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Items, Value, Metadata>(_ items: Items, queue: DispatchQueue = DispatchQueue.main, completion: (([YapItem]) -> Void)? = .none) where + Items: Sequence, + Items.Iterator.Element == YapItem, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + asyncWrite({ $0.writeWithMetadata(items) }, queue: queue, completion: completion) } } diff --git a/Sources/Functional_ValueWithNoMetadata.swift b/Sources/Functional_ValueWithNoMetadata.swift index f1ebbe5..156a4b9 100644 --- a/Sources/Functional_ValueWithNoMetadata.swift +++ b/Sources/Functional_ValueWithNoMetadata.swift @@ -21,13 +21,12 @@ extension ReadTransactionType { - returns: an optional `ItemType` */ public func readAtIndex< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(index: YapDB.Index) -> ValueWithNoMetadata? { - return ValueWithNoMetadata.decode(readAtIndex(index)) + Value>(_ index: YapDB.Index) -> Value? where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { + return Value.decode(readAtIndex(index) as Any?) } /** @@ -37,15 +36,14 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ public func readAtIndexes< - Indexes, ValueWithNoMetadata where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(indexes: Indexes) -> [ValueWithNoMetadata] { - return indexes.flatMap(readAtIndex) + Indexes, Value>(_ indexes: Indexes) -> [Value?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { + return indexes.map(readAtIndex) } /** @@ -55,13 +53,12 @@ extension ReadTransactionType { - returns: an optional `ItemType` */ public func readByKey< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(key: String) -> ValueWithNoMetadata? { - return readAtIndex(ValueWithNoMetadata.indexWithKey(key)) + Value>(_ key: String) -> Value? where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { + return readAtIndex(Value.indexWithKey(key)) } /** @@ -71,15 +68,14 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ public func readByKeys< - Keys, ValueWithNoMetadata where - Keys: SequenceType, - Keys.Generator.Element == String, - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(keys: Keys) -> [ValueWithNoMetadata] { - return readAtIndexes(ValueWithNoMetadata.indexesWithKeys(keys)) + Keys, Value>(_ keys: Keys) -> [Value?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { + return readAtIndexes(Value.indexesWithKeys(keys)) } /** @@ -88,13 +84,12 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ public func readAll< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>() -> [ValueWithNoMetadata] { - return readByKeys(keysInCollection(ValueWithNoMetadata.collection)) + Value>() -> [Value?] where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { + return readByKeys(keysInCollection(Value.collection)) } } @@ -107,12 +102,11 @@ extension ConnectionType { - returns: an optional `ItemType` */ public func readAtIndex< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(index: YapDB.Index) -> ValueWithNoMetadata? { + Value>(_ index: YapDB.Index) -> Value? where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { return read { $0.readAtIndex(index) } } @@ -123,14 +117,13 @@ extension ConnectionType { - returns: an array of `ItemType` */ public func readAtIndexes< - Indexes, ValueWithNoMetadata where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index, - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(indexes: Indexes) -> [ValueWithNoMetadata] { + Indexes, Value>(_ indexes: Indexes) -> [Value?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { return read { $0.readAtIndexes(indexes) } } @@ -141,13 +134,12 @@ extension ConnectionType { - returns: an optional `ItemType` */ public func readByKey< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(key: String) -> ValueWithNoMetadata? { - return readAtIndex(ValueWithNoMetadata.indexWithKey(key)) + Value>(_ key: String) -> Value? where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { + return readAtIndex(Value.indexWithKey(key)) } /** @@ -157,15 +149,14 @@ extension ConnectionType { - returns: an array of `ItemType` */ public func readByKeys< - Keys, ValueWithNoMetadata where - Keys: SequenceType, - Keys.Generator.Element == String, - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(keys: Keys) -> [ValueWithNoMetadata] { - return readAtIndexes(ValueWithNoMetadata.indexesWithKeys(keys)) + Keys, Value>(_ keys: Keys) -> [Value?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { + return readAtIndexes(Value.indexesWithKeys(keys)) } /** @@ -174,12 +165,11 @@ extension ConnectionType { - returns: an array of `ItemType` */ public func readAll< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>() -> [ValueWithNoMetadata] { + Value>() -> [Value?] where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { return read { $0.readAll() } } } @@ -194,13 +184,12 @@ extension WriteTransactionType { - parameter item: the item to store. */ public func write< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(item: ValueWithNoMetadata) -> ValueWithNoMetadata { - writeAtIndex(item.index, object: item.encoded, metadata: .None) + Value>(_ item: Value) -> Value where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { + writeAtIndex(item.index, object: item.encoded, metadata: .none) return item } @@ -210,14 +199,13 @@ extension WriteTransactionType { - parameter items: a SequenceType of items to store. */ public func write< - Items, ValueWithNoMetadata where - Items: SequenceType, - Items.Generator.Element == ValueWithNoMetadata, - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(items: Items) -> [ValueWithNoMetadata] { + Items, Value>(_ items: Items) -> [Value] where + Items: Sequence, + Items.Iterator.Element == Value, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { return items.map(write) } } @@ -230,12 +218,11 @@ extension ConnectionType { - parameter item: the item to store. */ public func write< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(item: ValueWithNoMetadata) -> ValueWithNoMetadata { + Value>(_ item: Value) -> Value where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { return write { $0.write(item) } } @@ -245,14 +232,13 @@ extension ConnectionType { - parameter items: a SequenceType of items to store. */ public func write< - Items, ValueWithNoMetadata where - Items: SequenceType, - Items.Generator.Element == ValueWithNoMetadata, - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(items: Items) -> [ValueWithNoMetadata] { + Items, Value>(_ items: Items) -> [Value] where + Items: Sequence, + Items.Iterator.Element == Value, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { return write { $0.write(items) } } @@ -264,12 +250,11 @@ extension ConnectionType { - parameter completion: a dispatch_block_t for completion. */ public func asyncWrite< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(item: ValueWithNoMetadata, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (ValueWithNoMetadata -> Void)? = .None) { + Value>(_ item: Value, queue: DispatchQueue = DispatchQueue.main, completion: ((Value) -> Void)? = .none) where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { asyncWrite({ $0.write(item) }, queue: queue, completion: completion) } @@ -281,14 +266,13 @@ extension ConnectionType { - parameter completion: a dispatch_block_t for completion. */ public func asyncWrite< - Items, ValueWithNoMetadata where - Items: SequenceType, - Items.Generator.Element == ValueWithNoMetadata, - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([ValueWithNoMetadata] -> Void)? = .None) { + Items, Value>(_ items: Items, queue: DispatchQueue = DispatchQueue.main, completion: (([Value]) -> Void)? = .none) where + Items: Sequence, + Items.Iterator.Element == Value, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.Value == Value { asyncWrite({ $0.write(items) }, queue: queue, completion: completion) } } diff --git a/Sources/Persistable_AnyWithObjectMetadata.swift b/Sources/Persistable_AnyWithObjectMetadata.swift index 13cf725..ed3e226 100644 --- a/Sources/Persistable_AnyWithObjectMetadata.swift +++ b/Sources/Persistable_AnyWithObjectMetadata.swift @@ -12,36 +12,37 @@ import ValueCoding // MARK: - Readable extension Readable where - ItemType: Persistable, - ItemType.MetadataType: NSCoding { + ItemType: Persistable { - func metadataInTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType.MetadataType? { + func metadataInTransaction(_ transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> Metadata? { return transaction.readMetadataAtIndex(index) } - func metadataAtIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> ItemType.MetadataType? { + func metadataAtIndexInTransaction(_ index: YapDB.Index) -> (Database.Connection.ReadTransaction) -> Metadata? { return { self.metadataInTransaction($0, atIndex: index) } } - func metadataInTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> ItemType.MetadataType? { + func metadataInTransactionAtIndex(_ transaction: Database.Connection.ReadTransaction) -> (YapDB.Index) -> Metadata? { return { self.metadataInTransaction(transaction, atIndex: $0) } } func metadataAtIndexesInTransaction< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [ItemType.MetadataType] { - let atIndex = metadataInTransactionAtIndex - return { indexes.flatMap(atIndex($0)) } + Indexes, Metadata>(_ indexes: Indexes) -> (Database.Connection.ReadTransaction) -> [Metadata?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Metadata: NSCoding { + return { indexes.map(self.metadataInTransactionAtIndex($0)) } } /** Reads the metadata at a given index. - parameter index: a YapDB.Index - - returns: an optional `ItemType.MetadataType` + - returns: an optional `Metadata` */ - public func metadataAtIndex(index: YapDB.Index) -> ItemType.MetadataType? { + public func metadataAtIndex< + Metadata>(_ index: YapDB.Index) -> Metadata? where + Metadata: NSCoding { return sync(metadataAtIndexInTransaction(index)) } @@ -49,12 +50,13 @@ extension Readable where Reads the metadata at the indexes. - parameter indexes: a SequenceType of YapDB.Index values - - returns: an array of `ItemType.MetadataType` + - returns: an array of `Metadata` */ public func metadataAtIndexes< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> [ItemType.MetadataType] { + Indexes, Metadata>(_ indexes: Indexes) -> [Metadata?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Metadata: NSCoding { return sync(metadataAtIndexesInTransaction(indexes)) } } diff --git a/Sources/Persistable_AnyWithValueMetadata.swift b/Sources/Persistable_AnyWithValueMetadata.swift index c27762b..ceeb1a1 100644 --- a/Sources/Persistable_AnyWithValueMetadata.swift +++ b/Sources/Persistable_AnyWithValueMetadata.swift @@ -12,38 +12,53 @@ import ValueCoding // MARK: - Readable extension Readable where - ItemType: Persistable, - ItemType.MetadataType: ValueCoding, - ItemType.MetadataType.Coder: NSCoding, - ItemType.MetadataType.Coder.ValueType == ItemType.MetadataType { + ItemType: Persistable { - func metadataInTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType.MetadataType? { + func metadataInTransaction< + Metadata>(_ transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> Metadata? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { return transaction.readMetadataAtIndex(index) } - func metadataAtIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> ItemType.MetadataType? { + func metadataAtIndexInTransaction< + Metadata>(_ index: YapDB.Index) -> (Database.Connection.ReadTransaction) -> Metadata? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { return { self.metadataInTransaction($0, atIndex: index) } } - func metadataInTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> ItemType.MetadataType? { + func metadataInTransactionAtIndex< + Metadata>(_ transaction: Database.Connection.ReadTransaction) -> (YapDB.Index) -> Metadata? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { return { self.metadataInTransaction(transaction, atIndex: $0) } } func metadataAtIndexesInTransaction< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [ItemType.MetadataType] { - let atIndex = metadataInTransactionAtIndex - return { indexes.flatMap(atIndex($0)) } + Indexes, Metadata>(_ indexes: Indexes) -> (Database.Connection.ReadTransaction) -> [Metadata?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { indexes.map(self.metadataInTransactionAtIndex($0)) } } /** Reads the metadata at a given index. - parameter index: a YapDB.Index - - returns: an optional `ItemType.MetadataType` + - returns: an optional `Metadata` */ - public func metadataAtIndex(index: YapDB.Index) -> ItemType.MetadataType? { + public func metadataAtIndex< + Metadata>(_ index: YapDB.Index) -> Metadata? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { return sync(metadataAtIndexInTransaction(index)) } @@ -51,12 +66,15 @@ extension Readable where Reads the metadata at the indexes. - parameter indexes: a SequenceType of YapDB.Index values - - returns: an array of `ItemType.MetadataType` + - returns: an array of `Metadata` */ public func metadataAtIndexes< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> [ItemType.MetadataType] { + Indexes, Metadata>(_ indexes: Indexes) -> [Metadata?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { return sync(metadataAtIndexesInTransaction(indexes)) } } diff --git a/Sources/Persistable_ObjectWithNoMetadata.swift b/Sources/Persistable_ObjectWithNoMetadata.swift index 17c3b13..52072d6 100644 --- a/Sources/Persistable_ObjectWithNoMetadata.swift +++ b/Sources/Persistable_ObjectWithNoMetadata.swift @@ -12,8 +12,7 @@ import ValueCoding // MARK: - Persistable extension Persistable where - Self: NSCoding, - Self.MetadataType == Void { + Self: NSCoding { // Writing @@ -23,7 +22,7 @@ extension Persistable where - parameter transaction: a YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> Self { + public func write(_ transaction: WriteTransaction) -> Self { return transaction.write(self) } @@ -33,7 +32,7 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> Self { + public func write(_ connection: Connection) -> Self { return connection.write(self) } @@ -43,7 +42,7 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (Self -> Void)? = .None) { + public func asyncWrite(_ connection: Connection, queue: DispatchQueue = DispatchQueue.main, completion: ((Self) -> Void)? = .none) { return connection.asyncWrite(self, queue: queue, completion: completion) } @@ -53,15 +52,14 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeOperation(_ connection: Connection) -> Operation { + return BlockOperation { _ = connection.write(self) } } } -extension SequenceType where - Generator.Element: Persistable, - Generator.Element: NSCoding, - Generator.Element.MetadataType == Void { +extension Sequence where + Iterator.Element: Persistable, + Iterator.Element: NSCoding { /** Write the items using an existing transaction. @@ -69,7 +67,7 @@ extension SequenceType where - parameter transaction: a WriteTransactionType e.g. YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> [Generator.Element] { + public func write(_ transaction: WriteTransaction) -> [Iterator.Element] { return transaction.write(self) } @@ -79,7 +77,7 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> [Generator.Element] { + public func write(_ connection: Connection) -> [Iterator.Element] { return connection.write(self) } @@ -89,7 +87,7 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([Generator.Element] -> Void)? = .None) { + public func asyncWrite(_ connection: Connection, queue: DispatchQueue = DispatchQueue.main, completion: (([Iterator.Element]) -> Void)? = .none) { return connection.asyncWrite(self, queue: queue, completion: completion) } @@ -99,8 +97,8 @@ extension SequenceType where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeOperation(_ connection: Connection) -> Operation { + return BlockOperation { _ = connection.write(self) } } } @@ -108,46 +106,45 @@ extension SequenceType where extension Readable where ItemType: NSCoding, - ItemType: Persistable, - ItemType.MetadataType == Void { + ItemType: Persistable { - func inTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType? { + func inTransaction(_ transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType? { return transaction.readAtIndex(index) } - func inTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> ItemType? { + func inTransactionAtIndex(_ transaction: Database.Connection.ReadTransaction) -> (YapDB.Index) -> ItemType? { return { self.inTransaction(transaction, atIndex: $0) } } - func atIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> ItemType? { + func atIndexInTransaction(_ index: YapDB.Index) -> (Database.Connection.ReadTransaction) -> ItemType? { return { self.inTransaction($0, atIndex: index) } } func atIndexesInTransaction< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [ItemType] { + Indexes>(_ indexes: Indexes) -> (Database.Connection.ReadTransaction) -> [ItemType?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index { let atIndex = inTransactionAtIndex - return { indexes.flatMap(atIndex($0)) } + return { indexes.map(atIndex($0)) } } - func inTransaction(transaction: Database.Connection.ReadTransaction, byKey key: String) -> ItemType? { + func inTransaction(_ transaction: Database.Connection.ReadTransaction, byKey key: String) -> ItemType? { return inTransaction(transaction, atIndex: ItemType.indexWithKey(key)) } - func inTransactionByKey(transaction: Database.Connection.ReadTransaction) -> String -> ItemType? { + func inTransactionByKey(_ transaction: Database.Connection.ReadTransaction) -> (String) -> ItemType? { return { self.inTransaction(transaction, byKey: $0) } } - func byKeyInTransaction(key: String) -> Database.Connection.ReadTransaction -> ItemType? { + func byKeyInTransaction(_ key: String) -> (Database.Connection.ReadTransaction) -> ItemType? { return { self.inTransaction($0, byKey: key) } } - func byKeysInTransaction(keys: [String]? = .None) -> Database.Connection.ReadTransaction -> [ItemType] { + func byKeysInTransaction(_ keys: [String]? = .none) -> (Database.Connection.ReadTransaction) -> [ItemType?] { let byKey = inTransactionByKey return { transaction in let keys = keys ?? transaction.keysInCollection(ItemType.collection) - return keys.flatMap(byKey(transaction)) + return keys.map(byKey(transaction)) } } @@ -157,7 +154,7 @@ extension Readable where - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func atIndex(index: YapDB.Index) -> ItemType? { + public func atIndex(_ index: YapDB.Index) -> ItemType? { return sync(atIndexInTransaction(index)) } @@ -168,9 +165,9 @@ extension Readable where - returns: an array of `ItemType` */ public func atIndexes< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> [ItemType] { + Indexes>(_ indexes: Indexes) -> [ItemType?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index { return sync(atIndexesInTransaction(indexes)) } @@ -180,7 +177,7 @@ extension Readable where - parameter key: a String - returns: an optional `ItemType` */ - public func byKey(key: String) -> ItemType? { + public func byKey(_ key: String) -> ItemType? { return sync(byKeyInTransaction(key)) } @@ -191,9 +188,9 @@ extension Readable where - returns: an array of `ItemType` */ public func byKeys< - Keys where - Keys: SequenceType, - Keys.Generator.Element == String>(keys: Keys) -> [ItemType] { + Keys>(_ keys: Keys) -> [ItemType?] where + Keys: Sequence, + Keys.Iterator.Element == String { return sync(byKeysInTransaction(Array(keys))) } @@ -202,7 +199,7 @@ extension Readable where - returns: an array of `ItemType` */ - public func all() -> [ItemType] { + public func all() -> [ItemType?] { return sync(byKeysInTransaction()) } @@ -212,12 +209,18 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: a tuple of type `([ItemType], [String])` */ - public func filterExisting(keys: [String]) -> (existing: [ItemType], missing: [String]) { + public func filterExisting(_ keys: [String]) -> (existing: [ItemType], missing: [String]) { let existingInTransaction = byKeysInTransaction(keys) return sync { transaction -> ([ItemType], [String]) in - let existing = existingInTransaction(transaction) - let existingKeys = existing.map(keyForPersistable) - let missingKeys = keys.filter { !existingKeys.contains($0) } + var missingKeys = [String]() + let maybeExisting = existingInTransaction(transaction) + let existing = zip(keys, maybeExisting).flatMap { zipped -> ItemType? in + guard let item = zipped.1 else { + missingKeys.append(zipped.0) + return nil + } + return item + } return (existing, missingKeys) } } diff --git a/Sources/Persistable_ObjectWithObjectMetadata.swift b/Sources/Persistable_ObjectWithObjectMetadata.swift index e910b72..4f33c88 100644 --- a/Sources/Persistable_ObjectWithObjectMetadata.swift +++ b/Sources/Persistable_ObjectWithObjectMetadata.swift @@ -7,13 +7,11 @@ // import Foundation -import ValueCoding // MARK: - Persistable extension Persistable where - Self: NSCoding, - Self.MetadataType: NSCoding { + Self: NSCoding { // Writing @@ -23,8 +21,11 @@ extension Persistable where - parameter transaction: a YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> Self { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata>(_ transaction: WriteTransaction, metadata: Metadata?) -> YapItem where + WriteTransaction: WriteTransactionType, + Metadata: NSCoding { + return transaction.writeWithMetadata(YapItem(self, metadata)) } /** @@ -33,8 +34,11 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> Self { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: Metadata?) -> YapItem where + Connection: ConnectionType, + Metadata: NSCoding { + return connection.writeWithMetadata(YapItem(self, metadata)) } /** @@ -43,8 +47,11 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (Self -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: Metadata?, queue: DispatchQueue = DispatchQueue.main, completion: ((YapItem) -> Void)? = .none) where + Connection: ConnectionType, + Metadata: NSCoding { + return connection.asyncWriteWithMetadata(YapItem(self, metadata), queue: queue, completion: completion) } /** @@ -53,15 +60,32 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata>(_ connection: Connection, metadata: Metadata?) -> Operation where + Connection: ConnectionType, + Metadata: NSCoding { + return BlockOperation { _ = connection.writeWithMetadata(YapItem(self, metadata)) } } } -extension SequenceType where - Generator.Element: Persistable, - Generator.Element: NSCoding, - Generator.Element.MetadataType: NSCoding { +extension Sequence where + Iterator.Element: Persistable, + Iterator.Element: NSCoding { + + /** + Zips the receiver with metadata into an array of YapItem. + Assumes `self` and `metadata` have the same `count`. + + - parameter metadata: a sequence of optional metadatas. + - returns: an array where Persistables and Metadata with corresponding indexes in `self` and `metadata` are joined in a `YapItem` + */ + public func yapItems< + Metadatas, Metadata>(with metadata: Metadatas) -> [YapItem] where + Metadata: NSCoding, + Metadatas: Sequence, + Metadatas.Iterator.Element == Optional { + return zip(self, metadata).map { YapItem($0, $1) } + } /** Write the items using an existing transaction. @@ -69,8 +93,12 @@ extension SequenceType where - parameter transaction: a WriteTransactionType e.g. YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> [Generator.Element] { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata>(_ transaction: WriteTransaction, metadata: [Metadata?]) -> [YapItem] where + WriteTransaction: WriteTransactionType, + Metadata: NSCoding { + let items = yapItems(with: metadata) + return transaction.writeWithMetadata(items) } /** @@ -79,8 +107,12 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> [Generator.Element] { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: [Metadata?]) -> [YapItem] where + Connection: ConnectionType, + Metadata: NSCoding { + let items = yapItems(with: metadata) + return connection.writeWithMetadata(items) } /** @@ -89,8 +121,12 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([Generator.Element] -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: [Metadata?], queue: DispatchQueue = DispatchQueue.main, completion: (([YapItem]) -> Void)? = .none) where + Connection: ConnectionType, + Metadata: NSCoding { + let items = yapItems(with: metadata) + return connection.asyncWriteWithMetadata(items, queue: queue, completion: completion) } /** @@ -99,8 +135,12 @@ extension SequenceType where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata>(_ connection: Connection, metadata: [Metadata?]) -> Operation where + Connection: ConnectionType, + Metadata: NSCoding { + let items = yapItems(with: metadata) + return BlockOperation { _ = connection.writeWithMetadata(items) } } } @@ -109,46 +149,44 @@ extension SequenceType where extension Readable where ItemType: NSCoding, - ItemType: Persistable, - ItemType.MetadataType: NSCoding { + ItemType: Persistable { - func inTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType? { - return transaction.readAtIndex(index) + func withMetadataInTransaction(_ transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> YapItem? { + return transaction.readWithMetadataAtIndex(index) } - func inTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> ItemType? { - return { self.inTransaction(transaction, atIndex: $0) } + func withMetadataInTransactionAtIndex(_ transaction: Database.Connection.ReadTransaction) -> (YapDB.Index) -> YapItem? { + return { self.withMetadataInTransaction(transaction, atIndex: $0) } } - func atIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, atIndex: index) } + func withMetadataAtIndexInTransaction(_ index: YapDB.Index) -> (Database.Connection.ReadTransaction) -> YapItem? { + return { self.withMetadataInTransaction($0, atIndex: index) } } - func atIndexesInTransaction< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [ItemType] { - let atIndex = inTransactionAtIndex - return { indexes.flatMap(atIndex($0)) } + func withMetadataAtIndexesInTransaction< + Indexes, Metadata>(_ indexes: Indexes) -> (Database.Connection.ReadTransaction) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Metadata: NSCoding { + return { indexes.map(self.withMetadataInTransactionAtIndex($0)) } } - func inTransaction(transaction: Database.Connection.ReadTransaction, byKey key: String) -> ItemType? { - return inTransaction(transaction, atIndex: ItemType.indexWithKey(key)) + func withMetadataInTransaction(_ transaction: Database.Connection.ReadTransaction, byKey key: String) -> YapItem? { + return withMetadataInTransaction(transaction, atIndex: ItemType.indexWithKey(key)) } - func inTransactionByKey(transaction: Database.Connection.ReadTransaction) -> String -> ItemType? { - return { self.inTransaction(transaction, byKey: $0) } + func withMetadataInTransactionByKey(_ transaction: Database.Connection.ReadTransaction) -> (String) -> YapItem? { + return { self.withMetadataInTransaction(transaction, byKey: $0) } } - func byKeyInTransaction(key: String) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, byKey: key) } + func withMetadataByKeyInTransaction(_ key: String) -> (Database.Connection.ReadTransaction) -> YapItem? { + return { self.withMetadataInTransaction($0, byKey: key) } } - func byKeysInTransaction(keys: [String]? = .None) -> Database.Connection.ReadTransaction -> [ItemType] { - let byKey = inTransactionByKey + func withMetadataByKeysInTransaction(_ keys: [String]? = .none) -> (Database.Connection.ReadTransaction) -> [YapItem?] { return { transaction in let keys = keys ?? transaction.keysInCollection(ItemType.collection) - return keys.flatMap(byKey(transaction)) + return keys.map(self.withMetadataInTransactionByKey(transaction)) } } @@ -158,8 +196,8 @@ extension Readable where - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func atIndex(index: YapDB.Index) -> ItemType? { - return sync(atIndexInTransaction(index)) + public func withMetadataAtIndex(_ index: YapDB.Index) -> YapItem? { + return sync(withMetadataAtIndexInTransaction(index)) } /** @@ -168,11 +206,12 @@ extension Readable where - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func atIndexes< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> [ItemType] { - return sync(atIndexesInTransaction(indexes)) + public func withMetadataAtIndexes< + Indexes, Metadata>(_ indexes: Indexes) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Metadata: NSCoding { + return sync(withMetadataAtIndexesInTransaction(indexes)) } /** @@ -181,8 +220,8 @@ extension Readable where - parameter key: a String - returns: an optional `ItemType` */ - public func byKey(key: String) -> ItemType? { - return sync(byKeyInTransaction(key)) + public func withMetadataByKey(_ key: String) -> YapItem? { + return sync(withMetadataByKeyInTransaction(key)) } /** @@ -191,11 +230,12 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func byKeys< - Keys where - Keys: SequenceType, - Keys.Generator.Element == String>(keys: Keys) -> [ItemType] { - return sync(byKeysInTransaction(Array(keys))) + public func withMetadataByKeys< + Keys, Metadata>(_ keys: Keys) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Metadata: NSCoding { + return sync(withMetadataByKeysInTransaction(Array(keys))) } /** @@ -203,8 +243,8 @@ extension Readable where - returns: an array of `ItemType` */ - public func all() -> [ItemType] { - return sync(byKeysInTransaction()) + public func withMetadataAll() -> [YapItem?] { + return sync(withMetadataByKeysInTransaction()) } /** @@ -213,12 +253,18 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: a tuple of type `([ItemType], [String])` */ - public func filterExisting(keys: [String]) -> (existing: [ItemType], missing: [String]) { - let existingInTransaction = byKeysInTransaction(keys) - return sync { transaction -> ([ItemType], [String]) in - let existing = existingInTransaction(transaction) - let existingKeys = existing.map(keyForPersistable) - let missingKeys = keys.filter { !existingKeys.contains($0) } + public func withMetadataFilterExisting(_ keys: [String]) -> (existing: [YapItem], missing: [String]) { + let existingInTransaction: (Database.Connection.ReadTransaction) -> [YapItem?] = withMetadataByKeysInTransaction(keys) + return sync { transaction -> ([YapItem], [String]) in + var missingKeys = [String]() + let maybeExisting = existingInTransaction(transaction) + let existing = zip(keys, maybeExisting).flatMap { zipped -> YapItem? in + guard let item = zipped.1 else { + missingKeys.append(zipped.0) + return nil + } + return item + } return (existing, missingKeys) } } diff --git a/Sources/Persistable_ObjectWithValueMetadata.swift b/Sources/Persistable_ObjectWithValueMetadata.swift index 2d63a2a..e71fa2e 100644 --- a/Sources/Persistable_ObjectWithValueMetadata.swift +++ b/Sources/Persistable_ObjectWithValueMetadata.swift @@ -12,10 +12,7 @@ import ValueCoding // MARK: - Persistable extension Persistable where - Self: NSCoding, - Self.MetadataType: ValueCoding, - Self.MetadataType.Coder: NSCoding, - Self.MetadataType.Coder.ValueType == Self.MetadataType { + Self: NSCoding { // Writing @@ -25,8 +22,13 @@ extension Persistable where - parameter transaction: a YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> Self { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata>(_ transaction: WriteTransaction, metadata: Metadata?) -> YapItem where + WriteTransaction: WriteTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return transaction.writeWithMetadata(YapItem(self, metadata)) } /** @@ -35,8 +37,13 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> Self { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: Metadata?) -> YapItem where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return connection.writeWithMetadata(YapItem(self, metadata)) } /** @@ -45,8 +52,13 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (Self -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: Metadata?, queue: DispatchQueue = DispatchQueue.main, completion: ((YapItem) -> Void)? = .none) where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return connection.asyncWriteWithMetadata(YapItem(self, metadata), queue: queue, completion: completion) } /** @@ -55,17 +67,36 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata>(_ connection: Connection, metadata: Metadata?) -> Operation where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return BlockOperation { _ = connection.writeWithMetadata(YapItem(self, metadata)) } } } -extension SequenceType where - Generator.Element: Persistable, - Generator.Element: NSCoding, - Generator.Element.MetadataType: ValueCoding, - Generator.Element.MetadataType.Coder: NSCoding, - Generator.Element.MetadataType.Coder.ValueType == Generator.Element.MetadataType { +extension Sequence where + Iterator.Element: Persistable, + Iterator.Element: NSCoding { + + /** + Zips the receiver with metadata into an array of YapItem. + Assumes `self` and `metadata` have the same `count`. + + - parameter metadata: a sequence of optional metadatas. + - returns: an array where Persistables and Metadata with corresponding indexes in `self` and `metadata` are joined in a `YapItem` + */ + public func yapItems< + Metadatas, Metadata>(with metadata: Metadatas) -> [YapItem] where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata, + Metadatas: Sequence, + Metadatas.Iterator.Element == Optional { + return zip(self, metadata).map { YapItem($0, $1) } + } /** Write the items using an existing transaction. @@ -73,8 +104,14 @@ extension SequenceType where - parameter transaction: a WriteTransactionType e.g. YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> [Generator.Element] { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata>(_ transaction: WriteTransaction, metadata: [Metadata?]) -> [YapItem] where + WriteTransaction: WriteTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + let items = yapItems(with: metadata) + return transaction.writeWithMetadata(items) } /** @@ -83,8 +120,14 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> [Generator.Element] { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: [Metadata?]) -> [YapItem] where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + let items = yapItems(with: metadata) + return connection.writeWithMetadata(items) } /** @@ -93,8 +136,14 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([Generator.Element] -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: [Metadata?], queue: DispatchQueue = DispatchQueue.main, completion: (([YapItem]) -> Void)? = .none) where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + let items = yapItems(with: metadata) + return connection.asyncWriteWithMetadata(items, queue: queue, completion: completion) } /** @@ -103,8 +152,14 @@ extension SequenceType where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata>(_ connection: Connection, metadata: [Metadata?]) -> Operation where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + let items = yapItems(with: metadata) + return BlockOperation { _ = connection.writeWithMetadata(items) } } } @@ -112,48 +167,74 @@ extension SequenceType where extension Readable where ItemType: NSCoding, - ItemType: Persistable, - ItemType.MetadataType: ValueCoding, - ItemType.MetadataType.Coder: NSCoding, - ItemType.MetadataType.Coder.ValueType == ItemType.MetadataType { - - func inTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType? { - return transaction.readAtIndex(index) + ItemType: Persistable { + + func withMetadataInTransaction< + Metadata>(_ transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return transaction.readWithMetadataAtIndex(index) } - func inTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> ItemType? { - return { self.inTransaction(transaction, atIndex: $0) } + func withMetadataInTransactionAtIndex< + Metadata>(_ transaction: Database.Connection.ReadTransaction) -> (YapDB.Index) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { self.withMetadataInTransaction(transaction, atIndex: $0) } } - func atIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, atIndex: index) } + func withMetadataAtIndexInTransaction< + Metadata>(_ index: YapDB.Index) -> (Database.Connection.ReadTransaction) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { self.withMetadataInTransaction($0, atIndex: index) } } - func atIndexesInTransaction< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [ItemType] { - let atIndex = inTransactionAtIndex - return { indexes.flatMap(atIndex($0)) } + func withMetadataAtIndexesInTransaction< + Indexes, Metadata>(_ indexes: Indexes) -> (Database.Connection.ReadTransaction) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { indexes.map(self.withMetadataInTransactionAtIndex($0)) } } - func inTransaction(transaction: Database.Connection.ReadTransaction, byKey key: String) -> ItemType? { - return inTransaction(transaction, atIndex: ItemType.indexWithKey(key)) + func withMetadataInTransaction< + Metadata>(_ transaction: Database.Connection.ReadTransaction, byKey key: String) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return withMetadataInTransaction(transaction, atIndex: ItemType.indexWithKey(key)) } - func inTransactionByKey(transaction: Database.Connection.ReadTransaction) -> String -> ItemType? { - return { self.inTransaction(transaction, byKey: $0) } + func withMetadataInTransactionByKey< + Metadata>(_ transaction: Database.Connection.ReadTransaction) -> (String) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { self.withMetadataInTransaction(transaction, byKey: $0) } } - func byKeyInTransaction(key: String) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, byKey: key) } + func withMetadataByKeyInTransaction< + Metadata>(_ key: String) -> (Database.Connection.ReadTransaction) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { self.withMetadataInTransaction($0, byKey: key) } } - func byKeysInTransaction(keys: [String]? = .None) -> Database.Connection.ReadTransaction -> [ItemType] { - let byKey = inTransactionByKey + func withMetadataByKeysInTransaction< + Metadata>(_ keys: [String]? = .none) -> (Database.Connection.ReadTransaction) -> [YapItem?] where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { return { transaction in let keys = keys ?? transaction.keysInCollection(ItemType.collection) - return keys.flatMap(byKey(transaction)) + return keys.map(self.withMetadataInTransactionByKey(transaction)) } } @@ -163,8 +244,12 @@ extension Readable where - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func atIndex(index: YapDB.Index) -> ItemType? { - return sync(atIndexInTransaction(index)) + public func withMetadataAtIndex< + Metadata>(_ index: YapDB.Index) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return sync(withMetadataAtIndexInTransaction(index)) } /** @@ -173,11 +258,14 @@ extension Readable where - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func atIndexes< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> [ItemType] { - return sync(atIndexesInTransaction(indexes)) + public func withMetadataAtIndexes< + Indexes, Metadata>(_ indexes: Indexes) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return sync(withMetadataAtIndexesInTransaction(indexes)) } /** @@ -186,8 +274,12 @@ extension Readable where - parameter key: a String - returns: an optional `ItemType` */ - public func byKey(key: String) -> ItemType? { - return sync(byKeyInTransaction(key)) + public func withMetadataByKey< + Metadata>(_ key: String) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return sync(withMetadataByKeyInTransaction(key)) } /** @@ -196,11 +288,14 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func byKeys< - Keys where - Keys: SequenceType, - Keys.Generator.Element == String>(keys: Keys) -> [ItemType] { - return sync(byKeysInTransaction(Array(keys))) + public func withMetadataByKeys< + Keys, Metadata>(_ keys: Keys) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return sync(withMetadataByKeysInTransaction(Array(keys))) } /** @@ -208,8 +303,12 @@ extension Readable where - returns: an array of `ItemType` */ - public func all() -> [ItemType] { - return sync(byKeysInTransaction()) + public func withMetadataAll< + Metadata>() -> [YapItem?] where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return sync(withMetadataByKeysInTransaction()) } /** @@ -218,12 +317,22 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: a tuple of type `([ItemType], [String])` */ - public func filterExisting(keys: [String]) -> (existing: [ItemType], missing: [String]) { - let existingInTransaction = byKeysInTransaction(keys) - return sync { transaction -> ([ItemType], [String]) in - let existing = existingInTransaction(transaction) - let existingKeys = existing.map(keyForPersistable) - let missingKeys = keys.filter { !existingKeys.contains($0) } + public func withMetadataFilterExisting< + Metadata>(_ keys: [String]) -> (existing: [YapItem], missing: [String]) where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + let existingInTransaction: (Database.Connection.ReadTransaction) -> [YapItem?] = withMetadataByKeysInTransaction(keys) + return sync { transaction -> ([YapItem], [String]) in + var missingKeys = [String]() + let maybeExisting = existingInTransaction(transaction) + let existing = zip(keys, maybeExisting).flatMap { zipped -> YapItem? in + guard let item = zipped.1 else { + missingKeys.append(zipped.0) + return nil + } + return item + } return (existing, missingKeys) } } diff --git a/Sources/Persistable_Remove.swift b/Sources/Persistable_Remove.swift index c99913f..62b1ba9 100644 --- a/Sources/Persistable_Remove.swift +++ b/Sources/Persistable_Remove.swift @@ -12,7 +12,7 @@ extension Persistable { - parameter transaction: a `WriteTransactionType` transaction */ - public func remove(transaction: WriteTransaction) { + public func remove(_ transaction: WriteTransaction) { transaction.remove(self) } @@ -21,7 +21,7 @@ extension Persistable { - parameter connection: a `ConnectionType` connection */ - public func remove(connection: Connection) { + public func remove(_ connection: Connection) { connection.remove(self) } @@ -30,7 +30,7 @@ extension Persistable { - parameter connection: a `ConnectionType` connection */ - public func asyncRemove(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: dispatch_block_t? = .None) { + public func asyncRemove(_ connection: Connection, queue: DispatchQueue = DispatchQueue.main, completion: (()->())? = .none) { connection.asyncRemove(self, queue: queue, completion: completion) } @@ -40,20 +40,20 @@ extension Persistable { - parameter connection: a `ConnectionType` connection */ - public func removeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.remove(self) } + public func removeOperation(_ connection: Connection) -> Operation { + return BlockOperation { connection.remove(self) } } } -extension SequenceType where -Generator.Element: Persistable { +extension Sequence where +Iterator.Element: Persistable { /** Removes the receiver using the write transaction. - parameter transaction: a `WriteTransactionType` transaction */ - public func remove(transaction: WriteTransaction) { + public func remove(_ transaction: WriteTransaction) { transaction.remove(self) } @@ -62,7 +62,7 @@ Generator.Element: Persistable { - parameter connection: a `ConnectionType` connection */ - public func remove(connection: Connection) { + public func remove(_ connection: Connection) { connection.remove(self) } @@ -71,7 +71,7 @@ Generator.Element: Persistable { - parameter connection: a `ConnectionType` connection */ - public func asyncRemove(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: dispatch_block_t? = .None) { + public func asyncRemove(_ connection: Connection, queue: DispatchQueue = DispatchQueue.main, completion: (()->())? = .none) { connection.asyncRemove(self, queue: queue, completion: completion) } @@ -81,8 +81,8 @@ Generator.Element: Persistable { - parameter connection: a `ConnectionType` connection */ - public func removeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.remove(self) } + public func removeOperation(_ connection: Connection) -> Operation { + return BlockOperation { connection.remove(self) } } } diff --git a/Sources/Persistable_ValueWithNoMetadata.swift b/Sources/Persistable_ValueWithNoMetadata.swift index e52e301..40f8225 100644 --- a/Sources/Persistable_ValueWithNoMetadata.swift +++ b/Sources/Persistable_ValueWithNoMetadata.swift @@ -13,9 +13,8 @@ import ValueCoding extension Persistable where Self: ValueCoding, - Self.MetadataType == Void, Self.Coder: NSCoding, - Self.Coder.ValueType == Self { + Self.Coder.Value == Self { // Writing @@ -25,7 +24,7 @@ extension Persistable where - parameter transaction: a YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> Self { + public func write(_ transaction: WriteTransaction) -> Self { return transaction.write(self) } @@ -35,7 +34,7 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> Self { + public func write(_ connection: Connection) -> Self { return connection.write(self) } @@ -45,7 +44,7 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (Self -> Void)? = .None) { + public func asyncWrite(_ connection: Connection, queue: DispatchQueue = DispatchQueue.main, completion: ((Self) -> Void)? = .none) { return connection.asyncWrite(self, queue: queue, completion: completion) } @@ -55,17 +54,16 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeOperation(_ connection: Connection) -> Operation { + return BlockOperation { _ = connection.write(self) } } } -extension SequenceType where - Generator.Element: Persistable, - Generator.Element: ValueCoding, - Generator.Element.MetadataType == Void, - Generator.Element.Coder: NSCoding, - Generator.Element.Coder.ValueType == Generator.Element { +extension Sequence where + Iterator.Element: Persistable, + Iterator.Element: ValueCoding, + Iterator.Element.Coder: NSCoding, + Iterator.Element.Coder.Value == Iterator.Element { /** Write the items using an existing transaction. @@ -73,7 +71,7 @@ extension SequenceType where - parameter transaction: a WriteTransactionType e.g. YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> [Generator.Element] { + public func write(_ transaction: WriteTransaction) -> [Iterator.Element] { return transaction.write(self) } @@ -83,7 +81,7 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> [Generator.Element] { + public func write(_ connection: Connection) -> [Iterator.Element] { return connection.write(self) } @@ -93,7 +91,7 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([Generator.Element] -> Void)? = .None) { + public func asyncWrite(_ connection: Connection, queue: DispatchQueue = DispatchQueue.main, completion: (([Iterator.Element]) -> Void)? = .none) { return connection.asyncWrite(self, queue: queue, completion: completion) } @@ -103,8 +101,8 @@ extension SequenceType where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeOperation(_ connection: Connection) -> Operation { + return BlockOperation { _ = connection.write(self) } } } @@ -113,47 +111,46 @@ extension SequenceType where extension Readable where ItemType: ValueCoding, ItemType: Persistable, - ItemType.MetadataType == Void, ItemType.Coder: NSCoding, - ItemType.Coder.ValueType == ItemType { + ItemType.Coder.Value == ItemType { - func inTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType? { + func inTransaction(_ transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType? { return transaction.readAtIndex(index) } - func inTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> ItemType? { + func inTransactionAtIndex(_ transaction: Database.Connection.ReadTransaction) -> (YapDB.Index) -> ItemType? { return { self.inTransaction(transaction, atIndex: $0) } } - func atIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> ItemType? { + func atIndexInTransaction(_ index: YapDB.Index) -> (Database.Connection.ReadTransaction) -> ItemType? { return { self.inTransaction($0, atIndex: index) } } func atIndexesInTransaction< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [ItemType] { + Indexes>(_ indexes: Indexes) -> (Database.Connection.ReadTransaction) -> [ItemType?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index { let atIndex = inTransactionAtIndex - return { indexes.flatMap(atIndex($0)) } + return { indexes.map(atIndex($0)) } } - func inTransaction(transaction: Database.Connection.ReadTransaction, byKey key: String) -> ItemType? { + func inTransaction(_ transaction: Database.Connection.ReadTransaction, byKey key: String) -> ItemType? { return inTransaction(transaction, atIndex: ItemType.indexWithKey(key)) } - func inTransactionByKey(transaction: Database.Connection.ReadTransaction) -> String -> ItemType? { + func inTransactionByKey(_ transaction: Database.Connection.ReadTransaction) -> (String) -> ItemType? { return { self.inTransaction(transaction, byKey: $0) } } - func byKeyInTransaction(key: String) -> Database.Connection.ReadTransaction -> ItemType? { + func byKeyInTransaction(_ key: String) -> (Database.Connection.ReadTransaction) -> ItemType? { return { self.inTransaction($0, byKey: key) } } - func byKeysInTransaction(keys: [String]? = .None) -> Database.Connection.ReadTransaction -> [ItemType] { + func byKeysInTransaction(_ keys: [String]? = .none) -> (Database.Connection.ReadTransaction) -> [ItemType?] { let byKey = inTransactionByKey return { transaction in let keys = keys ?? transaction.keysInCollection(ItemType.collection) - return keys.flatMap(byKey(transaction)) + return keys.map(byKey(transaction)) } } @@ -163,7 +160,7 @@ extension Readable where - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func atIndex(index: YapDB.Index) -> ItemType? { + public func atIndex(_ index: YapDB.Index) -> ItemType? { return sync(atIndexInTransaction(index)) } @@ -174,9 +171,9 @@ extension Readable where - returns: an array of `ItemType` */ public func atIndexes< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> [ItemType] { + Indexes>(_ indexes: Indexes) -> [ItemType?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index { return sync(atIndexesInTransaction(indexes)) } @@ -186,7 +183,7 @@ extension Readable where - parameter key: a String - returns: an optional `ItemType` */ - public func byKey(key: String) -> ItemType? { + public func byKey(_ key: String) -> ItemType? { return sync(byKeyInTransaction(key)) } @@ -197,9 +194,9 @@ extension Readable where - returns: an array of `ItemType` */ public func byKeys< - Keys where - Keys: SequenceType, - Keys.Generator.Element == String>(keys: Keys) -> [ItemType] { + Keys>(_ keys: Keys) -> [ItemType?] where + Keys: Sequence, + Keys.Iterator.Element == String { return sync(byKeysInTransaction(Array(keys))) } @@ -208,7 +205,7 @@ extension Readable where - returns: an array of `ItemType` */ - public func all() -> [ItemType] { + public func all() -> [ItemType?] { return sync(byKeysInTransaction()) } @@ -218,12 +215,18 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: a tuple of type `([ItemType], [String])` */ - public func filterExisting(keys: [String]) -> (existing: [ItemType], missing: [String]) { + public func filterExisting(_ keys: [String]) -> (existing: [ItemType], missing: [String]) { let existingInTransaction = byKeysInTransaction(keys) return sync { transaction -> ([ItemType], [String]) in - let existing = existingInTransaction(transaction) - let existingKeys = existing.map(keyForPersistable) - let missingKeys = keys.filter { !existingKeys.contains($0) } + var missingKeys = [String]() + let maybeExisting = existingInTransaction(transaction) + let existing = zip(keys, maybeExisting).flatMap { zipped -> ItemType? in + guard let item = zipped.1 else { + missingKeys.append(zipped.0) + return nil + } + return item + } return (existing, missingKeys) } } diff --git a/Sources/Persistable_ValueWithObjectMetadata.swift b/Sources/Persistable_ValueWithObjectMetadata.swift index ceb3f47..4af8229 100644 --- a/Sources/Persistable_ValueWithObjectMetadata.swift +++ b/Sources/Persistable_ValueWithObjectMetadata.swift @@ -14,8 +14,7 @@ import ValueCoding extension Persistable where Self: ValueCoding, Self.Coder: NSCoding, - Self.Coder.ValueType == Self, - Self.MetadataType: NSCoding { + Self.Coder.Value == Self { // Writing @@ -25,8 +24,11 @@ extension Persistable where - parameter transaction: a YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> Self { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata>(_ transaction: WriteTransaction, metadata: Metadata?) -> YapItem where + WriteTransaction: WriteTransactionType, + Metadata: NSCoding { + return transaction.writeWithMetadata(YapItem(self, metadata)) } /** @@ -35,8 +37,11 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> Self { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: Metadata?) -> YapItem where + Connection: ConnectionType, + Metadata: NSCoding { + return connection.writeWithMetadata(YapItem(self, metadata)) } /** @@ -45,8 +50,11 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (Self -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: Metadata?, queue: DispatchQueue = DispatchQueue.main, completion: ((YapItem) -> Void)? = .none) where + Connection: ConnectionType, + Metadata: NSCoding { + return connection.asyncWriteWithMetadata(YapItem(self, metadata), queue: queue, completion: completion) } /** @@ -55,17 +63,34 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata>(_ connection: Connection, metadata: Metadata?) -> Operation where + Connection: ConnectionType, + Metadata: NSCoding { + return BlockOperation { _ = connection.writeWithMetadata(YapItem(self, metadata)) } } } -extension SequenceType where - Generator.Element: Persistable, - Generator.Element: ValueCoding, - Generator.Element.Coder: NSCoding, - Generator.Element.Coder.ValueType == Generator.Element, - Generator.Element.MetadataType: NSCoding { +extension Sequence where + Iterator.Element: Persistable, + Iterator.Element: ValueCoding, + Iterator.Element.Coder: NSCoding, + Iterator.Element.Coder.Value == Iterator.Element { + + /** + Zips the receiver with metadata into an array of YapItem. + Assumes `self` and `metadata` have the same `count`. + + - parameter metadata: a sequence of optional metadatas. + - returns: an array where Persistables and Metadata with corresponding indexes in `self` and `metadata` are joined in a `YapItem` + */ + public func yapItems< + Metadatas, Metadata>(with metadata: Metadatas) -> [YapItem] where + Metadata: NSCoding, + Metadatas: Sequence, + Metadatas.Iterator.Element == Optional { + return zip(self, metadata).map { YapItem($0, $1) } + } /** Write the items using an existing transaction. @@ -73,8 +98,12 @@ extension SequenceType where - parameter transaction: a WriteTransactionType e.g. YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> [Generator.Element] { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata>(_ transaction: WriteTransaction, metadata: [Metadata?]) -> [YapItem] where + WriteTransaction: WriteTransactionType, + Metadata: NSCoding { + let items = yapItems(with: metadata) + return transaction.writeWithMetadata(items) } /** @@ -83,8 +112,12 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> [Generator.Element] { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: [Metadata?]) -> [YapItem] where + Connection: ConnectionType, + Metadata: NSCoding { + let items = yapItems(with: metadata) + return connection.writeWithMetadata(items) } /** @@ -93,8 +126,12 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([Generator.Element] -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: [Metadata?], queue: DispatchQueue = DispatchQueue.main, completion: (([YapItem]) -> Void)? = .none) where + Connection: ConnectionType, + Metadata: NSCoding { + let items = yapItems(with: metadata) + return connection.asyncWriteWithMetadata(items, queue: queue, completion: completion) } /** @@ -103,8 +140,12 @@ extension SequenceType where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata>(_ connection: Connection, metadata: [Metadata?]) -> Operation where + Connection: ConnectionType, + Metadata: NSCoding { + let items = yapItems(with: metadata) + return BlockOperation { _ = connection.writeWithMetadata(items) } } } @@ -115,46 +156,44 @@ extension Readable where ItemType: ValueCoding, ItemType: Persistable, ItemType.Coder: NSCoding, - ItemType.Coder.ValueType == ItemType, - ItemType.MetadataType: NSCoding { + ItemType.Coder.Value == ItemType { - func inTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType? { - return transaction.readAtIndex(index) + func withMetadataInTransaction(_ transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> YapItem? { + return transaction.readWithMetadataAtIndex(index) } - func inTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> ItemType? { - return { self.inTransaction(transaction, atIndex: $0) } + func withMetadataInTransactionAtIndex(_ transaction: Database.Connection.ReadTransaction) -> (YapDB.Index) -> YapItem? { + return { self.withMetadataInTransaction(transaction, atIndex: $0) } } - func atIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, atIndex: index) } + func withMetadataAtIndexInTransaction(_ index: YapDB.Index) -> (Database.Connection.ReadTransaction) -> YapItem? { + return { self.withMetadataInTransaction($0, atIndex: index) } } - func atIndexesInTransaction< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [ItemType] { - let atIndex = inTransactionAtIndex - return { indexes.flatMap(atIndex($0)) } + func withMetadataAtIndexesInTransaction< + Indexes, Metadata>(_ indexes: Indexes) -> (Database.Connection.ReadTransaction) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Metadata: NSCoding { + return { indexes.map(self.withMetadataInTransactionAtIndex($0)) } } - func inTransaction(transaction: Database.Connection.ReadTransaction, byKey key: String) -> ItemType? { - return inTransaction(transaction, atIndex: ItemType.indexWithKey(key)) + func withMetadataInTransaction(_ transaction: Database.Connection.ReadTransaction, byKey key: String) -> YapItem? { + return withMetadataInTransaction(transaction, atIndex: ItemType.indexWithKey(key)) } - func inTransactionByKey(transaction: Database.Connection.ReadTransaction) -> String -> ItemType? { - return { self.inTransaction(transaction, byKey: $0) } + func withMetadataInTransactionByKey(_ transaction: Database.Connection.ReadTransaction) -> (String) -> YapItem? { + return { self.withMetadataInTransaction(transaction, byKey: $0) } } - func byKeyInTransaction(key: String) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, byKey: key) } + func withMetadataByKeyInTransaction(_ key: String) -> (Database.Connection.ReadTransaction) -> YapItem? { + return { self.withMetadataInTransaction($0, byKey: key) } } - func byKeysInTransaction(keys: [String]? = .None) -> Database.Connection.ReadTransaction -> [ItemType] { - let byKey = inTransactionByKey + func withMetadataByKeysInTransaction(_ keys: [String]? = .none) -> (Database.Connection.ReadTransaction) -> [YapItem?] { return { transaction in let keys = keys ?? transaction.keysInCollection(ItemType.collection) - return keys.flatMap(byKey(transaction)) + return keys.map(self.withMetadataInTransactionByKey(transaction)) } } @@ -164,8 +203,8 @@ extension Readable where - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func atIndex(index: YapDB.Index) -> ItemType? { - return sync(atIndexInTransaction(index)) + public func withMetadataAtIndex(_ index: YapDB.Index) -> YapItem? { + return sync(withMetadataAtIndexInTransaction(index)) } /** @@ -174,11 +213,12 @@ extension Readable where - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func atIndexes< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> [ItemType] { - return sync(atIndexesInTransaction(indexes)) + public func withMetadataAtIndexes< + Indexes, Metadata>(_ indexes: Indexes) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Metadata: NSCoding { + return sync(withMetadataAtIndexesInTransaction(indexes)) } /** @@ -187,8 +227,8 @@ extension Readable where - parameter key: a String - returns: an optional `ItemType` */ - public func byKey(key: String) -> ItemType? { - return sync(byKeyInTransaction(key)) + public func withMetadataByKey(_ key: String) -> YapItem? { + return sync(withMetadataByKeyInTransaction(key)) } /** @@ -197,11 +237,12 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func byKeys< - Keys where - Keys: SequenceType, - Keys.Generator.Element == String>(keys: Keys) -> [ItemType] { - return sync(byKeysInTransaction(Array(keys))) + public func withMetadataByKeys< + Keys, Metadata>(_ keys: Keys) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Metadata: NSCoding { + return sync(withMetadataByKeysInTransaction(Array(keys))) } /** @@ -209,8 +250,8 @@ extension Readable where - returns: an array of `ItemType` */ - public func all() -> [ItemType] { - return sync(byKeysInTransaction()) + public func withMetadataAll() -> [YapItem?] { + return sync(withMetadataByKeysInTransaction()) } /** @@ -219,12 +260,18 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: a tuple of type `([ItemType], [String])` */ - public func filterExisting(keys: [String]) -> (existing: [ItemType], missing: [String]) { - let existingInTransaction = byKeysInTransaction(keys) - return sync { transaction -> ([ItemType], [String]) in - let existing = existingInTransaction(transaction) - let existingKeys = existing.map(keyForPersistable) - let missingKeys = keys.filter { !existingKeys.contains($0) } + public func withMetadataFilterExisting(_ keys: [String]) -> (existing: [YapItem], missing: [String]) { + let existingInTransaction: (Database.Connection.ReadTransaction) -> [YapItem?] = withMetadataByKeysInTransaction(keys) + return sync { transaction -> ([YapItem], [String]) in + var missingKeys = [String]() + let maybeExisting = existingInTransaction(transaction) + let existing = zip(keys, maybeExisting).flatMap { zipped -> YapItem? in + guard let item = zipped.1 else { + missingKeys.append(zipped.0) + return nil + } + return item + } return (existing, missingKeys) } } diff --git a/Sources/Persistable_ValueWithValueMetadata.swift b/Sources/Persistable_ValueWithValueMetadata.swift index 5b7b0fd..4d60aff 100644 --- a/Sources/Persistable_ValueWithValueMetadata.swift +++ b/Sources/Persistable_ValueWithValueMetadata.swift @@ -14,10 +14,7 @@ import ValueCoding extension Persistable where Self: ValueCoding, Self.Coder: NSCoding, - Self.Coder.ValueType == Self, - Self.MetadataType: ValueCoding, - Self.MetadataType.Coder: NSCoding, - Self.MetadataType.Coder.ValueType == Self.MetadataType { + Self.Coder.Value == Self { // Writing @@ -27,8 +24,13 @@ extension Persistable where - parameter transaction: a YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> Self { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata>(_ transaction: WriteTransaction, metadata: Metadata?) -> YapItem where + WriteTransaction: WriteTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return transaction.writeWithMetadata(YapItem(self, metadata)) } /** @@ -37,8 +39,13 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> Self { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: Metadata?) -> YapItem where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return connection.writeWithMetadata(YapItem(self, metadata)) } /** @@ -47,8 +54,13 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (Self -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: Metadata?, queue: DispatchQueue = DispatchQueue.main, completion: ((YapItem) -> Void)? = .none) where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return connection.asyncWriteWithMetadata(YapItem(self, metadata), queue: queue, completion: completion) } /** @@ -57,19 +69,38 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata>(_ connection: Connection, metadata: Metadata?) -> Operation where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return BlockOperation { _ = connection.writeWithMetadata(YapItem(self, metadata)) } } } -extension SequenceType where - Generator.Element: Persistable, - Generator.Element: ValueCoding, - Generator.Element.Coder: NSCoding, - Generator.Element.Coder.ValueType == Generator.Element, - Generator.Element.MetadataType: ValueCoding, - Generator.Element.MetadataType.Coder: NSCoding, - Generator.Element.MetadataType.Coder.ValueType == Generator.Element.MetadataType { +extension Sequence where + Iterator.Element: Persistable, + Iterator.Element: ValueCoding, + Iterator.Element.Coder: NSCoding, + Iterator.Element.Coder.Value == Iterator.Element { + + /** + Zips the receiver with metadata into an array of YapItem. + Assumes `self` and `metadata` have the same `count`. + + - parameter metadata: a sequence of optional metadatas. + - returns: an array where Persistables and Metadata with corresponding indexes in `self` and `metadata` are joined in a `YapItem` + */ + public func yapItems< + Metadatas, Metadata>(with metadata: Metadatas) -> [YapItem] where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata, + Metadatas: Sequence, + Metadatas.Iterator.Element == Optional { + return zip(self, metadata).map { YapItem($0, $1) } + } /** Write the items using an existing transaction. @@ -77,8 +108,14 @@ extension SequenceType where - parameter transaction: a WriteTransactionType e.g. YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> [Generator.Element] { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata>(_ transaction: WriteTransaction, metadata: [Metadata?]) -> [YapItem] where + WriteTransaction: WriteTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + let items = yapItems(with: metadata) + return transaction.writeWithMetadata(items) } /** @@ -87,8 +124,14 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> [Generator.Element] { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: [Metadata?]) -> [YapItem] where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + let items = yapItems(with: metadata) + return connection.writeWithMetadata(items) } /** @@ -97,8 +140,14 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([Generator.Element] -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata>(_ connection: Connection, metadata: [Metadata?], queue: DispatchQueue = DispatchQueue.main, completion: (([YapItem]) -> Void)? = .none) where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + let items = yapItems(with: metadata) + return connection.asyncWriteWithMetadata(items, queue: queue, completion: completion) } /** @@ -107,8 +156,14 @@ extension SequenceType where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata>(_ connection: Connection, metadata: [Metadata?]) -> Operation where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + let items = yapItems(with: metadata) + return BlockOperation { _ = connection.writeWithMetadata(items) } } } @@ -118,48 +173,74 @@ extension Readable where ItemType: ValueCoding, ItemType: Persistable, ItemType.Coder: NSCoding, - ItemType.Coder.ValueType == ItemType, - ItemType.MetadataType: ValueCoding, - ItemType.MetadataType.Coder: NSCoding, - ItemType.MetadataType.Coder.ValueType == ItemType.MetadataType { - - func inTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType? { - return transaction.readAtIndex(index) + ItemType.Coder.Value == ItemType { + + func withMetadataInTransaction< + Metadata>(_ transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return transaction.readWithMetadataAtIndex(index) } - func inTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> ItemType? { - return { self.inTransaction(transaction, atIndex: $0) } + func withMetadataInTransactionAtIndex< + Metadata>(_ transaction: Database.Connection.ReadTransaction) -> (YapDB.Index) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { self.withMetadataInTransaction(transaction, atIndex: $0) } } - func atIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, atIndex: index) } + func withMetadataAtIndexInTransaction< + Metadata>(_ index: YapDB.Index) -> (Database.Connection.ReadTransaction) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { self.withMetadataInTransaction($0, atIndex: index) } } - func atIndexesInTransaction< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [ItemType] { - let atIndex = inTransactionAtIndex - return { indexes.flatMap(atIndex($0)) } + func withMetadataAtIndexesInTransaction< + Indexes, Metadata>(_ indexes: Indexes) -> (Database.Connection.ReadTransaction) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { indexes.map(self.withMetadataInTransactionAtIndex($0)) } } - func inTransaction(transaction: Database.Connection.ReadTransaction, byKey key: String) -> ItemType? { - return inTransaction(transaction, atIndex: ItemType.indexWithKey(key)) + func withMetadataInTransaction< + Metadata>(_ transaction: Database.Connection.ReadTransaction, byKey key: String) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return withMetadataInTransaction(transaction, atIndex: ItemType.indexWithKey(key)) } - func inTransactionByKey(transaction: Database.Connection.ReadTransaction) -> String -> ItemType? { - return { self.inTransaction(transaction, byKey: $0) } + func withMetadataInTransactionByKey< + Metadata>(_ transaction: Database.Connection.ReadTransaction) -> (String) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { self.withMetadataInTransaction(transaction, byKey: $0) } } - func byKeyInTransaction(key: String) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, byKey: key) } + func withMetadataByKeyInTransaction< + Metadata>(_ key: String) -> (Database.Connection.ReadTransaction) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return { self.withMetadataInTransaction($0, byKey: key) } } - func byKeysInTransaction(keys: [String]? = .None) -> Database.Connection.ReadTransaction -> [ItemType] { - let byKey = inTransactionByKey + func withMetadataByKeysInTransaction< + Metadata>(_ keys: [String]? = .none) -> (Database.Connection.ReadTransaction) -> [YapItem?] where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { return { transaction in let keys = keys ?? transaction.keysInCollection(ItemType.collection) - return keys.flatMap(byKey(transaction)) + return keys.map(self.withMetadataInTransactionByKey(transaction)) } } @@ -169,8 +250,12 @@ extension Readable where - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func atIndex(index: YapDB.Index) -> ItemType? { - return sync(atIndexInTransaction(index)) + public func withMetadataAtIndex< + Metadata>(_ index: YapDB.Index) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return sync(withMetadataAtIndexInTransaction(index)) } /** @@ -179,11 +264,14 @@ extension Readable where - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func atIndexes< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> [ItemType] { - return sync(atIndexesInTransaction(indexes)) + public func withMetadataAtIndexes< + Indexes, Metadata>(_ indexes: Indexes) -> [YapItem?] where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return sync(withMetadataAtIndexesInTransaction(indexes)) } /** @@ -192,8 +280,12 @@ extension Readable where - parameter key: a String - returns: an optional `ItemType` */ - public func byKey(key: String) -> ItemType? { - return sync(byKeyInTransaction(key)) + public func withMetadataByKey< + Metadata>(_ key: String) -> YapItem? where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return sync(withMetadataByKeyInTransaction(key)) } /** @@ -202,11 +294,14 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func byKeys< - Keys where - Keys: SequenceType, - Keys.Generator.Element == String>(keys: Keys) -> [ItemType] { - return sync(byKeysInTransaction(Array(keys))) + public func withMetadataByKeys< + Keys, Metadata>(_ keys: Keys) -> [YapItem?] where + Keys: Sequence, + Keys.Iterator.Element == String, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return sync(withMetadataByKeysInTransaction(Array(keys))) } /** @@ -214,8 +309,12 @@ extension Readable where - returns: an array of `ItemType` */ - public func all() -> [ItemType] { - return sync(byKeysInTransaction()) + public func withMetadataAll< + Metadata>() -> [YapItem?] where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + return sync(withMetadataByKeysInTransaction()) } /** @@ -224,12 +323,22 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: a tuple of type `([ItemType], [String])` */ - public func filterExisting(keys: [String]) -> (existing: [ItemType], missing: [String]) { - let existingInTransaction = byKeysInTransaction(keys) - return sync { transaction -> ([ItemType], [String]) in - let existing = existingInTransaction(transaction) - let existingKeys = existing.map(keyForPersistable) - let missingKeys = keys.filter { !existingKeys.contains($0) } + public func withMetadataFilterExisting< + Metadata>(_ keys: [String]) -> (existing: [YapItem], missing: [String]) where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.Value == Metadata { + let existingInTransaction: (Database.Connection.ReadTransaction) -> [YapItem?] = withMetadataByKeysInTransaction(keys) + return sync { transaction -> ([YapItem], [String]) in + var missingKeys = [String]() + let maybeExisting = existingInTransaction(transaction) + let existing = zip(keys, maybeExisting).flatMap { zipped -> YapItem? in + guard let item = zipped.1 else { + missingKeys.append(zipped.0) + return nil + } + return item + } return (existing, missingKeys) } } diff --git a/Sources/Read.swift b/Sources/Read.swift index 4af4f59..d228c1f 100644 --- a/Sources/Read.swift +++ b/Sources/Read.swift @@ -26,17 +26,17 @@ public struct Read: Readable { let reader: Handle public var transaction: D.Connection.ReadTransaction? { - if case let .Transaction(transaction) = reader { + if case let .transaction(transaction) = reader { return transaction } - return .None + return .none } public var connection: D.Connection { switch reader { - case .Transaction(_): + case .transaction(_): fatalError("Attempting to get connection from a transaction.") - case .Connection(let connection): + case .connection(let connection): return connection default: return database.makeNewConnection() @@ -44,22 +44,22 @@ public struct Read: Readable { } internal var database: D { - if case let .Database(database) = reader { + if case let .database(database) = reader { return database } fatalError("Attempting to get database from \(reader)") } internal init(_ transaction: D.Connection.ReadTransaction) { - reader = .Transaction(transaction) + reader = .transaction(transaction) } internal init(_ connection: D.Connection) { - reader = .Connection(connection) + reader = .connection(connection) } internal init(_ database: D) { - reader = .Database(database) + reader = .database(database) } } @@ -83,7 +83,7 @@ extension Persistable { - parameter transaction: a type conforming to ReadTransactionType such as YapDatabaseReadTransaction */ - public static func read(transaction: D.Connection.ReadTransaction) -> Read { + public static func read(_ transaction: D.Connection.ReadTransaction) -> Read { return Read(transaction) } @@ -105,11 +105,11 @@ extension Persistable { - parameter connection: a type conforming to ConnectionType such as YapDatabaseConnection. */ - public static func read(connection: D.Connection) -> Read { + public static func read(_ connection: D.Connection) -> Read { return Read(connection) } - internal static func read(database: D) -> Read { + internal static func read(_ database: D) -> Read { return Read(database) } } @@ -118,7 +118,7 @@ extension Readable where ItemType: Persistable { - func sync(block: (Database.Connection.ReadTransaction) -> T) -> T { + func sync(_ block: @escaping (Database.Connection.ReadTransaction) -> T) -> T { if let transaction = transaction { return block(transaction) } diff --git a/Sources/YapDB.swift b/Sources/YapDB.swift index 7534482..51a9f0d 100644 --- a/Sources/YapDB.swift +++ b/Sources/YapDB.swift @@ -2,13 +2,20 @@ // Created by Daniel Thorpe on 22/04/2015. // +import YapDatabase +import YapDatabase.YapDatabaseView +import YapDatabase.YapDatabaseFilteredView +import YapDatabase.YapDatabaseFullTextSearch +import YapDatabase.YapDatabaseSecondaryIndex +import YapDatabase.YapDatabaseAutoView + protocol YapDatabaseViewProducer { func createDatabaseView() -> YapDatabaseView } protocol YapDatabaseExtensionRegistrar { - func isRegisteredInDatabase(database: YapDatabase) -> Bool - func registerInDatabase(database: YapDatabase, withConnection: YapDatabaseConnection?) + func isRegisteredInDatabase(_ database: YapDatabase) -> Bool + func registerInDatabase(_ database: YapDatabase, withConfig config: YapDatabaseConnectionConfig?) } extension YapDB { @@ -20,26 +27,26 @@ extension YapDB { */ public enum Fetch: YapDatabaseExtensionRegistrar { - case View(YapDB.View) - case Filter(YapDB.Filter) - case Search(YapDB.SearchResults) - case Index(YapDB.SecondaryIndex) + case view(YapDB.View) + case filter(YapDB.Filter) + case search(YapDB.SearchResults) + case index(YapDB.SecondaryIndex) public var name: String { switch self { - case let .View(view): return view.name - case let .Filter(filter): return filter.name - case let .Search(search): return search.name - case let .Index(index): return index.name + case let .view(view): return view.name + case let .filter(filter): return filter.name + case let .search(search): return search.name + case let .index(index): return index.name } } var registrar: YapDatabaseExtensionRegistrar { switch self { - case let .View(view): return view - case let .Filter(filter): return filter - case let .Search(search): return search - case let .Index(index): return index + case let .view(view): return view + case let .filter(filter): return filter + case let .search(search): return search + case let .index(index): return index } } @@ -49,7 +56,7 @@ extension YapDB { - parameter database: a YapDatabase instance - returns: a Bool */ - public func isRegisteredInDatabase(database: YapDatabase) -> Bool { + public func isRegisteredInDatabase(_ database: YapDatabase) -> Bool { return registrar.isRegisteredInDatabase(database) } @@ -59,8 +66,8 @@ extension YapDB { - parameter database: a YapDatabase instance - parameter connection: an optional YapDatabaseConnection, defaults to .None */ - public func registerInDatabase(database: YapDatabase, withConnection connection: YapDatabaseConnection? = .None) { - registrar.registerInDatabase(database, withConnection: connection) + public func registerInDatabase(_ database: YapDatabase, withConfig config: YapDatabaseConnectionConfig? = .none) { + registrar.registerInDatabase(database, withConfig: config) } /** @@ -69,8 +76,8 @@ extension YapDB { - parameter database: a YapDatabase instance - parameter connection: an optional YapDatabaseConnection, defaults to .None */ - public func createViewMappings(mappings: Mappings, inDatabase database: YapDatabase, withConnection connection: YapDatabaseConnection? = .None) -> YapDatabaseViewMappings { - registerInDatabase(database, withConnection: connection) + public func createViewMappings(_ mappings: Mappings, inDatabase database: YapDatabase, withConfig config: YapDatabaseConnectionConfig? = .none) -> YapDatabaseViewMappings { + registerInDatabase(database, withConfig: config) return mappings.createMappingsWithViewName(name) } } @@ -78,13 +85,13 @@ extension YapDB { extension YapDB { - public class BaseExtension { + open class BaseExtension { let name: String let version: String let collections: Set? let persistent: Bool - init(name n: String, version v: String = "1.0", persistent p: Bool = true, collections c: [String]? = .None) { + init(name n: String, version v: String = "1.0", persistent p: Bool = true, collections c: [String]? = .none) { name = n version = v persistent = p @@ -97,15 +104,15 @@ extension YapDB { - parameter database: a YapDatabase instance - returns: A Bool */ - public func isRegisteredInDatabase(database: YapDatabase) -> Bool { - return (database.registeredExtension(name) as? YapDatabaseView) != .None + public func isRegisteredInDatabase(_ database: YapDatabase) -> Bool { + return (database.registeredExtension(name) as? YapDatabaseExtension) != .none } } /** The base class for other YapDatabaseView wrapper types. */ - public class BaseView: BaseExtension { + open class BaseView: BaseExtension { var options: YapDatabaseViewOptions { get { @@ -124,7 +131,7 @@ extension YapDB { A wrapper around YapDatabaseView. It can be constructed with a name, which is the name the extension is registered under, a grouping enum type and a sorting enum type. */ - public class View: BaseView, YapDatabaseViewProducer, YapDatabaseExtensionRegistrar { + open class View: BaseView, YapDatabaseViewProducer, YapDatabaseExtensionRegistrar { /** An enum to make creating YapDatabaseViewGrouping easier. E.g. @@ -135,25 +142,25 @@ extension YapDB { */ public enum Grouping { - case ByKey(YapDatabaseViewGroupingWithKeyBlock) - case ByObject(YapDatabaseViewGroupingWithObjectBlock) - case ByMetadata(YapDatabaseViewGroupingWithMetadataBlock) - case ByRow(YapDatabaseViewGroupingWithRowBlock) + case byKey(YapDatabaseViewGroupingWithKeyBlock) + case byObject(YapDatabaseViewGroupingWithObjectBlock) + case byMetadata(YapDatabaseViewGroupingWithMetadataBlock) + case byRow(YapDatabaseViewGroupingWithRowBlock) - func object(withOptions opts: YapDatabaseBlockInvoke? = .None) -> YapDatabaseViewGrouping { + func object(withOptions opts: YapDatabaseBlockInvoke? = .none) -> YapDatabaseViewGrouping { if let opts = opts { switch self { - case let .ByKey(block): return YapDatabaseViewGrouping.withOptions(opts, keyBlock: block) - case let .ByObject(block): return YapDatabaseViewGrouping.withOptions(opts, objectBlock: block) - case let .ByMetadata(block): return YapDatabaseViewGrouping.withOptions(opts, metadataBlock: block) - case let .ByRow(block): return YapDatabaseViewGrouping.withOptions(opts, rowBlock: block) + case let .byKey(block): return YapDatabaseViewGrouping.withOptions(opts, keyBlock: block) + case let .byObject(block): return YapDatabaseViewGrouping.withOptions(opts, objectBlock: block) + case let .byMetadata(block): return YapDatabaseViewGrouping.withOptions(opts, metadataBlock: block) + case let .byRow(block): return YapDatabaseViewGrouping.withOptions(opts, rowBlock: block) } } else { switch self { - case let .ByKey(block): return YapDatabaseViewGrouping.withKeyBlock(block) - case let .ByObject(block): return YapDatabaseViewGrouping.withObjectBlock(block) - case let .ByMetadata(block): return YapDatabaseViewGrouping.withMetadataBlock(block) - case let .ByRow(block): return YapDatabaseViewGrouping.withRowBlock(block) + case let .byKey(block): return YapDatabaseViewGrouping.withKeyBlock(block) + case let .byObject(block): return YapDatabaseViewGrouping.withObjectBlock(block) + case let .byMetadata(block): return YapDatabaseViewGrouping.withMetadataBlock(block) + case let .byRow(block): return YapDatabaseViewGrouping.withRowBlock(block) } } } @@ -163,25 +170,25 @@ extension YapDB { An enum to make creating YapDatabaseViewSorting easier. */ public enum Sorting { - case ByKey(YapDatabaseViewSortingWithKeyBlock) - case ByObject(YapDatabaseViewSortingWithObjectBlock) - case ByMetadata(YapDatabaseViewSortingWithMetadataBlock) - case ByRow(YapDatabaseViewSortingWithRowBlock) + case byKey(YapDatabaseViewSortingWithKeyBlock) + case byObject(YapDatabaseViewSortingWithObjectBlock) + case byMetadata(YapDatabaseViewSortingWithMetadataBlock) + case byRow(YapDatabaseViewSortingWithRowBlock) - func object(withOptions opts: YapDatabaseBlockInvoke? = .None) -> YapDatabaseViewSorting { + func object(withOptions opts: YapDatabaseBlockInvoke? = .none) -> YapDatabaseViewSorting { if let opts = opts { switch self { - case let .ByKey(block): return YapDatabaseViewSorting.withOptions(opts, keyBlock: block) - case let .ByObject(block): return YapDatabaseViewSorting.withOptions(opts, objectBlock: block) - case let .ByMetadata(block): return YapDatabaseViewSorting.withOptions(opts, metadataBlock: block) - case let .ByRow(block): return YapDatabaseViewSorting.withOptions(opts, rowBlock: block) + case let .byKey(block): return YapDatabaseViewSorting.withOptions(opts, keyBlock: block) + case let .byObject(block): return YapDatabaseViewSorting.withOptions(opts, objectBlock: block) + case let .byMetadata(block): return YapDatabaseViewSorting.withOptions(opts, metadataBlock: block) + case let .byRow(block): return YapDatabaseViewSorting.withOptions(opts, rowBlock: block) } } else { switch self { - case let .ByKey(block): return YapDatabaseViewSorting.withKeyBlock(block) - case let .ByObject(block): return YapDatabaseViewSorting.withObjectBlock(block) - case let .ByMetadata(block): return YapDatabaseViewSorting.withMetadataBlock(block) - case let .ByRow(block): return YapDatabaseViewSorting.withRowBlock(block) + case let .byKey(block): return YapDatabaseViewSorting.withKeyBlock(block) + case let .byObject(block): return YapDatabaseViewSorting.withObjectBlock(block) + case let .byMetadata(block): return YapDatabaseViewSorting.withMetadataBlock(block) + case let .byRow(block): return YapDatabaseViewSorting.withRowBlock(block) } } } @@ -203,9 +210,9 @@ extension YapDB { - parameter collections: an optional array of collections which is used to white list the collections searched when populating the view. */ public init(name: String, - grouping g: Grouping, groupingOptions go: YapDatabaseBlockInvoke? = .None, - sorting s: Sorting, sortingOptions so: YapDatabaseBlockInvoke? = .None, - version: String = "1.0", persistent: Bool = true, collections: [String]? = .None) { + grouping g: Grouping, groupingOptions go: YapDatabaseBlockInvoke? = .none, + sorting s: Sorting, sortingOptions so: YapDatabaseBlockInvoke? = .none, + version: String = "1.0", persistent: Bool = true, collections: [String]? = .none) { grouping = g groupingOptions = go sorting = s @@ -214,16 +221,16 @@ extension YapDB { } func createDatabaseView() -> YapDatabaseView { - return YapDatabaseView(grouping: grouping.object(withOptions: groupingOptions), sorting: sorting.object(withOptions: sortingOptions), versionTag: version, options: options) + return YapDatabaseAutoView(grouping: grouping.object(withOptions: groupingOptions), sorting: sorting.object(withOptions: sortingOptions), versionTag: version, options: options) } - func registerInDatabase(database: YapDatabase, withConnection connection: YapDatabaseConnection? = .None) { + func registerInDatabase(_ database: YapDatabase, withConfig config: YapDatabaseConnectionConfig? = .none) { if !isRegisteredInDatabase(database) { - if let connection = connection { - database.registerExtension(createDatabaseView(), withName: name, connection: connection) + if let config = config { + database.register(createDatabaseView(), withName: name, config: config) } else { - database.registerExtension(createDatabaseView(), withName: name) + database.register(createDatabaseView(), withName: name) } } } @@ -240,31 +247,31 @@ extension YapDB { is a YapDB.Fetch type. This allows for filtering of other filters, and even filtering of search results. */ - public class Filter: BaseView, YapDatabaseViewProducer, YapDatabaseExtensionRegistrar { + open class Filter: BaseView, YapDatabaseViewProducer, YapDatabaseExtensionRegistrar { /** An enum to make creating YapDatabaseViewFiltering easier. */ public enum Filtering { - case ByKey(YapDatabaseViewFilteringWithKeyBlock) - case ByObject(YapDatabaseViewFilteringWithObjectBlock) - case ByMetadata(YapDatabaseViewFilteringWithMetadataBlock) - case ByRow(YapDatabaseViewFilteringWithRowBlock) + case byKey(YapDatabaseViewFilteringWithKeyBlock) + case byObject(YapDatabaseViewFilteringWithObjectBlock) + case byMetadata(YapDatabaseViewFilteringWithMetadataBlock) + case byRow(YapDatabaseViewFilteringWithRowBlock) - func object(withOptions ops: YapDatabaseBlockInvoke? = .None) -> YapDatabaseViewFiltering { + func object(withOptions ops: YapDatabaseBlockInvoke? = .none) -> YapDatabaseViewFiltering { if let ops = ops { switch self { - case .ByKey(let block): return YapDatabaseViewFiltering.withOptions(ops, keyBlock: block) - case .ByObject(let block): return YapDatabaseViewFiltering.withOptions(ops, objectBlock: block) - case .ByMetadata(let block): return YapDatabaseViewFiltering.withOptions(ops, metadataBlock: block) - case .ByRow(let block): return YapDatabaseViewFiltering.withOptions(ops, rowBlock: block) + case .byKey(let block): return YapDatabaseViewFiltering.withOptions(ops, keyBlock: block) + case .byObject(let block): return YapDatabaseViewFiltering.withOptions(ops, objectBlock: block) + case .byMetadata(let block): return YapDatabaseViewFiltering.withOptions(ops, metadataBlock: block) + case .byRow(let block): return YapDatabaseViewFiltering.withOptions(ops, rowBlock: block) } } else { switch self { - case .ByKey(let block): return YapDatabaseViewFiltering.withKeyBlock(block) - case .ByObject(let block): return YapDatabaseViewFiltering.withObjectBlock(block) - case .ByMetadata(let block): return YapDatabaseViewFiltering.withMetadataBlock(block) - case .ByRow(let block): return YapDatabaseViewFiltering.withRowBlock(block) + case .byKey(let block): return YapDatabaseViewFiltering.withKeyBlock(block) + case .byObject(let block): return YapDatabaseViewFiltering.withObjectBlock(block) + case .byMetadata(let block): return YapDatabaseViewFiltering.withMetadataBlock(block) + case .byRow(let block): return YapDatabaseViewFiltering.withRowBlock(block) } } } @@ -284,8 +291,8 @@ extension YapDB { - parameter persistent: a Bool, defaults to true - meaning that the contents of the view will be stored in YapDatabase between launches. - parameter collections: an optional array of collections which is used to white list the collections searched when populating the view. */ - public init(name: String, parent p: YapDB.Fetch, filtering f: Filtering, filteringOptions fo: YapDatabaseBlockInvoke? = .None, - version: String = "1.0", persistent: Bool = true, collections: [String]? = .None) { + public init(name: String, parent p: YapDB.Fetch, filtering f: Filtering, filteringOptions fo: YapDatabaseBlockInvoke? = .none, + version: String = "1.0", persistent: Bool = true, collections: [String]? = .none) { parent = p filtering = f filteringOptions = fo @@ -296,14 +303,14 @@ extension YapDB { return YapDatabaseFilteredView(parentViewName: parent.name, filtering: filtering.object(withOptions: filteringOptions), versionTag: version, options: options) } - func registerInDatabase(database: YapDatabase, withConnection connection: YapDatabaseConnection? = .None) { + func registerInDatabase(_ database: YapDatabase, withConfig config: YapDatabaseConnectionConfig? = .none) { if !isRegisteredInDatabase(database) { - parent.registerInDatabase(database, withConnection: connection) - if let connection = connection { - database.registerExtension(createDatabaseView(), withName: name, connection: connection) + parent.registerInDatabase(database, withConfig: config) + if let config = config { + database.register(createDatabaseView(), withName: name, config: config) } else { - database.registerExtension(createDatabaseView(), withName: name) + database.register(createDatabaseView(), withName: name) } } } @@ -320,23 +327,23 @@ extension YapDB { In this case, the parent is a YapDB.Fetch type. This allows for searching of other filters, and even searching inside search results. */ - public class SearchResults: BaseView, YapDatabaseViewProducer, YapDatabaseExtensionRegistrar { + open class SearchResults: BaseView, YapDatabaseViewProducer, YapDatabaseExtensionRegistrar { /** An enum to make creating YapDatabaseFullTextSearchHandler easier. */ public enum Handler { - case ByKey(YapDatabaseFullTextSearchWithKeyBlock) - case ByObject(YapDatabaseFullTextSearchWithObjectBlock) - case ByMetadata(YapDatabaseFullTextSearchWithMetadataBlock) - case ByRow(YapDatabaseFullTextSearchWithRowBlock) + case byKey(YapDatabaseFullTextSearchWithKeyBlock) + case byObject(YapDatabaseFullTextSearchWithObjectBlock) + case byMetadata(YapDatabaseFullTextSearchWithMetadataBlock) + case byRow(YapDatabaseFullTextSearchWithRowBlock) public var object: YapDatabaseFullTextSearchHandler { switch self { - case let .ByKey(block): return YapDatabaseFullTextSearchHandler.withKeyBlock(block) - case let .ByObject(block): return YapDatabaseFullTextSearchHandler.withObjectBlock(block) - case let .ByMetadata(block): return YapDatabaseFullTextSearchHandler.withMetadataBlock(block) - case let .ByRow(block): return YapDatabaseFullTextSearchHandler.withRowBlock(block) + case let .byKey(block): return YapDatabaseFullTextSearchHandler.withKeyBlock(block) + case let .byObject(block): return YapDatabaseFullTextSearchHandler.withObjectBlock(block) + case let .byMetadata(block): return YapDatabaseFullTextSearchHandler.withMetadataBlock(block) + case let .byRow(block): return YapDatabaseFullTextSearchHandler.withRowBlock(block) } } } @@ -358,7 +365,7 @@ extension YapDB { - parameter persistent: a Bool, defaults to true - meaning that the contents of the view will be stored in YapDatabase between launches. - parameter collections: an optional array of collections which is used to white list the collections searched when populating the view. */ - public init(name: String, parent p: YapDB.Fetch, search: String, columnNames cn: [String], handler h: Handler, version: String = "1.0", persistent: Bool = true, collections: [String]? = .None) { + public init(name: String, parent p: YapDB.Fetch, search: String, columnNames cn: [String], handler h: Handler, version: String = "1.0", persistent: Bool = true, collections: [String]? = .none) { parent = p searchName = search columnNames = cn @@ -367,28 +374,28 @@ extension YapDB { } func createDatabaseView() -> YapDatabaseView { - return YapDatabaseSearchResultsView(fullTextSearchName: searchName, parentViewName: parent.name, versionTag: version, options: .None) + return YapDatabaseSearchResultsView(fullTextSearchName: searchName, parentViewName: parent.name, versionTag: version, options: .none) } - func registerInDatabase(database: YapDatabase, withConnection connection: YapDatabaseConnection? = .None) { + func registerInDatabase(_ database: YapDatabase, withConfig config: YapDatabaseConnectionConfig? = .none) { - if (database.registeredExtension(searchName) as? YapDatabaseFullTextSearch) == .None { - let fullTextSearch = YapDatabaseFullTextSearch(columnNames: columnNames, handler: handler.object, versionTag: version) - if let connection = connection { - database.registerExtension(fullTextSearch, withName: searchName, connection: connection) + if (database.registeredExtension(searchName) as? YapDatabaseFullTextSearch) == .none { + let fullTextSearch = YapDatabaseFullTextSearch(columnNames: columnNames, options: nil, handler: handler.object, versionTag: version) + if let config = config { + database.register(fullTextSearch, withName: searchName, config: config) } else { - database.registerExtension(fullTextSearch, withName: searchName) + database.register(fullTextSearch, withName: searchName) } } if !isRegisteredInDatabase(database) { - parent.registerInDatabase(database, withConnection: connection) - if let connection = connection { - database.registerExtension(createDatabaseView(), withName: name, connection: connection) + parent.registerInDatabase(database, withConfig: config) + if let config = config { + database.register(createDatabaseView(), withName: name, config: config) } else { - database.registerExtension(createDatabaseView(), withName: name) + database.register(createDatabaseView(), withName: name) } } } @@ -405,20 +412,20 @@ extension YapDB { is similar to a full text search extension. It features a handler, which must be provided to update a dictionary used to index records. */ - public class SecondaryIndex: BaseExtension, YapDatabaseExtensionRegistrar { + open class SecondaryIndex: BaseExtension, YapDatabaseExtensionRegistrar { public enum Handler { - case ByKey(YapDatabaseSecondaryIndexWithKeyBlock) - case ByObject(YapDatabaseSecondaryIndexWithObjectBlock) - case ByMetadata(YapDatabaseSecondaryIndexWithMetadataBlock) - case ByRow(YapDatabaseSecondaryIndexWithRowBlock) + case byKey(YapDatabaseSecondaryIndexWithKeyBlock) + case byObject(YapDatabaseSecondaryIndexWithObjectBlock) + case byMetadata(YapDatabaseSecondaryIndexWithMetadataBlock) + case byRow(YapDatabaseSecondaryIndexWithRowBlock) public var object: YapDatabaseSecondaryIndexHandler { switch self { - case let .ByKey(block): return YapDatabaseSecondaryIndexHandler.withKeyBlock(block) - case let .ByObject(block): return YapDatabaseSecondaryIndexHandler.withObjectBlock(block) - case let .ByMetadata(block): return YapDatabaseSecondaryIndexHandler.withMetadataBlock(block) - case let .ByRow(block): return YapDatabaseSecondaryIndexHandler.withRowBlock(block) + case let .byKey(block): return YapDatabaseSecondaryIndexHandler.withKeyBlock(block) + case let .byObject(block): return YapDatabaseSecondaryIndexHandler.withObjectBlock(block) + case let .byMetadata(block): return YapDatabaseSecondaryIndexHandler.withMetadataBlock(block) + case let .byRow(block): return YapDatabaseSecondaryIndexHandler.withRowBlock(block) } } } @@ -443,19 +450,19 @@ extension YapDB { func setup() -> YapDatabaseSecondaryIndexSetup { let setup = YapDatabaseSecondaryIndexSetup() for (column, indexType) in columnTypes { - setup.addColumn(column, withType: indexType) + setup.addColumn(column, with: indexType) } return setup } - public func registerInDatabase(database: YapDatabase, withConnection connection: YapDatabaseConnection?) { + open func registerInDatabase(_ database: YapDatabase, withConfig config: YapDatabaseConnectionConfig?) { if !isRegisteredInDatabase(database) { let secondaryIndex = YapDatabaseSecondaryIndex(setup: setup(), handler: handler.object, versionTag: version, options: options) - if let connection = connection { - database.registerExtension(secondaryIndex, withName: name, connection: connection) + if let config = config { + database.register(secondaryIndex, withName: name, config: config) } else { - database.registerExtension(secondaryIndex, withName: name) + database.register(secondaryIndex, withName: name) } } } @@ -467,9 +474,9 @@ extension YapDB { public struct Mappings { public enum Kind { - case Composed(YapDatabaseViewMappings) - case Groups([String]) - case Dynamic((filter: YapDatabaseViewMappingGroupFilter, sorter: YapDatabaseViewMappingGroupSort)) + case composed(YapDatabaseViewMappings) + case groups([String]) + case dynamic((filter: YapDatabaseViewMappingGroupFilter, sorter: YapDatabaseViewMappingGroupSort)) } public static var passThroughFilter: YapDatabaseViewMappingGroupFilter { @@ -482,25 +489,25 @@ extension YapDB { let kind: Kind - public init(filter f: YapDatabaseViewMappingGroupFilter = Mappings.passThroughFilter, sort s: YapDatabaseViewMappingGroupSort = Mappings.caseInsensitiveGroupSort) { - kind = .Dynamic((f, s)) + public init(filter f: @escaping YapDatabaseViewMappingGroupFilter = Mappings.passThroughFilter, sort s: @escaping YapDatabaseViewMappingGroupSort = Mappings.caseInsensitiveGroupSort) { + kind = .dynamic((f, s)) } public init(groups: [String]) { - kind = .Groups(groups) + kind = .groups(groups) } public init(composed: YapDatabaseViewMappings) { - kind = .Composed(composed) + kind = .composed(composed) } - func createMappingsWithViewName(viewName: String) -> YapDatabaseViewMappings { + func createMappingsWithViewName(_ viewName: String) -> YapDatabaseViewMappings { switch kind { - case .Composed(let mappings): + case .composed(let mappings): return mappings - case .Groups(let groups): + case .groups(let groups): return YapDatabaseViewMappings(groups: groups, view: viewName) - case .Dynamic(let (filter: filter, sorter: sorter)): + case .dynamic(let (filter: filter, sorter: sorter)): return YapDatabaseViewMappings(groupFilterBlock: filter, sortBlock: sorter, view: viewName) } } @@ -521,26 +528,26 @@ extension YapDB { return fetch.name } - public init(fetch f: Fetch, mappings m: Mappings = Mappings(), block b: MappingsConfigurationBlock? = .None) { + public init(fetch f: Fetch, mappings m: Mappings = Mappings(), block b: MappingsConfigurationBlock? = .none) { fetch = f mappings = m block = b } public init(view: YapDB.View) { - self.init(fetch: .View(view)) + self.init(fetch: .view(view)) } public init(filter: YapDB.Filter) { - self.init(fetch: .Filter(filter)) + self.init(fetch: .filter(filter)) } public init(search: YapDB.SearchResults) { - self.init(fetch: .Search(search)) + self.init(fetch: .search(search)) } - public func createMappingsRegisteredInDatabase(database: YapDatabase, withConnection connection: YapDatabaseConnection? = .None) -> YapDatabaseViewMappings { - let databaseViewMappings = fetch.createViewMappings(mappings, inDatabase: database, withConnection: connection) + public func createMappingsRegisteredInDatabase(_ database: YapDatabase, withConfig config: YapDatabaseConnectionConfig? = .none) -> YapDatabaseViewMappings { + let databaseViewMappings = fetch.createViewMappings(mappings, inDatabase: database, withConfig: config) block?(databaseViewMappings) return databaseViewMappings } @@ -550,20 +557,20 @@ extension YapDB { extension YapDB { - public class Search { - public typealias Query = (searchTerm: String) -> String + open class Search { + public typealias Query = (_ searchTerm: String) -> String let database: YapDatabase let connection: YapDatabaseConnection let queues: [(String, YapDatabaseSearchQueue)] let query: Query - public init(db: YapDatabase, views: [YapDB.Fetch], query q: Query) { + public init(db: YapDatabase, views: [YapDB.Fetch], query q: @escaping Query) { database = db connection = db.newConnection() let _views = views.filter { fetch in switch fetch { - case .Index(_): return false + case .index(_): return false default: return true } } @@ -574,18 +581,18 @@ extension YapDB { query = q } - public convenience init(db: YapDatabase, view: YapDB.Fetch, query: Query) { + public convenience init(db: YapDatabase, view: YapDB.Fetch, query: @escaping Query) { self.init(db: db, views: [view], query: query) } - public func usingTerm(term: String) { + open func usingTerm(_ term: String) { for (_, queue) in queues { - queue.enqueueQuery(query(searchTerm: term)) + queue.enqueueQuery(query(term)) } - connection.asyncReadWriteWithBlock { [queues = self.queues] transaction in + connection.asyncReadWrite { [queues = self.queues] transaction in for (name, queue) in queues { if let searchResultsViewTransaction = transaction.ext(name) as? YapDatabaseSearchResultsViewTransaction { - searchResultsViewTransaction.performSearchWithQueue(queue) + searchResultsViewTransaction.performSearch(with: queue) } else { assertionFailure("Error: Attempting search using results view with name: \(name) which isn't a registered database extension.") diff --git a/Sources/YapDatabaseExtensions.swift b/Sources/YapDatabaseExtensions.swift index d1cf280..77e5282 100644 --- a/Sources/YapDatabaseExtensions.swift +++ b/Sources/YapDatabaseExtensions.swift @@ -22,8 +22,8 @@ public struct YapDB { - returns: a String representing the path to a database in the given search directory, with the given name/suffix. */ - public static func pathToDatabase(directory: NSSearchPathDirectory, name: String, suffix: String? = .None) -> String { - let paths = NSSearchPathForDirectoriesInDomains(directory, .UserDomainMask, true) + public static func pathToDatabase(_ directory: FileManager.SearchPathDirectory, name: String, suffix: String? = .none) -> String { + let paths = NSSearchPathForDirectoriesInDomains(directory, .userDomainMask, true) let directory: String = paths.first ?? NSTemporaryDirectory() let filename: String = { if let suffix = suffix { @@ -32,7 +32,7 @@ public struct YapDB { return "\(name).sqlite" }() - return (directory as NSString).stringByAppendingPathComponent(filename) + return (directory as NSString).appendingPathComponent(filename) } /// Type of closure which can perform operations on newly created/opened database instances. @@ -73,8 +73,8 @@ public struct YapDB { - returns: the YapDatabase instance. */ - public static func databaseNamed(name: String, operations: DatabaseOperationsBlock? = .None) -> YapDatabase { - let db = YapDatabase(path: pathToDatabase(.DocumentDirectory, name: name, suffix: .None)) + public static func databaseNamed(_ name: String, operations: DatabaseOperationsBlock? = .none) -> YapDatabase { + let db = YapDatabase(path: pathToDatabase(.documentDirectory, name: name, suffix: .none)) operations?(db) return db } @@ -105,11 +105,11 @@ public struct YapDB { - returns: the YapDatabase instance. */ - public static func testDatabase(file: String = #file, test: String = #function, operations: DatabaseOperationsBlock? = .None) -> YapDatabase { - let path = pathToDatabase(.CachesDirectory, name: (file as NSString).lastPathComponent, suffix: test.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "()"))) + public static func testDatabase(_ file: String = #file, test: String = #function, operations: DatabaseOperationsBlock? = .none) -> YapDatabase { + let path = pathToDatabase(.cachesDirectory, name: (file as NSString).lastPathComponent, suffix: test.trimmingCharacters(in: CharacterSet(charactersIn: "()"))) assert(!path.isEmpty, "Path should not be empty.") do { - try NSFileManager.defaultManager().removeItemAtPath(path) + try FileManager.default.removeItem(atPath: path) } catch { } @@ -145,6 +145,30 @@ extension YapDB { } } +/** +A pairing (effectively a tuple) of a value and a metadata. +Used when values and metadatas are read or written together. +*/ +public struct YapItem { + + /// The item's value + let value: Value + + /// The item's metadata + let metadata: Metadata? + + /** + Create a new YapItem value. + + - parameter value: the value associated with a `YapDB.Index` + - parameter metadata: an optional metadata associated with a `YapDB.Index` + */ + public init(_ value: Value, _ metadata: Metadata?) { + self.value = value + self.metadata = metadata + } +} + // MARK: - Identifiable /** @@ -169,10 +193,6 @@ Identifier for your String identifiers. */ public typealias Identifier = String -extension Identifier: CustomStringConvertible { - public var description: String { return self } -} - // MARK: - Persistable /** @@ -182,14 +202,8 @@ are stored in the same YapDatabase collection. */ public protocol Persistable: Identifiable { - /// The nested type of the metadata. Defaults to Void. - associatedtype MetadataType - /// The YapDatabase collection name the type is stored in. static var collection: String { get } - - /// A metadata which is set when reading, and get when writing. - var metadata: MetadataType? { get set } } extension Persistable { @@ -201,7 +215,7 @@ extension Persistable { - parameter key: a `String` - returns: a `YapDB.Index` value. */ - public static func indexWithKey(key: String) -> YapDB.Index { + public static func indexWithKey(_ key: String) -> YapDB.Index { return YapDB.Index(collection: collection, key: key) } @@ -216,21 +230,12 @@ extension Persistable { - returns: an array of `YapDB.Index` values. */ public static func indexesWithKeys< - Keys where - Keys: SequenceType, - Keys.Generator.Element == String>(keys: Keys) -> [YapDB.Index] { + Keys>(_ keys: Keys) -> [YapDB.Index] where + Keys: Sequence, + Keys.Iterator.Element == String { return Set(keys).map { YapDB.Index(collection: collection, key: $0) } } - /** - Default metadata property. Implement this to re-define your - own MetadataType. - */ - public var metadata: Void? { - get { return .None } - set { } - } - /** Convenience computed property to get the key for a persistable, which is just the identifier's description. @@ -247,17 +252,17 @@ extension Persistable { - returns: a `YapDB.Index`. */ public var index: YapDB.Index { - return self.dynamicType.indexWithKey(key) + return type(of: self).indexWithKey(key) } } // MARK: Functions -public func keyForPersistable(persistable: P) -> String { +public func keyForPersistable(_ persistable: P) -> String { return persistable.key } -public func indexForPersistable(persistable: P) -> YapDB.Index { +public func indexForPersistable(_ persistable: P) -> YapDB.Index { return persistable.index } @@ -272,7 +277,7 @@ public protocol ReadTransactionType { - parameter collection: a String. Not optional. - returns: an array of String values. */ - func keysInCollection(collection: String) -> [String] + func keysInCollection(_ collection: String) -> [String] /** Read the object at the index. @@ -280,7 +285,7 @@ public protocol ReadTransactionType { - parameter index: a YapDB.Index. - returns: an `AnyObject` if an item existing in the database for this index. */ - func readAtIndex(index: YapDB.Index) -> AnyObject? + func readAtIndex(_ index: YapDB.Index) -> AnyObject? /** Read the metadata at the index. @@ -288,7 +293,7 @@ public protocol ReadTransactionType { - parameter index: a YapDB.Index. - returns: an `AnyObject` if a metadata item existing in the database for this index. */ - func readMetadataAtIndex(index: YapDB.Index) -> AnyObject? + func readMetadataAtIndex(_ index: YapDB.Index) -> AnyObject? } /// A facade interface for a write transaction. @@ -301,7 +306,7 @@ public protocol WriteTransactionType: ReadTransactionType { - parameter object: the `AnyObject` which will be written. - parameter metadata: an optional `AnyObject` which will be written as metadata. */ - func writeAtIndex(index: YapDB.Index, object: AnyObject, metadata: AnyObject?) + func writeAtIndex(_ index: YapDB.Index, object: AnyObject, metadata: AnyObject?) /** Remove the sequence object from the database at the indexes (if it exists), including metadata @@ -309,9 +314,9 @@ public protocol WriteTransactionType: ReadTransactionType { - parameter indexes: the `[YapDB.Index]` to remove. */ func removeAtIndexes< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) + Indexes>(_ indexes: Indexes) where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index } /// A facade interface for a database connection. @@ -330,7 +335,7 @@ public protocol ConnectionType { - parameter block: a closure which receives YapDatabaseReadTransaction and returns T - returns: An instance of T */ - func read(block: ReadTransaction -> T) -> T + func read(_ block: @escaping (ReadTransaction) -> T) -> T /** Synchronously writes to the database on the connection. The closure receives @@ -343,7 +348,7 @@ public protocol ConnectionType { - parameter block: a closure which receives YapDatabaseReadWriteTransaction and returns T - returns: An instance of T */ - func write(block: WriteTransaction -> T) -> T + func write(_ block: @escaping (WriteTransaction) -> T) -> T /** Asynchronously reads from the database on the connection. The closure receives @@ -359,7 +364,7 @@ public protocol ConnectionType { - parameter queue: a dispatch_queue_t, defaults to main queue, can be ommitted in most cases. - parameter completion: a closure which receives T and returns Void. */ - func asyncRead(block: ReadTransaction -> T, queue: dispatch_queue_t, completion: (T) -> Void) + func asyncRead(_ block: @escaping (ReadTransaction) -> T, queue: DispatchQueue, completion: @escaping (T) -> Void) /** Asynchronously writes to the database on the connection. The closure receives @@ -375,7 +380,7 @@ public protocol ConnectionType { - parameter queue: a dispatch_queue_t, defaults to main queue, can be ommitted in most cases. - parameter completion: a closure which receives T and returns Void. */ - func asyncWrite(block: WriteTransaction -> T, queue: dispatch_queue_t, completion: (T -> Void)?) + func asyncWrite(_ block: @escaping (WriteTransaction) -> T, queue: DispatchQueue, completion: ((T) -> Void)?) /** Execute a read/write block inside a `NSOperation`. The block argument receives a @@ -391,7 +396,7 @@ public protocol ConnectionType { - parameter block: a closure of type (YapDatabaseReadWriteTransaction) -> Void - returns: an `NSOperation`. */ - func writeBlockOperation(block: WriteTransaction -> Void) -> NSOperation + func writeBlockOperation(_ block: @escaping (WriteTransaction) -> Void) -> Operation } /// A facade interface for a database. @@ -401,9 +406,9 @@ public protocol DatabaseType { } internal enum Handle { - case Transaction(D.Connection.ReadTransaction) - case Connection(D.Connection) - case Database(D) + case transaction(D.Connection.ReadTransaction) + case connection(D.Connection) + case database(D) } // MARK: - YapDatabaseReadTransaction @@ -416,8 +421,8 @@ extension YapDatabaseReadTransaction: ReadTransactionType { - parameter collection: a String. - returns: an array of String values. */ - public func keysInCollection(collection: String) -> [String] { - return allKeysInCollection(collection) + public func keysInCollection(_ collection: String) -> [String] { + return allKeys(inCollection: collection) } /** @@ -426,8 +431,8 @@ extension YapDatabaseReadTransaction: ReadTransactionType { - parameter index: The YapDB.Index value. - returns: An optional AnyObject. */ - public func readAtIndex(index: YapDB.Index) -> AnyObject? { - return objectForKey(index.key, inCollection: index.collection) + public func readAtIndex(_ index: YapDB.Index) -> AnyObject? { + return object(forKey: index.key, inCollection: index.collection) as AnyObject? } /** @@ -436,8 +441,8 @@ extension YapDatabaseReadTransaction: ReadTransactionType { - parameter index: The YapDB.Index value. - returns: An optional AnyObject. */ - public func readMetadataAtIndex(index: YapDB.Index) -> AnyObject? { - return metadataForKey(index.key, inCollection: index.collection) + public func readMetadataAtIndex(_ index: YapDB.Index) -> AnyObject? { + return metadata(forKey: index.key, inCollection: index.collection) as AnyObject? } } @@ -445,7 +450,7 @@ extension YapDatabaseReadTransaction: ReadTransactionType { extension YapDatabaseReadWriteTransaction: WriteTransactionType { - public func writeAtIndex(index: YapDB.Index, object: AnyObject, metadata: AnyObject? = .None) { + public func writeAtIndex(_ index: YapDB.Index, object: AnyObject, metadata: AnyObject? = .none) { if let metadata: AnyObject = metadata { setObject(object, forKey: index.key, inCollection: index.collection, withMetadata: metadata) } @@ -454,14 +459,14 @@ extension YapDatabaseReadWriteTransaction: WriteTransactionType { } } - func removeAtIndex(index: YapDB.Index) { - removeObjectForKey(index.key, inCollection: index.collection) + func removeAtIndex(_ index: YapDB.Index) { + removeObject(forKey: index.key, inCollection: index.collection) } public func removeAtIndexes< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) { + Indexes>(_ indexes: Indexes) where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index { indexes.forEach(removeAtIndex) } } @@ -479,9 +484,9 @@ extension YapDatabaseConnection: ConnectionType { - parameter block: a closure which receives YapDatabaseReadTransaction and returns T - returns: An instance of T */ - public func read(block: YapDatabaseReadTransaction -> T) -> T { - var result: T! = .None - readWithBlock { result = block($0) } + public func read(_ block: @escaping (YapDatabaseReadTransaction) -> T) -> T { + var result: T! = .none + self.read { result = block($0) } return result } @@ -496,9 +501,9 @@ extension YapDatabaseConnection: ConnectionType { - parameter block: a closure which receives YapDatabaseReadWriteTransaction and returns T - returns: An instance of T */ - public func write(block: YapDatabaseReadWriteTransaction -> T) -> T { - var result: T! = .None - readWriteWithBlock { result = block($0) } + public func write(_ block: @escaping (YapDatabaseReadWriteTransaction) -> T) -> T { + var result: T! = .none + readWrite { result = block($0) } return result } @@ -516,9 +521,9 @@ extension YapDatabaseConnection: ConnectionType { - parameter queue: a dispatch_queue_t, defaults to main queue, can be ommitted in most cases. - parameter completion: a closure which receives T and returns Void. */ - public func asyncRead(block: YapDatabaseReadTransaction -> T, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (T) -> Void) { - var result: T! = .None - asyncReadWithBlock({ result = block($0) }, completionQueue: queue) { completion(result) } + public func asyncRead(_ block: @escaping (YapDatabaseReadTransaction) -> T, queue: DispatchQueue = DispatchQueue.main, completion: @escaping (T) -> Void) { + var result: T! = .none + self.asyncRead({ result = block($0) }, completionQueue: queue) { completion(result) } } /** @@ -535,9 +540,9 @@ extension YapDatabaseConnection: ConnectionType { - parameter queue: a dispatch_queue_t, defaults to main queue, can be ommitted in most cases. - parameter completion: a closure which receives T and returns Void. */ - public func asyncWrite(block: YapDatabaseReadWriteTransaction -> T, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (T -> Void)?) { - var result: T! = .None - asyncReadWriteWithBlock({ result = block($0) }, completionQueue: queue) { completion?(result) } + public func asyncWrite(_ block: @escaping (YapDatabaseReadWriteTransaction) -> T, queue: DispatchQueue = DispatchQueue.main, completion: ((T) -> Void)?) { + var result: T! = .none + asyncReadWrite({ result = block($0) }, completionQueue: queue) { completion?(result) } } /** @@ -554,8 +559,8 @@ extension YapDatabaseConnection: ConnectionType { - parameter block: a closure of type (YapDatabaseReadWriteTransaction) -> Void - returns: an `NSOperation`. */ - public func writeBlockOperation(block: (YapDatabaseReadWriteTransaction) -> Void) -> NSOperation { - return NSBlockOperation { self.readWriteWithBlock(block) } + public func writeBlockOperation(_ block: @escaping (YapDatabaseReadWriteTransaction) -> Void) -> Operation { + return BlockOperation { self.readWrite(block) } } } @@ -598,7 +603,7 @@ extension YapDB.Index: ValueCoding { // MARK: Coders -public final class YapDBIndexCoder: NSObject, NSCoding, CodingType { +public final class YapDBIndexCoder: NSObject, NSCoding, CodingProtocol { public let value: YapDB.Index public init(_ v: YapDB.Index) { @@ -606,33 +611,33 @@ public final class YapDBIndexCoder: NSObject, NSCoding, CodingType { } public required init(coder aDecoder: NSCoder) { - let collection = aDecoder.decodeObjectForKey("collection") as! String - let key = aDecoder.decodeObjectForKey("key") as! String + let collection = aDecoder.decodeObject(forKey: "collection") as! String + let key = aDecoder.decodeObject(forKey: "key") as! String value = YapDB.Index(collection: collection, key: key) } - public func encodeWithCoder(aCoder: NSCoder) { - aCoder.encodeObject(value.collection, forKey: "collection") - aCoder.encodeObject(value.key, forKey: "key") + public func encode(with aCoder: NSCoder) { + aCoder.encode(value.collection, forKey: "collection") + aCoder.encode(value.key, forKey: "key") } } // MARK: - Deprecations -@available(*, unavailable, renamed="Persistable") +@available(*, unavailable, renamed: "Persistable") public typealias MetadataPersistable = Persistable -@available(*, unavailable, renamed="Persistable") +@available(*, unavailable, renamed: "Persistable") public typealias ObjectMetadataPersistable = Persistable -@available(*, unavailable, renamed="Persistable") +@available(*, unavailable, renamed: "Persistable") public typealias ValueMetadataPersistable = Persistable -@available(*, unavailable, renamed="ValueCoding") +@available(*, unavailable, renamed: "ValueCoding") public typealias Saveable = ValueCoding -@available(*, unavailable, renamed="CodingType") -public typealias Archiver = CodingType - - +@available(*, unavailable, renamed: "CodingProtocol") +public typealias CodingType = CodingProtocol +@available(*, unavailable, renamed: "CodingProtocol") +public typealias Archiver = CodingProtocol diff --git a/Supporting Files/Version.xcconfig b/Supporting Files/Version.xcconfig index cd3083e..bf8fe70 100644 --- a/Supporting Files/Version.xcconfig +++ b/Supporting Files/Version.xcconfig @@ -1 +1 @@ -YAP_DATABASE_EXTENSIONS_VERSION = 2.6.0 +YAP_DATABASE_EXTENSIONS_VERSION = 3.0.0 diff --git a/Supporting Files/YapDatabaseExtensions.xcconfig b/Supporting Files/YapDatabaseExtensions.xcconfig index bcbbfc1..3c1ebd9 100644 --- a/Supporting Files/YapDatabaseExtensions.xcconfig +++ b/Supporting Files/YapDatabaseExtensions.xcconfig @@ -11,8 +11,8 @@ INFOPLIST_FILE_framework = $(SRCROOT)/Supporting Files/Info.plist INFOPLIST_FILE_xctest = $(SRCROOT)/Tests/Info.plist INFOPLIST_FILE = $(INFOPLIST_FILE_$(WRAPPER_EXTENSION)) -PRODUCT_BUNDLE_IDENTIFIER_framework = me.danthorpe.YapDatabaseExtensions -PRODUCT_BUNDLE_IDENTIFIER_xctest = me.danthorpe.YapDatabaseExtensionsTests +PRODUCT_BUNDLE_IDENTIFIER_framework = com.roepcke.YapDatabaseExtensions +PRODUCT_BUNDLE_IDENTIFIER_xctest = com.roepcke.YapDatabaseExtensionsTests PRODUCT_BUNDLE_IDENTIFIER = $(PRODUCT_BUNDLE_IDENTIFIER_$(WRAPPER_EXTENSION)) PRODUCT_NAME_framework = YapDatabaseExtensions @@ -23,7 +23,7 @@ APPLICATION_EXTENSION_API_ONLY_framework = YES APPLICATION_EXTENSION_API_ONLY_xctest = NO APPLICATION_EXTENSION_API_ONLY = $(APPLICATION_EXTENSION_API_ONLY_$(WRAPPER_EXTENSION)) -SWIFT_VERSION = 2.3 +SWIFT_VERSION = 3.0 // Build Settings SUPPORTED_PLATFORMS = macosx iphoneos appletvos watchos appletvsimulator iphonesimulator watchsimulator diff --git a/Tests/Models.swift b/Tests/Models.swift index 1994c7b..f447a0a 100644 --- a/Tests/Models.swift +++ b/Tests/Models.swift @@ -12,8 +12,8 @@ import YapDatabase import YapDatabaseExtensions public enum Barcode: Equatable { - case UPCA(Int, Int, Int, Int) - case QRCode(String) + case upca(Int, Int, Int, Int) + case qrCode(String) } public struct Product: Identifiable, Equatable { @@ -31,13 +31,11 @@ public struct Product: Identifiable, Equatable { } } - public var metadata: Metadata? = .None public let identifier: Identifier internal let name: String internal let barcode: Barcode - public init(metadata: Metadata? = .None, identifier: Identifier, name: String, barcode: Barcode) { - self.metadata = metadata + public init(identifier: Identifier, name: String, barcode: Barcode) { self.identifier = identifier self.name = name self.barcode = barcode @@ -46,7 +44,6 @@ public struct Product: Identifiable, Equatable { public struct Inventory: Identifiable, Equatable { let product: Product - public var metadata: NSNumber? = .None public var identifier: Identifier { return product.identifier @@ -64,36 +61,34 @@ public class NamedEntity: NSObject, NSCoding { } public required init?(coder aDecoder: NSCoder) { - identifier = aDecoder.decodeObjectForKey("identifier") as! Identifier - name = aDecoder.decodeObjectForKey("name") as! String + identifier = aDecoder.decodeObject(forKey: "identifier") as! Identifier + name = aDecoder.decodeObject(forKey: "name") as! String } - public func encodeWithCoder(aCoder: NSCoder) { - aCoder.encodeObject(identifier, forKey: "identifier") - aCoder.encodeObject(name, forKey: "name") + public func encode(with aCoder: NSCoder) { + aCoder.encode(identifier, forKey: "identifier") + aCoder.encode(name, forKey: "name") } } public class Person: NamedEntity { } public class Employee: NamedEntity { - public var metadata: NSDate? = .None } public class Manager: NamedEntity { public struct Metadata: Equatable { public let numberOfDirectReports: Int } - public var metadata: Metadata? = .None } // MARK: - Equatable public func == (a: Barcode, b: Barcode) -> Bool { switch (a, b) { - case let (.UPCA(aNS, aM, aP, aC), .UPCA(bNS, bM, bP, bC)): + case let (.upca(aNS, aM, aP, aC), .upca(bNS, bM, bP, bC)): return (aNS == bNS) && (aM == bM) && (aP == bP) && (aC == bC) - case let (.QRCode(aCode), .QRCode(bCode)): + case let (.qrCode(aCode), .qrCode(bCode)): return aCode == bCode default: return false @@ -109,7 +104,7 @@ public func == (a: Product.Metadata, b: Product.Metadata) -> Bool { } public func == (a: Inventory, b: Inventory) -> Bool { - return (a.product == b.product) && (a.metadata == b.metadata) + return (a.product == b.product) } public func == (a: NamedEntity, b: NamedEntity) -> Bool { @@ -140,6 +135,18 @@ extension Inventory: Hashable { } } +extension Product.Metadata: Hashable { + public var hashValue: Int { + return categoryIdentifier.hashValue + } +} + +extension Manager.Metadata: Hashable { + public var hashValue: Int { + return numberOfDirectReports.hashValue + } +} + extension NamedEntity { public override var description: String { @@ -157,9 +164,9 @@ extension Barcode: Persistable { public var identifier: Int { switch self { - case let .UPCA(numberSystem, manufacturer, product, check): + case let .upca(numberSystem, manufacturer, product, check): return "\(numberSystem).\(manufacturer).\(product).\(check)".hashValue - case let .QRCode(code): + case let .qrCode(code): return code.hashValue } } @@ -213,12 +220,12 @@ extension Manager: Persistable { extension Barcode: ValueCoding { public typealias Coder = BarcodeCoder - enum Kind: Int { case UPCA = 1, QRCode } + enum Kind: Int { case upca = 1, qrCode } var kind: Kind { switch self { - case UPCA(_): return Kind.UPCA - case QRCode(_): return Kind.QRCode + case .upca(_): return Kind.upca + case .qrCode(_): return Kind.qrCode } } } @@ -246,7 +253,7 @@ extension Manager.Metadata: ValueCoding { // MARK: - Coders -public class BarcodeCoder: NSObject, NSCoding, CodingType { +public class BarcodeCoder: NSObject, NSCoding, CodingProtocol { public let value: Barcode public required init(_ v: Barcode) { @@ -254,17 +261,17 @@ public class BarcodeCoder: NSObject, NSCoding, CodingType { } public required init?(coder aDecoder: NSCoder) { - if let kind = Barcode.Kind(rawValue: aDecoder.decodeIntegerForKey("kind")) { + if let kind = Barcode.Kind(rawValue: aDecoder.decodeInteger(forKey: "kind")) { switch kind { - case .UPCA: - let numberSystem = aDecoder.decodeIntegerForKey("numberSystem") - let manufacturer = aDecoder.decodeIntegerForKey("manufacturer") - let product = aDecoder.decodeIntegerForKey("product") - let check = aDecoder.decodeIntegerForKey("check") - value = .UPCA(numberSystem, manufacturer, product, check) - case .QRCode: - let code = aDecoder.decodeObjectForKey("code") as! String - value = .QRCode(code) + case .upca: + let numberSystem = aDecoder.decodeInteger(forKey: "numberSystem") + let manufacturer = aDecoder.decodeInteger(forKey: "manufacturer") + let product = aDecoder.decodeInteger(forKey: "product") + let check = aDecoder.decodeInteger(forKey: "check") + value = .upca(numberSystem, manufacturer, product, check) + case .qrCode: + let code = aDecoder.decodeObject(forKey: "code") as! String + value = .qrCode(code) } } else { @@ -272,21 +279,21 @@ public class BarcodeCoder: NSObject, NSCoding, CodingType { } } - public func encodeWithCoder(aCoder: NSCoder) { - aCoder.encodeInteger(value.kind.rawValue, forKey: "kind") + public func encode(with aCoder: NSCoder) { + aCoder.encode(value.kind.rawValue, forKey: "kind") switch value { - case let .UPCA(numberSystem, manufacturer, product, check): - aCoder.encodeInteger(numberSystem, forKey: "numberSystem") - aCoder.encodeInteger(manufacturer, forKey: "manufacturer") - aCoder.encodeInteger(product, forKey: "product") - aCoder.encodeInteger(check, forKey: "check") - case let .QRCode(code): - aCoder.encodeObject(code, forKey: "code") + case let .upca(numberSystem, manufacturer, product, check): + aCoder.encode(numberSystem, forKey: "numberSystem") + aCoder.encode(manufacturer, forKey: "manufacturer") + aCoder.encode(product, forKey: "product") + aCoder.encode(check, forKey: "check") + case let .qrCode(code): + aCoder.encode(code, forKey: "code") } } } -public class ProductCategoryCoder: NSObject, NSCoding, CodingType { +public class ProductCategoryCoder: NSObject, NSCoding, CodingProtocol { public let value: Product.Category public required init(_ v: Product.Category) { @@ -294,18 +301,18 @@ public class ProductCategoryCoder: NSObject, NSCoding, CodingType { } public required init?(coder aDecoder: NSCoder) { - let identifier = aDecoder.decodeIntegerForKey("identifier") - let name = aDecoder.decodeObjectForKey("name") as? String + let identifier = aDecoder.decodeInteger(forKey: "identifier") + let name = aDecoder.decodeObject(forKey: "name") as? String value = Product.Category(identifier: identifier, name: name!) } - public func encodeWithCoder(aCoder: NSCoder) { - aCoder.encodeInteger(value.identifier, forKey: "identifier") - aCoder.encodeObject(value.name, forKey: "name") + public func encode(with aCoder: NSCoder) { + aCoder.encode(value.identifier, forKey: "identifier") + aCoder.encode(value.name, forKey: "name") } } -public class ProductMetadataCoder: NSObject, NSCoding, CodingType { +public class ProductMetadataCoder: NSObject, NSCoding, CodingProtocol { public let value: Product.Metadata public required init(_ v: Product.Metadata) { @@ -313,16 +320,16 @@ public class ProductMetadataCoder: NSObject, NSCoding, CodingType { } public required init?(coder aDecoder: NSCoder) { - let categoryIdentifier = aDecoder.decodeIntegerForKey("categoryIdentifier") + let categoryIdentifier = aDecoder.decodeInteger(forKey: "categoryIdentifier") value = Product.Metadata(categoryIdentifier: categoryIdentifier) } - public func encodeWithCoder(aCoder: NSCoder) { - aCoder.encodeInteger(value.categoryIdentifier, forKey: "categoryIdentifier") + public func encode(with aCoder: NSCoder) { + aCoder.encode(value.categoryIdentifier, forKey: "categoryIdentifier") } } -public class ProductCoder: NSObject, NSCoding, CodingType { +public class ProductCoder: NSObject, NSCoding, CodingProtocol { public let value: Product public required init(_ v: Product) { @@ -330,20 +337,20 @@ public class ProductCoder: NSObject, NSCoding, CodingType { } public required init?(coder aDecoder: NSCoder) { - let identifier = aDecoder.decodeObjectForKey("identifier") as! String - let name = aDecoder.decodeObjectForKey("name") as! String - let barcode = Barcode.decode(aDecoder.decodeObjectForKey("barcode")) + let identifier = aDecoder.decodeObject(forKey: "identifier") as! String + let name = aDecoder.decodeObject(forKey: "name") as! String + let barcode = Barcode.decode(aDecoder.decodeObject(forKey: "barcode")) value = Product(identifier: identifier, name: name, barcode: barcode!) } - public func encodeWithCoder(aCoder: NSCoder) { - aCoder.encodeObject(value.identifier, forKey: "identifier") - aCoder.encodeObject(value.name, forKey: "name") - aCoder.encodeObject(value.barcode.encoded, forKey: "barcode") + public func encode(with aCoder: NSCoder) { + aCoder.encode(value.identifier, forKey: "identifier") + aCoder.encode(value.name, forKey: "name") + aCoder.encode(value.barcode.encoded, forKey: "barcode") } } -public class InventoryCoder: NSObject, NSCoding, CodingType { +public class InventoryCoder: NSObject, NSCoding, CodingProtocol { public let value: Inventory public required init(_ v: Inventory) { @@ -351,17 +358,17 @@ public class InventoryCoder: NSObject, NSCoding, CodingType { } public required init?(coder aDecoder: NSCoder) { - let product = Product.decode(aDecoder.decodeObjectForKey("product")) - value = Inventory(product: product!, metadata: .None) + let product = Product.decode(aDecoder.decodeObject(forKey: "product")) + value = Inventory(product: product!) } - public func encodeWithCoder(aCoder: NSCoder) { - aCoder.encodeObject(value.product.encoded, forKey: "product") + public func encode(with aCoder: NSCoder) { + aCoder.encode(value.product.encoded, forKey: "product") } } -public class ManagerMetadataCoder: NSObject, NSCoding, CodingType { +public class ManagerMetadataCoder: NSObject, NSCoding, CodingProtocol { public let value: Manager.Metadata public required init(_ v: Manager.Metadata) { @@ -369,12 +376,12 @@ public class ManagerMetadataCoder: NSObject, NSCoding, CodingType { } public required init?(coder aDecoder: NSCoder) { - let numberOfDirectReports = aDecoder.decodeIntegerForKey("numberOfDirectReports") + let numberOfDirectReports = aDecoder.decodeInteger(forKey: "numberOfDirectReports") value = Manager.Metadata(numberOfDirectReports: numberOfDirectReports) } - public func encodeWithCoder(aCoder: NSCoder) { - aCoder.encodeInteger(value.numberOfDirectReports, forKey: "numberOfDirectReports") + public func encode(with aCoder: NSCoder) { + aCoder.encode(value.numberOfDirectReports, forKey: "numberOfDirectReports") } } @@ -382,7 +389,7 @@ public class ManagerMetadataCoder: NSObject, NSCoding, CodingType { public func products() -> YapDB.Fetch { - let grouping: YapDB.View.Grouping = .ByMetadata({ (_, collection, key, metadata) -> String! in + let grouping: YapDB.View.Grouping = .byMetadata({ (_, collection, key, metadata) -> String! in if collection == Product.collection { if let metadata = Product.Metadata.decode(metadata) { return "category: \(metadata.categoryIdentifier)" @@ -391,13 +398,13 @@ public func products() -> YapDB.Fetch { return nil }) - let sorting: YapDB.View.Sorting = .ByObject({ (_, group, collection1, key1, object1, collection2, key2, object2) -> NSComparisonResult in + let sorting: YapDB.View.Sorting = .byObject({ (_, group, collection1, key1, object1, collection2, key2, object2) -> ComparisonResult in if let product1 = Product.decode(object1) { if let product2 = Product.decode(object2) { return product1.name.caseInsensitiveCompare(product2.name) } } - return .OrderedSame + return .orderedSame }) let view = YapDB.View( @@ -406,7 +413,7 @@ public func products() -> YapDB.Fetch { sorting: sorting, collections: [Product.collection]) - return .View(view) + return .view(view) } diff --git a/Tests/ObjectWithNoMetadataTests.swift b/Tests/ObjectWithNoMetadataTests.swift index ce6fe18..5c3efa0 100644 --- a/Tests/ObjectWithNoMetadataTests.swift +++ b/Tests/ObjectWithNoMetadataTests.swift @@ -29,8 +29,8 @@ class ObjectWithNoMetadataTests: XCTestCase { var reader: Read! - var dispatchQueue: dispatch_queue_t! - var operationQueue: NSOperationQueue! + var dispatchQueue: DispatchQueue! + var operationQueue: OperationQueue! override func setUp() { super.setUp() @@ -50,8 +50,8 @@ class ObjectWithNoMetadataTests: XCTestCase { connection.writeTransaction = writeTransaction database.connection = connection - dispatchQueue = dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0) - operationQueue = NSOperationQueue() + dispatchQueue = DispatchQueue.global(qos: .default) + operationQueue = OperationQueue() } override func tearDown() { @@ -90,38 +90,44 @@ class ObjectWithNoMetadataTests: XCTestCase { readTransaction.keys = keys } - func checkTransactionDidWriteItem(result: TypeUnderTest) { + func checkTransactionDidWriteItem(_ result: TypeUnderTest) { XCTAssertEqual(result.identifier, item.identifier) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].1.identifier, item.identifier) - XCTAssertNil(writeTransaction.didWriteAtIndexes[0].2) - } - - func checkTransactionDidWriteItems(result: [TypeUnderTest]) { + + let _index = writeTransaction.didWriteAtIndexes[0].0 + let _identifier = writeTransaction.didWriteAtIndexes[0].1 as? TypeUnderTest + let _metadata = writeTransaction.didWriteAtIndexes[0].2 + + XCTAssertNotNil(_identifier?.identifier) + + XCTAssertEqual(_index, index) + XCTAssertEqual(_identifier?.identifier, item.identifier) + XCTAssertNil(_metadata) + } + + func checkTransactionDidWriteItems(_ result: [TypeUnderTest]) { XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) + XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sorted(), indexes.map { $0.key }.sorted()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertFalse(result.isEmpty) XCTAssertEqual(Set(result), Set(items)) } - func checkTransactionDidReadItem(result: TypeUnderTest?) -> Bool { + func checkTransactionDidReadItem(_ result: TypeUnderTest?) -> Bool { guard let result = result else { return false } XCTAssertEqual(readTransaction.didReadAtIndex, index) XCTAssertEqual(result.identifier, item.identifier) - XCTAssertNil(result.metadata) return true } - func checkTransactionDidReadItems(result: [TypeUnderTest]) -> Bool { - if result.isEmpty { + func checkTransactionDidReadItems(_ result: [TypeUnderTest?]) -> Bool { + if result.flatMap({$0}).isEmpty { return false } XCTAssertEqual(Set(readTransaction.didReadAtIndexes), Set(indexes)) - XCTAssertEqual(result.count, items.count) + XCTAssertEqual(result.flatMap({$0}).count, items.count) return true } @@ -135,18 +141,6 @@ class ObjectWithNoMetadataTests: XCTestCase { } } -class Base_ObjectWithNoMetadataTests: ObjectWithNoMetadataTests { - - func test__metadata_is_nil() { - XCTAssertNil(item.metadata) - } - - func test__metadata_cannot_be_set() { - item.metadata = Void() - XCTAssertNil(item.metadata) - } -} - class Functional_Read_ObjectWithNoMetadataTests: ObjectWithNoMetadataTests { // Functional API - ReadTransactionType - Reading @@ -300,24 +294,24 @@ class Functional_Write_ObjectWithNoMetadataTests: ObjectWithNoMetadataTests { func test__connection__async_write_item() { var result: TypeUnderTest! - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") connection.asyncWrite(item) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItem(result) XCTAssertTrue(connection.didAsyncWrite) } func test__connection__async_write_items() { var result: [TypeUnderTest] = [] - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") connection.asyncWrite(items) { received in result = received expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItems(result) XCTAssertTrue(connection.didAsyncWrite) } @@ -352,23 +346,23 @@ class Functional_Remove_ObjectWithNoMetadataTests: ObjectWithNoMetadataTests { } func test__connection_async_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() connection.asyncRemove(item) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_async_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() connection.asyncRemove(items) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didAsyncWrite) } @@ -567,8 +561,8 @@ class Persistable_Read_ObjectWithNoMetadataTests: ObjectWithNoMetadataTests { reader = Read(readTransaction) let (items, missing) = reader.filterExisting(keys) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) - XCTAssertEqual(missing, Array(keys.suffixFrom(1))) + XCTAssertEqual(items.map { $0.identifier }, items.prefix(upTo: 1).map { $0.identifier }) + XCTAssertEqual(missing, Array(keys.suffix(from: 1))) } // Reading - With Connection @@ -646,8 +640,8 @@ class Persistable_Read_ObjectWithNoMetadataTests: ObjectWithNoMetadataTests { let (items, missing) = reader.filterExisting(keys) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) - XCTAssertEqual(missing, Array(keys.suffixFrom(1))) + XCTAssertEqual(items.map { $0.identifier }, items.prefix(upTo: 1).map { $0.identifier }) + XCTAssertEqual(missing, Array(keys.suffix(from: 1))) } } @@ -664,20 +658,20 @@ class Persistable_Write_ObjectWithNoMetadataTests: ObjectWithNoMetadataTests { } func test__item_persistable__write_async_using_connection() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") var result: TypeUnderTest! = nil item.asyncWrite(connection) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItem(result) XCTAssertTrue(connection.didAsyncWrite) } func test__item_persistable__write_using_opertion() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") let operation = item.writeOperation(connection) operation.completionBlock = { @@ -685,11 +679,18 @@ class Persistable_Write_ObjectWithNoMetadataTests: ObjectWithNoMetadataTests { } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].1.identifier, item.identifier) - XCTAssertNil(writeTransaction.didWriteAtIndexes[0].2) + + let _index = writeTransaction.didWriteAtIndexes[0].0 + let _identifier = writeTransaction.didWriteAtIndexes[0].1 as? TypeUnderTest + let _metadata = writeTransaction.didWriteAtIndexes[0].2 + + XCTAssertNotNil(_identifier?.identifier) + + XCTAssertEqual(_index, index) + XCTAssertEqual(_identifier?.identifier, item.identifier) + XCTAssertNil(_metadata) XCTAssertTrue(connection.didWrite) } @@ -703,20 +704,20 @@ class Persistable_Write_ObjectWithNoMetadataTests: ObjectWithNoMetadataTests { } func test__items_persistable__write_async_using_connection() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") var result: [TypeUnderTest] = [] items.asyncWrite(connection) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItems(result) XCTAssertTrue(connection.didAsyncWrite) } func test__items_persistable__write_using_opertion() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") let operation = items.writeOperation(connection) operation.completionBlock = { @@ -724,9 +725,9 @@ class Persistable_Write_ObjectWithNoMetadataTests: ObjectWithNoMetadataTests { } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) + XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sorted(), indexes.map { $0.key }.sorted()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertTrue(connection.didWrite) } @@ -748,25 +749,25 @@ class Persistable_Remove_ObjectWithNoMetadataTests: ObjectWithNoMetadataTests { } func test__connection_async_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() item.asyncRemove(connection) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_operation_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() let operation = item.removeOperation(connection) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didWrite) } @@ -786,25 +787,25 @@ class Persistable_Remove_ObjectWithNoMetadataTests: ObjectWithNoMetadataTests { } func test__connection_async_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() items.asyncRemove(connection) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_operation_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() let operation = items.removeOperation(connection) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didWrite) } diff --git a/Tests/ObjectWithObjectMetadataTests.swift b/Tests/ObjectWithObjectMetadataTests.swift index a4f71fb..c79acfd 100644 --- a/Tests/ObjectWithObjectMetadataTests.swift +++ b/Tests/ObjectWithObjectMetadataTests.swift @@ -13,12 +13,15 @@ import XCTest class ObjectWithObjectMetadataTests: XCTestCase { typealias TypeUnderTest = Employee + typealias MetadataTypeUnderTest = NSDate var item: TypeUnderTest! + var metadata: MetadataTypeUnderTest! var index: YapDB.Index! var key: String! var items: [TypeUnderTest]! + var metadatas: [MetadataTypeUnderTest?]! var indexes: [YapDB.Index]! var keys: [String]! @@ -29,8 +32,8 @@ class ObjectWithObjectMetadataTests: XCTestCase { var reader: Read! - var dispatchQueue: dispatch_queue_t! - var operationQueue: NSOperationQueue! + var dispatchQueue: DispatchQueue! + var operationQueue: OperationQueue! override func setUp() { super.setUp() @@ -50,15 +53,17 @@ class ObjectWithObjectMetadataTests: XCTestCase { connection.writeTransaction = writeTransaction database.connection = connection - dispatchQueue = dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0) - operationQueue = NSOperationQueue() + dispatchQueue = DispatchQueue.global(qos: .default) + operationQueue = OperationQueue() } override func tearDown() { item = nil + metadata = nil index = nil key = nil items = nil + metadatas = nil indexes = nil keys = nil @@ -73,60 +78,68 @@ class ObjectWithObjectMetadataTests: XCTestCase { func createPersistables() { item = TypeUnderTest(id: "beatle-1", name: "John") - item.metadata = NSDate() + metadata = NSDate() items = [ item, TypeUnderTest(id: "beatle-2", name: "Paul"), TypeUnderTest(id: "beatle-3", name: "George"), TypeUnderTest(id: "beatle-4", name: "Ringo") ] - items.suffixFrom(1).forEach { $0.metadata = NSDate() } + metadatas = [metadata] + items.suffix(from: 1).forEach { _ in metadatas.append(NSDate()) } } func configureForReadingSingle() { readTransaction.object = item - readTransaction.metadata = item.metadata + readTransaction.metadata = metadata as AnyObject? } func configureForReadingMultiple() { readTransaction.objects = items - readTransaction.metadatas = items.map { $0.metadata } + readTransaction.metadatas = metadatas.map { $0 } readTransaction.keys = keys } - func checkTransactionDidWriteItem(result: TypeUnderTest) { - XCTAssertEqual(result.identifier, item.identifier) + func checkTransactionDidWriteItem(_ result: YapItem) { + XCTAssertEqual(result.value.identifier, item.identifier) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].1.identifier, item.identifier) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].2 as? NSDate, item.metadata) + + let _index = writeTransaction.didWriteAtIndexes[0].0 + let _identifier = writeTransaction.didWriteAtIndexes[0].1 as? TypeUnderTest + let _metadata = writeTransaction.didWriteAtIndexes[0].2 + + XCTAssertNotNil(_identifier?.identifier) + + XCTAssertEqual(_index, index) + XCTAssertEqual(_identifier?.identifier, item.identifier) + XCTAssertEqual(_metadata as? NSDate, metadata) } - func checkTransactionDidWriteItems(result: [TypeUnderTest]) { + func checkTransactionDidWriteItems(_ result: [YapItem]) { XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) + XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sorted(), indexes.map { $0.key }.sorted()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertFalse(result.isEmpty) - XCTAssertEqual(Set(result), Set(items)) + XCTAssertEqual(Set(result.map({$0.value})), Set(items)) } - func checkTransactionDidReadItem(result: TypeUnderTest?) -> Bool { + func checkTransactionDidReadItem(_ result: YapItem?) -> Bool { guard let result = result else { return false } XCTAssertEqual(readTransaction.didReadAtIndex, index) - XCTAssertEqual(result.identifier, item.identifier) + XCTAssertEqual(result.value.identifier, item.identifier) XCTAssertEqual(readTransaction.didReadMetadataAtIndex, index) - XCTAssertEqual(result.metadata, item.metadata) + XCTAssertEqual(result.metadata, metadata) return true } - func checkTransactionDidReadItems(result: [TypeUnderTest]) -> Bool { - if result.isEmpty { + func checkTransactionDidReadItems(_ result: [YapItem?]) -> Bool { + if result.flatMap({$0}).isEmpty { return false } XCTAssertEqual(Set(readTransaction.didReadAtIndexes), Set(indexes)) - XCTAssertEqual(result.count, items.count) + XCTAssertEqual(result.flatMap({$0}).count, items.count) return true } @@ -145,7 +158,7 @@ class ObjectWithObjectMetadataTests: XCTestCase { class Base_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTests { func test__metadata_is_not_nil() { - XCTAssertNotNil(item.metadata) + XCTAssertNotNil(metadata) } } @@ -155,116 +168,116 @@ class Functional_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTes func test__transaction__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(Set(indexes)))) } func test__transaction__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(Set(keys)))) } func test__transaction__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAll())) } // Functional API - ConnectionType - Reading func test__connection__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(Set(indexes)))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(Set(keys)))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAll())) XCTAssertTrue(connection.didRead) } } @@ -272,54 +285,45 @@ class Functional_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTes class Functional_Write_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTests { func test__transaction__write_item() { - checkTransactionDidWriteItem(writeTransaction.write(item)) + checkTransactionDidWriteItem(writeTransaction.writeWithMetadata(YapItem(item, metadata))) } func test__transaction__write_items() { - checkTransactionDidWriteItems(writeTransaction.write(items)) - } - - func test__transaction__write_items_2() { - checkTransactionDidWriteItems(writeTransaction.write(Set(items))) + checkTransactionDidWriteItems(writeTransaction.writeWithMetadata(items.yapItems(with: metadatas))) } // MARK: - Functional API - Connection - Writing func test__connection__write_item() { - checkTransactionDidWriteItem(connection.write(item)) + checkTransactionDidWriteItem(connection.writeWithMetadata(YapItem(item, metadata))) XCTAssertTrue(connection.didWrite) } func test__connection__write_items() { - checkTransactionDidWriteItems(connection.write(items)) - XCTAssertTrue(connection.didWrite) - } - - func test__connection__write_items_2() { - checkTransactionDidWriteItems(connection.write(Set(items))) + checkTransactionDidWriteItems(connection.writeWithMetadata(items.yapItems(with: metadatas))) XCTAssertTrue(connection.didWrite) } func test__connection__async_write_item() { - var result: TypeUnderTest! - let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(item) { tmp in + var result: YapItem! + let expectation = self.expectation(description: "Test: \(#function)") + connection.asyncWriteWithMetadata(YapItem(item, metadata)) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItem(result) XCTAssertTrue(connection.didAsyncWrite) } func test__connection__async_write_items() { - var result: [TypeUnderTest] = [] - let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(items) { received in + var result: [YapItem] = [] + let expectation = self.expectation(description: "Test: \(#function)") + connection.asyncWriteWithMetadata(items.yapItems(with: metadatas)) { received in result = received expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItems(result) XCTAssertTrue(connection.didAsyncWrite) } @@ -354,23 +358,23 @@ class Functional_Remove_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataT } func test__connection_async_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() connection.asyncRemove(item) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_async_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() connection.asyncRemove(items) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didAsyncWrite) } @@ -382,45 +386,45 @@ class Curried_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTests func test__curried__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_index_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } } @@ -428,7 +432,7 @@ class Curried_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTests class Curried_Write_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTests { func test__curried__write() { - checkTransactionDidWriteItem(connection.write(item.write())) + checkTransactionDidWriteItem(connection.write(item.writeWithMetadata(metadata))) XCTAssertTrue(connection.didWrite) } } @@ -440,69 +444,69 @@ class Persistable_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTe func test__reader__in_transaction_at_index() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader__in_transaction_at_index_2() { configureForReadingSingle() reader = Read(readTransaction) - let atIndex = reader.inTransactionAtIndex(readTransaction) + let atIndex: (YapDB.Index) -> YapItem? = reader.withMetadataInTransactionAtIndex(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(atIndex(index))) } func test__reader__at_index_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.atIndexInTransaction(index) + let inTransaction: (TestableReadTransaction) -> YapItem? = reader.withMetadataAtIndexInTransaction(index) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__at_indexes_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__at_indexes_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__in_transaction_by_key() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, byKey: key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, byKey: key))) } func test__reader__in_transaction_by_key_2() { configureForReadingSingle() reader = Read(readTransaction) - let byKey = reader.inTransactionByKey(readTransaction) + let byKey: (String) -> YapItem? = reader.withMetadataInTransactionByKey(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(byKey(key))) } func test__reader__by_key_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.byKeyInTransaction(key) + let inTransaction: (TestableReadTransaction) -> YapItem? = reader.withMetadataByKeyInTransaction(key) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__by_keys_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } func test__reader__by_keys_in_transaction_with_items_with_keys() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction()(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction()(readTransaction))) } func test__reader__by_keys_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } // Reading - With Transaction @@ -510,67 +514,67 @@ class Persistable_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTe func test__reader_with_transaction__at_index_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__at_index_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) } func test__reader_with_transaction__at_indexes_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__at_indexes_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__by_key_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__by_key_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) } func test__reader_with_transaction__by_keys_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__by_keys_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__all_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__all_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__filter() { configureForReadingSingle() reader = Read(readTransaction) - let (items, missing) = reader.filterExisting(keys) + let (items, missing): ([YapItem], [String]) = reader.withMetadataFilterExisting(keys) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) - XCTAssertEqual(missing, Array(keys.suffixFrom(1))) + XCTAssertEqual(items.map { $0.value.identifier }, items.prefix(upTo: 1).map { $0.value.identifier }) + XCTAssertEqual(missing, Array(keys.suffix(from: 1))) } // Reading - With Connection @@ -578,66 +582,66 @@ class Persistable_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTe func test__reader_with_connection__at_index_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_index_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__all_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_connection__all_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } @@ -648,8 +652,8 @@ class Persistable_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTe let (items, missing) = reader.filterExisting(keys) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) - XCTAssertEqual(missing, Array(keys.suffixFrom(1))) + XCTAssertEqual(items.map { $0.identifier }, items.prefix(upTo: 1).map { $0.identifier }) + XCTAssertEqual(missing, Array(keys.suffix(from: 1))) } } @@ -657,68 +661,76 @@ class Persistable_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTe class Persistable_Write_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTests { func test__item_persistable__write_using_transaction() { - checkTransactionDidWriteItem(item.write(writeTransaction)) + checkTransactionDidWriteItem(item.writeWithMetadata(writeTransaction, metadata: metadata)) } func test__item_persistable__write_using_connection() { - checkTransactionDidWriteItem(item.write(connection)) + checkTransactionDidWriteItem(item.writeWithMetadata(connection, metadata: metadata)) XCTAssertTrue(connection.didWrite) } func test__item_persistable__write_async_using_connection() { - let expectation = expectationWithDescription("Test: \(#function)") - var result: TypeUnderTest! = nil + let expectation = self.expectation(description: "Test: \(#function)") + var result: YapItem! = nil - item.asyncWrite(connection) { tmp in + item.asyncWriteWithMetadata(connection, metadata: metadata) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItem(result) XCTAssertTrue(connection.didAsyncWrite) } func test__item_persistable__write_using_opertion() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") - let operation = item.writeOperation(connection) + let operation = item.writeWithMetadataOperation(connection, metadata: metadata) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].1.identifier, item.identifier) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].2 as? NSDate, item.metadata) + + let _index = writeTransaction.didWriteAtIndexes[0].0 + let _identifier = writeTransaction.didWriteAtIndexes[0].1 as? TypeUnderTest + let _metadata = writeTransaction.didWriteAtIndexes[0].2 + + XCTAssertNotNil(_identifier?.identifier) + + XCTAssertEqual(_index, index) + XCTAssertEqual(_identifier?.identifier, item.identifier) + XCTAssertEqual(_metadata as? NSDate, metadata) + XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_using_transaction() { - checkTransactionDidWriteItems(items.write(writeTransaction)) + checkTransactionDidWriteItems(items.writeWithMetadata(writeTransaction, metadata: metadatas)) } func test__items_persistable__write_using_connection() { - checkTransactionDidWriteItems(items.write(connection)) + checkTransactionDidWriteItems(items.writeWithMetadata(connection, metadata: metadatas)) XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_async_using_connection() { - let expectation = expectationWithDescription("Test: \(#function)") - var result: [TypeUnderTest] = [] + let expectation = self.expectation(description: "Test: \(#function)") + var result: [YapItem] = [] - items.asyncWrite(connection) { tmp in + items.asyncWriteWithMetadata(connection, metadata: metadatas) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItems(result) XCTAssertTrue(connection.didAsyncWrite) } func test__items_persistable__write_using_opertion() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") let operation = items.writeOperation(connection) operation.completionBlock = { @@ -726,9 +738,9 @@ class Persistable_Write_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataT } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) + XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sorted(), indexes.map { $0.key }.sorted()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertTrue(connection.didWrite) } @@ -750,25 +762,25 @@ class Persistable_Remove_ObjectWithObjectMetadataTests: ObjectWithObjectMetadata } func test__connection_async_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() item.asyncRemove(connection) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_operation_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() let operation = item.removeOperation(connection) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didWrite) } @@ -788,25 +800,25 @@ class Persistable_Remove_ObjectWithObjectMetadataTests: ObjectWithObjectMetadata } func test__connection_async_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() items.asyncRemove(connection) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_operation_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() let operation = items.removeOperation(connection) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didWrite) } diff --git a/Tests/ObjectWithValueMetadataTests.swift b/Tests/ObjectWithValueMetadataTests.swift index ddbe249..c2e6b73 100644 --- a/Tests/ObjectWithValueMetadataTests.swift +++ b/Tests/ObjectWithValueMetadataTests.swift @@ -13,12 +13,15 @@ import XCTest class ObjectWithValueMetadataTests: XCTestCase { typealias TypeUnderTest = Manager + typealias MetadataTypeUnderTest = Manager.Metadata var item: TypeUnderTest! + var metadata: MetadataTypeUnderTest! var index: YapDB.Index! var key: String! var items: [TypeUnderTest]! + var metadatas: [MetadataTypeUnderTest?]! var indexes: [YapDB.Index]! var keys: [String]! @@ -29,8 +32,8 @@ class ObjectWithValueMetadataTests: XCTestCase { var reader: Read! - var dispatchQueue: dispatch_queue_t! - var operationQueue: NSOperationQueue! + var dispatchQueue: DispatchQueue! + var operationQueue: OperationQueue! override func setUp() { super.setUp() @@ -50,15 +53,17 @@ class ObjectWithValueMetadataTests: XCTestCase { connection.writeTransaction = writeTransaction database.connection = connection - dispatchQueue = dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0) - operationQueue = NSOperationQueue() + dispatchQueue = DispatchQueue.global(qos: .default) + operationQueue = OperationQueue() } override func tearDown() { item = nil + metadata = nil index = nil key = nil items = nil + metadatas = nil indexes = nil keys = nil @@ -73,60 +78,74 @@ class ObjectWithValueMetadataTests: XCTestCase { func createPersistables() { item = TypeUnderTest(id: "beatle-1", name: "John") - item.metadata = TypeUnderTest.Metadata(numberOfDirectReports: 4) + metadata = MetadataTypeUnderTest(numberOfDirectReports: 4) items = [ item, TypeUnderTest(id: "beatle-2", name: "Paul"), TypeUnderTest(id: "beatle-3", name: "George"), TypeUnderTest(id: "beatle-4", name: "Ringo") ] - items.suffixFrom(1).forEach { $0.metadata = TypeUnderTest.Metadata(numberOfDirectReports: 1) } + metadatas = [ + metadata, + MetadataTypeUnderTest(numberOfDirectReports: 3), + MetadataTypeUnderTest(numberOfDirectReports: 2), + MetadataTypeUnderTest(numberOfDirectReports: 1) + ] } func configureForReadingSingle() { readTransaction.object = item - readTransaction.metadata = item.metadata?.encoded + readTransaction.metadata = metadata?.encoded } func configureForReadingMultiple() { readTransaction.objects = items - readTransaction.metadatas = items.map { $0.metadata?.encoded } + readTransaction.metadatas = metadatas.map { $0?.encoded } readTransaction.keys = keys } - func checkTransactionDidWriteItem(result: TypeUnderTest) { - XCTAssertEqual(result.identifier, item.identifier) + func checkTransactionDidWriteItem(_ result: YapItem) { + XCTAssertEqual(result.value.identifier, item.identifier) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].1.identifier, item.identifier) - XCTAssertEqual(TypeUnderTest.MetadataType.decode(writeTransaction.didWriteAtIndexes[0].2), item.metadata) + + let _index = writeTransaction.didWriteAtIndexes[0].0 + let _identifier = writeTransaction.didWriteAtIndexes[0].1 as? TypeUnderTest + let _metadata = writeTransaction.didWriteAtIndexes[0].2 + + XCTAssertNotNil(_identifier?.identifier) + + XCTAssertEqual(_index, index) + XCTAssertEqual(_identifier?.identifier, item.identifier) + XCTAssertNotNil(_metadata) + + XCTAssertEqual(MetadataTypeUnderTest.decode(_metadata), metadata) } - func checkTransactionDidWriteItems(result: [TypeUnderTest]) { + func checkTransactionDidWriteItems(_ result: [YapItem]) { XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) + XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sorted(), indexes.map { $0.key }.sorted()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertFalse(result.isEmpty) - XCTAssertEqual(Set(result), Set(items)) + XCTAssertEqual(Set(result.map({$0.value})), Set(items)) } - func checkTransactionDidReadItem(result: TypeUnderTest?) -> Bool { + func checkTransactionDidReadItem(_ result: YapItem?) -> Bool { guard let result = result else { return false } XCTAssertEqual(readTransaction.didReadAtIndex, index) - XCTAssertEqual(result.identifier, item.identifier) + XCTAssertEqual(result.value.identifier, item.identifier) XCTAssertEqual(readTransaction.didReadMetadataAtIndex, index) - XCTAssertEqual(result.metadata, item.metadata) + XCTAssertEqual(result.metadata, metadata) return true } - func checkTransactionDidReadItems(result: [TypeUnderTest]) -> Bool { - if result.isEmpty { + func checkTransactionDidReadItems(_ result: [YapItem?]) -> Bool { + if result.flatMap({$0}).isEmpty { return false } XCTAssertEqual(Set(readTransaction.didReadAtIndexes), Set(indexes)) - XCTAssertEqual(result.count, items.count) + XCTAssertEqual(result.flatMap({$0}).count, items.count) return true } @@ -145,7 +164,7 @@ class ObjectWithValueMetadataTests: XCTestCase { class Base_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests { func test__metadata_is_not_nil() { - XCTAssertNotNil(item.metadata) + XCTAssertNotNil(metadata) } } @@ -155,116 +174,116 @@ class Functional_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests func test__transaction__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(Set(indexes)))) } func test__transaction__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(Set(keys)))) } func test__transaction__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAll())) } // Functional API - ConnectionType - Reading func test__connection__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(Set(indexes)))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(Set(keys)))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAll())) XCTAssertTrue(connection.didRead) } } @@ -272,54 +291,45 @@ class Functional_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests class Functional_Write_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests { func test__transaction__write_item() { - checkTransactionDidWriteItem(writeTransaction.write(item)) + checkTransactionDidWriteItem(writeTransaction.writeWithMetadata(YapItem(item, metadata))) } func test__transaction__write_items() { - checkTransactionDidWriteItems(writeTransaction.write(items)) - } - - func test__transaction__write_items_2() { - checkTransactionDidWriteItems(writeTransaction.write(Set(items))) + checkTransactionDidWriteItems(writeTransaction.writeWithMetadata(items.yapItems(with: metadatas))) } // MARK: - Functional API - Connection - Writing func test__connection__write_item() { - checkTransactionDidWriteItem(connection.write(item)) + checkTransactionDidWriteItem(connection.writeWithMetadata(YapItem(item, metadata))) XCTAssertTrue(connection.didWrite) } func test__connection__write_items() { - checkTransactionDidWriteItems(connection.write(items)) - XCTAssertTrue(connection.didWrite) - } - - func test__connection__write_items_2() { - checkTransactionDidWriteItems(connection.write(Set(items))) + checkTransactionDidWriteItems(connection.writeWithMetadata(items.yapItems(with: metadatas))) XCTAssertTrue(connection.didWrite) } func test__connection__async_write_item() { - var result: TypeUnderTest! - let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(item) { tmp in + var result: YapItem! + let expectation = self.expectation(description: "Test: \(#function)") + connection.asyncWriteWithMetadata(YapItem(item, metadata)) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItem(result) XCTAssertTrue(connection.didAsyncWrite) } func test__connection__async_write_items() { - var result: [TypeUnderTest] = [] - let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(items) { received in + var result: [YapItem] = [] + let expectation = self.expectation(description: "Test: \(#function)") + connection.asyncWriteWithMetadata(items.yapItems(with: metadatas)) { received in result = received expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItems(result) XCTAssertTrue(connection.didAsyncWrite) } @@ -354,23 +364,23 @@ class Functional_Remove_ObjectWithValueMetadataTests: ObjectWithValueMetadataTes } func test__connection_async_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() connection.asyncRemove(item) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_async_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() connection.asyncRemove(items) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didAsyncWrite) } @@ -382,45 +392,45 @@ class Curried_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests { func test__curried__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_index_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } } @@ -428,7 +438,7 @@ class Curried_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests { class Curried_Write_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests { func test__curried__write() { - checkTransactionDidWriteItem(connection.write(item.write())) + checkTransactionDidWriteItem(connection.write(item.writeWithMetadata(metadata))) XCTAssertTrue(connection.didWrite) } } @@ -440,69 +450,69 @@ class Persistable_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTest func test__reader__in_transaction_at_index() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader__in_transaction_at_index_2() { configureForReadingSingle() reader = Read(readTransaction) - let atIndex = reader.inTransactionAtIndex(readTransaction) + let atIndex: (YapDB.Index) -> YapItem? = reader.withMetadataInTransactionAtIndex(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(atIndex(index))) } func test__reader__at_index_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.atIndexInTransaction(index) + let inTransaction: (TestableReadTransaction) -> YapItem? = reader.withMetadataAtIndexInTransaction(index) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__at_indexes_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__at_indexes_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__in_transaction_by_key() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, byKey: key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, byKey: key))) } func test__reader__in_transaction_by_key_2() { configureForReadingSingle() reader = Read(readTransaction) - let byKey = reader.inTransactionByKey(readTransaction) + let byKey: (String) -> YapItem? = reader.withMetadataInTransactionByKey(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(byKey(key))) } func test__reader__by_key_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.byKeyInTransaction(key) + let inTransaction: (TestableReadTransaction) -> YapItem? = reader.withMetadataByKeyInTransaction(key) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__by_keys_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } func test__reader__by_keys_in_transaction_with_items_with_keys() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction()(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction()(readTransaction))) } func test__reader__by_keys_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } // Reading - With Transaction @@ -510,67 +520,67 @@ class Persistable_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTest func test__reader_with_transaction__at_index_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__at_index_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) } func test__reader_with_transaction__at_indexes_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__at_indexes_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__by_key_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__by_key_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) } func test__reader_with_transaction__by_keys_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__by_keys_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__all_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__all_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__filter() { configureForReadingSingle() reader = Read(readTransaction) - let (items, missing) = reader.filterExisting(keys) + let (items, missing): ([YapItem], [String]) = reader.withMetadataFilterExisting(keys) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) - XCTAssertEqual(missing, Array(keys.suffixFrom(1))) + XCTAssertEqual(items.map { $0.value.identifier }, items.prefix(upTo: 1).map { $0.value.identifier }) + XCTAssertEqual(missing, Array(keys.suffix(from: 1))) } // Reading - With Connection @@ -578,66 +588,66 @@ class Persistable_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTest func test__reader_with_connection__at_index_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_index_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__all_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_connection__all_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } @@ -648,8 +658,8 @@ class Persistable_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTest let (items, missing) = reader.filterExisting(keys) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) - XCTAssertEqual(missing, Array(keys.suffixFrom(1))) + XCTAssertEqual(items.map { $0.identifier }, items.prefix(upTo: 1).map { $0.identifier }) + XCTAssertEqual(missing, Array(keys.suffix(from: 1))) } } @@ -657,68 +667,76 @@ class Persistable_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTest class Persistable_Write_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests { func test__item_persistable__write_using_transaction() { - checkTransactionDidWriteItem(item.write(writeTransaction)) + checkTransactionDidWriteItem(item.writeWithMetadata(writeTransaction, metadata: metadata)) } func test__item_persistable__write_using_connection() { - checkTransactionDidWriteItem(item.write(connection)) + checkTransactionDidWriteItem(item.writeWithMetadata(connection, metadata: metadata)) XCTAssertTrue(connection.didWrite) } func test__item_persistable__write_async_using_connection() { - let expectation = expectationWithDescription("Test: \(#function)") - var result: TypeUnderTest! = nil + let expectation = self.expectation(description: "Test: \(#function)") + var result: YapItem! = nil - item.asyncWrite(connection) { tmp in + item.asyncWriteWithMetadata(connection, metadata: metadata) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItem(result) XCTAssertTrue(connection.didAsyncWrite) } func test__item_persistable__write_using_opertion() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") - let operation = item.writeOperation(connection) + let operation = item.writeWithMetadataOperation(connection, metadata: metadata) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].1.identifier, item.identifier) - XCTAssertEqual(TypeUnderTest.MetadataType.decode(writeTransaction.didWriteAtIndexes[0].2), item.metadata) + + let _index = writeTransaction.didWriteAtIndexes[0].0 + let _identifier = writeTransaction.didWriteAtIndexes[0].1 as? TypeUnderTest + let _metadata = writeTransaction.didWriteAtIndexes[0].2 + + XCTAssertNotNil(_identifier?.identifier) + + XCTAssertEqual(_index, index) + XCTAssertEqual(_identifier?.identifier, item.identifier) + XCTAssertEqual(MetadataTypeUnderTest.decode(_metadata), metadata) + XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_using_transaction() { - checkTransactionDidWriteItems(items.write(writeTransaction)) + checkTransactionDidWriteItems(items.writeWithMetadata(writeTransaction, metadata: metadatas)) } func test__items_persistable__write_using_connection() { - checkTransactionDidWriteItems(items.write(connection)) + checkTransactionDidWriteItems(items.writeWithMetadata(connection, metadata: metadatas)) XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_async_using_connection() { - let expectation = expectationWithDescription("Test: \(#function)") - var result: [TypeUnderTest] = [] + let expectation = self.expectation(description: "Test: \(#function)") + var result: [YapItem] = [] - items.asyncWrite(connection) { tmp in + items.asyncWriteWithMetadata(connection, metadata: metadatas) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItems(result) XCTAssertTrue(connection.didAsyncWrite) } func test__items_persistable__write_using_opertion() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") let operation = items.writeOperation(connection) operation.completionBlock = { @@ -726,9 +744,9 @@ class Persistable_Write_ObjectWithValueMetadataTests: ObjectWithValueMetadataTes } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) + XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sorted(), indexes.map { $0.key }.sorted()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertTrue(connection.didWrite) } @@ -750,25 +768,25 @@ class Persistable_Remove_ObjectWithValueMetadataTests: ObjectWithValueMetadataTe } func test__connection_async_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() item.asyncRemove(connection) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_operation_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() let operation = item.removeOperation(connection) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didWrite) } @@ -788,25 +806,25 @@ class Persistable_Remove_ObjectWithValueMetadataTests: ObjectWithValueMetadataTe } func test__connection_async_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() items.asyncRemove(connection) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_operation_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() let operation = items.removeOperation(connection) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didWrite) } diff --git a/Tests/ReadWriteTests.swift b/Tests/ReadWriteTests.swift index ae0f920..71f048c 100644 --- a/Tests/ReadWriteTests.swift +++ b/Tests/ReadWriteTests.swift @@ -10,10 +10,12 @@ import YapDatabase class ReadWriteBaseTests: XCTestCase { var item: Employee! + var metadata: NSDate! var index: YapDB.Index! var key: String! var items: [Employee]! + var metadatas: [NSDate?]! var indexes: [YapDB.Index]! var keys: [String]! @@ -29,9 +31,11 @@ class ReadWriteBaseTests: XCTestCase { override func tearDown() { item = nil + metadata = nil index = nil key = nil items = nil + metadatas = nil indexes = nil keys = nil super.tearDown() @@ -39,18 +43,23 @@ class ReadWriteBaseTests: XCTestCase { func createPersistables() { item = Employee(id: "beatle-1", name: "John") - item.metadata = NSDate() + metadata = NSDate() items = [ item, Employee(id: "beatle-2", name: "Paul"), Employee(id: "beatle-3", name: "George"), Employee(id: "beatle-4", name: "Ringo") ] - items.suffixFrom(1).forEach { $0.metadata = NSDate() } + metadatas = [ + metadata, + NSDate(), + NSDate(), + NSDate() + ] } - func writeItemsToDatabase(db: YapDatabase) { - db.makeNewConnection().write(items) + func writeItemsToDatabase(_ db: YapDatabase) { + _ = db.makeNewConnection().writeWithMetadata(items.yapItems(with: metadatas)) } } @@ -61,7 +70,7 @@ class ReadTests: ReadWriteBaseTests { func test__initialize_with_transaction() { let db = YapDB.testDatabase() let connection = db.makeNewConnection() - connection.readWithBlock { transaction in + connection.read { transaction in self.reader = Read(transaction) XCTAssertNotNil(self.reader) } @@ -86,7 +95,7 @@ class ReadTests: ReadWriteBaseTests { func test__getting_reader_from_persistable_with_transaction() { let db = YapDB.testDatabase() let connection = db.makeNewConnection() - connection.readWithBlock { transaction in + connection.read { transaction in self.reader = Employee.read(transaction) XCTAssertNotNil(self.reader) } diff --git a/Tests/Support.swift b/Tests/Support.swift index b256da5..b0d5f66 100644 --- a/Tests/Support.swift +++ b/Tests/Support.swift @@ -12,7 +12,7 @@ import Foundation class TestableReadTransaction { var keys: [String] = [] - var didKeysInCollection: String? = .None + var didKeysInCollection: String? = .none var object: AnyObject? { get { return objects.first } @@ -53,7 +53,7 @@ class TestableReadTransaction { currentReadIndex += 1 return object } - return .None + return .none } func getNextMetadata() -> AnyObject? { @@ -62,23 +62,23 @@ class TestableReadTransaction { currentMetadataReadIndex += 1 return object } - return .None + return .none } } extension TestableReadTransaction: ReadTransactionType { - func keysInCollection(collection: String) -> [String] { + func keysInCollection(_ collection: String) -> [String] { didKeysInCollection = collection return keys } - func readAtIndex(index: YapDB.Index) -> AnyObject? { + func readAtIndex(_ index: YapDB.Index) -> AnyObject? { didReadAtIndexes.append(index) return getNextObject() } - func readMetadataAtIndex(index: YapDB.Index) -> AnyObject? { + func readMetadataAtIndex(_ index: YapDB.Index) -> AnyObject? { didReadMetadataAtIndexes.append(index) return getNextMetadata() } @@ -93,14 +93,14 @@ class TestableWriteTransaction: TestableReadTransaction { extension TestableWriteTransaction: WriteTransactionType { - func writeAtIndex(index: YapDB.Index, object: AnyObject, metadata: AnyObject?) { + func writeAtIndex(_ index: YapDB.Index, object: AnyObject, metadata: AnyObject?) { didWriteAtIndexes.append((index, object, metadata)) } func removeAtIndexes< - Indexes where - Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) { + Indexes>(_ indexes: Indexes) where + Indexes: Sequence, + Indexes.Iterator.Element == YapDB.Index { didRemoveAtIndexes = Array(indexes) } } @@ -118,34 +118,34 @@ class TestableConnection { extension TestableConnection: ConnectionType { - func read(block: TestableReadTransaction -> T) -> T { + func read(_ block: @escaping (TestableReadTransaction) -> T) -> T { didRead = true return block(readTransaction) } - func write(block: TestableWriteTransaction -> T) -> T { + func write(_ block: @escaping (TestableWriteTransaction) -> T) -> T { didWrite = true return block(writeTransaction) } - func asyncRead(block: TestableReadTransaction -> T, queue: dispatch_queue_t, completion: (T) -> Void) { + func asyncRead(_ block: @escaping (TestableReadTransaction) -> T, queue: DispatchQueue, completion: @escaping (T) -> Void) { didAsyncRead = true - dispatch_async(queue) { [transaction = self.readTransaction] in + queue.async { [transaction = self.readTransaction] in completion(block(transaction)) } } - func asyncWrite(block: TestableWriteTransaction -> T, queue: dispatch_queue_t, completion: (T -> Void)? = .None) { + func asyncWrite(_ block: @escaping (TestableWriteTransaction) -> T, queue: DispatchQueue, completion: ((T) -> Void)? = .none) { didAsyncWrite = true - dispatch_async(queue) { [transaction = self.writeTransaction] in + queue.async { [transaction = self.writeTransaction] in let result = block(transaction) completion?(result) } } - func writeBlockOperation(block: TestableWriteTransaction -> Void) -> NSOperation { + func writeBlockOperation(_ block: @escaping (TestableWriteTransaction) -> Void) -> Operation { didWriteBlockOperation = true - return NSBlockOperation { block(self.writeTransaction) } + return BlockOperation { block(self.writeTransaction) } } } diff --git a/Tests/ValueWithNoMetadataTests.swift b/Tests/ValueWithNoMetadataTests.swift index 7c61aec..4d1d89d 100644 --- a/Tests/ValueWithNoMetadataTests.swift +++ b/Tests/ValueWithNoMetadataTests.swift @@ -31,8 +31,8 @@ class ValueWithNoMetadataTests: XCTestCase { var reader: Read! - var dispatchQueue: dispatch_queue_t! - var operationQueue: NSOperationQueue! + var dispatchQueue: DispatchQueue! + var operationQueue: OperationQueue! override func setUp() { super.setUp() @@ -52,8 +52,8 @@ class ValueWithNoMetadataTests: XCTestCase { connection.writeTransaction = writeTransaction database.connection = connection - dispatchQueue = dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0) - operationQueue = NSOperationQueue() + dispatchQueue = DispatchQueue.global(qos: .default) + operationQueue = OperationQueue() } override func tearDown() { @@ -74,12 +74,12 @@ class ValueWithNoMetadataTests: XCTestCase { } func createPersistables() { - item = .QRCode("I have no idea what the string of a QR Code might look like") + item = .qrCode("I have no idea what the string of a QR Code might look like") items = [ item, - .UPCA(23, 42, 78, 93), - .QRCode("This is a different QR Code!"), - .UPCA(68, 59, 147, 291) + .upca(23, 42, 78, 93), + .qrCode("This is a different QR Code!"), + .upca(68, 59, 147, 291) ] } @@ -92,7 +92,7 @@ class ValueWithNoMetadataTests: XCTestCase { readTransaction.keys = keys } - func checkTransactionDidWriteItem(result: TypeUnderTest) { + func checkTransactionDidWriteItem(_ result: TypeUnderTest) { XCTAssertEqual(result.identifier, item.identifier) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) @@ -100,30 +100,29 @@ class ValueWithNoMetadataTests: XCTestCase { XCTAssertNil(writeTransaction.didWriteAtIndexes[0].2) } - func checkTransactionDidWriteItems(result: [TypeUnderTest]) { + func checkTransactionDidWriteItems(_ result: [TypeUnderTest]) { XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) + XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sorted(), indexes.map { $0.key }.sorted()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertFalse(result.isEmpty) XCTAssertEqual(Set(result), Set(items)) } - func checkTransactionDidReadItem(result: TypeUnderTest?) -> Bool { + func checkTransactionDidReadItem(_ result: TypeUnderTest?) -> Bool { guard let result = result else { return false } XCTAssertEqual(readTransaction.didReadAtIndex, index) XCTAssertEqual(result.identifier, item.identifier) - XCTAssertNil(result.metadata) return true } - func checkTransactionDidReadItems(result: [TypeUnderTest]) -> Bool { - if result.isEmpty { + func checkTransactionDidReadItems(_ result: [TypeUnderTest?]) -> Bool { + if result.flatMap({$0}).isEmpty { return false } XCTAssertEqual(Set(readTransaction.didReadAtIndexes), Set(indexes)) - XCTAssertEqual(result.count, items.count) + XCTAssertEqual(result.flatMap({$0}).count, items.count) return true } @@ -137,18 +136,6 @@ class ValueWithNoMetadataTests: XCTestCase { } } -class Base_ValueWithNoMetadataTests: ValueWithNoMetadataTests { - - func test__metadata_is_nil() { - XCTAssertNil(item.metadata) - } - - func test__metadata_cannot_be_set() { - item.metadata = Void() - XCTAssertNil(item.metadata) - } -} - class Functional_Read_ValueWithNoMetadataTests: ValueWithNoMetadataTests { // Functional API - ReadTransactionType - Reading @@ -302,24 +289,24 @@ class Functional_Write_ValueWithNoMetadataTests: ValueWithNoMetadataTests { func test__connection__async_write_item() { var result: TypeUnderTest! - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") connection.asyncWrite(item) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItem(result) XCTAssertTrue(connection.didAsyncWrite) } func test__connection__async_write_items() { var result: [TypeUnderTest] = [] - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") connection.asyncWrite(items) { received in result = received expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItems(result) XCTAssertTrue(connection.didAsyncWrite) } @@ -354,23 +341,23 @@ class Functional_Remove_ValueWithNoMetadataTests: ValueWithNoMetadataTests { } func test__connection_async_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() connection.asyncRemove(item) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_async_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() connection.asyncRemove(items) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didAsyncWrite) } @@ -569,8 +556,8 @@ class Persistable_Read_ValueWithNoMetadataTests: ValueWithNoMetadataTests { reader = Read(readTransaction) let (items, missing) = reader.filterExisting(keys) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) - XCTAssertEqual(missing, Array(keys.suffixFrom(1))) + XCTAssertEqual(items.map { $0.identifier }, items.prefix(upTo: 1).map { $0.identifier }) + XCTAssertEqual(missing, Array(keys.suffix(from: 1))) } // Reading - With Connection @@ -648,8 +635,8 @@ class Persistable_Read_ValueWithNoMetadataTests: ValueWithNoMetadataTests { let (items, missing) = reader.filterExisting(keys) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) - XCTAssertEqual(missing, Array(keys.suffixFrom(1))) + XCTAssertEqual(items.map { $0.identifier }, items.prefix(upTo: 1).map { $0.identifier }) + XCTAssertEqual(missing, Array(keys.suffix(from: 1))) } } @@ -666,20 +653,20 @@ class Persistable_Write_ValueWithNoMetadataTests: ValueWithNoMetadataTests { } func test__item_persistable__write_async_using_connection() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") var result: TypeUnderTest! = nil item.asyncWrite(connection) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItem(result) XCTAssertTrue(connection.didAsyncWrite) } func test__item_persistable__write_using_opertion() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") let operation = item.writeOperation(connection) operation.completionBlock = { @@ -687,7 +674,7 @@ class Persistable_Write_ValueWithNoMetadataTests: ValueWithNoMetadataTests { } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) XCTAssertEqual(TypeUnderTest.decode(writeTransaction.didWriteAtIndexes[0].1)!, item) @@ -705,20 +692,20 @@ class Persistable_Write_ValueWithNoMetadataTests: ValueWithNoMetadataTests { } func test__items_persistable__write_async_using_connection() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") var result: [TypeUnderTest] = [] items.asyncWrite(connection) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItems(result) XCTAssertTrue(connection.didAsyncWrite) } func test__items_persistable__write_using_opertion() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") let operation = items.writeOperation(connection) operation.completionBlock = { @@ -726,9 +713,9 @@ class Persistable_Write_ValueWithNoMetadataTests: ValueWithNoMetadataTests { } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) + XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sorted(), indexes.map { $0.key }.sorted()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertTrue(connection.didWrite) } @@ -750,25 +737,25 @@ class Persistable_Remove_ValueWithNoMetadataTests: ValueWithNoMetadataTests { } func test__connection_async_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() item.asyncRemove(connection) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_operation_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() let operation = item.removeOperation(connection) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didWrite) } @@ -788,25 +775,25 @@ class Persistable_Remove_ValueWithNoMetadataTests: ValueWithNoMetadataTests { } func test__connection_async_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() items.asyncRemove(connection) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_operation_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() let operation = items.removeOperation(connection) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didWrite) } diff --git a/Tests/ValueWithObjectMetadataTests.swift b/Tests/ValueWithObjectMetadataTests.swift index 185e02f..aa3fd3d 100644 --- a/Tests/ValueWithObjectMetadataTests.swift +++ b/Tests/ValueWithObjectMetadataTests.swift @@ -13,12 +13,15 @@ import XCTest class ValueWithObjectMetadataTests: XCTestCase { typealias TypeUnderTest = Inventory + typealias MetadataTypeUnderTest = NSNumber var item: TypeUnderTest! + var metadata: MetadataTypeUnderTest! var index: YapDB.Index! var key: String! var items: [TypeUnderTest]! + var metadatas: [MetadataTypeUnderTest?]! var indexes: [YapDB.Index]! var keys: [String]! @@ -29,8 +32,8 @@ class ValueWithObjectMetadataTests: XCTestCase { var reader: Read! - var dispatchQueue: dispatch_queue_t! - var operationQueue: NSOperationQueue! + var dispatchQueue: DispatchQueue! + var operationQueue: OperationQueue! override func setUp() { super.setUp() @@ -50,15 +53,17 @@ class ValueWithObjectMetadataTests: XCTestCase { connection.writeTransaction = writeTransaction database.connection = connection - dispatchQueue = dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0) - operationQueue = NSOperationQueue() + dispatchQueue = DispatchQueue.global(qos: .default) + operationQueue = OperationQueue() } override func tearDown() { item = nil + metadata = nil index = nil key = nil items = nil + metadatas = nil indexes = nil keys = nil @@ -74,99 +79,102 @@ class ValueWithObjectMetadataTests: XCTestCase { func createPersistables() { let products = [ Product( - metadata: Product.Metadata(categoryIdentifier: 1), identifier: "vodka-123", name: "Belvidere", - barcode: .UPCA(1, 2, 3, 4) + barcode: .upca(1, 2, 3, 4) ), Product( - metadata: Product.Metadata(categoryIdentifier: 2), identifier: "gin-123", name: "Boxer Gin", - barcode: .UPCA(5, 10, 15, 20) + barcode: .upca(5, 10, 15, 20) ), Product( - metadata: Product.Metadata(categoryIdentifier: 3), identifier: "rum-123", name: "Mount Gay Rum", - barcode: .UPCA(12, 24, 39, 48) + barcode: .upca(12, 24, 39, 48) ), Product( - metadata: Product.Metadata(categoryIdentifier: 2), identifier: "gin-234", name: "Monkey 47", - barcode: .UPCA(31, 62, 93, 124) + barcode: .upca(31, 62, 93, 124) ) ] - items = products.map { TypeUnderTest(product: $0, metadata: NSNumber(integer: 12)) } + metadatas = [ + NSNumber(value: 12 as Int), + NSNumber(value: 13 as Int), + NSNumber(value: 14 as Int), + NSNumber(value: 15 as Int) + ] + items = products.map { TypeUnderTest(product: $0) } item = items[0] + metadata = metadatas[0] } func configureForReadingSingle() { readTransaction.object = item.encoded - readTransaction.metadata = item.metadata + readTransaction.metadata = metadata } func configureForReadingMultiple() { readTransaction.objects = items.encoded - readTransaction.metadatas = items.map { $0.metadata } + readTransaction.metadatas = metadatas.map { $0 } readTransaction.keys = keys } - func checkTransactionDidWriteItem(result: TypeUnderTest) { - XCTAssertEqual(result.identifier, item.identifier) + func checkTransactionDidWriteItem(_ result: YapItem) { + XCTAssertEqual(result.value.identifier, item.identifier) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) XCTAssertEqual(TypeUnderTest.decode(writeTransaction.didWriteAtIndexes[0].1)!, item) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].2 as? NSNumber, item.metadata) + XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].2 as? NSNumber, metadata) } - func checkTransactionDidWriteItems(result: [TypeUnderTest]) { + func checkTransactionDidWriteItems(_ result: [YapItem]) { XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) + XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sorted(), indexes.map { $0.key }.sorted()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertFalse(result.isEmpty) - XCTAssertEqual(Set(result), Set(items)) + XCTAssertEqual(Set(result.map({$0.value})), Set(items)) } - func checkTransactionDidReadItem(result: TypeUnderTest?) -> Bool { + func checkTransactionDidReadItem(_ result: YapItem?) -> Bool { XCTAssertEqual(readTransaction.didReadAtIndex, index) guard let result = result else { return false } XCTAssertEqual(readTransaction.didReadMetadataAtIndex, index) - XCTAssertEqual(result.identifier, item.identifier) - XCTAssertEqual(result.metadata, item.metadata) + XCTAssertEqual(result.value.identifier, item.identifier) + XCTAssertEqual(result.metadata, metadata) return true } - func checkTransactionDidReadItems(result: [TypeUnderTest]) -> Bool { - if result.isEmpty { + func checkTransactionDidReadItems(_ result: [YapItem?]) -> Bool { + if result.flatMap({$0}).isEmpty { return false } XCTAssertEqual(Set(readTransaction.didReadAtIndexes), Set(indexes)) - XCTAssertEqual(result.count, items.count) + XCTAssertEqual(result.flatMap({$0}).count, items.count) return true } - func checkTransactionDidReadMetadataItem(result: TypeUnderTest.MetadataType?) -> Bool { + func checkTransactionDidReadMetadataItem(_ result: MetadataTypeUnderTest?) -> Bool { XCTAssertNil(readTransaction.didReadAtIndex) guard let result = result else { return false } XCTAssertEqual(readTransaction.didReadMetadataAtIndex, index) - XCTAssertEqual(result, item.metadata) + XCTAssertEqual(result, metadata) return true } - func checkTransactionDidReadMetadataItems(result: [TypeUnderTest.MetadataType]) -> Bool { + func checkTransactionDidReadMetadataItems(_ result: [MetadataTypeUnderTest?]) -> Bool { XCTAssertTrue(readTransaction.didReadAtIndexes.isEmpty) - if result.isEmpty { + if result.flatMap({$0}).isEmpty { return false } XCTAssertEqual(Set(readTransaction.didReadMetadataAtIndexes), Set(indexes)) - XCTAssertEqual(result.count, items.count) + XCTAssertEqual(result.flatMap({$0}).count, items.count) return true } @@ -186,7 +194,7 @@ class ValueWithObjectMetadataTests: XCTestCase { class Base_ValueWithObjectMetadataTests: ValueWithObjectMetadataTests { func test__metadata_is_not_nil() { - XCTAssertNotNil(item.metadata) + XCTAssertNotNil(metadata) } } @@ -196,116 +204,116 @@ class Functional_Read_ValueWithObjectMetadataTests: ValueWithObjectMetadataTests func test__transaction__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(Set(indexes)))) } func test__transaction__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(Set(keys)))) } func test__transaction__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAll())) } // Functional API - ConnectionType - Reading func test__connection__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(Set(indexes)))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(Set(keys)))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAll())) XCTAssertTrue(connection.didRead) } } @@ -356,54 +364,45 @@ class Functional_Read_Metadata_ValueWithObjectMetadataTests: ValueWithObjectMeta class Functional_Write_ValueWithObjectMetadataTests: ValueWithObjectMetadataTests { func test__transaction__write_item() { - checkTransactionDidWriteItem(writeTransaction.write(item)) + checkTransactionDidWriteItem(writeTransaction.writeWithMetadata(YapItem(item, metadata))) } func test__transaction__write_items() { - checkTransactionDidWriteItems(writeTransaction.write(items)) - } - - func test__transaction__write_items_2() { - checkTransactionDidWriteItems(writeTransaction.write(Set(items))) + checkTransactionDidWriteItems(writeTransaction.writeWithMetadata(items.yapItems(with: metadatas))) } // MARK: - Functional API - Connection - Writing func test__connection__write_item() { - checkTransactionDidWriteItem(connection.write(item)) + checkTransactionDidWriteItem(connection.writeWithMetadata(YapItem(item, metadata))) XCTAssertTrue(connection.didWrite) } func test__connection__write_items() { - checkTransactionDidWriteItems(connection.write(items)) - XCTAssertTrue(connection.didWrite) - } - - func test__connection__write_items_2() { - checkTransactionDidWriteItems(connection.write(Set(items))) + checkTransactionDidWriteItems(connection.writeWithMetadata(items.yapItems(with: metadatas))) XCTAssertTrue(connection.didWrite) } func test__connection__async_write_item() { - var result: TypeUnderTest! - let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(item) { tmp in + var result: YapItem! + let expectation = self.expectation(description: "Test: \(#function)") + connection.asyncWriteWithMetadata(YapItem(item, metadata)) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItem(result) XCTAssertTrue(connection.didAsyncWrite) } func test__connection__async_write_items() { - var result: [TypeUnderTest] = [] - let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(items) { received in + var result: [YapItem] = [] + let expectation = self.expectation(description: "Test: \(#function)") + connection.asyncWriteWithMetadata(items.yapItems(with: metadatas)) { received in result = received expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItems(result) XCTAssertTrue(connection.didAsyncWrite) } @@ -438,23 +437,23 @@ class Functional_Remove_ValueWithObjectMetadataTests: ValueWithObjectMetadataTes } func test__connection_async_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() connection.asyncRemove(item) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_async_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() connection.asyncRemove(items) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didAsyncWrite) } @@ -466,45 +465,45 @@ class Curried_Read_ValueWithObjectMetadataTests: ValueWithObjectMetadataTests { func test__curried__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_index_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } } @@ -512,7 +511,7 @@ class Curried_Read_ValueWithObjectMetadataTests: ValueWithObjectMetadataTests { class Curried_Write_ValueWithObjectMetadataTests: ValueWithObjectMetadataTests { func test__curried__write() { - checkTransactionDidWriteItem(connection.write(item.write())) + checkTransactionDidWriteItem(connection.write(item.writeWithMetadata(metadata))) XCTAssertTrue(connection.didWrite) } } @@ -524,69 +523,69 @@ class Persistable_Read_ValueWithObjectMetadataTests: ValueWithObjectMetadataTest func test__reader__in_transaction_at_index() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader__in_transaction_at_index_2() { configureForReadingSingle() reader = Read(readTransaction) - let atIndex = reader.inTransactionAtIndex(readTransaction) + let atIndex: (YapDB.Index) -> YapItem? = reader.withMetadataInTransactionAtIndex(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(atIndex(index))) } func test__reader__at_index_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.atIndexInTransaction(index) + let inTransaction: (TestableReadTransaction) -> YapItem? = reader.withMetadataAtIndexInTransaction(index) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__at_indexes_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__at_indexes_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__in_transaction_by_key() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, byKey: key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, byKey: key))) } func test__reader__in_transaction_by_key_2() { configureForReadingSingle() reader = Read(readTransaction) - let byKey = reader.inTransactionByKey(readTransaction) + let byKey: (String) -> YapItem? = reader.withMetadataInTransactionByKey(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(byKey(key))) } func test__reader__by_key_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.byKeyInTransaction(key) + let inTransaction: (TestableReadTransaction) -> YapItem? = reader.withMetadataByKeyInTransaction(key) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__by_keys_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } func test__reader__by_keys_in_transaction_with_items_with_keys() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction()(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction()(readTransaction))) } func test__reader__by_keys_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } // Reading - With Transaction @@ -594,67 +593,67 @@ class Persistable_Read_ValueWithObjectMetadataTests: ValueWithObjectMetadataTest func test__reader_with_transaction__at_index_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__at_index_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) } func test__reader_with_transaction__at_indexes_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__at_indexes_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__by_key_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__by_key_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) } func test__reader_with_transaction__by_keys_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__by_keys_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__all_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__all_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__filter() { configureForReadingSingle() reader = Read(readTransaction) - let (items, missing) = reader.filterExisting(keys) + let (items, missing): ([YapItem], [String]) = reader.withMetadataFilterExisting(keys) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) - XCTAssertEqual(missing, Array(keys.suffixFrom(1))) + XCTAssertEqual(items.map { $0.value.identifier }, items.prefix(upTo: 1).map { $0.value.identifier }) + XCTAssertEqual(missing, Array(keys.suffix(from: 1))) } // Reading - With Connection @@ -662,66 +661,66 @@ class Persistable_Read_ValueWithObjectMetadataTests: ValueWithObjectMetadataTest func test__reader_with_connection__at_index_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_index_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__all_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_connection__all_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } @@ -732,8 +731,8 @@ class Persistable_Read_ValueWithObjectMetadataTests: ValueWithObjectMetadataTest let (items, missing) = reader.filterExisting(keys) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) - XCTAssertEqual(missing, Array(keys.suffixFrom(1))) + XCTAssertEqual(items.map { $0.identifier }, items.prefix(upTo: 1).map { $0.identifier }) + XCTAssertEqual(missing, Array(keys.suffix(from: 1))) } } @@ -792,78 +791,78 @@ class Persistable_Read_Metadata_ValueWithObjectMetadataTests: ValueWithObjectMet class Persistable_Write_ValueWithObjectMetadataTests: ValueWithObjectMetadataTests { func test__item_persistable__write_using_transaction() { - checkTransactionDidWriteItem(item.write(writeTransaction)) + checkTransactionDidWriteItem(item.writeWithMetadata(writeTransaction, metadata: metadata)) } func test__item_persistable__write_using_connection() { - checkTransactionDidWriteItem(item.write(connection)) + checkTransactionDidWriteItem(item.writeWithMetadata(connection, metadata: metadata)) XCTAssertTrue(connection.didWrite) } func test__item_persistable__write_async_using_connection() { - let expectation = expectationWithDescription("Test: \(#function)") - var result: TypeUnderTest! = nil + let expectation = self.expectation(description: "Test: \(#function)") + var result: YapItem! = nil - item.asyncWrite(connection) { tmp in + item.asyncWriteWithMetadata(connection, metadata: metadata) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItem(result) XCTAssertTrue(connection.didAsyncWrite) } func test__item_persistable__write_using_opertion() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") - let operation = item.writeOperation(connection) + let operation = item.writeWithMetadataOperation(connection, metadata: metadata) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) XCTAssertEqual(TypeUnderTest.decode(writeTransaction.didWriteAtIndexes[0].1)!, item) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].2 as? NSNumber, item.metadata) + XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].2 as? NSNumber, metadata) XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_using_transaction() { - checkTransactionDidWriteItems(items.write(writeTransaction)) + checkTransactionDidWriteItems(items.writeWithMetadata(writeTransaction, metadata: metadatas)) } func test__items_persistable__write_using_connection() { - checkTransactionDidWriteItems(items.write(connection)) + checkTransactionDidWriteItems(items.writeWithMetadata(connection, metadata: metadatas)) XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_async_using_connection() { - let expectation = expectationWithDescription("Test: \(#function)") - var result: [TypeUnderTest] = [] + let expectation = self.expectation(description: "Test: \(#function)") + var result: [YapItem] = [] - items.asyncWrite(connection) { tmp in + items.asyncWriteWithMetadata(connection, metadata: metadatas) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItems(result) XCTAssertTrue(connection.didAsyncWrite) } func test__items_persistable__write_using_opertion() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") - let operation = items.writeOperation(connection) + let operation = items.writeWithMetadataOperation(connection, metadata: metadatas) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) + XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sorted(), indexes.map { $0.key }.sorted()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertTrue(connection.didWrite) } @@ -885,25 +884,25 @@ class Persistable_Remove_ValueWithObjectMetadataTests: ValueWithObjectMetadataTe } func test__connection_async_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() item.asyncRemove(connection) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_operation_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() let operation = item.removeOperation(connection) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didWrite) } @@ -923,25 +922,25 @@ class Persistable_Remove_ValueWithObjectMetadataTests: ValueWithObjectMetadataTe } func test__connection_async_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() items.asyncRemove(connection) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_operation_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() let operation = items.removeOperation(connection) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didWrite) } diff --git a/Tests/ValueWithValueMetadataTests.swift b/Tests/ValueWithValueMetadataTests.swift index a22b05d..5453217 100644 --- a/Tests/ValueWithValueMetadataTests.swift +++ b/Tests/ValueWithValueMetadataTests.swift @@ -13,12 +13,15 @@ import XCTest class ValueWithValueMetadataTests: XCTestCase { typealias TypeUnderTest = Product + typealias MetadataTypeUnderTest = Product.Metadata var item: TypeUnderTest! + var metadata: MetadataTypeUnderTest! var index: YapDB.Index! var key: String! var items: [TypeUnderTest]! + var metadatas: [MetadataTypeUnderTest?]! var indexes: [YapDB.Index]! var keys: [String]! @@ -29,8 +32,8 @@ class ValueWithValueMetadataTests: XCTestCase { var reader: Read! - var dispatchQueue: dispatch_queue_t! - var operationQueue: NSOperationQueue! + var dispatchQueue: DispatchQueue! + var operationQueue: OperationQueue! override func setUp() { super.setUp() @@ -50,15 +53,17 @@ class ValueWithValueMetadataTests: XCTestCase { connection.writeTransaction = writeTransaction database.connection = connection - dispatchQueue = dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0) - operationQueue = NSOperationQueue() + dispatchQueue = DispatchQueue.global(qos: .default) + operationQueue = OperationQueue() } override func tearDown() { item = nil + metadata = nil index = nil key = nil items = nil + metadatas = nil indexes = nil keys = nil @@ -73,98 +78,101 @@ class ValueWithValueMetadataTests: XCTestCase { func createPersistables() { item = TypeUnderTest( - metadata: TypeUnderTest.Metadata(categoryIdentifier: 1), identifier: "vodka-123", name: "Belvidere", - barcode: .UPCA(1, 2, 3, 4) + barcode: .upca(1, 2, 3, 4) ) + metadata = TypeUnderTest.Metadata(categoryIdentifier: 1) items = [ item, TypeUnderTest( - metadata: TypeUnderTest.Metadata(categoryIdentifier: 2), identifier: "gin-123", name: "Boxer Gin", - barcode: .UPCA(5, 10, 15, 20) + barcode: .upca(5, 10, 15, 20) ), TypeUnderTest( - metadata: TypeUnderTest.Metadata(categoryIdentifier: 3), identifier: "rum-123", name: "Mount Gay Rum", - barcode: .UPCA(12, 24, 39, 48) + barcode: .upca(12, 24, 39, 48) ), TypeUnderTest( - metadata: TypeUnderTest.Metadata(categoryIdentifier: 2), identifier: "gin-234", name: "Monkey 47", - barcode: .UPCA(31, 62, 93, 124) + barcode: .upca(31, 62, 93, 124) ) ] + metadatas = [ + metadata, + MetadataTypeUnderTest(categoryIdentifier: 2), + MetadataTypeUnderTest(categoryIdentifier: 3), + MetadataTypeUnderTest(categoryIdentifier: 4) + ] } func configureForReadingSingle() { readTransaction.object = item.encoded - readTransaction.metadata = item.metadata?.encoded + readTransaction.metadata = metadata?.encoded } func configureForReadingMultiple() { readTransaction.objects = items.encoded - readTransaction.metadatas = items.map { $0.metadata?.encoded } + readTransaction.metadatas = metadatas.map { $0?.encoded } readTransaction.keys = keys } - func checkTransactionDidWriteItem(result: TypeUnderTest) { - XCTAssertEqual(result.identifier, item.identifier) + func checkTransactionDidWriteItem(_ result: YapItem) { + XCTAssertEqual(result.value.identifier, item.identifier) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) XCTAssertEqual(TypeUnderTest.decode(writeTransaction.didWriteAtIndexes[0].1)!, item) - XCTAssertEqual(TypeUnderTest.MetadataType.decode(writeTransaction.didWriteAtIndexes[0].2), item.metadata) + XCTAssertEqual(MetadataTypeUnderTest.decode(writeTransaction.didWriteAtIndexes[0].2), metadata) } - func checkTransactionDidWriteItems(result: [TypeUnderTest]) { + func checkTransactionDidWriteItems(_ result: [YapItem]) { XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) + XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sorted(), indexes.map { $0.key }.sorted()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertFalse(result.isEmpty) - XCTAssertEqual(Set(result), Set(items)) + XCTAssertEqual(Set(result.map({$0.value})), Set(items)) } - func checkTransactionDidReadItem(result: TypeUnderTest?) -> Bool { + func checkTransactionDidReadItem(_ result: YapItem?) -> Bool { XCTAssertEqual(readTransaction.didReadAtIndex, index) guard let result = result else { return false } XCTAssertEqual(readTransaction.didReadMetadataAtIndex, index) - XCTAssertEqual(result.identifier, item.identifier) - XCTAssertEqual(result.metadata, item.metadata) + XCTAssertEqual(result.value.identifier, item.identifier) + XCTAssertEqual(result.metadata, metadata) return true } - func checkTransactionDidReadItems(result: [TypeUnderTest]) -> Bool { - if result.isEmpty { + func checkTransactionDidReadItems(_ result: [YapItem?]) -> Bool { + if result.flatMap({$0}).isEmpty { return false } XCTAssertEqual(Set(readTransaction.didReadAtIndexes), Set(indexes)) - XCTAssertEqual(result.count, items.count) + XCTAssertEqual(result.flatMap({$0}).count, items.count) return true } - func checkTransactionDidReadMetadataItem(result: TypeUnderTest.MetadataType?) -> Bool { + func checkTransactionDidReadMetadataItem(_ result: MetadataTypeUnderTest?) -> Bool { XCTAssertNil(readTransaction.didReadAtIndex) guard let result = result else { return false } XCTAssertEqual(readTransaction.didReadMetadataAtIndex, index) - XCTAssertEqual(result, item.metadata) + XCTAssertEqual(result, metadata) return true } - func checkTransactionDidReadMetadataItems(result: [TypeUnderTest.MetadataType]) -> Bool { + func checkTransactionDidReadMetadataItems(_ result: [MetadataTypeUnderTest?]) -> Bool { XCTAssertTrue(readTransaction.didReadAtIndexes.isEmpty) - if result.isEmpty { + if result.flatMap({$0}).isEmpty { return false } XCTAssertEqual(Set(readTransaction.didReadMetadataAtIndexes), Set(indexes)) - XCTAssertEqual(result.count, items.count) + XCTAssertEqual(result.flatMap({$0}).count, items.count) return true } @@ -183,7 +191,7 @@ class ValueWithValueMetadataTests: XCTestCase { class Base_ValueWithValueMetadataTests: ValueWithValueMetadataTests { func test__metadata_is_not_nil() { - XCTAssertNotNil(item.metadata) + XCTAssertNotNil(metadata) } } @@ -193,116 +201,116 @@ class Functional_Read_ValueWithValueMetadataTests: ValueWithValueMetadataTests { func test__transaction__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(Set(indexes)))) } func test__transaction__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(Set(keys)))) } func test__transaction__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAll())) } // Functional API - ConnectionType - Reading func test__connection__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(Set(indexes)))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(Set(keys)))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAll())) XCTAssertTrue(connection.didRead) } } @@ -353,54 +361,45 @@ class Functional_Read_Metadata_ValueWithValueMetadataTests: ValueWithValueMetada class Functional_Write_ValueWithValueMetadataTests: ValueWithValueMetadataTests { func test__transaction__write_item() { - checkTransactionDidWriteItem(writeTransaction.write(item)) + checkTransactionDidWriteItem(writeTransaction.writeWithMetadata(YapItem(item, metadata))) } func test__transaction__write_items() { - checkTransactionDidWriteItems(writeTransaction.write(items)) - } - - func test__transaction__write_items_2() { - checkTransactionDidWriteItems(writeTransaction.write(Set(items))) + checkTransactionDidWriteItems(writeTransaction.writeWithMetadata(items.yapItems(with: metadatas))) } // MARK: - Functional API - Connection - Writing func test__connection__write_item() { - checkTransactionDidWriteItem(connection.write(item)) + checkTransactionDidWriteItem(connection.writeWithMetadata(YapItem(item, metadata))) XCTAssertTrue(connection.didWrite) } func test__connection__write_items() { - checkTransactionDidWriteItems(connection.write(items)) - XCTAssertTrue(connection.didWrite) - } - - func test__connection__write_items_2() { - checkTransactionDidWriteItems(connection.write(Set(items))) + checkTransactionDidWriteItems(connection.writeWithMetadata(items.yapItems(with: metadatas))) XCTAssertTrue(connection.didWrite) } func test__connection__async_write_item() { - var result: TypeUnderTest! - let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(item) { tmp in + var result: YapItem! + let expectation = self.expectation(description: "Test: \(#function)") + connection.asyncWriteWithMetadata(YapItem(item, metadata)) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItem(result) XCTAssertTrue(connection.didAsyncWrite) } func test__connection__async_write_items() { - var result: [TypeUnderTest] = [] - let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(items) { received in + var result: [YapItem] = [] + let expectation = self.expectation(description: "Test: \(#function)") + connection.asyncWriteWithMetadata(items.yapItems(with: metadatas)) { received in result = received expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItems(result) XCTAssertTrue(connection.didAsyncWrite) } @@ -435,23 +434,23 @@ class Functional_Remove_ValueWithValueMetadataTests: ValueWithValueMetadataTests } func test__connection_async_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() connection.asyncRemove(item) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_async_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() connection.asyncRemove(items) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didAsyncWrite) } @@ -463,45 +462,45 @@ class Curried_Read_ValueWithValueMetadataTests: ValueWithValueMetadataTests { func test__curried__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_index_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } } @@ -509,7 +508,7 @@ class Curried_Read_ValueWithValueMetadataTests: ValueWithValueMetadataTests { class Curried_Write_ValueWithValueMetadataTests: ValueWithValueMetadataTests { func test__curried__write() { - checkTransactionDidWriteItem(connection.write(item.write())) + checkTransactionDidWriteItem(connection.write(item.writeWithMetadata(metadata))) XCTAssertTrue(connection.didWrite) } } @@ -521,69 +520,69 @@ class Persistable_Read_ValueWithValueMetadataTests: ValueWithValueMetadataTests func test__reader__in_transaction_at_index() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader__in_transaction_at_index_2() { configureForReadingSingle() reader = Read(readTransaction) - let atIndex = reader.inTransactionAtIndex(readTransaction) + let atIndex: (YapDB.Index) -> YapItem? = reader.withMetadataInTransactionAtIndex(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(atIndex(index))) } func test__reader__at_index_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.atIndexInTransaction(index) + let inTransaction: (TestableReadTransaction) -> YapItem? = reader.withMetadataAtIndexInTransaction(index) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__at_indexes_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__at_indexes_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__in_transaction_by_key() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, byKey: key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, byKey: key))) } func test__reader__in_transaction_by_key_2() { configureForReadingSingle() reader = Read(readTransaction) - let byKey = reader.inTransactionByKey(readTransaction) + let byKey: (String) -> YapItem? = reader.withMetadataInTransactionByKey(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(byKey(key))) } func test__reader__by_key_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.byKeyInTransaction(key) + let inTransaction: (TestableReadTransaction) -> YapItem? = reader.withMetadataByKeyInTransaction(key) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__by_keys_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } func test__reader__by_keys_in_transaction_with_items_with_keys() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction()(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction()(readTransaction))) } func test__reader__by_keys_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } // Reading - With Transaction @@ -591,67 +590,67 @@ class Persistable_Read_ValueWithValueMetadataTests: ValueWithValueMetadataTests func test__reader_with_transaction__at_index_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__at_index_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) } func test__reader_with_transaction__at_indexes_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__at_indexes_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__by_key_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__by_key_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) } func test__reader_with_transaction__by_keys_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__by_keys_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__all_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__all_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__filter() { configureForReadingSingle() reader = Read(readTransaction) - let (items, missing) = reader.filterExisting(keys) + let (items, missing): ([YapItem], [String]) = reader.withMetadataFilterExisting(keys) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) - XCTAssertEqual(missing, Array(keys.suffixFrom(1))) + XCTAssertEqual(items.map { $0.value.identifier }, items.prefix(upTo: 1).map { $0.value.identifier }) + XCTAssertEqual(missing, Array(keys.suffix(from: 1))) } // Reading - With Connection @@ -659,66 +658,66 @@ class Persistable_Read_ValueWithValueMetadataTests: ValueWithValueMetadataTests func test__reader_with_connection__at_index_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_index_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__all_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_connection__all_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } @@ -729,8 +728,8 @@ class Persistable_Read_ValueWithValueMetadataTests: ValueWithValueMetadataTests let (items, missing) = reader.filterExisting(keys) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) - XCTAssertEqual(missing, Array(keys.suffixFrom(1))) + XCTAssertEqual(items.map { $0.identifier }, items.prefix(upTo: 1).map { $0.identifier }) + XCTAssertEqual(missing, Array(keys.suffix(from: 1))) } } @@ -789,78 +788,78 @@ class Persistable_Read_Metadata_ValueWithValueMetadataTests: ValueWithValueMetad class Persistable_Write_ValueWithValueMetadataTests: ValueWithValueMetadataTests { func test__item_persistable__write_using_transaction() { - checkTransactionDidWriteItem(item.write(writeTransaction)) + checkTransactionDidWriteItem(item.writeWithMetadata(writeTransaction, metadata: metadata)) } func test__item_persistable__write_using_connection() { - checkTransactionDidWriteItem(item.write(connection)) + checkTransactionDidWriteItem(item.writeWithMetadata(connection, metadata: metadata)) XCTAssertTrue(connection.didWrite) } func test__item_persistable__write_async_using_connection() { - let expectation = expectationWithDescription("Test: \(#function)") - var result: TypeUnderTest! = nil + let expectation = self.expectation(description: "Test: \(#function)") + var result: YapItem! = nil - item.asyncWrite(connection) { tmp in + item.asyncWriteWithMetadata(connection, metadata: metadata) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItem(result) XCTAssertTrue(connection.didAsyncWrite) } func test__item_persistable__write_using_opertion() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") - let operation = item.writeOperation(connection) + let operation = item.writeWithMetadataOperation(connection, metadata: metadata) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) XCTAssertEqual(TypeUnderTest.decode(writeTransaction.didWriteAtIndexes[0].1)!, item) - XCTAssertEqual(TypeUnderTest.MetadataType.decode(writeTransaction.didWriteAtIndexes[0].2), item.metadata) + XCTAssertEqual(MetadataTypeUnderTest.decode(writeTransaction.didWriteAtIndexes[0].2), metadata) XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_using_transaction() { - checkTransactionDidWriteItems(items.write(writeTransaction)) + checkTransactionDidWriteItems(items.writeWithMetadata(writeTransaction, metadata: metadatas)) } func test__items_persistable__write_using_connection() { - checkTransactionDidWriteItems(items.write(connection)) + checkTransactionDidWriteItems(items.writeWithMetadata(connection, metadata: metadatas)) XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_async_using_connection() { - let expectation = expectationWithDescription("Test: \(#function)") - var result: [TypeUnderTest] = [] - - items.asyncWrite(connection) { tmp in + let expectation = self.expectation(description: "Test: \(#function)") + var result: [YapItem] = [] + + items.asyncWriteWithMetadata(connection, metadata: metadatas) { tmp in result = tmp expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidWriteItems(result) XCTAssertTrue(connection.didAsyncWrite) } func test__items_persistable__write_using_opertion() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") - let operation = items.writeOperation(connection) + let operation = items.writeWithMetadataOperation(connection, metadata: metadatas) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) - XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) + XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sorted(), indexes.map { $0.key }.sorted()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertTrue(connection.didWrite) } @@ -882,25 +881,25 @@ class Persistable_Remove_ValueWithValueMetadataTests: ValueWithValueMetadataTest } func test__connection_async_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() item.asyncRemove(connection) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_operation_remove_item() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingSingle() let operation = item.removeOperation(connection) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItem() XCTAssertTrue(connection.didWrite) } @@ -920,25 +919,25 @@ class Persistable_Remove_ValueWithValueMetadataTests: ValueWithValueMetadataTest } func test__connection_async_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() items.asyncRemove(connection) { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didAsyncWrite) } func test__connection_operation_remove_items() { - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") configureForReadingMultiple() let operation = items.removeOperation(connection) operation.completionBlock = { expectation.fulfill() } operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) checkTransactionDidRemoveItems() XCTAssertTrue(connection.didWrite) } diff --git a/Tests/YapDatabaseExtensionsTests.swift b/Tests/YapDatabaseExtensionsTests.swift index 90dfae7..b14886a 100644 --- a/Tests/YapDatabaseExtensionsTests.swift +++ b/Tests/YapDatabaseExtensionsTests.swift @@ -66,7 +66,7 @@ class YapDatabaseReadTransactionTests: ReadWriteBaseTests { writeItemsToDatabase(db) let keys = db.makeNewConnection().read { $0.keysInCollection(Employee.collection) } XCTAssertNotNil(keys) - XCTAssertEqual(keys.sort(), items.map { $0.key }.sort()) + XCTAssertEqual(keys.sorted(), items.map { $0.key }.sorted()) } func test__read_at_index_returns_nil_with_empty_db() { @@ -101,33 +101,32 @@ class YapDatabaseReadWriteTransactionTests: ReadWriteBaseTests { func test__write_at_index_without_metadata() { let db = YapDB.testDatabase() - db.makeNewConnection().readWriteWithBlock { transaction in + db.makeNewConnection().readWrite { transaction in transaction.writeAtIndex(self.index, object: self.item) } let written = Employee.read(db).atIndex(index) XCTAssertNotNil(written) - XCTAssertNil(written!.metadata) XCTAssertEqual(written!.identifier, item.identifier) } func test__write_at_index_with_metadata() { let db = YapDB.testDatabase() - db.makeNewConnection().readWriteWithBlock { transaction in - transaction.writeAtIndex(self.index, object: self.item, metadata: self.item.metadata) + db.makeNewConnection().readWrite { transaction in + transaction.writeAtIndex(self.index, object: self.item, metadata: self.metadata) } - let written = Employee.read(db).atIndex(index) + let written: YapItem? = Employee.read(db).withMetadataAtIndex(index) XCTAssertNotNil(written) XCTAssertNotNil(written!.metadata) - XCTAssertEqual(written!.identifier, item.identifier) + XCTAssertEqual(written!.value.identifier, item.identifier) } func test__remove_at_indexes() { let db = YapDB.testDatabase() - db.makeNewConnection().write(items) + _ = db.makeNewConnection().write(items) XCTAssertNotNil(Employee.read(db).atIndex(index)) - db.makeNewConnection().readWriteWithBlock { transaction in + db.makeNewConnection().readWrite { transaction in transaction.removeAtIndexes(self.indexes) } @@ -137,23 +136,23 @@ class YapDatabaseReadWriteTransactionTests: ReadWriteBaseTests { class YapDatabaseConnectionTests: ReadWriteBaseTests { - var dispatchQueue: dispatch_queue_t! - var operationQueue: NSOperationQueue! + var dispatchQueue: DispatchQueue! + var operationQueue: OperationQueue! override func setUp() { super.setUp() - dispatchQueue = dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0) - operationQueue = NSOperationQueue() + dispatchQueue = DispatchQueue.global(qos: .default) + operationQueue = OperationQueue() } func test__async_read() { let db = YapDB.testDatabase() - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") - db.makeNewConnection().write(item) + _ = db.makeNewConnection().write(item) XCTAssertNotNil(Employee.read(db).atIndex(index)) - var received: Employee? = .None + var received: Employee? = .none db.newConnection().asyncRead({ transaction -> Employee? in return transaction.readAtIndex(self.index) as? Employee }, queue: dispatchQueue) { (result: Employee?) in @@ -161,25 +160,25 @@ class YapDatabaseConnectionTests: ReadWriteBaseTests { expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) XCTAssertNotNil(received) } func test__async_write() { let db = YapDB.testDatabase() - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") - var written: Employee? = .None + var written: Employee? = .none db.makeNewConnection().asyncWrite({ transaction -> Employee? in - transaction.writeAtIndex(self.index, object: self.item, metadata: self.item.metadata) + transaction.writeAtIndex(self.index, object: self.item, metadata: self.metadata) return self.item }, queue: dispatchQueue) { (result: Employee?) in written = result expectation.fulfill() } - waitForExpectationsWithTimeout(3.0, handler: nil) + waitForExpectations(timeout: 3.0, handler: nil) XCTAssertNotNil(written) XCTAssertNotNil(Employee.read(db).atIndex(index)) @@ -187,7 +186,7 @@ class YapDatabaseConnectionTests: ReadWriteBaseTests { func test__writeBlockOperation() { let db = YapDB.testDatabase() - let expectation = expectationWithDescription("Test: \(#function)") + let expectation = self.expectation(description: "Test: \(#function)") var didExecuteWithTransaction = false let operation = db.makeNewConnection().writeBlockOperation { transaction in @@ -197,8 +196,8 @@ class YapDatabaseConnectionTests: ReadWriteBaseTests { operationQueue.addOperation(operation) - waitForExpectationsWithTimeout(3.0, handler: nil) - XCTAssertTrue(operation.finished) + waitForExpectations(timeout: 3.0, handler: nil) + XCTAssertTrue(operation.isFinished) XCTAssertTrue(didExecuteWithTransaction) } } @@ -206,10 +205,12 @@ class YapDatabaseConnectionTests: ReadWriteBaseTests { class ValueCodingTests: XCTestCase { var item: Product! + var metadata: Product.Metadata! var index: YapDB.Index! var key: String! var items: [Product]! + var metadatas: [Product.Metadata?]! var indexes: [YapDB.Index]! var keys: [String]! @@ -225,9 +226,11 @@ class ValueCodingTests: XCTestCase { override func tearDown() { item = nil + metadata = nil index = nil key = nil items = nil + metadatas = nil indexes = nil keys = nil super.tearDown() @@ -235,32 +238,35 @@ class ValueCodingTests: XCTestCase { func createPersistables() { item = Product( - metadata: Product.Metadata(categoryIdentifier: 1), identifier: "vodka-123", name: "Belvidere", - barcode: .UPCA(1, 2, 3, 4) + barcode: .upca(1, 2, 3, 4) ) + metadata = Product.Metadata(categoryIdentifier: 1) items = [ item, Product( - metadata: Product.Metadata(categoryIdentifier: 2), identifier: "gin-123", name: "Boxer Gin", - barcode: .UPCA(5, 10, 15, 20) + barcode: .upca(5, 10, 15, 20) ), Product( - metadata: Product.Metadata(categoryIdentifier: 3), identifier: "rum-123", name: "Mount Gay Rum", - barcode: .UPCA(12, 24, 39, 48) + barcode: .upca(12, 24, 39, 48) ), Product( - metadata: Product.Metadata(categoryIdentifier: 2), identifier: "gin-234", name: "Monkey 47", - barcode: .UPCA(31, 62, 93, 124) + barcode: .upca(31, 62, 93, 124) ) ] + metadatas = [ + metadata, + Product.Metadata(categoryIdentifier: 2), + Product.Metadata(categoryIdentifier: 3), + Product.Metadata(categoryIdentifier: 2) + ] } func test__index_is_hashable() { @@ -274,11 +280,11 @@ class ValueCodingTests: XCTestCase { func test__index_is_codable() { let db = YapDB.testDatabase() - db.makeNewConnection().readWriteWithBlock { transaction in + db.makeNewConnection().readWrite { transaction in transaction.setObject(self.index.encoded, forKey: "test-index", inCollection: "test-index-collection") } - let unarchived = YapDB.Index.decode(db.makeNewConnection().read { $0.objectForKey("test-index", inCollection: "test-index-collection") }) + let unarchived = YapDB.Index.decode(db.makeNewConnection().read { $0.object(forKey: "test-index", inCollection: "test-index-collection") }) XCTAssertNotNil(unarchived) XCTAssertEqual(unarchived!, index) } diff --git a/YapDatabaseExtensions.podspec b/YapDatabaseExtensions.podspec index c2da953..c0f4f36 100644 --- a/YapDatabaseExtensions.podspec +++ b/YapDatabaseExtensions.podspec @@ -1,37 +1,34 @@ Pod::Spec.new do |s| s.name = "YapDatabaseExtensions" - s.version = "2.6.0" + s.version = "4.0.0" s.summary = "Helpers for using value types with YapDatabase." s.description = <<-DESC - + Defines APIs to conveniently read, write and remove objects and values to or from YapDatabse. See ValueCoding for value type support. DESC - s.homepage = "https://github.com/danthorpe/YapDatabaseExtensions" + s.homepage = "https://github.com/JimRoepcke/YapDatabaseExtensions" s.license = 'MIT' - s.author = { "Daniel Thorpe" => "@danthorpe" } + s.authors = { "Daniel Thorpe" => "@danthorpe", "Jim Roepcke" => "@JimRoepcke" } s.source = { :git => "https://github.com/danthorpe/YapDatabaseExtensions.git", :tag => s.version.to_s } s.module_name = 'YapDatabaseExtensions' s.social_media_url = 'https://twitter.com/danthorpe' s.requires_arc = true s.default_subspec = 'Persitable' - s.ios.deployment_target = '8.0' - s.osx.deployment_target = '10.10' + s.ios.deployment_target = '9.0' + s.osx.deployment_target = '10.11' + + s.dependency 'ValueCoding', '~> 3.0.0' + s.dependency 'YapDatabase', '~> 3.0.0' - s.dependency 'ValueCoding', '~> 1.5' - s.dependency 'YapDatabase', '2.9.2' - - # Ensure the correct version of Swift is used - s.pod_target_xcconfig = { 'SWIFT_VERSION' => '2.3' } - s.subspec 'Core' do |ss| ss.source_files = [ 'Sources/YapDatabaseExtensions.swift', - 'Sources/YapDB.swift' + 'Sources/YapDB.swift' ] end - + s.subspec 'Functional' do |ss| ss.dependency 'YapDatabaseExtensions/Core' ss.source_files = 'Sources/Functional_*.swift' @@ -40,9 +37,8 @@ Pod::Spec.new do |s| s.subspec 'Persitable' do |ss| ss.dependency 'YapDatabaseExtensions/Functional' ss.source_files = [ - 'Sources/Read.swift', + 'Sources/Read.swift', 'Sources/Persistable_*.swift' ] end end - diff --git a/YapDatabaseExtensions.xcodeproj/project.pbxproj b/YapDatabaseExtensions.xcodeproj/project.pbxproj index 00e948c..ac1ecca 100644 --- a/YapDatabaseExtensions.xcodeproj/project.pbxproj +++ b/YapDatabaseExtensions.xcodeproj/project.pbxproj @@ -46,6 +46,14 @@ 65E6DB801DA155700037A1AA /* ValueWithObjectMetadataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65E6DB751DA155700037A1AA /* ValueWithObjectMetadataTests.swift */; }; 65E6DB811DA155700037A1AA /* ValueWithValueMetadataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65E6DB761DA155700037A1AA /* ValueWithValueMetadataTests.swift */; }; 65E6DB821DA155700037A1AA /* YapDatabaseExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65E6DB771DA155700037A1AA /* YapDatabaseExtensionsTests.swift */; }; + BC69409C1FA62CBF00658E7C /* CocoaLumberjackSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC6940981FA62CBE00658E7C /* CocoaLumberjackSwift.framework */; }; + BC69409D1FA62CBF00658E7C /* CocoaLumberjack.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC6940991FA62CBE00658E7C /* CocoaLumberjack.framework */; }; + BC69409E1FA62CBF00658E7C /* ValueCoding.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC69409A1FA62CBE00658E7C /* ValueCoding.framework */; }; + BC69409F1FA62CBF00658E7C /* YapDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC69409B1FA62CBE00658E7C /* YapDatabase.framework */; }; + BCE1D7CC1FA7ECFA00666455 /* CocoaLumberjack.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC6940991FA62CBE00658E7C /* CocoaLumberjack.framework */; }; + BCE1D7CD1FA7ECFD00666455 /* CocoaLumberjackSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC6940981FA62CBE00658E7C /* CocoaLumberjackSwift.framework */; }; + BCE1D7CE1FA7ECFF00666455 /* ValueCoding.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC69409A1FA62CBE00658E7C /* ValueCoding.framework */; }; + BCE1D7CF1FA7ED0100666455 /* YapDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BC69409B1FA62CBE00658E7C /* YapDatabase.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -104,6 +112,10 @@ 65E6DB751DA155700037A1AA /* ValueWithObjectMetadataTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueWithObjectMetadataTests.swift; sourceTree = ""; }; 65E6DB761DA155700037A1AA /* ValueWithValueMetadataTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueWithValueMetadataTests.swift; sourceTree = ""; }; 65E6DB771DA155700037A1AA /* YapDatabaseExtensionsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = YapDatabaseExtensionsTests.swift; sourceTree = ""; }; + BC6940981FA62CBE00658E7C /* CocoaLumberjackSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CocoaLumberjackSwift.framework; path = Carthage/Build/iOS/CocoaLumberjackSwift.framework; sourceTree = ""; }; + BC6940991FA62CBE00658E7C /* CocoaLumberjack.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CocoaLumberjack.framework; path = Carthage/Build/iOS/CocoaLumberjack.framework; sourceTree = ""; }; + BC69409A1FA62CBE00658E7C /* ValueCoding.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ValueCoding.framework; path = Carthage/Build/iOS/ValueCoding.framework; sourceTree = ""; }; + BC69409B1FA62CBE00658E7C /* YapDatabase.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = YapDatabase.framework; path = Carthage/Build/iOS/YapDatabase.framework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -111,6 +123,10 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BC69409C1FA62CBF00658E7C /* CocoaLumberjackSwift.framework in Frameworks */, + BC69409D1FA62CBF00658E7C /* CocoaLumberjack.framework in Frameworks */, + BC69409E1FA62CBF00658E7C /* ValueCoding.framework in Frameworks */, + BC69409F1FA62CBF00658E7C /* YapDatabase.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -118,7 +134,11 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + BCE1D7CC1FA7ECFA00666455 /* CocoaLumberjack.framework in Frameworks */, 656BAE7B1D9A4CCC008279EE /* YapDatabaseExtensions.framework in Frameworks */, + BCE1D7CF1FA7ED0100666455 /* YapDatabase.framework in Frameworks */, + BCE1D7CE1FA7ECFF00666455 /* ValueCoding.framework in Frameworks */, + BCE1D7CD1FA7ECFD00666455 /* CocoaLumberjackSwift.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -132,6 +152,7 @@ 65E6DB6C1DA155700037A1AA /* Tests */, 65D2CBE31D9BF4880088AB4F /* Supporting Files */, 656BAE711D9A4CCC008279EE /* Products */, + BC6940971FA62CBE00658E7C /* Frameworks */, ); sourceTree = ""; }; @@ -208,6 +229,17 @@ path = Tests; sourceTree = ""; }; + BC6940971FA62CBE00658E7C /* Frameworks */ = { + isa = PBXGroup; + children = ( + BC6940991FA62CBE00658E7C /* CocoaLumberjack.framework */, + BC6940981FA62CBE00658E7C /* CocoaLumberjackSwift.framework */, + BC69409A1FA62CBE00658E7C /* ValueCoding.framework */, + BC69409B1FA62CBE00658E7C /* YapDatabase.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -266,15 +298,15 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0810; + LastUpgradeCheck = 0900; TargetAttributes = { 656BAE6F1D9A4CCC008279EE = { CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 0800; + LastSwiftMigration = 0900; }; 656BAE791D9A4CCC008279EE = { CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 0800; + LastSwiftMigration = 0900; }; }; }; @@ -323,7 +355,6 @@ ValueCoding, YapDatabase, CocoaLumberjack, - Reachability, ); name = "Copy Carthage Frameworks"; outputPaths = ( @@ -402,12 +433,18 @@ isa = XCBuildConfiguration; baseConfigurationReference = 65D2CBE81D9BF4880088AB4F /* YapDatabaseExtensions.xcconfig */; buildSettings = { + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -421,6 +458,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; ONLY_ACTIVE_ARCH = YES; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -428,12 +466,18 @@ isa = XCBuildConfiguration; baseConfigurationReference = 65D2CBE81D9BF4880088AB4F /* YapDatabaseExtensions.xcconfig */; buildSettings = { + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -446,6 +490,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; }; name = Release; }; @@ -476,6 +521,10 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); FRAMEWORK_VERSION = A; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; @@ -497,7 +546,8 @@ ONLY_ACTIVE_ARCH = YES; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 2.3; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -530,6 +580,10 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); FRAMEWORK_VERSION = A; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; @@ -543,7 +597,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; SKIP_INSTALL = YES; - SWIFT_VERSION = 2.3; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -573,6 +628,10 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -587,13 +646,14 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks $(FRAMEWORK_SEARCH_PATHS)"; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 2.3; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -621,6 +681,10 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -629,11 +693,12 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks $(FRAMEWORK_SEARCH_PATHS)"; MACOSX_DEPLOYMENT_TARGET = 10.11; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; - SWIFT_VERSION = 2.3; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/YapDatabaseExtensions.xcodeproj/xcshareddata/xcschemes/YapDatabaseExtensions.xcscheme b/YapDatabaseExtensions.xcodeproj/xcshareddata/xcschemes/YapDatabaseExtensions.xcscheme index b51b99f..ede265c 100644 --- a/YapDatabaseExtensions.xcodeproj/xcshareddata/xcschemes/YapDatabaseExtensions.xcscheme +++ b/YapDatabaseExtensions.xcodeproj/xcshareddata/xcschemes/YapDatabaseExtensions.xcscheme @@ -1,6 +1,6 @@