From d9c7840323bebe65d218091ac107d0f75189d155 Mon Sep 17 00:00:00 2001 From: Felix Mau Date: Mon, 7 Mar 2022 20:50:11 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20::=20Update=20example=20ap?= =?UTF-8?q?plication?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .swift-version | 2 +- Example/.swiftlint.yml | 7 +- Example/Example.xcodeproj/project.pbxproj | 724 +++++++ .../contents.xcworkspacedata | 2 +- .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../contents.xcworkspacedata | 2 +- .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 98 + Example/Example/Assets.xcassets/Contents.json | 6 + Example/Example/ExampleApp.swift | 31 + Example/Example/Helper/StoryboardView.swift | 28 + .../Preview Assets.xcassets/Contents.json | 6 + .../AdvancedExample.storyboard | 76 + .../AdvancedExampleViewController.swift | 129 ++ .../BasicExample/BasicExample.storyboard | 64 + .../BasicExampleViewController.swift | 21 +- Example/Example/Scenes/EntryPointView.swift | 97 + .../InterfaceBuilderExample.storyboard | 77 + ...nterfaceBuilderExampleViewController.swift | 21 +- .../NavigationBarExample.storyboard | 83 + .../NavigationBarExampleViewController.swift | 41 +- .../SafeAreaExample.storyboard | 92 + .../SafeAreaExampleViewController.swift | 22 +- .../SwiftUIExample/SwiftUIExampleView.swift | 22 + Example/ExampleTests/ExampleTests.swift | 34 + .../project.pbxproj | 903 -------- .../GradientLoadingBar-Example.xcscheme | 132 -- .../AdvancedExampleViewController.swift | 105 - Example/GradientLoadingBar/AppDelegate.swift | 52 - .../Base.lproj/LaunchScreen.xib | 42 - .../Base.lproj/Main.storyboard | 489 ----- .../Extensions/UIColor+CustomColors.swift | 16 - Example/GradientLoadingBar/Info.plist | 41 - .../Views/BlueBorderedButton.swift | 37 - .../Views/BlueFilledButton.swift | 41 - .../Views/LargeNavigationBarHeaderView.swift | 85 - Example/Podfile | 15 +- Example/Podfile.lock | 8 +- .../GradientLoadingBar.podspec.json | 2 +- Example/Pods/Manifest.lock | 8 +- Example/Pods/Pods.xcodeproj/project.pbxproj | 1795 ++++++---------- Example/Pods/SnapshotTesting/LICENSE | 21 - Example/Pods/SnapshotTesting/README.md | 244 --- .../AssertInlineSnapshot.swift | 326 --- .../SnapshotTesting/AssertSnapshot.swift | 313 --- .../Sources/SnapshotTesting/Async.swift | 39 - .../SnapshotTesting/Common/Internal.swift | 11 - .../SnapshotTesting/Common/PlistEncoder.swift | 1828 ----------------- .../Common/String+SpecialCharacters.swift | 57 - .../Sources/SnapshotTesting/Common/View.swift | 891 -------- .../Common/XCTAttachment.swift | 8 - .../Sources/SnapshotTesting/Diff.swift | 125 -- .../Sources/SnapshotTesting/Diffing.swift | 34 - .../SnapshotTesting/Extensions/Wait.swift | 27 - .../SnapshotTesting/SnapshotTestCase.swift | 4 - .../SnapshotTesting/Snapshotting.swift | 106 - .../SnapshotTesting/Snapshotting/Any.swift | 142 -- .../Snapshotting/CALayer.swift | 49 - .../SnapshotTesting/Snapshotting/CGPath.swift | 126 -- .../Snapshotting/CaseIterable.swift | 25 - .../Snapshotting/Codable.swift | 40 - .../SnapshotTesting/Snapshotting/Data.swift | 17 - .../Snapshotting/Description.swift | 7 - .../Snapshotting/NSBezierPath.swift | 93 - .../Snapshotting/NSImage.swift | 125 -- .../SnapshotTesting/Snapshotting/NSView.swift | 48 - .../Snapshotting/NSViewController.swift | 26 - .../Snapshotting/SceneKit.swift | 42 - .../Snapshotting/SpriteKit.swift | 42 - .../SnapshotTesting/Snapshotting/String.swift | 26 - .../Snapshotting/SwiftUIView.swift | 83 - .../Snapshotting/UIBezierPath.swift | 46 - .../Snapshotting/UIImage.swift | 140 -- .../SnapshotTesting/Snapshotting/UIView.swift | 65 - .../Snapshotting/UIViewController.swift | 114 - .../Snapshotting/URLRequest.swift | 83 - .../Pods-Example-Info.plist} | 0 .../Pods-Example-acknowledgements.markdown} | 0 .../Pods-Example-acknowledgements.plist} | 0 .../Pods-Example/Pods-Example-dummy.m | 5 + ...le-frameworks-Debug-input-files.xcfilelist | 3 + ...e-frameworks-Debug-output-files.xcfilelist | 2 + ...-frameworks-Release-input-files.xcfilelist | 3 + ...frameworks-Release-output-files.xcfilelist | 2 + .../Pods-Example-frameworks.sh} | 0 .../Pods-Example-umbrella.h} | 4 + .../Pods-Example.debug.xcconfig} | 0 .../Pods-Example/Pods-Example.modulemap | 6 + .../Pods-Example.release.xcconfig} | 0 .../Pods-ExampleTests-Info.plist} | 0 ...ds-ExampleTests-acknowledgements.markdown} | 0 .../Pods-ExampleTests-acknowledgements.plist} | 0 .../Pods-ExampleTests-dummy.m | 5 + .../Pods-ExampleTests-umbrella.h} | 4 +- .../Pods-ExampleTests.debug.xcconfig} | 0 .../Pods-ExampleTests.modulemap | 6 + .../Pods-ExampleTests.release.xcconfig} | 0 .../Pods-GradientLoadingBar_Example-dummy.m | 5 - ...ds-GradientLoadingBar_Example-resources.sh | 118 -- ...Pods-GradientLoadingBar_Example-umbrella.h | 16 - .../Pods-GradientLoadingBar_Example.modulemap | 6 - ...radientLoadingBar_SnapshotTests-Info.plist | 26 - ...ar_SnapshotTests-acknowledgements.markdown | 28 - ...ngBar_SnapshotTests-acknowledgements.plist | 60 - ...s-GradientLoadingBar_SnapshotTests-dummy.m | 5 - ...ientLoadingBar_SnapshotTests-frameworks.sh | 186 -- ...radientLoadingBar_SnapshotTests-umbrella.h | 16 - ...entLoadingBar_SnapshotTests.debug.xcconfig | 16 - ...GradientLoadingBar_SnapshotTests.modulemap | 6 - ...tLoadingBar_SnapshotTests.release.xcconfig | 16 - .../Pods-GradientLoadingBar_Tests/Info.plist | 26 - .../Pods-GradientLoadingBar_Tests-Info.plist | 26 - .../Pods-GradientLoadingBar_Tests-dummy.m | 5 - ...ods-GradientLoadingBar_Tests-frameworks.sh | 146 -- ...Pods-GradientLoadingBar_Tests-resources.sh | 118 -- .../Pods-GradientLoadingBar_Tests-umbrella.h | 16 - .../Pods-GradientLoadingBar_Tests.modulemap | 6 - .../SnapshotTesting-Info.plist | 26 - .../SnapshotTesting/SnapshotTesting-dummy.m | 5 - .../SnapshotTesting.debug.xcconfig | 18 - .../SnapshotTesting/SnapshotTesting.modulemap | 6 - .../SnapshotTesting.release.xcconfig | 18 - .../SnapshotTesting/SnapshotTesting.xcconfig | 13 - .../CustomColorSnapshotTestCase.swift | 42 - .../DefaultColorSnapshotTestCase.swift | 33 - ...wShouldContainCorrectColorsInitially.1.png | Bin 18704 -> 0 bytes ...wShouldContainCorrectColorsInitially.1.png | Bin 22566 -> 0 bytes ...GradientLoadingBarControllerTestCase.swift | 49 - ...GradientLoadingBarControllerTestCase.swift | 51 - .../testGradientLoadingBarController.1.png | Bin 88660 -> 0 bytes ...estNotchGradientLoadingBarController.1.png | Bin 95687 -> 0 bytes Example/SnapshotTests/Info.plist | 22 - Example/SnapshotTests/README.md | 4 - .../_Helper/Snapshotting+WindowedImage.swift | 44 - Example/Tests/Info.plist | 24 - ...ntActivityIndicatorViewModelTestCase.swift | 243 --- .../GradientLoadingBarViewModelTestCase.swift | 121 -- ...hGradientLoadingBarViewModelTestCase.swift | 76 - ...ndicatorView+AnimateIsHiddenTestCase.swift | 207 -- GradientLoadingBar.podspec | 4 +- GradientLoadingBar/Assets/.gitkeep | 0 .../GradientLoadingBarController.swift | 0 .../{Classes => }/Misc/Constants.swift | 0 .../NotchGradientLoadingBarController.swift | 4 +- .../GradientActivityIndicatorViewModel.swift | 2 +- .../GradientLoadingBarViewModel.swift | 0 .../NotchGradientLoadingBarViewModel.swift | 0 ...ctivityIndicatorView+AnimateIsHidden.swift | 2 +- .../Views/GradientActivityIndicatorView.swift | 0 150 files changed, 2398 insertions(+), 10351 deletions(-) create mode 100644 Example/Example.xcodeproj/project.pbxproj rename Example/{GradientLoadingBar.xcodeproj => Example.xcodeproj}/project.xcworkspace/contents.xcworkspacedata (66%) rename Example/{GradientLoadingBar.xcworkspace => Example.xcodeproj/project.xcworkspace}/xcshareddata/IDEWorkspaceChecks.plist (100%) rename Example/{GradientLoadingBar.xcworkspace => Example.xcworkspace}/contents.xcworkspacedata (76%) create mode 100644 Example/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Example/Example/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Example/Example/Assets.xcassets/Contents.json create mode 100644 Example/Example/ExampleApp.swift create mode 100644 Example/Example/Helper/StoryboardView.swift create mode 100644 Example/Example/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 Example/Example/Scenes/AdvancedExample/AdvancedExample.storyboard create mode 100644 Example/Example/Scenes/AdvancedExample/AdvancedExampleViewController.swift create mode 100644 Example/Example/Scenes/BasicExample/BasicExample.storyboard rename Example/{GradientLoadingBar => Example/Scenes/BasicExample}/BasicExampleViewController.swift (52%) create mode 100644 Example/Example/Scenes/EntryPointView.swift create mode 100644 Example/Example/Scenes/InterfaceBuilderExample/InterfaceBuilderExample.storyboard rename Example/{GradientLoadingBar => Example/Scenes/InterfaceBuilderExample}/InterfaceBuilderExampleViewController.swift (56%) create mode 100644 Example/Example/Scenes/NavigationBarExample/NavigationBarExample.storyboard rename Example/{GradientLoadingBar => Example/Scenes/NavigationBarExample}/NavigationBarExampleViewController.swift (73%) create mode 100644 Example/Example/Scenes/SafeAreaExample/SafeAreaExample.storyboard rename Example/{GradientLoadingBar => Example/Scenes/SafeAreaExample}/SafeAreaExampleViewController.swift (68%) create mode 100644 Example/Example/Scenes/SwiftUIExample/SwiftUIExampleView.swift create mode 100644 Example/ExampleTests/ExampleTests.swift delete mode 100644 Example/GradientLoadingBar.xcodeproj/project.pbxproj delete mode 100644 Example/GradientLoadingBar.xcodeproj/xcshareddata/xcschemes/GradientLoadingBar-Example.xcscheme delete mode 100644 Example/GradientLoadingBar/AdvancedExampleViewController.swift delete mode 100644 Example/GradientLoadingBar/AppDelegate.swift delete mode 100644 Example/GradientLoadingBar/Base.lproj/LaunchScreen.xib delete mode 100644 Example/GradientLoadingBar/Base.lproj/Main.storyboard delete mode 100644 Example/GradientLoadingBar/Extensions/UIColor+CustomColors.swift delete mode 100644 Example/GradientLoadingBar/Info.plist delete mode 100644 Example/GradientLoadingBar/Views/BlueBorderedButton.swift delete mode 100644 Example/GradientLoadingBar/Views/BlueFilledButton.swift delete mode 100644 Example/GradientLoadingBar/Views/LargeNavigationBarHeaderView.swift delete mode 100644 Example/Pods/SnapshotTesting/LICENSE delete mode 100644 Example/Pods/SnapshotTesting/README.md delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/AssertInlineSnapshot.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/AssertSnapshot.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Async.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/Internal.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/PlistEncoder.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/String+SpecialCharacters.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/View.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/XCTAttachment.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Diff.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Diffing.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Extensions/Wait.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/SnapshotTestCase.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Any.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/CALayer.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/CGPath.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/CaseIterable.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Codable.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Data.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Description.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/NSBezierPath.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/NSImage.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/NSView.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/NSViewController.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/SceneKit.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/SpriteKit.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/String.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/SwiftUIView.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIBezierPath.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIImage.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIView.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIViewController.swift delete mode 100644 Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/URLRequest.swift rename Example/Pods/Target Support Files/{Pods-GradientLoadingBar_Example/Info.plist => Pods-Example/Pods-Example-Info.plist} (100%) rename Example/Pods/Target Support Files/{Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-acknowledgements.markdown => Pods-Example/Pods-Example-acknowledgements.markdown} (100%) rename Example/Pods/Target Support Files/{Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-acknowledgements.plist => Pods-Example/Pods-Example-acknowledgements.plist} (100%) create mode 100644 Example/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m create mode 100644 Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-input-files.xcfilelist create mode 100644 Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-output-files.xcfilelist create mode 100644 Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-input-files.xcfilelist create mode 100644 Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-output-files.xcfilelist rename Example/Pods/Target Support Files/{Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-frameworks.sh => Pods-Example/Pods-Example-frameworks.sh} (100%) rename Example/Pods/Target Support Files/{SnapshotTesting/SnapshotTesting-prefix.pch => Pods-Example/Pods-Example-umbrella.h} (61%) rename Example/Pods/Target Support Files/{Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.debug.xcconfig => Pods-Example/Pods-Example.debug.xcconfig} (100%) create mode 100644 Example/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap rename Example/Pods/Target Support Files/{Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.release.xcconfig => Pods-Example/Pods-Example.release.xcconfig} (100%) rename Example/Pods/Target Support Files/{Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-Info.plist => Pods-ExampleTests/Pods-ExampleTests-Info.plist} (100%) rename Example/Pods/Target Support Files/{Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-acknowledgements.markdown => Pods-ExampleTests/Pods-ExampleTests-acknowledgements.markdown} (100%) rename Example/Pods/Target Support Files/{Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-acknowledgements.plist => Pods-ExampleTests/Pods-ExampleTests-acknowledgements.plist} (100%) create mode 100644 Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests-dummy.m rename Example/Pods/Target Support Files/{SnapshotTesting/SnapshotTesting-umbrella.h => Pods-ExampleTests/Pods-ExampleTests-umbrella.h} (60%) rename Example/Pods/Target Support Files/{Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.debug.xcconfig => Pods-ExampleTests/Pods-ExampleTests.debug.xcconfig} (100%) create mode 100644 Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests.modulemap rename Example/Pods/Target Support Files/{Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.release.xcconfig => Pods-ExampleTests/Pods-ExampleTests.release.xcconfig} (100%) delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-dummy.m delete mode 100755 Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-resources.sh delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-umbrella.h delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.modulemap delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-Info.plist delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-acknowledgements.markdown delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-acknowledgements.plist delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-dummy.m delete mode 100755 Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-frameworks.sh delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-umbrella.h delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.debug.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.modulemap delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.release.xcconfig delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Info.plist delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-Info.plist delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-dummy.m delete mode 100755 Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-frameworks.sh delete mode 100755 Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-resources.sh delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-umbrella.h delete mode 100644 Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.modulemap delete mode 100644 Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-Info.plist delete mode 100644 Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-dummy.m delete mode 100644 Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.debug.xcconfig delete mode 100644 Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.modulemap delete mode 100644 Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.release.xcconfig delete mode 100644 Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.xcconfig delete mode 100644 Example/SnapshotTests/GradientActivityIndicatorView/CustomColorSnapshotTestCase.swift delete mode 100644 Example/SnapshotTests/GradientActivityIndicatorView/DefaultColorSnapshotTestCase.swift delete mode 100644 Example/SnapshotTests/GradientActivityIndicatorView/__Snapshots__/CustomColorSnapshotTestCase/testGradientProgressIndicatorViewShouldContainCorrectColorsInitially.1.png delete mode 100644 Example/SnapshotTests/GradientActivityIndicatorView/__Snapshots__/DefaultColorSnapshotTestCase/testGradientProgressIndicatorViewShouldContainCorrectColorsInitially.1.png delete mode 100644 Example/SnapshotTests/GradientLoadingBarController/GradientLoadingBarControllerTestCase.swift delete mode 100644 Example/SnapshotTests/GradientLoadingBarController/NotchGradientLoadingBarControllerTestCase.swift delete mode 100644 Example/SnapshotTests/GradientLoadingBarController/__Snapshots__/GradientLoadingBarControllerTestCase/testGradientLoadingBarController.1.png delete mode 100644 Example/SnapshotTests/GradientLoadingBarController/__Snapshots__/NotchGradientLoadingBarControllerTestCase/testNotchGradientLoadingBarController.1.png delete mode 100644 Example/SnapshotTests/Info.plist delete mode 100644 Example/SnapshotTests/README.md delete mode 100644 Example/SnapshotTests/_Helper/Snapshotting+WindowedImage.swift delete mode 100644 Example/Tests/Info.plist delete mode 100644 Example/Tests/ViewModel/GradientActivityIndicatorViewModelTestCase.swift delete mode 100644 Example/Tests/ViewModel/GradientLoadingBarViewModelTestCase.swift delete mode 100644 Example/Tests/ViewModel/NotchGradientLoadingBarViewModelTestCase.swift delete mode 100644 Example/Tests/Views/GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift delete mode 100644 GradientLoadingBar/Assets/.gitkeep rename GradientLoadingBar/{Classes => }/GradientLoadingBarController.swift (100%) rename GradientLoadingBar/{Classes => }/Misc/Constants.swift (100%) rename GradientLoadingBar/{Classes => }/NotchGradientLoadingBarController.swift (98%) rename GradientLoadingBar/{Classes => }/ViewModel/GradientActivityIndicatorViewModel.swift (99%) rename GradientLoadingBar/{Classes => }/ViewModel/GradientLoadingBarViewModel.swift (100%) rename GradientLoadingBar/{Classes => }/ViewModel/NotchGradientLoadingBarViewModel.swift (100%) rename GradientLoadingBar/{Classes => }/Views/GradientActivityIndicatorView+AnimateIsHidden.swift (99%) rename GradientLoadingBar/{Classes => }/Views/GradientActivityIndicatorView.swift (100%) diff --git a/.swift-version b/.swift-version index a75b92f..9ad974f 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -5.1 +5.5 diff --git a/Example/.swiftlint.yml b/Example/.swiftlint.yml index 8bb590b..6275d0e 100644 --- a/Example/.swiftlint.yml +++ b/Example/.swiftlint.yml @@ -1,4 +1,4 @@ -# +# # .swiftlint.yml # Created by Felix Mau (https://felix.hamburg) # @@ -10,7 +10,7 @@ file_header: required_pattern: | \/\/ \/\/ SWIFTLINT_CURRENT_FILENAME - \/\/ (GradientLoadingBar|GradientLoadingBar_Example|GradientLoadingBar_Tests|GradientLoadingBar_SnapshotTests) + \/\/ (GradientLoadingBar|Example|ExampleTests|ExampleSnapshotTests) \/\/ \/\/ Created by .*? on \d{2}\.\d{2}\.\d{2}\. \/\/ Copyright © \d{4} .*?\. All rights reserved\. @@ -23,5 +23,4 @@ included: excluded: - Pods -parent_config: Pods/SwiftConfigurationFiles/.swiftlint.yml - +parent_config: Pods/SwiftConfigurationFiles/.swiftlint.yml \ No newline at end of file diff --git a/Example/Example.xcodeproj/project.pbxproj b/Example/Example.xcodeproj/project.pbxproj new file mode 100644 index 0000000..5284be8 --- /dev/null +++ b/Example/Example.xcodeproj/project.pbxproj @@ -0,0 +1,724 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 55; + objects = { + +/* Begin PBXBuildFile section */ + 8A0BF2A649F852F27812AA32 /* Pods_ExampleTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28825A77907675CA26D91A13 /* Pods_ExampleTests.framework */; }; + DC4E50A16A3B84900FBD1981 /* Pods_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12DDBD589B02F5D3C9C3AF69 /* Pods_Example.framework */; }; + DCA9833A27D68AD400D6EA30 /* ExampleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA9833927D68AD400D6EA30 /* ExampleApp.swift */; }; + DCA9833E27D68AD600D6EA30 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DCA9833D27D68AD600D6EA30 /* Assets.xcassets */; }; + DCA9834127D68AD600D6EA30 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DCA9834027D68AD600D6EA30 /* Preview Assets.xcassets */; }; + DCA9834B27D68AD600D6EA30 /* ExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA9834A27D68AD600D6EA30 /* ExampleTests.swift */; }; + DCA9836927D68E3500D6EA30 /* StoryboardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA9836827D68E3500D6EA30 /* StoryboardView.swift */; }; + DCA9836C27D6905000D6EA30 /* EntryPointView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA9836B27D6905000D6EA30 /* EntryPointView.swift */; }; + DCA9837127D6912300D6EA30 /* BasicExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA9837027D6912300D6EA30 /* BasicExampleViewController.swift */; }; + DCA9837627D693BB00D6EA30 /* BasicExample.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DCA9837527D693BB00D6EA30 /* BasicExample.storyboard */; }; + DCA9837827D6951C00D6EA30 /* SafeAreaExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA9837727D6951C00D6EA30 /* SafeAreaExampleViewController.swift */; }; + DCA9837A27D6958500D6EA30 /* SafeAreaExample.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DCA9837927D6958500D6EA30 /* SafeAreaExample.storyboard */; }; + DCA9837C27D69B5900D6EA30 /* InterfaceBuilderExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA9837B27D69B5900D6EA30 /* InterfaceBuilderExampleViewController.swift */; }; + DCA9837E27D69B8E00D6EA30 /* InterfaceBuilderExample.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DCA9837D27D69B8E00D6EA30 /* InterfaceBuilderExample.storyboard */; }; + DCA9838027D69C9300D6EA30 /* AdvancedExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA9837F27D69C9300D6EA30 /* AdvancedExampleViewController.swift */; }; + DCA9838227D69D3F00D6EA30 /* AdvancedExample.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DCA9838127D69D3F00D6EA30 /* AdvancedExample.storyboard */; }; + DCA9838727D6A44700D6EA30 /* NavigationBarExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA9838627D6A44700D6EA30 /* NavigationBarExampleViewController.swift */; }; + DCA9838927D6A55A00D6EA30 /* NavigationBarExample.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DCA9838827D6A55A00D6EA30 /* NavigationBarExample.storyboard */; }; + DCA9838B27D6A74800D6EA30 /* SwiftUIExampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA9838A27D6A74800D6EA30 /* SwiftUIExampleView.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + DCA9834727D68AD600D6EA30 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DCA9832E27D68AD400D6EA30 /* Project object */; + proxyType = 1; + remoteGlobalIDString = DCA9833527D68AD400D6EA30; + remoteInfo = Example; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 12DDBD589B02F5D3C9C3AF69 /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 28825A77907675CA26D91A13 /* Pods_ExampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ExampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3299012A62A2E4310D02CD78 /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.release.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.release.xcconfig"; sourceTree = ""; }; + 8546348DA9E4805657E6F366 /* Pods-ExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExampleTests.debug.xcconfig"; path = "Target Support Files/Pods-ExampleTests/Pods-ExampleTests.debug.xcconfig"; sourceTree = ""; }; + A84CFB3E33CA7C6024D463AF /* Pods-ExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExampleTests.release.xcconfig"; path = "Target Support Files/Pods-ExampleTests/Pods-ExampleTests.release.xcconfig"; sourceTree = ""; }; + DCA9833627D68AD400D6EA30 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + DCA9833927D68AD400D6EA30 /* ExampleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleApp.swift; sourceTree = ""; }; + DCA9833D27D68AD600D6EA30 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + DCA9834027D68AD600D6EA30 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + DCA9834627D68AD600D6EA30 /* ExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + DCA9834A27D68AD600D6EA30 /* ExampleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleTests.swift; sourceTree = ""; }; + DCA9836827D68E3500D6EA30 /* StoryboardView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoryboardView.swift; sourceTree = ""; }; + DCA9836B27D6905000D6EA30 /* EntryPointView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EntryPointView.swift; sourceTree = ""; }; + DCA9837027D6912300D6EA30 /* BasicExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicExampleViewController.swift; sourceTree = ""; }; + DCA9837527D693BB00D6EA30 /* BasicExample.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = BasicExample.storyboard; sourceTree = ""; }; + DCA9837727D6951C00D6EA30 /* SafeAreaExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafeAreaExampleViewController.swift; sourceTree = ""; }; + DCA9837927D6958500D6EA30 /* SafeAreaExample.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = SafeAreaExample.storyboard; sourceTree = ""; }; + DCA9837B27D69B5900D6EA30 /* InterfaceBuilderExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InterfaceBuilderExampleViewController.swift; sourceTree = ""; }; + DCA9837D27D69B8E00D6EA30 /* InterfaceBuilderExample.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = InterfaceBuilderExample.storyboard; sourceTree = ""; }; + DCA9837F27D69C9300D6EA30 /* AdvancedExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedExampleViewController.swift; sourceTree = ""; }; + DCA9838127D69D3F00D6EA30 /* AdvancedExample.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = AdvancedExample.storyboard; sourceTree = ""; }; + DCA9838627D6A44700D6EA30 /* NavigationBarExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarExampleViewController.swift; sourceTree = ""; }; + DCA9838827D6A55A00D6EA30 /* NavigationBarExample.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = NavigationBarExample.storyboard; sourceTree = ""; }; + DCA9838A27D6A74800D6EA30 /* SwiftUIExampleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIExampleView.swift; sourceTree = ""; }; + FAA1A12E84EBC1F48401EB10 /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.debug.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + DCA9833327D68AD400D6EA30 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + DC4E50A16A3B84900FBD1981 /* Pods_Example.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DCA9834327D68AD600D6EA30 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8A0BF2A649F852F27812AA32 /* Pods_ExampleTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 33D2CE217238EAE7A5515634 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 12DDBD589B02F5D3C9C3AF69 /* Pods_Example.framework */, + 28825A77907675CA26D91A13 /* Pods_ExampleTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + A6AC3866473F1A669D221CA4 /* Pods */ = { + isa = PBXGroup; + children = ( + FAA1A12E84EBC1F48401EB10 /* Pods-Example.debug.xcconfig */, + 3299012A62A2E4310D02CD78 /* Pods-Example.release.xcconfig */, + 8546348DA9E4805657E6F366 /* Pods-ExampleTests.debug.xcconfig */, + A84CFB3E33CA7C6024D463AF /* Pods-ExampleTests.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + DCA9832D27D68AD400D6EA30 = { + isa = PBXGroup; + children = ( + DCA9833827D68AD400D6EA30 /* Example */, + DCA9834927D68AD600D6EA30 /* ExampleTests */, + DCA9833727D68AD400D6EA30 /* Products */, + A6AC3866473F1A669D221CA4 /* Pods */, + 33D2CE217238EAE7A5515634 /* Frameworks */, + ); + sourceTree = ""; + }; + DCA9833727D68AD400D6EA30 /* Products */ = { + isa = PBXGroup; + children = ( + DCA9833627D68AD400D6EA30 /* Example.app */, + DCA9834627D68AD600D6EA30 /* ExampleTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + DCA9833827D68AD400D6EA30 /* Example */ = { + isa = PBXGroup; + children = ( + DCA9836727D68E3500D6EA30 /* Helper */, + DCA9836A27D68E3C00D6EA30 /* Scenes */, + DCA9833927D68AD400D6EA30 /* ExampleApp.swift */, + DCA9833D27D68AD600D6EA30 /* Assets.xcassets */, + DCA9833F27D68AD600D6EA30 /* Preview Content */, + ); + path = Example; + sourceTree = ""; + }; + DCA9833F27D68AD600D6EA30 /* Preview Content */ = { + isa = PBXGroup; + children = ( + DCA9834027D68AD600D6EA30 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + DCA9834927D68AD600D6EA30 /* ExampleTests */ = { + isa = PBXGroup; + children = ( + DCA9834A27D68AD600D6EA30 /* ExampleTests.swift */, + ); + path = ExampleTests; + sourceTree = ""; + }; + DCA9836727D68E3500D6EA30 /* Helper */ = { + isa = PBXGroup; + children = ( + DCA9836827D68E3500D6EA30 /* StoryboardView.swift */, + ); + path = Helper; + sourceTree = ""; + }; + DCA9836A27D68E3C00D6EA30 /* Scenes */ = { + isa = PBXGroup; + children = ( + DCA9836E27D6909A00D6EA30 /* AdvancedExample */, + DCA9836D27D6908F00D6EA30 /* BasicExample */, + DCA9837327D691B600D6EA30 /* InterfaceBuilderExample */, + DCA9837427D691C600D6EA30 /* NavigationBarExample */, + DCA9837227D691A200D6EA30 /* SafeAreaExample */, + DCA9836F27D690A400D6EA30 /* SwiftUIExample */, + DCA9836B27D6905000D6EA30 /* EntryPointView.swift */, + ); + path = Scenes; + sourceTree = ""; + }; + DCA9836D27D6908F00D6EA30 /* BasicExample */ = { + isa = PBXGroup; + children = ( + DCA9837527D693BB00D6EA30 /* BasicExample.storyboard */, + DCA9837027D6912300D6EA30 /* BasicExampleViewController.swift */, + ); + path = BasicExample; + sourceTree = ""; + }; + DCA9836E27D6909A00D6EA30 /* AdvancedExample */ = { + isa = PBXGroup; + children = ( + DCA9838127D69D3F00D6EA30 /* AdvancedExample.storyboard */, + DCA9837F27D69C9300D6EA30 /* AdvancedExampleViewController.swift */, + ); + path = AdvancedExample; + sourceTree = ""; + }; + DCA9836F27D690A400D6EA30 /* SwiftUIExample */ = { + isa = PBXGroup; + children = ( + DCA9838A27D6A74800D6EA30 /* SwiftUIExampleView.swift */, + ); + path = SwiftUIExample; + sourceTree = ""; + }; + DCA9837227D691A200D6EA30 /* SafeAreaExample */ = { + isa = PBXGroup; + children = ( + DCA9837927D6958500D6EA30 /* SafeAreaExample.storyboard */, + DCA9837727D6951C00D6EA30 /* SafeAreaExampleViewController.swift */, + ); + path = SafeAreaExample; + sourceTree = ""; + }; + DCA9837327D691B600D6EA30 /* InterfaceBuilderExample */ = { + isa = PBXGroup; + children = ( + DCA9837D27D69B8E00D6EA30 /* InterfaceBuilderExample.storyboard */, + DCA9837B27D69B5900D6EA30 /* InterfaceBuilderExampleViewController.swift */, + ); + path = InterfaceBuilderExample; + sourceTree = ""; + }; + DCA9837427D691C600D6EA30 /* NavigationBarExample */ = { + isa = PBXGroup; + children = ( + DCA9838827D6A55A00D6EA30 /* NavigationBarExample.storyboard */, + DCA9838627D6A44700D6EA30 /* NavigationBarExampleViewController.swift */, + ); + path = NavigationBarExample; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + DCA9833527D68AD400D6EA30 /* Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = DCA9835A27D68AD600D6EA30 /* Build configuration list for PBXNativeTarget "Example" */; + buildPhases = ( + 52082F0E9B4B579867A82146 /* [CP] Check Pods Manifest.lock */, + DCA9833227D68AD400D6EA30 /* Sources */, + DCA9833327D68AD400D6EA30 /* Frameworks */, + DCA9833427D68AD400D6EA30 /* Resources */, + C56CF067D28EB40785524B49 /* [CP] Embed Pods Frameworks */, + DCA9836527D68D6400D6EA30 /* SwiftFormat */, + DCA9836627D68D7000D6EA30 /* SwiftLint */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Example; + productName = Example; + productReference = DCA9833627D68AD400D6EA30 /* Example.app */; + productType = "com.apple.product-type.application"; + }; + DCA9834527D68AD600D6EA30 /* ExampleTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = DCA9835D27D68AD600D6EA30 /* Build configuration list for PBXNativeTarget "ExampleTests" */; + buildPhases = ( + 765F099D280F5648383C9020 /* [CP] Check Pods Manifest.lock */, + DCA9834227D68AD600D6EA30 /* Sources */, + DCA9834327D68AD600D6EA30 /* Frameworks */, + DCA9834427D68AD600D6EA30 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + DCA9834827D68AD600D6EA30 /* PBXTargetDependency */, + ); + name = ExampleTests; + productName = ExampleTests; + productReference = DCA9834627D68AD600D6EA30 /* ExampleTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + DCA9832E27D68AD400D6EA30 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1320; + LastUpgradeCheck = 1320; + TargetAttributes = { + DCA9833527D68AD400D6EA30 = { + CreatedOnToolsVersion = 13.2.1; + }; + DCA9834527D68AD600D6EA30 = { + CreatedOnToolsVersion = 13.2.1; + TestTargetID = DCA9833527D68AD400D6EA30; + }; + }; + }; + buildConfigurationList = DCA9833127D68AD400D6EA30 /* Build configuration list for PBXProject "Example" */; + compatibilityVersion = "Xcode 13.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = DCA9832D27D68AD400D6EA30; + productRefGroup = DCA9833727D68AD400D6EA30 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + DCA9833527D68AD400D6EA30 /* Example */, + DCA9834527D68AD600D6EA30 /* ExampleTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + DCA9833427D68AD400D6EA30 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DCA9834127D68AD600D6EA30 /* Preview Assets.xcassets in Resources */, + DCA9837A27D6958500D6EA30 /* SafeAreaExample.storyboard in Resources */, + DCA9837627D693BB00D6EA30 /* BasicExample.storyboard in Resources */, + DCA9838227D69D3F00D6EA30 /* AdvancedExample.storyboard in Resources */, + DCA9833E27D68AD600D6EA30 /* Assets.xcassets in Resources */, + DCA9838927D6A55A00D6EA30 /* NavigationBarExample.storyboard in Resources */, + DCA9837E27D69B8E00D6EA30 /* InterfaceBuilderExample.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DCA9834427D68AD600D6EA30 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 52082F0E9B4B579867A82146 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Example-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 765F099D280F5648383C9020 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ExampleTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + C56CF067D28EB40785524B49 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + DCA9836527D68D6400D6EA30 /* SwiftFormat */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = SwiftFormat; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "SWIFTFORMAT=\"${PODS_ROOT}/SwiftFormat/CommandLineTool/swiftformat\"\nif [ ! -f \"$SWIFTFORMAT\" ]; then\n echo \"warning: SwiftFormat not installed!\"\n exit 1\nfi\n\n$SWIFTFORMAT ../ --config \"${PODS_ROOT}/SwiftConfigurationFiles/.swiftformat\"\n"; + }; + DCA9836627D68D7000D6EA30 /* SwiftLint */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = SwiftLint; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "SWIFTLINT=\"${PODS_ROOT}/SwiftLint/swiftlint\"\nif [ ! -f \"$SWIFTLINT\" ]; then\n echo \"warning: SwiftLint not installed!\"\n exit 1\nfi\n\n$SWIFTLINT\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + DCA9833227D68AD400D6EA30 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DCA9837127D6912300D6EA30 /* BasicExampleViewController.swift in Sources */, + DCA9833A27D68AD400D6EA30 /* ExampleApp.swift in Sources */, + DCA9838027D69C9300D6EA30 /* AdvancedExampleViewController.swift in Sources */, + DCA9836927D68E3500D6EA30 /* StoryboardView.swift in Sources */, + DCA9836C27D6905000D6EA30 /* EntryPointView.swift in Sources */, + DCA9837827D6951C00D6EA30 /* SafeAreaExampleViewController.swift in Sources */, + DCA9838727D6A44700D6EA30 /* NavigationBarExampleViewController.swift in Sources */, + DCA9838B27D6A74800D6EA30 /* SwiftUIExampleView.swift in Sources */, + DCA9837C27D69B5900D6EA30 /* InterfaceBuilderExampleViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DCA9834227D68AD600D6EA30 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DCA9834B27D68AD600D6EA30 /* ExampleTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + DCA9834827D68AD600D6EA30 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DCA9833527D68AD400D6EA30 /* Example */; + targetProxy = DCA9834727D68AD600D6EA30 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + DCA9835827D68AD600D6EA30 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + 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; + 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 = ( + "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 = 15.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + DCA9835927D68AD600D6EA30 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + 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; + 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_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 = 15.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + DCA9835B27D68AD600D6EA30 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FAA1A12E84EBC1F48401EB10 /* Pods-Example.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"Example/Preview Content\""; + DEVELOPMENT_TEAM = F63GJC2AN7; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = hamburg.felix.gradientLoadingBar.example.Example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + DCA9835C27D68AD600D6EA30 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3299012A62A2E4310D02CD78 /* Pods-Example.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"Example/Preview Content\""; + DEVELOPMENT_TEAM = F63GJC2AN7; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = hamburg.felix.gradientLoadingBar.example.Example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + DCA9835E27D68AD600D6EA30 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8546348DA9E4805657E6F366 /* Pods-ExampleTests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = F63GJC2AN7; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = hamburg.felix.gradientLoadingBar.example.ExampleTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Example.app/Example"; + }; + name = Debug; + }; + DCA9835F27D68AD600D6EA30 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A84CFB3E33CA7C6024D463AF /* Pods-ExampleTests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = F63GJC2AN7; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.2; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = hamburg.felix.gradientLoadingBar.example.ExampleTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Example.app/Example"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + DCA9833127D68AD400D6EA30 /* Build configuration list for PBXProject "Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DCA9835827D68AD600D6EA30 /* Debug */, + DCA9835927D68AD600D6EA30 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DCA9835A27D68AD600D6EA30 /* Build configuration list for PBXNativeTarget "Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DCA9835B27D68AD600D6EA30 /* Debug */, + DCA9835C27D68AD600D6EA30 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DCA9835D27D68AD600D6EA30 /* Build configuration list for PBXNativeTarget "ExampleTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DCA9835E27D68AD600D6EA30 /* Debug */, + DCA9835F27D68AD600D6EA30 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = DCA9832E27D68AD400D6EA30 /* Project object */; +} diff --git a/Example/GradientLoadingBar.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 66% rename from Example/GradientLoadingBar.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 9d8a6fe..919434a 100644 --- a/Example/GradientLoadingBar.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/Example/GradientLoadingBar.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from Example/GradientLoadingBar.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Example/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Example/GradientLoadingBar.xcworkspace/contents.xcworkspacedata b/Example/Example.xcworkspace/contents.xcworkspacedata similarity index 76% rename from Example/GradientLoadingBar.xcworkspace/contents.xcworkspacedata rename to Example/Example.xcworkspace/contents.xcworkspacedata index 15907d8..a37cf19 100644 --- a/Example/GradientLoadingBar.xcworkspace/contents.xcworkspacedata +++ b/Example/Example.xcworkspace/contents.xcworkspacedata @@ -2,7 +2,7 @@ + location = "group:Example.xcodeproj"> diff --git a/Example/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Example/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Example/Example/Assets.xcassets/AccentColor.colorset/Contents.json b/Example/Example/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/Example/Example/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example/Example/Assets.xcassets/Contents.json b/Example/Example/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Example/Example/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example/Example/ExampleApp.swift b/Example/Example/ExampleApp.swift new file mode 100644 index 0000000..82786fc --- /dev/null +++ b/Example/Example/ExampleApp.swift @@ -0,0 +1,31 @@ +// +// ExampleApp.swift +// Example +// +// Created by Felix Mau on 07.03.22. +// Copyright © 2022 Felix Mau. All rights reserved. +// + +import SwiftUI + +@main +struct ExampleApp: App { + var body: some Scene { + WindowGroup { + EntryPointView() + .onAppear { + // Use iOS 13 navigation bar appearance. + // + // While the entry point scene looks better with an opaque navigation background, the child scenes look + // better with the default navigation background. As we can't update the appearance per scene we fallback + // to an appearance with the default background here. + // + // Based on: https://sarunw.com/posts/uinavigationbar-changes-in-ios13/ + let appearance = UINavigationBarAppearance() + appearance.configureWithDefaultBackground() + + UINavigationBar.appearance().scrollEdgeAppearance = appearance + } + } + } +} diff --git a/Example/Example/Helper/StoryboardView.swift b/Example/Example/Helper/StoryboardView.swift new file mode 100644 index 0000000..d88818b --- /dev/null +++ b/Example/Example/Helper/StoryboardView.swift @@ -0,0 +1,28 @@ +// +// StoryboardView.swift +// Example +// +// Created by Felix Mau on 02.02.22. +// Copyright © 2022 Felix Mau. All rights reserved. +// + +import SwiftUI + +struct StoryboardView: UIViewControllerRepresentable { + // MARK: - Public properties + + let name: String + + // MARK: - Public properties + + func makeUIViewController(context _: Context) -> UIViewController { + let storyboard = UIStoryboard(name: name, bundle: nil) + guard let viewController = storyboard.instantiateInitialViewController() else { + fatalError("⚠️ – Could not instantiate initial view controller for storyboard with name `\(name)`.") + } + + return viewController + } + + func updateUIViewController(_: UIViewController, context _: Context) {} +} diff --git a/Example/Example/Preview Content/Preview Assets.xcassets/Contents.json b/Example/Example/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Example/Example/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example/Example/Scenes/AdvancedExample/AdvancedExample.storyboard b/Example/Example/Scenes/AdvancedExample/AdvancedExample.storyboard new file mode 100644 index 0000000..aba4332 --- /dev/null +++ b/Example/Example/Scenes/AdvancedExample/AdvancedExample.storyboard @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Example/Scenes/AdvancedExample/AdvancedExampleViewController.swift b/Example/Example/Scenes/AdvancedExample/AdvancedExampleViewController.swift new file mode 100644 index 0000000..ac7e284 --- /dev/null +++ b/Example/Example/Scenes/AdvancedExample/AdvancedExampleViewController.swift @@ -0,0 +1,129 @@ +// +// AdvancedExampleViewController.swift +// Example +// +// Created by Felix Mau on 07.03.22. +// Copyright © 2022 Felix Mau. All rights reserved. +// + +import UIKit +import SwiftUI +import GradientLoadingBar + +final class AdvancedExampleViewController: UIViewController { + // MARK: - Config + + private enum Config { + /// The programatically applied height of the `GradientActivityIndicatorView`. + static let height: CGFloat = 3.5 + } + + // MARK: - Outlets + + @IBOutlet private var customSuperviewButton: BorderedButton! + @IBOutlet private var customColorsButton: UIButton! + + // MARK: - Private properties + + private let customSuperviewGradientActivityIndicatorView = GradientActivityIndicatorView() + private let customColorsGradientLoadingBar = GradientLoadingBar() + + // MARK: - Public methods + + override func viewDidLoad() { + super.viewDidLoad() + + setupCustomSuperviewGradientActivityIndicatorView() + setupCustomColorsGradientLoadingBar() + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + // Reset any possible visible loading bar. + customSuperviewGradientActivityIndicatorView.fadeOut() + customColorsGradientLoadingBar.fadeOut() + } + + // MARK: - Private methods + + private func setupCustomSuperviewGradientActivityIndicatorView() { + customSuperviewGradientActivityIndicatorView.isHidden = true + customSuperviewGradientActivityIndicatorView.alpha = 0 + + customSuperviewGradientActivityIndicatorView.translatesAutoresizingMaskIntoConstraints = false + customSuperviewButton.addSubview(customSuperviewGradientActivityIndicatorView) + + NSLayoutConstraint.activate([ + customSuperviewGradientActivityIndicatorView.leadingAnchor.constraint(equalTo: customSuperviewButton.leadingAnchor), + customSuperviewGradientActivityIndicatorView.trailingAnchor.constraint(equalTo: customSuperviewButton.trailingAnchor), + + customSuperviewGradientActivityIndicatorView.topAnchor.constraint(equalTo: customSuperviewButton.topAnchor), + customSuperviewGradientActivityIndicatorView.heightAnchor.constraint(equalToConstant: Config.height), + ]) + } + + private func setupCustomColorsGradientLoadingBar() { + // Source: https://color.adobe.com/Pink-Flamingo-color-theme-10343714/ + customColorsGradientLoadingBar.gradientColors = [ + #colorLiteral(red: 0.9490196078, green: 0.3215686275, blue: 0.431372549, alpha: 1), #colorLiteral(red: 0.9450980392, green: 0.4784313725, blue: 0.5921568627, alpha: 1), #colorLiteral(red: 0.9529411765, green: 0.737254902, blue: 0.7843137255, alpha: 1), #colorLiteral(red: 0.4274509804, green: 0.8666666667, blue: 0.9490196078, alpha: 1), #colorLiteral(red: 0.7568627451, green: 0.9411764706, blue: 0.9568627451, alpha: 1), + ] + } + + @IBAction private func toggleCustomSuperviewButtonTouchUpInside(_: Any) { + if customSuperviewGradientActivityIndicatorView.isHidden { + customSuperviewGradientActivityIndicatorView.fadeIn() + } else { + customSuperviewGradientActivityIndicatorView.fadeOut() + } + } + + @IBAction private func toggleCustomColorsButtonTouchUpInside(_: Any) { + // TODO: Add `isHidden` shortcut + if customColorsGradientLoadingBar.gradientActivityIndicatorView.isHidden { + customColorsGradientLoadingBar.fadeIn() + } else { + customColorsGradientLoadingBar.fadeOut() + } + } +} + +// MARK: - Helpers + +/// +/// +@IBDesignable +final class BorderedButton: UIButton { + private enum Config { + static let borderColor = #colorLiteral(red: 0.2862745098, green: 0.5647058824, blue: 0.8862745098, alpha: 1) + } + + override init(frame: CGRect) { + super.init(frame: frame) + + commonInit() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + + commonInit() + } + + private func commonInit() { + backgroundColor = .clear + tintColor = Config.borderColor + + layer.borderColor = Config.borderColor.cgColor + layer.borderWidth = 1 + layer.cornerRadius = 4 + layer.masksToBounds = true + } +} + +struct AdvancedExampleView: View { + var body: some View { + StoryboardView(name: "AdvancedExample") + .navigationTitle("🚀 Advanced Example") + } +} diff --git a/Example/Example/Scenes/BasicExample/BasicExample.storyboard b/Example/Example/Scenes/BasicExample/BasicExample.storyboard new file mode 100644 index 0000000..6478e90 --- /dev/null +++ b/Example/Example/Scenes/BasicExample/BasicExample.storyboard @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/GradientLoadingBar/BasicExampleViewController.swift b/Example/Example/Scenes/BasicExample/BasicExampleViewController.swift similarity index 52% rename from Example/GradientLoadingBar/BasicExampleViewController.swift rename to Example/Example/Scenes/BasicExample/BasicExampleViewController.swift index 1287eb7..a7fae8a 100644 --- a/Example/GradientLoadingBar/BasicExampleViewController.swift +++ b/Example/Example/Scenes/BasicExample/BasicExampleViewController.swift @@ -1,23 +1,27 @@ // // BasicExampleViewController.swift -// GradientLoadingBar_Example +// Example // -// Created by Felix Mau on 30.09.17. -// Copyright © 2017 Felix Mau. All rights reserved. +// Created by Felix Mau on 07.03.22. +// Copyright © 2022 Felix Mau. All rights reserved. // import UIKit +import SwiftUI import GradientLoadingBar -class BasicExampleViewController: UIViewController { +final class BasicExampleViewController: UIViewController { // MARK: - Public methods override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) + // Reset any possible visible loading bar. GradientLoadingBar.shared.fadeOut() } + // MARK: - Private methods + @IBAction private func showButtonTouchUpInside(_: Any) { GradientLoadingBar.shared.fadeIn() } @@ -26,3 +30,12 @@ class BasicExampleViewController: UIViewController { GradientLoadingBar.shared.fadeOut() } } + +// MARK: - Helpers + +struct BasicExampleView: View { + var body: some View { + StoryboardView(name: "BasicExample") + .navigationTitle("🏡 Basic Example") + } +} diff --git a/Example/Example/Scenes/EntryPointView.swift b/Example/Example/Scenes/EntryPointView.swift new file mode 100644 index 0000000..2559e74 --- /dev/null +++ b/Example/Example/Scenes/EntryPointView.swift @@ -0,0 +1,97 @@ +// +// EntryPointView.swift +// Example +// +// Created by Felix Mau on 07.03.22. +// Copyright © 2022 Felix Mau. All rights reserved. +// + +import SwiftUI + +struct EntryPointView: View { + // MARK: - Private properties + + @State + private var isNavigationBarExampleVisible = false + + // MARK: - Render + + var body: some View { + NavigationView { + List { + Section(header: Text("Example Application")) { + NavigationLink(destination: BasicExampleView()) { + TitleSubtitleView(title: "🏡 Basic Example", + subtitle: "Basic usage and setup.") + } + + NavigationLink(destination: SafeAreaExampleView()) { + TitleSubtitleView(title: "📲 Safe Area Example", + subtitle: "Loading bar ignoring the safe area.") + } + + NavigationLink(destination: InterfaceBuilderExampleView()) { + TitleSubtitleView(title: "🎨 Interface Builder Example", + subtitle: "Setup in a storyboard or xib.") + } + + NavigationLink(destination: AdvancedExampleView()) { + TitleSubtitleView(title: "🚀 Advanced Example", + subtitle: "How to apply e.g. custom colors.") + } + + Button { + isNavigationBarExampleVisible = true + } label: { + TitleSubtitleView(title: "🧭 Navigation Bar Example", + subtitle: "Attach the loading bar to a navigation bar.") + // Make entire row tappable and not just the text. + .frame(maxWidth: .infinity, alignment: .leading) + .contentShape(Rectangle()) + } + .buttonStyle(PlainButtonStyle()) + + NavigationLink(destination: SwiftUIExampleView()) { + TitleSubtitleView(title: "🪄 SwiftUI Example", + subtitle: "How to use in a SwiftUI context.") + } + } + } + // We present the `NavigationBarExampleView` as a sheet using it's own navigation controller. + // The `NavigationView` passed from SwiftUI isn't accessible from a `UIViewController` in a way, that we can add subviews to it. + .sheet(isPresented: $isNavigationBarExampleVisible) { + NavigationBarExampleView() + } + // Unfortunately setting the title here results in constraint warnings. + // I couldn't find a possible fix yet, even `.navigationViewStyle(.stack)` doesn't seem to work. + // https://stackoverflow.com/q/65316497 + .navigationTitle("GradientProgressBar") + .navigationBarTitleDisplayMode(.large) + } + } +} + +// MARK: - Subviews + +private struct TitleSubtitleView: View { + let title: String + let subtitle: String + + var body: some View { + VStack(alignment: .leading, spacing: 8) { + Text(title) + .font(.headline) + Text(subtitle) + .font(.subheadline) + } + .padding(.vertical, 8) + } +} + +// MARK: - Preview + +struct EntryPointView_Previews: PreviewProvider { + static var previews: some View { + EntryPointView() + } +} diff --git a/Example/Example/Scenes/InterfaceBuilderExample/InterfaceBuilderExample.storyboard b/Example/Example/Scenes/InterfaceBuilderExample/InterfaceBuilderExample.storyboard new file mode 100644 index 0000000..2750cfe --- /dev/null +++ b/Example/Example/Scenes/InterfaceBuilderExample/InterfaceBuilderExample.storyboard @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/GradientLoadingBar/InterfaceBuilderExampleViewController.swift b/Example/Example/Scenes/InterfaceBuilderExample/InterfaceBuilderExampleViewController.swift similarity index 56% rename from Example/GradientLoadingBar/InterfaceBuilderExampleViewController.swift rename to Example/Example/Scenes/InterfaceBuilderExample/InterfaceBuilderExampleViewController.swift index 031bc33..5b4d82f 100644 --- a/Example/GradientLoadingBar/InterfaceBuilderExampleViewController.swift +++ b/Example/Example/Scenes/InterfaceBuilderExample/InterfaceBuilderExampleViewController.swift @@ -1,15 +1,16 @@ // // InterfaceBuilderExampleViewController.swift -// GradientLoadingBar_Example +// Example // -// Created by Felix Mau on 12.10.19. -// Copyright © 2018 Felix Mau. All rights reserved. +// Created by Felix Mau on 07.03.22. +// Copyright © 2022 Felix Mau. All rights reserved. // import UIKit +import SwiftUI import GradientLoadingBar -class InterfaceBuilderExampleViewController: UIViewController { +final class InterfaceBuilderExampleViewController: UIViewController { // MARK: - Outlets @IBOutlet private var gradientActivityIndicatorView: GradientActivityIndicatorView! @@ -19,9 +20,12 @@ class InterfaceBuilderExampleViewController: UIViewController { override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) + // Reset any possible visible loading bar. gradientActivityIndicatorView.fadeOut() } + // MARK: - Private methods + @IBAction private func showButtonTouchUpInside(_: Any) { gradientActivityIndicatorView.fadeIn() } @@ -30,3 +34,12 @@ class InterfaceBuilderExampleViewController: UIViewController { gradientActivityIndicatorView.fadeOut() } } + +// MARK: - Helpers + +struct InterfaceBuilderExampleView: View { + var body: some View { + StoryboardView(name: "InterfaceBuilderExample") + .navigationTitle("🎨 Interface Builder Example") + } +} diff --git a/Example/Example/Scenes/NavigationBarExample/NavigationBarExample.storyboard b/Example/Example/Scenes/NavigationBarExample/NavigationBarExample.storyboard new file mode 100644 index 0000000..d40b4d2 --- /dev/null +++ b/Example/Example/Scenes/NavigationBarExample/NavigationBarExample.storyboard @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/GradientLoadingBar/NavigationBarExampleViewController.swift b/Example/Example/Scenes/NavigationBarExample/NavigationBarExampleViewController.swift similarity index 73% rename from Example/GradientLoadingBar/NavigationBarExampleViewController.swift rename to Example/Example/Scenes/NavigationBarExample/NavigationBarExampleViewController.swift index 1b23060..235a9de 100644 --- a/Example/GradientLoadingBar/NavigationBarExampleViewController.swift +++ b/Example/Example/Scenes/NavigationBarExample/NavigationBarExampleViewController.swift @@ -1,15 +1,16 @@ // // NavigationBarExampleViewController.swift -// GradientLoadingBar_Example +// Example // -// Created by Felix Mau on 29.08.18. -// Copyright © 2018 Felix Mau. All rights reserved. +// Created by Felix Mau on 07.03.22. +// Copyright © 2022 Felix Mau. All rights reserved. // import UIKit +import SwiftUI import GradientLoadingBar -class NavigationBarExampleViewController: UIViewController { +final class NavigationBarExampleViewController: UIViewController { // MARK: - Config private enum Config { @@ -26,20 +27,16 @@ class NavigationBarExampleViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + let barButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTapped)) + navigationItem.rightBarButtonItem = barButtonItem + setupGradientProgressIndicatorView() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) - gradientProgressIndicatorView.fadeOut() - } - - @IBAction private func showButtonTouchUpInside(_: Any) { - gradientProgressIndicatorView.fadeIn() - } - - @IBAction private func hideButtonTouchUpInside(_: Any) { + // Reset any possible visible loading bar. gradientProgressIndicatorView.fadeOut() } @@ -61,4 +58,24 @@ class NavigationBarExampleViewController: UIViewController { gradientProgressIndicatorView.heightAnchor.constraint(equalToConstant: Config.height), ]) } + + @IBAction private func doneButtonTapped(_: Any) { + dismiss(animated: true) + } + + @IBAction private func showButtonTouchUpInside(_: Any) { + gradientProgressIndicatorView.fadeIn() + } + + @IBAction private func hideButtonTouchUpInside(_: Any) { + gradientProgressIndicatorView.fadeOut() + } +} + +// MARK: - Helpers + +struct NavigationBarExampleView: View { + var body: some View { + StoryboardView(name: "NavigationBarExample") + } } diff --git a/Example/Example/Scenes/SafeAreaExample/SafeAreaExample.storyboard b/Example/Example/Scenes/SafeAreaExample/SafeAreaExample.storyboard new file mode 100644 index 0000000..2be1f00 --- /dev/null +++ b/Example/Example/Scenes/SafeAreaExample/SafeAreaExample.storyboard @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/GradientLoadingBar/SafeAreaExampleViewController.swift b/Example/Example/Scenes/SafeAreaExample/SafeAreaExampleViewController.swift similarity index 68% rename from Example/GradientLoadingBar/SafeAreaExampleViewController.swift rename to Example/Example/Scenes/SafeAreaExample/SafeAreaExampleViewController.swift index 48ad54c..ce54bdb 100644 --- a/Example/GradientLoadingBar/SafeAreaExampleViewController.swift +++ b/Example/Example/Scenes/SafeAreaExample/SafeAreaExampleViewController.swift @@ -1,19 +1,19 @@ // // SafeAreaExampleViewController.swift -// GradientLoadingBar_Example +// Example // -// Created by Felix Mau on 30.08.18. -// Copyright © 2018 Felix Mau. All rights reserved. +// Created by Felix Mau on 07.03.22. +// Copyright © 2022 Felix Mau. All rights reserved. // import UIKit +import SwiftUI import GradientLoadingBar -class SafeAreaExampleViewController: UIViewController { +final class SafeAreaExampleViewController: UIViewController { // MARK: - Private properties private let gradientLoadingBar = GradientLoadingBar(isRelativeToSafeArea: false) - private let notchGradientLoadingBar = NotchGradientLoadingBar(isRelativeToSafeArea: false) // MARK: - Public methods @@ -21,10 +21,13 @@ class SafeAreaExampleViewController: UIViewController { override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) + // Reset any possible visible loading bar. gradientLoadingBar.fadeOut() notchGradientLoadingBar.fadeOut() } + // MARK: - Private methods + @IBAction private func showBasicBarButtonTouchUpInside(_: Any) { gradientLoadingBar.fadeIn() } @@ -41,3 +44,12 @@ class SafeAreaExampleViewController: UIViewController { notchGradientLoadingBar.fadeOut() } } + +// MARK: - Helpers + +struct SafeAreaExampleView: View { + var body: some View { + StoryboardView(name: "SafeAreaExample") + .navigationTitle("📲 Safe Area Example") + } +} diff --git a/Example/Example/Scenes/SwiftUIExample/SwiftUIExampleView.swift b/Example/Example/Scenes/SwiftUIExample/SwiftUIExampleView.swift new file mode 100644 index 0000000..bae9062 --- /dev/null +++ b/Example/Example/Scenes/SwiftUIExample/SwiftUIExampleView.swift @@ -0,0 +1,22 @@ +// +// SwiftUIExampleView.swift +// Example +// +// Created by Felix Mau on 07.03.22. +// Copyright © 2022 Felix Mau. All rights reserved. +// + +import SwiftUI + +struct SwiftUIExampleView: View { + var body: some View { + Text("Coming soon!") + .navigationTitle("🎨 SwiftUI Example") + } +} + +struct SwiftUIExampleView_Previews: PreviewProvider { + static var previews: some View { + SwiftUIExampleView() + } +} diff --git a/Example/ExampleTests/ExampleTests.swift b/Example/ExampleTests/ExampleTests.swift new file mode 100644 index 0000000..643b940 --- /dev/null +++ b/Example/ExampleTests/ExampleTests.swift @@ -0,0 +1,34 @@ +// +// ExampleTests.swift +// ExampleTests +// +// Created by Felix Mau on 07.03.22. +// + +import XCTest +@testable import Example + +class ExampleTests: XCTestCase { + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + // Any test you write for XCTest can be annotated as throws and async. + // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. + // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. + } + + func testPerformanceExample() throws { + // This is an example of a performance test case. + measure { + // Put the code you want to measure the time of here. + } + } +} diff --git a/Example/GradientLoadingBar.xcodeproj/project.pbxproj b/Example/GradientLoadingBar.xcodeproj/project.pbxproj deleted file mode 100644 index 8209003..0000000 --- a/Example/GradientLoadingBar.xcodeproj/project.pbxproj +++ /dev/null @@ -1,903 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 397E9F2412E802485B755A87 /* Pods_GradientLoadingBar_SnapshotTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ABA9B1EF5F3928BA6E31D3EA /* Pods_GradientLoadingBar_SnapshotTests.framework */; }; - 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; - 607FACD81AFB9204008FA782 /* BasicExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* BasicExampleViewController.swift */; }; - 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; - 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; - 640E8AC0231457620008C5A6 /* GradientActivityIndicatorViewModelTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 640E8ABF231457620008C5A6 /* GradientActivityIndicatorViewModelTestCase.swift */; }; - 6430C3A32338F1CA001F4A33 /* LargeNavigationBarHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6430C3A22338F1CA001F4A33 /* LargeNavigationBarHeaderView.swift */; }; - 649A163C23770B4400404F3C /* DefaultColorSnapshotTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 649A163B23770B4400404F3C /* DefaultColorSnapshotTestCase.swift */; }; - 649A164423770E9300404F3C /* CustomColorSnapshotTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 649A164323770E9300404F3C /* CustomColorSnapshotTestCase.swift */; }; - 64C596EC2351D80000A6CC97 /* InterfaceBuilderExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C596EB2351D7FF00A6CC97 /* InterfaceBuilderExampleViewController.swift */; }; - 64E0F5BF2211B7D20066D00D /* GradientLoadingBarViewModelTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64E0F5BB2211B7D20066D00D /* GradientLoadingBarViewModelTestCase.swift */; }; - 64E7F4252293E16B00BE5095 /* GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64E7F4242293E16B00BE5095 /* GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift */; }; - 77357BD34CFF2778341F80E8 /* Pods_GradientLoadingBar_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03CD5D69D7C3FBBDBF5FABBB /* Pods_GradientLoadingBar_Example.framework */; }; - 8020C040972E902A8CCAA9E7 /* Pods_GradientLoadingBar_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 434E3C8A6E245A38C2831E73 /* Pods_GradientLoadingBar_Tests.framework */; }; - 972CFBCC2138849A006F14C9 /* SafeAreaExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 972CFBCB2138849A006F14C9 /* SafeAreaExampleViewController.swift */; }; - 97464E6721372BCD0097183A /* AdvancedExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97464E6621372BCD0097183A /* AdvancedExampleViewController.swift */; }; - 97464E6921372C010097183A /* NavigationBarExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97464E6821372C010097183A /* NavigationBarExampleViewController.swift */; }; - 97B6F5FE2143F31F008CFEA5 /* UIColor+CustomColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97B6F5FA2143F31F008CFEA5 /* UIColor+CustomColors.swift */; }; - 97B6F5FF2143F31F008CFEA5 /* BlueFilledButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97B6F5FC2143F31F008CFEA5 /* BlueFilledButton.swift */; }; - 97B6F6002143F31F008CFEA5 /* BlueBorderedButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97B6F5FD2143F31F008CFEA5 /* BlueBorderedButton.swift */; }; - DC190F622496A25A0069E2B0 /* NotchGradientLoadingBarControllerTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC190F602496A24F0069E2B0 /* NotchGradientLoadingBarControllerTestCase.swift */; }; - DC9FF938270A470D0065B5B9 /* NotchGradientLoadingBarViewModelTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC9FF937270A470D0065B5B9 /* NotchGradientLoadingBarViewModelTestCase.swift */; }; - DCE3AB13249761B300889FFA /* Snapshotting+WindowedImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCE3AB11249761AB00889FFA /* Snapshotting+WindowedImage.swift */; }; - DCE3AB16249764BB00889FFA /* GradientLoadingBarControllerTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCE3AB14249764A000889FFA /* GradientLoadingBarControllerTestCase.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 607FACC81AFB9204008FA782 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 607FACCF1AFB9204008FA782; - remoteInfo = GradientLoadingBar; - }; - 649A163E23770B4400404F3C /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 607FACC81AFB9204008FA782 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 607FACCF1AFB9204008FA782; - remoteInfo = GradientLoadingBar_Example; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 03CD5D69D7C3FBBDBF5FABBB /* Pods_GradientLoadingBar_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GradientLoadingBar_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 0E24EC094BE0798D462B5F96 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; - 14959BE5652C9E83FC09BBDD /* Pods-GradientLoadingBar_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GradientLoadingBar_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.release.xcconfig"; sourceTree = ""; }; - 172FD3755BEBFF66683F5D81 /* Pods-GradientLoadingBar_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GradientLoadingBar_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.release.xcconfig"; sourceTree = ""; }; - 3DC26E6D2B0C63183F508578 /* Pods-GradientLoadingBar_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GradientLoadingBar_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.debug.xcconfig"; sourceTree = ""; }; - 434E3C8A6E245A38C2831E73 /* Pods_GradientLoadingBar_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GradientLoadingBar_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 607FACD01AFB9204008FA782 /* GradientLoadingBar_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = GradientLoadingBar_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 /* BasicExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicExampleViewController.swift; sourceTree = ""; }; - 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 607FACE51AFB9204008FA782 /* GradientLoadingBar_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GradientLoadingBar_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 640E8ABF231457620008C5A6 /* GradientActivityIndicatorViewModelTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientActivityIndicatorViewModelTestCase.swift; sourceTree = ""; }; - 6430C3A22338F1CA001F4A33 /* LargeNavigationBarHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LargeNavigationBarHeaderView.swift; sourceTree = ""; }; - 649A163923770B4400404F3C /* GradientLoadingBar_SnapshotTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GradientLoadingBar_SnapshotTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 649A163B23770B4400404F3C /* DefaultColorSnapshotTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultColorSnapshotTestCase.swift; sourceTree = ""; }; - 649A163D23770B4400404F3C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 649A164323770E9300404F3C /* CustomColorSnapshotTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomColorSnapshotTestCase.swift; sourceTree = ""; }; - 64C596EB2351D7FF00A6CC97 /* InterfaceBuilderExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InterfaceBuilderExampleViewController.swift; sourceTree = ""; }; - 64E0F5BB2211B7D20066D00D /* GradientLoadingBarViewModelTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GradientLoadingBarViewModelTestCase.swift; sourceTree = ""; }; - 64E7F4242293E16B00BE5095 /* GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift"; sourceTree = ""; }; - 972CFBCB2138849A006F14C9 /* SafeAreaExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafeAreaExampleViewController.swift; sourceTree = ""; }; - 97464E6621372BCD0097183A /* AdvancedExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedExampleViewController.swift; sourceTree = ""; }; - 97464E6821372C010097183A /* NavigationBarExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarExampleViewController.swift; sourceTree = ""; }; - 97B6F5FA2143F31F008CFEA5 /* UIColor+CustomColors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+CustomColors.swift"; sourceTree = ""; }; - 97B6F5FC2143F31F008CFEA5 /* BlueFilledButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlueFilledButton.swift; sourceTree = ""; }; - 97B6F5FD2143F31F008CFEA5 /* BlueBorderedButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlueBorderedButton.swift; sourceTree = ""; }; - A98CA9F1B0C1BD6864C14E01 /* Pods-GradientLoadingBar_SnapshotTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GradientLoadingBar_SnapshotTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.release.xcconfig"; sourceTree = ""; }; - ABA9B1EF5F3928BA6E31D3EA /* Pods_GradientLoadingBar_SnapshotTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_GradientLoadingBar_SnapshotTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C06CA4DFA1DCB931095ABD3D /* GradientLoadingBar.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = GradientLoadingBar.podspec; path = ../GradientLoadingBar.podspec; sourceTree = ""; }; - DC190F602496A24F0069E2B0 /* NotchGradientLoadingBarControllerTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotchGradientLoadingBarControllerTestCase.swift; sourceTree = ""; }; - DC9FF937270A470D0065B5B9 /* NotchGradientLoadingBarViewModelTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotchGradientLoadingBarViewModelTestCase.swift; sourceTree = ""; }; - DCE3AB11249761AB00889FFA /* Snapshotting+WindowedImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Snapshotting+WindowedImage.swift"; sourceTree = ""; }; - DCE3AB14249764A000889FFA /* GradientLoadingBarControllerTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientLoadingBarControllerTestCase.swift; sourceTree = ""; }; - DCE3AB172497670400889FFA /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - E7B292793F03D669ACAA92D2 /* Pods-GradientLoadingBar_SnapshotTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GradientLoadingBar_SnapshotTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.debug.xcconfig"; sourceTree = ""; }; - F76834BE9E43CA11377EC030 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; - FECB95A4857728345199461F /* Pods-GradientLoadingBar_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GradientLoadingBar_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.debug.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 607FACCD1AFB9204008FA782 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 77357BD34CFF2778341F80E8 /* Pods_GradientLoadingBar_Example.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 607FACE21AFB9204008FA782 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 8020C040972E902A8CCAA9E7 /* Pods_GradientLoadingBar_Tests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 649A163623770B4400404F3C /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 397E9F2412E802485B755A87 /* Pods_GradientLoadingBar_SnapshotTests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 607FACC71AFB9204008FA782 = { - isa = PBXGroup; - children = ( - 607FACF51AFB993E008FA782 /* Podspec Metadata */, - 607FACD21AFB9204008FA782 /* Example for GradientLoadingBar */, - 607FACE81AFB9204008FA782 /* Tests */, - 649A163A23770B4400404F3C /* SnapshotTests */, - 607FACD11AFB9204008FA782 /* Products */, - BFC08F9E633527E553EDA250 /* Pods */, - DB185876CEF7C6517EB25B58 /* Frameworks */, - ); - sourceTree = ""; - }; - 607FACD11AFB9204008FA782 /* Products */ = { - isa = PBXGroup; - children = ( - 607FACD01AFB9204008FA782 /* GradientLoadingBar_Example.app */, - 607FACE51AFB9204008FA782 /* GradientLoadingBar_Tests.xctest */, - 649A163923770B4400404F3C /* GradientLoadingBar_SnapshotTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 607FACD21AFB9204008FA782 /* Example for GradientLoadingBar */ = { - isa = PBXGroup; - children = ( - 97B6F5F92143F31F008CFEA5 /* Extensions */, - 97B6F5FB2143F31F008CFEA5 /* Views */, - 607FACD71AFB9204008FA782 /* BasicExampleViewController.swift */, - 972CFBCB2138849A006F14C9 /* SafeAreaExampleViewController.swift */, - 64C596EB2351D7FF00A6CC97 /* InterfaceBuilderExampleViewController.swift */, - 97464E6621372BCD0097183A /* AdvancedExampleViewController.swift */, - 97464E6821372C010097183A /* NavigationBarExampleViewController.swift */, - 607FACD51AFB9204008FA782 /* AppDelegate.swift */, - 607FACD91AFB9204008FA782 /* Main.storyboard */, - 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, - 607FACD31AFB9204008FA782 /* Supporting Files */, - ); - name = "Example for GradientLoadingBar"; - path = GradientLoadingBar; - sourceTree = ""; - }; - 607FACD31AFB9204008FA782 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 607FACD41AFB9204008FA782 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 607FACE81AFB9204008FA782 /* Tests */ = { - isa = PBXGroup; - children = ( - 64C6B3E72313259500076A69 /* ViewModel */, - 64E7F4222293E16B00BE5095 /* Views */, - 607FACE91AFB9204008FA782 /* Supporting Files */, - ); - path = Tests; - sourceTree = ""; - }; - 607FACE91AFB9204008FA782 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 607FACEA1AFB9204008FA782 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { - isa = PBXGroup; - children = ( - C06CA4DFA1DCB931095ABD3D /* GradientLoadingBar.podspec */, - 0E24EC094BE0798D462B5F96 /* README.md */, - F76834BE9E43CA11377EC030 /* LICENSE */, - ); - name = "Podspec Metadata"; - sourceTree = ""; - }; - 649A163A23770B4400404F3C /* SnapshotTests */ = { - isa = PBXGroup; - children = ( - DCE3AB102497619600889FFA /* _Helper */, - DC190F5E2496A2290069E2B0 /* GradientActivityIndicatorView */, - DC190F5F2496A2380069E2B0 /* GradientLoadingBarController */, - 649A163D23770B4400404F3C /* Info.plist */, - DCE3AB172497670400889FFA /* README.md */, - ); - path = SnapshotTests; - sourceTree = ""; - }; - 64C6B3E72313259500076A69 /* ViewModel */ = { - isa = PBXGroup; - children = ( - 64E0F5BB2211B7D20066D00D /* GradientLoadingBarViewModelTestCase.swift */, - 640E8ABF231457620008C5A6 /* GradientActivityIndicatorViewModelTestCase.swift */, - DC9FF937270A470D0065B5B9 /* NotchGradientLoadingBarViewModelTestCase.swift */, - ); - path = ViewModel; - sourceTree = ""; - }; - 64E7F4222293E16B00BE5095 /* Views */ = { - isa = PBXGroup; - children = ( - 64E7F4242293E16B00BE5095 /* GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift */, - ); - path = Views; - sourceTree = ""; - }; - 97B6F5F92143F31F008CFEA5 /* Extensions */ = { - isa = PBXGroup; - children = ( - 97B6F5FA2143F31F008CFEA5 /* UIColor+CustomColors.swift */, - ); - path = Extensions; - sourceTree = ""; - }; - 97B6F5FB2143F31F008CFEA5 /* Views */ = { - isa = PBXGroup; - children = ( - 97B6F5FC2143F31F008CFEA5 /* BlueFilledButton.swift */, - 97B6F5FD2143F31F008CFEA5 /* BlueBorderedButton.swift */, - 6430C3A22338F1CA001F4A33 /* LargeNavigationBarHeaderView.swift */, - ); - path = Views; - sourceTree = ""; - }; - BFC08F9E633527E553EDA250 /* Pods */ = { - isa = PBXGroup; - children = ( - 3DC26E6D2B0C63183F508578 /* Pods-GradientLoadingBar_Example.debug.xcconfig */, - 172FD3755BEBFF66683F5D81 /* Pods-GradientLoadingBar_Example.release.xcconfig */, - FECB95A4857728345199461F /* Pods-GradientLoadingBar_Tests.debug.xcconfig */, - 14959BE5652C9E83FC09BBDD /* Pods-GradientLoadingBar_Tests.release.xcconfig */, - E7B292793F03D669ACAA92D2 /* Pods-GradientLoadingBar_SnapshotTests.debug.xcconfig */, - A98CA9F1B0C1BD6864C14E01 /* Pods-GradientLoadingBar_SnapshotTests.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - DB185876CEF7C6517EB25B58 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 03CD5D69D7C3FBBDBF5FABBB /* Pods_GradientLoadingBar_Example.framework */, - 434E3C8A6E245A38C2831E73 /* Pods_GradientLoadingBar_Tests.framework */, - ABA9B1EF5F3928BA6E31D3EA /* Pods_GradientLoadingBar_SnapshotTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - DC190F5E2496A2290069E2B0 /* GradientActivityIndicatorView */ = { - isa = PBXGroup; - children = ( - 649A163B23770B4400404F3C /* DefaultColorSnapshotTestCase.swift */, - 649A164323770E9300404F3C /* CustomColorSnapshotTestCase.swift */, - ); - path = GradientActivityIndicatorView; - sourceTree = ""; - }; - DC190F5F2496A2380069E2B0 /* GradientLoadingBarController */ = { - isa = PBXGroup; - children = ( - DCE3AB14249764A000889FFA /* GradientLoadingBarControllerTestCase.swift */, - DC190F602496A24F0069E2B0 /* NotchGradientLoadingBarControllerTestCase.swift */, - ); - path = GradientLoadingBarController; - sourceTree = ""; - }; - DCE3AB102497619600889FFA /* _Helper */ = { - isa = PBXGroup; - children = ( - DCE3AB11249761AB00889FFA /* Snapshotting+WindowedImage.swift */, - ); - path = _Helper; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 607FACCF1AFB9204008FA782 /* GradientLoadingBar_Example */ = { - isa = PBXNativeTarget; - buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "GradientLoadingBar_Example" */; - buildPhases = ( - 8A80B9B4778F0A3D30371790 /* [CP] Check Pods Manifest.lock */, - 607FACCC1AFB9204008FA782 /* Sources */, - 607FACCD1AFB9204008FA782 /* Frameworks */, - 607FACCE1AFB9204008FA782 /* Resources */, - 1A66A3C243446BE65EBE3AAE /* [CP] Embed Pods Frameworks */, - 972EE1C9201CA5C4001F603C /* Swiftformat */, - 9753E83D1F80F7D300EF2822 /* Swiftlint */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = GradientLoadingBar_Example; - productName = GradientLoadingBar; - productReference = 607FACD01AFB9204008FA782 /* GradientLoadingBar_Example.app */; - productType = "com.apple.product-type.application"; - }; - 607FACE41AFB9204008FA782 /* GradientLoadingBar_Tests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "GradientLoadingBar_Tests" */; - buildPhases = ( - 04A6606B8779F59C5BA953A7 /* [CP] Check Pods Manifest.lock */, - 607FACE11AFB9204008FA782 /* Sources */, - 607FACE21AFB9204008FA782 /* Frameworks */, - 607FACE31AFB9204008FA782 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 607FACE71AFB9204008FA782 /* PBXTargetDependency */, - ); - name = GradientLoadingBar_Tests; - productName = Tests; - productReference = 607FACE51AFB9204008FA782 /* GradientLoadingBar_Tests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 649A163823770B4400404F3C /* GradientLoadingBar_SnapshotTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 649A164223770B4400404F3C /* Build configuration list for PBXNativeTarget "GradientLoadingBar_SnapshotTests" */; - buildPhases = ( - C6F0F8135CCFB10901DB76DB /* [CP] Check Pods Manifest.lock */, - 649A163523770B4400404F3C /* Sources */, - 649A163623770B4400404F3C /* Frameworks */, - 649A163723770B4400404F3C /* Resources */, - 568034A03F733A9FAEAC587B /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 649A163F23770B4400404F3C /* PBXTargetDependency */, - ); - name = GradientLoadingBar_SnapshotTests; - productName = SnapshotTests; - productReference = 649A163923770B4400404F3C /* GradientLoadingBar_SnapshotTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 607FACC81AFB9204008FA782 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1120; - LastUpgradeCheck = 1020; - ORGANIZATIONNAME = CocoaPods; - TargetAttributes = { - 607FACCF1AFB9204008FA782 = { - CreatedOnToolsVersion = 6.3.1; - LastSwiftMigration = 1020; - }; - 607FACE41AFB9204008FA782 = { - CreatedOnToolsVersion = 6.3.1; - LastSwiftMigration = 1020; - TestTargetID = 607FACCF1AFB9204008FA782; - }; - 649A163823770B4400404F3C = { - CreatedOnToolsVersion = 11.2; - ProvisioningStyle = Automatic; - TestTargetID = 607FACCF1AFB9204008FA782; - }; - }; - }; - buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "GradientLoadingBar" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 607FACC71AFB9204008FA782; - productRefGroup = 607FACD11AFB9204008FA782 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 607FACCF1AFB9204008FA782 /* GradientLoadingBar_Example */, - 607FACE41AFB9204008FA782 /* GradientLoadingBar_Tests */, - 649A163823770B4400404F3C /* GradientLoadingBar_SnapshotTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 607FACCE1AFB9204008FA782 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, - 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 607FACE31AFB9204008FA782 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 649A163723770B4400404F3C /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 04A6606B8779F59C5BA953A7 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-GradientLoadingBar_Tests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 1A66A3C243446BE65EBE3AAE /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/GradientLoadingBar/GradientLoadingBar.framework", - "${BUILT_PRODUCTS_DIR}/LightweightObservable/LightweightObservable.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GradientLoadingBar.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LightweightObservable.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 568034A03F733A9FAEAC587B /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/SnapshotTesting/SnapshotTesting.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapshotTesting.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 8A80B9B4778F0A3D30371790 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-GradientLoadingBar_Example-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 972EE1C9201CA5C4001F603C /* Swiftformat */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = Swiftformat; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "SWIFTFORMAT=\"${PODS_ROOT}/SwiftFormat/CommandLineTool/swiftformat\"\nif [ ! -f \"$SWIFTFORMAT\" ]; then\n echo \"warning: SwiftFormat not installed!\"\n exit 1\nfi\n\n$SWIFTFORMAT ../ --config \"${PODS_ROOT}/SwiftConfigurationFiles/.swiftformat\"\n"; - }; - 9753E83D1F80F7D300EF2822 /* Swiftlint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = Swiftlint; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "SWIFTLINT=\"${PODS_ROOT}/SwiftLint/swiftlint\"\nif [ ! -f \"$SWIFTLINT\" ]; then\n echo \"warning: SwiftLint not installed!\"\n exit 1\nfi\n\n$SWIFTLINT\n"; - }; - C6F0F8135CCFB10901DB76DB /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-GradientLoadingBar_SnapshotTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 607FACCC1AFB9204008FA782 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 607FACD81AFB9204008FA782 /* BasicExampleViewController.swift in Sources */, - 64C596EC2351D80000A6CC97 /* InterfaceBuilderExampleViewController.swift in Sources */, - 972CFBCC2138849A006F14C9 /* SafeAreaExampleViewController.swift in Sources */, - 97464E6721372BCD0097183A /* AdvancedExampleViewController.swift in Sources */, - 6430C3A32338F1CA001F4A33 /* LargeNavigationBarHeaderView.swift in Sources */, - 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, - 97B6F5FF2143F31F008CFEA5 /* BlueFilledButton.swift in Sources */, - 97B6F5FE2143F31F008CFEA5 /* UIColor+CustomColors.swift in Sources */, - 97B6F6002143F31F008CFEA5 /* BlueBorderedButton.swift in Sources */, - 97464E6921372C010097183A /* NavigationBarExampleViewController.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 607FACE11AFB9204008FA782 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 640E8AC0231457620008C5A6 /* GradientActivityIndicatorViewModelTestCase.swift in Sources */, - 64E0F5BF2211B7D20066D00D /* GradientLoadingBarViewModelTestCase.swift in Sources */, - DC9FF938270A470D0065B5B9 /* NotchGradientLoadingBarViewModelTestCase.swift in Sources */, - 64E7F4252293E16B00BE5095 /* GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 649A163523770B4400404F3C /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DCE3AB13249761B300889FFA /* Snapshotting+WindowedImage.swift in Sources */, - DC190F622496A25A0069E2B0 /* NotchGradientLoadingBarControllerTestCase.swift in Sources */, - DCE3AB16249764BB00889FFA /* GradientLoadingBarControllerTestCase.swift in Sources */, - 649A164423770E9300404F3C /* CustomColorSnapshotTestCase.swift in Sources */, - 649A163C23770B4400404F3C /* DefaultColorSnapshotTestCase.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 607FACCF1AFB9204008FA782 /* GradientLoadingBar_Example */; - targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; - }; - 649A163F23770B4400404F3C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 607FACCF1AFB9204008FA782 /* GradientLoadingBar_Example */; - targetProxy = 649A163E23770B4400404F3C /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 607FACD91AFB9204008FA782 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 607FACDA1AFB9204008FA782 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - 607FACDF1AFB9204008FA782 /* Base */, - ); - name = LaunchScreen.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 607FACED1AFB9204008FA782 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - 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; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - 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 = 9.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 607FACEE1AFB9204008FA782 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - 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; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 607FACF01AFB9204008FA782 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3DC26E6D2B0C63183F508578 /* Pods-GradientLoadingBar_Example.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = GradientLoadingBar/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MODULE_NAME = ExampleApp; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 607FACF11AFB9204008FA782 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 172FD3755BEBFF66683F5D81 /* Pods-GradientLoadingBar_Example.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = GradientLoadingBar/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MODULE_NAME = ExampleApp; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 607FACF31AFB9204008FA782 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FECB95A4857728345199461F /* Pods-GradientLoadingBar_Tests.debug.xcconfig */; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = Tests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GradientLoadingBar_Example.app/GradientLoadingBar_Example"; - }; - name = Debug; - }; - 607FACF41AFB9204008FA782 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 14959BE5652C9E83FC09BBDD /* Pods-GradientLoadingBar_Tests.release.xcconfig */; - buildSettings = { - FRAMEWORK_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = Tests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GradientLoadingBar_Example.app/GradientLoadingBar_Example"; - }; - name = Release; - }; - 649A164023770B4400404F3C /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E7B292793F03D669ACAA92D2 /* Pods-GradientLoadingBar_SnapshotTests.debug.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - DEBUG_INFORMATION_FORMAT = dwarf; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = SnapshotTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = hamburg.felix.SnapshotTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GradientLoadingBar_Example.app/GradientLoadingBar_Example"; - }; - name = Debug; - }; - 649A164123770B4400404F3C /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A98CA9F1B0C1BD6864C14E01 /* Pods-GradientLoadingBar_SnapshotTests.release.xcconfig */; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_STYLE = Automatic; - GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = SnapshotTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = hamburg.felix.SnapshotTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/GradientLoadingBar_Example.app/GradientLoadingBar_Example"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "GradientLoadingBar" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 607FACED1AFB9204008FA782 /* Debug */, - 607FACEE1AFB9204008FA782 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "GradientLoadingBar_Example" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 607FACF01AFB9204008FA782 /* Debug */, - 607FACF11AFB9204008FA782 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "GradientLoadingBar_Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 607FACF31AFB9204008FA782 /* Debug */, - 607FACF41AFB9204008FA782 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 649A164223770B4400404F3C /* Build configuration list for PBXNativeTarget "GradientLoadingBar_SnapshotTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 649A164023770B4400404F3C /* Debug */, - 649A164123770B4400404F3C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 607FACC81AFB9204008FA782 /* Project object */; -} diff --git a/Example/GradientLoadingBar.xcodeproj/xcshareddata/xcschemes/GradientLoadingBar-Example.xcscheme b/Example/GradientLoadingBar.xcodeproj/xcshareddata/xcschemes/GradientLoadingBar-Example.xcscheme deleted file mode 100644 index dd5fd93..0000000 --- a/Example/GradientLoadingBar.xcodeproj/xcshareddata/xcschemes/GradientLoadingBar-Example.xcscheme +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/GradientLoadingBar/AdvancedExampleViewController.swift b/Example/GradientLoadingBar/AdvancedExampleViewController.swift deleted file mode 100644 index c47547b..0000000 --- a/Example/GradientLoadingBar/AdvancedExampleViewController.swift +++ /dev/null @@ -1,105 +0,0 @@ -// -// AdvancedExampleViewController.swift -// GradientLoadingBar_Example -// -// Created by Felix Mau on 30.08.18. -// Copyright © 2018 Felix Mau. All rights reserved. -// - -import UIKit -import GradientLoadingBar - -class AdvancedExampleViewController: UIViewController { - // MARK: - Config - - private enum Config { - /// The programatically applied height of the `GradientActivityIndicatorView`. - static let height: CGFloat = 3.5 - } - - // MARK: - Outlets - - @IBOutlet private var programmaticallyButton: BlueBorderedButton! - @IBOutlet private var customColorsButton: BlueBorderedButton! - - // MARK: - Private properties - - // swiftlint:disable:next identifier_name - private let programmaticallyGradientActivityIndicatorView = GradientActivityIndicatorView() - - // swiftlint:disable:next identifier_name - private let customColorsGradientActivityIndicatorView: GradientActivityIndicatorView = { - let gradientActivityIndicatorView = GradientActivityIndicatorView() - - // Source: https://color.adobe.com/Pink-Flamingo-color-theme-10343714/ - gradientActivityIndicatorView.gradientColors = [ - #colorLiteral(red: 0.9490196078, green: 0.3215686275, blue: 0.431372549, alpha: 1), #colorLiteral(red: 0.9450980392, green: 0.4784313725, blue: 0.5921568627, alpha: 1), #colorLiteral(red: 0.9529411765, green: 0.737254902, blue: 0.7843137255, alpha: 1), #colorLiteral(red: 0.4274509804, green: 0.8666666667, blue: 0.9490196078, alpha: 1), #colorLiteral(red: 0.7568627451, green: 0.9411764706, blue: 0.9568627451, alpha: 1), - ] - - return gradientActivityIndicatorView - }() - - // MARK: - Public methods - - override func viewDidLoad() { - super.viewDidLoad() - - setupProgrammaticallyGradientActivityIndicatorView() - setupCustomColorsGradientActivityIndicatorView() - } - - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - - programmaticallyGradientActivityIndicatorView.fadeOut() - customColorsGradientActivityIndicatorView.fadeOut() - } - - @IBAction private func toggleProgrammaticallyButtonTouchUpInside(_: Any) { - if programmaticallyGradientActivityIndicatorView.isHidden { - programmaticallyGradientActivityIndicatorView.fadeIn() - } else { - programmaticallyGradientActivityIndicatorView.fadeOut() - } - } - - @IBAction private func toggleCustomColorsButtonTouchUpInside(_: Any) { - if customColorsGradientActivityIndicatorView.isHidden { - customColorsGradientActivityIndicatorView.fadeIn() - } else { - customColorsGradientActivityIndicatorView.fadeOut() - } - } - - // MARK: - Private methods - - private func setupProgrammaticallyGradientActivityIndicatorView() { - programmaticallyGradientActivityIndicatorView.fadeOut(duration: 0) - - programmaticallyGradientActivityIndicatorView.translatesAutoresizingMaskIntoConstraints = false - programmaticallyButton.addSubview(programmaticallyGradientActivityIndicatorView) - - NSLayoutConstraint.activate([ - programmaticallyGradientActivityIndicatorView.leadingAnchor.constraint(equalTo: programmaticallyButton.leadingAnchor), - programmaticallyGradientActivityIndicatorView.trailingAnchor.constraint(equalTo: programmaticallyButton.trailingAnchor), - - programmaticallyGradientActivityIndicatorView.topAnchor.constraint(equalTo: programmaticallyButton.topAnchor), - programmaticallyGradientActivityIndicatorView.heightAnchor.constraint(equalToConstant: Config.height), - ]) - } - - private func setupCustomColorsGradientActivityIndicatorView() { - customColorsGradientActivityIndicatorView.fadeOut(duration: 0) - - customColorsGradientActivityIndicatorView.translatesAutoresizingMaskIntoConstraints = false - customColorsButton.addSubview(customColorsGradientActivityIndicatorView) - - NSLayoutConstraint.activate([ - customColorsGradientActivityIndicatorView.leadingAnchor.constraint(equalTo: customColorsButton.leadingAnchor), - customColorsGradientActivityIndicatorView.trailingAnchor.constraint(equalTo: customColorsButton.trailingAnchor), - - customColorsGradientActivityIndicatorView.bottomAnchor.constraint(equalTo: customColorsButton.bottomAnchor), - customColorsGradientActivityIndicatorView.heightAnchor.constraint(equalToConstant: Config.height), - ]) - } -} diff --git a/Example/GradientLoadingBar/AppDelegate.swift b/Example/GradientLoadingBar/AppDelegate.swift deleted file mode 100644 index 98b435b..0000000 --- a/Example/GradientLoadingBar/AppDelegate.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// AppDelegate.swift -// GradientLoadingBar -// -// Created by Felix Mau on 30.09.17. -// Copyright © 2017 Felix Mau. All rights reserved. -// - -import GradientLoadingBar -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? - - func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - - // Example on how to customize the shared instance of `GradientLoadingBar`. - // We're gonna use the same height though ¯\_(ツ)_/¯ - let customGradientLoadingBar = GradientLoadingBar(height: 3.0) - GradientLoadingBar.shared = customGradientLoadingBar - - return true - } - - func applicationWillResignActive(_: UIApplication) { - // Sent when the application is about to move from active to inactive state. - // This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application - // and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your - // application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. - // If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } -} diff --git a/Example/GradientLoadingBar/Base.lproj/LaunchScreen.xib b/Example/GradientLoadingBar/Base.lproj/LaunchScreen.xib deleted file mode 100644 index 72a748c..0000000 --- a/Example/GradientLoadingBar/Base.lproj/LaunchScreen.xib +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/GradientLoadingBar/Base.lproj/Main.storyboard b/Example/GradientLoadingBar/Base.lproj/Main.storyboard deleted file mode 100644 index 6a8cae1..0000000 --- a/Example/GradientLoadingBar/Base.lproj/Main.storyboard +++ /dev/null @@ -1,489 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/GradientLoadingBar/Extensions/UIColor+CustomColors.swift b/Example/GradientLoadingBar/Extensions/UIColor+CustomColors.swift deleted file mode 100644 index bceb3af..0000000 --- a/Example/GradientLoadingBar/Extensions/UIColor+CustomColors.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// UIColor+CustomColors.swift -// GradientLoadingBar_Example -// -// Created by Felix Mau on 29.08.18. -// Copyright © 2018 Felix Mau. All rights reserved. -// - -import UIKit - -extension UIColor { - /// Config that contains all our custom defined colors. - enum CustomColors { - static let blue = #colorLiteral(red: 0.2862745098, green: 0.5647058824, blue: 0.8862745098, alpha: 1) - } -} diff --git a/Example/GradientLoadingBar/Info.plist b/Example/GradientLoadingBar/Info.plist deleted file mode 100644 index 6f460e0..0000000 --- a/Example/GradientLoadingBar/Info.plist +++ /dev/null @@ -1,41 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationPortraitUpsideDown - - - diff --git a/Example/GradientLoadingBar/Views/BlueBorderedButton.swift b/Example/GradientLoadingBar/Views/BlueBorderedButton.swift deleted file mode 100644 index 5ffa5a8..0000000 --- a/Example/GradientLoadingBar/Views/BlueBorderedButton.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// BlueBorderedButton.swift -// GradientLoadingBar_Example -// -// Created by Felix Mau on 29.08.18. -// Copyright © 2018 Felix Mau. All rights reserved. -// - -import UIKit - -@IBDesignable -final class BlueBorderedButton: UIButton { - // MARK: - Initializer - - override init(frame: CGRect) { - super.init(frame: frame) - - commonInit() - } - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - - commonInit() - } - - // MARK: - Private methods - - private func commonInit() { - backgroundColor = .clear - tintColor = UIColor.CustomColors.blue - - layer.cornerRadius = 4 - layer.borderColor = UIColor.CustomColors.blue.cgColor - layer.borderWidth = 1 - } -} diff --git a/Example/GradientLoadingBar/Views/BlueFilledButton.swift b/Example/GradientLoadingBar/Views/BlueFilledButton.swift deleted file mode 100644 index 39501bf..0000000 --- a/Example/GradientLoadingBar/Views/BlueFilledButton.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// BlueFilledButton.swift -// GradientLoadingBar_Example -// -// Created by Felix Mau on 29.08.18. -// Copyright © 2018 Felix Mau. All rights reserved. -// - -import UIKit - -@IBDesignable -final class BlueFilledButton: UIButton { - // MARK: - Initializer - - override init(frame: CGRect) { - super.init(frame: frame) - - commonInit() - } - - required init?(coder aDecoder: NSCoder) { - super.init(coder: aDecoder) - - commonInit() - } - - override func prepareForInterfaceBuilder() { - super.prepareForInterfaceBuilder() - - commonInit() - } - - // MARK: - Private methods - - private func commonInit() { - tintColor = .white - backgroundColor = UIColor.CustomColors.blue - - layer.cornerRadius = 4.0 - } -} diff --git a/Example/GradientLoadingBar/Views/LargeNavigationBarHeaderView.swift b/Example/GradientLoadingBar/Views/LargeNavigationBarHeaderView.swift deleted file mode 100644 index 1bf2afb..0000000 --- a/Example/GradientLoadingBar/Views/LargeNavigationBarHeaderView.swift +++ /dev/null @@ -1,85 +0,0 @@ -// -// LargeNavigationBarHeaderView.swift -// GradientLoadingBar_Example -// -// Created by Felix Mau on 23.09.19. -// Copyright © 2019 CocoaPods. All rights reserved. -// - -import UIKit - -@IBDesignable -final class LargeNavigationBarHeaderView: UIView { - // MARK: - Public properties - - @IBInspectable var title: String = "" { - didSet { - titleLabel.text = title - } - } - - @IBInspectable var prompt: String = "" { - didSet { - promptLabel.text = prompt - } - } - - // MARK: - Private properties - - private let titleLabel = UILabel(frame: .zero) - - private let promptLabel = UILabel(frame: .zero) - - // MARK: - Initializer - - override init(frame: CGRect) { - super.init(frame: frame) - - commonInit() - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - - commonInit() - } - - // MARK: - Private methods - - private func commonInit() { - setupTitleLabel() - setupPromptLabel() - } - - private func setupTitleLabel() { - let fontDescriptor = UIFontDescriptor.preferredFontDescriptor(withTextStyle: .largeTitle) - titleLabel.font = UIFont.systemFont(ofSize: fontDescriptor.pointSize, weight: .bold) - titleLabel.textColor = .label - - titleLabel.translatesAutoresizingMaskIntoConstraints = false - addSubview(titleLabel) - - NSLayoutConstraint.activate([ - titleLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16.0), - titleLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -16.0), - - titleLabel.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -8.0), - ]) - } - - private func setupPromptLabel() { - promptLabel.font = UIFont.preferredFont(forTextStyle: .footnote) - promptLabel.textAlignment = .center - promptLabel.textColor = .label - - promptLabel.translatesAutoresizingMaskIntoConstraints = false - addSubview(promptLabel) - - NSLayoutConstraint.activate([ - promptLabel.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 8.0), - promptLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -8.0), - - promptLabel.topAnchor.constraint(equalTo: topAnchor, constant: 9.5), - ]) - } -} diff --git a/Example/Podfile b/Example/Podfile index 4fcdec5..9666893 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -4,7 +4,7 @@ source 'https://github.com/CocoaPods/Specs.git' platform :ios, '13.0' use_frameworks! -target 'GradientLoadingBar_Example' do +target 'Example' do pod 'GradientLoadingBar', :path => '../' # Development pods. @@ -12,17 +12,9 @@ target 'GradientLoadingBar_Example' do pod 'SwiftLint', '~> 0.42' pod 'SwiftConfigurationFiles', :git => 'https://github.com/fxm90/SwiftConfigurationFiles.git' - target 'GradientLoadingBar_Tests' do + target 'ExampleTests' do inherit! :search_paths - - # Pods for testing. - end - - target 'GradientLoadingBar_SnapshotTests' do - inherit! :search_paths - - # Pods for snapshot testing. - pod 'SnapshotTesting', '~> 1.7', :inhibit_warnings => true + # Pods for testing end post_install do |installer| @@ -46,4 +38,5 @@ target 'GradientLoadingBar_Example' do end end end + end diff --git a/Example/Podfile.lock b/Example/Podfile.lock index aae9e3c..1519b86 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -2,14 +2,12 @@ PODS: - GradientLoadingBar (2.2.3): - LightweightObservable (~> 2.1) - LightweightObservable (2.2.0) - - SnapshotTesting (1.9.0) - SwiftConfigurationFiles (0.0.1) - SwiftFormat/CLI (0.49.5) - SwiftLint (0.46.4) DEPENDENCIES: - GradientLoadingBar (from `../`) - - SnapshotTesting (~> 1.7) - SwiftConfigurationFiles (from `https://github.com/fxm90/SwiftConfigurationFiles.git`) - SwiftFormat/CLI (~> 0.41) - SwiftLint (~> 0.42) @@ -17,7 +15,6 @@ DEPENDENCIES: SPEC REPOS: https://github.com/CocoaPods/Specs.git: - LightweightObservable - - SnapshotTesting - SwiftFormat - SwiftLint @@ -33,13 +30,12 @@ CHECKOUT OPTIONS: :git: https://github.com/fxm90/SwiftConfigurationFiles.git SPEC CHECKSUMS: - GradientLoadingBar: 157bd321c74e6bd0b0d87de735336060011393ab + GradientLoadingBar: 61e71d4f05726cbfe1c3e5eea2804f5764ed04d6 LightweightObservable: a4fce3323002aa57234f3cf5524eecb144cc781f - SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b SwiftConfigurationFiles: 1cf2228a911ebed9f42f8dec077bb634f04ca6c8 SwiftFormat: 803e5a44e083cf414b3072381db0e9e65f4c0d0d SwiftLint: b24bab3f5ab5c9ae86a03381bc974d6f0ac85bb0 -PODFILE CHECKSUM: 36b90780cb508f9eaca4f0ac59660e3e748de601 +PODFILE CHECKSUM: d380a5fd965836c490796d665eae14d740294ee7 COCOAPODS: 1.11.2 diff --git a/Example/Pods/Local Podspecs/GradientLoadingBar.podspec.json b/Example/Pods/Local Podspecs/GradientLoadingBar.podspec.json index 32f82ac..6c17ca7 100644 --- a/Example/Pods/Local Podspecs/GradientLoadingBar.podspec.json +++ b/Example/Pods/Local Podspecs/GradientLoadingBar.podspec.json @@ -20,7 +20,7 @@ "platforms": { "ios": "9.0" }, - "source_files": "GradientLoadingBar/Classes/**/*", + "source_files": "GradientLoadingBar/**/*", "dependencies": { "LightweightObservable": [ "~> 2.1" diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index aae9e3c..1519b86 100644 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -2,14 +2,12 @@ PODS: - GradientLoadingBar (2.2.3): - LightweightObservable (~> 2.1) - LightweightObservable (2.2.0) - - SnapshotTesting (1.9.0) - SwiftConfigurationFiles (0.0.1) - SwiftFormat/CLI (0.49.5) - SwiftLint (0.46.4) DEPENDENCIES: - GradientLoadingBar (from `../`) - - SnapshotTesting (~> 1.7) - SwiftConfigurationFiles (from `https://github.com/fxm90/SwiftConfigurationFiles.git`) - SwiftFormat/CLI (~> 0.41) - SwiftLint (~> 0.42) @@ -17,7 +15,6 @@ DEPENDENCIES: SPEC REPOS: https://github.com/CocoaPods/Specs.git: - LightweightObservable - - SnapshotTesting - SwiftFormat - SwiftLint @@ -33,13 +30,12 @@ CHECKOUT OPTIONS: :git: https://github.com/fxm90/SwiftConfigurationFiles.git SPEC CHECKSUMS: - GradientLoadingBar: 157bd321c74e6bd0b0d87de735336060011393ab + GradientLoadingBar: 61e71d4f05726cbfe1c3e5eea2804f5764ed04d6 LightweightObservable: a4fce3323002aa57234f3cf5524eecb144cc781f - SnapshotTesting: 6141c48b6aa76ead61431ca665c14ab9a066c53b SwiftConfigurationFiles: 1cf2228a911ebed9f42f8dec077bb634f04ca6c8 SwiftFormat: 803e5a44e083cf414b3072381db0e9e65f4c0d0d SwiftLint: b24bab3f5ab5c9ae86a03381bc974d6f0ac85bb0 -PODFILE CHECKSUM: 36b90780cb508f9eaca4f0ac59660e3e748de601 +PODFILE CHECKSUM: d380a5fd965836c490796d665eae14d740294ee7 COCOAPODS: 1.11.2 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 827b2cc..bb75471 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 55; objects = { /* Begin PBXAggregateTarget section */ @@ -37,251 +37,145 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 07319FC388250B963206DB0BF5262128 /* CGPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = D90A4312109DE68F0350FBB5DD551816 /* CGPath.swift */; }; - 0ACD0ACD5263B4D09556739F7926FF96 /* NotchGradientLoadingBarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A6AFF4C6A1BA30CE9B8A5B1CEDC407A /* NotchGradientLoadingBarViewModel.swift */; }; - 1D0EF6FBAF37BB930183B8F5AA719CD2 /* SnapshotTesting-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E86B6F99751F56AA8AC35B5835DE4722 /* SnapshotTesting-dummy.m */; }; - 2115DE52F6A03FFC0F6A938F158F9259 /* NotchGradientLoadingBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9CADA2B0AD5E703D468B06A67A80492 /* NotchGradientLoadingBarController.swift */; }; - 21A1F3F09B0A8A1D091D1977D706D0C3 /* Observable+KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89D6B1C70C53B6DA6E6D0456F0F7DBD8 /* Observable+KeyPath.swift */; }; - 2527F1E9F6147C56510A178BE9F8502A /* Pods-GradientLoadingBar_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 132C18988D60EF85736C043D43C19E57 /* Pods-GradientLoadingBar_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 28F1B4D31269CC69CB5F41DBBCEF5222 /* Any.swift in Sources */ = {isa = PBXBuildFile; fileRef = E71E37779A210E3F9958FB4B465CC3B6 /* Any.swift */; }; - 2C0C1A356E0D75368E196C24C3761129 /* Diffing.swift in Sources */ = {isa = PBXBuildFile; fileRef = CED5F046F3966BF1758156DB5C0EAC5E /* Diffing.swift */; }; - 388F17A5CB909F346CB831BE157AC83C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; - 3D1E0E44DB5DB31C932BBB9F1385B57A /* NSView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94F6960E2E6F81EA1AEEEC7CAC13C054 /* NSView.swift */; }; - 3DAFC3A87D54F6BA47518F4904B7FE54 /* AssertSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEB65A52E203646F5F85230CB37055A7 /* AssertSnapshot.swift */; }; - 3E9A56ADB8427F240D98E65F282D5AB3 /* Pods-GradientLoadingBar_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8194C4CB9E683FC366F48513ED1B1A9A /* Pods-GradientLoadingBar_Example-dummy.m */; }; - 4249BA5FD30CFB0680582D7C7C6EE392 /* AssertInlineSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9801722F42CF5540558E2186724E2F08 /* AssertInlineSnapshot.swift */; }; - 480D1264071DA1967F86F28F5CF29B8B /* SpriteKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7C32BCB3A8CDE7A967257032D2CB146 /* SpriteKit.swift */; }; - 486A6DAD276EB55E6D7C9F515C86C227 /* SnapshotTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7B244F28A1FD6EEA4564C67C401D680 /* SnapshotTestCase.swift */; }; - 4A8EE45D20D442748189087F6A430A75 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5EBC8F300895E39EA0DF6D6B2B5E6BCD /* XCTest.framework */; }; - 4BE134B742037AAB5A883E394D6702E0 /* Pods-GradientLoadingBar_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A900E1CFF1D76CF61DDF7358F5C8863 /* Pods-GradientLoadingBar_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4F4D449821AB24276FA18CB343B2C3E8 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D70287148495215062E5030BA6267BB /* Codable.swift */; }; - 532436EEB8C806728018E24162505A32 /* Description.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2FF4849BA9ABFDAF933BC11BBE59A72 /* Description.swift */; }; - 5CA71008BD23B355944AC5383821C4E2 /* Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371D3CDC7543AF863ADAE5F4D66D793C /* Internal.swift */; }; - 5F34D446EDA13CFBB2792F77205C1BC3 /* LightweightObservable-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 785E1BC5584D16AC9173E04DE45A6036 /* LightweightObservable-dummy.m */; }; - 6235B3883B6D9B3EF262ACFF43631F3D /* SceneKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4342969D6D37396C136697D0BC1C2A06 /* SceneKit.swift */; }; - 65653E361AC18994D0C42D31EBD83C78 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDFA33C3D1AF4C2C0CDAFFE7D06B88AF /* Observable.swift */; }; - 6754C82145E0C59C9AF97D91D7321D72 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; - 68C5DB73151103C8F43EF26688EE5600 /* GradientLoadingBarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BC3C52825EB9FF41BCF9CDBAD1CFBFC /* GradientLoadingBarViewModel.swift */; }; - 6FA42D338F2CDE1914908E7D0662AED5 /* Diff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195C9E50C429616417E6F569B20896A6 /* Diff.swift */; }; - 6FFBF94E8163A16367C42D61BF77DAA6 /* GradientActivityIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBDE3024CEF242BA05EBFE42A753D313 /* GradientActivityIndicatorView.swift */; }; - 70060B0C311FBDF840146EEE9B762220 /* PlistEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86A83C5000A82493337A3DFC79D0B56F /* PlistEncoder.swift */; }; - 74116D4194C50C94965143D797AAB781 /* Observable+Equatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 523B7174E480C3FA74F83ABE7056DE17 /* Observable+Equatable.swift */; }; - 776004E55702AEB7C0881078F2CF0F36 /* Pods-GradientLoadingBar_SnapshotTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4371A74F9A6D74628527A30E755EFF25 /* Pods-GradientLoadingBar_SnapshotTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 78BBB110735B5BD1BDDC3CD4FC563323 /* Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE73B31D3D042300127FE7545DC9A288 /* Data.swift */; }; - 7F5C5DD662B656505ECF172E1DDC232E /* UIBezierPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E06D57A35648ECBC97644D217B868BD /* UIBezierPath.swift */; }; - 8368D89E28CF3A09A2A4CBBA83663DCD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; - 88DE0AA2E9071FD322F40132B5ACE852 /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CAC9E06708925371B8BFCC5484444DD /* String.swift */; }; - 8CFC4188603B9D2F1121730741BF4129 /* GradientLoadingBar-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EB5F6B9626AFB367351433E58717378 /* GradientLoadingBar-dummy.m */; }; - 9104476A4778BB28C819AB92599A5B6E /* UIImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54653ADB348C04B28B4D3455911AEFA0 /* UIImage.swift */; }; - 91B00DCD938BF31110A20C50E3C2FC58 /* Observable+Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F94EC0823DB851E6D0A4C81C33A0CEA /* Observable+Combine.swift */; }; - 928DBECCA86A6F98E4B42FA62C5FF051 /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1466DB0C211E9F079BFFFBDFDD4C1BD0 /* View.swift */; }; - 957508AA897C27F86D544CCF1CED1904 /* NSBezierPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = D067B70655B4D91995A1AD085829D7BB /* NSBezierPath.swift */; }; - 96E71750BD8C847E125FAB3C7A336224 /* URLRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 948F5A85ABC960EDF780E259FB3A8E23 /* URLRequest.swift */; }; - 97BEDF828D70F8BE2BE4E917DD992C48 /* NSImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80982F04B55AD6ED4052012DBA5D74E2 /* NSImage.swift */; }; - 9A928C98ED7DC6E400590141FFF8184D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; - 9B00AEBE5F221FE9815159125313C0BD /* Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24E9153BF879D5DA5CDF2FF9BD6EE07A /* Wait.swift */; }; - 9D65BFC4B2C4B6102D6B7EC25A7CD739 /* NSViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B38ABB2556378E0FBBFAC5F022A3F36B /* NSViewController.swift */; }; - 9D6622CDE2793B13735F47C44A7743ED /* SnapshotTesting-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BF6AF65269318A0D0E1C541D8D659BB5 /* SnapshotTesting-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9F6B241BE1332F18DFCC2BF32E03C42C /* UIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 009FB438C78F42859CE255EDC7F22DB3 /* UIView.swift */; }; - A515BDBD2767A9B62C4204B56D536D5A /* GradientLoadingBar-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EA6885FB45B2DE2A16E806813F4448C3 /* GradientLoadingBar-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AE9CFFEF1A0418411A63B2FA919F82BC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; - AFE414B3E0D49B39A358DE524B0839D5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */; }; - BFD9C55A9E36054591864A3D066CEB4E /* Pods-GradientLoadingBar_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A9107CAA27BA0679345F24910903133 /* Pods-GradientLoadingBar_Tests-dummy.m */; }; - C56B3E1A07308BCC8376D15C735B1C25 /* CALayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9761D5B7A8B0AF3C2D31731AA1E42F26 /* CALayer.swift */; }; - CB196C7B05685E1D7FF662F7652BA500 /* LightweightObservable-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F0E19B3286278186EC4012CDF8CAA48F /* LightweightObservable-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CCF6BE5916BD8F64AACED287B1364524 /* Pods-GradientLoadingBar_SnapshotTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 172DF8516EF6D5757C3FBEF1C0CB52DC /* Pods-GradientLoadingBar_SnapshotTests-dummy.m */; }; - CFFD67104AE4ABBFEB3801F9B8149664 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33915C6CA41A4120CCCFDA0A30623E99 /* Async.swift */; }; - D0A29718080A06AB351F6FA41B725BEA /* XCTAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B8421185176594CFD7B0CCE69071B4F /* XCTAttachment.swift */; }; - D0B06346D30863B023F787D5D579420B /* Disposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C70A9626A5985B4F9075500CF16CE8C8 /* Disposable.swift */; }; - D3B742506DD86C2472678C4231F3CA7C /* GradientActivityIndicatorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02F507B925649BDDC9AD86D1081E2FDE /* GradientActivityIndicatorViewModel.swift */; }; - D3C4D4F28C0180E812B6BA5FC4F5015B /* UIViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BBB42D19B8EDB33AE63C1A34EAD81DE /* UIViewController.swift */; }; - D7AE9DBB6C5D2522EB24A673921F9365 /* SwiftUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E633CB1D426841C43DF3462991319C4 /* SwiftUIView.swift */; }; - DA787DFD55A7814418DE78F66BA70847 /* CaseIterable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A38BD36975B9051B989F73656223996F /* CaseIterable.swift */; }; - E0404744D0B923F648287A50A63209FB /* GradientLoadingBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 920B8BFECED5286B10CD4EAA43825EB6 /* GradientLoadingBarController.swift */; }; - E9F255F44A070FE2F4A65A212FAEF61F /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C882B82678DDD020D9056F5C439A303D /* Constants.swift */; }; - EB5F8B0D9E74FD8A1724B04E6AACFABE /* Snapshotting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DAABA5B241D32CC27078958069BCC5B /* Snapshotting.swift */; }; - EE9AE0164C3214055E15309068AA5167 /* GradientActivityIndicatorView+AnimateIsHidden.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55AAE272FE0A61E24BF8311A0DEE32D3 /* GradientActivityIndicatorView+AnimateIsHidden.swift */; }; - FEB8176EE5F7E44C5399D94BC6DE0C46 /* String+SpecialCharacters.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12C335B7DC098086708FA73A72EE357 /* String+SpecialCharacters.swift */; }; + 0609895628611E712C728AA3CF036521 /* Observable+Equatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 082D8D0BFB1BCB9BD18458384665899A /* Observable+Equatable.swift */; }; + 08ECE12BF5A805361343CCA001A2E503 /* Disposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E095987C4CAE2F889232834505A5D0F9 /* Disposable.swift */; }; + 0ACD0ACD5263B4D09556739F7926FF96 /* NotchGradientLoadingBarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD3143D9C8FC90D2EA4A1C2C40DBD47B /* NotchGradientLoadingBarViewModel.swift */; }; + 110C6F18C17D074E76617348CD73E2FE /* NotchGradientLoadingBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5728A1B060B328908F33E4940A320F8 /* NotchGradientLoadingBarController.swift */; }; + 2358ECACBD675FFBFDBA36A56A0F7CCA /* Pods-ExampleTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BDD419F652F3675D32741451E718393 /* Pods-ExampleTests-dummy.m */; }; + 23BE1276E2F0185E449107447145175A /* Observable+KeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = A482DB85D620AA387395F03499CC3828 /* Observable+KeyPath.swift */; }; + 2821E8728C4AFEFC3749359F2E134EB5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + 4A0E4E446BEDFF8D0A790B77EC15FEA7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + 68C5DB73151103C8F43EF26688EE5600 /* GradientLoadingBarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCF5D271A78C27CCB58CF185AAB1F02A /* GradientLoadingBarViewModel.swift */; }; + 6FFBF94E8163A16367C42D61BF77DAA6 /* GradientActivityIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01878D225E1A7C6B3CDD94F2608F4D72 /* GradientActivityIndicatorView.swift */; }; + 733E738EB448BE03E562928656A6F4B6 /* LightweightObservable-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F1636BA6BA0D07871777A395C031882 /* LightweightObservable-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 76CEDD6AAA05A3247BB54278B730B272 /* GradientLoadingBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFC12B93FC53CC45081B03DB6B4EFEA2 /* GradientLoadingBarController.swift */; }; + 7719DCFF4EB1CC0969C674E77B243E38 /* Observable+Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = D94404FAD4CDC391E8B39C8BE848297B /* Observable+Combine.swift */; }; + 7FEA4E3E743874332EE3276AB7A88201 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4E8AD880DBC9FD367B825B3448745B0 /* Observable.swift */; }; + 8C6A97407F5503C0A8E9A230055825FC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + 8CFC4188603B9D2F1121730741BF4129 /* GradientLoadingBar-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FDF5B122F650A2634FB3C234A25C151D /* GradientLoadingBar-dummy.m */; }; + 8D39C1B6F1FF25F50A740038A5175EE0 /* LightweightObservable-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F68E85A90B9AF768C61F63A80C28F574 /* LightweightObservable-dummy.m */; }; + 9A928C98ED7DC6E400590141FFF8184D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + A515BDBD2767A9B62C4204B56D536D5A /* GradientLoadingBar-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 74F3E929AF83C1E4C9BC46B633924476 /* GradientLoadingBar-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B75C5770C7B1F07197F749756B259693 /* Pods-Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 19D02D64B16A88E3C04AA24A2931D027 /* Pods-Example-dummy.m */; }; + C2F7B05729193ABF3D3185603B6DC3BD /* Pods-ExampleTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 97F60369B21C7504D22C2F3E0C10FA35 /* Pods-ExampleTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D3B742506DD86C2472678C4231F3CA7C /* GradientActivityIndicatorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7E18A2258A5D30ACEAA1A0A8264FD2D /* GradientActivityIndicatorViewModel.swift */; }; + D89148BFC07632D1FE62D5CF4616C2E8 /* Pods-Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B41E79C10D2183B4E17863A56C910697 /* Pods-Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E9F255F44A070FE2F4A65A212FAEF61F /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C77E2A4AC6C090C3B4708BCEF61A594D /* Constants.swift */; }; + EE9AE0164C3214055E15309068AA5167 /* GradientActivityIndicatorView+AnimateIsHidden.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58459B178EBD2B9585E50F15D67EE23 /* GradientActivityIndicatorView+AnimateIsHidden.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 276CABBD3804115B644A56F123562956 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 086F937CFC9099EB74E4B66BE7CBCB93; - remoteInfo = LightweightObservable; - }; - 4012369D0A6B33A2D28988DC420728A7 /* PBXContainerItemProxy */ = { + 3B50FE1AC0645972DDF6EB1B99BB3C16 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = B951B6FCD3E55AF969FBA9F7B476B877; remoteInfo = SwiftConfigurationFiles; }; - 477DC7169CB4E1C57BA666CCE84BC9B5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = AD9297F9E6CC3E50EDCFECA0A77800B7; - remoteInfo = GradientLoadingBar; - }; - 5DF2B2B5427040C6011055367B351C8F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = E0B6892AAEBA4792BFD4534123482521; - remoteInfo = "Pods-GradientLoadingBar_Example"; - }; - 7633C8BB8928691939C63C8BF8F96578 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1CD0618C486973D5588EF20D2E8C0AEA; - remoteInfo = SwiftFormat; - }; - 8041B7D6F8DD028336D0B093E2B499EA /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = ADEAE7CDD604DE4F3072E6021A314487; - remoteInfo = SnapshotTesting; - }; - D403D63645BB96686AC4FFCF3FF0AA06 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 086F937CFC9099EB74E4B66BE7CBCB93; - remoteInfo = LightweightObservable; - }; - DC3A7A550F1D5D217989DBABEEEB6183 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = E0B6892AAEBA4792BFD4534123482521; - remoteInfo = "Pods-GradientLoadingBar_Example"; - }; - DF9B978CB494BA35B1C47288F181E799 /* PBXContainerItemProxy */ = { + 574AC9F9C31C74297B9524586A2FF89C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 52B60EC2A583F24ACBB69C113F5488B9; remoteInfo = SwiftLint; }; + 67C503C3B610E205D76A93A310ED216B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 086F937CFC9099EB74E4B66BE7CBCB93; + remoteInfo = LightweightObservable; + }; + 8DEC5A0BAF9296A07CDC5D52A125E546 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 086F937CFC9099EB74E4B66BE7CBCB93; + remoteInfo = LightweightObservable; + }; + AE04EB7A77A73FD0483A2988C6F93381 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0AEE99A309977BD12A049FF48AF9BA4B; + remoteInfo = "Pods-Example"; + }; + DC4BCACE451F2C82FD27594406E66FFB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = AD9297F9E6CC3E50EDCFECA0A77800B7; + remoteInfo = GradientLoadingBar; + }; + ECF9CF08B639EFC57E70D22AB04DFCBD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1CD0618C486973D5588EF20D2E8C0AEA; + remoteInfo = SwiftFormat; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 009FB438C78F42859CE255EDC7F22DB3 /* UIView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIView.swift; path = Sources/SnapshotTesting/Snapshotting/UIView.swift; sourceTree = ""; }; - 01F10362867DE1BC975D30D2B32F0ECA /* GradientLoadingBar-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "GradientLoadingBar-Info.plist"; sourceTree = ""; }; - 02F507B925649BDDC9AD86D1081E2FDE /* GradientActivityIndicatorViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GradientActivityIndicatorViewModel.swift; sourceTree = ""; }; - 034096A652454C479D78A11AF0738191 /* SnapshotTesting-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapshotTesting-prefix.pch"; sourceTree = ""; }; - 04D67E1AC2B476618545A95A11B5B811 /* SwiftConfigurationFiles.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftConfigurationFiles.release.xcconfig; sourceTree = ""; }; - 074CBA3DACEF2667EFED2C72D45A2403 /* LightweightObservable.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = LightweightObservable.release.xcconfig; sourceTree = ""; }; - 08E87DFECD69E46292154E099AB8D144 /* SwiftLint.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftLint.debug.xcconfig; sourceTree = ""; }; - 0A6AFF4C6A1BA30CE9B8A5B1CEDC407A /* NotchGradientLoadingBarViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NotchGradientLoadingBarViewModel.swift; sourceTree = ""; }; - 0E633CB1D426841C43DF3462991319C4 /* SwiftUIView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftUIView.swift; path = Sources/SnapshotTesting/Snapshotting/SwiftUIView.swift; sourceTree = ""; }; - 108AACC96F7DBC089B0840E09F19C698 /* Pods-GradientLoadingBar_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GradientLoadingBar_Example.release.xcconfig"; sourceTree = ""; }; - 132C18988D60EF85736C043D43C19E57 /* Pods-GradientLoadingBar_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-GradientLoadingBar_Tests-umbrella.h"; sourceTree = ""; }; - 13520AB8B3790CE3CEDCBBEEE1EF237A /* Pods-GradientLoadingBar_SnapshotTests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-GradientLoadingBar_SnapshotTests"; path = Pods_GradientLoadingBar_SnapshotTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 143F2717B1133164FBCC65A2DF3C3C67 /* LightweightObservable-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "LightweightObservable-Info.plist"; sourceTree = ""; }; - 1466DB0C211E9F079BFFFBDFDD4C1BD0 /* View.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = View.swift; path = Sources/SnapshotTesting/Common/View.swift; sourceTree = ""; }; - 1679A4CF92D4ADFB15F8200201EC3AE5 /* Pods-GradientLoadingBar_SnapshotTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GradientLoadingBar_SnapshotTests-frameworks.sh"; sourceTree = ""; }; - 1711FC18263D47D46851F0433A93F110 /* Pods-GradientLoadingBar_Tests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-GradientLoadingBar_Tests"; path = Pods_GradientLoadingBar_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 172DF8516EF6D5757C3FBEF1C0CB52DC /* Pods-GradientLoadingBar_SnapshotTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-GradientLoadingBar_SnapshotTests-dummy.m"; sourceTree = ""; }; - 195C9E50C429616417E6F569B20896A6 /* Diff.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Diff.swift; path = Sources/SnapshotTesting/Diff.swift; sourceTree = ""; }; - 1A9107CAA27BA0679345F24910903133 /* Pods-GradientLoadingBar_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-GradientLoadingBar_Tests-dummy.m"; sourceTree = ""; }; - 1B664F0A7F5E59140F761C16069995E9 /* Pods-GradientLoadingBar_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GradientLoadingBar_Tests.release.xcconfig"; sourceTree = ""; }; - 1CA5ADE67427DB590BC5414E8E4498BA /* Pods-GradientLoadingBar_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GradientLoadingBar_Tests-acknowledgements.plist"; sourceTree = ""; }; - 1CAC9E06708925371B8BFCC5484444DD /* String.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = String.swift; path = Sources/SnapshotTesting/Snapshotting/String.swift; sourceTree = ""; }; - 1F94EC0823DB851E6D0A4C81C33A0CEA /* Observable+Combine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Combine.swift"; path = "LightweightObservable/Extensions/Observable+Combine.swift"; sourceTree = ""; }; - 2009541AEFF2EFDA3802BF5CF3C8C6ED /* SnapshotTesting.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SnapshotTesting.modulemap; sourceTree = ""; }; - 219D91F90F2D4E48019FF8920700C17F /* Pods-GradientLoadingBar_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-GradientLoadingBar_Tests-acknowledgements.markdown"; sourceTree = ""; }; - 24E9153BF879D5DA5CDF2FF9BD6EE07A /* Wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Wait.swift; path = Sources/SnapshotTesting/Extensions/Wait.swift; sourceTree = ""; }; - 2D246858B1E28690CC1921F1EC8328E1 /* Pods-GradientLoadingBar_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-GradientLoadingBar_Example-frameworks.sh"; sourceTree = ""; }; - 2E06D57A35648ECBC97644D217B868BD /* UIBezierPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIBezierPath.swift; path = Sources/SnapshotTesting/Snapshotting/UIBezierPath.swift; sourceTree = ""; }; - 2E16A843354D5BC8D4DA54D9AEFEAAB2 /* Pods-GradientLoadingBar_SnapshotTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GradientLoadingBar_SnapshotTests-acknowledgements.plist"; sourceTree = ""; }; - 2EB5F6B9626AFB367351433E58717378 /* GradientLoadingBar-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GradientLoadingBar-dummy.m"; sourceTree = ""; }; - 321E0EECA8025D4E3C0406B264AB9F4A /* SwiftFormat.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftFormat.release.xcconfig; sourceTree = ""; }; - 33915C6CA41A4120CCCFDA0A30623E99 /* Async.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Async.swift; path = Sources/SnapshotTesting/Async.swift; sourceTree = ""; }; - 371D3CDC7543AF863ADAE5F4D66D793C /* Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Internal.swift; path = Sources/SnapshotTesting/Common/Internal.swift; sourceTree = ""; }; - 392F0D54DA316F76F7B4DF63E033D602 /* SnapshotTesting-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SnapshotTesting-Info.plist"; sourceTree = ""; }; - 39724ABA4E40A364B25F01F3E3CE31EC /* SwiftLint.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftLint.release.xcconfig; sourceTree = ""; }; - 3A900E1CFF1D76CF61DDF7358F5C8863 /* Pods-GradientLoadingBar_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-GradientLoadingBar_Example-umbrella.h"; sourceTree = ""; }; - 3C6A379C135C84644F189B8056CCBA04 /* Pods-GradientLoadingBar_Example */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-GradientLoadingBar_Example"; path = Pods_GradientLoadingBar_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 412F23BDA9646A7744AC81F4006F0817 /* GradientLoadingBar.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GradientLoadingBar.release.xcconfig; sourceTree = ""; }; - 432F44D6009308BDE038D8F587A32CC7 /* GradientLoadingBar.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = GradientLoadingBar.modulemap; sourceTree = ""; }; - 4342969D6D37396C136697D0BC1C2A06 /* SceneKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SceneKit.swift; path = Sources/SnapshotTesting/Snapshotting/SceneKit.swift; sourceTree = ""; }; - 4371A74F9A6D74628527A30E755EFF25 /* Pods-GradientLoadingBar_SnapshotTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-GradientLoadingBar_SnapshotTests-umbrella.h"; sourceTree = ""; }; - 4B8421185176594CFD7B0CCE69071B4F /* XCTAttachment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XCTAttachment.swift; path = Sources/SnapshotTesting/Common/XCTAttachment.swift; sourceTree = ""; }; - 523B7174E480C3FA74F83ABE7056DE17 /* Observable+Equatable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Equatable.swift"; path = "LightweightObservable/Extensions/Observable+Equatable.swift"; sourceTree = ""; }; - 54653ADB348C04B28B4D3455911AEFA0 /* UIImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIImage.swift; path = Sources/SnapshotTesting/Snapshotting/UIImage.swift; sourceTree = ""; }; - 55AAE272FE0A61E24BF8311A0DEE32D3 /* GradientActivityIndicatorView+AnimateIsHidden.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "GradientActivityIndicatorView+AnimateIsHidden.swift"; sourceTree = ""; }; - 5EB07AAAC446BF6E90F73800EBBC633A /* readme.md */ = {isa = PBXFileReference; includeInIndex = 1; path = readme.md; sourceTree = ""; }; - 5EBC8F300895E39EA0DF6D6B2B5E6BCD /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - 652D9AA358DBDB2DBA1CFB02CCBA8DC4 /* Pods-GradientLoadingBar_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GradientLoadingBar_Tests-Info.plist"; sourceTree = ""; }; + 01878D225E1A7C6B3CDD94F2608F4D72 /* GradientActivityIndicatorView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GradientActivityIndicatorView.swift; sourceTree = ""; }; + 06107814E96EF26954D68A89118CCEBC /* GradientLoadingBar-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GradientLoadingBar-prefix.pch"; sourceTree = ""; }; + 07DADC1D08E9BD634FBC308032199D6E /* Pods-ExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ExampleTests.release.xcconfig"; sourceTree = ""; }; + 082D8D0BFB1BCB9BD18458384665899A /* Observable+Equatable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Equatable.swift"; path = "LightweightObservable/Extensions/Observable+Equatable.swift"; sourceTree = ""; }; + 09C5334E28CBC780E7A2FC81DE7DCCB7 /* Pods-Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-Info.plist"; sourceTree = ""; }; + 0B7AF892C2E156E6B6122E080493A0A5 /* LightweightObservable.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = LightweightObservable.modulemap; sourceTree = ""; }; + 0C7BE7BD63270B53563BEB150E1DA59E /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.debug.xcconfig"; sourceTree = ""; }; + 19D02D64B16A88E3C04AA24A2931D027 /* Pods-Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Example-dummy.m"; sourceTree = ""; }; + 19F1D0B8781A40709AEB69CB400AFB9D /* Pods-Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-acknowledgements.plist"; sourceTree = ""; }; + 1F667CC0E19EAF34E5A4119E2121F585 /* Pods-Example */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-Example"; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 20341418D6A0CAEC5130A5C357532116 /* GradientLoadingBar-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "GradientLoadingBar-Info.plist"; sourceTree = ""; }; + 297F0661CA6513B73F36B371A2CCCA6F /* SwiftFormat.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftFormat.release.xcconfig; sourceTree = ""; }; + 2F26C179F9B8B899133211EBB95BBADB /* SwiftConfigurationFiles.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftConfigurationFiles.debug.xcconfig; sourceTree = ""; }; + 3D6CAD1BF1BCC0A7D1FB87ABF0D5205D /* Pods-Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Example-acknowledgements.markdown"; sourceTree = ""; }; + 5BDCBBB29F528C498323B4AA3F5C5FCD /* LightweightObservable.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = LightweightObservable.release.xcconfig; sourceTree = ""; }; + 62C623D1D471AB2511470ACF857D3FE2 /* Pods-ExampleTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ExampleTests-acknowledgements.markdown"; sourceTree = ""; }; + 630CABE8F692FCDBFD1B122A2D0CE388 /* Pods-ExampleTests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-ExampleTests"; path = Pods_ExampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 67873E92210DD4E777C49C6E8AEDC108 /* GradientLoadingBar */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = GradientLoadingBar; path = GradientLoadingBar.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 67DB9A65EEF58E7930846A0CEE3DA0F2 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; - 69838A921E83418B945E72EB342809F5 /* Pods-GradientLoadingBar_SnapshotTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GradientLoadingBar_SnapshotTests.debug.xcconfig"; sourceTree = ""; }; - 6BBB42D19B8EDB33AE63C1A34EAD81DE /* UIViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIViewController.swift; path = Sources/SnapshotTesting/Snapshotting/UIViewController.swift; sourceTree = ""; }; - 72E1E31C3B08F491DD072C74B13669AB /* GradientLoadingBar.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GradientLoadingBar.debug.xcconfig; sourceTree = ""; }; - 785E1BC5584D16AC9173E04DE45A6036 /* LightweightObservable-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "LightweightObservable-dummy.m"; sourceTree = ""; }; - 7BFBD5D32218C4E5AE0EE65833E6E9BE /* GradientLoadingBar.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = GradientLoadingBar.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 80982F04B55AD6ED4052012DBA5D74E2 /* NSImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSImage.swift; path = Sources/SnapshotTesting/Snapshotting/NSImage.swift; sourceTree = ""; }; - 8194C4CB9E683FC366F48513ED1B1A9A /* Pods-GradientLoadingBar_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-GradientLoadingBar_Example-dummy.m"; sourceTree = ""; }; - 86A83C5000A82493337A3DFC79D0B56F /* PlistEncoder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PlistEncoder.swift; path = Sources/SnapshotTesting/Common/PlistEncoder.swift; sourceTree = ""; }; - 89D6B1C70C53B6DA6E6D0456F0F7DBD8 /* Observable+KeyPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+KeyPath.swift"; path = "LightweightObservable/Extensions/Observable+KeyPath.swift"; sourceTree = ""; }; - 8B75864FEFCDD0C986F965BC9B1D2A1B /* LightweightObservable.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = LightweightObservable.debug.xcconfig; sourceTree = ""; }; - 8BC3C52825EB9FF41BCF9CDBAD1CFBFC /* GradientLoadingBarViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GradientLoadingBarViewModel.swift; sourceTree = ""; }; - 8D70287148495215062E5030BA6267BB /* Codable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Codable.swift; path = Sources/SnapshotTesting/Snapshotting/Codable.swift; sourceTree = ""; }; - 8DAABA5B241D32CC27078958069BCC5B /* Snapshotting.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Snapshotting.swift; path = Sources/SnapshotTesting/Snapshotting.swift; sourceTree = ""; }; - 920B8BFECED5286B10CD4EAA43825EB6 /* GradientLoadingBarController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GradientLoadingBarController.swift; path = GradientLoadingBar/Classes/GradientLoadingBarController.swift; sourceTree = ""; }; - 92595228CA62A3593A599AE616D42DC9 /* LightweightObservable-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LightweightObservable-prefix.pch"; sourceTree = ""; }; - 948F5A85ABC960EDF780E259FB3A8E23 /* URLRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLRequest.swift; path = Sources/SnapshotTesting/Snapshotting/URLRequest.swift; sourceTree = ""; }; - 94F6960E2E6F81EA1AEEEC7CAC13C054 /* NSView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSView.swift; path = Sources/SnapshotTesting/Snapshotting/NSView.swift; sourceTree = ""; }; - 9761D5B7A8B0AF3C2D31731AA1E42F26 /* CALayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CALayer.swift; path = Sources/SnapshotTesting/Snapshotting/CALayer.swift; sourceTree = ""; }; - 9801722F42CF5540558E2186724E2F08 /* AssertInlineSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertInlineSnapshot.swift; path = Sources/SnapshotTesting/AssertInlineSnapshot.swift; sourceTree = ""; }; - 9D21619E3127A33326194FAC5E0241D7 /* SnapshotTesting.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapshotTesting.debug.xcconfig; sourceTree = ""; }; + 6BDD419F652F3675D32741451E718393 /* Pods-ExampleTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ExampleTests-dummy.m"; sourceTree = ""; }; + 6FDE3CD52E416082AE176DBDB70626CB /* Pods-ExampleTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ExampleTests-Info.plist"; sourceTree = ""; }; + 71872C2E0B6E8DF2819ECF73055406F6 /* readme.md */ = {isa = PBXFileReference; includeInIndex = 1; path = readme.md; sourceTree = ""; }; + 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 74F3E929AF83C1E4C9BC46B633924476 /* GradientLoadingBar-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GradientLoadingBar-umbrella.h"; sourceTree = ""; }; + 8669497E8F926A3169C00AF47826AAD6 /* SwiftFormat.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftFormat.debug.xcconfig; sourceTree = ""; }; + 87D32B363FBDF3F00313D21994B675AB /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; + 92594448460C4FAEA07450F6CA28523D /* GradientLoadingBar.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = GradientLoadingBar.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 97F60369B21C7504D22C2F3E0C10FA35 /* Pods-ExampleTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ExampleTests-umbrella.h"; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9DD32929B122D2561D1E99468EECDBF7 /* Pods-GradientLoadingBar_SnapshotTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GradientLoadingBar_SnapshotTests.release.xcconfig"; sourceTree = ""; }; - A037DBBCCACBFACB5C39A80B1C273043 /* SnapshotTesting */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SnapshotTesting; path = SnapshotTesting.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A38BD36975B9051B989F73656223996F /* CaseIterable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CaseIterable.swift; path = Sources/SnapshotTesting/Snapshotting/CaseIterable.swift; sourceTree = ""; }; - A652F20CE7EE44E64565C2120B651665 /* Pods-GradientLoadingBar_SnapshotTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-GradientLoadingBar_SnapshotTests.modulemap"; sourceTree = ""; }; - A95E7032DE35DF972EF7FEC8A884303B /* Pods-GradientLoadingBar_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GradientLoadingBar_Example.debug.xcconfig"; sourceTree = ""; }; - AE02F290421D0044A7B9B488A50DBD6C /* SwiftConfigurationFiles.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftConfigurationFiles.debug.xcconfig; sourceTree = ""; }; - B1518F0564D9405495037F4713C4F143 /* Pods-GradientLoadingBar_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-GradientLoadingBar_Tests.modulemap"; sourceTree = ""; }; - B27AAA41B1DEF56C8059867126A15A38 /* Pods-GradientLoadingBar_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GradientLoadingBar_Example-Info.plist"; sourceTree = ""; }; - B38ABB2556378E0FBBFAC5F022A3F36B /* NSViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSViewController.swift; path = Sources/SnapshotTesting/Snapshotting/NSViewController.swift; sourceTree = ""; }; - B7FF35F32E5C06204CAF8183AC101D53 /* Pods-GradientLoadingBar_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GradientLoadingBar_Example-acknowledgements.plist"; sourceTree = ""; }; - BBB6B9166CB669730E6755D0283ACC89 /* GradientLoadingBar-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GradientLoadingBar-prefix.pch"; sourceTree = ""; }; - BEBA37204701F79F631433A8EEF190E7 /* Pods-GradientLoadingBar_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-GradientLoadingBar_Example-acknowledgements.markdown"; sourceTree = ""; }; - BF6AF65269318A0D0E1C541D8D659BB5 /* SnapshotTesting-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapshotTesting-umbrella.h"; sourceTree = ""; }; - C70A9626A5985B4F9075500CF16CE8C8 /* Disposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposable.swift; path = LightweightObservable/Disposable.swift; sourceTree = ""; }; - C75C124F1A4261FB6DC06040CA090D87 /* LightweightObservable.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = LightweightObservable.modulemap; sourceTree = ""; }; - C882B82678DDD020D9056F5C439A303D /* Constants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; - C9CADA2B0AD5E703D468B06A67A80492 /* NotchGradientLoadingBarController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotchGradientLoadingBarController.swift; path = GradientLoadingBar/Classes/NotchGradientLoadingBarController.swift; sourceTree = ""; }; - CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - CE73B31D3D042300127FE7545DC9A288 /* Data.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Data.swift; path = Sources/SnapshotTesting/Snapshotting/Data.swift; sourceTree = ""; }; - CEB65A52E203646F5F85230CB37055A7 /* AssertSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertSnapshot.swift; path = Sources/SnapshotTesting/AssertSnapshot.swift; sourceTree = ""; }; - CED5F046F3966BF1758156DB5C0EAC5E /* Diffing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Diffing.swift; path = Sources/SnapshotTesting/Diffing.swift; sourceTree = ""; }; - D067B70655B4D91995A1AD085829D7BB /* NSBezierPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSBezierPath.swift; path = Sources/SnapshotTesting/Snapshotting/NSBezierPath.swift; sourceTree = ""; }; - D90A4312109DE68F0350FBB5DD551816 /* CGPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CGPath.swift; path = Sources/SnapshotTesting/Snapshotting/CGPath.swift; sourceTree = ""; }; - DFDBA3729D272425F9E33F46EF920BFF /* SnapshotTesting.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapshotTesting.release.xcconfig; sourceTree = ""; }; - E0D90990792D653F523A884442305989 /* Pods-GradientLoadingBar_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-GradientLoadingBar_Example.modulemap"; sourceTree = ""; }; - E2FF4849BA9ABFDAF933BC11BBE59A72 /* Description.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Description.swift; path = Sources/SnapshotTesting/Snapshotting/Description.swift; sourceTree = ""; }; - E43F95A56840098ECFFB3426EC236F54 /* SwiftFormat.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftFormat.debug.xcconfig; sourceTree = ""; }; - E71E37779A210E3F9958FB4B465CC3B6 /* Any.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Any.swift; path = Sources/SnapshotTesting/Snapshotting/Any.swift; sourceTree = ""; }; - E7B244F28A1FD6EEA4564C67C401D680 /* SnapshotTestCase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SnapshotTestCase.swift; path = Sources/SnapshotTesting/SnapshotTestCase.swift; sourceTree = ""; }; - E7C32BCB3A8CDE7A967257032D2CB146 /* SpriteKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SpriteKit.swift; path = Sources/SnapshotTesting/Snapshotting/SpriteKit.swift; sourceTree = ""; }; - E86B6F99751F56AA8AC35B5835DE4722 /* SnapshotTesting-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SnapshotTesting-dummy.m"; sourceTree = ""; }; - EA6885FB45B2DE2A16E806813F4448C3 /* GradientLoadingBar-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "GradientLoadingBar-umbrella.h"; sourceTree = ""; }; - EDFA33C3D1AF4C2C0CDAFFE7D06B88AF /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Observable.swift; path = LightweightObservable/Observable.swift; sourceTree = ""; }; - F0E19B3286278186EC4012CDF8CAA48F /* LightweightObservable-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LightweightObservable-umbrella.h"; sourceTree = ""; }; - F12C335B7DC098086708FA73A72EE357 /* String+SpecialCharacters.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+SpecialCharacters.swift"; path = "Sources/SnapshotTesting/Common/String+SpecialCharacters.swift"; sourceTree = ""; }; + 9E727A4C9E4C166DCC2CAA15F7ACF299 /* LightweightObservable-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "LightweightObservable-Info.plist"; sourceTree = ""; }; + 9F1636BA6BA0D07871777A395C031882 /* LightweightObservable-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LightweightObservable-umbrella.h"; sourceTree = ""; }; + A3129AC48F73935634A39479CA444F46 /* GradientLoadingBar.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GradientLoadingBar.release.xcconfig; sourceTree = ""; }; + A482DB85D620AA387395F03499CC3828 /* Observable+KeyPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+KeyPath.swift"; path = "LightweightObservable/Extensions/Observable+KeyPath.swift"; sourceTree = ""; }; + A610260AC2D3CAC2947252EE2F3B1D56 /* SwiftLint.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftLint.release.xcconfig; sourceTree = ""; }; + AC4F0BC942FDBFD7B9FF3908C5E1A4BB /* Pods-ExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ExampleTests.debug.xcconfig"; sourceTree = ""; }; + AD3143D9C8FC90D2EA4A1C2C40DBD47B /* NotchGradientLoadingBarViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NotchGradientLoadingBarViewModel.swift; sourceTree = ""; }; + B41E79C10D2183B4E17863A56C910697 /* Pods-Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Example-umbrella.h"; sourceTree = ""; }; + B58459B178EBD2B9585E50F15D67EE23 /* GradientActivityIndicatorView+AnimateIsHidden.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "GradientActivityIndicatorView+AnimateIsHidden.swift"; sourceTree = ""; }; + B9029B0C1AFA347190D04C606F478112 /* GradientLoadingBar.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GradientLoadingBar.debug.xcconfig; sourceTree = ""; }; + BCF5D271A78C27CCB58CF185AAB1F02A /* GradientLoadingBarViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GradientLoadingBarViewModel.swift; sourceTree = ""; }; + C024E2AF9C50E93F3BA2C25A88AD67F0 /* LightweightObservable.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = LightweightObservable.debug.xcconfig; sourceTree = ""; }; + C446CE8F49F5478E670868D947F52FE5 /* Pods-ExampleTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ExampleTests.modulemap"; sourceTree = ""; }; + C4E8AD880DBC9FD367B825B3448745B0 /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Observable.swift; path = LightweightObservable/Observable.swift; sourceTree = ""; }; + C77E2A4AC6C090C3B4708BCEF61A594D /* Constants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + CBCB66E6B77C07333D85DC27A19A6477 /* SwiftConfigurationFiles.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftConfigurationFiles.release.xcconfig; sourceTree = ""; }; + CFC12B93FC53CC45081B03DB6B4EFEA2 /* GradientLoadingBarController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GradientLoadingBarController.swift; path = GradientLoadingBar/GradientLoadingBarController.swift; sourceTree = ""; }; + D5103732AE89972930C6F57A19C61DDB /* SwiftLint.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftLint.debug.xcconfig; sourceTree = ""; }; + D6135EDF389122C641DC811FC623312E /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.release.xcconfig"; sourceTree = ""; }; + D78DFC26A262C9B6DD87AC449DE9C917 /* GradientLoadingBar.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = GradientLoadingBar.modulemap; sourceTree = ""; }; + D876BA00A58E54915A12F7B47D3C649C /* Pods-ExampleTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ExampleTests-acknowledgements.plist"; sourceTree = ""; }; + D94404FAD4CDC391E8B39C8BE848297B /* Observable+Combine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Combine.swift"; path = "LightweightObservable/Extensions/Observable+Combine.swift"; sourceTree = ""; }; + E095987C4CAE2F889232834505A5D0F9 /* Disposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposable.swift; path = LightweightObservable/Disposable.swift; sourceTree = ""; }; + E7DB0D6B64BA08002C7DC9165D10D9F4 /* LightweightObservable-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LightweightObservable-prefix.pch"; sourceTree = ""; }; + E7E18A2258A5D30ACEAA1A0A8264FD2D /* GradientActivityIndicatorViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GradientActivityIndicatorViewModel.swift; sourceTree = ""; }; F196AAA163469B17170E99B82C7C4C0A /* LightweightObservable */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = LightweightObservable; path = LightweightObservable.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F7B1750DE470F045803DE2094D5F7264 /* Pods-GradientLoadingBar_SnapshotTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-GradientLoadingBar_SnapshotTests-Info.plist"; sourceTree = ""; }; - FBAEAE91BB9B77006558E537894C33C5 /* Pods-GradientLoadingBar_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-GradientLoadingBar_Tests.debug.xcconfig"; sourceTree = ""; }; - FBDE3024CEF242BA05EBFE42A753D313 /* GradientActivityIndicatorView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GradientActivityIndicatorView.swift; sourceTree = ""; }; - FF135E1D23F08BE7F1D7FFC86260EF9B /* Pods-GradientLoadingBar_SnapshotTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-GradientLoadingBar_SnapshotTests-acknowledgements.markdown"; sourceTree = ""; }; + F1A45E0B6EB826771A16350B666D273E /* Pods-Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Example-frameworks.sh"; sourceTree = ""; }; + F5728A1B060B328908F33E4940A320F8 /* NotchGradientLoadingBarController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NotchGradientLoadingBarController.swift; path = GradientLoadingBar/NotchGradientLoadingBarController.swift; sourceTree = ""; }; + F68E85A90B9AF768C61F63A80C28F574 /* LightweightObservable-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "LightweightObservable-dummy.m"; sourceTree = ""; }; + FDF5B122F650A2634FB3C234A25C151D /* GradientLoadingBar-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "GradientLoadingBar-dummy.m"; sourceTree = ""; }; + FEF8A4D0CFDD18F4F07E729EB41C30C2 /* Pods-Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Example.modulemap"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -293,290 +187,193 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 451D4F703C0E61819FF0AC5A649A439F /* Frameworks */ = { + 80CB26F1AFBA6BA2257DE8F446122E81 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 388F17A5CB909F346CB831BE157AC83C /* Foundation.framework in Frameworks */, + 4A0E4E446BEDFF8D0A790B77EC15FEA7 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A3E6F437DCDBD6A93A734772AFD5F236 /* Frameworks */ = { + 881B870922A1040A539D6DDC65BEF831 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - AFE414B3E0D49B39A358DE524B0839D5 /* Foundation.framework in Frameworks */, - 4A8EE45D20D442748189087F6A430A75 /* XCTest.framework in Frameworks */, + 2821E8728C4AFEFC3749359F2E134EB5 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BAC4B04FC3FA2B79DAC279C0D21C8C5C /* Frameworks */ = { + A954471A8A4F347E9DDF93C0716D534D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - AE9CFFEF1A0418411A63B2FA919F82BC /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ED5AC0D962E33B70032B2026DD2CC8B2 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 6754C82145E0C59C9AF97D91D7321D72 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F646365FBEF9107873B7F1590CD0853A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 8368D89E28CF3A09A2A4CBBA83663DCD /* Foundation.framework in Frameworks */, + 8C6A97407F5503C0A8E9A230055825FC /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 04671A532A737A9698DE71F7DEA1802A /* Support Files */ = { + 1538BF0E3865FAEC282AE36A733D7F5F /* SwiftLint */ = { isa = PBXGroup; children = ( - AE02F290421D0044A7B9B488A50DBD6C /* SwiftConfigurationFiles.debug.xcconfig */, - 04D67E1AC2B476618545A95A11B5B811 /* SwiftConfigurationFiles.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/SwiftConfigurationFiles"; - sourceTree = ""; - }; - 11743C6FFCADF6A7B5BE6FA435115EA3 /* Views */ = { - isa = PBXGroup; - children = ( - FBDE3024CEF242BA05EBFE42A753D313 /* GradientActivityIndicatorView.swift */, - 55AAE272FE0A61E24BF8311A0DEE32D3 /* GradientActivityIndicatorView+AnimateIsHidden.swift */, - ); - name = Views; - path = GradientLoadingBar/Classes/Views; - sourceTree = ""; - }; - 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 974814B39C0012DECD183BBB91B32103 /* iOS */, - ); - name = Frameworks; - sourceTree = ""; - }; - 182051F58B71F1C24E92C50B91E729E9 /* Pods-GradientLoadingBar_Tests */ = { - isa = PBXGroup; - children = ( - B1518F0564D9405495037F4713C4F143 /* Pods-GradientLoadingBar_Tests.modulemap */, - 219D91F90F2D4E48019FF8920700C17F /* Pods-GradientLoadingBar_Tests-acknowledgements.markdown */, - 1CA5ADE67427DB590BC5414E8E4498BA /* Pods-GradientLoadingBar_Tests-acknowledgements.plist */, - 1A9107CAA27BA0679345F24910903133 /* Pods-GradientLoadingBar_Tests-dummy.m */, - 652D9AA358DBDB2DBA1CFB02CCBA8DC4 /* Pods-GradientLoadingBar_Tests-Info.plist */, - 132C18988D60EF85736C043D43C19E57 /* Pods-GradientLoadingBar_Tests-umbrella.h */, - FBAEAE91BB9B77006558E537894C33C5 /* Pods-GradientLoadingBar_Tests.debug.xcconfig */, - 1B664F0A7F5E59140F761C16069995E9 /* Pods-GradientLoadingBar_Tests.release.xcconfig */, - ); - name = "Pods-GradientLoadingBar_Tests"; - path = "Target Support Files/Pods-GradientLoadingBar_Tests"; - sourceTree = ""; - }; - 2AFC4759ECC4D53FF9953C3CFBE67078 /* Support Files */ = { - isa = PBXGroup; - children = ( - 2009541AEFF2EFDA3802BF5CF3C8C6ED /* SnapshotTesting.modulemap */, - E86B6F99751F56AA8AC35B5835DE4722 /* SnapshotTesting-dummy.m */, - 392F0D54DA316F76F7B4DF63E033D602 /* SnapshotTesting-Info.plist */, - 034096A652454C479D78A11AF0738191 /* SnapshotTesting-prefix.pch */, - BF6AF65269318A0D0E1C541D8D659BB5 /* SnapshotTesting-umbrella.h */, - 9D21619E3127A33326194FAC5E0241D7 /* SnapshotTesting.debug.xcconfig */, - DFDBA3729D272425F9E33F46EF920BFF /* SnapshotTesting.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/SnapshotTesting"; - sourceTree = ""; - }; - 2B23D09BF983A3F081B96D5579D08787 /* Support Files */ = { - isa = PBXGroup; - children = ( - 08E87DFECD69E46292154E099AB8D144 /* SwiftLint.debug.xcconfig */, - 39724ABA4E40A364B25F01F3E3CE31EC /* SwiftLint.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/SwiftLint"; - sourceTree = ""; - }; - 2BEFDB084B1FC055097BB3AF7230859C /* Pod */ = { - isa = PBXGroup; - children = ( - 7BFBD5D32218C4E5AE0EE65833E6E9BE /* GradientLoadingBar.podspec */, - 67DB9A65EEF58E7930846A0CEE3DA0F2 /* LICENSE */, - 5EB07AAAC446BF6E90F73800EBBC633A /* readme.md */, - ); - name = Pod; - sourceTree = ""; - }; - 42C5E31CFED75787FC35907ED840E206 /* Products */ = { - isa = PBXGroup; - children = ( - 67873E92210DD4E777C49C6E8AEDC108 /* GradientLoadingBar */, - F196AAA163469B17170E99B82C7C4C0A /* LightweightObservable */, - 3C6A379C135C84644F189B8056CCBA04 /* Pods-GradientLoadingBar_Example */, - 13520AB8B3790CE3CEDCBBEEE1EF237A /* Pods-GradientLoadingBar_SnapshotTests */, - 1711FC18263D47D46851F0433A93F110 /* Pods-GradientLoadingBar_Tests */, - A037DBBCCACBFACB5C39A80B1C273043 /* SnapshotTesting */, - ); - name = Products; - sourceTree = ""; - }; - 43AAC1AB1516723E83B3890B1D058A16 /* SwiftConfigurationFiles */ = { - isa = PBXGroup; - children = ( - 04671A532A737A9698DE71F7DEA1802A /* Support Files */, - ); - name = SwiftConfigurationFiles; - path = SwiftConfigurationFiles; - sourceTree = ""; - }; - 625395338A1C7013D0E5EA11C9A0F5B4 /* GradientLoadingBar */ = { - isa = PBXGroup; - children = ( - 920B8BFECED5286B10CD4EAA43825EB6 /* GradientLoadingBarController.swift */, - C9CADA2B0AD5E703D468B06A67A80492 /* NotchGradientLoadingBarController.swift */, - A8B491E4E7AD1B86A1B5A7A9DE523DEC /* Misc */, - 2BEFDB084B1FC055097BB3AF7230859C /* Pod */, - C7B4887CB582A60B2828150E550CA0C1 /* Support Files */, - 839E937F28D0B9CB9F457692610A394A /* ViewModel */, - 11743C6FFCADF6A7B5BE6FA435115EA3 /* Views */, - ); - name = GradientLoadingBar; - path = ../..; - sourceTree = ""; - }; - 810FDB3212C2E1BF5CEB60C53A119039 /* Pods-GradientLoadingBar_SnapshotTests */ = { - isa = PBXGroup; - children = ( - A652F20CE7EE44E64565C2120B651665 /* Pods-GradientLoadingBar_SnapshotTests.modulemap */, - FF135E1D23F08BE7F1D7FFC86260EF9B /* Pods-GradientLoadingBar_SnapshotTests-acknowledgements.markdown */, - 2E16A843354D5BC8D4DA54D9AEFEAAB2 /* Pods-GradientLoadingBar_SnapshotTests-acknowledgements.plist */, - 172DF8516EF6D5757C3FBEF1C0CB52DC /* Pods-GradientLoadingBar_SnapshotTests-dummy.m */, - 1679A4CF92D4ADFB15F8200201EC3AE5 /* Pods-GradientLoadingBar_SnapshotTests-frameworks.sh */, - F7B1750DE470F045803DE2094D5F7264 /* Pods-GradientLoadingBar_SnapshotTests-Info.plist */, - 4371A74F9A6D74628527A30E755EFF25 /* Pods-GradientLoadingBar_SnapshotTests-umbrella.h */, - 69838A921E83418B945E72EB342809F5 /* Pods-GradientLoadingBar_SnapshotTests.debug.xcconfig */, - 9DD32929B122D2561D1E99468EECDBF7 /* Pods-GradientLoadingBar_SnapshotTests.release.xcconfig */, - ); - name = "Pods-GradientLoadingBar_SnapshotTests"; - path = "Target Support Files/Pods-GradientLoadingBar_SnapshotTests"; - sourceTree = ""; - }; - 8117A0062130D047C63C2824B16563F9 /* SwiftFormat */ = { - isa = PBXGroup; - children = ( - 82BF8F914435313C9DCFF6FAFE9EF700 /* Support Files */, - ); - name = SwiftFormat; - path = SwiftFormat; - sourceTree = ""; - }; - 82BF8F914435313C9DCFF6FAFE9EF700 /* Support Files */ = { - isa = PBXGroup; - children = ( - E43F95A56840098ECFFB3426EC236F54 /* SwiftFormat.debug.xcconfig */, - 321E0EECA8025D4E3C0406B264AB9F4A /* SwiftFormat.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/SwiftFormat"; - sourceTree = ""; - }; - 839E937F28D0B9CB9F457692610A394A /* ViewModel */ = { - isa = PBXGroup; - children = ( - 02F507B925649BDDC9AD86D1081E2FDE /* GradientActivityIndicatorViewModel.swift */, - 8BC3C52825EB9FF41BCF9CDBAD1CFBFC /* GradientLoadingBarViewModel.swift */, - 0A6AFF4C6A1BA30CE9B8A5B1CEDC407A /* NotchGradientLoadingBarViewModel.swift */, - ); - name = ViewModel; - path = GradientLoadingBar/Classes/ViewModel; - sourceTree = ""; - }; - 8D4021A66B75C4DAC37FB29AF10F5972 /* LightweightObservable */ = { - isa = PBXGroup; - children = ( - C70A9626A5985B4F9075500CF16CE8C8 /* Disposable.swift */, - EDFA33C3D1AF4C2C0CDAFFE7D06B88AF /* Observable.swift */, - 1F94EC0823DB851E6D0A4C81C33A0CEA /* Observable+Combine.swift */, - 523B7174E480C3FA74F83ABE7056DE17 /* Observable+Equatable.swift */, - 89D6B1C70C53B6DA6E6D0456F0F7DBD8 /* Observable+KeyPath.swift */, - F62BDBCF2DC54A7887F6D705A6E84E66 /* Support Files */, - ); - name = LightweightObservable; - path = LightweightObservable; - sourceTree = ""; - }; - 974814B39C0012DECD183BBB91B32103 /* iOS */ = { - isa = PBXGroup; - children = ( - CA8B94E9D3B433157168D1EECCEC11CD /* Foundation.framework */, - 5EBC8F300895E39EA0DF6D6B2B5E6BCD /* XCTest.framework */, - ); - name = iOS; - sourceTree = ""; - }; - A45F4A4E9AC8AF47029D4812E205A54B /* SwiftLint */ = { - isa = PBXGroup; - children = ( - 2B23D09BF983A3F081B96D5579D08787 /* Support Files */, + C0D1CBD055D6A6588A506E4B5CF3B3F1 /* Support Files */, ); name = SwiftLint; path = SwiftLint; sourceTree = ""; }; - A8B491E4E7AD1B86A1B5A7A9DE523DEC /* Misc */ = { + 1961CEDF56AE09CC2555A1D466B3F889 /* Products */ = { isa = PBXGroup; children = ( - C882B82678DDD020D9056F5C439A303D /* Constants.swift */, + 67873E92210DD4E777C49C6E8AEDC108 /* GradientLoadingBar */, + F196AAA163469B17170E99B82C7C4C0A /* LightweightObservable */, + 1F667CC0E19EAF34E5A4119E2121F585 /* Pods-Example */, + 630CABE8F692FCDBFD1B122A2D0CE388 /* Pods-ExampleTests */, ); - name = Misc; - path = GradientLoadingBar/Classes/Misc; + name = Products; sourceTree = ""; }; - B61AD2E05C344D7309F63862B66F2BC0 /* Pods-GradientLoadingBar_Example */ = { + 2B5209E60C92277B4546CA61AA88C321 /* Support Files */ = { isa = PBXGroup; children = ( - E0D90990792D653F523A884442305989 /* Pods-GradientLoadingBar_Example.modulemap */, - BEBA37204701F79F631433A8EEF190E7 /* Pods-GradientLoadingBar_Example-acknowledgements.markdown */, - B7FF35F32E5C06204CAF8183AC101D53 /* Pods-GradientLoadingBar_Example-acknowledgements.plist */, - 8194C4CB9E683FC366F48513ED1B1A9A /* Pods-GradientLoadingBar_Example-dummy.m */, - 2D246858B1E28690CC1921F1EC8328E1 /* Pods-GradientLoadingBar_Example-frameworks.sh */, - B27AAA41B1DEF56C8059867126A15A38 /* Pods-GradientLoadingBar_Example-Info.plist */, - 3A900E1CFF1D76CF61DDF7358F5C8863 /* Pods-GradientLoadingBar_Example-umbrella.h */, - A95E7032DE35DF972EF7FEC8A884303B /* Pods-GradientLoadingBar_Example.debug.xcconfig */, - 108AACC96F7DBC089B0840E09F19C698 /* Pods-GradientLoadingBar_Example.release.xcconfig */, - ); - name = "Pods-GradientLoadingBar_Example"; - path = "Target Support Files/Pods-GradientLoadingBar_Example"; - sourceTree = ""; - }; - C7B4887CB582A60B2828150E550CA0C1 /* Support Files */ = { - isa = PBXGroup; - children = ( - 432F44D6009308BDE038D8F587A32CC7 /* GradientLoadingBar.modulemap */, - 2EB5F6B9626AFB367351433E58717378 /* GradientLoadingBar-dummy.m */, - 01F10362867DE1BC975D30D2B32F0ECA /* GradientLoadingBar-Info.plist */, - BBB6B9166CB669730E6755D0283ACC89 /* GradientLoadingBar-prefix.pch */, - EA6885FB45B2DE2A16E806813F4448C3 /* GradientLoadingBar-umbrella.h */, - 72E1E31C3B08F491DD072C74B13669AB /* GradientLoadingBar.debug.xcconfig */, - 412F23BDA9646A7744AC81F4006F0817 /* GradientLoadingBar.release.xcconfig */, + D78DFC26A262C9B6DD87AC449DE9C917 /* GradientLoadingBar.modulemap */, + FDF5B122F650A2634FB3C234A25C151D /* GradientLoadingBar-dummy.m */, + 20341418D6A0CAEC5130A5C357532116 /* GradientLoadingBar-Info.plist */, + 06107814E96EF26954D68A89118CCEBC /* GradientLoadingBar-prefix.pch */, + 74F3E929AF83C1E4C9BC46B633924476 /* GradientLoadingBar-umbrella.h */, + B9029B0C1AFA347190D04C606F478112 /* GradientLoadingBar.debug.xcconfig */, + A3129AC48F73935634A39479CA444F46 /* GradientLoadingBar.release.xcconfig */, ); name = "Support Files"; path = "Example/Pods/Target Support Files/GradientLoadingBar"; sourceTree = ""; }; + 5125C31A53896A2D96F6D789F2C4C1EF /* LightweightObservable */ = { + isa = PBXGroup; + children = ( + E095987C4CAE2F889232834505A5D0F9 /* Disposable.swift */, + C4E8AD880DBC9FD367B825B3448745B0 /* Observable.swift */, + D94404FAD4CDC391E8B39C8BE848297B /* Observable+Combine.swift */, + 082D8D0BFB1BCB9BD18458384665899A /* Observable+Equatable.swift */, + A482DB85D620AA387395F03499CC3828 /* Observable+KeyPath.swift */, + 9F57CC0A003D15EE3A149D8555340C69 /* Support Files */, + ); + name = LightweightObservable; + path = LightweightObservable; + sourceTree = ""; + }; + 5654FA15AB8E153A3A42BDD0D1D93413 /* ViewModel */ = { + isa = PBXGroup; + children = ( + E7E18A2258A5D30ACEAA1A0A8264FD2D /* GradientActivityIndicatorViewModel.swift */, + BCF5D271A78C27CCB58CF185AAB1F02A /* GradientLoadingBarViewModel.swift */, + AD3143D9C8FC90D2EA4A1C2C40DBD47B /* NotchGradientLoadingBarViewModel.swift */, + ); + name = ViewModel; + path = GradientLoadingBar/ViewModel; + sourceTree = ""; + }; + 578452D2E740E91742655AC8F1636D1F /* iOS */ = { + isa = PBXGroup; + children = ( + 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 690B9F5657E7015EECC7142B65D5F377 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + EDC509F4ACF20869A7F7AAB6B7AF91C5 /* Pods-Example */, + A698A56C0AABAA469E463A53BBD27B7F /* Pods-ExampleTests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 6AF8C606BCA3355016B4EEAB1B584FB9 /* SwiftFormat */ = { + isa = PBXGroup; + children = ( + E06143DDA1B20446A5E527278BE31354 /* Support Files */, + ); + name = SwiftFormat; + path = SwiftFormat; + sourceTree = ""; + }; + 9F57CC0A003D15EE3A149D8555340C69 /* Support Files */ = { + isa = PBXGroup; + children = ( + 0B7AF892C2E156E6B6122E080493A0A5 /* LightweightObservable.modulemap */, + F68E85A90B9AF768C61F63A80C28F574 /* LightweightObservable-dummy.m */, + 9E727A4C9E4C166DCC2CAA15F7ACF299 /* LightweightObservable-Info.plist */, + E7DB0D6B64BA08002C7DC9165D10D9F4 /* LightweightObservable-prefix.pch */, + 9F1636BA6BA0D07871777A395C031882 /* LightweightObservable-umbrella.h */, + C024E2AF9C50E93F3BA2C25A88AD67F0 /* LightweightObservable.debug.xcconfig */, + 5BDCBBB29F528C498323B4AA3F5C5FCD /* LightweightObservable.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/LightweightObservable"; + sourceTree = ""; + }; + A3D136E552F19DAD93030CDE95AD3F72 /* Pod */ = { + isa = PBXGroup; + children = ( + 92594448460C4FAEA07450F6CA28523D /* GradientLoadingBar.podspec */, + 87D32B363FBDF3F00313D21994B675AB /* LICENSE */, + 71872C2E0B6E8DF2819ECF73055406F6 /* readme.md */, + ); + name = Pod; + sourceTree = ""; + }; + A698A56C0AABAA469E463A53BBD27B7F /* Pods-ExampleTests */ = { + isa = PBXGroup; + children = ( + C446CE8F49F5478E670868D947F52FE5 /* Pods-ExampleTests.modulemap */, + 62C623D1D471AB2511470ACF857D3FE2 /* Pods-ExampleTests-acknowledgements.markdown */, + D876BA00A58E54915A12F7B47D3C649C /* Pods-ExampleTests-acknowledgements.plist */, + 6BDD419F652F3675D32741451E718393 /* Pods-ExampleTests-dummy.m */, + 6FDE3CD52E416082AE176DBDB70626CB /* Pods-ExampleTests-Info.plist */, + 97F60369B21C7504D22C2F3E0C10FA35 /* Pods-ExampleTests-umbrella.h */, + AC4F0BC942FDBFD7B9FF3908C5E1A4BB /* Pods-ExampleTests.debug.xcconfig */, + 07DADC1D08E9BD634FBC308032199D6E /* Pods-ExampleTests.release.xcconfig */, + ); + name = "Pods-ExampleTests"; + path = "Target Support Files/Pods-ExampleTests"; + sourceTree = ""; + }; + B373A2B0D322199E5871E3923120D8A1 /* Support Files */ = { + isa = PBXGroup; + children = ( + 2F26C179F9B8B899133211EBB95BBADB /* SwiftConfigurationFiles.debug.xcconfig */, + CBCB66E6B77C07333D85DC27A19A6477 /* SwiftConfigurationFiles.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/SwiftConfigurationFiles"; + sourceTree = ""; + }; + B72AD445BCB6C242480FA00F4A7FA00A /* Misc */ = { + isa = PBXGroup; + children = ( + C77E2A4AC6C090C3B4708BCEF61A594D /* Constants.swift */, + ); + name = Misc; + path = GradientLoadingBar/Misc; + sourceTree = ""; + }; + C0D1CBD055D6A6588A506E4B5CF3B3F1 /* Support Files */ = { + isa = PBXGroup; + children = ( + D5103732AE89972930C6F57A19C61DDB /* SwiftLint.debug.xcconfig */, + A610260AC2D3CAC2947252EE2F3B1D56 /* SwiftLint.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/SwiftLint"; + sourceTree = ""; + }; CE6272E67A33588A9F25C079BF5BB051 /* Development Pods */ = { isa = PBXGroup; children = ( - 625395338A1C7013D0E5EA11C9A0F5B4 /* GradientLoadingBar */, + DE0BBA978813ADF373BBD68DB7ACD339 /* GradientLoadingBar */, ); name = "Development Pods"; sourceTree = ""; @@ -586,116 +383,117 @@ children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, CE6272E67A33588A9F25C079BF5BB051 /* Development Pods */, - 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, - D9E4C6772BA43B15D379F74ADB1F3D24 /* Pods */, - 42C5E31CFED75787FC35907ED840E206 /* Products */, - F35D8C7C6DA5C631C17C6CAC2AECDFEA /* Targets Support Files */, + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, + DC9700C99B32666AF281877FF78DD6A4 /* Pods */, + 1961CEDF56AE09CC2555A1D466B3F889 /* Products */, + 690B9F5657E7015EECC7142B65D5F377 /* Targets Support Files */, ); sourceTree = ""; }; - D9E4C6772BA43B15D379F74ADB1F3D24 /* Pods */ = { + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { isa = PBXGroup; children = ( - 8D4021A66B75C4DAC37FB29AF10F5972 /* LightweightObservable */, - DB9FA77551B6F1F7BB7B66D9513B92B4 /* SnapshotTesting */, - 43AAC1AB1516723E83B3890B1D058A16 /* SwiftConfigurationFiles */, - 8117A0062130D047C63C2824B16563F9 /* SwiftFormat */, - A45F4A4E9AC8AF47029D4812E205A54B /* SwiftLint */, + 578452D2E740E91742655AC8F1636D1F /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + DC9700C99B32666AF281877FF78DD6A4 /* Pods */ = { + isa = PBXGroup; + children = ( + 5125C31A53896A2D96F6D789F2C4C1EF /* LightweightObservable */, + EC2DBEF081E26E92DCE4EBEA6C0E85DA /* SwiftConfigurationFiles */, + 6AF8C606BCA3355016B4EEAB1B584FB9 /* SwiftFormat */, + 1538BF0E3865FAEC282AE36A733D7F5F /* SwiftLint */, ); name = Pods; sourceTree = ""; }; - DB9FA77551B6F1F7BB7B66D9513B92B4 /* SnapshotTesting */ = { + DE0BBA978813ADF373BBD68DB7ACD339 /* GradientLoadingBar */ = { isa = PBXGroup; children = ( - E71E37779A210E3F9958FB4B465CC3B6 /* Any.swift */, - 9801722F42CF5540558E2186724E2F08 /* AssertInlineSnapshot.swift */, - CEB65A52E203646F5F85230CB37055A7 /* AssertSnapshot.swift */, - 33915C6CA41A4120CCCFDA0A30623E99 /* Async.swift */, - 9761D5B7A8B0AF3C2D31731AA1E42F26 /* CALayer.swift */, - A38BD36975B9051B989F73656223996F /* CaseIterable.swift */, - D90A4312109DE68F0350FBB5DD551816 /* CGPath.swift */, - 8D70287148495215062E5030BA6267BB /* Codable.swift */, - CE73B31D3D042300127FE7545DC9A288 /* Data.swift */, - E2FF4849BA9ABFDAF933BC11BBE59A72 /* Description.swift */, - 195C9E50C429616417E6F569B20896A6 /* Diff.swift */, - CED5F046F3966BF1758156DB5C0EAC5E /* Diffing.swift */, - 371D3CDC7543AF863ADAE5F4D66D793C /* Internal.swift */, - D067B70655B4D91995A1AD085829D7BB /* NSBezierPath.swift */, - 80982F04B55AD6ED4052012DBA5D74E2 /* NSImage.swift */, - 94F6960E2E6F81EA1AEEEC7CAC13C054 /* NSView.swift */, - B38ABB2556378E0FBBFAC5F022A3F36B /* NSViewController.swift */, - 86A83C5000A82493337A3DFC79D0B56F /* PlistEncoder.swift */, - 4342969D6D37396C136697D0BC1C2A06 /* SceneKit.swift */, - E7B244F28A1FD6EEA4564C67C401D680 /* SnapshotTestCase.swift */, - 8DAABA5B241D32CC27078958069BCC5B /* Snapshotting.swift */, - E7C32BCB3A8CDE7A967257032D2CB146 /* SpriteKit.swift */, - 1CAC9E06708925371B8BFCC5484444DD /* String.swift */, - F12C335B7DC098086708FA73A72EE357 /* String+SpecialCharacters.swift */, - 0E633CB1D426841C43DF3462991319C4 /* SwiftUIView.swift */, - 2E06D57A35648ECBC97644D217B868BD /* UIBezierPath.swift */, - 54653ADB348C04B28B4D3455911AEFA0 /* UIImage.swift */, - 009FB438C78F42859CE255EDC7F22DB3 /* UIView.swift */, - 6BBB42D19B8EDB33AE63C1A34EAD81DE /* UIViewController.swift */, - 948F5A85ABC960EDF780E259FB3A8E23 /* URLRequest.swift */, - 1466DB0C211E9F079BFFFBDFDD4C1BD0 /* View.swift */, - 24E9153BF879D5DA5CDF2FF9BD6EE07A /* Wait.swift */, - 4B8421185176594CFD7B0CCE69071B4F /* XCTAttachment.swift */, - 2AFC4759ECC4D53FF9953C3CFBE67078 /* Support Files */, + CFC12B93FC53CC45081B03DB6B4EFEA2 /* GradientLoadingBarController.swift */, + F5728A1B060B328908F33E4940A320F8 /* NotchGradientLoadingBarController.swift */, + B72AD445BCB6C242480FA00F4A7FA00A /* Misc */, + A3D136E552F19DAD93030CDE95AD3F72 /* Pod */, + 2B5209E60C92277B4546CA61AA88C321 /* Support Files */, + 5654FA15AB8E153A3A42BDD0D1D93413 /* ViewModel */, + FCF27B6059B29C86D29779B4B617FE26 /* Views */, ); - name = SnapshotTesting; - path = SnapshotTesting; + name = GradientLoadingBar; + path = ../..; sourceTree = ""; }; - F35D8C7C6DA5C631C17C6CAC2AECDFEA /* Targets Support Files */ = { + E06143DDA1B20446A5E527278BE31354 /* Support Files */ = { isa = PBXGroup; children = ( - B61AD2E05C344D7309F63862B66F2BC0 /* Pods-GradientLoadingBar_Example */, - 810FDB3212C2E1BF5CEB60C53A119039 /* Pods-GradientLoadingBar_SnapshotTests */, - 182051F58B71F1C24E92C50B91E729E9 /* Pods-GradientLoadingBar_Tests */, - ); - name = "Targets Support Files"; - sourceTree = ""; - }; - F62BDBCF2DC54A7887F6D705A6E84E66 /* Support Files */ = { - isa = PBXGroup; - children = ( - C75C124F1A4261FB6DC06040CA090D87 /* LightweightObservable.modulemap */, - 785E1BC5584D16AC9173E04DE45A6036 /* LightweightObservable-dummy.m */, - 143F2717B1133164FBCC65A2DF3C3C67 /* LightweightObservable-Info.plist */, - 92595228CA62A3593A599AE616D42DC9 /* LightweightObservable-prefix.pch */, - F0E19B3286278186EC4012CDF8CAA48F /* LightweightObservable-umbrella.h */, - 8B75864FEFCDD0C986F965BC9B1D2A1B /* LightweightObservable.debug.xcconfig */, - 074CBA3DACEF2667EFED2C72D45A2403 /* LightweightObservable.release.xcconfig */, + 8669497E8F926A3169C00AF47826AAD6 /* SwiftFormat.debug.xcconfig */, + 297F0661CA6513B73F36B371A2CCCA6F /* SwiftFormat.release.xcconfig */, ); name = "Support Files"; - path = "../Target Support Files/LightweightObservable"; + path = "../Target Support Files/SwiftFormat"; + sourceTree = ""; + }; + EC2DBEF081E26E92DCE4EBEA6C0E85DA /* SwiftConfigurationFiles */ = { + isa = PBXGroup; + children = ( + B373A2B0D322199E5871E3923120D8A1 /* Support Files */, + ); + name = SwiftConfigurationFiles; + path = SwiftConfigurationFiles; + sourceTree = ""; + }; + EDC509F4ACF20869A7F7AAB6B7AF91C5 /* Pods-Example */ = { + isa = PBXGroup; + children = ( + FEF8A4D0CFDD18F4F07E729EB41C30C2 /* Pods-Example.modulemap */, + 3D6CAD1BF1BCC0A7D1FB87ABF0D5205D /* Pods-Example-acknowledgements.markdown */, + 19F1D0B8781A40709AEB69CB400AFB9D /* Pods-Example-acknowledgements.plist */, + 19D02D64B16A88E3C04AA24A2931D027 /* Pods-Example-dummy.m */, + F1A45E0B6EB826771A16350B666D273E /* Pods-Example-frameworks.sh */, + 09C5334E28CBC780E7A2FC81DE7DCCB7 /* Pods-Example-Info.plist */, + B41E79C10D2183B4E17863A56C910697 /* Pods-Example-umbrella.h */, + 0C7BE7BD63270B53563BEB150E1DA59E /* Pods-Example.debug.xcconfig */, + D6135EDF389122C641DC811FC623312E /* Pods-Example.release.xcconfig */, + ); + name = "Pods-Example"; + path = "Target Support Files/Pods-Example"; + sourceTree = ""; + }; + FCF27B6059B29C86D29779B4B617FE26 /* Views */ = { + isa = PBXGroup; + children = ( + 01878D225E1A7C6B3CDD94F2608F4D72 /* GradientActivityIndicatorView.swift */, + B58459B178EBD2B9585E50F15D67EE23 /* GradientActivityIndicatorView+AnimateIsHidden.swift */, + ); + name = Views; + path = GradientLoadingBar/Views; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 3947A3E6326E76107645A5B1E3DD15FA /* Headers */ = { + 1485F00414A7C3466BE5E72A72283967 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - CB196C7B05685E1D7FF662F7652BA500 /* LightweightObservable-umbrella.h in Headers */, + C2F7B05729193ABF3D3185603B6DC3BD /* Pods-ExampleTests-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 3DB53013216AE1CFCAD939686EC8C0A4 /* Headers */ = { + 8F2E0B274EB5DF0EF0445590D1F1C984 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 9D6622CDE2793B13735F47C44A7743ED /* SnapshotTesting-umbrella.h in Headers */, + D89148BFC07632D1FE62D5CF4616C2E8 /* Pods-Example-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - C55D0E8D825ACBABCA55D20231466C03 /* Headers */ = { + 95C9A97DB6AED867F864BE222FF097B5 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 776004E55702AEB7C0881078F2CF0F36 /* Pods-GradientLoadingBar_SnapshotTests-umbrella.h in Headers */, + 733E738EB448BE03E562928656A6F4B6 /* LightweightObservable-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -707,33 +505,17 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - EA4F25403A153665117D255C5772568D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BE134B742037AAB5A883E394D6702E0 /* Pods-GradientLoadingBar_Example-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F7B0E7FF99A86CC897C98DBE3679D5B8 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 2527F1E9F6147C56510A178BE9F8502A /* Pods-GradientLoadingBar_Tests-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 086F937CFC9099EB74E4B66BE7CBCB93 /* LightweightObservable */ = { isa = PBXNativeTarget; - buildConfigurationList = 06A21E4C3D86EC1D79566842A1353F5D /* Build configuration list for PBXNativeTarget "LightweightObservable" */; + buildConfigurationList = 604828AAD4352324F9A9846696D777FA /* Build configuration list for PBXNativeTarget "LightweightObservable" */; buildPhases = ( - 3947A3E6326E76107645A5B1E3DD15FA /* Headers */, - BF69B54F6314944F46B184EBDB94BBBF /* Sources */, - 451D4F703C0E61819FF0AC5A649A439F /* Frameworks */, - 81114DA5A7BF69BDD43FD980D03624D9 /* Resources */, + 95C9A97DB6AED867F864BE222FF097B5 /* Headers */, + 81EEFFF8BDB79DE22EA65D8A46131383 /* Sources */, + 881B870922A1040A539D6DDC65BEF831 /* Frameworks */, + EF1C521E3446D7B319379181DEC61E32 /* Resources */, ); buildRules = ( ); @@ -744,43 +526,46 @@ productReference = F196AAA163469B17170E99B82C7C4C0A /* LightweightObservable */; productType = "com.apple.product-type.framework"; }; - 2D25DEDF3D75C227835191E29870E7C2 /* Pods-GradientLoadingBar_Tests */ = { + 0AEE99A309977BD12A049FF48AF9BA4B /* Pods-Example */ = { isa = PBXNativeTarget; - buildConfigurationList = 65463214C51D389DB615B2FC4BEEBB9A /* Build configuration list for PBXNativeTarget "Pods-GradientLoadingBar_Tests" */; + buildConfigurationList = DEC8C7C6183C8CB28E37C671AF3EBB82 /* Build configuration list for PBXNativeTarget "Pods-Example" */; buildPhases = ( - F7B0E7FF99A86CC897C98DBE3679D5B8 /* Headers */, - FAF12747714546F34E3590CD55DAC829 /* Sources */, - F646365FBEF9107873B7F1590CD0853A /* Frameworks */, - B415E42E58E34C50CF8B799C41E80617 /* Resources */, + 8F2E0B274EB5DF0EF0445590D1F1C984 /* Headers */, + 203DD628AAF3FB99758F754DBB412850 /* Sources */, + A954471A8A4F347E9DDF93C0716D534D /* Frameworks */, + 11646F422953A144A1AA42025159C502 /* Resources */, ); buildRules = ( ); dependencies = ( - 7CED639A2BA6C107FA17B8CBB62F24EB /* PBXTargetDependency */, + CDCCCEE07B243DA0E402E29C505281D9 /* PBXTargetDependency */, + 743FEE1E4597C81DA0A1AD0DF2E441E1 /* PBXTargetDependency */, + 416C809FBDE172179CE18E7C2AA55118 /* PBXTargetDependency */, + 810CAC3E0EADD6F59A3C92BF648CABA5 /* PBXTargetDependency */, + 189122B1BC219235B9FAE9D893390A30 /* PBXTargetDependency */, ); - name = "Pods-GradientLoadingBar_Tests"; - productName = Pods_GradientLoadingBar_Tests; - productReference = 1711FC18263D47D46851F0433A93F110 /* Pods-GradientLoadingBar_Tests */; + name = "Pods-Example"; + productName = Pods_Example; + productReference = 1F667CC0E19EAF34E5A4119E2121F585 /* Pods-Example */; productType = "com.apple.product-type.framework"; }; - A90357950A476FE4A373B62B3B4CB4B5 /* Pods-GradientLoadingBar_SnapshotTests */ = { + 4432A314DF5F14FFF8809E319054F4AF /* Pods-ExampleTests */ = { isa = PBXNativeTarget; - buildConfigurationList = A79C25C72298FC50BB18B7E3A9554F1D /* Build configuration list for PBXNativeTarget "Pods-GradientLoadingBar_SnapshotTests" */; + buildConfigurationList = F0287A78E5A76A2A6A40287F0DDED66F /* Build configuration list for PBXNativeTarget "Pods-ExampleTests" */; buildPhases = ( - C55D0E8D825ACBABCA55D20231466C03 /* Headers */, - F2DD0F3058F1A2DA2F85F8306742295F /* Sources */, - ED5AC0D962E33B70032B2026DD2CC8B2 /* Frameworks */, - ACF08C75C53E425407DFE769404BCD3D /* Resources */, + 1485F00414A7C3466BE5E72A72283967 /* Headers */, + E75AD816BDF5379296E39CADCB1AD12B /* Sources */, + 80CB26F1AFBA6BA2257DE8F446122E81 /* Frameworks */, + D350226F7E4E15FDB327A278A8336B8C /* Resources */, ); buildRules = ( ); dependencies = ( - E966D22FC8596EB8701404A9F812092B /* PBXTargetDependency */, - 45FF9C9B91D4A91B8186FCB009D86C30 /* PBXTargetDependency */, + EB292E6B06823E2E452BEBFED8825971 /* PBXTargetDependency */, ); - name = "Pods-GradientLoadingBar_SnapshotTests"; - productName = Pods_GradientLoadingBar_SnapshotTests; - productReference = 13520AB8B3790CE3CEDCBBEEE1EF237A /* Pods-GradientLoadingBar_SnapshotTests */; + name = "Pods-ExampleTests"; + productName = Pods_ExampleTests; + productReference = 630CABE8F692FCDBFD1B122A2D0CE388 /* Pods-ExampleTests */; productType = "com.apple.product-type.framework"; }; AD9297F9E6CC3E50EDCFECA0A77800B7 /* GradientLoadingBar */ = { @@ -795,54 +580,13 @@ buildRules = ( ); dependencies = ( - F95FF4DF35FA10B716C4C486D7FF596E /* PBXTargetDependency */, + 1E3E6F4DF08F1E824C2B2D8FFEF67844 /* PBXTargetDependency */, ); name = GradientLoadingBar; productName = GradientLoadingBar; productReference = 67873E92210DD4E777C49C6E8AEDC108 /* GradientLoadingBar */; productType = "com.apple.product-type.framework"; }; - ADEAE7CDD604DE4F3072E6021A314487 /* SnapshotTesting */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331A33CBF071F9C6C103AB492799B536 /* Build configuration list for PBXNativeTarget "SnapshotTesting" */; - buildPhases = ( - 3DB53013216AE1CFCAD939686EC8C0A4 /* Headers */, - A6FA35379EB6A1D3271EA288BC860175 /* Sources */, - A3E6F437DCDBD6A93A734772AFD5F236 /* Frameworks */, - EABF71C4857BAE69F08CA52822E17A0D /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = SnapshotTesting; - productName = SnapshotTesting; - productReference = A037DBBCCACBFACB5C39A80B1C273043 /* SnapshotTesting */; - productType = "com.apple.product-type.framework"; - }; - E0B6892AAEBA4792BFD4534123482521 /* Pods-GradientLoadingBar_Example */ = { - isa = PBXNativeTarget; - buildConfigurationList = 402EB0955AF7AE0C98C697B37C821B7E /* Build configuration list for PBXNativeTarget "Pods-GradientLoadingBar_Example" */; - buildPhases = ( - EA4F25403A153665117D255C5772568D /* Headers */, - 5516BE8F572A5076956ED78891A7D545 /* Sources */, - BAC4B04FC3FA2B79DAC279C0D21C8C5C /* Frameworks */, - C7838D9FAA34DDF83CC3C022CACB9940 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 444024198265D1B4A4B715E5F205EA00 /* PBXTargetDependency */, - 727F31BA64401F001CD991E1FB0DFDB9 /* PBXTargetDependency */, - 0B60749EF53B4BE6B9E83E337CFD9D42 /* PBXTargetDependency */, - 69D89607FFC40052B0485751D41AFBF1 /* PBXTargetDependency */, - 376B0F8DF9702432EA737C108B64ACA4 /* PBXTargetDependency */, - ); - name = "Pods-GradientLoadingBar_Example"; - productName = Pods_GradientLoadingBar_Example; - productReference = 3C6A379C135C84644F189B8056CCBA04 /* Pods-GradientLoadingBar_Example */; - productType = "com.apple.product-type.framework"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -853,7 +597,7 @@ LastUpgradeCheck = 1240; }; buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 13.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -861,16 +605,14 @@ en, ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; - productRefGroup = 42C5E31CFED75787FC35907ED840E206 /* Products */; + productRefGroup = 1961CEDF56AE09CC2555A1D466B3F889 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( AD9297F9E6CC3E50EDCFECA0A77800B7 /* GradientLoadingBar */, 086F937CFC9099EB74E4B66BE7CBCB93 /* LightweightObservable */, - E0B6892AAEBA4792BFD4534123482521 /* Pods-GradientLoadingBar_Example */, - A90357950A476FE4A373B62B3B4CB4B5 /* Pods-GradientLoadingBar_SnapshotTests */, - 2D25DEDF3D75C227835191E29870E7C2 /* Pods-GradientLoadingBar_Tests */, - ADEAE7CDD604DE4F3072E6021A314487 /* SnapshotTesting */, + 0AEE99A309977BD12A049FF48AF9BA4B /* Pods-Example */, + 4432A314DF5F14FFF8809E319054F4AF /* Pods-ExampleTests */, B951B6FCD3E55AF969FBA9F7B476B877 /* SwiftConfigurationFiles */, 1CD0618C486973D5588EF20D2E8C0AEA /* SwiftFormat */, 52B60EC2A583F24ACBB69C113F5488B9 /* SwiftLint */, @@ -879,21 +621,7 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 81114DA5A7BF69BDD43FD980D03624D9 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ACF08C75C53E425407DFE769404BCD3D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B415E42E58E34C50CF8B799C41E80617 /* Resources */ = { + 11646F422953A144A1AA42025159C502 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -907,14 +635,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - C7838D9FAA34DDF83CC3C022CACB9940 /* Resources */ = { + D350226F7E4E15FDB327A278A8336B8C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - EABF71C4857BAE69F08CA52822E17A0D /* Resources */ = { + EF1C521E3446D7B319379181DEC61E32 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -933,171 +661,95 @@ EE9AE0164C3214055E15309068AA5167 /* GradientActivityIndicatorView+AnimateIsHidden.swift in Sources */, D3B742506DD86C2472678C4231F3CA7C /* GradientActivityIndicatorViewModel.swift in Sources */, 8CFC4188603B9D2F1121730741BF4129 /* GradientLoadingBar-dummy.m in Sources */, - E0404744D0B923F648287A50A63209FB /* GradientLoadingBarController.swift in Sources */, + 76CEDD6AAA05A3247BB54278B730B272 /* GradientLoadingBarController.swift in Sources */, 68C5DB73151103C8F43EF26688EE5600 /* GradientLoadingBarViewModel.swift in Sources */, - 2115DE52F6A03FFC0F6A938F158F9259 /* NotchGradientLoadingBarController.swift in Sources */, + 110C6F18C17D074E76617348CD73E2FE /* NotchGradientLoadingBarController.swift in Sources */, 0ACD0ACD5263B4D09556739F7926FF96 /* NotchGradientLoadingBarViewModel.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 5516BE8F572A5076956ED78891A7D545 /* Sources */ = { + 203DD628AAF3FB99758F754DBB412850 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3E9A56ADB8427F240D98E65F282D5AB3 /* Pods-GradientLoadingBar_Example-dummy.m in Sources */, + B75C5770C7B1F07197F749756B259693 /* Pods-Example-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - A6FA35379EB6A1D3271EA288BC860175 /* Sources */ = { + 81EEFFF8BDB79DE22EA65D8A46131383 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 28F1B4D31269CC69CB5F41DBBCEF5222 /* Any.swift in Sources */, - 4249BA5FD30CFB0680582D7C7C6EE392 /* AssertInlineSnapshot.swift in Sources */, - 3DAFC3A87D54F6BA47518F4904B7FE54 /* AssertSnapshot.swift in Sources */, - CFFD67104AE4ABBFEB3801F9B8149664 /* Async.swift in Sources */, - C56B3E1A07308BCC8376D15C735B1C25 /* CALayer.swift in Sources */, - DA787DFD55A7814418DE78F66BA70847 /* CaseIterable.swift in Sources */, - 07319FC388250B963206DB0BF5262128 /* CGPath.swift in Sources */, - 4F4D449821AB24276FA18CB343B2C3E8 /* Codable.swift in Sources */, - 78BBB110735B5BD1BDDC3CD4FC563323 /* Data.swift in Sources */, - 532436EEB8C806728018E24162505A32 /* Description.swift in Sources */, - 6FA42D338F2CDE1914908E7D0662AED5 /* Diff.swift in Sources */, - 2C0C1A356E0D75368E196C24C3761129 /* Diffing.swift in Sources */, - 5CA71008BD23B355944AC5383821C4E2 /* Internal.swift in Sources */, - 957508AA897C27F86D544CCF1CED1904 /* NSBezierPath.swift in Sources */, - 97BEDF828D70F8BE2BE4E917DD992C48 /* NSImage.swift in Sources */, - 3D1E0E44DB5DB31C932BBB9F1385B57A /* NSView.swift in Sources */, - 9D65BFC4B2C4B6102D6B7EC25A7CD739 /* NSViewController.swift in Sources */, - 70060B0C311FBDF840146EEE9B762220 /* PlistEncoder.swift in Sources */, - 6235B3883B6D9B3EF262ACFF43631F3D /* SceneKit.swift in Sources */, - 486A6DAD276EB55E6D7C9F515C86C227 /* SnapshotTestCase.swift in Sources */, - 1D0EF6FBAF37BB930183B8F5AA719CD2 /* SnapshotTesting-dummy.m in Sources */, - EB5F8B0D9E74FD8A1724B04E6AACFABE /* Snapshotting.swift in Sources */, - 480D1264071DA1967F86F28F5CF29B8B /* SpriteKit.swift in Sources */, - 88DE0AA2E9071FD322F40132B5ACE852 /* String.swift in Sources */, - FEB8176EE5F7E44C5399D94BC6DE0C46 /* String+SpecialCharacters.swift in Sources */, - D7AE9DBB6C5D2522EB24A673921F9365 /* SwiftUIView.swift in Sources */, - 7F5C5DD662B656505ECF172E1DDC232E /* UIBezierPath.swift in Sources */, - 9104476A4778BB28C819AB92599A5B6E /* UIImage.swift in Sources */, - 9F6B241BE1332F18DFCC2BF32E03C42C /* UIView.swift in Sources */, - D3C4D4F28C0180E812B6BA5FC4F5015B /* UIViewController.swift in Sources */, - 96E71750BD8C847E125FAB3C7A336224 /* URLRequest.swift in Sources */, - 928DBECCA86A6F98E4B42FA62C5FF051 /* View.swift in Sources */, - 9B00AEBE5F221FE9815159125313C0BD /* Wait.swift in Sources */, - D0A29718080A06AB351F6FA41B725BEA /* XCTAttachment.swift in Sources */, + 08ECE12BF5A805361343CCA001A2E503 /* Disposable.swift in Sources */, + 8D39C1B6F1FF25F50A740038A5175EE0 /* LightweightObservable-dummy.m in Sources */, + 7FEA4E3E743874332EE3276AB7A88201 /* Observable.swift in Sources */, + 7719DCFF4EB1CC0969C674E77B243E38 /* Observable+Combine.swift in Sources */, + 0609895628611E712C728AA3CF036521 /* Observable+Equatable.swift in Sources */, + 23BE1276E2F0185E449107447145175A /* Observable+KeyPath.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - BF69B54F6314944F46B184EBDB94BBBF /* Sources */ = { + E75AD816BDF5379296E39CADCB1AD12B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - D0B06346D30863B023F787D5D579420B /* Disposable.swift in Sources */, - 5F34D446EDA13CFBB2792F77205C1BC3 /* LightweightObservable-dummy.m in Sources */, - 65653E361AC18994D0C42D31EBD83C78 /* Observable.swift in Sources */, - 91B00DCD938BF31110A20C50E3C2FC58 /* Observable+Combine.swift in Sources */, - 74116D4194C50C94965143D797AAB781 /* Observable+Equatable.swift in Sources */, - 21A1F3F09B0A8A1D091D1977D706D0C3 /* Observable+KeyPath.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F2DD0F3058F1A2DA2F85F8306742295F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CCF6BE5916BD8F64AACED287B1364524 /* Pods-GradientLoadingBar_SnapshotTests-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FAF12747714546F34E3590CD55DAC829 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BFD9C55A9E36054591864A3D066CEB4E /* Pods-GradientLoadingBar_Tests-dummy.m in Sources */, + 2358ECACBD675FFBFDBA36A56A0F7CCA /* Pods-ExampleTests-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 0B60749EF53B4BE6B9E83E337CFD9D42 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SwiftConfigurationFiles; - target = B951B6FCD3E55AF969FBA9F7B476B877 /* SwiftConfigurationFiles */; - targetProxy = 4012369D0A6B33A2D28988DC420728A7 /* PBXContainerItemProxy */; - }; - 376B0F8DF9702432EA737C108B64ACA4 /* PBXTargetDependency */ = { + 189122B1BC219235B9FAE9D893390A30 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SwiftLint; target = 52B60EC2A583F24ACBB69C113F5488B9 /* SwiftLint */; - targetProxy = DF9B978CB494BA35B1C47288F181E799 /* PBXContainerItemProxy */; + targetProxy = 574AC9F9C31C74297B9524586A2FF89C /* PBXContainerItemProxy */; }; - 444024198265D1B4A4B715E5F205EA00 /* PBXTargetDependency */ = { + 1E3E6F4DF08F1E824C2B2D8FFEF67844 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = GradientLoadingBar; - target = AD9297F9E6CC3E50EDCFECA0A77800B7 /* GradientLoadingBar */; - targetProxy = 477DC7169CB4E1C57BA666CCE84BC9B5 /* PBXContainerItemProxy */; + name = LightweightObservable; + target = 086F937CFC9099EB74E4B66BE7CBCB93 /* LightweightObservable */; + targetProxy = 67C503C3B610E205D76A93A310ED216B /* PBXContainerItemProxy */; }; - 45FF9C9B91D4A91B8186FCB009D86C30 /* PBXTargetDependency */ = { + 416C809FBDE172179CE18E7C2AA55118 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = SnapshotTesting; - target = ADEAE7CDD604DE4F3072E6021A314487 /* SnapshotTesting */; - targetProxy = 8041B7D6F8DD028336D0B093E2B499EA /* PBXContainerItemProxy */; + name = SwiftConfigurationFiles; + target = B951B6FCD3E55AF969FBA9F7B476B877 /* SwiftConfigurationFiles */; + targetProxy = 3B50FE1AC0645972DDF6EB1B99BB3C16 /* PBXContainerItemProxy */; }; - 69D89607FFC40052B0485751D41AFBF1 /* PBXTargetDependency */ = { + 743FEE1E4597C81DA0A1AD0DF2E441E1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = LightweightObservable; + target = 086F937CFC9099EB74E4B66BE7CBCB93 /* LightweightObservable */; + targetProxy = 8DEC5A0BAF9296A07CDC5D52A125E546 /* PBXContainerItemProxy */; + }; + 810CAC3E0EADD6F59A3C92BF648CABA5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SwiftFormat; target = 1CD0618C486973D5588EF20D2E8C0AEA /* SwiftFormat */; - targetProxy = 7633C8BB8928691939C63C8BF8F96578 /* PBXContainerItemProxy */; + targetProxy = ECF9CF08B639EFC57E70D22AB04DFCBD /* PBXContainerItemProxy */; }; - 727F31BA64401F001CD991E1FB0DFDB9 /* PBXTargetDependency */ = { + CDCCCEE07B243DA0E402E29C505281D9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = LightweightObservable; - target = 086F937CFC9099EB74E4B66BE7CBCB93 /* LightweightObservable */; - targetProxy = D403D63645BB96686AC4FFCF3FF0AA06 /* PBXContainerItemProxy */; + name = GradientLoadingBar; + target = AD9297F9E6CC3E50EDCFECA0A77800B7 /* GradientLoadingBar */; + targetProxy = DC4BCACE451F2C82FD27594406E66FFB /* PBXContainerItemProxy */; }; - 7CED639A2BA6C107FA17B8CBB62F24EB /* PBXTargetDependency */ = { + EB292E6B06823E2E452BEBFED8825971 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = "Pods-GradientLoadingBar_Example"; - target = E0B6892AAEBA4792BFD4534123482521 /* Pods-GradientLoadingBar_Example */; - targetProxy = 5DF2B2B5427040C6011055367B351C8F /* PBXContainerItemProxy */; - }; - E966D22FC8596EB8701404A9F812092B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Pods-GradientLoadingBar_Example"; - target = E0B6892AAEBA4792BFD4534123482521 /* Pods-GradientLoadingBar_Example */; - targetProxy = DC3A7A550F1D5D217989DBABEEEB6183 /* PBXContainerItemProxy */; - }; - F95FF4DF35FA10B716C4C486D7FF596E /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = LightweightObservable; - target = 086F937CFC9099EB74E4B66BE7CBCB93 /* LightweightObservable */; - targetProxy = 276CABBD3804115B644A56F123562956 /* PBXContainerItemProxy */; + name = "Pods-Example"; + target = 0AEE99A309977BD12A049FF48AF9BA4B /* Pods-Example */; + targetProxy = AE04EB7A77A73FD0483A2988C6F93381 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 0B7AFA9829D5FFAFA2032F51A7EC0B44 /* Debug */ = { + 23413D20AA7494F4CB1D008106E68A7A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E43F95A56840098ECFFB3426EC236F54 /* SwiftFormat.debug.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 1A1C696B9BE01F6EA26B3621C28EA9AF /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 69838A921E83418B945E72EB342809F5 /* Pods-GradientLoadingBar_SnapshotTests.debug.xcconfig */; + baseConfigurationReference = D6135EDF389122C641DC811FC623312E /* Pods-Example.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1107,12 +759,54 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 2FE57ACED72D87CA1A52E88BE8C90CF1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AC4F0BC942FDBFD7B9FF3908C5E1A4BB /* Pods-ExampleTests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + "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"; + INFOPLIST_FILE = "Target Support Files/Pods-ExampleTests/Pods-ExampleTests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ExampleTests/Pods-ExampleTests.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -1126,155 +820,26 @@ }; name = Debug; }; - 2302134C9C885DAFA48D259D064C8887 /* Release */ = { + 4062373683B4E7F5C7166110E2F5B2A9 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 412F23BDA9646A7744AC81F4006F0817 /* GradientLoadingBar.release.xcconfig */; + baseConfigurationReference = 2F26C179F9B8B899133211EBB95BBADB /* SwiftConfigurationFiles.debug.xcconfig */; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - "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/GradientLoadingBar/GradientLoadingBar-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/GradientLoadingBar/GradientLoadingBar-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/GradientLoadingBar/GradientLoadingBar.modulemap"; - PRODUCT_MODULE_NAME = GradientLoadingBar; - PRODUCT_NAME = GradientLoadingBar; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.1; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 28B884D4EE09C656E3DC0E5452929210 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 321E0EECA8025D4E3C0406B264AB9F4A /* SwiftFormat.release.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 39D0F8C0DF8A3DF1976A02725A047CFE /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 39724ABA4E40A364B25F01F3E3CE31EC /* SwiftLint.release.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 3EE73820F12EDD6E8FE533391DA8C70E /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 72E1E31C3B08F491DD072C74B13669AB /* GradientLoadingBar.debug.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - "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/GradientLoadingBar/GradientLoadingBar-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/GradientLoadingBar/GradientLoadingBar-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/GradientLoadingBar/GradientLoadingBar.modulemap"; - PRODUCT_MODULE_NAME = GradientLoadingBar; - PRODUCT_NAME = GradientLoadingBar; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.1; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 4D23A2E978BA72DC562C20ADE8F7F09C /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 04D67E1AC2B476618545A95A11B5B811 /* SwiftConfigurationFiles.release.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 4F70CC855B68C75F68D41BEA61947783 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A95E7032DE35DF972EF7FEC8A884303B /* Pods-GradientLoadingBar_Example.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CLANG_ENABLE_OBJC_WEAK = NO; - "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"; - INFOPLIST_FILE = "Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 5DE69BEEF4237E7695FF53FC24F3E656 /* Debug */ = { + 42B5EABDF484F603FE11D950DE30AF4E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FBAEAE91BB9B77006558E537894C33C5 /* Pods-GradientLoadingBar_Tests.debug.xcconfig */; + baseConfigurationReference = C024E2AF9C50E93F3BA2C25A88AD67F0 /* LightweightObservable.debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -1283,142 +848,28 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/LightweightObservable/LightweightObservable-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/LightweightObservable/LightweightObservable-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 7073071A95165FEAA0509F7B4524263A /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = DFDBA3729D272425F9E33F46EF920BFF /* SnapshotTesting.release.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CLANG_ENABLE_OBJC_WEAK = NO; - "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/SnapshotTesting/SnapshotTesting-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SnapshotTesting/SnapshotTesting-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/SnapshotTesting/SnapshotTesting.modulemap"; - PRODUCT_MODULE_NAME = SnapshotTesting; - PRODUCT_NAME = SnapshotTesting; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/LightweightObservable/LightweightObservable.modulemap"; + PRODUCT_MODULE_NAME = LightweightObservable; + PRODUCT_NAME = LightweightObservable; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.2; + SWIFT_VERSION = 5.5; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; - }; - 74A4367AFBA2BC72E9F0249101354BDA /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 08E87DFECD69E46292154E099AB8D144 /* SwiftLint.debug.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; name = Debug; }; - 85653DC562FC25D782BD10D3C128E844 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 1B664F0A7F5E59140F761C16069995E9 /* Pods-GradientLoadingBar_Tests.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CLANG_ENABLE_OBJC_WEAK = NO; - "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"; - INFOPLIST_FILE = "Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 859F08364B31DC4D4D9031E605D6E8CB /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 108AACC96F7DBC089B0840E09F19C698 /* Pods-GradientLoadingBar_Example.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - CLANG_ENABLE_OBJC_WEAK = NO; - "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"; - INFOPLIST_FILE = "Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; 8DE5143C03248BB6CD542DE3963D6F3A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1486,11 +937,28 @@ }; name = Debug; }; - 8FE0B4025645967B73EE74B683185228 /* Debug */ = { + 8DEF60E8A61723230ABCDDDD8B05F224 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9D21619E3127A33326194FAC5E0241D7 /* SnapshotTesting.debug.xcconfig */; + baseConfigurationReference = 297F0661CA6513B73F36B371A2CCCA6F /* SwiftFormat.release.xcconfig */; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 976AE70244296486A314D80A301B9FE0 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0C7BE7BD63270B53563BEB150E1DA59E /* Pods-Example.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1500,38 +968,29 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/SnapshotTesting/SnapshotTesting-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SnapshotTesting/SnapshotTesting-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-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/SnapshotTesting/SnapshotTesting.modulemap"; - PRODUCT_MODULE_NAME = SnapshotTesting; - PRODUCT_NAME = SnapshotTesting; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.2; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 9B37241A118549BC576074606BB93C76 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = AE02F290421D0044A7B9B488A50DBD6C /* SwiftConfigurationFiles.debug.xcconfig */; - buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; 9E406C6AAF85E580207CD97B0044DEAB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1594,11 +1053,43 @@ }; name = Release; }; - CE4AF09E1F7AFC775A0633B54D327863 /* Debug */ = { + AD81E62ACCB0B7A923FC8AA288F9921E /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8B75864FEFCDD0C986F965BC9B1D2A1B /* LightweightObservable.debug.xcconfig */; + baseConfigurationReference = A610260AC2D3CAC2947252EE2F3B1D56 /* SwiftLint.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + B4D735C278D065C9DB708F250D0B915D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8669497E8F926A3169C00AF47826AAD6 /* SwiftFormat.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + B7CA19A811DB7A7642868249D248DDAC /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5BDCBBB29F528C498323B4AA3F5C5FCD /* LightweightObservable.release.xcconfig */; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -1611,7 +1102,11 @@ INFOPLIST_FILE = "Target Support Files/LightweightObservable/LightweightObservable-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MODULEMAP_FILE = "Target Support Files/LightweightObservable/LightweightObservable.modulemap"; PRODUCT_MODULE_NAME = LightweightObservable; PRODUCT_NAME = LightweightObservable; @@ -1620,17 +1115,17 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; SWIFT_VERSION = 5.5; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - EEA067F7B0C6046396816A88A9219093 /* Release */ = { + C3C32413428D472DD4D67FE4F5215DE0 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9DD32929B122D2561D1E99468EECDBF7 /* Pods-GradientLoadingBar_SnapshotTests.release.xcconfig */; + baseConfigurationReference = 07DADC1D08E9BD634FBC308032199D6E /* Pods-ExampleTests.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1640,12 +1135,16 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-ExampleTests/Pods-ExampleTests-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.modulemap"; + MODULEMAP_FILE = "Target Support Files/Pods-ExampleTests/Pods-ExampleTests.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -1660,11 +1159,10 @@ }; name = Release; }; - EF05ACDB25123F4D0FCCB95B0A9369C9 /* Release */ = { + C86791B0CE52ABA6259EE4868F1221F3 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 074CBA3DACEF2667EFED2C72D45A2403 /* LightweightObservable.release.xcconfig */; + baseConfigurationReference = A3129AC48F73935634A39479CA444F46 /* GradientLoadingBar.release.xcconfig */; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_64_BIT)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -1673,18 +1171,22 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/LightweightObservable/LightweightObservable-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/LightweightObservable/LightweightObservable-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/GradientLoadingBar/GradientLoadingBar-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GradientLoadingBar/GradientLoadingBar-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/LightweightObservable/LightweightObservable.modulemap"; - PRODUCT_MODULE_NAME = LightweightObservable; - PRODUCT_NAME = LightweightObservable; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/GradientLoadingBar/GradientLoadingBar.modulemap"; + PRODUCT_MODULE_NAME = GradientLoadingBar; + PRODUCT_NAME = GradientLoadingBar; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.5; + SWIFT_VERSION = 5.1; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1692,41 +1194,81 @@ }; name = Release; }; + D2E2A385931B22FAADBBF66D4C5E591D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CBCB66E6B77C07333D85DC27A19A6477 /* SwiftConfigurationFiles.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + D8D9D3E34A82A003B28B1C4EDB39801F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B9029B0C1AFA347190D04C606F478112 /* GradientLoadingBar.debug.xcconfig */; + buildSettings = { + "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/GradientLoadingBar/GradientLoadingBar-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/GradientLoadingBar/GradientLoadingBar-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/GradientLoadingBar/GradientLoadingBar.modulemap"; + PRODUCT_MODULE_NAME = GradientLoadingBar; + PRODUCT_NAME = GradientLoadingBar; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.1; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + EADD1F50ABC8096A0D6CB18822BB4EE4 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D5103732AE89972930C6F57A19C61DDB /* SwiftLint.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 06A21E4C3D86EC1D79566842A1353F5D /* Build configuration list for PBXNativeTarget "LightweightObservable" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - CE4AF09E1F7AFC775A0633B54D327863 /* Debug */, - EF05ACDB25123F4D0FCCB95B0A9369C9 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 331A33CBF071F9C6C103AB492799B536 /* Build configuration list for PBXNativeTarget "SnapshotTesting" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8FE0B4025645967B73EE74B683185228 /* Debug */, - 7073071A95165FEAA0509F7B4524263A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 402EB0955AF7AE0C98C697B37C821B7E /* Build configuration list for PBXNativeTarget "Pods-GradientLoadingBar_Example" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4F70CC855B68C75F68D41BEA61947783 /* Debug */, - 859F08364B31DC4D4D9031E605D6E8CB /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 43BA60EDD2249290FB9F0AB390E37237 /* Build configuration list for PBXNativeTarget "GradientLoadingBar" */ = { isa = XCConfigurationList; buildConfigurations = ( - 3EE73820F12EDD6E8FE533391DA8C70E /* Debug */, - 2302134C9C885DAFA48D259D064C8887 /* Release */, + D8D9D3E34A82A003B28B1C4EDB39801F /* Debug */, + C86791B0CE52ABA6259EE4868F1221F3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1740,11 +1282,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 65463214C51D389DB615B2FC4BEEBB9A /* Build configuration list for PBXNativeTarget "Pods-GradientLoadingBar_Tests" */ = { + 604828AAD4352324F9A9846696D777FA /* Build configuration list for PBXNativeTarget "LightweightObservable" */ = { isa = XCConfigurationList; buildConfigurations = ( - 5DE69BEEF4237E7695FF53FC24F3E656 /* Debug */, - 85653DC562FC25D782BD10D3C128E844 /* Release */, + 42B5EABDF484F603FE11D950DE30AF4E /* Debug */, + B7CA19A811DB7A7642868249D248DDAC /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1752,17 +1294,8 @@ 6B2B7DF197DF6A7CA487150557230A41 /* Build configuration list for PBXAggregateTarget "SwiftFormat" */ = { isa = XCConfigurationList; buildConfigurations = ( - 0B7AFA9829D5FFAFA2032F51A7EC0B44 /* Debug */, - 28B884D4EE09C656E3DC0E5452929210 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - A79C25C72298FC50BB18B7E3A9554F1D /* Build configuration list for PBXNativeTarget "Pods-GradientLoadingBar_SnapshotTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1A1C696B9BE01F6EA26B3621C28EA9AF /* Debug */, - EEA067F7B0C6046396816A88A9219093 /* Release */, + B4D735C278D065C9DB708F250D0B915D /* Debug */, + 8DEF60E8A61723230ABCDDDD8B05F224 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1770,8 +1303,8 @@ AE7B4FB01588B9E6DF09CB79FC7CE7BD /* Build configuration list for PBXAggregateTarget "SwiftLint" */ = { isa = XCConfigurationList; buildConfigurations = ( - 74A4367AFBA2BC72E9F0249101354BDA /* Debug */, - 39D0F8C0DF8A3DF1976A02725A047CFE /* Release */, + EADD1F50ABC8096A0D6CB18822BB4EE4 /* Debug */, + AD81E62ACCB0B7A923FC8AA288F9921E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1779,8 +1312,26 @@ C94370DDBAF2E85B239A19BD8F0908C6 /* Build configuration list for PBXAggregateTarget "SwiftConfigurationFiles" */ = { isa = XCConfigurationList; buildConfigurations = ( - 9B37241A118549BC576074606BB93C76 /* Debug */, - 4D23A2E978BA72DC562C20ADE8F7F09C /* Release */, + 4062373683B4E7F5C7166110E2F5B2A9 /* Debug */, + D2E2A385931B22FAADBBF66D4C5E591D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + DEC8C7C6183C8CB28E37C671AF3EBB82 /* Build configuration list for PBXNativeTarget "Pods-Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 976AE70244296486A314D80A301B9FE0 /* Debug */, + 23413D20AA7494F4CB1D008106E68A7A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F0287A78E5A76A2A6A40287F0DDED66F /* Build configuration list for PBXNativeTarget "Pods-ExampleTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2FE57ACED72D87CA1A52E88BE8C90CF1 /* Debug */, + C3C32413428D472DD4D67FE4F5215DE0 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Example/Pods/SnapshotTesting/LICENSE b/Example/Pods/SnapshotTesting/LICENSE deleted file mode 100644 index cb545c0..0000000 --- a/Example/Pods/SnapshotTesting/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2019 Point-Free, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Example/Pods/SnapshotTesting/README.md b/Example/Pods/SnapshotTesting/README.md deleted file mode 100644 index 6382483..0000000 --- a/Example/Pods/SnapshotTesting/README.md +++ /dev/null @@ -1,244 +0,0 @@ -# 📸 SnapshotTesting - -[![Swift 5.1](https://img.shields.io/badge/swift-5.1-ED523F.svg?style=flat)](https://swift.org/download/) -[![CI](https://github.com/pointfreeco/swift-snapshot-testing/workflows/CI/badge.svg)](https://actions-badge.atrox.dev/pointfreeco/swift-snapshot-testing/goto) -[![@pointfreeco](https://img.shields.io/badge/contact-@pointfreeco-5AA9E7.svg?style=flat)](https://twitter.com/pointfreeco) - -Delightful Swift snapshot testing. - - - -## Usage - -Once [installed](#installation), _no additional configuration is required_. You can import the `SnapshotTesting` module and call the `assertSnapshot` function. - -``` swift -import SnapshotTesting -import XCTest - -class MyViewControllerTests: XCTestCase { - func testMyViewController() { - let vc = MyViewController() - - assertSnapshot(matching: vc, as: .image) - } -} -``` - -When an assertion first runs, a snapshot is automatically recorded to disk and the test will fail, printing out the file path of any newly-recorded reference. - -> 🛑 failed - No reference was found on disk. Automatically recorded snapshot: … -> -> open "…/MyAppTests/\_\_Snapshots\_\_/MyViewControllerTests/testMyViewController.png" -> -> Re-run "testMyViewController" to test against the newly-recorded snapshot. - -Repeat test runs will load this reference and compare it with the runtime value. If they don't match, the test will fail and describe the difference. Failures can be inspected from Xcode's Report Navigator or by inspecting the file URLs of the failure. - -You can record a new reference by setting the `record` parameter to `true` on the assertion or setting `isRecording` globally. - -``` swift -assertSnapshot(matching: vc, as: .image, record: true) - -// or globally - -isRecording = true -assertSnapshot(matching: vc, as: .image) -``` - -## Snapshot Anything - -While most snapshot testing libraries in the Swift community are limited to `UIImage`s of `UIView`s, SnapshotTesting can work with _any_ format of _any_ value on _any_ Swift platform! - -The `assertSnapshot` function accepts a value and any snapshot strategy that value supports. This means that a [view](Documentation/Available-Snapshot-Strategies.md#uiview) or [view controller](Documentation/Available-Snapshot-Strategies.md#uiviewcontroller) can be tested against an image representation _and_ against a textual representation of its properties and subview hierarchy. - -``` swift -assertSnapshot(matching: vc, as: .image) -assertSnapshot(matching: vc, as: .recursiveDescription) -``` - -View testing is [highly configurable](Documentation/Available-Snapshot-Strategies.md#uiviewcontroller). You can override trait collections (for specific size classes and content size categories) and generate device-agnostic snapshots, all from a single simulator. - -``` swift -assertSnapshot(matching: vc, as: .image(on: .iPhoneSe)) -assertSnapshot(matching: vc, as: .recursiveDescription(on: .iPhoneSe)) - -assertSnapshot(matching: vc, as: .image(on: .iPhoneSe(.landscape))) -assertSnapshot(matching: vc, as: .recursiveDescription(on: .iPhoneSe(.landscape))) - -assertSnapshot(matching: vc, as: .image(on: .iPhoneX)) -assertSnapshot(matching: vc, as: .recursiveDescription(on: .iPhoneX)) - -assertSnapshot(matching: vc, as: .image(on: .iPadMini(.portrait))) -assertSnapshot(matching: vc, as: .recursiveDescription(on: .iPadMini(.portrait))) -``` - -> ⚠️ Warning: Snapshots must be compared using a simulator with the same OS, device gamut, and scale as the simulator that originally took the reference to avoid discrepancies between images. - -Better yet, SnapshotTesting isn't limited to views and view controllers! There are [a number of available snapshot strategies](Documentation/Available-Snapshot-Strategies.md) to choose from. - -For example, you can snapshot test URL requests (_e.g._, those that your API client prepares). - -``` swift -assertSnapshot(matching: urlRequest, as: .raw) -// POST http://localhost:8080/account -// Cookie: pf_session={"userId":"1"} -// -// email=blob%40pointfree.co&name=Blob -``` - -And you can snapshot test `Encodable` values against their JSON _and_ property list representations. - -``` swift -assertSnapshot(matching: user, as: .json) -// { -// "bio" : "Blobbed around the world.", -// "id" : 1, -// "name" : "Blobby" -// } - -assertSnapshot(matching: user, as: .plist) -// -// -// -// -// bio -// Blobbed around the world. -// id -// 1 -// name -// Blobby -// -// -``` - -In fact, _[any](Documentation/Available-Snapshot-Strategies.md#any)_ value can be snapshot-tested by default using its [mirror](https://developer.apple.com/documentation/swift/mirror)! - -``` swift -assertSnapshot(matching: user, as: .dump) -// ▿ User -// - bio: "Blobbed around the world." -// - id: 1 -// - name: "Blobby" -``` - -If your data can be represented as an image, text, or data, you can write a snapshot test for it! Check out [all of the snapshot strategies](Documentation/Available-Snapshot-Strategies.md) that ship with SnapshotTesting and [learn how to define your own custom strategies](Documentation/Defining-Custom-Snapshot-Strategies.md). - -## Installation - -### Xcode 11 - -> ⚠️ Warning: By default, Xcode will try to add the SnapshotTesting package to your project's main application/framework target. Please ensure that SnapshotTesting is added to a _test_ target instead, as documented in the last step, below. - - 1. From the **File** menu, navigate through **Swift Packages** and select **Add Package Dependency…**. - 2. Enter package repository URL: `https://github.com/pointfreeco/swift-snapshot-testing.git` - 3. Confirm the version and let Xcode resolve the package - 4. On the final dialog, update SnapshotTesting's **Add to Target** column to a test target that will contain snapshot tests (if you have more than one test target, you can later add SnapshotTesting to them by manually linking the library in its build phase) - -### Swift Package Manager - -If you want to use SnapshotTesting in any other project that uses [SwiftPM](https://swift.org/package-manager/), add the package as a dependency in `Package.swift`: - -```swift -dependencies: [ - .package(name: "SnapshotTesting", url: "https://github.com/pointfreeco/swift-snapshot-testing.git", from: "1.8.1"), -] -``` - -Next, add `SnapshotTesting` as a dependency of your test target: - -```swift -targets: [ - .target(name: "MyApp", dependencies: [], path: "Sources"), - .testTarget(name: "MyAppTests", dependencies: ["MyApp", "SnapshotTesting"]) -] -``` - -### Carthage - -If you use [Carthage](https://github.com/Carthage/Carthage), you can add the following dependency to your `Cartfile`: - -``` ruby -github "pointfreeco/swift-snapshot-testing" ~> 1.8.0 -``` - -> ⚠️ Warning: Carthage instructs you to drag frameworks into your Xcode project. Xcode may automatically attempt to link these frameworks to your app target. `SnapshotTesting.framework` is only compatible with test targets, so when you first add it to your project: -> -> 1. Remove `SnapshotTesting.framework` from any non-test target it may have been added to. -> 2. Add `SnapshotTesting.framework` to any applicable test targets. -> 3. Add a **New Copy Build Phase** to any applicable test targets with **Destination** set to "Frameworks", and add `SnapshotTesting.framework` as an item to this phase. -> 4. Do _not_ add `SnapshotTesting.framework` to the "Input Files" or "Output Files" of your app target's Carthage `copy-frameworks` **Run Script Phase**. -> -> See Carthage's "[Adding frameworks to unit tests or a framework](https://github.com/Carthage/Carthage#adding-frameworks-to-unit-tests-or-a-framework)" documentation for more. - -### CocoaPods - -If your project uses [CocoaPods](https://cocoapods.org), add the pod to any applicable test targets in your `Podfile`: - -```ruby -target 'MyAppTests' do - pod 'SnapshotTesting', '~> 1.8.1' -end -``` - -## Features - - - [**Dozens of snapshot strategies**](Documentation/Available-Snapshot-Strategies.md). Snapshot testing isn't just for `UIView`s and `CALayer`s. Write snapshots against _any_ value. - - [**Write your own snapshot strategies**](Documentation/Defining-Custom-Snapshot-Strategies.md). If you can convert it to an image, string, data, or your own diffable format, you can snapshot test it! Build your own snapshot strategies from scratch or transform existing ones. - - **No configuration required.** Don't fuss with scheme settings and environment variables. Snapshots are automatically saved alongside your tests. - - **More hands-off.** New snapshots are recorded whether `isRecording` mode is `true` or not. - - **Subclass-free.** Assert from any XCTest case or Quick spec. - - **Device-agnostic snapshots.** Render views and view controllers for specific devices and trait collections from a single simulator. - - **First-class Xcode support.** Image differences are captured as XCTest attachments. Text differences are rendered in inline error messages. - - **Supports any platform that supports Swift.** Write snapshot tests for iOS, Linux, macOS, and tvOS. - - **SceneKit, SpriteKit, and WebKit support.** Most snapshot testing libraries don't support these view subclasses. - - **`Codable` support**. Snapshot encodable data structures into their [JSON](Documentation/Available-Snapshot-Strategies.md#json) and [property list](Documentation/Available-Snapshot-Strategies.md#plist) representations. - - **Custom diff tool integration**. - -## Plug-ins - - - [swift-snapshot-testing-nimble](https://github.com/Killectro/swift-snapshot-testing-nimble) adds [Nimble](https://github.com/Quick/Nimble) matchers for SnapshotTesting. - - - [swift-html](https://github.com/pointfreeco/swift-html) is a Swift DSL for type-safe, extensible, and transformable HTML documents and includes an `HtmlSnapshotTesting` module to snapshot test its HTML documents. - - - [GRDBSnapshotTesting](https://github.com/SebastianOsinski/GRDBSnapshotTesting) adds snapshot strategy for testing SQLite database migrations made with [GRDB](https://github.com/groue/GRDB.swift). - - - [AccessibilitySnapshot](https://github.com/cashapp/AccessibilitySnapshot) adds easy regression testing for iOS accessibility. - - - [AccessibilitySnapshotColorBlindness](https://github.com/Sherlouk/AccessibilitySnapshotColorBlindness) adds snapshot strategies for color blindness simulation on iOS views, view controllers and images. - -Have you written your own SnapshotTesting plug-in? [Add it here](https://github.com/pointfreeco/swift-snapshot-testing/edit/master/README.md) and submit a pull request! - -## Related Tools - - - [`iOSSnapshotTestCase`](https://github.com/uber/ios-snapshot-test-case/) helped introduce screen shot testing to a broad audience in the iOS community. Experience with it inspired the creation of this library. - - - [Jest](https://jestjs.io) brought generalized snapshot testing to the JavaScript community with a polished user experience. Several features of this library (diffing, automatically capturing new snapshots) were directly influenced. - -## Learn More - -SnapshotTesting was designed with [witness-oriented programming](https://www.pointfree.co/episodes/ep39-witness-oriented-library-design). - -This concept (and more) are explored thoroughly in a series of episodes on [Point-Free](https://www.pointfree.co), a video series exploring functional programming and Swift hosted by [Brandon Williams](https://twitter.com/mbrandonw) and [Stephen Celis](https://twitter.com/stephencelis). - -Witness-oriented programming and the design of this library was explored in the following [Point-Free](https://www.pointfree.co) episodes: - - - [Episode 33](https://www.pointfree.co/episodes/ep33-protocol-witnesses-part-1): Protocol Witnesses: Part 1 - - [Episode 34](https://www.pointfree.co/episodes/ep34-protocol-witnesses-part-1): Protocol Witnesses: Part 2 - - [Episode 35](https://www.pointfree.co/episodes/ep35-advanced-protocol-witnesses-part-1): Advanced Protocol Witnesses: Part 1 - - [Episode 36](https://www.pointfree.co/episodes/ep36-advanced-protocol-witnesses-part-2): Advanced Protocol Witnesses: Part 2 - - [Episode 37](https://www.pointfree.co/episodes/ep37-protocol-oriented-library-design-part-1): Protocol-Oriented Library Design: Part 1 - - [Episode 38](https://www.pointfree.co/episodes/ep38-protocol-oriented-library-design-part-2): Protocol-Oriented Library Design: Part 2 - - [Episode 39](https://www.pointfree.co/episodes/ep39-witness-oriented-library-design): Witness-Oriented Library Design - - [Episode 40](https://www.pointfree.co/episodes/ep40-async-functional-refactoring): Async Functional Refactoring - - [Episode 41](https://www.pointfree.co/episodes/ep41-a-tour-of-snapshot-testing): A Tour of Snapshot Testing 🆓 - - - video poster image - - -## License - -This library is released under the MIT license. See [LICENSE](LICENSE) for details. diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/AssertInlineSnapshot.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/AssertInlineSnapshot.swift deleted file mode 100644 index 434cbfd..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/AssertInlineSnapshot.swift +++ /dev/null @@ -1,326 +0,0 @@ -import XCTest - -/// Asserts that a given value matches a string literal. -/// -/// Note: Empty `reference` will be replaced automatically with generated output. -/// -/// Usage: -/// ``` -/// _assertInlineSnapshot(matching: value, as: .dump, with: """ -/// """) -/// ``` -/// -/// - Parameters: -/// - value: A value to compare against a reference. -/// - snapshotting: A strategy for serializing, deserializing, and comparing values. -/// - recording: Whether or not to record a new reference. -/// - timeout: The amount of time a snapshot must be generated in. -/// - reference: The expected output of snapshotting. -/// - file: The file in which failure occurred. Defaults to the file name of the test case in which this function was called. -/// - line: The line number on which failure occurred. Defaults to the line number on which this function was called. -public func _assertInlineSnapshot( - matching value: @autoclosure () throws -> Value, - as snapshotting: Snapshotting, - record recording: Bool = false, - timeout: TimeInterval = 5, - with reference: String, - file: StaticString = #file, - testName: String = #function, - line: UInt = #line - ) { - - let failure = _verifyInlineSnapshot( - matching: try value(), - as: snapshotting, - record: recording, - timeout: timeout, - with: reference, - file: file, - testName: testName, - line: line - ) - guard let message = failure else { return } - XCTFail(message, file: file, line: line) -} - -/// Verifies that a given value matches a string literal. -/// -/// Third party snapshot assert helpers can be built on top of this function. Simply invoke `verifyInlineSnapshot` with your own arguments, and then invoke `XCTFail` with the string returned if it is non-`nil`. -/// -/// - Parameters: -/// - value: A value to compare against a reference. -/// - snapshotting: A strategy for serializing, deserializing, and comparing values. -/// - recording: Whether or not to record a new reference. -/// - timeout: The amount of time a snapshot must be generated in. -/// - reference: The expected output of snapshotting. -/// - file: The file in which failure occurred. Defaults to the file name of the test case in which this function was called. -/// - testName: The name of the test in which failure occurred. Defaults to the function name of the test case in which this function was called. -/// - line: The line number on which failure occurred. Defaults to the line number on which this function was called. -/// - Returns: A failure message or, if the value matches, nil. -public func _verifyInlineSnapshot( - matching value: @autoclosure () throws -> Value, - as snapshotting: Snapshotting, - record recording: Bool = false, - timeout: TimeInterval = 5, - with reference: String, - file: StaticString = #file, - testName: String = #function, - line: UInt = #line - ) - -> String? { - - let recording = recording || isRecording - - do { - let tookSnapshot = XCTestExpectation(description: "Took snapshot") - var optionalDiffable: String? - snapshotting.snapshot(try value()).run { b in - optionalDiffable = b - tookSnapshot.fulfill() - } - let result = XCTWaiter.wait(for: [tookSnapshot], timeout: timeout) - switch result { - case .completed: - break - case .timedOut: - return """ - Exceeded timeout of \(timeout) seconds waiting for snapshot. - - This can happen when an asynchronously rendered view (like a web view) has not loaded. \ - Ensure that every subview of the view hierarchy has loaded to avoid timeouts, or, if a \ - timeout is unavoidable, consider setting the "timeout" parameter of "assertSnapshot" to \ - a higher value. - """ - case .incorrectOrder, .invertedFulfillment, .interrupted: - return "Couldn't snapshot value" - @unknown default: - return "Couldn't snapshot value" - } - - let trimmingChars = CharacterSet.whitespacesAndNewlines.union(CharacterSet(charactersIn: "\u{FEFF}")) - guard let diffable = optionalDiffable?.trimmingCharacters(in: trimmingChars) else { - return "Couldn't snapshot value" - } - - let trimmedReference = reference.trimmingCharacters(in: .whitespacesAndNewlines) - - // Always perform diff, and return early on success! - guard let (failure, attachments) = snapshotting.diffing.diff(trimmedReference, diffable) else { - return nil - } - - // If that diff failed, we either record or fail. - if recording || trimmedReference.isEmpty { - let fileName = "\(file)" - let sourceCodeFilePath = URL(fileURLWithPath: fileName, isDirectory: false) - let sourceCode = try String(contentsOf: sourceCodeFilePath) - var newRecordings = recordings - - let modifiedSource = try writeInlineSnapshot( - &newRecordings, - Context( - sourceCode: sourceCode, - diffable: diffable, - fileName: fileName, - lineIndex: Int(line) - ) - ).sourceCode - - try modifiedSource - .data(using: String.Encoding.utf8)? - .write(to: sourceCodeFilePath) - - if newRecordings != recordings { - recordings = newRecordings - /// If no other recording has been made, then fail! - return """ - No reference was found inline. Automatically recorded snapshot. - - Re-run "\(sanitizePathComponent(testName))" to test against the newly-recorded snapshot. - """ - } else { - /// There is already an failure in this file, - /// and we don't want to write to the wrong place. - return nil - } - } - - /// Did not successfully record, so we will fail. - if !attachments.isEmpty { - #if !os(Linux) - if ProcessInfo.processInfo.environment.keys.contains("__XCODE_BUILT_PRODUCTS_DIR_PATHS") { - XCTContext.runActivity(named: "Attached Failure Diff") { activity in - attachments.forEach { - activity.add($0) - } - } - } - #endif - } - - return """ - Snapshot does not match reference. - - \(failure.trimmingCharacters(in: .whitespacesAndNewlines)) - """ - - } catch { - return error.localizedDescription - } -} - -internal typealias Recordings = [String: [FileRecording]] - -internal struct Context { - let sourceCode: String - let diffable: String - let fileName: String - // First line of a file is line 1 (as with the #line macro) - let lineIndex: Int - - func setSourceCode(_ newSourceCode: String) -> Context { - return Context( - sourceCode: newSourceCode, - diffable: diffable, - fileName: fileName, - lineIndex: lineIndex - ) - } -} - -internal func writeInlineSnapshot( - _ recordings: inout Recordings, - _ context: Context -) throws -> Context { - var sourceCodeLines = context.sourceCode - .split(separator: "\n", omittingEmptySubsequences: false) - - let otherRecordings = recordings[context.fileName, default: []] - let otherRecordingsAboveThisLine = otherRecordings.filter { $0.line < context.lineIndex } - let offsetStartIndex = otherRecordingsAboveThisLine.reduce(context.lineIndex) { $0 + $1.difference } - let functionLineIndex = offsetStartIndex - 1 - var lineCountDifference = 0 - - // Convert `""` to multi-line literal - if sourceCodeLines[functionLineIndex].hasSuffix(emptyStringLiteralWithCloseBrace) { - // Convert: - // _assertInlineSnapshot(matching: value, as: .dump, with: "") - // to: - // _assertInlineSnapshot(matching: value, as: .dump, with: """ - // """) - var functionCallLine = sourceCodeLines.remove(at: functionLineIndex) - functionCallLine.removeLast(emptyStringLiteralWithCloseBrace.count) - let indentText = indentation(of: functionCallLine) - sourceCodeLines.insert(contentsOf: [ - functionCallLine + multiLineStringLiteralTerminator, - indentText + multiLineStringLiteralTerminator + ")", - ] as [String.SubSequence], at: functionLineIndex) - lineCountDifference += 1 - } - - /// If they haven't got a multi-line literal by now, then just fail. - guard sourceCodeLines[functionLineIndex].hasSuffix(multiLineStringLiteralTerminator) else { - struct InlineError: LocalizedError { - var errorDescription: String? { - return """ -To use inline snapshots, please convert the "with" argument to a multi-line literal. -""" - } - } - throw InlineError() - } - - /// Find the end of multi-line literal and replace contents with recording. - if let multiLineLiteralEndIndex = sourceCodeLines[offsetStartIndex...].firstIndex(where: { $0.hasClosingMultilineStringDelimiter() }) { - - let diffableLines = context.diffable.split(separator: "\n") - - // Add #'s to the multiline string literal if needed - let numberSigns: String - if context.diffable.hasEscapedSpecialCharactersLiteral() { - numberSigns = String(repeating: "#", count: context.diffable.numberOfNumberSignsNeeded()) - } else if nil != diffableLines.first(where: { $0.endsInBackslash() }) { - // We want to avoid \ being interpreted as an escaped newline in the recorded inline snapshot - numberSigns = "#" - } else { - numberSigns = "" - } - let multiLineStringLiteralTerminatorPre = numberSigns + multiLineStringLiteralTerminator - let multiLineStringLiteralTerminatorPost = multiLineStringLiteralTerminator + numberSigns - - // Update opening (#...)""" - sourceCodeLines[functionLineIndex].replaceFirstOccurrence( - of: extendedOpeningStringDelimitersPattern, - with: multiLineStringLiteralTerminatorPre - ) - - // Update closing """(#...) - sourceCodeLines[multiLineLiteralEndIndex].replaceFirstOccurrence( - of: extendedClosingStringDelimitersPattern, - with: multiLineStringLiteralTerminatorPost - ) - - /// Convert actual value to Lines to insert - let indentText = indentation(of: sourceCodeLines[multiLineLiteralEndIndex]) - let newDiffableLines = context.diffable - .split(separator: "\n", omittingEmptySubsequences: false) - .map { Substring(indentText + $0) } - lineCountDifference += newDiffableLines.count - (multiLineLiteralEndIndex - offsetStartIndex) - - let fileRecording = FileRecording(line: context.lineIndex, difference: lineCountDifference) - - /// Insert the lines - sourceCodeLines.replaceSubrange(offsetStartIndex..(of str: S) -> String { - var count = 0 - for char in str { - guard char == " " else { break } - count += 1 - } - return String(repeating: " ", count: count) -} - -fileprivate extension Substring { - mutating func replaceFirstOccurrence(of pattern: String, with newString: String) { - let newString = replacingOccurrences(of: pattern, with: newString, options: .regularExpression) - self = Substring(newString) - } - - func hasOpeningMultilineStringDelimiter() -> Bool { - return range(of: extendedOpeningStringDelimitersPattern, options: .regularExpression) != nil - } - - func hasClosingMultilineStringDelimiter() -> Bool { - return range(of: extendedClosingStringDelimitersPattern, options: .regularExpression) != nil - } - - func endsInBackslash() -> Bool { - if let lastChar = last { - return lastChar == Character(#"\"#) - } - return false - } -} - -private let emptyStringLiteralWithCloseBrace = "\"\")" -private let multiLineStringLiteralTerminator = "\"\"\"" -private let extendedOpeningStringDelimitersPattern = #"#{0,}\"\"\""# -private let extendedClosingStringDelimitersPattern = ##"\"\"\"#{0,}"## - -// When we modify a file, the line numbers reported by the compiler through #line are no longer -// accurate. With the FileRecording values we keep track of we modify the files so we can adjust -// line numbers. -private var recordings: Recordings = [:] diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/AssertSnapshot.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/AssertSnapshot.swift deleted file mode 100644 index dd6ca4f..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/AssertSnapshot.swift +++ /dev/null @@ -1,313 +0,0 @@ -import XCTest - -/// Enhances failure messages with a command line diff tool expression that can be copied and pasted into a terminal. -/// -/// diffTool = "ksdiff" -public var diffTool: String? = nil - -/// Whether or not to record all new references. -public var isRecording = false - -/// Whether or not to record all new references. -/// Due to a name clash in Xcode 12, this has been renamed to `isRecording`. -@available(*, deprecated, renamed: "isRecording") -public var record: Bool { - get { isRecording } - set { isRecording = newValue } -} - -/// Asserts that a given value matches a reference on disk. -/// -/// - Parameters: -/// - value: A value to compare against a reference. -/// - snapshotting: A strategy for serializing, deserializing, and comparing values. -/// - name: An optional description of the snapshot. -/// - recording: Whether or not to record a new reference. -/// - timeout: The amount of time a snapshot must be generated in. -/// - file: The file in which failure occurred. Defaults to the file name of the test case in which this function was called. -/// - testName: The name of the test in which failure occurred. Defaults to the function name of the test case in which this function was called. -/// - line: The line number on which failure occurred. Defaults to the line number on which this function was called. -public func assertSnapshot( - matching value: @autoclosure () throws -> Value, - as snapshotting: Snapshotting, - named name: String? = nil, - record recording: Bool = false, - timeout: TimeInterval = 5, - file: StaticString = #file, - testName: String = #function, - line: UInt = #line - ) { - - let failure = verifySnapshot( - matching: try value(), - as: snapshotting, - named: name, - record: recording, - timeout: timeout, - file: file, - testName: testName, - line: line - ) - guard let message = failure else { return } - XCTFail(message, file: file, line: line) -} - -/// Asserts that a given value matches references on disk. -/// -/// - Parameters: -/// - value: A value to compare against a reference. -/// - snapshotting: A dictionary of names and strategies for serializing, deserializing, and comparing values. -/// - recording: Whether or not to record a new reference. -/// - timeout: The amount of time a snapshot must be generated in. -/// - file: The file in which failure occurred. Defaults to the file name of the test case in which this function was called. -/// - testName: The name of the test in which failure occurred. Defaults to the function name of the test case in which this function was called. -/// - line: The line number on which failure occurred. Defaults to the line number on which this function was called. -public func assertSnapshots( - matching value: @autoclosure () throws -> Value, - as strategies: [String: Snapshotting], - record recording: Bool = false, - timeout: TimeInterval = 5, - file: StaticString = #file, - testName: String = #function, - line: UInt = #line - ) { - - try? strategies.forEach { name, strategy in - assertSnapshot( - matching: try value(), - as: strategy, - named: name, - record: recording, - timeout: timeout, - file: file, - testName: testName, - line: line - ) - } -} - -/// Asserts that a given value matches references on disk. -/// -/// - Parameters: -/// - value: A value to compare against a reference. -/// - snapshotting: An array of strategies for serializing, deserializing, and comparing values. -/// - recording: Whether or not to record a new reference. -/// - timeout: The amount of time a snapshot must be generated in. -/// - file: The file in which failure occurred. Defaults to the file name of the test case in which this function was called. -/// - testName: The name of the test in which failure occurred. Defaults to the function name of the test case in which this function was called. -/// - line: The line number on which failure occurred. Defaults to the line number on which this function was called. -public func assertSnapshots( - matching value: @autoclosure () throws -> Value, - as strategies: [Snapshotting], - record recording: Bool = false, - timeout: TimeInterval = 5, - file: StaticString = #file, - testName: String = #function, - line: UInt = #line - ) { - - try? strategies.forEach { strategy in - assertSnapshot( - matching: try value(), - as: strategy, - record: recording, - timeout: timeout, - file: file, - testName: testName, - line: line - ) - } -} - -/// Verifies that a given value matches a reference on disk. -/// -/// Third party snapshot assert helpers can be built on top of this function. Simply invoke `verifySnapshot` with your own arguments, and then invoke `XCTFail` with the string returned if it is non-`nil`. For example, if you want the snapshot directory to be determined by an environment variable, you can create your own assert helper like so: -/// -/// public func myAssertSnapshot( -/// matching value: @autoclosure () throws -> Value, -/// as snapshotting: Snapshotting, -/// named name: String? = nil, -/// record recording: Bool = false, -/// timeout: TimeInterval = 5, -/// file: StaticString = #file, -/// testName: String = #function, -/// line: UInt = #line -/// ) { -/// -/// let snapshotDirectory = ProcessInfo.processInfo.environment["SNAPSHOT_REFERENCE_DIR"]! + "/" + #file -/// let failure = verifySnapshot( -/// matching: value, -/// as: snapshotting, -/// named: name, -/// record: recording, -/// snapshotDirectory: snapshotDirectory, -/// timeout: timeout, -/// file: file, -/// testName: testName -/// ) -/// guard let message = failure else { return } -/// XCTFail(message, file: file, line: line) -/// } -/// -/// - Parameters: -/// - value: A value to compare against a reference. -/// - snapshotting: A strategy for serializing, deserializing, and comparing values. -/// - name: An optional description of the snapshot. -/// - recording: Whether or not to record a new reference. -/// - snapshotDirectory: Optional directory to save snapshots. By default snapshots will be saved in a directory with the same name as the test file, and that directory will sit inside a directory `__Snapshots__` that sits next to your test file. -/// - timeout: The amount of time a snapshot must be generated in. -/// - file: The file in which failure occurred. Defaults to the file name of the test case in which this function was called. -/// - testName: The name of the test in which failure occurred. Defaults to the function name of the test case in which this function was called. -/// - line: The line number on which failure occurred. Defaults to the line number on which this function was called. -/// - Returns: A failure message or, if the value matches, nil. -public func verifySnapshot( - matching value: @autoclosure () throws -> Value, - as snapshotting: Snapshotting, - named name: String? = nil, - record recording: Bool = false, - snapshotDirectory: String? = nil, - timeout: TimeInterval = 5, - file: StaticString = #file, - testName: String = #function, - line: UInt = #line - ) - -> String? { - - let recording = recording || isRecording - - do { - let fileUrl = URL(fileURLWithPath: "\(file)", isDirectory: false) - let fileName = fileUrl.deletingPathExtension().lastPathComponent - - let snapshotDirectoryUrl = snapshotDirectory.map { URL(fileURLWithPath: $0, isDirectory: true) } - ?? fileUrl - .deletingLastPathComponent() - .appendingPathComponent("__Snapshots__") - .appendingPathComponent(fileName) - - let identifier: String - if let name = name { - identifier = sanitizePathComponent(name) - } else { - let counter = counterQueue.sync { () -> Int in - let key = snapshotDirectoryUrl.appendingPathComponent(testName) - counterMap[key, default: 0] += 1 - return counterMap[key]! - } - identifier = String(counter) - } - - let testName = sanitizePathComponent(testName) - let snapshotFileUrl = snapshotDirectoryUrl - .appendingPathComponent("\(testName).\(identifier)") - .appendingPathExtension(snapshotting.pathExtension ?? "") - let fileManager = FileManager.default - try fileManager.createDirectory(at: snapshotDirectoryUrl, withIntermediateDirectories: true) - - let tookSnapshot = XCTestExpectation(description: "Took snapshot") - var optionalDiffable: Format? - snapshotting.snapshot(try value()).run { b in - optionalDiffable = b - tookSnapshot.fulfill() - } - let result = XCTWaiter.wait(for: [tookSnapshot], timeout: timeout) - switch result { - case .completed: - break - case .timedOut: - return """ - Exceeded timeout of \(timeout) seconds waiting for snapshot. - - This can happen when an asynchronously rendered view (like a web view) has not loaded. \ - Ensure that every subview of the view hierarchy has loaded to avoid timeouts, or, if a \ - timeout is unavoidable, consider setting the "timeout" parameter of "assertSnapshot" to \ - a higher value. - """ - case .incorrectOrder, .invertedFulfillment, .interrupted: - return "Couldn't snapshot value" - @unknown default: - return "Couldn't snapshot value" - } - - guard var diffable = optionalDiffable else { - return "Couldn't snapshot value" - } - - guard !recording, fileManager.fileExists(atPath: snapshotFileUrl.path) else { - try snapshotting.diffing.toData(diffable).write(to: snapshotFileUrl) - return recording - ? """ - Record mode is on. Turn record mode off and re-run "\(testName)" to test against the newly-recorded snapshot. - - open "\(snapshotFileUrl.path)" - - Recorded snapshot: … - """ - : """ - No reference was found on disk. Automatically recorded snapshot: … - - open "\(snapshotFileUrl.path)" - - Re-run "\(testName)" to test against the newly-recorded snapshot. - """ - } - - let data = try Data(contentsOf: snapshotFileUrl) - let reference = snapshotting.diffing.fromData(data) - - #if os(iOS) || os(tvOS) - // If the image generation fails for the diffable part use the reference - if let localDiff = diffable as? UIImage, localDiff.size == .zero { - diffable = reference - } - #endif - - guard let (failure, attachments) = snapshotting.diffing.diff(reference, diffable) else { - return nil - } - - let artifactsUrl = URL( - fileURLWithPath: ProcessInfo.processInfo.environment["SNAPSHOT_ARTIFACTS"] ?? NSTemporaryDirectory(), isDirectory: true - ) - let artifactsSubUrl = artifactsUrl.appendingPathComponent(fileName) - try fileManager.createDirectory(at: artifactsSubUrl, withIntermediateDirectories: true) - let failedSnapshotFileUrl = artifactsSubUrl.appendingPathComponent(snapshotFileUrl.lastPathComponent) - try snapshotting.diffing.toData(diffable).write(to: failedSnapshotFileUrl) - - if !attachments.isEmpty { - #if !os(Linux) - if ProcessInfo.processInfo.environment.keys.contains("__XCODE_BUILT_PRODUCTS_DIR_PATHS") { - XCTContext.runActivity(named: "Attached Failure Diff") { activity in - attachments.forEach { - activity.add($0) - } - } - } - #endif - } - - let diffMessage = diffTool - .map { "\($0) \"\(snapshotFileUrl.path)\" \"\(failedSnapshotFileUrl.path)\"" } - ?? "@\(minus)\n\"\(snapshotFileUrl.path)\"\n@\(plus)\n\"\(failedSnapshotFileUrl.path)\"" - return """ - Snapshot does not match reference. - - \(diffMessage) - - \(failure.trimmingCharacters(in: .whitespacesAndNewlines)) - """ - } catch { - return error.localizedDescription - } -} - -// MARK: - Private - -private let counterQueue = DispatchQueue(label: "co.pointfree.SnapshotTesting.counter") -private var counterMap: [URL: Int] = [:] - -func sanitizePathComponent(_ string: String) -> String { - return string - .replacingOccurrences(of: "\\W+", with: "-", options: .regularExpression) - .replacingOccurrences(of: "^-|-$", with: "", options: .regularExpression) -} diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Async.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Async.swift deleted file mode 100644 index 427d5a5..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Async.swift +++ /dev/null @@ -1,39 +0,0 @@ -/// A wrapper around an asynchronous operation. -/// -/// Snapshot strategies may utilize this type to create snapshots in an asynchronous fashion. -/// -/// For example, WebKit's `WKWebView` offers a callback-based API for taking image snapshots (`takeSnapshot`). `Async` allows us to build a value that can pass its callback along to the scope in which the image has been created. -/// -/// Async { callback in -/// webView.takeSnapshot(with: nil) { image, error in -/// callback(image!) -/// } -/// } -public struct Async { - public let run: (@escaping (Value) -> Void) -> Void - - /// Creates an asynchronous operation. - /// - /// - Parameters: - /// - run: A function that, when called, can hand a value to a callback. - /// - callback: A function that can be called with a value. - public init(run: @escaping (_ callback: @escaping (Value) -> Void) -> Void) { - self.run = run - } - - /// Wraps a pure value in an asynchronous operation. - /// - /// - Parameter value: A value to be wrapped in an asynchronous operation. - public init(value: Value) { - self.init { callback in callback(value) } - } - - /// Transforms an Async into an Async with a function `(Value) -> NewValue`. - /// - /// - Parameter f: A transformation to apply to the value wrapped by the async value. - public func map(_ f: @escaping (Value) -> NewValue) -> Async { - return .init { callback in - self.run { a in callback(f(a)) } - } - } -} diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/Internal.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/Internal.swift deleted file mode 100644 index af77913..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/Internal.swift +++ /dev/null @@ -1,11 +0,0 @@ -#if os(macOS) -import Cocoa -typealias Image = NSImage -typealias ImageView = NSImageView -typealias View = NSView -#elseif os(iOS) || os(tvOS) -import UIKit -typealias Image = UIImage -typealias ImageView = UIImageView -typealias View = UIView -#endif diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/PlistEncoder.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/PlistEncoder.swift deleted file mode 100644 index 589557e..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/PlistEncoder.swift +++ /dev/null @@ -1,1828 +0,0 @@ -// NB: This file is copied from Swift to make available to Linux Swift 4.2 and below. -// -// https://github.com/apple/swift/blob/master/stdlib/public/SDK/Foundation/PlistEncoder.swift -import Foundation - -extension DecodingError { - internal static func _typeMismatch(at path: [CodingKey], expectation: Any.Type, reality: Any) -> DecodingError { - let description = "Expected to decode \(expectation) but found \(type(of: reality)) instead." - return .typeMismatch(expectation, Context(codingPath: path, debugDescription: description)) - } -} - -let kCFBooleanTrue = NSNumber(booleanLiteral: true) -let kCFBooleanFalse = NSNumber(booleanLiteral: false) - - -//===----------------------------------------------------------------------===// -// -// This source file is part of the Swift.org open source project -// -// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors -// Licensed under Apache License v2.0 with Runtime Library Exception -// -// See https://swift.org/LICENSE.txt for license information -// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors -// -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -// Plist Encoder -//===----------------------------------------------------------------------===// - -/// `PropertyListEncoder` facilitates the encoding of `Encodable` values into property lists. -open class PropertyListEncoder { - - // MARK: - Options - - /// The output format to write the property list data in. Defaults to `.binary`. - open var outputFormat: PropertyListSerialization.PropertyListFormat = .binary - - /// Contextual user-provided information for use during encoding. - open var userInfo: [CodingUserInfoKey : Any] = [:] - - /// Options set on the top-level encoder to pass down the encoding hierarchy. - fileprivate struct _Options { - let outputFormat: PropertyListSerialization.PropertyListFormat - let userInfo: [CodingUserInfoKey : Any] - } - - /// The options set on the top-level encoder. - fileprivate var options: _Options { - return _Options(outputFormat: outputFormat, userInfo: userInfo) - } - - // MARK: - Constructing a Property List Encoder - - /// Initializes `self` with default strategies. - public init() {} - - // MARK: - Encoding Values - - /// Encodes the given top-level value and returns its property list representation. - /// - /// - parameter value: The value to encode. - /// - returns: A new `Data` value containing the encoded property list data. - /// - throws: `EncodingError.invalidValue` if a non-conforming floating-point value is encountered during encoding, and the encoding strategy is `.throw`. - /// - throws: An error if any value throws an error during encoding. - open func encode(_ value: Value) throws -> Data { - let topLevel = try encodeToTopLevelContainer(value) - if topLevel is NSNumber { - throw EncodingError.invalidValue(value, - EncodingError.Context(codingPath: [], - debugDescription: "Top-level \(Value.self) encoded as number property list fragment.")) - } else if topLevel is NSString { - throw EncodingError.invalidValue(value, - EncodingError.Context(codingPath: [], - debugDescription: "Top-level \(Value.self) encoded as string property list fragment.")) - } else if topLevel is NSDate { - throw EncodingError.invalidValue(value, - EncodingError.Context(codingPath: [], - debugDescription: "Top-level \(Value.self) encoded as date property list fragment.")) - } - - do { - return try PropertyListSerialization.data(fromPropertyList: topLevel, format: self.outputFormat, options: 0) - } catch { - throw EncodingError.invalidValue(value, - EncodingError.Context(codingPath: [], debugDescription: "Unable to encode the given top-level value as a property list", underlyingError: error)) - } - } - - /// Encodes the given top-level value and returns its plist-type representation. - /// - /// - parameter value: The value to encode. - /// - returns: A new top-level array or dictionary representing the value. - /// - throws: `EncodingError.invalidValue` if a non-conforming floating-point value is encountered during encoding, and the encoding strategy is `.throw`. - /// - throws: An error if any value throws an error during encoding. - internal func encodeToTopLevelContainer(_ value: Value) throws -> Any { - let encoder = _PlistEncoder(options: self.options) - guard let topLevel = try encoder.box_(value) else { - throw EncodingError.invalidValue(value, - EncodingError.Context(codingPath: [], - debugDescription: "Top-level \(Value.self) did not encode any values.")) - } - - return topLevel - } -} - -// MARK: - _PlistEncoder - -fileprivate class _PlistEncoder : Encoder { - // MARK: Properties - - /// The encoder's storage. - fileprivate var storage: _PlistEncodingStorage - - /// Options set on the top-level encoder. - fileprivate let options: PropertyListEncoder._Options - - /// The path to the current point in encoding. - fileprivate(set) public var codingPath: [CodingKey] - - /// Contextual user-provided information for use during encoding. - public var userInfo: [CodingUserInfoKey : Any] { - return self.options.userInfo - } - - // MARK: - Initialization - - /// Initializes `self` with the given top-level encoder options. - fileprivate init(options: PropertyListEncoder._Options, codingPath: [CodingKey] = []) { - self.options = options - self.storage = _PlistEncodingStorage() - self.codingPath = codingPath - } - - /// Returns whether a new element can be encoded at this coding path. - /// - /// `true` if an element has not yet been encoded at this coding path; `false` otherwise. - fileprivate var canEncodeNewValue: Bool { - // Every time a new value gets encoded, the key it's encoded for is pushed onto the coding path (even if it's a nil key from an unkeyed container). - // At the same time, every time a container is requested, a new value gets pushed onto the storage stack. - // If there are more values on the storage stack than on the coding path, it means the value is requesting more than one container, which violates the precondition. - // - // This means that anytime something that can request a new container goes onto the stack, we MUST push a key onto the coding path. - // Things which will not request containers do not need to have the coding path extended for them (but it doesn't matter if it is, because they will not reach here). - return self.storage.count == self.codingPath.count - } - - // MARK: - Encoder Methods - public func container(keyedBy: Key.Type) -> KeyedEncodingContainer { - // If an existing keyed container was already requested, return that one. - let topContainer: NSMutableDictionary - if self.canEncodeNewValue { - // We haven't yet pushed a container at this level; do so here. - topContainer = self.storage.pushKeyedContainer() - } else { - guard let container = self.storage.containers.last as? NSMutableDictionary else { - preconditionFailure("Attempt to push new keyed encoding container when already previously encoded at this path.") - } - - topContainer = container - } - - let container = _PlistKeyedEncodingContainer(referencing: self, codingPath: self.codingPath, wrapping: topContainer) - return KeyedEncodingContainer(container) - } - - public func unkeyedContainer() -> UnkeyedEncodingContainer { - // If an existing unkeyed container was already requested, return that one. - let topContainer: NSMutableArray - if self.canEncodeNewValue { - // We haven't yet pushed a container at this level; do so here. - topContainer = self.storage.pushUnkeyedContainer() - } else { - guard let container = self.storage.containers.last as? NSMutableArray else { - preconditionFailure("Attempt to push new unkeyed encoding container when already previously encoded at this path.") - } - - topContainer = container - } - - return _PlistUnkeyedEncodingContainer(referencing: self, codingPath: self.codingPath, wrapping: topContainer) - } - - public func singleValueContainer() -> SingleValueEncodingContainer { - return self - } -} - -// MARK: - Encoding Storage and Containers - -fileprivate struct _PlistEncodingStorage { - // MARK: Properties - - /// The container stack. - /// Elements may be any one of the plist types (NSNumber, NSString, NSDate, NSArray, NSDictionary). - private(set) fileprivate var containers: [NSObject] = [] - - // MARK: - Initialization - - /// Initializes `self` with no containers. - fileprivate init() {} - - // MARK: - Modifying the Stack - - fileprivate var count: Int { - return self.containers.count - } - - fileprivate mutating func pushKeyedContainer() -> NSMutableDictionary { - let dictionary = NSMutableDictionary() - self.containers.append(dictionary) - return dictionary - } - - fileprivate mutating func pushUnkeyedContainer() -> NSMutableArray { - let array = NSMutableArray() - self.containers.append(array) - return array - } - - fileprivate mutating func push(container: __owned NSObject) { - self.containers.append(container) - } - - fileprivate mutating func popContainer() -> NSObject { - precondition(!self.containers.isEmpty, "Empty container stack.") - return self.containers.popLast()! - } -} - -// MARK: - Encoding Containers - -fileprivate struct _PlistKeyedEncodingContainer : KeyedEncodingContainerProtocol { - typealias Key = K - - // MARK: Properties - - /// A reference to the encoder we're writing to. - private let encoder: _PlistEncoder - - /// A reference to the container we're writing to. - private let container: NSMutableDictionary - - /// The path of coding keys taken to get to this point in encoding. - private(set) public var codingPath: [CodingKey] - - // MARK: - Initialization - - /// Initializes `self` with the given references. - fileprivate init(referencing encoder: _PlistEncoder, codingPath: [CodingKey], wrapping container: NSMutableDictionary) { - self.encoder = encoder - self.codingPath = codingPath - self.container = container - } - - // MARK: - KeyedEncodingContainerProtocol Methods - - public mutating func encodeNil(forKey key: Key) throws { self.container[key.stringValue] = _plistNullNSString } - public mutating func encode(_ value: Bool, forKey key: Key) throws { self.container[key.stringValue] = self.encoder.box(value) } - public mutating func encode(_ value: Int, forKey key: Key) throws { self.container[key.stringValue] = self.encoder.box(value) } - public mutating func encode(_ value: Int8, forKey key: Key) throws { self.container[key.stringValue] = self.encoder.box(value) } - public mutating func encode(_ value: Int16, forKey key: Key) throws { self.container[key.stringValue] = self.encoder.box(value) } - public mutating func encode(_ value: Int32, forKey key: Key) throws { self.container[key.stringValue] = self.encoder.box(value) } - public mutating func encode(_ value: Int64, forKey key: Key) throws { self.container[key.stringValue] = self.encoder.box(value) } - public mutating func encode(_ value: UInt, forKey key: Key) throws { self.container[key.stringValue] = self.encoder.box(value) } - public mutating func encode(_ value: UInt8, forKey key: Key) throws { self.container[key.stringValue] = self.encoder.box(value) } - public mutating func encode(_ value: UInt16, forKey key: Key) throws { self.container[key.stringValue] = self.encoder.box(value) } - public mutating func encode(_ value: UInt32, forKey key: Key) throws { self.container[key.stringValue] = self.encoder.box(value) } - public mutating func encode(_ value: UInt64, forKey key: Key) throws { self.container[key.stringValue] = self.encoder.box(value) } - public mutating func encode(_ value: String, forKey key: Key) throws { self.container[key.stringValue] = self.encoder.box(value) } - public mutating func encode(_ value: Float, forKey key: Key) throws { self.container[key.stringValue] = self.encoder.box(value) } - public mutating func encode(_ value: Double, forKey key: Key) throws { self.container[key.stringValue] = self.encoder.box(value) } - - public mutating func encode(_ value: T, forKey key: Key) throws { - self.encoder.codingPath.append(key) - defer { self.encoder.codingPath.removeLast() } - self.container[key.stringValue] = try self.encoder.box(value) - } - - public mutating func nestedContainer(keyedBy keyType: NestedKey.Type, forKey key: Key) -> KeyedEncodingContainer { - let dictionary = NSMutableDictionary() - self.container[key.stringValue] = dictionary - - self.codingPath.append(key) - defer { self.codingPath.removeLast() } - - let container = _PlistKeyedEncodingContainer(referencing: self.encoder, codingPath: self.codingPath, wrapping: dictionary) - return KeyedEncodingContainer(container) - } - - public mutating func nestedUnkeyedContainer(forKey key: Key) -> UnkeyedEncodingContainer { - let array = NSMutableArray() - self.container[key.stringValue] = array - - self.codingPath.append(key) - defer { self.codingPath.removeLast() } - return _PlistUnkeyedEncodingContainer(referencing: self.encoder, codingPath: self.codingPath, wrapping: array) - } - - public mutating func superEncoder() -> Encoder { - return _PlistReferencingEncoder(referencing: self.encoder, at: _PlistKey.super, wrapping: self.container) - } - - public mutating func superEncoder(forKey key: Key) -> Encoder { - return _PlistReferencingEncoder(referencing: self.encoder, at: key, wrapping: self.container) - } -} - -fileprivate struct _PlistUnkeyedEncodingContainer : UnkeyedEncodingContainer { - // MARK: Properties - - /// A reference to the encoder we're writing to. - private let encoder: _PlistEncoder - - /// A reference to the container we're writing to. - private let container: NSMutableArray - - /// The path of coding keys taken to get to this point in encoding. - private(set) public var codingPath: [CodingKey] - - /// The number of elements encoded into the container. - public var count: Int { - return self.container.count - } - - // MARK: - Initialization - - /// Initializes `self` with the given references. - fileprivate init(referencing encoder: _PlistEncoder, codingPath: [CodingKey], wrapping container: NSMutableArray) { - self.encoder = encoder - self.codingPath = codingPath - self.container = container - } - - // MARK: - UnkeyedEncodingContainer Methods - - public mutating func encodeNil() throws { self.container.add(_plistNullNSString) } - public mutating func encode(_ value: Bool) throws { self.container.add(self.encoder.box(value)) } - public mutating func encode(_ value: Int) throws { self.container.add(self.encoder.box(value)) } - public mutating func encode(_ value: Int8) throws { self.container.add(self.encoder.box(value)) } - public mutating func encode(_ value: Int16) throws { self.container.add(self.encoder.box(value)) } - public mutating func encode(_ value: Int32) throws { self.container.add(self.encoder.box(value)) } - public mutating func encode(_ value: Int64) throws { self.container.add(self.encoder.box(value)) } - public mutating func encode(_ value: UInt) throws { self.container.add(self.encoder.box(value)) } - public mutating func encode(_ value: UInt8) throws { self.container.add(self.encoder.box(value)) } - public mutating func encode(_ value: UInt16) throws { self.container.add(self.encoder.box(value)) } - public mutating func encode(_ value: UInt32) throws { self.container.add(self.encoder.box(value)) } - public mutating func encode(_ value: UInt64) throws { self.container.add(self.encoder.box(value)) } - public mutating func encode(_ value: Float) throws { self.container.add(self.encoder.box(value)) } - public mutating func encode(_ value: Double) throws { self.container.add(self.encoder.box(value)) } - public mutating func encode(_ value: String) throws { self.container.add(self.encoder.box(value)) } - - public mutating func encode(_ value: T) throws { - self.encoder.codingPath.append(_PlistKey(index: self.count)) - defer { self.encoder.codingPath.removeLast() } - self.container.add(try self.encoder.box(value)) - } - - public mutating func nestedContainer(keyedBy keyType: NestedKey.Type) -> KeyedEncodingContainer { - self.codingPath.append(_PlistKey(index: self.count)) - defer { self.codingPath.removeLast() } - - let dictionary = NSMutableDictionary() - self.container.add(dictionary) - - let container = _PlistKeyedEncodingContainer(referencing: self.encoder, codingPath: self.codingPath, wrapping: dictionary) - return KeyedEncodingContainer(container) - } - - public mutating func nestedUnkeyedContainer() -> UnkeyedEncodingContainer { - self.codingPath.append(_PlistKey(index: self.count)) - defer { self.codingPath.removeLast() } - - let array = NSMutableArray() - self.container.add(array) - return _PlistUnkeyedEncodingContainer(referencing: self.encoder, codingPath: self.codingPath, wrapping: array) - } - - public mutating func superEncoder() -> Encoder { - return _PlistReferencingEncoder(referencing: self.encoder, at: self.container.count, wrapping: self.container) - } -} - -extension _PlistEncoder : SingleValueEncodingContainer { - // MARK: - SingleValueEncodingContainer Methods - - private func assertCanEncodeNewValue() { - precondition(self.canEncodeNewValue, "Attempt to encode value through single value container when previously value already encoded.") - } - - public func encodeNil() throws { - assertCanEncodeNewValue() - self.storage.push(container: _plistNullNSString) - } - - public func encode(_ value: Bool) throws { - assertCanEncodeNewValue() - self.storage.push(container: self.box(value)) - } - - public func encode(_ value: Int) throws { - assertCanEncodeNewValue() - self.storage.push(container: self.box(value)) - } - - public func encode(_ value: Int8) throws { - assertCanEncodeNewValue() - self.storage.push(container: self.box(value)) - } - - public func encode(_ value: Int16) throws { - assertCanEncodeNewValue() - self.storage.push(container: self.box(value)) - } - - public func encode(_ value: Int32) throws { - assertCanEncodeNewValue() - self.storage.push(container: self.box(value)) - } - - public func encode(_ value: Int64) throws { - assertCanEncodeNewValue() - self.storage.push(container: self.box(value)) - } - - public func encode(_ value: UInt) throws { - assertCanEncodeNewValue() - self.storage.push(container: self.box(value)) - } - - public func encode(_ value: UInt8) throws { - assertCanEncodeNewValue() - self.storage.push(container: self.box(value)) - } - - public func encode(_ value: UInt16) throws { - assertCanEncodeNewValue() - self.storage.push(container: self.box(value)) - } - - public func encode(_ value: UInt32) throws { - assertCanEncodeNewValue() - self.storage.push(container: self.box(value)) - } - - public func encode(_ value: UInt64) throws { - assertCanEncodeNewValue() - self.storage.push(container: self.box(value)) - } - - public func encode(_ value: String) throws { - assertCanEncodeNewValue() - self.storage.push(container: self.box(value)) - } - - public func encode(_ value: Float) throws { - assertCanEncodeNewValue() - self.storage.push(container: self.box(value)) - } - - public func encode(_ value: Double) throws { - assertCanEncodeNewValue() - self.storage.push(container: self.box(value)) - } - - public func encode(_ value: T) throws { - assertCanEncodeNewValue() - try self.storage.push(container: self.box(value)) - } -} - -// MARK: - Concrete Value Representations - -extension _PlistEncoder { - - /// Returns the given value boxed in a container appropriate for pushing onto the container stack. - fileprivate func box(_ value: Bool) -> NSObject { return NSNumber(value: value) } - fileprivate func box(_ value: Int) -> NSObject { return NSNumber(value: value) } - fileprivate func box(_ value: Int8) -> NSObject { return NSNumber(value: value) } - fileprivate func box(_ value: Int16) -> NSObject { return NSNumber(value: value) } - fileprivate func box(_ value: Int32) -> NSObject { return NSNumber(value: value) } - fileprivate func box(_ value: Int64) -> NSObject { return NSNumber(value: value) } - fileprivate func box(_ value: UInt) -> NSObject { return NSNumber(value: value) } - fileprivate func box(_ value: UInt8) -> NSObject { return NSNumber(value: value) } - fileprivate func box(_ value: UInt16) -> NSObject { return NSNumber(value: value) } - fileprivate func box(_ value: UInt32) -> NSObject { return NSNumber(value: value) } - fileprivate func box(_ value: UInt64) -> NSObject { return NSNumber(value: value) } - fileprivate func box(_ value: Float) -> NSObject { return NSNumber(value: value) } - fileprivate func box(_ value: Double) -> NSObject { return NSNumber(value: value) } - fileprivate func box(_ value: String) -> NSObject { return NSString(string: value) } - - fileprivate func box(_ value: T) throws -> NSObject { - return try self.box_(value) ?? NSDictionary() - } - - fileprivate func box_(_ value: T) throws -> NSObject? { - if T.self == Date.self || T.self == NSDate.self { - // PropertyListSerialization handles NSDate directly. - return (value as! NSDate) - } else if T.self == Data.self || T.self == NSData.self { - // PropertyListSerialization handles NSData directly. - return (value as! NSData) - } - - // The value should request a container from the _PlistEncoder. - let depth = self.storage.count - do { - try value.encode(to: self) - } catch let error { - // If the value pushed a container before throwing, pop it back off to restore state. - if self.storage.count > depth { - let _ = self.storage.popContainer() - } - - throw error - } - - // The top container should be a new container. - guard self.storage.count > depth else { - return nil - } - - return self.storage.popContainer() - } -} - -// MARK: - _PlistReferencingEncoder - -/// _PlistReferencingEncoder is a special subclass of _PlistEncoder which has its own storage, but references the contents of a different encoder. -/// It's used in superEncoder(), which returns a new encoder for encoding a superclass -- the lifetime of the encoder should not escape the scope it's created in, but it doesn't necessarily know when it's done being used (to write to the original container). -fileprivate class _PlistReferencingEncoder : _PlistEncoder { - // MARK: Reference types. - - /// The type of container we're referencing. - private enum Reference { - /// Referencing a specific index in an array container. - case array(NSMutableArray, Int) - - /// Referencing a specific key in a dictionary container. - case dictionary(NSMutableDictionary, String) - } - - // MARK: - Properties - - /// The encoder we're referencing. - private let encoder: _PlistEncoder - - /// The container reference itself. - private let reference: Reference - - // MARK: - Initialization - - /// Initializes `self` by referencing the given array container in the given encoder. - fileprivate init(referencing encoder: _PlistEncoder, at index: Int, wrapping array: NSMutableArray) { - self.encoder = encoder - self.reference = .array(array, index) - super.init(options: encoder.options, codingPath: encoder.codingPath) - - self.codingPath.append(_PlistKey(index: index)) - } - - /// Initializes `self` by referencing the given dictionary container in the given encoder. - fileprivate init(referencing encoder: _PlistEncoder, at key: CodingKey, wrapping dictionary: NSMutableDictionary) { - self.encoder = encoder - self.reference = .dictionary(dictionary, key.stringValue) - super.init(options: encoder.options, codingPath: encoder.codingPath) - - self.codingPath.append(key) - } - - // MARK: - Coding Path Operations - - fileprivate override var canEncodeNewValue: Bool { - // With a regular encoder, the storage and coding path grow together. - // A referencing encoder, however, inherits its parents coding path, as well as the key it was created for. - // We have to take this into account. - return self.storage.count == self.codingPath.count - self.encoder.codingPath.count - 1 - } - - // MARK: - Deinitialization - - // Finalizes `self` by writing the contents of our storage to the referenced encoder's storage. - deinit { - let value: Any - switch self.storage.count { - case 0: value = NSDictionary() - case 1: value = self.storage.popContainer() - default: fatalError("Referencing encoder deallocated with multiple containers on stack.") - } - - switch self.reference { - case .array(let array, let index): - array.insert(value, at: index) - - case .dictionary(let dictionary, let key): - dictionary[NSString(string: key)] = value - } - } -} - -//===----------------------------------------------------------------------===// -// Plist Decoder -//===----------------------------------------------------------------------===// - -/// `PropertyListDecoder` facilitates the decoding of property list values into semantic `Decodable` types. -open class PropertyListDecoder { - // MARK: Options - - /// Contextual user-provided information for use during decoding. - open var userInfo: [CodingUserInfoKey : Any] = [:] - - /// Options set on the top-level encoder to pass down the decoding hierarchy. - fileprivate struct _Options { - let userInfo: [CodingUserInfoKey : Any] - } - - /// The options set on the top-level decoder. - fileprivate var options: _Options { - return _Options(userInfo: userInfo) - } - - // MARK: - Constructing a Property List Decoder - - /// Initializes `self` with default strategies. - public init() {} - - // MARK: - Decoding Values - - /// Decodes a top-level value of the given type from the given property list representation. - /// - /// - parameter type: The type of the value to decode. - /// - parameter data: The data to decode from. - /// - returns: A value of the requested type. - /// - throws: `DecodingError.dataCorrupted` if values requested from the payload are corrupted, or if the given data is not a valid property list. - /// - throws: An error if any value throws an error during decoding. - open func decode(_ type: T.Type, from data: Data) throws -> T { - var format: PropertyListSerialization.PropertyListFormat = .binary - return try decode(type, from: data, format: &format) - } - - /// Decodes a top-level value of the given type from the given property list representation. - /// - /// - parameter type: The type of the value to decode. - /// - parameter data: The data to decode from. - /// - parameter format: The parsed property list format. - /// - returns: A value of the requested type along with the detected format of the property list. - /// - throws: `DecodingError.dataCorrupted` if values requested from the payload are corrupted, or if the given data is not a valid property list. - /// - throws: An error if any value throws an error during decoding. - open func decode(_ type: T.Type, from data: Data, format: inout PropertyListSerialization.PropertyListFormat) throws -> T { - let topLevel: Any - do { - topLevel = try PropertyListSerialization.propertyList(from: data, options: [], format: &format) - } catch { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: [], debugDescription: "The given data was not a valid property list.", underlyingError: error)) - } - - return try decode(type, fromTopLevel: topLevel) - } - - /// Decodes a top-level value of the given type from the given property list container (top-level array or dictionary). - /// - /// - parameter type: The type of the value to decode. - /// - parameter container: The top-level plist container. - /// - returns: A value of the requested type. - /// - throws: `DecodingError.dataCorrupted` if values requested from the payload are corrupted, or if the given data is not a valid property list. - /// - throws: An error if any value throws an error during decoding. - internal func decode(_ type: T.Type, fromTopLevel container: Any) throws -> T { - let decoder = _PlistDecoder(referencing: container, options: self.options) - guard let value = try decoder.unbox(container, as: type) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: [], debugDescription: "The given data did not contain a top-level value.")) - } - - return value - } -} - -// MARK: - _PlistDecoder - -fileprivate class _PlistDecoder : Decoder { - // MARK: Properties - - /// The decoder's storage. - fileprivate var storage: _PlistDecodingStorage - - /// Options set on the top-level decoder. - fileprivate let options: PropertyListDecoder._Options - - /// The path to the current point in encoding. - fileprivate(set) public var codingPath: [CodingKey] - - /// Contextual user-provided information for use during encoding. - public var userInfo: [CodingUserInfoKey : Any] { - return self.options.userInfo - } - - // MARK: - Initialization - - /// Initializes `self` with the given top-level container and options. - fileprivate init(referencing container: Any, at codingPath: [CodingKey] = [], options: PropertyListDecoder._Options) { - self.storage = _PlistDecodingStorage() - self.storage.push(container: container) - self.codingPath = codingPath - self.options = options - } - - // MARK: - Decoder Methods - - public func container(keyedBy type: Key.Type) throws -> KeyedDecodingContainer { - guard !(self.storage.topContainer is NSNull) else { - throw DecodingError.valueNotFound(KeyedDecodingContainer.self, - DecodingError.Context(codingPath: self.codingPath, - debugDescription: "Cannot get keyed decoding container -- found null value instead.")) - } - - guard let topContainer = self.storage.topContainer as? [String : Any] else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: [String : Any].self, reality: self.storage.topContainer) - } - - let container = _PlistKeyedDecodingContainer(referencing: self, wrapping: topContainer) - return KeyedDecodingContainer(container) - } - - public func unkeyedContainer() throws -> UnkeyedDecodingContainer { - guard !(self.storage.topContainer is NSNull) else { - throw DecodingError.valueNotFound(UnkeyedDecodingContainer.self, - DecodingError.Context(codingPath: self.codingPath, - debugDescription: "Cannot get unkeyed decoding container -- found null value instead.")) - } - - guard let topContainer = self.storage.topContainer as? [Any] else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: [Any].self, reality: self.storage.topContainer) - } - - return _PlistUnkeyedDecodingContainer(referencing: self, wrapping: topContainer) - } - - public func singleValueContainer() throws -> SingleValueDecodingContainer { - return self - } -} - -// MARK: - Decoding Storage - -fileprivate struct _PlistDecodingStorage { - // MARK: Properties - - /// The container stack. - /// Elements may be any one of the plist types (NSNumber, Date, String, Array, [String : Any]). - private(set) fileprivate var containers: [Any] = [] - - // MARK: - Initialization - - /// Initializes `self` with no containers. - fileprivate init() {} - - // MARK: - Modifying the Stack - - fileprivate var count: Int { - return self.containers.count - } - - fileprivate var topContainer: Any { - precondition(!self.containers.isEmpty, "Empty container stack.") - return self.containers.last! - } - - fileprivate mutating func push(container: __owned Any) { - self.containers.append(container) - } - - fileprivate mutating func popContainer() { - precondition(!self.containers.isEmpty, "Empty container stack.") - self.containers.removeLast() - } -} - -// MARK: Decoding Containers - -fileprivate struct _PlistKeyedDecodingContainer : KeyedDecodingContainerProtocol { - typealias Key = K - - // MARK: Properties - - /// A reference to the decoder we're reading from. - private let decoder: _PlistDecoder - - /// A reference to the container we're reading from. - private let container: [String : Any] - - /// The path of coding keys taken to get to this point in decoding. - private(set) public var codingPath: [CodingKey] - - // MARK: - Initialization - - /// Initializes `self` by referencing the given decoder and container. - fileprivate init(referencing decoder: _PlistDecoder, wrapping container: [String : Any]) { - self.decoder = decoder - self.container = container - self.codingPath = decoder.codingPath - } - - // MARK: - KeyedDecodingContainerProtocol Methods - - public var allKeys: [Key] { - return self.container.keys.compactMap { Key(stringValue: $0) } - } - - public func contains(_ key: Key) -> Bool { - return self.container[key.stringValue] != nil - } - - public func decodeNil(forKey key: Key) throws -> Bool { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - guard let value = entry as? String else { - return false - } - - return value == _plistNull - } - - public func decode(_ type: Bool.Type, forKey key: Key) throws -> Bool { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = try self.decoder.unbox(entry, as: Bool.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead.")) - } - - return value - } - - public func decode(_ type: Int.Type, forKey key: Key) throws -> Int { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = try self.decoder.unbox(entry, as: Int.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead.")) - } - - return value - } - - public func decode(_ type: Int8.Type, forKey key: Key) throws -> Int8 { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = try self.decoder.unbox(entry, as: Int8.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead.")) - } - - return value - } - - public func decode(_ type: Int16.Type, forKey key: Key) throws -> Int16 { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = try self.decoder.unbox(entry, as: Int16.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead.")) - } - - return value - } - - public func decode(_ type: Int32.Type, forKey key: Key) throws -> Int32 { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = try self.decoder.unbox(entry, as: Int32.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead.")) - } - - return value - } - - public func decode(_ type: Int64.Type, forKey key: Key) throws -> Int64 { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = try self.decoder.unbox(entry, as: Int64.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead.")) - } - - return value - } - - public func decode(_ type: UInt.Type, forKey key: Key) throws -> UInt { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = try self.decoder.unbox(entry, as: UInt.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead.")) - } - - return value - } - - public func decode(_ type: UInt8.Type, forKey key: Key) throws -> UInt8 { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = try self.decoder.unbox(entry, as: UInt8.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead.")) - } - - return value - } - - public func decode(_ type: UInt16.Type, forKey key: Key) throws -> UInt16 { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = try self.decoder.unbox(entry, as: UInt16.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead.")) - } - - return value - } - - public func decode(_ type: UInt32.Type, forKey key: Key) throws -> UInt32 { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = try self.decoder.unbox(entry, as: UInt32.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead.")) - } - - return value - } - - public func decode(_ type: UInt64.Type, forKey key: Key) throws -> UInt64 { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = try self.decoder.unbox(entry, as: UInt64.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead.")) - } - - return value - } - - public func decode(_ type: Float.Type, forKey key: Key) throws -> Float { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - guard let value = try self.decoder.unbox(entry, as: Float.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead.")) - } - - return value - } - - public func decode(_ type: Double.Type, forKey key: Key) throws -> Double { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = try self.decoder.unbox(entry, as: Double.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead.")) - } - - return value - } - - public func decode(_ type: String.Type, forKey key: Key) throws -> String { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = try self.decoder.unbox(entry, as: String.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead.")) - } - - return value - } - - public func decode(_ type: T.Type, forKey key: Key) throws -> T { - guard let entry = self.container[key.stringValue] else { - throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\").")) - } - - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = try self.decoder.unbox(entry, as: type) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead.")) - } - - return value - } - - public func nestedContainer(keyedBy type: NestedKey.Type, forKey key: Key) throws -> KeyedDecodingContainer { - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = self.container[key.stringValue] else { - throw DecodingError.valueNotFound(KeyedDecodingContainer.self, - DecodingError.Context(codingPath: self.codingPath, - debugDescription: "Cannot get nested keyed container -- no value found for key \"\(key.stringValue)\"")) - } - - guard let dictionary = value as? [String : Any] else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: [String : Any].self, reality: value) - } - - let container = _PlistKeyedDecodingContainer(referencing: self.decoder, wrapping: dictionary) - return KeyedDecodingContainer(container) - } - - public func nestedUnkeyedContainer(forKey key: Key) throws -> UnkeyedDecodingContainer { - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - guard let value = self.container[key.stringValue] else { - throw DecodingError.valueNotFound(UnkeyedDecodingContainer.self, - DecodingError.Context(codingPath: self.codingPath, - debugDescription: "Cannot get nested unkeyed container -- no value found for key \"\(key.stringValue)\"")) - } - - guard let array = value as? [Any] else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: [Any].self, reality: value) - } - - return _PlistUnkeyedDecodingContainer(referencing: self.decoder, wrapping: array) - } - - private func _superDecoder(forKey key: __owned CodingKey) throws -> Decoder { - self.decoder.codingPath.append(key) - defer { self.decoder.codingPath.removeLast() } - - let value: Any = self.container[key.stringValue] ?? NSNull() - return _PlistDecoder(referencing: value, at: self.decoder.codingPath, options: self.decoder.options) - } - - public func superDecoder() throws -> Decoder { - return try _superDecoder(forKey: _PlistKey.super) - } - - public func superDecoder(forKey key: Key) throws -> Decoder { - return try _superDecoder(forKey: key) - } -} - -fileprivate struct _PlistUnkeyedDecodingContainer : UnkeyedDecodingContainer { - // MARK: Properties - - /// A reference to the decoder we're reading from. - private let decoder: _PlistDecoder - - /// A reference to the container we're reading from. - private let container: [Any] - - /// The path of coding keys taken to get to this point in decoding. - private(set) public var codingPath: [CodingKey] - - /// The index of the element we're about to decode. - private(set) public var currentIndex: Int - - // MARK: - Initialization - - /// Initializes `self` by referencing the given decoder and container. - fileprivate init(referencing decoder: _PlistDecoder, wrapping container: [Any]) { - self.decoder = decoder - self.container = container - self.codingPath = decoder.codingPath - self.currentIndex = 0 - } - - // MARK: - UnkeyedDecodingContainer Methods - - public var count: Int? { - return self.container.count - } - - public var isAtEnd: Bool { - return self.currentIndex >= self.count! - } - - public mutating func decodeNil() throws -> Bool { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(Any?.self, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - if self.container[self.currentIndex] is NSNull { - self.currentIndex += 1 - return true - } else { - return false - } - } - - public mutating func decode(_ type: Bool.Type) throws -> Bool { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard let decoded = try self.decoder.unbox(self.container[self.currentIndex], as: Bool.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Expected \(type) but found null instead.")) - } - - self.currentIndex += 1 - return decoded - } - - public mutating func decode(_ type: Int.Type) throws -> Int { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard let decoded = try self.decoder.unbox(self.container[self.currentIndex], as: Int.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Expected \(type) but found null instead.")) - } - - self.currentIndex += 1 - return decoded - } - - public mutating func decode(_ type: Int8.Type) throws -> Int8 { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard let decoded = try self.decoder.unbox(self.container[self.currentIndex], as: Int8.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Expected \(type) but found null instead.")) - } - - self.currentIndex += 1 - return decoded - } - - public mutating func decode(_ type: Int16.Type) throws -> Int16 { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard let decoded = try self.decoder.unbox(self.container[self.currentIndex], as: Int16.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Expected \(type) but found null instead.")) - } - - self.currentIndex += 1 - return decoded - } - - public mutating func decode(_ type: Int32.Type) throws -> Int32 { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard let decoded = try self.decoder.unbox(self.container[self.currentIndex], as: Int32.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Expected \(type) but found null instead.")) - } - - self.currentIndex += 1 - return decoded - } - - public mutating func decode(_ type: Int64.Type) throws -> Int64 { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard let decoded = try self.decoder.unbox(self.container[self.currentIndex], as: Int64.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Expected \(type) but found null instead.")) - } - - self.currentIndex += 1 - return decoded - } - - public mutating func decode(_ type: UInt.Type) throws -> UInt { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard let decoded = try self.decoder.unbox(self.container[self.currentIndex], as: UInt.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Expected \(type) but found null instead.")) - } - - self.currentIndex += 1 - return decoded - } - - public mutating func decode(_ type: UInt8.Type) throws -> UInt8 { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard let decoded = try self.decoder.unbox(self.container[self.currentIndex], as: UInt8.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Expected \(type) but found null instead.")) - } - - self.currentIndex += 1 - return decoded - } - - public mutating func decode(_ type: UInt16.Type) throws -> UInt16 { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard let decoded = try self.decoder.unbox(self.container[self.currentIndex], as: UInt16.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Expected \(type) but found null instead.")) - } - - self.currentIndex += 1 - return decoded - } - - public mutating func decode(_ type: UInt32.Type) throws -> UInt32 { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard let decoded = try self.decoder.unbox(self.container[self.currentIndex], as: UInt32.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Expected \(type) but found null instead.")) - } - - self.currentIndex += 1 - return decoded - } - - public mutating func decode(_ type: UInt64.Type) throws -> UInt64 { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard let decoded = try self.decoder.unbox(self.container[self.currentIndex], as: UInt64.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Expected \(type) but found null instead.")) - } - - self.currentIndex += 1 - return decoded - } - - public mutating func decode(_ type: Float.Type) throws -> Float { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard let decoded = try self.decoder.unbox(self.container[self.currentIndex], as: Float.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Expected \(type) but found null instead.")) - } - - self.currentIndex += 1 - return decoded - } - - public mutating func decode(_ type: Double.Type) throws -> Double { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard let decoded = try self.decoder.unbox(self.container[self.currentIndex], as: Double.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Expected \(type) but found null instead.")) - } - - self.currentIndex += 1 - return decoded - } - - public mutating func decode(_ type: String.Type) throws -> String { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard let decoded = try self.decoder.unbox(self.container[self.currentIndex], as: String.self) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Expected \(type) but found null instead.")) - } - - self.currentIndex += 1 - return decoded - } - - public mutating func decode(_ type: T.Type) throws -> T { - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Unkeyed container is at end.")) - } - - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard let decoded = try self.decoder.unbox(self.container[self.currentIndex], as: type) else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath + [_PlistKey(index: self.currentIndex)], debugDescription: "Expected \(type) but found null instead.")) - } - - self.currentIndex += 1 - return decoded - } - - public mutating func nestedContainer(keyedBy type: NestedKey.Type) throws -> KeyedDecodingContainer { - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(KeyedDecodingContainer.self, - DecodingError.Context(codingPath: self.codingPath, - debugDescription: "Cannot get nested keyed container -- unkeyed container is at end.")) - } - - let value = self.container[self.currentIndex] - guard !(value is NSNull) else { - throw DecodingError.valueNotFound(KeyedDecodingContainer.self, - DecodingError.Context(codingPath: self.codingPath, - debugDescription: "Cannot get keyed decoding container -- found null value instead.")) - } - - guard let dictionary = value as? [String : Any] else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: [String : Any].self, reality: value) - } - - self.currentIndex += 1 - let container = _PlistKeyedDecodingContainer(referencing: self.decoder, wrapping: dictionary) - return KeyedDecodingContainer(container) - } - - public mutating func nestedUnkeyedContainer() throws -> UnkeyedDecodingContainer { - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(UnkeyedDecodingContainer.self, - DecodingError.Context(codingPath: self.codingPath, - debugDescription: "Cannot get nested unkeyed container -- unkeyed container is at end.")) - } - - let value = self.container[self.currentIndex] - guard !(value is NSNull) else { - throw DecodingError.valueNotFound(UnkeyedDecodingContainer.self, - DecodingError.Context(codingPath: self.codingPath, - debugDescription: "Cannot get keyed decoding container -- found null value instead.")) - } - - guard let array = value as? [Any] else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: [Any].self, reality: value) - } - - self.currentIndex += 1 - return _PlistUnkeyedDecodingContainer(referencing: self.decoder, wrapping: array) - } - - public mutating func superDecoder() throws -> Decoder { - self.decoder.codingPath.append(_PlistKey(index: self.currentIndex)) - defer { self.decoder.codingPath.removeLast() } - - guard !self.isAtEnd else { - throw DecodingError.valueNotFound(Decoder.self, DecodingError.Context(codingPath: self.codingPath, - debugDescription: "Cannot get superDecoder() -- unkeyed container is at end.")) - } - - let value = self.container[self.currentIndex] - self.currentIndex += 1 - return _PlistDecoder(referencing: value, at: self.decoder.codingPath, options: self.decoder.options) - } -} - -extension _PlistDecoder : SingleValueDecodingContainer { - // MARK: SingleValueDecodingContainer Methods - - private func expectNonNull(_ type: T.Type) throws { - guard !self.decodeNil() else { - throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.codingPath, debugDescription: "Expected \(type) but found null value instead.")) - } - } - - public func decodeNil() -> Bool { - guard let string = self.storage.topContainer as? String else { - return false - } - - return string == _plistNull - } - - public func decode(_ type: Bool.Type) throws -> Bool { - try expectNonNull(Bool.self) - return try self.unbox(self.storage.topContainer, as: Bool.self)! - } - - public func decode(_ type: Int.Type) throws -> Int { - try expectNonNull(Int.self) - return try self.unbox(self.storage.topContainer, as: Int.self)! - } - - public func decode(_ type: Int8.Type) throws -> Int8 { - try expectNonNull(Int8.self) - return try self.unbox(self.storage.topContainer, as: Int8.self)! - } - - public func decode(_ type: Int16.Type) throws -> Int16 { - try expectNonNull(Int16.self) - return try self.unbox(self.storage.topContainer, as: Int16.self)! - } - - public func decode(_ type: Int32.Type) throws -> Int32 { - try expectNonNull(Int32.self) - return try self.unbox(self.storage.topContainer, as: Int32.self)! - } - - public func decode(_ type: Int64.Type) throws -> Int64 { - try expectNonNull(Int64.self) - return try self.unbox(self.storage.topContainer, as: Int64.self)! - } - - public func decode(_ type: UInt.Type) throws -> UInt { - try expectNonNull(UInt.self) - return try self.unbox(self.storage.topContainer, as: UInt.self)! - } - - public func decode(_ type: UInt8.Type) throws -> UInt8 { - try expectNonNull(UInt8.self) - return try self.unbox(self.storage.topContainer, as: UInt8.self)! - } - - public func decode(_ type: UInt16.Type) throws -> UInt16 { - try expectNonNull(UInt16.self) - return try self.unbox(self.storage.topContainer, as: UInt16.self)! - } - - public func decode(_ type: UInt32.Type) throws -> UInt32 { - try expectNonNull(UInt32.self) - return try self.unbox(self.storage.topContainer, as: UInt32.self)! - } - - public func decode(_ type: UInt64.Type) throws -> UInt64 { - try expectNonNull(UInt64.self) - return try self.unbox(self.storage.topContainer, as: UInt64.self)! - } - - public func decode(_ type: Float.Type) throws -> Float { - try expectNonNull(Float.self) - return try self.unbox(self.storage.topContainer, as: Float.self)! - } - - public func decode(_ type: Double.Type) throws -> Double { - try expectNonNull(Double.self) - return try self.unbox(self.storage.topContainer, as: Double.self)! - } - - public func decode(_ type: String.Type) throws -> String { - try expectNonNull(String.self) - return try self.unbox(self.storage.topContainer, as: String.self)! - } - - public func decode(_ type: T.Type) throws -> T { - try expectNonNull(type) - return try self.unbox(self.storage.topContainer, as: type)! - } -} - -// MARK: - Concrete Value Representations - -extension _PlistDecoder { - /// Returns the given value unboxed from a container. - fileprivate func unbox(_ value: Any, as type: Bool.Type) throws -> Bool? { - if let string = value as? String, string == _plistNull { return nil } - - if let number = value as? NSNumber { - // TODO: Add a flag to coerce non-boolean numbers into Bools? - if number === kCFBooleanTrue as NSNumber { - return true - } else if number === kCFBooleanFalse as NSNumber { - return false - } - - /* FIXME: If swift-corelibs-foundation doesn't change to use NSNumber, this code path will need to be included and tested: - } else if let bool = value as? Bool { - return bool - */ - - } - - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - fileprivate func unbox(_ value: Any, as type: Int.Type) throws -> Int? { - if let string = value as? String, string == _plistNull { return nil } - - guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - let int = number.intValue - guard NSNumber(value: int) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed property list number <\(number)> does not fit in \(type).")) - } - - return int - } - - fileprivate func unbox(_ value: Any, as type: Int8.Type) throws -> Int8? { - if let string = value as? String, string == _plistNull { return nil } - - guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - let int8 = number.int8Value - guard NSNumber(value: int8) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed property list number <\(number)> does not fit in \(type).")) - } - - return int8 - } - - fileprivate func unbox(_ value: Any, as type: Int16.Type) throws -> Int16? { - if let string = value as? String, string == _plistNull { return nil } - - guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - let int16 = number.int16Value - guard NSNumber(value: int16) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed property list number <\(number)> does not fit in \(type).")) - } - - return int16 - } - - fileprivate func unbox(_ value: Any, as type: Int32.Type) throws -> Int32? { - if let string = value as? String, string == _plistNull { return nil } - - guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - let int32 = number.int32Value - guard NSNumber(value: int32) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed property list number <\(number)> does not fit in \(type).")) - } - - return int32 - } - - fileprivate func unbox(_ value: Any, as type: Int64.Type) throws -> Int64? { - if let string = value as? String, string == _plistNull { return nil } - - guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - let int64 = number.int64Value - guard NSNumber(value: int64) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed property list number <\(number)> does not fit in \(type).")) - } - - return int64 - } - - fileprivate func unbox(_ value: Any, as type: UInt.Type) throws -> UInt? { - if let string = value as? String, string == _plistNull { return nil } - - guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - let uint = number.uintValue - guard NSNumber(value: uint) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed property list number <\(number)> does not fit in \(type).")) - } - - return uint - } - - fileprivate func unbox(_ value: Any, as type: UInt8.Type) throws -> UInt8? { - if let string = value as? String, string == _plistNull { return nil } - - guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - let uint8 = number.uint8Value - guard NSNumber(value: uint8) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed property list number <\(number)> does not fit in \(type).")) - } - - return uint8 - } - - fileprivate func unbox(_ value: Any, as type: UInt16.Type) throws -> UInt16? { - if let string = value as? String, string == _plistNull { return nil } - - guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - let uint16 = number.uint16Value - guard NSNumber(value: uint16) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed property list number <\(number)> does not fit in \(type).")) - } - - return uint16 - } - - fileprivate func unbox(_ value: Any, as type: UInt32.Type) throws -> UInt32? { - if let string = value as? String, string == _plistNull { return nil } - - guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - let uint32 = number.uint32Value - guard NSNumber(value: uint32) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed property list number <\(number)> does not fit in \(type).")) - } - - return uint32 - } - - fileprivate func unbox(_ value: Any, as type: UInt64.Type) throws -> UInt64? { - if let string = value as? String, string == _plistNull { return nil } - - guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - let uint64 = number.uint64Value - guard NSNumber(value: uint64) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed property list number <\(number)> does not fit in \(type).")) - } - - return uint64 - } - - fileprivate func unbox(_ value: Any, as type: Float.Type) throws -> Float? { - if let string = value as? String, string == _plistNull { return nil } - - guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - let float = number.floatValue - guard NSNumber(value: float) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed property list number <\(number)> does not fit in \(type).")) - } - - return float - } - - fileprivate func unbox(_ value: Any, as type: Double.Type) throws -> Double? { - if let string = value as? String, string == _plistNull { return nil } - - guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - let double = number.doubleValue - guard NSNumber(value: double) == number else { - throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed property list number <\(number)> does not fit in \(type).")) - } - - return double - } - - fileprivate func unbox(_ value: Any, as type: String.Type) throws -> String? { - guard let string = value as? String else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - return string == _plistNull ? nil : string - } - - fileprivate func unbox(_ value: Any, as type: Date.Type) throws -> Date? { - if let string = value as? String, string == _plistNull { return nil } - - guard let date = value as? Date else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - return date - } - - fileprivate func unbox(_ value: Any, as type: Data.Type) throws -> Data? { - if let string = value as? String, string == _plistNull { return nil } - - guard let data = value as? Data else { - throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value) - } - - return data - } - - fileprivate func unbox(_ value: Any, as type: T.Type) throws -> T? { - if type == Date.self || type == NSDate.self { - return try self.unbox(value, as: Date.self) as? T - } else if type == Data.self || type == NSData.self { - return try self.unbox(value, as: Data.self) as? T - } else { - self.storage.push(container: value) - defer { self.storage.popContainer() } - return try type.init(from: self) - } - } -} - -//===----------------------------------------------------------------------===// -// Shared Plist Null Representation -//===----------------------------------------------------------------------===// - -// Since plists do not support null values by default, we will encode them as "$null". -fileprivate let _plistNull = "$null" -fileprivate let _plistNullNSString = NSString(string: _plistNull) - -//===----------------------------------------------------------------------===// -// Shared Key Types -//===----------------------------------------------------------------------===// - -fileprivate struct _PlistKey : CodingKey { - public var stringValue: String - public var intValue: Int? - - public init?(stringValue: String) { - self.stringValue = stringValue - self.intValue = nil - } - - public init?(intValue: Int) { - self.stringValue = "\(intValue)" - self.intValue = intValue - } - - fileprivate init(index: Int) { - self.stringValue = "Index \(index)" - self.intValue = index - } - - fileprivate static let `super` = _PlistKey(stringValue: "super")! -} diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/String+SpecialCharacters.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/String+SpecialCharacters.swift deleted file mode 100644 index e084323..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/String+SpecialCharacters.swift +++ /dev/null @@ -1,57 +0,0 @@ -import Foundation - -extension String { - - /// Checks whether the string has escaped special character literals or not. - /// - /// This method won't detect an unescaped special character. - /// For example, this method will return true for "\\n" or #"\n"#, but false for "\n" - /// - /// The following are the special character literals that this methods looks for: - /// The escaped special characters \0 (null character), \\ (backslash), - /// \t (horizontal tab), \n (line feed), \r (carriage return), - /// \" (double quotation mark) and \' (single quotation mark), - /// An arbitrary Unicode scalar value, written as \u{n}, - /// where n is a 1–8 digit hexadecimal number (Unicode is discussed in Unicode below) - /// The character sequence "# - /// - /// - Returns: True if the string has any special character literals, false otherwise. - func hasEscapedSpecialCharactersLiteral() -> Bool { - let multilineLiteralAndNumberSign = ##""" - """# - """## - let patterns = [ - // Matches \u{n} where n is a 1–8 digit hexadecimal number - try? NSRegularExpression(pattern: #"\\u\{[a-fA-f0-9]{1,8}\}"#, options: .init()), - try? NSRegularExpression(pattern: #"\0"#, options: .ignoreMetacharacters), - try? NSRegularExpression(pattern: #"\\"#, options: .ignoreMetacharacters), - try? NSRegularExpression(pattern: #"\t"#, options: .ignoreMetacharacters), - try? NSRegularExpression(pattern: #"\n"#, options: .ignoreMetacharacters), - try? NSRegularExpression(pattern: #"\r"#, options: .ignoreMetacharacters), - try? NSRegularExpression(pattern: #"\""#, options: .ignoreMetacharacters), - try? NSRegularExpression(pattern: #"\'"#, options: .ignoreMetacharacters), - try? NSRegularExpression(pattern: multilineLiteralAndNumberSign, options: .ignoreMetacharacters), - ] - let matches = patterns.compactMap { $0?.firstMatch(in: self, options: .init(), range: NSRange.init(location: 0, length: self.count)) } - return matches.count > 0 - } - - - /// This method calculates how many number signs (#) we need to add around a string - /// literal to properly escape its content. - /// - /// Multiple # are needed when the literal contains "#, "##, "### ... - /// - /// - Returns: The number of "number signs(#)" needed around a string literal. - /// When there is no "#, ... return 1 - func numberOfNumberSignsNeeded() -> Int { - let pattern = try! NSRegularExpression(pattern: ##""#{1,}"##, options: .init()) - - let matches = pattern.matches(in: self, options: .init(), range: NSRange.init(location: 0, length: self.count)) - - // If we have "## then the length of the match is 3, - // which is also the number of "number signs (#)" we need to add - // before and after the string literal - return matches.map { $0.range.length }.max() ?? 1 - } -} diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/View.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/View.swift deleted file mode 100644 index 053bb85..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/View.swift +++ /dev/null @@ -1,891 +0,0 @@ -#if os(iOS) || os(macOS) || os(tvOS) -#if os(macOS) -import Cocoa -#endif -import SceneKit -import SpriteKit -#if os(iOS) || os(tvOS) -import UIKit -#endif -#if os(iOS) || os(macOS) -import WebKit -#endif - -#if os(iOS) || os(tvOS) -public struct ViewImageConfig { - public enum Orientation { - case landscape - case portrait - } - public enum TabletOrientation { - public enum PortraitSplits { - case oneThird - case twoThirds - case full - } - public enum LandscapeSplits { - case oneThird - case oneHalf - case twoThirds - case full - } - case landscape(splitView: LandscapeSplits) - case portrait(splitView: PortraitSplits) - } - - public var safeArea: UIEdgeInsets - public var size: CGSize? - public var traits: UITraitCollection - - public init( - safeArea: UIEdgeInsets = .zero, - size: CGSize? = nil, - traits: UITraitCollection = .init() - ) { - self.safeArea = safeArea - self.size = size - self.traits = traits - } - - #if os(iOS) - public static let iPhoneSe = ViewImageConfig.iPhoneSe(.portrait) - - public static func iPhoneSe(_ orientation: Orientation) -> ViewImageConfig { - let safeArea: UIEdgeInsets - let size: CGSize - switch orientation { - case .landscape: - safeArea = .zero - size = .init(width: 568, height: 320) - case .portrait: - safeArea = .init(top: 20, left: 0, bottom: 0, right: 0) - size = .init(width: 320, height: 568) - } - return .init(safeArea: safeArea, size: size, traits: .iPhoneSe(orientation)) - } - - public static let iPhone8 = ViewImageConfig.iPhone8(.portrait) - - public static func iPhone8(_ orientation: Orientation) -> ViewImageConfig { - let safeArea: UIEdgeInsets - let size: CGSize - switch orientation { - case .landscape: - safeArea = .zero - size = .init(width: 667, height: 375) - case .portrait: - safeArea = .init(top: 20, left: 0, bottom: 0, right: 0) - size = .init(width: 375, height: 667) - } - return .init(safeArea: safeArea, size: size, traits: .iPhone8(orientation)) - } - - public static let iPhone8Plus = ViewImageConfig.iPhone8Plus(.portrait) - - public static func iPhone8Plus(_ orientation: Orientation) -> ViewImageConfig { - let safeArea: UIEdgeInsets - let size: CGSize - switch orientation { - case .landscape: - safeArea = .zero - size = .init(width: 736, height: 414) - case .portrait: - safeArea = .init(top: 20, left: 0, bottom: 0, right: 0) - size = .init(width: 414, height: 736) - } - return .init(safeArea: safeArea, size: size, traits: .iPhone8Plus(orientation)) - } - - public static let iPhoneX = ViewImageConfig.iPhoneX(.portrait) - - public static func iPhoneX(_ orientation: Orientation) -> ViewImageConfig { - let safeArea: UIEdgeInsets - let size: CGSize - switch orientation { - case .landscape: - safeArea = .init(top: 0, left: 44, bottom: 24, right: 44) - size = .init(width: 812, height: 375) - case .portrait: - safeArea = .init(top: 44, left: 0, bottom: 34, right: 0) - size = .init(width: 375, height: 812) - } - return .init(safeArea: safeArea, size: size, traits: .iPhoneX(orientation)) - } - - public static let iPhoneXsMax = ViewImageConfig.iPhoneXsMax(.portrait) - - public static func iPhoneXsMax(_ orientation: Orientation) -> ViewImageConfig { - let safeArea: UIEdgeInsets - let size: CGSize - switch orientation { - case .landscape: - safeArea = .init(top: 0, left: 44, bottom: 24, right: 44) - size = .init(width: 896, height: 414) - case .portrait: - safeArea = .init(top: 44, left: 0, bottom: 34, right: 0) - size = .init(width: 414, height: 896) - } - return .init(safeArea: safeArea, size: size, traits: .iPhoneXsMax(orientation)) - } - - @available(iOS 11.0, *) - public static let iPhoneXr = ViewImageConfig.iPhoneXr(.portrait) - - @available(iOS 11.0, *) - public static func iPhoneXr(_ orientation: Orientation) -> ViewImageConfig { - let safeArea: UIEdgeInsets - let size: CGSize - switch orientation { - case .landscape: - safeArea = .init(top: 0, left: 44, bottom: 24, right: 44) - size = .init(width: 896, height: 414) - case .portrait: - safeArea = .init(top: 44, left: 0, bottom: 34, right: 0) - size = .init(width: 414, height: 896) - } - return .init(safeArea: safeArea, size: size, traits: .iPhoneXr(orientation)) - } - - public static let iPadMini = ViewImageConfig.iPadMini(.landscape) - - public static func iPadMini(_ orientation: Orientation) -> ViewImageConfig { - switch orientation { - case .landscape: - return ViewImageConfig.iPadMini(.landscape(splitView: .full)) - case .portrait: - return ViewImageConfig.iPadMini(.portrait(splitView: .full)) - } - } - - public static func iPadMini(_ orientation: TabletOrientation) -> ViewImageConfig { - let size: CGSize - let traits: UITraitCollection - switch orientation { - case .landscape(let splitView): - switch splitView { - case .oneThird: - size = .init(width: 320, height: 768) - traits = .iPadMini_Compact_SplitView - case .oneHalf: - size = .init(width: 507, height: 768) - traits = .iPadMini_Compact_SplitView - case .twoThirds: - size = .init(width: 694, height: 768) - traits = .iPadMini - case .full: - size = .init(width: 1024, height: 768) - traits = .iPadMini - } - case .portrait(let splitView): - switch splitView { - case .oneThird: - size = .init(width: 320, height: 1024) - traits = .iPadMini_Compact_SplitView - case .twoThirds: - size = .init(width: 438, height: 1024) - traits = .iPadMini_Compact_SplitView - case .full: - size = .init(width: 768, height: 1024) - traits = .iPadMini - } - } - return .init(safeArea: .init(top: 20, left: 0, bottom: 0, right: 0), size: size, traits: traits) - } - - public static let iPadPro10_5 = ViewImageConfig.iPadPro10_5(.landscape) - - public static func iPadPro10_5(_ orientation: Orientation) -> ViewImageConfig { - switch orientation { - case .landscape: - return ViewImageConfig.iPadPro10_5(.landscape(splitView: .full)) - case .portrait: - return ViewImageConfig.iPadPro10_5(.portrait(splitView: .full)) - } - } - - public static func iPadPro10_5(_ orientation: TabletOrientation) -> ViewImageConfig { - let size: CGSize - let traits: UITraitCollection - switch orientation { - case .landscape(let splitView): - switch splitView { - case .oneThird: - size = .init(width: 320, height: 834) - traits = .iPadPro10_5_Compact_SplitView - case .oneHalf: - size = .init(width: 551, height: 834) - traits = .iPadPro10_5_Compact_SplitView - case .twoThirds: - size = .init(width: 782, height: 834) - traits = .iPadPro10_5 - case .full: - size = .init(width: 1112, height: 834) - traits = .iPadPro10_5 - } - case .portrait(let splitView): - switch splitView { - case .oneThird: - size = .init(width: 320, height: 1112) - traits = .iPadPro10_5_Compact_SplitView - case .twoThirds: - size = .init(width: 504, height: 1112) - traits = .iPadPro10_5_Compact_SplitView - case .full: - size = .init(width: 834, height: 1112) - traits = .iPadPro10_5 - } - } - return .init(safeArea: .init(top: 20, left: 0, bottom: 0, right: 0), size: size, traits: traits) - } - - public static let iPadPro11 = ViewImageConfig.iPadPro11(.landscape) - - public static func iPadPro11(_ orientation: Orientation) -> ViewImageConfig { - switch orientation { - case .landscape: - return ViewImageConfig.iPadPro11(.landscape(splitView: .full)) - case .portrait: - return ViewImageConfig.iPadPro11(.portrait(splitView: .full)) - } - } - - public static func iPadPro11(_ orientation: TabletOrientation) -> ViewImageConfig { - let size: CGSize - let traits: UITraitCollection - switch orientation { - case .landscape(let splitView): - switch splitView { - case .oneThird: - size = .init(width: 375, height: 834) - traits = .iPadPro11_Compact_SplitView - case .oneHalf: - size = .init(width: 592, height: 834) - traits = .iPadPro11_Compact_SplitView - case .twoThirds: - size = .init(width: 809, height: 834) - traits = .iPadPro11 - case .full: - size = .init(width: 1194, height: 834) - traits = .iPadPro11 - } - case .portrait(let splitView): - switch splitView { - case .oneThird: - size = .init(width: 320, height: 1194) - traits = .iPadPro11_Compact_SplitView - case .twoThirds: - size = .init(width: 504, height: 1194) - traits = .iPadPro11_Compact_SplitView - case .full: - size = .init(width: 834, height: 1194) - traits = .iPadPro11 - } - } - return .init(safeArea: .init(top: 24, left: 0, bottom: 20, right: 0), size: size, traits: traits) - } - - public static let iPadPro12_9 = ViewImageConfig.iPadPro12_9(.landscape) - - public static func iPadPro12_9(_ orientation: Orientation) -> ViewImageConfig { - switch orientation { - case .landscape: - return ViewImageConfig.iPadPro12_9(.landscape(splitView: .full)) - case .portrait: - return ViewImageConfig.iPadPro12_9(.portrait(splitView: .full)) - } - } - - public static func iPadPro12_9(_ orientation: TabletOrientation) -> ViewImageConfig { - let size: CGSize - let traits: UITraitCollection - switch orientation { - case .landscape(let splitView): - switch splitView { - case .oneThird: - size = .init(width: 375, height: 1024) - traits = .iPadPro12_9_Compact_SplitView - case .oneHalf: - size = .init(width: 678, height: 1024) - traits = .iPadPro12_9 - case .twoThirds: - size = .init(width: 981, height: 1024) - traits = .iPadPro12_9 - case .full: - size = .init(width: 1366, height: 1024) - traits = .iPadPro12_9 - } - - case .portrait(let splitView): - switch splitView { - case .oneThird: - size = .init(width: 375, height: 1366) - traits = .iPadPro12_9_Compact_SplitView - case .twoThirds: - size = .init(width: 639, height: 1366) - traits = .iPadPro12_9_Compact_SplitView - case .full: - size = .init(width: 1024, height: 1366) - traits = .iPadPro12_9 - } - - } - return .init(safeArea: .init(top: 20, left: 0, bottom: 0, right: 0), size: size, traits: traits) - } - #elseif os(tvOS) - public static let tv = ViewImageConfig( - safeArea: .init(top: 60, left: 90, bottom: 60, right: 90), - size: .init(width: 1920, height: 1080), - traits: .init() - ) - public static let tv4K = ViewImageConfig( - safeArea: .init(top: 120, left: 180, bottom: 120, right: 180), - size: .init(width: 3840, height: 2160), - traits: .init() - ) - #endif -} - -extension UITraitCollection { - #if os(iOS) - public static func iPhoneSe(_ orientation: ViewImageConfig.Orientation) - -> UITraitCollection { - let base: [UITraitCollection] = [ -// .init(displayGamut: .SRGB), -// .init(displayScale: 2), - .init(forceTouchCapability: .available), - .init(layoutDirection: .leftToRight), - .init(preferredContentSizeCategory: .medium), - .init(userInterfaceIdiom: .phone) - ] - switch orientation { - case .landscape: - return .init( - traitsFrom: base + [ - .init(horizontalSizeClass: .compact), - .init(verticalSizeClass: .compact) - ] - ) - case .portrait: - return .init( - traitsFrom: base + [ - .init(horizontalSizeClass: .compact), - .init(verticalSizeClass: .regular), - ] - ) - } - } - - public static func iPhone8(_ orientation: ViewImageConfig.Orientation) - -> UITraitCollection { - let base: [UITraitCollection] = [ -// .init(displayGamut: .P3), -// .init(displayScale: 2), - .init(forceTouchCapability: .available), - .init(layoutDirection: .leftToRight), - .init(preferredContentSizeCategory: .medium), - .init(userInterfaceIdiom: .phone) - ] - switch orientation { - case .landscape: - return .init( - traitsFrom: base + [ - .init(horizontalSizeClass: .compact), - .init(verticalSizeClass: .compact) - ] - ) - case .portrait: - return .init( - traitsFrom: base + [ - .init(horizontalSizeClass: .compact), - .init(verticalSizeClass: .regular) - ] - ) - } - } - - public static func iPhone8Plus(_ orientation: ViewImageConfig.Orientation) - -> UITraitCollection { - let base: [UITraitCollection] = [ -// .init(displayGamut: .P3), -// .init(displayScale: 3), - .init(forceTouchCapability: .available), - .init(layoutDirection: .leftToRight), - .init(preferredContentSizeCategory: .medium), - .init(userInterfaceIdiom: .phone) - ] - switch orientation { - case .landscape: - return .init( - traitsFrom: base + [ - .init(horizontalSizeClass: .regular), - .init(verticalSizeClass: .compact) - ] - ) - case .portrait: - return .init( - traitsFrom: base + [ - .init(horizontalSizeClass: .compact), - .init(verticalSizeClass: .regular) - ] - ) - } - } - - public static func iPhoneX(_ orientation: ViewImageConfig.Orientation) - -> UITraitCollection { - let base: [UITraitCollection] = [ -// .init(displayGamut: .P3), -// .init(displayScale: 3), - .init(forceTouchCapability: .available), - .init(layoutDirection: .leftToRight), - .init(preferredContentSizeCategory: .medium), - .init(userInterfaceIdiom: .phone) - ] - switch orientation { - case .landscape: - return .init( - traitsFrom: base + [ - .init(horizontalSizeClass: .compact), - .init(verticalSizeClass: .compact) - ] - ) - case .portrait: - return .init( - traitsFrom: base + [ - .init(horizontalSizeClass: .compact), - .init(verticalSizeClass: .regular) - ] - ) - } - } - - public static func iPhoneXr(_ orientation: ViewImageConfig.Orientation) - -> UITraitCollection { - let base: [UITraitCollection] = [ -// .init(displayGamut: .P3), -// .init(displayScale: 2), - .init(forceTouchCapability: .unavailable), - .init(layoutDirection: .leftToRight), - .init(preferredContentSizeCategory: .medium), - .init(userInterfaceIdiom: .phone) - ] - switch orientation { - case .landscape: - return .init( - traitsFrom: base + [ - .init(horizontalSizeClass: .regular), - .init(verticalSizeClass: .compact) - ] - ) - case .portrait: - return .init( - traitsFrom: base + [ - .init(horizontalSizeClass: .compact), - .init(verticalSizeClass: .regular) - ] - ) - } - } - - public static func iPhoneXsMax(_ orientation: ViewImageConfig.Orientation) - -> UITraitCollection { - let base: [UITraitCollection] = [ -// .init(displayGamut: .P3), -// .init(displayScale: 3), - .init(forceTouchCapability: .available), - .init(layoutDirection: .leftToRight), - .init(preferredContentSizeCategory: .medium), - .init(userInterfaceIdiom: .phone) - ] - switch orientation { - case .landscape: - return .init( - traitsFrom: base + [ - .init(horizontalSizeClass: .regular), - .init(verticalSizeClass: .compact) - ] - ) - case .portrait: - return .init( - traitsFrom: [ - .init(horizontalSizeClass: .compact), - .init(verticalSizeClass: .regular) - ] - ) - } - } - - public static let iPadMini = iPad - public static let iPadMini_Compact_SplitView = iPadCompactSplitView - public static let iPadPro10_5 = iPad - public static let iPadPro10_5_Compact_SplitView = iPadCompactSplitView - public static let iPadPro11 = iPad - public static let iPadPro11_Compact_SplitView = iPadCompactSplitView - public static let iPadPro12_9 = iPad - public static let iPadPro12_9_Compact_SplitView = iPadCompactSplitView - - private static let iPad = UITraitCollection( - traitsFrom: [ -// .init(displayScale: 2), - .init(horizontalSizeClass: .regular), - .init(verticalSizeClass: .regular), - .init(userInterfaceIdiom: .pad) - ] - ) - - private static let iPadCompactSplitView = UITraitCollection( - traitsFrom: [ - .init(horizontalSizeClass: .compact), - .init(verticalSizeClass: .regular), - .init(userInterfaceIdiom: .pad) - ] - ) - #elseif os(tvOS) - // TODO - #endif -} -#endif - -func addImagesForRenderedViews(_ view: View) -> [Async] { - return view.snapshot - .map { async in - [ - Async { callback in - async.run { image in - let imageView = ImageView() - imageView.image = image - imageView.frame = view.frame - #if os(macOS) - view.superview?.addSubview(imageView, positioned: .above, relativeTo: view) - #elseif os(iOS) || os(tvOS) - view.superview?.insertSubview(imageView, aboveSubview: view) - #endif - callback(imageView) - } - } - ] - } - ?? view.subviews.flatMap(addImagesForRenderedViews) -} - -extension View { - var snapshot: Async? { - func inWindow(_ perform: () -> T) -> T { - #if os(macOS) - let superview = self.superview - defer { superview?.addSubview(self) } - let window = ScaledWindow() - window.contentView = NSView() - window.contentView?.addSubview(self) - window.makeKey() - #endif - return perform() - } - #if (os(iOS) && !targetEnvironment(macCatalyst)) || os(tvOS) - if let glkView = self as? GLKView { - return Async(value: inWindow { glkView.snapshot }) - } - #endif - if let scnView = self as? SCNView { - return Async(value: inWindow { scnView.snapshot() }) - } else if let skView = self as? SKView { - if #available(macOS 10.11, *) { - let cgImage = inWindow { skView.texture(from: skView.scene!)!.cgImage() } - #if os(macOS) - let image = Image(cgImage: cgImage, size: skView.bounds.size) - #elseif os(iOS) || os(tvOS) - let image = Image(cgImage: cgImage) - #endif - return Async(value: image) - } else { - fatalError("Taking SKView snapshots requires macOS 10.11 or greater") - } - } - #if os(iOS) || os(macOS) - if let wkWebView = self as? WKWebView { - return Async { callback in - let delegate = NavigationDelegate() - let work = { - if #available(iOS 11.0, macOS 10.13, *) { - inWindow { - guard wkWebView.frame.width != 0, wkWebView.frame.height != 0 else { - callback(Image()) - return - } - wkWebView.takeSnapshot(with: nil) { image, _ in - _ = delegate - callback(image!) - } - } - } else { - #if os(iOS) - fatalError("Taking WKWebView snapshots requires iOS 11.0 or greater") - #elseif os(macOS) - fatalError("Taking WKWebView snapshots requires macOS 10.13 or greater") - #endif - } - } - - if wkWebView.isLoading { - delegate.didFinish = work - wkWebView.navigationDelegate = delegate - } else { - work() - } - } - } - #endif - return nil - } - #if os(iOS) || os(tvOS) - func asImage() -> Image { - let renderer = UIGraphicsImageRenderer(bounds: bounds) - return renderer.image { rendererContext in - layer.render(in: rendererContext.cgContext) - } - } - #endif -} - -#if os(iOS) || os(macOS) -private final class NavigationDelegate: NSObject, WKNavigationDelegate { - var didFinish: () -> Void - - init(didFinish: @escaping () -> Void = {}) { - self.didFinish = didFinish - } - - func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { - webView.evaluateJavaScript("document.readyState") { _, _ in - self.didFinish() - } - } -} -#endif - -#if os(iOS) || os(tvOS) -extension UIApplication { - static var sharedIfAvailable: UIApplication? { - let sharedSelector = NSSelectorFromString("sharedApplication") - guard UIApplication.responds(to: sharedSelector) else { - return nil - } - - let shared = UIApplication.perform(sharedSelector) - return shared?.takeUnretainedValue() as! UIApplication? - } -} - -func prepareView( - config: ViewImageConfig, - drawHierarchyInKeyWindow: Bool, - traits: UITraitCollection, - view: UIView, - viewController: UIViewController - ) -> () -> Void { - let size = config.size ?? viewController.view.frame.size - view.frame.size = size - if view != viewController.view { - viewController.view.bounds = view.bounds - viewController.view.addSubview(view) - } - let traits = UITraitCollection(traitsFrom: [config.traits, traits]) - let window: UIWindow - if drawHierarchyInKeyWindow { - guard let keyWindow = getKeyWindow() else { - fatalError("'drawHierarchyInKeyWindow' requires tests to be run in a host application") - } - window = keyWindow - window.frame.size = size - } else { - window = Window( - config: .init(safeArea: config.safeArea, size: config.size ?? size, traits: traits), - viewController: viewController - ) - } - let dispose = add(traits: traits, viewController: viewController, to: window) - - if size.width == 0 || size.height == 0 { - // Try to call sizeToFit() if the view still has invalid size - view.sizeToFit() - view.setNeedsLayout() - view.layoutIfNeeded() - } - - return dispose -} - -func snapshotView( - config: ViewImageConfig, - drawHierarchyInKeyWindow: Bool, - traits: UITraitCollection, - view: UIView, - viewController: UIViewController - ) - -> Async { - let initialFrame = view.frame - let dispose = prepareView( - config: config, - drawHierarchyInKeyWindow: drawHierarchyInKeyWindow, - traits: traits, - view: view, - viewController: viewController - ) - // NB: Avoid safe area influence. - if config.safeArea == .zero { view.frame.origin = .init(x: offscreen, y: offscreen) } - - return (view.snapshot ?? Async { callback in - addImagesForRenderedViews(view).sequence().run { views in - callback( - renderer(bounds: view.bounds, for: traits).image { ctx in - if drawHierarchyInKeyWindow { - view.drawHierarchy(in: view.bounds, afterScreenUpdates: true) - } else { - view.layer.render(in: ctx.cgContext) - } - } - ) - views.forEach { $0.removeFromSuperview() } - view.frame = initialFrame - } - }).map { dispose(); return $0 } -} - -private let offscreen: CGFloat = 10_000 - -func renderer(bounds: CGRect, for traits: UITraitCollection) -> UIGraphicsImageRenderer { - let renderer: UIGraphicsImageRenderer - if #available(iOS 11.0, tvOS 11.0, *) { - renderer = UIGraphicsImageRenderer(bounds: bounds, format: .init(for: traits)) - } else { - renderer = UIGraphicsImageRenderer(bounds: bounds) - } - return renderer -} - -private func add(traits: UITraitCollection, viewController: UIViewController, to window: UIWindow) -> () -> Void { - let rootViewController: UIViewController - if viewController != window.rootViewController { - rootViewController = UIViewController() - rootViewController.view.backgroundColor = .clear - rootViewController.view.frame = window.frame - rootViewController.view.translatesAutoresizingMaskIntoConstraints = - viewController.view.translatesAutoresizingMaskIntoConstraints - rootViewController.preferredContentSize = rootViewController.view.frame.size - viewController.view.frame = rootViewController.view.frame - rootViewController.view.addSubview(viewController.view) - if viewController.view.translatesAutoresizingMaskIntoConstraints { - viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] - } else { - NSLayoutConstraint.activate([ - viewController.view.topAnchor.constraint(equalTo: rootViewController.view.topAnchor), - viewController.view.bottomAnchor.constraint(equalTo: rootViewController.view.bottomAnchor), - viewController.view.leadingAnchor.constraint(equalTo: rootViewController.view.leadingAnchor), - viewController.view.trailingAnchor.constraint(equalTo: rootViewController.view.trailingAnchor), - ]) - } - rootViewController.addChild(viewController) - } else { - rootViewController = viewController - } - rootViewController.setOverrideTraitCollection(traits, forChild: viewController) - viewController.didMove(toParent: rootViewController) - - window.rootViewController = rootViewController - - rootViewController.beginAppearanceTransition(true, animated: false) - rootViewController.endAppearanceTransition() - - rootViewController.view.setNeedsLayout() - rootViewController.view.layoutIfNeeded() - - viewController.view.setNeedsLayout() - viewController.view.layoutIfNeeded() - - return { - rootViewController.beginAppearanceTransition(false, animated: false) - rootViewController.endAppearanceTransition() - window.rootViewController = nil - } -} - -private func getKeyWindow() -> UIWindow? { - var window: UIWindow? - if #available(iOS 13.0, *) { - window = UIApplication.sharedIfAvailable?.windows.first { $0.isKeyWindow } - } else { - window = UIApplication.sharedIfAvailable?.keyWindow - } - return window -} - -private final class Window: UIWindow { - var config: ViewImageConfig - - init(config: ViewImageConfig, viewController: UIViewController) { - let size = config.size ?? viewController.view.bounds.size - self.config = config - super.init(frame: .init(origin: .zero, size: size)) - - // NB: Safe area renders inaccurately for UI{Navigation,TabBar}Controller. - // Fixes welcome! - if viewController is UINavigationController { - self.frame.size.height -= self.config.safeArea.top - self.config.safeArea.top = 0 - } else if let viewController = viewController as? UITabBarController { - self.frame.size.height -= self.config.safeArea.bottom - self.config.safeArea.bottom = 0 - if viewController.selectedViewController is UINavigationController { - self.frame.size.height -= self.config.safeArea.top - self.config.safeArea.top = 0 - } - } - self.isHidden = false - } - - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - @available(iOS 11.0, *) - override var safeAreaInsets: UIEdgeInsets { - #if os(iOS) - let removeTopInset = self.config.safeArea == .init(top: 20, left: 0, bottom: 0, right: 0) - && self.rootViewController?.prefersStatusBarHidden ?? false - if removeTopInset { return .zero } - #endif - return self.config.safeArea - } -} -#endif - -#if os(macOS) -import Cocoa - -private final class ScaledWindow: NSWindow { - override var backingScaleFactor: CGFloat { - return 2 - } -} -#endif -#endif - -extension Array { - func sequence() -> Async<[A]> where Element == Async { - guard !self.isEmpty else { return Async(value: []) } - return Async<[A]> { callback in - var result = [A?](repeating: nil, count: self.count) - result.reserveCapacity(self.count) - var count = 0 - zip(self.indices, self).forEach { idx, async in - async.run { - result[idx] = $0 - count += 1 - if count == self.count { - callback(result as! [A]) - } - } - } - } - } -} diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/XCTAttachment.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/XCTAttachment.swift deleted file mode 100644 index 312d8bc..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/XCTAttachment.swift +++ /dev/null @@ -1,8 +0,0 @@ -#if os(Linux) -import Foundation - -public struct XCTAttachment { - public init(data: Data) {} - public init(data: Data, uniformTypeIdentifier: String) {} -} -#endif diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Diff.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Diff.swift deleted file mode 100644 index 20d264c..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Diff.swift +++ /dev/null @@ -1,125 +0,0 @@ -import Foundation - -struct Difference { - enum Which { - case first - case second - case both - } - - let elements: [A] - let which: Which -} - -func diff(_ fst: [A], _ snd: [A]) -> [Difference] { - var idxsOf = [A: [Int]]() - fst.enumerated().forEach { idxsOf[$1, default: []].append($0) } - - let sub = snd.enumerated().reduce((overlap: [Int: Int](), fst: 0, snd: 0, len: 0)) { sub, sndPair in - (idxsOf[sndPair.element] ?? []) - .reduce((overlap: [Int: Int](), fst: sub.fst, snd: sub.snd, len: sub.len)) { innerSub, fstIdx in - - var newOverlap = innerSub.overlap - newOverlap[fstIdx] = (sub.overlap[fstIdx - 1] ?? 0) + 1 - - if let newLen = newOverlap[fstIdx], newLen > sub.len { - return (newOverlap, fstIdx - newLen + 1, sndPair.offset - newLen + 1, newLen) - } - return (newOverlap, innerSub.fst, innerSub.snd, innerSub.len) - } - } - let (_, fstIdx, sndIdx, len) = sub - - if len == 0 { - let fstDiff = fst.isEmpty ? [] : [Difference(elements: fst, which: .first)] - let sndDiff = snd.isEmpty ? [] : [Difference(elements: snd, which: .second)] - return fstDiff + sndDiff - } else { - let fstDiff = diff(Array(fst.prefix(upTo: fstIdx)), Array(snd.prefix(upTo: sndIdx))) - let midDiff = [Difference(elements: Array(fst.suffix(from: fstIdx).prefix(len)), which: .both)] - let lstDiff = diff(Array(fst.suffix(from: fstIdx + len)), Array(snd.suffix(from: sndIdx + len))) - return fstDiff + midDiff + lstDiff - } -} - -let minus = "−" -let plus = "+" -private let figureSpace = "\u{2007}" - -struct Hunk { - let fstIdx: Int - let fstLen: Int - let sndIdx: Int - let sndLen: Int - let lines: [String] - - var patchMark: String { - let fstMark = "\(minus)\(fstIdx + 1),\(fstLen)" - let sndMark = "\(plus)\(sndIdx + 1),\(sndLen)" - return "@@ \(fstMark) \(sndMark) @@" - } - - // Semigroup - - static func +(lhs: Hunk, rhs: Hunk) -> Hunk { - return Hunk( - fstIdx: lhs.fstIdx + rhs.fstIdx, - fstLen: lhs.fstLen + rhs.fstLen, - sndIdx: lhs.sndIdx + rhs.sndIdx, - sndLen: lhs.sndLen + rhs.sndLen, - lines: lhs.lines + rhs.lines - ) - } - - // Monoid - - init(fstIdx: Int = 0, fstLen: Int = 0, sndIdx: Int = 0, sndLen: Int = 0, lines: [String] = []) { - self.fstIdx = fstIdx - self.fstLen = fstLen - self.sndIdx = sndIdx - self.sndLen = sndLen - self.lines = lines - } - - init(idx: Int = 0, len: Int = 0, lines: [String] = []) { - self.init(fstIdx: idx, fstLen: len, sndIdx: idx, sndLen: len, lines: lines) - } -} - -func chunk(diff diffs: [Difference], context ctx: Int = 4) -> [Hunk] { - func prepending(_ prefix: String) -> (String) -> String { - return { prefix + $0 + ($0.hasSuffix(" ") ? "¬" : "") } - } - let changed: (Hunk) -> Bool = { $0.lines.contains(where: { $0.hasPrefix(minus) || $0.hasPrefix(plus) }) } - - let (hunk, hunks) = diffs - .reduce((current: Hunk(), hunks: [Hunk]())) { cursor, diff in - let (current, hunks) = cursor - let len = diff.elements.count - - switch diff.which { - case .both where len > ctx * 2: - let hunk = current + Hunk(len: ctx, lines: diff.elements.prefix(ctx).map(prepending(figureSpace))) - let next = Hunk( - fstIdx: current.fstIdx + current.fstLen + len - ctx, - fstLen: ctx, - sndIdx: current.sndIdx + current.sndLen + len - ctx, - sndLen: ctx, - lines: (diff.elements.suffix(ctx) as ArraySlice).map(prepending(figureSpace)) - ) - return (next, changed(hunk) ? hunks + [hunk] : hunks) - case .both where current.lines.isEmpty: - let lines = (diff.elements.suffix(ctx) as ArraySlice).map(prepending(figureSpace)) - let count = lines.count - return (current + Hunk(idx: len - count, len: count, lines: lines), hunks) - case .both: - return (current + Hunk(len: len, lines: diff.elements.map(prepending(figureSpace))), hunks) - case .first: - return (current + Hunk(fstLen: len, lines: diff.elements.map(prepending(minus))), hunks) - case .second: - return (current + Hunk(sndLen: len, lines: diff.elements.map(prepending(plus))), hunks) - } - } - - return changed(hunk) ? hunks + [hunk] : hunks -} diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Diffing.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Diffing.swift deleted file mode 100644 index 663271a..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Diffing.swift +++ /dev/null @@ -1,34 +0,0 @@ -import Foundation -import XCTest - -/// The ability to compare `Value`s and convert them to and from `Data`. -public struct Diffing { - /// Converts a value _to_ data. - public var toData: (Value) -> Data - - /// Produces a value _from_ data. - public var fromData: (Data) -> Value - - /// Compares two values. If the values do not match, returns a failure message and artifacts describing the failure. - public var diff: (Value, Value) -> (String, [XCTAttachment])? - - /// Creates a new `Diffing` on `Value`. - /// - /// - Parameters: - /// - toData: A function used to convert a value _to_ data. - /// - value: A value to convert into data. - /// - fromData: A function used to produce a value _from_ data. - /// - data: Data to convert into a value. - /// - diff: A function used to compare two values. If the values do not match, returns a failure message and artifacts describing the failure. - /// - lhs: A value to compare. - /// - rhs: Another value to compare. - public init( - toData: @escaping (_ value: Value) -> Data, - fromData: @escaping (_ data: Data) -> Value, - diff: @escaping (_ lhs: Value, _ rhs: Value) -> (String, [XCTAttachment])? - ) { - self.toData = toData - self.fromData = fromData - self.diff = diff - } -} diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Extensions/Wait.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Extensions/Wait.swift deleted file mode 100644 index 71316df..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Extensions/Wait.swift +++ /dev/null @@ -1,27 +0,0 @@ -import Foundation -import XCTest - -extension Snapshotting { - /// Transforms an existing snapshot strategy into one that waits for some amount of time before taking the snapshot. This can be useful for waiting for animations to complete or for UIKit events to finish (i.e. waiting for a UINavigationController to push a child onto the stack). - /// - Parameters: - /// - duration: The amount of time to wait before taking the snapshot. - /// - strategy: The snapshot to invoke after the specified amount of time has passed. - public static func wait( - for duration: TimeInterval, - on strategy: Snapshotting - ) -> Snapshotting { - return Snapshotting( - pathExtension: strategy.pathExtension, - diffing: strategy.diffing, - asyncSnapshot: { value in - Async { callback in - let expectation = XCTestExpectation(description: "Wait") - DispatchQueue.main.asyncAfter(deadline: .now() + duration) { - expectation.fulfill() - } - _ = XCTWaiter.wait(for: [expectation], timeout: duration + 1) - strategy.snapshot(value).run(callback) - } - }) - } -} diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/SnapshotTestCase.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/SnapshotTestCase.swift deleted file mode 100644 index ba93752..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/SnapshotTestCase.swift +++ /dev/null @@ -1,4 +0,0 @@ -import XCTest - -@available(swift, obsoleted: 5.0, renamed: "XCTestCase", message: "Please use XCTestCase instead") -public typealias SnapshotTestCase = XCTestCase diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting.swift deleted file mode 100644 index c595953..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting.swift +++ /dev/null @@ -1,106 +0,0 @@ -import Foundation -import XCTest - -/// A type representing the ability to transform a snapshottable value into a diffable format (like text or an image) for snapshot testing. -public struct Snapshotting { - /// The path extension applied to references saved to disk. - public var pathExtension: String? - - /// How the snapshot format is diffed and converted to and from data. - public var diffing: Diffing - - /// How a value is transformed into a diffable snapshot format. - public var snapshot: (Value) -> Async - - /// Creates a snapshot strategy. - /// - /// - Parameters: - /// - pathExtension: The path extension applied to references saved to disk. - /// - diffing: How to diff and convert the snapshot format to and from data. - /// - snapshot: An asynchronous transform function from a value into a diffable snapshot format. - /// - value: A value to be converted. - public init( - pathExtension: String?, - diffing: Diffing, - asyncSnapshot: @escaping (_ value: Value) -> Async - ) { - self.pathExtension = pathExtension - self.diffing = diffing - self.snapshot = asyncSnapshot - } - - /// Creates a snapshot strategy. - /// - /// - Parameters: - /// - pathExtension: The path extension applied to references saved to disk. - /// - diffing: How to diff and convert the snapshot format to and from data. - /// - snapshot: A transform function from a value into a diffable snapshot format. - /// - value: A snapshot value to be converted. - public init( - pathExtension: String?, - diffing: Diffing, - snapshot: @escaping (_ value: Value) -> Format - ) { - self.init(pathExtension: pathExtension, diffing: diffing) { - Async(value: snapshot($0)) - } - } - - /// Transforms a strategy on `Value`s into a strategy on `NewValue`s through a function `(NewValue) -> Value`. - /// - /// This is the most important operation for transforming existing strategies into new strategies. It allows you to transform a `Snapshotting` into a `Snapshotting` by pulling it back along a function `(NewValue) -> Value`. Notice that the function must go in the direction `(NewValue) -> Value` even though we are transforming in the other direction `(Snapshotting) -> Snapshotting`. - /// - /// A simple example of this is to `pullback` the snapshot strategy on `UIView`s to work on `UIViewController`s: - /// - /// let strategy = Snapshotting.image.pullback { (vc: UIViewController) in - /// return vc.view - /// } - /// - /// Here we took the strategy that snapshots `UIView`s as `UIImage`s and pulled it back to work on `UIViewController`s by using the function `(UIViewController) -> UIView` that simply plucks the view out of the controller. - /// - /// Nearly every snapshot strategy provided in this library is a pullback of some base strategy, which shows just how important this operation is. - /// - /// - Parameters: - /// - transform: A transform function from `NewValue` into `Value`. - /// - otherValue: A value to be transformed. - public func pullback(_ transform: @escaping (_ otherValue: NewValue) -> Value) -> Snapshotting { - return self.asyncPullback { newValue in Async(value: transform(newValue)) } - } - - /// Transforms a strategy on `Value`s into a strategy on `NewValue`s through a function `(NewValue) -> Async`. - /// - /// See the documention of `pullback` for a full description of how pullbacks works. This operation differs from `pullback` in that it allows you to use a transformation `(NewValue) -> Async`, which is necessary when your transformation needs to perform some asynchronous work. - /// - /// - Parameters: - /// - transform: A transform function from `NewValue` into `Async`. - /// - otherValue: A value to be transformed. - public func asyncPullback(_ transform: @escaping (_ otherValue: NewValue) -> Async) - -> Snapshotting { - - return Snapshotting( - pathExtension: self.pathExtension, - diffing: self.diffing - ) { newValue in - return .init { callback in - transform(newValue).run { value in - self.snapshot(value).run { snapshot in - callback(snapshot) - } - } - } - } - } -} - -/// A snapshot strategy where the type being snapshot is also a diffable type. -public typealias SimplySnapshotting = Snapshotting - -extension Snapshotting where Value == Format { - public init(pathExtension: String?, diffing: Diffing) { - self.init( - pathExtension: pathExtension, - diffing: diffing, - snapshot: { $0 } - ) - } -} diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Any.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Any.swift deleted file mode 100644 index 2254190..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Any.swift +++ /dev/null @@ -1,142 +0,0 @@ -import Foundation - -extension Snapshotting where Format == String { - /// A snapshot strategy for comparing any structure based on a sanitized text dump. - public static var dump: Snapshotting { - return SimplySnapshotting.lines.pullback { snap($0) } - } -} - -private func snap(_ value: T, name: String? = nil, indent: Int = 0) -> String { - let indentation = String(repeating: " ", count: indent) - let mirror = Mirror(reflecting: value) - var children = mirror.children - let count = children.count - let bullet = count == 0 ? "-" : "▿" - - let description: String - switch (value, mirror.displayStyle) { - case (_, .collection?): - description = count == 1 ? "1 element" : "\(count) elements" - case (_, .dictionary?): - description = count == 1 ? "1 key/value pair" : "\(count) key/value pairs" - children = sort(children) - case (_, .set?): - description = count == 1 ? "1 member" : "\(count) members" - children = sort(children) - case (_, .tuple?): - description = count == 1 ? "(1 element)" : "(\(count) elements)" - case (_, .optional?): - let subjectType = String(describing: mirror.subjectType) - .replacingOccurrences(of: " #\\d+", with: "", options: .regularExpression) - description = count == 0 ? "\(subjectType).none" : "\(subjectType)" - case (let value as AnySnapshotStringConvertible, _) where type(of: value).renderChildren: - description = value.snapshotDescription - case (let value as AnySnapshotStringConvertible, _): - return "\(indentation)- \(name.map { "\($0): " } ?? "")\(value.snapshotDescription)\n" - case (let value as CustomStringConvertible, _): - description = value.description - case (_, .class?), (_, .struct?): - description = String(describing: mirror.subjectType) - .replacingOccurrences(of: " #\\d+", with: "", options: .regularExpression) - children = sort(children) - case (_, .enum?): - let subjectType = String(describing: mirror.subjectType) - .replacingOccurrences(of: " #\\d+", with: "", options: .regularExpression) - description = count == 0 ? "\(subjectType).\(value)" : "\(subjectType)" - case (let value, _): - description = String(describing: value) - } - - let lines = ["\(indentation)\(bullet) \(name.map { "\($0): " } ?? "")\(description)\n"] - + children.map { snap($1, name: $0, indent: indent + 2) } - - return lines.joined() -} - -private func sort(_ children: Mirror.Children) -> Mirror.Children { - return .init( - children - .map({ (child: $0, snap: snap($0)) }) - .sorted(by: { $0.snap < $1.snap }) - .map({ $0.child }) - ) -} - -/// A type with a customized snapshot dump representation. -/// -/// Types that conform to the `AnySnapshotStringConvertible` protocol can provide their own representation to be used when converting an instance to a `dump`-based snapshot. -public protocol AnySnapshotStringConvertible { - /// Whether or not to dump child nodes (defaults to `false`). - static var renderChildren: Bool { get } - - /// A textual snapshot dump representation of this instance. - var snapshotDescription: String { get } -} - -extension AnySnapshotStringConvertible { - public static var renderChildren: Bool { - return false - } -} - -extension Character: AnySnapshotStringConvertible { - public var snapshotDescription: String { - return self.debugDescription - } -} - -extension Data: AnySnapshotStringConvertible { - public var snapshotDescription: String { - return self.debugDescription - } -} - -extension Date: AnySnapshotStringConvertible { - public var snapshotDescription: String { - return snapshotDateFormatter.string(from: self) - } -} - -extension NSObject: AnySnapshotStringConvertible { - #if canImport(ObjectiveC) - @objc open var snapshotDescription: String { - return purgePointers(self.debugDescription) - } - #else - open var snapshotDescription: String { - return purgePointers(self.debugDescription) - } - #endif -} - -extension String: AnySnapshotStringConvertible { - public var snapshotDescription: String { - return self.debugDescription - } -} - -extension Substring: AnySnapshotStringConvertible { - public var snapshotDescription: String { - return self.debugDescription - } -} - -extension URL: AnySnapshotStringConvertible { - public var snapshotDescription: String { - return self.debugDescription - } -} - -private let snapshotDateFormatter: DateFormatter = { - let formatter = DateFormatter() - formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" - formatter.calendar = Calendar(identifier: .gregorian) - formatter.locale = Locale(identifier: "en_US_POSIX") - formatter.timeZone = TimeZone(abbreviation: "UTC") - return formatter -}() - -func purgePointers(_ string: String) -> String { - return string.replacingOccurrences(of: ":?\\s*0x[\\da-f]+(\\s*)", with: "$1", options: .regularExpression) -} diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/CALayer.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/CALayer.swift deleted file mode 100644 index d11e37f..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/CALayer.swift +++ /dev/null @@ -1,49 +0,0 @@ -#if os(macOS) -import Cocoa - -extension Snapshotting where Value == CALayer, Format == NSImage { - /// A snapshot strategy for comparing layers based on pixel equality. - public static var image: Snapshotting { - return .image(precision: 1) - } - - /// A snapshot strategy for comparing layers based on pixel equality. - /// - /// - Parameter precision: The percentage of pixels that must match. - public static func image(precision: Float) -> Snapshotting { - return SimplySnapshotting.image(precision: precision).pullback { layer in - let image = NSImage(size: layer.bounds.size) - image.lockFocus() - let context = NSGraphicsContext.current!.cgContext - layer.setNeedsLayout() - layer.layoutIfNeeded() - layer.render(in: context) - image.unlockFocus() - return image - } - } -} -#elseif os(iOS) || os(tvOS) -import UIKit - -extension Snapshotting where Value == CALayer, Format == UIImage { - /// A snapshot strategy for comparing layers based on pixel equality. - public static var image: Snapshotting { - return .image() - } - - /// A snapshot strategy for comparing layers based on pixel equality. - /// - /// - Parameter precision: The percentage of pixels that must match. - public static func image(precision: Float = 1, traits: UITraitCollection = .init()) - -> Snapshotting { - return SimplySnapshotting.image(precision: precision, scale: traits.displayScale).pullback { layer in - renderer(bounds: layer.bounds, for: traits).image { ctx in - layer.setNeedsLayout() - layer.layoutIfNeeded() - layer.render(in: ctx.cgContext) - } - } - } -} -#endif diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/CGPath.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/CGPath.swift deleted file mode 100644 index d7ee7df..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/CGPath.swift +++ /dev/null @@ -1,126 +0,0 @@ -#if os(macOS) -import Cocoa - -extension Snapshotting where Value == CGPath, Format == NSImage { - /// A snapshot strategy for comparing bezier paths based on pixel equality. - public static var image: Snapshotting { - return .image() - } - - /// A snapshot strategy for comparing bezier paths based on pixel equality. - /// - /// - Parameter precision: The percentage of pixels that must match. - public static func image(precision: Float = 1, drawingMode: CGPathDrawingMode = .eoFill) -> Snapshotting { - return SimplySnapshotting.image(precision: precision).pullback { path in - let bounds = path.boundingBoxOfPath - var transform = CGAffineTransform(translationX: -bounds.origin.x, y: -bounds.origin.y) - let path = path.copy(using: &transform)! - - let image = NSImage(size: bounds.size) - image.lockFocus() - let context = NSGraphicsContext.current!.cgContext - - context.addPath(path) - context.drawPath(using: drawingMode) - image.unlockFocus() - return image - } - } -} -#elseif os(iOS) || os(tvOS) -import UIKit - -extension Snapshotting where Value == CGPath, Format == UIImage { - /// A snapshot strategy for comparing bezier paths based on pixel equality. - public static var image: Snapshotting { - return .image() - } - - /// A snapshot strategy for comparing bezier paths based on pixel equality. - /// - /// - Parameter precision: The percentage of pixels that must match. - public static func image(precision: Float = 1, scale: CGFloat = 1, drawingMode: CGPathDrawingMode = .eoFill) -> Snapshotting { - return SimplySnapshotting.image(precision: precision, scale: scale).pullback { path in - let bounds = path.boundingBoxOfPath - let format: UIGraphicsImageRendererFormat - if #available(iOS 11.0, tvOS 11.0, *) { - format = UIGraphicsImageRendererFormat.preferred() - } else { - format = UIGraphicsImageRendererFormat.default() - } - format.scale = scale - return UIGraphicsImageRenderer(bounds: bounds, format: format).image { ctx in - let cgContext = ctx.cgContext - cgContext.addPath(path) - cgContext.drawPath(using: drawingMode) - } - } - } -} -#endif - -#if os(macOS) || os(iOS) || os(tvOS) -@available(iOS 11.0, OSX 10.13, tvOS 11.0, *) -extension Snapshotting where Value == CGPath, Format == String { - /// A snapshot strategy for comparing bezier paths based on element descriptions. - public static var elementsDescription: Snapshotting { - return .elementsDescription(numberFormatter: defaultNumberFormatter) - } - - /// A snapshot strategy for comparing bezier paths based on element descriptions. - /// - /// - Parameter numberFormatter: The number formatter used for formatting points. - public static func elementsDescription(numberFormatter: NumberFormatter) -> Snapshotting { - let namesByType: [CGPathElementType: String] = [ - .moveToPoint: "MoveTo", - .addLineToPoint: "LineTo", - .addQuadCurveToPoint: "QuadCurveTo", - .addCurveToPoint: "CurveTo", - .closeSubpath: "Close", - ] - - let numberOfPointsByType: [CGPathElementType: Int] = [ - .moveToPoint: 1, - .addLineToPoint: 1, - .addQuadCurveToPoint: 2, - .addCurveToPoint: 3, - .closeSubpath: 0, - ] - - return SimplySnapshotting.lines.pullback { path in - var string: String = "" - - path.applyWithBlock { elementPointer in - let element = elementPointer.pointee - let name = namesByType[element.type] ?? "Unknown" - - if element.type == .moveToPoint && !string.isEmpty { - string += "\n" - } - - string += name - - if let numberOfPoints = numberOfPointsByType[element.type] { - let points = UnsafeBufferPointer(start: element.points, count: numberOfPoints) - string += " " + points.map { point in - let x = numberFormatter.string(from: point.x as NSNumber)! - let y = numberFormatter.string(from: point.y as NSNumber)! - return "(\(x), \(y))" - }.joined(separator: " ") - } - - string += "\n" - } - - return string - } - } -} - -private let defaultNumberFormatter: NumberFormatter = { - let numberFormatter = NumberFormatter() - numberFormatter.minimumFractionDigits = 1 - numberFormatter.maximumFractionDigits = 3 - return numberFormatter -}() -#endif diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/CaseIterable.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/CaseIterable.swift deleted file mode 100644 index 1a6330e..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/CaseIterable.swift +++ /dev/null @@ -1,25 +0,0 @@ -extension Snapshotting where Value: CaseIterable, Format == String { - /// A strategy for snapshotting the output for every input of a function. The format of the snapshot - /// is a comma-separated value (CSV) file that shows the mapping of inputs to outputs. - /// - /// Parameter witness: A snapshotting value on the output of the function to be snapshot. - /// Returns: A snapshot strategy on functions (Value) -> A that feeds every possible input into the - /// function and records the output into a CSV file. - public static func `func`(into witness: Snapshotting) -> Snapshotting<(Value) -> A, Format> { - var snapshotting = Snapshotting.lines.asyncPullback { (f: (Value) -> A) in - Value.allCases.map { input in - witness.snapshot(f(input)) - .map { (input, $0) } - } - .sequence() - .map { rows in - rows.map { "\"\($0)\",\"\($1)\"" } - .joined(separator: "\n") - } - } - - snapshotting.pathExtension = "csv" - - return snapshotting - } -} diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Codable.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Codable.swift deleted file mode 100644 index ed3e329..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Codable.swift +++ /dev/null @@ -1,40 +0,0 @@ -import Foundation - -extension Snapshotting where Value: Encodable, Format == String { - /// A snapshot strategy for comparing encodable structures based on their JSON representation. - @available(iOS 11.0, macOS 10.13, tvOS 11.0, *) - public static var json: Snapshotting { - let encoder = JSONEncoder() - encoder.outputFormatting = [.prettyPrinted, .sortedKeys] - return .json(encoder) - } - - /// A snapshot strategy for comparing encodable structures based on their JSON representation. - /// - /// - Parameter encoder: A JSON encoder. - public static func json(_ encoder: JSONEncoder) -> Snapshotting { - var snapshotting = SimplySnapshotting.lines.pullback { (encodable: Value) in - try! String(decoding: encoder.encode(encodable), as: UTF8.self) - } - snapshotting.pathExtension = "json" - return snapshotting - } - - /// A snapshot strategy for comparing encodable structures based on their property list representation. - public static var plist: Snapshotting { - let encoder = PropertyListEncoder() - encoder.outputFormat = .xml - return .plist(encoder) - } - - /// A snapshot strategy for comparing encodable structures based on their property list representation. - /// - /// - Parameter encoder: A property list encoder. - public static func plist(_ encoder: PropertyListEncoder) -> Snapshotting { - var snapshotting = SimplySnapshotting.lines.pullback { (encodable: Value) in - try! String(decoding: encoder.encode(encodable), as: UTF8.self) - } - snapshotting.pathExtension = "plist" - return snapshotting - } -} diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Data.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Data.swift deleted file mode 100644 index d28778f..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Data.swift +++ /dev/null @@ -1,17 +0,0 @@ -import Foundation -import XCTest - -extension Snapshotting where Value == Data, Format == Data { - public static var data: Snapshotting { - return .init( - pathExtension: nil, - diffing: .init(toData: { $0 }, fromData: { $0 }) { old, new in - guard old != new else { return nil } - let message = old.count == new.count - ? "Expected data to match" - : "Expected \(new) to match \(old)" - return (message, []) - } - ) - } -} diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Description.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Description.swift deleted file mode 100644 index 41641d2..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/Description.swift +++ /dev/null @@ -1,7 +0,0 @@ -extension Snapshotting where Format == String { - /// A snapshot strategy that captures a value's textual description from `String`'s `init(description:)` - /// initializer. - public static var description: Snapshotting { - return SimplySnapshotting.lines.pullback(String.init(describing:)) - } -} diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/NSBezierPath.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/NSBezierPath.swift deleted file mode 100644 index d9d5def..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/NSBezierPath.swift +++ /dev/null @@ -1,93 +0,0 @@ -#if os(macOS) -import Cocoa - -extension Snapshotting where Value == NSBezierPath, Format == NSImage { - /// A snapshot strategy for comparing bezier paths based on pixel equality. - public static var image: Snapshotting { - return .image() - } - - /// A snapshot strategy for comparing bezier paths based on pixel equality. - /// - /// - Parameter precision: The percentage of pixels that must match. - public static func image(precision: Float = 1) -> Snapshotting { - return SimplySnapshotting.image(precision: precision).pullback { path in - // Move path info frame: - let bounds = path.bounds - let transform = AffineTransform(translationByX: -bounds.origin.x, byY: -bounds.origin.y) - path.transform(using: transform) - - let image = NSImage(size: path.bounds.size) - image.lockFocus() - path.fill() - image.unlockFocus() - return image - } - } -} - -extension Snapshotting where Value == NSBezierPath, Format == String { - /// A snapshot strategy for comparing bezier paths based on pixel equality. - @available(iOS 11.0, *) - public static var elementsDescription: Snapshotting { - return .elementsDescription(numberFormatter: defaultNumberFormatter) - } - - /// A snapshot strategy for comparing bezier paths based on pixel equality. - /// - /// - Parameter numberFormatter: The number formatter used for formatting points. - @available(iOS 11.0, *) - public static func elementsDescription(numberFormatter: NumberFormatter) -> Snapshotting { - let namesByType: [NSBezierPath.ElementType: String] = [ - .moveTo: "MoveTo", - .lineTo: "LineTo", - .curveTo: "CurveTo", - .closePath: "Close", - ] - - let numberOfPointsByType: [NSBezierPath.ElementType: Int] = [ - .moveTo: 1, - .lineTo: 1, - .curveTo: 3, - .closePath: 0, - ] - - return SimplySnapshotting.lines.pullback { path in - var string: String = "" - - var elementPoints = [CGPoint](repeating: .zero, count: 3) - for elementIndex in 0.. Diffing { - return .init( - toData: { NSImagePNGRepresentation($0)! }, - fromData: { NSImage(data: $0)! } - ) { old, new in - guard !compare(old, new, precision: precision) else { return nil } - let difference = SnapshotTesting.diff(old, new) - let message = new.size == old.size - ? "Newly-taken snapshot does not match reference." - : "Newly-taken snapshot@\(new.size) does not match reference@\(old.size)." - return ( - message, - [XCTAttachment(image: old), XCTAttachment(image: new), XCTAttachment(image: difference)] - ) - } - } -} - -extension Snapshotting where Value == NSImage, Format == NSImage { - /// A snapshot strategy for comparing images based on pixel equality. - public static var image: Snapshotting { - return .image(precision: 1) - } - - /// A snapshot strategy for comparing images based on pixel equality. - /// - /// - Parameter precision: The percentage of pixels that must match. - public static func image(precision: Float) -> Snapshotting { - return .init( - pathExtension: "png", - diffing: .image(precision: precision) - ) - } -} - -private func NSImagePNGRepresentation(_ image: NSImage) -> Data? { - guard let cgImage = image.cgImage(forProposedRect: nil, context: nil, hints: nil) else { return nil } - let rep = NSBitmapImageRep(cgImage: cgImage) - rep.size = image.size - return rep.representation(using: .png, properties: [:]) -} - -private func compare(_ old: NSImage, _ new: NSImage, precision: Float) -> Bool { - guard let oldCgImage = old.cgImage(forProposedRect: nil, context: nil, hints: nil) else { return false } - guard let newCgImage = new.cgImage(forProposedRect: nil, context: nil, hints: nil) else { return false } - guard oldCgImage.width != 0 else { return false } - guard newCgImage.width != 0 else { return false } - guard oldCgImage.width == newCgImage.width else { return false } - guard oldCgImage.height != 0 else { return false } - guard newCgImage.height != 0 else { return false } - guard oldCgImage.height == newCgImage.height else { return false } - guard let oldContext = context(for: oldCgImage) else { return false } - guard let newContext = context(for: newCgImage) else { return false } - guard let oldData = oldContext.data else { return false } - guard let newData = newContext.data else { return false } - let byteCount = oldContext.height * oldContext.bytesPerRow - if memcmp(oldData, newData, byteCount) == 0 { return true } - let newer = NSImage(data: NSImagePNGRepresentation(new)!)! - guard let newerCgImage = newer.cgImage(forProposedRect: nil, context: nil, hints: nil) else { return false } - guard let newerContext = context(for: newerCgImage) else { return false } - guard let newerData = newerContext.data else { return false } - if memcmp(oldData, newerData, byteCount) == 0 { return true } - if precision >= 1 { return false } - let oldRep = NSBitmapImageRep(cgImage: oldCgImage) - let newRep = NSBitmapImageRep(cgImage: newerCgImage) - var differentPixelCount = 0 - let pixelCount = oldRep.pixelsWide * oldRep.pixelsHigh - let threshold = (1 - precision) * Float(pixelCount) - let p1: UnsafeMutablePointer = oldRep.bitmapData! - let p2: UnsafeMutablePointer = newRep.bitmapData! - for offset in 0 ..< pixelCount * 4 { - if p1[offset] != p2[offset] { - differentPixelCount += 1 - } - if Float(differentPixelCount) > threshold { return false } - } - return true -} - -private func context(for cgImage: CGImage) -> CGContext? { - guard - let space = cgImage.colorSpace, - let context = CGContext( - data: nil, - width: cgImage.width, - height: cgImage.height, - bitsPerComponent: cgImage.bitsPerComponent, - bytesPerRow: cgImage.bytesPerRow, - space: space, - bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue - ) - else { return nil } - - context.draw(cgImage, in: CGRect(x: 0, y: 0, width: cgImage.width, height: cgImage.height)) - return context -} - -private func diff(_ old: NSImage, _ new: NSImage) -> NSImage { - let oldCiImage = CIImage(cgImage: old.cgImage(forProposedRect: nil, context: nil, hints: nil)!) - let newCiImage = CIImage(cgImage: new.cgImage(forProposedRect: nil, context: nil, hints: nil)!) - let differenceFilter = CIFilter(name: "CIDifferenceBlendMode")! - differenceFilter.setValue(oldCiImage, forKey: kCIInputImageKey) - differenceFilter.setValue(newCiImage, forKey: kCIInputBackgroundImageKey) - let maxSize = CGSize( - width: max(old.size.width, new.size.width), - height: max(old.size.height, new.size.height) - ) - let rep = NSCIImageRep(ciImage: differenceFilter.outputImage!) - let difference = NSImage(size: maxSize) - difference.addRepresentation(rep) - return difference -} -#endif diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/NSView.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/NSView.swift deleted file mode 100644 index 292570f..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/NSView.swift +++ /dev/null @@ -1,48 +0,0 @@ -#if os(macOS) -import Cocoa - -extension Snapshotting where Value == NSView, Format == NSImage { - /// A snapshot strategy for comparing views based on pixel equality. - public static var image: Snapshotting { - return .image() - } - - /// A snapshot strategy for comparing views based on pixel equality. - /// - /// - Parameters: - /// - precision: The percentage of pixels that must match. - /// - size: A view size override. - public static func image(precision: Float = 1, size: CGSize? = nil) -> Snapshotting { - return SimplySnapshotting.image(precision: precision).asyncPullback { view in - let initialSize = view.frame.size - if let size = size { view.frame.size = size } - guard view.frame.width > 0, view.frame.height > 0 else { - fatalError("View not renderable to image at size \(view.frame.size)") - } - return view.snapshot ?? Async { callback in - addImagesForRenderedViews(view).sequence().run { views in - let bitmapRep = view.bitmapImageRepForCachingDisplay(in: view.bounds)! - view.cacheDisplay(in: view.bounds, to: bitmapRep) - let image = NSImage(size: view.bounds.size) - image.addRepresentation(bitmapRep) - callback(image) - views.forEach { $0.removeFromSuperview() } - view.frame.size = initialSize - } - } - } - } -} - -extension Snapshotting where Value == NSView, Format == String { - /// A snapshot strategy for comparing views based on a recursive description of their properties and hierarchies. - public static var recursiveDescription: Snapshotting { - return SimplySnapshotting.lines.pullback { view in - return purgePointers( - view.perform(Selector(("_subtreeDescription"))).retain().takeUnretainedValue() - as! String - ) - } - } -} -#endif diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/NSViewController.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/NSViewController.swift deleted file mode 100644 index 70d9724..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/NSViewController.swift +++ /dev/null @@ -1,26 +0,0 @@ -#if os(macOS) -import Cocoa - -extension Snapshotting where Value == NSViewController, Format == NSImage { - /// A snapshot strategy for comparing view controller views based on pixel equality. - public static var image: Snapshotting { - return .image() - } - - /// A snapshot strategy for comparing view controller views based on pixel equality. - /// - /// - Parameters: - /// - precision: The percentage of pixels that must match. - /// - size: A view size override. - public static func image(precision: Float = 1, size: CGSize? = nil) -> Snapshotting { - return Snapshotting.image(precision: precision, size: size).pullback { $0.view } - } -} - -extension Snapshotting where Value == NSViewController, Format == String { - /// A snapshot strategy for comparing view controller views based on a recursive description of their properties and hierarchies. - public static var recursiveDescription: Snapshotting { - return Snapshotting.recursiveDescription.pullback { $0.view } - } -} -#endif diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/SceneKit.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/SceneKit.swift deleted file mode 100644 index 86dc7ff..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/SceneKit.swift +++ /dev/null @@ -1,42 +0,0 @@ -#if os(iOS) || os(macOS) || os(tvOS) -import SceneKit -#if os(macOS) -import Cocoa -#elseif os(iOS) || os(tvOS) -import UIKit -#endif - -#if os(macOS) -extension Snapshotting where Value == SCNScene, Format == NSImage { - /// A snapshot strategy for comparing SceneKit scenes based on pixel equality. - /// - /// - Parameters: - /// - precision: The percentage of pixels that must match. - /// - size: The size of the scene. - public static func image(precision: Float = 1, size: CGSize) -> Snapshotting { - return .scnScene(precision: precision, size: size) - } -} -#elseif os(iOS) || os(tvOS) -extension Snapshotting where Value == SCNScene, Format == UIImage { - /// A snapshot strategy for comparing SceneKit scenes based on pixel equality. - /// - /// - Parameters: - /// - precision: The percentage of pixels that must match. - /// - size: The size of the scene. - public static func image(precision: Float = 1, size: CGSize) -> Snapshotting { - return .scnScene(precision: precision, size: size) - } -} -#endif - -fileprivate extension Snapshotting where Value == SCNScene, Format == Image { - static func scnScene(precision: Float, size: CGSize) -> Snapshotting { - return Snapshotting.image(precision: precision).pullback { scene in - let view = SCNView(frame: .init(x: 0, y: 0, width: size.width, height: size.height)) - view.scene = scene - return view - } - } -} -#endif diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/SpriteKit.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/SpriteKit.swift deleted file mode 100644 index 8d71ce1..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/SpriteKit.swift +++ /dev/null @@ -1,42 +0,0 @@ -#if os(iOS) || os(macOS) || os(tvOS) -import SpriteKit -#if os(macOS) -import Cocoa -#elseif os(iOS) || os(tvOS) -import UIKit -#endif - -#if os(macOS) -extension Snapshotting where Value == SKScene, Format == NSImage { - /// A snapshot strategy for comparing SpriteKit scenes based on pixel equality. - /// - /// - Parameters: - /// - precision: The percentage of pixels that must match. - /// - size: The size of the scene. - public static func image(precision: Float = 1, size: CGSize) -> Snapshotting { - return .skScene(precision: precision, size: size) - } -} -#elseif os(iOS) || os(tvOS) -extension Snapshotting where Value == SKScene, Format == UIImage { - /// A snapshot strategy for comparing SpriteKit scenes based on pixel equality. - /// - /// - Parameters: - /// - precision: The percentage of pixels that must match. - /// - size: The size of the scene. - public static func image(precision: Float = 1, size: CGSize) -> Snapshotting { - return .skScene(precision: precision, size: size) - } -} -#endif - -fileprivate extension Snapshotting where Value == SKScene, Format == Image { - static func skScene(precision: Float, size: CGSize) -> Snapshotting { - return Snapshotting.image(precision: precision).pullback { scene in - let view = SKView(frame: .init(x: 0, y: 0, width: size.width, height: size.height)) - view.presentScene(scene) - return view - } - } -} -#endif diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/String.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/String.swift deleted file mode 100644 index 3de02fe..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/String.swift +++ /dev/null @@ -1,26 +0,0 @@ -import Foundation -import XCTest - -extension Snapshotting where Value == String, Format == String { - /// A snapshot strategy for comparing strings based on equality. - public static let lines = Snapshotting(pathExtension: "txt", diffing: .lines) -} - -extension Diffing where Value == String { - /// A line-diffing strategy for UTF-8 text. - public static let lines = Diffing( - toData: { Data($0.utf8) }, - fromData: { String(decoding: $0, as: UTF8.self) } - ) { old, new in - guard old != new else { return nil } - let hunks = chunk(diff: SnapshotTesting.diff( - old.split(separator: "\n", omittingEmptySubsequences: false).map(String.init), - new.split(separator: "\n", omittingEmptySubsequences: false).map(String.init) - )) - let failure = hunks - .flatMap { [$0.patchMark] + $0.lines } - .joined(separator: "\n") - let attachment = XCTAttachment(data: Data(failure.utf8), uniformTypeIdentifier: "public.patch-file") - return (failure, [attachment]) - } -} diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/SwiftUIView.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/SwiftUIView.swift deleted file mode 100644 index ec7bd91..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/SwiftUIView.swift +++ /dev/null @@ -1,83 +0,0 @@ -#if canImport(SwiftUI) -import Foundation -import SwiftUI - -/// The size constraint for a snapshot (similar to `PreviewLayout`). -public enum SwiftUISnapshotLayout { - #if os(iOS) || os(tvOS) - /// Center the view in a device container described by`config`. - case device(config: ViewImageConfig) - #endif - /// Center the view in a fixed size container. - case fixed(width: CGFloat, height: CGFloat) - /// Fit the view to the ideal size that fits its content. - case sizeThatFits -} - -#if os(iOS) || os(tvOS) -@available(iOS 13.0, tvOS 13.0, *) -extension Snapshotting where Value: SwiftUI.View, Format == UIImage { - - /// A snapshot strategy for comparing SwiftUI Views based on pixel equality. - public static var image: Snapshotting { - return .image() - } - - /// A snapshot strategy for comparing SwiftUI Views based on pixel equality. - /// - /// - Parameters: - /// - drawHierarchyInKeyWindow: Utilize the simulator's key window in order to render `UIAppearance` and `UIVisualEffect`s. This option requires a host application for your tests and will _not_ work for framework test targets. - /// - precision: The percentage of pixels that must match. - /// - size: A view size override. - /// - traits: A trait collection override. - public static func image( - drawHierarchyInKeyWindow: Bool = false, - precision: Float = 1, - layout: SwiftUISnapshotLayout = .sizeThatFits, - traits: UITraitCollection = .init() - ) - -> Snapshotting { - let config: ViewImageConfig - - switch layout { - #if os(iOS) || os(tvOS) - case let .device(config: deviceConfig): - config = deviceConfig - #endif - case .sizeThatFits: - config = .init(safeArea: .zero, size: nil, traits: traits) - case let .fixed(width: width, height: height): - let size = CGSize(width: width, height: height) - config = .init(safeArea: .zero, size: size, traits: traits) - } - - return SimplySnapshotting.image(precision: precision, scale: traits.displayScale).asyncPullback { view in - var config = config - - let controller: UIViewController - - if config.size != nil { - controller = UIHostingController.init( - rootView: view - ) - } else { - let hostingController = UIHostingController.init(rootView: view) - - let maxSize = CGSize(width: 0.0, height: 0.0) - config.size = hostingController.sizeThatFits(in: maxSize) - - controller = hostingController - } - - return snapshotView( - config: config, - drawHierarchyInKeyWindow: drawHierarchyInKeyWindow, - traits: traits, - view: controller.view, - viewController: controller - ) - } - } -} -#endif -#endif diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIBezierPath.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIBezierPath.swift deleted file mode 100644 index 826044f..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIBezierPath.swift +++ /dev/null @@ -1,46 +0,0 @@ -#if os(iOS) || os(tvOS) -import UIKit - -extension Snapshotting where Value == UIBezierPath, Format == UIImage { - /// A snapshot strategy for comparing bezier paths based on pixel equality. - public static var image: Snapshotting { - return .image() - } - - /// A snapshot strategy for comparing bezier paths based on pixel equality. - /// - /// - Parameter precision: The percentage of pixels that must match. - public static func image(precision: Float = 1, scale: CGFloat = 1) -> Snapshotting { - return SimplySnapshotting.image(precision: precision, scale: scale).pullback { path in - let bounds = path.bounds - let format: UIGraphicsImageRendererFormat - if #available(iOS 11.0, tvOS 11.0, *) { - format = UIGraphicsImageRendererFormat.preferred() - } else { - format = UIGraphicsImageRendererFormat.default() - } - format.scale = scale - return UIGraphicsImageRenderer(bounds: bounds, format: format).image { ctx in - path.fill() - } - } - } -} - -@available(iOS 11.0, tvOS 11.0, *) -extension Snapshotting where Value == UIBezierPath, Format == String { - /// A snapshot strategy for comparing bezier paths based on pixel equality. - public static var elementsDescription: Snapshotting { - Snapshotting.elementsDescription.pullback { path in path.cgPath } - } - - /// A snapshot strategy for comparing bezier paths based on pixel equality. - /// - /// - Parameter numberFormatter: The number formatter used for formatting points. - public static func elementsDescription(numberFormatter: NumberFormatter) -> Snapshotting { - Snapshotting.elementsDescription( - numberFormatter: numberFormatter - ).pullback { path in path.cgPath } - } -} -#endif diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIImage.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIImage.swift deleted file mode 100644 index bf87a1c..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIImage.swift +++ /dev/null @@ -1,140 +0,0 @@ -#if os(iOS) || os(tvOS) -import UIKit -import XCTest - -extension Diffing where Value == UIImage { - /// A pixel-diffing strategy for UIImage's which requires a 100% match. - public static let image = Diffing.image(precision: 1, scale: nil) - - /// A pixel-diffing strategy for UIImage that allows customizing how precise the matching must be. - /// - /// - Parameter precision: A value between 0 and 1, where 1 means the images must match 100% of their pixels. - /// - Parameter scale: Scale to use when loading the reference image from disk. If `nil` or the `UITraitCollection`s default value of `0.0`, the screens scale is used. - /// - Returns: A new diffing strategy. - public static func image(precision: Float, scale: CGFloat?) -> Diffing { - let imageScale: CGFloat - if let scale = scale, scale != 0.0 { - imageScale = scale - } else { - imageScale = UIScreen.main.scale - } - - return Diffing( - toData: { $0.pngData() ?? emptyImage().pngData()! }, - fromData: { UIImage(data: $0, scale: imageScale)! } - ) { old, new in - guard !compare(old, new, precision: precision) else { return nil } - let difference = SnapshotTesting.diff(old, new) - let message = new.size == old.size - ? "Newly-taken snapshot does not match reference." - : "Newly-taken snapshot@\(new.size) does not match reference@\(old.size)." - let oldAttachment = XCTAttachment(image: old) - oldAttachment.name = "reference" - let newAttachment = XCTAttachment(image: new) - newAttachment.name = "failure" - let differenceAttachment = XCTAttachment(image: difference) - differenceAttachment.name = "difference" - return ( - message, - [oldAttachment, newAttachment, differenceAttachment] - ) - } - } - - - /// Used when the image size has no width or no height to generated the default empty image - private static func emptyImage() -> UIImage { - let label = UILabel(frame: CGRect(x: 0, y: 0, width: 400, height: 80)) - label.backgroundColor = .red - label.text = "Error: No image could be generated for this view as its size was zero. Please set an explicit size in the test." - label.textAlignment = .center - label.numberOfLines = 3 - return label.asImage() - } -} - -extension Snapshotting where Value == UIImage, Format == UIImage { - /// A snapshot strategy for comparing images based on pixel equality. - public static var image: Snapshotting { - return .image(precision: 1, scale: nil) - } - - /// A snapshot strategy for comparing images based on pixel equality. - /// - /// - Parameter precision: The percentage of pixels that must match. - /// - Parameter scale: The scale of the reference image stored on disk. - public static func image(precision: Float, scale: CGFloat?) -> Snapshotting { - return .init( - pathExtension: "png", - diffing: .image(precision: precision, scale: scale) - ) - } -} - -private func compare(_ old: UIImage, _ new: UIImage, precision: Float) -> Bool { - guard let oldCgImage = old.cgImage else { return false } - guard let newCgImage = new.cgImage else { return false } - guard oldCgImage.width != 0 else { return false } - guard newCgImage.width != 0 else { return false } - guard oldCgImage.width == newCgImage.width else { return false } - guard oldCgImage.height != 0 else { return false } - guard newCgImage.height != 0 else { return false } - guard oldCgImage.height == newCgImage.height else { return false } - // Values between images may differ due to padding to multiple of 64 bytes per row, - // because of that a freshly taken view snapshot may differ from one stored as PNG. - // At this point we're sure that size of both images is the same, so we can go with minimal `bytesPerRow` value - // and use it to create contexts. - let minBytesPerRow = min(oldCgImage.bytesPerRow, newCgImage.bytesPerRow) - let byteCount = minBytesPerRow * oldCgImage.height - - var oldBytes = [UInt8](repeating: 0, count: byteCount) - guard let oldContext = context(for: oldCgImage, bytesPerRow: minBytesPerRow, data: &oldBytes) else { return false } - guard let oldData = oldContext.data else { return false } - if let newContext = context(for: newCgImage, bytesPerRow: minBytesPerRow), let newData = newContext.data { - if memcmp(oldData, newData, byteCount) == 0 { return true } - } - let newer = UIImage(data: new.pngData()!)! - guard let newerCgImage = newer.cgImage else { return false } - var newerBytes = [UInt8](repeating: 0, count: byteCount) - guard let newerContext = context(for: newerCgImage, bytesPerRow: minBytesPerRow, data: &newerBytes) else { return false } - guard let newerData = newerContext.data else { return false } - if memcmp(oldData, newerData, byteCount) == 0 { return true } - if precision >= 1 { return false } - var differentPixelCount = 0 - let threshold = 1 - precision - for byte in 0.. threshold { return false} - } - return true -} - -private func context(for cgImage: CGImage, bytesPerRow: Int, data: UnsafeMutableRawPointer? = nil) -> CGContext? { - guard - let space = cgImage.colorSpace, - let context = CGContext( - data: data, - width: cgImage.width, - height: cgImage.height, - bitsPerComponent: cgImage.bitsPerComponent, - bytesPerRow: bytesPerRow, - space: space, - bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue - ) - else { return nil } - - context.draw(cgImage, in: CGRect(x: 0, y: 0, width: cgImage.width, height: cgImage.height)) - return context -} - -private func diff(_ old: UIImage, _ new: UIImage) -> UIImage { - let width = max(old.size.width, new.size.width) - let height = max(old.size.height, new.size.height) - UIGraphicsBeginImageContextWithOptions(CGSize(width: width, height: height), true, 0) - new.draw(at: .zero) - old.draw(at: .zero, blendMode: .difference, alpha: 1) - let differenceImage = UIGraphicsGetImageFromCurrentImageContext()! - UIGraphicsEndImageContext() - return differenceImage -} -#endif diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIView.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIView.swift deleted file mode 100644 index fe1e81a..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIView.swift +++ /dev/null @@ -1,65 +0,0 @@ -#if os(iOS) || os(tvOS) -import UIKit - -extension Snapshotting where Value == UIView, Format == UIImage { - /// A snapshot strategy for comparing views based on pixel equality. - public static var image: Snapshotting { - return .image() - } - - /// A snapshot strategy for comparing views based on pixel equality. - /// - /// - Parameters: - /// - drawHierarchyInKeyWindow: Utilize the simulator's key window in order to render `UIAppearance` and `UIVisualEffect`s. This option requires a host application for your tests and will _not_ work for framework test targets. - /// - precision: The percentage of pixels that must match. - /// - size: A view size override. - /// - traits: A trait collection override. - public static func image( - drawHierarchyInKeyWindow: Bool = false, - precision: Float = 1, - size: CGSize? = nil, - traits: UITraitCollection = .init() - ) - -> Snapshotting { - - return SimplySnapshotting.image(precision: precision, scale: traits.displayScale).asyncPullback { view in - snapshotView( - config: .init(safeArea: .zero, size: size ?? view.frame.size, traits: .init()), - drawHierarchyInKeyWindow: drawHierarchyInKeyWindow, - traits: traits, - view: view, - viewController: .init() - ) - } - } -} - -extension Snapshotting where Value == UIView, Format == String { - /// A snapshot strategy for comparing views based on a recursive description of their properties and hierarchies. - public static var recursiveDescription: Snapshotting { - return Snapshotting.recursiveDescription() - } - - /// A snapshot strategy for comparing views based on a recursive description of their properties and hierarchies. - public static func recursiveDescription( - size: CGSize? = nil, - traits: UITraitCollection = .init() - ) - -> Snapshotting { - return SimplySnapshotting.lines.pullback { view in - let dispose = prepareView( - config: .init(safeArea: .zero, size: size ?? view.frame.size, traits: traits), - drawHierarchyInKeyWindow: false, - traits: .init(), - view: view, - viewController: .init() - ) - defer { dispose() } - return purgePointers( - view.perform(Selector(("recursiveDescription"))).retain().takeUnretainedValue() - as! String - ) - } - } -} -#endif diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIViewController.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIViewController.swift deleted file mode 100644 index 45e719c..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIViewController.swift +++ /dev/null @@ -1,114 +0,0 @@ -#if os(iOS) || os(tvOS) -import UIKit - -extension Snapshotting where Value == UIViewController, Format == UIImage { - /// A snapshot strategy for comparing view controller views based on pixel equality. - public static var image: Snapshotting { - return .image() - } - - /// A snapshot strategy for comparing view controller views based on pixel equality. - /// - /// - Parameters: - /// - config: A set of device configuration settings. - /// - precision: The percentage of pixels that must match. - /// - size: A view size override. - /// - traits: A trait collection override. - public static func image( - on config: ViewImageConfig, - precision: Float = 1, - size: CGSize? = nil, - traits: UITraitCollection = .init() - ) - -> Snapshotting { - - return SimplySnapshotting.image(precision: precision, scale: traits.displayScale).asyncPullback { viewController in - snapshotView( - config: size.map { .init(safeArea: config.safeArea, size: $0, traits: config.traits) } ?? config, - drawHierarchyInKeyWindow: false, - traits: traits, - view: viewController.view, - viewController: viewController - ) - } - } - - /// A snapshot strategy for comparing view controller views based on pixel equality. - /// - /// - Parameters: - /// - drawHierarchyInKeyWindow: Utilize the simulator's key window in order to render `UIAppearance` and `UIVisualEffect`s. This option requires a host application for your tests and will _not_ work for framework test targets. - /// - precision: The percentage of pixels that must match. - /// - size: A view size override. - /// - traits: A trait collection override. - public static func image( - drawHierarchyInKeyWindow: Bool = false, - precision: Float = 1, - size: CGSize? = nil, - traits: UITraitCollection = .init() - ) - -> Snapshotting { - - return SimplySnapshotting.image(precision: precision, scale: traits.displayScale).asyncPullback { viewController in - snapshotView( - config: .init(safeArea: .zero, size: size, traits: traits), - drawHierarchyInKeyWindow: drawHierarchyInKeyWindow, - traits: .init(), - view: viewController.view, - viewController: viewController - ) - } - } -} - -extension Snapshotting where Value == UIViewController, Format == String { - /// A snapshot strategy for comparing view controllers based on their embedded controller hierarchy. - public static var hierarchy: Snapshotting { - return Snapshotting.lines.pullback { viewController in - let dispose = prepareView( - config: .init(), - drawHierarchyInKeyWindow: false, - traits: .init(), - view: viewController.view, - viewController: viewController - ) - defer { dispose() } - return purgePointers( - viewController.perform(Selector(("_printHierarchy"))).retain().takeUnretainedValue() as! String - ) - } - } - - /// A snapshot strategy for comparing view controller views based on a recursive description of their properties and hierarchies. - public static var recursiveDescription: Snapshotting { - return Snapshotting.recursiveDescription() - } - - /// A snapshot strategy for comparing view controller views based on a recursive description of their properties and hierarchies. - /// - /// - Parameters: - /// - config: A set of device configuration settings. - /// - size: A view size override. - /// - traits: A trait collection override. - public static func recursiveDescription( - on config: ViewImageConfig = .init(), - size: CGSize? = nil, - traits: UITraitCollection = .init() - ) - -> Snapshotting { - return SimplySnapshotting.lines.pullback { viewController in - let dispose = prepareView( - config: .init(safeArea: config.safeArea, size: size ?? config.size, traits: config.traits), - drawHierarchyInKeyWindow: false, - traits: traits, - view: viewController.view, - viewController: viewController - ) - defer { dispose() } - return purgePointers( - viewController.view.perform(Selector(("recursiveDescription"))).retain().takeUnretainedValue() - as! String - ) - } - } -} -#endif diff --git a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/URLRequest.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/URLRequest.swift deleted file mode 100644 index 10ea42e..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/URLRequest.swift +++ /dev/null @@ -1,83 +0,0 @@ -import Foundation -#if canImport(FoundationNetworking) -import FoundationNetworking -#endif - -extension Snapshotting where Value == URLRequest, Format == String { - /// A snapshot strategy for comparing requests based on raw equality. - public static let raw = Snapshotting.raw(pretty: false) - - /// A snapshot strategy for comparing requests based on raw equality. - /// - /// - Parameter pretty: Attempts to pretty print the body of the request (supports JSON). - public static func raw(pretty: Bool) -> Snapshotting { - return SimplySnapshotting.lines.pullback { (request: URLRequest) in - let method = "\(request.httpMethod ?? "GET") \(request.url?.absoluteString ?? "(null)")" - - let headers = (request.allHTTPHeaderFields ?? [:]) - .map { key, value in "\(key): \(value)" } - .sorted() - - let body: [String] - do { - if pretty, #available(iOS 11.0, macOS 10.13, tvOS 11.0, *) { - body = try request.httpBody - .map { try JSONSerialization.jsonObject(with: $0, options: []) } - .map { try JSONSerialization.data(withJSONObject: $0, options: [.prettyPrinted, .sortedKeys]) } - .map { ["\n\(String(decoding: $0, as: UTF8.self))"] } - ?? [] - } else { - throw NSError(domain: "co.pointfree.Never", code: 1, userInfo: nil) - } - } - catch { - body = request.httpBody - .map { ["\n\(String(decoding: $0, as: UTF8.self))"] } - ?? [] - } - - return ([method] + headers + body).joined(separator: "\n") - } - } - - /// A snapshot strategy for comparing requests based on a cURL representation. - public static let curl = SimplySnapshotting.lines.pullback { (request: URLRequest) in - - var components = ["curl"] - - // HTTP Method - let httpMethod = request.httpMethod! - switch httpMethod { - case "GET": break - case "HEAD": components.append("--head") - default: components.append("--request \(httpMethod)") - } - - // Headers - if let headers = request.allHTTPHeaderFields { - for field in headers.keys.sorted() where field != "Cookie" { - let escapedValue = headers[field]!.replacingOccurrences(of: "\"", with: "\\\"") - components.append("--header \"\(field): \(escapedValue)\"") - } - } - - // Body - if let httpBodyData = request.httpBody, let httpBody = String(data: httpBodyData, encoding: .utf8) { - var escapedBody = httpBody.replacingOccurrences(of: "\\\"", with: "\\\\\"") - escapedBody = escapedBody.replacingOccurrences(of: "\"", with: "\\\"") - - components.append("--data \"\(escapedBody)\"") - } - - // Cookies - if let cookie = request.allHTTPHeaderFields?["Cookie"] { - let escapedValue = cookie.replacingOccurrences(of: "\"", with: "\\\"") - components.append("--cookie \"\(escapedValue)\"") - } - - // URL - components.append("\"\(request.url!.absoluteString)\"") - - return components.joined(separator: " \\\n\t") - } -} diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Info.plist b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-Info.plist similarity index 100% rename from Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Info.plist rename to Example/Pods/Target Support Files/Pods-Example/Pods-Example-Info.plist diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown similarity index 100% rename from Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-acknowledgements.markdown rename to Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist similarity index 100% rename from Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-acknowledgements.plist rename to Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist diff --git a/Example/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m new file mode 100644 index 0000000..6ee3f90 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_Example : NSObject +@end +@implementation PodsDummy_Pods_Example +@end diff --git a/Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-input-files.xcfilelist b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-input-files.xcfilelist new file mode 100644 index 0000000..46eafcd --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-input-files.xcfilelist @@ -0,0 +1,3 @@ +${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh +${BUILT_PRODUCTS_DIR}/GradientLoadingBar/GradientLoadingBar.framework +${BUILT_PRODUCTS_DIR}/LightweightObservable/LightweightObservable.framework \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-output-files.xcfilelist b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-output-files.xcfilelist new file mode 100644 index 0000000..8ee89fd --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-output-files.xcfilelist @@ -0,0 +1,2 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GradientLoadingBar.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LightweightObservable.framework \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-input-files.xcfilelist b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-input-files.xcfilelist new file mode 100644 index 0000000..46eafcd --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-input-files.xcfilelist @@ -0,0 +1,3 @@ +${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh +${BUILT_PRODUCTS_DIR}/GradientLoadingBar/GradientLoadingBar.framework +${BUILT_PRODUCTS_DIR}/LightweightObservable/LightweightObservable.framework \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-output-files.xcfilelist b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-output-files.xcfilelist new file mode 100644 index 0000000..8ee89fd --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-output-files.xcfilelist @@ -0,0 +1,2 @@ +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GradientLoadingBar.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LightweightObservable.framework \ No newline at end of file diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-frameworks.sh b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks.sh similarity index 100% rename from Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-frameworks.sh rename to Example/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks.sh diff --git a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-prefix.pch b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h similarity index 61% rename from Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-prefix.pch rename to Example/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h index beb2a24..ecf498e 100644 --- a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-prefix.pch +++ b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h @@ -10,3 +10,7 @@ #endif #endif + +FOUNDATION_EXPORT double Pods_ExampleVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_ExampleVersionString[]; + diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.debug.xcconfig b/Example/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig similarity index 100% rename from Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.debug.xcconfig rename to Example/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig diff --git a/Example/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap b/Example/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap new file mode 100644 index 0000000..4b5189f --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap @@ -0,0 +1,6 @@ +framework module Pods_Example { + umbrella header "Pods-Example-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.release.xcconfig b/Example/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig similarity index 100% rename from Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.release.xcconfig rename to Example/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-Info.plist b/Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests-Info.plist similarity index 100% rename from Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-Info.plist rename to Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests-Info.plist diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests-acknowledgements.markdown similarity index 100% rename from Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-acknowledgements.markdown rename to Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests-acknowledgements.markdown diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests-acknowledgements.plist similarity index 100% rename from Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-acknowledgements.plist rename to Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests-acknowledgements.plist diff --git a/Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests-dummy.m b/Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests-dummy.m new file mode 100644 index 0000000..c0024d5 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_ExampleTests : NSObject +@end +@implementation PodsDummy_Pods_ExampleTests +@end diff --git a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-umbrella.h b/Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests-umbrella.h similarity index 60% rename from Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-umbrella.h rename to Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests-umbrella.h index cf2e3d0..b12f2ef 100644 --- a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-umbrella.h +++ b/Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests-umbrella.h @@ -11,6 +11,6 @@ #endif -FOUNDATION_EXPORT double SnapshotTestingVersionNumber; -FOUNDATION_EXPORT const unsigned char SnapshotTestingVersionString[]; +FOUNDATION_EXPORT double Pods_ExampleTestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_ExampleTestsVersionString[]; diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests.debug.xcconfig similarity index 100% rename from Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.debug.xcconfig rename to Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests.debug.xcconfig diff --git a/Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests.modulemap b/Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests.modulemap new file mode 100644 index 0000000..08843bd --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_ExampleTests { + umbrella header "Pods-ExampleTests-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.release.xcconfig b/Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests.release.xcconfig similarity index 100% rename from Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.release.xcconfig rename to Example/Pods/Target Support Files/Pods-ExampleTests/Pods-ExampleTests.release.xcconfig diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-dummy.m b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-dummy.m deleted file mode 100644 index 3dde865..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_GradientLoadingBar_Example : NSObject -@end -@implementation PodsDummy_Pods_GradientLoadingBar_Example -@end diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-resources.sh b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-resources.sh deleted file mode 100755 index 345301f..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-resources.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/sh -set -e -set -u -set -o pipefail - -if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then - # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy - # resources to, so exit 0 (signalling the script phase was successful). - exit 0 -fi - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -case "${TARGETED_DEVICE_FAMILY:-}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - 3) - TARGET_DEVICE_ARGS="--target-device tv" - ;; - 4) - TARGET_DEVICE_ARGS="--target-device watch" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; -esac - -install_resource() -{ - if [[ "$1" = /* ]] ; then - RESOURCE_PATH="$1" - else - RESOURCE_PATH="${PODS_ROOT}/$1" - fi - if [[ ! -e "$RESOURCE_PATH" ]] ; then - cat << EOM -error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. -EOM - exit 1 - fi - case $RESOURCE_PATH in - *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true - xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - *) - echo "$RESOURCE_PATH" || true - echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" - ;; - esac -} - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] -then - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "${PODS_ROOT}*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - else - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" - fi -fi diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-umbrella.h b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-umbrella.h deleted file mode 100644 index cad7e6f..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double Pods_GradientLoadingBar_ExampleVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_GradientLoadingBar_ExampleVersionString[]; - diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.modulemap b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.modulemap deleted file mode 100644 index 21cc459..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Example/Pods-GradientLoadingBar_Example.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_GradientLoadingBar_Example { - umbrella header "Pods-GradientLoadingBar_Example-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-Info.plist b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-Info.plist deleted file mode 100644 index 2243fe6..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-acknowledgements.markdown deleted file mode 100644 index 339c3a6..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-acknowledgements.markdown +++ /dev/null @@ -1,28 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: - -## SnapshotTesting - -MIT License - -Copyright (c) 2019 Point-Free, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-acknowledgements.plist deleted file mode 100644 index 9ce1936..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-acknowledgements.plist +++ /dev/null @@ -1,60 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - MIT License - -Copyright (c) 2019 Point-Free, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - License - MIT - Title - SnapshotTesting - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - https://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-dummy.m b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-dummy.m deleted file mode 100644 index ee6ee32..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_GradientLoadingBar_SnapshotTests : NSObject -@end -@implementation PodsDummy_Pods_GradientLoadingBar_SnapshotTests -@end diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-frameworks.sh b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-frameworks.sh deleted file mode 100755 index e1ce1e0..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-frameworks.sh +++ /dev/null @@ -1,186 +0,0 @@ -#!/bin/sh -set -e -set -u -set -o pipefail - -function on_error { - echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" -} -trap 'on_error $LINENO' ERR - -if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then - # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy - # frameworks to, so exit 0 (signalling the script phase was successful). - exit 0 -fi - -echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" -mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - -COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" -SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" -BCSYMBOLMAP_DIR="BCSymbolMaps" - - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -# Copies and strips a vendored framework -install_framework() -{ - if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then - local source="${BUILT_PRODUCTS_DIR}/$1" - elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then - local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" - elif [ -r "$1" ]; then - local source="$1" - fi - - local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - - if [ -L "${source}" ]; then - echo "Symlinked..." - source="$(readlink "${source}")" - fi - - if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then - # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied - find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do - echo "Installing $f" - install_bcsymbolmap "$f" "$destination" - rm "$f" - done - rmdir "${source}/${BCSYMBOLMAP_DIR}" - fi - - # Use filter instead of exclude so missing patterns don't throw errors. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" - - local basename - basename="$(basename -s .framework "$1")" - binary="${destination}/${basename}.framework/${basename}" - - if ! [ -r "$binary" ]; then - binary="${destination}/${basename}" - elif [ -L "${binary}" ]; then - echo "Destination binary is symlinked..." - dirname="$(dirname "${binary}")" - binary="${dirname}/$(readlink "${binary}")" - fi - - # Strip invalid architectures so "fat" simulator / device frameworks work on device - if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then - strip_invalid_archs "$binary" - fi - - # Resign the code if required by the build settings to avoid unstable apps - code_sign_if_enabled "${destination}/$(basename "$1")" - - # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. - if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then - local swift_runtime_libs - swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) - for lib in $swift_runtime_libs; do - echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" - rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" - code_sign_if_enabled "${destination}/${lib}" - done - fi -} -# Copies and strips a vendored dSYM -install_dsym() { - local source="$1" - warn_missing_arch=${2:-true} - if [ -r "$source" ]; then - # Copy the dSYM into the targets temp dir. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" - - local basename - basename="$(basename -s .dSYM "$source")" - binary_name="$(ls "$source/Contents/Resources/DWARF")" - binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" - - # Strip invalid architectures from the dSYM. - if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then - strip_invalid_archs "$binary" "$warn_missing_arch" - fi - if [[ $STRIP_BINARY_RETVAL == 0 ]]; then - # Move the stripped file into its final destination. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" - else - # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. - mkdir -p "${DWARF_DSYM_FOLDER_PATH}" - touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" - fi - fi -} - -# Used as a return value for each invocation of `strip_invalid_archs` function. -STRIP_BINARY_RETVAL=0 - -# Strip invalid architectures -strip_invalid_archs() { - binary="$1" - warn_missing_arch=${2:-true} - # Get architectures for current target binary - binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" - # Intersect them with the architectures we are building for - intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" - # If there are no archs supported by this binary then warn the user - if [[ -z "$intersected_archs" ]]; then - if [[ "$warn_missing_arch" == "true" ]]; then - echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." - fi - STRIP_BINARY_RETVAL=1 - return - fi - stripped="" - for arch in $binary_archs; do - if ! [[ "${ARCHS}" == *"$arch"* ]]; then - # Strip non-valid architectures in-place - lipo -remove "$arch" -output "$binary" "$binary" - stripped="$stripped $arch" - fi - done - if [[ "$stripped" ]]; then - echo "Stripped $binary of architectures:$stripped" - fi - STRIP_BINARY_RETVAL=0 -} - -# Copies the bcsymbolmap files of a vendored framework -install_bcsymbolmap() { - local bcsymbolmap_path="$1" - local destination="${BUILT_PRODUCTS_DIR}" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" -} - -# Signs a framework with the provided identity -code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then - # Use the current code_sign_identity - echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" - - if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - code_sign_cmd="$code_sign_cmd &" - fi - echo "$code_sign_cmd" - eval "$code_sign_cmd" - fi -} - -if [[ "$CONFIGURATION" == "Debug" ]]; then - install_framework "${BUILT_PRODUCTS_DIR}/SnapshotTesting/SnapshotTesting.framework" -fi -if [[ "$CONFIGURATION" == "Release" ]]; then - install_framework "${BUILT_PRODUCTS_DIR}/SnapshotTesting/SnapshotTesting.framework" -fi -if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - wait -fi diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-umbrella.h b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-umbrella.h deleted file mode 100644 index fccac2a..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double Pods_GradientLoadingBar_SnapshotTestsVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_GradientLoadingBar_SnapshotTestsVersionString[]; - diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.debug.xcconfig deleted file mode 100644 index bb19a95..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.debug.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "${PODS_CONFIGURATION_BUILD_DIR}/GradientLoadingBar" "${PODS_CONFIGURATION_BUILD_DIR}/LightweightObservable" "${PODS_CONFIGURATION_BUILD_DIR}/SnapshotTesting" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GradientLoadingBar/GradientLoadingBar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LightweightObservable/LightweightObservable.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapshotTesting/SnapshotTesting.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift "$(PLATFORM_DIR)/Developer/Library/Frameworks" '@executable_path/Frameworks' '@loader_path/Frameworks' -LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SnapshotTesting/SnapshotTesting.framework/Headers" -iframework "$(PLATFORM_DIR)/Developer/Library/Frameworks" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SnapshotTesting" -OTHER_LDFLAGS = $(inherited) -framework "GradientLoadingBar" -framework "LightweightObservable" -framework "SnapshotTesting" -framework "XCTest" -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.modulemap b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.modulemap deleted file mode 100644 index 7dae8bd..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_GradientLoadingBar_SnapshotTests { - umbrella header "Pods-GradientLoadingBar_SnapshotTests-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.release.xcconfig b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.release.xcconfig deleted file mode 100644 index bb19a95..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_SnapshotTests/Pods-GradientLoadingBar_SnapshotTests.release.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "${PODS_CONFIGURATION_BUILD_DIR}/GradientLoadingBar" "${PODS_CONFIGURATION_BUILD_DIR}/LightweightObservable" "${PODS_CONFIGURATION_BUILD_DIR}/SnapshotTesting" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/GradientLoadingBar/GradientLoadingBar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LightweightObservable/LightweightObservable.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapshotTesting/SnapshotTesting.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift "$(PLATFORM_DIR)/Developer/Library/Frameworks" '@executable_path/Frameworks' '@loader_path/Frameworks' -LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/SnapshotTesting/SnapshotTesting.framework/Headers" -iframework "$(PLATFORM_DIR)/Developer/Library/Frameworks" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/SnapshotTesting" -OTHER_LDFLAGS = $(inherited) -framework "GradientLoadingBar" -framework "LightweightObservable" -framework "SnapshotTesting" -framework "XCTest" -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Info.plist b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Info.plist deleted file mode 100644 index 2243fe6..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-Info.plist b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-Info.plist deleted file mode 100644 index 2243fe6..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-dummy.m b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-dummy.m deleted file mode 100644 index 9902074..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_GradientLoadingBar_Tests : NSObject -@end -@implementation PodsDummy_Pods_GradientLoadingBar_Tests -@end diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-frameworks.sh b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-frameworks.sh deleted file mode 100755 index 08e3eaa..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-frameworks.sh +++ /dev/null @@ -1,146 +0,0 @@ -#!/bin/sh -set -e -set -u -set -o pipefail - -if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then - # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy - # frameworks to, so exit 0 (signalling the script phase was successful). - exit 0 -fi - -echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" -mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - -COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" -SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" - -# Used as a return value for each invocation of `strip_invalid_archs` function. -STRIP_BINARY_RETVAL=0 - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -# Copies and strips a vendored framework -install_framework() -{ - if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then - local source="${BUILT_PRODUCTS_DIR}/$1" - elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then - local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" - elif [ -r "$1" ]; then - local source="$1" - fi - - local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - - if [ -L "${source}" ]; then - echo "Symlinked..." - source="$(readlink "${source}")" - fi - - # Use filter instead of exclude so missing patterns don't throw errors. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" - - local basename - basename="$(basename -s .framework "$1")" - binary="${destination}/${basename}.framework/${basename}" - if ! [ -r "$binary" ]; then - binary="${destination}/${basename}" - fi - - # Strip invalid architectures so "fat" simulator / device frameworks work on device - if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then - strip_invalid_archs "$binary" - fi - - # Resign the code if required by the build settings to avoid unstable apps - code_sign_if_enabled "${destination}/$(basename "$1")" - - # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. - if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then - local swift_runtime_libs - swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) - for lib in $swift_runtime_libs; do - echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" - rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" - code_sign_if_enabled "${destination}/${lib}" - done - fi -} - -# Copies and strips a vendored dSYM -install_dsym() { - local source="$1" - if [ -r "$source" ]; then - # Copy the dSYM into a the targets temp dir. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" - - local basename - basename="$(basename -s .framework.dSYM "$source")" - binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" - - # Strip invalid architectures so "fat" simulator / device frameworks work on device - if [[ "$(file "$binary")" == *"Mach-O dSYM companion"* ]]; then - strip_invalid_archs "$binary" - fi - - if [[ $STRIP_BINARY_RETVAL == 1 ]]; then - # Move the stripped file into its final destination. - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" - else - # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. - touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" - fi - fi -} - -# Signs a framework with the provided identity -code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then - # Use the current code_sign_identitiy - echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" - - if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - code_sign_cmd="$code_sign_cmd &" - fi - echo "$code_sign_cmd" - eval "$code_sign_cmd" - fi -} - -# Strip invalid architectures -strip_invalid_archs() { - binary="$1" - # Get architectures for current target binary - binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" - # Intersect them with the architectures we are building for - intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" - # If there are no archs supported by this binary then warn the user - if [[ -z "$intersected_archs" ]]; then - echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." - STRIP_BINARY_RETVAL=0 - return - fi - stripped="" - for arch in $binary_archs; do - if ! [[ "${ARCHS}" == *"$arch"* ]]; then - # Strip non-valid architectures in-place - lipo -remove "$arch" -output "$binary" "$binary" || exit 1 - stripped="$stripped $arch" - fi - done - if [[ "$stripped" ]]; then - echo "Stripped $binary of architectures:$stripped" - fi - STRIP_BINARY_RETVAL=1 -} - -if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - wait -fi diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-resources.sh b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-resources.sh deleted file mode 100755 index 345301f..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-resources.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/sh -set -e -set -u -set -o pipefail - -if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then - # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy - # resources to, so exit 0 (signalling the script phase was successful). - exit 0 -fi - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -case "${TARGETED_DEVICE_FAMILY:-}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - 3) - TARGET_DEVICE_ARGS="--target-device tv" - ;; - 4) - TARGET_DEVICE_ARGS="--target-device watch" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; -esac - -install_resource() -{ - if [[ "$1" = /* ]] ; then - RESOURCE_PATH="$1" - else - RESOURCE_PATH="${PODS_ROOT}/$1" - fi - if [[ ! -e "$RESOURCE_PATH" ]] ; then - cat << EOM -error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. -EOM - exit 1 - fi - case $RESOURCE_PATH in - *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true - xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - *) - echo "$RESOURCE_PATH" || true - echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" - ;; - esac -} - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] -then - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "${PODS_ROOT}*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - else - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" - fi -fi diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-umbrella.h b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-umbrella.h deleted file mode 100644 index df297a1..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double Pods_GradientLoadingBar_TestsVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_GradientLoadingBar_TestsVersionString[]; - diff --git a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.modulemap b/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.modulemap deleted file mode 100644 index 0f9dc0a..0000000 --- a/Example/Pods/Target Support Files/Pods-GradientLoadingBar_Tests/Pods-GradientLoadingBar_Tests.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_GradientLoadingBar_Tests { - umbrella header "Pods-GradientLoadingBar_Tests-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-Info.plist b/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-Info.plist deleted file mode 100644 index 62cf7b2..0000000 --- a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.9.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-dummy.m b/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-dummy.m deleted file mode 100644 index 30dbacc..0000000 --- a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_SnapshotTesting : NSObject -@end -@implementation PodsDummy_SnapshotTesting -@end diff --git a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.debug.xcconfig b/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.debug.xcconfig deleted file mode 100644 index a38cae1..0000000 --- a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.debug.xcconfig +++ /dev/null @@ -1,18 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SnapshotTesting -ENABLE_BITCODE = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/usr/lib" "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "XCTest" -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/SnapshotTesting -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -SWIFT_INCLUDE_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/usr/lib" -SYSTEM_FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.modulemap b/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.modulemap deleted file mode 100644 index a8d7c9f..0000000 --- a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module SnapshotTesting { - umbrella header "SnapshotTesting-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.release.xcconfig b/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.release.xcconfig deleted file mode 100644 index a38cae1..0000000 --- a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.release.xcconfig +++ /dev/null @@ -1,18 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SnapshotTesting -ENABLE_BITCODE = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/usr/lib" "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "XCTest" -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/SnapshotTesting -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -SWIFT_INCLUDE_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/usr/lib" -SYSTEM_FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.xcconfig b/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.xcconfig deleted file mode 100644 index 80a45ac..0000000 --- a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting.xcconfig +++ /dev/null @@ -1,13 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SnapshotTesting -ENABLE_BITCODE = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_LDFLAGS = $(inherited) -framework "XCTest" -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}/SnapshotTesting -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/SnapshotTests/GradientActivityIndicatorView/CustomColorSnapshotTestCase.swift b/Example/SnapshotTests/GradientActivityIndicatorView/CustomColorSnapshotTestCase.swift deleted file mode 100644 index 659ce95..0000000 --- a/Example/SnapshotTests/GradientActivityIndicatorView/CustomColorSnapshotTestCase.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// CustomColorSnapshotTestCase.swift -// GradientLoadingBar_SnapshotTests -// -// Created by Felix Mau on 09.11.19. -// Copyright © 2019 CocoaPods. All rights reserved. -// - -import XCTest -import SnapshotTesting - -@testable import GradientLoadingBar - -class CustomColorSnapshotTestCase: XCTestCase { - // MARK: - Config - - /// The frame we use for rendering the `GradientLoadingBar`. This will also be the image size for our snapshot. - private static let frame = CGRect(origin: .zero, size: CGSize(width: 375, height: 4)) - - /// The custom colors we use on this test-case. - /// Source: https://color.adobe.com/Pink-Flamingo-color-theme-10343714/ - private static let gradientColors = [ - #colorLiteral(red: 0.9490196078, green: 0.3215686275, blue: 0.431372549, alpha: 1), #colorLiteral(red: 0.9450980392, green: 0.4784313725, blue: 0.5921568627, alpha: 1), #colorLiteral(red: 0.9529411765, green: 0.737254902, blue: 0.7843137255, alpha: 1), #colorLiteral(red: 0.4274509804, green: 0.8666666667, blue: 0.9490196078, alpha: 1), #colorLiteral(red: 0.7568627451, green: 0.9411764706, blue: 0.9568627451, alpha: 1), - ] - - // MARK: - Test cases - - func testGradientProgressIndicatorViewShouldContainCorrectColorsInitially() { - // Given - let gradientActivityIndicatorView = GradientActivityIndicatorView(frame: Self.frame) - - // We're only interested in the initial state containing the correct gradient-colors. - // Therefore we're gonna remove the progress animation. - gradientActivityIndicatorView.layer.removeAllAnimations() - - // When - gradientActivityIndicatorView.gradientColors = Self.gradientColors - - // Then - assertSnapshot(matching: gradientActivityIndicatorView, as: .image) - } -} diff --git a/Example/SnapshotTests/GradientActivityIndicatorView/DefaultColorSnapshotTestCase.swift b/Example/SnapshotTests/GradientActivityIndicatorView/DefaultColorSnapshotTestCase.swift deleted file mode 100644 index 124f7f3..0000000 --- a/Example/SnapshotTests/GradientActivityIndicatorView/DefaultColorSnapshotTestCase.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// DefaultColorSnapshotTestCase.swift -// GradientLoadingBar_SnapshotTests -// -// Created by Felix Mau on 09.11.19. -// Copyright © 2019 CocoaPods. All rights reserved. -// - -import XCTest -import SnapshotTesting - -@testable import GradientLoadingBar - -class DefaultColorSnapshotTestCase: XCTestCase { - // MARK: - Config - - /// The frame we use for rendering the `GradientLoadingBar`. This will also be the image size for our snapshot. - private static let frame = CGRect(origin: .zero, size: CGSize(width: 375, height: 4)) - - // MARK: - Test cases - - func testGradientProgressIndicatorViewShouldContainCorrectColorsInitially() { - // When - let gradientActivityIndicatorView = GradientActivityIndicatorView(frame: Self.frame) - - // We're only interested in the initial state containing the correct gradient-colors. - // Therefore we're gonna remove the progress animation. - gradientActivityIndicatorView.layer.removeAllAnimations() - - // Then - assertSnapshot(matching: gradientActivityIndicatorView, as: .image) - } -} diff --git a/Example/SnapshotTests/GradientActivityIndicatorView/__Snapshots__/CustomColorSnapshotTestCase/testGradientProgressIndicatorViewShouldContainCorrectColorsInitially.1.png b/Example/SnapshotTests/GradientActivityIndicatorView/__Snapshots__/CustomColorSnapshotTestCase/testGradientProgressIndicatorViewShouldContainCorrectColorsInitially.1.png deleted file mode 100644 index ac87cef9dcb2227299c050721838b018d99d9de1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18704 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 i8M`NgzbA}25&i#-9P2WwQCwpH0000ml4kZ diff --git a/Example/SnapshotTests/GradientActivityIndicatorView/__Snapshots__/DefaultColorSnapshotTestCase/testGradientProgressIndicatorViewShouldContainCorrectColorsInitially.1.png b/Example/SnapshotTests/GradientActivityIndicatorView/__Snapshots__/DefaultColorSnapshotTestCase/testGradientProgressIndicatorViewShouldContainCorrectColorsInitially.1.png deleted file mode 100644 index 8c9e0f2c146889d561264a2bb08f4c9a783cbb31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22566 zcmX_{3p|r;`1m(tp^;E+sHU2jWp-_76o7Q`w zP?{WgkJHA&@8-RzE_gvldu?<<6+SlWhd+*TcDr*uJWxyEy*5e{ZGzHLUjjdC(5CI2 zmv?ub9?R@_`z!M2LQMX~c4t5KIFWrz_Hf9&g*EQU-mQpidgEX=eD-|Ro{D>J3t5X2 z#_=7uTUd*W_n9Gkza8<=mRe4%T-?2ykg$d@Ojc~K`se)?SMDZsMs2jLci8#x$5-l`ElpPUrLKf3uU4_JrDSZIAKPk} zr3jt+_o%|CCECjCE;gYCJG}VpKQ1rcud%K!Ta$b;tUGS@xYN|Xv5M&}`(?c6*veU_JC`2C!TLebt$Pd-{1bbO4wbY1kfup!7Q|7-hZax8Y7(7CxO;jWAB z#lp7Up1z`+qIp|)Y?@IWyKD2_O+%UI8V>qr%H9~A%aCopyLvAl)bEUYD+r>UV-o~b0Y5%q)q^!#1 zcFgPIB~IbqckHXLFUj{gzx1YV_dOpI+X69T&MxyRvD?XOsUa0lTbS$4+3)teS&$HP zuC2CYg}Z*|_r6{3)hn-k=o+Pt79D%ukb^irTKjSP$t!NZ?WRfhSTBB3oRbpMa>K+a zgnK7vd5PPWoNd+#m$ofT$liPE>kGx7E!W+SS|?oaS-6;9AU2BpgIKT;n{Po}uTxVY zUJhOhA1+MD@w86JInhkNdbUT%dgyzauxsJP%Ma7d9Ln5A)9f7HPyG615)kj`V_!Sh z;#>Avhw}>$oG~MR8=UEILQ%wjNnEfIcYWP@{f+TXrP!Gh8x&8{PE3VG>Mi)zDs-Ke zPFYI`c4G5Rd`y^psrWONwP@|Y;%}GZ9kdfh*Iqw6zvoZ)_?c;x=f`Idf`?tPJExCk zt`oy+cevBR$a9pm4db`!&qciwZk`}Vy?Uoxz1Gx+EY|JNou~}LcPec83ma=5Zs5l) zuDyRJc5&L7TV{#-CU&02r;jTlKI}5Do%j7_zLVv~(=KkK@t4OPS^AqZo^>fA9;OI> zxy5Jo?wfeKoc;Obw-~?XT^0UK^W_Prz9Rn0ZALXNEiq&FZ9fFZ4qo_?YSu{KJbe4; z{FP4ZmXA>#y+U$@V!p$rZa)1N{q)A)%fB-^wtm>!x@LO)cN zM0D1we(a8Jpm&~0$(k5k+N?ue+wkUFZOPgU`}yy~C*I`D*g*Y>>6py z5owM?fm3Ba!Y7Wnb!H^k9-|GI|JnOZ)_I)Pm60Qa-}m2m{V8{ri0Nt}4>0RaPTgzFo_?Yv}!bN&K6l@{zYie|>D*@pGiizCJuD zLhtt*lIpLxmV*!Co1?0-hO=5%HGi$yH$SkPu)pNW&nr$XVNGj7YBZ176=G{`8%#rP z2iJ1UJEyml-oN+ZLWs}XM8}3Vp=*!`+v2T052g2Z`8;_L5&f@w_VSXEN2=FW;Xz+o zOQq?KE&Kb{gg7>~99~f)4T-t(t2Ay?1>=B}EY`2e9N(NKJYAJ3OpnR$xnCVZ`h2eS z?CG8Z@bj;tzvnAg{(kl0qMU9*^7yCKC*E$UxZw6>UF631$ija&eH3nK9MSJbVv7zE z_``WI`LrDKn0%`i4#lR0V^A2xtUNfkV&mg6T;06{r@(U4{pIoI8|&{$s($=%bwYXP-jCgJHk}{E?zcahO*sY)ivv3XJ4+5cX{gP6((vWv zN#pVQ@1l37M8V4Ze8-xTBXe7(l}C)&I8ArD_i~FnQh`NiiYa+)7-fS>@l%Oh4~iGuw%~%y&^I20!@p-kmxWRoyqMGVft? z)WRsnnXFzeY1pFDVR%EYR;6C$>hWX!SwC~eg6^)h!kk^FcsKNfxV8D+{(YQa#n=5? zb*LJIV||&(fXV^6HfV&H5E>79TeI#Jibu?i?ye#ktysIn=-#R&nJd;V$UIBF@W+ZF z-7=%u{*fzkxz!aZX-!5(1=HBG5mRZj{FfpQ`8XEC*{hgp9X`8KxN>W)@6hLp&9fq7u*OdU%xYCcJtdWvzy+A&rz;cRMWFp ze)wH>M2Rtiw*WHnNP_`>9*pL(zC_sAuC+Ug89v2Qe%E;Kc!tpSn?(tw+`E^ z&ko95S9~&LmFHncf+gqFPnuJ7=-T$=&*8E6KCk}1tUc}X+V4A$?T9{E_4*U{*q-Rj zs%M`_$4Z`^`Zl}uEB4sEXWzdaZXE2L+w0u8?}KylzTUU|mx>t0PrV|y!i;fKKk|Iy z{ACp`Yg+tl<~uqM_>(T#S8QKXkdPiLtK7Y&xpLE*qJ*=t+y1yr7*1UKozQzdXL|3x zM-$&X9#2G3KCYTr_R+7`Y~pmmk+RrJ(c-)$ zuEgk-Je)00wV#V}A+kJW8{3)AS>`|74$oBK8Z9K|LIV0-gMmuWU?H-jxGs04WEMGd zSLIH3rBG)&YEiKqoC+_J7BWc*X^Bz|XKB)fl3A)=BPB}FJI#`Di?ya^rWSJK{i!fV z3ggyXCe~9H`7n^3o+Q=Kq8>rZ@gh4S#?qBoGS`{!$$hgV#Zz8K--bd`-wa_=>?n-g zy2}}xmt%;GfdiH-rduAaj=oh3xsGPylcb9yb+{<@W*xSf(m;V1Z6jW0_IdO08q$x( zs<93YO34SUDvYFkvt#~=j8VnQ$s<0O0h)%&ElkbUj=izcyvM)1*?K;jS zG*%=wVOv;({}R)=s?YV~^J1qFOJ;gRGBP9aJ((i5DI-?Haa} zkPlEw64kxF1bsnqHoq{HkiBOt?{Vh-T8xD!Dh!l2riq>zC}VZrxe!NZbt>)_9YAwl z*rAX?G#ka4G*B(_BxzAKk+_#TmPqV~u9im5f+Xo?m|PZ$jp80p#S7~l^Kf386ow|= zmBLa#te%Rp<58=0S*W0+F*o#_xz=51#VT*}W17gmB|>c#N^$UrB?f;PX4Q>xB~oU^ zqtDsOL-x$OnekXR5EY~$al%CMo%?Vo!t`!jBK^w2SfRNPEqI0(hHQn2mDj|ZxKTeW-iCsl3Hm(;kyS2Fw&mIJDW#l3epqlIPPhzAizv%=CIRPneUAC zEk-h-^$u6BdXff9p(3UrX?oYt!T@b{C{m|7 zgJ$8%*sjvCH+8sf9E$?$fMuB}U+Gb>yuPO>Zai|;t6r6NT!*b4qRqys3?5G%+?3jY z*C3=KX!%s^r*V|Mrd>q}vWX;|*sDMPVv@9RBT9jKJf-U?H>?BMDsr2rDKQtA=Z+lV z!J6rE#xxYD`@!;9J!clNubgLhClS{zNG7Bqn#jB)n8uABKV0%ub}0K4WaCPSd5*d0 zS**>&CBlgXTGY(73`(?_O&%;tDhSM!T7O-gN6AdVVl8UI#r+hLDQM$?<(V1;40XQ7 zQ~Ze$8lDB~%#V~UlQ4YO=w<# zcHoqu!ZK$Y(RDf47yMKE1^H+ZOtVQLF~wZaU0$pA7=NOBrIEtE&oR)Gd&xyAv(i)8 zn+wfz(87?v#zSTbw}Et*7}qX*gm)%Pqv~?B+1f#d6b!!PX-iahytyz0O>DH3pieZR zkQ79hs|`|YE?DE=z3;q zv5n;h3QH0CX#Ea~E1rrLf<@VnqUs0_P^efU-`UN!ZhEIC5`+)|7FJw!kfqI?>^3!*I5F~YxilOX6=d9yF&4vA~`?AKgPB_s@FrM7BoMuZ&y9{h9eOrOw z)%GQGFe<+!KV8aYPb{VHn~SD%pKkAxQ)uZv4N>KbJo*e5=`Iv!FIt3_poNtL=f2r4 zQa@)xzW-hxg0jP)xY``7h61-h)c!ZBIe|=~^6p_85;kiiXzv zjw}+o=c!zH(o{|A+?^=p4NuDwO$s+;8U|_B5Sa_T(fE?T-v;ue4~nl@C#n`yPJ=~K zX;cp@^d>rYc#{c>WlQ8ja@mDHo!UGo|OP&n&pEZhmKZ4tZ;-i#Eqhfs(J< zKulisHp7$q*D5{yDE(v;57aZW_ZScK{t-!W^3hBeLY*YbfraMEHI#yL-%-@TS>T0; z9y)9{C6_0CgjR-yukb6=P>7a6qyft8ssS?>VwMXYti1rs`PY7EhGq0U?)?2&QOLoQ zRc^%SCH1&G)v0e-rYifCkpB{v!*&>@GEi2zS|-EqH}67u1ZOE0%UKf^?Ahm9Cpm*+ zt=Z3OTP&>HzD7$jVec$`GU%U!=G3TkJY~PNzInvCNJoV*R^joFmXe7z4|7%HC}frs zma_!Sx@KRE<{UrSYoIhXQu?uFpv^~KBOmm+!ObYe=Sss`sWnSR*W@T6lqkgHrh5>0 z1QeJldrnlc^<|mBRf<=Mo@ILTl$RQVk4^l5`ciLhtofoQZ=Da2a3a|{iXEKGV| zlxW8YmC?J)+C=2->Z_Ba;VE_(72-T{$#*-H%P$y&U0QPrje_;@bC(9D=l2wCOSZK%L8wF0cAgrN01;7LYwhI za_4#)#0JjtJQWEg#Zg>oau0U7@?|y|+;JIv-kK)H<=sVYqNY%1YY^^m!G7FNF*QYEG0LlCj4$an zTSKzV5(5g$cLoo9hhxaVdh*KzzR2-_hbTpGo3J3oqEXZGva_ru3>L_dV+dD6jOSD2 zBAqo;;=N@hY0IGtVtVVn4xzb7hw0`)NWyED(F2ur;*eVgVq6^#{0ockI89F1XM&+? z%P2s6v4;hX(lA<|sL~-+X(>#!7(LUTVrS1b;Nj1MmW0C11$x{Lq1sMtV}L2%>_8{* znR2h`5S3Vp>R0Q_VXic|$WnqcA=XNgXb~+skNnM74L^Kk0czYt;h+K$I^h+vQ7!%X zOnw=TPN)N)>%cKqw4sy~Zc~MIw00O_MxuZ(6PO^S>{X>4#DmZvX%ioy$=s}^#)>-e ze-hguZ4*QA@CM9cF~k616(1YO>qLoj8H+`EWTQH`TkS{&5RREV_IjBrg4s;js3E6t zo4
  • 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 Mhaa!14vWkBAJ|S59smFU diff --git a/Example/SnapshotTests/GradientLoadingBarController/GradientLoadingBarControllerTestCase.swift b/Example/SnapshotTests/GradientLoadingBarController/GradientLoadingBarControllerTestCase.swift deleted file mode 100644 index f82c055..0000000 --- a/Example/SnapshotTests/GradientLoadingBarController/GradientLoadingBarControllerTestCase.swift +++ /dev/null @@ -1,49 +0,0 @@ -// -// GradientLoadingBarControllerTestCase.swift -// GradientLoadingBar_SnapshotTests -// -// Created by Felix Mau on 14.06.20. -// Copyright © 2020 CocoaPods. All rights reserved. -// - -import XCTest -import SnapshotTesting - -@testable import GradientLoadingBar - -class GradientLoadingBarControllerTestCase: XCTestCase { - // MARK: - Private properties - - private var gradientLoadingBarController: GradientLoadingBarController! - - // MARK: - Public methods - - override func setUpWithError() throws { - try super.setUpWithError() - - gradientLoadingBarController = GradientLoadingBarController() - gradientLoadingBarController.fadeIn(duration: 0) - } - - override func tearDownWithError() throws { - gradientLoadingBarController = nil - - try super.tearDownWithError() - } - - // MARK: - Tests - - func testGradientLoadingBarController() { - // Given - let rootViewController = UIViewController() - - let expectation = self.expectation(description: "Waiting for view to appear.") - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - expectation.fulfill() - } - - // Then - wait(for: [expectation], timeout: 1) - assertSnapshot(matching: rootViewController, as: .windowedImage) - } -} diff --git a/Example/SnapshotTests/GradientLoadingBarController/NotchGradientLoadingBarControllerTestCase.swift b/Example/SnapshotTests/GradientLoadingBarController/NotchGradientLoadingBarControllerTestCase.swift deleted file mode 100644 index 4149955..0000000 --- a/Example/SnapshotTests/GradientLoadingBarController/NotchGradientLoadingBarControllerTestCase.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// NotchGradientLoadingBarControllerTestCase.swift -// GradientLoadingBar_SnapshotTests -// -// Created by Felix Mau on 14.06.20. -// Copyright © 2020 CocoaPods. All rights reserved. -// - -import XCTest -import SnapshotTesting - -@testable import GradientLoadingBar - -class NotchGradientLoadingBarControllerTestCase: XCTestCase { - // swiftlint:disable:previous type_name - - // MARK: - Private properties - - private var notchGradientLoadingBarController: NotchGradientLoadingBarController! - - // MARK: - Public methods - - override func setUpWithError() throws { - try super.setUpWithError() - - notchGradientLoadingBarController = NotchGradientLoadingBarController() - notchGradientLoadingBarController.fadeIn(duration: 0) - } - - override func tearDownWithError() throws { - notchGradientLoadingBarController = nil - - try super.tearDownWithError() - } - - // MARK: - Tests - - func testNotchGradientLoadingBarController() { - // Given - let rootViewController = UIViewController() - - let expectation = self.expectation(description: "Waiting for view to appear.") - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - expectation.fulfill() - } - - // Then - wait(for: [expectation], timeout: 1) - assertSnapshot(matching: rootViewController, as: .windowedImage) - } -} diff --git a/Example/SnapshotTests/GradientLoadingBarController/__Snapshots__/GradientLoadingBarControllerTestCase/testGradientLoadingBarController.1.png b/Example/SnapshotTests/GradientLoadingBarController/__Snapshots__/GradientLoadingBarControllerTestCase/testGradientLoadingBarController.1.png deleted file mode 100644 index 19f9e55c752a60caecbe4673eeee004411a54070..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88660 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 z z)Ytg|ASDTNPcLhg_q+tYGB`MmYp0q+tUB zHsM3-yKYlk_ik~G^PpFL2UQWHl4PMb+s`E-{=T?V!kGeuh7*Inn7~`;(-oFG10f)- zBb;Vu%`u#?XH?u|NOyn{D81IA2jA8PxD^K13h1`g&bl9#=k@McCRO#UsLnX~TOJQ? z-TqO42Cp7IC-OigmFZTzHg#6Z22Ps^cUc_rf7hPtCF>0Z`L}UFXA&zfQZ}G4T!q=a zFe=}{9E30pv!Vgl1C+VpePa~#2)W9wnCU;^y`&GOsoKzu=EhA9X)n*qmkkPuu$c_iK?Hzx{o^2- z>I5Y5`lSFHJD-oARHu&FcqpDgQwjNKDBW9+frXBcPV7tlL$rX=t-XjQ%lp*3{lg=L z6S??EoY?dRgUT&~f zdsN%eMC7yM&ns}72M$P=TOZqh%HVvtaDL~=B-s6Jo(VG%xuE#^4VZxVaEb6F9d3|APt?^vdAx-u@R-2?Z5$y6h`UD7)NsG0_t( zFN~d9OJSe~5L<|Nk}WiRA4M68iC7x>;x)rd54zbPx(*X^En&GVi zV;EJR+!&XT;yXy5JQ-}RV}f3y6$2>|0Kx*J0BTl$wUO9aQ>p)gTC@eA2U$(UN7m?icm8Oj4D~{kQi{CzF&hFkp0>fVc_Dt_+-q43=DRYHGmust#@QC?xpZP#%s8*8Ss6dB6`%h7#vP!7kDgs81ka%a6yxE^e802?W`G+r@AKNQ4P`JM>VFulQ$U(4}#NR3{%(w8THFJpX=vv2W_RwKGq`v3VvUCFiIaS zgZ*??TEG{CDvt<9LnZdTN~(0j=^w@C zu7RCrR8fG(TJ#Ty)IdSzuT+6h5d29z0!)*Pmm|-(f^zOkIn%&D2}b@0>dK8lgpHB? zMVTMtKl?~l>U>*3`7FKg4zi@2NLZ;dO;hWDPVSsqketiT;!}zvM}TxT%x(5*)mPT1 zi=E8X1JyT?s}u<(S7=muPavfu?EuL=n3n(~buvEl9}FZ(!}zTFPd3->wGkL1vb-XW z!4+6tug9ori2K09Ly<4~&QJ~PkZyi$XtD63oJ$ytP4AbA632_U`Zh|<#-xceD@eu63!`%Cc2jqzPho;fQLz&1qc+z4dX8L@R_H(t)s)`~L zhwC?p_JVk-tif?dl`ZIws~A898gOV*%_BP-0BaX!>APuj=^picoSliO$s z0E_U@)5F(FKN^7vU)v94T#4~LJ>}DRAmSAgyx%}LN)gSJku%u1Vw40C-w*#zs6eHC zgv?s=@&0O?U3oc2uyVs8pPa!{ZG=@ANOte8R#J#i9_|-19|0mBq_h$cm{(ZME9K?( z1tc{#wW6rAp4cf)@$X%oNRK?$VgSM)>O(^MA+$|scu>?aIE|#2dB6ZH?pIe)6e=hl zqDipQiO*NY{Si^}D&#tHUyUO-Z;>ltgjSBfAS{g`35@+K5<{~u$(`1d_$kX*&)u<1 zvTgbH;wTaM>n;%Ulby%TV$sw&9_vWXcLI5h)i9sv6?^4B*AK`qx#ZP9d0xZEpo|ufcKgwn(bxP5$?n&hPs_wZryxJN%T(hXbiXj* zqlS)wkyNgpeo1bCP=IKdyU`yn*oPC}Dd(jh@k~Uf0kv1u?DW>17NZJp6DAUdLmL`T zE-HPs(4S!WvEexPiKiEJ*&P;tZUWF{cutzJfseCy&vN6+8@ z%G*9zJ9UkdMhTe;BXP_#BTq2NRpM3t@o75*nTr(8)uiexlY?L&wcPotiZTTOO0$r$ zn$DDw^c@61N)rMTpoeq-N}L3OEY%w`WO0zVyRMM!`ii1nRz}}^#yETJQ}2csIMEzX z=-z~U58(bKiz|T7+Q>Lyp~RBRhYRx-s>;Z=s}z-RVj>Dk#7qKE@hS#@XG4k7V9Zd1 zII%{4clW!vIzQ@<2QW^cl726^GEDdT@3>h$1%T*X`Jqe~r}v?j(LgcX7aG_71d~!7 z00=DrfCAZ`5`MsKh2oib&q!kWIvn7XTvQos%ynn)GD`_FJP=Rvj=TDh1Dx7@HaD{N zy2-!QVE9(n7YjcLf_nl~^}Bnph=1`SL7DB6iOdhS?fFuLg{mI(bi4+Z?%;?g<`-R@ z34?wrnBKn94vJ8csg&M;+za)Ya8RxMt2`^34K-el;DhLlr zZ(j>{=-Vq$1BrAIj0=yu>wTsm=2V4jJYD4gR_+cYV--q-0i3$6jI}Vf@aAm?(kd?q zA7GB7Ch)Ejk%dpeaWYBDgXqG{d}Br;s^aLZ7^<)l30vKau>wMpo0+Oz;u}Y%RdVdA z=w}H_2|lrNj}f8#2$1I`gTtcd3FK9lT$?cQ!h!H0AEVDaAZ*m>nN5BILPO+~61mD6 zWmjaUMH#?Ti)(T+O)3LXsSmSStVdJ_+W}C&U<4z6*BZsSd?x``@4r1`2-Jf~*KF(t z=K$#0MONg~5Dc#P6X$3*I_?~RVe}k0|NXxJ2&!=GQ{*#~8e;<)7||WfEpRc<%0M1Q zlsUxzbUCE0w@fw6Sdy6k!NNeLJVBXm2Ij^Cyjj)S2}Ux43EmU~0r>!s%zX0_b1Zrm z_#63d>uxr5MATXs4*_vsvw{OXuV3T_GSe(}O8PF6E02i8y_A_lOiAaa;n?cwUOt;p zaYFtzP(N*vRIxxHw=p*^^#XBa=Llx}2?7We@k()4PZsz;-%1}o%~w1}Age9!_ZexT zI4DKuq=RWB)ES=l-+NvUOZjvi2>^(6JP{U0K8cBZ&U%!mhxyR!juin(!@Q}46M!Ol zfQ}6(8i8l!@ik^S0|BJ5JN37vEk^>cqVl9kFA)a@&p>{H33Uw%{u^Zs5$TuYGSv`h zoRs4#D&Li1cIxwdokgr?7u76*ntELr7gWBW9iLb9gy|MOOG0$MZjM^bLx6ebyEyW` z^GIjSHq2XPIzPhHUd+24z;BpxNfms^Lkg;6p*G97qy@6W>W>7c;;| zGEtvXZ-w(1BN$S+t*ZV8B3_tRu6ZHF!YX&cESqXNlloPhl=^GI6l(n*w|NF}E&$9; z7=Y6xNCaao$yDtum^Zolb1T^j6R1)D)GoH}TJ>18gnU9Y|>*8-z5W}ZMb?M~?F2u`XJC%W70hk0|sB-Vfo>EYYrWhvBa zmy{~&X6g@Z%eId_*2Xr>JYedFkZAq(H!iK=%6+pS{K#|@AjHKv6cj#WJR_oHZzZB+ z{fxNV@_wNVz=~3y>5X~}9;nX6>+1bpq0GBgA|HPj>ogKipvPROq0s(@p)0hh)+2NWkX)B=EO6jk0ozpQG$t^&uD#4}WZ!i~|KJ5yjJEzN0Vev7fu z&`-BQJBu^}|A`UIU;88Di%77wz10_ zJAowE5RhoNH;HJHP4y&Xa#0D$XM%Flng}4z5$;MD2Luy6j7rv7EEH`}APW##A86Ah zDiKiJEbl}2@uA7pX83^)s`-gP8Eyh1yL?x^Z%K{bf2%p3$}eQ8y5~o|0{xXF_oChy z#6IO3AW78ZMuD*s(E6$0$W`M>`w#l}ml}fivDMM{?4bQ#TX$4OU+RGjuo9}X=hYZU zjYu)WHuh+UEtU!38Zw%QFj%x4uL8&}3dl}`!8GD4mJtsh%KrFf+M9(0tMJu)Sxp_{ zoG={C^o!H59TEn;q2A;}IWVelRc6FwD-gX@8j}tQ$IV+Y0{Qbmbpdi2JA@NRℑe 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 BD&YVC diff --git a/Example/SnapshotTests/GradientLoadingBarController/__Snapshots__/NotchGradientLoadingBarControllerTestCase/testNotchGradientLoadingBarController.1.png b/Example/SnapshotTests/GradientLoadingBarController/__Snapshots__/NotchGradientLoadingBarControllerTestCase/testNotchGradientLoadingBarController.1.png deleted file mode 100644 index b24cf3f32f28da0dc5a342255ad15b8d3e2421cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95687 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

    Mg7w&6DU7WFvK%n` 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 P@E?AQwK-*z`_cace-&{N diff --git a/Example/SnapshotTests/Info.plist b/Example/SnapshotTests/Info.plist deleted file mode 100644 index 64d65ca..0000000 --- a/Example/SnapshotTests/Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/Example/SnapshotTests/README.md b/Example/SnapshotTests/README.md deleted file mode 100644 index c353260..0000000 --- a/Example/SnapshotTests/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Snapshot-Tests - -## Device -Run test-cases with the `iPhone 13` using `iOS 15`. diff --git a/Example/SnapshotTests/_Helper/Snapshotting+WindowedImage.swift b/Example/SnapshotTests/_Helper/Snapshotting+WindowedImage.swift deleted file mode 100644 index 96965b9..0000000 --- a/Example/SnapshotTests/_Helper/Snapshotting+WindowedImage.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// Snapshotting+WindowedImage.swift -// GradientLoadingBar_SnapshotTests -// -// Created by Felix Mau on 14.06.20. -// Copyright © 2020 CocoaPods. All rights reserved. -// - -import SnapshotTesting - -// MARK: - Config - -private enum Config { - /// Allow for a 1% pixel difference. - static let precision: Float = 0.99 -} - -// MARK: - Public properties - -extension Snapshotting where Value: UIViewController, Format == UIImage { - /// Based on: - /// and - static var windowedImage: Snapshotting { - Snapshotting.image(precision: Config.precision, scale: nil).asyncPullback { viewController in - Async { callback in - UIView.setAnimationsEnabled(false) - - guard let keyWindow = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) else { - fatalError("⚠️ – Failed to get key window from application!") - } - keyWindow.rootViewController = viewController - - DispatchQueue.main.async { - let image = UIGraphicsImageRenderer(bounds: keyWindow.bounds).image { _ in - keyWindow.drawHierarchy(in: keyWindow.bounds, afterScreenUpdates: true) - } - callback(image) - - UIView.setAnimationsEnabled(true) - } - } - } - } -} diff --git a/Example/Tests/Info.plist b/Example/Tests/Info.plist deleted file mode 100644 index ba72822..0000000 --- a/Example/Tests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Example/Tests/ViewModel/GradientActivityIndicatorViewModelTestCase.swift b/Example/Tests/ViewModel/GradientActivityIndicatorViewModelTestCase.swift deleted file mode 100644 index 0328e33..0000000 --- a/Example/Tests/ViewModel/GradientActivityIndicatorViewModelTestCase.swift +++ /dev/null @@ -1,243 +0,0 @@ -// -// GradientActivityIndicatorViewModelTestCase.swift -// GradientLoadingBar_Tests -// -// Created by Felix Mau on 26.08.19. -// Copyright © 2019 Felix Mau. All rights reserved. -// - -import XCTest -import LightweightObservable - -@testable import GradientLoadingBar - -// swiftlint:disable:next type_name -class GradientActivityIndicatorViewModelTestCase: XCTestCase { - // MARK: - Private properties - - private var viewModel: GradientActivityIndicatorViewModel! - - // MARK: - Public methods - - override func setUp() { - super.setUp() - - viewModel = GradientActivityIndicatorViewModel() - } - - override func tearDown() { - viewModel = nil - - super.tearDown() - } - - // MARK: - Test initializer - - func testInitializerShouldSetGradientLayerColorsToCorrectValue() { - let expectedGradientLayerColors = makeGradientLayerColors() - XCTAssertEqual(viewModel.gradientLayerColors.value, expectedGradientLayerColors) - } - - func testInitializerShouldSetColorLocationMatrixToCorrectValue() throws { - let receivedColorLocationMatrix = try XCTUnwrap(viewModel.colorLocationMatrix.value) - let expectedColorLocationMatrix = makeColorLocationMatrix() - - // Unfortunately there is no easier way comparing an array of type `NSNumber` / `Double` with a given accuracy. - XCTAssertEqual(receivedColorLocationMatrix.count, expectedColorLocationMatrix.count) - - for (receivedColorLocationRow, expectedColorLocationRow) in zip(receivedColorLocationMatrix, expectedColorLocationMatrix) { - XCTAssertEqual(receivedColorLocationRow.count, expectedColorLocationRow.count) - - for (receivedColorLocation, expectedColorLocation) in zip(receivedColorLocationRow, expectedColorLocationRow) { - XCTAssertEqual(receivedColorLocation.doubleValue, expectedColorLocation.doubleValue, accuracy: .ulpOfOne) - } - } - } - - func testInitializerShouldSetAnimationDurationToStaticConfigurationProperty() { - XCTAssertEqual(viewModel.animationDuration.value, TimeInterval.GradientLoadingBar.progressDuration) - } - - func testInitializerShouldSetIsAnimatingToTrue() throws { - XCTAssertTrue( - try XCTUnwrap(viewModel.isAnimating.value) - ) - } - - func testInitializerShouldSetGradientColorsToStaticConfigurationProperty() { - XCTAssertEqual(viewModel.gradientColors, UIColor.GradientLoadingBar.gradientColors) - } - - func testInitializerShouldSetProgressAnimationDurationToStaticConfigurationProperty() { - XCTAssertEqual(viewModel.progressAnimationDuration, TimeInterval.GradientLoadingBar.progressDuration) - } - - func testInitializerShouldSetIsHiddenToFalse() { - XCTAssertFalse(viewModel.isHidden) - } - - // MARK: - Test property `gradientColors` - - func testSettingGradientColorsShouldUpdateGradientLayerColorsObservable() { - // Given - let gradientColors: [UIColor] = [.red, .yellow, .green] - - // When - viewModel.gradientColors = gradientColors - - // Then - // - // `gradientColors = [.red, .yellow, .green]` - // `gradientLayerColors = [.red, .yellow, .green, .yellow, .red, .yellow, .green]` - // - let expectedGradientColors: [UIColor] = [.red, .yellow, .green, .yellow, .red, .yellow, .green] - let expectedGradientLayerColors = expectedGradientColors.map { $0.cgColor } - - XCTAssertEqual(viewModel.gradientLayerColors.value, expectedGradientLayerColors) - } - - func testSettingGradientColorsShouldUpdateColorLocationMatrixObservable() { - // Given - let gradientColors: [UIColor] = [.red, .yellow, .green] - - // When - viewModel.gradientColors = gradientColors - - // Then - // - // `gradientColors = [.red, .yellow, .green]` - // `gradientLayerColors = [.red, .yellow, .green, .yellow, .red, .yellow, .green]` - // - // i | .red | .yellow | .green | .yellow | .red | .yellow | .green - // 0 | 0 | 0 | 0 | 0 | 0 | 0.5 | 1 - // 1 | 0 | 0 | 0 | 0 | 0.5 | 1 | 1 - // 2 | 0 | 0 | 0 | 0.5 | 1 | 1 | 1 - // 3 | 0 | 0 | 0.5 | 1 | 1 | 1 | 1 - // 4 | 0 | 0.5 | 1 | 1 | 1 | 1 | 1 - // - let colorLocationMatrix = [ - [0, 0, 0, 0, 0, 0.5, 1], - [0, 0, 0, 0, 0.5, 1, 1], - [0, 0, 0, 0.5, 1, 1, 1], - [0, 0, 0.5, 1, 1, 1, 1], - [0, 0.5, 1, 1, 1, 1, 1], - ] - - let expectedColorLocationMatrix = colorLocationMatrix.map { - $0.map { NSNumber(value: $0) } - } - - XCTAssertEqual(viewModel.colorLocationMatrix.value, expectedColorLocationMatrix) - } - - // MARK: - Test property `progressAnimationDuration` - - func testSettingProgressAnimationDurationShouldUpdateAnimationDurationObservable() { - // Given - let progressAnimationDuration: TimeInterval = 123 - - // When - viewModel.progressAnimationDuration = progressAnimationDuration - - // Then - XCTAssertEqual(viewModel.animationDuration.value, progressAnimationDuration) - } - - // MARK: - Test property `isHidden` - - func testSettingIsHiddenToTrueShouldSetIsAnimatingToFalse() throws { - // When - viewModel.isHidden = true - - // Then - XCTAssertFalse( - try XCTUnwrap(viewModel.isAnimating.value) - ) - } - - func testSettingIsHiddenToFalseShouldSetIsAnimatingToTrue() throws { - // When - viewModel.isHidden = false - - // Then - XCTAssertTrue( - try XCTUnwrap(viewModel.isAnimating.value) - ) - } -} - -// MARK: - Helpers - -extension GradientActivityIndicatorViewModelTestCase { - private func makeGradientLayerColors() -> [CGColor] { - let gradientColors = [ - #colorLiteral(red: 0.2980392157, green: 0.8509803922, blue: 0.3921568627, alpha: 1), #colorLiteral(red: 0.3529411765, green: 0.7843137255, blue: 0.9803921569, alpha: 1), #colorLiteral(red: 0, green: 0.4784313725, blue: 1, alpha: 1), #colorLiteral(red: 0.2039215686, green: 0.6666666667, blue: 0.862745098, alpha: 1), #colorLiteral(red: 0.3450980392, green: 0.337254902, blue: 0.8392156863, alpha: 1), #colorLiteral(red: 1, green: 0.1764705882, blue: 0.3333333333, alpha: 1), - ] - - XCTAssertEqual(gradientColors, UIColor.GradientLoadingBar.gradientColors, - "Precondition failed – The given gradient colors do not match the current color constant!") - - // swiftlint:disable:next identifier_name - let reversedGradientColorsWithoutFirstAndLastValue = [ - #colorLiteral(red: 0.3450980392, green: 0.337254902, blue: 0.8392156863, alpha: 1), #colorLiteral(red: 0.2039215686, green: 0.6666666667, blue: 0.862745098, alpha: 1), #colorLiteral(red: 0, green: 0.4784313725, blue: 1, alpha: 1), #colorLiteral(red: 0.3529411765, green: 0.7843137255, blue: 0.9803921569, alpha: 1), - ] - - let infiniteGradientColors = gradientColors + reversedGradientColorsWithoutFirstAndLastValue + gradientColors - return infiniteGradientColors.map { $0.cgColor } - } - - private func makeColorLocationInitialRow() -> ColorLocationRow { - let gradientLocations = [0, 0.2, 0.4, 0.6, 0.8, 1] - - XCTAssertEqual(gradientLocations.count, UIColor.GradientLoadingBar.gradientColors.count, - "Precondition failed – The given gradient locations do not match for the current color constant!") - - // The current constant has 6 value and therefore we expect 16 gradient layer colors in total. - // Ergo we have to fill the first 10 values with "0", before adding the `gradientLocations`. - // - // .green | .malibu | .azure | .curious | .violet | .red | .violet | .curious | .azure | .malibu | .green | .malibu | .azure | .curious | .violet | .red - // 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.2 | 0.4 | 0.6 | 0.8 | 1 - // - // swiftlint:disable:next identifier_name - let gradientLocationAnimationMatrixInitialRow = Array(repeating: 0.0, count: 10) + gradientLocations - - return gradientLocationAnimationMatrixInitialRow.map { - NSNumber(value: $0) - } - } - - private func makeColorLocationMatrix() -> ColorLocationMatrix { - let gradientLocations = [0, 0.2, 0.4, 0.6, 0.8, 1] - - XCTAssertEqual(gradientLocations.count, UIColor.GradientLoadingBar.gradientColors.count, - "Precondition failed – The given gradient locations do not match for the current color constant!") - - // The current constant has 6 value and therefore we expect 16 gradient layer colors in total. - // Ergo we have to fill the first 10 values with "0", before adding the `gradientLocations`. - // - // .green | .malibu | .azure | .curious | .violet | .red | .violet | .curious | .azure | .malibu | .green | .malibu | .azure | .curious | .violet | .red - // 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.2 | 0.4 | 0.6 | 0.8 | 1 - // ... - // 0 | 0 | 0 | 0 | 0 | 0 | 0.2 | 0.4 | 0.6 | 0.8 | 1 | 1 | 1 | 1 | 1 | 1 - // ... - // 0 | 0.2 | 0.4 | 0.6 | 0.8 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 - // - let colorLocationMatrix = [ - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.4, 0.6, 0.8, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.4, 0.6, 0.8, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.4, 0.6, 0.8, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0.2, 0.4, 0.6, 0.8, 1, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0.2, 0.4, 0.6, 0.8, 1, 1, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0.2, 0.4, 0.6, 0.8, 1, 1, 1, 1, 1, 1], - [0, 0, 0, 0, 0, 0.2, 0.4, 0.6, 0.8, 1, 1, 1, 1, 1, 1, 1], - [0, 0, 0, 0, 0.2, 0.4, 0.6, 0.8, 1, 1, 1, 1, 1, 1, 1, 1], - [0, 0, 0, 0.2, 0.4, 0.6, 0.8, 1, 1, 1, 1, 1, 1, 1, 1, 1], - [0, 0, 0.2, 0.4, 0.6, 0.8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], - [0, 0.2, 0.4, 0.6, 0.8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], - ] - - return colorLocationMatrix.map { - $0.map { NSNumber(value: $0) } - } - } -} diff --git a/Example/Tests/ViewModel/GradientLoadingBarViewModelTestCase.swift b/Example/Tests/ViewModel/GradientLoadingBarViewModelTestCase.swift deleted file mode 100644 index dc8061b..0000000 --- a/Example/Tests/ViewModel/GradientLoadingBarViewModelTestCase.swift +++ /dev/null @@ -1,121 +0,0 @@ -// -// GradientLoadingBarViewModelTestCase.swift -// GradientLoadingBar_Tests -// -// Created by Felix Mau on 26.12.17. -// Copyright © 2017 Felix Mau. All rights reserved. -// - -import XCTest -import LightweightObservable - -@testable import GradientLoadingBar - -class GradientLoadingBarViewModelTestCase: XCTestCase { - // MARK: - Private properties - - private var sharedApplicationMock: SharedApplicationMock! - private var notificationCenter: NotificationCenter! - - // MARK: - Public methods - - override func setUp() { - super.setUp() - - sharedApplicationMock = SharedApplicationMock() - notificationCenter = NotificationCenter() - } - - override func tearDown() { - notificationCenter = nil - sharedApplicationMock = nil - - super.tearDown() - } - - // MARK: - Test observable `superview` - - func testInitializerShouldSetupSuperviewObservableNil() throws { - // When - let viewModel = GradientLoadingBarViewModel(sharedApplication: sharedApplicationMock, - notificationCenter: notificationCenter) - - // Then - let variable = try XCTUnwrap(viewModel.superview as? Variable, "Cast `Observable` instance to `Variable` in order to validate the initial value.") - XCTAssertNil(variable.value) - } - - func testInitializerShouldSetupSuperviewObservableWithKeyWindow() { - // Given - let keyWindow = UIWindow() - keyWindow.makeKey() - - let otherWindow = UIWindow() - sharedApplicationMock.windows = [keyWindow, otherWindow] - - // When - let viewModel = GradientLoadingBarViewModel(sharedApplication: sharedApplicationMock, - notificationCenter: notificationCenter) - - // Then - XCTAssertEqual(viewModel.superview.value, keyWindow) - } - - func testInitializerShouldSetupSuperviewObservableAfterUIWindowDidBecomeKeyNotification() { - // Given - let keyWindow = UIWindow() - keyWindow.makeKey() - - let otherWindow = UIWindow() - sharedApplicationMock.windows = [otherWindow] - - let viewModel = GradientLoadingBarViewModel(sharedApplication: sharedApplicationMock, - notificationCenter: notificationCenter) - - // When - sharedApplicationMock.windows.append(keyWindow) - notificationCenter.post(name: UIWindow.didBecomeKeyNotification, - object: nil) - - // Then - XCTAssertEqual(viewModel.superview.value, keyWindow) - } - - func testDeinitShouldResetSuperviewObservableToNil() { - // Given - let keyWindow = UIWindow() - keyWindow.makeKey() - - let otherWindow = UIWindow() - sharedApplicationMock.windows = [keyWindow, otherWindow] - - var viewModel: GradientLoadingBarViewModel? = GradientLoadingBarViewModel(sharedApplication: sharedApplicationMock, - notificationCenter: notificationCenter) - - let expectation = self.expectation(description: "Expected observer to be informed to reset superview to nil.") - var disposeBag = DisposeBag() - - // As we've just initialized the view model it has to exist at this point, and therefore we can "safely" use force-unwrapping here. - // swiftlint:disable:next force_unwrapping - viewModel!.superview.subscribe { newSuperview, _ in - guard newSuperview == nil else { - // Skip initial call to observer. - return - } - - expectation.fulfill() - }.disposed(by: &disposeBag) - - // When - viewModel = nil - - // Then - wait(for: [expectation], timeout: 0.1) - } -} - -// MARK: - Mocks - -private class SharedApplicationMock: UIApplicationProtocol { - var windows = [UIWindow]() -} diff --git a/Example/Tests/ViewModel/NotchGradientLoadingBarViewModelTestCase.swift b/Example/Tests/ViewModel/NotchGradientLoadingBarViewModelTestCase.swift deleted file mode 100644 index dfb6a02..0000000 --- a/Example/Tests/ViewModel/NotchGradientLoadingBarViewModelTestCase.swift +++ /dev/null @@ -1,76 +0,0 @@ -// -// NotchGradientLoadingBarViewModelTestCase.swift -// GradientLoadingBar_Tests -// -// Created by Felix Mau on 26.12.17. -// Copyright © 2017 Felix Mau. All rights reserved. -// - -import XCTest - -@testable import GradientLoadingBar - -class NotchGradientLoadingBarViewModelTestCase: XCTestCase { - func testInitializerShouldSetSafeAreaDeviceToIPhoneX() { - // Given - let deviceIdentifiers = ["iPhone10,3", "iPhone10,6", "iPhone11,2", "iPhone11,4", "iPhone11,6", "iPhone11,8"] - deviceIdentifiers.forEach { deviceIdentifier in - - // When - let viewModel = NotchGradientLoadingBarViewModel(deviceIdentifier: deviceIdentifier) - - // Then - XCTAssertEqual(viewModel.safeAreaDevice, .iPhoneX) - } - } - - func testInitializerShouldSetSafeAreaDeviceToIPhone11() { - // Given - let deviceIdentifiers = ["iPhone12,1", "iPhone12,3", "iPhone12,5"] - deviceIdentifiers.forEach { deviceIdentifier in - - // When - let viewModel = NotchGradientLoadingBarViewModel(deviceIdentifier: deviceIdentifier) - - // Then - XCTAssertEqual(viewModel.safeAreaDevice, .iPhone11) - } - } - - func testInitializerShouldSetSafeAreaDeviceToIPhone12() { - // Given - let deviceIdentifiers = ["iPhone13,1", "iPhone13,2", "iPhone13,3", "iPhone13,4"] - deviceIdentifiers.forEach { deviceIdentifier in - - // When - let viewModel = NotchGradientLoadingBarViewModel(deviceIdentifier: deviceIdentifier) - - // Then - XCTAssertEqual(viewModel.safeAreaDevice, .iPhone12) - } - } - - func testInitializerShouldSetSafeAreaDeviceToIPhone13() { - // Given - let deviceIdentifiers = ["iPhone14,4", "iPhone14,5", "iPhone14,2", "iPhone14,3"] - deviceIdentifiers.forEach { deviceIdentifier in - - // When - let viewModel = NotchGradientLoadingBarViewModel(deviceIdentifier: deviceIdentifier) - - // Then - XCTAssertEqual(viewModel.safeAreaDevice, .iPhone13) - } - } - - func testInitializerShouldSetSafeAreaDeviceToUnknown() { - // Given - let deviceIdentifier = "Foo-Bar-🤡" - - // When - let viewModel = NotchGradientLoadingBarViewModel(deviceIdentifier: deviceIdentifier) - - // Then - XCTAssertEqual(viewModel.safeAreaDevice, .unknown) - } -} diff --git a/Example/Tests/Views/GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift b/Example/Tests/Views/GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift deleted file mode 100644 index 4742a14..0000000 --- a/Example/Tests/Views/GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift +++ /dev/null @@ -1,207 +0,0 @@ -// -// GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift -// GradientLoadingBar_Tests -// -// Created by Felix Mau on 19.05.19. -// Copyright © 2017 Felix Mau. All rights reserved. -// - -import XCTest - -@testable import GradientLoadingBar - -// swiftlint:disable:next type_name -class GradientActivityIndicatorViewAnimateIsHiddenTestCase: XCTestCase { - // MARK: - Private properties - - private var window: UIWindow! - private var gradientActivityIndicatorView: GradientActivityIndicatorView! - - // MARK: - Public methods - - override func setUp() { - super.setUp() - - // In order for UIView animations to be executed correctly, the corresponding view has to be attached to a visible window. - // Therefore we're gonna use the current key-window, add our testing view here in `setUp()` and remove it later in `tearDown()`. - window = UIApplication.shared.windows.first { $0.isKeyWindow } - - gradientActivityIndicatorView = GradientActivityIndicatorView() - window.addSubview(gradientActivityIndicatorView) - } - - override func tearDown() { - gradientActivityIndicatorView.removeFromSuperview() - gradientActivityIndicatorView = nil - - window = nil - - super.tearDown() - } - - // MARK: - Test method `animate(isHidden:)` - - func testAnimateIsHiddenShouldShowViewAndCallCompletionHandler() { - // Given - let expectation = self.expectation(description: "Expect completion handler to be called.") - - // Hide view to validate fade-in. - gradientActivityIndicatorView.alpha = 0 - gradientActivityIndicatorView.isHidden = true - - // When - gradientActivityIndicatorView.animate(isHidden: false, duration: 0.1) { isFinished in - XCTAssertTrue(isFinished) - expectation.fulfill() - } - - // Then - wait(for: [expectation], timeout: 1) - - XCTAssertFalse(gradientActivityIndicatorView.isHidden) - XCTAssertEqual(gradientActivityIndicatorView.alpha, 1.0, accuracy: CGFloat.ulpOfOne) - } - - func testAnimateIsHiddenWithInterruptionShouldShowViewAndCallCompletionHandler() { - // Given - let expectation = self.expectation(description: "Expect completion handler to be called.") - - // Hide view to validate fade-in. - gradientActivityIndicatorView.alpha = 0 - gradientActivityIndicatorView.isHidden = true - - // When - gradientActivityIndicatorView.animate(isHidden: false, duration: 0.1) { isFinished in - XCTAssertFalse(isFinished) - expectation.fulfill() - } - - // Cancel animation. - gradientActivityIndicatorView.layer.removeAllAnimations() - - // Then - wait(for: [expectation], timeout: 1) - - XCTAssertFalse(gradientActivityIndicatorView.isHidden) - } - - func testAnimateIsHiddenShouldHideViewAndCallCompletionHandler() { - // Given - let expectation = self.expectation(description: "Expect completion handler to be called.") - - // When - gradientActivityIndicatorView.animate(isHidden: true, duration: 0.1) { isFinished in - XCTAssertTrue(isFinished) - expectation.fulfill() - } - - // Then - wait(for: [expectation], timeout: 1) - - XCTAssertTrue(gradientActivityIndicatorView.isHidden) - XCTAssertEqual(gradientActivityIndicatorView.alpha, 0, accuracy: CGFloat.ulpOfOne) - } - - func testAnimateIsHiddenWithInterruptionShouldNotHideViewAndCallCompletionHandler() { - // Given - let expectation = self.expectation(description: "Expect completion handler to be called.") - - // When - gradientActivityIndicatorView.animate(isHidden: true, duration: 0.1) { isFinished in - XCTAssertFalse(isFinished) - expectation.fulfill() - } - - // Cancel animation. - gradientActivityIndicatorView.layer.removeAllAnimations() - - // Then - wait(for: [expectation], timeout: 1) - - XCTAssertFalse(gradientActivityIndicatorView.isHidden, "As we've interrupted the animation, we expect the `isHidden` flag to still be `false`.") - } - - // MARK: - Test method `fadeIn()` - - func testFadeInShouldShowViewAndCallCompletionHandler() { - // Given - let expectation = self.expectation(description: "Expect completion handler to be called.") - - // Hide view to validate fade-in. - gradientActivityIndicatorView.alpha = 0 - gradientActivityIndicatorView.isHidden = true - - // When - gradientActivityIndicatorView.fadeIn(duration: 0.1) { isFinished in - XCTAssertTrue(isFinished) - expectation.fulfill() - } - - // Then - wait(for: [expectation], timeout: 1) - - XCTAssertFalse(gradientActivityIndicatorView.isHidden) - XCTAssertEqual(gradientActivityIndicatorView.alpha, 1.0, accuracy: CGFloat.ulpOfOne) - } - - func testFadeInWithInterruptionShouldShowViewAndCallCompletionHandler() { - // Given - let expectation = self.expectation(description: "Expect completion handler to be called.") - - // Hide view to validate fade-in. - gradientActivityIndicatorView.alpha = 0 - gradientActivityIndicatorView.isHidden = true - - // When - gradientActivityIndicatorView.fadeIn(duration: 0.1) { isFinished in - XCTAssertFalse(isFinished) - expectation.fulfill() - } - - // Cancel animation. - gradientActivityIndicatorView.layer.removeAllAnimations() - - // Then - wait(for: [expectation], timeout: 1) - - XCTAssertFalse(gradientActivityIndicatorView.isHidden) - } - - // MARK: - Test method `fadeOut()` - - func testFadeOutShouldHideViewAndCallCompletionHandler() { - // Given - let expectation = self.expectation(description: "Expect completion handler to be called.") - - // When - gradientActivityIndicatorView.fadeOut(duration: 0.1) { isFinished in - XCTAssertTrue(isFinished) - expectation.fulfill() - } - - // Then - wait(for: [expectation], timeout: 1) - - XCTAssertTrue(gradientActivityIndicatorView.isHidden) - XCTAssertEqual(gradientActivityIndicatorView.alpha, 0, accuracy: CGFloat.ulpOfOne) - } - - func testFadeOutWithInterruptionShouldNotHideViewAndCallCompletionHandler() { - // Given - let expectation = self.expectation(description: "Expect completion handler to be called.") - - // When - gradientActivityIndicatorView.fadeOut(duration: 0.1) { isFinished in - XCTAssertFalse(isFinished) - expectation.fulfill() - } - - // Cancel animation. - gradientActivityIndicatorView.layer.removeAllAnimations() - - // Then - wait(for: [expectation], timeout: 1) - - XCTAssertFalse(gradientActivityIndicatorView.isHidden, "As we've interrupted the animation, we expect the `isHidden` flag to still be `false`.") - } -} diff --git a/GradientLoadingBar.podspec b/GradientLoadingBar.podspec index 598e5b3..0c53ba8 100644 --- a/GradientLoadingBar.podspec +++ b/GradientLoadingBar.podspec @@ -28,10 +28,10 @@ Inspired by https://codepen.io/marcobiedermann/pen/LExXWW s.author = { 'Felix Mau' => 'contact@felix.hamburg' } s.source = { :git => 'https://github.com/fxm90/GradientLoadingBar.git', :tag => s.version.to_s } - s.swift_version = '5.1' + s.swift_version = '5.5' s.ios.deployment_target = '9.0' - s.source_files = 'GradientLoadingBar/Classes/**/*' + s.source_files = 'GradientLoadingBar/**/*' # s.resource_bundles = { # 'GradientLoadingBar' => ['GradientLoadingBar/Assets/*.png'] diff --git a/GradientLoadingBar/Assets/.gitkeep b/GradientLoadingBar/Assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/GradientLoadingBar/Classes/GradientLoadingBarController.swift b/GradientLoadingBar/GradientLoadingBarController.swift similarity index 100% rename from GradientLoadingBar/Classes/GradientLoadingBarController.swift rename to GradientLoadingBar/GradientLoadingBarController.swift diff --git a/GradientLoadingBar/Classes/Misc/Constants.swift b/GradientLoadingBar/Misc/Constants.swift similarity index 100% rename from GradientLoadingBar/Classes/Misc/Constants.swift rename to GradientLoadingBar/Misc/Constants.swift diff --git a/GradientLoadingBar/Classes/NotchGradientLoadingBarController.swift b/GradientLoadingBar/NotchGradientLoadingBarController.swift similarity index 98% rename from GradientLoadingBar/Classes/NotchGradientLoadingBarController.swift rename to GradientLoadingBar/NotchGradientLoadingBarController.swift index 1ad0ac1..f404c40 100644 --- a/GradientLoadingBar/Classes/NotchGradientLoadingBarController.swift +++ b/GradientLoadingBar/NotchGradientLoadingBarController.swift @@ -95,7 +95,7 @@ open class NotchGradientLoadingBarController: GradientLoadingBarController { config = .iPhone13Device } - let notchBezierPath = self.notchBezierPath(for: screenWidth, config: config) + let notchBezierPath = notchBezierPath(for: screenWidth, config: config) // Setting the `lineWidth` draws a line, where the actual path is exactly in the middle of the drawn line. // To get the correct height (including the path) we have to add the `height` here to the given bounds (half height for top, half for bottom). @@ -124,7 +124,7 @@ open class NotchGradientLoadingBarController: GradientLoadingBarController { let smallCircleDiameter: CGFloat = 2 * config.smallCircleRadius // Reducing the height here a little in order to match the "basic" gradient loading bar. - let height = self.height - 0.5 + let height = height - 0.5 let bezierPath = UIBezierPath() bezierPath.move(to: .zero) diff --git a/GradientLoadingBar/Classes/ViewModel/GradientActivityIndicatorViewModel.swift b/GradientLoadingBar/ViewModel/GradientActivityIndicatorViewModel.swift similarity index 99% rename from GradientLoadingBar/Classes/ViewModel/GradientActivityIndicatorViewModel.swift rename to GradientLoadingBar/ViewModel/GradientActivityIndicatorViewModel.swift index 74ddc1e..eec7ea3 100644 --- a/GradientLoadingBar/Classes/ViewModel/GradientActivityIndicatorViewModel.swift +++ b/GradientLoadingBar/ViewModel/GradientActivityIndicatorViewModel.swift @@ -134,7 +134,7 @@ private extension ColorLocationRow { .dropLast() let infiniteGradientColors = gradientColors + reversedColors + gradientColors - return infiniteGradientColors.map { $0.cgColor } + return infiniteGradientColors.map(\.cgColor) } } diff --git a/GradientLoadingBar/Classes/ViewModel/GradientLoadingBarViewModel.swift b/GradientLoadingBar/ViewModel/GradientLoadingBarViewModel.swift similarity index 100% rename from GradientLoadingBar/Classes/ViewModel/GradientLoadingBarViewModel.swift rename to GradientLoadingBar/ViewModel/GradientLoadingBarViewModel.swift diff --git a/GradientLoadingBar/Classes/ViewModel/NotchGradientLoadingBarViewModel.swift b/GradientLoadingBar/ViewModel/NotchGradientLoadingBarViewModel.swift similarity index 100% rename from GradientLoadingBar/Classes/ViewModel/NotchGradientLoadingBarViewModel.swift rename to GradientLoadingBar/ViewModel/NotchGradientLoadingBarViewModel.swift diff --git a/GradientLoadingBar/Classes/Views/GradientActivityIndicatorView+AnimateIsHidden.swift b/GradientLoadingBar/Views/GradientActivityIndicatorView+AnimateIsHidden.swift similarity index 99% rename from GradientLoadingBar/Classes/Views/GradientActivityIndicatorView+AnimateIsHidden.swift rename to GradientLoadingBar/Views/GradientActivityIndicatorView+AnimateIsHidden.swift index e321def..0a5ce3f 100644 --- a/GradientLoadingBar/Classes/Views/GradientActivityIndicatorView+AnimateIsHidden.swift +++ b/GradientLoadingBar/Views/GradientActivityIndicatorView+AnimateIsHidden.swift @@ -52,7 +52,7 @@ public extension GradientActivityIndicatorView { }, completion: { isFinished in // Update `isHidden` flag accordingly: - // - set to `true` in case animation was completly finished. + // - set to `true` in case animation was completely finished. // - set to `false` in case animation was interrupted, e.g. due to starting of another animation. self.isHidden = isFinished diff --git a/GradientLoadingBar/Classes/Views/GradientActivityIndicatorView.swift b/GradientLoadingBar/Views/GradientActivityIndicatorView.swift similarity index 100% rename from GradientLoadingBar/Classes/Views/GradientActivityIndicatorView.swift rename to GradientLoadingBar/Views/GradientActivityIndicatorView.swift