diff --git a/.swift-version b/.swift-version index 9f55b2c..bf77d54 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -3.0 +4.2 diff --git a/.travis.yml b/.travis.yml index 7c8aa57..1f406fb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ language: objective-c # cache: cocoapods podfile: Example/Podfile before_install: + - pod repo update - gem install cocoapods # Since Travis is not always on latest version - pod install --project-directory=Example script: diff --git a/CHANGELOG.md b/CHANGELOG.md index 22dc040..13bf9a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +## 2.0.0 +- interactive transitions are now possible +- renamed FadeIn, ShiftIn, and SlideIn to Fade, Slide & Cover +- the animator is now capable of resizing and realigning already presented viewControllers +- presentations will be configured using new dedicated models for size, alignment etc. +- removed the Jelly Prefix from all classes +- extended example app with interactive examples like slide out menu etc. +- minimum deployment target is iOS 10 now, because of UIViewPropertyAnimator +- new Logo and overall design of Jelly related icons and ui + ## 1.2.5 (2018-10-02) - Swift 4.2 support @@ -45,8 +55,6 @@ Minor Version update: ## 1.0 (2016-11-20) -First Major Release: - - 1.0 Provides SlideIn and FadeIn Transitions - Customization Options like corner-radius, background style included - code cleanup diff --git a/Example/Jelly.xcodeproj/project.pbxproj b/Example/Jelly.xcodeproj/project.pbxproj index d7a045b..20a8412 100644 --- a/Example/Jelly.xcodeproj/project.pbxproj +++ b/Example/Jelly.xcodeproj/project.pbxproj @@ -7,12 +7,14 @@ objects = { /* Begin PBXBuildFile section */ + 150401C1218C46B300BCBF88 /* CustomNavController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 150401C0218C46B300BCBF88 /* CustomNavController.swift */; }; + 1510AAA5218DFDE000468AC3 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1510AAA4218DFDE000468AC3 /* MainViewController.swift */; }; 1545094A1DF6084C0096C822 /* JellyAnimatorSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 154509491DF6084C0096C822 /* JellyAnimatorSpec.swift */; }; - 155B7B851DE1E5820093DF2A /* CustomNavController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 155B7B841DE1E5820093DF2A /* CustomNavController.swift */; }; - 15B1CF981DEB5827003B4107 /* ExampleDataFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15B1CF971DEB5827003B4107 /* ExampleDataFactory.swift */; }; 15B3AD2D1DE1C5CB003FF7B8 /* DismissMeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15B3AD2C1DE1C5CB003FF7B8 /* DismissMeController.swift */; }; + 15DBFCDC21958B0E00E5176E /* RoundedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15DBFCDB21958B0E00E5176E /* RoundedView.swift */; }; + 15DBFCDF219592C800E5176E /* ExampleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15DBFCDE219592C800E5176E /* ExampleType.swift */; }; 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; - 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; + 607FACD81AFB9204008FA782 /* MenuViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* MenuViewController.swift */; }; 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; @@ -31,18 +33,25 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 150401C0218C46B300BCBF88 /* CustomNavController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomNavController.swift; sourceTree = ""; }; + 1510AAA4218DFDE000468AC3 /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; 152009C91E26C6EA00537CD5 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = CHANGELOG.md; path = ../CHANGELOG.md; sourceTree = ""; }; 154175841E337E4F00503A99 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 154509481DF6084B0096C822 /* Jelly_Tests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Jelly_Tests-Bridging-Header.h"; sourceTree = ""; }; 154509491DF6084C0096C822 /* JellyAnimatorSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JellyAnimatorSpec.swift; sourceTree = ""; }; - 155B7B841DE1E5820093DF2A /* CustomNavController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomNavController.swift; sourceTree = ""; }; - 15B1CF971DEB5827003B4107 /* ExampleDataFactory.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExampleDataFactory.swift; sourceTree = ""; }; + 158575E121949581007B2E4B /* .travis.yml */ = {isa = PBXFileReference; lastKnownFileType = text; name = .travis.yml; path = ../.travis.yml; sourceTree = ""; }; + 158575E221949581007B2E4B /* .swift-version */ = {isa = PBXFileReference; lastKnownFileType = text; name = ".swift-version"; path = "../.swift-version"; sourceTree = ""; }; + 158575E321949581007B2E4B /* .git */ = {isa = PBXFileReference; lastKnownFileType = folder; name = .git; path = ../.git; sourceTree = ""; }; + 158575E421949581007B2E4B /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; name = .gitignore; path = ../.gitignore; sourceTree = ""; }; 15B1CF991DEB7299003B4107 /* Github */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Github; path = ../Github; sourceTree = ""; }; 15B3AD2C1DE1C5CB003FF7B8 /* DismissMeController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DismissMeController.swift; sourceTree = ""; }; + 15DBFCDB21958B0E00E5176E /* RoundedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoundedView.swift; sourceTree = ""; }; + 15DBFCDE219592C800E5176E /* ExampleType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleType.swift; sourceTree = ""; }; + 15DBFCE02195C2B700E5176E /* Future-Features.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = "Future-Features.md"; path = "../Future-Features.md"; sourceTree = ""; }; 607FACD01AFB9204008FA782 /* Jelly_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Jelly_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 607FACD71AFB9204008FA782 /* MenuViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuViewController.swift; sourceTree = ""; }; 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; @@ -79,6 +88,46 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 150401BC218C3E3800BCBF88 /* Resources */ = { + isa = PBXGroup; + children = ( + 607FACD91AFB9204008FA782 /* Main.storyboard */, + 607FACDC1AFB9204008FA782 /* Images.xcassets */, + 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, + ); + name = Resources; + sourceTree = ""; + }; + 150401BD218C3E4400BCBF88 /* Sources */ = { + isa = PBXGroup; + children = ( + 15DBFCDD21958FEC00E5176E /* Enums */, + 15DBFCDA21958AF400E5176E /* Views */, + 607FACD51AFB9204008FA782 /* AppDelegate.swift */, + 607FACD71AFB9204008FA782 /* MenuViewController.swift */, + 15B3AD2C1DE1C5CB003FF7B8 /* DismissMeController.swift */, + 150401C0218C46B300BCBF88 /* CustomNavController.swift */, + 1510AAA4218DFDE000468AC3 /* MainViewController.swift */, + ); + name = Sources; + sourceTree = ""; + }; + 15DBFCDA21958AF400E5176E /* Views */ = { + isa = PBXGroup; + children = ( + 15DBFCDB21958B0E00E5176E /* RoundedView.swift */, + ); + name = Views; + sourceTree = ""; + }; + 15DBFCDD21958FEC00E5176E /* Enums */ = { + isa = PBXGroup; + children = ( + 15DBFCDE219592C800E5176E /* ExampleType.swift */, + ); + name = Enums; + sourceTree = ""; + }; 39CE1241BD68C0D6255E3163 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -91,15 +140,20 @@ 607FACC71AFB9204008FA782 = { isa = PBXGroup; children = ( - 154175841E337E4F00503A99 /* README.md */, - 152009C91E26C6EA00537CD5 /* CHANGELOG.md */, - 15B1CF991DEB7299003B4107 /* Github */, - 607FACF51AFB993E008FA782 /* Podspec Metadata */, 607FACD21AFB9204008FA782 /* Example for Jelly */, 607FACE81AFB9204008FA782 /* Tests */, 607FACD11AFB9204008FA782 /* Products */, A30E2D426D45D2832CB99640 /* Pods */, 39CE1241BD68C0D6255E3163 /* Frameworks */, + 158575E321949581007B2E4B /* .git */, + 15B1CF991DEB7299003B4107 /* Github */, + 607FACF51AFB993E008FA782 /* Podspec Metadata */, + 158575E421949581007B2E4B /* .gitignore */, + 158575E221949581007B2E4B /* .swift-version */, + 158575E121949581007B2E4B /* .travis.yml */, + 154175841E337E4F00503A99 /* README.md */, + 152009C91E26C6EA00537CD5 /* CHANGELOG.md */, + 15DBFCE02195C2B700E5176E /* Future-Features.md */, ); sourceTree = ""; }; @@ -115,14 +169,8 @@ 607FACD21AFB9204008FA782 /* Example for Jelly */ = { isa = PBXGroup; children = ( - 607FACD51AFB9204008FA782 /* AppDelegate.swift */, - 607FACD71AFB9204008FA782 /* ViewController.swift */, - 15B1CF971DEB5827003B4107 /* ExampleDataFactory.swift */, - 15B3AD2C1DE1C5CB003FF7B8 /* DismissMeController.swift */, - 155B7B841DE1E5820093DF2A /* CustomNavController.swift */, - 607FACD91AFB9204008FA782 /* Main.storyboard */, - 607FACDC1AFB9204008FA782 /* Images.xcassets */, - 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, + 150401BD218C3E4400BCBF88 /* Sources */, + 150401BC218C3E3800BCBF88 /* Resources */, 607FACD31AFB9204008FA782 /* Supporting Files */, ); name = "Example for Jelly"; @@ -227,7 +275,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0830; + LastUpgradeCheck = 1000; ORGANIZATIONNAME = CocoaPods; TargetAttributes = { 607FACCF1AFB9204008FA782 = { @@ -290,10 +338,12 @@ inputPaths = ( "${SRCROOT}/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example-frameworks.sh", "${BUILT_PRODUCTS_DIR}/Jelly/Jelly.framework", + "${BUILT_PRODUCTS_DIR}/TouchVisualizer/TouchVisualizer.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Jelly.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TouchVisualizer.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -393,11 +443,13 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 155B7B851DE1E5820093DF2A /* CustomNavController.swift in Sources */, + 15DBFCDF219592C800E5176E /* ExampleType.swift in Sources */, 15B3AD2D1DE1C5CB003FF7B8 /* DismissMeController.swift in Sources */, - 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, + 607FACD81AFB9204008FA782 /* MenuViewController.swift in Sources */, + 1510AAA5218DFDE000468AC3 /* MainViewController.swift in Sources */, + 150401C1218C46B300BCBF88 /* CustomNavController.swift in Sources */, 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, - 15B1CF981DEB5827003B4107 /* ExampleDataFactory.swift in Sources */, + 15DBFCDC21958B0E00E5176E /* RoundedView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -447,14 +499,22 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + 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; @@ -494,14 +554,22 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + 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; @@ -533,10 +601,10 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = JY9STJR6M4; INFOPLIST_FILE = Jelly/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MODULE_NAME = ExampleApp; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.demo.Jelly; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 4.2; }; @@ -549,10 +617,10 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = JY9STJR6M4; INFOPLIST_FILE = Jelly/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MODULE_NAME = ExampleApp; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.demo.Jelly; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 4.2; }; @@ -573,7 +641,7 @@ "$(inherited)", ); INFOPLIST_FILE = Tests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -595,7 +663,7 @@ "$(inherited)", ); INFOPLIST_FILE = Tests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/Example/Jelly.xcodeproj/xcshareddata/xcschemes/Jelly-Example.xcscheme b/Example/Jelly.xcodeproj/xcshareddata/xcschemes/Jelly-Example.xcscheme index ce18ca3..3f952cb 100644 --- a/Example/Jelly.xcodeproj/xcshareddata/xcschemes/Jelly-Example.xcscheme +++ b/Example/Jelly.xcodeproj/xcshareddata/xcschemes/Jelly-Example.xcscheme @@ -1,6 +1,6 @@ + + + + BuildSystemType + Original + + diff --git a/Example/Jelly/Base.lproj/LaunchScreen.xib b/Example/Jelly/Base.lproj/LaunchScreen.xib index 0d8bf99..1b8740d 100644 --- a/Example/Jelly/Base.lproj/LaunchScreen.xib +++ b/Example/Jelly/Base.lproj/LaunchScreen.xib @@ -1,11 +1,11 @@ - + - + @@ -15,34 +15,23 @@ - - - - - - + - + - - - - - + + + + - + - + diff --git a/Example/Jelly/Base.lproj/Main.storyboard b/Example/Jelly/Base.lproj/Main.storyboard index 461b6f8..ddd5a36 100644 --- a/Example/Jelly/Base.lproj/Main.storyboard +++ b/Example/Jelly/Base.lproj/Main.storyboard @@ -1,78 +1,14 @@ - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -81,55 +17,28 @@ - + - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - + + + + @@ -137,7 +46,7 @@ - + @@ -151,17 +60,17 @@ - - + @@ -173,31 +82,534 @@ - + - + - + - + - + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Jelly/CustomNavController.swift b/Example/Jelly/CustomNavController.swift index 1e53282..a37ce8c 100644 --- a/Example/Jelly/CustomNavController.swift +++ b/Example/Jelly/CustomNavController.swift @@ -1,27 +1,19 @@ -// -// CustomNavController.swift -// Jelly -// -// Created by Sebastian Boldt on 20.11.16. -// Copyright © 2016 CocoaPods. All rights reserved. -// - import UIKit +import TouchVisualizer -class CustomNavController: UINavigationController { - - override func viewDidLoad() { - super.viewDidLoad() - - // Do any additional setup after loading the view. - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. +class CustomNav: UINavigationController { + override var prefersStatusBarHidden: Bool { + return true } - override var preferredStatusBarStyle: UIStatusBarStyle { - return .lightContent + override func viewDidLoad() { + super.viewDidLoad() + modalPresentationCapturesStatusBarAppearance = true + + var config = Configuration() + config.color = .darkGray + config.showsTouchRadius = true + config.defaultSize = CGSize(width: 100, height: 100) + Visualizer.start(config) } } diff --git a/Example/Jelly/DismissMeController.swift b/Example/Jelly/DismissMeController.swift index c052080..e66253c 100644 --- a/Example/Jelly/DismissMeController.swift +++ b/Example/Jelly/DismissMeController.swift @@ -5,18 +5,18 @@ import UIKit class DismissMeController: UIViewController { - + var interactionAction: (() -> ())? override func viewDidLoad() { super.viewDidLoad() + modalPresentationCapturesStatusBarAppearance = true } - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - @IBAction func dismissMe(_ sender: Any) { - self.dismiss(animated: true, completion: nil) + @IBAction func actionButtonPressed(_ sender: Any) { + if let interactionAction = interactionAction { + interactionAction() + } else { + self.dismiss(animated: true, completion: nil) + } } override var prefersStatusBarHidden: Bool { diff --git a/Example/Jelly/ExampleDataFactory.swift b/Example/Jelly/ExampleDataFactory.swift deleted file mode 100644 index 4d73127..0000000 --- a/Example/Jelly/ExampleDataFactory.swift +++ /dev/null @@ -1,125 +0,0 @@ -// -// ExampleDataProvider.swift -// Jelly -// -// Created by Sebastian Boldt on 27.11.16. -// Copyright © 2016 CocoaPods. All rights reserved. -// - -import Foundation -import Jelly - -struct DataObject { - let presentation : JellyPresentation - let titleDescription : String - let detailDescription : String -} - -struct ExampleDataProvider { - var data : [DataObject] = { - - /// Default Fade in with custom size - var defaultFadeInPresentation = JellyFadeInPresentation(widthForViewController: .halfscreen, - heightForViewController: .halfscreen) - defaultFadeInPresentation.isTapBackgroundToDismissEnabled = false - let defaultFadeInObject = DataObject(presentation: defaultFadeInPresentation, titleDescription: "Default Fade in Animation", detailDescription: "default values, disabled tap to dismiss") - - /// Default slide in with custom size - let defaultSlideInPresentation = JellySlideInPresentation(widthForViewController: .halfscreen, - heightForViewController: .halfscreen) - - let defaultSlideInObject = DataObject(presentation: defaultSlideInPresentation , - titleDescription: "Default Slide in Animation", - detailDescription: "Default slide in wth .halfscreen width and height") - - - /// Fade in with blur and custom size - let customBlurFadeInPresentation = JellyFadeInPresentation(backgroundStyle: .blur(effectStyle: .light), - widthForViewController: .halfscreen, - heightForViewController: .halfscreen) - - let customBlurFadeInObject = DataObject(presentation: customBlurFadeInPresentation , - titleDescription: "Blurred Fade in", - detailDescription: "Fade in Viewcontroller blurred background .light") - - /// Custom slide in presentation with blur - let customSlideInPresentation = JellySlideInPresentation(backgroundStyle: .blur(effectStyle: .dark), - widthForViewController: .halfscreen, - heightForViewController: .halfscreen) - - let customBlurSlideInObject = DataObject(presentation: customSlideInPresentation, - titleDescription: "Blurred Slide in", - detailDescription: "Slide in Viewcontroller with blurred background .dark") - - /// Corner Radius and Jellyness - let customCornerSlideInPresentation = JellySlideInPresentation(cornerRadius: 15, - backgroundStyle: .blur(effectStyle: .dark), - jellyness: .jellier, - duration: .medium, - directionShow: .left, - directionDismiss: .right, - widthForViewController: .halfscreen, - heightForViewController: .halfscreen) - - let customCornerDirectionSlideInObject = DataObject(presentation:customCornerSlideInPresentation , - titleDescription: "Blurred Slide in Custom Direction", - detailDescription: "Slide in Viewcontroller with custom corner radius, directions and jelliness") - - // Custom SlideOver - let slideOverPresentation = JellySlideInPresentation(dismissCurve: .linear, - presentationCurve: .linear, - cornerRadius: 0, - backgroundStyle: .dimmed(alpha: 0.5), - jellyness: .none, - duration: .normal, - directionShow: .left, - directionDismiss: .left, - widthForViewController: .halfscreen, - heightForViewController: .fullscreen, - horizontalAlignment: .left, - verticalAlignment: .top) - - let slideOver = DataObject(presentation: slideOverPresentation, - titleDescription: "SlideOver", - detailDescription: "halfscreen left side slide in menu") - - // Custom Alert - let alertPresentation = JellySlideInPresentation(dismissCurve: .linear, - presentationCurve: .linear, - cornerRadius: 15, - backgroundStyle: .blur(effectStyle: .light), - jellyness: .jellier, - duration: .normal, - directionShow: .top, - directionDismiss: .top, - widthForViewController: .fullscreen, // Lets use 10000 to see if marginGuards kick in - heightForViewController: .custom(value:200) , - horizontalAlignment: .center, - verticalAlignment: .top, - marginGuards: UIEdgeInsets(top: 30, left: 10, bottom: 30, right: 10)) - - let alertObject = DataObject(presentation: alertPresentation, - titleDescription: "Custom Notification", - detailDescription: "custom alert that comes from the top with blurred transition background") - - // ShiftInPresentation - - var shiftInPresentation = JellyShiftInPresentation() - shiftInPresentation.direction = .right - shiftInPresentation.size = .custom(value: 300) - - let shiftInObject = DataObject(presentation: shiftInPresentation, titleDescription: "Shift in Dimmed", detailDescription: "dimmed, right") - - var shiftInBlurred = JellyShiftInPresentation() - shiftInBlurred.direction = .bottom - shiftInBlurred.backgroundStyle = .blur(effectStyle: .light) - shiftInBlurred.size = .custom(value: 300) - - let shiftInBlurredObject = DataObject(presentation: shiftInBlurred, titleDescription: "Shift in Blurred", detailDescription: "blurred, bottom") - - - let data = [defaultFadeInObject,defaultSlideInObject,customBlurFadeInObject,customBlurSlideInObject,customCornerDirectionSlideInObject,slideOver,alertObject, shiftInObject,shiftInBlurredObject] - - return data - }() -} diff --git a/Example/Jelly/ExampleType.swift b/Example/Jelly/ExampleType.swift new file mode 100644 index 0000000..54208e4 --- /dev/null +++ b/Example/Jelly/ExampleType.swift @@ -0,0 +1,26 @@ +import Foundation + +enum ExampleType { + case interactive(type: InteractiveType) + case nonInteractive(type: NotInteractiveType) + case liveUpdate(type: LiveUpdateType) +} + +enum InteractiveType { + case slideMenuFromRightEdge + case coverMenuFromRightCanvas + case notificationFromTopCanvas + case multipleDirectionsCoverCanvas +} + +enum NotInteractiveType { + case coverFromBottom + case slideFromRight +} + +enum LiveUpdateType { + case updateSize + case updateAlignment + case updateMarginGuards + case updateCornerRadius +} diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Contents.json b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Contents.json index ecf55ce..7130009 100644 --- a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Contents.json @@ -145,8 +145,9 @@ "scale" : "2x" }, { - "idiom" : "ios-marketing", "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "ios-marketing.png", "scale" : "1x" } ], diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-40.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-40.png index b6c243a..c2f714b 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-40.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-40.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png index d3e8f2f..6a066b0 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png index d49ac04..c3a45be 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png index d49ac04..c3a45be 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png index 73d570d..1a33d36 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-72.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-72.png index 06d02e1..b8b4f22 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-72.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-72.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png index e86fe46..d570f80 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-76.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-76.png index 7faf379..c6cab60 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-76.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-76.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png index 898e9f3..8c632b0 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png index 769678d..970c673 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png index eaf09fa..d792326 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png index 9cff786..cc800d3 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small.png index fa06204..f57c082 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png index 76a970c..c0e1361 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png index 0a156af..6af4502 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon.png index 05d33e4..2f9c893 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon@2x.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon@2x.png index 7eaeca1..5c280c2 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon@2x.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/Icon@2x.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon@2x.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon@2x.png index b6c243a..c2f714b 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon@2x.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon@2x.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon@3x.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon@3x.png index ed6a519..fe44deb 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon@3x.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon@3x.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon~ipad.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon~ipad.png index df6ca4a..b3a984a 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon~ipad.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon~ipad.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon~ipad@2x.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon~ipad@2x.png index b6c243a..c2f714b 100644 Binary files a/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon~ipad@2x.png and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/NotificationIcon~ipad@2x.png differ diff --git a/Example/Jelly/Images.xcassets/AppIcon.appiconset/ios-marketing.png b/Example/Jelly/Images.xcassets/AppIcon.appiconset/ios-marketing.png new file mode 100644 index 0000000..286ffb8 Binary files /dev/null and b/Example/Jelly/Images.xcassets/AppIcon.appiconset/ios-marketing.png differ diff --git a/Example/Jelly/Images.xcassets/Jelly-Logo.imageset/Contents.json b/Example/Jelly/Images.xcassets/Jelly-Logo.imageset/Contents.json index 4d1300c..a5754f8 100644 --- a/Example/Jelly/Images.xcassets/Jelly-Logo.imageset/Contents.json +++ b/Example/Jelly/Images.xcassets/Jelly-Logo.imageset/Contents.json @@ -2,7 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "Jelly-Logo.png", + "filename" : "Jellyfish.png", "scale" : "1x" }, { diff --git a/Example/Jelly/Images.xcassets/Jelly-Logo.imageset/Jelly-Logo.png b/Example/Jelly/Images.xcassets/Jelly-Logo.imageset/Jelly-Logo.png deleted file mode 100644 index 4e39b57..0000000 Binary files a/Example/Jelly/Images.xcassets/Jelly-Logo.imageset/Jelly-Logo.png and /dev/null differ diff --git a/Example/Jelly/Images.xcassets/Jelly-Logo.imageset/Jellyfish.png b/Example/Jelly/Images.xcassets/Jelly-Logo.imageset/Jellyfish.png new file mode 100644 index 0000000..f8532b2 Binary files /dev/null and b/Example/Jelly/Images.xcassets/Jelly-Logo.imageset/Jellyfish.png differ diff --git a/Example/Jelly/Info.plist b/Example/Jelly/Info.plist index de21faa..390fee9 100644 --- a/Example/Jelly/Info.plist +++ b/Example/Jelly/Info.plist @@ -2,10 +2,10 @@ - UIViewControllerBasedStatusBarAppearance - CFBundleDevelopmentRegion en + CFBundleDisplayName + Jelly CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -32,10 +32,15 @@ armv7 + UIRequiresFullScreen + + UIStatusBarHidden + UISupportedInterfaceOrientations UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft + UIViewControllerBasedStatusBarAppearance + diff --git a/Example/Jelly/MainViewController.swift b/Example/Jelly/MainViewController.swift new file mode 100644 index 0000000..8d3f35b --- /dev/null +++ b/Example/Jelly/MainViewController.swift @@ -0,0 +1,200 @@ +import UIKit +import Jelly + +class MainViewController: UIViewController { + var animator: Animator? + var type: ExampleType? + var showButtonLogic: (() -> Void)? + + @IBAction func didPressShowButton(_ sender: Any) { + showButtonLogic?() + } + + override func viewDidLoad() { + super.viewDidLoad() + navigationController?.isNavigationBarHidden = true + modalPresentationCapturesStatusBarAppearance = true + setup() + } + + override var prefersStatusBarHidden: Bool { + return true + } + + func setup() { + guard let type = type else { + return + } + + switch type { + case .nonInteractive(let nonInteractiveType): + switch nonInteractiveType { + case .coverFromBottom: + showButtonLogic = { + let storyboard = UIStoryboard.init(name: "Main", bundle: nil) + let viewControllerToPresent = storyboard.instantiateViewController(withIdentifier: "PresentMe") + let marginGuards = UIEdgeInsets(top: 0, left: 16, bottom: 32, right: 16) + let uiConfiguration = PresentationUIConfiguration(cornerRadius: 10, backgroundStyle: .dimmed(alpha: 0.5), isTapBackgroundToDismissEnabled: true, corners: [.layerMaxXMaxYCorner,.layerMaxXMinYCorner,.layerMinXMaxYCorner,.layerMinXMinYCorner]) + let size = PresentationSize(width: .fullscreen, height: .halfscreen) + let alignment = PresentationAlignment(vertical: .bottom, horizontal: .center) + let presentation = CoverPresentation(directionShow: .bottom, directionDismiss: .bottom, uiConfiguration: uiConfiguration, size: size, alignment: alignment, marginGuards: marginGuards) + let animator = Animator(presentation: presentation) + animator.prepare(presentedViewController: viewControllerToPresent) + self.animator = animator + self.present(viewControllerToPresent, animated: true, completion: nil) + } + case .slideFromRight: + showButtonLogic = { + let storyboard = UIStoryboard.init(name: "Main", bundle: nil) + let viewControllerToPresent = storyboard.instantiateViewController(withIdentifier: "PresentMe") + let presentation = SlidePresentation(direction: .right, size: .halfscreen) + let animator = Animator(presentation: presentation) + animator.prepare(presentedViewController: viewControllerToPresent) + self.animator = animator + self.present(viewControllerToPresent, animated: true, completion: nil) + } + } + case .interactive(let interactiveType): + switch interactiveType { + case .coverMenuFromRightCanvas:() + let storyboard = UIStoryboard.init(name: "Main", bundle: nil) + let viewControllerToPresent = storyboard.instantiateViewController(withIdentifier: "PresentMe") + let interactionConfiguration = InteractionConfiguration(presentingViewController: self, completionThreshold: 0.5, dragMode: .canvas) + let uiConfiguration = PresentationUIConfiguration(backgroundStyle: .blurred(effectStyle: .light)) + let size = PresentationSize(width: .halfscreen, height: .fullscreen) + let alignment = PresentationAlignment(vertical: .center, horizontal: .left) + let presentation = CoverPresentation(directionShow: .left, directionDismiss: .left, uiConfiguration: uiConfiguration, size: size, alignment: alignment, interactionConfiguration: interactionConfiguration) + let animator = Animator(presentation: presentation) + animator.prepare(presentedViewController: viewControllerToPresent) + self.animator = animator + + showButtonLogic = { + self.present(viewControllerToPresent, animated: true, completion: nil) + } + case .slideMenuFromRightEdge: + let storyboard = UIStoryboard.init(name: "Main", bundle: nil) + let viewControllerToPresent = storyboard.instantiateViewController(withIdentifier: "PresentMe") + let interactionConfiguration = InteractionConfiguration(presentingViewController: self, completionThreshold: 0.5, dragMode: .edge) + let uiConfiguration = PresentationUIConfiguration(backgroundStyle: .dimmed(alpha: 0.5)) + let presentation = SlidePresentation(uiConfiguration: uiConfiguration, direction: .right, size: .fullscreen, interactionConfiguration: interactionConfiguration) + let animator = Animator(presentation: presentation) + animator.prepare(presentedViewController: viewControllerToPresent) + self.animator = animator + + showButtonLogic = { + self.present(viewControllerToPresent, animated: true, completion: nil) + } + case .multipleDirectionsCoverCanvas: + let storyboard = UIStoryboard.init(name: "Main", bundle: nil) + let viewControllerToPresent = storyboard.instantiateViewController(withIdentifier: "PresentMe") + let interactionConfiguration = InteractionConfiguration(presentingViewController: self, completionThreshold: 0.5, dragMode: .canvas) + let uiConfiguration = PresentationUIConfiguration(cornerRadius: 10, backgroundStyle: .blurred(effectStyle: .light)) + let size = PresentationSize(width: .fullscreen, height: .halfscreen) + let marginGuards = UIEdgeInsets(top: 50, left: 16, bottom: 50, right: 16) + let alignment = PresentationAlignment(vertical: .center, horizontal: .center) + let presentation = CoverPresentation(directionShow: .left, directionDismiss: .right, uiConfiguration: uiConfiguration, size: size, alignment: alignment, marginGuards: marginGuards, interactionConfiguration: interactionConfiguration) + let animator = Animator(presentation: presentation) + animator.prepare(presentedViewController: viewControllerToPresent) + self.animator = animator + + showButtonLogic = { + self.present(viewControllerToPresent, animated: true, completion: nil) + } + case .notificationFromTopCanvas: + let storyboard = UIStoryboard.init(name: "Main", bundle: nil) + let viewControllerToPresent = storyboard.instantiateViewController(withIdentifier: "PresentMe") + let interactionConfiguration = InteractionConfiguration(presentingViewController: self, completionThreshold: 0.5, dragMode: .canvas) + let uiConfiguration = PresentationUIConfiguration(cornerRadius: 10, backgroundStyle: .dimmed(alpha: 0.5)) + let size = PresentationSize(width: .fullscreen, height: .custom(value: 200)) + let marginGuards = UIEdgeInsets(top: 50, left: 16, bottom: 8, right: 16) + let alignment = PresentationAlignment(vertical: .top, horizontal: .center) + let presentation = CoverPresentation(directionShow: .top, directionDismiss: .top, uiConfiguration: uiConfiguration, size: size, alignment: alignment, marginGuards: marginGuards, interactionConfiguration: interactionConfiguration) + let animator = Animator(presentation: presentation) + animator.prepare(presentedViewController: viewControllerToPresent) + self.animator = animator + + showButtonLogic = { + self.present(viewControllerToPresent, animated: true, completion: nil) + } + + } + case .liveUpdate(let liveUpdateType): + switch liveUpdateType { + case .updateAlignment:() + let storyboard = UIStoryboard.init(name: "Main", bundle: nil) + let viewControllerToPresent = storyboard.instantiateViewController(withIdentifier: "PresentMe") as! DismissMeController + let alignment = PresentationAlignment(vertical: .top, horizontal: .center) + let uiConfig = PresentationUIConfiguration(cornerRadius: 10) + let marginGuards = UIEdgeInsets(top: 50, left: 16, bottom: 50, right: 16) + let presentation = CoverPresentation(directionShow: .top, directionDismiss: .top, uiConfiguration: uiConfig, size: PresentationSize(width: .fullscreen, height: .halfscreen), alignment: alignment, marginGuards: marginGuards) + let animator = Animator(presentation: presentation) + animator.prepare(presentedViewController: viewControllerToPresent) + self.animator = animator + + showButtonLogic = { [weak self] in + self?.present(viewControllerToPresent, animated: true, completion: nil) + } + + viewControllerToPresent.interactionAction = { [weak self] in + try! self?.animator?.updateVerticalAlignment(alignment: .bottom, duration: .medium) + } + case .updateSize:() + let storyboard = UIStoryboard.init(name: "Main", bundle: nil) + let viewControllerToPresent = storyboard.instantiateViewController(withIdentifier: "PresentMe") as! DismissMeController + let alignment = PresentationAlignment(vertical: .top, horizontal: .center) + let uiConfig = PresentationUIConfiguration(cornerRadius: 10) + let marginGuards = UIEdgeInsets(top: 50, left: 16, bottom: 50, right: 16) + let presentation = CoverPresentation(directionShow: .top, directionDismiss: .top, uiConfiguration: uiConfig, size: PresentationSize(width: .fullscreen, height: .halfscreen), alignment: alignment, marginGuards: marginGuards) + let animator = Animator(presentation: presentation) + animator.prepare(presentedViewController: viewControllerToPresent) + self.animator = animator + + showButtonLogic = { [weak self] in + self?.present(viewControllerToPresent, animated: true, completion: nil) + } + + viewControllerToPresent.interactionAction = { [weak self] in + let newSize = PresentationSize(width: .fullscreen, height: .fullscreen) + try! self?.animator?.updateSize(presentationSize: newSize, duration: .medium) + } + case .updateCornerRadius:() + let storyboard = UIStoryboard.init(name: "Main", bundle: nil) + let viewControllerToPresent = storyboard.instantiateViewController(withIdentifier: "PresentMe") as! DismissMeController + let alignment = PresentationAlignment(vertical: .top, horizontal: .center) + let uiConfig = PresentationUIConfiguration(cornerRadius: 10) + let marginGuards = UIEdgeInsets(top: 50, left: 16, bottom: 50, right: 16) + let presentation = CoverPresentation(directionShow: .top, directionDismiss: .top, uiConfiguration: uiConfig, size: PresentationSize(width: .fullscreen, height: .halfscreen), alignment: alignment, marginGuards: marginGuards) + let animator = Animator(presentation: presentation) + animator.prepare(presentedViewController: viewControllerToPresent) + self.animator = animator + + showButtonLogic = { [weak self] in + self?.present(viewControllerToPresent, animated: true, completion: nil) + } + + viewControllerToPresent.interactionAction = { [weak self] in + self?.animator?.updateCorners(radius: 30, corners: [.layerMinXMinYCorner, .layerMaxXMinYCorner], duration: .medium) + } + case .updateMarginGuards: + let storyboard = UIStoryboard.init(name: "Main", bundle: nil) + let viewControllerToPresent = storyboard.instantiateViewController(withIdentifier: "PresentMe") as! DismissMeController + let alignment = PresentationAlignment(vertical: .top, horizontal: .center) + let uiConfig = PresentationUIConfiguration(cornerRadius: 10) + let marginGuards = UIEdgeInsets(top: 100, left: 32, bottom: 50, right: 32) + let presentation = CoverPresentation(directionShow: .top, directionDismiss: .top, uiConfiguration: uiConfig, size: PresentationSize(width: .fullscreen, height: .halfscreen), alignment: alignment, marginGuards: marginGuards) + let animator = Animator(presentation: presentation) + animator.prepare(presentedViewController: viewControllerToPresent) + self.animator = animator + + showButtonLogic = { [weak self] in + self?.present(viewControllerToPresent, animated: true, completion: nil) + } + + viewControllerToPresent.interactionAction = { [weak self] in + let newGuards = UIEdgeInsets(top: 70, left: 8, bottom: 0, right: 8) + try! self?.animator?.updateMarginGuards(marginGuards: newGuards, duration: .medium) + } + } + } + } +} diff --git a/Example/Jelly/MenuViewController.swift b/Example/Jelly/MenuViewController.swift new file mode 100644 index 0000000..744b11c --- /dev/null +++ b/Example/Jelly/MenuViewController.swift @@ -0,0 +1,59 @@ +// +// ViewController.swift +// Jelly-Animators +// +// Created by Sebastian Boldt on 11/16/2016. +// Copyright (c) 2016 Sebastian Boldt. All rights reserved. +// +import UIKit +import Jelly + +class MenuViewController: UITableViewController { + override func viewDidLoad() { + super.viewDidLoad() + modalPresentationCapturesStatusBarAppearance = true + } + + override var prefersStatusBarHidden: Bool { + return true + } + + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + guard let mainVC = segue.destination as? MainViewController else { + return + } + + guard let identifier = segue.identifier else { + return + } + + switch identifier { + // Not Interactive + case "NotInteractive-coverFromLeft": + mainVC.type = ExampleType.nonInteractive(type: .coverFromBottom) + case "NotInteractive-slideFromLeft": + mainVC.type = ExampleType.nonInteractive(type: .slideFromRight) + + // Interactive + case "Interactive-CoverMenuFromRightCanvas": + mainVC.type = ExampleType.interactive(type: .coverMenuFromRightCanvas) + case "Interactive-SlideMenuFromRightEdge": + mainVC.type = ExampleType.interactive(type: .slideMenuFromRightEdge) + case "Interactive-NotificationFromTopCanvas": + mainVC.type = ExampleType.interactive(type: .notificationFromTopCanvas) + case "Interactive-MultipleDirectionCoverCanvas": + mainVC.type = ExampleType.interactive(type: .multipleDirectionsCoverCanvas) + + // Live Update + case "LiveUpdate-Size": + mainVC.type = ExampleType.liveUpdate(type: .updateSize) + case "LiveUpdate-Alignments": + mainVC.type = ExampleType.liveUpdate(type: .updateAlignment) + case "LiveUpdate-MarginGuards": + mainVC.type = ExampleType.liveUpdate(type: .updateMarginGuards) + case "LiveUpdate-CornerRadius": + mainVC.type = ExampleType.liveUpdate(type: .updateCornerRadius) + default:() + } + } +} diff --git a/Example/Jelly/RoundedView.swift b/Example/Jelly/RoundedView.swift new file mode 100644 index 0000000..30fab0a --- /dev/null +++ b/Example/Jelly/RoundedView.swift @@ -0,0 +1,9 @@ +import UIKit + +class RoundedView: UIView { + override func layoutSubviews() { + super.layoutSubviews() + layer.cornerRadius = frame.size.width / 2 + layer.masksToBounds = true + } +} diff --git a/Example/Jelly/ViewController.swift b/Example/Jelly/ViewController.swift deleted file mode 100644 index 9e0f24f..0000000 --- a/Example/Jelly/ViewController.swift +++ /dev/null @@ -1,60 +0,0 @@ -// -// ViewController.swift -// Jelly-Animators -// -// Created by Sebastian Boldt on 11/16/2016. -// Copyright (c) 2016 Sebastian Boldt. All rights reserved. -// -import UIKit -import Jelly - -class ViewController: UIViewController { - - fileprivate lazy var model : [DataObject] = { - return ExampleDataProvider().data - }() - - @IBOutlet var presentMeButton: UIButton! - @IBOutlet var tableView: UITableView! - - /// We need to keep a strong reference to the Animator because the transitiong delegate is weak - fileprivate var jellyAnimator: JellyAnimator? - - fileprivate func createVC() -> UIViewController? { - return self.storyboard?.instantiateViewController(withIdentifier: "PresentMe") - } - - override var preferredStatusBarStyle: UIStatusBarStyle { - return .lightContent - } -} - -extension ViewController: UITableViewDelegate { - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - let presentation = self.model[indexPath.row].presentation - if let viewController = self.createVC() { - self.jellyAnimator = JellyAnimator(presentation:presentation) - self.jellyAnimator?.prepare(viewController: viewController) - self.present(viewController, animated: true, completion: nil) - } - } -} - -extension ViewController: UITableViewDataSource { - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return model.count - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) - let data = model[indexPath.row] - cell.textLabel?.text = data.titleDescription - cell.detailTextLabel?.text = data.detailDescription - - return cell - } - - func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return 80 - } -} diff --git a/Example/Podfile b/Example/Podfile index df7833a..37cc700 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -1,10 +1,11 @@ use_frameworks! -platform :ios, '8.0' +platform :ios, '11.0' source 'https://github.com/CocoaPods/Specs.git' target 'Jelly_Example' do pod 'Jelly' , :path => '../' + pod "TouchVisualizer", '~>3.1.0' target 'Jelly_Tests' do inherit! :search_paths diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 8f4f0d5..0de50a0 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,22 +1,25 @@ PODS: - - Jelly (1.2.4) - - Nimble (7.0.2) - - Quick (1.2.0) + - Jelly (1.2.5) + - Nimble (7.3.1) + - Quick (1.3.2) + - TouchVisualizer (3.1.0) DEPENDENCIES: - Jelly (from `../`) - Nimble - Quick + - TouchVisualizer (~> 3.1.0) EXTERNAL SOURCES: Jelly: :path: ../ SPEC CHECKSUMS: - Jelly: 8fd7f789c18ff0ca9f297af7e3beb66c43190a1a - Nimble: bfe1f814edabba69ff145cb1283e04ed636a67f2 - Quick: 58d203b1c5e27fff7229c4c1ae445ad7069a7a08 + Jelly: a6f48f175497c91cbfe1443b94fe93ffd4a8750f + Nimble: 04f732da099ea4d153122aec8c2a88fd0c7219ae + Quick: 2623cb30d7a7f41ca62f684f679586558f483d46 + TouchVisualizer: b97b1efb0f25d1408bb4557e6f493eae454425e7 -PODFILE CHECKSUM: d9462fde83474a6e879a1f65f3c8d7c0d2fd1ef3 +PODFILE CHECKSUM: 802e33c01e5684bad7ba0410f21e91c48b66d2ad COCOAPODS: 1.4.0 diff --git a/Example/Pods/Local Podspecs/Jelly.podspec.json b/Example/Pods/Local Podspecs/Jelly.podspec.json index 0b6acc2..558335a 100644 --- a/Example/Pods/Local Podspecs/Jelly.podspec.json +++ b/Example/Pods/Local Podspecs/Jelly.podspec.json @@ -1,6 +1,6 @@ { "name": "Jelly", - "version": "1.2.4", + "version": "1.2.5", "summary": "Jelly provides custom view controller animations with just a few lines of code", "description": "Jelly is a simple to use Animation-Library\nIt helps you to add rich animations to your app without writing boiler code over and over", "homepage": "https://github.com/SebastianBoldt/Jelly", @@ -14,10 +14,10 @@ "social_media_url": "https://twitter.com/sebastianboldt", "source": { "git": "https://github.com/SebastianBoldt/Jelly.git", - "tag": "1.2.4" + "tag": "1.2.5" }, "platforms": { - "ios": "8.0" + "ios": "11.0" }, "source_files": "Jelly/Classes/**/*", "frameworks": "UIKit" diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index 8f4f0d5..0de50a0 100644 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -1,22 +1,25 @@ PODS: - - Jelly (1.2.4) - - Nimble (7.0.2) - - Quick (1.2.0) + - Jelly (1.2.5) + - Nimble (7.3.1) + - Quick (1.3.2) + - TouchVisualizer (3.1.0) DEPENDENCIES: - Jelly (from `../`) - Nimble - Quick + - TouchVisualizer (~> 3.1.0) EXTERNAL SOURCES: Jelly: :path: ../ SPEC CHECKSUMS: - Jelly: 8fd7f789c18ff0ca9f297af7e3beb66c43190a1a - Nimble: bfe1f814edabba69ff145cb1283e04ed636a67f2 - Quick: 58d203b1c5e27fff7229c4c1ae445ad7069a7a08 + Jelly: a6f48f175497c91cbfe1443b94fe93ffd4a8750f + Nimble: 04f732da099ea4d153122aec8c2a88fd0c7219ae + Quick: 2623cb30d7a7f41ca62f684f679586558f483d46 + TouchVisualizer: b97b1efb0f25d1408bb4557e6f493eae454425e7 -PODFILE CHECKSUM: d9462fde83474a6e879a1f65f3c8d7c0d2fd1ef3 +PODFILE CHECKSUM: 802e33c01e5684bad7ba0410f21e91c48b66d2ad COCOAPODS: 1.4.0 diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift b/Example/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift similarity index 76% rename from Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift rename to Example/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift index 196ee9a..3e89e23 100644 --- a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift +++ b/Example/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift @@ -24,14 +24,12 @@ import Foundation import CwlCatchExceptionSupport #endif -private func catchReturnTypeConverter(_ instance: T, block: () -> Void) -> T? { - // Get the type from an *instance*, instead of a receiving the type directly - return catchExceptionOfKind(T.self, block) as? T +private func catchReturnTypeConverter(_ type: T.Type, block: () -> Void) -> T? { + return catchExceptionOfKind(type, block) as? T } extension NSException { public static func catchException(in block: () -> Void) -> Self? { - // Use a dummy instance of Self to provide the type - return catchReturnTypeConverter(self.init(), block: block) + return catchReturnTypeConverter(self, block: block) } } diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m b/Example/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m similarity index 100% rename from Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m rename to Example/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h b/Example/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h similarity index 99% rename from Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h rename to Example/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h index ae48c23..0c8dd87 100644 --- a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h +++ b/Example/Pods/Nimble/Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h @@ -30,4 +30,3 @@ FOUNDATION_EXPORT const unsigned char CwlCatchExceptionVersionString[]; __attribute__((visibility("hidden"))) #endif NSException* __nullable catchExceptionOfKind(Class __nonnull type, __attribute__((noescape)) void (^ __nonnull inBlock)(void)); - diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m b/Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m similarity index 100% rename from Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m rename to Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h b/Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h similarity index 98% rename from Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h rename to Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h index 5755bfc..aef59c2 100644 --- a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h +++ b/Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h @@ -1,5 +1,5 @@ // -// CwlMachBadExceptionHandler.h +// CwlMachBadInstructionHandler.h // CwlPreconditionTesting // // Created by Matt Gallagher on 2016/01/10. diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c b/Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.c similarity index 100% rename from Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c rename to Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.c diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h b/Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.h similarity index 100% rename from Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h rename to Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.h diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift b/Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlBadInstructionException.swift similarity index 100% rename from Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift rename to Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlBadInstructionException.swift diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift b/Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstruction.swift similarity index 76% rename from Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift rename to Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstruction.swift index 6e84115..f96ec63 100644 --- a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift +++ b/Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstruction.swift @@ -21,7 +21,6 @@ import Foundation #if SWIFT_PACKAGE - import CwlCatchException import CwlMachBadInstructionHandler #endif @@ -38,16 +37,6 @@ import Foundation } } - extension execTypesCountTuple { - mutating func pointer(in block: (UnsafeMutablePointer) -> R) -> R { - return withUnsafeMutablePointer(to: &self) { p -> R in - return p.withMemoryRebound(to: T.self, capacity: EXC_TYPES_COUNT) { ptr -> R in - return block(ptr) - } - } - } - } - extension request_mach_exception_raise_t { mutating func withMsgHeaderPointer(in block: (UnsafeMutablePointer) -> R) -> R { return withUnsafeMutablePointer(to: &self) { p -> R in @@ -78,17 +67,23 @@ import Foundation var currentExceptionPort: mach_port_t = 0 var handlerThread: pthread_t? = nil - mutating func withUnsafeMutablePointers(in block: (UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer) -> R) -> R { - return masks.pointer { masksPtr in - return ports.pointer { portsPtr in - return behaviors.pointer { behaviorsPtr in - return flavors.pointer { flavorsPtr in - return block(masksPtr, portsPtr, behaviorsPtr, flavorsPtr) + static func internalMutablePointers(_ m: UnsafeMutablePointer>, _ c: UnsafeMutablePointer, _ p: UnsafeMutablePointer>, _ b: UnsafeMutablePointer>, _ f: UnsafeMutablePointer>, _ block: (UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer) -> R) -> R { + return m.withMemoryRebound(to: exception_mask_t.self, capacity: 1) { masksPtr in + return c.withMemoryRebound(to: mach_msg_type_number_t.self, capacity: 1) { countPtr in + return p.withMemoryRebound(to: mach_port_t.self, capacity: 1) { portsPtr in + return b.withMemoryRebound(to: exception_behavior_t.self, capacity: 1) { behaviorsPtr in + return f.withMemoryRebound(to: thread_state_flavor_t.self, capacity: 1) { flavorsPtr in + return block(masksPtr, countPtr, portsPtr, behaviorsPtr, flavorsPtr) + } } } } } } + + mutating func withUnsafeMutablePointers(in block: @escaping (UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer, UnsafeMutablePointer) -> R) -> R { + return MachContext.internalMutablePointers(&masks, &count, &ports, &behaviors, &flavors, block) + } } /// A function for receiving mach messages and parsing the first with mach_exc_server (and if any others are received, throwing them away). @@ -102,8 +97,9 @@ import Foundation // Request the next mach message from the port request.Head.msgh_local_port = context.currentExceptionPort request.Head.msgh_size = UInt32(MemoryLayout.size) + let requestSize = request.Head.msgh_size try kernCheck { request.withMsgHeaderPointer { requestPtr in - mach_msg(requestPtr, MACH_RCV_MSG | MACH_RCV_INTERRUPT, 0, request.Head.msgh_size, context.currentExceptionPort, 0, UInt32(MACH_PORT_NULL)) + mach_msg(requestPtr, MACH_RCV_MSG | MACH_RCV_INTERRUPT, 0, requestSize, context.currentExceptionPort, 0, UInt32(MACH_PORT_NULL)) } } // Prepare the reply structure @@ -121,13 +117,14 @@ import Foundation handledfirstException = true } else { - // If multiple fatal errors occur, don't handle subsequent errors (let the program crash) + // If multiple fatal errors occur, don't handle subsquent errors (let the program crash) reply.RetCode = KERN_FAILURE } // Send the reply + let replySize = reply.Head.msgh_size try kernCheck { reply.withMsgHeaderPointer { replyPtr in - mach_msg(replyPtr, MACH_SEND_MSG, reply.Head.msgh_size, 0, UInt32(MACH_PORT_NULL), 0, UInt32(MACH_PORT_NULL)) + mach_msg(replyPtr, MACH_SEND_MSG, replySize, 0, UInt32(MACH_PORT_NULL), 0, UInt32(MACH_PORT_NULL)) } } } catch let error as NSError where (error.domain == NSMachErrorDomain && (error.code == Int(MACH_RCV_PORT_CHANGED) || error.code == Int(MACH_RCV_INVALID_NAME))) { // Port was already closed before we started or closed while we were listening. @@ -170,14 +167,15 @@ import Foundation mach_port_insert_right(mach_task_self_, context.currentExceptionPort, context.currentExceptionPort, MACH_MSG_TYPE_MAKE_SEND) } - try kernCheck { context.withUnsafeMutablePointers { masksPtr, portsPtr, behaviorsPtr, flavorsPtr in + let currentExceptionPtr = context.currentExceptionPort + try kernCheck { context.withUnsafeMutablePointers { masksPtr, countPtr, portsPtr, behaviorsPtr, flavorsPtr in // 3. Apply the mach port as the handler for this thread - thread_swap_exception_ports(mach_thread_self(), EXC_MASK_BAD_INSTRUCTION, context.currentExceptionPort, Int32(bitPattern: UInt32(EXCEPTION_STATE) | MACH_EXCEPTION_CODES), x86_THREAD_STATE64, masksPtr, &context.count, portsPtr, behaviorsPtr, flavorsPtr) + thread_swap_exception_ports(mach_thread_self(), EXC_MASK_BAD_INSTRUCTION, currentExceptionPtr, Int32(bitPattern: UInt32(EXCEPTION_STATE) | MACH_EXCEPTION_CODES), x86_THREAD_STATE64, masksPtr, countPtr, portsPtr, behaviorsPtr, flavorsPtr) } } - defer { context.withUnsafeMutablePointers { masksPtr, portsPtr, behaviorsPtr, flavorsPtr in + defer { context.withUnsafeMutablePointers { masksPtr, countPtr, portsPtr, behaviorsPtr, flavorsPtr in // 6. Unapply the mach port - _ = thread_swap_exception_ports(mach_thread_self(), EXC_MASK_BAD_INSTRUCTION, 0, EXCEPTION_DEFAULT, THREAD_STATE_NONE, masksPtr, &context.count, portsPtr, behaviorsPtr, flavorsPtr) + _ = thread_swap_exception_ports(mach_thread_self(), EXC_MASK_BAD_INSTRUCTION, 0, EXCEPTION_DEFAULT, THREAD_STATE_NONE, masksPtr, countPtr, portsPtr, behaviorsPtr, flavorsPtr) } } try withUnsafeMutablePointer(to: &context) { c throws in diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift b/Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift similarity index 100% rename from Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift rename to Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift diff --git a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h b/Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h similarity index 96% rename from Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h rename to Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h index f9dbedd..7c50da1 100644 --- a/Example/Pods/Nimble/Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h +++ b/Example/Pods/Nimble/Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h @@ -20,6 +20,8 @@ #import +extern bool _swift_reportFatalErrorsToDebugger; + //! Project version number for CwlUtils. FOUNDATION_EXPORT double CwlPreconditionTestingVersionNumber; diff --git a/Example/Pods/Nimble/README.md b/Example/Pods/Nimble/README.md index a190ac6..19c562f 100644 --- a/Example/Pods/Nimble/README.md +++ b/Example/Pods/Nimble/README.md @@ -226,9 +226,9 @@ exception once evaluated: // that Nimble will catch. // (see https://github.com/Quick/Nimble/issues/220#issuecomment-172667064) let exception = NSException( - name: NSInternalInconsistencyException, - reason: "Not enough fish in the sea.", - userInfo: ["something": "is fishy"]) + name: NSInternalInconsistencyException, + reason: "Not enough fish in the sea.", + userInfo: ["something": "is fishy"]) expect { exception.raise() }.to(raiseException()) // Also, you can customize raiseException to be more specific @@ -714,7 +714,7 @@ expect(actual) ≈ expected expect(actual) ≈ (expected, delta) ``` -(Type Option-x to get ≈ on a U.S. keyboard) +(Type option+x to get `≈` on a U.S. keyboard) The former version uses the default delta of 0.0001. Here is yet another way to do this: @@ -725,7 +725,7 @@ expect(actual) ≈ expected ± delta expect(actual) == expected ± delta ``` -(Type Option-Shift-= to get ± on a U.S. keyboard) +(Type option+shift+= to get `±` on a U.S. keyboard) If you are comparing arrays of floating point numbers, you'll find the following useful: @@ -1043,10 +1043,10 @@ let turtles: [Turtle] = functionThatReturnsSomeTurtlesInAnyOrder() // [{color: "blue"}, {color: "green"}] or [{color: "green"}, {color: "blue"}]: expect(turtles).to(containElementSatisfying({ turtle in - return turtle.color == "green" + return turtle.color == "green" })) expect(turtles).to(containElementSatisfying({ turtle in - return turtle.color == "blue" + return turtle.color == "blue" }, "that is a turtle with color 'blue'")) // The second matcher will incorporate the provided string in the error message @@ -1069,10 +1069,10 @@ NSArray * __nonnull turtles = functionThatReturnsSomeTurtlesInAnyOrder // [{color: "blue"}, {color: "green"}] or [{color: "green"}, {color: "blue"}]: expect(turtles).to(containElementSatisfying(^BOOL(id __nonnull object) { - return [[turtle color] isEqualToString:@"green"]; + return [[turtle color] isEqualToString:@"green"]; })); expect(turtles).to(containElementSatisfying(^BOOL(id __nonnull object) { - return [[turtle color] isEqualToString:@"blue"]; + return [[turtle color] isEqualToString:@"blue"]; })); ``` @@ -1273,24 +1273,24 @@ value and return a `Predicate` closure. Take `equal`, for example: // Swift public func equal(expectedValue: T?) -> Predicate { - // Can be shortened to: - // Predicate { actual in ... } - // - // But shown with types here for clarity. - return Predicate { (actual: Expression) throws -> PredicateResult in - let msg = ExpectationMessage.expectedActualValueTo("equal <\(expectedValue)>") - if let actualValue = try actualExpression.evaluate() { - return PredicateResult( - bool: actualValue == expectedValue!, - message: msg - ) - } else { - return PredicateResult( - status: .fail, - message: msg.appendedBeNilHint() - ) + // Can be shortened to: + // Predicate { actual in ... } + // + // But shown with types here for clarity. + return Predicate { (actual: Expression) throws -> PredicateResult in + let msg = ExpectationMessage.expectedActualValueTo("equal <\(expectedValue)>") + if let actualValue = try actualExpression.evaluate() { + return PredicateResult( + bool: actualValue == expectedValue!, + message: msg + ) + } else { + return PredicateResult( + status: .fail, + message: msg.appendedBeNilHint() + ) + } } - } } ``` @@ -1382,11 +1382,11 @@ custom matchers should call `actualExpression.evaluate()`: // Swift public func beNil() -> Predicate { - // Predicate.simpleNilable(..) automatically generates ExpectationMessage for - // us based on the string we provide to it. Also, the 'Nilable' postfix indicates - // that this Predicate supports matching against nil actualExpressions, instead of - // always resulting in a PredicateStatus.fail result -- which is true for - // Predicate.simple(..) + // Predicate.simpleNilable(..) automatically generates ExpectationMessage for + // us based on the string we provide to it. Also, the 'Nilable' postfix indicates + // that this Predicate supports matching against nil actualExpressions, instead of + // always resulting in a PredicateStatus.fail result -- which is true for + // Predicate.simple(..) return Predicate.simpleNilable("be nil") { actualExpression in let actualValue = try actualExpression.evaluate() return PredicateStatus(bool: actualValue == nil) @@ -1412,9 +1412,9 @@ against the one provided to the matcher function, and passes if they are the sam // Swift public func haveDescription(description: String) -> Predicate { - return Predicate.simple("have description") { actual in - return PredicateStatus(bool: actual.evaluate().description == description) - } + return Predicate.simple("have description") { actual in + return PredicateStatus(bool: actual.evaluate().description == description) + } } ``` @@ -1489,7 +1489,7 @@ case expectedCustomValueTo(/* message: */ String, /* actual: */ String) // Emits standard error message without mentioning the actual value // eg - "expected to " -case expectedTo(/* message: */ String, /* actual: */ String) +case expectedTo(/* message: */ String) // ... } @@ -1526,13 +1526,13 @@ custom matcher. The example below defines the class method // Swift extension NMBObjCMatcher { - public class func beNilMatcher() -> NMBObjCMatcher { - return NMBObjCMatcher { actualBlock, failureMessage, location in - let block = ({ actualBlock() as NSObject? }) - let expr = Expression(expression: block, location: location) - return beNil().matches(expr, failureMessage: failureMessage) + public class func beNilMatcher() -> NMBObjCMatcher { + return NMBObjCMatcher { actualBlock, failureMessage, location in + let block = ({ actualBlock() as NSObject? }) + let expr = Expression(expression: block, location: location) + return beNil().matches(expr, failureMessage: failureMessage) + } } - } } ``` @@ -1551,7 +1551,7 @@ class method: // Objective-C FOUNDATION_EXPORT id beNil() { - return [NMBObjCMatcher beNilMatcher]; + return [NMBObjCMatcher beNilMatcher]; } ``` diff --git a/Example/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift b/Example/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift index 740c392..cc39636 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Adapters/AssertionRecorder.swift @@ -65,7 +65,7 @@ public func withAssertionHandler(_ tempAssertionHandler: AssertionHandler, closu /// assertion handler when this is true. Defaults to false. /// /// @see gatherFailingExpectations -public func gatherExpectations(silently: Bool = false, closure: @escaping () -> Void) -> [AssertionRecord] { +public func gatherExpectations(silently: Bool = false, closure: () -> Void) -> [AssertionRecord] { let previousRecorder = NimbleEnvironment.activeInstance.assertionHandler let recorder = AssertionRecorder() let handlers: [AssertionHandler] @@ -92,7 +92,7 @@ public func gatherExpectations(silently: Bool = false, closure: @escaping () -> /// /// @see gatherExpectations /// @see raiseException source for an example use case. -public func gatherFailingExpectations(silently: Bool = false, closure: @escaping () -> Void) -> [AssertionRecord] { +public func gatherFailingExpectations(silently: Bool = false, closure: () -> Void) -> [AssertionRecord] { let assertions = gatherExpectations(silently: silently, closure: closure) return assertions.filter { assertion in !assertion.success diff --git a/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift b/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift index 88d9406..add7d3f 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBExpectation.swift @@ -4,7 +4,7 @@ import Foundation private func from(objcPredicate: NMBPredicate) -> Predicate { return Predicate { actualExpression in - let result = objcPredicate.satisfies(({ try! actualExpression.evaluate() }), + let result = objcPredicate.satisfies(({ try actualExpression.evaluate() }), location: actualExpression.location) return result.toSwift() } @@ -30,13 +30,13 @@ internal struct ObjCMatcherWrapper: Matcher { // Equivalent to Expectation, but for Nimble's Objective-C interface public class NMBExpectation: NSObject { - internal let _actualBlock: () -> NSObject! + internal let _actualBlock: () -> NSObject? internal var _negative: Bool internal let _file: FileString internal let _line: UInt internal var _timeout: TimeInterval = 1.0 - @objc public init(actualBlock: @escaping () -> NSObject!, negative: Bool, file: FileString, line: UInt) { + @objc public init(actualBlock: @escaping () -> NSObject?, negative: Bool, file: FileString, line: UInt) { self._actualBlock = actualBlock self._negative = negative self._file = file diff --git a/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift b/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift index 9ba2ffa..a114dff 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Adapters/NMBObjCMatcher.swift @@ -3,8 +3,8 @@ import Foundation #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) // swiftlint:disable line_length -public typealias MatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage) -> Bool -public typealias FullMatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage, _ shouldNotMatch: Bool) -> Bool +public typealias MatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage) throws -> Bool +public typealias FullMatcherBlock = (_ actualExpression: Expression, _ failureMessage: FailureMessage, _ shouldNotMatch: Bool) throws -> Bool // swiftlint:enable line_length public class NMBObjCMatcher: NSObject, NMBMatcher { @@ -24,7 +24,7 @@ public class NMBObjCMatcher: NSObject, NMBMatcher { public convenience init(canMatchNil: Bool, matcher: @escaping MatcherBlock) { self.init(canMatchNil: canMatchNil, matcher: matcher, notMatcher: ({ actualExpression, failureMessage in - return !matcher(actualExpression, failureMessage) + return try !matcher(actualExpression, failureMessage) })) } @@ -34,9 +34,9 @@ public class NMBObjCMatcher: NSObject, NMBMatcher { public convenience init(canMatchNil: Bool, matcher: @escaping FullMatcherBlock) { self.init(canMatchNil: canMatchNil, matcher: ({ actualExpression, failureMessage in - return matcher(actualExpression, failureMessage, false) + return try matcher(actualExpression, failureMessage, false) }), notMatcher: ({ actualExpression, failureMessage in - return matcher(actualExpression, failureMessage, true) + return try matcher(actualExpression, failureMessage, true) })) } @@ -55,11 +55,16 @@ public class NMBObjCMatcher: NSObject, NMBMatcher { return true } - public func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + public func matches(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let expr = Expression(expression: actualBlock, location: location) - let result = _match( - expr, - failureMessage) + let result: Bool + do { + result = try _match(expr, failureMessage) + } catch let error { + failureMessage.stringValue = "unexpected error thrown: <\(error)>" + return false + } + if self.canMatch(Expression(expression: actualBlock, location: location), failureMessage: failureMessage) { return result } else { @@ -67,11 +72,16 @@ public class NMBObjCMatcher: NSObject, NMBMatcher { } } - public func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + public func doesNotMatch(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let expr = Expression(expression: actualBlock, location: location) - let result = _doesNotMatch( - expr, - failureMessage) + let result: Bool + do { + result = try _doesNotMatch(expr, failureMessage) + } catch let error { + failureMessage.stringValue = "unexpected error thrown: <\(error)>" + return false + } + if self.canMatch(Expression(expression: actualBlock, location: location), failureMessage: failureMessage) { return result } else { diff --git a/Example/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift b/Example/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift index 0ad8590..14bb045 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Adapters/NimbleXCTestHandler.swift @@ -42,12 +42,23 @@ class NimbleXCTestUnavailableHandler: AssertionHandler { private(set) var currentTestCase: XCTestCase? + private var stashed_swift_reportFatalErrorsToDebugger: Bool = false + @objc func testCaseWillStart(_ testCase: XCTestCase) { + #if swift(>=3.2) + stashed_swift_reportFatalErrorsToDebugger = _swift_reportFatalErrorsToDebugger + _swift_reportFatalErrorsToDebugger = false + #endif + currentTestCase = testCase } @objc func testCaseDidFinish(_ testCase: XCTestCase) { currentTestCase = nil + + #if swift(>=3.2) + _swift_reportFatalErrorsToDebugger = stashed_swift_reportFatalErrorsToDebugger + #endif } } #endif @@ -61,7 +72,7 @@ func isXCTestAvailable() -> Bool { #endif } -private func recordFailure(_ message: String, location: SourceLocation) { +public func recordFailure(_ message: String, location: SourceLocation) { #if SWIFT_PACKAGE XCTFail("\(message)", file: location.file, line: location.line) #else diff --git a/Example/Pods/Nimble/Sources/Nimble/DSL+Wait.swift b/Example/Pods/Nimble/Sources/Nimble/DSL+Wait.swift index a84682f..e874136 100644 --- a/Example/Pods/Nimble/Sources/Nimble/DSL+Wait.swift +++ b/Example/Pods/Nimble/Sources/Nimble/DSL+Wait.swift @@ -111,6 +111,6 @@ internal func blockedRunLoopErrorMessageFor(_ fnName: String, leeway: TimeInterv /// /// This function manages the main run loop (`NSRunLoop.mainRunLoop()`) while this function /// is executing. Any attempts to touch the run loop may cause non-deterministic behavior. -public func waitUntil(timeout: TimeInterval = 1, file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) -> Void) { +public func waitUntil(timeout: TimeInterval = AsyncDefaults.Timeout, file: FileString = #file, line: UInt = #line, action: @escaping (@escaping () -> Void) -> Void) { NMBWait.until(timeout: timeout, file: file, line: line, action: action) } diff --git a/Example/Pods/Nimble/Sources/Nimble/Expectation.swift b/Example/Pods/Nimble/Sources/Nimble/Expectation.swift index e3f616a..41625a1 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Expectation.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Expectation.swift @@ -1,23 +1,5 @@ import Foundation -// Deprecated -internal func expressionMatches(_ expression: Expression, matcher: U, to: String, description: String?) -> (Bool, FailureMessage) - where U: Matcher, U.ValueType == T { - let msg = FailureMessage() - msg.userDescription = description - msg.to = to - do { - let pass = try matcher.matches(expression, failureMessage: msg) - if msg.actualValue == "" { - msg.actualValue = "<\(stringify(try expression.evaluate()))>" - } - return (pass, msg) - } catch let error { - msg.stringValue = "unexpected error thrown: <\(error)>" - return (false, msg) - } -} - // Deprecated internal func expressionDoesNotMatch(_ expression: Expression, matcher: U, toNot: String, description: String?) -> (Bool, FailureMessage) where U: Matcher, U.ValueType == T { @@ -75,6 +57,10 @@ public struct Expectation { public let expression: Expression + public init(expression: Expression) { + self.expression = expression + } + public func verify(_ pass: Bool, _ message: FailureMessage) { let handler = NimbleEnvironment.activeInstance.assertionHandler handler.assert(pass, message: message, location: expression.location) @@ -85,8 +71,15 @@ public struct Expectation { /// DEPRECATED: Tests the actual value using a matcher to match. public func to(_ matcher: U, description: String? = nil) where U: Matcher, U.ValueType == T { - let (pass, msg) = expressionMatches(expression, matcher: matcher, to: "to", description: description) - verify(pass, msg) + let (pass, msg) = execute( + expression, + .toMatch, + matcher.predicate, + to: "to", + description: description, + captureExceptions: false + ) + verify(pass, msg) } /// DEPRECATED: Tests the actual value using a matcher to not match. @@ -127,6 +120,6 @@ public struct Expectation { } // see: - // - AsyncMatcherWrapper for extension + // - `async` for extension // - NMBExpectation for Objective-C interface } diff --git a/Example/Pods/Nimble/Sources/Nimble/ExpectationMessage.swift b/Example/Pods/Nimble/Sources/Nimble/ExpectationMessage.swift index 992ee0e..7aae341 100644 --- a/Example/Pods/Nimble/Sources/Nimble/ExpectationMessage.swift +++ b/Example/Pods/Nimble/Sources/Nimble/ExpectationMessage.swift @@ -152,8 +152,10 @@ public indirect enum ExpectationMessage { // Backwards compatibility: converts ExpectationMessage tree to FailureMessage internal func update(failureMessage: FailureMessage) { switch self { - case let .fail(msg): + case let .fail(msg) where !msg.isEmpty: failureMessage.stringValue = msg + case .fail: + break case let .expectedTo(msg): failureMessage.actualValue = nil failureMessage.postfixMessage = msg diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift index 8affa62..cc6c24f 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/AllPass.swift @@ -68,7 +68,7 @@ extension NMBObjCMatcher { @objc public class func allPassMatcher(_ matcher: NMBMatcher) -> NMBPredicate { return NMBPredicate { actualExpression in let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() + let actualValue = try actualExpression.evaluate() var nsObjects = [NSObject]() var collectionIsUsable = true @@ -99,7 +99,7 @@ extension NMBObjCMatcher { let expr = Expression(expression: ({ nsObjects }), location: location) let pred: Predicate<[NSObject]> = createPredicate(Predicate { expr in if let predicate = matcher as? NMBPredicate { - return predicate.satisfies(({ try! expr.evaluate() }), location: expr.location).toSwift() + return predicate.satisfies(({ try expr.evaluate() }), location: expr.location).toSwift() } else { let failureMessage = FailureMessage() let result = matcher.matches( @@ -114,7 +114,7 @@ extension NMBObjCMatcher { ) } }) - return try! pred.satisfies(expr).toObjectiveC() + return try pred.satisfies(expr).toObjectiveC() } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/Async.swift similarity index 68% rename from Example/Pods/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift rename to Example/Pods/Nimble/Sources/Nimble/Matchers/Async.swift index 3cba8b0..63e863e 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/AsyncMatcherWrapper.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/Async.swift @@ -32,76 +32,7 @@ private func async(style: ExpectationStyle, predicate: Predicate, timeout: // swiftlint:disable:next line_length return PredicateResult(status: .fail, message: lastPredicateResult!.message.appended(message: " (timed out, but main thread was unresponsive).")) case .incomplete: - internalError("Reached .incomplete state for toEventually(...).") - } - } -} - -// Deprecated -internal struct AsyncMatcherWrapper: Matcher - where U: Matcher, U.ValueType == T { - let fullMatcher: U - let timeoutInterval: TimeInterval - let pollInterval: TimeInterval - - init(fullMatcher: U, timeoutInterval: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval) { - self.fullMatcher = fullMatcher - self.timeoutInterval = timeoutInterval - self.pollInterval = pollInterval - } - - func matches(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - let uncachedExpression = actualExpression.withoutCaching() - let fnName = "expect(...).toEventually(...)" - let result = pollBlock( - pollInterval: pollInterval, - timeoutInterval: timeoutInterval, - file: actualExpression.location.file, - line: actualExpression.location.line, - fnName: fnName) { - try self.fullMatcher.matches(uncachedExpression, failureMessage: failureMessage) - } - switch result { - case let .completed(isSuccessful): return isSuccessful - case .timedOut: return false - case let .errorThrown(error): - failureMessage.stringValue = "an unexpected error thrown: <\(error)>" - return false - case let .raisedException(exception): - failureMessage.stringValue = "an unexpected exception thrown: <\(exception)>" - return false - case .blockedRunLoop: - failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." - return false - case .incomplete: - internalError("Reached .incomplete state for toEventually(...).") - } - } - - func doesNotMatch(_ actualExpression: Expression, failureMessage: FailureMessage) -> Bool { - let uncachedExpression = actualExpression.withoutCaching() - let result = pollBlock( - pollInterval: pollInterval, - timeoutInterval: timeoutInterval, - file: actualExpression.location.file, - line: actualExpression.location.line, - fnName: "expect(...).toEventuallyNot(...)") { - try self.fullMatcher.doesNotMatch(uncachedExpression, failureMessage: failureMessage) - } - switch result { - case let .completed(isSuccessful): return isSuccessful - case .timedOut: return false - case let .errorThrown(error): - failureMessage.stringValue = "an unexpected error thrown: <\(error)>" - return false - case let .raisedException(exception): - failureMessage.stringValue = "an unexpected exception thrown: <\(exception)>" - return false - case .blockedRunLoop: - failureMessage.postfixMessage += " (timed out, but main thread was unresponsive)." - return false - case .incomplete: - internalError("Reached .incomplete state for toEventuallyNot(...).") + internalError("Reached .incomplete state for \(fnName)(...).") } } } @@ -182,14 +113,19 @@ extension Expectation { public func toEventually(_ matcher: U, timeout: TimeInterval = AsyncDefaults.Timeout, pollInterval: TimeInterval = AsyncDefaults.PollInterval, description: String? = nil) where U: Matcher, U.ValueType == T { if expression.isClosure { - let (pass, msg) = expressionMatches( + let (pass, msg) = execute( expression, - matcher: AsyncMatcherWrapper( - fullMatcher: matcher, - timeoutInterval: timeout, - pollInterval: pollInterval), + .toMatch, + async( + style: .toMatch, + predicate: matcher.predicate, + timeout: timeout, + poll: pollInterval, + fnName: "toEventually" + ), to: "to eventually", - description: description + description: description, + captureExceptions: false ) verify(pass, msg) } else { @@ -208,10 +144,13 @@ extension Expectation { if expression.isClosure { let (pass, msg) = expressionDoesNotMatch( expression, - matcher: AsyncMatcherWrapper( - fullMatcher: matcher, - timeoutInterval: timeout, - pollInterval: pollInterval), + matcher: async( + style: .toNotMatch, + predicate: matcher.predicate, + timeout: timeout, + poll: pollInterval, + fnName: "toEventuallyNot" + ), toNot: "to eventually not", description: description ) diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift index 5674525..5d0f5a1 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAKindOf.swift @@ -59,8 +59,8 @@ public func beAKindOf(_ expectedClass: AnyClass) -> Predicate { extension NMBObjCMatcher { @objc public class func beAKindOfMatcher(_ expected: AnyClass) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! beAKindOf(expected).matches(actualExpression, failureMessage: failureMessage) + return NMBPredicate { actualExpression in + return try beAKindOf(expected).satisfies(actualExpression).toObjectiveC() } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift index 70c5661..bc1b02c 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeAnInstanceOf.swift @@ -48,8 +48,8 @@ public func beAnInstanceOf(_ expectedClass: AnyClass) -> Predicate { #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { @objc public class func beAnInstanceOfMatcher(_ expected: AnyClass) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! beAnInstanceOf(expected).matches(actualExpression, failureMessage: failureMessage) + return NMBPredicate { actualExpression in + return try beAnInstanceOf(expected).satisfies(actualExpression).toObjectiveC() } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift index dfb4e28..b1e6f4c 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeCloseTo.swift @@ -43,22 +43,34 @@ public class NMBObjCBeCloseToMatcher: NSObject, NMBMatcher { _delta = within } - @objc public func matches(_ actualExpression: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + @objc public func matches(_ actualExpression: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let actualBlock: () -> NMBDoubleConvertible? = ({ return actualExpression() as? NMBDoubleConvertible }) let expr = Expression(expression: actualBlock, location: location) let matcher = beCloseTo(self._expected, within: self._delta) - return try! matcher.matches(expr, failureMessage: failureMessage) + + do { + return try matcher.matches(expr, failureMessage: failureMessage) + } catch let error { + failureMessage.stringValue = "unexpected error thrown: <\(error)>" + return false + } } - @objc public func doesNotMatch(_ actualExpression: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + @objc public func doesNotMatch(_ actualExpression: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let actualBlock: () -> NMBDoubleConvertible? = ({ return actualExpression() as? NMBDoubleConvertible }) let expr = Expression(expression: actualBlock, location: location) let matcher = beCloseTo(self._expected, within: self._delta) - return try! matcher.doesNotMatch(expr, failureMessage: failureMessage) + + do { + return try matcher.doesNotMatch(expr, failureMessage: failureMessage) + } catch let error { + failureMessage.stringValue = "unexpected error thrown: <\(error)>" + return false + } } @objc public var within: (CDouble) -> NMBObjCBeCloseToMatcher { diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift index 3cbc15d..8d73dcc 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeEmpty.swift @@ -66,14 +66,14 @@ extension NMBObjCMatcher { @objc public class func beEmptyMatcher() -> NMBPredicate { return NMBPredicate { actualExpression in let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() + let actualValue = try actualExpression.evaluate() if let value = actualValue as? NMBCollection { let expr = Expression(expression: ({ value as NMBCollection }), location: location) - return try! beEmpty().satisfies(expr).toObjectiveC() + return try beEmpty().satisfies(expr).toObjectiveC() } else if let value = actualValue as? NSString { let expr = Expression(expression: ({ value as String }), location: location) - return try! beEmpty().satisfies(expr).toObjectiveC() + return try beEmpty().satisfies(expr).toObjectiveC() } else if let actualValue = actualValue { // swiftlint:disable:next line_length let badTypeErrorMsg = "be empty (only works for NSArrays, NSSets, NSIndexSets, NSDictionaries, NSHashTables, and NSStrings)" diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift index 8717f97..b86f25d 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThan.swift @@ -13,13 +13,13 @@ public func beGreaterThan(_ expectedValue: T?) -> Predicate { /// A Nimble matcher that succeeds when the actual value is greater than the expected value. public func beGreaterThan(_ expectedValue: NMBComparable?) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "be greater than <\(stringify(expectedValue))>" + let errorMessage = "be greater than <\(stringify(expectedValue))>" + return Predicate.simple(errorMessage) { actualExpression in let actualValue = try actualExpression.evaluate() let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) == ComparisonResult.orderedDescending - return matches - }.requireNonNil + return PredicateStatus(bool: matches) + } } public func >(lhs: Expectation, rhs: T) { @@ -35,7 +35,7 @@ extension NMBObjCMatcher { @objc public class func beGreaterThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beGreaterThan(expected).matches(expr, failureMessage: failureMessage) + return try beGreaterThan(expected).matches(expr, failureMessage: failureMessage) } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift index 55d8e7b..2a3ca4a 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift @@ -3,25 +3,25 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is greater than /// or equal to the expected value. public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "be greater than or equal to <\(stringify(expectedValue))>" + let message = "be greater than or equal to <\(stringify(expectedValue))>" + return Predicate.simple(message) { actualExpression in let actualValue = try actualExpression.evaluate() if let actual = actualValue, let expected = expectedValue { - return actual >= expected + return PredicateStatus(bool: actual >= expected) } - return false - }.requireNonNil + return .fail + } } /// A Nimble matcher that succeeds when the actual value is greater than /// or equal to the expected value. public func beGreaterThanOrEqualTo(_ expectedValue: T?) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "be greater than or equal to <\(stringify(expectedValue))>" + let message = "be greater than or equal to <\(stringify(expectedValue))>" + return Predicate.simple(message) { actualExpression in let actualValue = try actualExpression.evaluate() let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) != ComparisonResult.orderedAscending - return matches - }.requireNonNil + return PredicateStatus(bool: matches) + } } public func >=(lhs: Expectation, rhs: T) { @@ -37,7 +37,7 @@ extension NMBObjCMatcher { @objc public class func beGreaterThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beGreaterThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) + return try beGreaterThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift index ad19def..94758c2 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeIdenticalTo.swift @@ -3,20 +3,27 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is the same instance /// as the expected instance. public func beIdenticalTo(_ expected: Any?) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + return Predicate.define { actualExpression in #if os(Linux) let actual = try actualExpression.evaluate() as? AnyObject #else let actual = try actualExpression.evaluate() as AnyObject? #endif - failureMessage.actualValue = "\(identityAsString(actual))" - failureMessage.postfixMessage = "be identical to \(identityAsString(expected))" + + let bool: Bool #if os(Linux) - return actual === (expected as? AnyObject) && actual !== nil + bool = actual === (expected as? AnyObject) && actual !== nil #else - return actual === (expected as AnyObject?) && actual !== nil + bool = actual === (expected as AnyObject?) && actual !== nil #endif - }.requireNonNil + return PredicateResult( + bool: bool, + message: .expectedCustomValueTo( + "be identical to \(identityAsString(expected))", + "\(identityAsString(actual))" + ) + ) + } } public func === (lhs: Expectation, rhs: Any?) { @@ -39,7 +46,7 @@ extension NMBObjCMatcher { @objc public class func beIdenticalToMatcher(_ expected: NSObject?) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let aExpr = actualExpression.cast { $0 as Any? } - return try! beIdenticalTo(expected).matches(aExpr, failureMessage: failureMessage) + return try beIdenticalTo(expected).matches(aExpr, failureMessage: failureMessage) } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift index 8047efd..e1fbf1e 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThan.swift @@ -2,23 +2,23 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is less than the expected value. public func beLessThan(_ expectedValue: T?) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than <\(stringify(expectedValue))>" + let message = "be less than <\(stringify(expectedValue))>" + return Predicate.simple(message) { actualExpression in if let actual = try actualExpression.evaluate(), let expected = expectedValue { - return actual < expected + return PredicateStatus(bool: actual < expected) } - return false - }.requireNonNil + return .fail + } } /// A Nimble matcher that succeeds when the actual value is less than the expected value. public func beLessThan(_ expectedValue: NMBComparable?) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than <\(stringify(expectedValue))>" + let message = "be less than <\(stringify(expectedValue))>" + return Predicate.simple(message) { actualExpression in let actualValue = try actualExpression.evaluate() let matches = actualValue != nil && actualValue!.NMB_compare(expectedValue) == ComparisonResult.orderedAscending - return matches - }.requireNonNil + return PredicateStatus(bool: matches) + } } public func <(lhs: Expectation, rhs: T) { @@ -34,7 +34,7 @@ extension NMBObjCMatcher { @objc public class func beLessThanMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beLessThan(expected).matches(expr, failureMessage: failureMessage) + return try beLessThan(expected).matches(expr, failureMessage: failureMessage) } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift index 098a852..c37cb16 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLessThanOrEqual.swift @@ -3,23 +3,22 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is less than /// or equal to the expected value. public func beLessThanOrEqualTo(_ expectedValue: T?) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than or equal to <\(stringify(expectedValue))>" + return Predicate.simple("be less than or equal to <\(stringify(expectedValue))>") { actualExpression in if let actual = try actualExpression.evaluate(), let expected = expectedValue { - return actual <= expected + return PredicateStatus(bool: actual <= expected) } - return false - }.requireNonNil + return .fail + } } /// A Nimble matcher that succeeds when the actual value is less than /// or equal to the expected value. public func beLessThanOrEqualTo(_ expectedValue: T?) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "be less than or equal to <\(stringify(expectedValue))>" + return Predicate.simple("be less than or equal to <\(stringify(expectedValue))>") { actualExpression in let actualValue = try actualExpression.evaluate() - return actualValue != nil && actualValue!.NMB_compare(expectedValue) != ComparisonResult.orderedDescending - }.requireNonNil + let matches = actualValue.map { $0.NMB_compare(expectedValue) != .orderedDescending } ?? false + return PredicateStatus(bool: matches) + } } public func <=(lhs: Expectation, rhs: T) { @@ -33,9 +32,9 @@ public func <=(lhs: Expectation, rhs: T) { #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { @objc public class func beLessThanOrEqualToMatcher(_ expected: NMBComparable?) -> NMBObjCMatcher { - return NMBObjCMatcher(canMatchNil:false) { actualExpression, failureMessage in + return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let expr = actualExpression.cast { $0 as? NMBComparable } - return try! beLessThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) + return try beLessThanOrEqualTo(expected).matches(expr, failureMessage: failureMessage) } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLogical.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLogical.swift index 2b18b4c..035500e 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLogical.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeLogical.swift @@ -139,28 +139,28 @@ extension NMBObjCMatcher { @objc public class func beTruthyMatcher() -> NMBObjCMatcher { return NMBObjCMatcher { actualExpression, failureMessage in let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beTruthy().matches(expr, failureMessage: failureMessage) + return try beTruthy().matches(expr, failureMessage: failureMessage) } } @objc public class func beFalsyMatcher() -> NMBObjCMatcher { return NMBObjCMatcher { actualExpression, failureMessage in let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beFalsy().matches(expr, failureMessage: failureMessage) + return try beFalsy().matches(expr, failureMessage: failureMessage) } } @objc public class func beTrueMatcher() -> NMBObjCMatcher { return NMBObjCMatcher { actualExpression, failureMessage in let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beTrue().matches(expr, failureMessage: failureMessage) + return try beTrue().matches(expr, failureMessage: failureMessage) } } @objc public class func beFalseMatcher() -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let expr = actualExpression.cast { ($0 as? NSNumber)?.boolValue ?? false } - return try! beFalse().matches(expr, failureMessage: failureMessage) + return try beFalse().matches(expr, failureMessage: failureMessage) } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift index a22e0f4..387420b 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeNil.swift @@ -12,7 +12,7 @@ public func beNil() -> Predicate { extension NMBObjCMatcher { @objc public class func beNilMatcher() -> NMBObjCMatcher { return NMBObjCMatcher { actualExpression, failureMessage in - return try! beNil().matches(actualExpression, failureMessage: failureMessage) + return try beNil().matches(actualExpression, failureMessage: failureMessage) } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift index f5bf22a..a9dbc28 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeVoid.swift @@ -2,10 +2,9 @@ import Foundation /// A Nimble matcher that succeeds when the actual value is Void. public func beVoid() -> Predicate<()> { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "be void" + return Predicate.simpleNilable("be void") { actualExpression in let actualValue: ()? = try actualExpression.evaluate() - return actualValue != nil + return PredicateStatus(bool: actualValue != nil) } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift index c2ab568..a013f9f 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/BeginWith.swift @@ -46,13 +46,13 @@ public func beginWith(_ startingSubstring: String) -> Predicate { extension NMBObjCMatcher { @objc public class func beginWithMatcher(_ expected: Any) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = try! actualExpression.evaluate() + let actual = try actualExpression.evaluate() if (actual as? String) != nil { let expr = actualExpression.cast { $0 as? String } - return try! beginWith(expected as! String).matches(expr, failureMessage: failureMessage) + return try beginWith(expected as! String).matches(expr, failureMessage: failureMessage) } else { let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return try! beginWith(expected).matches(expr, failureMessage: failureMessage) + return try beginWith(expected).matches(expr, failureMessage: failureMessage) } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift index f1afb72..2c84c5c 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/Contain.swift @@ -8,15 +8,15 @@ public func contain(_ items: T...) -> Predicate public func contain(_ items: [T]) -> Predicate where S.Iterator.Element == T { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "contain <\(arrayAsString(items))>" + return Predicate.simple("contain <\(arrayAsString(items))>") { actualExpression in if let actual = try actualExpression.evaluate() { - return items.all { + let matches = items.all { return actual.contains($0) } + return PredicateStatus(bool: matches) } - return false - }.requireNonNil + return .fail + } } /// A Nimble matcher that succeeds when the actual string contains the expected substring. @@ -25,16 +25,16 @@ public func contain(_ substrings: String...) -> Predicate { } public func contain(_ substrings: [String]) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "contain <\(arrayAsString(substrings))>" + return Predicate.simple("contain <\(arrayAsString(substrings))>") { actualExpression in if let actual = try actualExpression.evaluate() { - return substrings.all { + let matches = substrings.all { let range = actual.range(of: $0) return range != nil && !range!.isEmpty } + return PredicateStatus(bool: matches) } - return false - }.requireNonNil + return .fail + } } /// A Nimble matcher that succeeds when the actual string contains the expected substring. @@ -43,13 +43,13 @@ public func contain(_ substrings: NSString...) -> Predicate { } public func contain(_ substrings: [NSString]) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "contain <\(arrayAsString(substrings))>" + return Predicate.simple("contain <\(arrayAsString(substrings))>") { actualExpression in if let actual = try actualExpression.evaluate() { - return substrings.all { actual.range(of: $0.description).length != 0 } + let matches = substrings.all { actual.range(of: $0.description).length != 0 } + return PredicateStatus(bool: matches) } - return false - }.requireNonNil + return .fail + } } /// A Nimble matcher that succeeds when the actual collection contains the expected object. @@ -58,13 +58,13 @@ public func contain(_ items: Any?...) -> Predicate { } public func contain(_ items: [Any?]) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "contain <\(arrayAsString(items))>" - guard let actual = try actualExpression.evaluate() else { return false } - return items.all { item in - return item != nil && actual.contains(item!) + return Predicate.simple("contain <\(arrayAsString(items))>") { actualExpression in + guard let actual = try actualExpression.evaluate() else { return .fail } + let matches = items.all { item in + return item.map { actual.contains($0) } ?? false } - }.requireNonNil + return PredicateStatus(bool: matches) + } } #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) @@ -72,16 +72,16 @@ extension NMBObjCMatcher { @objc public class func containMatcher(_ expected: [NSObject]) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() + let actualValue = try actualExpression.evaluate() if let value = actualValue as? NMBContainer { let expr = Expression(expression: ({ value as NMBContainer }), location: location) // A straightforward cast on the array causes this to crash, so we have to cast the individual items let expectedOptionals: [Any?] = expected.map({ $0 as Any? }) - return try! contain(expectedOptionals).matches(expr, failureMessage: failureMessage) + return try contain(expectedOptionals).matches(expr, failureMessage: failureMessage) } else if let value = actualValue as? NSString { let expr = Expression(expression: ({ value as String }), location: location) - return try! contain(expected as! [String]).matches(expr, failureMessage: failureMessage) + return try contain(expected as! [String]).matches(expr, failureMessage: failureMessage) } else if actualValue != nil { // swiftlint:disable:next line_length failureMessage.postfixMessage = "contain <\(arrayAsString(expected))> (only works for NSArrays, NSSets, NSHashTables, and NSStrings)" diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift index ae0d854..8a23a6c 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/ContainElementSatisfying.swift @@ -2,34 +2,33 @@ import Foundation public func containElementSatisfying(_ predicate: @escaping ((T) -> Bool), _ predicateDescription: String = "") -> Predicate where S.Iterator.Element == T { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.actualValue = nil - + return Predicate.define { actualExpression in + let message: ExpectationMessage if predicateDescription == "" { - failureMessage.postfixMessage = "find object in collection that satisfies predicate" + message = .expectedTo("find object in collection that satisfies predicate") } else { - failureMessage.postfixMessage = "find object in collection \(predicateDescription)" + message = .expectedTo("find object in collection \(predicateDescription)") } if let sequence = try actualExpression.evaluate() { for object in sequence { if predicate(object) { - return true + return PredicateResult(bool: true, message: message) } } - return false + return PredicateResult(bool: false, message: message) } - return false - }.requireNonNil + return PredicateResult(status: .fail, message: message) + } } #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { @objc public class func containElementSatisfyingMatcher(_ predicate: @escaping ((NSObject) -> Bool)) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let value = try! actualExpression.evaluate() + let value = try actualExpression.evaluate() guard let enumeration = value as? NSFastEnumeration else { // swiftlint:disable:next line_length failureMessage.postfixMessage = "containElementSatisfying must be provided an NSFastEnumeration object" @@ -51,8 +50,7 @@ public func containElementSatisfying(_ predicate: @escaping ((T) } failureMessage.actualValue = nil - failureMessage.postfixMessage = "" - failureMessage.to = "to find object in collection that satisfies predicate" + failureMessage.postfixMessage = "find object in collection that satisfies predicate" return false } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift index a6f9f91..80a06ca 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/EndWith.swift @@ -4,9 +4,7 @@ import Foundation /// is equal to the expected value. public func endWith(_ endingElement: T) -> Predicate where S.Iterator.Element == T { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "end with <\(endingElement)>" - + return Predicate.simple("end with <\(endingElement)>") { actualExpression in if let actualValue = try actualExpression.evaluate() { var actualGenerator = actualValue.makeIterator() var lastItem: T? @@ -16,55 +14,53 @@ public func endWith(_ endingElement: T) -> Predicate< item = actualGenerator.next() } while(item != nil) - return lastItem == endingElement + return PredicateStatus(bool: lastItem == endingElement) } - return false - }.requireNonNil + return .fail + } } /// A Nimble matcher that succeeds when the actual collection's last element /// is equal to the expected object. public func endWith(_ endingElement: Any) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "end with <\(endingElement)>" - guard let collection = try actualExpression.evaluate() else { return false } - guard collection.count > 0 else { return false } + return Predicate.simple("end with <\(endingElement)>") { actualExpression in + guard let collection = try actualExpression.evaluate() else { return .fail } + guard collection.count > 0 else { return PredicateStatus(bool: false) } #if os(Linux) guard let collectionValue = collection.object(at: collection.count - 1) as? NSObject else { - return false + return .fail } #else let collectionValue = collection.object(at: collection.count - 1) as AnyObject #endif - return collectionValue.isEqual(endingElement) - }.requireNonNil + return PredicateStatus(bool: collectionValue.isEqual(endingElement)) + } } /// A Nimble matcher that succeeds when the actual string contains the expected substring /// where the expected substring's location is the actual string's length minus the /// expected substring's length. public func endWith(_ endingSubstring: String) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "end with <\(endingSubstring)>" + return Predicate.simple("end with <\(endingSubstring)>") { actualExpression in if let collection = try actualExpression.evaluate() { - return collection.hasSuffix(endingSubstring) + return PredicateStatus(bool: collection.hasSuffix(endingSubstring)) } - return false - }.requireNonNil + return .fail + } } #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { @objc public class func endWithMatcher(_ expected: Any) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - let actual = try! actualExpression.evaluate() + let actual = try actualExpression.evaluate() if (actual as? String) != nil { let expr = actualExpression.cast { $0 as? String } - return try! endWith(expected as! String).matches(expr, failureMessage: failureMessage) + return try endWith(expected as! String).matches(expr, failureMessage: failureMessage) } else { let expr = actualExpression.cast { $0 as? NMBOrderedCollection } - return try! endWith(expected).matches(expr, failureMessage: failureMessage) + return try endWith(expected).matches(expr, failureMessage: failureMessage) } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift index 9467154..5f26f49 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/Equal.swift @@ -212,8 +212,8 @@ public func !=(lhs: Expectation<[T: C]>, rhs: [T: C]?) { #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { @objc public class func equalMatcher(_ expected: NSObject) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in - return try! equal(expected).matches(actualExpression, failureMessage: failureMessage) + return NMBPredicate { actualExpression in + return try equal(expected).satisfies(actualExpression).toObjectiveC() } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift index 93335a8..3529da8 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/HaveCount.swift @@ -8,33 +8,39 @@ import Foundation /// A Nimble matcher that succeeds when the actual Collection's count equals /// the expected value public func haveCount(_ expectedValue: T.IndexDistance) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + return Predicate.define { actualExpression in if let actualValue = try actualExpression.evaluate() { - // swiftlint:disable:next line_length - failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" + let message = ExpectationMessage + .expectedCustomValueTo( + "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))", + "\(actualValue.count)" + ) + .appended(details: "Actual Value: \(stringify(actualValue))") + let result = expectedValue == actualValue.count - failureMessage.actualValue = "\(actualValue.count)" - failureMessage.extendedMessage = "Actual Value: \(stringify(actualValue))" - return result + return PredicateResult(bool: result, message: message) } else { - return false + return PredicateResult(status: .fail, message: .fail("")) } - }.requireNonNil + } } /// A Nimble matcher that succeeds when the actual collection's count equals /// the expected value public func haveCount(_ expectedValue: Int) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + return Predicate { actualExpression in if let actualValue = try actualExpression.evaluate() { - // swiftlint:disable:next line_length - failureMessage.postfixMessage = "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))" + let message = ExpectationMessage + .expectedCustomValueTo( + "have \(prettyCollectionType(actualValue)) with count \(stringify(expectedValue))", + "\(actualValue.count)" + ) + .appended(details: "Actual Value: \(stringify(actualValue))") + let result = expectedValue == actualValue.count - failureMessage.actualValue = "\(actualValue.count)" - failureMessage.extendedMessage = "Actual Value: \(stringify(actualValue))" - return result + return PredicateResult(bool: result, message: message) } else { - return false + return PredicateResult(status: .fail, message: .fail("")) } } } @@ -44,10 +50,10 @@ extension NMBObjCMatcher { @objc public class func haveCountMatcher(_ expected: NSNumber) -> NMBObjCMatcher { return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in let location = actualExpression.location - let actualValue = try! actualExpression.evaluate() + let actualValue = try actualExpression.evaluate() if let value = actualValue as? NMBCollection { let expr = Expression(expression: ({ value as NMBCollection}), location: location) - return try! haveCount(expected.intValue).matches(expr, failureMessage: failureMessage) + return try haveCount(expected.intValue).matches(expr, failureMessage: failureMessage) } else if let actualValue = actualValue { failureMessage.postfixMessage = "get type of NSArray, NSSet, NSDictionary, or NSHashTable" failureMessage.actualValue = "\(String(describing: type(of: actualValue)))" diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/Match.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/Match.swift index 1e5762f..f738daf 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/Match.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/Match.swift @@ -3,26 +3,25 @@ import Foundation /// A Nimble matcher that succeeds when the actual string satisfies the regular expression /// described by the expected string. public func match(_ expectedValue: String?) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - failureMessage.postfixMessage = "match <\(stringify(expectedValue))>" - + return Predicate.simple("match <\(stringify(expectedValue))>") { actualExpression in if let actual = try actualExpression.evaluate() { if let regexp = expectedValue { - return actual.range(of: regexp, options: .regularExpression) != nil + let bool = actual.range(of: regexp, options: .regularExpression) != nil + return PredicateStatus(bool: bool) } } - return false - }.requireNonNil + return .fail + } } #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) extension NMBObjCMatcher { @objc public class func matchMatcher(_ expected: NSString) -> NMBMatcher { - return NMBObjCMatcher(canMatchNil: false) { actualExpression, failureMessage in + return NMBPredicate { actualExpression in let actual = actualExpression.cast { $0 as? String } - return try! match(expected.description).matches(actual, failureMessage: failureMessage) + return try match(expected.description).satisfies(actual).toObjectiveC() } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift index 9c86fb7..4ad71d4 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/MatchError.swift @@ -6,16 +6,24 @@ import Foundation /// Errors are tried to be compared by their implementation of Equatable, /// otherwise they fallback to comparison by _domain and _code. public func matchError(_ error: T) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - let actualError: Error? = try actualExpression.evaluate() + return Predicate.define { actualExpression in + let actualError = try actualExpression.evaluate() + + let failureMessage = FailureMessage() + setFailureMessageForError( + failureMessage, + postfixMessageVerb: "match", + actualError: actualError, + error: error + ) - setFailureMessageForError(failureMessage, postfixMessageVerb: "match", actualError: actualError, error: error) var matches = false if let actualError = actualError, errorMatchesExpectedError(actualError, expectedError: error) { matches = true } - return matches - }.requireNonNil + + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + } } /// A Nimble matcher that succeeds when the actual expression evaluates to an @@ -24,35 +32,45 @@ public func matchError(_ error: T) -> Predicate { /// Errors are tried to be compared by their implementation of Equatable, /// otherwise they fallback to comparision by _domain and _code. public func matchError(_ error: T) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - let actualError: Error? = try actualExpression.evaluate() + return Predicate.define { actualExpression in + let actualError = try actualExpression.evaluate() - setFailureMessageForError(failureMessage, postfixMessageVerb: "match", actualError: actualError, error: error) + let failureMessage = FailureMessage() + setFailureMessageForError( + failureMessage, + postfixMessageVerb: "match", + actualError: actualError, + error: error + ) var matches = false if let actualError = actualError as? T, error == actualError { matches = true } - return matches - }.requireNonNil + + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + } } /// A Nimble matcher that succeeds when the actual expression evaluates to an /// error of the specified type public func matchError(_ errorType: T.Type) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - let actualError: Error? = try actualExpression.evaluate() + return Predicate.define { actualExpression in + let actualError = try actualExpression.evaluate() + let failureMessage = FailureMessage() setFailureMessageForError( failureMessage, postfixMessageVerb: "match", actualError: actualError, errorType: errorType ) + var matches = false if actualError as? T != nil { matches = true } - return matches - }.requireNonNil + + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) + } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift index fff3c77..6f8f103 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/MatcherProtocols.swift @@ -31,8 +31,8 @@ extension Matcher { #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) /// Objective-C interface to the Swift variant of Matcher. @objc public protocol NMBMatcher { - func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool - func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool + func matches(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool + func doesNotMatch(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool } #endif @@ -46,8 +46,8 @@ public protocol NMBContainer { //extension NSHashTable : NMBContainer {} // Corelibs Foundation does not include this class yet #endif -extension NSArray : NMBContainer {} -extension NSSet : NMBContainer {} +extension NSArray: NMBContainer {} +extension NSSet: NMBContainer {} /// Protocol for types that support only beEmpty(), haveCount() matchers public protocol NMBCollection { @@ -55,32 +55,32 @@ public protocol NMBCollection { } #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -extension NSHashTable : NMBCollection {} // Corelibs Foundation does not include these classes yet -extension NSMapTable : NMBCollection {} +extension NSHashTable: NMBCollection {} // Corelibs Foundation does not include these classes yet +extension NSMapTable: NMBCollection {} #endif -extension NSSet : NMBCollection {} -extension NSIndexSet : NMBCollection {} -extension NSDictionary : NMBCollection {} +extension NSSet: NMBCollection {} +extension NSIndexSet: NMBCollection {} +extension NSDictionary: NMBCollection {} /// Protocol for types that support beginWith(), endWith(), beEmpty() matchers public protocol NMBOrderedCollection: NMBCollection { func object(at index: Int) -> Any } -extension NSArray : NMBOrderedCollection {} +extension NSArray: NMBOrderedCollection {} public protocol NMBDoubleConvertible { var doubleValue: CDouble { get } } -extension Double : NMBDoubleConvertible { +extension Double: NMBDoubleConvertible { public var doubleValue: CDouble { return self } } -extension Float : NMBDoubleConvertible { +extension Float: NMBDoubleConvertible { public var doubleValue: CDouble { return CDouble(self) } @@ -92,7 +92,7 @@ extension CGFloat: NMBDoubleConvertible { } } -extension NSNumber : NMBDoubleConvertible { +extension NSNumber: NMBDoubleConvertible { } private let dateFormatter: DateFormatter = { @@ -142,12 +142,12 @@ public protocol NMBComparable { } #endif -extension NSNumber : NMBComparable { +extension NSNumber: NMBComparable { public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult { return compare(otherObject as! NSNumber) } } -extension NSString : NMBComparable { +extension NSString: NMBComparable { public func NMB_compare(_ otherObject: NMBComparable!) -> ComparisonResult { return compare(otherObject as! String) } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift index 8288bb0..16af011 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/PostNotification.swift @@ -1,5 +1,32 @@ import Foundation +// A workaround to SR-6419. +extension NotificationCenter { +#if !(os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) + #if swift(>=4.0) + #if swift(>=4.0.2) + #else + func addObserver(forName name: Notification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol { + return addObserver(forName: name, object: obj, queue: queue, usingBlock: block) + } + #endif + #elseif swift(>=3.2) + #if swift(>=3.2.2) + #else + // swiftlint:disable:next line_length + func addObserver(forName name: Notification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol { + return addObserver(forName: name, object: obj, queue: queue, usingBlock: block) + } + #endif + #else + // swiftlint:disable:next line_length + func addObserver(forName name: Notification.Name?, object obj: Any?, queue: OperationQueue?, using block: @escaping (Notification) -> Void) -> NSObjectProtocol { + return addObserver(forName: name, object: obj, queue: queue, usingBlock: block) + } + #endif +#endif +} + internal class NotificationCollector { private(set) var observedNotifications: [Notification] private let notificationCenter: NotificationCenter @@ -15,10 +42,11 @@ internal class NotificationCollector { } func startObserving() { - self.token = self.notificationCenter.addObserver(forName: nil, object: nil, queue: nil) { [weak self] n in + // swiftlint:disable:next line_length + self.token = self.notificationCenter.addObserver(forName: nil, object: nil, queue: nil, using: { [weak self] n in // linux-swift gets confused by .append(n) self?.observedNotifications.append(n) - } + }) } deinit { @@ -46,7 +74,8 @@ public func postNotifications( let collector = NotificationCollector(notificationCenter: center) collector.startObserving() var once: Bool = false - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + + return Predicate { actualExpression in let collectorNotificationsExpression = Expression(memoizedExpression: { _ in return collector.observedNotifications }, location: actualExpression.location, withoutCaching: true) @@ -57,12 +86,13 @@ public func postNotifications( _ = try actualExpression.evaluate() } + let failureMessage = FailureMessage() let match = try notificationsMatcher.matches(collectorNotificationsExpression, failureMessage: failureMessage) if collector.observedNotifications.isEmpty { failureMessage.actualValue = "no notifications" } else { failureMessage.actualValue = "<\(stringify(collector.observedNotifications))>" } - return match + return PredicateResult(bool: match, message: failureMessage.toExpectationMessage()) } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift index e48d164..19fd322 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/Predicate.swift @@ -82,8 +82,8 @@ extension Predicate { } } -// Question: Should this be exposed? It's safer to not for now and decide later. -internal enum ExpectationStyle { +// The Expectation style intended for comparison to a PredicateStatus. +public enum ExpectationStyle { case toMatch, toNotMatch } @@ -91,9 +91,9 @@ internal enum ExpectationStyle { /// predicate. public struct PredicateResult { /// Status indicates if the predicate matches, does not match, or fails. - var status: PredicateStatus + public var status: PredicateStatus /// The error message that can be displayed if it does not match - var message: ExpectationMessage + public var message: ExpectationMessage /// Constructs a new PredicateResult with a given status and error message public init(status: PredicateStatus, message: ExpectationMessage) { @@ -108,7 +108,7 @@ public struct PredicateResult { } /// Converts the result to a boolean based on what the expectation intended - internal func toBoolean(expectation style: ExpectationStyle) -> Bool { + public func toBoolean(expectation style: ExpectationStyle) -> Bool { return status.toBoolean(expectation: style) } } @@ -242,7 +242,7 @@ extension Predicate { } #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) -public typealias PredicateBlock = (_ actualExpression: Expression) -> NMBPredicateResult +public typealias PredicateBlock = (_ actualExpression: Expression) throws -> NMBPredicateResult public class NMBPredicate: NSObject { private let predicate: PredicateBlock @@ -251,20 +251,24 @@ public class NMBPredicate: NSObject { self.predicate = predicate } - func satisfies(_ expression: @escaping () -> NSObject!, location: SourceLocation) -> NMBPredicateResult { + func satisfies(_ expression: @escaping () throws -> NSObject?, location: SourceLocation) -> NMBPredicateResult { let expr = Expression(expression: expression, location: location) - return self.predicate(expr) + do { + return try self.predicate(expr) + } catch let error { + return PredicateResult(status: .fail, message: .fail("unexpected error thrown: <\(error)>")).toObjectiveC() + } } } extension NMBPredicate: NMBMatcher { - public func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + public func matches(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let result = satisfies(actualBlock, location: location).toSwift() result.message.update(failureMessage: failureMessage) return result.status.toBoolean(expectation: .toMatch) } - public func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + public func doesNotMatch(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let result = satisfies(actualBlock, location: location).toSwift() result.message.update(failureMessage: failureMessage) return result.status.toBoolean(expectation: .toNotMatch) diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift index 60553bd..459d2cd 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/RaisesException.swift @@ -17,8 +17,7 @@ public func raiseException( reason: String? = nil, userInfo: NSDictionary? = nil, closure: ((NSException) -> Void)? = nil) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - + return Predicate { actualExpression in var exception: NSException? let capture = NMBExceptionCapture(handler: ({ e in exception = e @@ -26,9 +25,9 @@ public func raiseException( capture.tryBlock { _ = try! actualExpression.evaluate() - return } + let failureMessage = FailureMessage() setFailureMessageForException( failureMessage, exception: exception, @@ -37,13 +36,15 @@ public func raiseException( userInfo: userInfo, closure: closure ) - return exceptionMatchesNonNilFieldsOrClosure( + + let matches = exceptionMatchesNonNilFieldsOrClosure( exception, named: named, reason: reason, userInfo: userInfo, closure: closure ) + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) } } @@ -129,19 +130,24 @@ public class NMBObjCRaiseExceptionMatcher: NSObject, NMBMatcher { _block = block } - @objc public func matches(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + @objc public func matches(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { let block: () -> Any? = ({ _ = actualBlock(); return nil }) let expr = Expression(expression: block, location: location) - return try! raiseException( - named: _name, - reason: _reason, - userInfo: _userInfo, - closure: _block - ).matches(expr, failureMessage: failureMessage) + do { + return try raiseException( + named: _name, + reason: _reason, + userInfo: _userInfo, + closure: _block + ).matches(expr, failureMessage: failureMessage) + } catch let error { + failureMessage.stringValue = "unexpected error thrown: <\(error)>" + return false + } } - @objc public func doesNotMatch(_ actualBlock: @escaping () -> NSObject!, failureMessage: FailureMessage, location: SourceLocation) -> Bool { + @objc public func doesNotMatch(_ actualBlock: @escaping () -> NSObject?, failureMessage: FailureMessage, location: SourceLocation) -> Bool { return !matches(actualBlock, failureMessage: failureMessage, location: location) } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift new file mode 100644 index 0000000..2b9eb21 --- /dev/null +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAllOf.swift @@ -0,0 +1,76 @@ +import Foundation + +/// A Nimble matcher that succeeds when the actual value matches with all of the matchers +/// provided in the variable list of matchers. +public func satisfyAllOf(_ matchers: U...) -> Predicate + where U: Matcher, U.ValueType == T { + return satisfyAllOf(matchers.map { $0.predicate }) +} + +internal func satisfyAllOf(_ predicates: [Predicate]) -> Predicate { + return Predicate.define { actualExpression in + var postfixMessages = [String]() + var matches = true + for predicate in predicates { + let result = try predicate.satisfies(actualExpression) + if result.toBoolean(expectation: .toNotMatch) { + matches = false + } + postfixMessages.append("{\(result.message.expectedMessage)}") + } + + var msg: ExpectationMessage + if let actualValue = try actualExpression.evaluate() { + msg = .expectedCustomValueTo( + "match all of: " + postfixMessages.joined(separator: ", and "), + "\(actualValue)" + ) + } else { + msg = .expectedActualValueTo( + "match all of: " + postfixMessages.joined(separator: ", and ") + ) + } + + return PredicateResult(bool: matches, message: msg) + } +} + +public func && (left: Predicate, right: Predicate) -> Predicate { + return satisfyAllOf(left, right) +} + +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) +extension NMBObjCMatcher { + @objc public class func satisfyAllOfMatcher(_ matchers: [NMBMatcher]) -> NMBPredicate { + return NMBPredicate { actualExpression in + if matchers.isEmpty { + return NMBPredicateResult( + status: NMBPredicateStatus.fail, + message: NMBExpectationMessage( + fail: "satisfyAllOf must be called with at least one matcher" + ) + ) + } + + var elementEvaluators = [Predicate]() + for matcher in matchers { + let elementEvaluator = Predicate { expression in + if let predicate = matcher as? NMBPredicate { + // swiftlint:disable:next line_length + return predicate.satisfies({ try expression.evaluate() }, location: actualExpression.location).toSwift() + } else { + let failureMessage = FailureMessage() + // swiftlint:disable:next line_length + let success = matcher.matches({ try! expression.evaluate() }, failureMessage: failureMessage, location: actualExpression.location) + return PredicateResult(bool: success, message: failureMessage.toExpectationMessage()) + } + } + + elementEvaluators.append(elementEvaluator) + } + + return try satisfyAllOf(elementEvaluators).satisfies(actualExpression).toObjectiveC() + } + } +} +#endif diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift index d02a0ff..57b15fd 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/SatisfyAnyOf.swift @@ -4,33 +4,11 @@ import Foundation /// provided in the variable list of matchers. public func satisfyAnyOf(_ matchers: U...) -> Predicate where U: Matcher, U.ValueType == T { - return satisfyAnyOf(matchers) -} - -/// Deprecated. Please use `satisfyAnyOf(_) -> Predicate` instead. -internal func satisfyAnyOf(_ matchers: [U]) -> Predicate - where U: Matcher, U.ValueType == T { - return NonNilMatcherFunc { actualExpression, failureMessage in - let postfixMessages = NSMutableArray() - var matches = false - for matcher in matchers { - if try matcher.matches(actualExpression, failureMessage: failureMessage) { - matches = true - } - postfixMessages.add(NSString(string: "{\(failureMessage.postfixMessage)}")) - } - - failureMessage.postfixMessage = "match one of: " + postfixMessages.componentsJoined(by: ", or ") - if let actualValue = try actualExpression.evaluate() { - failureMessage.actualValue = "\(actualValue)" - } - - return matches - }.predicate + return satisfyAnyOf(matchers.map { $0.predicate }) } internal func satisfyAnyOf(_ predicates: [Predicate]) -> Predicate { - return Predicate { actualExpression in + return Predicate.define { actualExpression in var postfixMessages = [String]() var matches = false for predicate in predicates { @@ -53,11 +31,8 @@ internal func satisfyAnyOf(_ predicates: [Predicate]) -> Predicate { ) } - return PredicateResult( - status: PredicateStatus(bool: matches), - message: msg - ) - }.requireNonNil + return PredicateResult(bool: matches, message: msg) + } } public func || (left: Predicate, right: Predicate) -> Predicate { @@ -90,7 +65,7 @@ extension NMBObjCMatcher { let elementEvaluator = Predicate { expression in if let predicate = matcher as? NMBPredicate { // swiftlint:disable:next line_length - return predicate.satisfies({ try! expression.evaluate() }, location: actualExpression.location).toSwift() + return predicate.satisfies({ try expression.evaluate() }, location: actualExpression.location).toSwift() } else { let failureMessage = FailureMessage() // swiftlint:disable:next line_length @@ -102,7 +77,7 @@ extension NMBObjCMatcher { elementEvaluators.append(elementEvaluator) } - return try! satisfyAnyOf(elementEvaluators).satisfies(actualExpression).toObjectiveC() + return try satisfyAnyOf(elementEvaluators).satisfies(actualExpression).toObjectiveC() } } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift index a530c60..035c744 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowAssertion.swift @@ -1,13 +1,11 @@ import Foundation public func throwAssertion() -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in + return Predicate { actualExpression in #if arch(x86_64) && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE - failureMessage.postfixMessage = "throw an assertion" - failureMessage.actualValue = nil - - var succeeded = true + let message = ExpectationMessage.expectedTo("throw an assertion") + var actualError: Error? let caughtException: BadInstructionException? = catchBadInstruction { #if os(tvOS) if !NimbleEnvironment.activeInstance.suppressTVOSAssertionWarning { @@ -27,21 +25,19 @@ public func throwAssertion() -> Predicate { #endif do { try actualExpression.evaluate() - } catch let error { - succeeded = false - failureMessage.postfixMessage += "; threw error instead <\(error)>" + } catch { + actualError = error } } - if !succeeded { - return false - } - - if caughtException == nil { - return false + if let actualError = actualError { + return PredicateResult( + bool: false, + message: message.appended(message: "; threw error instead <\(actualError)>") + ) + } else { + return PredicateResult(bool: caughtException != nil, message: message) } - - return true #elseif SWIFT_PACKAGE fatalError("The throwAssertion Nimble matcher does not currently support Swift CLI." + " You can silence this error by placing the test case inside an #if !SWIFT_PACKAGE" + diff --git a/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift b/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift index 872ca5c..d294ba3 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Matchers/ThrowError.swift @@ -12,22 +12,19 @@ import Foundation /// nil arguments indicates that the matcher should not attempt to match against /// that parameter. public func throwError() -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - + return Predicate { actualExpression in var actualError: Error? do { _ = try actualExpression.evaluate() - } catch let catchedError { - actualError = catchedError + } catch { + actualError = error } - failureMessage.postfixMessage = "throw any error" if let actualError = actualError { - failureMessage.actualValue = "<\(actualError)>" + return PredicateResult(bool: true, message: .expectedCustomValueTo("throw any error", "<\(actualError)>")) } else { - failureMessage.actualValue = "no error" + return PredicateResult(bool: false, message: .expectedCustomValueTo("throw any error", "no error")) } - return actualError != nil } } @@ -43,15 +40,15 @@ public func throwError() -> Predicate { /// nil arguments indicates that the matcher should not attempt to match against /// that parameter. public func throwError(_ error: T, closure: ((Error) -> Void)? = nil) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - + return Predicate { actualExpression in var actualError: Error? do { _ = try actualExpression.evaluate() - } catch let catchedError { - actualError = catchedError + } catch { + actualError = error } + let failureMessage = FailureMessage() setFailureMessageForError( failureMessage, actualError: actualError, @@ -59,20 +56,23 @@ public func throwError(_ error: T, closure: ((Error) -> Void)? = nil) errorType: nil, closure: closure ) + var matches = false if let actualError = actualError, errorMatchesExpectedError(actualError, expectedError: error) { matches = true + if let closure = closure { let assertions = gatherFailingExpectations { closure(actualError) } let messages = assertions.map { $0.message } - if messages.count > 0 { + if !messages.isEmpty { matches = false } } } - return matches + + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) } } @@ -88,15 +88,15 @@ public func throwError(_ error: T, closure: ((Error) -> Void)? = nil) /// nil arguments indicates that the matcher should not attempt to match against /// that parameter. public func throwError(_ error: T, closure: ((T) -> Void)? = nil) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - + return Predicate { actualExpression in var actualError: Error? do { _ = try actualExpression.evaluate() - } catch let catchedError { - actualError = catchedError + } catch { + actualError = error } + let failureMessage = FailureMessage() setFailureMessageForError( failureMessage, actualError: actualError, @@ -104,6 +104,7 @@ public func throwError(_ error: T, closure: ((T) -> Void)? errorType: nil, closure: closure ) + var matches = false if let actualError = actualError as? T, error == actualError { matches = true @@ -113,12 +114,13 @@ public func throwError(_ error: T, closure: ((T) -> Void)? closure(actualError) } let messages = assertions.map { $0.message } - if messages.count > 0 { + if !messages.isEmpty { matches = false } } } - return matches + + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) } } @@ -136,15 +138,15 @@ public func throwError(_ error: T, closure: ((T) -> Void)? public func throwError( errorType: T.Type, closure: ((T) -> Void)? = nil) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - + return Predicate { actualExpression in var actualError: Error? do { _ = try actualExpression.evaluate() - } catch let catchedError { - actualError = catchedError + } catch { + actualError = error } + let failureMessage = FailureMessage() setFailureMessageForError( failureMessage, actualError: actualError, @@ -152,16 +154,18 @@ public func throwError( errorType: errorType, closure: closure ) + var matches = false if let actualError = actualError { matches = true + if let actualError = actualError as? T { if let closure = closure { let assertions = gatherFailingExpectations { closure(actualError) } let messages = assertions.map { $0.message } - if messages.count > 0 { + if !messages.isEmpty { matches = false } } @@ -176,14 +180,14 @@ public func throwError( } } let messages = assertions.map { $0.message } - if messages.count > 0 { + if !messages.isEmpty { matches = false } } } } - return matches + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) } } @@ -195,15 +199,15 @@ public func throwError( /// /// The closure only gets called when an error was thrown. public func throwError(closure: @escaping ((Error) -> Void)) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - + return Predicate { actualExpression in var actualError: Error? do { _ = try actualExpression.evaluate() - } catch let catchedError { - actualError = catchedError + } catch { + actualError = error } + let failureMessage = FailureMessage() setFailureMessageForError(failureMessage, actualError: actualError, closure: closure) var matches = false @@ -214,11 +218,12 @@ public func throwError(closure: @escaping ((Error) -> Void)) -> Predicate { closure(actualError) } let messages = assertions.map { $0.message } - if messages.count > 0 { + if !messages.isEmpty { matches = false } } - return matches + + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) } } @@ -230,15 +235,15 @@ public func throwError(closure: @escaping ((Error) -> Void)) -> Predicate { /// /// The closure only gets called when an error was thrown. public func throwError(closure: @escaping ((T) -> Void)) -> Predicate { - return Predicate.fromDeprecatedClosure { actualExpression, failureMessage in - + return Predicate { actualExpression in var actualError: Error? do { _ = try actualExpression.evaluate() - } catch let catchedError { - actualError = catchedError + } catch { + actualError = error } + let failureMessage = FailureMessage() setFailureMessageForError(failureMessage, actualError: actualError, closure: closure) var matches = false @@ -249,10 +254,11 @@ public func throwError(closure: @escaping ((T) -> Void)) -> Predicate< closure(actualError) } let messages = assertions.map { $0.message } - if messages.count > 0 { + if !messages.isEmpty { matches = false } } - return matches + + return PredicateResult(bool: matches, message: failureMessage.toExpectationMessage()) } } diff --git a/Example/Pods/Nimble/Sources/Nimble/Nimble.h b/Example/Pods/Nimble/Sources/Nimble/Nimble.h index bd45c5d..2bbc693 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Nimble.h +++ b/Example/Pods/Nimble/Sources/Nimble/Nimble.h @@ -3,7 +3,11 @@ #import "NMBStringify.h" #import "DSL.h" -#import "CwlPreconditionTesting.h" +#if TARGET_OS_TV + #import "CwlPreconditionTesting_POSIX.h" +#else + #import "CwlPreconditionTesting.h" +#endif FOUNDATION_EXPORT double NimbleVersionNumber; FOUNDATION_EXPORT const unsigned char NimbleVersionString[]; diff --git a/Example/Pods/Nimble/Sources/Nimble/Utils/Async.swift b/Example/Pods/Nimble/Sources/Nimble/Utils/Await.swift similarity index 98% rename from Example/Pods/Nimble/Sources/Nimble/Utils/Async.swift rename to Example/Pods/Nimble/Sources/Nimble/Utils/Await.swift index c77a8fc..cb672ad 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Utils/Async.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Utils/Await.swift @@ -263,7 +263,11 @@ internal class AwaitPromiseBuilder { self.trigger.timeoutSource.resume() while self.promise.asyncResult.isIncomplete() { // Stopping the run loop does not work unless we run only 1 mode + #if swift(>=4.2) + _ = RunLoop.current.run(mode: .default, before: .distantFuture) + #else _ = RunLoop.current.run(mode: .defaultRunLoopMode, before: .distantFuture) + #endif } self.trigger.timeoutSource.cancel() diff --git a/Example/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift b/Example/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift index cd6de20..7c4d273 100644 --- a/Example/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift +++ b/Example/Pods/Nimble/Sources/Nimble/Utils/Stringers.swift @@ -144,7 +144,9 @@ extension Data: TestOutputStringConvertible { /// will return the result of constructing a string from the value. /// /// - SeeAlso: `TestOutputStringConvertible` -public func stringify(_ value: T) -> String { +public func stringify(_ value: T?) -> String { + guard let value = value else { return "nil" } + if let value = value as? TestOutputStringConvertible { return value.testDescription } @@ -156,14 +158,6 @@ public func stringify(_ value: T) -> String { return String(describing: value) } -/// -SeeAlso: `stringify(value: T)` -public func stringify(_ value: T?) -> String { - if let unboxed = value { - return stringify(unboxed) - } - return "nil" -} - #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) @objc public class NMBStringer: NSObject { @objc public class func stringify(_ obj: Any?) -> String { diff --git a/Example/Pods/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h b/Example/Pods/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h deleted file mode 100644 index 5d416e4..0000000 --- a/Example/Pods/Nimble/Sources/NimbleObjectiveC/CurrentTestCaseTracker.h +++ /dev/null @@ -1,9 +0,0 @@ -#import -#import - -SWIFT_CLASS("_TtC6Nimble22CurrentTestCaseTracker") -@interface CurrentTestCaseTracker : NSObject -+ (CurrentTestCaseTracker *)sharedInstance; -@end - -@interface CurrentTestCaseTracker (Register) @end diff --git a/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h b/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h index caa3f7c..9170541 100644 --- a/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h +++ b/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.h @@ -350,6 +350,12 @@ NIMBLE_EXPORT id NMB_satisfyAnyOfWithMatchers(id matchers); #define satisfyAnyOf(...) NMB_satisfyAnyOf(__VA_ARGS__) #endif +NIMBLE_EXPORT id NMB_satisfyAllOfWithMatchers(id matchers); +#define NMB_satisfyAllOf(...) NMB_satisfyAllOfWithMatchers(@[__VA_ARGS__]) +#ifndef NIMBLE_DISABLE_SHORT_SYNTAX +#define satisfyAllOf(...) NMB_satisfyAllOf(__VA_ARGS__) +#endif + // In order to preserve breakpoint behavior despite using macros to fill in __FILE__ and __LINE__, // define a builder that populates __FILE__ and __LINE__, and returns a block that takes timeout // and action arguments. See https://github.com/Quick/Quick/pull/185 for details. diff --git a/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m b/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m index 5a145b8..670415b 100644 --- a/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m +++ b/Example/Pods/Nimble/Sources/NimbleObjectiveC/DSL.m @@ -1,13 +1,10 @@ #import -#import - -SWIFT_CLASS("_TtC6Nimble7NMBWait") -@interface NMBWait : NSObject - -+ (void)untilTimeout:(NSTimeInterval)timeout file:(NSString *)file line:(NSUInteger)line action:(void (^ _Nonnull)(void (^ _Nonnull)(void)))action; -+ (void)untilFile:(NSString *)file line:(NSUInteger)line action:(void (^ _Nonnull)(void (^ _Nonnull)(void)))action; -@end +#if __has_include("Nimble-Swift.h") +#import "Nimble-Swift.h" +#else +#import +#endif NS_ASSUME_NONNULL_BEGIN @@ -141,6 +138,10 @@ NIMBLE_EXPORT void NMB_failWithMessage(NSString *msg, NSString *file, NSUInteger return [NMBObjCMatcher satisfyAnyOfMatcher:matchers]; } +NIMBLE_EXPORT id NMB_satisfyAllOfWithMatchers(id matchers) { + return [NMBObjCMatcher satisfyAllOfMatcher:matchers]; +} + NIMBLE_EXPORT NMBObjCRaiseExceptionMatcher *NMB_raiseException() { return [NMBObjCMatcher raiseExceptionMatcher]; } diff --git a/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m b/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m index 3381047..52684b7 100644 --- a/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m +++ b/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBExceptionCapture.m @@ -16,7 +16,7 @@ - (nonnull instancetype)initWithHandler:(void(^ _Nullable)(NSException * _Nonnul return self; } -- (void)tryBlock:(void(^ _Nonnull)(void))unsafeBlock { +- (void)tryBlock:(__attribute__((noescape)) void(^ _Nonnull)(void))unsafeBlock { @try { unsafeBlock(); } diff --git a/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.m b/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.m index 329d39a..31a80d6 100644 --- a/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.m +++ b/Example/Pods/Nimble/Sources/NimbleObjectiveC/NMBStringify.m @@ -1,5 +1,10 @@ #import "NMBStringify.h" + +#if __has_include("Nimble-Swift.h") +#import "Nimble-Swift.h" +#else #import +#endif NSString *_Nonnull NMBStringify(id _Nullable anyObject) { return [NMBStringer stringify:anyObject]; diff --git a/Example/Pods/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m b/Example/Pods/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m index 35f26fd..fa5030a 100644 --- a/Example/Pods/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m +++ b/Example/Pods/Nimble/Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m @@ -1,7 +1,12 @@ -#import "CurrentTestCaseTracker.h" #import #import +#if __has_include("Nimble-Swift.h") +#import "Nimble-Swift.h" +#else +#import +#endif + #pragma mark - Method Swizzling /// Swaps the implementations between two instance methods. diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 1b08c90..54252b5 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -7,760 +7,1056 @@ objects = { /* Begin PBXBuildFile section */ - 051B2AF789E6D4E648C099830025DED9 /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38838690C7FCB8A320C0F7580365CB8B /* CwlCatchBadInstruction.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 05EC946C9DC9AB0AFDC70D658BCC6C89 /* JellyShiftInPresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17D1D74DA804951335589CB7E1360987 /* JellyShiftInPresentation.swift */; }; - 0A2CA8B0DD7E300ABFCF1956E6B58248 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = F02A82F99C5626988794EEDB37318A12 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0CF49F861976DF018EA063C3FA60E955 /* JellyFadeInPresentationAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C6A3FF19A3070F637BA3EB207A58659 /* JellyFadeInPresentationAnimator.swift */; }; - 16409C737271C4F1D7FEEFB91E317D5A /* CwlPreconditionTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = FC004067434874641C7FD573C6D54FC8 /* CwlPreconditionTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17C8EE7DF3F57C8F99EAF63C6E61EA99 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCED5C53076B7249E95E0D1D43E1B985 /* FailureMessage.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 1A3E19B9F5EEB773C3BB61CA42F8BF62 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D7224D3F69BFCF084E13946CE3B7646 /* DSL.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 1E1CE28FFCCD7499620B47C910E9B9E9 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71C9C2C08177BF35A3FD0A747DADCDF9 /* BeLogical.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 1E1D6CE3D5CE567CA3BA6F660DED9C78 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C78BF27F3A2B7B1368FE2E4317B6557 /* DSL.swift */; }; - 1E94045D114B4B7C5684EE8810A03472 /* World.h in Headers */ = {isa = PBXBuildFile; fileRef = 129DA04B381B509DAEDD565711C5A0DA /* World.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 21E144ADA17DF11A68921A7990CF3F43 /* ExampleHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 301223B3EB74E21CDB1303C459B57231 /* ExampleHooks.swift */; }; - 22E9F6FA56858A5F7A5D664E5968ECB0 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = 728B660135AE89C557C10A6FCCB94D9B /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 23CDA1074E3D3E72D9CAF8E8FBD35DB2 /* JellySlideInPresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF3F337754E5DE1590D4DCE4E36AD91F /* JellySlideInPresentation.swift */; }; - 23DE64F6518B524DF9950850ED3A31FD /* Pods-Jelly_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D3FFF8B1DA954395FEB22B2010BA70AE /* Pods-Jelly_Example-dummy.m */; }; - 25D1805055756CAA69A167CA03B2465C /* ContainElementSatisfying.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC42EEC7E1FD4F0ED085C79F34477C8F /* ContainElementSatisfying.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 25D7312BBE513DAB0ACBC1814DDC7C86 /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 358C5CE9A3BF3A1365D22576DCE92C31 /* CwlDarwinDefinitions.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 2820703556A070F86B59613CAED93838 /* ErrorUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24FAED8BD878439BC32BE461165E4E08 /* ErrorUtility.swift */; }; - 296D08EA16B75022CAE82C89E93D3CA3 /* Jelly-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D5BA02A339BFAC598B13254A845929F /* Jelly-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 29A65FF7D1752DFFF87F5DC8F55CE859 /* ToSucceed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 731177567616F5D676C628DB89BB2BFC /* ToSucceed.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 29BA245B168F471ABEEA028C73621ABC /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = B38F7EB4258060BAA361D06EF1B16D9B /* Example.swift */; }; - 2AC13B3BCACAF47A4568AD59A0A526EA /* Callsite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20C9E93FDAF76CEA15A9E23CC159DED1 /* Callsite.swift */; }; - 2E6730CD6DFCFE1212EDE5343F2E099B /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A9D19719FFB71B0D47572AB1BA8E037 /* CwlCatchException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 2F20AB9F93BAF0466C6B8FCBED57383A /* JellyConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FDD084452EBDF969EBE029C72577A02 /* JellyConstants.swift */; }; - 2F2DA5BA5AE1FB074F387E97115F47D5 /* mach_excServer.h in Headers */ = {isa = PBXBuildFile; fileRef = C3FE50EC469768C3CD434A2E18D7E9B4 /* mach_excServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 306A88B4C9BC7D9734C4C0F49871C3C4 /* JellySlideInPresentationAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC6C9EB907A69CCE62EECC7E46F4F55E /* JellySlideInPresentationAnimator.swift */; }; - 31C39ED8CB1C9317F1F2840FC919662D /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3276DE715636F61DFFDE3B068F88418A /* PostNotification.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 32B38992751B96F21324BFC9923BFCBD /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6D0E06336A816BC0192B9FEC92119A /* AssertionDispatcher.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 33293482BBCD8CB337C47A0F519FB427 /* QuickSpecBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BA4794DD94D5DE6BFFFEEC72B8C43E3 /* QuickSpecBase.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 37C5AC3FE6711A1117819AC5A18EE5C4 /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAFAA3CA1B6ED55914944D32D60CD692 /* CwlBadInstructionException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 3807DB3A1508DBBF73638061AACCFAF2 /* World+DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 467F00CAF06ADEF612F697F068843FB2 /* World+DSL.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3B3A88E074630B1EBC2139F4F70F0443 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F67A2DFCB98D4ECC29A99E91703B507D /* ThrowAssertion.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 3BAA3F2174E5076C76FE9C124A6BD102 /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8737F3E0C1FB1ABDDC8F61A081B1F76B /* World.swift */; }; - 3C66D2692E811DAE57A244A67E7AC555 /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8DF89EBDCAF5E0E6AD1B667DA4FBCFC /* BeVoid.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 3D1A89FDD6B579BAA92AD398E5C019F9 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3B6045E75C2D2CBF310BFC536C5F1E7 /* EndWith.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 3E04D23B2995705A6106D41F3E3E4E33 /* ExpectationMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6C3B6DAC9EE276DD752D93EAED6E88B /* ExpectationMessage.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 45F183320C688F9978649F30ABE21D09 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C307734CC6DDA96E75DB8F886E6E029 /* MatchError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 496C2F48D86EEC3185AA85525CD195B3 /* Pods-Jelly_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D6E779444F549BF86B8E3F5D643907F4 /* Pods-Jelly_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4C5546B28A1DE96739C13EE60FC0B971 /* Quick-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BCD7C4F10E8CD2DCAD3B2734A26D9B0 /* Quick-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4CDACD8A5A6CFB688838AA988E7D1E43 /* Nimble-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FF69EB8C1C9234284BFB37FCE9D23D4 /* Nimble-dummy.m */; }; - 4D68C35510D1E911C9B89840FC4B777F /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = 20E530434E483C2BA306B0020773B18F /* mach_excServer.c */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 4FABBF5CA8F735F48035BE4144613CB7 /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = B99D6596391EB4AD2D146D0851746820 /* Expression.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 50698F14E7847E18B907E9373FBF4C21 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE147446A1225BA68EA82615B1436CC1 /* Foundation.framework */; }; - 531C54B1C10BA0F17A2B7D81D02BD390 /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = 912DC6AF27F5A0EB0D0E4D6E237216F4 /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 54CC2049C937561A469575AF9E6A6FE9 /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2104EEA5E8F1528DDF41A689B5A01FF /* NimbleEnvironment.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 5528487B8CA7F7D304BDC4F48BE73726 /* Jelly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6406BD8D8C00F95B1722EC84BD0DFC71 /* Jelly.swift */; }; - 5706C5BA9647CC9CA4EF1599014FE57C /* Closures.swift in Sources */ = {isa = PBXBuildFile; fileRef = D685C0D509328CD8778F99DD53A49A48 /* Closures.swift */; }; - 57318255435A94922FC4F7FE9E903490 /* QuickTestSuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8E430D83F3CC7F72E348A0B222C46F /* QuickTestSuite.swift */; }; - 5881A2ED53DE796E62D63EC568052D69 /* SuiteHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42DD07575CFDE63DE6412F425FDBED71 /* SuiteHooks.swift */; }; - 58C0125D796A97541FDE3414001D8A92 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC8D36EDFA340683FD5DAEB9875AB2C5 /* BeEmpty.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 58D964317DFBB10F54A273CB12843017 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F4B04767442BB7BD15AAE24AA792327 /* BeGreaterThanOrEqualTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 5AB9DB61D62D8BF7B1C734B373F361E7 /* CurrentTestCaseTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 23613A479D2E1D88D235530FD7BCC89A /* CurrentTestCaseTracker.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 5AC5F0B8A787AF301AE6395546E77E44 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D9A924C203A11767BBF4D9C3737DA5D /* XCTestSuite+QuickTestSuiteBuilder.m */; }; - 5BF274C2DEF332ED79B1CD15CFEC3498 /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 393E0E59AB864543FA7641EE7E61605A /* ThrowError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 5DBCC0E4C72649C9A39A00D40D944DDA /* Nimble-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 16A20C34FBBE39465FCF6F0F34947C2F /* Nimble-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 606093446CD645B97D0873DC926B281F /* ExampleGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 829CA47FBDF0A83BF67F7102D4CD40E6 /* ExampleGroup.swift */; }; - 6061BF472FF45CE7ED2D7876387696A2 /* Pods-Jelly_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3EA7EF46A7976B0FBD80E32D71A4E257 /* Pods-Jelly_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 607C656B600E80F321686A0DD904066F /* Jelly-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8CD53270A7F033A8E966616E7F756B18 /* Jelly-dummy.m */; }; - 62D26CE7BA3AEDB4E5E87218FDCBBA90 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5689A9DFCFAE2BDCCE427EB97661DCBA /* Functional.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 63F175C624BCCD8AF13BFABFC24F3FD1 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FEA1DF1C7C22E7B20D2DC30FB9D3EF1 /* Configuration.swift */; }; - 643C6B155FA0A57769FF4B59E31B9A9B /* Pods-Jelly_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DBE27E6C449AFB6AD96AD5284AD962B9 /* Pods-Jelly_Tests-dummy.m */; }; - 64819C8D4EBD3386377D0F84DC909F8B /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = 031049477EF89D8C0F6EDF4DA335F657 /* CwlCatchException.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 65985C142EE8A74E6E56D5E30A39C79C /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2D40E21FFD40BEFA4C8C5B04B4FEE82 /* Expectation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 68FD03C72D719117929696B62038B3D7 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D18A3F4B9E1AFFEC61F2CB2F0BE05DED /* NMBExpectation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 69BD3C79C0FE2C62BE7F2431A7103B58 /* QuickConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EF0EA564D82AB46B710DC6096C1EA6B /* QuickConfiguration.m */; }; - 6BB0EBEB4730B94AC07458E398D142C8 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF51629E9BBE4FA04992668A7567A852 /* MatcherProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 6CB4890B9BF5F846E980634AFE83917D /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BE286288EE340CF8EF3F41D9772F145 /* NMBExceptionCapture.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 6F3149062AB731B6F1B5D8F43598C76B /* NSBundle+CurrentTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B78AC1C0059E66BD95A9F0CD2D24F5 /* NSBundle+CurrentTestBundle.swift */; }; - 70DA9E601DDDCC1AFE39E4270A2BCA7B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE147446A1225BA68EA82615B1436CC1 /* Foundation.framework */; }; - 73BC5AC2ECDB8722E085F14B53E0D24E /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FA3B0D7D5D9D8EDF2641BCE7E45A71B /* AssertionRecorder.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 75538A8B20C7A20AF3D54BBF35D56FFE /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61C83B8B4A556ADB7CB613AD8A7E78B5 /* BeLessThanOrEqual.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 75ABB48E3C30C2D736C3D05D6FD566A8 /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C2256ED78FCA069D0A67AE7996F700F /* BeNil.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 7D685EF740B61FBFAAC60304CA2E84A1 /* JellyAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03624B0D8D1E6BDE86AF91150E013F1F /* JellyAnimator.swift */; }; - 7E0C9AE6468A5DF91F0F4C7A387D725C /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBDDD402C136C4C7E06650F0EB6E9CD6 /* BeAKindOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 8170866E2ACE0ACFBC6D90081354EC65 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = D61A65644B128A845AB3BF3D8631CC4C /* Stringers.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 8442DC4D17B0DAAB10CBA72AB7143686 /* HooksPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9245B48A46AAC45502A6B8A2AB745038 /* HooksPhase.swift */; }; - 8A6FC1367146555F0E9F2E026A9798F4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDF04AEFCC4B011565BFFBFFF52B2FCE /* UIKit.framework */; }; - 8B55BD430033027AD5FF22D630DD9F62 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = A271F0BB61B5E4A69A22F05AE8C0E6FB /* DSL.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 8FFEAD6FE47636D0CCD8E4E72E6C0D9C /* QCKDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = B9985CC02179403DC54B3460DCE486AC /* QCKDSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 95B1822B493FFACE163ACF0774CA3152 /* World+DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65B4CDEF78BF13177A9303C1E765E5F6 /* World+DSL.swift */; }; - 96132E7432F8DD315A88A07C6B4F9C72 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = AC9720E44CC5EEB092E90D118DC69352 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 988EED125395950177DC14AF9BC87D8D /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB3FE3EC8226C0B8E6FC7B845B39DEDC /* HaveCount.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - 99E867EAAA1E5C553DC3D710EF4FC77F /* JellyShiftInPresentationAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EC41E2C52978063B6A50DE22C692E38 /* JellyShiftInPresentationAnimator.swift */; }; - 9E8D63BD1D5AFC9A0B12226F94FFF4CA /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C4D786F262665CE8C9113FA91745753 /* Filter.swift */; }; - A084E411B238604F4EB2CAE768C66BD1 /* UIViewControllerAnimatedTransitioning+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A5305568B2E2268061D10CF689B08D5 /* UIViewControllerAnimatedTransitioning+Extension.swift */; }; - A0AB98BF5C5B263338D5447DB8DD11CF /* ExampleMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8452C5F4B63A4A0178E56CDC9E95DFE8 /* ExampleMetadata.swift */; }; - A0BF05A1C4863372A7D9F24881B00F55 /* UIView+Jelly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0FA0DB6A6530B3AF1AE18BE05984041D /* UIView+Jelly.swift */; }; - A0EF4FC6C455C59C0F60AAA7A54731D4 /* JellyFadeInPresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EABC671AC0F5260B11C5E39AF005600 /* JellyFadeInPresentation.swift */; }; - A57B1622384C7C3C8AF1CC42B21E452D /* QCKDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 12989D830FCE4AEF54A357265111CAEF /* QCKDSL.m */; }; - A61ADD214AA182EEB2AC95EA3F3D658F /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = 8152C3AB4ECF2BA42CA9EAD577F6F404 /* XCTestObservationCenter+Register.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - A667134AA12155E870C7BEE07C832639 /* Behavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73C1D1A0D20C667FAF4F01C3BA4AC451 /* Behavior.swift */; }; - A74537420FF0CEDC6B9E82E1DC4C2B15 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46F8511B08505FC55B5329E6464AFDFA /* Contain.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - A7C13C62E4116CA964A3E82179092AD5 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194B2F0745EF6C9A632F0FCCD3C970A3 /* NMBObjCMatcher.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - A867263C360C948CFF7378C06EACA536 /* JellyPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 725EB33ADBE3FB6CD9638DCEF54736F8 /* JellyPresentationController.swift */; }; - ADEE95A3A188BE3095990E20766BCCC8 /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E97EDDDEDAD07EB20F5E5E4A16056BA /* DSL+Wait.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - AE4DA49ECD693BF384CD824DF02D7C6E /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = E32F5B894304A324CD56AB687A5D06B2 /* NMBStringify.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - AF1174085D9BC5D50FCE0480E9C2BE94 /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98DA9221D3C3670D09A3418B64C4293F /* BeGreaterThan.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - AF5DF12D1A768FADDBA1BD12B2F599A7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE147446A1225BA68EA82615B1436CC1 /* Foundation.framework */; }; - AFFC00F3EC5C3CFEE52966D942FD3921 /* Quick.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C846417EADDAAFF733CF6AC8FEB5EEA /* Quick.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B102ABE4E54B71B3D2C2118E2782FAB9 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF96C550BAD2A4F1B36336E4950F81AC /* BeLessThan.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - B2C151B20635A480E1937E3D2B509BB4 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85003248050785BFEF966D1E89E5A847 /* Async.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - B37D0376FCEB3133F44CF5F4416C58E1 /* CwlMachBadInstructionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = B4903A86024F5425CE9A8BE57C1F8E5A /* CwlMachBadInstructionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B40FEC5030A794FEC3611FD04A209841 /* Quick-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A9D7EA20C39A55A1EF0C23094895A75 /* Quick-dummy.m */; }; - BC103904981A4994F28949AFD76D7009 /* QuickSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 38A82DE4A0130E4C946A904FEDDD74CA /* QuickSpec.m */; }; - BC7B9761322C74FA27969BD55833BA47 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27A6E1B1438113D3D4423FB3586E904A /* Errors.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - BF3B7218901760A6226C7F6346BEF454 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = F92D220FEB1399287C37F2660BABEB4F /* BeCloseTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - C06FA100C1BBEE34B863BCB8A65359C1 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0419679307D183B699A139C94F152FAD /* MatcherFunc.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - C1D862177DC2999FAC710AC25F253BD0 /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95614EC69755CACD43F81B3D967B88A9 /* BeAnInstanceOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - C3B1A7E0024A06554CBE973A69DFEDA2 /* CwlMachBadInstructionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = F4F188E8BF10EA41AA12912175B25178 /* CwlMachBadInstructionHandler.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - C4EE9BFCFE19793509CB252F86626081 /* QuickSpecBase.m in Sources */ = {isa = PBXBuildFile; fileRef = E585A4F6C1434FD922B8371E432B5051 /* QuickSpecBase.m */; }; - C8320A6164C870ADDB8A855ADEBBBDC9 /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3718B918BEFD94E93859B9284AA81994 /* Equal.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - CB06F67C64C60CBA399057F1281134FE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE147446A1225BA68EA82615B1436CC1 /* Foundation.framework */; }; - CCDAF11E7AF29E720C587B038145F622 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 980107C107885320335941A4471C9DBA /* BeginWith.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - CD35A419AF9F565BCF46E85719F327EF /* QuickSelectedTestSuiteBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4C7D6328493B73EF741AC61F4CEF01E /* QuickSelectedTestSuiteBuilder.swift */; }; - CF55697859D633C852C3586384647EB6 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C017FD42384880C826F224329BE5F90 /* NimbleXCTestHandler.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - D1F64BCFD9F32C3442A5EA2EB2BC6904 /* QuickConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D2E298780429D096F1EC434CFC3B225 /* QuickConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DB0E8803698C3B17EA0D6894E1F72CA0 /* QuickSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = EA8315675F3D2B2385E834043F85C676 /* QuickSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DB42C9499010389E4E5C54D126C0C168 /* NSString+C99ExtendedIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 057B1682EF92E71137867F0C259AF2CC /* NSString+C99ExtendedIdentifier.swift */; }; - DBD0FC430F214E9FD0C425AA379263A2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE147446A1225BA68EA82615B1436CC1 /* Foundation.framework */; }; - DC68C1C8E64C53AB1C3EB8265C200C71 /* URL+FileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6D48A33A49B17952C7ABB6214240CB9 /* URL+FileName.swift */; }; - DCC01B1A2A8E9B5DAB8C7A7F3265B2F7 /* JellyPresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D37783B2E2DCA65BF2F54F827795778 /* JellyPresentation.swift */; }; - DF026F6F406A4FB6CEA63B0A4B9E27DD /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6E780E005CD78D86050E2F1C9B86227 /* AllPass.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - E6C372E0463DBF9CE2B0E717A6D90D39 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2D9897D646E2BB9FBF73704C04440B2 /* XCTest.framework */; }; - EAAA05EBBC34225C0DB45797712E24A1 /* AsyncMatcherWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFA739FCCF461022D3476D9AC0A12969 /* AsyncMatcherWrapper.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - EAE2AAE5EB826B38978692984BB22FDD /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C12FE311471678F66F177EFA1D02222 /* RaisesException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - EB3A73071ABA60E77E0704649637D8BD /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE81B79A8CD03840E8A5EEEE5860BA15 /* SatisfyAnyOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - EF8548E0C37E8888D9DDC11ED89D3568 /* Predicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CBFA93649DC414474690ACD27048025 /* Predicate.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - F28003B228B82B7E1497D4F41F55A31E /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A6B34FE5E08BAF87E042A2629840DAD /* Match.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - F3BAA36614ABDBC0538B0DEA99CF80A0 /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48FBC678177B9AD2C7DE8B1059F8BAC3 /* SourceLocation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - F4BD249C60F21F5E0F7C1FAC8A5BC2AF /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = F83B921F09A6958C37B8A1A5E64C4264 /* BeIdenticalTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - F9649DD59BAEE88C6864EEFE73ECA88C /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E088B77C89183030BDE7BF0FD5A6E61 /* AdapterProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; - FB433A84B0A557CD5E5948A8B6705024 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 2B97EFAAC8E5F1ABA276BDBBCA8A7E8B /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0178CE8ACB5D1694994D10E11A699077 /* HooksPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27A842237DBB504849240C780B3C516B /* HooksPhase.swift */; }; + 032E9A065A38C85443A482180DCC2728 /* PresentationUIConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C2D59C58087D18ACC3E5AB791CC0484 /* PresentationUIConfiguration.swift */; }; + 039B6DF6277B90CE3E78AD37333752B3 /* Direction+EdgeHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1089E480B232FF6A11A3B16306763021 /* Direction+EdgeHelper.swift */; }; + 060AE17E2B7A654E4A091C45D8F13389 /* PresentationType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41D8158295CF3E762A07AD5ED4E27615 /* PresentationType.swift */; }; + 06F38DD26D80484050C9ED86478406F2 /* BeLessThanOrEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD5835E79CFF4725914917855ABD641C /* BeLessThanOrEqual.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 0915724DFE66D41FC4E418DF2ED64512 /* PresentationTimingInformationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68C662027E8A1C42ECC845231DF6FEFC /* PresentationTimingInformationProvider.swift */; }; + 0C345DBBF5EF9ED046CB579FDD401A57 /* NimbleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76FC08B06351D893CB9D678B5ACC4A89 /* NimbleEnvironment.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 0D74DB80E4766C505062F32B6C5A70AD /* BeAnInstanceOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = B62E41EDC1D1F0A50CD6F238DE5DA52A /* BeAnInstanceOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 10BF18C5EC2F2C79BD25F09F56100B77 /* PresentationSpringProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF89C3F00812A2CD77EE52D3F73A86FB /* PresentationSpringProvider.swift */; }; + 118894DB9F20F5979822204C8AC30096 /* Closures.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BB4FEDE8A834E0FEB9971CE9F7C6B6C /* Closures.swift */; }; + 178D335802CD200B689E8B456E417DA5 /* BackgroundStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9EB96877C5119273BFD64D93DE99DC6 /* BackgroundStyle.swift */; }; + 19291565899B5113A5355002CF9C8F2F /* Equal.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF719D8E22FDE4224BB3A07CAA27139C /* Equal.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 1AC5D2CE6FA79327468F53B53D0A9418 /* AllPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBBB0432FE5912A44538CF0F7360FA8B /* AllPass.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 1E2AE2B6202B65E712FE05FB2699BD2C /* ExpectationMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31184022E189DD64414E2576456FDED8 /* ExpectationMessage.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 1EC327DF2A59DCBA29124E86B6209E48 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 884D43269F037BE17858CACB7F93DA82 /* XCTest.framework */; }; + 1ECAB0BE4120F1C173B873889DD27693 /* ExampleMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6302F23F33CA08B3EF7B47B34924CCE /* ExampleMetadata.swift */; }; + 1FB288917FD6212D5120728D4AF52926 /* PresentationSizeProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5102E5F18979A6903F09A65CB8F45B1 /* PresentationSizeProvider.swift */; }; + 223CA7D4EDF23874D61C762F6CF51C56 /* NMBExpectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67B5D4872A05553D49A2DF83D297BCEA /* NMBExpectation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 22948773F0660B81265C2C17A0761F0D /* PostNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = A84F4188F0FA05A478D3DC28A5F39B85 /* PostNotification.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 24AC6513961FF6DC60E0FB284E8914B6 /* FailureMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6CCD506C35B56CFB587CD3CD87825BC /* FailureMessage.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 2574D09B363D42ACA6BA589B675FFA26 /* CwlCatchException.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB10616E99816BA5D4A7DB844B21E839 /* CwlCatchException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 294F8B34F4D480C46EFE16B08BE99280 /* Quick-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F800624BF03EE61550A5004A05E2E9D0 /* Quick-dummy.m */; }; + 2AAECA63C28DA66D2734980B48CBA2DC /* InteractionConfigurationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09DBC35316A67A89802EFFCA924C0918 /* InteractionConfigurationProvider.swift */; }; + 2BBF69C2A9AE5D1B99F9393725B7A4F5 /* SlideAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95F4ECC691CF2ADA63EF9FD0C34099E7 /* SlideAnimator.swift */; }; + 2C3E1CB52B965BFAB1E9A2D61FA32731 /* Size.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41BC14DD346C33EFA77474BABF5729C0 /* Size.swift */; }; + 2CCECD5D997EC574894D3FE519371833 /* NSBundle+CurrentTestBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F7235A89BF04113F682D7F521BA7FDE /* NSBundle+CurrentTestBundle.swift */; }; + 2CDC32CF3E8FEDC5F47BBA7B8AE79BAC /* World+DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 746F20E704821A5B075984A2ED48B960 /* World+DSL.swift */; }; + 2EF89DB591335BFB29606E0706E66D9F /* NMBExceptionCapture.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AAFEC712B16CE9933A1F11E8FC5B910 /* NMBExceptionCapture.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 3312F77A6C289F2CEFBF0C1D98431671 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = B330EAEAE470617DB666786F29A5D3FD /* Async.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 3429418EB87F21D02290226EF75D173F /* Spring.swift in Sources */ = {isa = PBXBuildFile; fileRef = A209199E40D349E3E6D12DCCBA8E0CC4 /* Spring.swift */; }; + 344E4BE009FEC7F80EE8EC3F568C1307 /* Size+Equatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A4A356EBA75B9130AE0691B7CCA2DB9 /* Size+Equatable.swift */; }; + 350C051E271508531C90540A2496684C /* CwlCatchBadInstruction.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8C48001BCC90BCDEFB88A807EC08AA2 /* CwlCatchBadInstruction.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 350D088DE95C8378AE3C8B4F14898343 /* Quick-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B83EC3B38D0BD6BF558AD7B3AAB9196 /* Quick-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 35D999B8052458CE52C2B56C5E2E62BB /* QuickConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 75E56F91363B1925AA3C597614223873 /* QuickConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 365684BF52554808935CE1C1BB1DA68B /* Jelly-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3543AC392CF460A47042F28C00D7303D /* Jelly-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 37C3C6235A5DDB8E37629314CF0E8489 /* ThrowAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87378AA8EEA6DAB96F4E3E2B37935625 /* ThrowAssertion.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 3805AA812801A18911D5D0357A7F4E35 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13B0483C2FE51C1DA7E45625C2D7EE45 /* DSL.swift */; }; + 3BEF5520DAA602A348B56A416E18AA73 /* QuickSelectedTestSuiteBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E34F8ED7F13C3ECA2FC921AF52E517 /* QuickSelectedTestSuiteBuilder.swift */; }; + 3C0D99EED837A3AD705A664503EF48DE /* NMBStringify.m in Sources */ = {isa = PBXBuildFile; fileRef = 92506BB54D506728D7327F0BD6BA8C40 /* NMBStringify.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 3F6252E0F3B16FC9B2F2B15AC5084F9F /* PresentationSingleSizeProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA5D168B7E72F59A0AC42E8D7EEE6B08 /* PresentationSingleSizeProvider.swift */; }; + 4018169479A8ADEE40D4C084D8FE5812 /* QuickSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C3778EDDDB10CB1DF14FA3B9657CA2E /* QuickSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 42A9F49A3D23555A2EC71F3E84E435FB /* DSL+Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62FCED261837F758860C1765F94AC364 /* DSL+Wait.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 430D0E9E855C6F3FD6ECA03B41476B11 /* Pods-Jelly_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 228844A9F87E4192BD8C40A22CA669DB /* Pods-Jelly_Tests-dummy.m */; }; + 4376543F566BB8211E6B6D1FE8E1E0A3 /* PresentationHeightProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1822FD917660B068E38C82469523F9B0 /* PresentationHeightProvider.swift */; }; + 440D74B1049C698F588B700AEFA8D5F2 /* Orientation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8D9C3E16F783B88416EFADC4DD38D46 /* Orientation.swift */; }; + 44F6B7EB2EAF73218A16F56D45C877A4 /* MatcherFunc.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8ECE7516D5818633D7E512C671A4897 /* MatcherFunc.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 46D69C9CB63C873B2873F767A0FCB2BB /* UIWindow+Swizzle.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCDFC9D258ED4F41CF77583751635E65 /* UIWindow+Swizzle.swift */; }; + 47E6EBF129F76146D437F5678E1CEEE6 /* NSString+C99ExtendedIdentifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF83488F516E7135D6A84081B0F3EE81 /* NSString+C99ExtendedIdentifier.swift */; }; + 496348493ECB434C490045B03BB0D61E /* ExampleGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 088BE09AECC2698F26D11549C759E521 /* ExampleGroup.swift */; }; + 4BC394D58E27C08243FC9B6F6826B9C2 /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28D147C11DD41351CCC587548593CCC9 /* Filter.swift */; }; + 4BC738EA304E6FA57294B9AAFEC56F70 /* Functional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4594B4B082BE8DE3284C3B71494937C1 /* Functional.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 4C093ABFA796CEC3AC89C1B9DC36841D /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 266870BF78B80ED449ABA047A0D44C09 /* Errors.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 4CE7C32CB4FCF9037915B0419FBE2BFC /* DragMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2857F01CF61CFD8CCA443B02BF8CB771 /* DragMode.swift */; }; + 4EA6E1C17F11C38C85A1765B59DD1C62 /* PresentationAlignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = D974F15456DB6A90B2F8B69E42C790B2 /* PresentationAlignment.swift */; }; + 51CBC2F9289BC515ADC6A20DF4843C7A /* ExampleHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DCD3F0A440882E2592B2762C30C59A6 /* ExampleHooks.swift */; }; + 54694B54DA5E88F7260D7C9AA48810B2 /* World.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3880CAD03796E2DC8DFC9B9E3B2E9428 /* World.swift */; }; + 54DB75675BB41A42357B7E194F6CF74F /* Duration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 537096846FE79477222E055E5E9D012B /* Duration.swift */; }; + 562B8E7BBB3176E837BEBD6D24DA7EF4 /* NMBObjCMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 788A40FBD0CC8E60385139BA9D044065 /* NMBObjCMatcher.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 5747F17B237F1ACB862F3F2911E5CBB1 /* BeVoid.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEA1C96D7243B4462255937B9F0C1CBB /* BeVoid.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 574F89786271FD7BAD216D075EA1E898 /* Nimble.h in Headers */ = {isa = PBXBuildFile; fileRef = 25E90B619B5C3A2CB8EDA6F768B3B854 /* Nimble.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 58040055A530DAC34F9A1BD032FF07A9 /* PresentationDirectionShowProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9433251C9A3362E53C57E77E1563DBA7 /* PresentationDirectionShowProvider.swift */; }; + 5895EA4D5666103B2CD4243690487D07 /* RaisesException.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ACA6BEECAB84430A29EE4BCDFD6F79A /* RaisesException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 58B249717B134855DA1DF182DF0AEDB9 /* BeGreaterThanOrEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE688EB7CB06FF68E59F36504C83878D /* BeGreaterThanOrEqualTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 5BA1006DAFD72ACF9F31DC95096FD054 /* mach_excServer.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB22DBE438CA4F194008503BFB08227 /* mach_excServer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5F14E3653BAC37DB4316A40816CA216E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1659222AD64CCA597F148530E7695E75 /* Foundation.framework */; }; + 60D2D3C45C8CCFD2B5409C0CD650700D /* PresentationTimingProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC396710E0A9944755F97ED19270C897 /* PresentationTimingProtocol.swift */; }; + 616E1E7159BAAE1A77A74BB0DB71DE51 /* TouchVisualizer-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B0C2F7D5E07EFDD0FB9CDAC5174321B3 /* TouchVisualizer-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 618C13D4020EBA363997EFB60A56AC20 /* DSL.h in Headers */ = {isa = PBXBuildFile; fileRef = FC15AA1B2CC648706B59562BF5F98177 /* DSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 621BD1AB78A152EFFCDDD7AB36C81E8E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1659222AD64CCA597F148530E7695E75 /* Foundation.framework */; }; + 625DF4DD54C40BF9DFD365930B982212 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0846448D09624616444BD5134A1203D2 /* Configuration.swift */; }; + 62A3D36B892ED9C9A3210134C97FE3F9 /* NimbleXCTestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9CEE68A6FD6F85E4FF9CA16876648E6 /* NimbleXCTestHandler.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 66D3DA2225488356273B3D0AB83DA268 /* CwlMachBadInstructionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = F3948A09C13E299AF5C5110689C4CCC7 /* CwlMachBadInstructionHandler.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 670F2E3611B2B8EBD2C871FA67358D0B /* URL+FileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB7369A38DD1C7219356277E11ABD889 /* URL+FileName.swift */; }; + 6985430721C89135D5B4CBE13357EC31 /* DSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 9409D16C26350406F62588CE2510EF1B /* DSL.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 6A8A6F921233499B250FFD98DEDA713F /* Behavior.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F0DE168D68F9193C94D4F9F47B54468 /* Behavior.swift */; }; + 6B124A4D8EB28A918E0C87F2E75D94F8 /* MatcherProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68F35295CCEA9F4010583FA57CA5405F /* MatcherProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 6B2DF45B9BFABD4BF3DDC503F073FB71 /* BeAKindOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D8EA033ACA3A6E71F559401AA71134E /* BeAKindOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 6B42CEEE38FE6194B13BAA48E3C3C73D /* InteractionConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6266AB3F9F9E54E8437F52FC287F25A7 /* InteractionConfiguration.swift */; }; + 6F26C585C94166C53642255C104C97FB /* PresentationSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = E718B72B3A4C792A682C43A35D9968A3 /* PresentationSize.swift */; }; + 6FE504E9ED5B37C05CFC2A530019AE5D /* BeGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 197388BE63349DDE4956191F9C68932A /* BeGreaterThan.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 702665C14074D2CD1A96791B076F05D9 /* InteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2AB7A30488027398CD983E692FC2B39 /* InteractionController.swift */; }; + 72D4E134EA8772652620E55B6E280A99 /* Example.swift in Sources */ = {isa = PBXBuildFile; fileRef = C23D5A55607B45A44790FA3203DAEBF4 /* Example.swift */; }; + 74605907C211553B00F09768BEF12834 /* EndWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = E28C924C8E4588F3EC6DA534343C1291 /* EndWith.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 746D0DBAF8EB27CA816CFD021DE2A7A1 /* SatisfyAnyOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0008470615ADF5EEE6D320EB32A985A /* SatisfyAnyOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 7485AAEB633B78268D656D019B77E023 /* SatisfyAllOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 157D741AE0729C5DBC91FC32AC9F5110 /* SatisfyAllOf.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 74CABE7BBFC6708DAE774F204091B655 /* ErrorUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 734E9D36083A5CEB4FAFFA2686966AF0 /* ErrorUtility.swift */; }; + 76A0170E649A948EC59ACEEC5AA1DB42 /* CombinedTimingCurveProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 798A09EB29BB03821C5844521295D6F8 /* CombinedTimingCurveProvider.swift */; }; + 773FC9A1305BC6EB5BF067B5F19A0253 /* FadeAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B05B2A0CE73CCD3A99AF938AD1145BD8 /* FadeAnimator.swift */; }; + 780A929EDC45A825E2CBADDD1DA550EB /* UIView+RoundCorners.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D408FEE27A43A863913BC57573CC1FC /* UIView+RoundCorners.swift */; }; + 79FA255F43C9E42470C9720C0604444F /* Nimble-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 12877A6C39454B09A71B6432428EF643 /* Nimble-dummy.m */; }; + 7AA9A7388AF44BB4EB2111CEDB29A666 /* MatchError.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF321956D5A58145BC8ADDB3749FAF76 /* MatchError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 7D4F109F5FAB9560EED1B52D90E9EB8B /* VerticalAlignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49219B0764B50AC29F12A1C3DC4A7B1E /* VerticalAlignment.swift */; }; + 8050C10B78F2D1DD98A2F3E250A24AD0 /* CwlDarwinDefinitions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED20A4ED7F29CDE83EB3DF00FB6FC62 /* CwlDarwinDefinitions.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 821F1A5C052DDE77B6248CD0C418EBC2 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCA459A3154AA6386DAEE2F96AB75ABE /* Configuration.swift */; }; + 831D4BC6FF5439CA6E955D26BEF214CF /* QCKDSL.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CBE0DC13312B13670858D3C9EF5C4C0 /* QCKDSL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 850791A73ACE3ADFC6F6CB9ABD2DBADA /* UIViewControllerAnimatedTransitioning+Convenience.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F392C614FBAFE5483B6C12D2701B047 /* UIViewControllerAnimatedTransitioning+Convenience.swift */; }; + 85107C3BD627EA89CC1EAB25859EF85D /* AssertionRecorder.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8014C543D597CB3D6F0C070DDF62038 /* AssertionRecorder.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 85D158B2C4138641B98D689FCECD52AF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1659222AD64CCA597F148530E7695E75 /* Foundation.framework */; }; + 86C063BAE236118248770D5BF0668FBE /* Visualizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67A69DD81D8ECDA0C288F022126790C3 /* Visualizer.swift */; }; + 891A68909587F4C951CEE146DC55D310 /* TouchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C93BBBD8865ABFDCE72D4D0BF2400C0 /* TouchView.swift */; }; + 8A44986DA8C47B461DF1E2950B4F6D1E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F4EBF1B47B9B5488DD67538957A428EF /* UIKit.framework */; }; + 8BB7F5B7E3E77CF25E64E1EAD1A26E68 /* ContainElementSatisfying.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF3719DE487FE57A2BEE832D339248E3 /* ContainElementSatisfying.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 8E83E547D107FFC8B596829313AAF38F /* BeNil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4554AB2C7A6F1887524E4A848E0ADEA5 /* BeNil.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 9084FD8960EAD11A5BF719AE3F5BA624 /* Callsite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33708C75E8787278AAC3A515E5BB4D75 /* Callsite.swift */; }; + 9096D686AB39D3475A4227F0765C3DC4 /* Nimble-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4226EEA999978D8B72C90CFCACE5AE85 /* Nimble-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 935558F919649CDE3784CBD344D3C008 /* Predicate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5C803E6C34277D717AD3C2DA0F40FB8 /* Predicate.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 95B6F39536C6E21B2271061A6B5A6E94 /* AnimationCurve+AnimationOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E275B5D8012E6192AC17F7ACA5CB88F4 /* AnimationCurve+AnimationOptions.swift */; }; + 9680E409CB6A335EEA527934BC3B6101 /* Animator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B71D599F1288F9AE51EC97B51247E7D2 /* Animator.swift */; }; + 97A60F28FA1FF94422D2560002CEE407 /* NMBStringify.h in Headers */ = {isa = PBXBuildFile; fileRef = F53F85E807A4D646F30E40233AA43F83 /* NMBStringify.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 97EE56F66DCD3C983D0585D8F45FDB6A /* BeIdenticalTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BD07EF4BDBF4A44FD439BA0FE6C226A /* BeIdenticalTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 99CE62DE2D2E8C354D36D3E1CC131EB1 /* PresentationWidthProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74E734FEA44534A65F01108915FF8C3E /* PresentationWidthProvider.swift */; }; + 9A0EB2F0A468E4576E776AE1E9221E7A /* CwlBadInstructionException.swift in Sources */ = {isa = PBXBuildFile; fileRef = B165D03AAB19A47056D37D1E2BD923B9 /* CwlBadInstructionException.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + 9A3BD9B26C2ACBCE6EE7D18550254C7B /* Presentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7C3A3698E689F66DD8ECAE9D8A45B62 /* Presentation.swift */; }; + 9AFADEAD60F22CAD938F3DC856D84449 /* Direction+Orientation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1E3BDC86641E884E556E51E4D6D8BBF /* Direction+Orientation.swift */; }; + 9B682327EF17EB443C3DA91C198440C5 /* QuickConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EFA670EC3A1A9FAE8649B0AFA5F33F1 /* QuickConfiguration.m */; }; + 9C22921616DC80691662977DDEA6B2C4 /* BeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B47AA90CBFE5954E52A4309C13CBBC5 /* BeEmpty.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + A13DB1D9C8120FEB9AB49D5823F4E6B0 /* QuickTestSuite.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B15A675AA25F45EFE0DA199CE553B13 /* QuickTestSuite.swift */; }; + A256EFAA83A77FB21F39220710D7DB55 /* QuickSpec.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FE82651A24B4278D7D4F6FEDB248088 /* QuickSpec.m */; }; + A286AD495C5D4520ADF2ECE7786EF950 /* Expectation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DED1AAAB0C78D4DB52DDDD117FAC5BF /* Expectation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + A2E4847546706E7A83BB4FD3391AADF9 /* PresentationDirectionDismissProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 424F8E2E5CC96CEE27CB59BD2BCF2BCF /* PresentationDirectionDismissProvider.swift */; }; + A3209494C8B29F390AC14D95519460A8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1659222AD64CCA597F148530E7695E75 /* Foundation.framework */; }; + A490FAE0B78B47AF739B0DAFC1DC5AD6 /* DSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F780A75CE32B9EC82BC4AA4832FA4D /* DSL.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + AE8DEFD225997857F08F6B1127F6473B /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5A1B513EB15ABC51EB40FE152727E35 /* Constants.swift */; }; + B1A7F7EE1A038950627A70298AA74D9C /* CoverPresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E29F6AC390B8EB21D73A46E9122BBBB /* CoverPresentation.swift */; }; + B25CF838D27CE9E1EACB2A5F642AC967 /* SuiteHooks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F4184BC3FF22ACEFDB62F88267C36D5 /* SuiteHooks.swift */; }; + B2C6771C44D01ABF742A710658FA2548 /* Pods-Jelly_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 99D660B556AD0425BA1CD57E1BBD4CF4 /* Pods-Jelly_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B2F5395D43472600D7BA7E26E3772069 /* BeLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D9F3C1C9EABE7290731076E3B8CF9D1 /* BeLessThan.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + B30FCDD03BFE82B7E9776FD9CE3A1C51 /* Contain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68E8F5AA95E065C35DFCC282555C8A5A /* Contain.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + B3895E766FFE0B7DF58F4D0BE246221B /* XCTestObservationCenter+Register.m in Sources */ = {isa = PBXBuildFile; fileRef = F2E2AC41B0BF4BC959C5FAC4CF6F1269 /* XCTestObservationCenter+Register.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + B3C3D7DAB6567A273DA50FD2068AFF77 /* NMBExceptionCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = E756756BD85BFDEE80151DF3B653FFD4 /* NMBExceptionCapture.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B4A5391D08A413DFDB77272A80094CCA /* CoverAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 218136F27C201C83B9D57B0C42D6F91D /* CoverAnimator.swift */; }; + B4EDAEC51A85334113924B375D318329 /* LiveUpdateError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66F5B0A0D4265D0A7F0DF52BC03DA4A4 /* LiveUpdateError.swift */; }; + B6F0D7C04121F97B1D4933C0168278EF /* AssertionDispatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7314F3E7754355A85BB6B5C04CA92382 /* AssertionDispatcher.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + B7183AAA4DB9E86D1CC6A304F780F662 /* Direction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17DED76AA5A94F85DC50F6BD455B79BF /* Direction.swift */; }; + B72BC319F9338FE721BFBEA0EDD49B36 /* PresentationTiming.swift in Sources */ = {isa = PBXBuildFile; fileRef = 625B26AA59DCCA991D52BEF7196378C4 /* PresentationTiming.swift */; }; + B7ED1B41F56087971B656A2E38322310 /* Stringers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 567820F04B2F5E322BDECBF14AE19EF9 /* Stringers.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + BEB8082717D949400F2DE3458E75CBE3 /* CwlMachBadInstructionHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 1160831F489A83F2E71F3237380508D4 /* CwlMachBadInstructionHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0026E595D65E6D500964036FA222011 /* PresentationUIConfigurationProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0673D98501C03C559FF8D3985D68178 /* PresentationUIConfigurationProvider.swift */; }; + C22C16AEFB219949BA28C619B86F9D5C /* Jelly-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BBA67F3FB14446597F4BAEB6DD90057 /* Jelly-dummy.m */; }; + C5305DE0B553BCA7361C3997ACD70FFB /* mach_excServer.c in Sources */ = {isa = PBXBuildFile; fileRef = BC7BB415F2E10F37FB336D155572EA32 /* mach_excServer.c */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + C825352204A89543F8B4C8BCE8E8D0B6 /* PresentationAlignmentProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CDD4099666421EF8778C2ADA179F87A /* PresentationAlignmentProvider.swift */; }; + CBFBEFEADE7C9D2973C61769E0D06B98 /* QuickSpecBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 48B0D71A44292C8B702C04CF7E2F55BC /* QuickSpecBase.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CE1287DA39DB4208F5511CE47FE8298D /* AdapterProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50D41FF8BE448618C9764A1ACF5962DD /* AdapterProtocols.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + CE23D4838FB5AA609E41EFC7D6D7BA35 /* PresentationSizeProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D55E1F2C48D0D630433228D40DDDF22 /* PresentationSizeProtocol.swift */; }; + D0FC783134058EA7EAA2D9009C36AF81 /* Pods-Jelly_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 79B84C337A00CF3A6955E1B9EDA7D30E /* Pods-Jelly_Example-dummy.m */; }; + D3BD7C7DBE343CB1556FEB27C5E9AC86 /* PresentationAnimatorProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4133A61C654D96C3387A6F56FB3C83D3 /* PresentationAnimatorProvider.swift */; }; + DA257CBBCAB6C22BA5476F983AC78BB5 /* BeCloseTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 803798B45BA51A60FAE5C58408157425 /* BeCloseTo.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + DA4FBA76599ECAB9A1993F119A41359D /* SourceLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62BFD7AF7FB1F3EDF4EA85D844569624 /* SourceLocation.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + DAF21E37BBBFD5D408F514E867A5936C /* ToSucceed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9018A052A181232EBE7D0A1551FBF379 /* ToSucceed.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + DD2EB3198539280E2F07F0E360AFF324 /* BeLogical.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB358FD18B22C8AB37036F562CE9FF0 /* BeLogical.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + DD9F95FCF2097B64801826E14E6B0E1A /* PresentationInteractiveAnimatorProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = A19E199A0F2A999E89145AAC47C047F6 /* PresentationInteractiveAnimatorProvider.swift */; }; + DDB89D0F2F9422FEFF8D3ABB4B1FC7F9 /* Match.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53F0BB4CBC88C0F10747AFEDB2FF74D7 /* Match.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + DEEDD0D7C0369178EC867A59373F6380 /* Await.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DF962BF0DEA31B9398C2F18FC52A323 /* Await.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + DF7CF1941236840A89D99B233E4DC086 /* BeginWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85037AF127EB293D3150CD2F636AD58F /* BeginWith.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + E26DE2707229F79E4BE6030A030EC426 /* PresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A174B11A8CDEDF11FA2758F7AC37A372 /* PresentationController.swift */; }; + E454528E8D39931207848DACBB617A4C /* Expression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32DD7B7CA9E0432DD3BB6BAB6DFEB238 /* Expression.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + E5B0F4C1BA4EDEAC30933E6378116D65 /* Quick.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D84EAD8BB8842D6543482754209A9E3 /* Quick.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E65CC5E19EE6525D57426BDB6E26CB79 /* PresentationMarginGuardsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCB243552831A37A26D18E5B0EE37389 /* PresentationMarginGuardsProvider.swift */; }; + E7007304EF95155DD821426F64223085 /* Spring+Values.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4747224FBAF235CB5311FB6776B83328 /* Spring+Values.swift */; }; + E85EAC40F42C10F327BE0BCF39C2DF3B /* ThrowError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEFB139FA2FA4F89E5BE9BFA0F50BB4B /* ThrowError.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + E8D0E6CFC7590FCB468020C2ED16BC2B /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 996E055B10E5F8588ED8B71AB226C42E /* XCTestSuite+QuickTestSuiteBuilder.m */; }; + E8F8705C022296F6849F5CB00DEC1B14 /* Pods-Jelly_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 17DF03237581043F86B86780F4FC15BC /* Pods-Jelly_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E984CB87ABF0DD970BD4B856DEA35E1A /* CwlPreconditionTesting.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F7D6A41179EB81C7A2085298870FDB8 /* CwlPreconditionTesting.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EC6B59311C15B33D5FEF724DCF0EB8A2 /* SlidePresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3B2AA7AFCA6D2320240A0E5C2855390 /* SlidePresentation.swift */; }; + F088EE1AE386EEF27AC934DE13F455BB /* CwlCatchException.h in Headers */ = {isa = PBXBuildFile; fileRef = 8606BBC23BBBD314A10018A71EF88853 /* CwlCatchException.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F32B9D0318D13B740E6D88E16709FEA3 /* HaveCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 878FD9A1699E94775AC0C28BE53A9540 /* HaveCount.swift */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + F429F04B2D4A0CBB549BA75A48853886 /* QuickSpecBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 9724C077CE7A513AA8A1D3DB92BAC86A /* QuickSpecBase.m */; }; + F43F40BA8DE54117CC8DD5FAE1E6C3A8 /* HorizontalAlignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4C632753BBCE6EFBB3A1EE5DDE93281 /* HorizontalAlignment.swift */; }; + F4EE282D8435D54A662C6DDD30A3D2CD /* CwlCatchException.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CC7F94266B7E574DA9E0B737AD6EF9 /* CwlCatchException.m */; settings = {COMPILER_FLAGS = "-DPRODUCT_NAME=Nimble/Nimble"; }; }; + F5A60CB15F1CFDBE47EBFFC6086AFD43 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1659222AD64CCA597F148530E7695E75 /* Foundation.framework */; }; + F869CF4A83E5333771493E16AC8FC813 /* QCKDSL.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BBA82243AF7504D591AC35041B220E9 /* QCKDSL.m */; }; + F8DCC99E49F076FA92E4DEC50C63ACA2 /* FadePresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61D4E86FFAFAB1212D56FBCE47063315 /* FadePresentation.swift */; }; + FBE0A7DD649B259D4A1D2C3203170E76 /* TouchVisualizer-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CC44AFA150A0CFF24B353319B41146A /* TouchVisualizer-dummy.m */; }; + FCC64A159B5CC194F41E8417C0289F92 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1659222AD64CCA597F148530E7695E75 /* Foundation.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 1FBDB0CCF6D97AB3AC1E63A523F4F6D7 /* PBXContainerItemProxy */ = { + 1BC4E9D95753457F116A2E9030F9F164 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 95E8C31CC69BDDA0F4E33D5DCDF3C16A; - remoteInfo = Jelly; + remoteGlobalIDString = 73CB6F78FA8634EE2E6526014548F149; + remoteInfo = TouchVisualizer; }; - 4FB31F760D6C4673A0D93CED806928E9 /* PBXContainerItemProxy */ = { + 71F5D4CDA15B0C37C6E8AD3CC9B4266D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = AA0132774BE36428369B19BF6856B6D8; - remoteInfo = Quick; + remoteGlobalIDString = 5E269AA9A7FBCB9BFD8EA487B43AE7F9; + remoteInfo = Nimble; }; - CFE8D551ADA67A281E68A28368D3FC5F /* PBXContainerItemProxy */ = { + 74D68A4775EAF1138A959F8FE087910D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = DD7C8BF89FE8053D0A2A2D88BB49CF07; - remoteInfo = Nimble; + remoteGlobalIDString = BEB11A95BFFDF3D35A3DE6F6656F857B; + remoteInfo = Jelly; + }; + E535A53649D53CACBB882A9B4025F883 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4E403190E18100D8B6FEB375DD12865F; + remoteInfo = Quick; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 031049477EF89D8C0F6EDF4DA335F657 /* CwlCatchException.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlCatchException.m; path = Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/CwlCatchException.m; sourceTree = ""; }; - 03624B0D8D1E6BDE86AF91150E013F1F /* JellyAnimator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JellyAnimator.swift; path = Jelly/Classes/JellyAnimator.swift; sourceTree = ""; }; - 0419679307D183B699A139C94F152FAD /* MatcherFunc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherFunc.swift; path = Sources/Nimble/Matchers/MatcherFunc.swift; sourceTree = ""; }; - 057B1682EF92E71137867F0C259AF2CC /* NSString+C99ExtendedIdentifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSString+C99ExtendedIdentifier.swift"; path = "Sources/Quick/NSString+C99ExtendedIdentifier.swift"; sourceTree = ""; }; - 0A5305568B2E2268061D10CF689B08D5 /* UIViewControllerAnimatedTransitioning+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewControllerAnimatedTransitioning+Extension.swift"; path = "Jelly/Classes/UIViewControllerAnimatedTransitioning+Extension.swift"; sourceTree = ""; }; - 0A9D7EA20C39A55A1EF0C23094895A75 /* Quick-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Quick-dummy.m"; sourceTree = ""; }; - 0D7224D3F69BFCF084E13946CE3B7646 /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Nimble/DSL.swift; sourceTree = ""; }; - 0EB4C32ACA09B07E39B455AA1E2B35A6 /* Jelly.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = Jelly.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 0EC41E2C52978063B6A50DE22C692E38 /* JellyShiftInPresentationAnimator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JellyShiftInPresentationAnimator.swift; path = Jelly/Classes/JellyShiftInPresentationAnimator.swift; sourceTree = ""; }; - 0FA0DB6A6530B3AF1AE18BE05984041D /* UIView+Jelly.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Jelly.swift"; path = "Jelly/Classes/UIView+Jelly.swift"; sourceTree = ""; }; - 12989D830FCE4AEF54A357265111CAEF /* QCKDSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QCKDSL.m; path = Sources/QuickObjectiveC/DSL/QCKDSL.m; sourceTree = ""; }; - 129DA04B381B509DAEDD565711C5A0DA /* World.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = World.h; path = Sources/QuickObjectiveC/World.h; sourceTree = ""; }; - 16A20C34FBBE39465FCF6F0F34947C2F /* Nimble-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-umbrella.h"; sourceTree = ""; }; - 17D1D74DA804951335589CB7E1360987 /* JellyShiftInPresentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JellyShiftInPresentation.swift; path = Jelly/Classes/JellyShiftInPresentation.swift; sourceTree = ""; }; - 194B2F0745EF6C9A632F0FCCD3C970A3 /* NMBObjCMatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBObjCMatcher.swift; path = Sources/Nimble/Adapters/NMBObjCMatcher.swift; sourceTree = ""; }; - 1BCD7C4F10E8CD2DCAD3B2734A26D9B0 /* Quick-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-umbrella.h"; sourceTree = ""; }; - 1BE286288EE340CF8EF3F41D9772F145 /* NMBExceptionCapture.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBExceptionCapture.m; path = Sources/NimbleObjectiveC/NMBExceptionCapture.m; sourceTree = ""; }; - 1C846417EADDAAFF733CF6AC8FEB5EEA /* Quick.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Quick.h; path = Sources/QuickObjectiveC/Quick.h; sourceTree = ""; }; - 20C9E93FDAF76CEA15A9E23CC159DED1 /* Callsite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Callsite.swift; path = Sources/Quick/Callsite.swift; sourceTree = ""; }; - 20E530434E483C2BA306B0020773B18F /* mach_excServer.c */ = {isa = PBXFileReference; includeInIndex = 1; name = mach_excServer.c; path = Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.c; sourceTree = ""; }; - 23613A479D2E1D88D235530FD7BCC89A /* CurrentTestCaseTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CurrentTestCaseTracker.h; path = Sources/NimbleObjectiveC/CurrentTestCaseTracker.h; sourceTree = ""; }; - 24FAED8BD878439BC32BE461165E4E08 /* ErrorUtility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ErrorUtility.swift; path = Sources/Quick/ErrorUtility.swift; sourceTree = ""; }; - 27A6E1B1438113D3D4423FB3586E904A /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = Sources/Nimble/Utils/Errors.swift; sourceTree = ""; }; - 2B97EFAAC8E5F1ABA276BDBBCA8A7E8B /* DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DSL.h; path = Sources/NimbleObjectiveC/DSL.h; sourceTree = ""; }; - 2C12FE311471678F66F177EFA1D02222 /* RaisesException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RaisesException.swift; path = Sources/Nimble/Matchers/RaisesException.swift; sourceTree = ""; }; - 2C6A3FF19A3070F637BA3EB207A58659 /* JellyFadeInPresentationAnimator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JellyFadeInPresentationAnimator.swift; path = Jelly/Classes/JellyFadeInPresentationAnimator.swift; sourceTree = ""; }; - 2E8E430D83F3CC7F72E348A0B222C46F /* QuickTestSuite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickTestSuite.swift; path = Sources/Quick/QuickTestSuite.swift; sourceTree = ""; }; - 2FF69EB8C1C9234284BFB37FCE9D23D4 /* Nimble-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-dummy.m"; sourceTree = ""; }; - 301223B3EB74E21CDB1303C459B57231 /* ExampleHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleHooks.swift; path = Sources/Quick/Hooks/ExampleHooks.swift; sourceTree = ""; }; - 3276DE715636F61DFFDE3B068F88418A /* PostNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostNotification.swift; path = Sources/Nimble/Matchers/PostNotification.swift; sourceTree = ""; }; - 32964E944076AFED03E7BF06C0A06AB0 /* Pods_Jelly_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Jelly_Example.framework; path = "Pods-Jelly_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 358C5CE9A3BF3A1365D22576DCE92C31 /* CwlDarwinDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlDarwinDefinitions.swift; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlDarwinDefinitions.swift; sourceTree = ""; }; - 3718B918BEFD94E93859B9284AA81994 /* Equal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Equal.swift; path = Sources/Nimble/Matchers/Equal.swift; sourceTree = ""; }; - 37806CEB041B6F1DA90F47CC738C2636 /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Nimble.framework; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 38838690C7FCB8A320C0F7580365CB8B /* CwlCatchBadInstruction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlCatchBadInstruction.swift; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlCatchBadInstruction.swift; sourceTree = ""; }; - 38A82DE4A0130E4C946A904FEDDD74CA /* QuickSpec.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpec.m; path = Sources/QuickObjectiveC/QuickSpec.m; sourceTree = ""; }; - 38AA7B61E292C1CF5D3CC850A80F5DFE /* Jelly.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Jelly.framework; path = Jelly.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 393E0E59AB864543FA7641EE7E61605A /* ThrowError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowError.swift; path = Sources/Nimble/Matchers/ThrowError.swift; sourceTree = ""; }; - 3EA7EF46A7976B0FBD80E32D71A4E257 /* Pods-Jelly_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Jelly_Example-umbrella.h"; sourceTree = ""; }; - 42DD07575CFDE63DE6412F425FDBED71 /* SuiteHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SuiteHooks.swift; path = Sources/Quick/Hooks/SuiteHooks.swift; sourceTree = ""; }; - 43721E0BB49BF05FEDA30F3C53264CDD /* Pods-Jelly_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Jelly_Tests-frameworks.sh"; sourceTree = ""; }; - 467F00CAF06ADEF612F697F068843FB2 /* World+DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "World+DSL.h"; path = "Sources/QuickObjectiveC/DSL/World+DSL.h"; sourceTree = ""; }; - 46F8511B08505FC55B5329E6464AFDFA /* Contain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Contain.swift; path = Sources/Nimble/Matchers/Contain.swift; sourceTree = ""; }; - 48FBC678177B9AD2C7DE8B1059F8BAC3 /* SourceLocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SourceLocation.swift; path = Sources/Nimble/Utils/SourceLocation.swift; sourceTree = ""; }; - 4C2256ED78FCA069D0A67AE7996F700F /* BeNil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeNil.swift; path = Sources/Nimble/Matchers/BeNil.swift; sourceTree = ""; }; - 4D5BA02A339BFAC598B13254A845929F /* Jelly-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Jelly-umbrella.h"; sourceTree = ""; }; - 4E97EDDDEDAD07EB20F5E5E4A16056BA /* DSL+Wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DSL+Wait.swift"; path = "Sources/Nimble/DSL+Wait.swift"; sourceTree = ""; }; - 4FEA1DF1C7C22E7B20D2DC30FB9D3EF1 /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Sources/Quick/Configuration/Configuration.swift; sourceTree = ""; }; - 561C23FF26877422BF1F75F4BC11F182 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 5689A9DFCFAE2BDCCE427EB97661DCBA /* Functional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Functional.swift; path = Sources/Nimble/Utils/Functional.swift; sourceTree = ""; }; - 570631FA0517A859523BCDDDBBED67B5 /* Pods-Jelly_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Jelly_Tests.release.xcconfig"; sourceTree = ""; }; - 596E8B0FE44B4ECBBE4A0E71F8F7A8BC /* Jelly.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Jelly.modulemap; sourceTree = ""; }; - 5C4D786F262665CE8C9113FA91745753 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Quick/Filter.swift; sourceTree = ""; }; - 61C83B8B4A556ADB7CB613AD8A7E78B5 /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThanOrEqual.swift; path = Sources/Nimble/Matchers/BeLessThanOrEqual.swift; sourceTree = ""; }; - 637DB7A45FE5BB1290DBA08148286EEA /* Quick-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-prefix.pch"; sourceTree = ""; }; - 6406BD8D8C00F95B1722EC84BD0DFC71 /* Jelly.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Jelly.swift; path = Jelly/Classes/Jelly.swift; sourceTree = ""; }; - 65B4CDEF78BF13177A9303C1E765E5F6 /* World+DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "World+DSL.swift"; path = "Sources/Quick/DSL/World+DSL.swift"; sourceTree = ""; }; - 66219932202903DE7641EBA5603D159A /* Pods-Jelly_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Jelly_Example.release.xcconfig"; sourceTree = ""; }; - 6A9D19719FFB71B0D47572AB1BA8E037 /* CwlCatchException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlCatchException.swift; path = Sources/Lib/CwlPreconditionTesting/CwlCatchException/CwlCatchException.swift; sourceTree = ""; }; - 6BA4794DD94D5DE6BFFFEEC72B8C43E3 /* QuickSpecBase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpecBase.h; path = Sources/QuickSpecBase/include/QuickSpecBase.h; sourceTree = ""; }; - 6D2E298780429D096F1EC434CFC3B225 /* QuickConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickConfiguration.h; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.h; sourceTree = ""; }; - 6F4B04767442BB7BD15AAE24AA792327 /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThanOrEqualTo.swift; path = Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift; sourceTree = ""; }; - 71C9C2C08177BF35A3FD0A747DADCDF9 /* BeLogical.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLogical.swift; path = Sources/Nimble/Matchers/BeLogical.swift; sourceTree = ""; }; - 7247AAFF328D9D4EC5D7740AC628B80E /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; - 725EB33ADBE3FB6CD9638DCEF54736F8 /* JellyPresentationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JellyPresentationController.swift; path = Jelly/Classes/JellyPresentationController.swift; sourceTree = ""; }; - 728B660135AE89C557C10A6FCCB94D9B /* NMBExceptionCapture.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBExceptionCapture.h; path = Sources/NimbleObjectiveC/NMBExceptionCapture.h; sourceTree = ""; }; - 731177567616F5D676C628DB89BB2BFC /* ToSucceed.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToSucceed.swift; path = Sources/Nimble/Matchers/ToSucceed.swift; sourceTree = ""; }; - 73C1D1A0D20C667FAF4F01C3BA4AC451 /* Behavior.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Behavior.swift; path = Sources/Quick/Behavior.swift; sourceTree = ""; }; - 75B78AC1C0059E66BD95A9F0CD2D24F5 /* NSBundle+CurrentTestBundle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSBundle+CurrentTestBundle.swift"; path = "Sources/Quick/NSBundle+CurrentTestBundle.swift"; sourceTree = ""; }; - 782C6A0644CB087D98D17B89197F211F /* Pods-Jelly_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Jelly_Tests-acknowledgements.markdown"; sourceTree = ""; }; - 7BB3B5D20A1A447AF7763AD10B33964C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 7D9A924C203A11767BBF4D9C3737DA5D /* XCTestSuite+QuickTestSuiteBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestSuite+QuickTestSuiteBuilder.m"; path = "Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m"; sourceTree = ""; }; - 7E088B77C89183030BDE7BF0FD5A6E61 /* AdapterProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AdapterProtocols.swift; path = Sources/Nimble/Adapters/AdapterProtocols.swift; sourceTree = ""; }; - 7FA3B0D7D5D9D8EDF2641BCE7E45A71B /* AssertionRecorder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionRecorder.swift; path = Sources/Nimble/Adapters/AssertionRecorder.swift; sourceTree = ""; }; - 7FC6C2B1B0491AD6C97D1D57F9F176EA /* Pods-Jelly_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Jelly_Example.debug.xcconfig"; sourceTree = ""; }; - 7FDD084452EBDF969EBE029C72577A02 /* JellyConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JellyConstants.swift; path = Jelly/Classes/JellyConstants.swift; sourceTree = ""; }; - 8152C3AB4ECF2BA42CA9EAD577F6F404 /* XCTestObservationCenter+Register.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestObservationCenter+Register.m"; path = "Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m"; sourceTree = ""; }; - 82468B5D2EA727327AC939D9A8AB9476 /* Pods-Jelly_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Jelly_Example-acknowledgements.markdown"; sourceTree = ""; }; - 829CA47FBDF0A83BF67F7102D4CD40E6 /* ExampleGroup.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleGroup.swift; path = Sources/Quick/ExampleGroup.swift; sourceTree = ""; }; - 8452C5F4B63A4A0178E56CDC9E95DFE8 /* ExampleMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleMetadata.swift; path = Sources/Quick/ExampleMetadata.swift; sourceTree = ""; }; - 85003248050785BFEF966D1E89E5A847 /* Async.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Async.swift; path = Sources/Nimble/Utils/Async.swift; sourceTree = ""; }; - 85886496CDEC909E048C8D8082B296E4 /* Nimble.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Nimble.modulemap; sourceTree = ""; }; - 8737F3E0C1FB1ABDDC8F61A081B1F76B /* World.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = World.swift; path = Sources/Quick/World.swift; sourceTree = ""; }; - 8A6B34FE5E08BAF87E042A2629840DAD /* Match.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Match.swift; path = Sources/Nimble/Matchers/Match.swift; sourceTree = ""; }; - 8B567BA254EE2EE05EF27AD3A348466E /* Pods-Jelly_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Jelly_Example-acknowledgements.plist"; sourceTree = ""; }; - 8C017FD42384880C826F224329BE5F90 /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleXCTestHandler.swift; path = Sources/Nimble/Adapters/NimbleXCTestHandler.swift; sourceTree = ""; }; - 8CD53270A7F033A8E966616E7F756B18 /* Jelly-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Jelly-dummy.m"; sourceTree = ""; }; - 8EABC671AC0F5260B11C5E39AF005600 /* JellyFadeInPresentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JellyFadeInPresentation.swift; path = Jelly/Classes/JellyFadeInPresentation.swift; sourceTree = ""; }; - 8EF0EA564D82AB46B710DC6096C1EA6B /* QuickConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickConfiguration.m; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.m; sourceTree = ""; }; - 912DC6AF27F5A0EB0D0E4D6E237216F4 /* CwlCatchException.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlCatchException.h; path = Sources/Lib/CwlPreconditionTesting/CwlCatchExceptionSupport/include/CwlCatchException.h; sourceTree = ""; }; - 9245B48A46AAC45502A6B8A2AB745038 /* HooksPhase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HooksPhase.swift; path = Sources/Quick/Hooks/HooksPhase.swift; sourceTree = ""; }; + 04CC7F94266B7E574DA9E0B737AD6EF9 /* CwlCatchException.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlCatchException.m; path = Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/CwlCatchException.m; sourceTree = ""; }; + 0846448D09624616444BD5134A1203D2 /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Sources/Quick/Configuration/Configuration.swift; sourceTree = ""; }; + 088BE09AECC2698F26D11549C759E521 /* ExampleGroup.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleGroup.swift; path = Sources/Quick/ExampleGroup.swift; sourceTree = ""; }; + 09DBC35316A67A89802EFFCA924C0918 /* InteractionConfigurationProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InteractionConfigurationProvider.swift; sourceTree = ""; }; + 0A68B97167C83E75EDE964FFE91AEC9B /* TouchVisualizer.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TouchVisualizer.xcconfig; sourceTree = ""; }; + 0AB9C0E30FFD2F19217224F230405282 /* Pods-Jelly_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Jelly_Example.release.xcconfig"; sourceTree = ""; }; + 0B47AA90CBFE5954E52A4309C13CBBC5 /* BeEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeEmpty.swift; path = Sources/Nimble/Matchers/BeEmpty.swift; sourceTree = ""; }; + 0CC44AFA150A0CFF24B353319B41146A /* TouchVisualizer-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "TouchVisualizer-dummy.m"; sourceTree = ""; }; + 0D9F3C1C9EABE7290731076E3B8CF9D1 /* BeLessThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThan.swift; path = Sources/Nimble/Matchers/BeLessThan.swift; sourceTree = ""; }; + 0DCD3F0A440882E2592B2762C30C59A6 /* ExampleHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleHooks.swift; path = Sources/Quick/Hooks/ExampleHooks.swift; sourceTree = ""; }; + 0EFA670EC3A1A9FAE8649B0AFA5F33F1 /* QuickConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickConfiguration.m; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.m; sourceTree = ""; }; + 0F59B268A354F5C8FAB7EEC8B262444D /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1089E480B232FF6A11A3B16306763021 /* Direction+EdgeHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Direction+EdgeHelper.swift"; sourceTree = ""; }; + 1160831F489A83F2E71F3237380508D4 /* CwlMachBadInstructionHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlMachBadInstructionHandler.h; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h; sourceTree = ""; }; + 12877A6C39454B09A71B6432428EF643 /* Nimble-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Nimble-dummy.m"; sourceTree = ""; }; + 13B0483C2FE51C1DA7E45625C2D7EE45 /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Quick/DSL/DSL.swift; sourceTree = ""; }; + 157D741AE0729C5DBC91FC32AC9F5110 /* SatisfyAllOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SatisfyAllOf.swift; path = Sources/Nimble/Matchers/SatisfyAllOf.swift; sourceTree = ""; }; + 16058921B2D948B462510589BA13898E /* Pods_Jelly_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Jelly_Tests.framework; path = "Pods-Jelly_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 1659222AD64CCA597F148530E7695E75 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 17DED76AA5A94F85DC50F6BD455B79BF /* Direction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Direction.swift; sourceTree = ""; }; + 17DF03237581043F86B86780F4FC15BC /* Pods-Jelly_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Jelly_Tests-umbrella.h"; sourceTree = ""; }; + 1822FD917660B068E38C82469523F9B0 /* PresentationHeightProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationHeightProvider.swift; sourceTree = ""; }; + 197388BE63349DDE4956191F9C68932A /* BeGreaterThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThan.swift; path = Sources/Nimble/Matchers/BeGreaterThan.swift; sourceTree = ""; }; + 1C2D59C58087D18ACC3E5AB791CC0484 /* PresentationUIConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationUIConfiguration.swift; sourceTree = ""; }; + 1CBE0DC13312B13670858D3C9EF5C4C0 /* QCKDSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QCKDSL.h; path = Sources/QuickObjectiveC/DSL/QCKDSL.h; sourceTree = ""; }; + 1E12E8BD69B22FA3A3EC53C844D11E10 /* Pods_Jelly_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Jelly_Example.framework; path = "Pods-Jelly_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 2120927A09044CFD1D24D26454EC9199 /* Nimble-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-prefix.pch"; sourceTree = ""; }; + 218136F27C201C83B9D57B0C42D6F91D /* CoverAnimator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CoverAnimator.swift; sourceTree = ""; }; + 2216869779F9686263BB08850C1079C9 /* Jelly.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Jelly.xcconfig; sourceTree = ""; }; + 228844A9F87E4192BD8C40A22CA669DB /* Pods-Jelly_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Jelly_Tests-dummy.m"; sourceTree = ""; }; + 25E90B619B5C3A2CB8EDA6F768B3B854 /* Nimble.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Nimble.h; path = Sources/Nimble/Nimble.h; sourceTree = ""; }; + 266870BF78B80ED449ABA047A0D44C09 /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = Sources/Nimble/Utils/Errors.swift; sourceTree = ""; }; + 272851DB38A28F446F5931D320F5108F /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Quick.framework; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 27A842237DBB504849240C780B3C516B /* HooksPhase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HooksPhase.swift; path = Sources/Quick/Hooks/HooksPhase.swift; sourceTree = ""; }; + 2857F01CF61CFD8CCA443B02BF8CB771 /* DragMode.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DragMode.swift; sourceTree = ""; }; + 28D147C11DD41351CCC587548593CCC9 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Quick/Filter.swift; sourceTree = ""; }; + 2BBA67F3FB14446597F4BAEB6DD90057 /* Jelly-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Jelly-dummy.m"; sourceTree = ""; }; + 2CDD4099666421EF8778C2ADA179F87A /* PresentationAlignmentProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationAlignmentProvider.swift; sourceTree = ""; }; + 2D8555A6FB62176BF9C8B92CC7EB8407 /* Pods-Jelly_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Jelly_Example.modulemap"; sourceTree = ""; }; + 2E29F6AC390B8EB21D73A46E9122BBBB /* CoverPresentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CoverPresentation.swift; sourceTree = ""; }; + 2F392C614FBAFE5483B6C12D2701B047 /* UIViewControllerAnimatedTransitioning+Convenience.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIViewControllerAnimatedTransitioning+Convenience.swift"; sourceTree = ""; }; + 2F7235A89BF04113F682D7F521BA7FDE /* NSBundle+CurrentTestBundle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSBundle+CurrentTestBundle.swift"; path = "Sources/Quick/NSBundle+CurrentTestBundle.swift"; sourceTree = ""; }; + 2F7D6A41179EB81C7A2085298870FDB8 /* CwlPreconditionTesting.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlPreconditionTesting.h; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h; sourceTree = ""; }; + 2FE82651A24B4278D7D4F6FEDB248088 /* QuickSpec.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpec.m; path = Sources/QuickObjectiveC/QuickSpec.m; sourceTree = ""; }; + 31184022E189DD64414E2576456FDED8 /* ExpectationMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpectationMessage.swift; path = Sources/Nimble/ExpectationMessage.swift; sourceTree = ""; }; + 32DD7B7CA9E0432DD3BB6BAB6DFEB238 /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/Nimble/Expression.swift; sourceTree = ""; }; + 33708C75E8787278AAC3A515E5BB4D75 /* Callsite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Callsite.swift; path = Sources/Quick/Callsite.swift; sourceTree = ""; }; + 3543AC392CF460A47042F28C00D7303D /* Jelly-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Jelly-umbrella.h"; sourceTree = ""; }; + 37FC21B23F9F374968D8A8E37774345F /* Pods-Jelly_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Jelly_Example.debug.xcconfig"; sourceTree = ""; }; + 385304331C6F91E28810B6290729B660 /* TouchVisualizer.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = TouchVisualizer.modulemap; sourceTree = ""; }; + 3880CAD03796E2DC8DFC9B9E3B2E9428 /* World.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = World.swift; path = Sources/Quick/World.swift; sourceTree = ""; }; + 3ED20A4ED7F29CDE83EB3DF00FB6FC62 /* CwlDarwinDefinitions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlDarwinDefinitions.swift; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlDarwinDefinitions.swift; sourceTree = ""; }; + 3F0EDD3869E0831904170852B53BD787 /* Pods-Jelly_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Jelly_Tests-resources.sh"; sourceTree = ""; }; + 4133A61C654D96C3387A6F56FB3C83D3 /* PresentationAnimatorProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationAnimatorProvider.swift; sourceTree = ""; }; + 41BC14DD346C33EFA77474BABF5729C0 /* Size.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Size.swift; sourceTree = ""; }; + 41D8158295CF3E762A07AD5ED4E27615 /* PresentationType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationType.swift; sourceTree = ""; }; + 4226EEA999978D8B72C90CFCACE5AE85 /* Nimble-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-umbrella.h"; sourceTree = ""; }; + 424F8E2E5CC96CEE27CB59BD2BCF2BCF /* PresentationDirectionDismissProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationDirectionDismissProvider.swift; sourceTree = ""; }; + 4554AB2C7A6F1887524E4A848E0ADEA5 /* BeNil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeNil.swift; path = Sources/Nimble/Matchers/BeNil.swift; sourceTree = ""; }; + 4594B4B082BE8DE3284C3B71494937C1 /* Functional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Functional.swift; path = Sources/Nimble/Utils/Functional.swift; sourceTree = ""; }; + 4747224FBAF235CB5311FB6776B83328 /* Spring+Values.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Spring+Values.swift"; sourceTree = ""; }; + 48B0D71A44292C8B702C04CF7E2F55BC /* QuickSpecBase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpecBase.h; path = Sources/QuickSpecBase/include/QuickSpecBase.h; sourceTree = ""; }; + 49219B0764B50AC29F12A1C3DC4A7B1E /* VerticalAlignment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = VerticalAlignment.swift; sourceTree = ""; }; + 49FF1F37EFAE124A8538EF5EBC51B421 /* Nimble.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Nimble.modulemap; sourceTree = ""; }; + 4C93BBBD8865ABFDCE72D4D0BF2400C0 /* TouchView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TouchView.swift; path = TouchVisualizer/TouchView.swift; sourceTree = ""; }; + 4F0DE168D68F9193C94D4F9F47B54468 /* Behavior.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Behavior.swift; path = Sources/Quick/Behavior.swift; sourceTree = ""; }; + 50D41FF8BE448618C9764A1ACF5962DD /* AdapterProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AdapterProtocols.swift; path = Sources/Nimble/Adapters/AdapterProtocols.swift; sourceTree = ""; }; + 51E34F8ED7F13C3ECA2FC921AF52E517 /* QuickSelectedTestSuiteBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickSelectedTestSuiteBuilder.swift; path = Sources/Quick/QuickSelectedTestSuiteBuilder.swift; sourceTree = ""; }; + 537096846FE79477222E055E5E9D012B /* Duration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Duration.swift; sourceTree = ""; }; + 53F0BB4CBC88C0F10747AFEDB2FF74D7 /* Match.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Match.swift; path = Sources/Nimble/Matchers/Match.swift; sourceTree = ""; }; + 567820F04B2F5E322BDECBF14AE19EF9 /* Stringers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stringers.swift; path = Sources/Nimble/Utils/Stringers.swift; sourceTree = ""; }; + 58CBDF37B9C1503053A89B31D14F8B3F /* Pods-Jelly_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Jelly_Tests-acknowledgements.markdown"; sourceTree = ""; }; + 5B15A675AA25F45EFE0DA199CE553B13 /* QuickTestSuite.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickTestSuite.swift; path = Sources/Quick/QuickTestSuite.swift; sourceTree = ""; }; + 5BBA82243AF7504D591AC35041B220E9 /* QCKDSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QCKDSL.m; path = Sources/QuickObjectiveC/DSL/QCKDSL.m; sourceTree = ""; }; + 5CB358FD18B22C8AB37036F562CE9FF0 /* BeLogical.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLogical.swift; path = Sources/Nimble/Matchers/BeLogical.swift; sourceTree = ""; }; + 5D55E1F2C48D0D630433228D40DDDF22 /* PresentationSizeProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationSizeProtocol.swift; sourceTree = ""; }; + 5F4184BC3FF22ACEFDB62F88267C36D5 /* SuiteHooks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SuiteHooks.swift; path = Sources/Quick/Hooks/SuiteHooks.swift; sourceTree = ""; }; + 61A97243EBD76C4212926B4DA961AE25 /* TouchVisualizer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = TouchVisualizer.framework; path = TouchVisualizer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 61D4E86FFAFAB1212D56FBCE47063315 /* FadePresentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = FadePresentation.swift; sourceTree = ""; }; + 625B26AA59DCCA991D52BEF7196378C4 /* PresentationTiming.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationTiming.swift; sourceTree = ""; }; + 6266AB3F9F9E54E8437F52FC287F25A7 /* InteractionConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InteractionConfiguration.swift; sourceTree = ""; }; + 62BFD7AF7FB1F3EDF4EA85D844569624 /* SourceLocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SourceLocation.swift; path = Sources/Nimble/Utils/SourceLocation.swift; sourceTree = ""; }; + 62FCED261837F758860C1765F94AC364 /* DSL+Wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DSL+Wait.swift"; path = "Sources/Nimble/DSL+Wait.swift"; sourceTree = ""; }; + 66F5B0A0D4265D0A7F0DF52BC03DA4A4 /* LiveUpdateError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LiveUpdateError.swift; sourceTree = ""; }; + 67A69DD81D8ECDA0C288F022126790C3 /* Visualizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Visualizer.swift; path = TouchVisualizer/Visualizer.swift; sourceTree = ""; }; + 67B5D4872A05553D49A2DF83D297BCEA /* NMBExpectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBExpectation.swift; path = Sources/Nimble/Adapters/NMBExpectation.swift; sourceTree = ""; }; + 68C662027E8A1C42ECC845231DF6FEFC /* PresentationTimingInformationProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationTimingInformationProvider.swift; sourceTree = ""; }; + 68E8F5AA95E065C35DFCC282555C8A5A /* Contain.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Contain.swift; path = Sources/Nimble/Matchers/Contain.swift; sourceTree = ""; }; + 68F35295CCEA9F4010583FA57CA5405F /* MatcherProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherProtocols.swift; path = Sources/Nimble/Matchers/MatcherProtocols.swift; sourceTree = ""; }; + 6A882F64221501550BB9D2DEF6F4AB6C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 6B83EC3B38D0BD6BF558AD7B3AAB9196 /* Quick-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-umbrella.h"; sourceTree = ""; }; + 6BD07EF4BDBF4A44FD439BA0FE6C226A /* BeIdenticalTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeIdenticalTo.swift; path = Sources/Nimble/Matchers/BeIdenticalTo.swift; sourceTree = ""; }; + 6C3778EDDDB10CB1DF14FA3B9657CA2E /* QuickSpec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpec.h; path = Sources/QuickObjectiveC/QuickSpec.h; sourceTree = ""; }; + 6DF962BF0DEA31B9398C2F18FC52A323 /* Await.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Await.swift; path = Sources/Nimble/Utils/Await.swift; sourceTree = ""; }; + 71049A15412B793B718C18C42C5C40E8 /* Jelly.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; path = Jelly.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 7314F3E7754355A85BB6B5C04CA92382 /* AssertionDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionDispatcher.swift; path = Sources/Nimble/Adapters/AssertionDispatcher.swift; sourceTree = ""; }; + 734E9D36083A5CEB4FAFFA2686966AF0 /* ErrorUtility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ErrorUtility.swift; path = Sources/Quick/ErrorUtility.swift; sourceTree = ""; }; + 746F20E704821A5B075984A2ED48B960 /* World+DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "World+DSL.swift"; path = "Sources/Quick/DSL/World+DSL.swift"; sourceTree = ""; }; + 74E734FEA44534A65F01108915FF8C3E /* PresentationWidthProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationWidthProvider.swift; sourceTree = ""; }; + 75E56F91363B1925AA3C597614223873 /* QuickConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickConfiguration.h; path = Sources/QuickObjectiveC/Configuration/QuickConfiguration.h; sourceTree = ""; }; + 76FC08B06351D893CB9D678B5ACC4A89 /* NimbleEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleEnvironment.swift; path = Sources/Nimble/Adapters/NimbleEnvironment.swift; sourceTree = ""; }; + 788A40FBD0CC8E60385139BA9D044065 /* NMBObjCMatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBObjCMatcher.swift; path = Sources/Nimble/Adapters/NMBObjCMatcher.swift; sourceTree = ""; }; + 798A09EB29BB03821C5844521295D6F8 /* CombinedTimingCurveProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CombinedTimingCurveProvider.swift; sourceTree = ""; }; + 79B84C337A00CF3A6955E1B9EDA7D30E /* Pods-Jelly_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Jelly_Example-dummy.m"; sourceTree = ""; }; + 7A77FA09C3C205B7CC1AFF09FBCF6E6C /* Quick.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Quick.xcconfig; sourceTree = ""; }; + 7ACA6BEECAB84430A29EE4BCDFD6F79A /* RaisesException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RaisesException.swift; path = Sources/Nimble/Matchers/RaisesException.swift; sourceTree = ""; }; + 7BB4FEDE8A834E0FEB9971CE9F7C6B6C /* Closures.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Closures.swift; path = Sources/Quick/Hooks/Closures.swift; sourceTree = ""; }; + 7D8EA033ACA3A6E71F559401AA71134E /* BeAKindOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAKindOf.swift; path = Sources/Nimble/Matchers/BeAKindOf.swift; sourceTree = ""; }; + 803798B45BA51A60FAE5C58408157425 /* BeCloseTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeCloseTo.swift; path = Sources/Nimble/Matchers/BeCloseTo.swift; sourceTree = ""; }; + 81C05F7673502076BBF7B8987824B5E8 /* Quick-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Quick-prefix.pch"; sourceTree = ""; }; + 85037AF127EB293D3150CD2F636AD58F /* BeginWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeginWith.swift; path = Sources/Nimble/Matchers/BeginWith.swift; sourceTree = ""; }; + 8606BBC23BBBD314A10018A71EF88853 /* CwlCatchException.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlCatchException.h; path = Carthage/Checkouts/CwlCatchException/Sources/CwlCatchExceptionSupport/include/CwlCatchException.h; sourceTree = ""; }; + 8610EDF1C2C7128D11D45C08DCB6C4BE /* Pods-Jelly_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Jelly_Example-frameworks.sh"; sourceTree = ""; }; + 87378AA8EEA6DAB96F4E3E2B37935625 /* ThrowAssertion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowAssertion.swift; path = Sources/Nimble/Matchers/ThrowAssertion.swift; sourceTree = ""; }; + 878FD9A1699E94775AC0C28BE53A9540 /* HaveCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HaveCount.swift; path = Sources/Nimble/Matchers/HaveCount.swift; sourceTree = ""; }; + 884D43269F037BE17858CACB7F93DA82 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 8A2198B04D3617BD022B461E07394879 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8A4A356EBA75B9130AE0691B7CCA2DB9 /* Size+Equatable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Size+Equatable.swift"; sourceTree = ""; }; + 8AAFEC712B16CE9933A1F11E8FC5B910 /* NMBExceptionCapture.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBExceptionCapture.m; path = Sources/NimbleObjectiveC/NMBExceptionCapture.m; sourceTree = ""; }; + 8DED1AAAB0C78D4DB52DDDD117FAC5BF /* Expectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expectation.swift; path = Sources/Nimble/Expectation.swift; sourceTree = ""; }; + 9018A052A181232EBE7D0A1551FBF379 /* ToSucceed.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToSucceed.swift; path = Sources/Nimble/Matchers/ToSucceed.swift; sourceTree = ""; }; + 91E91FEF09AE9662313AA8828A1AC3A0 /* Pods-Jelly_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Jelly_Tests.release.xcconfig"; sourceTree = ""; }; + 92506BB54D506728D7327F0BD6BA8C40 /* NMBStringify.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBStringify.m; path = Sources/NimbleObjectiveC/NMBStringify.m; sourceTree = ""; }; 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 95614EC69755CACD43F81B3D967B88A9 /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAnInstanceOf.swift; path = Sources/Nimble/Matchers/BeAnInstanceOf.swift; sourceTree = ""; }; - 980107C107885320335941A4471C9DBA /* BeginWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeginWith.swift; path = Sources/Nimble/Matchers/BeginWith.swift; sourceTree = ""; }; - 98884B98AC8059074D67FE0CD2C32438 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 98DA9221D3C3670D09A3418B64C4293F /* BeGreaterThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThan.swift; path = Sources/Nimble/Matchers/BeGreaterThan.swift; sourceTree = ""; }; - 9C307734CC6DDA96E75DB8F886E6E029 /* MatchError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatchError.swift; path = Sources/Nimble/Matchers/MatchError.swift; sourceTree = ""; }; - 9C78BF27F3A2B7B1368FE2E4317B6557 /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Quick/DSL/DSL.swift; sourceTree = ""; }; - 9CBFA93649DC414474690ACD27048025 /* Predicate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Predicate.swift; path = Sources/Nimble/Matchers/Predicate.swift; sourceTree = ""; }; - 9D37783B2E2DCA65BF2F54F827795778 /* JellyPresentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JellyPresentation.swift; path = Jelly/Classes/JellyPresentation.swift; sourceTree = ""; }; - 9E6D0E06336A816BC0192B9FEC92119A /* AssertionDispatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionDispatcher.swift; path = Sources/Nimble/Adapters/AssertionDispatcher.swift; sourceTree = ""; }; - A2104EEA5E8F1528DDF41A689B5A01FF /* NimbleEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleEnvironment.swift; path = Sources/Nimble/Adapters/NimbleEnvironment.swift; sourceTree = ""; }; - A271F0BB61B5E4A69A22F05AE8C0E6FB /* DSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DSL.m; path = Sources/NimbleObjectiveC/DSL.m; sourceTree = ""; }; - A31B12010AD7A33648A58605520F09DA /* Pods-Jelly_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Jelly_Tests.debug.xcconfig"; sourceTree = ""; }; - A7BB0E7B9D5419C5E9F9C13F400AFA46 /* Pods-Jelly_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-Jelly_Example.modulemap"; sourceTree = ""; }; - AAA8C71B8A49F36B4627F961D9F8A9C3 /* Pods-Jelly_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-Jelly_Tests.modulemap"; sourceTree = ""; }; - AC9720E44CC5EEB092E90D118DC69352 /* NMBStringify.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBStringify.h; path = Sources/NimbleObjectiveC/NMBStringify.h; sourceTree = ""; }; - AE311FD9A0241C1B0B383CF262BDBB82 /* Jelly.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Jelly.xcconfig; sourceTree = ""; }; - AE81B79A8CD03840E8A5EEEE5860BA15 /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SatisfyAnyOf.swift; path = Sources/Nimble/Matchers/SatisfyAnyOf.swift; sourceTree = ""; }; - AF452C29C1C0442F7AAD6480F6D4E960 /* Pods_Jelly_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Jelly_Tests.framework; path = "Pods-Jelly_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - B2D40E21FFD40BEFA4C8C5B04B4FEE82 /* Expectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expectation.swift; path = Sources/Nimble/Expectation.swift; sourceTree = ""; }; - B38F7EB4258060BAA361D06EF1B16D9B /* Example.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Example.swift; path = Sources/Quick/Example.swift; sourceTree = ""; }; - B3B6045E75C2D2CBF310BFC536C5F1E7 /* EndWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EndWith.swift; path = Sources/Nimble/Matchers/EndWith.swift; sourceTree = ""; }; - B4903A86024F5425CE9A8BE57C1F8E5A /* CwlMachBadInstructionHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlMachBadInstructionHandler.h; path = Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/include/CwlMachBadInstructionHandler.h; sourceTree = ""; }; - B62FC8D3EFD93B2D3877DF87DBB12631 /* Quick.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Quick.xcconfig; sourceTree = ""; }; - B6D48A33A49B17952C7ABB6214240CB9 /* URL+FileName.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+FileName.swift"; path = "Sources/Quick/URL+FileName.swift"; sourceTree = ""; }; - B9985CC02179403DC54B3460DCE486AC /* QCKDSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QCKDSL.h; path = Sources/QuickObjectiveC/DSL/QCKDSL.h; sourceTree = ""; }; - B99D6596391EB4AD2D146D0851746820 /* Expression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Expression.swift; path = Sources/Nimble/Expression.swift; sourceTree = ""; }; - BC42EEC7E1FD4F0ED085C79F34477C8F /* ContainElementSatisfying.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContainElementSatisfying.swift; path = Sources/Nimble/Matchers/ContainElementSatisfying.swift; sourceTree = ""; }; - C003A3ADDB78ADAF3CE91C08A0E8A033 /* Quick.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Quick.framework; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C22EE1E30D2DAA8C037AF664DF8E96BE /* Quick.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Quick.modulemap; sourceTree = ""; }; - C35894679DDD01011CBF77D4C6B8F308 /* Pods-Jelly_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Jelly_Example-resources.sh"; sourceTree = ""; }; - C3FE50EC469768C3CD434A2E18D7E9B4 /* mach_excServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mach_excServer.h; path = Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/mach_excServer.h; sourceTree = ""; }; - C562707E04357F17989661F5AEC83C3D /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C5D562693A407A8D771D89AB6D5C7ADB /* Jelly-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Jelly-prefix.pch"; sourceTree = ""; }; - C9B8B90E0F57B131BB3AD78E0F412393 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; - CBE5B2FAAA37D31347BA9DACE8438F13 /* Pods-Jelly_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Jelly_Tests-acknowledgements.plist"; sourceTree = ""; }; - CCED5C53076B7249E95E0D1D43E1B985 /* FailureMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FailureMessage.swift; path = Sources/Nimble/FailureMessage.swift; sourceTree = ""; }; - CF96C550BAD2A4F1B36336E4950F81AC /* BeLessThan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThan.swift; path = Sources/Nimble/Matchers/BeLessThan.swift; sourceTree = ""; }; - D18A3F4B9E1AFFEC61F2CB2F0BE05DED /* NMBExpectation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NMBExpectation.swift; path = Sources/Nimble/Adapters/NMBExpectation.swift; sourceTree = ""; }; - D3FFF8B1DA954395FEB22B2010BA70AE /* Pods-Jelly_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Jelly_Example-dummy.m"; sourceTree = ""; }; - D5EBE08A3B758919CB15F7C75D878D1D /* Nimble.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Nimble.xcconfig; sourceTree = ""; }; - D61A65644B128A845AB3BF3D8631CC4C /* Stringers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stringers.swift; path = Sources/Nimble/Utils/Stringers.swift; sourceTree = ""; }; - D685C0D509328CD8778F99DD53A49A48 /* Closures.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Closures.swift; path = Sources/Quick/Hooks/Closures.swift; sourceTree = ""; }; - D6C3B6DAC9EE276DD752D93EAED6E88B /* ExpectationMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpectationMessage.swift; path = Sources/Nimble/ExpectationMessage.swift; sourceTree = ""; }; - D6E779444F549BF86B8E3F5D643907F4 /* Pods-Jelly_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Jelly_Tests-umbrella.h"; sourceTree = ""; }; - DBE27E6C449AFB6AD96AD5284AD962B9 /* Pods-Jelly_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Jelly_Tests-dummy.m"; sourceTree = ""; }; - DD1B93E0B5F44C69536B8D236A10490D /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DDF04AEFCC4B011565BFFBFFF52B2FCE /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - DE147446A1225BA68EA82615B1436CC1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - DEA46A1F5BD30B49A32329EE1FDF7CC6 /* Pods-Jelly_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Jelly_Example-frameworks.sh"; sourceTree = ""; }; - E2D9897D646E2BB9FBF73704C04440B2 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - E32F5B894304A324CD56AB687A5D06B2 /* NMBStringify.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NMBStringify.m; path = Sources/NimbleObjectiveC/NMBStringify.m; sourceTree = ""; }; - E585A4F6C1434FD922B8371E432B5051 /* QuickSpecBase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpecBase.m; path = Sources/QuickSpecBase/QuickSpecBase.m; sourceTree = ""; }; - E6E780E005CD78D86050E2F1C9B86227 /* AllPass.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AllPass.swift; path = Sources/Nimble/Matchers/AllPass.swift; sourceTree = ""; }; - EA8315675F3D2B2385E834043F85C676 /* QuickSpec.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = QuickSpec.h; path = Sources/QuickObjectiveC/QuickSpec.h; sourceTree = ""; }; - EAFAA3CA1B6ED55914944D32D60CD692 /* CwlBadInstructionException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlBadInstructionException.swift; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/CwlBadInstructionException.swift; sourceTree = ""; }; - EC6C9EB907A69CCE62EECC7E46F4F55E /* JellySlideInPresentationAnimator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JellySlideInPresentationAnimator.swift; path = Jelly/Classes/JellySlideInPresentationAnimator.swift; sourceTree = ""; }; - EC8D36EDFA340683FD5DAEB9875AB2C5 /* BeEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeEmpty.swift; path = Sources/Nimble/Matchers/BeEmpty.swift; sourceTree = ""; }; - EF51629E9BBE4FA04992668A7567A852 /* MatcherProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherProtocols.swift; path = Sources/Nimble/Matchers/MatcherProtocols.swift; sourceTree = ""; }; - F02A82F99C5626988794EEDB37318A12 /* Nimble.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Nimble.h; path = Sources/Nimble/Nimble.h; sourceTree = ""; }; - F4C7D6328493B73EF741AC61F4CEF01E /* QuickSelectedTestSuiteBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = QuickSelectedTestSuiteBuilder.swift; path = Sources/Quick/QuickSelectedTestSuiteBuilder.swift; sourceTree = ""; }; - F4F188E8BF10EA41AA12912175B25178 /* CwlMachBadInstructionHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlMachBadInstructionHandler.m; path = Sources/Lib/CwlPreconditionTesting/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m; sourceTree = ""; }; - F67A2DFCB98D4ECC29A99E91703B507D /* ThrowAssertion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowAssertion.swift; path = Sources/Nimble/Matchers/ThrowAssertion.swift; sourceTree = ""; }; - F82446D8FE90C03C4E8B4F37FDF4E4E1 /* Nimble-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Nimble-prefix.pch"; sourceTree = ""; }; - F83B921F09A6958C37B8A1A5E64C4264 /* BeIdenticalTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeIdenticalTo.swift; path = Sources/Nimble/Matchers/BeIdenticalTo.swift; sourceTree = ""; }; - F8DF89EBDCAF5E0E6AD1B667DA4FBCFC /* BeVoid.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeVoid.swift; path = Sources/Nimble/Matchers/BeVoid.swift; sourceTree = ""; }; - F92D220FEB1399287C37F2660BABEB4F /* BeCloseTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeCloseTo.swift; path = Sources/Nimble/Matchers/BeCloseTo.swift; sourceTree = ""; }; - FACEDBDE373DB782A302E0FB8F43B88F /* Pods-Jelly_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Jelly_Tests-resources.sh"; sourceTree = ""; }; - FB3FE3EC8226C0B8E6FC7B845B39DEDC /* HaveCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HaveCount.swift; path = Sources/Nimble/Matchers/HaveCount.swift; sourceTree = ""; }; - FBDDD402C136C4C7E06650F0EB6E9CD6 /* BeAKindOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAKindOf.swift; path = Sources/Nimble/Matchers/BeAKindOf.swift; sourceTree = ""; }; - FC004067434874641C7FD573C6D54FC8 /* CwlPreconditionTesting.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CwlPreconditionTesting.h; path = Sources/Lib/CwlPreconditionTesting/CwlPreconditionTesting/Mach/CwlPreconditionTesting.h; sourceTree = ""; }; - FF3F337754E5DE1590D4DCE4E36AD91F /* JellySlideInPresentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JellySlideInPresentation.swift; path = Jelly/Classes/JellySlideInPresentation.swift; sourceTree = ""; }; - FFA739FCCF461022D3476D9AC0A12969 /* AsyncMatcherWrapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncMatcherWrapper.swift; path = Sources/Nimble/Matchers/AsyncMatcherWrapper.swift; sourceTree = ""; }; + 9409D16C26350406F62588CE2510EF1B /* DSL.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DSL.m; path = Sources/NimbleObjectiveC/DSL.m; sourceTree = ""; }; + 9433251C9A3362E53C57E77E1563DBA7 /* PresentationDirectionShowProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationDirectionShowProvider.swift; sourceTree = ""; }; + 95F4ECC691CF2ADA63EF9FD0C34099E7 /* SlideAnimator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SlideAnimator.swift; sourceTree = ""; }; + 9724C077CE7A513AA8A1D3DB92BAC86A /* QuickSpecBase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = QuickSpecBase.m; path = Sources/QuickSpecBase/QuickSpecBase.m; sourceTree = ""; }; + 996E055B10E5F8588ED8B71AB226C42E /* XCTestSuite+QuickTestSuiteBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestSuite+QuickTestSuiteBuilder.m"; path = "Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m"; sourceTree = ""; }; + 99D660B556AD0425BA1CD57E1BBD4CF4 /* Pods-Jelly_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Jelly_Example-umbrella.h"; sourceTree = ""; }; + 9D408FEE27A43A863913BC57573CC1FC /* UIView+RoundCorners.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIView+RoundCorners.swift"; sourceTree = ""; }; + 9D84EAD8BB8842D6543482754209A9E3 /* Quick.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Quick.h; path = Sources/QuickObjectiveC/Quick.h; sourceTree = ""; }; + 9F1A7ACC6DA0250A6997C674FA91EB44 /* TouchVisualizer-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TouchVisualizer-prefix.pch"; sourceTree = ""; }; + A08B204CBEF53B76667C6107CEC871BD /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A12564DCC02B79A051553537445C1096 /* Pods-Jelly_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Jelly_Tests.modulemap"; sourceTree = ""; }; + A174B11A8CDEDF11FA2758F7AC37A372 /* PresentationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationController.swift; sourceTree = ""; }; + A19E199A0F2A999E89145AAC47C047F6 /* PresentationInteractiveAnimatorProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationInteractiveAnimatorProvider.swift; sourceTree = ""; }; + A209199E40D349E3E6D12DCCBA8E0CC4 /* Spring.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Spring.swift; sourceTree = ""; }; + A84F4188F0FA05A478D3DC28A5F39B85 /* PostNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PostNotification.swift; path = Sources/Nimble/Matchers/PostNotification.swift; sourceTree = ""; }; + A9CEE68A6FD6F85E4FF9CA16876648E6 /* NimbleXCTestHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NimbleXCTestHandler.swift; path = Sources/Nimble/Adapters/NimbleXCTestHandler.swift; sourceTree = ""; }; + B0008470615ADF5EEE6D320EB32A985A /* SatisfyAnyOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SatisfyAnyOf.swift; path = Sources/Nimble/Matchers/SatisfyAnyOf.swift; sourceTree = ""; }; + B05B2A0CE73CCD3A99AF938AD1145BD8 /* FadeAnimator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = FadeAnimator.swift; sourceTree = ""; }; + B0C2F7D5E07EFDD0FB9CDAC5174321B3 /* TouchVisualizer-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "TouchVisualizer-umbrella.h"; sourceTree = ""; }; + B165D03AAB19A47056D37D1E2BD923B9 /* CwlBadInstructionException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlBadInstructionException.swift; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlBadInstructionException.swift; sourceTree = ""; }; + B1E3BDC86641E884E556E51E4D6D8BBF /* Direction+Orientation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Direction+Orientation.swift"; sourceTree = ""; }; + B330EAEAE470617DB666786F29A5D3FD /* Async.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Async.swift; path = Sources/Nimble/Matchers/Async.swift; sourceTree = ""; }; + B4C632753BBCE6EFBB3A1EE5DDE93281 /* HorizontalAlignment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HorizontalAlignment.swift; sourceTree = ""; }; + B62E41EDC1D1F0A50CD6F238DE5DA52A /* BeAnInstanceOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeAnInstanceOf.swift; path = Sources/Nimble/Matchers/BeAnInstanceOf.swift; sourceTree = ""; }; + B6302F23F33CA08B3EF7B47B34924CCE /* ExampleMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExampleMetadata.swift; path = Sources/Quick/ExampleMetadata.swift; sourceTree = ""; }; + B71D599F1288F9AE51EC97B51247E7D2 /* Animator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Animator.swift; sourceTree = ""; }; + BBDD0426316D5C53701685B6F02FF43F /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Nimble.framework; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BC7BB415F2E10F37FB336D155572EA32 /* mach_excServer.c */ = {isa = PBXFileReference; includeInIndex = 1; name = mach_excServer.c; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.c; sourceTree = ""; }; + BCB22DBE438CA4F194008503BFB08227 /* mach_excServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = mach_excServer.h; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/mach_excServer.h; sourceTree = ""; }; + BCDFC9D258ED4F41CF77583751635E65 /* UIWindow+Swizzle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIWindow+Swizzle.swift"; path = "TouchVisualizer/UIWindow+Swizzle.swift"; sourceTree = ""; }; + BD5835E79CFF4725914917855ABD641C /* BeLessThanOrEqual.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeLessThanOrEqual.swift; path = Sources/Nimble/Matchers/BeLessThanOrEqual.swift; sourceTree = ""; }; + BEFB139FA2FA4F89E5BE9BFA0F50BB4B /* ThrowError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThrowError.swift; path = Sources/Nimble/Matchers/ThrowError.swift; sourceTree = ""; }; + C15A3A32D90C76C4E74E825689DD367B /* Quick.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Quick.modulemap; sourceTree = ""; }; + C23D5A55607B45A44790FA3203DAEBF4 /* Example.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Example.swift; path = Sources/Quick/Example.swift; sourceTree = ""; }; + C3B2AA7AFCA6D2320240A0E5C2855390 /* SlidePresentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SlidePresentation.swift; sourceTree = ""; }; + C3F780A75CE32B9EC82BC4AA4832FA4D /* DSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DSL.swift; path = Sources/Nimble/DSL.swift; sourceTree = ""; }; + C4FE8A021E27B8859128D8F496275877 /* Nimble.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Nimble.xcconfig; sourceTree = ""; }; + C5102E5F18979A6903F09A65CB8F45B1 /* PresentationSizeProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationSizeProvider.swift; sourceTree = ""; }; + C5A1B513EB15ABC51EB40FE152727E35 /* Constants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + C77CEFAFF3796D8DBEBC124C68E32792 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; + C8014C543D597CB3D6F0C070DDF62038 /* AssertionRecorder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertionRecorder.swift; path = Sources/Nimble/Adapters/AssertionRecorder.swift; sourceTree = ""; }; + CA5D168B7E72F59A0AC42E8D7EEE6B08 /* PresentationSingleSizeProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationSingleSizeProvider.swift; sourceTree = ""; }; + CB10616E99816BA5D4A7DB844B21E839 /* CwlCatchException.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlCatchException.swift; path = Carthage/Checkouts/CwlCatchException/Sources/CwlCatchException/CwlCatchException.swift; sourceTree = ""; }; + CB234AA1227279EF5D09AA5BFD8C18F4 /* Pods-Jelly_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Jelly_Tests-frameworks.sh"; sourceTree = ""; }; + CCB243552831A37A26D18E5B0EE37389 /* PresentationMarginGuardsProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationMarginGuardsProvider.swift; sourceTree = ""; }; + CE688EB7CB06FF68E59F36504C83878D /* BeGreaterThanOrEqualTo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeGreaterThanOrEqualTo.swift; path = Sources/Nimble/Matchers/BeGreaterThanOrEqualTo.swift; sourceTree = ""; }; + D1DEF657F956669079CC2E86C09B4EAD /* Pods-Jelly_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Jelly_Example-acknowledgements.plist"; sourceTree = ""; }; + D2AB7A30488027398CD983E692FC2B39 /* InteractionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InteractionController.swift; sourceTree = ""; }; + D484D8E273280854E1215DB4642B89A5 /* Pods-Jelly_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Jelly_Tests.debug.xcconfig"; sourceTree = ""; }; + D5C803E6C34277D717AD3C2DA0F40FB8 /* Predicate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Predicate.swift; path = Sources/Nimble/Matchers/Predicate.swift; sourceTree = ""; }; + D6CCD506C35B56CFB587CD3CD87825BC /* FailureMessage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FailureMessage.swift; path = Sources/Nimble/FailureMessage.swift; sourceTree = ""; }; + D8C48001BCC90BCDEFB88A807EC08AA2 /* CwlCatchBadInstruction.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CwlCatchBadInstruction.swift; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlPreconditionTesting/CwlCatchBadInstruction.swift; sourceTree = ""; }; + D8ECE7516D5818633D7E512C671A4897 /* MatcherFunc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatcherFunc.swift; path = Sources/Nimble/Matchers/MatcherFunc.swift; sourceTree = ""; }; + D974F15456DB6A90B2F8B69E42C790B2 /* PresentationAlignment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationAlignment.swift; sourceTree = ""; }; + DDF6F674FF41FCFBF755A2C3305B4320 /* Pods-Jelly_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Jelly_Example-acknowledgements.markdown"; sourceTree = ""; }; + DEA1C96D7243B4462255937B9F0C1CBB /* BeVoid.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BeVoid.swift; path = Sources/Nimble/Matchers/BeVoid.swift; sourceTree = ""; }; + DF321956D5A58145BC8ADDB3749FAF76 /* MatchError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MatchError.swift; path = Sources/Nimble/Matchers/MatchError.swift; sourceTree = ""; }; + DF719D8E22FDE4224BB3A07CAA27139C /* Equal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Equal.swift; path = Sources/Nimble/Matchers/Equal.swift; sourceTree = ""; }; + DF83488F516E7135D6A84081B0F3EE81 /* NSString+C99ExtendedIdentifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSString+C99ExtendedIdentifier.swift"; path = "Sources/Quick/NSString+C99ExtendedIdentifier.swift"; sourceTree = ""; }; + E0673D98501C03C559FF8D3985D68178 /* PresentationUIConfigurationProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationUIConfigurationProvider.swift; sourceTree = ""; }; + E275B5D8012E6192AC17F7ACA5CB88F4 /* AnimationCurve+AnimationOptions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "AnimationCurve+AnimationOptions.swift"; sourceTree = ""; }; + E28C924C8E4588F3EC6DA534343C1291 /* EndWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EndWith.swift; path = Sources/Nimble/Matchers/EndWith.swift; sourceTree = ""; }; + E439B4D2D4AD858E222ECEF713B12EF3 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; + E718B72B3A4C792A682C43A35D9968A3 /* PresentationSize.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationSize.swift; sourceTree = ""; }; + E756756BD85BFDEE80151DF3B653FFD4 /* NMBExceptionCapture.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBExceptionCapture.h; path = Sources/NimbleObjectiveC/NMBExceptionCapture.h; sourceTree = ""; }; + E7C3A3698E689F66DD8ECAE9D8A45B62 /* Presentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Presentation.swift; sourceTree = ""; }; + E8D9C3E16F783B88416EFADC4DD38D46 /* Orientation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Orientation.swift; sourceTree = ""; }; + EBBB0432FE5912A44538CF0F7360FA8B /* AllPass.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AllPass.swift; path = Sources/Nimble/Matchers/AllPass.swift; sourceTree = ""; }; + EC396710E0A9944755F97ED19270C897 /* PresentationTimingProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationTimingProtocol.swift; sourceTree = ""; }; + ECA31579DE6A755F4CF3C9439A563137 /* Jelly.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Jelly.framework; path = Jelly.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EF89C3F00812A2CD77EE52D3F73A86FB /* PresentationSpringProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PresentationSpringProvider.swift; sourceTree = ""; }; + EFF33673B9A034C5A5DB9FFC905D5357 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F2E2AC41B0BF4BC959C5FAC4CF6F1269 /* XCTestObservationCenter+Register.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "XCTestObservationCenter+Register.m"; path = "Sources/NimbleObjectiveC/XCTestObservationCenter+Register.m"; sourceTree = ""; }; + F3948A09C13E299AF5C5110689C4CCC7 /* CwlMachBadInstructionHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CwlMachBadInstructionHandler.m; path = Carthage/Checkouts/CwlPreconditionTesting/Sources/CwlMachBadInstructionHandler/CwlMachBadInstructionHandler.m; sourceTree = ""; }; + F4EBF1B47B9B5488DD67538957A428EF /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + F53F85E807A4D646F30E40233AA43F83 /* NMBStringify.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NMBStringify.h; path = Sources/NimbleObjectiveC/NMBStringify.h; sourceTree = ""; }; + F77381196F0B104A5A56CE85AE62D53E /* Jelly.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Jelly.modulemap; sourceTree = ""; }; + F7CE79ABE32DDDC9E042E908251C4FD6 /* Jelly-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Jelly-prefix.pch"; sourceTree = ""; }; + F800624BF03EE61550A5004A05E2E9D0 /* Quick-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Quick-dummy.m"; sourceTree = ""; }; + F9EB96877C5119273BFD64D93DE99DC6 /* BackgroundStyle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BackgroundStyle.swift; sourceTree = ""; }; + FB7369A38DD1C7219356277E11ABD889 /* URL+FileName.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+FileName.swift"; path = "Sources/Quick/URL+FileName.swift"; sourceTree = ""; }; + FC15AA1B2CC648706B59562BF5F98177 /* DSL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DSL.h; path = Sources/NimbleObjectiveC/DSL.h; sourceTree = ""; }; + FC43045A4BCECD290ED8DE4A251A1262 /* Pods-Jelly_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Jelly_Example-resources.sh"; sourceTree = ""; }; + FCA459A3154AA6386DAEE2F96AB75ABE /* Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = TouchVisualizer/Configuration.swift; sourceTree = ""; }; + FCDBBE221E717CF12830CA8FDD3C585F /* Pods-Jelly_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Jelly_Tests-acknowledgements.plist"; sourceTree = ""; }; + FE72C6684F355A4F5A51AE4A0E33C54B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FF3719DE487FE57A2BEE832D339248E3 /* ContainElementSatisfying.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContainElementSatisfying.swift; path = Sources/Nimble/Matchers/ContainElementSatisfying.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 416246FA9BA3AB171D6DF37AF87F8EA1 /* Frameworks */ = { + 26A75F54442C79179B993E4D0A8DD10C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 85D158B2C4138641B98D689FCECD52AF /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 44CBD958BA7E1BD01F609DF0E8C7398A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 70DA9E601DDDCC1AFE39E4270A2BCA7B /* Foundation.framework in Frameworks */, - E6C372E0463DBF9CE2B0E717A6D90D39 /* XCTest.framework in Frameworks */, + FCC64A159B5CC194F41E8417C0289F92 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 819A9B65073BE3B5599196C0A3B27EBC /* Frameworks */ = { + 5BD1B3CAD35CDC1FCE47A3EBF22495A7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 50698F14E7847E18B907E9373FBF4C21 /* Foundation.framework in Frameworks */, + 5F14E3653BAC37DB4316A40816CA216E /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 965C406C7455E461EB953AF08950162C /* Frameworks */ = { + 7F682A9E296D139B5A1E649989FB51D0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - AF5DF12D1A768FADDBA1BD12B2F599A7 /* Foundation.framework in Frameworks */, + A3209494C8B29F390AC14D95519460A8 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9F97C9E2A3E6B6A53DC272C3D6A579CD /* Frameworks */ = { + D11D839F9B54F670289B1795F28017B5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DBD0FC430F214E9FD0C425AA379263A2 /* Foundation.framework in Frameworks */, + F5A60CB15F1CFDBE47EBFFC6086AFD43 /* Foundation.framework in Frameworks */, + 8A44986DA8C47B461DF1E2950B4F6D1E /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - D6FCEC787164E550A250F87E9B0386AD /* Frameworks */ = { + F2DE7F580AF16C1A4242FFF89C8121FD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - CB06F67C64C60CBA399057F1281134FE /* Foundation.framework in Frameworks */, - 8A6FC1367146555F0E9F2E026A9798F4 /* UIKit.framework in Frameworks */, + 621BD1AB78A152EFFCDDD7AB36C81E8E /* Foundation.framework in Frameworks */, + 1EC327DF2A59DCBA29124E86B6209E48 /* XCTest.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 019799724D9A3B81C3852627C8602E72 /* Products */ = { + 03B983B3607010AAB52A4FA426F39915 /* Extensions */ = { isa = PBXGroup; children = ( - 38AA7B61E292C1CF5D3CC850A80F5DFE /* Jelly.framework */, - 37806CEB041B6F1DA90F47CC738C2636 /* Nimble.framework */, - 32964E944076AFED03E7BF06C0A06AB0 /* Pods_Jelly_Example.framework */, - AF452C29C1C0442F7AAD6480F6D4E960 /* Pods_Jelly_Tests.framework */, - C003A3ADDB78ADAF3CE91C08A0E8A033 /* Quick.framework */, + 8A4A356EBA75B9130AE0691B7CCA2DB9 /* Size+Equatable.swift */, ); - name = Products; + name = Extensions; + path = Extensions; + sourceTree = ""; + }; + 080B44D2EEC0EB6900A94E869115E01F /* Animators */ = { + isa = PBXGroup; + children = ( + 3B86ABC93C80C91D0A9490E33D161FDE /* Animated Animators */, + 414C08DC8FD2E4AF2E80CA1D70695360 /* Interaction Controllers */, + ); + name = Animators; + path = Animators; + sourceTree = ""; + }; + 0A759DEDBFB5CD5DDC68347775D5478F /* Pods */ = { + isa = PBXGroup; + children = ( + 9408041907DA7389DF2957707EE2CB28 /* Nimble */, + 5161F95D996875E0071661AF023E0702 /* Quick */, + C319B3435CC52547673113402A809C43 /* TouchVisualizer */, + ); + name = Pods; + sourceTree = ""; + }; + 0B19474EF6BB04EA61D79F754593249C /* Pod */ = { + isa = PBXGroup; + children = ( + 71049A15412B793B718C18C42C5C40E8 /* Jelly.podspec */, + C77CEFAFF3796D8DBEBC124C68E32792 /* LICENSE */, + E439B4D2D4AD858E222ECEF713B12EF3 /* README.md */, + ); + name = Pod; + sourceTree = ""; + }; + 0C60796BBD8EA42E093D7A6700F7E20C /* Pods-Jelly_Example */ = { + isa = PBXGroup; + children = ( + EFF33673B9A034C5A5DB9FFC905D5357 /* Info.plist */, + 2D8555A6FB62176BF9C8B92CC7EB8407 /* Pods-Jelly_Example.modulemap */, + DDF6F674FF41FCFBF755A2C3305B4320 /* Pods-Jelly_Example-acknowledgements.markdown */, + D1DEF657F956669079CC2E86C09B4EAD /* Pods-Jelly_Example-acknowledgements.plist */, + 79B84C337A00CF3A6955E1B9EDA7D30E /* Pods-Jelly_Example-dummy.m */, + 8610EDF1C2C7128D11D45C08DCB6C4BE /* Pods-Jelly_Example-frameworks.sh */, + FC43045A4BCECD290ED8DE4A251A1262 /* Pods-Jelly_Example-resources.sh */, + 99D660B556AD0425BA1CD57E1BBD4CF4 /* Pods-Jelly_Example-umbrella.h */, + 37FC21B23F9F374968D8A8E37774345F /* Pods-Jelly_Example.debug.xcconfig */, + 0AB9C0E30FFD2F19217224F230405282 /* Pods-Jelly_Example.release.xcconfig */, + ); + name = "Pods-Jelly_Example"; + path = "Target Support Files/Pods-Jelly_Example"; + sourceTree = ""; + }; + 1142DED2481E43CCFA5D0D7AEC15DA24 /* Presentations */ = { + isa = PBXGroup; + children = ( + 2E29F6AC390B8EB21D73A46E9122BBBB /* CoverPresentation.swift */, + 61D4E86FFAFAB1212D56FBCE47063315 /* FadePresentation.swift */, + C3B2AA7AFCA6D2320240A0E5C2855390 /* SlidePresentation.swift */, + ); + name = Presentations; + path = Presentations; sourceTree = ""; }; 122DA2E5084A4393C29BE363C764795C /* Frameworks */ = { isa = PBXGroup; children = ( - 926C31924772091F3FBE0E8F025C2B0D /* iOS */, + AB543369810442EA78955D4D3D6379F1 /* iOS */, ); name = Frameworks; sourceTree = ""; }; + 18374BAA4C35FB88111276392F9ED95A /* Models */ = { + isa = PBXGroup; + children = ( + 798A09EB29BB03821C5844521295D6F8 /* CombinedTimingCurveProvider.swift */, + 41D8158295CF3E762A07AD5ED4E27615 /* PresentationType.swift */, + ); + name = Models; + path = Models; + sourceTree = ""; + }; + 247630950D4320854A232508819088E5 /* Configuration */ = { + isa = PBXGroup; + children = ( + F9EB96877C5119273BFD64D93DE99DC6 /* BackgroundStyle.swift */, + 17DED76AA5A94F85DC50F6BD455B79BF /* Direction.swift */, + 2857F01CF61CFD8CCA443B02BF8CB771 /* DragMode.swift */, + 537096846FE79477222E055E5E9D012B /* Duration.swift */, + B4C632753BBCE6EFBB3A1EE5DDE93281 /* HorizontalAlignment.swift */, + E8D9C3E16F783B88416EFADC4DD38D46 /* Orientation.swift */, + 41BC14DD346C33EFA77474BABF5729C0 /* Size.swift */, + A209199E40D349E3E6D12DCCBA8E0CC4 /* Spring.swift */, + 49219B0764B50AC29F12A1C3DC4A7B1E /* VerticalAlignment.swift */, + 3693FC1614433886ECDE45960E355352 /* Presentation */, + ); + name = Configuration; + path = Configuration; + sourceTree = ""; + }; + 2B26A877456650343CA39F2158B90928 /* Development Pods */ = { + isa = PBXGroup; + children = ( + 57BF8B7F5063D9DB3ECE7F89E8FA1948 /* Jelly */, + ); + name = "Development Pods"; + sourceTree = ""; + }; 2D50F98B9187FADAE9D8011C10296E2A /* Targets Support Files */ = { isa = PBXGroup; children = ( - D03077284905427A747E4F1894E07BE2 /* Pods-Jelly_Example */, - 52E8E41D89EE22F32064A4499C8F20B7 /* Pods-Jelly_Tests */, + 0C60796BBD8EA42E093D7A6700F7E20C /* Pods-Jelly_Example */, + A0DF348C48E95145E7C4CFA97A102B0D /* Pods-Jelly_Tests */, ); name = "Targets Support Files"; sourceTree = ""; }; - 2E2F88278B0020D08A1D642563AE3CA4 /* Jelly */ = { + 3693FC1614433886ECDE45960E355352 /* Presentation */ = { isa = PBXGroup; children = ( - 6406BD8D8C00F95B1722EC84BD0DFC71 /* Jelly.swift */, - 03624B0D8D1E6BDE86AF91150E013F1F /* JellyAnimator.swift */, - 7FDD084452EBDF969EBE029C72577A02 /* JellyConstants.swift */, - 8EABC671AC0F5260B11C5E39AF005600 /* JellyFadeInPresentation.swift */, - 2C6A3FF19A3070F637BA3EB207A58659 /* JellyFadeInPresentationAnimator.swift */, - 9D37783B2E2DCA65BF2F54F827795778 /* JellyPresentation.swift */, - 725EB33ADBE3FB6CD9638DCEF54736F8 /* JellyPresentationController.swift */, - 17D1D74DA804951335589CB7E1360987 /* JellyShiftInPresentation.swift */, - 0EC41E2C52978063B6A50DE22C692E38 /* JellyShiftInPresentationAnimator.swift */, - FF3F337754E5DE1590D4DCE4E36AD91F /* JellySlideInPresentation.swift */, - EC6C9EB907A69CCE62EECC7E46F4F55E /* JellySlideInPresentationAnimator.swift */, - 0FA0DB6A6530B3AF1AE18BE05984041D /* UIView+Jelly.swift */, - 0A5305568B2E2268061D10CF689B08D5 /* UIViewControllerAnimatedTransitioning+Extension.swift */, - 94EB32DD5C056511277BA07D8F5FC613 /* Pod */, - 63E6DB8B37B37151B616744A8D188BC6 /* Support Files */, + 6266AB3F9F9E54E8437F52FC287F25A7 /* InteractionConfiguration.swift */, + D974F15456DB6A90B2F8B69E42C790B2 /* PresentationAlignment.swift */, + E718B72B3A4C792A682C43A35D9968A3 /* PresentationSize.swift */, + 625B26AA59DCCA991D52BEF7196378C4 /* PresentationTiming.swift */, + 1C2D59C58087D18ACC3E5AB791CC0484 /* PresentationUIConfiguration.swift */, ); - name = Jelly; - path = ../..; + name = Presentation; + path = Presentation; sourceTree = ""; }; - 3C3FDCB7F0ADE0D02BF96EB1D4E2C89F /* Pods */ = { + 3B86ABC93C80C91D0A9490E33D161FDE /* Animated Animators */ = { isa = PBXGroup; children = ( - B00ACA35EE752C5527C8F768F7DC4346 /* Nimble */, - D803EB5B15D4EAD4461BD11F3EF5188C /* Quick */, + 218136F27C201C83B9D57B0C42D6F91D /* CoverAnimator.swift */, + B05B2A0CE73CCD3A99AF938AD1145BD8 /* FadeAnimator.swift */, + 95F4ECC691CF2ADA63EF9FD0C34099E7 /* SlideAnimator.swift */, ); - name = Pods; + name = "Animated Animators"; + path = "Animated Animators"; sourceTree = ""; }; - 52324DECCF3E0D2A76F8AC61AB22FC1B /* Support Files */ = { + 414C08DC8FD2E4AF2E80CA1D70695360 /* Interaction Controllers */ = { isa = PBXGroup; children = ( - 561C23FF26877422BF1F75F4BC11F182 /* Info.plist */, - C22EE1E30D2DAA8C037AF664DF8E96BE /* Quick.modulemap */, - B62FC8D3EFD93B2D3877DF87DBB12631 /* Quick.xcconfig */, - 0A9D7EA20C39A55A1EF0C23094895A75 /* Quick-dummy.m */, - 637DB7A45FE5BB1290DBA08148286EEA /* Quick-prefix.pch */, - 1BCD7C4F10E8CD2DCAD3B2734A26D9B0 /* Quick-umbrella.h */, + D2AB7A30488027398CD983E692FC2B39 /* InteractionController.swift */, ); - name = "Support Files"; - path = "../Target Support Files/Quick"; + name = "Interaction Controllers"; + path = "Interaction Controllers"; sourceTree = ""; }; - 52E8E41D89EE22F32064A4499C8F20B7 /* Pods-Jelly_Tests */ = { + 5161F95D996875E0071661AF023E0702 /* Quick */ = { isa = PBXGroup; children = ( - C562707E04357F17989661F5AEC83C3D /* Info.plist */, - AAA8C71B8A49F36B4627F961D9F8A9C3 /* Pods-Jelly_Tests.modulemap */, - 782C6A0644CB087D98D17B89197F211F /* Pods-Jelly_Tests-acknowledgements.markdown */, - CBE5B2FAAA37D31347BA9DACE8438F13 /* Pods-Jelly_Tests-acknowledgements.plist */, - DBE27E6C449AFB6AD96AD5284AD962B9 /* Pods-Jelly_Tests-dummy.m */, - 43721E0BB49BF05FEDA30F3C53264CDD /* Pods-Jelly_Tests-frameworks.sh */, - FACEDBDE373DB782A302E0FB8F43B88F /* Pods-Jelly_Tests-resources.sh */, - D6E779444F549BF86B8E3F5D643907F4 /* Pods-Jelly_Tests-umbrella.h */, - A31B12010AD7A33648A58605520F09DA /* Pods-Jelly_Tests.debug.xcconfig */, - 570631FA0517A859523BCDDDBBED67B5 /* Pods-Jelly_Tests.release.xcconfig */, + 4F0DE168D68F9193C94D4F9F47B54468 /* Behavior.swift */, + 33708C75E8787278AAC3A515E5BB4D75 /* Callsite.swift */, + 7BB4FEDE8A834E0FEB9971CE9F7C6B6C /* Closures.swift */, + 0846448D09624616444BD5134A1203D2 /* Configuration.swift */, + 13B0483C2FE51C1DA7E45625C2D7EE45 /* DSL.swift */, + 734E9D36083A5CEB4FAFFA2686966AF0 /* ErrorUtility.swift */, + C23D5A55607B45A44790FA3203DAEBF4 /* Example.swift */, + 088BE09AECC2698F26D11549C759E521 /* ExampleGroup.swift */, + 0DCD3F0A440882E2592B2762C30C59A6 /* ExampleHooks.swift */, + B6302F23F33CA08B3EF7B47B34924CCE /* ExampleMetadata.swift */, + 28D147C11DD41351CCC587548593CCC9 /* Filter.swift */, + 27A842237DBB504849240C780B3C516B /* HooksPhase.swift */, + 2F7235A89BF04113F682D7F521BA7FDE /* NSBundle+CurrentTestBundle.swift */, + DF83488F516E7135D6A84081B0F3EE81 /* NSString+C99ExtendedIdentifier.swift */, + 1CBE0DC13312B13670858D3C9EF5C4C0 /* QCKDSL.h */, + 5BBA82243AF7504D591AC35041B220E9 /* QCKDSL.m */, + 9D84EAD8BB8842D6543482754209A9E3 /* Quick.h */, + 75E56F91363B1925AA3C597614223873 /* QuickConfiguration.h */, + 0EFA670EC3A1A9FAE8649B0AFA5F33F1 /* QuickConfiguration.m */, + 51E34F8ED7F13C3ECA2FC921AF52E517 /* QuickSelectedTestSuiteBuilder.swift */, + 6C3778EDDDB10CB1DF14FA3B9657CA2E /* QuickSpec.h */, + 2FE82651A24B4278D7D4F6FEDB248088 /* QuickSpec.m */, + 48B0D71A44292C8B702C04CF7E2F55BC /* QuickSpecBase.h */, + 9724C077CE7A513AA8A1D3DB92BAC86A /* QuickSpecBase.m */, + 5B15A675AA25F45EFE0DA199CE553B13 /* QuickTestSuite.swift */, + 5F4184BC3FF22ACEFDB62F88267C36D5 /* SuiteHooks.swift */, + FB7369A38DD1C7219356277E11ABD889 /* URL+FileName.swift */, + 3880CAD03796E2DC8DFC9B9E3B2E9428 /* World.swift */, + 746F20E704821A5B075984A2ED48B960 /* World+DSL.swift */, + 996E055B10E5F8588ED8B71AB226C42E /* XCTestSuite+QuickTestSuiteBuilder.m */, + 666CBE239B6D36E922B704FF8D3775A2 /* Support Files */, ); - name = "Pods-Jelly_Tests"; - path = "Target Support Files/Pods-Jelly_Tests"; + name = Quick; + path = Quick; sourceTree = ""; }; - 63E6DB8B37B37151B616744A8D188BC6 /* Support Files */ = { + 57BF8B7F5063D9DB3ECE7F89E8FA1948 /* Jelly */ = { isa = PBXGroup; children = ( - DD1B93E0B5F44C69536B8D236A10490D /* Info.plist */, - 596E8B0FE44B4ECBBE4A0E71F8F7A8BC /* Jelly.modulemap */, - AE311FD9A0241C1B0B383CF262BDBB82 /* Jelly.xcconfig */, - 8CD53270A7F033A8E966616E7F756B18 /* Jelly-dummy.m */, - C5D562693A407A8D771D89AB6D5C7ADB /* Jelly-prefix.pch */, - 4D5BA02A339BFAC598B13254A845929F /* Jelly-umbrella.h */, + 0B19474EF6BB04EA61D79F754593249C /* Pod */, + 9A8679B323D3DF123A48CBF7B9BB09C7 /* private */, + F30FA5646B0FAE890883D740220DECEB /* public */, + 9AA40C9707254C13470CCCB16FBDB7F6 /* Support Files */, ); - name = "Support Files"; - path = "Example/Pods/Target Support Files/Jelly"; + name = Jelly; + path = ../..; sourceTree = ""; }; - 7783AEB29D33865F5821E296CCFE5DF5 /* Support Files */ = { + 666CBE239B6D36E922B704FF8D3775A2 /* Support Files */ = { isa = PBXGroup; children = ( - 98884B98AC8059074D67FE0CD2C32438 /* Info.plist */, - 85886496CDEC909E048C8D8082B296E4 /* Nimble.modulemap */, - D5EBE08A3B758919CB15F7C75D878D1D /* Nimble.xcconfig */, - 2FF69EB8C1C9234284BFB37FCE9D23D4 /* Nimble-dummy.m */, - F82446D8FE90C03C4E8B4F37FDF4E4E1 /* Nimble-prefix.pch */, - 16A20C34FBBE39465FCF6F0F34947C2F /* Nimble-umbrella.h */, + A08B204CBEF53B76667C6107CEC871BD /* Info.plist */, + C15A3A32D90C76C4E74E825689DD367B /* Quick.modulemap */, + 7A77FA09C3C205B7CC1AFF09FBCF6E6C /* Quick.xcconfig */, + F800624BF03EE61550A5004A05E2E9D0 /* Quick-dummy.m */, + 81C05F7673502076BBF7B8987824B5E8 /* Quick-prefix.pch */, + 6B83EC3B38D0BD6BF558AD7B3AAB9196 /* Quick-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/Nimble"; + path = "../Target Support Files/Quick"; + sourceTree = ""; + }; + 7413D67DB61580464316985C390F3150 /* Models */ = { + isa = PBXGroup; + children = ( + 247630950D4320854A232508819088E5 /* Configuration */, + 1142DED2481E43CCFA5D0D7AEC15DA24 /* Presentations */, + C800CC6FCBBC00B158399D225BD0A3E4 /* Protocols */, + ); + name = Models; + path = Models; sourceTree = ""; }; 7DB346D0F39D3F0E887471402A8071AB = { isa = PBXGroup; children = ( 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - 9A351735BF3033EAB36E159CB8A659EC /* Development Pods */, + 2B26A877456650343CA39F2158B90928 /* Development Pods */, 122DA2E5084A4393C29BE363C764795C /* Frameworks */, - 3C3FDCB7F0ADE0D02BF96EB1D4E2C89F /* Pods */, - 019799724D9A3B81C3852627C8602E72 /* Products */, + 0A759DEDBFB5CD5DDC68347775D5478F /* Pods */, + 85303BD091248A69AAC5BCF911107BB7 /* Products */, 2D50F98B9187FADAE9D8011C10296E2A /* Targets Support Files */, ); sourceTree = ""; }; - 926C31924772091F3FBE0E8F025C2B0D /* iOS */ = { + 85303BD091248A69AAC5BCF911107BB7 /* Products */ = { + isa = PBXGroup; + children = ( + ECA31579DE6A755F4CF3C9439A563137 /* Jelly.framework */, + BBDD0426316D5C53701685B6F02FF43F /* Nimble.framework */, + 1E12E8BD69B22FA3A3EC53C844D11E10 /* Pods_Jelly_Example.framework */, + 16058921B2D948B462510589BA13898E /* Pods_Jelly_Tests.framework */, + 272851DB38A28F446F5931D320F5108F /* Quick.framework */, + 61A97243EBD76C4212926B4DA961AE25 /* TouchVisualizer.framework */, + ); + name = Products; + sourceTree = ""; + }; + 9408041907DA7389DF2957707EE2CB28 /* Nimble */ = { + isa = PBXGroup; + children = ( + 50D41FF8BE448618C9764A1ACF5962DD /* AdapterProtocols.swift */, + EBBB0432FE5912A44538CF0F7360FA8B /* AllPass.swift */, + 7314F3E7754355A85BB6B5C04CA92382 /* AssertionDispatcher.swift */, + C8014C543D597CB3D6F0C070DDF62038 /* AssertionRecorder.swift */, + B330EAEAE470617DB666786F29A5D3FD /* Async.swift */, + 6DF962BF0DEA31B9398C2F18FC52A323 /* Await.swift */, + 7D8EA033ACA3A6E71F559401AA71134E /* BeAKindOf.swift */, + B62E41EDC1D1F0A50CD6F238DE5DA52A /* BeAnInstanceOf.swift */, + 803798B45BA51A60FAE5C58408157425 /* BeCloseTo.swift */, + 0B47AA90CBFE5954E52A4309C13CBBC5 /* BeEmpty.swift */, + 85037AF127EB293D3150CD2F636AD58F /* BeginWith.swift */, + 197388BE63349DDE4956191F9C68932A /* BeGreaterThan.swift */, + CE688EB7CB06FF68E59F36504C83878D /* BeGreaterThanOrEqualTo.swift */, + 6BD07EF4BDBF4A44FD439BA0FE6C226A /* BeIdenticalTo.swift */, + 0D9F3C1C9EABE7290731076E3B8CF9D1 /* BeLessThan.swift */, + BD5835E79CFF4725914917855ABD641C /* BeLessThanOrEqual.swift */, + 5CB358FD18B22C8AB37036F562CE9FF0 /* BeLogical.swift */, + 4554AB2C7A6F1887524E4A848E0ADEA5 /* BeNil.swift */, + DEA1C96D7243B4462255937B9F0C1CBB /* BeVoid.swift */, + 68E8F5AA95E065C35DFCC282555C8A5A /* Contain.swift */, + FF3719DE487FE57A2BEE832D339248E3 /* ContainElementSatisfying.swift */, + B165D03AAB19A47056D37D1E2BD923B9 /* CwlBadInstructionException.swift */, + D8C48001BCC90BCDEFB88A807EC08AA2 /* CwlCatchBadInstruction.swift */, + 8606BBC23BBBD314A10018A71EF88853 /* CwlCatchException.h */, + 04CC7F94266B7E574DA9E0B737AD6EF9 /* CwlCatchException.m */, + CB10616E99816BA5D4A7DB844B21E839 /* CwlCatchException.swift */, + 3ED20A4ED7F29CDE83EB3DF00FB6FC62 /* CwlDarwinDefinitions.swift */, + 1160831F489A83F2E71F3237380508D4 /* CwlMachBadInstructionHandler.h */, + F3948A09C13E299AF5C5110689C4CCC7 /* CwlMachBadInstructionHandler.m */, + 2F7D6A41179EB81C7A2085298870FDB8 /* CwlPreconditionTesting.h */, + FC15AA1B2CC648706B59562BF5F98177 /* DSL.h */, + 9409D16C26350406F62588CE2510EF1B /* DSL.m */, + C3F780A75CE32B9EC82BC4AA4832FA4D /* DSL.swift */, + 62FCED261837F758860C1765F94AC364 /* DSL+Wait.swift */, + E28C924C8E4588F3EC6DA534343C1291 /* EndWith.swift */, + DF719D8E22FDE4224BB3A07CAA27139C /* Equal.swift */, + 266870BF78B80ED449ABA047A0D44C09 /* Errors.swift */, + 8DED1AAAB0C78D4DB52DDDD117FAC5BF /* Expectation.swift */, + 31184022E189DD64414E2576456FDED8 /* ExpectationMessage.swift */, + 32DD7B7CA9E0432DD3BB6BAB6DFEB238 /* Expression.swift */, + D6CCD506C35B56CFB587CD3CD87825BC /* FailureMessage.swift */, + 4594B4B082BE8DE3284C3B71494937C1 /* Functional.swift */, + 878FD9A1699E94775AC0C28BE53A9540 /* HaveCount.swift */, + BC7BB415F2E10F37FB336D155572EA32 /* mach_excServer.c */, + BCB22DBE438CA4F194008503BFB08227 /* mach_excServer.h */, + 53F0BB4CBC88C0F10747AFEDB2FF74D7 /* Match.swift */, + D8ECE7516D5818633D7E512C671A4897 /* MatcherFunc.swift */, + 68F35295CCEA9F4010583FA57CA5405F /* MatcherProtocols.swift */, + DF321956D5A58145BC8ADDB3749FAF76 /* MatchError.swift */, + 25E90B619B5C3A2CB8EDA6F768B3B854 /* Nimble.h */, + 76FC08B06351D893CB9D678B5ACC4A89 /* NimbleEnvironment.swift */, + A9CEE68A6FD6F85E4FF9CA16876648E6 /* NimbleXCTestHandler.swift */, + E756756BD85BFDEE80151DF3B653FFD4 /* NMBExceptionCapture.h */, + 8AAFEC712B16CE9933A1F11E8FC5B910 /* NMBExceptionCapture.m */, + 67B5D4872A05553D49A2DF83D297BCEA /* NMBExpectation.swift */, + 788A40FBD0CC8E60385139BA9D044065 /* NMBObjCMatcher.swift */, + F53F85E807A4D646F30E40233AA43F83 /* NMBStringify.h */, + 92506BB54D506728D7327F0BD6BA8C40 /* NMBStringify.m */, + A84F4188F0FA05A478D3DC28A5F39B85 /* PostNotification.swift */, + D5C803E6C34277D717AD3C2DA0F40FB8 /* Predicate.swift */, + 7ACA6BEECAB84430A29EE4BCDFD6F79A /* RaisesException.swift */, + 157D741AE0729C5DBC91FC32AC9F5110 /* SatisfyAllOf.swift */, + B0008470615ADF5EEE6D320EB32A985A /* SatisfyAnyOf.swift */, + 62BFD7AF7FB1F3EDF4EA85D844569624 /* SourceLocation.swift */, + 567820F04B2F5E322BDECBF14AE19EF9 /* Stringers.swift */, + 87378AA8EEA6DAB96F4E3E2B37935625 /* ThrowAssertion.swift */, + BEFB139FA2FA4F89E5BE9BFA0F50BB4B /* ThrowError.swift */, + 9018A052A181232EBE7D0A1551FBF379 /* ToSucceed.swift */, + F2E2AC41B0BF4BC959C5FAC4CF6F1269 /* XCTestObservationCenter+Register.m */, + BA29F9BE861CBCECD852EE09BEC354A3 /* Support Files */, + ); + name = Nimble; + path = Nimble; + sourceTree = ""; + }; + 9A8679B323D3DF123A48CBF7B9BB09C7 /* private */ = { + isa = PBXGroup; + children = ( + A174B11A8CDEDF11FA2758F7AC37A372 /* PresentationController.swift */, + 080B44D2EEC0EB6900A94E869115E01F /* Animators */, + A3EBC59FAC3AE8DD87C79DD8B8C9A722 /* Extensions */, + 18374BAA4C35FB88111276392F9ED95A /* Models */, + ); + name = private; + path = Jelly/Classes/private; + sourceTree = ""; + }; + 9AA40C9707254C13470CCCB16FBDB7F6 /* Support Files */ = { + isa = PBXGroup; + children = ( + 0F59B268A354F5C8FAB7EEC8B262444D /* Info.plist */, + F77381196F0B104A5A56CE85AE62D53E /* Jelly.modulemap */, + 2216869779F9686263BB08850C1079C9 /* Jelly.xcconfig */, + 2BBA67F3FB14446597F4BAEB6DD90057 /* Jelly-dummy.m */, + F7CE79ABE32DDDC9E042E908251C4FD6 /* Jelly-prefix.pch */, + 3543AC392CF460A47042F28C00D7303D /* Jelly-umbrella.h */, + ); + name = "Support Files"; + path = "Example/Pods/Target Support Files/Jelly"; + sourceTree = ""; + }; + A0DF348C48E95145E7C4CFA97A102B0D /* Pods-Jelly_Tests */ = { + isa = PBXGroup; + children = ( + 8A2198B04D3617BD022B461E07394879 /* Info.plist */, + A12564DCC02B79A051553537445C1096 /* Pods-Jelly_Tests.modulemap */, + 58CBDF37B9C1503053A89B31D14F8B3F /* Pods-Jelly_Tests-acknowledgements.markdown */, + FCDBBE221E717CF12830CA8FDD3C585F /* Pods-Jelly_Tests-acknowledgements.plist */, + 228844A9F87E4192BD8C40A22CA669DB /* Pods-Jelly_Tests-dummy.m */, + CB234AA1227279EF5D09AA5BFD8C18F4 /* Pods-Jelly_Tests-frameworks.sh */, + 3F0EDD3869E0831904170852B53BD787 /* Pods-Jelly_Tests-resources.sh */, + 17DF03237581043F86B86780F4FC15BC /* Pods-Jelly_Tests-umbrella.h */, + D484D8E273280854E1215DB4642B89A5 /* Pods-Jelly_Tests.debug.xcconfig */, + 91E91FEF09AE9662313AA8828A1AC3A0 /* Pods-Jelly_Tests.release.xcconfig */, + ); + name = "Pods-Jelly_Tests"; + path = "Target Support Files/Pods-Jelly_Tests"; + sourceTree = ""; + }; + A3EBC59FAC3AE8DD87C79DD8B8C9A722 /* Extensions */ = { + isa = PBXGroup; + children = ( + E275B5D8012E6192AC17F7ACA5CB88F4 /* AnimationCurve+AnimationOptions.swift */, + 1089E480B232FF6A11A3B16306763021 /* Direction+EdgeHelper.swift */, + B1E3BDC86641E884E556E51E4D6D8BBF /* Direction+Orientation.swift */, + 4747224FBAF235CB5311FB6776B83328 /* Spring+Values.swift */, + 9D408FEE27A43A863913BC57573CC1FC /* UIView+RoundCorners.swift */, + 2F392C614FBAFE5483B6C12D2701B047 /* UIViewControllerAnimatedTransitioning+Convenience.swift */, + ); + name = Extensions; + path = Extensions; + sourceTree = ""; + }; + AB543369810442EA78955D4D3D6379F1 /* iOS */ = { isa = PBXGroup; children = ( - DE147446A1225BA68EA82615B1436CC1 /* Foundation.framework */, - DDF04AEFCC4B011565BFFBFFF52B2FCE /* UIKit.framework */, - E2D9897D646E2BB9FBF73704C04440B2 /* XCTest.framework */, + 1659222AD64CCA597F148530E7695E75 /* Foundation.framework */, + F4EBF1B47B9B5488DD67538957A428EF /* UIKit.framework */, + 884D43269F037BE17858CACB7F93DA82 /* XCTest.framework */, ); name = iOS; sourceTree = ""; }; - 94EB32DD5C056511277BA07D8F5FC613 /* Pod */ = { + BA29F9BE861CBCECD852EE09BEC354A3 /* Support Files */ = { isa = PBXGroup; children = ( - 0EB4C32ACA09B07E39B455AA1E2B35A6 /* Jelly.podspec */, - 7247AAFF328D9D4EC5D7740AC628B80E /* LICENSE */, - C9B8B90E0F57B131BB3AD78E0F412393 /* README.md */, + 6A882F64221501550BB9D2DEF6F4AB6C /* Info.plist */, + 49FF1F37EFAE124A8538EF5EBC51B421 /* Nimble.modulemap */, + C4FE8A021E27B8859128D8F496275877 /* Nimble.xcconfig */, + 12877A6C39454B09A71B6432428EF643 /* Nimble-dummy.m */, + 2120927A09044CFD1D24D26454EC9199 /* Nimble-prefix.pch */, + 4226EEA999978D8B72C90CFCACE5AE85 /* Nimble-umbrella.h */, ); - name = Pod; + name = "Support Files"; + path = "../Target Support Files/Nimble"; sourceTree = ""; }; - 9A351735BF3033EAB36E159CB8A659EC /* Development Pods */ = { + C319B3435CC52547673113402A809C43 /* TouchVisualizer */ = { isa = PBXGroup; children = ( - 2E2F88278B0020D08A1D642563AE3CA4 /* Jelly */, + FCA459A3154AA6386DAEE2F96AB75ABE /* Configuration.swift */, + 4C93BBBD8865ABFDCE72D4D0BF2400C0 /* TouchView.swift */, + BCDFC9D258ED4F41CF77583751635E65 /* UIWindow+Swizzle.swift */, + 67A69DD81D8ECDA0C288F022126790C3 /* Visualizer.swift */, + EFAE3217CC6CD394B5497F0D09A6350A /* Support Files */, ); - name = "Development Pods"; + name = TouchVisualizer; + path = TouchVisualizer; sourceTree = ""; }; - B00ACA35EE752C5527C8F768F7DC4346 /* Nimble */ = { + C800CC6FCBBC00B158399D225BD0A3E4 /* Protocols */ = { isa = PBXGroup; children = ( - 7E088B77C89183030BDE7BF0FD5A6E61 /* AdapterProtocols.swift */, - E6E780E005CD78D86050E2F1C9B86227 /* AllPass.swift */, - 9E6D0E06336A816BC0192B9FEC92119A /* AssertionDispatcher.swift */, - 7FA3B0D7D5D9D8EDF2641BCE7E45A71B /* AssertionRecorder.swift */, - 85003248050785BFEF966D1E89E5A847 /* Async.swift */, - FFA739FCCF461022D3476D9AC0A12969 /* AsyncMatcherWrapper.swift */, - FBDDD402C136C4C7E06650F0EB6E9CD6 /* BeAKindOf.swift */, - 95614EC69755CACD43F81B3D967B88A9 /* BeAnInstanceOf.swift */, - F92D220FEB1399287C37F2660BABEB4F /* BeCloseTo.swift */, - EC8D36EDFA340683FD5DAEB9875AB2C5 /* BeEmpty.swift */, - 980107C107885320335941A4471C9DBA /* BeginWith.swift */, - 98DA9221D3C3670D09A3418B64C4293F /* BeGreaterThan.swift */, - 6F4B04767442BB7BD15AAE24AA792327 /* BeGreaterThanOrEqualTo.swift */, - F83B921F09A6958C37B8A1A5E64C4264 /* BeIdenticalTo.swift */, - CF96C550BAD2A4F1B36336E4950F81AC /* BeLessThan.swift */, - 61C83B8B4A556ADB7CB613AD8A7E78B5 /* BeLessThanOrEqual.swift */, - 71C9C2C08177BF35A3FD0A747DADCDF9 /* BeLogical.swift */, - 4C2256ED78FCA069D0A67AE7996F700F /* BeNil.swift */, - F8DF89EBDCAF5E0E6AD1B667DA4FBCFC /* BeVoid.swift */, - 46F8511B08505FC55B5329E6464AFDFA /* Contain.swift */, - BC42EEC7E1FD4F0ED085C79F34477C8F /* ContainElementSatisfying.swift */, - 23613A479D2E1D88D235530FD7BCC89A /* CurrentTestCaseTracker.h */, - EAFAA3CA1B6ED55914944D32D60CD692 /* CwlBadInstructionException.swift */, - 38838690C7FCB8A320C0F7580365CB8B /* CwlCatchBadInstruction.swift */, - 912DC6AF27F5A0EB0D0E4D6E237216F4 /* CwlCatchException.h */, - 031049477EF89D8C0F6EDF4DA335F657 /* CwlCatchException.m */, - 6A9D19719FFB71B0D47572AB1BA8E037 /* CwlCatchException.swift */, - 358C5CE9A3BF3A1365D22576DCE92C31 /* CwlDarwinDefinitions.swift */, - B4903A86024F5425CE9A8BE57C1F8E5A /* CwlMachBadInstructionHandler.h */, - F4F188E8BF10EA41AA12912175B25178 /* CwlMachBadInstructionHandler.m */, - FC004067434874641C7FD573C6D54FC8 /* CwlPreconditionTesting.h */, - 2B97EFAAC8E5F1ABA276BDBBCA8A7E8B /* DSL.h */, - A271F0BB61B5E4A69A22F05AE8C0E6FB /* DSL.m */, - 0D7224D3F69BFCF084E13946CE3B7646 /* DSL.swift */, - 4E97EDDDEDAD07EB20F5E5E4A16056BA /* DSL+Wait.swift */, - B3B6045E75C2D2CBF310BFC536C5F1E7 /* EndWith.swift */, - 3718B918BEFD94E93859B9284AA81994 /* Equal.swift */, - 27A6E1B1438113D3D4423FB3586E904A /* Errors.swift */, - B2D40E21FFD40BEFA4C8C5B04B4FEE82 /* Expectation.swift */, - D6C3B6DAC9EE276DD752D93EAED6E88B /* ExpectationMessage.swift */, - B99D6596391EB4AD2D146D0851746820 /* Expression.swift */, - CCED5C53076B7249E95E0D1D43E1B985 /* FailureMessage.swift */, - 5689A9DFCFAE2BDCCE427EB97661DCBA /* Functional.swift */, - FB3FE3EC8226C0B8E6FC7B845B39DEDC /* HaveCount.swift */, - 20E530434E483C2BA306B0020773B18F /* mach_excServer.c */, - C3FE50EC469768C3CD434A2E18D7E9B4 /* mach_excServer.h */, - 8A6B34FE5E08BAF87E042A2629840DAD /* Match.swift */, - 0419679307D183B699A139C94F152FAD /* MatcherFunc.swift */, - EF51629E9BBE4FA04992668A7567A852 /* MatcherProtocols.swift */, - 9C307734CC6DDA96E75DB8F886E6E029 /* MatchError.swift */, - F02A82F99C5626988794EEDB37318A12 /* Nimble.h */, - A2104EEA5E8F1528DDF41A689B5A01FF /* NimbleEnvironment.swift */, - 8C017FD42384880C826F224329BE5F90 /* NimbleXCTestHandler.swift */, - 728B660135AE89C557C10A6FCCB94D9B /* NMBExceptionCapture.h */, - 1BE286288EE340CF8EF3F41D9772F145 /* NMBExceptionCapture.m */, - D18A3F4B9E1AFFEC61F2CB2F0BE05DED /* NMBExpectation.swift */, - 194B2F0745EF6C9A632F0FCCD3C970A3 /* NMBObjCMatcher.swift */, - AC9720E44CC5EEB092E90D118DC69352 /* NMBStringify.h */, - E32F5B894304A324CD56AB687A5D06B2 /* NMBStringify.m */, - 3276DE715636F61DFFDE3B068F88418A /* PostNotification.swift */, - 9CBFA93649DC414474690ACD27048025 /* Predicate.swift */, - 2C12FE311471678F66F177EFA1D02222 /* RaisesException.swift */, - AE81B79A8CD03840E8A5EEEE5860BA15 /* SatisfyAnyOf.swift */, - 48FBC678177B9AD2C7DE8B1059F8BAC3 /* SourceLocation.swift */, - D61A65644B128A845AB3BF3D8631CC4C /* Stringers.swift */, - F67A2DFCB98D4ECC29A99E91703B507D /* ThrowAssertion.swift */, - 393E0E59AB864543FA7641EE7E61605A /* ThrowError.swift */, - 731177567616F5D676C628DB89BB2BFC /* ToSucceed.swift */, - 8152C3AB4ECF2BA42CA9EAD577F6F404 /* XCTestObservationCenter+Register.m */, - 7783AEB29D33865F5821E296CCFE5DF5 /* Support Files */, + 09DBC35316A67A89802EFFCA924C0918 /* InteractionConfigurationProvider.swift */, + E7C3A3698E689F66DD8ECAE9D8A45B62 /* Presentation.swift */, + 2CDD4099666421EF8778C2ADA179F87A /* PresentationAlignmentProvider.swift */, + 4133A61C654D96C3387A6F56FB3C83D3 /* PresentationAnimatorProvider.swift */, + 424F8E2E5CC96CEE27CB59BD2BCF2BCF /* PresentationDirectionDismissProvider.swift */, + 9433251C9A3362E53C57E77E1563DBA7 /* PresentationDirectionShowProvider.swift */, + 1822FD917660B068E38C82469523F9B0 /* PresentationHeightProvider.swift */, + A19E199A0F2A999E89145AAC47C047F6 /* PresentationInteractiveAnimatorProvider.swift */, + CCB243552831A37A26D18E5B0EE37389 /* PresentationMarginGuardsProvider.swift */, + CA5D168B7E72F59A0AC42E8D7EEE6B08 /* PresentationSingleSizeProvider.swift */, + 5D55E1F2C48D0D630433228D40DDDF22 /* PresentationSizeProtocol.swift */, + C5102E5F18979A6903F09A65CB8F45B1 /* PresentationSizeProvider.swift */, + EF89C3F00812A2CD77EE52D3F73A86FB /* PresentationSpringProvider.swift */, + 68C662027E8A1C42ECC845231DF6FEFC /* PresentationTimingInformationProvider.swift */, + EC396710E0A9944755F97ED19270C897 /* PresentationTimingProtocol.swift */, + E0673D98501C03C559FF8D3985D68178 /* PresentationUIConfigurationProvider.swift */, + 74E734FEA44534A65F01108915FF8C3E /* PresentationWidthProvider.swift */, ); - name = Nimble; - path = Nimble; + name = Protocols; + path = Protocols; sourceTree = ""; }; - D03077284905427A747E4F1894E07BE2 /* Pods-Jelly_Example */ = { + EFAE3217CC6CD394B5497F0D09A6350A /* Support Files */ = { isa = PBXGroup; children = ( - 7BB3B5D20A1A447AF7763AD10B33964C /* Info.plist */, - A7BB0E7B9D5419C5E9F9C13F400AFA46 /* Pods-Jelly_Example.modulemap */, - 82468B5D2EA727327AC939D9A8AB9476 /* Pods-Jelly_Example-acknowledgements.markdown */, - 8B567BA254EE2EE05EF27AD3A348466E /* Pods-Jelly_Example-acknowledgements.plist */, - D3FFF8B1DA954395FEB22B2010BA70AE /* Pods-Jelly_Example-dummy.m */, - DEA46A1F5BD30B49A32329EE1FDF7CC6 /* Pods-Jelly_Example-frameworks.sh */, - C35894679DDD01011CBF77D4C6B8F308 /* Pods-Jelly_Example-resources.sh */, - 3EA7EF46A7976B0FBD80E32D71A4E257 /* Pods-Jelly_Example-umbrella.h */, - 7FC6C2B1B0491AD6C97D1D57F9F176EA /* Pods-Jelly_Example.debug.xcconfig */, - 66219932202903DE7641EBA5603D159A /* Pods-Jelly_Example.release.xcconfig */, + FE72C6684F355A4F5A51AE4A0E33C54B /* Info.plist */, + 385304331C6F91E28810B6290729B660 /* TouchVisualizer.modulemap */, + 0A68B97167C83E75EDE964FFE91AEC9B /* TouchVisualizer.xcconfig */, + 0CC44AFA150A0CFF24B353319B41146A /* TouchVisualizer-dummy.m */, + 9F1A7ACC6DA0250A6997C674FA91EB44 /* TouchVisualizer-prefix.pch */, + B0C2F7D5E07EFDD0FB9CDAC5174321B3 /* TouchVisualizer-umbrella.h */, ); - name = "Pods-Jelly_Example"; - path = "Target Support Files/Pods-Jelly_Example"; + name = "Support Files"; + path = "../Target Support Files/TouchVisualizer"; sourceTree = ""; }; - D803EB5B15D4EAD4461BD11F3EF5188C /* Quick */ = { + F30FA5646B0FAE890883D740220DECEB /* public */ = { isa = PBXGroup; children = ( - 73C1D1A0D20C667FAF4F01C3BA4AC451 /* Behavior.swift */, - 20C9E93FDAF76CEA15A9E23CC159DED1 /* Callsite.swift */, - D685C0D509328CD8778F99DD53A49A48 /* Closures.swift */, - 4FEA1DF1C7C22E7B20D2DC30FB9D3EF1 /* Configuration.swift */, - 9C78BF27F3A2B7B1368FE2E4317B6557 /* DSL.swift */, - 24FAED8BD878439BC32BE461165E4E08 /* ErrorUtility.swift */, - B38F7EB4258060BAA361D06EF1B16D9B /* Example.swift */, - 829CA47FBDF0A83BF67F7102D4CD40E6 /* ExampleGroup.swift */, - 301223B3EB74E21CDB1303C459B57231 /* ExampleHooks.swift */, - 8452C5F4B63A4A0178E56CDC9E95DFE8 /* ExampleMetadata.swift */, - 5C4D786F262665CE8C9113FA91745753 /* Filter.swift */, - 9245B48A46AAC45502A6B8A2AB745038 /* HooksPhase.swift */, - 75B78AC1C0059E66BD95A9F0CD2D24F5 /* NSBundle+CurrentTestBundle.swift */, - 057B1682EF92E71137867F0C259AF2CC /* NSString+C99ExtendedIdentifier.swift */, - B9985CC02179403DC54B3460DCE486AC /* QCKDSL.h */, - 12989D830FCE4AEF54A357265111CAEF /* QCKDSL.m */, - 1C846417EADDAAFF733CF6AC8FEB5EEA /* Quick.h */, - 6D2E298780429D096F1EC434CFC3B225 /* QuickConfiguration.h */, - 8EF0EA564D82AB46B710DC6096C1EA6B /* QuickConfiguration.m */, - F4C7D6328493B73EF741AC61F4CEF01E /* QuickSelectedTestSuiteBuilder.swift */, - EA8315675F3D2B2385E834043F85C676 /* QuickSpec.h */, - 38A82DE4A0130E4C946A904FEDDD74CA /* QuickSpec.m */, - 6BA4794DD94D5DE6BFFFEEC72B8C43E3 /* QuickSpecBase.h */, - E585A4F6C1434FD922B8371E432B5051 /* QuickSpecBase.m */, - 2E8E430D83F3CC7F72E348A0B222C46F /* QuickTestSuite.swift */, - 42DD07575CFDE63DE6412F425FDBED71 /* SuiteHooks.swift */, - B6D48A33A49B17952C7ABB6214240CB9 /* URL+FileName.swift */, - 129DA04B381B509DAEDD565711C5A0DA /* World.h */, - 8737F3E0C1FB1ABDDC8F61A081B1F76B /* World.swift */, - 467F00CAF06ADEF612F697F068843FB2 /* World+DSL.h */, - 65B4CDEF78BF13177A9303C1E765E5F6 /* World+DSL.swift */, - 7D9A924C203A11767BBF4D9C3737DA5D /* XCTestSuite+QuickTestSuiteBuilder.m */, - 52324DECCF3E0D2A76F8AC61AB22FC1B /* Support Files */, + B71D599F1288F9AE51EC97B51247E7D2 /* Animator.swift */, + C5A1B513EB15ABC51EB40FE152727E35 /* Constants.swift */, + 66F5B0A0D4265D0A7F0DF52BC03DA4A4 /* LiveUpdateError.swift */, + 03B983B3607010AAB52A4FA426F39915 /* Extensions */, + 7413D67DB61580464316985C390F3150 /* Models */, ); - name = Quick; - path = Quick; + name = public; + path = Jelly/Classes/public; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 65FA0C4FD86AF155A8A0F40C6E3B4CE4 /* Headers */ = { + 240E7E452A05C878E0E0D3D387C5395C /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + E8F8705C022296F6849F5CB00DEC1B14 /* Pods-Jelly_Tests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3FE9AFD1C3A631FDEAD706B3A970127C /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 8FFEAD6FE47636D0CCD8E4E72E6C0D9C /* QCKDSL.h in Headers */, - 4C5546B28A1DE96739C13EE60FC0B971 /* Quick-umbrella.h in Headers */, - AFFC00F3EC5C3CFEE52966D942FD3921 /* Quick.h in Headers */, - D1F64BCFD9F32C3442A5EA2EB2BC6904 /* QuickConfiguration.h in Headers */, - DB0E8803698C3B17EA0D6894E1F72CA0 /* QuickSpec.h in Headers */, - 33293482BBCD8CB337C47A0F519FB427 /* QuickSpecBase.h in Headers */, - 3807DB3A1508DBBF73638061AACCFAF2 /* World+DSL.h in Headers */, - 1E94045D114B4B7C5684EE8810A03472 /* World.h in Headers */, + 831D4BC6FF5439CA6E955D26BEF214CF /* QCKDSL.h in Headers */, + 350D088DE95C8378AE3C8B4F14898343 /* Quick-umbrella.h in Headers */, + E5B0F4C1BA4EDEAC30933E6378116D65 /* Quick.h in Headers */, + 35D999B8052458CE52C2B56C5E2E62BB /* QuickConfiguration.h in Headers */, + 4018169479A8ADEE40D4C084D8FE5812 /* QuickSpec.h in Headers */, + CBFBEFEADE7C9D2973C61769E0D06B98 /* QuickSpecBase.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 733CFCDA2357090BFEED01BC61141E50 /* Headers */ = { + 6E3B5022E7CB29214C450E568052FC5C /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 296D08EA16B75022CAE82C89E93D3CA3 /* Jelly-umbrella.h in Headers */, + B2C6771C44D01ABF742A710658FA2548 /* Pods-Jelly_Example-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 85497845823171A47E23A59621A44463 /* Headers */ = { + B82CDA7ECA45E22A1B849539AFE8F6AE /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 5AB9DB61D62D8BF7B1C734B373F361E7 /* CurrentTestCaseTracker.h in Headers */, - 531C54B1C10BA0F17A2B7D81D02BD390 /* CwlCatchException.h in Headers */, - B37D0376FCEB3133F44CF5F4416C58E1 /* CwlMachBadInstructionHandler.h in Headers */, - 16409C737271C4F1D7FEEFB91E317D5A /* CwlPreconditionTesting.h in Headers */, - FB433A84B0A557CD5E5948A8B6705024 /* DSL.h in Headers */, - 2F2DA5BA5AE1FB074F387E97115F47D5 /* mach_excServer.h in Headers */, - 5DBCC0E4C72649C9A39A00D40D944DDA /* Nimble-umbrella.h in Headers */, - 0A2CA8B0DD7E300ABFCF1956E6B58248 /* Nimble.h in Headers */, - 22E9F6FA56858A5F7A5D664E5968ECB0 /* NMBExceptionCapture.h in Headers */, - 96132E7432F8DD315A88A07C6B4F9C72 /* NMBStringify.h in Headers */, + 616E1E7159BAAE1A77A74BB0DB71DE51 /* TouchVisualizer-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - C6CC43AE2B3829796F1BEF1089673A89 /* Headers */ = { + C471C8275717C160DE2A2D5AAF09101C /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 496C2F48D86EEC3185AA85525CD195B3 /* Pods-Jelly_Tests-umbrella.h in Headers */, + 365684BF52554808935CE1C1BB1DA68B /* Jelly-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - EDC3E60D70CCC2A24DCB3C6F3992431D /* Headers */ = { + C9B96F4DDF06565D3B41A826AD209B1C /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 6061BF472FF45CE7ED2D7876387696A2 /* Pods-Jelly_Example-umbrella.h in Headers */, + F088EE1AE386EEF27AC934DE13F455BB /* CwlCatchException.h in Headers */, + BEB8082717D949400F2DE3458E75CBE3 /* CwlMachBadInstructionHandler.h in Headers */, + E984CB87ABF0DD970BD4B856DEA35E1A /* CwlPreconditionTesting.h in Headers */, + 618C13D4020EBA363997EFB60A56AC20 /* DSL.h in Headers */, + 5BA1006DAFD72ACF9F31DC95096FD054 /* mach_excServer.h in Headers */, + 9096D686AB39D3475A4227F0765C3DC4 /* Nimble-umbrella.h in Headers */, + 574F89786271FD7BAD216D075EA1E898 /* Nimble.h in Headers */, + B3C3D7DAB6567A273DA50FD2068AFF77 /* NMBExceptionCapture.h in Headers */, + 97A60F28FA1FF94422D2560002CEE407 /* NMBStringify.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 95E8C31CC69BDDA0F4E33D5DCDF3C16A /* Jelly */ = { + 30889BA112E197F05F23C038061C870B /* Pods-Jelly_Example */ = { isa = PBXNativeTarget; - buildConfigurationList = BC55D1F178728256030F1BDE9216F0DA /* Build configuration list for PBXNativeTarget "Jelly" */; + buildConfigurationList = 869DDD2C0661010C13C2D62CB014786F /* Build configuration list for PBXNativeTarget "Pods-Jelly_Example" */; buildPhases = ( - E616A5257B5FAEA0B73D4FE9AC833CA0 /* Sources */, - D6FCEC787164E550A250F87E9B0386AD /* Frameworks */, - 733CFCDA2357090BFEED01BC61141E50 /* Headers */, + 6E3B5022E7CB29214C450E568052FC5C /* Headers */, + 629B935403684770C2A6CC120265E72E /* Sources */, + 5BD1B3CAD35CDC1FCE47A3EBF22495A7 /* Frameworks */, + 35E0ADD47DEA13C60CD41D5D9EB7FC71 /* Resources */, ); buildRules = ( ); dependencies = ( + 110127550680282D7B8A509EB48B7CA4 /* PBXTargetDependency */, + 1BF2720F91A5A662452907580EAD2835 /* PBXTargetDependency */, ); - name = Jelly; - productName = Jelly; - productReference = 38AA7B61E292C1CF5D3CC850A80F5DFE /* Jelly.framework */; + name = "Pods-Jelly_Example"; + productName = "Pods-Jelly_Example"; + productReference = 1E12E8BD69B22FA3A3EC53C844D11E10 /* Pods_Jelly_Example.framework */; productType = "com.apple.product-type.framework"; }; - AA0132774BE36428369B19BF6856B6D8 /* Quick */ = { + 4E403190E18100D8B6FEB375DD12865F /* Quick */ = { isa = PBXNativeTarget; - buildConfigurationList = 78B03B96B66DDB44DCEF0106BB393AB4 /* Build configuration list for PBXNativeTarget "Quick" */; + buildConfigurationList = 5919EE7DF75F42AC0E738A4F456990B0 /* Build configuration list for PBXNativeTarget "Quick" */; buildPhases = ( - 62BA9A1FB5FAD6C5BF16E2D5BB6E31EE /* Sources */, - 416246FA9BA3AB171D6DF37AF87F8EA1 /* Frameworks */, - 65FA0C4FD86AF155A8A0F40C6E3B4CE4 /* Headers */, + 3FE9AFD1C3A631FDEAD706B3A970127C /* Headers */, + 8B4668842547AC8A6BAB34100AAC2308 /* Sources */, + F2DE7F580AF16C1A4242FFF89C8121FD /* Frameworks */, + 0C558D26BCB5E47FAC833F14AFDC1666 /* Resources */, ); buildRules = ( ); @@ -768,35 +1064,37 @@ ); name = Quick; productName = Quick; - productReference = C003A3ADDB78ADAF3CE91C08A0E8A033 /* Quick.framework */; + productReference = 272851DB38A28F446F5931D320F5108F /* Quick.framework */; productType = "com.apple.product-type.framework"; }; - BBD9F449B5F80199B107DB20FEFBB726 /* Pods-Jelly_Tests */ = { + 5B075E814FF56919B48C5199CFE1C195 /* Pods-Jelly_Tests */ = { isa = PBXNativeTarget; - buildConfigurationList = D5F6A273F42E94B3D655A18CF4F36591 /* Build configuration list for PBXNativeTarget "Pods-Jelly_Tests" */; + buildConfigurationList = C9EB3F1F71D4B17A5B079EBAA97A2A19 /* Build configuration list for PBXNativeTarget "Pods-Jelly_Tests" */; buildPhases = ( - C72CBAA127935D8E1FF76A5C8A58E256 /* Sources */, - 9F97C9E2A3E6B6A53DC272C3D6A579CD /* Frameworks */, - C6CC43AE2B3829796F1BEF1089673A89 /* Headers */, + 240E7E452A05C878E0E0D3D387C5395C /* Headers */, + AA381656640E20B40E56AB82937D1D8A /* Sources */, + 44CBD958BA7E1BD01F609DF0E8C7398A /* Frameworks */, + A2123B4DBD6F94D291032DAFB0EDB87A /* Resources */, ); buildRules = ( ); dependencies = ( - 890AE878C3A770F65EB0635ABA9A93EA /* PBXTargetDependency */, - 25F2E957A55138653C45EDF02E62E916 /* PBXTargetDependency */, + D88B4329FC820B0038CBBB07F4853184 /* PBXTargetDependency */, + 876C46852E5BEC7267BA80530063CC6E /* PBXTargetDependency */, ); name = "Pods-Jelly_Tests"; productName = "Pods-Jelly_Tests"; - productReference = AF452C29C1C0442F7AAD6480F6D4E960 /* Pods_Jelly_Tests.framework */; + productReference = 16058921B2D948B462510589BA13898E /* Pods_Jelly_Tests.framework */; productType = "com.apple.product-type.framework"; }; - DD7C8BF89FE8053D0A2A2D88BB49CF07 /* Nimble */ = { + 5E269AA9A7FBCB9BFD8EA487B43AE7F9 /* Nimble */ = { isa = PBXNativeTarget; - buildConfigurationList = 439502BDB29394EE0D69336E69C8494C /* Build configuration list for PBXNativeTarget "Nimble" */; + buildConfigurationList = 10836172B46B0B0B73CE062C21769FF3 /* Build configuration list for PBXNativeTarget "Nimble" */; buildPhases = ( - 3B8E072FBCB923980AC89BAC33C449B9 /* Sources */, - 819A9B65073BE3B5599196C0A3B27EBC /* Frameworks */, - 85497845823171A47E23A59621A44463 /* Headers */, + C9B96F4DDF06565D3B41A826AD209B1C /* Headers */, + 00172CED9D8741CA7FB64BA63FDC1054 /* Sources */, + 7F682A9E296D139B5A1E649989FB51D0 /* Frameworks */, + 260DB7AEBBC86367BD11959FA116A36E /* Resources */, ); buildRules = ( ); @@ -804,25 +1102,43 @@ ); name = Nimble; productName = Nimble; - productReference = 37806CEB041B6F1DA90F47CC738C2636 /* Nimble.framework */; + productReference = BBDD0426316D5C53701685B6F02FF43F /* Nimble.framework */; productType = "com.apple.product-type.framework"; }; - E96AE5E531261575EC9256436399A62F /* Pods-Jelly_Example */ = { + 73CB6F78FA8634EE2E6526014548F149 /* TouchVisualizer */ = { isa = PBXNativeTarget; - buildConfigurationList = 04855A33EE9056CAF8A0FD3A3A2684D5 /* Build configuration list for PBXNativeTarget "Pods-Jelly_Example" */; + buildConfigurationList = 8B8B07C5F57F051753329D5E1FE32603 /* Build configuration list for PBXNativeTarget "TouchVisualizer" */; buildPhases = ( - F1CBFBB59EA8981018C282ED6339AE93 /* Sources */, - 965C406C7455E461EB953AF08950162C /* Frameworks */, - EDC3E60D70CCC2A24DCB3C6F3992431D /* Headers */, + B82CDA7ECA45E22A1B849539AFE8F6AE /* Headers */, + 61EC6B3589B247AC515F786F28C6B7BE /* Sources */, + 26A75F54442C79179B993E4D0A8DD10C /* Frameworks */, + B0E57F3EF4D686A1BBC0FA437FD3A994 /* Resources */, ); buildRules = ( ); dependencies = ( - 02EAA5FEF39323FFB6FD94DEB1E19D3B /* PBXTargetDependency */, ); - name = "Pods-Jelly_Example"; - productName = "Pods-Jelly_Example"; - productReference = 32964E944076AFED03E7BF06C0A06AB0 /* Pods_Jelly_Example.framework */; + name = TouchVisualizer; + productName = TouchVisualizer; + productReference = 61A97243EBD76C4212926B4DA961AE25 /* TouchVisualizer.framework */; + productType = "com.apple.product-type.framework"; + }; + BEB11A95BFFDF3D35A3DE6F6656F857B /* Jelly */ = { + isa = PBXNativeTarget; + buildConfigurationList = E5A0760326CAA5741B107D9C938C1596 /* Build configuration list for PBXNativeTarget "Jelly" */; + buildPhases = ( + C471C8275717C160DE2A2D5AAF09101C /* Headers */, + 1BF9654538985A5DCF8C985D32457D84 /* Sources */, + D11D839F9B54F670289B1795F28017B5 /* Frameworks */, + F7968B6CBF3E5E51DED9E8D1A7165E60 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Jelly; + productName = Jelly; + productReference = ECA31579DE6A755F4CF3C9439A563137 /* Jelly.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -831,8 +1147,8 @@ D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0700; + LastSwiftUpdateCheck = 0930; + LastUpgradeCheck = 0930; }; buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; @@ -842,185 +1158,347 @@ en, ); mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = 019799724D9A3B81C3852627C8602E72 /* Products */; + productRefGroup = 85303BD091248A69AAC5BCF911107BB7 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 95E8C31CC69BDDA0F4E33D5DCDF3C16A /* Jelly */, - DD7C8BF89FE8053D0A2A2D88BB49CF07 /* Nimble */, - E96AE5E531261575EC9256436399A62F /* Pods-Jelly_Example */, - BBD9F449B5F80199B107DB20FEFBB726 /* Pods-Jelly_Tests */, - AA0132774BE36428369B19BF6856B6D8 /* Quick */, + BEB11A95BFFDF3D35A3DE6F6656F857B /* Jelly */, + 5E269AA9A7FBCB9BFD8EA487B43AE7F9 /* Nimble */, + 30889BA112E197F05F23C038061C870B /* Pods-Jelly_Example */, + 5B075E814FF56919B48C5199CFE1C195 /* Pods-Jelly_Tests */, + 4E403190E18100D8B6FEB375DD12865F /* Quick */, + 73CB6F78FA8634EE2E6526014548F149 /* TouchVisualizer */, ); }; /* End PBXProject section */ +/* Begin PBXResourcesBuildPhase section */ + 0C558D26BCB5E47FAC833F14AFDC1666 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 260DB7AEBBC86367BD11959FA116A36E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 35E0ADD47DEA13C60CD41D5D9EB7FC71 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A2123B4DBD6F94D291032DAFB0EDB87A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B0E57F3EF4D686A1BBC0FA437FD3A994 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F7968B6CBF3E5E51DED9E8D1A7165E60 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ - 3B8E072FBCB923980AC89BAC33C449B9 /* Sources */ = { + 00172CED9D8741CA7FB64BA63FDC1054 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - F9649DD59BAEE88C6864EEFE73ECA88C /* AdapterProtocols.swift in Sources */, - DF026F6F406A4FB6CEA63B0A4B9E27DD /* AllPass.swift in Sources */, - 32B38992751B96F21324BFC9923BFCBD /* AssertionDispatcher.swift in Sources */, - 73BC5AC2ECDB8722E085F14B53E0D24E /* AssertionRecorder.swift in Sources */, - B2C151B20635A480E1937E3D2B509BB4 /* Async.swift in Sources */, - EAAA05EBBC34225C0DB45797712E24A1 /* AsyncMatcherWrapper.swift in Sources */, - 7E0C9AE6468A5DF91F0F4C7A387D725C /* BeAKindOf.swift in Sources */, - C1D862177DC2999FAC710AC25F253BD0 /* BeAnInstanceOf.swift in Sources */, - BF3B7218901760A6226C7F6346BEF454 /* BeCloseTo.swift in Sources */, - 58C0125D796A97541FDE3414001D8A92 /* BeEmpty.swift in Sources */, - CCDAF11E7AF29E720C587B038145F622 /* BeginWith.swift in Sources */, - AF1174085D9BC5D50FCE0480E9C2BE94 /* BeGreaterThan.swift in Sources */, - 58D964317DFBB10F54A273CB12843017 /* BeGreaterThanOrEqualTo.swift in Sources */, - F4BD249C60F21F5E0F7C1FAC8A5BC2AF /* BeIdenticalTo.swift in Sources */, - B102ABE4E54B71B3D2C2118E2782FAB9 /* BeLessThan.swift in Sources */, - 75538A8B20C7A20AF3D54BBF35D56FFE /* BeLessThanOrEqual.swift in Sources */, - 1E1CE28FFCCD7499620B47C910E9B9E9 /* BeLogical.swift in Sources */, - 75ABB48E3C30C2D736C3D05D6FD566A8 /* BeNil.swift in Sources */, - 3C66D2692E811DAE57A244A67E7AC555 /* BeVoid.swift in Sources */, - A74537420FF0CEDC6B9E82E1DC4C2B15 /* Contain.swift in Sources */, - 25D1805055756CAA69A167CA03B2465C /* ContainElementSatisfying.swift in Sources */, - 37C5AC3FE6711A1117819AC5A18EE5C4 /* CwlBadInstructionException.swift in Sources */, - 051B2AF789E6D4E648C099830025DED9 /* CwlCatchBadInstruction.swift in Sources */, - 64819C8D4EBD3386377D0F84DC909F8B /* CwlCatchException.m in Sources */, - 2E6730CD6DFCFE1212EDE5343F2E099B /* CwlCatchException.swift in Sources */, - 25D7312BBE513DAB0ACBC1814DDC7C86 /* CwlDarwinDefinitions.swift in Sources */, - C3B1A7E0024A06554CBE973A69DFEDA2 /* CwlMachBadInstructionHandler.m in Sources */, - ADEE95A3A188BE3095990E20766BCCC8 /* DSL+Wait.swift in Sources */, - 8B55BD430033027AD5FF22D630DD9F62 /* DSL.m in Sources */, - 1A3E19B9F5EEB773C3BB61CA42F8BF62 /* DSL.swift in Sources */, - 3D1A89FDD6B579BAA92AD398E5C019F9 /* EndWith.swift in Sources */, - C8320A6164C870ADDB8A855ADEBBBDC9 /* Equal.swift in Sources */, - BC7B9761322C74FA27969BD55833BA47 /* Errors.swift in Sources */, - 65985C142EE8A74E6E56D5E30A39C79C /* Expectation.swift in Sources */, - 3E04D23B2995705A6106D41F3E3E4E33 /* ExpectationMessage.swift in Sources */, - 4FABBF5CA8F735F48035BE4144613CB7 /* Expression.swift in Sources */, - 17C8EE7DF3F57C8F99EAF63C6E61EA99 /* FailureMessage.swift in Sources */, - 62D26CE7BA3AEDB4E5E87218FDCBBA90 /* Functional.swift in Sources */, - 988EED125395950177DC14AF9BC87D8D /* HaveCount.swift in Sources */, - 4D68C35510D1E911C9B89840FC4B777F /* mach_excServer.c in Sources */, - F28003B228B82B7E1497D4F41F55A31E /* Match.swift in Sources */, - C06FA100C1BBEE34B863BCB8A65359C1 /* MatcherFunc.swift in Sources */, - 6BB0EBEB4730B94AC07458E398D142C8 /* MatcherProtocols.swift in Sources */, - 45F183320C688F9978649F30ABE21D09 /* MatchError.swift in Sources */, - 4CDACD8A5A6CFB688838AA988E7D1E43 /* Nimble-dummy.m in Sources */, - 54CC2049C937561A469575AF9E6A6FE9 /* NimbleEnvironment.swift in Sources */, - CF55697859D633C852C3586384647EB6 /* NimbleXCTestHandler.swift in Sources */, - 6CB4890B9BF5F846E980634AFE83917D /* NMBExceptionCapture.m in Sources */, - 68FD03C72D719117929696B62038B3D7 /* NMBExpectation.swift in Sources */, - A7C13C62E4116CA964A3E82179092AD5 /* NMBObjCMatcher.swift in Sources */, - AE4DA49ECD693BF384CD824DF02D7C6E /* NMBStringify.m in Sources */, - 31C39ED8CB1C9317F1F2840FC919662D /* PostNotification.swift in Sources */, - EF8548E0C37E8888D9DDC11ED89D3568 /* Predicate.swift in Sources */, - EAE2AAE5EB826B38978692984BB22FDD /* RaisesException.swift in Sources */, - EB3A73071ABA60E77E0704649637D8BD /* SatisfyAnyOf.swift in Sources */, - F3BAA36614ABDBC0538B0DEA99CF80A0 /* SourceLocation.swift in Sources */, - 8170866E2ACE0ACFBC6D90081354EC65 /* Stringers.swift in Sources */, - 3B3A88E074630B1EBC2139F4F70F0443 /* ThrowAssertion.swift in Sources */, - 5BF274C2DEF332ED79B1CD15CFEC3498 /* ThrowError.swift in Sources */, - 29A65FF7D1752DFFF87F5DC8F55CE859 /* ToSucceed.swift in Sources */, - A61ADD214AA182EEB2AC95EA3F3D658F /* XCTestObservationCenter+Register.m in Sources */, + CE1287DA39DB4208F5511CE47FE8298D /* AdapterProtocols.swift in Sources */, + 1AC5D2CE6FA79327468F53B53D0A9418 /* AllPass.swift in Sources */, + B6F0D7C04121F97B1D4933C0168278EF /* AssertionDispatcher.swift in Sources */, + 85107C3BD627EA89CC1EAB25859EF85D /* AssertionRecorder.swift in Sources */, + 3312F77A6C289F2CEFBF0C1D98431671 /* Async.swift in Sources */, + DEEDD0D7C0369178EC867A59373F6380 /* Await.swift in Sources */, + 6B2DF45B9BFABD4BF3DDC503F073FB71 /* BeAKindOf.swift in Sources */, + 0D74DB80E4766C505062F32B6C5A70AD /* BeAnInstanceOf.swift in Sources */, + DA257CBBCAB6C22BA5476F983AC78BB5 /* BeCloseTo.swift in Sources */, + 9C22921616DC80691662977DDEA6B2C4 /* BeEmpty.swift in Sources */, + DF7CF1941236840A89D99B233E4DC086 /* BeginWith.swift in Sources */, + 6FE504E9ED5B37C05CFC2A530019AE5D /* BeGreaterThan.swift in Sources */, + 58B249717B134855DA1DF182DF0AEDB9 /* BeGreaterThanOrEqualTo.swift in Sources */, + 97EE56F66DCD3C983D0585D8F45FDB6A /* BeIdenticalTo.swift in Sources */, + B2F5395D43472600D7BA7E26E3772069 /* BeLessThan.swift in Sources */, + 06F38DD26D80484050C9ED86478406F2 /* BeLessThanOrEqual.swift in Sources */, + DD2EB3198539280E2F07F0E360AFF324 /* BeLogical.swift in Sources */, + 8E83E547D107FFC8B596829313AAF38F /* BeNil.swift in Sources */, + 5747F17B237F1ACB862F3F2911E5CBB1 /* BeVoid.swift in Sources */, + B30FCDD03BFE82B7E9776FD9CE3A1C51 /* Contain.swift in Sources */, + 8BB7F5B7E3E77CF25E64E1EAD1A26E68 /* ContainElementSatisfying.swift in Sources */, + 9A0EB2F0A468E4576E776AE1E9221E7A /* CwlBadInstructionException.swift in Sources */, + 350C051E271508531C90540A2496684C /* CwlCatchBadInstruction.swift in Sources */, + F4EE282D8435D54A662C6DDD30A3D2CD /* CwlCatchException.m in Sources */, + 2574D09B363D42ACA6BA589B675FFA26 /* CwlCatchException.swift in Sources */, + 8050C10B78F2D1DD98A2F3E250A24AD0 /* CwlDarwinDefinitions.swift in Sources */, + 66D3DA2225488356273B3D0AB83DA268 /* CwlMachBadInstructionHandler.m in Sources */, + 42A9F49A3D23555A2EC71F3E84E435FB /* DSL+Wait.swift in Sources */, + 6985430721C89135D5B4CBE13357EC31 /* DSL.m in Sources */, + A490FAE0B78B47AF739B0DAFC1DC5AD6 /* DSL.swift in Sources */, + 74605907C211553B00F09768BEF12834 /* EndWith.swift in Sources */, + 19291565899B5113A5355002CF9C8F2F /* Equal.swift in Sources */, + 4C093ABFA796CEC3AC89C1B9DC36841D /* Errors.swift in Sources */, + A286AD495C5D4520ADF2ECE7786EF950 /* Expectation.swift in Sources */, + 1E2AE2B6202B65E712FE05FB2699BD2C /* ExpectationMessage.swift in Sources */, + E454528E8D39931207848DACBB617A4C /* Expression.swift in Sources */, + 24AC6513961FF6DC60E0FB284E8914B6 /* FailureMessage.swift in Sources */, + 4BC738EA304E6FA57294B9AAFEC56F70 /* Functional.swift in Sources */, + F32B9D0318D13B740E6D88E16709FEA3 /* HaveCount.swift in Sources */, + C5305DE0B553BCA7361C3997ACD70FFB /* mach_excServer.c in Sources */, + DDB89D0F2F9422FEFF8D3ABB4B1FC7F9 /* Match.swift in Sources */, + 44F6B7EB2EAF73218A16F56D45C877A4 /* MatcherFunc.swift in Sources */, + 6B124A4D8EB28A918E0C87F2E75D94F8 /* MatcherProtocols.swift in Sources */, + 7AA9A7388AF44BB4EB2111CEDB29A666 /* MatchError.swift in Sources */, + 79FA255F43C9E42470C9720C0604444F /* Nimble-dummy.m in Sources */, + 0C345DBBF5EF9ED046CB579FDD401A57 /* NimbleEnvironment.swift in Sources */, + 62A3D36B892ED9C9A3210134C97FE3F9 /* NimbleXCTestHandler.swift in Sources */, + 2EF89DB591335BFB29606E0706E66D9F /* NMBExceptionCapture.m in Sources */, + 223CA7D4EDF23874D61C762F6CF51C56 /* NMBExpectation.swift in Sources */, + 562B8E7BBB3176E837BEBD6D24DA7EF4 /* NMBObjCMatcher.swift in Sources */, + 3C0D99EED837A3AD705A664503EF48DE /* NMBStringify.m in Sources */, + 22948773F0660B81265C2C17A0761F0D /* PostNotification.swift in Sources */, + 935558F919649CDE3784CBD344D3C008 /* Predicate.swift in Sources */, + 5895EA4D5666103B2CD4243690487D07 /* RaisesException.swift in Sources */, + 7485AAEB633B78268D656D019B77E023 /* SatisfyAllOf.swift in Sources */, + 746D0DBAF8EB27CA816CFD021DE2A7A1 /* SatisfyAnyOf.swift in Sources */, + DA4FBA76599ECAB9A1993F119A41359D /* SourceLocation.swift in Sources */, + B7ED1B41F56087971B656A2E38322310 /* Stringers.swift in Sources */, + 37C3C6235A5DDB8E37629314CF0E8489 /* ThrowAssertion.swift in Sources */, + E85EAC40F42C10F327BE0BCF39C2DF3B /* ThrowError.swift in Sources */, + DAF21E37BBBFD5D408F514E867A5936C /* ToSucceed.swift in Sources */, + B3895E766FFE0B7DF58F4D0BE246221B /* XCTestObservationCenter+Register.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 62BA9A1FB5FAD6C5BF16E2D5BB6E31EE /* Sources */ = { + 1BF9654538985A5DCF8C985D32457D84 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - A667134AA12155E870C7BEE07C832639 /* Behavior.swift in Sources */, - 2AC13B3BCACAF47A4568AD59A0A526EA /* Callsite.swift in Sources */, - 5706C5BA9647CC9CA4EF1599014FE57C /* Closures.swift in Sources */, - 63F175C624BCCD8AF13BFABFC24F3FD1 /* Configuration.swift in Sources */, - 1E1D6CE3D5CE567CA3BA6F660DED9C78 /* DSL.swift in Sources */, - 2820703556A070F86B59613CAED93838 /* ErrorUtility.swift in Sources */, - 29BA245B168F471ABEEA028C73621ABC /* Example.swift in Sources */, - 606093446CD645B97D0873DC926B281F /* ExampleGroup.swift in Sources */, - 21E144ADA17DF11A68921A7990CF3F43 /* ExampleHooks.swift in Sources */, - A0AB98BF5C5B263338D5447DB8DD11CF /* ExampleMetadata.swift in Sources */, - 9E8D63BD1D5AFC9A0B12226F94FFF4CA /* Filter.swift in Sources */, - 8442DC4D17B0DAAB10CBA72AB7143686 /* HooksPhase.swift in Sources */, - 6F3149062AB731B6F1B5D8F43598C76B /* NSBundle+CurrentTestBundle.swift in Sources */, - DB42C9499010389E4E5C54D126C0C168 /* NSString+C99ExtendedIdentifier.swift in Sources */, - A57B1622384C7C3C8AF1CC42B21E452D /* QCKDSL.m in Sources */, - B40FEC5030A794FEC3611FD04A209841 /* Quick-dummy.m in Sources */, - 69BD3C79C0FE2C62BE7F2431A7103B58 /* QuickConfiguration.m in Sources */, - CD35A419AF9F565BCF46E85719F327EF /* QuickSelectedTestSuiteBuilder.swift in Sources */, - BC103904981A4994F28949AFD76D7009 /* QuickSpec.m in Sources */, - C4EE9BFCFE19793509CB252F86626081 /* QuickSpecBase.m in Sources */, - 57318255435A94922FC4F7FE9E903490 /* QuickTestSuite.swift in Sources */, - 5881A2ED53DE796E62D63EC568052D69 /* SuiteHooks.swift in Sources */, - DC68C1C8E64C53AB1C3EB8265C200C71 /* URL+FileName.swift in Sources */, - 95B1822B493FFACE163ACF0774CA3152 /* World+DSL.swift in Sources */, - 3BAA3F2174E5076C76FE9C124A6BD102 /* World.swift in Sources */, - 5AC5F0B8A787AF301AE6395546E77E44 /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */, + 95B6F39536C6E21B2271061A6B5A6E94 /* AnimationCurve+AnimationOptions.swift in Sources */, + 9680E409CB6A335EEA527934BC3B6101 /* Animator.swift in Sources */, + 178D335802CD200B689E8B456E417DA5 /* BackgroundStyle.swift in Sources */, + 76A0170E649A948EC59ACEEC5AA1DB42 /* CombinedTimingCurveProvider.swift in Sources */, + AE8DEFD225997857F08F6B1127F6473B /* Constants.swift in Sources */, + B4A5391D08A413DFDB77272A80094CCA /* CoverAnimator.swift in Sources */, + B1A7F7EE1A038950627A70298AA74D9C /* CoverPresentation.swift in Sources */, + 039B6DF6277B90CE3E78AD37333752B3 /* Direction+EdgeHelper.swift in Sources */, + 9AFADEAD60F22CAD938F3DC856D84449 /* Direction+Orientation.swift in Sources */, + B7183AAA4DB9E86D1CC6A304F780F662 /* Direction.swift in Sources */, + 4CE7C32CB4FCF9037915B0419FBE2BFC /* DragMode.swift in Sources */, + 54DB75675BB41A42357B7E194F6CF74F /* Duration.swift in Sources */, + 773FC9A1305BC6EB5BF067B5F19A0253 /* FadeAnimator.swift in Sources */, + F8DCC99E49F076FA92E4DEC50C63ACA2 /* FadePresentation.swift in Sources */, + F43F40BA8DE54117CC8DD5FAE1E6C3A8 /* HorizontalAlignment.swift in Sources */, + 6B42CEEE38FE6194B13BAA48E3C3C73D /* InteractionConfiguration.swift in Sources */, + 2AAECA63C28DA66D2734980B48CBA2DC /* InteractionConfigurationProvider.swift in Sources */, + 702665C14074D2CD1A96791B076F05D9 /* InteractionController.swift in Sources */, + C22C16AEFB219949BA28C619B86F9D5C /* Jelly-dummy.m in Sources */, + B4EDAEC51A85334113924B375D318329 /* LiveUpdateError.swift in Sources */, + 440D74B1049C698F588B700AEFA8D5F2 /* Orientation.swift in Sources */, + 9A3BD9B26C2ACBCE6EE7D18550254C7B /* Presentation.swift in Sources */, + 4EA6E1C17F11C38C85A1765B59DD1C62 /* PresentationAlignment.swift in Sources */, + C825352204A89543F8B4C8BCE8E8D0B6 /* PresentationAlignmentProvider.swift in Sources */, + D3BD7C7DBE343CB1556FEB27C5E9AC86 /* PresentationAnimatorProvider.swift in Sources */, + E26DE2707229F79E4BE6030A030EC426 /* PresentationController.swift in Sources */, + A2E4847546706E7A83BB4FD3391AADF9 /* PresentationDirectionDismissProvider.swift in Sources */, + 58040055A530DAC34F9A1BD032FF07A9 /* PresentationDirectionShowProvider.swift in Sources */, + 4376543F566BB8211E6B6D1FE8E1E0A3 /* PresentationHeightProvider.swift in Sources */, + DD9F95FCF2097B64801826E14E6B0E1A /* PresentationInteractiveAnimatorProvider.swift in Sources */, + E65CC5E19EE6525D57426BDB6E26CB79 /* PresentationMarginGuardsProvider.swift in Sources */, + 3F6252E0F3B16FC9B2F2B15AC5084F9F /* PresentationSingleSizeProvider.swift in Sources */, + 6F26C585C94166C53642255C104C97FB /* PresentationSize.swift in Sources */, + CE23D4838FB5AA609E41EFC7D6D7BA35 /* PresentationSizeProtocol.swift in Sources */, + 1FB288917FD6212D5120728D4AF52926 /* PresentationSizeProvider.swift in Sources */, + 10BF18C5EC2F2C79BD25F09F56100B77 /* PresentationSpringProvider.swift in Sources */, + B72BC319F9338FE721BFBEA0EDD49B36 /* PresentationTiming.swift in Sources */, + 0915724DFE66D41FC4E418DF2ED64512 /* PresentationTimingInformationProvider.swift in Sources */, + 60D2D3C45C8CCFD2B5409C0CD650700D /* PresentationTimingProtocol.swift in Sources */, + 060AE17E2B7A654E4A091C45D8F13389 /* PresentationType.swift in Sources */, + 032E9A065A38C85443A482180DCC2728 /* PresentationUIConfiguration.swift in Sources */, + C0026E595D65E6D500964036FA222011 /* PresentationUIConfigurationProvider.swift in Sources */, + 99CE62DE2D2E8C354D36D3E1CC131EB1 /* PresentationWidthProvider.swift in Sources */, + 344E4BE009FEC7F80EE8EC3F568C1307 /* Size+Equatable.swift in Sources */, + 2C3E1CB52B965BFAB1E9A2D61FA32731 /* Size.swift in Sources */, + 2BBF69C2A9AE5D1B99F9393725B7A4F5 /* SlideAnimator.swift in Sources */, + EC6B59311C15B33D5FEF724DCF0EB8A2 /* SlidePresentation.swift in Sources */, + E7007304EF95155DD821426F64223085 /* Spring+Values.swift in Sources */, + 3429418EB87F21D02290226EF75D173F /* Spring.swift in Sources */, + 780A929EDC45A825E2CBADDD1DA550EB /* UIView+RoundCorners.swift in Sources */, + 850791A73ACE3ADFC6F6CB9ABD2DBADA /* UIViewControllerAnimatedTransitioning+Convenience.swift in Sources */, + 7D4F109F5FAB9560EED1B52D90E9EB8B /* VerticalAlignment.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - C72CBAA127935D8E1FF76A5C8A58E256 /* Sources */ = { + 61EC6B3589B247AC515F786F28C6B7BE /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 643C6B155FA0A57769FF4B59E31B9A9B /* Pods-Jelly_Tests-dummy.m in Sources */, + 821F1A5C052DDE77B6248CD0C418EBC2 /* Configuration.swift in Sources */, + 891A68909587F4C951CEE146DC55D310 /* TouchView.swift in Sources */, + FBE0A7DD649B259D4A1D2C3203170E76 /* TouchVisualizer-dummy.m in Sources */, + 46D69C9CB63C873B2873F767A0FCB2BB /* UIWindow+Swizzle.swift in Sources */, + 86C063BAE236118248770D5BF0668FBE /* Visualizer.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - E616A5257B5FAEA0B73D4FE9AC833CA0 /* Sources */ = { + 629B935403684770C2A6CC120265E72E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 607C656B600E80F321686A0DD904066F /* Jelly-dummy.m in Sources */, - 5528487B8CA7F7D304BDC4F48BE73726 /* Jelly.swift in Sources */, - 7D685EF740B61FBFAAC60304CA2E84A1 /* JellyAnimator.swift in Sources */, - 2F20AB9F93BAF0466C6B8FCBED57383A /* JellyConstants.swift in Sources */, - A0EF4FC6C455C59C0F60AAA7A54731D4 /* JellyFadeInPresentation.swift in Sources */, - 0CF49F861976DF018EA063C3FA60E955 /* JellyFadeInPresentationAnimator.swift in Sources */, - DCC01B1A2A8E9B5DAB8C7A7F3265B2F7 /* JellyPresentation.swift in Sources */, - A867263C360C948CFF7378C06EACA536 /* JellyPresentationController.swift in Sources */, - 05EC946C9DC9AB0AFDC70D658BCC6C89 /* JellyShiftInPresentation.swift in Sources */, - 99E867EAAA1E5C553DC3D710EF4FC77F /* JellyShiftInPresentationAnimator.swift in Sources */, - 23CDA1074E3D3E72D9CAF8E8FBD35DB2 /* JellySlideInPresentation.swift in Sources */, - 306A88B4C9BC7D9734C4C0F49871C3C4 /* JellySlideInPresentationAnimator.swift in Sources */, - A0BF05A1C4863372A7D9F24881B00F55 /* UIView+Jelly.swift in Sources */, - A084E411B238604F4EB2CAE768C66BD1 /* UIViewControllerAnimatedTransitioning+Extension.swift in Sources */, + D0FC783134058EA7EAA2D9009C36AF81 /* Pods-Jelly_Example-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - F1CBFBB59EA8981018C282ED6339AE93 /* Sources */ = { + 8B4668842547AC8A6BAB34100AAC2308 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 23DE64F6518B524DF9950850ED3A31FD /* Pods-Jelly_Example-dummy.m in Sources */, + 6A8A6F921233499B250FFD98DEDA713F /* Behavior.swift in Sources */, + 9084FD8960EAD11A5BF719AE3F5BA624 /* Callsite.swift in Sources */, + 118894DB9F20F5979822204C8AC30096 /* Closures.swift in Sources */, + 625DF4DD54C40BF9DFD365930B982212 /* Configuration.swift in Sources */, + 3805AA812801A18911D5D0357A7F4E35 /* DSL.swift in Sources */, + 74CABE7BBFC6708DAE774F204091B655 /* ErrorUtility.swift in Sources */, + 72D4E134EA8772652620E55B6E280A99 /* Example.swift in Sources */, + 496348493ECB434C490045B03BB0D61E /* ExampleGroup.swift in Sources */, + 51CBC2F9289BC515ADC6A20DF4843C7A /* ExampleHooks.swift in Sources */, + 1ECAB0BE4120F1C173B873889DD27693 /* ExampleMetadata.swift in Sources */, + 4BC394D58E27C08243FC9B6F6826B9C2 /* Filter.swift in Sources */, + 0178CE8ACB5D1694994D10E11A699077 /* HooksPhase.swift in Sources */, + 2CCECD5D997EC574894D3FE519371833 /* NSBundle+CurrentTestBundle.swift in Sources */, + 47E6EBF129F76146D437F5678E1CEEE6 /* NSString+C99ExtendedIdentifier.swift in Sources */, + F869CF4A83E5333771493E16AC8FC813 /* QCKDSL.m in Sources */, + 294F8B34F4D480C46EFE16B08BE99280 /* Quick-dummy.m in Sources */, + 9B682327EF17EB443C3DA91C198440C5 /* QuickConfiguration.m in Sources */, + 3BEF5520DAA602A348B56A416E18AA73 /* QuickSelectedTestSuiteBuilder.swift in Sources */, + A256EFAA83A77FB21F39220710D7DB55 /* QuickSpec.m in Sources */, + F429F04B2D4A0CBB549BA75A48853886 /* QuickSpecBase.m in Sources */, + A13DB1D9C8120FEB9AB49D5823F4E6B0 /* QuickTestSuite.swift in Sources */, + B25CF838D27CE9E1EACB2A5F642AC967 /* SuiteHooks.swift in Sources */, + 670F2E3611B2B8EBD2C871FA67358D0B /* URL+FileName.swift in Sources */, + 2CDC32CF3E8FEDC5F47BBA7B8AE79BAC /* World+DSL.swift in Sources */, + 54694B54DA5E88F7260D7C9AA48810B2 /* World.swift in Sources */, + E8D0E6CFC7590FCB468020C2ED16BC2B /* XCTestSuite+QuickTestSuiteBuilder.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AA381656640E20B40E56AB82937D1D8A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 430D0E9E855C6F3FD6ECA03B41476B11 /* Pods-Jelly_Tests-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 02EAA5FEF39323FFB6FD94DEB1E19D3B /* PBXTargetDependency */ = { + 110127550680282D7B8A509EB48B7CA4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Jelly; - target = 95E8C31CC69BDDA0F4E33D5DCDF3C16A /* Jelly */; - targetProxy = 1FBDB0CCF6D97AB3AC1E63A523F4F6D7 /* PBXContainerItemProxy */; + target = BEB11A95BFFDF3D35A3DE6F6656F857B /* Jelly */; + targetProxy = 74D68A4775EAF1138A959F8FE087910D /* PBXContainerItemProxy */; + }; + 1BF2720F91A5A662452907580EAD2835 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = TouchVisualizer; + target = 73CB6F78FA8634EE2E6526014548F149 /* TouchVisualizer */; + targetProxy = 1BC4E9D95753457F116A2E9030F9F164 /* PBXContainerItemProxy */; }; - 25F2E957A55138653C45EDF02E62E916 /* PBXTargetDependency */ = { + 876C46852E5BEC7267BA80530063CC6E /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Quick; - target = AA0132774BE36428369B19BF6856B6D8 /* Quick */; - targetProxy = 4FB31F760D6C4673A0D93CED806928E9 /* PBXContainerItemProxy */; + target = 4E403190E18100D8B6FEB375DD12865F /* Quick */; + targetProxy = E535A53649D53CACBB882A9B4025F883 /* PBXContainerItemProxy */; }; - 890AE878C3A770F65EB0635ABA9A93EA /* PBXTargetDependency */ = { + D88B4329FC820B0038CBBB07F4853184 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Nimble; - target = DD7C8BF89FE8053D0A2A2D88BB49CF07 /* Nimble */; - targetProxy = CFE8D551ADA67A281E68A28368D3FC5F /* PBXContainerItemProxy */; + target = 5E269AA9A7FBCB9BFD8EA487B43AE7F9 /* Nimble */; + targetProxy = 71F5D4CDA15B0C37C6E8AD3CC9B4266D /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 270918D0049DBF7D12EB99A88679E33E /* Debug */ = { + 006A233AFBB63BE14DD02BFC751CC7B5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AE311FD9A0241C1B0B383CF262BDBB82 /* Jelly.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + 051AD2973C379122AE9D1F1A9F73CDD1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C4FE8A021E27B8859128D8F496275877 /* Nimble.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1031,60 +1509,128 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Jelly/Jelly-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Jelly/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Nimble/Nimble-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Nimble/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Jelly/Jelly.modulemap"; - PRODUCT_NAME = Jelly; + MODULEMAP_FILE = "Target Support Files/Nimble/Nimble.modulemap"; + PRODUCT_NAME = Nimble; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 42642BC2090C1F01FA133D0BAD557484 /* Release */ = { + 1549AE7B9505286BBFDDBF4F4F16E1E4 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D5EBE08A3B758919CB15F7C75D878D1D /* Nimble.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 1A75C42B7032B3BFDA8BA3301173B628 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 37FC21B23F9F374968D8A8E37774345F /* Pods-Jelly_Example.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Nimble/Nimble-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Nimble/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-Jelly_Example/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Nimble/Nimble.modulemap"; - PRODUCT_NAME = Nimble; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_Jelly_Example; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 66D3B5A290788E87CD1E2FB5D1AA745D /* Release */ = { + 4C7D51D8DFB052E707BE8BC41BE25030 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 570631FA0517A859523BCDDDBBED67B5 /* Pods-Jelly_Tests.release.xcconfig */; + baseConfigurationReference = D484D8E273280854E1215DB4642B89A5 /* Pods-Jelly_Tests.debug.xcconfig */; buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1096,7 +1642,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Target Support Files/Pods-Jelly_Tests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-Jelly_Tests/Pods-Jelly_Tests.modulemap"; @@ -1107,17 +1653,17 @@ PRODUCT_NAME = Pods_Jelly_Tests; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 6B4B805320F41E3B7571BC025BC768DF /* Debug */ = { + 6718E0BC10A8C3D124A3E291DD10F7C5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D5EBE08A3B758919CB15F7C75D878D1D /* Nimble.xcconfig */; + baseConfigurationReference = 7A77FA09C3C205B7CC1AFF09FBCF6E6C /* Quick.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1128,27 +1674,27 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Nimble/Nimble-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Nimble/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Quick/Quick-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Quick/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Nimble/Nimble.modulemap"; - PRODUCT_NAME = Nimble; + MODULEMAP_FILE = "Target Support Files/Quick/Quick.modulemap"; + PRODUCT_NAME = Quick; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 753B9243193C90A3451EEEA0316CD0AD /* Release */ = { + 6DE9B3F5DD39EC9986CD932AAC9EF5F6 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B62FC8D3EFD93B2D3877DF87DBB12631 /* Quick.xcconfig */; + baseConfigurationReference = 0A68B97167C83E75EDE964FFE91AEC9B /* TouchVisualizer.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1159,18 +1705,19 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Quick/Quick-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Quick/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/TouchVisualizer/TouchVisualizer-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/TouchVisualizer/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Quick/Quick.modulemap"; - PRODUCT_NAME = Quick; + MODULEMAP_FILE = "Target Support Files/TouchVisualizer/TouchVisualizer.modulemap"; + PRODUCT_NAME = TouchVisualizer; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1178,10 +1725,11 @@ }; name = Release; }; - 7EF4474B6D96D7722C2B81A365C65813 /* Debug */ = { + 8864CEEE463BA01F520FD04639B46C28 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B62FC8D3EFD93B2D3877DF87DBB12631 /* Quick.xcconfig */; + baseConfigurationReference = 91E91FEF09AE9662313AA8828A1AC3A0 /* Pods-Jelly_Tests.release.xcconfig */; buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1191,28 +1739,33 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Quick/Quick-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Quick/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-Jelly_Tests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Quick/Quick.modulemap"; - PRODUCT_NAME = Quick; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Jelly_Tests/Pods-Jelly_Tests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_Jelly_Tests; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - A060025FF804DE5C92FEB8054EA89689 /* Release */ = { + A557A04FB989171991ED50D66BA74B34 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AE311FD9A0241C1B0B383CF262BDBB82 /* Jelly.xcconfig */; + baseConfigurationReference = 2216869779F9686263BB08850C1079C9 /* Jelly.xcconfig */; buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1225,15 +1778,16 @@ GCC_PREFIX_HEADER = "Target Support Files/Jelly/Jelly-prefix.pch"; INFOPLIST_FILE = "Target Support Files/Jelly/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/Jelly/Jelly.modulemap"; PRODUCT_NAME = Jelly; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 4.0; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1241,10 +1795,11 @@ }; name = Release; }; - ACE76F104949C54842005E1AB9C74F09 /* Release */ = { + B5108AD4E7DF803378B4110FD3130C16 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 66219932202903DE7641EBA5603D159A /* Pods-Jelly_Example.release.xcconfig */; + baseConfigurationReference = 0AB9C0E30FFD2F19217224F230405282 /* Pods-Jelly_Example.release.xcconfig */; buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1256,7 +1811,7 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Target Support Files/Pods-Jelly_Example/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example.modulemap"; @@ -1267,7 +1822,8 @@ PRODUCT_NAME = Pods_Jelly_Example; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1275,9 +1831,9 @@ }; name = Release; }; - AE8ED629B038B76575E36C43A23BD863 /* Debug */ = { + D7C90D4956D3F1AE5A8FC302547EA23A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A31B12010AD7A33648A58605520F09DA /* Pods-Jelly_Tests.debug.xcconfig */; + baseConfigurationReference = 7A77FA09C3C205B7CC1AFF09FBCF6E6C /* Quick.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1288,145 +1844,92 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-Jelly_Tests/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Quick/Quick-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Quick/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-Jelly_Tests/Pods-Jelly_Tests.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_Jelly_Tests; + MODULEMAP_FILE = "Target Support Files/Quick/Quick.modulemap"; + PRODUCT_NAME = Quick; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - B254DAA6CF0CE39F4A3D11B90A7E059A /* Release */ = { + F387B23DB673D025827D707070AFCAEF /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 0A68B97167C83E75EDE964FFE91AEC9B /* TouchVisualizer.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; - STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "${SRCROOT}/../build"; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/TouchVisualizer/TouchVisualizer-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/TouchVisualizer/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/TouchVisualizer/TouchVisualizer.modulemap"; + PRODUCT_NAME = TouchVisualizer; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - E4B68EE12B21C47CB798D9B1ECA6D7A7 /* Debug */ = { + F8E3F3EC86CEFECB730B9E208951E5DB /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 2216869779F9686263BB08850C1079C9 /* Jelly.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SYMROOT = "${SRCROOT}/../build"; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/Jelly/Jelly-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Jelly/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Jelly/Jelly.modulemap"; + PRODUCT_NAME = Jelly; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Debug; }; - E6421269C292CB55964EEF26361B27C1 /* Debug */ = { + FECF2EE124A3FC7D57394EC2848B88D8 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7FC6C2B1B0491AD6C97D1D57F9F176EA /* Pods-Jelly_Example.debug.xcconfig */; + baseConfigurationReference = C4FE8A021E27B8859128D8F496275877 /* Nimble.xcconfig */; buildSettings = { CODE_SIGN_IDENTITY = ""; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1437,35 +1940,34 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-Jelly_Example/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Nimble/Nimble-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Nimble/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_Jelly_Example; + MODULEMAP_FILE = "Target Support Files/Nimble/Nimble.modulemap"; + PRODUCT_NAME = Nimble; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 04855A33EE9056CAF8A0FD3A3A2684D5 /* Build configuration list for PBXNativeTarget "Pods-Jelly_Example" */ = { + 10836172B46B0B0B73CE062C21769FF3 /* Build configuration list for PBXNativeTarget "Nimble" */ = { isa = XCConfigurationList; buildConfigurations = ( - E6421269C292CB55964EEF26361B27C1 /* Debug */, - ACE76F104949C54842005E1AB9C74F09 /* Release */, + 051AD2973C379122AE9D1F1A9F73CDD1 /* Debug */, + FECF2EE124A3FC7D57394EC2848B88D8 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1473,44 +1975,53 @@ 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - E4B68EE12B21C47CB798D9B1ECA6D7A7 /* Debug */, - B254DAA6CF0CE39F4A3D11B90A7E059A /* Release */, + 1549AE7B9505286BBFDDBF4F4F16E1E4 /* Debug */, + 006A233AFBB63BE14DD02BFC751CC7B5 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5919EE7DF75F42AC0E738A4F456990B0 /* Build configuration list for PBXNativeTarget "Quick" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6718E0BC10A8C3D124A3E291DD10F7C5 /* Debug */, + D7C90D4956D3F1AE5A8FC302547EA23A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 439502BDB29394EE0D69336E69C8494C /* Build configuration list for PBXNativeTarget "Nimble" */ = { + 869DDD2C0661010C13C2D62CB014786F /* Build configuration list for PBXNativeTarget "Pods-Jelly_Example" */ = { isa = XCConfigurationList; buildConfigurations = ( - 6B4B805320F41E3B7571BC025BC768DF /* Debug */, - 42642BC2090C1F01FA133D0BAD557484 /* Release */, + 1A75C42B7032B3BFDA8BA3301173B628 /* Debug */, + B5108AD4E7DF803378B4110FD3130C16 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 78B03B96B66DDB44DCEF0106BB393AB4 /* Build configuration list for PBXNativeTarget "Quick" */ = { + 8B8B07C5F57F051753329D5E1FE32603 /* Build configuration list for PBXNativeTarget "TouchVisualizer" */ = { isa = XCConfigurationList; buildConfigurations = ( - 7EF4474B6D96D7722C2B81A365C65813 /* Debug */, - 753B9243193C90A3451EEEA0316CD0AD /* Release */, + F387B23DB673D025827D707070AFCAEF /* Debug */, + 6DE9B3F5DD39EC9986CD932AAC9EF5F6 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - BC55D1F178728256030F1BDE9216F0DA /* Build configuration list for PBXNativeTarget "Jelly" */ = { + C9EB3F1F71D4B17A5B079EBAA97A2A19 /* Build configuration list for PBXNativeTarget "Pods-Jelly_Tests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 270918D0049DBF7D12EB99A88679E33E /* Debug */, - A060025FF804DE5C92FEB8054EA89689 /* Release */, + 4C7D51D8DFB052E707BE8BC41BE25030 /* Debug */, + 8864CEEE463BA01F520FD04639B46C28 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - D5F6A273F42E94B3D655A18CF4F36591 /* Build configuration list for PBXNativeTarget "Pods-Jelly_Tests" */ = { + E5A0760326CAA5741B107D9C938C1596 /* Build configuration list for PBXNativeTarget "Jelly" */ = { isa = XCConfigurationList; buildConfigurations = ( - AE8ED629B038B76575E36C43A23BD863 /* Debug */, - 66D3B5A290788E87CD1E2FB5D1AA745D /* Release */, + F8E3F3EC86CEFECB730B9E208951E5DB /* Debug */, + A557A04FB989171991ED50D66BA74B34 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Jelly.xcscheme b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Jelly.xcscheme index 34039d5..0ea492b 100644 --- a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Jelly.xcscheme +++ b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Jelly.xcscheme @@ -1,6 +1,6 @@ @@ -45,7 +45,7 @@ @@ -63,7 +63,7 @@ diff --git a/Example/Pods/Quick/Sources/Quick/DSL/World+DSL.swift b/Example/Pods/Quick/Sources/Quick/DSL/World+DSL.swift index 5249027..942c2e6 100644 --- a/Example/Pods/Quick/Sources/Quick/DSL/World+DSL.swift +++ b/Example/Pods/Quick/Sources/Quick/DSL/World+DSL.swift @@ -85,6 +85,7 @@ extension World { } #endif + @nonobjc internal func it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { if beforesCurrentlyExecuting { raiseError("'it' cannot be used inside 'beforeEach', 'it' may only be used inside 'context' or 'describe'. ") @@ -100,18 +101,21 @@ extension World { currentExampleGroup.appendExample(example) } + @nonobjc internal func fit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { var focusedFlags = flags focusedFlags[Filter.focused] = true self.it(description, flags: focusedFlags, file: file, line: line, closure: closure) } + @nonobjc internal func xit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { var pendingFlags = flags pendingFlags[Filter.pending] = true self.it(description, flags: pendingFlags, file: file, line: line, closure: closure) } + @nonobjc internal func itBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { guard currentExampleMetadata == nil else { raiseError("'itBehavesLike' cannot be used inside '\(currentPhase)', 'itBehavesLike' may only be used inside 'context' or 'describe'. ") @@ -131,6 +135,7 @@ extension World { } } + @nonobjc internal func fitBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { var focusedFlags = flags focusedFlags[Filter.focused] = true @@ -169,22 +174,22 @@ extension World { #if (os(macOS) || os(iOS) || os(tvOS) || os(watchOS)) && !SWIFT_PACKAGE @objc(itWithDescription:flags:file:line:closure:) - private func objc_it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { + internal func objc_it(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { it(description, flags: flags, file: file, line: line, closure: closure) } @objc(fitWithDescription:flags:file:line:closure:) - private func objc_fit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { + internal func objc_fit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { fit(description, flags: flags, file: file, line: line, closure: closure) } @objc(xitWithDescription:flags:file:line:closure:) - private func objc_xit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { + internal func objc_xit(_ description: String, flags: FilterFlags, file: String, line: UInt, closure: @escaping () -> Void) { xit(description, flags: flags, file: file, line: line, closure: closure) } @objc(itBehavesLikeSharedExampleNamed:sharedExampleContext:flags:file:line:) - private func objc_itBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { + internal func objc_itBehavesLike(_ name: String, sharedExampleContext: @escaping SharedExampleContext, flags: FilterFlags, file: String, line: UInt) { itBehavesLike(name, sharedExampleContext: sharedExampleContext, flags: flags, file: file, line: line) } #endif diff --git a/Example/Pods/Quick/Sources/Quick/Example.swift b/Example/Pods/Quick/Sources/Quick/Example.swift index c15b31a..cf7b4a3 100644 --- a/Example/Pods/Quick/Sources/Quick/Example.swift +++ b/Example/Pods/Quick/Sources/Quick/Example.swift @@ -81,6 +81,9 @@ final public class Example: _ExampleBase { let exampleMetadata = ExampleMetadata(example: self, exampleIndex: numberOfExamplesRun) world.currentExampleMetadata = exampleMetadata + defer { + world.currentExampleMetadata = nil + } world.exampleHooks.executeBefores(exampleMetadata) group!.phase = .beforesExecuting diff --git a/Example/Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift b/Example/Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift index ef73762..8d67d8d 100644 --- a/Example/Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift +++ b/Example/Pods/Quick/Sources/Quick/NSString+C99ExtendedIdentifier.swift @@ -1,8 +1,7 @@ #if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) import Foundation -public extension NSString { - +extension NSString { private static var invalidCharacters: CharacterSet = { var invalidCharacters = CharacterSet() @@ -22,12 +21,29 @@ public extension NSString { return invalidCharacters }() + /// This API is not meant to be used outside Quick, so will be unavaialbe in + /// a next major version. @objc(qck_c99ExtendedIdentifier) - var c99ExtendedIdentifier: String { + public var c99ExtendedIdentifier: String { let validComponents = components(separatedBy: NSString.invalidCharacters) let result = validComponents.joined(separator: "_") return result.isEmpty ? "_" : result } } + +/// Extension methods or properties for NSObject subclasses are invisible from +/// the Objective-C runtime on static linking unless the consumers add `-ObjC` +/// linker flag, so let's make a wrapper class to mitigate that situation. +/// +/// See: https://github.com/Quick/Quick/issues/785 and https://github.com/Quick/Quick/pull/803 +@objc +class QCKObjCStringUtils: NSObject { + override private init() {} + + @objc + static func c99ExtendedIdentifier(from string: String) -> String { + return string.c99ExtendedIdentifier + } +} #endif diff --git a/Example/Pods/Quick/Sources/Quick/World.swift b/Example/Pods/Quick/Sources/Quick/World.swift index 127239a..59ea7e6 100644 --- a/Example/Pods/Quick/Sources/Quick/World.swift +++ b/Example/Pods/Quick/Sources/Quick/World.swift @@ -160,7 +160,7 @@ final internal class World: _WorldBase { #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) @objc(examplesForSpecClass:) - private func objc_examples(_ specClass: AnyClass) -> [Example] { + internal func objc_examples(_ specClass: AnyClass) -> [Example] { return examples(specClass) } #endif diff --git a/Example/Pods/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m b/Example/Pods/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m index 937b818..17beaa7 100644 --- a/Example/Pods/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m +++ b/Example/Pods/Quick/Sources/QuickObjectiveC/Configuration/QuickConfiguration.m @@ -1,7 +1,12 @@ #import "QuickConfiguration.h" -#import "World.h" #import +#if __has_include("Quick-Swift.h") +#import "Quick-Swift.h" +#else +#import +#endif + typedef void (^QCKClassEnumerationBlock)(Class klass); /** diff --git a/Example/Pods/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m b/Example/Pods/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m index 10e8a3d..624832e 100644 --- a/Example/Pods/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m +++ b/Example/Pods/Quick/Sources/QuickObjectiveC/DSL/QCKDSL.m @@ -1,6 +1,10 @@ #import "QCKDSL.h" -#import "World.h" -#import "World+DSL.h" + +#if __has_include("Quick-Swift.h") +#import "Quick-Swift.h" +#else +#import +#endif void qck_beforeSuite(QCKDSLEmptyBlock closure) { [[World sharedWorld] beforeSuite:closure]; diff --git a/Example/Pods/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h b/Example/Pods/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h deleted file mode 100644 index a3b8524..0000000 --- a/Example/Pods/Quick/Sources/QuickObjectiveC/DSL/World+DSL.h +++ /dev/null @@ -1,20 +0,0 @@ -#import - -@interface World (SWIFT_EXTENSION(Quick)) -- (void)beforeSuite:(void (^ __nonnull)(void))closure; -- (void)afterSuite:(void (^ __nonnull)(void))closure; -- (void)sharedExamples:(NSString * __nonnull)name closure:(void (^ __nonnull)(NSDictionary * __nonnull (^ __nonnull)(void)))closure; -- (void)describe:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)context:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)fdescribe:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)xdescribe:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags closure:(void (^ __nonnull)(void))closure; -- (void)beforeEach:(void (^ __nonnull)(void))closure; -- (void)beforeEachWithMetadata:(void (^ __nonnull)(ExampleMetadata * __nonnull))closure; -- (void)afterEach:(void (^ __nonnull)(void))closure; -- (void)afterEachWithMetadata:(void (^ __nonnull)(ExampleMetadata * __nonnull))closure; -- (void)itWithDescription:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line closure:(void (^ __nonnull)(void))closure; -- (void)fitWithDescription:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line closure:(void (^ __nonnull)(void))closure; -- (void)xitWithDescription:(NSString * __nonnull)description flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line closure:(void (^ __nonnull)(void))closure; -- (void)itBehavesLikeSharedExampleNamed:(NSString * __nonnull)name sharedExampleContext:(NSDictionary * __nonnull (^ __nonnull)(void))sharedExampleContext flags:(NSDictionary * __nonnull)flags file:(NSString * __nonnull)file line:(NSUInteger)line; -- (void)pending:(NSString * __nonnull)description closure:(void (^ __nonnull)(void))closure; -@end diff --git a/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.h b/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.h index 105a97e..21bc772 100644 --- a/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.h +++ b/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.h @@ -47,4 +47,10 @@ */ - (void)spec; +/** + Returns the currently executing spec. Use in specs that require XCTestCase + methds, e.g. expectationWithDescription. +*/ +@property (class, nonatomic, readonly) QuickSpec *current; + @end diff --git a/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m b/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m index 4891679..ed70d35 100644 --- a/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m +++ b/Example/Pods/Quick/Sources/QuickObjectiveC/QuickSpec.m @@ -1,7 +1,11 @@ #import "QuickSpec.h" #import "QuickConfiguration.h" -#import "World.h" + +#if __has_include("Quick-Swift.h") +#import "Quick-Swift.h" +#else #import +#endif static QuickSpec *currentSpec = nil; @@ -75,6 +79,10 @@ + (NSArray *)testInvocations { - (void)spec { } ++ (QuickSpec*) current { + return currentSpec; +} + #pragma mark - Internal Methods /** @@ -101,8 +109,8 @@ + (SEL)addInstanceMethodForExample:(Example *)example classSelectorNames:(NSMuta }); const char *types = [[NSString stringWithFormat:@"%s%s%s", @encode(void), @encode(id), @encode(SEL)] UTF8String]; - - NSString *originalName = example.name.qck_c99ExtendedIdentifier; + + NSString *originalName = [QCKObjCStringUtils c99ExtendedIdentifierFrom:example.name]; NSString *selectorName = originalName; NSUInteger i = 2; diff --git a/Example/Pods/Quick/Sources/QuickObjectiveC/World.h b/Example/Pods/Quick/Sources/QuickObjectiveC/World.h deleted file mode 100644 index e638cf6..0000000 --- a/Example/Pods/Quick/Sources/QuickObjectiveC/World.h +++ /dev/null @@ -1,18 +0,0 @@ -#import - -@class ExampleGroup; -@class ExampleMetadata; - -SWIFT_CLASS("_TtC5Quick5World") -@interface World - -@property (nonatomic) ExampleGroup * __nullable currentExampleGroup; -@property (nonatomic) ExampleMetadata * __nullable currentExampleMetadata; -@property (nonatomic) BOOL isRunningAdditionalSuites; -+ (World * __nonnull)sharedWorld; -- (void)configure:(void (^ __nonnull)(Configuration * __nonnull))closure; -- (void)finalizeConfiguration; -- (ExampleGroup * __nonnull)rootExampleGroupForSpecClass:(Class __nonnull)cls; -- (NSArray * __nonnull)examplesForSpecClass:(Class __nonnull)specClass; -- (void)performWithCurrentExampleGroup:(ExampleGroup * __nonnull)group closure:(void (^ __nonnull)(void))closure; -@end diff --git a/Example/Pods/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m b/Example/Pods/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m index e49939e..ae63036 100644 --- a/Example/Pods/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m +++ b/Example/Pods/Quick/Sources/QuickObjectiveC/XCTestSuite+QuickTestSuiteBuilder.m @@ -1,6 +1,11 @@ #import #import + +#if __has_include("Quick-Swift.h") +#import "Quick-Swift.h" +#else #import +#endif @interface XCTestSuite (QuickTestSuiteBuilder) @end diff --git a/Example/Pods/Target Support Files/Jelly/Info.plist b/Example/Pods/Target Support Files/Jelly/Info.plist index 2e6c90d..b27458d 100644 --- a/Example/Pods/Target Support Files/Jelly/Info.plist +++ b/Example/Pods/Target Support Files/Jelly/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.2.4 + 1.2.5 CFBundleSignature ???? CFBundleVersion diff --git a/Example/Pods/Target Support Files/Nimble/Info.plist b/Example/Pods/Target Support Files/Nimble/Info.plist index c01bd4c..6971fd4 100644 --- a/Example/Pods/Target Support Files/Nimble/Info.plist +++ b/Example/Pods/Target Support Files/Nimble/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 7.0.2 + 7.3.1 CFBundleSignature ???? CFBundleVersion diff --git a/Example/Pods/Target Support Files/Nimble/Nimble-umbrella.h b/Example/Pods/Target Support Files/Nimble/Nimble-umbrella.h index 9aac00a..3a2c2c8 100644 --- a/Example/Pods/Target Support Files/Nimble/Nimble-umbrella.h +++ b/Example/Pods/Target Support Files/Nimble/Nimble-umbrella.h @@ -10,14 +10,14 @@ #endif #endif -#import "CwlCatchException.h" -#import "CwlMachBadInstructionHandler.h" -#import "mach_excServer.h" -#import "CwlPreconditionTesting.h" #import "Nimble.h" #import "DSL.h" #import "NMBExceptionCapture.h" #import "NMBStringify.h" +#import "CwlCatchException.h" +#import "CwlMachBadInstructionHandler.h" +#import "mach_excServer.h" +#import "CwlPreconditionTesting.h" FOUNDATION_EXPORT double NimbleVersionNumber; FOUNDATION_EXPORT const unsigned char NimbleVersionString[]; diff --git a/Example/Pods/Target Support Files/Nimble/Nimble.xcconfig b/Example/Pods/Target Support Files/Nimble/Nimble.xcconfig index 3eb970f..f5eec0e 100644 --- a/Example/Pods/Target Support Files/Nimble/Nimble.xcconfig +++ b/Example/Pods/Target Support Files/Nimble/Nimble.xcconfig @@ -1,9 +1,10 @@ +APPLICATION_EXTENSION_API_ONLY = YES CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Nimble ENABLE_BITCODE = NO FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" -OTHER_LDFLAGS = -weak-lswiftXCTest -weak_framework "XCTest" +OTHER_LDFLAGS = $(inherited) -Xlinker -no_application_extension -weak-lswiftXCTest -weak_framework "XCTest" OTHER_SWIFT_FLAGS = $(inherited) -suppress-warnings $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example-acknowledgements.markdown index 0c107ef..c9a0390 100644 --- a/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example-acknowledgements.markdown +++ b/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example-acknowledgements.markdown @@ -23,4 +23,27 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## TouchVisualizer + +Copyright (c) 2015 Naoki Morita + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example-acknowledgements.plist index 2088f05..4007be0 100644 --- a/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example-acknowledgements.plist +++ b/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example-acknowledgements.plist @@ -41,6 +41,35 @@ THE SOFTWARE. Type PSGroupSpecifier + + FooterText + Copyright (c) 2015 Naoki Morita <namorit@gmail.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + License + MIT + Title + TouchVisualizer + Type + PSGroupSpecifier + FooterText Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example-frameworks.sh b/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example-frameworks.sh index 7ab53da..691d26b 100755 --- a/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example-frameworks.sh +++ b/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example-frameworks.sh @@ -135,9 +135,11 @@ strip_invalid_archs() { if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/Jelly/Jelly.framework" + install_framework "${BUILT_PRODUCTS_DIR}/TouchVisualizer/TouchVisualizer.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/Jelly/Jelly.framework" + install_framework "${BUILT_PRODUCTS_DIR}/TouchVisualizer/TouchVisualizer.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then wait diff --git a/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example.debug.xcconfig b/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example.debug.xcconfig index c68f2c6..28e47b2 100644 --- a/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example.debug.xcconfig +++ b/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example.debug.xcconfig @@ -1,9 +1,9 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Jelly" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Jelly" "${PODS_CONFIGURATION_BUILD_DIR}/TouchVisualizer" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Jelly/Jelly.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Jelly" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Jelly/Jelly.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/TouchVisualizer/TouchVisualizer.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Jelly" -framework "TouchVisualizer" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example.release.xcconfig b/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example.release.xcconfig index c68f2c6..28e47b2 100644 --- a/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example.release.xcconfig +++ b/Example/Pods/Target Support Files/Pods-Jelly_Example/Pods-Jelly_Example.release.xcconfig @@ -1,9 +1,9 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Jelly" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Jelly" "${PODS_CONFIGURATION_BUILD_DIR}/TouchVisualizer" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Jelly/Jelly.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "Jelly" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Jelly/Jelly.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/TouchVisualizer/TouchVisualizer.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "Jelly" -framework "TouchVisualizer" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Example/Pods/Target Support Files/Pods-Jelly_Tests/Pods-Jelly_Tests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-Jelly_Tests/Pods-Jelly_Tests.debug.xcconfig index 2253772..157ae14 100644 --- a/Example/Pods/Target Support Files/Pods-Jelly_Tests/Pods-Jelly_Tests.debug.xcconfig +++ b/Example/Pods/Target Support Files/Pods-Jelly_Tests/Pods-Jelly_Tests.debug.xcconfig @@ -1,8 +1,8 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PLATFORM_DIR)/Developer/Library/Frameworks "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" "${PODS_CONFIGURATION_BUILD_DIR}/Quick" "${PODS_CONFIGURATION_BUILD_DIR}/Jelly" +FRAMEWORK_SEARCH_PATHS = $(inherited) $(PLATFORM_DIR)/Developer/Library/Frameworks "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" "${PODS_CONFIGURATION_BUILD_DIR}/Quick" "${PODS_CONFIGURATION_BUILD_DIR}/Jelly" "${PODS_CONFIGURATION_BUILD_DIR}/TouchVisualizer" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Jelly/Jelly.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Jelly/Jelly.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/TouchVisualizer/TouchVisualizer.framework/Headers" OTHER_LDFLAGS = $(inherited) -framework "Nimble" -framework "Quick" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = ${BUILD_DIR} diff --git a/Example/Pods/Target Support Files/Pods-Jelly_Tests/Pods-Jelly_Tests.release.xcconfig b/Example/Pods/Target Support Files/Pods-Jelly_Tests/Pods-Jelly_Tests.release.xcconfig index 2253772..157ae14 100644 --- a/Example/Pods/Target Support Files/Pods-Jelly_Tests/Pods-Jelly_Tests.release.xcconfig +++ b/Example/Pods/Target Support Files/Pods-Jelly_Tests/Pods-Jelly_Tests.release.xcconfig @@ -1,8 +1,8 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PLATFORM_DIR)/Developer/Library/Frameworks "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" "${PODS_CONFIGURATION_BUILD_DIR}/Quick" "${PODS_CONFIGURATION_BUILD_DIR}/Jelly" +FRAMEWORK_SEARCH_PATHS = $(inherited) $(PLATFORM_DIR)/Developer/Library/Frameworks "${PODS_CONFIGURATION_BUILD_DIR}/Nimble" "${PODS_CONFIGURATION_BUILD_DIR}/Quick" "${PODS_CONFIGURATION_BUILD_DIR}/Jelly" "${PODS_CONFIGURATION_BUILD_DIR}/TouchVisualizer" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Jelly/Jelly.framework/Headers" +OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Nimble/Nimble.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Quick/Quick.framework/Headers" $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/Jelly/Jelly.framework/Headers" -iquote "${PODS_CONFIGURATION_BUILD_DIR}/TouchVisualizer/TouchVisualizer.framework/Headers" OTHER_LDFLAGS = $(inherited) -framework "Nimble" -framework "Quick" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = ${BUILD_DIR} diff --git a/Example/Pods/Target Support Files/Quick/Info.plist b/Example/Pods/Target Support Files/Quick/Info.plist index 2a9158a..6c1d64f 100644 --- a/Example/Pods/Target Support Files/Quick/Info.plist +++ b/Example/Pods/Target Support Files/Quick/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.2.0 + 1.3.2 CFBundleSignature ???? CFBundleVersion diff --git a/Example/Pods/Target Support Files/Quick/Quick.xcconfig b/Example/Pods/Target Support Files/Quick/Quick.xcconfig index 6c4e8fd..e5126ac 100644 --- a/Example/Pods/Target Support Files/Quick/Quick.xcconfig +++ b/Example/Pods/Target Support Files/Quick/Quick.xcconfig @@ -1,9 +1,10 @@ +APPLICATION_EXTENSION_API_ONLY = YES CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Quick ENABLE_BITCODE = NO FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" -OTHER_LDFLAGS = -framework "XCTest" +OTHER_LDFLAGS = $(inherited) -Xlinker -no_application_extension -framework "XCTest" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Example/Pods/Target Support Files/TouchVisualizer/Info.plist b/Example/Pods/Target Support Files/TouchVisualizer/Info.plist new file mode 100644 index 0000000..90db36a --- /dev/null +++ b/Example/Pods/Target Support Files/TouchVisualizer/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 3.1.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/TouchVisualizer/TouchVisualizer-dummy.m b/Example/Pods/Target Support Files/TouchVisualizer/TouchVisualizer-dummy.m new file mode 100644 index 0000000..c15d27c --- /dev/null +++ b/Example/Pods/Target Support Files/TouchVisualizer/TouchVisualizer-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_TouchVisualizer : NSObject +@end +@implementation PodsDummy_TouchVisualizer +@end diff --git a/Example/Pods/Target Support Files/TouchVisualizer/TouchVisualizer-prefix.pch b/Example/Pods/Target Support Files/TouchVisualizer/TouchVisualizer-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Example/Pods/Target Support Files/TouchVisualizer/TouchVisualizer-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Example/Pods/Target Support Files/TouchVisualizer/TouchVisualizer-umbrella.h b/Example/Pods/Target Support Files/TouchVisualizer/TouchVisualizer-umbrella.h new file mode 100644 index 0000000..97fa588 --- /dev/null +++ b/Example/Pods/Target Support Files/TouchVisualizer/TouchVisualizer-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double TouchVisualizerVersionNumber; +FOUNDATION_EXPORT const unsigned char TouchVisualizerVersionString[]; + diff --git a/Example/Pods/Target Support Files/TouchVisualizer/TouchVisualizer.modulemap b/Example/Pods/Target Support Files/TouchVisualizer/TouchVisualizer.modulemap new file mode 100644 index 0000000..18471fa --- /dev/null +++ b/Example/Pods/Target Support Files/TouchVisualizer/TouchVisualizer.modulemap @@ -0,0 +1,6 @@ +framework module TouchVisualizer { + umbrella header "TouchVisualizer-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/TouchVisualizer/TouchVisualizer.xcconfig b/Example/Pods/Target Support Files/TouchVisualizer/TouchVisualizer.xcconfig new file mode 100644 index 0000000..a9e5d7c --- /dev/null +++ b/Example/Pods/Target Support Files/TouchVisualizer/TouchVisualizer.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/TouchVisualizer +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/TouchVisualizer +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Example/Pods/TouchVisualizer/LICENSE b/Example/Pods/TouchVisualizer/LICENSE new file mode 100644 index 0000000..f9d844b --- /dev/null +++ b/Example/Pods/TouchVisualizer/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015 Naoki Morita + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Example/Pods/TouchVisualizer/README.md b/Example/Pods/TouchVisualizer/README.md new file mode 100644 index 0000000..c216d5f --- /dev/null +++ b/Example/Pods/TouchVisualizer/README.md @@ -0,0 +1,149 @@ +# ![TouchVisualizer](misc/logo2.png) + +[![Version](https://img.shields.io/cocoapods/v/TouchVisualizer.svg?style=flat)](http://cocoadocs.org/docsets/TouchVisualizer) [![License](https://img.shields.io/cocoapods/l/TouchVisualizer.svg?style=flat)](http://cocoadocs.org/docsets/TouchVisualizer) [![Platform](https://img.shields.io/cocoapods/p/TouchVisualizer.svg?style=flat)](http://cocoadocs.org/docsets/TouchVisualizer) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/morizotter/TouchVisualizer) +[![Circle CI](https://circleci.com/gh/morizotter/TouchVisualizer/tree/master.svg?style=shield&circle-token=b7eb2e179731634bcac95d1e4f8e90b837b092e3)](https://circleci.com/gh/morizotter/TouchVisualizer/tree/master) [![Join the chat at https://gitter.im/morizotter/TouchVisualizer](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/morizotter/TouchVisualizer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + +TouchVisualizer is a lightweight pure Swift implementation for visualising touches on the screen. + +## Features +- Works with just **a single line of code**! +- Supports multiple fingers. +- Supports multiple `UIWindow`'s. +- Displays touch radius (finger size). +- Displays touch duration. +- Customise the finger-points image and colour. +- Supports iPhone and iPad in both portrait and landscape mode. + +## How it looks +### Portrait: +![one](misc/one.gif) +### Landscape: +![two](misc/two.gif) +### Robots: +![three](misc/three.gif) +### In-app implementation: +![four](misc/four.gif) + +It's fun! + +## Runtime Requirements + +- Swift 4.0 +- Xcode 9.2 +- iOS9.0 or later + +TouchVisualizer works with Swift 3 from version 3.0.0. + +## Installation and Setup +**Note:** Embedded frameworks require a minimum deployment target of iOS 9.0. + +**Information:** To use TouchVisualizer with a project targeting iOS 8.0 or lower, you must include the `TouchVisualizer.swift` source file directly in your project. + +### Installing with CocoaPods + +[CocoaPods](http://cocoapods.org) is a centralised dependency manager that automates the process of adding libraries to your Cocoa application. You can install it with the following command: + +```bash +$ gem update +$ gem install cocoapods +$ pods --version +``` + +To integrate TouchVisualizer into your Xcode project using CocoaPods, specify it in your `Podfile` and run `pod install`. + +```bash +platform :ios, '8.0' +use_frameworks! +pod "TouchVisualizer", '~>3.0.0' +``` + +### Installing with Carthage +Carthage is a decentralised dependency manager that automates the process of adding frameworks to your Cocoa application. + +You can install Carthage with [Homebrew](http://brew.sh/) using the following command: + +```bash +$ brew update +$ brew install carthage +``` + +To integrate TouchVisualizer into your Xcode project using Carthage, specify it in your `Cartfile`: + +```ogdl +github "morizotter/TouchVisualizer" "3.0.0" +``` + +### Manual Installation + +To install TouchVisualizer without a dependency manager, please add all of the files in `/Pod` to your Xcode Project. + +## Usage + +To start using TouchVisualizer, write the following line wherever you want to start visualising: + +```swift +import TouchVisualizer +``` + +Then invoke visualisation, by calling: + +```swift +Visualizer.start() +``` + +and stop the presentation like this: + +```swift +Visualizer.stop() +``` +Get touch locations by this: + +```swift +Visualizer.getTouches() +``` + +It is really simple, isn't it? + +## Customisation + +TouchVisualizer also has the ability to customize your touch events. Here is an example of what can be customized: + +```swift +var config = Configuration() +config.color = UIColor.redColor() +config.image = UIImage(named: "YOUR-IMAGE") +config.showsTimer = true +config.showsTouchRadius = true +config.showsLog = true +Visualizer.start(config) +``` + +### Configuration properties + +|name|type|description|default| +|:----|:----|:----|:----| +| color | `UIColor` | Color of touch point and text. | default color | +| image | `UIImage` | Touch point image. If rendering mode is set to `UIImageRenderingModeAlwaysTemplate`, the image is filled with color above. | circle image | +| defaultSize| `CGSize` | Default size of touch point.| 60 x 60px | +| showsTimer| `Bool` | Shows touch duration. | false | +| showsTouchRadius | `Bool` | Shows touch radius by scaling touch point. It doesn't work on simulator. | false | +| showsLog | `Bool` | Shows log. | false | + +## Documentation +### Peripheral + +- [How to take an iOS screen movie](misc/take_a_movie.md) + +### Presentation + +- [TouchVisualizer Demo movie #potatotips // Speaker Deck](https://speakerdeck.com/morizotter/touchvisualizer-demo-movie-number-potatotips) @potatotips May 13 2015 + +## Contributing + +Please file issues or submit pull requests for anything you’d like to see! We're waiting! :) + +## Licensing +TouchVisualizer is released under the MIT license. Go read the LICENSE file for more information. +#### Miscellaneous +There is a similar *touch visualization* library called [COSTouchVisualizer](https://github.com/conopsys/COSTouchVisualizer), which is written in Objective-C. [COSTouchVisualizer](https://github.com/conopsys/COSTouchVisualizer) supports earlier versions of iOS and is more mature. If TouchVisualizer isn't enough for you, try that! diff --git a/Example/Pods/TouchVisualizer/TouchVisualizer/Configuration.swift b/Example/Pods/TouchVisualizer/TouchVisualizer/Configuration.swift new file mode 100644 index 0000000..d33df54 --- /dev/null +++ b/Example/Pods/TouchVisualizer/TouchVisualizer/Configuration.swift @@ -0,0 +1,54 @@ +// +// Configuration.swift +// TouchVisualizer +// + +import UIKit + +public struct Configuration { + private struct Constants { + static let defaultColor = UIColor(red: 52.0/255.0, green: 152.0/255.0, blue: 219.0/255.0, alpha: 0.8) + } + + /** + Color of touch points + */ + public var color: UIColor? = Constants.defaultColor + + // Image of touch points + public var image: UIImage? = { + let rect = CGRect(x: 0.0, y: 0.0, width: 60.0, height: 60.0) + + UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) + let contextRef = UIGraphicsGetCurrentContext() + contextRef?.setFillColor(Constants.defaultColor.cgColor) + contextRef?.fillEllipse(in: rect) + var image = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + + return image?.withRenderingMode(.alwaysTemplate) + }() + + /** + Default touch point size. If `showsTouchRadius` is enabled, this value is ignored + */ + public var defaultSize = CGSize(width: 60.0, height: 60.0) + + /** + Shows touch duration. + */ + public var showsTimer = false + + /** + Shows touch radius. It doesn't work on simulator because it is not + possible to read touch radius on it. Please test it on device + */ + public var showsTouchRadius = false + + /** + Shows log. This will affect performance. Make sure showing logs only in development environment + */ + public var showsLog = false + + public init(){} +} diff --git a/Example/Pods/TouchVisualizer/TouchVisualizer/TouchView.swift b/Example/Pods/TouchVisualizer/TouchVisualizer/TouchView.swift new file mode 100644 index 0000000..8b5f1c8 --- /dev/null +++ b/Example/Pods/TouchVisualizer/TouchVisualizer/TouchView.swift @@ -0,0 +1,113 @@ +// +// TouchView.swift +// TouchVisualizer +// + +import UIKit + +final public class TouchView: UIImageView { + + // MARK: - Public Variables + internal weak var touch: UITouch? + private weak var timer: Timer? + private var _config: Configuration + private var previousRatio: CGFloat = 1.0 + private var startDate: Date? + private var lastTimeString: String! + + public var config: Configuration { + get { return _config } + set (value) { + _config = value + image = self.config.image + tintColor = self.config.color + timerLabel.textColor = self.config.color + } + } + + lazy var timerLabel: UILabel = { + let size = CGSize(width: 200.0, height: 44.0) + let bottom: CGFloat = 8.0 + var label = UILabel() + + label.frame = CGRect(x: -(size.width - self.frame.width) / 2, + y: -size.height - bottom, + width: size.width, + height: size.height) + + label.font = UIFont(name: "Helvetica", size: 24.0) + label.textAlignment = .center + self.addSubview(label) + + return label + }() + + // MARK: - Object life cycle + convenience init() { + self.init(frame: .zero) + } + + override init(frame: CGRect) { + _config = Configuration() + super.init(frame: frame) + + self.frame = CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: _config.defaultSize) + } + + public required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + deinit { + timer?.invalidate() + } + + // MARK: - Begin and end touching functions + internal func beginTouch() { + alpha = 1.0 + timerLabel.alpha = 0.0 + layer.transform = CATransform3DIdentity + previousRatio = 1.0 + frame = CGRect(origin: frame.origin, size: _config.defaultSize) + startDate = Date() + timer = Timer.scheduledTimer(timeInterval: 1.0 / 60.0, target: self, selector: #selector(self.update(_:)), userInfo: nil, repeats: true) + + RunLoop + .main + .add(timer!, forMode: RunLoop.Mode.common) + + if _config.showsTimer { + timerLabel.alpha = 1.0 + } + + if _config.showsTouchRadius { + updateSize() + } + } + + func endTouch() { + timer?.invalidate() + } + + // MARK: - Update Functions + @objc internal func update(_ timer: Timer) { + guard let startDate = startDate else { return } + + let interval = Date().timeIntervalSince(startDate) + let timeString = String(format: "%.02f", Float(interval)) + timerLabel.text = timeString + + if _config.showsTouchRadius { + updateSize() + } + } + + internal func updateSize() { + guard let touch = touch else { return } + let ratio = touch.majorRadius * 2.0 / _config.defaultSize.width + if ratio != previousRatio { + layer.transform = CATransform3DMakeScale(ratio, ratio, 1.0) + previousRatio = ratio + } + } +} diff --git a/Example/Pods/TouchVisualizer/TouchVisualizer/UIWindow+Swizzle.swift b/Example/Pods/TouchVisualizer/TouchVisualizer/UIWindow+Swizzle.swift new file mode 100644 index 0000000..ac1be79 --- /dev/null +++ b/Example/Pods/TouchVisualizer/TouchVisualizer/UIWindow+Swizzle.swift @@ -0,0 +1,38 @@ +// +// UIWindow+Swizzle.swift +// TouchVisualizer +// + +import UIKit + +fileprivate var isSwizzled = false + +@available(iOS 8.0, *) +extension UIWindow { + + public func swizzle() { + guard isSwizzled == false else { + return + } + + let sendEvent = class_getInstanceMethod( + object_getClass(self), + #selector(UIApplication.sendEvent(_:)) + ) + let swizzledSendEvent = class_getInstanceMethod( + object_getClass(self), + #selector(UIWindow.swizzledSendEvent(_:)) + ) + method_exchangeImplementations(sendEvent!, swizzledSendEvent!) + + isSwizzled = true + } +} + +// MARK: - Swizzle +extension UIWindow { + @objc public func swizzledSendEvent(_ event: UIEvent) { + Visualizer.sharedInstance.handleEvent(event) + swizzledSendEvent(event) + } +} diff --git a/Example/Pods/TouchVisualizer/TouchVisualizer/Visualizer.swift b/Example/Pods/TouchVisualizer/TouchVisualizer/Visualizer.swift new file mode 100644 index 0000000..4e763e6 --- /dev/null +++ b/Example/Pods/TouchVisualizer/TouchVisualizer/Visualizer.swift @@ -0,0 +1,246 @@ +// +// TouchVisualizer.swift +// TouchVisualizer +// + +import UIKit + +final public class Visualizer:NSObject { + + // MARK: - Public Variables + static public let sharedInstance = Visualizer() + fileprivate var enabled = false + fileprivate var config: Configuration! + fileprivate var touchViews = [TouchView]() + fileprivate var previousLog = "" + + // MARK: - Object life cycle + private override init() { + super.init() + NotificationCenter + .default + .addObserver(self, selector: #selector(Visualizer.orientationDidChangeNotification(_:)), name: UIDevice.orientationDidChangeNotification, object: nil) + + NotificationCenter + .default + .addObserver(self, selector: #selector(Visualizer.applicationDidBecomeActiveNotification(_:)), name: UIApplication.didBecomeActiveNotification, object: nil) + + UIDevice + .current + .beginGeneratingDeviceOrientationNotifications() + + warnIfSimulator() + } + + deinit { + NotificationCenter + .default + .removeObserver(self) + } + + // MARK: - Helper Functions + @objc internal func applicationDidBecomeActiveNotification(_ notification: Notification) { + UIApplication.shared.keyWindow?.swizzle() + } + + @objc internal func orientationDidChangeNotification(_ notification: Notification) { + let instance = Visualizer.sharedInstance + for touch in instance.touchViews { + touch.removeFromSuperview() + } + } + + public func removeAllTouchViews() { + for view in self.touchViews { + view.removeFromSuperview() + } + } +} + +extension Visualizer { + public class func isEnabled() -> Bool { + return sharedInstance.enabled + } + + // MARK: - Start and Stop functions + + public class func start(_ config: Configuration = Configuration()) { + + if config.showsLog { + print("Visualizer start...") + } + let instance = sharedInstance + instance.enabled = true + instance.config = config + + if let window = UIApplication.shared.keyWindow { + for subview in window.subviews { + if let subview = subview as? TouchView { + subview.removeFromSuperview() + } + } + } + if config.showsLog { + print("started !") + } + } + + public class func stop() { + let instance = sharedInstance + instance.enabled = false + + for touch in instance.touchViews { + touch.removeFromSuperview() + } + } + + public class func getTouches() -> [UITouch] { + let instance = sharedInstance + var touches: [UITouch] = [] + for view in instance.touchViews { + guard let touch = view.touch else { continue } + touches.append(touch) + } + return touches + } + + // MARK: - Dequeue and locating TouchViews and handling events + private func dequeueTouchView() -> TouchView { + var touchView: TouchView? + for view in touchViews { + if view.superview == nil { + touchView = view + break + } + } + + if touchView == nil { + touchView = TouchView() + touchViews.append(touchView!) + } + + return touchView! + } + + private func findTouchView(_ touch: UITouch) -> TouchView? { + for view in touchViews { + if touch == view.touch { + return view + } + } + + return nil + } + + public func handleEvent(_ event: UIEvent) { + if event.type != .touches { + return + } + + if !Visualizer.sharedInstance.enabled { + return + } + + var topWindow = UIApplication.shared.keyWindow! + for window in UIApplication.shared.windows { + if window.isHidden == false && window.windowLevel > topWindow.windowLevel { + topWindow = window + } + } + + for touch in event.allTouches! { + let phase = touch.phase + switch phase { + case .began: + let view = dequeueTouchView() + view.config = Visualizer.sharedInstance.config + view.touch = touch + view.beginTouch() + view.center = touch.location(in: topWindow) + topWindow.addSubview(view) + log(touch) + case .moved: + if let view = findTouchView(touch) { + view.center = touch.location(in: topWindow) + } + + log(touch) + case .stationary: + log(touch) + case .ended, .cancelled: + if let view = findTouchView(touch) { + UIView.animate(withDuration: 0.2, delay: 0.0, options: .allowUserInteraction, animations: { () -> Void in + view.alpha = 0.0 + view.endTouch() + }, completion: { [unowned self] (finished) -> Void in + view.removeFromSuperview() + self.log(touch) + }) + } + + log(touch) + } + } + } +} + +extension Visualizer { + public func warnIfSimulator() { + #if targetEnvironment(simulator) + print("[TouchVisualizer] Warning: TouchRadius doesn't work on the simulator because it is not possible to read touch radius on it.", terminator: "") + #endif + } + + // MARK: - Logging + public func log(_ touch: UITouch) { + if !config.showsLog { + return + } + + var ti = 0 + var viewLogs = [[String:String]]() + for view in touchViews { + var index = "" + + index = "\(ti)" + ti += 1 + + var phase: String! + switch touch.phase { + case .began: phase = "B" + case .moved: phase = "M" + case .stationary: phase = "S" + case .ended: phase = "E" + case .cancelled: phase = "C" + } + + let x = String(format: "%.02f", view.center.x) + let y = String(format: "%.02f", view.center.y) + let center = "(\(x), \(y))" + let radius = String(format: "%.02f", touch.majorRadius) + viewLogs.append(["index": index, "center": center, "phase": phase, "radius": radius]) + } + + var log = "" + + for viewLog in viewLogs { + + if (viewLog["index"]!).count == 0 { + continue + } + + let index = viewLog["index"]! + let center = viewLog["center"]! + let phase = viewLog["phase"]! + let radius = viewLog["radius"]! + log += "Touch: [\(index)]<\(phase)> c:\(center) r:\(radius)\t\n" + } + + if log == previousLog { + return + } + + previousLog = log + print(log, terminator: "") + } +} diff --git a/Example/Tests/JellyAnimatorSpec.swift b/Example/Tests/JellyAnimatorSpec.swift index 1d0e121..a411ece 100644 --- a/Example/Tests/JellyAnimatorSpec.swift +++ b/Example/Tests/JellyAnimatorSpec.swift @@ -1,38 +1,37 @@ -// -// JellyAnimatorSpec.swift -// Jelly -// -// Created by Sebastian Boldt on 05.12.16. -// Copyright © 2016 CocoaPods. All rights reserved. -// - +@testable import Jelly import Quick import Nimble -@testable import Jelly class JellyAnimatorSpec: QuickSpec { - let presentedViewController = UIViewController() let presentingViewController = UIViewController() - let defaultSlideIn = JellySlideInPresentation() - let defaultFadeIn = JellyFadeInPresentation() override func spec() { describe("After Configuring a JellyAnimator") { + context("with cover presentation") { + it("UIViewControllerTransitioningDelegate should return right animationController for presenting") { + let coverPresentation = Jelly.CoverPresentation(directionShow: .left, directionDismiss: .left, interactionConfiguration: InteractionConfiguration(presentingViewController: self.presentingViewController, completionThreshold: 0.5, dragMode: .edge)) + let animator = Jelly.Animator(presentation: coverPresentation) + let animationController = animator.animationController(forPresented: self.presentedViewController, presenting: self.presentingViewController, source: self.presentedViewController) + expect(animationController is Jelly.CoverAnimator).to(equal(true)) + } + } - context("with slide in presentation") { + context("with fade presentation") { it("UIViewControllerTransitioningDelegate should return right animationController for presenting") { - let animator = JellyAnimator(presentation: self.defaultSlideIn) + let fadePresentation = Jelly.FadePresentation() + let animator = Jelly.Animator(presentation: fadePresentation) let animationController = animator.animationController(forPresented: self.presentedViewController, presenting: self.presentingViewController, source: self.presentedViewController) - expect(animationController is JellySlideInPresentationAnimator).to(equal(true)) + expect(animationController is Jelly.FadeAnimator).to(equal(true)) } } - context("with fade in presentation") { + context("with slide presentation") { it("UIViewControllerTransitioningDelegate should return right animationController for presenting") { - let animator = JellyAnimator(presentation: self.defaultFadeIn) + let slidePresentation = Jelly.SlidePresentation(interactionConfiguration: InteractionConfiguration(presentingViewController: self.presentingViewController, completionThreshold: 0.5, dragMode: .edge)) + let animator = Jelly.Animator(presentation: slidePresentation) let animationController = animator.animationController(forPresented: self.presentedViewController, presenting: self.presentingViewController, source: self.presentedViewController) - expect(animationController is JellyFadeInPresentationAnimator).to(equal(true)) + expect(animationController is Jelly.SlideAnimator).to(equal(true)) } } } diff --git a/Future-Features.md b/Future-Features.md new file mode 100644 index 0000000..1e9f750 --- /dev/null +++ b/Future-Features.md @@ -0,0 +1,2 @@ +1. Introducing Live Update on Slide Transitions - This is currently not possible because the presentation controller is not capable of resizing the presentingViewControllers frame on the containerView +2. Chaining of live updates diff --git a/Github/IMG_0240.TRIM.gif b/Github/IMG_0240.TRIM.gif new file mode 100644 index 0000000..b640cd4 Binary files /dev/null and b/Github/IMG_0240.TRIM.gif differ diff --git a/Github/IMG_0242.TRIM.gif b/Github/IMG_0242.TRIM.gif new file mode 100644 index 0000000..fb7172a Binary files /dev/null and b/Github/IMG_0242.TRIM.gif differ diff --git a/Github/IMG_0244.TRIM.gif b/Github/IMG_0244.TRIM.gif new file mode 100644 index 0000000..dbb91e1 Binary files /dev/null and b/Github/IMG_0244.TRIM.gif differ diff --git a/Github/IMG_0246.TRIM.gif b/Github/IMG_0246.TRIM.gif new file mode 100644 index 0000000..30ac1de Binary files /dev/null and b/Github/IMG_0246.TRIM.gif differ diff --git a/Github/IMG_0248.TRIM.gif b/Github/IMG_0248.TRIM.gif new file mode 100644 index 0000000..368363b Binary files /dev/null and b/Github/IMG_0248.TRIM.gif differ diff --git a/Github/IMG_0250.TRIM.gif b/Github/IMG_0250.TRIM.gif new file mode 100644 index 0000000..ac00164 Binary files /dev/null and b/Github/IMG_0250.TRIM.gif differ diff --git a/Github/IMG_0252.TRIM.gif b/Github/IMG_0252.TRIM.gif new file mode 100644 index 0000000..13c24d6 Binary files /dev/null and b/Github/IMG_0252.TRIM.gif differ diff --git a/Github/IMG_0254.TRIM.gif b/Github/IMG_0254.TRIM.gif new file mode 100644 index 0000000..9cfe3c7 Binary files /dev/null and b/Github/IMG_0254.TRIM.gif differ diff --git a/Github/Jellyfish.png b/Github/Jellyfish.png index 68d73d4..f8532b2 100644 Binary files a/Github/Jellyfish.png and b/Github/Jellyfish.png differ diff --git a/Github/author.png b/Github/author.png new file mode 100644 index 0000000..3263d25 Binary files /dev/null and b/Github/author.png differ diff --git a/Github/blurredslidein.gif b/Github/blurredslidein.gif deleted file mode 100644 index 841f2c5..0000000 Binary files a/Github/blurredslidein.gif and /dev/null differ diff --git a/Github/customization.png b/Github/customization.png new file mode 100644 index 0000000..0488368 Binary files /dev/null and b/Github/customization.png differ diff --git a/Github/emoji.png b/Github/emoji.png new file mode 100755 index 0000000..6cbd0fd Binary files /dev/null and b/Github/emoji.png differ diff --git a/Github/fadin.gif b/Github/fadin.gif deleted file mode 100644 index 3953d84..0000000 Binary files a/Github/fadin.gif and /dev/null differ diff --git a/Github/how to.png b/Github/how to.png new file mode 100644 index 0000000..038143d Binary files /dev/null and b/Github/how to.png differ diff --git a/Github/installation.png b/Github/installation.png new file mode 100644 index 0000000..55256e1 Binary files /dev/null and b/Github/installation.png differ diff --git a/Github/interactive-transitions.png b/Github/interactive-transitions.png new file mode 100644 index 0000000..9d631c0 Binary files /dev/null and b/Github/interactive-transitions.png differ diff --git a/Github/license.png b/Github/license.png new file mode 100644 index 0000000..ca009c8 Binary files /dev/null and b/Github/license.png differ diff --git a/Github/mentions.png b/Github/mentions.png new file mode 100644 index 0000000..61f907d Binary files /dev/null and b/Github/mentions.png differ diff --git a/Github/notification.gif b/Github/notification.gif deleted file mode 100644 index 12a9470..0000000 Binary files a/Github/notification.gif and /dev/null differ diff --git a/Github/requirements.png b/Github/requirements.png new file mode 100644 index 0000000..b0eec43 Binary files /dev/null and b/Github/requirements.png differ diff --git a/Github/shiftinblurred.gif b/Github/shiftinblurred.gif deleted file mode 100644 index 3f33b35..0000000 Binary files a/Github/shiftinblurred.gif and /dev/null differ diff --git a/Github/shiftindimmed.gif b/Github/shiftindimmed.gif deleted file mode 100644 index adc60c5..0000000 Binary files a/Github/shiftindimmed.gif and /dev/null differ diff --git a/Github/slideover.gif b/Github/slideover.gif deleted file mode 100644 index e1730e9..0000000 Binary files a/Github/slideover.gif and /dev/null differ diff --git a/Github/update.png b/Github/update.png new file mode 100644 index 0000000..4a988a3 Binary files /dev/null and b/Github/update.png differ diff --git a/Jelly.podspec b/Jelly.podspec index ae95112..49a33a7 100644 --- a/Jelly.podspec +++ b/Jelly.podspec @@ -6,7 +6,7 @@ Pod::Spec.new do |s| s.name = 'Jelly' - s.version = '1.2.5' + s.version = '2.0.0' s.summary = 'Jelly provides custom view controller animations with just a few lines of code' s.description = <<-DESC @@ -21,7 +21,7 @@ Pod::Spec.new do |s| s.source = { :git => 'https://github.com/SebastianBoldt/Jelly.git', :tag => s.version.to_s } s.social_media_url = 'https://twitter.com/sebastianboldt' - s.ios.deployment_target = '8.0' + s.ios.deployment_target = '11.0' s.source_files = 'Jelly/Classes/**/*' s.frameworks = 'UIKit' end diff --git a/Jelly/Classes/Jelly.swift b/Jelly/Classes/Jelly.swift deleted file mode 100644 index a122381..0000000 --- a/Jelly/Classes/Jelly.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// Jelly.swift -// Created by Sebastian Boldt on 18.11.16. - - -import Foundation - -public struct Jelly { - - public var damping: CGFloat - public var velocity: CGFloat - - init(damping: CGFloat = 1.0, velocity: CGFloat = 1.0) { - self.damping = damping - self.velocity = velocity - } -} diff --git a/Jelly/Classes/JellyAnimator.swift b/Jelly/Classes/JellyAnimator.swift deleted file mode 100644 index 8a7ab31..0000000 --- a/Jelly/Classes/JellyAnimator.swift +++ /dev/null @@ -1,76 +0,0 @@ -// JellyAnimator.swift -// Created by Sebastian Boldt on 17.11.16. - -import UIKit - -/// # JellyAnimator -/// A JellyAnimator is an UIViewControllerTransitionsDelegate with some extra candy. -/// Basically the JellyAnimator is the main class to use when working with Jelly. -/// You need to create a JellyAnimator and assign it as a transitionDelegate to your ViewController. -/// After you did this you need to set the presentation style to custom so the VC asks its custom delegate. -/// You can use the prepare function for that - -public class JellyAnimator : NSObject { - - fileprivate var presentation: JellyPresentation - - /// ## designated initializer - /// - Parameter presentation: a custom Presentation Object - public init(presentation: JellyPresentation) { - self.presentation = presentation - super.init() - } - - /// ## prepare - /// Call this function to prepare the viewController you want to present - /// - Parameter viewController: viewController that should be presented in a custom way - public func prepare(viewController: UIViewController) { - viewController.modalPresentationStyle = .custom - viewController.transitioningDelegate = self - } -} - -/// ## UIViewControllerTransitioningDelegate Implementation -/// The JellyAnimator needs to conform to the UIViewControllerTransitioningDelegate protocol -/// it will provide a custom Presentation-Controller that tells UIKit which extra Views the presentation should have -/// it also provides the size and frame for the controller that wants to be presented -extension JellyAnimator: UIViewControllerTransitioningDelegate { - - - /// Gets called from UIKit if presentatioStyle is custom and transitionDelegate is set - public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { - - let jellyPresentationController = JellyPresentationController(presentedViewController: presented, presentingViewController: presenting, presentation: presentation) - return jellyPresentationController - } - - /// Each Presentation has two directions - /// Inside a Presention Object you can specify some extra parameters - /// This Parameters will be passed to a custom animator that handles the presentation animation (duration, direction etc.) - public func animationController(forPresented presented: UIViewController, - presenting: UIViewController, - source: UIViewController) -> UIViewControllerAnimatedTransitioning? { - if let presentation = self.presentation as? JellySlideInPresentation { - return JellySlideInPresentationAnimator(direction: presentation.directionShow, presentationType: .show, presentation: presentation) - } else if let presentation = self.presentation as? JellyFadeInPresentation { - return JellyFadeInPresentationAnimator(presentationType: .show, presentation: presentation) - } else if let presentation = self.presentation as? JellyShiftInPresentation { - return JellyShiftInPresentationAnimator(direction: presentation.direction, presentationType: .show, presentation: presentation) - } else { - return nil - } - } - - public func animationController(forDismissed dismissed: UIViewController) - -> UIViewControllerAnimatedTransitioning? { - if let presentation = self.presentation as? JellySlideInPresentation { - return JellySlideInPresentationAnimator(direction: presentation.directionDismiss, presentationType: .dismiss, presentation: presentation) - } else if let presentation = self.presentation as? JellyFadeInPresentation { - return JellyFadeInPresentationAnimator(presentationType: .dismiss, presentation: presentation) - } else if let presentation = self.presentation as? JellyShiftInPresentation { - return JellyShiftInPresentationAnimator(direction: presentation.direction, presentationType: .dismiss, presentation: presentation) - } else { - return nil - } - } -} diff --git a/Jelly/Classes/JellyConstants.swift b/Jelly/Classes/JellyConstants.swift deleted file mode 100644 index b4109f7..0000000 --- a/Jelly/Classes/JellyConstants.swift +++ /dev/null @@ -1,122 +0,0 @@ -// -// JellyStyle.swift -// Created by Sebastian Boldt on 17.11.16. - -import Foundation - -/// Datamodel Types which will be used to create a JellyPresentationObject -public struct JellyConstants { - - public enum HorizontalAlignment { - case left - case right - case center - case custom(x: CGFloat) - } - - public enum VerticalAlignment { - case top - case bottom - case center - case custom(y: CGFloat) - } - - public enum Size { - case fullscreen - case halfscreen - case custom(value: CGFloat) - } - - public enum BackgroundStyle { - case dimmed(alpha: CGFloat) - case blur(effectStyle: UIBlurEffect.Style) - } - - /// Will the ViewController be shown or dismissed? - public enum PresentationType { - case show - case dismiss - } - - /// Direction the Viewcontroller should fly out or come in from - public enum Direction { - case top - case bottom - case left - case right - - public func orientation() -> Orientation { - switch self { - case .left, .right : - return .horizontal - case .top, .bottom : - return .vertical - } - } - } - - public enum Orientation { - case horizontal - case vertical - } - - public enum Jellyness { - case none - case jelly - case jellier - case jelliest - - func convertJellyness() -> Jelly { - - var damping = 1.0 - var velocity = 0 - - switch self { - case .none: - () - case .jelly: - damping = 0.7 - velocity = 2 - case .jellier: - damping = 0.5 - velocity = 3 - case .jelliest: - damping = 0.2 - velocity = 4 - } - - return Jelly(damping:CGFloat(damping),velocity:CGFloat(velocity)) - } - } - - public enum Duration : TimeInterval { - case ultraSlow = 2.0 - case slow = 1.0 - case medium = 0.5 - case normal = 0.35 - case fast = 0.2 - case reallyFast = 0.1 - } - - public enum JellyCurve { - - case easeInEaseOut - case easeIn - case easeOut - case linear - - public func getAnimationOptionForJellyCurve() -> UIView.AnimationOptions { - switch self { - case .easeInEaseOut: - return .curveEaseInOut - case .easeIn: - return .curveEaseIn - case .easeOut: - return .curveEaseOut - case .linear: - return .curveLinear - } - } - } - -} diff --git a/Jelly/Classes/JellyFadeInPresentation.swift b/Jelly/Classes/JellyFadeInPresentation.swift deleted file mode 100644 index 8742f3b..0000000 --- a/Jelly/Classes/JellyFadeInPresentation.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// JellyFadeInPresentation.swift -// Created by Sebastian Boldt on 20.11.16. -// - -import Foundation - -public struct JellyFadeInPresentation: JellyPresentation, AlignablePresentation, DynamicPresentation { - - // Jelly Presentation Protocol conformance - public var dismissCurve: JellyConstants.JellyCurve = .linear - public var presentationCurve: JellyConstants.JellyCurve = .linear - public var cornerRadius: Double = 0.0 - public var backgroundStyle: JellyConstants.BackgroundStyle = .dimmed(alpha: 0.5) - public var duration : JellyConstants.Duration = .normal // Duration the ViewController needs to kick in - public var widthForViewController: JellyConstants.Size = .halfscreen - public var heightForViewController: JellyConstants.Size = .halfscreen - public var marginGuards: UIEdgeInsets = .zero - public var isTapBackgroundToDismissEnabled: Bool = true - public var corners: UIRectCorner = [.topLeft, .topRight, .bottomLeft, .bottomRight] - - // Alginable - public var horizontalAlignment: JellyConstants.HorizontalAlignment = .center - public var verticalAlignemt: JellyConstants.VerticalAlignment = .center - - public init(dismissCurve: JellyConstants.JellyCurve = .linear, - presentationCurve: JellyConstants.JellyCurve = .linear, - cornerRadius: Double = 0.0, - backgroundStyle: JellyConstants.BackgroundStyle = .dimmed(alpha: 0.5), - duration: JellyConstants.Duration = .normal, - widthForViewController: JellyConstants.Size = .fullscreen, - heightForViewController: JellyConstants.Size = .fullscreen, - horizontalAlignment: JellyConstants.HorizontalAlignment = .center, - verticalAlignment: JellyConstants.VerticalAlignment = .center, - marginGuards: UIEdgeInsets = .zero, - corners: UIRectCorner = [.topLeft, .topRight, .bottomLeft, .bottomRight]) { - - self.dismissCurve = dismissCurve - self.presentationCurve = presentationCurve - self.cornerRadius = cornerRadius - self.backgroundStyle = backgroundStyle - self.duration = duration - self.widthForViewController = widthForViewController - self.heightForViewController = heightForViewController - self.horizontalAlignment = horizontalAlignment - self.verticalAlignemt = verticalAlignment - self.marginGuards = marginGuards - self.corners = corners - } - -} diff --git a/Jelly/Classes/JellyFadeInPresentationAnimator.swift b/Jelly/Classes/JellyFadeInPresentationAnimator.swift deleted file mode 100644 index c138c99..0000000 --- a/Jelly/Classes/JellyFadeInPresentationAnimator.swift +++ /dev/null @@ -1,57 +0,0 @@ -// -// SlideInPresentationAnimator.swift -// Created by Sebastian Boldt on 18.11.16. - -import Foundation - -final class JellyFadeInPresentationAnimator: NSObject { - - let presentationType : JellyConstants.PresentationType - let presentation : JellyFadeInPresentation - - init(presentationType: JellyConstants.PresentationType, presentation: JellyFadeInPresentation) { - self.presentationType = presentationType - self.presentation = presentation - super.init() - } - -} - -extension JellyFadeInPresentationAnimator : UIViewControllerAnimatedTransitioning { - func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { - return presentation.duration.rawValue - } - - func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { - - let key = getPresentedViewControllerKeyForPresentationType(type: self.presentationType) - let isPresentation = key == .to - let controllerToAnimate = transitionContext.viewController(forKey: key)! - - // If we animate to the ViewController we need to add the View to the ContainerView - if isPresentation { - transitionContext.containerView.addSubview(controllerToAnimate.view) - } - - let presentedFrame = transitionContext.finalFrame(for: controllerToAnimate) // Frame the ViewController - - let finalAlpha = isPresentation ? 1.0 : 0.0 - let initialAlpha = isPresentation ? 0.0 : 1.0 - - let animationDuration = transitionDuration(using: transitionContext) - controllerToAnimate.view.frame = presentedFrame - controllerToAnimate.view.alpha = CGFloat(initialAlpha) - - let animationCurve = isPresentation ? presentation.presentationCurve : presentation.dismissCurve - - UIView.animate(withDuration: animationDuration, - delay: 0.0, - options: animationCurve.getAnimationOptionForJellyCurve(), - animations: { - controllerToAnimate.view.alpha = CGFloat(finalAlpha) - }, completion:{ finished in - transitionContext.completeTransition(!transitionContext.transitionWasCancelled) - }) - - } -} diff --git a/Jelly/Classes/JellyPresentation.swift b/Jelly/Classes/JellyPresentation.swift deleted file mode 100644 index c3aec07..0000000 --- a/Jelly/Classes/JellyPresentation.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// JellyPresentation.swift -// Created by Sebastian Boldt on 17.11.16. -// - -import Foundation - -/// The JellyPresentation protocol defines which properties a basic presentation should provide -/// Maybe we could use a class hierarchy to abstract all the different types better than using protocols for that -public protocol JellyPresentation { - var duration: JellyConstants.Duration { get set } - var cornerRadius: Double { get set } - var presentationCurve : JellyConstants.JellyCurve { get set } - var dismissCurve : JellyConstants.JellyCurve { get set } - var backgroundStyle : JellyConstants.BackgroundStyle { get set } - var isTapBackgroundToDismissEnabled : Bool { get set } - var corners: UIRectCorner { get set } -} - -/// If a presentation is Alginable it provides vertical and horizontal alignment options -public protocol AlignablePresentation { - var verticalAlignemt : JellyConstants.VerticalAlignment { get set } - var horizontalAlignment : JellyConstants.HorizontalAlignment { get set } -} - -public protocol DynamicPresentation { - var widthForViewController: JellyConstants.Size { get set } - var heightForViewController: JellyConstants.Size { get set } - /// If the width or height is bigger than the container we are working in, marginGuards will kick in and limit the size the specified margins - var marginGuards: UIEdgeInsets { get set } -} - -public enum PresentationType { - case fade - case shift - case slide -} diff --git a/Jelly/Classes/JellyShiftInPresentation.swift b/Jelly/Classes/JellyShiftInPresentation.swift deleted file mode 100644 index e2244a9..0000000 --- a/Jelly/Classes/JellyShiftInPresentation.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// JellyShiftInPresentation.swift -// Pods -// -// Created by Sebastian Boldt on 11.12.16. -// -// - -import Foundation - -public struct JellyShiftInPresentation: JellyPresentation { - public var dismissCurve: JellyConstants.JellyCurve = .linear - public var presentationCurve: JellyConstants.JellyCurve = .linear - public var cornerRadius: Double = 0.0 - public var backgroundStyle: JellyConstants.BackgroundStyle = .dimmed(alpha:0.5) - public var jellyness: JellyConstants.Jellyness = .none - public var duration : JellyConstants.Duration = .medium // Duration the ViewController needs to kick in - public var isTapBackgroundToDismissEnabled: Bool = true - public var direction : JellyConstants.Direction = .bottom - public var size: JellyConstants.Size = .halfscreen - public var corners: UIRectCorner = [.topLeft, .topRight, .bottomLeft, .bottomRight] - - public init(dismissCurve: JellyConstants.JellyCurve = .linear, - presentationCurve: JellyConstants.JellyCurve = .linear, - cornerRadius: Double = 0.0, - backgroundStyle: JellyConstants.BackgroundStyle = .dimmed(alpha: 0.5), - jellyness: JellyConstants.Jellyness = .none, - duration: JellyConstants.Duration = .normal, - direction: JellyConstants.Direction = .bottom, - size: JellyConstants.Size = .halfscreen, - corners: UIRectCorner = [.topLeft, .topRight, .bottomLeft, .bottomRight]) { - - self.dismissCurve = dismissCurve - self.presentationCurve = presentationCurve - self.cornerRadius = cornerRadius - self.backgroundStyle = backgroundStyle - self.jellyness = jellyness - self.duration = duration - self.direction = direction - self.size = size - self.corners = corners - } -} diff --git a/Jelly/Classes/JellySlideInPresentation.swift b/Jelly/Classes/JellySlideInPresentation.swift deleted file mode 100644 index 4514d9c..0000000 --- a/Jelly/Classes/JellySlideInPresentation.swift +++ /dev/null @@ -1,58 +0,0 @@ -// -// JellySlideInPresentation.swift -// Created by Sebastian Boldt on 20.11.16. -// - -public struct JellySlideInPresentation: JellyPresentation, AlignablePresentation, DynamicPresentation { - - // JellyPresentation Protocol conformance - public var dismissCurve: JellyConstants.JellyCurve = .linear - public var presentationCurve: JellyConstants.JellyCurve = .linear - public var cornerRadius: Double = 0.0 - public var backgroundStyle: JellyConstants.BackgroundStyle = .dimmed(alpha: 0.5) - public var jellyness: JellyConstants.Jellyness - public var duration : JellyConstants.Duration = .normal // Duration the ViewController needs to kick in - public var widthForViewController: JellyConstants.Size = .halfscreen - public var heightForViewController: JellyConstants.Size = .halfscreen - public var isTapBackgroundToDismissEnabled: Bool = true - public var marginGuards: UIEdgeInsets = .zero - public var corners: UIRectCorner = [.topLeft, .topRight, .bottomLeft, .bottomRight] - // Unique - public var directionShow: JellyConstants.Direction = .left // Direction the ViewController slides in from - public var directionDismiss: JellyConstants.Direction = .left // Direction the ViewController slides out to - - // Alginable - public var horizontalAlignment: JellyConstants.HorizontalAlignment = .center - public var verticalAlignemt: JellyConstants.VerticalAlignment = .center - - public init(dismissCurve: JellyConstants.JellyCurve = .linear, - presentationCurve: JellyConstants.JellyCurve = .linear, - cornerRadius: Double = 0.0, - backgroundStyle: JellyConstants.BackgroundStyle = .dimmed(alpha: 0.5), - jellyness: JellyConstants.Jellyness = .none, - duration: JellyConstants.Duration = .normal, - directionShow: JellyConstants.Direction = .top, - directionDismiss: JellyConstants.Direction = .top, - widthForViewController: JellyConstants.Size = .fullscreen, - heightForViewController: JellyConstants.Size = .fullscreen, - horizontalAlignment: JellyConstants.HorizontalAlignment = .center, - verticalAlignment: JellyConstants.VerticalAlignment = .center, - marginGuards: UIEdgeInsets = .zero, - corners: UIRectCorner = [.topLeft, .topRight, .bottomLeft, .bottomRight]) { - - self.dismissCurve = dismissCurve - self.presentationCurve = presentationCurve - self.cornerRadius = cornerRadius - self.backgroundStyle = backgroundStyle - self.jellyness = jellyness - self.duration = duration - self.directionShow = directionShow - self.directionDismiss = directionDismiss - self.widthForViewController = widthForViewController - self.heightForViewController = heightForViewController - self.verticalAlignemt = verticalAlignment - self.horizontalAlignment = horizontalAlignment - self.marginGuards = marginGuards - self.corners = corners - } -} diff --git a/Jelly/Classes/UIView+Jelly.swift b/Jelly/Classes/UIView+Jelly.swift deleted file mode 100644 index ec3fb79..0000000 --- a/Jelly/Classes/UIView+Jelly.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// JellyHelper.swift -// Pods -// -// Created by Sebastian Boldt on 18.12.16. -// -// - -import Foundation -import UIKit - -extension UIView { - public func roundCorners(corners: UIRectCorner = .allCorners, radius: Double = 0.0) { - self.layer.masksToBounds = true - let maskPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width:radius, height:radius)) - let shape = CAShapeLayer() - shape.path = maskPath.cgPath - self.layer.mask = shape - } -} diff --git a/Jelly/Classes/UIViewControllerAnimatedTransitioning+Extension.swift b/Jelly/Classes/UIViewControllerAnimatedTransitioning+Extension.swift deleted file mode 100644 index 82519d7..0000000 --- a/Jelly/Classes/UIViewControllerAnimatedTransitioning+Extension.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// UIViewControllerAnimatedTransitioning+Extension.swift -// Pods -// -// Created by Sebastian Boldt on 23.05.17. -// -// - -import Foundation - -public extension UIViewControllerAnimatedTransitioning { - public func getPresentedViewControllerKeyForPresentationType(type: JellyConstants.PresentationType) -> UITransitionContextViewControllerKey { - switch type { - case .show: - return .to - case .dismiss: - return .from - } - } - - public func getUnderlyingViewControllerKeyForPresentationType(type: JellyConstants.PresentationType) -> UITransitionContextViewControllerKey { - switch type { - case .show: - return .from - case .dismiss: - return .to - } - } -} diff --git a/Jelly/Classes/JellySlideInPresentationAnimator.swift b/Jelly/Classes/private/Animators/Animated Animators/CoverAnimator.swift similarity index 53% rename from Jelly/Classes/JellySlideInPresentationAnimator.swift rename to Jelly/Classes/private/Animators/Animated Animators/CoverAnimator.swift index 311ad26..5c56c3a 100644 --- a/Jelly/Classes/JellySlideInPresentationAnimator.swift +++ b/Jelly/Classes/private/Animators/Animated Animators/CoverAnimator.swift @@ -1,31 +1,52 @@ -// -// SlideInPresentationAnimator.swift -// Created by Sebastian Boldt on 18.11.16. - import Foundation -final class JellySlideInPresentationAnimator: NSObject { - - let direction: JellyConstants.Direction - let presentationType : JellyConstants.PresentationType - let presentation : JellySlideInPresentation +final class CoverAnimator: NSObject { + private let presentationType : PresentationType + private let presentation : CoverPresentation - init(direction: JellyConstants.Direction, presentationType: JellyConstants.PresentationType, presentation: JellySlideInPresentation) { - self.direction = direction + init(presentationType: PresentationType, presentation: CoverPresentation) { self.presentationType = presentationType self.presentation = presentation super.init() } - } -extension JellySlideInPresentationAnimator : UIViewControllerAnimatedTransitioning { +extension CoverAnimator : UIViewControllerAnimatedTransitioning { + func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { + let propertyAnimator = createPropertyAnimator(using: transitionContext) + propertyAnimator.startAnimation() + } + + func interruptibleAnimator(using transitionContext: UIViewControllerContextTransitioning) -> UIViewImplicitlyAnimating { + return createPropertyAnimator(using: transitionContext) + } + func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { - return presentation.duration.rawValue + return presentation.presentationTiming.duration.timeInterval } - func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { - + /// Return dismissed frame depending on provides direction + /// + /// - Parameters: + /// - presentedFrame: frame the viewController will have if he is fully presented + /// - transitionContext: nothing to say here + /// - Returns: the frame the view should have afer dismissing it + private func calculateDismissedFrame(from presentedFrame: CGRect, usingDirection direction: Direction , andContext transitionContext: UIViewControllerContextTransitioning) -> CGRect { + var dismissedFrame: CGRect = presentedFrame + switch direction { + case .left: + dismissedFrame.origin.x = -presentedFrame.width + case .right: + dismissedFrame.origin.x = transitionContext.containerView.frame.size.width + case .top: + dismissedFrame.origin.y = -presentedFrame.height + case .bottom: + dismissedFrame.origin.y = transitionContext.containerView.frame.size.height + } + return dismissedFrame + } + + func createPropertyAnimator(using transitionContext: UIViewControllerContextTransitioning) -> UIViewPropertyAnimator { let key = getPresentedViewControllerKeyForPresentationType(type: self.presentationType) let isPresentation = key == .to let controllerToAnimate = transitionContext.viewController(forKey: key)! @@ -36,55 +57,33 @@ extension JellySlideInPresentationAnimator : UIViewControllerAnimatedTransitioni } let presentedFrame = transitionContext.finalFrame(for: controllerToAnimate) // Frame the ViewController will have after animation completes - let dismissedFrame = calculateDismissedFrame(from: presentedFrame, usingDirection: self.direction, andContext: transitionContext) // Frame the ViewController will have when he is dismissed - print(dismissedFrame) + let direction = self.presentationType == .show ? presentation.showDirection : presentation.dismissDirection + let dismissedFrame = calculateDismissedFrame(from: presentedFrame, usingDirection: direction, andContext: transitionContext) // Frame the ViewController will have when he is dismissed let initialFrame = isPresentation ? dismissedFrame : presentedFrame let finalFrame = isPresentation ? presentedFrame : dismissedFrame - let animationDuration = transitionDuration(using: transitionContext) controllerToAnimate.view.frame = initialFrame - var jellyness = Jelly() + let timing = presentation.presentationTiming + let animationCurve = isPresentation ? timing.presentationCurve : timing.dismissCurve - if isPresentation { - jellyness = presentation.jellyness.convertJellyness() - } + let velocityVector = direction == .bottom || direction == .top ? CGVector(dx: 0, dy: presentation.spring.velocity) : CGVector(dx: presentation.spring.velocity, dy: 0) + let springParameters = UISpringTimingParameters(dampingRatio: presentation.spring.damping, initialVelocity: velocityVector) + let cubicParameters = UICubicTimingParameters(animationCurve: animationCurve) + let timingCurveProvider = CombinedTimingCurveProvider(springParameters: springParameters, cubicParameters: cubicParameters) - let animationCurve = isPresentation ? presentation.presentationCurve : presentation.dismissCurve - UIView.animate(withDuration: animationDuration, - delay: 0.0, - usingSpringWithDamping: jellyness.damping, - initialSpringVelocity: jellyness.velocity, - options: animationCurve.getAnimationOptionForJellyCurve(), - animations: { + let propertyAnimator = UIViewPropertyAnimator(duration: animationDuration, timingParameters: timingCurveProvider) + + propertyAnimator.addAnimations { controllerToAnimate.view.frame = finalFrame - }, completion:{ finished in - transitionContext.completeTransition(!transitionContext.transitionWasCancelled) - }) + } - } - - - /// Return dismissed frame depending on provides direction - /// - /// - Parameters: - /// - presentedFrame: frame the viewController will have if he is fully presented - /// - transitionContext: nothing to say here - /// - Returns: the frame the view should have afer dismissing it - private func calculateDismissedFrame(from presentedFrame: CGRect, usingDirection direction: JellyConstants.Direction , andContext transitionContext: UIViewControllerContextTransitioning) -> CGRect { - var dismissedFrame: CGRect = presentedFrame - switch direction { - case .left: - dismissedFrame.origin.x = -presentedFrame.width - case .right: - dismissedFrame.origin.x = transitionContext.containerView.frame.size.width - case .top: - dismissedFrame.origin.y = -presentedFrame.height - case .bottom: - dismissedFrame.origin.y = transitionContext.containerView.frame.size.height + propertyAnimator.addCompletion { animatedPosition in + transitionContext.completeTransition(!transitionContext.transitionWasCancelled) } - return dismissedFrame + + return propertyAnimator } } diff --git a/Jelly/Classes/private/Animators/Animated Animators/FadeAnimator.swift b/Jelly/Classes/private/Animators/Animated Animators/FadeAnimator.swift new file mode 100644 index 0000000..8e21e51 --- /dev/null +++ b/Jelly/Classes/private/Animators/Animated Animators/FadeAnimator.swift @@ -0,0 +1,60 @@ +import Foundation + +final class FadeAnimator: NSObject { + private let presentationType : PresentationType + private let presentation : FadePresentation + + init(presentationType: PresentationType, presentation: FadePresentation) { + self.presentationType = presentationType + self.presentation = presentation + super.init() + } +} + +extension FadeAnimator : UIViewControllerAnimatedTransitioning { + func interruptibleAnimator(using transitionContext: UIViewControllerContextTransitioning) -> UIViewImplicitlyAnimating { + return createPropertyAnimator(using: transitionContext) + } + func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { + return presentation.presentationTiming.duration.timeInterval + } + + func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { + let propertyAnimator = createPropertyAnimator(using: transitionContext) + propertyAnimator.startAnimation() + } + + private func createPropertyAnimator(using transitionContext: UIViewControllerContextTransitioning) -> UIViewPropertyAnimator { + let key = getPresentedViewControllerKeyForPresentationType(type: self.presentationType) + let isPresentation = key == .to + let controllerToAnimate = transitionContext.viewController(forKey: key)! + + // If we animate to the ViewController we need to add the View to the ContainerView + if isPresentation { + transitionContext.containerView.addSubview(controllerToAnimate.view) + } + + let presentedFrame = transitionContext.finalFrame(for: controllerToAnimate) // Frame the ViewController + + let finalAlpha = isPresentation ? 1.0 : 0.0 + let initialAlpha = isPresentation ? 0.0 : 1.0 + + let animationDuration = transitionDuration(using: transitionContext) + controllerToAnimate.view.frame = presentedFrame + controllerToAnimate.view.alpha = CGFloat(initialAlpha) + + let timing = presentation.presentationTiming + let animationCurve = isPresentation ? timing.presentationCurve : timing.dismissCurve + let timingCurveProvider = UICubicTimingParameters(animationCurve: animationCurve) + let propertyAnimator = UIViewPropertyAnimator(duration: animationDuration, timingParameters: timingCurveProvider) + + propertyAnimator.addAnimations { + controllerToAnimate.view.alpha = CGFloat(finalAlpha) + } + + propertyAnimator.addCompletion { animatedPosition in + transitionContext.completeTransition(!transitionContext.transitionWasCancelled) + } + return propertyAnimator + } +} diff --git a/Jelly/Classes/JellyShiftInPresentationAnimator.swift b/Jelly/Classes/private/Animators/Animated Animators/SlideAnimator.swift similarity index 55% rename from Jelly/Classes/JellyShiftInPresentationAnimator.swift rename to Jelly/Classes/private/Animators/Animated Animators/SlideAnimator.swift index 2fde89b..381f2d1 100644 --- a/Jelly/Classes/JellyShiftInPresentationAnimator.swift +++ b/Jelly/Classes/private/Animators/Animated Animators/SlideAnimator.swift @@ -1,31 +1,31 @@ -// -// SlideInPresentationAnimator.swift -// Created by Sebastian Boldt on 18.11.16. - import Foundation -final class JellyShiftInPresentationAnimator: NSObject { - - let direction: JellyConstants.Direction - let presentationType : JellyConstants.PresentationType - let presentation : JellyShiftInPresentation - - init(direction: JellyConstants.Direction, presentationType: JellyConstants.PresentationType, presentation: JellyShiftInPresentation) { - self.direction = direction +final class SlideAnimator: NSObject { + private let presentationType : PresentationType + private let presentation : SlidePresentation + + init(presentationType: PresentationType, presentation: SlidePresentation) { self.presentationType = presentationType self.presentation = presentation super.init() } - } -extension JellyShiftInPresentationAnimator : UIViewControllerAnimatedTransitioning { +extension SlideAnimator : UIViewControllerAnimatedTransitioning { func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { - return presentation.duration.rawValue + return presentation.presentationTiming.duration.timeInterval } func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { - + let propertyAnimator = createPropertyAnimator(using: transitionContext) + propertyAnimator.startAnimation() + } + + func interruptibleAnimator(using transitionContext: UIViewControllerContextTransitioning) -> UIViewImplicitlyAnimating { + return createPropertyAnimator(using: transitionContext) + } + + func createPropertyAnimator(using transitionContext: UIViewControllerContextTransitioning) -> UIViewPropertyAnimator{ let presentedKey = getPresentedViewControllerKeyForPresentationType(type: self.presentationType) let underlyingKey = getUnderlyingViewControllerKeyForPresentationType(type: self.presentationType) @@ -40,19 +40,19 @@ extension JellyShiftInPresentationAnimator : UIViewControllerAnimatedTransitioni // Frames for pushed ViewController let presentedFrameForPresented = transitionContext.finalFrame(for: presentedViewController) // Frame the ViewController will have after animation completes - let dismissedFrameForPresented = calculateDismissedFrame(from: presentedFrameForPresented, usingDirection: self.direction, andContext: transitionContext) // Frame the ViewController will have when he is dismissed + let dismissedFrameForPresented = calculateDismissedFrame(from: presentedFrameForPresented, usingDirection: presentation.showDirection, andContext: transitionContext) // Frame the ViewController will have when he is dismissed var presentedFrameForUnderlying = transitionContext.containerView.frame - switch self.presentation.direction { - case .left: - presentedFrameForUnderlying.origin.x = presentedFrameForPresented.origin.x + presentedFrameForPresented.size.width - case .right: - presentedFrameForUnderlying.origin.x = presentedFrameForUnderlying.origin.x - presentedFrameForPresented.size.width - case .top: - presentedFrameForUnderlying.origin.y = presentedFrameForPresented.origin.y + presentedFrameForPresented.size.height - case .bottom: - presentedFrameForUnderlying.origin.y = presentedFrameForUnderlying.origin.y - presentedFrameForPresented.size.height + switch self.presentation.showDirection { + case .left: + presentedFrameForUnderlying.origin.x = presentedFrameForPresented.origin.x + presentedFrameForPresented.size.width + case .right: + presentedFrameForUnderlying.origin.x = presentedFrameForUnderlying.origin.x - presentedFrameForPresented.size.width + case .top: + presentedFrameForUnderlying.origin.y = presentedFrameForPresented.origin.y + presentedFrameForPresented.size.height + case .bottom: + presentedFrameForUnderlying.origin.y = presentedFrameForUnderlying.origin.y - presentedFrameForPresented.size.height } let dismissedFrameForUnderLying = transitionContext.containerView.frame @@ -68,37 +68,38 @@ extension JellyShiftInPresentationAnimator : UIViewControllerAnimatedTransitioni presentedViewController.view.frame = initialFrameForPresented underlyingViewController.view.frame = initialFrameForUnderlying - var jellyness = Jelly() + let animationCurve = isPresentation ? presentation.presentationTiming.presentationCurve : presentation.presentationTiming.presentationCurve + let direction = presentation.showDirection + let velocityVector = direction == .bottom || direction == .top ? CGVector(dx: 0, dy: presentation.spring.velocity) : CGVector(dx: presentation.spring.velocity, dy: 0) + let springParameters = UISpringTimingParameters(dampingRatio: presentation.spring.damping, initialVelocity: velocityVector) + let cubicParameters = UICubicTimingParameters(animationCurve: animationCurve) + let timingCurveProvider = CombinedTimingCurveProvider(springParameters: springParameters, cubicParameters: cubicParameters) - if isPresentation { - jellyness = presentation.jellyness.convertJellyness() + let propertyAnimator = UIViewPropertyAnimator(duration: animationDuration, timingParameters: timingCurveProvider) + + propertyAnimator.addAnimations { + presentedViewController.view.frame = finalFrameFoPresented + underlyingViewController.view.frame = finalFrameForUnderlying } - let animationCurve = isPresentation ? presentation.presentationCurve : presentation.dismissCurve - UIView.animate(withDuration: animationDuration, - delay: 0.0, - usingSpringWithDamping: jellyness.damping, - initialSpringVelocity: jellyness.velocity, - options: animationCurve.getAnimationOptionForJellyCurve(), - animations: { - - presentedViewController.view.frame = finalFrameFoPresented - underlyingViewController.view.frame = finalFrameForUnderlying - - }, completion:{ finished in + propertyAnimator.addCompletion { animatedPosition in transitionContext.completeTransition(!transitionContext.transitionWasCancelled) - }) + } + return propertyAnimator } - - +} + +extension SlideAnimator { /// Return dismissed frame depending on provides direction /// /// - Parameters: /// - presentedFrame: frame the viewController will have if he is fully presented /// - transitionContext: nothing to say here /// - Returns: the frame the view should have afer dismissing it - private func calculateDismissedFrame(from presentedFrame: CGRect, usingDirection direction: JellyConstants.Direction , andContext transitionContext: UIViewControllerContextTransitioning) -> CGRect { + private func calculateDismissedFrame(from presentedFrame: CGRect, + usingDirection direction: Direction, + andContext transitionContext: UIViewControllerContextTransitioning) -> CGRect { var dismissedFrame: CGRect = presentedFrame switch direction { case .left: diff --git a/Jelly/Classes/private/Animators/Interaction Controllers/InteractionController.swift b/Jelly/Classes/private/Animators/Interaction Controllers/InteractionController.swift new file mode 100644 index 0000000..bb4c732 --- /dev/null +++ b/Jelly/Classes/private/Animators/Interaction Controllers/InteractionController.swift @@ -0,0 +1,204 @@ +import UIKit + +class InteractionController: UIPercentDrivenInteractiveTransition { + var interactionInProgress = false + private var shouldCompleteTransition = false + + private weak var presentedViewController: UIViewController! + private weak var presentingViewController: UIViewController? + private weak var presentationController: PresentationController? + + private let presentation: (InteractionConfigurationProvider & PresentationShowDirectionProvider) + private let presentationType: PresentationType + private let configuration: InteractionConfiguration + + init(configuration: InteractionConfiguration, + presentedViewController: UIViewController, + presentingViewController: UIViewController?, + presentationType: PresentationType, + presentation: (InteractionConfigurationProvider & PresentationShowDirectionProvider), + presentationController: PresentationController?) { + + self.presentedViewController = presentedViewController + self.presentingViewController = presentingViewController + self.presentation = presentation + self.presentationType = presentationType + self.presentationController = presentationController + self.configuration = configuration + + super.init() + prepareGestureRecognizers() + } + + public func setPresentationController(presentationController: PresentationController) { + self.presentationController = presentationController + } + + private func prepareGestureRecognizers() { + switch (presentationType, configuration.dragMode) { + case (.show, .canvas), (.show, .edge): + guard let view = presentingViewController?.view else { break } + addInteractionGestureRecognizer(to: view) + case (.dismiss, .canvas): + addInteractionGestureRecognizer(to: presentedViewController.view) + case (.dismiss, .edge): + prepareSpecialWorkAroundForDismissGestureRecognizers() + } + } + + /* + if orientation is vertical + if height is >= than screen + we should add it to the presntedViewController + else if + we add it to the dimming and blurView + else if orientation is horizontal + if width is >= than screen + we should add it to the presntedViewController + else if + we add it to the dimming and blurView + */ + //TODO: try to refactor this + private func prepareSpecialWorkAroundForDismissGestureRecognizers() { + var size: Size? + if presentation.showDirection.orientation() == .vertical { + if let sizeProvider = presentation as? PresentationSizeProvider { + size = sizeProvider.presentationSize.height + } else if let sizeProvider = presentation as? PresentationSingleSizeProvider { + size = sizeProvider.size + } + + guard let size = size else { + return + } + + switch size { + case .fullscreen: + addInteractionGestureRecognizer(to: presentedViewController.view) + case .custom(let height): + if height >= UIScreen.main.bounds.height { + addInteractionGestureRecognizer(to: presentedViewController.view) + } else { + addInteractionGestureRecognizer(to: presentationController!.dimmingView) + addInteractionGestureRecognizer(to: presentationController!.blurView) + } + case .halfscreen: + addInteractionGestureRecognizer(to: presentationController!.dimmingView) + addInteractionGestureRecognizer(to: presentationController!.blurView) + + } + + } else if presentation.showDirection.orientation() == .horizontal { + if let sizeProvider = presentation as? PresentationSizeProvider { + size = sizeProvider.presentationSize.width + } else if let singleSizeProvider = presentation as? PresentationSingleSizeProvider { + size = singleSizeProvider.size + } + + guard let size = size else { + return + } + + switch size { + case .fullscreen: + addInteractionGestureRecognizer(to: presentedViewController.view) + case .custom(let width): + if width >= UIScreen.main.bounds.width { + addInteractionGestureRecognizer(to: presentedViewController.view) + } else { + addInteractionGestureRecognizer(to: presentationController!.dimmingView) + addInteractionGestureRecognizer(to: presentationController!.blurView) + } + case .halfscreen: + addInteractionGestureRecognizer(to: presentationController!.dimmingView) + addInteractionGestureRecognizer(to: presentationController!.blurView) + } + } + } + + private func addInteractionGestureRecognizer(to view: UIView) { + var dismissDirection = presentation.showDirection + if let dismissProvider = presentation as? PresentationDismissDirectionProvider { + dismissDirection = dismissProvider.dismissDirection + } + + let dragDirection = presentationType == .show ? presentation.showDirection : dismissDirection + switch configuration.dragMode { + case .canvas: + let gesture = UIPanGestureRecognizer(target: self, action: #selector(handleGesture(_:))) + if #available(iOS 11.0, *) { + gesture.name = Constants.gestureRecognizerIdentifier + } + view.addGestureRecognizer(gesture) + case .edge: + let gesture = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(handleGesture(_:))) + gesture.edges = presentationType == .dismiss ? dragDirection.dismissRectEdges : dragDirection.showRectEdges + if #available(iOS 11.0, *) { + gesture.name = Constants.gestureRecognizerIdentifier + } + view.addGestureRecognizer(gesture) + } + } + + @objc func handleGesture(_ gestureRecognizer: UIPanGestureRecognizer) { + guard let superView = gestureRecognizer.view?.superview else { + return + } + + var direction: Direction = presentation.showDirection + if presentationType == .dismiss, let dismissProvider = presentation as? PresentationDismissDirectionProvider { + direction = dismissProvider.dismissDirection + } + + let translation = gestureRecognizer.translation(in: superView) + var progress = getProgress(for: direction, translation: translation) + progress = CGFloat(min(max(Float(progress), 0.0), 1.0)) + updateTransition(with: progress, and: gestureRecognizer.state) + } + + private func getProgress(for direction: Direction, translation: CGPoint) -> CGFloat { + let height = presentedViewController.view.frame.height + let width = presentedViewController.view.frame.width + switch (direction, presentationType) { + case (.top, .show), (.bottom, .dismiss): + return (abs(max(0,translation.y)) / height) + case (.top, .dismiss), (.bottom, .show): + return (abs(min(0,translation.y)) / height) + case (.left, .show), (.right, .dismiss): + return (abs(max(0,translation.x)) / width) + case (.right, .show),(.left, .dismiss): + return (abs(min(0,translation.x)) / width) + } + } +} + +extension InteractionController { + func updateTransition(with progress: CGFloat, and state: UIGestureRecognizer.State) { + switch state { + case .began: + interactionInProgress = true + performTransition(for: presentationType) + case .changed: + shouldCompleteTransition = progress > configuration.completionThreshold + update(progress) + case .cancelled: + interactionInProgress = false + cancel() + case .ended: + interactionInProgress = false + shouldCompleteTransition ? finish() : cancel() + default: + break + } + } + + private func performTransition(for type: PresentationType) { + switch presentationType { + case .show: + presentingViewController?.present(presentedViewController, animated: true, completion: nil) + case .dismiss: + presentedViewController.dismiss(animated: true, completion: nil) + + } + } +} diff --git a/Jelly/Classes/private/Extensions/AnimationCurve+AnimationOptions.swift b/Jelly/Classes/private/Extensions/AnimationCurve+AnimationOptions.swift new file mode 100644 index 0000000..2f64717 --- /dev/null +++ b/Jelly/Classes/private/Extensions/AnimationCurve+AnimationOptions.swift @@ -0,0 +1,17 @@ +import UIKit + +extension UIView.AnimationCurve { + var animationOptions: UIView.AnimationOptions { + switch (self) { + case .easeInOut: + return UIView.AnimationOptions.curveEaseInOut + case .easeIn: return + UIView.AnimationOptions.curveEaseIn + case .easeOut: return + UIView.AnimationOptions.curveEaseOut + case .linear: + return UIView.AnimationOptions.curveLinear + } + } +} + diff --git a/Jelly/Classes/private/Extensions/Direction+EdgeHelper.swift b/Jelly/Classes/private/Extensions/Direction+EdgeHelper.swift new file mode 100644 index 0000000..045012e --- /dev/null +++ b/Jelly/Classes/private/Extensions/Direction+EdgeHelper.swift @@ -0,0 +1,42 @@ +import Foundation + +extension Direction { + var panDirection: UISwipeGestureRecognizer.Direction { + switch self { + case .top: + return .down + case .left: + return .left + case .bottom: + return .up + case .right: + return .right + } + } + + var showRectEdges: UIRectEdge { + switch self { + case .top: + return .top + case .left: + return .left + case .bottom: + return .bottom + case .right: + return .right + } + } + + var dismissRectEdges: UIRectEdge { + switch self { + case .top: + return .bottom + case .bottom: + return .top + case .left: + return .right + case .right: + return .left + } + } +} diff --git a/Jelly/Classes/private/Extensions/Direction+Orientation.swift b/Jelly/Classes/private/Extensions/Direction+Orientation.swift new file mode 100644 index 0000000..372b1c2 --- /dev/null +++ b/Jelly/Classes/private/Extensions/Direction+Orientation.swift @@ -0,0 +1,12 @@ +import Foundation + +extension Direction { + public func orientation() -> Orientation { + switch self { + case .left, .right : + return .horizontal + case .top, .bottom : + return .vertical + } + } +} diff --git a/Jelly/Classes/private/Extensions/Spring+Values.swift b/Jelly/Classes/private/Extensions/Spring+Values.swift new file mode 100644 index 0000000..6643ccf --- /dev/null +++ b/Jelly/Classes/private/Extensions/Spring+Values.swift @@ -0,0 +1,29 @@ +import Foundation + +extension Spring { + var damping: CGFloat { + switch self { + case .none: + return 1.0 + case .tight: + return 0.7 + case .medium: + return 0.5 + case .loose: + return 0.2 + } + } + + var velocity: CGFloat { + switch self { + case .none: + return 0 + case .tight: + return 1 + case .medium: + return 3 + case .loose: + return 4 + } + } +} diff --git a/Jelly/Classes/private/Extensions/UIView+RoundCorners.swift b/Jelly/Classes/private/Extensions/UIView+RoundCorners.swift new file mode 100644 index 0000000..54126c6 --- /dev/null +++ b/Jelly/Classes/private/Extensions/UIView+RoundCorners.swift @@ -0,0 +1,9 @@ +import UIKit + +extension UIView { + public func roundCorners(corners: CACornerMask = [.layerMaxXMaxYCorner,.layerMaxXMinYCorner, .layerMinXMaxYCorner, .layerMinXMinYCorner], radius: CGFloat = 0.0) { + layer.masksToBounds = true + layer.cornerRadius = radius + layer.maskedCorners = corners + } +} diff --git a/Jelly/Classes/private/Extensions/UIViewControllerAnimatedTransitioning+Convenience.swift b/Jelly/Classes/private/Extensions/UIViewControllerAnimatedTransitioning+Convenience.swift new file mode 100644 index 0000000..700ce51 --- /dev/null +++ b/Jelly/Classes/private/Extensions/UIViewControllerAnimatedTransitioning+Convenience.swift @@ -0,0 +1,21 @@ +import Foundation + +extension UIViewControllerAnimatedTransitioning { + func getPresentedViewControllerKeyForPresentationType(type: PresentationType) -> UITransitionContextViewControllerKey { + switch type { + case .show: + return .to + case .dismiss: + return .from + } + } + + func getUnderlyingViewControllerKeyForPresentationType(type: PresentationType) -> UITransitionContextViewControllerKey { + switch type { + case .show: + return .from + case .dismiss: + return .to + } + } +} diff --git a/Jelly/Classes/private/Models/CombinedTimingCurveProvider.swift b/Jelly/Classes/private/Models/CombinedTimingCurveProvider.swift new file mode 100644 index 0000000..fd4e815 --- /dev/null +++ b/Jelly/Classes/private/Models/CombinedTimingCurveProvider.swift @@ -0,0 +1,30 @@ +import UIKit + +@objc(CombinedTimingCurveProvider) class CombinedTimingCurveProvider: NSObject, UITimingCurveProvider { + var springTimingParameters: UISpringTimingParameters? + var cubicTimingParameters: UICubicTimingParameters? + var timingCurveType: UITimingCurveType { + return .composed + } + + init(springParameters: UISpringTimingParameters?, cubicParameters: UICubicTimingParameters?) { + self.springTimingParameters = springParameters + self.cubicTimingParameters = cubicParameters + } + + override init() { + super.init() + } + + required convenience init?(coder aDecoder: NSCoder) { + self.init() + } + + public func copy(with zone: NSZone? = nil) -> Any { + return CombinedTimingCurveProvider(springParameters: self.springTimingParameters, cubicParameters: self.cubicTimingParameters) + } + + public func encode(with aCoder: NSCoder) { + return + } +} diff --git a/Jelly/Classes/private/Models/PresentationType.swift b/Jelly/Classes/private/Models/PresentationType.swift new file mode 100644 index 0000000..3c60ac9 --- /dev/null +++ b/Jelly/Classes/private/Models/PresentationType.swift @@ -0,0 +1,6 @@ +import Foundation + +enum PresentationType { + case show + case dismiss +} diff --git a/Jelly/Classes/JellyPresentationController.swift b/Jelly/Classes/private/PresentationController.swift similarity index 53% rename from Jelly/Classes/JellyPresentationController.swift rename to Jelly/Classes/private/PresentationController.swift index 9477d3d..7ac111b 100644 --- a/Jelly/Classes/JellyPresentationController.swift +++ b/Jelly/Classes/private/PresentationController.swift @@ -1,90 +1,79 @@ -// -// JellyPresentationController.swift -// Created by Sebastian Boldt on 17.11.16. - import UIKit +protocol PresentationControllerProtocol { + func updatePresentation(presentation: Presentation, duration: Duration) + var dimmingView: UIView { get } + var blurView: UIVisualEffectView { get } +} -/// A JellyPresentationControllers tells UIKit what exactly to do with the View that should be presented +/// A PresentationController tells UIKit what exactly to do with the View that should be presented /// It also reacts to transtion state changes etc. -/// We use this controller to setup dimmingView, blurView, positioning the presented ViewController etc. -class JellyPresentationController : UIPresentationController { +/// We use this controller to setup dimmingView, blurView, positioning and resize the the presented ViewController etc. + +final class PresentationController: UIPresentationController, PresentationControllerProtocol { + fileprivate var presentation: Presentation - fileprivate var presentation: JellyPresentation - fileprivate var dimmingView: UIView = UIView() - fileprivate var blurView: UIVisualEffectView = UIVisualEffectView() + // Blur and Dimming View needs to be accessible because the Interactor attaches Gesture-Recognizer to them when + // using a edge pan gesture becaue it wont work other wise with non full screen viewController transitions + private(set) var dimmingView: UIView = UIView() + private(set) var blurView: UIVisualEffectView = UIVisualEffectView() - init(presentedViewController: UIViewController, presentingViewController: UIViewController?, presentation: JellyPresentation) { - + init(presentedViewController: UIViewController, presentingViewController: UIViewController?, presentation: Presentation) { self.presentation = presentation - super.init(presentedViewController: presentedViewController, - presenting: presentingViewController) - + super.init(presentedViewController: presentedViewController, presenting: presentingViewController) presentedViewController.view.layer.masksToBounds = true - presentedViewController.view.roundCorners(corners: self.presentation.corners, radius: presentation.cornerRadius) + let corners = presentation.presentationUIConfiguration.corners + let radius = presentation.presentationUIConfiguration.cornerRadius + presentedViewController.view.roundCorners(corners: corners, radius: radius) + } + + func updatePresentation(presentation: Presentation, duration: Duration) { + self.presentation = presentation + self.containerView?.setNeedsLayout() + UIView.animate(withDuration: duration.timeInterval) { + self.containerView?.layoutIfNeeded() + } } override func presentationTransitionWillBegin() { - switch self.presentation.backgroundStyle { - case .blur(let effectStyle): + let backgroundStyle = presentation.presentationUIConfiguration.backgroundStyle + switch backgroundStyle { + case .blurred(let effectStyle): self.setupBlurView() animateBlurView(effectStyle: effectStyle) case .dimmed(let alpha): self.setupDimmingView(withAlpha: alpha) - animateDimmingView() + animateDimmingView(alpha: alpha) } } - private func animateBlurView(effectStyle: UIBlurEffect.Style) { - let effect = UIBlurEffect(style: effectStyle) - - guard let coordinator = presentedViewController.transitionCoordinator else { - self.blurView.effect = effect - return - } - - coordinator.animate(alongsideTransition: { _ in - self.blurView.effect = effect - }) - } - - private func animateDimmingView() { - guard let coordinator = presentedViewController.transitionCoordinator else { - dimmingView.alpha = 1.0 - return - } - - coordinator.animate(alongsideTransition: { _ in - self.dimmingView.alpha = 1.0 - }) - } - override func dismissalTransitionWillBegin() { - guard let coordinator = presentedViewController.transitionCoordinator else { - dimmingView.alpha = 0.0 - return + let backgroundStyle = presentation.presentationUIConfiguration.backgroundStyle + switch backgroundStyle { + case .blurred: + animateBlurView(effectStyle: nil) + case .dimmed: + animateDimmingView(alpha: 0.0) } - - coordinator.animate(alongsideTransition: { _ in - self.dimmingView.alpha = 0.0 - self.blurView.effect = nil - }) } - override func containerViewWillLayoutSubviews() { + override func containerViewWillLayoutSubviews() { presentedView?.frame = frameOfPresentedViewInContainerView - presentedView?.roundCorners(corners: self.presentation.corners, radius: self.presentation.cornerRadius) + let corners = presentation.presentationUIConfiguration.corners + let radius = presentation.presentationUIConfiguration.cornerRadius + presentedView?.roundCorners(corners: corners, radius: radius) } override func size(forChildContentContainer container: UIContentContainer, withParentContainerSize parentSize: CGSize) -> CGSize { - - guard let nonFullScreenPresentation = self.presentation as? DynamicPresentation else { + guard let nonFullScreenPresentation = self.presentation as? PresentationSizeProvider else { return parentSize } var width : CGFloat = 0.0 - switch nonFullScreenPresentation.widthForViewController { + var height : CGFloat = 0.0 + + switch nonFullScreenPresentation.presentationSize.width { case .fullscreen: width = parentSize.width case .halfscreen: @@ -93,8 +82,7 @@ class JellyPresentationController : UIPresentationController { width = value } - var height : CGFloat = 0.0 - switch nonFullScreenPresentation.heightForViewController { + switch nonFullScreenPresentation.presentationSize.height { case .fullscreen: height = parentSize.height case .halfscreen: @@ -107,79 +95,117 @@ class JellyPresentationController : UIPresentationController { } override var frameOfPresentedViewInContainerView: CGRect { - - if let shiftIn = self.presentation as? JellyShiftInPresentation { - return self.getFrameForShiftInPresentation(shiftIn: shiftIn) + if let slideIn = self.presentation as? SlidePresentation { + return self.getFrameForSlidePresentation(presentation: slideIn) } - guard let dynamicPresentation = self.presentation as? DynamicPresentation else { + guard let sizeProvider = self.presentation as? PresentationSizeProvider else { return CGRect(x:0,y:0,width: containerView!.bounds.size.width, height: containerView!.bounds.size.height) } var frame: CGRect = .zero frame.size = size(forChildContentContainer: presentedViewController, withParentContainerSize: containerView!.bounds.size) limit(frame: &frame, withSize: frame.size) + let marginGuards = (sizeProvider as? PresentationMarginGuardsProvider)?.marginGuards ?? .zero align(frame: &frame, withPresentation: self.presentation) - applymarginGuards(toFrame: &frame, marginGuards: dynamicPresentation.marginGuards, container: containerView!.bounds.size) - + applymarginGuards(toFrame: &frame, marginGuards: marginGuards, container: containerView!.bounds.size) return frame } - private func getFrameForShiftInPresentation(shiftIn: JellyShiftInPresentation) -> CGRect { - var shiftFrame : CGRect = .zero - let size = getSizeValue(fromPresentation: shiftIn) - switch shiftIn.direction { + @objc dynamic func handleTap(recognizer: UITapGestureRecognizer) { + if presentation.presentationUIConfiguration.isTapBackgroundToDismissEnabled { + presentingViewController.dismiss(animated: true) + } + } +} + +extension PresentationController { + private func animateBlurView(effectStyle: UIBlurEffect.Style?) { + let effect: UIBlurEffect? = (effectStyle != nil) ? UIBlurEffect(style: effectStyle!) : nil + guard let coordinator = presentedViewController.transitionCoordinator else { + self.blurView.effect = effect + return + } + + coordinator.animate(alongsideTransition: { _ in + self.blurView.effect = effect + }) + } + + private func animateDimmingView(alpha: CGFloat) { + guard let coordinator = presentedViewController.transitionCoordinator else { + dimmingView.alpha = alpha + return + } + + coordinator.animate(alongsideTransition: { _ in + self.dimmingView.alpha = alpha + }) + } + + private func getFrameForSlidePresentation(presentation: SlidePresentation) -> CGRect { + var slideInFrame : CGRect = .zero + let size = getSizeValue(fromPresentation: presentation) + switch presentation.showDirection { case .left: - shiftFrame = CGRect(x: 0, y: 0, width: size, height: containerView!.bounds.size.height) + slideInFrame = CGRect(x: 0, y: 0, width: size, height: containerView!.bounds.size.height) case .right: - shiftFrame = CGRect(x: containerView!.bounds.size.width - size, y: 0, width: size, height: containerView!.bounds.size.height) + slideInFrame = CGRect(x: containerView!.bounds.size.width - size, y: 0, width: size, height: containerView!.bounds.size.height) case .top: - shiftFrame = CGRect(x: 0, y: 0, width: containerView!.bounds.size.width, height: size) + slideInFrame = CGRect(x: 0, y: 0, width: containerView!.bounds.size.width, height: size) case .bottom: - shiftFrame = CGRect(x: 0, y: containerView!.bounds.size.height - size , width: containerView!.bounds.size.width, height: size) + slideInFrame = CGRect(x: 0, y: containerView!.bounds.size.height - size , width: containerView!.bounds.size.width, height: size) } - limit(frame: &shiftFrame, withSize: containerView!.bounds.size) - return shiftFrame + limit(frame: &slideInFrame, withSize: containerView!.bounds.size) + return slideInFrame } - private func getSizeValue(fromPresentation presentation: JellyShiftInPresentation) -> CGFloat{ + private func getSizeValue(fromPresentation presentation: SlidePresentation) -> CGFloat{ switch presentation.size { case .custom(let value): return value case .halfscreen: - if presentation.direction.orientation() == .horizontal { + if presentation.showDirection.orientation() == .horizontal { return (self.containerView?.frame.size.width)! / 2 } else { return (self.containerView?.frame.size.height)! / 2 } case .fullscreen: - if presentation.direction.orientation() == .horizontal { + if presentation.showDirection.orientation() == .horizontal { return (self.containerView?.frame.size.width)! } else { return (self.containerView?.frame.size.height)! } - } + } } private func applymarginGuards(toFrame frame: inout CGRect, marginGuards: UIEdgeInsets, container: CGSize){ - // Apply horizontal marginGuards - if (frame.origin.x <= 0) { + // Apply Width + if frame.width > container.width - (marginGuards.left + marginGuards.right) { + let width = frame.width - (marginGuards.left + marginGuards.right) + frame.size = CGSize(width: width, height: frame.height) + } + + if frame.origin.x < marginGuards.left { frame.origin.x = marginGuards.left } - if((frame.origin.x + frame.width) >= (container.width - marginGuards.right)) { - let delta = (frame.origin.x + frame.width) - container.width - frame.size = CGSize(width: frame.width - delta - marginGuards.right , height: frame.height) + if (frame.origin.x + frame.size.width) >= container.width { + frame.origin.x = frame.origin.x - marginGuards.right } - // Apply vertical marginGuards - if (frame.origin.y <= marginGuards.top) { + // Apply Height + if frame.height > container.height - (marginGuards.top + marginGuards.bottom) { + let height = frame.height - (marginGuards.top + marginGuards.bottom) + frame.size = CGSize(width: frame.width, height: height) + } + + if frame.origin.y < marginGuards.top { frame.origin.y = marginGuards.top } - if((frame.origin.y + frame.height) >= (container.height - marginGuards.bottom)) { - let delta = (frame.origin.y + frame.height) - container.height - frame.size = CGSize(width: frame.width , height: frame.height - delta - marginGuards.bottom) + if (frame.origin.y + frame.size.height) >= container.height { + frame.origin.y = frame.origin.y - marginGuards.bottom } } @@ -188,7 +214,6 @@ class JellyPresentationController : UIPresentationController { /// - Parameters: /// - frame: frame to limit /// - size: size to apply - private func limit(frame: inout CGRect, withSize size: CGSize) { if (frame.size.height > size.height) { frame.origin.y = 0 @@ -201,18 +226,15 @@ class JellyPresentationController : UIPresentationController { } } - /// Align alignes the Frame using the alignment options specified inside the presentation object /// /// - Parameters: /// - frame: frame to align /// - presentation: presentation which will be used to provide the alignment options - private func align(frame: inout CGRect, withPresentation presentation: JellyPresentation) { - - if let alignablePresentation = presentation as? AlignablePresentation { - + private func align(frame: inout CGRect, withPresentation presentation: Presentation) { + if let alignablePresentation = presentation as? PresentationAlignmentProvider { // Prepare Horizontal Alignment - switch alignablePresentation.horizontalAlignment { + switch alignablePresentation.presentationAlignment.horizontalAlignment { case .center: frame.origin.x = (containerView!.frame.size.width/2)-(frame.size.width/2) case .left: @@ -221,10 +243,10 @@ class JellyPresentationController : UIPresentationController { frame.origin.x = (containerView?.frame.size.width)! - frame.size.width case .custom(let x): frame.origin.x = x - } + } // Prepare Vertical Alignment - switch alignablePresentation.verticalAlignemt { + switch alignablePresentation.presentationAlignment.verticalAlignemt { case .center: frame.origin.y = (containerView!.frame.size.height/2)-(frame.size.height/2) case .top: @@ -233,30 +255,30 @@ class JellyPresentationController : UIPresentationController { frame.origin.y = (containerView?.frame.size.height)! - frame.size.height case .custom(let y): frame.origin.y = y - } + } } else { frame.origin.x = (containerView!.frame.size.width/2)-(frame.size.width/2) frame.origin.y = (containerView!.frame.size.height/2)-(frame.size.height/2) } } - - func setupBlurView () { - - blurView.translatesAutoresizingMaskIntoConstraints = false - let recognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(recognizer:))) - blurView.addGestureRecognizer(recognizer) - - containerView?.insertSubview(blurView, at: 0) - +} +extension PresentationController { + private func setupBlurView () { guard let containerView = containerView else { return } + blurView.translatesAutoresizingMaskIntoConstraints = false + let recognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(recognizer:))) + recognizer.delegate = self + blurView.addGestureRecognizer(recognizer) + containerView.insertSubview(blurView, at: 0) + if #available(iOS 9.0, *) { - NSLayoutConstraint.activate([blurView.leftAnchor.constraint(equalTo: containerView.leftAnchor)]) - NSLayoutConstraint.activate([blurView.rightAnchor.constraint(equalTo: containerView.rightAnchor)]) - NSLayoutConstraint.activate([blurView.topAnchor.constraint(equalTo: containerView.topAnchor)]) - NSLayoutConstraint.activate([blurView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor)]) + blurView.leftAnchor.constraint(equalTo: containerView.leftAnchor).isActive = true + blurView.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true + blurView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true + blurView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true } else { // Fallback on earlier versions NSLayoutConstraint.activate( @@ -265,11 +287,13 @@ class JellyPresentationController : UIPresentationController { NSLayoutConstraint.activate( NSLayoutConstraint.constraints(withVisualFormat: "H:|[blurView]|", options: [], metrics: nil, views: ["blurView": blurView])) - } } - func setupDimmingView(withAlpha alpha: CGFloat = 0.5) { + private func setupDimmingView(withAlpha alpha: CGFloat = 0.5) { + guard let containerView = containerView else { + return + } dimmingView.translatesAutoresizingMaskIntoConstraints = false dimmingView.alpha = 0.0 @@ -277,20 +301,14 @@ class JellyPresentationController : UIPresentationController { let recognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(recognizer:))) dimmingView.addGestureRecognizer(recognizer) - - containerView?.insertSubview(dimmingView, at: 0) - - guard let containerView = containerView else { - return - } + containerView.insertSubview(dimmingView, at: 0) if #available(iOS 9.0, *) { - NSLayoutConstraint.activate([dimmingView.leftAnchor.constraint(equalTo: containerView.leftAnchor)]) - NSLayoutConstraint.activate([dimmingView.rightAnchor.constraint(equalTo: containerView.rightAnchor)]) - NSLayoutConstraint.activate([dimmingView.topAnchor.constraint(equalTo: containerView.topAnchor)]) - NSLayoutConstraint.activate([dimmingView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor)]) + dimmingView.leftAnchor.constraint(equalTo: containerView.leftAnchor).isActive = true + dimmingView.rightAnchor.constraint(equalTo: containerView.rightAnchor).isActive = true + dimmingView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true + dimmingView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true } else { - // Fallback on earlier versions // Fallback on earlier versions NSLayoutConstraint.activate( NSLayoutConstraint.constraints(withVisualFormat: "V:|[dimmingView]|", @@ -299,13 +317,11 @@ class JellyPresentationController : UIPresentationController { NSLayoutConstraint.constraints(withVisualFormat: "H:|[dimmingView]|", options: [], metrics: nil, views: ["dimmingView": dimmingView])) } - - } - - @objc dynamic func handleTap(recognizer: UITapGestureRecognizer) { - if self.presentation.isTapBackgroundToDismissEnabled { - presentingViewController.dismiss(animated: true) - } +} + +extension PresentationController: UIGestureRecognizerDelegate { + func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + return true } } diff --git a/Jelly/Classes/public/Animator.swift b/Jelly/Classes/public/Animator.swift new file mode 100644 index 0000000..2c2bf18 --- /dev/null +++ b/Jelly/Classes/public/Animator.swift @@ -0,0 +1,186 @@ +import UIKit + +public protocol AnimatorProtocol { + init(presentation: Presentation) +} + +public protocol LiveUpdatable { + func prepare(presentedViewController: UIViewController) + func updateAlignment(alignment: PresentationAlignmentProtocol, duration: Duration) throws + func updateVerticalAlignment(alignment: VerticalAlignment, duration: Duration) throws + func updateHorizontalAlignment(alignment: HorizontalAlignment, duration: Duration) throws + func updateSize(presentationSize: PresentationSize, duration: Duration) throws + func updateWidth(width: Size, duration: Duration) throws + func updateHeight(height: Size, duration: Duration) throws + func updateMarginGuards(marginGuards: UIEdgeInsets, duration: Duration) throws + func updateCorners(radius: CGFloat, corners: CACornerMask, duration: Duration) +} + +/// # Animator +/// An Animator is an UIViewControllerTransitionsDelegate with some extra candy. +/// Basically the Animator is the main class to use when working with Jelly. +public class Animator: NSObject { + private var presentation: Presentation + + private var currentPresentationController: PresentationController! + private weak var presentedViewController: UIViewController! + + private var showInteractionController: InteractionController? + private var dismissInteractionController: InteractionController? + + /// ## designated initializer + /// - Parameter presentation: a custom Presentation Object + public init(presentation: Presentation) { + self.presentation = presentation + super.init() + } + + /// ## prepare + /// Call this function to prepare the viewController you want to present + /// - Parameter viewController: presentedViewController that should be presented in a custom way + public func prepare(presentedViewController: UIViewController) { + // Create InteractionController over here because it needs a reference to the PresentationController + if let interactivePresentation = presentation as? (PresentationShowDirectionProvider & InteractionConfigurationProvider), + let configuration = interactivePresentation.interactionConfiguration, let presentingViewController = configuration.presentingViewController { + self.showInteractionController = InteractionController(configuration: configuration, presentedViewController: presentedViewController, presentingViewController: presentingViewController, presentationType: .show, presentation: interactivePresentation, presentationController: nil) + } + presentedViewController.modalPresentationStyle = .custom + presentedViewController.transitioningDelegate = self + self.presentedViewController = presentedViewController + } +} + +/// ## UIViewControllerTransitioningDelegate Implementation +/// The Animator needs to conform to the UIViewControllerTransitioningDelegate protocol +/// it will provide a custom Presentation-Controller that tells UIKit which extra Views the presentation should have +/// it also returns the interaction controllers for interaction with via gesuture recognizers +extension Animator: UIViewControllerTransitioningDelegate { + /// Gets called from UIKit if presentatioStyle is custom and transitionDelegate is set + public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { + let presentationController = PresentationController(presentedViewController: presented, presentingViewController: presenting, presentation: presentation) + currentPresentationController = presentationController + if let interactivePresentation = presentation as? (InteractionConfigurationProvider & PresentationShowDirectionProvider), + let configuration = interactivePresentation.interactionConfiguration, let presentingViewController = configuration.presentingViewController { + self.dismissInteractionController = InteractionController(configuration: configuration, presentedViewController: presentedViewController, presentingViewController: presentingViewController, presentationType: .dismiss, presentation: interactivePresentation, presentationController: currentPresentationController) + } + return presentationController + } + + /// Each Presentation has two directions + /// Inside a Presention Object you can specify some extra parameters + /// This Parameters will be passed to a custom animator that handles the presentation animation (duration, direction etc.) + public func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? { + return presentation.showAnimator + } + + public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { + return presentation.dismissAnimator + } + + public func interactionControllerForDismissal(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { + guard dismissInteractionController?.interactionInProgress == true else { + return nil + } + return dismissInteractionController + } + + public func interactionControllerForPresentation(using animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? { + guard showInteractionController?.interactionInProgress == true else { + return nil + } + return showInteractionController + } +} + +extension Animator: LiveUpdatable { + public func updateAlignment(alignment: PresentationAlignmentProtocol, duration: Duration) throws { + guard !(presentation is SlidePresentation), var presentation = presentation as? (Presentation & PresentationAlignmentProvider) else { + throw LiveUpdateError.notSupportedOnSlide + } + + presentation.presentationAlignment = alignment + self.presentation = presentation + currentPresentationController.updatePresentation(presentation: presentation, duration: duration) + } + + public func updateVerticalAlignment(alignment: VerticalAlignment, duration: Duration) throws { + guard !(presentation is SlidePresentation), var presentation = presentation as? (Presentation & PresentationAlignmentProvider) else { + throw LiveUpdateError.notSupportedOnSlide + } + + presentation.presentationAlignment = PresentationAlignment(vertical: alignment, horizontal: presentation.presentationAlignment.horizontalAlignment) + self.presentation = presentation + currentPresentationController.updatePresentation(presentation: presentation, duration: duration) + } + + public func updateHorizontalAlignment(alignment: HorizontalAlignment, duration: Duration) throws { + guard !(presentation is SlidePresentation), var presentation = presentation as? (Presentation & PresentationAlignmentProvider) else { + throw LiveUpdateError.notSupportedOnSlide + } + + presentation.presentationAlignment = PresentationAlignment(vertical: presentation.presentationAlignment.verticalAlignemt, horizontal: alignment) + self.presentation = presentation + currentPresentationController.updatePresentation(presentation: presentation, duration: duration) + } + + public func updateSize(presentationSize: PresentationSize, duration: Duration) throws { + guard !(presentation is SlidePresentation), var presentation = presentation as? (PresentationSizeProvider & Presentation) else { + throw LiveUpdateError.notSupportedOnSlide + } + + presentation.presentationSize = presentationSize + self.presentation = presentation + currentPresentationController.updatePresentation(presentation: presentation, duration: duration) + } + + public func updateWidth(width: Size, duration: Duration) throws { + guard !(presentation is SlidePresentation) else { + throw LiveUpdateError.notSupportedOnSlide + } + + if var presentation = presentation as? FadePresentation { + presentation.presentationSize = PresentationSize(width: width, height: presentation.presentationSize.height) + self.presentation = presentation + currentPresentationController.updatePresentation(presentation: presentation, duration: duration) + } else if var presentation = presentation as? CoverPresentation { + presentation.presentationSize = PresentationSize(width: width, height: presentation.presentationSize.height) + self.presentation = presentation + currentPresentationController.updatePresentation(presentation: presentation, duration: duration) + } + } + + public func updateHeight(height: Size, duration: Duration) throws { + guard !(presentation is SlidePresentation) else { + throw LiveUpdateError.notSupportedOnSlide + } + + if var presentation = presentation as? FadePresentation { + presentation.presentationSize = PresentationSize(width: presentation.presentationSize.height, height: height) + self.presentation = presentation + currentPresentationController.updatePresentation(presentation: presentation, duration: duration) + } else if var presentation = presentation as? CoverPresentation { + presentation.presentationSize = PresentationSize(width: presentation.presentationSize.height, height: height) + self.presentation = presentation + currentPresentationController.updatePresentation(presentation: presentation, duration: duration) + } + } + + public func updateMarginGuards(marginGuards: UIEdgeInsets, duration: Duration) throws { + guard !(presentation is SlidePresentation), var presentation = presentation as? (Presentation & PresentationMarginGuardsProvider) else { + throw LiveUpdateError.notSupportedOnSlide + } + + presentation.marginGuards = marginGuards + self.presentation = presentation + currentPresentationController.updatePresentation(presentation: presentation, duration: duration) + } + + public func updateCorners(radius: CGFloat, corners: CACornerMask, duration: Duration) { + var presentation = self.presentation + presentation.presentationUIConfiguration.cornerRadius = radius + presentation.presentationUIConfiguration.corners = corners + self.presentation = presentation + currentPresentationController.updatePresentation(presentation: presentation, duration: duration) + } + +} diff --git a/Jelly/Classes/public/Constants.swift b/Jelly/Classes/public/Constants.swift new file mode 100644 index 0000000..afef1a4 --- /dev/null +++ b/Jelly/Classes/public/Constants.swift @@ -0,0 +1,6 @@ +import Foundation + +public struct Constants { + // This is only available on iOS 11 and later + static let gestureRecognizerIdentifier = "JellyInteractivePanGestureRecognizer" +} diff --git a/Jelly/Classes/public/Extensions/Size+Equatable.swift b/Jelly/Classes/public/Extensions/Size+Equatable.swift new file mode 100644 index 0000000..e145b7b --- /dev/null +++ b/Jelly/Classes/public/Extensions/Size+Equatable.swift @@ -0,0 +1,14 @@ +import Foundation + +extension Size: Equatable { + public static func == (lhs: Size, rhs: Size) -> Bool { + switch (lhs, rhs) { + case (.fullscreen,.fullscreen), (.halfscreen,.halfscreen): + return true + case (.custom(let lhsValue), .custom(let rhsValue)): + return lhsValue == rhsValue + default: + return false + } + } +} diff --git a/Jelly/Classes/public/LiveUpdateError.swift b/Jelly/Classes/public/LiveUpdateError.swift new file mode 100644 index 0000000..a52123a --- /dev/null +++ b/Jelly/Classes/public/LiveUpdateError.swift @@ -0,0 +1,5 @@ +import Foundation + +enum LiveUpdateError: Error { + case notSupportedOnSlide +} diff --git a/Jelly/Classes/public/Models/Configuration/BackgroundStyle.swift b/Jelly/Classes/public/Models/Configuration/BackgroundStyle.swift new file mode 100644 index 0000000..dbce159 --- /dev/null +++ b/Jelly/Classes/public/Models/Configuration/BackgroundStyle.swift @@ -0,0 +1,6 @@ +import Foundation + +public enum BackgroundStyle { + case dimmed(alpha: CGFloat) + case blurred(effectStyle: UIBlurEffect.Style) +} diff --git a/Jelly/Classes/public/Models/Configuration/Direction.swift b/Jelly/Classes/public/Models/Configuration/Direction.swift new file mode 100644 index 0000000..60c0185 --- /dev/null +++ b/Jelly/Classes/public/Models/Configuration/Direction.swift @@ -0,0 +1,8 @@ +import Foundation + +public enum Direction { + case top + case bottom + case left + case right +} diff --git a/Jelly/Classes/public/Models/Configuration/DragMode.swift b/Jelly/Classes/public/Models/Configuration/DragMode.swift new file mode 100644 index 0000000..2e44abc --- /dev/null +++ b/Jelly/Classes/public/Models/Configuration/DragMode.swift @@ -0,0 +1,6 @@ +import Foundation + +public enum DragMode { + case edge + case canvas +} diff --git a/Jelly/Classes/public/Models/Configuration/Duration.swift b/Jelly/Classes/public/Models/Configuration/Duration.swift new file mode 100644 index 0000000..01c491e --- /dev/null +++ b/Jelly/Classes/public/Models/Configuration/Duration.swift @@ -0,0 +1,30 @@ +import Foundation + +public enum Duration { + case custom(duration: TimeInterval) + case ultraSlow + case slow + case medium + case normal + case fast + case reallyFast + + var timeInterval: TimeInterval { + switch self { + case .custom(let duration): + return duration + case .ultraSlow: + return 2.0 + case .slow: + return 1.0 + case .medium: + return 0.5 + case .normal: + return 0.35 + case .fast: + return 0.2 + case .reallyFast: + return 0.1 + } + } +} diff --git a/Jelly/Classes/public/Models/Configuration/HorizontalAlignment.swift b/Jelly/Classes/public/Models/Configuration/HorizontalAlignment.swift new file mode 100644 index 0000000..a3e1e37 --- /dev/null +++ b/Jelly/Classes/public/Models/Configuration/HorizontalAlignment.swift @@ -0,0 +1,8 @@ +import Foundation + +public enum HorizontalAlignment { + case left + case right + case center + case custom(x: CGFloat) +} diff --git a/Jelly/Classes/public/Models/Configuration/Orientation.swift b/Jelly/Classes/public/Models/Configuration/Orientation.swift new file mode 100644 index 0000000..03c86f8 --- /dev/null +++ b/Jelly/Classes/public/Models/Configuration/Orientation.swift @@ -0,0 +1,6 @@ +import Foundation + +public enum Orientation { + case horizontal + case vertical +} diff --git a/Jelly/Classes/public/Models/Configuration/Presentation/InteractionConfiguration.swift b/Jelly/Classes/public/Models/Configuration/Presentation/InteractionConfiguration.swift new file mode 100644 index 0000000..87ce282 --- /dev/null +++ b/Jelly/Classes/public/Models/Configuration/Presentation/InteractionConfiguration.swift @@ -0,0 +1,14 @@ +import Foundation + + +public struct InteractionConfiguration { + var completionThreshold: CGFloat + var dragMode: DragMode + weak var presentingViewController: UIViewController! + + public init(presentingViewController: UIViewController, completionThreshold: CGFloat = 0.5, dragMode: DragMode) { + self.completionThreshold = completionThreshold + self.dragMode = dragMode + self.presentingViewController = presentingViewController + } +} diff --git a/Jelly/Classes/public/Models/Configuration/Presentation/PresentationAlignment.swift b/Jelly/Classes/public/Models/Configuration/Presentation/PresentationAlignment.swift new file mode 100644 index 0000000..5c0e3f8 --- /dev/null +++ b/Jelly/Classes/public/Models/Configuration/Presentation/PresentationAlignment.swift @@ -0,0 +1,15 @@ +import Foundation + +public struct PresentationAlignment: PresentationAlignmentProtocol { + public var verticalAlignemt: VerticalAlignment + public var horizontalAlignment: HorizontalAlignment + + public static var centerAlignment: PresentationAlignment { + return PresentationAlignment(vertical: .center, horizontal: .center) + } + + public init(vertical: VerticalAlignment, horizontal: HorizontalAlignment) { + self.verticalAlignemt = vertical + self.horizontalAlignment = horizontal + } +} diff --git a/Jelly/Classes/public/Models/Configuration/Presentation/PresentationSize.swift b/Jelly/Classes/public/Models/Configuration/Presentation/PresentationSize.swift new file mode 100644 index 0000000..d150663 --- /dev/null +++ b/Jelly/Classes/public/Models/Configuration/Presentation/PresentationSize.swift @@ -0,0 +1,12 @@ +import Foundation + +public struct PresentationSize: PresentationSizeProtocol { + public var width: Size + public var height: Size + + public init(width: Size = .fullscreen, + height: Size = .fullscreen) { + self.width = width + self.height = height + } +} diff --git a/Jelly/Classes/public/Models/Configuration/Presentation/PresentationTiming.swift b/Jelly/Classes/public/Models/Configuration/Presentation/PresentationTiming.swift new file mode 100644 index 0000000..ee854de --- /dev/null +++ b/Jelly/Classes/public/Models/Configuration/Presentation/PresentationTiming.swift @@ -0,0 +1,15 @@ +import Foundation + +public struct PresentationTiming: PresentationTimingProtocol { + public var duration: Duration + public var presentationCurve: UIView.AnimationCurve + public var dismissCurve: UIView.AnimationCurve + + public init(duration: Duration = .medium, + presentationCurve: UIView.AnimationCurve = .linear, + dismissCurve: UIView.AnimationCurve = .linear) { + self.duration = duration + self.presentationCurve = presentationCurve + self.dismissCurve = dismissCurve + } +} diff --git a/Jelly/Classes/public/Models/Configuration/Presentation/PresentationUIConfiguration.swift b/Jelly/Classes/public/Models/Configuration/Presentation/PresentationUIConfiguration.swift new file mode 100644 index 0000000..1232d5e --- /dev/null +++ b/Jelly/Classes/public/Models/Configuration/Presentation/PresentationUIConfiguration.swift @@ -0,0 +1,22 @@ +import Foundation + +public protocol PresentationUIConfigurationProtocol { + var cornerRadius: CGFloat { get set } + var backgroundStyle : BackgroundStyle { get set } + var isTapBackgroundToDismissEnabled : Bool { get set } + var corners: CACornerMask { get set } +} + +public struct PresentationUIConfiguration: PresentationUIConfigurationProtocol{ + public var cornerRadius: CGFloat + public var backgroundStyle: BackgroundStyle + public var isTapBackgroundToDismissEnabled: Bool + public var corners: CACornerMask + + public init(cornerRadius: CGFloat = 0.0, backgroundStyle: BackgroundStyle = .dimmed(alpha: 0.5), isTapBackgroundToDismissEnabled: Bool = true, corners: CACornerMask = [.layerMaxXMaxYCorner,.layerMaxXMinYCorner, .layerMinXMaxYCorner, .layerMinXMinYCorner]) { + self.cornerRadius = cornerRadius + self.backgroundStyle = backgroundStyle + self.isTapBackgroundToDismissEnabled = isTapBackgroundToDismissEnabled + self.corners = corners + } +} diff --git a/Jelly/Classes/public/Models/Configuration/Size.swift b/Jelly/Classes/public/Models/Configuration/Size.swift new file mode 100644 index 0000000..e587c7c --- /dev/null +++ b/Jelly/Classes/public/Models/Configuration/Size.swift @@ -0,0 +1,7 @@ +import Foundation + +public enum Size { + case fullscreen + case halfscreen + case custom(value: CGFloat) +} diff --git a/Jelly/Classes/public/Models/Configuration/Spring.swift b/Jelly/Classes/public/Models/Configuration/Spring.swift new file mode 100644 index 0000000..9a3ebc6 --- /dev/null +++ b/Jelly/Classes/public/Models/Configuration/Spring.swift @@ -0,0 +1,8 @@ +import Foundation + +public enum Spring { + case none + case tight + case medium + case loose +} diff --git a/Jelly/Classes/public/Models/Configuration/VerticalAlignment.swift b/Jelly/Classes/public/Models/Configuration/VerticalAlignment.swift new file mode 100644 index 0000000..f204be6 --- /dev/null +++ b/Jelly/Classes/public/Models/Configuration/VerticalAlignment.swift @@ -0,0 +1,9 @@ +import Foundation + +public enum VerticalAlignment { + case top + case bottom + case center + case custom(y: CGFloat) +} + diff --git a/Jelly/Classes/public/Models/Presentations/CoverPresentation.swift b/Jelly/Classes/public/Models/Presentations/CoverPresentation.swift new file mode 100644 index 0000000..7f7c909 --- /dev/null +++ b/Jelly/Classes/public/Models/Presentations/CoverPresentation.swift @@ -0,0 +1,51 @@ +public struct CoverPresentation: Presentation, + PresentationDismissDirectionProvider, + PresentationShowDirectionProvider, + PresentationMarginGuardsProvider, + PresentationSizeProvider, + PresentationAlignmentProvider, + PresentationSpringProvider, + InteractionConfigurationProvider { + + public var showDirection: Direction + public var dismissDirection: Direction + public var presentationTiming: PresentationTimingProtocol + public var presentationUIConfiguration: PresentationUIConfigurationProtocol + public var presentationSize: PresentationSizeProtocol + public var presentationAlignment: PresentationAlignmentProtocol + public var spring: Spring + public var marginGuards: UIEdgeInsets + public var interactionConfiguration: InteractionConfiguration? + + public init(directionShow: Direction, + directionDismiss: Direction, + uiConfiguration: PresentationUIConfigurationProtocol = PresentationUIConfiguration(), + size: PresentationSizeProtocol = PresentationSize(), + alignment: PresentationAlignmentProtocol = PresentationAlignment.centerAlignment, + marginGuards: UIEdgeInsets = .zero , + timing: PresentationTimingProtocol = PresentationTiming(), + spring: Spring = .none, + interactionConfiguration: InteractionConfiguration? = nil) { + + self.dismissDirection = directionDismiss + self.showDirection = directionShow + self.presentationTiming = timing + self.presentationUIConfiguration = uiConfiguration + self.presentationSize = size + self.presentationAlignment = alignment + self.spring = spring + self.marginGuards = marginGuards + self.presentationAlignment = alignment + self.interactionConfiguration = interactionConfiguration + } +} + +extension CoverPresentation: PresentationAnimatorProvider { + public var showAnimator: UIViewControllerAnimatedTransitioning { + return CoverAnimator(presentationType: .show, presentation: self) + } + + public var dismissAnimator: UIViewControllerAnimatedTransitioning { + return CoverAnimator(presentationType: .dismiss, presentation: self) + } +} diff --git a/Jelly/Classes/public/Models/Presentations/FadePresentation.swift b/Jelly/Classes/public/Models/Presentations/FadePresentation.swift new file mode 100644 index 0000000..8651864 --- /dev/null +++ b/Jelly/Classes/public/Models/Presentations/FadePresentation.swift @@ -0,0 +1,35 @@ +import UIKit + +public struct FadePresentation: Presentation, + PresentationAlignmentProvider, + PresentationSizeProvider, + PresentationMarginGuardsProvider { + + public var presentationAlignment: PresentationAlignmentProtocol + public var presentationSize: PresentationSizeProtocol + public var presentationUIConfiguration: PresentationUIConfigurationProtocol + public var marginGuards: UIEdgeInsets + public var presentationTiming: PresentationTimingProtocol + + public init(alignment: PresentationAlignmentProtocol = PresentationAlignment.centerAlignment, + size: PresentationSizeProtocol = PresentationSize(width: .fullscreen, height: .fullscreen), + marginGuards: UIEdgeInsets = .zero, + timing: PresentationTimingProtocol = PresentationTiming(duration: .normal, presentationCurve: .linear, dismissCurve: .linear ), + ui: PresentationUIConfigurationProtocol = PresentationUIConfiguration(cornerRadius: 0.0, backgroundStyle: .dimmed(alpha: 0.5), isTapBackgroundToDismissEnabled: true, corners: [.layerMaxXMaxYCorner,.layerMaxXMinYCorner, .layerMinXMaxYCorner, .layerMinXMinYCorner])) { + self.presentationAlignment = alignment + self.presentationSize = size + self.presentationTiming = timing + self.presentationUIConfiguration = ui + self.marginGuards = marginGuards + } +} + +extension FadePresentation: PresentationAnimatorProvider { + public var showAnimator: UIViewControllerAnimatedTransitioning { + return FadeAnimator(presentationType: .show, presentation: self) + } + + public var dismissAnimator: UIViewControllerAnimatedTransitioning { + return FadeAnimator(presentationType: .dismiss, presentation: self) + } +} diff --git a/Jelly/Classes/public/Models/Presentations/SlidePresentation.swift b/Jelly/Classes/public/Models/Presentations/SlidePresentation.swift new file mode 100644 index 0000000..d8f4ba2 --- /dev/null +++ b/Jelly/Classes/public/Models/Presentations/SlidePresentation.swift @@ -0,0 +1,37 @@ +import Foundation + +public struct SlidePresentation: Presentation, + PresentationShowDirectionProvider, + PresentationSingleSizeProvider, + InteractionConfigurationProvider { + public var presentationTiming: PresentationTimingProtocol + public var presentationUIConfiguration: PresentationUIConfigurationProtocol + public var showDirection: Direction + public var size: Size + public var spring: Spring + public var interactionConfiguration: InteractionConfiguration? + + public init(timing: PresentationTimingProtocol = PresentationTiming(), + uiConfiguration: PresentationUIConfigurationProtocol = PresentationUIConfiguration(), + direction: Direction = .bottom, + size: Size = .fullscreen, + spring: Spring = .none, + interactionConfiguration: InteractionConfiguration? = nil) { + self.presentationUIConfiguration = uiConfiguration + self.presentationTiming = timing + self.size = size + self.spring = spring + self.showDirection = direction + self.interactionConfiguration = interactionConfiguration + } +} + +extension SlidePresentation: PresentationAnimatorProvider { + public var showAnimator: UIViewControllerAnimatedTransitioning { + return SlideAnimator(presentationType: .show, presentation: self) + } + + public var dismissAnimator: UIViewControllerAnimatedTransitioning { + return SlideAnimator(presentationType: .dismiss, presentation: self) + } +} diff --git a/Jelly/Classes/public/Models/Protocols/InteractionConfigurationProvider.swift b/Jelly/Classes/public/Models/Protocols/InteractionConfigurationProvider.swift new file mode 100644 index 0000000..6032492 --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/InteractionConfigurationProvider.swift @@ -0,0 +1,5 @@ +import Foundation + +protocol InteractionConfigurationProvider { + var interactionConfiguration: InteractionConfiguration? { get } +} diff --git a/Jelly/Classes/public/Models/Protocols/Presentation.swift b/Jelly/Classes/public/Models/Protocols/Presentation.swift new file mode 100644 index 0000000..9e004a0 --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/Presentation.swift @@ -0,0 +1,6 @@ +import Foundation + +public protocol Presentation: PresentationTimingInformationProvider, + PresentationUIConfigurationProvider, + PresentationAnimatorProvider { +} diff --git a/Jelly/Classes/public/Models/Protocols/PresentationAlignmentProvider.swift b/Jelly/Classes/public/Models/Protocols/PresentationAlignmentProvider.swift new file mode 100644 index 0000000..1381bfc --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/PresentationAlignmentProvider.swift @@ -0,0 +1,10 @@ +import Foundation + +public protocol PresentationAlignmentProvider { + var presentationAlignment: PresentationAlignmentProtocol { get set } +} + +public protocol PresentationAlignmentProtocol { + var verticalAlignemt : VerticalAlignment { get set } + var horizontalAlignment : HorizontalAlignment { get set } +} diff --git a/Jelly/Classes/public/Models/Protocols/PresentationAnimatorProvider.swift b/Jelly/Classes/public/Models/Protocols/PresentationAnimatorProvider.swift new file mode 100644 index 0000000..a31ee64 --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/PresentationAnimatorProvider.swift @@ -0,0 +1,6 @@ +import Foundation + +public protocol PresentationAnimatorProvider { + var showAnimator: UIViewControllerAnimatedTransitioning { get } + var dismissAnimator: UIViewControllerAnimatedTransitioning { get } +} diff --git a/Jelly/Classes/public/Models/Protocols/PresentationDirectionDismissProvider.swift b/Jelly/Classes/public/Models/Protocols/PresentationDirectionDismissProvider.swift new file mode 100644 index 0000000..b6bbb48 --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/PresentationDirectionDismissProvider.swift @@ -0,0 +1,5 @@ +import Foundation + +public protocol PresentationDismissDirectionProvider { + var dismissDirection: Direction { get set } +} diff --git a/Jelly/Classes/public/Models/Protocols/PresentationDirectionShowProvider.swift b/Jelly/Classes/public/Models/Protocols/PresentationDirectionShowProvider.swift new file mode 100644 index 0000000..7c17f4c --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/PresentationDirectionShowProvider.swift @@ -0,0 +1,5 @@ +import Foundation + +public protocol PresentationShowDirectionProvider { + var showDirection: Direction { get set } +} diff --git a/Jelly/Classes/public/Models/Protocols/PresentationHeightProvider.swift b/Jelly/Classes/public/Models/Protocols/PresentationHeightProvider.swift new file mode 100644 index 0000000..0763e06 --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/PresentationHeightProvider.swift @@ -0,0 +1,5 @@ +import Foundation + +public protocol PresentationHeightProvider { + var height: Size { get set } +} diff --git a/Jelly/Classes/public/Models/Protocols/PresentationInteractiveAnimatorProvider.swift b/Jelly/Classes/public/Models/Protocols/PresentationInteractiveAnimatorProvider.swift new file mode 100644 index 0000000..3828309 --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/PresentationInteractiveAnimatorProvider.swift @@ -0,0 +1,6 @@ +import Foundation + +public protocol PresentationInteractiveAnimatorProvider { + var interactiveShowAnimator: UIViewControllerInteractiveTransitioning? { get } + var interactiveDismissAnimator: UIViewControllerInteractiveTransitioning? { get } +} diff --git a/Jelly/Classes/public/Models/Protocols/PresentationMarginGuardsProvider.swift b/Jelly/Classes/public/Models/Protocols/PresentationMarginGuardsProvider.swift new file mode 100644 index 0000000..2118dd6 --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/PresentationMarginGuardsProvider.swift @@ -0,0 +1,9 @@ +import Foundation + +public protocol PresentationMarginGuardsProvider { + /* + If the width or height is bigger than the container we are working in, + marginGuards will kick in and limit the size the specified margins + */ + var marginGuards: UIEdgeInsets { get set } +} diff --git a/Jelly/Classes/public/Models/Protocols/PresentationSingleSizeProvider.swift b/Jelly/Classes/public/Models/Protocols/PresentationSingleSizeProvider.swift new file mode 100644 index 0000000..1d2cb7b --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/PresentationSingleSizeProvider.swift @@ -0,0 +1,5 @@ +import Foundation + +public protocol PresentationSingleSizeProvider { + var size: Size { get set } +} diff --git a/Jelly/Classes/public/Models/Protocols/PresentationSizeProtocol.swift b/Jelly/Classes/public/Models/Protocols/PresentationSizeProtocol.swift new file mode 100644 index 0000000..bc9ded8 --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/PresentationSizeProtocol.swift @@ -0,0 +1,5 @@ +import Foundation + +public protocol PresentationSizeProtocol: PresentationWidthProvider, PresentationHeightProvider { + +} diff --git a/Jelly/Classes/public/Models/Protocols/PresentationSizeProvider.swift b/Jelly/Classes/public/Models/Protocols/PresentationSizeProvider.swift new file mode 100644 index 0000000..bd08a29 --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/PresentationSizeProvider.swift @@ -0,0 +1,5 @@ +import Foundation + +public protocol PresentationSizeProvider { + var presentationSize: PresentationSizeProtocol { get set } +} diff --git a/Jelly/Classes/public/Models/Protocols/PresentationSpringProvider.swift b/Jelly/Classes/public/Models/Protocols/PresentationSpringProvider.swift new file mode 100644 index 0000000..f56ca7c --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/PresentationSpringProvider.swift @@ -0,0 +1,5 @@ +import Foundation + +public protocol PresentationSpringProvider { + var spring: Spring { get set } +} diff --git a/Jelly/Classes/public/Models/Protocols/PresentationTimingInformationProvider.swift b/Jelly/Classes/public/Models/Protocols/PresentationTimingInformationProvider.swift new file mode 100644 index 0000000..d415689 --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/PresentationTimingInformationProvider.swift @@ -0,0 +1,6 @@ +import Foundation + +public protocol PresentationTimingInformationProvider { + var presentationTiming: PresentationTimingProtocol { get set} +} + diff --git a/Jelly/Classes/public/Models/Protocols/PresentationTimingProtocol.swift b/Jelly/Classes/public/Models/Protocols/PresentationTimingProtocol.swift new file mode 100644 index 0000000..2f2da66 --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/PresentationTimingProtocol.swift @@ -0,0 +1,7 @@ +import Foundation + +public protocol PresentationTimingProtocol { + var duration: Duration { get set } + var presentationCurve : UIView.AnimationCurve { get set } + var dismissCurve : UIView.AnimationCurve { get set } +} diff --git a/Jelly/Classes/public/Models/Protocols/PresentationUIConfigurationProvider.swift b/Jelly/Classes/public/Models/Protocols/PresentationUIConfigurationProvider.swift new file mode 100644 index 0000000..68d40cc --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/PresentationUIConfigurationProvider.swift @@ -0,0 +1,7 @@ +import Foundation + +public protocol PresentationUIConfigurationProvider { + var presentationUIConfiguration: PresentationUIConfigurationProtocol { get set } +} + + diff --git a/Jelly/Classes/public/Models/Protocols/PresentationWidthProvider.swift b/Jelly/Classes/public/Models/Protocols/PresentationWidthProvider.swift new file mode 100644 index 0000000..01d6991 --- /dev/null +++ b/Jelly/Classes/public/Models/Protocols/PresentationWidthProvider.swift @@ -0,0 +1,5 @@ +import Foundation + +public protocol PresentationWidthProvider { + var width: Size { get set } +} diff --git a/README.md b/README.md index 3a7e312..9e35591 100644 --- a/README.md +++ b/README.md @@ -1,181 +1,175 @@ +![Jelly-Animators: Elegant Viewcontroller Animations in Swift](https://github.com/SebastianBoldt/Jelly/blob/feature/2.0.0/Github/Jellyfish.png?raw=true) -# Jelly -##### (2.0 Coming soon, including dynamic resizing and interactive transitions) -#### Create rich viewcontroller transition animations with just a few lines of code - -![Jelly-Animators: Elegant Viewcontroller Animations in Swift](https://github.com/SebastianBoldt/Jelly/blob/master/Github/Jellyfish.png) - -current version +current version +current version twitter handle Swift 4.2 compatible -platform +platform carthage support license -Jelly provides custom view controller transitions with just a few lines of code. -No need to create your own Presentation-Controller or Animator objects. -A Jelly-Animator will do the heavy lifting for you. +Jelly is a library for animated, non-interactive & interactive viewcontroller
+transitions and presentations with the focus on a simple and yet flexible API. + + + + + + + + + + +With a few lines of source code, interactive UIViewController transitions
+and custom resizable UIViewController presentations can be created,
+without the use of the cumbersome UIKit Transitioning API. + +```swift -## 📱 Example +var slidePresentation = SlidePresentation(direction: .left) +let animator = Animator(presentation: slidePresentation) +animator.prepare(viewController: viewController) +present(viewController, animated: true, completion: nil) +``` -You can use Jelly to build your own Alertviews or Slidein-Menus using ViewControllers designed by yourself. + -![Jelly-Animators: Elegant Viewcontroller Animations in Swift](https://github.com/SebastianBoldt/Jelly/blob/master/Github/notification.gif?raw=true) ![Jelly-Animators: Elegant Viewcontroller Animations in Swift](https://github.com/SebastianBoldt/Jelly/blob/master/Github/slideover.gif?raw=true) +1. Create a `Presentation` Object +2. Configure an `Animator` with the *Presentation* +3. Call the `prepare` Function +4. Use the native `UIViewController` presentation function. -![Jelly-Animators: Elegant Viewcontroller Animations in Swift](https://github.com/SebastianBoldt/Jelly/blob/master/Github/shiftindimmed.gif?raw=true) ![Jelly-Animators: Elegant Viewcontroller Animations in Swift](https://github.com/SebastianBoldt/Jelly/blob/master/Github/shiftinblurred.gif?raw=true) +```swift +class ViewController : UIViewController { + var animator: Jelly.Animator? + override func viewDidLoad() { + super.viewDidLoad() + let viewController = YourViewController() + let presentation = SlidePresentation(direction: .left) + animator = Animator(presentation:presentation) + animator?.prepare(presentedViewController: viewController) + present(viewController, animated: true, completion: nil) + } +} +``` -![Jelly-Animators: Elegant Viewcontroller Animations in Swift](https://github.com/SebastianBoldt/Jelly/blob/master/Github/fadin.gif?raw=true) ![Jelly-Animators: Elegant Viewcontroller Animations in Swift](https://github.com/SebastianBoldt/Jelly/blob/master/Github/blurredslidein.gif?raw=true) +***DO NOT FORGET TO KEEP A STRONG 💪 REFERENCE*** +Because the `transitioningDelegate` of a `UIViewController` is weak, you need to +hold a strong reference to the `Animator` inside the `UIViewController` you are presenting from or +the central object that maintains your presentations. -To run the example project, clone the repo, and run `pod install` from the Example directory first. + -## 🔧How to use +Interactive transitions can be activated for the *slide* and the *cover* transitions. +If the transitions are to be interactive, only an `InteractionConfiguration` object has to be passed to the presentation. -Jelly is super easy to use. + + + + -1. Create a *JellyPresentation* Object (SlideIn, FadeIn or ShiftIn) -2. Initialize a *JellyAnimator* using the *JellyPresentation* Object created in Step 1. -3. Call the *prepare(viewController:UIViewController)* Function -4. Finally call the native *UIViewController* presentation function. +Here 2 parameters play an important role. First, the `completionThreshold`, which determines the percentage of the animation that is automatically completed as soon as the user finishes the interaction. +The second parameter is the actual type of interaction. Jelly offers the `.edge` and the `.canvas` type. +In an `.edge` transition, the user must execute the gesture from the edge of the screen. +When using the `.canvas` type, gesture recognizers are configured so that direct interaction with the presenting and presented view leads to the transition. ```swift -override func viewDidLoad() { - super.viewDidLoad() - let viewController = self.storyboard.instantiateViewController(withIdentifier: "someViewController") - //1. - let presentation = JellySlideInPresentation() - //2. - self.jellyAnimator = JellyAnimator(presentation:presentation) - //3. - self.jellyAnimator?.prepare(viewController: viewController) - //4. - self.present(viewController, animated: true, completion: nil) -} +let viewController = YourViewController() +let interaction = InteractionConfiguration(presentingViewController: self, completionThreshold: 0.5, dragMode: .edge) +let presentation = SlidePresentation(direction: .right, interactionConfiguration: interaction) +let animator = Animator(presentation: presentation) +animator.prepare(presentedViewController: viewController) ``` + -***DO NOT FORGET TO KEEP A STRONG 💪 REFERENCE*** +Jelly 2.0 also provides a new feature called *LIVE UPDATE*. +Using Jellys new `Live Update API` it is now possible to update the alignment, size and margin guards when the viewcontroller is already visible. -Because the *transitioningDelegate* of a *UIViewController* is weak, you need to -hold a strong reference to the *JellyAnimator* inside the *UIViewController* you are presenting from or the central object that maintains your presentations. + + -```swift -class CustomVC : UIViewController { - var jellyAnimator: JellyAnimator? - override func viewDidLoad() { - super.viewDidLoad() - var shiftInPresentation = JellyShiftInPresentation() - shiftInPresentation.direction = .left - let animator = JellyAnnimator(presentation:presentation) - self.jellyAnimator = animator - } -} -``` +These are the new live update functions provided by the Animator. -That's it. That's lit. - -## 🖌 Customize -Jelly offers 3 types of Presentations for you: -* **JellySlideInPresentation** -* **JellyShiftInPresentation** -* **JellyFadeInPresentation** - -Not every property is available for each animation. -Check out the interfaces of each class to learn more about them. - -* **duration:** JellyConstants.Duration (default: normal) - * ultraSlow = 2.0 - * slow = 1.0 - * medium = 0.5 - * normal = 0.35 - * fast = 0.2 - * reallyFast = 0.1 -* **backgroundStyle:** JellyConstants.BackgroundStyle (default: .dimmed(0.5)) - * dimmed(alpha: CGFloat) - * blur(effectStyle: UIBlurEffectStyle) - * if you want a transparent background use .dimmed(alpha:0.0) -* **cornerRadius:** Double (default: 0) -* **corners:** UIRectCorner (default: .allCorners) - * define which corners the radius should be applied to -* **presentationCurve:** JellyConstants.JellyCurve (default: linear) - * easeIn - * easeOut - * easeInEaseOut - * linear -* **dismissCurve:** JellyConstants.JellyCurve (default: linear) - * easeIn - * easeOut - * easeInEaseOut -    * linear -* **isTapBackgroundToDismissEnabled** (default: true) - * tapping the background dismisses the ViewController by default - * set it to false to prevent this behavior -* **widthForViewController:** JellyConstants.Size (default: fullscreen) - * If the container is smaller than the provided width, Jelly will automatically resize to the containers width - * if Margin Guards are specified they also will be applied if width is to wide for the container -* **heightForViewController:** JellyConstants.Size (default: fullscreen) - * If the container is smaller than the provided height, Jelly will automatically resize to the containers width - * if Margin Guards are specified they also will be applied when height is to high for the container -* **horizontalAlignment:** JellyConstants.HorizontalAlignment (default: .center) - * center, left or right -* **verticalAlignemt:** JellyConstants.VerticalAlignment (default:center) - * top, bottom, center -* **marginGuards:** default(UIEdgeInsets.zero) - * If the width or height is bigger than the container we are working with, marginGuards will kick in and limit the size using the specified margins -* **directionShow:** JellyConstants.Direction (default: top) - * left, top, bottom, right -* **directionDismiss:** JellyConstants.Direction (default: top) - * left, top, bottom, right -* **jellyness:** (default: none) - * none (damping = 1.0, velocity = 0.0) - * jelly (damping = 0.7, velocity = 2) - * jellier (damping = 0.5 , velocity = 3) - * jelliest (damping = 0.2, velocity = 4) +* `updateAlignment(alignment: PresentationAlignment, duration: Duration)` - Cover & Fade +* `updateVerticalAlignment(alignment: VerticalAlignment, duration: Duration)` - Cover & Fade +* `updateHorizontalAlignment(alignment: HorizontalAlignment, duration: Duration)` - Cover & Fade +* `updateSize(presentationSize: PresentationSize, duration: Duration)` - Cover & Fade +* `updateWidth(width: Size, duration: Duration)` - Cover, Fade and horizontal Slide +* `updateHeight(height: Size, duration: Duration)` - Cover, Fade and vertical Slide +* `updateMarginGuards(marginGuards: UIEdgeInsets, duration: Duration)` - Cover & Fade +* `updateCorners(radius: CGFloat, corners: CACornerMask, duration: Duration)` - Cover & Fade & Slide -```swift +Some of them will throw an exception if used on a wrong presentationType.
+For example: a width update can not be performed on vertical slide transitions because it always has full width or height depending on the direction type. -let customPresentation = JellySlideInPresentation(dismissCurve: .linear, - presentationCurve: .linear, - cornerRadius: 15, - backgroundStyle: .blur(effectStyle: .light), - jellyness: .jellier, - duration: .normal, - directionShow: .top, - directionDismiss: .top, - widthForViewController: .fullscreen, - heightForViewController: .custom(value:200) , - horizontalAlignment: .center, - verticalAlignment: .top, - marginGuards: UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10), - corners: [.topLeft,.bottomRight]) - - -self.jellyAnimator = JellyAnimator(presentation:customPresentation) -self.jellyAnimator?.prepare(viewController: viewController) -self.present(viewController, animated: true, completion: nil) -``` + + +The presentation types can be configured with various settings: + +* `size` +* `margin guards` +* `direction` +* `horizontal & vertical alignment` +* `dimmed and blurred backgroundStyle` +* `duration` +* `presentation and dismiss curve` +* `spring damping & velocity` +* `corner specification` & `corner radius` +* `completion threshold` +* `interactive drag mode` -## ✅ Requirements +Each component is explained in more detail in the Jelly Wiki. -Deployment target of your App is >= iOS 8.0 -## 📲 Installation + + +Deployment target of your App is >= iOS 11.0 + + + Jelly is available through [CocoaPods](http://cocoapods.org). To install it, simply add the following line to your Podfile: ```ruby -pod "Jelly" +pod 'Jelly', '~> 2.0' ``` -## 🗣 Mentions + + * Mentioned in iOS Dev Weekly by @Dave Verwer - Issue NO. 112 * Mentioned in This Week in Swift by @Natasha the Robot - Issue No. 279 -## 🤖 Author + + + + +Sebastian Boldt, https://www.sebastianboldt.com + +I am a mobile software architect and developer specializing in iOS. +Passionate about creating awesome user experiences, designing beautiful user interfaces, +and writing maintainable, structured, and best-practice orientated code. +Continuously trying to improve skills and learn new technologies. -Sebastian Boldt, www.sebastianboldt.com +current version -## 📄 License + Jelly is available under the MIT license. See the LICENSE file for more info.